array ('style:name', 'style', false), 'style-display-name' => array ('style:display-name', 'style', false), 'style-parent' => array ('style:parent-style-name', 'style', false), 'style-class' => array ('style:class', 'style', true), 'style-family' => array ('style:family', 'style', true), 'style-next' => array ('style:next-style-name', 'style', true), 'style-list-level' => array ('style:list-level', 'style', true), 'style-list-style-name' => array ('style:list-style-name', 'style', true), 'style-master-page-name' => array ('style:master-page-name', 'style', true), 'style-auto-update' => array ('style:auto-update', 'style', true), 'style-data-style-name' => array ('style:data-style-name', 'style', true), 'style-percentage-data-style-name' => array ('style:percentage-data-style-name', 'style', true), 'style-default-outline-level' => array ('style:default-outline-level', 'style', true), ); static $get_family_callbacks = NULL; static $import_odt_callbacks = NULL; protected $is_default = false; /** * Constructor. */ public function __construct() { if (!isset(self::$get_family_callbacks)) self::$get_family_callbacks = array(); if (!isset(self::$import_odt_callbacks)) self::$import_odt_callbacks = array(); } static public function register ($classname) { self::$get_family_callbacks [] = array($classname, 'getFamily'); self::$import_odt_callbacks [] = array($classname, 'importODTStyle'); } /** * Get the element name for the ODT XML encoding of the style. * * @param $properties Properties to be imported * @param $disabled Properties to be ignored */ public function getElementName() { if ($this->isDefault() == true) { return 'style:default-style'; } return 'style:style'; } /** * Mark style as default style or not. * * @param $is_default */ public function setDefault($is_default) { $this->is_default = $is_default; } /** * Is this style a default style? * * @return boolean Is this a default style? */ public function isDefault() { return $this->is_default; } /** * Encode current style values in a string and return it. * * @return string ODT XML encoded style */ public function toString() { //FIXME: Handling for background-image-section $style = ''; $text = ''; $paragraph = ''; $table = ''; $table_column = ''; $table_row = ''; $table_cell = ''; $tab_stop = ''; $image = ''; foreach ($this->properties as $property => $items) { switch ($items ['section']) { case 'style': $style .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'text': $text .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'paragraph': $paragraph .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'table': $table .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'table-column': $table_column .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'table-row': $table_row .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'table-cell': $table_cell .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'tab-stop': $tab_stop .= $items ['odt_property'].'="'.$items ['value'].'" '; break; case 'table-cell-background-image': $image .= $items ['odt_property'].'="'.$items ['value'].'" '; break; } } // Build style. $element = $this->getElementName(); $style = '<'.$element.' '.$style.'>'."\n"; if ( !empty($paragraph) ) { if ( empty($tab_stop) ) { $style .= ' '."\n"; } else { $style .= ' '."\n"; $style .= ' '."\n"; $style .= ' '."\n"; } } if ( !empty($text) ) { $style .= ' '."\n"; } if ( !empty($table) ) { $style .= ' '."\n"; } if ( !empty($table_column) ) { $style .= ' '."\n"; } if ( !empty($table_row) ) { $style .= ' '."\n"; } if ( !empty($table_cell) ) { if (empty($image)) { $style .= ' '."\n"; } else { $style .= ' '."\n"; $style .=' '."\n"; $style .= ' '; } } $style .= ''."\n"; return $style; } /** * 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) { $matches = array(); if (preg_match ('/style:family="[^"]+"/', $xmlCode, $matches) !== 1) { return NULL; } $family = substr ($matches [0], strlen('style:family=')); $family = trim ($family, '"<>'); for ($index = 0 ; $index < count(self::$get_family_callbacks) ; $index++ ) { $curr_family = call_user_func(self::$get_family_callbacks [$index]); if ($curr_family == $family) { return call_user_func(self::$import_odt_callbacks [$index], $xmlCode); } } // Unknown/not implemented style family. // Return NULL, in this case ODTStyle will create a generic unknown style. return NULL; } /** * 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. Only those properties * will be accepted that are mentioned in the fields array. * * @param $style ODTStyle object for storing the properties * @param $fields Properties accepted by the object/class * @param $properties Properties to be imported * @param $disabled Properties to be ignored */ protected function importPropertiesInternal(array $fields, $properties, $disabled, &$dest=NULL) { parent::importPropertiesInternal($fields, $properties, $disabled, $dest); } /** * The function deletes all properties that do not belong to the styles section, * e.g. text properties or paragraph properties. */ public function clearLayoutProperties() { foreach ($this->properties as $property => $items) { switch ($items ['section']) { case 'style': // Keep it. break; default: // Delete everything that does not belong to the styles section. $this->properties [$property] = NULL; unset ($this->properties [$property]); break; } } } static public function getStyleProperties () { return self::$style_fields; } }