summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/m-database.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/m-database.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/m-database.lua35
1 files changed, 23 insertions, 12 deletions
diff --git a/Master/texmf-dist/tex/context/base/m-database.lua b/Master/texmf-dist/tex/context/base/m-database.lua
index b9ec3aa3691..47854daa023 100644
--- a/Master/texmf-dist/tex/context/base/m-database.lua
+++ b/Master/texmf-dist/tex/context/base/m-database.lua
@@ -10,6 +10,7 @@ local sub, gmatch, format = string.sub, string.gmatch, string.format
local concat = table.concat
local lpegpatterns, lpegmatch, lpegsplitat = lpeg.patterns, lpeg.match, lpeg.splitat
local lpegP, lpegC, lpegS, lpegCt = lpeg.P, lpeg.C, lpeg.S, lpeg.Ct
+local stripstring = string.strip
-- One also needs to enable context.trace, here we only plug in some code (maybe
-- some day this tracker will also toggle the main context tracer.
@@ -20,12 +21,19 @@ local report_database = logs.reporter("database")
buffers.database = buffers.database or { }
+local l_tab = lpegpatterns.tab
+local l_space = lpegpatterns.space
+local l_comma = lpegpatterns.comma
+local l_empty = lpegS("\t\n\r ")^0 * lpegP(-1)
+
+local v_yes = interfaces.variables.yes
+
local separators = { -- not interfaced
- tab = lpegpatterns.tab,
- tabs = lpegpatterns.tab^1,
- comma = lpegpatterns.comma,
- space = lpegpatterns.space,
- spaces = lpegpatterns.space^1,
+ tab = l_tab,
+ tabs = l_tab^1,
+ comma = l_comma,
+ space = l_space,
+ spaces = l_space^1,
}
function buffers.database.process(settings)
@@ -46,6 +54,7 @@ function buffers.database.process(settings)
local first, last = settings.first or "", settings.last or ""
local left, right = settings.left or "", settings.right or ""
local setups = settings.setups or ""
+ local strip = settings.strip == v_yes or false
local command = settings.command
separatorchar = (not separatorchar and ",") or separators[separatorchar] or separatorchar
local separator = type(separatorchar) == "string" and lpegS(separatorchar) or separatorchar
@@ -54,7 +63,7 @@ function buffers.database.process(settings)
local quotedata = nil
for chr in gmatch(quotechar,".") do
local quotechar = lpegP(chr)
- local quoteword = quotechar * lpeg.C((1 - quotechar)^0) * quotechar
+ local quoteword = l_space^0 * quotechar * lpegC((1 - quotechar)^0) * quotechar * l_space^0
if quotedata then
quotedata = quotedata + quoteword
else
@@ -63,12 +72,12 @@ function buffers.database.process(settings)
end
whatever = quotedata + whatever
end
- local checker = commentchar ~= "" and lpeg.S(commentchar)
+ local checker = commentchar ~= "" and lpegS(commentchar)
local splitter = lpegCt(whatever * (separator * whatever)^0)
local found = false
for i=1,#data do
local line = data[i]
- if line ~= "" and (not checker or not lpegmatch(checker,line)) then
+ if not lpegmatch(l_empty,line) and (not checker or not lpegmatch(checker,line)) then
local list = lpegmatch(splitter,line)
if not found then
if setups ~= "" then
@@ -82,13 +91,14 @@ function buffers.database.process(settings)
local result, r = { }, 0
r = r + 1 ; result[r] = first
for j=1,#list do
+ local str = strip and stripstring(list[j]) or list[j]
r = r + 1 ; result[r] = left
if command == "" then
- r = r + 1 ; result[r] = list[j]
+ r = r + 1 ; result[r] = str
else
r = r + 1 ; result[r] = command
r = r + 1 ; result[r] = "{"
- r = r + 1 ; result[r] = list[j]
+ r = r + 1 ; result[r] = str
r = r + 1 ; result[r] = "}"
end
r = r + 1 ; result[r] = right
@@ -98,12 +108,13 @@ function buffers.database.process(settings)
else
context(first)
for j=1,#list do
+ local str = strip and stripstring(list[j]) or list[j]
context(left)
if command == "" then
- context(list[j])
+ context(str)
else
context(command)
- context(false,list[j])
+ context(false,str)
end
context(right)
end