array ('style:name', 'style', false), 'style-page-usage' => array ('style:page-usage', 'style', false), ); static $layout_props_fields = array( // Fields belonging to "style:page-layout-properties" 'width' => array ('fo:page-width', 'props', true), 'height' => array ('fo:page-height', 'props', true), 'num-format' => array ('style:num-format', 'props', true), 'num-letter-sync' => array ('style:num-letter-sync', 'props', true), 'num-prefix' => array ('style:num-prefix', 'props', true), 'num-suffix' => array ('style:num-suffix', 'props', true), 'paper-tray-name' => array ('style:paper-tray-name', 'props', true), 'print-orientation' => array ('style:print-orientation', 'props', true), 'margin-left' => array ('fo:margin-left', 'props', true), 'margin-right' => array ('fo:margin-right', 'props', true), 'margin-top' => array ('fo:margin-top', 'props', true), 'margin-bottom' => array ('fo:margin-bottom', 'props', true), 'margin' => array ('fo:margin', 'props', true), 'border' => array ('fo:border', 'props', true), 'border-top' => array ('fo:border-top', 'props', true), 'border-right' => array ('fo:border-right', 'props', true), 'border-bottom' => array ('fo:border-bottom', 'props', true), 'border-left' => array ('fo:border-left', 'props', true), 'border-line-width' => array ('style:border-line-width', 'props', true), 'border-line-width-top' => array ('style:border-line-width-top', 'props', true), 'border-line-width-bottom' => array ('style:border-line-width-bottom', 'props', true), 'border-line-width-left' => array ('style:border-line-width-left', 'props', true), 'border-line-width-right' => array ('style:border-line-width-right', 'props', true), 'padding' => array ('fo:padding', 'props', true), 'padding-top' => array ('fo:padding-top', 'props', true), 'padding-bottom' => array ('fo:padding-bottom', 'props', true), 'padding-left' => array ('fo:padding-left', 'props', true), 'padding-right' => array ('fo:padding-right', 'props', true), 'shadow' => array ('style:shadow', 'props', true), 'background-color' => array ('fo:background-color', 'props', true), 'register-truth-ref-style-name' => array ('style:register-truth-ref-style-name', 'props', true), 'print' => array ('style:print', 'props', true), 'print-page-order' => array ('style:print-page-order', 'props', true), 'first-page-number' => array ('style:first-page-number', 'props', true), 'scale-to' => array ('style:scale-to', 'props', true), 'scale-to-pages' => array ('style:scale-to-pages', 'props', true), 'table-centering' => array ('style:table-centering', 'props', true), 'footnote-max-height' => array ('style:footnote-max-height', 'props', true), 'writing-mode' => array ('style:writing-mode', 'props', true), 'layout-grid-mode' => array ('style:layout-grid-mode', 'props', true), 'layout-grid-standard-mode' => array ('style:layout-grid-standard-mode', 'props', true), 'layout-grid-base-height' => array ('style:layout-grid-base-height', 'props', true), 'layout-grid-ruby-height' => array ('style:layout-grid-ruby-height', 'props', true), 'layout-grid-lines' => array ('style:layout-grid-lines', 'props', true), 'layout-grid-base-width' => array ('style:layout-grid-base-width', 'props', true), 'layout-grid-color' => array ('style:layout-grid-color', 'props', true), 'layout-grid-ruby-below' => array ('style:layout-grid-ruby-below', 'props', true), 'layout-grid-print' => array ('style:layout-grid-print', 'props', true), 'layout-grid-display' => array ('style:layout-grid-display', 'props', true), 'layout-grid-snap-to' => array ('style:layout-grid-snap-to', 'props', true), ); static $bgi_fields = array( // Fields belonging to "style:background-image" // The content of element "style:background-image" will be saved as is 'repeat' => array ('style:repeat', 'bgi', true), 'position' => array ('style:position', 'bgi', true), 'filter-name' => array ('style:filter-name', 'bgi', true), 'opacity' => array ('draw:opacity', 'bgi', true), 'xlink-type' => array ('xlink:type', 'bgi', true), 'xlink-href' => array ('xlink:href', 'bgi', true), 'xlink-show' => array ('xlink:show', 'bgi', true), 'xlink-actuate' => array ('xlink:actuate', 'bgi', true), ); static $columns_fields = array( // Fields belonging to "style:columns" // The content of element "style:columns" will be saved as is 'column-count' => array ('fo:column-count', 'columns', true), 'column-gap' => array ('fo:column-gap', 'columns', true), 'column-gap' => array ('fo:column-gap', 'columns', true), ); static $footnote_fields = array( // Fields belonging to "style:footnote-sep" 'ftsep-width' => array ('style:width', 'ftsep', true), 'ftsep-rel-width' => array ('style:rel-width', 'ftsep', true), 'ftsep-color' => array ('style:color', 'ftsep', true), 'ftsep-line-style' => array ('style:line-style', 'ftsep', true), 'ftsep-adjustment' => array ('style:adjustment', 'ftsep', true), 'ftsep-distance-before-sep' => array ('style:distance-before-sep', 'ftsep', true), 'ftsep-distance-after-sep' => array ('style:distance-after-sep', 'ftsep', true), ); protected $page_layout_style = array(); protected $layout_props = array(); protected $bgi_props = array(); protected $columns_props = array(); protected $footnote_props = array(); protected $content_bgi = NULL; protected $content_columns = NULL; protected $content_header = NULL; protected $content_footer = NULL; /** * Get the element name for the ODT XML encoding of the style. */ public function getElementName() { return 'style:page-layout'; } /** * Set style properties by importing values from a properties array. * Properties might be disabled by setting them in $disabled. * The style must have been previously created. * * @param $properties Properties to be imported * @param $disabled Properties to be ignored */ public function importProperties($properties, $disabled=array()) { $this->importPropertiesInternal(self::$page_layout_fields, $properties, $disabled, $this->page_layout_style); $this->importPropertiesInternal(self::$layout_props_fields, $properties, $disabled, $this->layout_props); $this->importPropertiesInternal(self::$bgi_fields, $properties, $disabled, $this->bgi_props); $this->importPropertiesInternal(self::$columns_fields, $properties, $disabled, $this->columns_props); $this->importPropertiesInternal(self::$footnote_props, $properties, $disabled, $this->footnote_fields); } /** * Check if a style is a common style. * * @return bool Is common style */ public function mustBeCommonStyle() { return false; } /** * Set a property. * * @param $property The name of the property to set * @param $value New value to set */ public function setProperty($property, $value) { if (array_key_exists ($property, self::$page_layout_fields)) { $this->setPropertyInternal ($property, self::$page_layout_fields [$property][0], $value, self::$page_layout_fields [$property][1], $this->page_layout_style); return; } if (array_key_exists ($property, self::$layout_props_fields)) { $this->setPropertyInternal ($property, self::$layout_props_fields [$property][0], $value, self::$layout_props_fields [$property][1], $this->layout_props); return; } if (array_key_exists ($property, self::$bgi_fields)) { $this->setPropertyInternal ($property, self::$bgi_fields [$property][0], $value, self::$bgi_fields [$property][1], $this->bgi_props); return; } if (array_key_exists ($property, self::$columns_fields)) { $this->setPropertyInternal ($property, self::$columns_fields [$property][0], $value, self::$columns_fields [$property][1], $this->columns_props); return; } if (array_key_exists ($property, self::$footnote_fields)) { $this->setPropertyInternal ($property, self::$footnote_fields [$property][0], $value, self::$footnote_fields [$property][1], $this->footnote_props); return; } } /** * Get the value of a property. * * @param $property The property name * @return string The current value of the property */ public function getProperty($property) { if (array_key_exists ($property, self::$page_layout_fields)) { return $this->page_layout_style [$property]['value']; } if (array_key_exists ($property, self::$layout_props_fields)) { return $this->layout_props [$property]['value']; } if (array_key_exists ($property, self::$bgi_fields)) { return $this->bgi_props [$property]['value']; } if (array_key_exists ($property, self::$columns_fields)) { return $this->columns_props [$property]['value']; } if (array_key_exists ($property, self::$footnote_fields)) { return $this->footnote_props [$property]['value']; } return NULL; } /** * Create new style by importing ODT style definition. * * @param $xmlCode Style definition in ODT XML format * @return ODTStyle New specific style */ static public function importODTStyle($xmlCode) { $style = new ODTPageLayoutStyle(); // Get attributes for element 'style:master-page' $open = XMLUtil::getElementOpenTag('style:page-layout', $xmlCode); if (!empty($open)) { $style->importODTStyleInternal(self::$page_layout_fields, $open, $style->page_layout_style); $childs = XMLUtil::getElementContent ('style:page-layout', $xmlCode); if (!empty($childs)) { // Get attributes for element 'style:page-layout-properties' $open = XMLUtil::getElementOpenTag('style:page-layout-properties', $childs); $style->content_header = XMLUtil::getElement ('style:header-style', $childs); $style->content_footer = XMLUtil::getElement ('style:footer-style', $childs); if (!empty($open)) { $style->importODTStyleInternal(self::$layout_props_fields, $open, $style->layout_props); $childs = XMLUtil::getElementContent ('style:page-layout-properties', $xmlCode); if (!empty($childs)) { // Get 'style:background-image' $open = XMLUtil::getElementOpenTag('style:background-image', $childs); if (!empty($open)) { $style->importODTStyleInternal(self::$bgi_fields, $open, $style->bgi_props); $style->content_bgi = XMLUtil::getElementContent ('style:background-image', $childs); } // Get 'style:columns' $open = XMLUtil::getElementOpenTag('style:columns', $childs); if (!empty($open)) { $style->importODTStyleInternal(self::$columns_fields, $open, $style->columns_props); $style->content_columns = XMLUtil::getElementContent ('style:columns', $childs); } // Get 'style:footnote-sep' $open = XMLUtil::getElementOpenTag('style:footnote-sep', $childs); if (!empty($open)) { $style->importODTStyleInternal(self::$footnote_fields, $open, $style->footnote_props); } } } } } return $style; } /** * Encode current style values in a string and return it. * * @return string ODT XML encoded style */ public function toString() { $layout_style = ''; $layout = ''; $bgi = ''; $columns = ''; $footnote = ''; // Get page layout style ODT properties foreach ($this->page_layout_style as $property => $items) { $layout_style .= $items ['odt_property'].'="'.$items ['value'].'" '; } // Get page layout properties ODT properties foreach ($this->layout_props as $property => $items) { $layout .= $items ['odt_property'].'="'.$items ['value'].'" '; } // Get background-image ODT properties foreach ($this->bgi_props as $property => $items) { $bgi .= $items ['odt_property'].'="'.$items ['value'].'" '; } // Get columns ODT properties foreach ($this->columns_props as $property => $items) { $columns .= $items ['odt_property'].'="'.$items ['value'].'" '; } // Get footnote-sep ODT properties foreach ($this->footnote_props as $property => $items) { $footnote .= $items ['odt_property'].'="'.$items ['value'].'" '; } // Build style. $style = '\n"; if ( !empty($layout) || !empty($bgi) || !empty($columns) || !empty($footnote) || !empty($this->content_bgi) || !empty($this->content_columns) ) { $style .= '\n"; if ( !empty($bgi) || !empty($this->content_bgi) ) { $style .= '\n"; $style .= $this->content_bgi; $style .= ''."\n"; } if ( !empty($columns) || !empty($content_columns) ) { $style .= '\n"; $style .= $this->content_columns; $style .= ''."\n"; } if ( !empty($footnote) ) { $style .= '\n"; } $style .= ''."\n"; } $style .= $this->content_header; $style .= $this->content_footer; $style .= '\n"; return $style; } /** * This function creates a page layout style with the parameters given in $properies. * * The currently supported properties are: * style-name, width, height, margin-top, margin-bottom, margin-right and margin-left. * All properties except the style-name are expected to be numeric values. * The function will add 'cm' itself, so do not add any units. * * The function returns the name of the new style or NULL if all relevant properties are empty. * * @author LarsDW223 * * @param $properties * @param null $disabled_props * @return ODTUnknownStyle or NULL */ public static function createPageLayoutStyle(array $properties, array $disabled_props = NULL) { // Create style name (if not given). $style_name = $properties ['style-name']; if ( empty($style_name) ) { $style_name = self::getNewStylename ('Page'); $properties ['style-name'] = $style_name; } $style = ' '; return self::importODTStyle($style); } }