summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/trac-lmx.lua
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2010-05-24 14:05:02 +0000
committerTaco Hoekwater <taco@elvenkind.com>2010-05-24 14:05:02 +0000
commit57ea7dad48fbf2541c04e434c31bde655ada3ac4 (patch)
tree1f8b43bc7cb92939271e1f5bec610710be69097f /Master/texmf-dist/tex/context/base/trac-lmx.lua
parent6ee41e1f1822657f7f23231ec56c0272de3855e3 (diff)
here is context 2010.05.24 13:05
git-svn-id: svn://tug.org/texlive/trunk@18445 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/trac-lmx.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/trac-lmx.lua263
1 files changed, 164 insertions, 99 deletions
diff --git a/Master/texmf-dist/tex/context/base/trac-lmx.lua b/Master/texmf-dist/tex/context/base/trac-lmx.lua
index 07f5ae291c0..664815c6618 100644
--- a/Master/texmf-dist/tex/context/base/trac-lmx.lua
+++ b/Master/texmf-dist/tex/context/base/trac-lmx.lua
@@ -1,72 +1,129 @@
if not modules then modules = { } end modules ['trac-lmx'] = {
- version = 1.001,
- comment = "companion to luat-lib.tex",
+ version = 1.002,
+ comment = "companion to trac-lmx.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-local gsub, format, concat = string.gsub, string.format, table.concat
+-- todo: use lpeg instead (although not really needed)
--- we can now use l-xml, and we can also use lpeg
+local gsub, format, concat, byte = string.gsub, string.format, table.concat, string.byte
lmx = lmx or { }
-lmx.escapes = {
+local escapes = {
['&'] = '&amp;',
['<'] = '&lt;',
['>'] = '&gt;',
['"'] = '&quot;'
}
--- local function p -> ends up in lmx.p, so we need to cast
-
-lmx.variables = { }
-
-lmx.variables['title-default'] = 'LMX File'
-lmx.variables['title'] = lmx.variables['title-default']
-
--- demonstrates: local, *all, gsub using tables, nil or value, loadstring
-
-function lmx.loadedfile(filename)
- return io.loaddata(resolvers.find_file(filename))
-end
-
-lmx.converting = false
-
-local templates = { }
-
-function lmx.convert(template,result) -- todo: use lpeg instead
- if not lmx.converting then -- else, if error then again tex error and loop
- local data = templates[template]
- if not data then
- data = lmx.loadedfile(template)
- templates[template] = data
- end
- local text = { }
- function lmx.print(...)
- text[#text+1] = concat({...})
- end
- function lmx.variable(str)
- return lmx.variables[str] or ""
- end
- function lmx.escape(str)
- str = tostring(str)
- str = gsub(str,'&','&amp;')
- str = gsub(str,'[<>"]',lmx.escapes)
- return str
- end
- function lmx.type(str)
- if str then lmx.print("<tt>" .. lmx.escape(str) .. "</tt>") end
- end
- function lmx.pv(str)
- lmx.print(lmx.variable(str))
- end
- function lmx.tv(str)
- lmx.type(lmx.variable(str))
- end
+-- variables
+
+lmx.variables = { } -- global, shared
+
+local lmxvariables = lmx.variables
+
+lmxvariables['title-default'] = 'ConTeXt LMX File'
+lmxvariables['title'] = lmx.variables['title-default']
+lmxvariables['color-background-green'] = '#4F6F6F'
+lmxvariables['color-background-blue'] = '#6F6F8F'
+lmxvariables['color-background-yellow'] = '#8F8F6F'
+lmxvariables['color-background-purple'] = '#8F6F8F'
+lmxvariables['color-background-body'] = '#808080'
+lmxvariables['color-background-main'] = '#3F3F3F'
+lmxvariables['color-background-one'] = lmxvariables['color-background-green']
+lmxvariables['color-background-two'] = lmxvariables['color-background-blue']
+
+function lmx.set(key, value)
+ lmxvariables[key] = value
+end
+
+function lmx.get(key)
+ return lmxvariables[key] or ""
+end
+
+-- helpers
+
+local variables, result = { } -- we assume no nesting
+
+local function do_print(one,two,...)
+ if two then
+ result[#result+1] = concat { one, two, ... }
+ else
+ result[#result+1] = one
+ end
+end
+
+local function do_escape(str)
+ str = tostring(str)
+ str = gsub(str,'&','&amp;')
+ str = gsub(str,'[<>"]',escapes)
+ return str
+end
+
+local function do_urlescaped(str)
+ return (gsub(str,"[^%a%d]",format("%%0x",byte("%1"))))
+end
+
+function do_type(str)
+ if str then do_print("<tt>" .. do_escape(str) .. "</tt>") end
+end
+
+local function do_variable(str)
+ return variables[str] or lmxvariables[str] -- or format("<!-- unset lmx instance variable: %s -->",str or "?")
+end
+
+function lmx.loadedfile(name)
+ name = (resolvers and resolvers.find_file and resolvers.find_file(name)) or name
+ return io.loaddata(name)
+end
+
+local function do_include(filename)
+ local stylepath = do_variable('includepath')
+ local data = lmx.loadedfile(filename)
+ if (not data or data == "") and stylepath ~= "" then
+ data = lmx.loadedfile(file.join(stylepath,filename))
+ end
+ if not data or data == "" then
+ data = format("<!-- unknown lmx include file: %s -->",filename)
+ end
+ return data
+end
+
+lmx.print = do_print
+lmx.type = do_type
+lmx.escape = do_escape
+lmx.urlescape = do_escape
+lmx.variable = do_variable
+lmx.include = do_include
+
+function lmx.pv(str)
+ do_print(do_variable(str) or "")
+end
+
+function lmx.tv(str)
+ lmx.type(do_variable(str) or "")
+end
+
+local template = [[
+ local definitions = { }
+ local p, v, e, t, pv, tv = lmx.print, lmx.variable, lmx.escape, lmx.type, lmx.pv, lmx.tv
+ %s
+]]
+
+local cache = { }
+
+local trace = false
+
+function lmx.new(data,variables)
+ data = data or ""
+ local known = cache[data]
+ if not known then
+ local definitions = { }
data = gsub(data,"<%?lmx%-include%s+(.-)%s-%?>", function(filename)
- return lmx.loadedfile(filename)
+ return lmx.include(filename)
end)
local definitions = { }
data = gsub(data,"<%?lmx%-define%-begin%s+(%S-)%s-%?>(.-)<%?lmx%-define%-end%s-%?>", function(tag,content)
@@ -76,78 +133,86 @@ function lmx.convert(template,result) -- todo: use lpeg instead
data = gsub(data,"<%?lmx%-resolve%s+(%S-)%s-%?>", function(tag)
return definitions[tag] or ""
end)
- data = gsub(data,"%c%s-(<%?lua .-%?>)%s-%c", function(lua)
- return "\n" .. lua .. " "
- end)
- data = gsub(data .. "<?lua ?>","(.-)<%?lua%s+(.-)%?>", function(txt, lua)
- txt = gsub(txt,"%c+", "\\n")
- txt = gsub(txt,'"' , '\\"')
- txt = gsub(txt,"'" , "\\'")
- -- txt = gsub(txt,"([\'\"])", { ["'"] = '\\"', ['"'] = "\\'" } )
- return "p(\"" .. txt .. "\")\n" .. lua .. "\n"
+ data = gsub(data .. "<?lua ?>","(.-)<%?lua%s+(.-)%s*%?>", function(txt,lua)
+ txt = gsub(txt,"%c+","\n")
+ return format("p(%q)%s ",txt,lua) -- nb! space
end)
- lmx.converting = true
- data = "local p,v,e,t,pv,tv = lmx.print,lmx.variable,lmx.escape,lmx.type,lmx.pv,lmx.tv " .. data
- assert(loadstring(data))()
- lmx.converting = false
- text = concat(text)
- if result then
- io.savedata(result,text)
- else
- return text
- end
+ data = format(template,data)
+ known = {
+ data = trace and data,
+ variables = variables or { },
+ converter = loadstring(data),
+ }
+ elseif variables then
+ known.variables = variables
+ end
+ return known, known.variables
+end
+
+function lmx.reset(self)
+ self.variables = { }
+end
+
+function lmx.result(self)
+ if trace then
+ return self.data
+ else
+ variables, result = self.variables, { }
+ self.converter()
+ return concat(result)
+ end
+end
+
+-- file converter
+
+local loaded = { }
+
+function lmx.convert(templatefile,resultfile,variables)
+ local data = loaded[templatefile]
+ if not data then
+ data = lmx.new(lmx.loadedfile(templatefile),variables)
+ loaded[template] = data
+ elseif variables then
+ data.variables = variables
+ end
+ local result = lmx.result(data)
+ if resultfile then
+ io.savedata(resultfile,result)
+ else
+ return lmx.result(data,result)
end
end
-- these can be overloaded; we assume that the os handles filename associations
-lmx.lmxfile = function(filename) return filename end
-lmx.htmfile = function(filename) return filename end
+lmx.lmxfile = function(filename) return filename end -- beware, these can be set!
+lmx.htmfile = function(filename) return filename end -- beware, these can be set!
-if os.platform == "windows" then
+if os.type == "windows" then
lmx.popupfile = function(filename) os.execute("start " .. filename) end
else
lmx.popupfile = function(filename) os.execute(filename) end
end
-function lmx.make(name)
+function lmx.make(name,variables)
local lmxfile = lmx.lmxfile(name)
local htmfile = lmx.htmfile(name)
if lmxfile == htmfile then
htmfile = gsub(lmxfile, "%.%a+$", "html")
end
- lmx.convert(lmxfile, htmfile)
+ lmx.convert(lmxfile,htmfile,variables)
return htmfile
end
-function lmx.show(name)
- local htmfile = lmx.make(name)
+function lmx.show(name,variables)
+ local htmfile = lmx.make(name,variables)
lmx.popupfile(htmfile)
return htmfile
end
--- kind of private
-
-lmx.restorables = { }
-
-function lmx.set(key, value)
- if not lmx.restorables[key] then
- table.insert(lmx.restorables, key)
- lmx.variables['@@' .. key] = lmx.variables[key]
- end
- lmx.variables[key] = value
-end
-
-function lmx.get(key)
- return lmx.variables[key] or ""
-end
+-- test
-function lmx.restore()
- for _,key in pairs(lmx.restorables) do
- lmx.variables[key] = lmx.variables['@@' .. key]
- end
- lmx.restorables = { }
-end
+--~ print(lmx.result(lmx.new(io.loaddata("t:/sources/context-timing.lmx"))))
-- command line