@@ -99,6 +99,7 @@ static zend_always_inline xmlNodePtr lexbor_libxml2_bridge_new_text_node_fast(xm
99
99
static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert (
100
100
lxb_dom_node_t * start_node ,
101
101
xmlDocPtr lxml_doc ,
102
+ xmlNodePtr root ,
102
103
bool compact_text_nodes ,
103
104
bool create_default_ns ,
104
105
php_dom_libxml_ns_mapper * ns_mapper
@@ -114,7 +115,7 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
114
115
lexbor_array_obj_init (& work_list , WORK_LIST_INIT_SIZE , sizeof (work_list_item ));
115
116
116
117
for (lxb_dom_node_t * node = start_node ; node != NULL ; node = node -> prev ) {
117
- lexbor_libxml2_bridge_work_list_item_push (& work_list , node , LXB_NS__UNDEF , ( xmlNodePtr ) lxml_doc , NULL );
118
+ lexbor_libxml2_bridge_work_list_item_push (& work_list , node , LXB_NS__UNDEF , root , NULL );
118
119
}
119
120
120
121
work_list_item * current_stack_item ;
@@ -316,6 +317,7 @@ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_document(
316
317
lexbor_libxml2_bridge_status status = lexbor_libxml2_bridge_convert (
317
318
lxb_dom_interface_node (document )-> last_child ,
318
319
lxml_doc ,
320
+ (xmlNodePtr ) lxml_doc ,
319
321
compact_text_nodes ,
320
322
create_default_ns ,
321
323
ns_mapper
@@ -328,6 +330,35 @@ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_document(
328
330
return LEXBOR_LIBXML2_BRIDGE_STATUS_OK ;
329
331
}
330
332
333
+ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_fragment (
334
+ lxb_dom_node_t * start_node ,
335
+ xmlDocPtr lxml_doc ,
336
+ xmlNodePtr * fragment_out ,
337
+ bool compact_text_nodes ,
338
+ bool create_default_ns ,
339
+ php_dom_libxml_ns_mapper * ns_mapper
340
+ )
341
+ {
342
+ xmlNodePtr fragment = xmlNewDocFragment (lxml_doc );
343
+ if (UNEXPECTED (fragment == NULL )) {
344
+ return LEXBOR_LIBXML2_BRIDGE_STATUS_OOM ;
345
+ }
346
+ lexbor_libxml2_bridge_status status = lexbor_libxml2_bridge_convert (
347
+ start_node ,
348
+ lxml_doc ,
349
+ fragment ,
350
+ compact_text_nodes ,
351
+ create_default_ns ,
352
+ ns_mapper
353
+ );
354
+ if (status != LEXBOR_LIBXML2_BRIDGE_STATUS_OK ) {
355
+ xmlFreeNode (fragment );
356
+ return status ;
357
+ }
358
+ * fragment_out = fragment ;
359
+ return LEXBOR_LIBXML2_BRIDGE_STATUS_OK ;
360
+ }
361
+
331
362
void lexbor_libxml2_bridge_report_errors (
332
363
const lexbor_libxml2_bridge_parse_context * ctx ,
333
364
lxb_html_parser_t * parser ,
@@ -376,12 +407,22 @@ void lexbor_libxml2_bridge_report_errors(
376
407
* error_index_offset_tree = index ;
377
408
}
378
409
410
+ static php_libxml_quirks_mode dom_translate_quirks_mode (lxb_dom_document_cmode_t quirks_mode )
411
+ {
412
+ switch (quirks_mode ) {
413
+ case LXB_DOM_DOCUMENT_CMODE_NO_QUIRKS : return PHP_LIBXML_NO_QUIRKS ;
414
+ case LXB_DOM_DOCUMENT_CMODE_LIMITED_QUIRKS : return PHP_LIBXML_LIMITED_QUIRKS ;
415
+ case LXB_DOM_DOCUMENT_CMODE_QUIRKS : return PHP_LIBXML_QUIRKS ;
416
+ EMPTY_SWITCH_DEFAULT_CASE ();
417
+ }
418
+ }
419
+
379
420
void lexbor_libxml2_bridge_copy_observations (lxb_html_tree_t * tree , lexbor_libxml2_bridge_extracted_observations * observations )
380
421
{
381
422
observations -> has_explicit_html_tag = tree -> has_explicit_html_tag ;
382
423
observations -> has_explicit_head_tag = tree -> has_explicit_head_tag ;
383
424
observations -> has_explicit_body_tag = tree -> has_explicit_body_tag ;
384
- observations -> quirks_mode = lxb_dom_interface_document (tree -> document )-> compat_mode == LXB_DOM_DOCUMENT_CMODE_QUIRKS ;
425
+ observations -> quirks_mode = dom_translate_quirks_mode ( lxb_dom_interface_document (tree -> document )-> compat_mode ) ;
385
426
}
386
427
387
428
#endif /* HAVE_LIBXML && HAVE_DOM */
0 commit comments