summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/context/lua/mtxrun.lua8
-rw-r--r--scripts/context/stubs/mswin/mtxrun.lua8
-rwxr-xr-xscripts/context/stubs/unix/mtxrun8
-rw-r--r--tex/context/base/buff-ini.lua52
-rw-r--r--tex/context/base/buff-ini.mkiv10
-rw-r--r--tex/context/base/buff-ver.mkiv2
-rw-r--r--tex/context/base/data-met.lua2
-rw-r--r--tex/context/base/data-out.lua2
-rw-r--r--tex/context/base/data-tex.lua393
-rw-r--r--tex/context/base/data-zip.lua4
-rw-r--r--tex/context/base/mult-cld.lua30
-rw-r--r--tex/context/base/strc-blk.lua8
-rw-r--r--tex/context/base/strc-blk.mkiv13
-rw-r--r--tex/context/base/trac-log.lua1
14 files changed, 341 insertions, 200 deletions
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index c41de7fb8..3be305bed 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -10435,7 +10435,7 @@ function resolvers.methodhandler(what, filename, filetype) -- ...
if trace_locating then
report_resolvers("using special handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
end
- return resolver[scheme](filename,filetype)
+ return resolver[scheme](filename,filetype,specification) -- todo: query
else
if trace_locating then
report_resolvers("no handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
@@ -12041,7 +12041,7 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
--- not used yet
+resolvers.savers = utilities.storage.allocate { }
@@ -12301,6 +12301,8 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- to be redone using the more recent schemes mechanism
+
local format, find, match = string.format, string.find, string.match
local unpack = unpack or table.unpack
@@ -12436,7 +12438,7 @@ function openers.zip(specification)
if trace_locating then
report_resolvers("zip opener, file '%s' found",q.name)
end
- return openers.textopener(specification,dfile,'zip')
+ return openers.textopener('zip',specification,dfile)
elseif trace_locating then
report_resolvers("zip opener, file '%s' not found",q.name)
end
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index c41de7fb8..3be305bed 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -10435,7 +10435,7 @@ function resolvers.methodhandler(what, filename, filetype) -- ...
if trace_locating then
report_resolvers("using special handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
end
- return resolver[scheme](filename,filetype)
+ return resolver[scheme](filename,filetype,specification) -- todo: query
else
if trace_locating then
report_resolvers("no handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
@@ -12041,7 +12041,7 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
--- not used yet
+resolvers.savers = utilities.storage.allocate { }
@@ -12301,6 +12301,8 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- to be redone using the more recent schemes mechanism
+
local format, find, match = string.format, string.find, string.match
local unpack = unpack or table.unpack
@@ -12436,7 +12438,7 @@ function openers.zip(specification)
if trace_locating then
report_resolvers("zip opener, file '%s' found",q.name)
end
- return openers.textopener(specification,dfile,'zip')
+ return openers.textopener('zip',specification,dfile)
elseif trace_locating then
report_resolvers("zip opener, file '%s' not found",q.name)
end
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index c41de7fb8..3be305bed 100755
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -10435,7 +10435,7 @@ function resolvers.methodhandler(what, filename, filetype) -- ...
if trace_locating then
report_resolvers("using special handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
end
- return resolver[scheme](filename,filetype)
+ return resolver[scheme](filename,filetype,specification) -- todo: query
else
if trace_locating then
report_resolvers("no handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
@@ -12041,7 +12041,7 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
--- not used yet
+resolvers.savers = utilities.storage.allocate { }
@@ -12301,6 +12301,8 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- to be redone using the more recent schemes mechanism
+
local format, find, match = string.format, string.find, string.match
local unpack = unpack or table.unpack
@@ -12436,7 +12438,7 @@ function openers.zip(specification)
if trace_locating then
report_resolvers("zip opener, file '%s' found",q.name)
end
- return openers.textopener(specification,dfile,'zip')
+ return openers.textopener('zip',specification,dfile)
elseif trace_locating then
report_resolvers("zip opener, file '%s' not found",q.name)
end
diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua
index 9caa673dc..9d4562e18 100644
--- a/tex/context/base/buff-ini.lua
+++ b/tex/context/base/buff-ini.lua
@@ -22,12 +22,12 @@ local huge = math.huge
local byte, sub, find, char, gsub, rep, lower, format, gmatch, match, count = string.byte, string.sub, string.find, string.char, string.gsub, string.rep, string.lower, string.format, string.gmatch, string.match, string.count
local splitlines, escapedpattern = string.splitlines, string.escapedpattern
local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local ctxcatcodes = tex.ctxcatcodes
local variables = interfaces.variables
local lpegmatch = lpeg.match
local settings_to_array = utilities.parsers.settings_to_array
local allocate = utilities.storage.allocate
local tabtospace = utilities.strings.tabtospace
+local texsprint, texprint, ctxcatcodes = tex.sprint, tex.print, tex.ctxcatcodes
buffers = {
data = allocate(),
@@ -218,18 +218,18 @@ function buffers.typebuffer(settings) -- todo: settings.nature = "display"
end
end
-function buffers.processbuffer(settings) -- overlaps too much with the previous
- local name = settings.name -- maybe use processor instead of visualizer
+function buffers.processbuffer(settings) -- nearly the same
+ local name = settings.name
local lines = name and data[name]
if lines then
+ -- dodo: process only and feedback
if type(lines) == "string" then
lines = splitlines(lines)
data[name] = lines
end
local content, m = filter(lines,settings)
if content and content ~= "" then
---~ print("!!!!!!!!!!!!!!!!!!!")
- flush(content,"process",settings)
+ flush(content,"direct",settings)
end
end
end
@@ -314,13 +314,14 @@ local printer = (lpeg.patterns.textline/texprint)^0 -- not the right one, we can
function buffers.get(name)
local b = data[name]
if b then
- if type(b) == "table" then
- for i=1,#b do
- texprint(b[i])
- end
- else
- lpegmatch(printer,b)
- end
+ context.viafile(b)
+--~ if type(b) == "table" then
+--~ for i=1,#b do
+--~ texprint(b[i])
+--~ end
+--~ else
+--~ lpegmatch(printer,b)
+--~ end
end
end
@@ -348,6 +349,33 @@ function buffers.evaluate(name)
end
end
+-- maybe we should keep buffers unsplit and only split when needed
+-- or better: we need a tex.sprint that splits on newlines (\r \n or
+-- \r\n)
+
+local function n_content(s)
+ flush(contentcatcodes,s)
+end
+
+local function n_endofline()
+ texsprint(" ")
+end
+
+local function n_emptyline()
+ texprint("")
+end
+
+local function n_simpleline()
+ texprint("")
+end
+
+function buffers.mkvi(name,raw)
+ local lines = content(name)
+ lines = resolvers.macros.preprocessed(lines)
+ -- context.printlines(lines,raw)
+ context.viafile(lines)
+end
+
function buffers.collect(names,separator) -- no print
-- maybe we should always store a buffer as table so
-- that we can pass it directly
diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
index f195cd8cf..403bbf55f 100644
--- a/tex/context/base/buff-ini.mkiv
+++ b/tex/context/base/buff-ini.mkiv
@@ -186,10 +186,12 @@
%
% \ctxluabuffer[what] \ctxluabuffer
-\def\ctxluabuffer
- {\dosingleempty\doctxluabuffer}
+\def\ctxluabuffer {\dosingleempty\doctxluabuffer}
+\def\mkvibuffer {\dosingleempty\domkvibuffer}
+\def\mkvibufferraw{\dosingleempty\domkvibufferraw}
-\def\doctxluabuffer[#1]%
- {\ctxlua{buffers.evaluate("#1")}}
+\def\doctxluabuffer [#1]{\ctxlua{buffers.evaluate("#1")}}
+\def\domkvibuffer [#1]{\ctxlua{buffers.mkvi("#1")}}
+%def\domkvibufferraw[#1]{\ctxlua{buffers.mkvi("#1",true)}}
\protect \endinput
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index 4a226885e..6dd540385 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -765,7 +765,7 @@
strip = "\typingparameter\c!strip",
tab = "\typingparameter\c!tab",
visualizer = "\typingparameter\c!option",
- nature = "process",
+ nature = "direct",
}}}
% line numbering, keep broken lines together
diff --git a/tex/context/base/data-met.lua b/tex/context/base/data-met.lua
index c9c3cde5e..908dbf199 100644
--- a/tex/context/base/data-met.lua
+++ b/tex/context/base/data-met.lua
@@ -42,7 +42,7 @@ function resolvers.methodhandler(what, filename, filetype) -- ...
if trace_locating then
report_resolvers("using special handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
end
- return resolver[scheme](filename,filetype)
+ return resolver[scheme](filename,filetype,specification) -- todo: query
else
if trace_locating then
report_resolvers("no handler for '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
diff --git a/tex/context/base/data-out.lua b/tex/context/base/data-out.lua
index 94c12bd8c..598f857f8 100644
--- a/tex/context/base/data-out.lua
+++ b/tex/context/base/data-out.lua
@@ -6,5 +6,5 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
--- not used yet
+resolvers.savers = utilities.storage.allocate { }
diff --git a/tex/context/base/data-tex.lua b/tex/context/base/data-tex.lua
index 3c42882fd..393c787d6 100644
--- a/tex/context/base/data-tex.lua
+++ b/tex/context/base/data-tex.lua
@@ -17,147 +17,10 @@ local report_resolvers = logs.new("resolvers")
local resolvers = resolvers
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
-function finders.generic(tag,filename,filetype)
- local foundname = resolvers.findfile(filename,filetype)
- if foundname and foundname ~= "" then
- if trace_locating then
- report_resolvers("%s finder: file '%s' found",tag,filename)
- end
- return foundname
- else
- if trace_locating then
- report_resolvers("%s finder: unknown file '%s'",tag,filename)
- end
- return unpack(finders.notfound)
- end
-end
-
--- -- keep this one as reference as it's the first version
---
--- resolvers.filters = resolvers.filters or { }
---
--- local input_translator, utf_translator, user_translator = nil, nil, nil
---
--- function resolvers.filters.install(name,func)
--- if name == "input" then input_translator = func
--- elseif name == "utf" then utf_translator = func
--- elseif name == "user" then user_translator = func end
--- end
---
--- function openers.textopener(filename,file_handle,tag)
--- local u = unicode.utftype(file_handle)
--- local t = { }
--- if u > 0 then
--- if trace_locating then
--- report_resolvers("%s opener, file '%s' opened using method '%s'",tag,filename,unicode.utfname[u])
--- end
--- local l
--- local data = file_handle:read("*a")
--- if u > 2 then
--- l = unicode.utf32_to_utf8(data,u==4)
--- elseif u > 1 then
--- l = unicode.utf16_to_utf8(data,u==2)
--- else
--- l = string.splitlines(data)
--- end
--- file_handle:close()
--- t = {
--- utftype = u, -- may go away
--- lines = l,
--- current = 0, -- line number, not really needed
--- handle = nil,
--- noflines = #l,
--- close = function()
--- if trace_locating then
--- report_resolvers("%s closer, file '%s' closed",tag,filename)
--- end
--- logs.show_close(filename)
--- t = nil
--- end,
--- reader = function(self)
--- self = self or t
--- local current, lines = self.current, self.lines
--- if current >= #lines then
--- return nil
--- else
--- current = current + 1
--- self.current = current
--- local line = lines[current]
--- if not line then
--- return nil
--- elseif line == "" then
--- return ""
--- else
--- if input_translator then
--- line = input_translator(line)
--- end
--- if utf_translator then
--- line = utf_translator(line)
--- end
--- if user_translator then
--- line = user_translator(line)
--- end
--- return line
--- end
--- end
--- end
--- }
--- else
--- if trace_locating then
--- report_resolvers("%s opener, file '%s' opened",tag,filename)
--- end
--- -- todo: file;name -> freeze / eerste regel scannen -> freeze
--- --~ local data = lpegmatch(getlines,file_handle:read("*a"))
--- --~ local n = 0
--- t = {
--- reader = function() -- self
--- local line = file_handle:read()
--- --~ n = n + 1
--- --~ local line = data[n]
--- --~ print(line)
--- if not line then
--- return nil
--- elseif line == "" then
--- return ""
--- else
--- if input_translator then
--- line = input_translator(line)
--- end
--- if utf_translator then
--- line = utf_translator(line)
--- end
--- if user_translator then
--- line = user_translator(line)
--- end
--- return line
--- end
--- end,
--- close = function()
--- if trace_locating then
--- report_resolvers("%s closer, file '%s' closed",tag,filename)
--- end
--- logs.show_close(filename)
--- file_handle:close()
--- t = nil
--- collectgarbage("step") -- saves some memory, maybe checkgarbage but no #
--- end,
--- handle = function()
--- return file_handle
--- end,
--- noflines = function()
--- t.noflines = io.noflines(file_handle)
--- return t.noflines
--- end
--- }
--- end
--- return t
--- end
-
-
-- the main text reader --
local sequencers = utilities.sequencers
@@ -186,26 +49,40 @@ sequencers.appendgroup(textfileactions,"user")
sequencers.appendgroup(textlineactions,"system")
sequencers.appendgroup(textlineactions,"user")
-function openers.textopener(filename,file_handle,tag)
- if trace_locating then
- report_resolvers("%s opener, file '%s' opened using method '%s'",tag,filename,unicode.utfname[u])
- end
+function openers.textopener(tag,filename,file_handle)
if textfileactions.dirty then
fileprocessor = sequencers.compile(textfileactions)
end
- local lines = io.loaddata(filename)
- local kind = unicode.filetype(lines)
- if kind == "utf-16-be" then
- lines = unicode.utf16_to_utf8_be(lines)
- elseif kind == "utf-16-le" then
- lines = unicode.utf16_to_utf8_le(lines)
- elseif kind == "utf-32-be" then
- lines = unicode.utf32_to_utf8_be(lines)
- elseif kind == "utf-32-le" then
- lines = unicode.utf32_to_utf8_le(lines)
- else -- utf8 or unknown
- lines = fileprocessor(lines,filename) or lines
- lines = string.splitlines(lines)
+ local lines
+ if not file_handle then
+ lines = io.loaddata(filename)
+ elseif type(file_handle) == "string" then
+ lines = file_handle
+ elseif type(file_handle) == "table" then
+ lines = file_handle
+ elseif file_handle then
+ lines = file_handle:read("*a")
+ file_handle:close()
+ end
+ if type(lines) == "string" then
+ local kind = unicode.filetype(lines)
+ if trace_locating then
+ report_resolvers("%s opener, file '%s' opened using method '%s'",tag,filename,kind)
+ end
+ if kind == "utf-16-be" then
+ lines = unicode.utf16_to_utf8_be(lines)
+ elseif kind == "utf-16-le" then
+ lines = unicode.utf16_to_utf8_le(lines)
+ elseif kind == "utf-32-be" then
+ lines = unicode.utf32_to_utf8_be(lines)
+ elseif kind == "utf-32-le" then
+ lines = unicode.utf32_to_utf8_le(lines)
+ else -- utf8 or unknown
+ lines = fileprocessor(lines,filename) or lines
+ lines = string.splitlines(lines)
+ end
+ elseif trace_locating then
+ report_resolvers("%s opener, file '%s' opened",tag,filename)
end
local t = {
lines = lines,
@@ -244,7 +121,88 @@ function openers.textopener(filename,file_handle,tag)
return t
end
--- -- --
+local data, n, template = { }, 0, "virtual://virtualfile:%s"
+
+-- todo: report statistics
+
+function savers.virtual(content)
+ n = n + 1
+ local filename = format(template,n)
+ if trace_locating then
+ report_resolvers("%s finder: virtual file '%s' saved",tag,filename)
+ end
+ data[filename] = content
+ return filename
+end
+
+function finders.virtual(filename,filetype,specification)
+ local path = specification and specification.path
+ local name = path ~= "" and path or filename
+ local d = data[name]
+ if d then
+ if trace_locating then
+ report_resolvers("virtual finder: file '%s' found",filename)
+ end
+ return filename
+ else
+ if trace_locating then
+ report_resolvers("virtual finder: unknown file '%s'",filename)
+ end
+ return unpack(finders.notfound)
+ end
+end
+
+function openers.virtual(filename,filetype,specification) -- duplicate ... todo: specification
+ local path = specification and specification.path
+ local name = path ~= "" and path or filename
+ local d = data[name]
+ if d then
+ if trace_locating then
+ report_resolvers("virtual opener, file '%s' opened",filename)
+ end
+ data[filename] = nil
+ return openers.textopener("virtual",filename,d)
+ else
+ if trace_locating then
+ report_resolvers("virtual opener, file '%s' not found",filename)
+ end
+ return unpack(openers.notfound)
+ end
+end
+
+function loaders.virtual(filename,filetype,specification)
+ local path = specification and specification.path
+ local name = path ~= "" and path or filename
+ local d = data[name]
+ if d then
+ if trace_locating then
+ report_resolvers("virtual loader, file '%s' loaded",filename)
+ end
+ data[filename] = nil
+ return true, d, #d
+ end
+ if trace_locating then
+ report_resolvers("virtual loader, file '%s' not loaded",filename)
+ end
+ return unpack(loaders.notfound)
+end
+
+-- could be a finder (beware: the generic finders take a tag!)
+
+function finders.generic(tag,filename,filetype)
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_resolvers("%s finder: file '%s' found",tag,filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_resolvers("%s finder: unknown file '%s'",tag,filename)
+ end
+ return unpack(finders.notfound)
+ end
+end
function openers.generic(tag,filename)
if filename and filename ~= "" then
@@ -254,7 +212,7 @@ function openers.generic(tag,filename)
if trace_locating then
report_resolvers("%s opener, file '%s' opened",tag,filename)
end
- return openers.textopener(filename,f,tag)
+ return openers.textopener(tag,filename,f)
end
end
if trace_locating then
@@ -323,3 +281,124 @@ function resolvers.loadtexfile(filename, filetype)
end
resolvers.texdatablob = resolvers.loadtexfile
+
+-- -- keep this one as reference as it's the first version
+--
+-- resolvers.filters = resolvers.filters or { }
+--
+-- local input_translator, utf_translator, user_translator = nil, nil, nil
+--
+-- function resolvers.filters.install(name,func)
+-- if name == "input" then input_translator = func
+-- elseif name == "utf" then utf_translator = func
+-- elseif name == "user" then user_translator = func end
+-- end
+--
+-- function openers.textopener(tag,filename,file_handle)
+-- local u = unicode.utftype(file_handle)
+-- local t = { }
+-- if u > 0 then
+-- if trace_locating then
+-- report_resolvers("%s opener, file '%s' opened using method '%s'",tag,filename,unicode.utfname[u])
+-- end
+-- local l
+-- local data = file_handle:read("*a")
+-- if u > 2 then
+-- l = unicode.utf32_to_utf8(data,u==4)
+-- elseif u > 1 then
+-- l = unicode.utf16_to_utf8(data,u==2)
+-- else
+-- l = string.splitlines(data)
+-- end
+-- file_handle:close()
+-- t = {
+-- utftype = u, -- may go away
+-- lines = l,
+-- current = 0, -- line number, not really needed
+-- handle = nil,
+-- noflines = #l,
+-- close = function()
+-- if trace_locating then
+-- report_resolvers("%s closer, file '%s' closed",tag,filename)
+-- end
+-- logs.show_close(filename)
+-- t = nil
+-- end,
+-- reader = function(self)
+-- self = self or t
+-- local current, lines = self.current, self.lines
+-- if current >= #lines then
+-- return nil
+-- else
+-- current = current + 1
+-- self.current = current
+-- local line = lines[current]
+-- if not line then
+-- return nil
+-- elseif line == "" then
+-- return ""
+-- else
+-- if input_translator then
+-- line = input_translator(line)
+-- end
+-- if utf_translator then
+-- line = utf_translator(line)
+-- end
+-- if user_translator then
+-- line = user_translator(line)
+-- end
+-- return line
+-- end
+-- end
+-- end
+-- }
+-- else
+-- if trace_locating then
+-- report_resolvers("%s opener, file '%s' opened",tag,filename)
+-- end
+-- -- todo: file;name -> freeze / eerste regel scannen -> freeze
+-- --~ local data = lpegmatch(getlines,file_handle:read("*a"))
+-- --~ local n = 0
+-- t = {
+-- reader = function() -- self
+-- local line = file_handle:read()
+-- --~ n = n + 1
+-- --~ local line = data[n]
+-- --~ print(line)
+-- if not line then
+-- return nil
+-- elseif line == "" then
+-- return ""
+-- else
+-- if input_translator then
+-- line = input_translator(line)
+-- end
+-- if utf_translator then
+-- line = utf_translator(line)
+-- end
+-- if user_translator then
+-- line = user_translator(line)
+-- end
+-- return line
+-- end
+-- end,
+-- close = function()
+-- if trace_locating then
+-- report_resolvers("%s closer, file '%s' closed",tag,filename)
+-- end
+-- logs.show_close(filename)
+-- file_handle:close()
+-- t = nil
+-- collectgarbage("step") -- saves some memory, maybe checkgarbage but no #
+-- end,
+-- handle = function()
+-- return file_handle
+-- end,
+-- noflines = function()
+-- t.noflines = io.noflines(file_handle)
+-- return t.noflines
+-- end
+-- }
+-- end
+-- return t
+-- end
diff --git a/tex/context/base/data-zip.lua b/tex/context/base/data-zip.lua
index 784ecb6b7..10c1b74f0 100644
--- a/tex/context/base/data-zip.lua
+++ b/tex/context/base/data-zip.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- to be redone using the more recent schemes mechanism
+
local format, find, match = string.format, string.find, string.match
local unpack = unpack or table.unpack
@@ -141,7 +143,7 @@ function openers.zip(specification)
if trace_locating then
report_resolvers("zip opener, file '%s' found",q.name)
end
- return openers.textopener(specification,dfile,'zip')
+ return openers.textopener('zip',specification,dfile)
elseif trace_locating then
report_resolvers("zip opener, file '%s' not found",q.name)
end
diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua
index 1154eefe3..32436c5a5 100644
--- a/tex/context/base/mult-cld.lua
+++ b/tex/context/base/mult-cld.lua
@@ -161,9 +161,37 @@ end
local flushlines = lpeg.texlinesplitter(n_content,n_endofline,n_emptyline,n_simpleline)
-context.__flushlines = flushlines -- maybe context.helpers.flushtexlines
+context.__flushlines = flushlines -- maybe context.helpers.flushtexlines
context.__flush = flush
+local printlines_ctx = (
+ (newline) / function() texprint("") end +
+ (1-newline)^1 / function(s) texprint(ctxcatcodes,s) end * newline^-1
+)^0
+
+local printlines_raw = (
+ (newline) / function() texprint("") end +
+ (1-newline)^1 / function(s) texprint(s) end * newline^-1
+)^0
+
+function context.printlines(str,raw)
+ if raw then
+ lpegmatch(printlines_raw,str)
+ else
+ lpegmatch(printlines_ctx,str)
+ end
+end
+
+-- -- --
+
+local savedata = resolvers.savers.virtual
+
+function context.viafile(data)
+ -- this is the only way to deal with nested buffers
+ -- and other catcode sensitive data
+ context.input(savedata(data))
+end
+
-- -- --
local function writer(parent,command,first,...)
diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua
index d02fdeb7b..a52fb737a 100644
--- a/tex/context/base/strc-blk.lua
+++ b/tex/context/base/strc-blk.lua
@@ -43,13 +43,7 @@ function blocks.print(name,data,hide)
else
context.dostartnormalblock(name)
end
- if type(data) == "table" then
- for i=1,#data do
- context(data[i])
- end
- else
- lpegmatch(printer,data)
- end
+ context.viafile(data)
if hide then
context.dostophiddenblock()
else
diff --git a/tex/context/base/strc-blk.mkiv b/tex/context/base/strc-blk.mkiv
index 1f8bbd212..f625fa448 100644
--- a/tex/context/base/strc-blk.mkiv
+++ b/tex/context/base/strc-blk.mkiv
@@ -23,7 +23,7 @@
% check functionality
% alternative files (needs further integration elsewhere)
-\def\blockparameter#1#2{\ifcsname\??tb#1#2\endcsname\csname\??tb#1#2\endcsname\fi}
+\def\namedblockparameter#1#2{\ifcsname\??tb#1#2\endcsname\csname\??tb#1#2\endcsname\fi}
\unexpanded\def\setupblockparameters{\dodoubleargument \dosetupblock} % fast one (for compatibility)
\unexpanded\def\setupblock {\dodoubleargumentwithset\dosetupblock} % handles set
@@ -42,12 +42,13 @@
\c!style=,
\c!file=]% todo
\ctxlua{structures.blocks.define("#1")}%
- \setvalue{\e!begin#1}{\dodoubleempty\dobeginofblock[#1]}%
+ \setuvalue{\e!begin#1}{\dodoubleempty\dobeginofblock[#1]}%
\letvalue{\e!end#1}\relax}
\long\def\dobeginofblock[#1][#2]%
{\normalexpanded{\noexpand\dodowithbuffer{@block@}{\e!begin#1}{\e!end#1}}
- {}{\ctxlua{structures.blocks.save("#1","#2","@block@")}}}% before after
+ {}% before
+ {\ctxlua{structures.blocks.save("#1","#2","@block@")}}}% after
\def\dostarthiddenblock
{\startnointerference
@@ -69,15 +70,15 @@
\edef\currentblock{#1}%
\doblocksetups\currentblock
\let\doblocksetups\gobbleoneargument
- \blockparameter\currentblock\c!before
+ \namedblockparameter\currentblock\c!before
\dosetfontattribute{\??tb\currentblock}\c!style
\dosetcolorattribute{\??tb\currentblock}\c!color
- \blockparameter\currentblock\c!inner
+ \namedblockparameter\currentblock\c!inner
\ignorespaces}
\def\dostopnormalblock
{\removeunwantedspaces
- \blockparameter\currentblock\c!after
+ \namedblockparameter\currentblock\c!after
\par % todo: alternative = text, paragraph
\egroup}
diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua
index 768f61821..4a77087f5 100644
--- a/tex/context/base/trac-log.lua
+++ b/tex/context/base/trac-log.lua
@@ -92,6 +92,7 @@ end
local texlog = { } logs.tex = texlog setmetatable(texlog, { __index = noplog })
function texlog.report(a,b,c,...)
+--~ print(a,b,c,...)
if c then
write_nl(format("%-16s> %s\n",a,format(b,c,...)))
elseif b then