static int parse(lua_State *L) { size_t input_len, tagname_len; GumboOptions options = kGumboDefaultOptions; options.max_errors = 0; const char *input = luaL_checklstring(L, 1, &input_len); options.tab_stop = (int)luaL_optinteger(L, 2, 8); const char *tagname = luaL_optlstring(L, 3, NULL, &tagname_len); if (tagname != NULL) { options.fragment_context = gumbo_tagn_enum(tagname, tagname_len); } static const char *namespaces[] = {"html", "svg", "math", NULL}; options.fragment_namespace = luaL_checkoption(L, 4, "html", namespaces); for (int i = 1; i <= nupvalues; i++) { luaL_checktype(L, i + 4, LUA_TTABLE); } lua_pushcclosure(L, push_document, nupvalues); GumboOutput *output = gumbo_parse_with_options(&options, input, input_len); if (output == NULL) { lua_pushnil(L); lua_pushliteral(L, "gumbo_parse_with_options() returned NULL"); return 2; } GumboOutputStatus status = output->status; if (status != GUMBO_STATUS_OK) { gumbo_destroy_output(output); lua_pushnil(L); lua_pushstring(L, gumbo_status_to_string(status)); return 2; } lua_pushlightuserdata(L, &output->document->v.document); int err = lua_pcall(L, 1, 1, 0); gumbo_destroy_output(output); if (err == 0) { // LUA_OK return 1; } else { lua_pushnil(L); lua_pushvalue(L, -2); return 2; } }
GumboTag gumbo_tag_enum(const char* tagname) { return gumbo_tagn_enum(tagname, strlen(tagname)); }