static void add_tag(lua_State *L, const GumboElement *element) { if (element->tag_namespace == GUMBO_NAMESPACE_SVG) { GumboStringPiece original_tag = element->original_tag; gumbo_tag_from_original_text(&original_tag); const char *normalized = gumbo_normalize_svg_tagname(&original_tag); if (normalized) { add_string(L, "tag", normalized); return; } } if (element->tag == GUMBO_TAG_UNKNOWN) { GumboStringPiece original_tag = element->original_tag; gumbo_tag_from_original_text(&original_tag); luaL_Buffer b; luaL_buffinit(L, &b); for (size_t i = 0, n = original_tag.length; i < n; i++) { const char c = original_tag.data[i]; luaL_addchar(&b, (c <= 'Z' && c >= 'A') ? c + 32 : c); } luaL_pushresult(&b); } else { lua_pushstring(L, gumbo_normalized_tagname(element->tag)); } lua_setfield(L, -2, "tag"); }
static void set_tag(lua_State *L, const GumboElement *element) { if (element->tag_namespace == GUMBO_NAMESPACE_SVG) { set_literal(L, "namespace", "svg"); GumboStringPiece original_tag = element->original_tag; gumbo_tag_from_original_text(&original_tag); const char *normalized = gumbo_normalize_svg_tagname(&original_tag); if (normalized) { set_string(L, "localName", normalized); return; } } else if (element->tag_namespace == GUMBO_NAMESPACE_MATHML) { set_literal(L, "namespace", "math"); } if (element->tag == GUMBO_TAG_UNKNOWN) { GumboStringPiece original_tag = element->original_tag; gumbo_tag_from_original_text(&original_tag); pushstring_lower(L, original_tag.data, original_tag.length); } else { lua_pushstring(L, gumbo_normalized_tagname(element->tag)); } lua_setfield(L, -2, "localName"); }
std::string GumboInterface::get_tag_name(GumboNode *node) { std::string tagname; if (node->type == GUMBO_NODE_DOCUMENT) { tagname = "#document"; return tagname; } else if ((node->type == GUMBO_NODE_TEXT) || (node->type == GUMBO_NODE_WHITESPACE)) { tagname = "#text"; return tagname; } else if (node->type == GUMBO_NODE_CDATA) { tagname = "#cdata"; return tagname; } tagname = gumbo_normalized_tagname(node->v.element.tag); if ((tagname.empty()) || (node->v.element.tag_namespace == GUMBO_NAMESPACE_SVG)) { // set up to examine original text of tag. GumboStringPiece gsp = node->v.element.original_tag; gumbo_tag_from_original_text(&gsp); // special handling for some svg tag names. if (node->v.element.tag_namespace == GUMBO_NAMESPACE_SVG) { const char * data = gumbo_normalize_svg_tagname(&gsp); // NOTE: data may not be null-terminated! // since case change only - length must be same as original // if no replacement found returns null, not original tag! if (data != NULL) { return std::string(data, gsp.length); } } if (tagname.empty()) { return std::string(gsp.data, gsp.length); } } return tagname; }