From 627ea5d5e35964244aa37e59c01b5497e657f1d0 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 9 Aug 2013 23:39:00 +0200 Subject: beta 2013.08.09 23:39 --- tex/context/base/buff-ini.lua | 123 +++++++++++++++++++++++------------ tex/context/base/context-version.pdf | Bin 4108 -> 4104 bytes tex/context/base/grph-fig.mkiv | 10 +-- tex/context/base/status-files.pdf | Bin 24685 -> 24695 bytes tex/context/base/util-soc.lua | 16 +++-- 5 files changed, 94 insertions(+), 55 deletions(-) diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index f76494c43..45288d18b 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -17,6 +17,7 @@ local trace_grab = false trackers.register("buffers.grab", function local trace_visualize = false trackers.register("buffers.visualize", function(v) trace_visualize = v end) local report_buffers = logs.reporter("buffers","usage") +local report_typeset = logs.reporter("buffers","typeset") local report_grabbing = logs.reporter("buffers","grabbing") local context = context @@ -25,6 +26,7 @@ local commands = commands local variables = interfaces.variables local settings_to_array = utilities.parsers.settings_to_array local formatters = string.formatters +local addsuffix = file.addsuffix local v_yes = variables.yes @@ -43,15 +45,23 @@ local function erase(name) end local function assign(name,str,catcodes) - cache[name] = { data = str, catcodes = catcodes } + cache[name] = { + data = str, + catcodes = catcodes, + typeset = false, + } end local function append(name,str) local buffer = cache[name] if buffer then - buffer.data = buffer.data .. str + buffer.data = buffer.data .. str + buffer.typeset = false else - cache[name] = { data = str } + cache[name] = { + data = str, + typeset = false, + } end end @@ -69,10 +79,40 @@ local function getlines(name) return buffer and splitlines(buffer.data) end -local function collectcontent(names,separator) -- no print - if type(names) == "string" then - names = settings_to_array(names) +local function getnames(name) + if type(name) == "string" then + return settings_to_array(name) + else + return name + end +end + +local function istypeset(name) + local names = getnames(name) + if #names == 0 then + return false + end + for i=1,#names do + local c = cache[names[i]] + if c and not c.typeset then + return false + end end + return true +end + +local function markastypeset(name) + local names = getnames(name) + for i=1,#names do + local c = cache[names[i]] + if c then + c.typeset = true + end + end +end + +local function collectcontent(name,separator) -- no print + local names = getnames(name) local nnames = #names if nnames == 0 then return getcontent("") -- default buffer @@ -91,12 +131,10 @@ local function collectcontent(names,separator) -- no print end end -local function loadcontent(names) -- no print - if type(names) == "string" then - names = settings_to_array(names) - end +local function loadcontent(name) -- no print + local names = getnames(name) local nnames = #names - local ok = false + local ok = false if nnames == 0 then ok = load(getcontent("")) -- default buffer elseif nnames == 1 then @@ -128,7 +166,6 @@ local function loadcontent(names) -- no print end end - buffers.raw = getcontent buffers.erase = erase buffers.assign = assign @@ -234,7 +271,7 @@ end function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes) -- maybe move \\ to call local dn = getcontent(name) if dn == "" then - nesting = 0 + nesting = 0 continue = false end if trace_grab then @@ -252,8 +289,8 @@ function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes) -- maybe nesting = nesting + lpegmatch(counter,bufferdata) local more = nesting > 0 if more then - dn = dn .. sub(bufferdata,2,-1) .. endtag - nesting = nesting - 1 + dn = dn .. sub(bufferdata,2,-1) .. endtag + nesting = nesting - 1 continue = true else if continue then @@ -275,10 +312,7 @@ function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes) -- maybe commands.doifelse(more) end --- The optional prefix hack is there for the typesetbuffer feature and --- in mkii we needed that (this hidden feature is used in a manual). - -local function prepared(name,list,prefix) -- list is optional +function commands.savebuffer(list,name,prefix) -- name is optional if not list or list == "" then list = name end @@ -289,37 +323,44 @@ local function prepared(name,list,prefix) -- list is optional if content == "" then content = "empty buffer" end - if prefix then - local name = file.addsuffix(name,"tmp") - return tex.jobname .. "-" .. name, content - else - return name, content + if prefix == v_yes then + name = addsuffix(tex.jobname .. "-" .. name,"tmp") end + io.savedata(name,content) end -local capsule = "\\starttext\n%s\n\\stoptext\n" -local command = "context %s" +local files = { } +local last = 0 -function commands.runbuffer(name,list,encapsulate) - local name, content = prepared(name,list) - if encapsulate then - content = format(capsule,content) +function commands.runbuffer(name,encapsulate) -- we used to compare the saved file with content + local names = getnames(name) + local filename = files[name] + if not filename then + last = last + 1 + filename = formatters["%s-typeset-buffer-%03i"](tex.jobname,last) + files[name] = filename end - local data = io.loaddata(name) - if data ~= content then + if not istypeset(names) then if trace_run then - report_buffers("changes in %a, processing forced",name) + report_typeset("changes in %a, processing forced",name) end - io.savedata(name,content) - os.execute(format(command,name)) + local filename = addsuffix(filename,"tmp") + local content = collectcontent(names,nil) or "" + if content == "" then + content = "empty buffer" + end + if encapsulate then + content = formatters["\\starttext\n%s\n\\stoptext\n"](content) + end + report_typeset("\n") + io.savedata(filename,content) + os.execute(formatters["context %s"](filename)) + report_typeset("\n") + markastypeset(names) elseif trace_run then - report_buffers("no changes in %a, not processed",name) + report_typeset("no changes in %a, not processed",name) end -end - -function commands.savebuffer(list,name,prefix) -- name is optional - local name, content = prepared(name,list,prefix==v_yes) - io.savedata(name,content) + context(addsuffix(filename,"pdf")) end function commands.getbuffer(name) diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 64590a05a..562f9c5c4 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv index d74f257f5..f11c481e3 100644 --- a/tex/context/base/grph-fig.mkiv +++ b/tex/context/base/grph-fig.mkiv @@ -27,11 +27,9 @@ % we could use \typesetbuffer[*] to access the last one -\newcount \c_grph_buffers_n \newconstant\c_grph_buffers_mode -\let\m_grph_buffers_filename\empty -\let\lasttypesetbuffer \empty +\let\lasttypesetbuffer\empty \unexpanded\def\typesetbuffer {\bgroup @@ -55,11 +53,7 @@ \fi\fi} \def\grph_buffers_typeset_indeed[#1][#2]% we could use the via files - {\doifnot{#1}{*} - {\global\advance\c_grph_buffers_n\plusone - \edef\m_grph_buffers_filename{\jobname-buffer-\the\c_grph_buffers_n}% - \ctxcommand{runbuffer("\m_grph_buffers_filename.tmp","#1",true)}% - \xdef\lasttypesetbuffer{\m_grph_buffers_filename.pdf}}% + {\doifnot{#1}{*}{\xdef\lasttypesetbuffer{\ctxcommand{runbuffer("#1")}}}% \ifcase\c_grph_buffers_mode % typesetonly \or diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index c2980374c..3ad04b484 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/util-soc.lua b/tex/context/base/util-soc.lua index 30301c510..3a52ee86d 100644 --- a/tex/context/base/util-soc.lua +++ b/tex/context/base/util-soc.lua @@ -25,17 +25,17 @@ function mail.send(specification) local server = specification.server or "" if not server then report_mail("no server specified") - return false + return false, "invalid server" end local to = specification.to or specification.recepient or "" if to == "" then - report_mail("no recepient specified") - return false + report_mail("no recipient specified") + return false, "invalid recipient" end local from = specification.from or specification.sender or "" if from == "" then report_mail("no sender specified") - return false + return false, "invalid sender" end local message = { } local body = specification.body @@ -68,11 +68,13 @@ function mail.send(specification) end end end + local user = specification.user + local password = specification.password local result, detail = smtp.send { server = specification.server, port = specification.port, - user = specification.user, - password = specification.password, + user = user ~= "" and user or nil, + password = password ~= "" and password or nil, from = from, rcpt = to, source = smtp.message { @@ -87,7 +89,9 @@ function mail.send(specification) } if detail then report_mail("error: %s",detail) + return false, detail else report_mail("message sent") + return true end end -- cgit v1.2.3