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>@', '<$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;
}
?>