documentElement); $serializer->serialize("\n"); } function serialize_html_doctype($serializer, $document) { if ($document->doctype !== NULL) { $serializer->serialize('doctype->name); $system_id = $serializer->doctype_system_id() !== NULL ? $serializer->doctype_system_id() : $document->doctype->systemId; if (is_string($document->doctype->publicId)) { $serializer->serialize(' PUBLIC "'. $document->doctype->publicId.'" "'. $system_id.'">'."\n"); } else { $serializer->serialize('SYSTEM "'. $document->doctype->publicId.'" "'. $system_id.'">'."\n"); } } } function serialize_html_element($serializer, $element) { $serializer->serialize('<'.$element->localName); serialize_html_attributes($serializer, $element); $serializer->serialize('>'); for ($child = $element->firstChild; $child !== NULL; $child = $child->nextSibling) { switch ($child->nodeType) { case XML_TEXT_NODE: $serializer->serialize(htmlspecialchars($child->nodeValue, ENT_NOQUOTES)); break; case XML_ELEMENT_NODE: serialize_html_element($serializer, $child); break; case XML_CDATA_SECTION_NODE: serialize_html_cdata($serializer, $child); break; case XML_PROCESSING_INSTRUCTION_NODE: serialize_html_pi($serializer, $child); break; case XML_COMMENT_NODE: serialize_html_comment($serializer, $child); break; case XML_ENTITY_REFERENCE_NODE: case XML_ENTITY_NODE: default: log_error('NYI: serialization of node type '.$child->nodeType, DEFAULT_LOG_LIMIT, LOG_ERR); } } if ($element->namespaceURI == '' && # true <=> NULL or empty string !is_empty_html_element_name(strtolower($element->localName))) { $serializer->serialize('localName.'>'); } elseif ($element->namespaceURI === XHTML_NS && !is_empty_html_element_name($element->localName)) { $serializer->serialize('localName.'>'); } } function is_empty_html_element_name($element_name) { static $empty_elements = array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'); return in_array($element_name, $empty_elements, TRUE); } function serialize_html_attributes($serializer, $element) { for ($i = 0; ($attr = $element->attributes->item($i)) !== NULL; ++$i) { $serializer->serialize(' '); serialize_html_attribute($serializer, $attr); } } function serialize_html_attribute($serializer, $attr) { if (preg_match('/^[\\w\\-\\.:]+$/', $attr->value) === 1) { $quote = ''; $value = $attr->value; } else { if (strchr($attr->value, '"') !== FALSE && strchr($attr->value, "'") === FALSE) { $quote = "'"; $value = htmlspecialchars($attr->value, ENT_NOQUOTES); } else { $quote = '"'; # Use str_replace instead of # htmlspecialchars($attr->value, ENT_COMPAT) to replace # '"' by '"' instead of '"'. $value = str_replace(array( '&', '"', '<', '>'), array('&', '"', '<', '>'), $attr->value); } } $serializer->serialize($attr->localName.'='.$quote.$value.$quote); } function serialize_html_cdata($serializer, $node) { $serializer->serialize('serialize($node->nodeValue); $serializer->serialize(']]>'); } function serialize_html_pi($serializer, $node) { $serializer->serialize('serialize($node->nodeName); $serializer->serialize($node->nodeValue); $serializer->serialize('?>'); } function serialize_html_comment($serializer, $node) { $serializer->serialize('