diff options
author | Marius <mariausol@gmail.com> | 2013-05-19 20:40:34 +0300 |
---|---|---|
committer | Marius <mariausol@gmail.com> | 2013-05-19 20:40:34 +0300 |
commit | 13ec4b540e0d46c97fd7b089e0b7413da81e0a9f (patch) | |
tree | bebfa563a17c06b3bd3bf8f6f4ba6d025e00d107 /tex/context/base/l-string.lua | |
parent | 69ad13650cda027526271179e95b5294694143a1 (diff) | |
download | context-13ec4b540e0d46c97fd7b089e0b7413da81e0a9f.tar.gz |
beta 2013.05.19 19:27
Diffstat (limited to 'tex/context/base/l-string.lua')
-rw-r--r-- | tex/context/base/l-string.lua | 410 |
1 files changed, 205 insertions, 205 deletions
diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua index 77c076cc5..c87c57521 100644 --- a/tex/context/base/l-string.lua +++ b/tex/context/base/l-string.lua @@ -1,205 +1,205 @@ -if not modules then modules = { } end modules ['l-string'] = { - version = 1.001, - comment = "companion to luat-lib.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - -local string = string -local sub, gmatch, format, char, byte, rep, lower = string.sub, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower -local lpegmatch, patterns = lpeg.match, lpeg.patterns -local P, S, C, Ct, Cc, Cs = lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cs - --- Some functions are already defined in l-lpeg and maybe some from here will --- move there (unless we also expose caches). - --- if not string.split then --- --- function string.split(str,pattern) --- local t = { } --- if #str > 0 then --- local n = 1 --- for s in gmatch(str..pattern,"(.-)"..pattern) do --- t[n] = s --- n = n + 1 --- end --- end --- return t --- end --- --- end - --- function string.unquoted(str) --- return (gsub(str,"^([\"\'])(.*)%1$","%2")) -- interesting pattern --- end - -local unquoted = patterns.squote * C(patterns.nosquote) * patterns.squote - + patterns.dquote * C(patterns.nodquote) * patterns.dquote - -function string.unquoted(str) - return lpegmatch(unquoted,str) or str -end - --- print(string.unquoted("test")) --- print(string.unquoted([["t\"est"]])) --- print(string.unquoted([["t\"est"x]])) --- print(string.unquoted("\'test\'")) --- print(string.unquoted('"test"')) --- print(string.unquoted('"test"')) - -function string.quoted(str) - return format("%q",str) -- always double quote -end - -function string.count(str,pattern) -- variant 3 - local n = 0 - for _ in gmatch(str,pattern) do -- not for utf - n = n + 1 - end - return n -end - -function string.limit(str,n,sentinel) -- not utf proof - if #str > n then - sentinel = sentinel or "..." - return sub(str,1,(n-#sentinel)) .. sentinel - else - return str - end -end - -local stripper = patterns.stripper -local collapser = patterns.collapser -local longtostring = patterns.longtostring - -function string.strip(str) - return lpegmatch(stripper,str) or "" -end - -function string.collapsespaces(str) - return lpegmatch(collapser,str) or "" -end - -function string.longtostring(str) - return lpegmatch(longtostring,str) or "" -end - --- function string.is_empty(str) --- return not find(str,"%S") --- end - -local pattern = P(" ")^0 * P(-1) - -function string.is_empty(str) - if str == "" then - return true - else - return lpegmatch(pattern,str) and true or false - end -end - --- if not string.escapedpattern then --- --- local patterns_escapes = { --- ["%"] = "%%", --- ["."] = "%.", --- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", --- ["["] = "%[", ["]"] = "%]", --- ["("] = "%(", [")"] = "%)", --- -- ["{"] = "%{", ["}"] = "%}" --- -- ["^"] = "%^", ["$"] = "%$", --- } --- --- local simple_escapes = { --- ["-"] = "%-", --- ["."] = "%.", --- ["?"] = ".", --- ["*"] = ".*", --- } --- --- function string.escapedpattern(str,simple) --- return (gsub(str,".",simple and simple_escapes or patterns_escapes)) --- end --- --- function string.topattern(str,lowercase,strict) --- if str == "" then --- return ".*" --- else --- str = gsub(str,".",simple_escapes) --- if lowercase then --- str = lower(str) --- end --- if strict then --- return "^" .. str .. "$" --- else --- return str --- end --- end --- end --- --- end - ---- needs checking - -local anything = patterns.anything -local allescapes = Cc("%") * S(".-+%?()[]*") -- also {} and ^$ ? -local someescapes = Cc("%") * S(".-+%()[]") -- also {} and ^$ ? -local matchescapes = Cc(".") * S("*?") -- wildcard and single match - -local pattern_a = Cs ( ( allescapes + anything )^0 ) -local pattern_b = Cs ( ( someescapes + matchescapes + anything )^0 ) -local pattern_c = Cs ( Cc("^") * ( someescapes + matchescapes + anything )^0 * Cc("$") ) - -function string.escapedpattern(str,simple) - return lpegmatch(simple and pattern_b or pattern_a,str) -end - -function string.topattern(str,lowercase,strict) - if str=="" or type(str) ~= "string" then - return ".*" - elseif strict then - str = lpegmatch(pattern_c,str) - else - str = lpegmatch(pattern_b,str) - end - if lowercase then - return lower(str) - else - return str - end -end - --- print(string.escapedpattern("12+34*.tex",false)) --- print(string.escapedpattern("12+34*.tex",true)) --- print(string.topattern ("12+34*.tex",false,false)) --- print(string.topattern ("12+34*.tex",false,true)) - -function string.valid(str,default) - return (type(str) == "string" and str ~= "" and str) or default or nil -end - --- handy fallback - -string.itself = function(s) return s end - --- also handy (see utf variant) - -local pattern = Ct(C(1)^0) -- string and not utf ! - -function string.totable(str) - return lpegmatch(pattern,str) -end - --- handy from within tex: - -local replacer = lpeg.replacer("@","%%") -- Watch the escaped % in lpeg! - -function string.tformat(fmt,...) - return format(lpegmatch(replacer,fmt),...) -end - --- obsolete names: - -string.quote = string.quoted -string.unquote = string.unquoted +if not modules then modules = { } end modules ['l-string'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local string = string
+local sub, gmatch, format, char, byte, rep, lower = string.sub, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
+local lpegmatch, patterns = lpeg.match, lpeg.patterns
+local P, S, C, Ct, Cc, Cs = lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cs
+
+-- Some functions are already defined in l-lpeg and maybe some from here will
+-- move there (unless we also expose caches).
+
+-- if not string.split then
+--
+-- function string.split(str,pattern)
+-- local t = { }
+-- if #str > 0 then
+-- local n = 1
+-- for s in gmatch(str..pattern,"(.-)"..pattern) do
+-- t[n] = s
+-- n = n + 1
+-- end
+-- end
+-- return t
+-- end
+--
+-- end
+
+-- function string.unquoted(str)
+-- return (gsub(str,"^([\"\'])(.*)%1$","%2")) -- interesting pattern
+-- end
+
+local unquoted = patterns.squote * C(patterns.nosquote) * patterns.squote
+ + patterns.dquote * C(patterns.nodquote) * patterns.dquote
+
+function string.unquoted(str)
+ return lpegmatch(unquoted,str) or str
+end
+
+-- print(string.unquoted("test"))
+-- print(string.unquoted([["t\"est"]]))
+-- print(string.unquoted([["t\"est"x]]))
+-- print(string.unquoted("\'test\'"))
+-- print(string.unquoted('"test"'))
+-- print(string.unquoted('"test"'))
+
+function string.quoted(str)
+ return format("%q",str) -- always double quote
+end
+
+function string.count(str,pattern) -- variant 3
+ local n = 0
+ for _ in gmatch(str,pattern) do -- not for utf
+ n = n + 1
+ end
+ return n
+end
+
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
+ else
+ return str
+ end
+end
+
+local stripper = patterns.stripper
+local collapser = patterns.collapser
+local longtostring = patterns.longtostring
+
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
+end
+
+function string.collapsespaces(str)
+ return lpegmatch(collapser,str) or ""
+end
+
+function string.longtostring(str)
+ return lpegmatch(longtostring,str) or ""
+end
+
+-- function string.is_empty(str)
+-- return not find(str,"%S")
+-- end
+
+local pattern = P(" ")^0 * P(-1)
+
+function string.is_empty(str)
+ if str == "" then
+ return true
+ else
+ return lpegmatch(pattern,str) and true or false
+ end
+end
+
+-- if not string.escapedpattern then
+--
+-- local patterns_escapes = {
+-- ["%"] = "%%",
+-- ["."] = "%.",
+-- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+-- ["["] = "%[", ["]"] = "%]",
+-- ["("] = "%(", [")"] = "%)",
+-- -- ["{"] = "%{", ["}"] = "%}"
+-- -- ["^"] = "%^", ["$"] = "%$",
+-- }
+--
+-- local simple_escapes = {
+-- ["-"] = "%-",
+-- ["."] = "%.",
+-- ["?"] = ".",
+-- ["*"] = ".*",
+-- }
+--
+-- function string.escapedpattern(str,simple)
+-- return (gsub(str,".",simple and simple_escapes or patterns_escapes))
+-- end
+--
+-- function string.topattern(str,lowercase,strict)
+-- if str == "" then
+-- return ".*"
+-- else
+-- str = gsub(str,".",simple_escapes)
+-- if lowercase then
+-- str = lower(str)
+-- end
+-- if strict then
+-- return "^" .. str .. "$"
+-- else
+-- return str
+-- end
+-- end
+-- end
+--
+-- end
+
+--- needs checking
+
+local anything = patterns.anything
+local allescapes = Cc("%") * S(".-+%?()[]*") -- also {} and ^$ ?
+local someescapes = Cc("%") * S(".-+%()[]") -- also {} and ^$ ?
+local matchescapes = Cc(".") * S("*?") -- wildcard and single match
+
+local pattern_a = Cs ( ( allescapes + anything )^0 )
+local pattern_b = Cs ( ( someescapes + matchescapes + anything )^0 )
+local pattern_c = Cs ( Cc("^") * ( someescapes + matchescapes + anything )^0 * Cc("$") )
+
+function string.escapedpattern(str,simple)
+ return lpegmatch(simple and pattern_b or pattern_a,str)
+end
+
+function string.topattern(str,lowercase,strict)
+ if str=="" or type(str) ~= "string" then
+ return ".*"
+ elseif strict then
+ str = lpegmatch(pattern_c,str)
+ else
+ str = lpegmatch(pattern_b,str)
+ end
+ if lowercase then
+ return lower(str)
+ else
+ return str
+ end
+end
+
+-- print(string.escapedpattern("12+34*.tex",false))
+-- print(string.escapedpattern("12+34*.tex",true))
+-- print(string.topattern ("12+34*.tex",false,false))
+-- print(string.topattern ("12+34*.tex",false,true))
+
+function string.valid(str,default)
+ return (type(str) == "string" and str ~= "" and str) or default or nil
+end
+
+-- handy fallback
+
+string.itself = function(s) return s end
+
+-- also handy (see utf variant)
+
+local pattern = Ct(C(1)^0) -- string and not utf !
+
+function string.totable(str)
+ return lpegmatch(pattern,str)
+end
+
+-- handy from within tex:
+
+local replacer = lpeg.replacer("@","%%") -- Watch the escaped % in lpeg!
+
+function string.tformat(fmt,...)
+ return format(lpegmatch(replacer,fmt),...)
+end
+
+-- obsolete names:
+
+string.quote = string.quoted
+string.unquote = string.unquoted
|