diff options
Diffstat (limited to 'modules/luci-lua-runtime/src/template_lualib.c')
-rw-r--r-- | modules/luci-lua-runtime/src/template_lualib.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/modules/luci-lua-runtime/src/template_lualib.c b/modules/luci-lua-runtime/src/template_lualib.c new file mode 100644 index 0000000000..4efd9f1de6 --- /dev/null +++ b/modules/luci-lua-runtime/src/template_lualib.c @@ -0,0 +1,224 @@ +/* + * LuCI Template - Lua binding + * + * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lualib.h" + +static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname) +{ + int lua_status, rv; + + if (!parser) + { + lua_pushnil(L); + lua_pushinteger(L, errno); + lua_pushstring(L, strerror(errno)); + return 3; + } + + lua_status = lua_load(L, template_reader, parser, chunkname); + + if (lua_status == 0) + rv = 1; + else + rv = template_error(L, parser); + + template_close(parser); + + return rv; +} + +int template_L_parse(lua_State *L) +{ + const char *file = luaL_checkstring(L, 1); + struct template_parser *parser = template_open(file); + + return template_L_do_parse(L, parser, file); +} + +int template_L_parse_string(lua_State *L) +{ + size_t len; + const char *str = luaL_checklstring(L, 1, &len); + struct template_parser *parser = template_string(str, len); + + return template_L_do_parse(L, parser, "[string]"); +} + +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; +} + +int template_L_pcdata(lua_State *L) +{ + size_t len = 0; + const char *str = luaL_checklstring(L, 1, &len); + char *res = pcdata(str, len); + + if (res != NULL) + { + lua_pushstring(L, res); + free(res); + + return 1; + } + + 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 void template_L_get_translations_cb(uint32_t key, const char *val, int len, void *priv) { + lua_State *L = priv; + char hex[9]; + + luaL_checktype(L, 1, LUA_TFUNCTION); + snprintf(hex, sizeof(hex), "%08x", key); + + lua_pushvalue(L, 1); + lua_pushstring(L, hex); + lua_pushlstring(L, val, len); + lua_call(L, 2, 0); +} + +static int template_L_get_translations(lua_State *L) { + lmo_iterate(template_L_get_translations_cb, L); + return 0; +} + +static int template_L_translate(lua_State *L) { + size_t len, ctxlen = 0; + char *tr; + int trlen; + const char *key = luaL_checklstring(L, 1, &len); + const char *ctx = luaL_optlstring(L, 2, NULL, &ctxlen); + + switch (lmo_translate_ctxt(key, len, ctx, ctxlen, &tr, &trlen)) + { + case 0: + lua_pushlstring(L, tr, trlen); + return 1; + + case -1: + return 0; + } + + lua_pushnil(L); + lua_pushstring(L, "no catalog loaded"); + return 2; +} + +static int template_L_ntranslate(lua_State *L) { + size_t slen, plen, ctxlen = 0; + char *tr; + int trlen; + int n = luaL_checkinteger(L, 1); + const char *skey = luaL_checklstring(L, 2, &slen); + const char *pkey = luaL_checklstring(L, 3, &plen); + const char *ctx = luaL_optlstring(L, 4, NULL, &ctxlen); + + switch (lmo_translate_plural_ctxt(n, skey, slen, pkey, plen, ctx, ctxlen, &tr, &trlen)) + { + case 0: + lua_pushlstring(L, tr, trlen); + return 1; + + case -1: + return 0; + } + + lua_pushnil(L); + 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 }, + { "parse_string", template_L_parse_string }, + { "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 }, + { "get_translations", template_L_get_translations }, + { "translate", template_L_translate }, + { "ntranslate", template_L_ntranslate }, + { "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; +} |