@@ -350,7 +350,7 @@ ERL_NIF_TERM attributes_to_term(ErlNifEnv *env, lxb_dom_element_t *element,
350350
351351void node_to_tree (ErlNifEnv *env, fine::ResourcePtr<LazyHTML> &resource,
352352 lxb_dom_node_t *node, std::vector<ERL_NIF_TERM> &tree,
353- bool sort_attributes) {
353+ bool sort_attributes, bool skip_whitespace_nodes ) {
354354 if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) {
355355 auto element = lxb_dom_interface_element (node);
356356
@@ -366,7 +366,8 @@ void node_to_tree(ErlNifEnv *env, fine::ResourcePtr<LazyHTML> &resource,
366366 auto children = std::vector<ERL_NIF_TERM>();
367367 for (auto child = template_aware_first_child (node); child != NULL ;
368368 child = lxb_dom_node_next (child)) {
369- node_to_tree (env, resource, child, children, sort_attributes);
369+ node_to_tree (env, resource, child, children, sort_attributes,
370+ skip_whitespace_nodes);
370371 }
371372
372373 auto children_term = enif_make_list_from_array (
@@ -375,10 +376,19 @@ void node_to_tree(ErlNifEnv *env, fine::ResourcePtr<LazyHTML> &resource,
375376 tree.push_back (enif_make_tuple3 (env, name_term, attrs_term, children_term));
376377 } else if (node->type == LXB_DOM_NODE_TYPE_TEXT) {
377378 auto character_data = lxb_dom_interface_character_data (node);
378- auto term = fine::make_resource_binary (
379- env, resource, reinterpret_cast <char *>(character_data->data .data ),
380- character_data->data .length );
381- tree.push_back (term);
379+
380+ auto whitespace_size = leading_whitespace_size (character_data->data .data ,
381+ character_data->data .length );
382+
383+ if (whitespace_size == character_data->data .length &&
384+ skip_whitespace_nodes) {
385+ // Append nothing
386+ } else {
387+ auto term = fine::make_resource_binary (
388+ env, resource, reinterpret_cast <char *>(character_data->data .data ),
389+ character_data->data .length );
390+ tree.push_back (term);
391+ }
382392 } else if (node->type == LXB_DOM_NODE_TYPE_COMMENT) {
383393 auto character_data = lxb_dom_interface_character_data (node);
384394 auto term = fine::make_resource_binary (
@@ -390,11 +400,12 @@ void node_to_tree(ErlNifEnv *env, fine::ResourcePtr<LazyHTML> &resource,
390400}
391401
392402fine::Term to_tree (ErlNifEnv *env, ExLazyHTML ex_lazy_html,
393- bool sort_attributes) {
403+ bool sort_attributes, bool skip_whitespace_nodes ) {
394404 auto tree = std::vector<ERL_NIF_TERM>();
395405
396406 for (auto node : ex_lazy_html.resource ->nodes ) {
397- node_to_tree (env, ex_lazy_html.resource , node, tree, sort_attributes);
407+ node_to_tree (env, ex_lazy_html.resource , node, tree, sort_attributes,
408+ skip_whitespace_nodes);
398409 }
399410
400411 return enif_make_list_from_array (env, tree.data (),
0 commit comments