2 * LuCI Template - Lua binding
4 * Copyright (C) 2009-2018 Jo-Philipp Wich <jo@mein.io>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include "template_lualib.h"
21 static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname)
28 lua_pushinteger(L, errno);
29 lua_pushstring(L, strerror(errno));
33 lua_status = lua_load(L, template_reader, parser, chunkname);
38 rv = template_error(L, parser);
40 template_close(parser);
45 int template_L_parse(lua_State *L)
47 const char *file = luaL_checkstring(L, 1);
48 struct template_parser *parser = template_open(file);
50 return template_L_do_parse(L, parser, file);
53 int template_L_parse_string(lua_State *L)
56 const char *str = luaL_checklstring(L, 1, &len);
57 struct template_parser *parser = template_string(str, len);
59 return template_L_do_parse(L, parser, "[string]");
62 int template_L_utf8(lua_State *L)
65 const char *str = luaL_checklstring(L, 1, &len);
66 char *res = utf8(str, len);
70 lua_pushstring(L, res);
79 int template_L_pcdata(lua_State *L)
82 const char *str = luaL_checklstring(L, 1, &len);
83 char *res = pcdata(str, len);
87 lua_pushstring(L, res);
96 int template_L_striptags(lua_State *L)
99 const char *str = luaL_checklstring(L, 1, &len);
100 char *res = striptags(str, len);
104 lua_pushstring(L, res);
113 int template_L_urlencode(lua_State *L)
116 const char *str = luaL_checkstring(L, 1);
117 char *res = urlencode(str, &len);
121 lua_pushlstring(L, res, len);
135 int template_L_urldecode(lua_State *L)
138 const char *str = luaL_checkstring(L, 1);
139 int keep_plus = lua_toboolean(L, 2);
140 char *res = urldecode(str, &len, keep_plus == 1);
144 lua_pushlstring(L, res, len);
158 static int template_L_load_catalog(lua_State *L) {
159 const char *lang = luaL_optstring(L, 1, "en");
160 const char *dir = luaL_optstring(L, 2, NULL);
161 lua_pushboolean(L, !lmo_load_catalog(lang, dir));
165 static int template_L_close_catalog(lua_State *L) {
166 const char *lang = luaL_optstring(L, 1, "en");
167 lmo_close_catalog(lang);
171 static int template_L_change_catalog(lua_State *L) {
172 const char *lang = luaL_optstring(L, 1, "en");
173 lua_pushboolean(L, !lmo_change_catalog(lang));
177 static int template_L_translate(lua_State *L) {
181 const char *key = luaL_checklstring(L, 1, &len);
183 switch (lmo_translate(key, len, &tr, &trlen))
186 lua_pushlstring(L, tr, trlen);
194 lua_pushstring(L, "no catalog loaded");
198 static int template_L_hash(lua_State *L) {
200 const char *key = luaL_checklstring(L, 1, &len);
201 lua_pushinteger(L, sfh_hash(key, len));
207 static const luaL_reg R[] = {
208 { "parse", template_L_parse },
209 { "parse_string", template_L_parse_string },
210 { "utf8", template_L_utf8 },
211 { "pcdata", template_L_pcdata },
212 { "striptags", template_L_striptags },
213 { "urlencode", template_L_urlencode },
214 { "urldecode", template_L_urldecode },
215 { "load_catalog", template_L_load_catalog },
216 { "close_catalog", template_L_close_catalog },
217 { "change_catalog", template_L_change_catalog },
218 { "translate", template_L_translate },
219 { "hash", template_L_hash },
223 LUALIB_API int luaopen_luci_template_parser(lua_State *L) {
224 luaL_register(L, TEMPLATE_LUALIB_META, R);