24 #include <boost/algorithm/string/trim.hpp>
38 if(lua_isstring(L, 1)) {
39 std::string str = lua_tostring(L, 1);
53 template<
bool conjunct>
57 auto values = lua_check<std::vector<t_string>>(L, 2);
67 if(lua_type(L, 2) == LUA_TSTRING) {
69 lua_getglobal(L,
"stringx");
73 }
else if(lua_type(L, 2) == LUA_TNUMBER) {
75 int len = lua_rawlen(L, 1);
76 int i = luaL_checkinteger(L, 2);
78 if(
i == 0 || abs(
i) > len) {
101 enum {BASIC, ESCAPED, PAREN, ANIM}
type = BASIC;
102 const std::string& str = luaL_checkstring(L, 1);
103 const std::string& sep = luaL_optstring(L, 2,
",");
104 std::string left, right;
106 if(lua_istable(L, 3)) {
117 return luaL_error(L,
"escape and expand_anim options are incompatible!");
120 left = luaL_checkstring(L, -1);
121 if(left.size() != 1) {
122 return luaL_error(L,
"escape must be a single character");
125 left = right = luaL_checkstring(L, -1);
129 right.push_back(
']');
132 left = luaL_checkstring(L, -2);
133 right = luaL_checkstring(L, -1);
135 if(left.find_first_of(
"[]") != std::string::npos || right.find_first_of(
"[]") != std::string::npos) {
136 return luaL_error(L,
"left and right cannot include square brackets [] if expand_anim is enabled");
140 right.push_back(
']');
147 if(
type != ESCAPED && left.size() != right.size()) {
148 return luaL_error(L,
"left and right need to be strings of the same length");
176 const std::string& str = luaL_checkstring(L, 1);
177 const std::string& left = luaL_optstring(L, 2,
"(");
178 const std::string& right = luaL_optstring(L, 3,
")");
179 if(left.size() != right.size()) {
180 return luaL_error(L,
"left and right need to be strings of the same length");
195 const std::string& str = luaL_checkstring(L, 1);
196 const std::string& sep = luaL_optstring(L, 2,
",");
197 const std::string& kv = luaL_optstring(L, 3,
":");
199 if(sep.size() != 1) {
200 return luaL_error(L,
"separator must be a single character");
203 return luaL_error(L,
"key_value_separator must be a single character");
206 if(lua_istable(L, 4)) {
215 dflt = luaL_checkstring(L, -1);
233 if(lua_istable(L, 1)) {
235 sep = luaL_optstring(L, 2,
",");
236 }
else if(lua_istable(L, 2)) {
237 sep = luaL_checkstring(L, 1);
239 }
else return luaL_error(L,
"invalid arguments to join, should have map and separator");
240 std::vector<std::string> pieces;
241 for(
int i = 1;
i <= luaL_len(L, list_idx);
i++) {
242 lua_getglobal(L,
"tostring");
243 lua_geti(L, list_idx,
i);
245 pieces.push_back(luaL_checkstring(L, -1));
264 if(lua_istable(L, 1)) {
266 sep = luaL_optstring(L, 2,
",");
267 kv = luaL_optstring(L, 3,
":");
268 }
else if(lua_istable(L, 2)) {
269 sep = luaL_checkstring(L, 1);
271 kv = luaL_optstring(L, 3,
":");
272 }
else if(lua_istable(L, 3)) {
273 sep = luaL_checkstring(L, 1);
274 kv = luaL_checkstring(L, 2);
276 }
else return luaL_error(L,
"invalid arguments to join_map, should have map, separator, and key_value_separator");
277 std::map<std::string, std::string> pieces;
278 for(lua_pushnil(L); lua_next(L, map_idx); ) {
279 int key_idx = lua_absindex(L, -2), val_idx = lua_absindex(L, -1);
280 lua_getglobal(L,
"tostring");
281 lua_pushvalue(L, key_idx);
283 std::string& val = pieces[luaL_checkstring(L, -1)];
284 lua_getglobal(L,
"tostring");
285 lua_pushvalue(L, val_idx);
287 val = luaL_checkstring(L, -1);
288 lua_settop(L, key_idx);
299 std::string str = luaL_checkstring(L, 1);
301 lua_pushlstring(L, str.c_str(), str.size());
308 int nargs = lua_gettop(L);
311 lua_getglobal(L,
"tostring");
318 lua_pushvalue(L, lua_upvalueindex(1));
322 lua_call(L, nargs, 1);
333 const std::string str = luaL_checkstring(L, 1);
334 if(luaL_opt(L, lua_toboolean, 2,
false)) {
336 lua_pushnumber(L, interval.first);
337 lua_pushnumber(L, interval.second);
340 lua_pushinteger(L, interval.first);
341 lua_pushinteger(L, interval.second);
347 auto& lk = lua_kernel_base::get_lua_kernel<lua_kernel_base>(L);
348 lk.add_log(
"Adding stringx module...\n");
349 static luaL_Reg
const str_callbacks[] = {
358 {
"format_conjunct_list", &intf_format_list<true> },
359 {
"format_disjunct_list", &intf_format_list<false> },
360 {
nullptr,
nullptr },
363 luaL_setfuncs(L, str_callbacks, 0);
365 lua_createtable(L, 0, 1);
366 lua_getglobal(L,
"string");
367 lua_setfield(L, -2,
"__index");
368 lua_setmetatable(L, -2);
371 lua_pushliteral(L,
"");
372 lua_getmetatable(L, -1);
374 lua_setfield(L, -2,
"__index");
375 lua_setmetatable(L, -2);
379 lua_getglobal(L,
"string");
380 lua_getfield(L, -1,
"format");
382 lua_setfield(L, -2,
"format");
A config object defines a single node in a WML file, with access to child nodes.
bool luaW_iststring(lua_State *L, int index)
config luaW_checkconfig(lua_State *L, int index)
Converts an optional table or vconfig to a config object.
bool luaW_toboolean(lua_State *L, int n)
bool luaW_tableget(lua_State *L, int index, const char *key)
bool luaW_getglobal(lua_State *L, const std::vector< std::string > &path)
Pushes the value found by following the variadic names (char *), if the value is not nil.
t_string luaW_checktstring(lua_State *L, int index)
Converts a scalar to a translatable string.
static int intf_str_split(lua_State *L)
Splits a string into parts according to options Arg 1: String to split Arg 2: Separator Arg 3: Option...
static int intf_str_map_split(lua_State *L)
Splits a string into a map Arg 1: string to split Arg 2: Separator for items Arg 3: Separator for key...
static int intf_parse_range(lua_State *L)
Parses a range string of the form a-b into an interval pair Accepts the string "infinity" as represen...
static int intf_format(lua_State *L)
Formats a message by interpolating WML variable syntax Arg 1: (optional) Logger Arg 2: Message.
static int intf_str_paren_split(lua_State *L)
Splits a string into parenthesized portions and portions between parenthesized portions Arg 1: String...
static int intf_format_list(lua_State *L)
Formats a list into human-readable format Arg 1: default value, used if the list is empty Arg 2: list...
static int intf_str_trim(lua_State *L)
Trims whitespace from the beginning and end of a string.
static int impl_str_index(lua_State *L)
Enables indexing a string by an integer, while also treating the stringx module as its metatable....
static int intf_str_join(lua_State *L)
Joins a list into a string; calls __tostring and __index metamethods Arg 1: list to join Arg 2: separ...
static int intf_str_format(lua_State *L)
static int intf_str_join_map(lua_State *L)
Joins a map into a string; calls __tostring metamethods (on both key and value) but not __index Arg 1...
int luaW_open(lua_State *L)
@ STRIP_SPACES
REMOVE_EMPTY: remove empty elements.
void trim(std::string_view &s)
std::string interpolate_variables_into_string(const std::string &str, const string_map *const symbols)
Function which will interpolate variables, starting with '$' in the string 'str' with the equivalent ...
std::map< std::string, std::string > map_split(const std::string &val, char major, char minor, int flags, const std::string &default_value)
Splits a string based on two separators into a map.
std::vector< std::string > quoted_split(const std::string &val, char c, int flags, char quote)
This function is identical to split(), except it does not split when it otherwise would if the previo...
std::string join_map(const T &v, const std::string &major=",", const std::string &minor=":")
t_string interpolate_variables_into_tstring(const t_string &tstr, const variable_set &variables)
Function that does the same as the above, for t_stringS.
std::vector< std::string > parenthetical_split(std::string_view val, const char separator, std::string_view left, std::string_view right, const int flags)
Splits a string based either on a separator, except then the text appears within specified parenthesi...
std::string format_disjunct_list(const t_string &empty, const std::vector< t_string > &elems)
Format a disjunctive list.
std::vector< std::string > square_parenthetical_split(const std::string &val, const char separator, const std::string &left, const std::string &right, const int flags)
Similar to parenthetical_split, but also expands embedded square brackets.
std::pair< int, int > parse_range(std::string_view str)
Recognises the following patterns, and returns a {min, max} pair.
std::string join(const T &v, const std::string &s=",")
Generates a new string joining container items in a list.
std::string format_conjunct_list(const t_string &empty, const std::vector< t_string > &elems)
Format a conjunctive list.
std::pair< double, double > parse_range_real(std::string_view str)
Recognises similar patterns to parse_range, and returns a {min, max} pair.
std::vector< std::string > split(const config_attribute_value &val)
void lua_push(lua_State *L, const T &val)
std::decay_t< T > luaW_table_get_def(lua_State *L, int index, std::string_view k, const T &def)
returns t[k] where k is the table at index index and k is k or def if it is not convertible to the co...