22#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
33#define TRY(x) do { if (UNEXPECTED((x) != SUCCESS)) { return FAILURE; } } while (0)
72 const char *last_output = content;
75 const char *mask = attribute_mode ?
"&\xC2\"" :
"&\xC2<>";
78 size_t chunk_length =
strcspn(content, mask);
80 content += chunk_length;
81 if (*content ==
'\0') {
90 last_output = content + 1;
96 if (content[1] ==
'\xA0') {
100 last_output = content + 1;
109 last_output = content + 1;
117 last_output = content + 1;
123 last_output = content + 1;
136 if (!node->content) {
140 const xmlNode *parent = node->parent;
142 size_t name_length =
strlen((
const char *) parent->name);
146 if (dom_local_name_compare_ex(parent,
"style",
strlen(
"style"), name_length)
147 || dom_local_name_compare_ex(parent,
"script",
strlen(
"script"), name_length)
148 || dom_local_name_compare_ex(parent,
"xmp",
strlen(
"xmp"), name_length)
149 || dom_local_name_compare_ex(parent,
"iframe",
strlen(
"iframe"), name_length)
150 || dom_local_name_compare_ex(parent,
"noembed",
strlen(
"noembed"), name_length)
151 || dom_local_name_compare_ex(parent,
"noframes",
strlen(
"noframes"), name_length)
152 || dom_local_name_compare_ex(parent,
"plaintext",
strlen(
"plaintext"), name_length)) {
157 return dom_html5_escape_string(ctx, (
const char *) node->content,
false);
163 if (node->ns !=
NULL && node->ns->prefix !=
NULL
174 TRY(dom_html5_serialize_element_tag_name(ctx, node));
188 if (
strcmp((
const char *)
attr->name,
"xmlns") == 0) {
197 }
else if (
attr->ns->prefix ==
NULL) {
208 for (xmlNodePtr child =
attr->children; child !=
NULL; child = child->next) {
210 if (child->content !=
NULL) {
211 TRY(dom_html5_escape_string(ctx, (
const char *) child->content,
true));
215 TRY(dom_html5_escape_string(ctx, (
const char *) child->name,
true));
230static bool dom_html5_serializes_as_void(
const xmlNode *node)
233 size_t name_length =
strlen((
const char *) node->name);
235 dom_local_name_compare_ex(node,
"area",
strlen(
"area"), name_length)
236 || dom_local_name_compare_ex(node,
"base",
strlen(
"base"), name_length)
237 || dom_local_name_compare_ex(node,
"br",
strlen(
"br"), name_length)
238 || dom_local_name_compare_ex(node,
"col",
strlen(
"col"), name_length)
239 || dom_local_name_compare_ex(node,
"embed",
strlen(
"embed"), name_length)
240 || dom_local_name_compare_ex(node,
"hr",
strlen(
"hr"), name_length)
241 || dom_local_name_compare_ex(node,
"img",
strlen(
"img"), name_length)
242 || dom_local_name_compare_ex(node,
"input",
strlen(
"input"), name_length)
243 || dom_local_name_compare_ex(node,
"link",
strlen(
"link"), name_length)
244 || dom_local_name_compare_ex(node,
"meta",
strlen(
"meta"), name_length)
245 || dom_local_name_compare_ex(node,
"source",
strlen(
"source"), name_length)
246 || dom_local_name_compare_ex(node,
"track",
strlen(
"track"), name_length)
247 || dom_local_name_compare_ex(node,
"wbr",
strlen(
"wbr"), name_length)
249 || dom_local_name_compare_ex(node,
"basefont",
strlen(
"basefont"), name_length)
250 || dom_local_name_compare_ex(node,
"bgsound",
strlen(
"bgsound"), name_length)
251 || dom_local_name_compare_ex(node,
"frame",
strlen(
"frame"), name_length)
252 || dom_local_name_compare_ex(node,
"keygen",
strlen(
"keygen"), name_length)
253 || dom_local_name_compare_ex(node,
"param",
strlen(
"param"), name_length)) {
262 if (!dom_html5_serializes_as_void(node)) {
264 TRY(dom_html5_serialize_element_tag_name(ctx, node));
273 while (node !=
NULL) {
274 switch (node->type) {
276 TRY(dom_html5_serialize_doctype(ctx, (
const xmlDtd *) node));
282 TRY(dom_html5_serialize_text_node(ctx, node));
287 TRY(dom_html5_serialize_processing_instruction(ctx, node));
292 TRY(dom_html5_serialize_comment(ctx, node));
297 TRY(dom_html5_serialize_element_start(ctx, node));
298 const xmlNode *children = node->children;
303 if (!dom_html5_serializes_as_void(node)) {
309 TRY(dom_html5_serialize_element_end(ctx, node));
315 if (node->children) {
316 node = node->children;
324 TRY(dom_html5_serialize_entity_ref(ctx, node));
342 TRY(dom_html5_serialize_element_end(ctx, node));
344 }
while (node->next ==
NULL);
371 children = node->children;
377 return dom_html5_serialize_node(ctx, children, node);
384 node = node->children;
388 return dom_html5_serialize_node(ctx, node, node->parent);
390 xmlNodePtr old_next = node->next;
393 ((xmlNodePtr) node)->
next = old_next;
strcspn(string $string, string $characters, int $offset=0, ?int $length=null)
zend_result dom_html5_serialize_outer(dom_html5_serialize_context *ctx, const xmlNode *node)
zend_result dom_html5_serialize(dom_html5_serialize_context *ctx, const xmlNode *node)
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_html_magic_token
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_xmlns_magic_token
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_xlink_magic_token
PHP_DOM_EXPORT bool php_dom_ns_is_fast(const xmlNode *nodep, const php_dom_ns_magic_token *magic_token)
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_svg_magic_token
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_mathml_magic_token
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_xml_magic_token
const XML_HTML_DOCUMENT_NODE
const XML_CDATA_SECTION_NODE
const XML_DOCUMENT_FRAG_NODE
const XML_ENTITY_REF_NODE
xmlNodePtr php_dom_retrieve_templated_content(php_dom_private_data *private_data, const xmlNode *template_node)
zend_result(* write_string_len)(void *application_data, const char *buf, size_t len)
php_dom_private_data * private_data
zend_result(* write_string)(void *application_data, const char *buf)
strcmp(string $string1, string $string2)
ZEND_RESULT_CODE zend_result