summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2010-03-12 19:49:00 +0100
committerHans Hagen <pragma@wxs.nl>2010-03-12 19:49:00 +0100
commitf8583123d8e264910387d015f4d6576551fe0ee4 (patch)
tree41d4aa093f2fbec9ca5d94af60f7ce75b9b1143d
parent6ef8510a630d227217d45ec510eea0f51bb9191f (diff)
downloadcontext-f8583123d8e264910387d015f4d6576551fe0ee4.tar.gz
beta 2010.03.12 19:49
-rw-r--r--scripts/context/lua/luatools.lua179
-rw-r--r--scripts/context/lua/mtxrun.lua201
-rw-r--r--scripts/context/stubs/mswin/luatools.lua179
-rw-r--r--scripts/context/stubs/mswin/mtxrun.lua201
-rwxr-xr-xscripts/context/stubs/unix/luatools179
-rwxr-xr-xscripts/context/stubs/unix/mtxrun201
-rw-r--r--tex/context/base/anch-pgr.mkiv2
-rw-r--r--tex/context/base/bibl-bib.lua5
-rw-r--r--tex/context/base/buff-ini.lua2
-rw-r--r--tex/context/base/buff-ini.mkiv6
-rw-r--r--tex/context/base/buff-ver.mkiv2
-rw-r--r--tex/context/base/cont-log.tex35
-rw-r--r--tex/context/base/cont-new.tex2
-rw-r--r--tex/context/base/context.tex2
-rw-r--r--tex/context/base/core-mis.mkiv2
-rw-r--r--tex/context/base/core-sys.mkiv2
-rw-r--r--tex/context/base/data-res.lua30
-rw-r--r--tex/context/base/data-tex.lua2
-rw-r--r--tex/context/base/enco-ini.mkiv4
-rw-r--r--tex/context/base/font-ini.mkiv32
-rw-r--r--tex/context/base/l-aux.lua32
-rw-r--r--tex/context/base/l-dir.lua6
-rw-r--r--tex/context/base/l-file.lua9
-rw-r--r--tex/context/base/l-lpeg.lua124
-rw-r--r--tex/context/base/l-os.lua8
-rw-r--r--tex/context/base/lxml-lpt.lua10
-rw-r--r--tex/context/base/lxml-tab.lua22
-rw-r--r--tex/context/base/lxml-tex.lua43
-rw-r--r--tex/context/base/math-ali.mkiv4
-rw-r--r--tex/context/base/math-arr.mkiv12
-rw-r--r--tex/context/base/math-ini.mkiv8
-rw-r--r--tex/context/base/node-rul.mkiv4
-rw-r--r--tex/context/base/pack-rul.mkiv8
-rw-r--r--tex/context/base/page-mar.mkiv2
-rw-r--r--tex/context/base/page-str.mkiv69
-rw-r--r--tex/context/base/prop-ini.mkiv16
-rw-r--r--tex/context/base/spac-fnt.mkiv3
-rw-r--r--tex/context/base/spac-ver.lua8
-rw-r--r--tex/context/base/spac-ver.mkiv222
-rw-r--r--tex/context/base/strc-blk.lua2
-rw-r--r--tex/context/base/strc-def.mkiv1
-rw-r--r--tex/context/base/strc-des.mkiv30
-rw-r--r--tex/context/base/strc-flt.mkiv42
-rw-r--r--tex/context/base/strc-lnt.mkiv6
-rw-r--r--tex/context/base/strc-mar.mkiv6
-rw-r--r--tex/context/base/strc-ref.mkiv2
-rw-r--r--tex/context/base/strc-reg.mkiv6
-rw-r--r--tex/context/base/strc-ren.mkiv54
-rw-r--r--tex/context/base/strc-sec.mkiv20
-rw-r--r--tex/context/base/strc-syn.mkiv12
-rw-r--r--tex/context/base/syst-aux.mkiv5
-rw-r--r--tex/context/base/tabl-tab.mkiv4
-rw-r--r--tex/context/base/type-ini.mkiv2
-rw-r--r--tex/context/base/x-asciimath.lua2
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua131
55 files changed, 1188 insertions, 1015 deletions
diff --git a/scripts/context/lua/luatools.lua b/scripts/context/lua/luatools.lua
index 1a579eb69..ea3b47840 100644
--- a/scripts/context/lua/luatools.lua
+++ b/scripts/context/lua/luatools.lua
@@ -336,57 +336,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -397,7 +395,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -463,37 +461,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1720,7 +1712,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1800,13 +1792,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2318,6 +2312,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2549,6 +2552,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2717,7 +2722,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2784,7 +2789,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3386,6 +3391,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3558,21 +3572,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -5671,22 +5678,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index ef7eda9b0..447d958b2 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -345,57 +345,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -406,7 +404,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -472,37 +470,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1729,7 +1721,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1809,13 +1801,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2327,6 +2321,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2558,6 +2561,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2726,7 +2731,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2793,7 +2798,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3196,6 +3201,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3368,21 +3382,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -3820,6 +3827,7 @@ local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatabl
local format, lower, find, match = string.format, string.lower, string.find, string.match
local utfchar = unicode.utf8.char
local lpegmatch = lpeg.match
+local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
--[[ldx--
<p>First a hack to enable namespace resolving. A namespace is characterized by
@@ -3831,7 +3839,7 @@ much cleaner.</p>
xml.xmlns = xml.xmlns or { }
-local check = lpeg.P(false)
+local check = P(false)
local parse = check
--[[ldx--
@@ -3844,8 +3852,8 @@ xml.registerns("mml","mathml")
--ldx]]--
function xml.registerns(namespace, pattern) -- pattern can be an lpeg
- check = check + lpeg.C(lpeg.P(lower(pattern))) / namespace
- parse = lpeg.P { lpeg.P(check) + 1 * lpeg.V(1) }
+ check = check + C(P(lower(pattern))) / namespace
+ parse = P { P(check) + 1 * V(1) }
end
--[[ldx--
@@ -4123,8 +4131,6 @@ local function fromdec(s)
end
end
-local P, S, R, C, V, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cs
-
local rest = (1-P(";"))^0
local many = P(1)^0
@@ -4226,10 +4232,7 @@ local valid = R('az', 'AZ', '09') + S('_-.')
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
-
-local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
- P('\255\254') + P('\254\255') + P('\239\187\191') -- no capture
-
+local utfbom = lpeg.patterns.utfbom -- no capture
local spacing = C(space^0)
----- entitycontent = (1-open-semicolon)^0
@@ -4314,10 +4317,10 @@ local doctype = (spacing * begindoctype * somedoctype * enddoct
-- nicer but slower:
--
--- local instruction = (lpeg.Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
--- local comment = (lpeg.Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
--- local cdata = (lpeg.Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
--- local doctype = (lpeg.Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
+-- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
+-- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
+-- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
+-- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
local trailer = space^0 * (text_unparsed/set_message)^0
@@ -8765,22 +8768,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/scripts/context/stubs/mswin/luatools.lua b/scripts/context/stubs/mswin/luatools.lua
index 1a579eb69..ea3b47840 100644
--- a/scripts/context/stubs/mswin/luatools.lua
+++ b/scripts/context/stubs/mswin/luatools.lua
@@ -336,57 +336,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -397,7 +395,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -463,37 +461,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1720,7 +1712,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1800,13 +1792,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2318,6 +2312,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2549,6 +2552,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2717,7 +2722,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2784,7 +2789,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3386,6 +3391,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3558,21 +3572,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -5671,22 +5678,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index ef7eda9b0..447d958b2 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -345,57 +345,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -406,7 +404,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -472,37 +470,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1729,7 +1721,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1809,13 +1801,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2327,6 +2321,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2558,6 +2561,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2726,7 +2731,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2793,7 +2798,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3196,6 +3201,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3368,21 +3382,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -3820,6 +3827,7 @@ local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatabl
local format, lower, find, match = string.format, string.lower, string.find, string.match
local utfchar = unicode.utf8.char
local lpegmatch = lpeg.match
+local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
--[[ldx--
<p>First a hack to enable namespace resolving. A namespace is characterized by
@@ -3831,7 +3839,7 @@ much cleaner.</p>
xml.xmlns = xml.xmlns or { }
-local check = lpeg.P(false)
+local check = P(false)
local parse = check
--[[ldx--
@@ -3844,8 +3852,8 @@ xml.registerns("mml","mathml")
--ldx]]--
function xml.registerns(namespace, pattern) -- pattern can be an lpeg
- check = check + lpeg.C(lpeg.P(lower(pattern))) / namespace
- parse = lpeg.P { lpeg.P(check) + 1 * lpeg.V(1) }
+ check = check + C(P(lower(pattern))) / namespace
+ parse = P { P(check) + 1 * V(1) }
end
--[[ldx--
@@ -4123,8 +4131,6 @@ local function fromdec(s)
end
end
-local P, S, R, C, V, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cs
-
local rest = (1-P(";"))^0
local many = P(1)^0
@@ -4226,10 +4232,7 @@ local valid = R('az', 'AZ', '09') + S('_-.')
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
-
-local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
- P('\255\254') + P('\254\255') + P('\239\187\191') -- no capture
-
+local utfbom = lpeg.patterns.utfbom -- no capture
local spacing = C(space^0)
----- entitycontent = (1-open-semicolon)^0
@@ -4314,10 +4317,10 @@ local doctype = (spacing * begindoctype * somedoctype * enddoct
-- nicer but slower:
--
--- local instruction = (lpeg.Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
--- local comment = (lpeg.Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
--- local cdata = (lpeg.Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
--- local doctype = (lpeg.Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
+-- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
+-- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
+-- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
+-- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
local trailer = space^0 * (text_unparsed/set_message)^0
@@ -8765,22 +8768,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/scripts/context/stubs/unix/luatools b/scripts/context/stubs/unix/luatools
index 1a579eb69..ea3b47840 100755
--- a/scripts/context/stubs/unix/luatools
+++ b/scripts/context/stubs/unix/luatools
@@ -336,57 +336,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -397,7 +395,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -463,37 +461,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1720,7 +1712,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1800,13 +1792,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2318,6 +2312,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2549,6 +2552,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2717,7 +2722,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2784,7 +2789,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3386,6 +3391,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3558,21 +3572,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -5671,22 +5678,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index ef7eda9b0..447d958b2 100755
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -345,57 +345,55 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.hex = P("0x") * R("09","AF")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -406,7 +404,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -472,37 +470,31 @@ end
--~ from roberto's site:
--~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
+--~ local function f1 = string.byte
+--~
+--~ local function f2(s)
--~ local c1, c2 = string.byte(s, 1, 2)
--~ return c1 * 64 + c2 - 12416
--~ end
--~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
+--~ local function f3(s)
--~ local c1, c2, c3 = string.byte(s, 1, 3)
--~ return (c1 * 64 + c2) * 64 + c3 - 925824
--~ end
--~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
+--~ local function f4(s)
--~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
--~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
--~ end
--~
--~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
+--~ local utf8 = lpeg.R("\0\127") / f1
--~ + lpeg.R("\194\223") * cont / f2
--~ + lpeg.R("\224\239") * cont * cont / f3
--~ + lpeg.R("\240\244") * cont * cont * cont / f4
--~
--~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
-
end -- of closure
@@ -1729,7 +1721,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -1809,13 +1801,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
@@ -2327,6 +2321,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- of closure
@@ -2558,6 +2561,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -2726,7 +2731,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -2793,7 +2798,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
@@ -3196,6 +3201,15 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
@@ -3368,21 +3382,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
@@ -3820,6 +3827,7 @@ local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatabl
local format, lower, find, match = string.format, string.lower, string.find, string.match
local utfchar = unicode.utf8.char
local lpegmatch = lpeg.match
+local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
--[[ldx--
<p>First a hack to enable namespace resolving. A namespace is characterized by
@@ -3831,7 +3839,7 @@ much cleaner.</p>
xml.xmlns = xml.xmlns or { }
-local check = lpeg.P(false)
+local check = P(false)
local parse = check
--[[ldx--
@@ -3844,8 +3852,8 @@ xml.registerns("mml","mathml")
--ldx]]--
function xml.registerns(namespace, pattern) -- pattern can be an lpeg
- check = check + lpeg.C(lpeg.P(lower(pattern))) / namespace
- parse = lpeg.P { lpeg.P(check) + 1 * lpeg.V(1) }
+ check = check + C(P(lower(pattern))) / namespace
+ parse = P { P(check) + 1 * V(1) }
end
--[[ldx--
@@ -4123,8 +4131,6 @@ local function fromdec(s)
end
end
-local P, S, R, C, V, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cs
-
local rest = (1-P(";"))^0
local many = P(1)^0
@@ -4226,10 +4232,7 @@ local valid = R('az', 'AZ', '09') + S('_-.')
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
-
-local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
- P('\255\254') + P('\254\255') + P('\239\187\191') -- no capture
-
+local utfbom = lpeg.patterns.utfbom -- no capture
local spacing = C(space^0)
----- entitycontent = (1-open-semicolon)^0
@@ -4314,10 +4317,10 @@ local doctype = (spacing * begindoctype * somedoctype * enddoct
-- nicer but slower:
--
--- local instruction = (lpeg.Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
--- local comment = (lpeg.Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
--- local cdata = (lpeg.Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
--- local doctype = (lpeg.Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
+-- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
+-- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
+-- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
+-- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
local trailer = space^0 * (text_unparsed/set_message)^0
@@ -8765,22 +8768,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index 7a8fcd07f..19a44d687 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -950,7 +950,7 @@
\c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]%
\getparameters[\??td#1][#2]%
\doifvalue{\??td#1\c!state}\v!start\checktextbackgrounds
- \unexpanded\setvalue{#1}%
+ \setuvalue{#1}%
{\groupedcommand{\starttextbackground[#1]}{\stoptextbackground}}%
\setvalue{\e!start#1}{\starttextbackground[#1]}%
\setvalue{\e!stop #1}{\stoptextbackground}%
diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua
index b3199a506..8c76465c2 100644
--- a/tex/context/base/bibl-bib.lua
+++ b/tex/context/base/bibl-bib.lua
@@ -82,10 +82,7 @@ local function add(a,b) if b then return a..b else return a end end
local keyword = lpeg.C((lpeg.R("az","AZ","09") + lpeg.S("@_:-"))^1) -- lpeg.C((1-space)^1)
local s_quoted = ((escape*single) + collapsed + (1-single))^0
local d_quoted = ((escape*double) + collapsed + (1-double))^0
-local balanced = lpeg.P {
- [1] = ((escape * (left+right)) + (1 - (left+right)) + lpeg.V(2))^0,
- [2] = left * lpeg.V(1) * right
-}
+local balanced = lpeg.patterns.balanced
local s_value = (single/"") * s_quoted * (single/"")
local d_value = (double/"") * d_quoted * (double/"")
diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua
index 129182741..0e17e23b0 100644
--- a/tex/context/base/buff-ini.lua
+++ b/tex/context/base/buff-ini.lua
@@ -258,7 +258,7 @@ function buffers.run(name,list,encapsulate)
end
end
-local printer = (lpeg.linebyline/texprint)^0
+local printer = (lpeg.patterns.textline/texprint)^0
function buffers.get(name)
local b = buffers.data[name]
diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
index c6300a624..dea7b0a49 100644
--- a/tex/context/base/buff-ini.mkiv
+++ b/tex/context/base/buff-ini.mkiv
@@ -161,9 +161,9 @@
\doglobal\increment\nofdefinedbuffers
\letvalue{\??bu#1\c!number }\nofdefinedbuffers
\letvalue{\??bu#1\c!paragraph}\v!no
- \setevalue{\e!start#1}{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}%
- \unexpanded\setevalue{\e!get #1}{\noexpand\dogetbuffer [#1][def-\nofdefinedbuffers]}%
- \unexpanded\setevalue{\e!type #1}{\noexpand\dotypebuffer [#1][def-\nofdefinedbuffers]}%
+ \setuevalue{\e!start#1}{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}% maybe also relax stop
+ \setuevalue{\e!get #1}{\noexpand\dogetbuffer [#1][def-\nofdefinedbuffers]}%
+ \setuevalue{\e!type #1}{\noexpand\dotypebuffer [#1][def-\nofdefinedbuffers]}%
\getparameters[\??bu#1][#2]%
\fi}
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index f1d733d76..928f26057 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -726,7 +726,7 @@
{\dodoubleempty\dodefinetype}
\def\dodefinetype[#1][#2]%
- {\unexpanded\setvalue{#1}{\dotype{#1}}%
+ {\setuvalue{#1}{\dotype{#1}}%
\getparameters[\??ty#1][#2]}
%D \macros
diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex
index 3eb68db7a..9bfec2999 100644
--- a/tex/context/base/cont-log.tex
+++ b/tex/context/base/cont-log.tex
@@ -322,7 +322,38 @@
% \TeX
% \endgroup}
%
-% \let\LuaTeX \luaTeX
-% \let\LUATEX \luaTeX
+% a further iteration from the list, patched again
+
+% \ifx\fontalternative\c!it -\else
+% \ifx\fontalternative\c!sl -\else
+% \ifx\fontalternative\c!bi -\else
+% \ifx\fontalternative\c!bs -\fi\fi\fi\fi
+
+\def\LuaTeX
+ {\dontleavehmode
+ \begingroup
+ Lua%
+ % hope for kerning, try aT
+ \setbox0\hbox{aT}%
+ \setbox2\hbox{a\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT kerning, try oT as a is not symmetrical
+ \setbox0\hbox{oT}%
+ \setbox2\hbox{o\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT and oT kerning, try To
+ \setbox0\hbox{To}%
+ \setbox2\hbox{T\kern\zeropoint o}%
+ % maybe we need to compensate for the angle (sl/it/bs/bi)
+ \fi
+ \ifdim\wd0=\wd2\else
+ \kern\dimexpr\wd0-\wd2\relax
+ \fi
+ \fi
+ \TeX
+ \endgroup}
+
+\let\luaTeX \LuaTeX
+\let\LUATEX \LuaTeX
\protect \endinput
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index a313c6c54..e080d3904 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2010.03.10 23:47}
+\newcontextversion{2010.03.12 19:49}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index b0742590a..c70f20b8e 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2010.03.10 23:47}
+\edef\contextversion{2010.03.12 19:49}
%D For those who want to use this:
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
index 63f279c92..00535e586 100644
--- a/tex/context/base/core-mis.mkiv
+++ b/tex/context/base/core-mis.mkiv
@@ -859,7 +859,7 @@
\c!leftmargin,\c!rightmargin,\c!indentnext,
\c!before,\c!after,\c!left,\c!right]}}%
\doifsomething{#1}
- {\unexpanded\setvalue{#1}{\delimitedtext[#1]}%
+ {\setuvalue{#1}{\delimitedtext[#1]}%
\setvalue{\e!start#1}{\startdelimitedtext[#1]}%
\setvalue{\e!stop #1}{\stopdelimitedtext}}}
diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv
index c7747d4bb..932d387ec 100644
--- a/tex/context/base/core-sys.mkiv
+++ b/tex/context/base/core-sys.mkiv
@@ -203,7 +203,7 @@
\c!commands=,
\c!style=,
#2]%
- \unexpanded\setvalue{#1}%
+ \setuvalue{#1}%
{\groupedcommand
{\getvalue{\??be#1\c!commands}%
\dostartattributes{\??be#1}\c!style\c!color}
diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua
index 47c29fda9..7299475d3 100644
--- a/tex/context/base/data-res.lua
+++ b/tex/context/base/data-res.lua
@@ -891,22 +891,26 @@ local cache = { }
local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
local found = cache[str]
if not found then
- str = gsub(str,"\\","/")
- local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k,v in ipairs(found) do
- logs.report("fileio","% 4i: %s",k,v)
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k,v in ipairs(found) do
+ logs.report("fileio","% 4i: %s",k,v)
+ end
end
+ cache[str] = found
end
- cache[str] = found
end
return found
end
diff --git a/tex/context/base/data-tex.lua b/tex/context/base/data-tex.lua
index 8f31bb258..c9fa3625a 100644
--- a/tex/context/base/data-tex.lua
+++ b/tex/context/base/data-tex.lua
@@ -34,7 +34,7 @@ function finders.generic(tag,filename,filetype)
end
--~ local lpegmatch = lpeg.match
---~ local getlines = lpeg.Ct(lpeg.linebyline)
+--~ local getlines = lpeg.Ct(lpeg.patterns.textline)
local input_translator, utf_translator, user_translator = nil, nil, nil
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index bab631ef9..495767389 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -71,10 +71,10 @@
\def\definecharacter#1 #2 %
{\doifnumberelse{\string#2}
{\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax}
- {\unexpanded\setvalue {\string#1}{#2}}}
+ {\setuvalue {\string#1}{#2}}}
\def\definecommand#1 #2 %
- {\unexpanded\setvalue{\string#1}{#2}}
+ {\setuvalue{\string#1}{#2}}
%D \macros
%D {everyuppercase, EveryUppercase,
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index 40142ea10..b000cac31 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -1109,9 +1109,9 @@
\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id]
{\ifthirdargument
- \unexpanded\setvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
+ \setuvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
\else
- \unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}%
+ \setuvalue{#1}{\dododefinefont{#1}{#2}}%
\fi}
\def\redodefinefont#1#2#3%
@@ -1657,21 +1657,21 @@
\def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty
{%\message{!m #1 #2 #3!}%
% #1 #2 #3 = signal
- %unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \mr \mb
- \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}}% \mm
+ %setugvalue {#2}{\setcurrentfontalternative {#2}}% \mr \mb
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}}% \mm
\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
{%\message{!t #1 #2 #3!}%
- \unexpanded\setgvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
- \unexpanded\setgvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
- \unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
- \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}% \rm
- \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \sl
- \unexpanded\setgvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
- \unexpanded\setgvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
- \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
- \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
- \unexpanded\setgvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
+ \setugvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
+ \setugvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
+ \setugvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}% \rm
+ \setugvalue {#2}{\setcurrentfontalternative {#2}}% \sl
+ \setugvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
+ \setugvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
+ \setugvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
+ \setugvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
+ \setugvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
{\def\dododefinedefaultbodyfont##1%
@@ -1750,7 +1750,7 @@
%D instead of the more memory hungry:
%D
%D \starttyping
-%D \unexpanded\setvalue{name}{...}
+%D \setuvalue{name}{...}
%D \stoptyping
%D
%D The first alternative saves about 500 hash entries (about
@@ -4007,7 +4007,7 @@
\def\dodefinestylecollection[#1]%
{\iffirstargument
- \unexpanded\setvalue{#1}{\styleinstance[#1]}%
+ \setuvalue{#1}{\styleinstance[#1]}%
\def\docommand##1%
{\def\dodocommand####1{\letbeundefined{\??sx##1:####1:\commalistelement}}%
\processcommacommand[\fontalternativelist,\s!default]\dodocommand}%
diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua
index 4cee5f324..7950a03a7 100644
--- a/tex/context/base/l-aux.lua
+++ b/tex/context/base/l-aux.lua
@@ -14,13 +14,22 @@ local concat, format, gmatch = table.concat, string.format, string.gmatch
local tostring, type = tostring, type
local lpegmatch = lpeg.match
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
local space = lpeg.P(' ')
local equal = lpeg.P("=")
local comma = lpeg.P(",")
local lbrace = lpeg.P("{")
local rbrace = lpeg.P("}")
local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P{ lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
local spaces = space^0
local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
@@ -186,21 +195,14 @@ end
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-
---~ local finish = lpeg.P(-1)
---~ local nodigit = (1-digit) + finish
---~ local case_1 = (period * zero^1 * #nodigit)/"" -- .000
---~ local case_2 = (period * (1-(zero^0/"") * #nodigit)^1 * (zero^0/"") * nodigit) -- .010 .10 .100100
-
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
--~ collectgarbage("collect")
diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua
index 369895c43..0d08362b1 100644
--- a/tex/context/base/l-dir.lua
+++ b/tex/context/base/l-dir.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
local lpegmatch = lpeg.match
@@ -174,7 +176,7 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
function dir.mkdirs(...)
local str, pth = "", ""
@@ -241,7 +243,7 @@ if string.find(os.getenv("PATH"),";") then
--~ print(dir.mkdirs("///a/b/c"))
--~ print(dir.mkdirs("a/bbb//ccc/"))
- function dir.expand_name(str)
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
local first, nothing, last = match(str,"^(//)(//*)(.*)$")
if first then
first = lfs.currentdir() .. "/"
diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua
index 0b2c96d8f..be0e3d016 100644
--- a/tex/context/base/l-file.lua
+++ b/tex/context/base/l-file.lua
@@ -301,3 +301,12 @@ end
-- test { "c:", "c:aa", "c:aa/bb", "c:aa/bb/cc", "c:aa/bb/cc.dd", "c:aa/bb/cc.dd.ee" }
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua
index 227b193da..2e366a904 100644
--- a/tex/context/base/l-lpeg.lua
+++ b/tex/context/base/l-lpeg.lua
@@ -6,57 +6,58 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.octal = patterns.oct
+patterns.HEX = P("0x") * R("09","AF")^1
+patterns.hex = P("0x") * R("09","af")^1
+patterns.hexadecimal = P("0x") * R("09","AF","af")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -67,7 +68,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -123,43 +124,20 @@ end
--~ local p = pp
--~ for l=1,#list do
--~ if p then
---~ p = p + lpeg.P(list[l])
+--~ p = p + P(list[l])
--~ else
---~ p = lpeg.P(list[l])
+--~ p = P(list[l])
--~ end
--~ end
--~ return p
--~ end
--~ from roberto's site:
---~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
---~ local c1, c2 = string.byte(s, 1, 2)
---~ return c1 * 64 + c2 - 12416
---~ end
---~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
---~ local c1, c2, c3 = string.byte(s, 1, 3)
---~ return (c1 * 64 + c2) * 64 + c3 - 925824
---~ end
---~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
---~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
---~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
---~ end
---~
---~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
---~ + lpeg.R("\194\223") * cont / f2
---~ + lpeg.R("\224\239") * cont * cont / f3
---~ + lpeg.R("\240\244") * cont * cont * cont / f4
---~
---~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-
-local cont = R("\128\191") -- continuation byte
-
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
+
+local f1 = string.byte
+
+local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2 - 12416 end
+local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
+local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
+
+patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua
index 7dd288877..4f0c0c176 100644
--- a/tex/context/base/l-os.lua
+++ b/tex/context/base/l-os.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['l-os'] = {
-- maybe build io.flush in os.execute
-local find, format = string.find, string.format
+local find, format, gsub = string.find, string.format, string.gsub
local random, ceil = math.random, math.ceil
local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
@@ -88,13 +88,15 @@ end
-- no need for function anymore as we have more clever code and helpers now
-os.resolvers = { }
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end }
local osix = osmt.__index
osmt.__index = function(t,k)
- return (os.resolvers[k] or osix)(t,k)
+ return (resolvers[k] or osix)(t,k)
end
setmetatable(os,osmt)
diff --git a/tex/context/base/lxml-lpt.lua b/tex/context/base/lxml-lpt.lua
index 04808c70f..883b174db 100644
--- a/tex/context/base/lxml-lpt.lua
+++ b/tex/context/base/lxml-lpt.lua
@@ -475,10 +475,10 @@ local lp_or = P("|") / " or "
local lp_and = P("&") / " and "
local lp_builtin = P (
-P("firstindex") / "1" +
-P("lastindex") / "(#ll.__p__.dt or 1)" +
-P("firstelement") / "1" +
-P("lastelement") / "(ll.__p__.en or 1)" +
+ P("firstindex") / "1" +
+ P("lastindex") / "(#ll.__p__.dt or 1)" +
+ P("firstelement") / "1" +
+ P("lastelement") / "(ll.__p__.en or 1)" +
P("first") / "1" +
P("last") / "#list" +
P("rootposition") / "order" +
@@ -488,7 +488,7 @@ P("lastelement") / "(ll.__p__.en or 1)" +
P("index") / "(ll.ni or 1)" +
P("match") / "(ll.mi or 1)" +
P("text") / "(ll.dt[1] or '')" +
---~ P("name") / "(ll.ns~='' and ll.ns..':'..ll.tg)" +
+ -- P("name") / "(ll.ns~='' and ll.ns..':'..ll.tg)" +
P("name") / "((ll.ns~='' and ll.ns..':'..ll.tg) or ll.tg)" +
P("tag") / "ll.tg" +
P("ns") / "ll.ns"
diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua
index b275ef03b..b13e2a4ac 100644
--- a/tex/context/base/lxml-tab.lua
+++ b/tex/context/base/lxml-tab.lua
@@ -33,6 +33,7 @@ local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatabl
local format, lower, find, match = string.format, string.lower, string.find, string.match
local utfchar = unicode.utf8.char
local lpegmatch = lpeg.match
+local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
--[[ldx--
<p>First a hack to enable namespace resolving. A namespace is characterized by
@@ -44,7 +45,7 @@ much cleaner.</p>
xml.xmlns = xml.xmlns or { }
-local check = lpeg.P(false)
+local check = P(false)
local parse = check
--[[ldx--
@@ -57,8 +58,8 @@ xml.registerns("mml","mathml")
--ldx]]--
function xml.registerns(namespace, pattern) -- pattern can be an lpeg
- check = check + lpeg.C(lpeg.P(lower(pattern))) / namespace
- parse = lpeg.P { lpeg.P(check) + 1 * lpeg.V(1) }
+ check = check + C(P(lower(pattern))) / namespace
+ parse = P { P(check) + 1 * V(1) }
end
--[[ldx--
@@ -336,8 +337,6 @@ local function fromdec(s)
end
end
-local P, S, R, C, V, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cs
-
local rest = (1-P(";"))^0
local many = P(1)^0
@@ -439,10 +438,7 @@ local valid = R('az', 'AZ', '09') + S('_-.')
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
-
-local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
- P('\255\254') + P('\254\255') + P('\239\187\191') -- no capture
-
+local utfbom = lpeg.patterns.utfbom -- no capture
local spacing = C(space^0)
----- entitycontent = (1-open-semicolon)^0
@@ -527,10 +523,10 @@ local doctype = (spacing * begindoctype * somedoctype * enddoct
-- nicer but slower:
--
--- local instruction = (lpeg.Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
--- local comment = (lpeg.Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
--- local cdata = (lpeg.Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
--- local doctype = (lpeg.Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
+-- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
+-- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
+-- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
+-- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
local trailer = space^0 * (text_unparsed/set_message)^0
diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua
index f27fd6d44..754c9eb7d 100644
--- a/tex/context/base/lxml-tex.lua
+++ b/tex/context/base/lxml-tex.lua
@@ -13,6 +13,7 @@ local concat, insert, remove, gsub, find = table.concat, table.insert, table.rem
local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match
local type, next, tonumber, tostring = type, next, tonumber, tostring
local lpegmatch = lpeg.match
+local P, S, C, Cc = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc
if not tex and not tex.sprint then
tex = {
@@ -61,30 +62,27 @@ finalizers.tex = finalizers.tex or { }
-- because we avoid tokenization of leading spaces and xml can be
-- rather verbose (indented)
-local crlf = lpeg.P("\r\n")
-local cr = lpeg.P("\r")
-local lf = lpeg.P("\n")
-local newline = crlf + cr + lf
-local space = lpeg.S(" \t\f\v")
-local ampersand = lpeg.P("&")
-local semicolon = lpeg.P(";")
+local newline = lpeg.patterns.newline
+local space = lpeg.patterns.spacer
+local ampersand = P("&")
+local semicolon = P(";")
local spacing = newline * space^0
-local content = lpeg.C((1-spacing-ampersand)^1)
-local verbose = lpeg.C((1-(space+newline))^1)
-local entity = ampersand * lpeg.C((1-semicolon)^1) * semicolon
+local content = C((1-spacing-ampersand)^1)
+local verbose = C((1-(space+newline))^1)
+local entity = ampersand * C((1-semicolon)^1) * semicolon
local xmltextcapture = (
- space^0 * newline^2 * lpeg.Cc("") / texprint + -- better ^-2 ?
- space^0 * newline * space^0 * lpeg.Cc(" ") / texsprint +
- content / function(str) return texsprint(notcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
- entity / xml.resolved_entity
+ space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
+ space^0 * newline * space^0 * Cc(" ") / texsprint +
+ content / function(str) return texsprint(notcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
+ entity / xml.resolved_entity
)^0
local ctxtextcapture = (
- space^0 * newline^2 * lpeg.Cc("") / texprint + -- better ^-2 ?
- space^0 * newline * space^0 * lpeg.Cc(" ") / texsprint +
- content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
- entity / xml.resolved_entity
+ space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
+ space^0 * newline * space^0 * Cc(" ") / texsprint +
+ content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
+ entity / xml.resolved_entity
)^0
local forceraw, rawroot = false, nil
@@ -178,7 +176,6 @@ function lxml.store(id,root,filename)
end
end
---~ local splitter = lpeg.C((1-lpeg.P(":"))^1) * lpeg.P("::") * lpeg.C(lpeg.P(1)^1)
local splitter = lpeg.splitat("::")
lxml.idsplitter = splitter
@@ -482,12 +479,12 @@ end
local pihandlers = { } xml.pihandlers = pihandlers
-local kind = lpeg.P("context-") * lpeg.C((1-lpeg.P("-"))^1) * lpeg.P("-directive")
-local space = lpeg.S(" \n\r")
+local kind = P("context-") * C((1-P("-"))^1) * P("-directive")
+local space = S(" \n\r")
local spaces = space^0
-local class = lpeg.C((1-space)^0)
+local class = C((1-space)^0)
local key = class
-local value = lpeg.C(lpeg.P(1-(space * -1))^0)
+local value = C(P(1-(space * -1))^0)
local parser = kind * spaces * class * spaces * key * spaces * value
diff --git a/tex/context/base/math-ali.mkiv b/tex/context/base/math-ali.mkiv
index c9741e8cc..fcf5b4cc5 100644
--- a/tex/context/base/math-ali.mkiv
+++ b/tex/context/base/math-ali.mkiv
@@ -610,8 +610,8 @@
{\dodoubleempty\dodefinemathmatrix}
\def\dodefinemathmatrix[#1]% [#2]%
- {\unexpanded\setvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}%
- \unexpanded\setvalue{\e!stop #1}{\dostopmathmatrix}%
+ {\setuvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}%
+ \setuvalue{\e!stop #1}{\dostopmathmatrix}%
\setupmathmatrix[#1]}% [#2]
\definemathmatrix[matrix]
diff --git a/tex/context/base/math-arr.mkiv b/tex/context/base/math-arr.mkiv
index 0b2ee9b66..6019de4bc 100644
--- a/tex/context/base/math-arr.mkiv
+++ b/tex/context/base/math-arr.mkiv
@@ -217,13 +217,13 @@
\def\redefinebotharrow#1#2#3% real dirty, this overload!
{\doifdefined{#1}
{\pushmacro\dohandlemtharrow
- \def\dohandlemtharrow[##1][##2]{\unexpanded\setvalue{#1}{\dohandlemtharrow[#2][##2]}}%
+ \def\dohandlemtharrow[##1][##2]{\setuvalue{#1}{\dohandlemtharrow[#2][##2]}}%
% == \def\dohandlemtharrow[##1][##2]{\dodefinebotharrow{#1}{#2}{##2}}%
\getvalue{#1}%
\popmacro\dohandlemtharrow}}
\def\dodefinebotharrow#1#2#3%
- {\unexpanded\setvalue{#1}{\dohandlemtharrow[#2][#3]}}
+ {\setuvalue{#1}{\dohandlemtharrow[#2][#3]}}
\def\dohandlemtharrow
{\dotripleempty\doxmtharrow}
@@ -363,9 +363,9 @@
\def\dodefinemathoverarrow[#1][#2][#3]%
{\ifthirdargument
- \unexpanded\setvalue{#1}{\dohandlemathoverarrow[#2][#3]}%
+ \setuvalue{#1}{\dohandlemathoverarrow[#2][#3]}%
\else
- \unexpanded\setvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}%
+ \setuvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}%
\fi}
\def\dohandlemathoverarrow[#1][#2]%
@@ -390,9 +390,9 @@
\def\dodefinemathunderarrow[#1][#2][#3]%
{\ifthirdargument
- \unexpanded\setvalue{#1}{\dohandlemathunderarrow[#2][#3]}%
+ \setuvalue{#1}{\dohandlemathunderarrow[#2][#3]}%
\else
- \unexpanded\setvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}%
+ \setuvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}%
\fi}
\def\dohandlemathunderarrow[#1][#2]%
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index 9ac43455d..d4be17ded 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -244,12 +244,12 @@
{\ifthirdargument
\processaction
[#3]
- [one=>\unexpanded\setvalue{#1}##1{\puremathcomm{#2}{#4{##1}}},
- two=>\unexpanded\setvalue{#1}##1##2{\puremathcomm{#2}{#4{##1}{##2}}}]%
+ [one=>\setuvalue{#1}##1{\puremathcomm{#2}{#4{##1}}},
+ two=>\setuvalue{#1}##1##2{\puremathcomm{#2}{#4{##1}{##2}}}]%
\else\ifsecondargument
- \unexpanded\setvalue{#1}{\puremathcomm{#2}{#4}}%
+ \setuvalue{#1}{\puremathcomm{#2}{#4}}%
\else
- \unexpanded\setvalue{#1}{\puremathcomm{nothing}{#4}}%
+ \setuvalue{#1}{\puremathcomm{nothing}{#4}}%
\fi\fi}
%D Moved from font-ini.mkiv:
diff --git a/tex/context/base/node-rul.mkiv b/tex/context/base/node-rul.mkiv
index ca4018d14..a14f56955 100644
--- a/tex/context/base/node-rul.mkiv
+++ b/tex/context/base/node-rul.mkiv
@@ -87,7 +87,7 @@
\fi
\normalexpanded{\checkalldefinedbars{\noexpand\doredefinebar{#1}\the\checkalldefinedbars}}%
\dodefinebarindeed{#1}%
- \unexpanded\setvalue{#1}{\doruled{#1}}}
+ \setuvalue{#1}{\doruled{#1}}}
\def\dodefinebarindeed#1%
{\bgroup
@@ -233,7 +233,7 @@
\fi
\normalexpanded{\checkalldefinedshifts{\noexpand\doredefineshift{#1}\the\checkalldefinedshifts}}%
\dodefineshiftindeed{#1}%
- \unexpanded\setvalue{#1}{\doshifted{#1}}}
+ \setuvalue{#1}{\doshifted{#1}}}
\def\dodefineshiftindeed#1%
{\bgroup
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv
index 9dc7e5321..a77436b61 100644
--- a/tex/context/base/pack-rul.mkiv
+++ b/tex/context/base/pack-rul.mkiv
@@ -2655,9 +2655,9 @@
\c!orientation=,
\c!indenting=,
#2]%
- \unexpanded\setvalue{\e!start#1}{\dostartframedtext[#1]}%
- \unexpanded\setvalue{\e!stop #1}{\dostopframedtext }%
- \unexpanded\setvalue {#1}{\doframedtext [#1]}}
+ \setuvalue{\e!start#1}{\dostartframedtext[#1]}%
+ \setuvalue{\e!stop #1}{\dostopframedtext }%
+ \setuvalue {#1}{\doframedtext [#1]}}
\def\defineframedtext
{\dodoubleempty\dodefineframedtext}
@@ -2833,7 +2833,7 @@
\def\dodefineframed[#1][#2]%
{\iffirstargument
- \unexpanded\setvalue{#1}{\dodoubleempty\doframed[#2]}%
+ \setuvalue{#1}{\dodoubleempty\doframed[#2]}%
\fi}
\def\doframed[#1][#2]%
diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv
index b85a99aa6..83a08d00e 100644
--- a/tex/context/base/page-mar.mkiv
+++ b/tex/context/base/page-mar.mkiv
@@ -58,7 +58,7 @@
\c!hoffset=\leftmargindistance,
\c!command=,
#2]%
- \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}}
+ \setuvalue{#1}{\dohandlemarginline{#1}}}
\def\marginlineparameter #1{\csname\??im\??im\currentmarginline#1\endcsname}
\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
diff --git a/tex/context/base/page-str.mkiv b/tex/context/base/page-str.mkiv
index e4fd39794..4fd5d58a5 100644
--- a/tex/context/base/page-str.mkiv
+++ b/tex/context/base/page-str.mkiv
@@ -25,9 +25,9 @@
% not yet ok in mkiv ... marknotes .. will be completely redone
-\unprotect
+\endinput
-% taco, what is the best way to append a otr chunk (insert pagediscards?)
+\unprotect
\let\currentoutputstream\s!default
@@ -107,21 +107,12 @@
\kern\strutdepth}%
\fi}
-% \def\presetoutputstream
-% {\pdffirstlineheight\strutheight
-% \pdflastlinedepth \strutdepth
-% \pdfeachlineheight \strutheight
-% \pdfeachlinedepth \strutdepth}
-
\let\presetoutputstream\relax
\def\outputstreamht [#1]{\ht\outputstreamtag{#1}}
\def\outputstreamdp [#1]{\dp\outputstreamtag{#1}}
\def\outputstreamwd [#1]{\wd\outputstreamtag{#1}}
-%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi}
-%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi}
-
\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi}
\def\outputstreamcopy {\dowithoutputstreambox\copy }
@@ -129,55 +120,13 @@
\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy}
\def\outputstreamunvbox {\dowithoutputstreambox\unvbox }
-%D Footnotes don't go along with streams, simply because there is no
-%D way to re-split inserts. A dirty way out is to use marks and store
-%D notes that way.
-
-% not mkiv ready yet
-
-\def\definemarknote
- {\dodoubleempty\dodefinemarknote}
-
-\def\dodefinemarknote[#1][#2]%
- {\definemarking[mn:#1]%
- \setvalue{mn:#1:n}{0}%
- \getparameters
- [mn:#1]
- [\c!before=,
- \c!after=,
- \c!inbetween=\endgraf,
- \c!command=\firstofoneargument,
- #2]}
-
-\def\setmarknote[#1]#2%
- {\doglobal\incrementvalue{mn:#1:n}%
- \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}%
- \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}}
-
-\def\flushmarknotes[#1]% assumes split
- {\begingroup
-% \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
-% \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
-% \ifnum\firstmarknote<\lastmarknote\relax
-% \getvalue{mn:#1\c!before}%
-% \dostepwiserecurse\firstmarknote\lastmarknote\plusone
-% {\ifnum\recurselevel>\firstmarknote\relax
-% \ifnum\recurselevel<\lastmarknote\relax
-% \getvalue{mn:#1\c!inbetween}%
-% \fi
-% \fi
-% \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}%
-% \getvalue{mn:#1\c!after}%
-% \fi
- \endgroup}
-
-\def\erasemarknotes[#1]%
- {\begingroup
- \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
- \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
- \dostepwiserecurse\firstmarknote\lastmarknote\plusone
- {\global\letvalue{mn:#1:t:\recurselevel}\empty}%
- \endgroup}
+%D Obsolete in \MKIV:
+
+\def\definemarknote {\dodoubleempty\dodefinemarknote}
+\def\dodefinemarknote[#1][#2]{}
+\def\setmarknote [#1]{\gobbleoneargument}
+\def\flushmarknotes [#1]{}
+\def\erasemarknotes [#1]{}
%D The next section implements synchronization of (currently
%D two) output streams. In due time we will implement both a
diff --git a/tex/context/base/prop-ini.mkiv b/tex/context/base/prop-ini.mkiv
index c5df391a7..10b313506 100644
--- a/tex/context/base/prop-ini.mkiv
+++ b/tex/context/base/prop-ini.mkiv
@@ -98,15 +98,15 @@
\letgvalue{\??py\s!check#1}\docheckproperty
\doifelsevalue{\??py#1\c!method}\v!command
{\doifelsevalue{\??py#1\c!global}\v!yes
- {\unexpanded\setgvalue{\e!start#1}{\dostartproperty{#1}}%
- \unexpanded\setgvalue{\e!stop #1}{\dostopproperty}}%
- {\unexpanded\setgvalue{\e!start#1}{\dostartgproperty{#1}}%
- \unexpanded\setgvalue{\e!stop #1}{\dostopgproperty}}}%
+ {\setugvalue{\e!start#1}{\dostartproperty{#1}}%
+ \setugvalue{\e!stop #1}{\dostopproperty}}%
+ {\setugvalue{\e!start#1}{\dostartgproperty{#1}}%
+ \setugvalue{\e!stop #1}{\dostopgproperty}}}%
{\doifelsevalue{\??py#1\c!global}\v!yes
- {\unexpanded\setgvalue{\e!start#2}[##1]{\dostartproperty{##1}}%
- \unexpanded\setgvalue{\e!stop #2}{\dostopproperty}}%
- {\unexpanded\setgvalue{\e!start#2}[##1]{\dostartgproperty{##1}}%
- \unexpanded\setgvalue{\e!stop #2}{\dostopgproperty}}}}
+ {\setugvalue{\e!start#2}[##1]{\dostartproperty{##1}}%
+ \setugvalue{\e!stop #2}{\dostopproperty}}%
+ {\setugvalue{\e!start#2}[##1]{\dostartgproperty{##1}}%
+ \setugvalue{\e!stop #2}{\dostopgproperty}}}}
\def\nododefineproperty[#1][#2][#3]%
{}
diff --git a/tex/context/base/spac-fnt.mkiv b/tex/context/base/spac-fnt.mkiv
index d8fc46a5e..c268d7893 100644
--- a/tex/context/base/spac-fnt.mkiv
+++ b/tex/context/base/spac-fnt.mkiv
@@ -61,8 +61,11 @@
%D Bonus macro, see core-sec.tex
+\newconditional\fontattributeisset
+
\unexpanded\def\dosetfontattribute#1#2%
{\ifcsname#1#2\endcsname
+ \settrue\fontattributeisset % reset is done elsewhere
\@EA\doconvertfont\csname#1#2\@EA\endcsname
\fi\empty}
diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua
index 02fe1fe85..af9f5170f 100644
--- a/tex/context/base/spac-ver.lua
+++ b/tex/context/base/spac-ver.lua
@@ -1088,6 +1088,14 @@ function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an action
end
end
+--~ function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
+--~ if groupcode == "" then -- mvl only
+--~ return head, false
+--~ else
+--~ return head, false
+--~ end
+--~ end
+
--~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust")
nodes.builders = nodes.builder or { }
diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv
index 58aec3caf..1a4291e17 100644
--- a/tex/context/base/spac-ver.mkiv
+++ b/tex/context/base/spac-ver.mkiv
@@ -78,9 +78,42 @@
\fi
+% \def\presetnormallineheight
+% {\edef\normallineheight{\@@itline}%
+% %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
+% \iflocalinterlinespace \else
+% \doifdefined\bodyfontinterlinespecs
+% {\doifsomething\bodyfontinterlinespace
+% {\edef\normallineheight{\bodyfontinterlinespace}}}%
+% \fi}
+
+% \def\setupspecifiedinterlinespace[#1]%
+% {\getparameters[\??it][#1]%
+% \scratchdimen0\@@itheight\points
+% \advance\scratchdimen 0\@@itdepth\points
+% \ifdim\scratchdimen>\onepoint
+% \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}%
+% \let\@@itheight\strutheightfactor
+% \let\@@itdepth \strutdepthfactor
+% \else
+% \let\strutheightfactor\@@itheight
+% \let\strutdepthfactor \@@itdepth
+% \fi
+% \let\minimumstrutheight \@@itminheight
+% \let\minimumstrutdepth \@@itmindepth
+% \let\minimumlinedistance\@@itdistance
+% \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex
+% \doifelse\@@ittop\v!height % new, topskip does more bad than good
+% {\let\topskipfactor \@@itheight}
+% {\let\topskipfactor \@@ittop }%
+% \let\maxdepthfactor \@@itbottom
+% \let\baselinegluefactor \@@itstretch
+% \setfontparameters % redundant, can be \setstrut, test first
+% \updateraggedskips} % yes indeed
+
\def\presetnormallineheight
- {\edef\normallineheight{\@@itline}%
-% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
+ {\edef\normallineheight{\interlinespaceparameter\c!line}%
+ %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
\iflocalinterlinespace \else
\doifdefined\bodyfontinterlinespecs
{\doifsomething\bodyfontinterlinespace
@@ -88,43 +121,28 @@
\fi}
\def\setupspecifiedinterlinespace[#1]%
- {\getparameters[\??it][#1]%
- \scratchdimen0\@@itheight\points
- \advance\scratchdimen 0\@@itdepth\points
- \ifdim\scratchdimen>\onepoint
- \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}%
- \let\@@itheight\strutheightfactor
- \let\@@itdepth \strutdepthfactor
- \else
- \let\strutheightfactor\@@itheight
- \let\strutdepthfactor \@@itdepth
+ {\getparameters[\??it\currentinterlinespace][#1]%
+ \dosetupspecifiedinterlinespaceindeed}
+
+\def\dosetupspecifiedinterlinespaceindeed
+ {\edef\strutheightfactor {\interlinespaceparameter\c!height}%
+ \edef\strutdepthfactor {\interlinespaceparameter\c!depth}%
+ \edef\minimumstrutheight {\interlinespaceparameter\c!minheight}%
+ \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth}%
+ \edef\minimumlinedistance{\interlinespaceparameter\c!distance}%
+ \edef\normallineheight {\interlinespaceparameter\c!line}%
+ \edef\topskipfactor {\interlinespaceparameter\c!top}%
+ \edef\maxdepthfactor {\interlinespaceparameter\c!bottom}%
+ \edef\baselinegluefactor {\interlinespaceparameter\c!stretch}%
+ % often topskip does more bad than good, so:
+ \ifx\topskipfactor\v!height
+ \let\topskipfactor\strutheightfactor
\fi
- \let\minimumstrutheight \@@itminheight
- \let\minimumstrutdepth \@@itmindepth
- \let\minimumlinedistance\@@itdistance
- \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex
- \doifelse\@@ittop\v!height % new, topskip does more bad than good
- {\let\topskipfactor \@@itheight}
- {\let\topskipfactor \@@ittop }%
- \let\maxdepthfactor \@@itbottom
- \let\baselinegluefactor \@@itstretch
\setfontparameters % redundant, can be \setstrut, test first
\updateraggedskips} % yes indeed
\let\currentrelativeinterlinespace\empty
-% \def\setuprelativeinterlinespace[#1]%
-% {\processallactionsinset
-% [#1]
-% [ \v!on=>\oninterlineskip,
-% \v!off=>\offinterlineskip,
-% \v!reset=>\let\currentrelativeinterlinespace\empty
-% \let\setrelativeinterlinespace\relax
-% \setfontparameters,
-% \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace,
-% \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
-% \spacing\currentrelativeinterlinespace]}
-
\setvalue{\??it::\v!on }{\oninterlineskip}
\setvalue{\??it::\v!off }{\offinterlineskip}
\setvalue{\??it::\v!reset}{\let\currentrelativeinterlinespace\empty
@@ -132,9 +150,15 @@
\setfontparameters}
\setvalue{\??it::\v!auto }{\let\setrelativeinterlinespace\dosetrelativeinterlinespace}
-\def\dosetspecifiedrelativeinterlinespace#1%
- {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
- \spacing\currentrelativeinterlinespace}
+% \def\dosetspecifiedrelativeinterlinespace#1%
+% {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+% \spacing\currentrelativeinterlinespace}
+
+\def\dosetspecifiedrelativeinterlinespace#1% fragile?
+ {\doifdimensionelse{#1}
+ {\setupspecifiedinterlinespace[\c!line=#1]}
+ {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+ \spacing\currentrelativeinterlinespace}}
\def\setuprelativeinterlinespace[#1]%
{\processcommalist[#1]\dosetuprelativeinterlinespace}
@@ -158,6 +182,43 @@
\newtoks \everysetupglobalinterlinespace
\newtoks \everysetuplocalinterlinespace
+% \def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
+% {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
+% \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
+
+\def\interlinespaceparameter #1{\csname\dointerlinespaceparameter{\??it\currentinterlinespace}#1\endcsname}
+\def\dointerlinespaceparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointerlinespaceparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\dointerlinespaceparentparameter#1#2{\ifx#1\relax\s!empty\else\dointerlinespaceparameter#1#2\fi}
+
+\newconditional\interlinespaceisset
+
+\let\currentinterlinespace\empty
+
+\def\defineinterlinespace
+ {\dodoubleempty\dodefineinterlinespace}
+
+\def\dodefineinterlinespace[#1][#2]%
+ {\getparameters[\??it#1][\s!parent=\??it,#2]}
+
+\unexpanded\def\setupinterlinespace
+ {\dodoubleempty\dosetupinterlinespace}
+
+\def\dosetupinterlinespace[#1][#2]%
+ {\settrue\interlinespaceisset % reset has to be done when needed
+ \ifsecondargument
+ \getparameters[\??it#1][#2]%
+ \else\iffirstargument
+ \edef\currentinterlinespace{\ifcsname\??it#1\s!parent\endcsname#1\fi}%
+ \ifx\currentinterlinespace\empty
+ \complexsetupinterlinespace[#1]%
+ \else
+ \dosetupspecifiedinterlinespaceindeed
+ \fi
+ \else
+ \let\currentinterlinespace\empty
+ \simplesetupinterlinespace
+ \fi\fi}
+
\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
{\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
\the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
@@ -169,27 +230,80 @@
\the\everysetuplocalinterlinespace
\localinterlinespacefalse}
+% \def\dosetupcheckedinterlinespace#1% often a chain
+% {\edef\askedinterlinespace{#1}%
+% \ifx\askedinterlinespace\empty
+% \simplesetupinterlinespace
+% \else
+% \normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
+% \noexpand\setupspecifiedinterlinespace
+% \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
+% \iflocalinterlinespace
+% \the\everysetuplocalinterlinespace
+% \else
+% \localinterlinespacetrue
+% \the\everysetuplocalinterlinespace
+% \localinterlinespacefalse
+% \fi
+% \fi}
+
+\def\dosetupcheckedinterlinespace#1% often a chain
+ {\edef\askedinterlinespace{#1}%
+ \ifx\askedinterlinespace\empty
+ \simplesetupinterlinespace
+ \else\ifcsname\??it\askedinterlinespace\s!parent\endcsname
+ \pushmacro\currentinterlinespace
+ \let\currentinterlinespace\askedinterlinespace
+ \dosetupspecifiedinterlinespaceindeed
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \popmacro\currentinterlinespace
+ \else
+ \normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
+ \noexpand\setupspecifiedinterlinespace
+ \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \fi\fi}
+
+% \unexpanded\def\setuplocalinterlinespace[#1]%
+% {\localinterlinespacetrue
+% \let\@@saveditheight \@@itheight
+% \let\@@saveditdepth \@@itdepth
+% \let\@@saveditline \@@itline
+% \let\@@saveditminheight\@@itminheight
+% \let\@@saveditmindepth \@@itmindepth
+% \let\@@saveditdistance \@@itdistance
+% \let\@@savedittop \@@ittop
+% \let\@@saveditbottom \@@itbottom
+% \let\@@saveditstretch \@@itstretch
+% \setupinterlinespace[#1]%
+% \let\@@itheight \@@saveditheight
+% \let\@@itdepth \@@saveditdepth
+% \let\@@itline \@@saveditline
+% \let\@@itminheight\@@saveditminheight
+% \let\@@itmindepth \@@saveditmindepth
+% \let\@@itdistance \@@saveditdistance
+% \let\@@ittop \@@savedittop
+% \let\@@itbottom \@@saveditbottom
+% \let\@@itstretch \@@saveditstretch
+% \localinterlinespacefalse}
+
\unexpanded\def\setuplocalinterlinespace[#1]%
{\localinterlinespacetrue
- \let\@@saveditheight \@@itheight
- \let\@@saveditdepth \@@itdepth
- \let\@@saveditline \@@itline
- \let\@@saveditminheight\@@itminheight
- \let\@@saveditmindepth \@@itmindepth
- \let\@@saveditdistance \@@itdistance
- \let\@@savedittop \@@ittop
- \let\@@saveditbottom \@@itbottom
- \let\@@saveditstretch \@@itstretch
+ \pushmacro\currentinterlinespace
\setupinterlinespace[#1]%
- \let\@@itheight \@@saveditheight
- \let\@@itdepth \@@saveditdepth
- \let\@@itline \@@saveditline
- \let\@@itminheight\@@saveditminheight
- \let\@@itmindepth \@@saveditmindepth
- \let\@@itdistance \@@saveditdistance
- \let\@@ittop \@@savedittop
- \let\@@itbottom \@@saveditbottom
- \let\@@itstretch \@@saveditstretch
+ \popmacro\currentinterlinespace
\localinterlinespacefalse}
\let\switchtointerlinespace\setuplocalinterlinespace
diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua
index 301c76a0e..f9f20a8fb 100644
--- a/tex/context/base/strc-blk.lua
+++ b/tex/context/base/strc-blk.lua
@@ -30,7 +30,7 @@ end
job.register('structure.blocks.collected', structure.blocks.tobesaved, initializer)
-local printer = (lpeg.linebyline/texprint)^0
+local printer = (lpeg.patterns.textline/texprint)^0 -- can be shared
function blocks.print(name,data,hide)
if hide then
diff --git a/tex/context/base/strc-def.mkiv b/tex/context/base/strc-def.mkiv
index f1a8aab87..ea5c9e66f 100644
--- a/tex/context/base/strc-def.mkiv
+++ b/tex/context/base/strc-def.mkiv
@@ -89,6 +89,7 @@
%\c!sectionsegments=,
\c!sectionseparatorset=\s!default,
\c!sectionset=\v!all,
+ \c!interlinespace=,
%\c!sectionstopper=,
%\c!sectionstarter=,
%\c!strut=,
diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv
index df234b948..c457f812c 100644
--- a/tex/context/base/strc-des.mkiv
+++ b/tex/context/base/strc-des.mkiv
@@ -474,9 +474,9 @@
\fi}
\def\dodefinedescriptioncommands#1#2%
- {\unexpanded\setevalue {#1}{\noexpand\dodescriptioncommand{#1}}%
- \unexpanded\setevalue{\e!start#1}{\noexpand\dodescriptionstart {#1}}%
- \unexpanded\setevalue{\e!stop #1}{\noexpand\dodescriptionstop {#1}}}
+ {\setuevalue {#1}{\noexpand\dodescriptioncommand{#1}}%
+ \setuevalue{\e!start#1}{\noexpand\dodescriptionstart {#1}}%
+ \setuevalue{\e!stop #1}{\noexpand\dodescriptionstop {#1}}}
% handle descriptions
@@ -602,9 +602,9 @@
\def\dodefineenumerationcommands#1#2#3#4% since we use \currentdescription, we need an edef
{\setevalue{\??dd#3#1\s!parent}{#4}%
- \unexpanded\setevalue {#3#1}{\noexpand\doenumerationcommand{#1}{#2}{#3}}%
- \unexpanded\setevalue{\e!start#3#1}{\noexpand\doenumerationstart {#1}{#2}{#3}}%
- \unexpanded\setevalue{\e!stop #3#1}{\noexpand\doenumerationstop {#1}{#2}{#3}}}
+ \setuevalue {#3#1}{\noexpand\doenumerationcommand{#1}{#2}{#3}}%
+ \setuevalue{\e!start#3#1}{\noexpand\doenumerationstart {#1}{#2}{#3}}%
+ \setuevalue{\e!stop #3#1}{\noexpand\doenumerationstop {#1}{#2}{#3}}}
% handle enumeration
@@ -912,12 +912,12 @@
\fi}
\def\dodefinelabelcommands#1#2%
- {\unexpanded\setevalue {#1}{\noexpand\dolabelnumbercommand {#1}}%
- \unexpanded\setevalue{\c!reset #1}{\noexpand\doresetlabelnumber {#1}}%
- %\unexpanded\setevalue{\c!set #1}{\noexpand\dosetlabelnumber {#1}}% [#2] or {#2} ?
- \unexpanded\setevalue{\e!next #1}{\noexpand\donextlabelnumber {#1}}%
- \unexpanded\setevalue{\e!increment#1}{\noexpand\doincrementlabelnumber{#1}}%
- \unexpanded\setevalue{\c!current #1}{\noexpand\docurrentlabelnumber {#1}}}
+ {\setuevalue {#1}{\noexpand\dolabelnumbercommand {#1}}%
+ \setuevalue{\c!reset #1}{\noexpand\doresetlabelnumber {#1}}%
+ %\setuevalue{\c!set #1}{\noexpand\dosetlabelnumber {#1}}% [#2] or {#2} ?
+ \setuevalue{\e!next #1}{\noexpand\donextlabelnumber {#1}}%
+ \setuevalue{\e!increment#1}{\noexpand\doincrementlabelnumber{#1}}%
+ \setuevalue{\c!current #1}{\noexpand\docurrentlabelnumber {#1}}}
% this is just for downward compatibility, we might drop it
@@ -982,9 +982,9 @@
[\c!text,\c!separator,\c!width,\c!style,\c!color,
\c!headstyle,\c!sample,\c!before,\c!after,\c!distance]%
\getparameters[\??ds#1][#2]%
- \unexpanded\setvalue {#1}{\dododefineindenting{#1}{0}{1}}%
- \unexpanded\setvalue {\v!sub#1}{\dododefineindenting{#1}{1}{2}}%
- \unexpanded\setvalue{\v!sub\v!sub#1}{\dododefineindenting{#1}{2}{3}}}
+ \setuvalue {#1}{\dododefineindenting{#1}{0}{1}}%
+ \setuvalue {\v!sub#1}{\dododefineindenting{#1}{1}{2}}%
+ \setuvalue{\v!sub\v!sub#1}{\dododefineindenting{#1}{2}{3}}}
\def\dododefineindenting#1#2#3%
{\par
diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv
index 08b91823b..6af0a1434 100644
--- a/tex/context/base/strc-flt.mkiv
+++ b/tex/context/base/strc-flt.mkiv
@@ -20,7 +20,7 @@
%D This module needs a cleanup and will be split in
%D strc-flt.tex and page-flt.mkiv cq. page-flt.mkii.
-\ifx\addlocalbackgroundtobox\undefined \def\addlocalbackgroundtobox{\resetglobal\gobbleoneargument} \fi
+\ifdefined\addlocalbackgroundtobox\else \def\addlocalbackgroundtobox{\resetglobal\gobbleoneargument} \fi
\def\placefloats{\doflushfloats} % keep this one
@@ -268,16 +268,16 @@
\dodefinefloatcommands[#1][#2]}
\def\dodefinefloatcommands[#1][#2]%
- {\setvalue {\e!place\e!listof#2}{\dodoubleempty\doplacelist[#1]}%
- \setvalue {\e!complete\e!listof#2}{\dotripleempty\dodocompletelist[#1][#2]}%
- \setvalue {\e!place#1}{\dotripleempty\docomplexplacefloat[#1]}%
- \setvalue {\e!reserve#1}{\doquadrupleempty\docomplexreserveblock[#1]}%
- \setvalue {\e!start#1\e!text}{\dotripleempty\docomplexstarttextblock[#1]}%
- \setvalue {\e!stop#1\e!text}{\dostoptextfloat}%
- \setvalue{\e!start\e!reserve#1\e!text}{\doquadrupleempty\docomplexstartreservetextblock[#1]}%
- \setvalue {\e!stop\e!reserve#1\e!text}{\dostoptextfloat}%
- \setvalue {\e!emptyone#1}{\doemptyfloatblock{#1}}%
- \setvalue {\e!emptytwo#1}{\doemptyfloatblock{#1}}}
+ {\setuvalue {\e!place\e!listof#2}{\dodoubleempty\doplacelist[#1]}%
+ \setuvalue {\e!complete\e!listof#2}{\dotripleempty\dodocompletelist[#1][#2]}%
+ \setuvalue {\e!place#1}{\dotripleempty\docomplexplacefloat[#1]}%
+ \setuvalue {\e!reserve#1}{\doquadrupleempty\docomplexreserveblock[#1]}%
+ \setuvalue {\e!start#1\e!text}{\dotripleempty\docomplexstarttextblock[#1]}%
+ \setuvalue {\e!stop#1\e!text}{\dostoptextfloat}%
+ \setuvalue{\e!start\e!reserve#1\e!text}{\doquadrupleempty\docomplexstartreservetextblock[#1]}%
+ \setuvalue {\e!stop\e!reserve#1\e!text}{\dostoptextfloat}%
+ \setuvalue {\e!emptyone#1}{\doemptyfloatblock{#1}}%
+ \setuvalue {\e!emptytwo#1}{\doemptyfloatblock{#1}}}
%D Fallback float body:
@@ -1103,8 +1103,8 @@
\let\dorestorefloatstatus\relax
-\ifx\doflushfloats\undefined \let\doflushfloats\relax \fi
-\ifx\flushfloatbox\undefined \let\flushfloatbox\relax \fi
+\ifdefined\doflushfloats\else \let\doflushfloats\relax \fi
+\ifdefined\flushfloatbox\else \let\flushfloatbox\relax \fi
% needed in the splitter:
@@ -1173,12 +1173,12 @@
\flushfloatbox
\blank[\floatsharedparameter\c!spaceafter]}
-\ifx\someherefloat\undefined \let\someherefloat\doplacefloatbox \fi
-\ifx\someslotfloat\undefined \let\someslotfloat\doplacefloatbox \fi
-\ifx\somefixdfloat\undefined \let\somefixdfloat\doplacefloatbox \fi
-\ifx\sometopsfloat\undefined \let\sometopsfloat\doplacefloatbox \fi
-\ifx\somebotsfloat\undefined \let\somebotsfloat\doplacefloatbox \fi
-\ifx\somesidefloat\undefined \let\somesidefloat\doplacefloatbox \fi
+\ifdefined\someherefloat\else \let\someherefloat\doplacefloatbox \fi
+\ifdefined\someslotfloat\else \let\someslotfloat\doplacefloatbox \fi
+\ifdefined\somefixdfloat\else \let\somefixdfloat\doplacefloatbox \fi
+\ifdefined\sometopsfloat\else \let\sometopsfloat\doplacefloatbox \fi
+\ifdefined\somebotsfloat\else \let\somebotsfloat\doplacefloatbox \fi
+\ifdefined\somesidefloat\else \let\somesidefloat\doplacefloatbox \fi
% test case:
%
@@ -1374,7 +1374,7 @@
% minwidth=fit,width=max : no overshoot, as wide as graphic
-\ifx\moveboxontogrid\undefined \let\movecaptionontogrid\gobblethreearguments \fi
+\ifdefined\moveboxontogrid\else \let\movecaptionontogrid\gobblethreearguments \fi
\def\locatefloatbox
{\chardef\alignstrutmode\zerocount
@@ -2052,7 +2052,7 @@
\@EA\aftersplitstring \floatcolumn\at*\to\floatrow
\@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn
% todo: nog algemeen otr
- \ifx\OTRSETsetpreferedcolumnslot\undefined\else
+ \ifdefined\OTRSETsetpreferedcolumnslot
\OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
\fi}
{\let\floatcolumn\empty
diff --git a/tex/context/base/strc-lnt.mkiv b/tex/context/base/strc-lnt.mkiv
index d80d38900..707559ac3 100644
--- a/tex/context/base/strc-lnt.mkiv
+++ b/tex/context/base/strc-lnt.mkiv
@@ -59,9 +59,9 @@
\def\dodefinelinenote[#1][#2]%
{\definenote[ln:#1][#2]%
- \unexpanded\setvalue {#1}{\dolinenote {#1}}%
- \unexpanded\setvalue{\e!start#1}{\dostartlinenote{#1}}%
- \unexpanded\setvalue{\e!stop #1}{\dostoplinenote {#1}}}
+ \setuvalue {#1}{\dolinenote {#1}}%
+ \setuvalue{\e!start#1}{\dostartlinenote{#1}}%
+ \setuvalue{\e!stop #1}{\dostoplinenote {#1}}}
\def\setuplinenote[#1]% convenient
{\setupnote[ln:#1]}
diff --git a/tex/context/base/strc-mar.mkiv b/tex/context/base/strc-mar.mkiv
index 8dbbb232c..65f360749 100644
--- a/tex/context/base/strc-mar.mkiv
+++ b/tex/context/base/strc-mar.mkiv
@@ -138,8 +138,10 @@
\def\checkedcurrentmarks{\markcurrentcs} % #1 shared current mark
-\let\currentsplittopmarknumber\currenttopmarknumber
-\let\normalsplittopmarks \normaltopmarks
+\let\currentsplitfirstmarknumber\currentfirstmarknumber
+\let\currentsplittopmarknumber \currenttopmarknumber
+\let\currentsplitbotmarknumber \currentbotmarknumber
+\let\normalsplittopmarks \normaltopmarks
\def\uncheckedautotopmark {\normaltopmarks \markautocs} % #1
\def\uncheckedautofirstmark {\normalfirstmarks \markautocs} % #1
diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv
index 7e578459b..ed77edc85 100644
--- a/tex/context/base/strc-ref.mkiv
+++ b/tex/context/base/strc-ref.mkiv
@@ -917,7 +917,7 @@
\c!label=, % can be {left}{right}
\c!command=\in,
#2]%
- \unexpanded\setvalue{#1}%
+ \setuvalue{#1}%
{\dontleavehmode\doexecutereferenceformat{#1}}%
\fi}
diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv
index 4fa29285a..b9498c0d2 100644
--- a/tex/context/base/strc-reg.mkiv
+++ b/tex/context/base/strc-reg.mkiv
@@ -132,9 +132,9 @@
{\setupregister[#1][\s!parent=\??id]%
\ctxlua{jobregisters.define('#1')}%
\presetheadtext[#1=\Word{#1}]%
- \unexpanded\setvalue{#1}{\dodoubleempty\doregister[#1]}%
- \unexpanded\setvalue{\e!see#1}{\dodoubleempty\doseeregister[#1]}%
-% \unexpanded\setvalue{\e!coupled#1}{\dolinkedregister{#1}}%
+ \setuvalue{#1}{\dodoubleempty\doregister[#1]}%
+ \setuvalue{\e!see#1}{\dodoubleempty\doseeregister[#1]}%
+% \setuvalue{\e!coupled#1}{\dolinkedregister{#1}}%
\setvalue{\e!place#1}{\placeregister[#1]}%
\setvalue{\e!complete#1}{\completeregister[#1]}%
\setvalue{\e!setup#1\e!endsetup}[##1]{\getparameters[\??id#1][##1]}}
diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv
index 2115d6287..5cdf3703f 100644
--- a/tex/context/base/strc-ren.mkiv
+++ b/tex/context/base/strc-ren.mkiv
@@ -31,22 +31,51 @@
{\the\everyheadstart
\doif{\structureheadparameter\c!margintext}\v!yes\placemargincontent}
-\def\doplaceheadtextcomponent#1#2%
- {\begingroup
- \dosetstructureheadattributes\c!style\c!color
- % nasty, we need to adapt twice
- \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
- \setupinterlinespace
+\def\setupheadcomponentfont#1#2%
+ {\ifconditional\structureheadisdisplay
+ \edef\askedstructureheadinterlinespace{\structureheadparameter\c!interlinespace}%
+ \ifx\askedstructureheadinterlinespace\empty
+ % here the interline space is only set when style sets no space
+ \setfalse\fontattributeisset
+ \setfalse\interlinespaceisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else
+ \setupinterlinespace
+ \fi \fi
+ \setfalse\fontattributeisset \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else
+ \setupinterlinespace
+ \fi \fi
\else
+ % here the set interline space overloads any other set space in the style
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset
+ \dosetupcheckedinterlinespace\askedstructureheadinterlinespace
+ \fi
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset
+ \dosetupcheckedinterlinespace\askedstructureheadinterlinespace
+ \fi
+ \fi
+ \else
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset
\setupspacing
\fi
- \dosetstructureheadattributes\c!textstyle\c!textcolor
- \dontconvertfont
- \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
- \setupinterlinespace
- \else
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset
\setupspacing
\fi
+ \fi
+ \dontconvertfont}
+
+\def\doplaceheadtextcomponent#1#2%
+ {\begingroup
+ \setupheadcomponentfont\c!textstyle\c!textcolor
% \ifcase\headtimingmode#1\fi % can introduce cr
\structureheadparameter\c!commandbefore
\placeheadmargintexts
@@ -74,8 +103,7 @@
\def\doplaceheadnumbercomponent#1#2%
{\begingroup
- \dosetstructureheadattributes\c!style\c!color
- \dosetstructureheadattributes\c!numberstyle\c!numbercolor
+ \setupheadcomponentfont\c!numberstyle\c!numbercolor
% \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005
\placeheadmargintexts
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv
index f583ef849..2074fabdf 100644
--- a/tex/context/base/strc-sec.mkiv
+++ b/tex/context/base/strc-sec.mkiv
@@ -399,14 +399,21 @@
\unexpanded\def\placeheadtext {\dosingleempty\doplaceheadtext } % use with care
\unexpanded\def\placeheadnumber{\dosingleempty\doplaceheadnumber} % use with care
+\ifdefined\setupheadcomponentfont \else
+
+ \def\setupheadcomponentfont#1#2%
+ {\dosetstructureheadattributes\c!style\c!color
+ \dosetstructureheadattributes#1#2%
+ \dontconvertfont
+ \setupinterlinespace}
+
+\fi
+
\def\doplaceheadtext[#1]%
{\dontleavehmode
\begingroup
\edef\currentstructurehead{#1}%
- \dosetstructureheadattributes\c!style\c!color
- \dosetstructureheadattributes\c!textstyle\c!textcolor
- \dontconvertfont
- \setupinterlinespace
+ \setupheadcomponentfont\c!textstyle\c!textcolor
\relax
\getspecificstructuretitle{\thenamedstructureheadlevel{#1}}%
\endgraf
@@ -416,10 +423,7 @@
{\dontleavehmode
\begingroup
\edef\currentstructurehead{#1}%
- \dosetstructureheadattributes\c!style\c!color
- \dosetstructureheadattributes\c!numberstyle\c!numbercolor
- \dontconvertfont
- \setupinterlinespace
+ \setupheadcomponentfont\c!numberstyle\c!numbercolor
\relax
\getfullstructurenumber{\thenamedstructureheadlevel{#1}}%
\endgraf
diff --git a/tex/context/base/strc-syn.mkiv b/tex/context/base/strc-syn.mkiv
index 17ae7934a..9da6aad40 100644
--- a/tex/context/base/strc-syn.mkiv
+++ b/tex/context/base/strc-syn.mkiv
@@ -107,12 +107,12 @@
\ifthirdargument
\unexpanded\def#3##1{\doinsertsynonymmeaning{#1}{##1}}% \meaning
\fi
- \unexpanded\setvalue{#1}{\definesynonym[\v!no][#1]}% \name
+ \setuvalue{#1}{\definesynonym[\v!no][#1]}% \name
\else
\ifthirdargument
\unexpanded\def#3##1{\doinsertsynonymmeaning{#1}{##1}}% \meaning
\fi
- \unexpanded\setvalue{#1}{\definesynonym[\v!yes][#1]}% \name
+ \setuvalue{#1}{\definesynonym[\v!yes][#1]}% \name
\fi
\getparameters[\??sm#1][\s!parent=\??sm,\s!multi={#2}]%
\presetheadtext[#2=\Word{#2}]% changes the \if...argument
@@ -150,7 +150,7 @@
used = false,
}
})}%
- \doif{#1}\v!yes{\unexpanded\setxvalue\currentsynonymtag{\noexpand\doinsertsynonym{\currentsynonym}{\currentsynonymtag}}}%
+ \doif{#1}\v!yes{\setuxvalue\currentsynonymtag{\noexpand\doinsertsynonym{\currentsynonym}{\currentsynonymtag}}}%
\fi
\endgroup}
@@ -275,9 +275,9 @@
{\ifx#3\relax \else
\unexpanded\def#3##1{\doinsertsort{#1}{##1}}%
\fi}%
- \unexpanded\setvalue{#1}{\definesort[\v!no][#1]}%
+ \setuvalue{#1}{\definesort[\v!no][#1]}%
\else
- \unexpanded\setvalue{#1}{\definesort[\v!yes][#1]}%
+ \setuvalue{#1}{\definesort[\v!yes][#1]}%
\fi
\getparameters[\??so#1][\s!parent=\??so,\s!multi={#2}]%
\presetheadtext[#2=\Word{#2}]% after \ifthirdargument -)
@@ -313,7 +313,7 @@
% used = false,
}
})}%
- \doif{#1}\v!yes{\unexpanded\setxvalue\currentsortingtag{\noexpand\doinsertsort{\currentsorting}{\currentsortingtag}}}%
+ \doif{#1}\v!yes{\setuxvalue\currentsortingtag{\noexpand\doinsertsort{\currentsorting}{\currentsortingtag}}}%
\fi
\endgroup}
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
index 815d5add0..95d260750 100644
--- a/tex/context/base/syst-aux.mkiv
+++ b/tex/context/base/syst-aux.mkiv
@@ -428,6 +428,11 @@
\def\undefinevalue#1{\expandafter\let\csname#1\endcsname\undefined}
\def\ignorevalue#1#2{\expandafter\let\csname#1\endcsname\empty}
+\def\setuvalue #1{\normalprotected\expandafter \def\csname#1\endcsname}
+\def\setuevalue #1{\normalprotected\expandafter\edef\csname#1\endcsname}
+\def\setugvalue #1{\normalprotected\expandafter\gdef\csname#1\endcsname}
+\def\setuxvalue #1{\normalprotected\expandafter\xdef\csname#1\endcsname}
+
%D \macros
%D {globallet,glet}
%D
diff --git a/tex/context/base/tabl-tab.mkiv b/tex/context/base/tabl-tab.mkiv
index 1b83d4dd8..5015473e0 100644
--- a/tex/context/base/tabl-tab.mkiv
+++ b/tex/context/base/tabl-tab.mkiv
@@ -2423,10 +2423,10 @@
\expanded{\NormalTLTU{\the\scratchdimen}}%
% spacing, was depth=4 height=8 (counters, sigh, now macros)
\doifelse\@@tiheight\v!strut
- {\let\StrutHeightFactor\@@itheight}
+ {\let\StrutHeightFactor\strutheightfactor}
{\let\StrutHeightFactor\@@tiheight}%
\doifelse\@@tidepth\v!strut
- {\let\StrutDepthFactor\@@itdepth}
+ {\let\StrutDepthFactor\strutdepthfactor}
{\let\StrutDepthFactor\@@tidepth}%
\scratchdimen\StrutHeightFactor\points \multiply\scratchdimen 10%
\edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
diff --git a/tex/context/base/type-ini.mkiv b/tex/context/base/type-ini.mkiv
index 6a17eccc7..dca6e3a4d 100644
--- a/tex/context/base/type-ini.mkiv
+++ b/tex/context/base/type-ini.mkiv
@@ -554,7 +554,7 @@
\setgvalue{\??tf#1\s!default}{#2}%
\fi
\ifcsname#1\endcsname \else
- \unexpanded\setgvalue{#1}{\switchtotypeface[#1][#2]}%
+ \setugvalue{#1}{\switchtotypeface[#1][#2]}%
\fi}}
\def\setuptypeface% [class] [settings]
diff --git a/tex/context/base/x-asciimath.lua b/tex/context/base/x-asciimath.lua
index 84a89ad44..c2b15e313 100644
--- a/tex/context/base/x-asciimath.lua
+++ b/tex/context/base/x-asciimath.lua
@@ -18,7 +18,7 @@ local lpegmatch = lpeg.match
local S, P, R, C, V, Cc, Ct, Cs = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs
-local letter = lpeg.utf8
+local letter = lpeg.patterns.utf8
local space = S(" \n\r\t")
local spaces = space^0/""
local integer = P("-")^-1 * R("09")^1
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index 21396c76c..800d3d525 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua
--- merge date : 03/10/10 23:51:28
+-- merge date : 03/12/10 19:55:31
do -- begin closure to overcome local limits and interference
@@ -302,57 +302,58 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
license = "see context related readme files"
}
-lpeg = require("lpeg")
+local lpeg = require("lpeg")
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
local match = lpeg.match
---~ l-lpeg.lua :
-
---~ lpeg.digit = lpeg.R('09')^1
---~ lpeg.sign = lpeg.S('+-')^1
---~ lpeg.cardinal = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.integer = lpeg.P(lpeg.sign^0 * lpeg.digit^1)
---~ lpeg.float = lpeg.P(lpeg.sign^0 * lpeg.digit^0 * lpeg.P('.') * lpeg.digit^1)
---~ lpeg.number = lpeg.float + lpeg.integer
---~ lpeg.oct = lpeg.P("0") * lpeg.R('07')^1
---~ lpeg.hex = lpeg.P("0x") * (lpeg.R('09') + lpeg.R('AF'))^1
---~ lpeg.uppercase = lpeg.P("AZ")
---~ lpeg.lowercase = lpeg.P("az")
-
---~ lpeg.eol = lpeg.S('\r\n\f')^1 -- includes formfeed
---~ lpeg.space = lpeg.S(' ')^1
---~ lpeg.nonspace = lpeg.P(1-lpeg.space)^1
---~ lpeg.whitespace = lpeg.S(' \r\n\f\t')^1
---~ lpeg.nonwhitespace = lpeg.P(1-lpeg.whitespace)^1
-
-local hash = { }
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.octal = patterns.oct
+patterns.HEX = P("0x") * R("09","AF")^1
+patterns.hex = P("0x") * R("09","af")^1
+patterns.hexadecimal = P("0x") * R("09","AF","af")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * lpeg.V(1) }
-end
-
-function lpeg.startswith(pattern) --slightly adapted
- return P(pattern)
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
end
function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
--- variant:
-
---~ local parser = lpeg.Ct(lpeg.splitat(newline))
-
-local crlf = P("\r\n")
-local cr = P("\r")
-local lf = P("\n")
-local space = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-local newline = crlf + cr + lf
-local spacing = space^0 * newline
-
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
local empty = spacing * Cc("")
local nonempty = Cs((1-spacing)^1) * spacing^-1
local content = (empty + nonempty)^1
@@ -363,7 +364,7 @@ function string:splitlines()
return match(capture,self)
end
-lpeg.linebyline = content -- better make a sublibrary
+patterns.textline = content
--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
@@ -419,46 +420,23 @@ end
--~ local p = pp
--~ for l=1,#list do
--~ if p then
---~ p = p + lpeg.P(list[l])
+--~ p = p + P(list[l])
--~ else
---~ p = lpeg.P(list[l])
+--~ p = P(list[l])
--~ end
--~ end
--~ return p
--~ end
--~ from roberto's site:
---~
---~ -- decode a two-byte UTF-8 sequence
---~ local function f2 (s)
---~ local c1, c2 = string.byte(s, 1, 2)
---~ return c1 * 64 + c2 - 12416
---~ end
---~
---~ -- decode a three-byte UTF-8 sequence
---~ local function f3 (s)
---~ local c1, c2, c3 = string.byte(s, 1, 3)
---~ return (c1 * 64 + c2) * 64 + c3 - 925824
---~ end
---~
---~ -- decode a four-byte UTF-8 sequence
---~ local function f4 (s)
---~ local c1, c2, c3, c4 = string.byte(s, 1, 4)
---~ return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
---~ end
---~
---~ local cont = lpeg.R("\128\191") -- continuation byte
---~
---~ local utf8 = lpeg.R("\0\127") / string.byte
---~ + lpeg.R("\194\223") * cont / f2
---~ + lpeg.R("\224\239") * cont * cont / f3
---~ + lpeg.R("\240\244") * cont * cont * cont / f4
---~
---~ local decode_pattern = lpeg.Ct(utf8^0) * -1
-local cont = R("\128\191") -- continuation byte
+local f1 = string.byte
-lpeg.patterns.utf8 = R("\0\127") + R("\194\223") * cont + R("\224\239") * cont * cont + R("\240\244") * cont * cont * cont
+local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2 - 12416 end
+local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
+local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
+
+patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
end -- closure
@@ -1738,6 +1716,15 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
end -- closure
do -- begin closure to overcome local limits and interference