std::string GumboInterface::serialize(GumboNode* node, enum UpdateTypes doupdates) { // special case the document node if (node->type == GUMBO_NODE_DOCUMENT) { std::string results = build_doctype(node); results.append(serialize_contents(node, doupdates)); return results; } std::string close = ""; std::string closeTag = ""; std::string atts = ""; std::string tagname = get_tag_name(node); bool need_special_handling = in_set(special_handling, tagname); bool is_void_tag = in_set(void_tags, tagname); bool no_entity_substitution = in_set(no_entity_sub, tagname); // bool is_inline = in_set(nonbreaking_inline, tagname); bool is_href_src_tag = in_set(href_src_tags, tagname); // build attr string const GumboVector * attribs = &node->v.element.attributes; for (unsigned int i=0; i< attribs->length; ++i) { GumboAttribute* at = static_cast<GumboAttribute*>(attribs->data[i]); atts.append(build_attributes(at, no_entity_substitution, ((doupdates & SourceUpdates) && is_href_src_tag), (doupdates & StyleUpdates))); } // Make sure that the xmlns attribute exists as an html tag attribute if (tagname == "html") { if (atts.find("xmlns=") == std::string::npos) { atts.append(" xmlns=\"http://www.w3.org/1999/xhtml\""); } } // determine closing tag type if (is_void_tag) { close = "/"; } else { closeTag = "</" + tagname + ">"; } std::string contents; if ((tagname == "body") && (doupdates & BodyUpdates)) { contents = m_newbody; } else { // serialize your contents contents = serialize_contents(node, doupdates); } if ((doupdates & StyleUpdates) && (tagname == "style") && (node->parent->type == GUMBO_NODE_ELEMENT) && (node->parent->v.element.tag == GUMBO_TAG_HEAD)) { contents = update_style_urls(contents); } if (need_special_handling) { ltrimnewlines(contents); rtrim(contents); contents.append("\n"); } // build results std::string results; if ((doupdates & LinkUpdates) && (tagname == "link") && (node->parent->type == GUMBO_NODE_ELEMENT) && (node->parent->v.element.tag == GUMBO_TAG_HEAD)) { return ""; } results.append("<"+tagname+atts+close+">"); if (need_special_handling) results.append("\n"); results.append(contents); if ((doupdates & LinkUpdates) && (tagname == "head")) { results.append(m_newcsslinks); } results.append(closeTag); if (need_special_handling) results.append("\n"); return results; }
std::string GumboInterface::serialize(GumboNode* node, enum UpdateTypes doupdates) { // special case the document node if (node->type == GUMBO_NODE_DOCUMENT) { std::string results = build_doctype(node); results.append(serialize_contents(node, doupdates)); return results; } std::string close = ""; std::string closeTag = ""; std::string atts = ""; std::string tagname = get_tag_name(node); std::string key = "|" + tagname + "|"; bool need_special_handling = special_handling.find(key) != std::string::npos; bool is_empty_tag = empty_tags.find(key) != std::string::npos; bool no_entity_substitution = no_entity_sub.find(key) != std::string::npos; bool is_inline = nonbreaking_inline.find(key) != std::string::npos; bool is_href_src_tag = href_src_tags.find(key) != std::string::npos; // build attr string const GumboVector * attribs = &node->v.element.attributes; for (int i=0; i< attribs->length; ++i) { GumboAttribute* at = static_cast<GumboAttribute*>(attribs->data[i]); atts.append(build_attributes(at, no_entity_substitution, ((doupdates & SourceUpdates) && is_href_src_tag) )); } // determine closing tag type if (is_empty_tag) { close = "/"; } else { closeTag = "</" + tagname + ">"; } std::string contents; if ((tagname == "body") && (doupdates & BodyUpdates)) { contents = m_newbody; } else { // serialize your contents contents = serialize_contents(node, doupdates); } if (need_special_handling) { ltrimnewlines(contents); rtrim(contents); contents.append("\n"); } // build results std::string results; if ((doupdates & LinkUpdates) && (tagname == "link") && (node->parent->type == GUMBO_NODE_ELEMENT) && (node->parent->v.element.tag == GUMBO_TAG_HEAD)) { return ""; } results.append("<"+tagname+atts+close+">"); if (need_special_handling) results.append("\n"); results.append(contents); if ((doupdates & LinkUpdates) && (tagname == "head")) { results.append(m_newcsslinks); } results.append(closeTag); if (need_special_handling) results.append("\n"); return results; }