Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
GumboTag gumbo_tag_enum(const char* tagname) {
    return gumbo_tagn_enum(tagname, strlen(tagname));
}