/** * Parse children. We override this because the xml DOM hierarchy has rows, columns, and cells as children of table * we need to change the idml element hierarchy so tables are parents of rows which are parents of cells * @param DOMElement $parentNode */ protected function parseChildren($parentNode) { foreach ($parentNode->childNodes as $childNode) { if (IdmlParserHelper::isParsableChildIdmlObjectNode($childNode)) { $parsableObject = IdmlElementFactory::createFromNode($childNode); if (is_object($parsableObject)) { //set the parent first since sometimes parse requires or sets parent data $parsableObject->parentElement = $this; if (!IdmlParserHelper::isIdmlTagNode($childNode) && IdmlParserHelper::getIdmlObjectType($parsableObject) != "TableCell") { $this->childrenElements[] = $parsableObject; //don't set IdmlTable as parent for IdmlTableCell } $parsableObject->parse($childNode); } } } }
/** * Parse children. * * @param DOMNode $parentNode */ private function parseChildren($parentNode) { //same logic/code as for IdmlElement method - more comprehensive and easier to maintain foreach ($parentNode->childNodes as $childNode) { if (IdmlParserHelper::isParsableChildIdmlObjectNode($childNode)) { if (Configure::read("dev.idmlHtmlDebugOutput") == true) { CakeLog::debug(sprintf("[IdmlStory::parseChildren] Parse Story %8s %30s --> %sKb", $this->UID, $childNode->nodeName, round(memory_get_usage(true) / 1024))); } $parsableObject = IdmlElementFactory::createFromNode($childNode); //we must set the parent before parsing since children need parent $parsableObject->parentElement = $this; $parsableObject->parse($childNode); $this->childrenElements[] = $parsableObject; } } }
/** * Parse children. * @param DOMElement $parentNode */ protected function parseChildren($parentNode) { foreach ($parentNode->childNodes as $childNode) { if (IdmlParserHelper::isParsableChildIdmlObjectNode($childNode)) { $parsableObject = IdmlElementFactory::createFromNode($childNode); if (is_object($parsableObject)) { //set the parent first since sometimes parse requires or sets parent data $parsableObject->parentElement = $this; //set this parsable child object as a child of the parent (bypassing xml parent) $this->childrenElements[] = $parsableObject; $parsableObject->parse($childNode); } } } }
/** * @param DOMNode $node * @return IdmlElement $object */ public static function createFromNode(DOMNode $node) { if (IdmlParserHelper::isParsableChildIdmlObjectNode($node)) { $object = null; switch ($node->nodeName) { case 'Rectangle': // @TODO - determine whether spans should be used for rectangles parallel to the axes, and code accordingly // $object = new IdmlRectangle(); $object = new IdmlPolygon(); break; case 'TextFrame': $object = new IdmlTextFrame(); break; case 'Element': $object = new IdmlElement(); break; case 'CharacterStyleRange': $object = new IdmlCharacterRange(); break; case 'ParagraphStyleRange': $object = new IdmlParagraphRange(); break; case 'Image': case 'PDF': /* Adobe Illustrator PDF image */ /* Adobe Illustrator PDF image */ case 'EPS': /* Encapsulated Postscript image */ $object = new IdmlImage(); break; case 'Group': $object = new IdmlGroup(); break; case 'Story': $object = new IdmlStory(); break; case 'Change': $object = new IdmlChange(); break; case 'Content': $object = new IdmlContent(); break; case 'Br': $object = new IdmlBrContent(); break; case 'XMLElement': $object = new IdmlXmlElement(); break; case 'Table': $object = new IdmlTable(); break; case 'Cell': $object = new IdmlTableCell(); break; case 'Column': $object = new IdmlTableColumn(); break; case 'Row': $object = new IdmlTableRow(); break; case 'HyperlinkTextSource': $object = new IdmlHyperlink(); break; case 'HyperlinkTextDestination': $object = new IdmlHyperlinkDestination(); break; case 'Sound': $object = new IdmlSound(); break; case 'Movie': $object = new IdmlMovie(); break; case 'TextVariableInstance': $object = new IdmlTextVariableInstance(); break; case 'GraphicLine': $object = new IdmlGraphicLine(); break; case 'Polygon': $object = new IdmlPolygon(); break; case 'Oval': $object = new IdmlOval(); break; default: CakeLog::debug("[IdmlElementFactory::createFromNode] '{$node->nodeName}' not implemented"); $object = null; } return $object; } }
public function parseChildrenRecursively($node, $nodeNamespace) { // Within the node there are many, many attributes that we *may* be interested in foreach ($node->attributes as $key => $attr) { // For example <ParagraphStyle FontStyle="Regular" /> becomes: $idmlKeyValues['FontStyle'] => 'Regular' // For example, <Properties><AppliedFont>Minion Pro</AppliedFont></Properties> becomes: $idmlKeyValues['Properties::AppliedFont'] => 'Minion Pro' if ($nodeNamespace != '') { $key = $nodeNamespace . '->' . $key; } $this->idmlKeyValues[$key] = $attr->value; } // Now loop through all child elements foreach ($node->childNodes as $childNode) { if ($childNode->nodeType != XML_ELEMENT_NODE) { continue; } if (IdmlParserHelper::isParsableChildIdmlObjectNode($childNode) == true) { continue; } if ($nodeNamespace == '') { $key = $childNode->tagName; } else { $key = $nodeNamespace . '::' . $childNode->tagName; } $value = $childNode->textContent; $key = $this->makeUniqueKey($key); $this->idmlKeyValues[$key] = $value; $this->parseChildrenRecursively($childNode, $key); } }