X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Futil.lua;h=53e46a99dc85176b1461720d0446954ad1512e85;hp=c84df1a170f46f41d04cc1c8ac0cff72ed2cccd0;hb=a3cf596d37e4116a7068daaa724270a0898cb7da;hpb=9e2759ec348c4b44475fd594d91eab14e7e3220e diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index c84df1a17..53e46a99d 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -31,10 +31,11 @@ local debug = require "debug" local ldebug = require "luci.debug" local string = require "string" local coroutine = require "coroutine" +local cutil = require "luci.cutil" local getmetatable, setmetatable = getmetatable, setmetatable local rawget, rawset, unpack = rawget, rawset, unpack -local tostring, type, assert = tostring, type, assert +local tostring, type, assert = tostring, type, assert local ipairs, pairs, loadstring = ipairs, pairs, loadstring local require, pcall, xpcall = require, pcall, xpcall @@ -44,6 +45,7 @@ module "luci.util" -- -- Pythonic string formatting extension -- +--[[ getmetatable("").__mod = function(a, b) if not b then return a @@ -53,6 +55,7 @@ getmetatable("").__mod = function(a, b) return a:format(b) end end +]]-- -- @@ -60,6 +63,7 @@ end -- -- Instantiates a class +--[[ local function _instantiate(class, ...) local inst = setmetatable({}, {__index = class}) @@ -69,6 +73,7 @@ local function _instantiate(class, ...) return inst end +]]-- --- Create a Class object (Python-style object model). -- The class object can be instantiated by calling itself. @@ -84,12 +89,15 @@ end -- @return A class object -- @see instanceof -- @see clone +--[[ function class(base) return setmetatable({}, { __call = _instantiate, __index = base }) end +]]-- +class = cutil.class --- Test whether the given object is an instance of the given class. -- @param object Object instance @@ -97,6 +105,7 @@ end -- @return Boolean indicating whether the object is an instance -- @see class -- @see clone +--[[ function instanceof(object, class) local meta = getmetatable(object) while meta and meta.__index do @@ -107,6 +116,8 @@ function instanceof(object, class) end return false end +]]-- +instanceof = cutil.instanceof -- @@ -162,7 +173,7 @@ end function dumptable(t, maxdepth, i, seen) i = i or 0 seen = seen or setmetatable({}, {__mode="k"}) - + for k,v in pairs(t) do perror(string.rep("\t", i) .. tostring(k) .. "\t" .. tostring(v)) if type(v) == "table" and (not maxdepth or i < maxdepth) then @@ -193,15 +204,18 @@ end --- Create valid XML PCDATA from given string. -- @param value String value containing the data to escape -- @return String value containing the escaped data +--[[ function pcdata(value) - if not value then return end - value = tostring(value) - value = value:gsub("&", "&") - value = value:gsub('"', """) - value = value:gsub("'", "'") - value = value:gsub("<", "<") - return value:gsub(">", ">") + return value and tostring(value):gsub("[&\"'<>]", { + ["&"] = "&", + ['"'] = """, + ["'"] = "'", + ["<"] = "<", + [">"] = ">" + }) end +]]-- +pcdata = cutil.pcdata --- Strip HTML tags from given string. -- @param value String containing the HTML text @@ -257,9 +271,22 @@ end --- Remove leading and trailing whitespace from given string value. -- @param str String value containing whitespace padded data -- @return String value with leading and trailing space removed +--[[ function trim(str) return (str:gsub("^%s*(.-)%s*$", "%1")) end +]]-- +trim = cutil.trim + +--- Count the occurences of given substring in given string. +-- @param str String to search in +-- @param pattern String containing pattern to find +-- @return Number of found occurences +function cmatch(str, pat) + local count = 0 + for _ in str:gmatch(pat) do count = count + 1 end + return count +end --- Parse certain units from the given string and return the canonical integer -- value or 0 if the unit is unknown. Upper- or lower case is irrelevant. @@ -320,19 +347,40 @@ function parse_units(ustr) return val end ---- Combines two or more numerically indexed tables into one. +-- also register functions above in the central string class for convenience +string.escape = escape +string.pcdata = pcdata +string.striptags = striptags +string.split = split +string.trim = trim +string.cmatch = cmatch +string.parse_units = parse_units + + +--- Appends numerically indexed tables or single objects to a given table. +-- @param src Target table +-- @param ... Objects to insert +-- @return Target table +function append(src, ...) + for i, a in ipairs({...}) do + if type(a) == "table" then + for j, v in ipairs(a) do + src[#src+1] = v + end + else + src[#src+1] = a + end + end + return src +end + +--- Combines two or more numerically indexed tables and single objects into one table. -- @param tbl1 Table value to combine -- @param tbl2 Table value to combine -- @param ... More tables to combine -- @return Table value containing all values of given tables function combine(...) - local result = {} - for i, a in ipairs(arg) do - for j, v in ipairs(a) do - result[#result+1] = v - end - end - return result + return append({}, ...) end --- Checks whether the given table contains the given value. @@ -406,7 +454,7 @@ end function _serialize_table(t, seen) assert(not seen[t], "Recursion detected.") seen[t] = true - + local data = "" local idata = "" local ilen = 0 @@ -425,7 +473,7 @@ function _serialize_table(t, seen) for i = 1, ilen do local v = serialize_data(t[i], seen) idata = idata .. ( #idata > 0 and ", " or "" ) .. v - end + end return idata .. ( #data > 0 and #idata > 0 and ", " or "" ) .. data end @@ -438,7 +486,7 @@ end -- @see get_bytecode function serialize_data(val, seen) seen = seen or setmetatable({}, {__mode="k"}) - + if val == nil then return "nil" elseif type(val) == "number" then @@ -567,13 +615,12 @@ function _sortiter( t, f ) end local _pos = 0 - local _len = table.getn( keys ) table.sort( keys, f ) return function() _pos = _pos + 1 - if _pos <= _len then + if _pos <= #keys then return keys[_pos], t[keys[_pos]] end end @@ -634,11 +681,11 @@ function execi(command) return pp and function() local line = pp:read() - + if not line then pp:close() end - + return line end end