libs/core: further fixes for luci.util.pcdata(), fix wrong character range and drop...
[project/luci.git] / libs / core / luasrc / util.lua
index 6498a49..79f01a6 100644 (file)
@@ -193,14 +193,25 @@ end
 --- Create valid XML PCDATA from given string.
 -- @param value        String value containing the data to escape
 -- @return             String value containing the escaped data
+local function _pcdata_repl(c)
+       local i = string.byte(c)
+
+       if ( i >= 0x00 and i <= 0x08 ) or ( i >= 0x0B and i <= 0x0C ) or
+          ( i >= 0x0E and i <= 0x1F ) or ( i == 0x7F )
+       then
+               return ""
+               
+       elseif ( i == 0x26 ) or ( i == 0x27 ) or ( i == 0x22 ) or
+              ( i == 0x3C ) or ( i == 0x3E )
+       then
+               return string.format("&#%i;", i)
+       end
+
+       return c
+end
+
 function pcdata(value)
-       return value and tostring(value):gsub("[&\"'<>]", {
-               ["&"] = "&#38;",
-               ['"'] = "&#34;",
-               ["'"] = "&#39;",
-               ["<"] = "&#60;",
-               [">"] = "&#62;"
-       })
+       return value and tostring(value):gsub("[&\"'<>%c]", _pcdata_repl)
 end
 
 --- Strip HTML tags from given string.
@@ -261,6 +272,16 @@ function trim(str)
        return (str:gsub("^%s*(.-)%s*$", "%1"))
 end
 
+--- 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.
 -- Recognized units are:
@@ -320,23 +341,40 @@ function parse_units(ustr)
        return val
 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 = {}
+-- 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
-                               result[#result+1] = v
+                               src[#src+1] = v
                        end
                else
-                       result[#result+1] = a
+                       src[#src+1] = a
                end
        end
-       return result
+       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(...)
+       return append({}, ...)
 end
 
 --- Checks whether the given table contains the given value.