X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fweb%2Fsrc%2Ftemplate_lualib.c;h=0d43641041091cdd68d82c0000da23e5fa40ac6d;hb=91b97bc9f625d09431dc1c753209a037d7c42fbc;hp=f91b19ceb85c07f1778771cc29d72b1adfa94feb;hpb=047d4e45f6d26d54d2019ff3d12e372fae3f2e22;p=project%2Fluci.git diff --git a/libs/web/src/template_lualib.c b/libs/web/src/template_lualib.c index f91b19ceb..0d4364104 100644 --- a/libs/web/src/template_lualib.c +++ b/libs/web/src/template_lualib.c @@ -21,47 +21,143 @@ int template_L_parse(lua_State *L) { const char *file = luaL_checkstring(L, 1); - struct template_parser parser; - int lua_status; + struct template_parser *parser = template_open(file); + int lua_status, rv; - if( (parser.fd = open(file, O_RDONLY)) > 0 ) + if (!parser) { - parser.flags = 0; - parser.bufsize = 0; - parser.state = T_STATE_TEXT_NEXT; + lua_pushnil(L); + lua_pushinteger(L, errno); + lua_pushstring(L, strerror(errno)); + return 3; + } + + lua_status = lua_load(L, template_reader, parser, file); + + if (lua_status == 0) + rv = 1; + else + rv = template_error(L, parser); + + template_close(parser); + + return rv; +} + +int template_L_utf8(lua_State *L) +{ + size_t len = 0; + const char *str = luaL_checklstring(L, 1, &len); + char *res = utf8(str, len); + + if (res != NULL) + { + lua_pushstring(L, res); + free(res); + + return 1; + } + + return 0; +} - lua_status = lua_load(L, template_reader, &parser, file); +int template_L_pcdata(lua_State *L) +{ + size_t len = 0; + const char *str = luaL_checklstring(L, 1, &len); + char *res = pcdata(str, len); - (void) close(parser.fd); + if (res != NULL) + { + lua_pushstring(L, res); + free(res); + return 1; + } - if( lua_status == 0 ) - { + return 0; +} + +int template_L_striptags(lua_State *L) +{ + size_t len = 0; + const char *str = luaL_checklstring(L, 1, &len); + char *res = striptags(str, len); + + if (res != NULL) + { + lua_pushstring(L, res); + free(res); + + return 1; + } + + return 0; +} + +static int template_L_load_catalog(lua_State *L) { + const char *lang = luaL_optstring(L, 1, "en"); + const char *dir = luaL_optstring(L, 2, NULL); + lua_pushboolean(L, !lmo_load_catalog(lang, dir)); + return 1; +} + +static int template_L_close_catalog(lua_State *L) { + const char *lang = luaL_optstring(L, 1, "en"); + lmo_close_catalog(lang); + return 0; +} + +static int template_L_change_catalog(lua_State *L) { + const char *lang = luaL_optstring(L, 1, "en"); + lua_pushboolean(L, !lmo_change_catalog(lang)); + return 1; +} + +static int template_L_translate(lua_State *L) { + size_t len; + char *tr; + int trlen; + const char *key = luaL_checklstring(L, 1, &len); + + switch (lmo_translate(key, len, &tr, &trlen)) + { + case 0: + lua_pushlstring(L, tr, trlen); return 1; - } - else - { - lua_pushnil(L); - lua_pushinteger(L, lua_status); - lua_pushlstring(L, parser.out, parser.outsize); - return 3; - } + + case -1: + return 0; } lua_pushnil(L); - lua_pushinteger(L, 255); - lua_pushstring(L, "No such file or directory"); - return 3; + lua_pushstring(L, "no catalog loaded"); + return 2; } +static int template_L_hash(lua_State *L) { + size_t len; + const char *key = luaL_checklstring(L, 1, &len); + lua_pushinteger(L, sfh_hash(key, len)); + return 1; +} + + /* module table */ static const luaL_reg R[] = { - {"parse", template_L_parse}, - {NULL, NULL} + { "parse", template_L_parse }, + { "utf8", template_L_utf8 }, + { "pcdata", template_L_pcdata }, + { "striptags", template_L_striptags }, + { "load_catalog", template_L_load_catalog }, + { "close_catalog", template_L_close_catalog }, + { "change_catalog", template_L_change_catalog }, + { "translate", template_L_translate }, + { "hash", template_L_hash }, + { NULL, NULL } }; LUALIB_API int luaopen_luci_template_parser(lua_State *L) { luaL_register(L, TEMPLATE_LUALIB_META, R); return 1; } -