diff options
Diffstat (limited to 'plugins/55/wrap/helper.php')
-rw-r--r-- | plugins/55/wrap/helper.php | 808 |
1 files changed, 808 insertions, 0 deletions
diff --git a/plugins/55/wrap/helper.php b/plugins/55/wrap/helper.php new file mode 100644 index 0000000..6fc2cc5 --- /dev/null +++ b/plugins/55/wrap/helper.php @@ -0,0 +1,808 @@ +<?php +/** + * Helper Component for the Wrap Plugin + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Anika Henke <anika@selfthinker.org> + */ + +class helper_plugin_wrap extends DokuWiki_Plugin { + static protected $boxes = array ('wrap_box', 'wrap_danger', 'wrap_warning', 'wrap_caution', 'wrap_notice', 'wrap_safety', + 'wrap_info', 'wrap_important', 'wrap_alert', 'wrap_tip', 'wrap_help', 'wrap_todo', + 'wrap_download', 'wrap_hi', 'wrap_spoiler'); + static protected $paragraphs = array ('wrap_leftalign', 'wrap_rightalign', 'wrap_centeralign', 'wrap_justify'); + + /* list of languages which normally use RTL scripts */ + static protected $rtllangs = array('ar','dv','fa','ha','he','ks','ku','ps','ur','yi','arc'); + /* list of right-to-left scripts (may override the language defaults to rtl) */ + static protected $rtlscripts = array('arab','thaa','hebr','deva','shrd'); + /* selection of left-to-right scripts (may override the language defaults to ltr) */ + static protected $ltrscripts = array('latn','cyrl','grek','hebr','cyrs','armn'); + + static $box_left_pos = 0; + static $box_right_pos = 0; + static $box_first = true; + static $table_entr = 0; + + protected $column_count = 0; + + /** + * get attributes (pull apart the string between '<wrap' and '>') + * and identify classes, width, lang and dir + * + * @author Anika Henke <anika@selfthinker.org> + * @author Christopher Smith <chris@jalakai.co.uk> + * (parts taken from http://www.dokuwiki.org/plugin:box) + */ + function getAttributes($data, $useNoPrefix=true) { + + $attr = array( + 'lang' => null, + 'class' => null, + 'width' => null, + 'id' => null, + 'dir' => null + ); + $tokens = preg_split('/\s+/', $data, 9); + + // anonymous function to convert inclusive comma separated items to regex pattern + $pattern = function ($csv) { + return '/^(?:'. str_replace(['?','*',' ',','], + ['.','.*','','|'], $csv) .')$/'; + }; + + // noPrefix: comma separated class names that should be excluded from + // being prefixed with "wrap_", + // each item may contain wildcard (*, ?) + $noPrefix = ($this->getConf('noPrefix') && $useNoPrefix) ? $pattern($this->getConf('noPrefix')) : ''; + + // restrictedClasses : comma separated class names that should be checked + // based on restriction type (whitelist or blacklist), + // each item may contain wildcard (*, ?) + $restrictedClasses = ($this->getConf('restrictedClasses')) ? + $pattern($this->getConf('restrictedClasses')) : ''; + $restrictionType = $this->getConf('restrictionType'); + + foreach ($tokens as $token) { + + //get width + if (preg_match('/^\d*\.?\d+(%|px|em|rem|ex|ch|vw|vh|pt|pc|cm|mm|in)$/', $token)) { + $attr['width'] = $token; + continue; + } + + //get lang + if (preg_match('/:([a-z\-]+)/', $token)) { + $attr['lang'] = trim($token,':'); + continue; + } + + //get id + if (preg_match('/#([A-Za-z0-9_-]+)/', $token)) { + $attr['id'] = trim($token,'#'); + continue; + } + + //get classes + //restrict token (class names) characters to prevent any malicious data + if (preg_match('/[^A-Za-z0-9_-]/',$token)) continue; + if ($restrictedClasses) { + $classIsInList = preg_match($restrictedClasses, $token); + // either allow only certain classes or disallow certain classes + if ($restrictionType xor $classIsInList) continue; + } + // prefix adjustment of class name + $prefix = (!empty($noPrefix) && preg_match($noPrefix, $token)) ? '' : 'wrap_'; + $attr['class'] = (isset($attr['class']) ? $attr['class'].' ' : '').$prefix.$token; + } + if ($this->getConf('darkTpl')) { + $attr['class'] = (isset($attr['class']) ? $attr['class'].' ' : '').'wrap__dark'; + } + if ($this->getConf('emulatedHeadings')) { + $attr['class'] = (isset($attr['class']) ? $attr['class'].' ' : '').'wrap__emuhead'; + } + + /* improved RTL detection to make sure it covers more cases: */ + if($attr['lang'] && $attr['lang'] !== '') { + + // turn the language code into an array of components: + $arr = explode('-', $attr['lang']); + + // is the language iso code (first field) in the list of RTL languages? + $rtl = in_array($arr[0], self::$rtllangs); + + // is there a Script specified somewhere which overrides the text direction? + $rtl = ($rtl xor (bool) array_intersect( $rtl ? self::$ltrscripts : self::$rtlscripts, $arr)); + + $attr['dir'] = ( $rtl ? 'rtl' : 'ltr' ); + } + + return $attr; + } + + /** + * build attributes (write out classes, width, lang and dir) + */ + function buildAttributes($data, $addClass='', $mode='xhtml') { + + $attr = $this->getAttributes($data); + $out = ''; + + if ($mode=='xhtml') { + if($attr['class']) $out .= ' class="'.hsc($attr['class']).' '.$addClass.'"'; + // if used in other plugins, they might want to add their own class(es) + elseif($addClass) $out .= ' class="'.$addClass.'"'; + if($attr['id']) $out .= ' id="'.hsc($attr['id']).'"'; + // width on spans normally doesn't make much sense, but in the case of floating elements it could be used + if($attr['width']) { + if (strpos($attr['width'],'%') !== false) { + $out .= ' style="width: '.hsc($attr['width']).';"'; + } else { + // anything but % should be 100% when the screen gets smaller + $out .= ' style="width: '.hsc($attr['width']).'; max-width: 100%;"'; + } + } + // only write lang if it's a language in lang2dir.conf + if($attr['dir']) $out .= ' lang="'.$attr['lang'].'" xml:lang="'.$attr['lang'].'" dir="'.$attr['dir'].'"'; + } + + return $out; + } + + /** + * render ODT element, Open + * (get Attributes, select ODT element that fits, render it, return element name) + */ + function renderODTElementOpen($renderer, $HTMLelement, $data) { + $attr = $this->getAttributes($data, false); + $attr_string = $this->buildAttributes($data); + $classes = explode (' ', $attr['class']); + + // Get language + $language = $attr['lang']; + + $is_indent = in_array ('wrap_indent', $classes); + $is_outdent = in_array ('wrap_outdent', $classes); + $is_column = in_array ('wrap_column', $classes); + $is_group = in_array ('wrap_group', $classes); + $is_pagebreak = in_array ('wrap_pagebreak', $classes); + + // Check for multicolumns + $columns = 0; + preg_match ('/wrap_col\d/', $attr ['class'], $matches); + if ( empty ($matches [0]) === false ) { + $columns = $matches [0] [strlen($matches [0])-1]; + } + + // Check for boxes + $is_box = false; + foreach (self::$boxes as $box) { + if ( strpos ($attr ['class'], $box) !== false ) { + $is_box = true; + break; + } + } + + // Check for paragraphs + $is_paragraph = false; + if ( empty($language) === false ) { + $is_paragraph = true; + } else { + foreach (self::$paragraphs as $paragraph) { + if ( strpos ($attr ['class'], $paragraph) !== false ) { + $is_paragraph = true; + break; + } + } + } + + $style = null; + if ( empty($attr['width']) === false ) { + $style = 'width: '.$attr['width'].';'; + } + $attr ['class'] = 'dokuwiki '.$attr ['class']; + + // Call corresponding functions for current wrap class + if ( $HTMLelement == 'span' ) { + if ( $is_indent === false && $is_outdent === false ) { + $this->renderODTOpenSpan ($renderer, $attr ['class'], $style, $language, $attr_string); + return 'span'; + } else { + $this->renderODTOpenParagraph ($renderer, $attr ['class'], $style, $attr ['dir'], $language, $is_indent, $is_outdent, true, $attr_string); + return 'paragraph'; + } + } else if ( $HTMLelement == 'div' ) { + if ( $is_box === true ) { + $wrap = $this->loadHelper('wrap'); + $fullattr = $wrap->buildAttributes($data, 'plugin_wrap'); + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === false ) { + $this->renderODTOpenBox ($renderer, $attr ['class'], $style, $fullattr); + } else { + $this->renderODTOpenTable ($renderer, $attr, $style, $attr_string); + } + return 'box'; + } else if ( $columns > 0 ) { + $this->renderODTOpenColumns ($renderer, $attr ['class'], $style); + return 'multicolumn'; + } else if ( $is_paragraph === true || $is_indent === true || $is_outdent === true ) { + $this->renderODTOpenParagraph ($renderer, $attr ['class'], $style, $attr ['dir'], $language, $is_indent, $is_outdent, false, $attr_string); + return 'paragraph'; + } else if ( $is_pagebreak === true ) { + $renderer->pagebreak (); + // Pagebreak hasn't got a closing stack so we return/push 'other' on the stack + return 'other'; + } else if ( $is_column === true ) { + $this->renderODTOpenColumn ($renderer, $attr ['class'], $style, $attr_string); + return 'column'; + } else if ( $is_group === true ) { + $this->renderODTOpenGroup ($renderer, $attr ['class'], $style); + return 'group'; + } else if (strpos ($attr ['class'], 'wrap_clear') !== false ) { + $renderer->linebreak(); + $renderer->p_close(); + $renderer->p_open(); + + self::$box_left_pos = 0; + self::$box_right_pos = 0; + self::$box_first = true; + } + } + return 'other'; + } + + /** + * render ODT element, Close + */ + function renderODTElementClose($renderer, $element) { + switch ($element) { + case 'box': + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === false ) { + $this->renderODTCloseBox ($renderer); + } else { + $this->renderODTCloseTable ($renderer); + } + break; + case 'multicolumn': + $this->renderODTCloseColumns($renderer); + break; + case 'paragraph': + $this->renderODTCloseParagraph($renderer); + break; + case 'column': + $this->renderODTCloseColumn($renderer); + break; + case 'group': + $this->renderODTCloseGroup($renderer); + break; + case 'span': + $this->renderODTCloseSpan($renderer); + break; + // No default by intention. + } + } + + function renderODTOpenBox ($renderer, $class, $style, $fullattr) { + $properties = array (); + + if ( method_exists ($renderer, 'getODTProperties') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + + // Get CSS properties for ODT export. + $renderer->getODTProperties ($properties, 'div', $class, $style); + + if ( empty($properties ['background-image']) === false ) { + $properties ['background-image'] = + $renderer->replaceURLPrefix ($properties ['background-image'], DOKU_INC); + } + + if ( empty($properties ['float']) === true ) { + // If the float property is not set, set it to 'left' becuase the ODT plugin + // would default to 'center' which is diffeent to the XHTML behaviour. + if ( strpos ($class, 'wrap_center') === false ) { + $properties ['float'] = 'left'; + } else { + $properties ['float'] = 'center'; + } + } + + // The display property has differing usage in CSS. So we better overwrite it. + $properties ['display'] = 'always'; + if ( stripos ($class, 'wrap_noprint') !== false ) { + $properties ['display'] = 'screen'; + } + if ( stripos ($class, 'wrap_onlyprint') !== false ) { + $properties ['display'] = 'printer'; + } + + $renderer->_odtDivOpenAsFrameUseProperties ($properties); + } + + function renderODTCloseBox ($renderer) { + if ( method_exists ($renderer, '_odtDivCloseAsFrame') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + $renderer->_odtDivCloseAsFrame (); + } + + function renderODTOpenColumns ($renderer, $class, $style) { + $properties = array (); + + if ( method_exists ($renderer, 'getODTProperties') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + + // Get CSS properties for ODT export. + $renderer->getODTProperties ($properties, 'div', $class, $style); + + $renderer->_odtOpenMultiColumnFrame($properties); + } + + function renderODTCloseColumns ($renderer) { + if ( method_exists ($renderer, '_odtCloseMultiColumnFrame') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + $renderer->_odtCloseMultiColumnFrame(); + } + + function renderODTOpenParagraph ($renderer, $class, $style, $dir, $language, $is_indent, $is_outdent, $indent_first, $attr=null) { + $properties = array (); + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === true ) { + // Get CSS properties for ODT export. + // Set parameter $inherit=false to prevent changiung the font-size and family! + $renderer->getODTPropertiesNew ($properties, 'p', $attr, null, false); + } else if ( method_exists ($renderer, 'getODTProperties') === true ) { + // Get CSS properties for ODT export (deprecated version). + $renderer->getODTProperties ($properties, 'p', $class, $style); + + if ( empty($properties ['background-image']) === false ) { + $properties ['background-image'] = + $renderer->replaceURLPrefix ($properties ['background-image'], DOKU_INC); + } + } else { + // To old ODT plugin version. + return; + } + + if ( empty($properties ['text-align']) ) + { + if ($dir == 'ltr') { + $properties ['text-align'] = 'left'; + $properties ['writing-mode'] = 'lr'; + } + if ($dir == 'rtl') { + $properties ['text-align'] = 'right'; + $properties ['writing-mode'] = 'rl'; + } + } + + $name = ''; + if ( empty($language) === false ) { + $properties ['lang'] = $language; + $name .= 'Language: '.$language; + } + + if ( $indent_first === true ) { + // Eventually indent or outdent first line only... + if ( $is_indent === true ) { + // FIXME: Has to be adjusted if test direction will be supported. + // See all.css + $properties ['text-indent'] = $properties ['padding-left']; + $properties ['padding-left'] = 0; + $name .= 'Indent first'; + } + if ( $is_outdent === true ) { + // FIXME: Has to be adjusted if text (RTL, LTR) direction will be supported. + // See all.css + $properties ['text-indent'] = $properties ['margin-left']; + $properties ['margin-left'] = 0; + $name .= 'Outdent first'; + } + } else { + // Eventually indent or outdent the whole paragraph... + if ( $is_indent === true ) { + // FIXME: Has to be adjusted if test direction will be supported. + // See all.css + $properties ['margin-left'] = $properties ['padding-left'] ?? null; + $properties ['padding-left'] = 0; + $name .= 'Indent'; + } + if ( $is_outdent === true ) { + // Nothing to change: keep left margin property. + // FIXME: Has to be adjusted if text (RTL, LTR) direction will be supported. + // See all.css + $name .= 'Outdent'; + } + } + + $renderer->p_close(); + if ( method_exists ($renderer, 'createParagraphStyle') === false ) { + // Older ODT plugin version. + $renderer->_odtParagraphOpenUseProperties($properties); + } else { + // Newer version create our own common styles. + + // Create parent style to group the others beneath it + if (!$renderer->styleExists('Plugin_Wrap_Paragraphs')) { + $parent_properties = array(); + $parent_properties ['style-parent'] = null; + $parent_properties ['style-class'] = 'Plugin Wrap Paragraphs'; + $parent_properties ['style-name'] = 'Plugin_Wrap_Paragraphs'; + $parent_properties ['style-display-name'] = 'Plugin Wrap'; + $renderer->createParagraphStyle($parent_properties); + } + + $name .= $this->getODTCommonStyleName($class); + $style_name = 'Plugin_Wrap_Paragraph_'.$name; + if (!$renderer->styleExists($style_name)) { + $properties ['style-parent'] = 'Plugin_Wrap_Paragraphs'; + $properties ['style-class'] = null; + $properties ['style-name'] = $style_name; + $properties ['style-display-name'] = $name; + $renderer->createParagraphStyle($properties); + } + + $renderer->p_open($style_name); + } + } + + function renderODTCloseParagraph ($renderer) { + if ( method_exists ($renderer, 'p_close') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + $renderer->p_close(); + } + + function renderODTOpenColumn ($renderer, $class, $style, $attr) { + $properties = array (); + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === true ) { + // Get CSS properties for ODT export. + $renderer->getODTPropertiesNew ($properties, 'div', $attr); + } else if ( method_exists ($renderer, 'getODTProperties') === true ) { + // Get CSS properties for ODT export (deprecated version). + $renderer->getODTProperties ($properties, null, $class, $style); + } else { + // To old ODT plugin version. + return; + } + + // Frames/Textboxes still have some issues with formatting (at least in LibreOffice) + // So as a workaround we implement columns as a table. + // This is why we now use the margin of the div as the padding for the ODT table. + $properties ['padding-left'] = $properties ['margin-left'] ?? null; + $properties ['padding-right'] = $properties ['margin-right'] ?? null; + $properties ['padding-top'] = $properties ['margin-top'] ?? null; + $properties ['padding-bottom'] = $properties ['margin-bottom'] ?? null; + $properties ['margin-left'] = null; + $properties ['margin-right'] = null; + $properties ['margin-top'] = null; + $properties ['margin-bottom'] = null; + + // Percentage values are not supported for the padding. Convert to absolute values. + $length = strlen ($properties ['padding-left']); + if ( $length > 0 && $properties ['padding-left'] [$length-1] == '%' ) { + $properties ['padding-left'] = trim ($properties ['padding-left'], '%'); + $properties ['padding-left'] = $renderer->_getAbsWidthMindMargins ($properties ['padding-left']).'cm'; + } + $length = strlen ($properties ['padding-right']); + if ( $length > 0 && $properties ['padding-right'] [$length-1] == '%' ) { + $properties ['padding-right'] = trim ($properties ['padding-right'], '%'); + $properties ['padding-right'] = $renderer->_getAbsWidthMindMargins ($properties ['padding-right']).'cm'; + } + $length = strlen ($properties ['padding-top']); + if ( $length > 0 && $properties ['padding-top'] [$length-1] == '%' ) { + $properties ['padding-top'] = trim ($properties ['padding-top'], '%'); + $properties ['padding-top'] = $renderer->_getAbsWidthMindMargins ($properties ['padding-top']).'cm'; + } + $length = strlen ($properties ['padding-bottom']); + if ( $length > 0 && $properties ['padding-bottom'] [$length-1] == '%' ) { + $properties ['padding-bottom'] = trim ($properties ['padding-bottom'], '%'); + $properties ['padding-bottom'] = $renderer->_getAbsWidthMindMargins ($properties ['padding-bottom']).'cm'; + } + + $this->column_count++; + if ( $this->column_count == 1 ) { + // If this is the first column opened since the group was opened + // then we have to open the table and a (single) row first. + $properties ['width'] = '100%'; + $renderer->_odtTableOpenUseProperties($properties); + $renderer->_odtTableRowOpenUseProperties($properties); + } + + // We did not specify any max column value when we opened the table. + // So we have to tell the renderer to add a column just now. + unset($properties ['width']); + $renderer->_odtTableAddColumnUseProperties($properties); + + // Open the cell. + $renderer->_odtTableCellOpenUseProperties($properties); + } + + function renderODTCloseColumn ($renderer) { + if ( method_exists ($renderer, '_odtTableAddColumnUseProperties') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + + $renderer->tablecell_close(); + } + + function renderODTOpenGroup ($renderer, $class, $style) { + // Nothing to do for now. + } + + function renderODTCloseGroup ($renderer) { + // If a table has been opened in the group we close it now. + if ( $this->column_count > 0 ) { + // At last we need to close the row and the table! + $renderer->tablerow_close(); + //$renderer->table_close(); + $renderer->_odtTableClose(); + } + $this->column_count = 0; + } + + function renderODTOpenSpan ($renderer, $class, $style, $language, $attr) { + $properties = array (); + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === true ) { + // Get CSS properties for ODT export. + // Set parameter $inherit=false to prevent changiung the font-size and family! + $renderer->getODTPropertiesNew ($properties, 'span', $attr, null, false); + } else if ( method_exists ($renderer, 'getODTProperties') === true ) { + // Get CSS properties for ODT export (deprecated version). + $renderer->getODTProperties ($properties, 'span', $class, $style); + + if ( empty($properties ['background-image']) === false ) { + $properties ['background-image'] = + $renderer->replaceURLPrefix ($properties ['background-image'], DOKU_INC); + } + } else { + // To old ODT plugin version. + return; + } + + $name = ''; + if ( empty($language) === false ) { + $properties ['lang'] = $language; + $name .= 'Language: '.$language; + } + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === false ) { + // Older ODT plugin version. + $renderer->_odtSpanOpenUseProperties($properties); + } else { + // Newer version create our own common styles. + $properties ['font-size'] = null; + + // Create parent style to group the others beneath it + if (!$renderer->styleExists('Plugin_Wrap_Spans')) { + $parent_properties = array(); + $parent_properties ['style-parent'] = null; + $parent_properties ['style-class'] = 'Plugin Wrap Spans'; + $parent_properties ['style-name'] = 'Plugin_Wrap_Spans'; + $parent_properties ['style-display-name'] = 'Plugin Wrap'; + $renderer->createTextStyle($parent_properties); + } + + $name .= $this->getODTCommonStyleName($class); + $style_name = 'Plugin_Wrap_Span_'.$name; + if (!$renderer->styleExists($style_name)) { + $properties ['style-parent'] = 'Plugin_Wrap_Spans'; + $properties ['style-class'] = null; + $properties ['style-name'] = $style_name; + $properties ['style-display-name'] = $name; + $renderer->createTextStyle($properties); + } + + if (!empty($properties ['background-image'])) { + if (method_exists ($renderer, '_odtAddImageUseProperties') === true) { + $size = null; + if (!empty($properties ['font-size'])) { + $size = $properties ['font-size']; + $size = $renderer->addToValue($size, '2pt'); + } + $properties ['width'] = $size; + $properties ['height'] = $size; + $properties ['title'] = null; + $renderer->_odtAddImageUseProperties ($properties ['background-image'],$properties); + } else { + $renderer->_odtAddImage ($properties ['background-image'],null,null,null,null,null); + } + } + $renderer->_odtSpanOpen($style_name); + } + } + + function renderODTCloseSpan ($renderer) { + if ( method_exists ($renderer, '_odtSpanClose') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + $renderer->_odtSpanClose(); + } + + function renderODTOpenTable ($renderer, $attr, $style, $attr_string) { + self::$table_entr += 1; + + $class = $attr ['class']; + $css_properties = array (); + + if ( method_exists ($renderer, 'getODTPropertiesFromElement') === false ) { + // Function is not supported by installed ODT plugin version, return. + return; + } + + // Get CSS properties for ODT export. + $renderer->getODTPropertiesNew ($css_properties, 'div', $attr_string, null, true); + + if ( empty($css_properties ['float']) === true ) { + // If the float property is not set, set it to 'left' becuase the ODT plugin + // would default to 'center' which is diffeent to the XHTML behaviour. + //$css_properties ['float'] = 'left'; + if (strpos ($class, 'wrap_left') !== false ) { + $css_properties ['float'] = 'left'; + } else if (strpos ($class, 'wrap_center') !== false ) { + $css_properties ['float'] = 'center'; + } else if (strpos ($class, 'wrap_right') !== false) { + $css_properties ['float'] = 'right'; + } + } + + // The display property has differing usage in CSS. So we better overwrite it. + $css_properties ['display'] = 'always'; + if ( stripos ($class, 'wrap_noprint') !== false ) { + $css_properties ['display'] = 'screen'; + } + if ( stripos ($class, 'wrap_onlyprint') !== false ) { + $css_properties ['display'] = 'printer'; + } + + $background_color = $css_properties ['background-color']; + $image = $css_properties ['background-image'] ?? null; + $margin_top = $css_properties ['margin-top']; + $margin_right = $css_properties ['margin-right']; + $margin_bottom = $css_properties ['margin-bottom']; + $margin_left = $css_properties ['margin-left']; + $width = $attr ['width']; + + // Open 2x1 table if image is present + // otherwise only a 1x1 table + $properties = array(); + $properties ['width'] = '100%'; + $properties ['align'] = 'center'; + $properties ['margin-top'] = $margin_top; + $properties ['margin-right'] = $margin_right; + $properties ['margin-bottom'] = $margin_bottom; + $properties ['margin-left'] = $margin_left; + + $frame_props = array(); + if (!empty($css_properties ['border'])) { + $frame_props ['border'] = $css_properties ['border']; + } else { + $frame_props ['border'] = 'none'; + } + $frame_props ['min-height'] = '1cm'; + $frame_props ['width'] = $attr ['width']; + $frame_props ['float'] = $css_properties ['float']; + if ( self::$table_entr > 1 ) { + $frame_props ['anchor-type'] = 'as-char'; + } else { + $frame_props ['anchor-type'] = 'paragraph'; + } + $frame_props ['textarea-horizontal-align'] = 'left'; + $frame_props ['run-through'] = 'foreground'; + $frame_props ['vertical-pos'] = 'from-top'; + $frame_props ['vertical-rel'] = 'paragraph'; + $frame_props ['horizontal-pos'] = 'from-left'; + $frame_props ['horizontal-rel'] = 'paragraph'; + $frame_props ['wrap'] = 'parallel'; + $frame_props ['number-wrapped-paragraphs'] = 'no-limit'; + if (!empty($frame_props ['float']) && + $frame_props ['float'] != 'center') { + $frame_props ['margin-top'] = '0cm'; + $frame_props ['margin-right'] = '0cm'; + $frame_props ['margin-bottom'] = '0cm'; + $frame_props ['margin-left'] = '0cm'; + $frame_props ['padding-top'] = '0cm'; + $frame_props ['padding-bottom'] = '0cm'; + } else { + // No wrapping on not floating divs + $frame_props ['wrap'] = 'none'; + } + + switch ($frame_props ['float']) { + case 'left': + if ( self::$table_entr == 1 ) { + $frame_props ['y'] = '0cm'; + $frame_props ['x'] = self::$box_left_pos.'cm'; + self::$box_left_pos += trim($frame_props ['width'], 'cm'); + } + $frame_props ['padding-left'] = '0cm'; + break; + case 'right': + $frame_props ['horizontal-rel'] = 'paragraph'; + $frame_props ['horizontal-pos'] = 'right'; + $frame_props ['padding-right'] = '0cm'; + break; + case 'center': + $frame_props ['horizontal-pos'] = 'center'; + break; + default: + $frame_props ['padding-left'] = '0cm'; + break; + } + $renderer->_odtOpenTextBoxUseProperties($frame_props); + + $renderer->_odtTableOpenUseProperties($properties); + + if (!empty($image)) { + $properties = array(); + $properties ['width'] = '2cm'; + $renderer->_odtTableAddColumnUseProperties($properties); + } + + $properties = array(); + $renderer->_odtTableAddColumnUseProperties($properties); + + $renderer->tablerow_open(); + + if (!empty($image)) { + $properties = array(); + $properties ['vertical-align'] = 'middle'; + $properties ['text-align'] = 'center'; + $properties ['padding'] = '0.1cm'; + $properties ['background-color'] = $background_color; + + $renderer->_odtTableCellOpenUseProperties($properties); + $renderer->_odtAddImage($image); + $renderer->tablecell_close(); + } + + $properties = array(); + $properties ['vertical-align'] = 'middle'; + $properties ['padding'] = '0.3cm'; + $properties ['background-color'] = $background_color; + $properties ['border'] = 'none'; + $renderer->_odtTableCellOpenUseProperties($properties); + } + + function renderODTCloseTable ($renderer) { + $renderer->tablecell_close(); + $renderer->tablerow_close(); + $renderer->_odtTableClose(); + $renderer->_odtCloseTextBox (); + $renderer->p_open(); + $renderer->p_close(); + + self::$table_entr -= 1; + } + + protected function getODTCommonStyleName ($class_string) { + static $map = array ( + 'wrap_box' => 'Box', 'wrap_danger' => 'Danger', 'wrap_warning' => 'Warning', + 'wrap_caution' => 'Caution', 'wrap_notice' => 'Notice', 'wrap_safety' => 'Safety', + 'wrap_info' => 'Info', 'wrap_important' => 'Important', 'wrap_alert' => 'Alert', + 'wrap_tip' => 'Tip', 'wrap_help' => 'Help', 'wrap_todo' => 'To do', + 'wrap_download' => 'Download', 'wrap_hi' => 'Highlighted', 'wrap_spoiler' => 'Spoiler', + 'wrap_leftalign' => 'Left aligned', 'wrap_rightalign' => 'Right aligned', + 'wrap_centeralign' => 'Centered', 'wrap_justify' => 'Justify', 'wrap_em' => 'Emphasised', + 'wrap_lo' => 'Less significant'); + $classes = explode(' ', $class_string); + $name = ''; + foreach ($classes as $class) { + if (array_key_exists($class, $map)) { + $name .= $map [$class]; + } + } + return ($name); + } +} |