doctype)) { serialize_document_in_html($serializer, $document); } elseif (is_xhtml_1_0_doctype($document->doctype)) { serialize_document_in_xhtml_1_0($serializer, $document); } else { serialize_document_in_xml($serializer, $document); } } function is_html_doctype($doctype) { return is_string($doctype->publicId) && (str_start_with($doctype->publicId, '-//W3C//DTD HTML') || str_start_with($doctype->publicId, '-//IETF//DTD HTML')); } function is_xhtml_1_0_doctype($doctype) { return is_string($doctype->publicId) && str_start_with($doctype->publicId, '-//W3C//DTD XHTML 1.0'); } function serialize_document_in_html($serializer, $document) { if (CUSTOM_HTML_SERIALIZATION) { require_once 'serialize_html.php'; serialize_html_document($serializer, $document); } else { $markup = $document->saveHTML(); if ($serializer->doctype_system_id() !== NULL) { $markup = replace_doctype_system_id($markup, $serializer->doctype_system_id()); } $markup = erase_w2ml_ns_decls($markup); $serializer->serialize($markup); } } function serialize_document_in_xhtml_1_0($serializer, $document) { $markup = $document->saveXML(); if ($serializer->options() & Serializer::NO_XML_DECL) { $markup = erase_xml_decl($markup); } if ($serializer->doctype_system_id() !== NULL) { $markup = replace_doctype_system_id($markup, $serializer->doctype_system_id()); } if ($serializer->options() & Serializer::NO_META_CONTENT_TYPE) { $markup = erase_meta_content_type($document, $markup); } if ($serializer->options() & Serializer::NO_W2ML_NS_DECL) { $markup = erase_w2ml_ns_decls($markup); } $serializer->serialize($markup); } function serialize_document_in_xml($serializer, $document) { $markup = $document->saveXML(); if ($serializer->options() & Serializer::NO_XML_DECL) { $markup = erase_xml_decl($markup); } if ($serializer->doctype_system_id() !== NULL) { $markup = replace_doctype_system_id($markup, $serializer->doctype_system_id()); } if ($serializer->options() & Serializer::NO_META_CONTENT_TYPE) { $markup = erase_meta_content_type($document, $markup); } $markup = clean_libxml_empty_tags($markup); if ($serializer->options() & Serializer::NO_W2ML_NS_DECL) { $markup = erase_w2ml_ns_decls($markup); } $serializer->serialize($markup); } # Libxml2 adds # out of nowhere when saving. Remove it from $markup if it does not appear in $document. function erase_meta_content_type($document, $markup) { if (FIX_SERIALIZE_META) { $markup = preg_replace('@@i', '', $markup, 1); } return $markup; } # Libxml2 add a space before '/' in empty tags. We don't need it for pure XML, so remove it. # Libxml2 does not use empty tags every time it could, so do it. function clean_libxml_empty_tags($markup) { if (FIX_SERIALIZE_EMPTY_TAGS) { $markup = preg_replace('@ />@', '/>', $markup); $markup = preg_replace('@<([^ >]+)([^>]*)>@', '<$1$2/>', $markup); } return $markup; } function erase_xml_decl($markup) { if (FIX_SERIALIZE_XML_DECL) { $markup = preg_replace('@<\\?xml [^>]*\\?>\\n@', '', $markup, 1); } return $markup; } function replace_doctype_system_id($markup, $system_id) { return preg_replace('@()@', '$1'.$system_id.'$4', $markup, 1); } # Remove W2ML namespace declarations from markup. function erase_w2ml_ns_decls($markup) { if (FIX_SERIALIZE_W2ML_NS_DECL) { $markup = preg_replace('@ xmlns(:[^=]+)?='. '([\'"])http://w2ml\\.org/2005/w2ml\\2@', '', $markup); } return $markup; } ?>