From 942daebfbd9ce27aa5208411d58226100a1b2935 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 12 Mar 2013 18:11:37 +0100 Subject: =?UTF-8?q?prototype=20for=20a=20=E2=80=9Ccontainer=E2=80=9D=20dir?= =?UTF-8?q?ective?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mod/tex/context/third/rst/rst_context.lua | 32 ++++++++-------- mod/tex/context/third/rst/rst_directives.lua | 55 ++++++++++++++++++++++------ mod/tex/context/third/rst/rst_setups.lua | 9 +++-- 3 files changed, 65 insertions(+), 31 deletions(-) (limited to 'mod/tex/context') diff --git a/mod/tex/context/third/rst/rst_context.lua b/mod/tex/context/third/rst/rst_context.lua index b079730..a5fb603 100644 --- a/mod/tex/context/third/rst/rst_context.lua +++ b/mod/tex/context/third/rst/rst_context.lua @@ -18,11 +18,12 @@ local helpers = helpers or thirddata and thirddata.rst_helpers local rst_directives = rst_directives or thirddata and thirddata.rst_directives -local utf = unicode.utf8 -local utflen = utf.len -local utflower = utf.lower -local utfupper = utf.upper -local iowrite = io.write +local utf = unicode.utf8 +local utflen = utf.len +local utflower = utf.lower +local utfupper = utf.upper +local iowrite = io.write +local tableconcat = table.concat local dbg_write = helpers.dbg_writef @@ -381,7 +382,7 @@ do end function rst_context.joinindented (tab) - return table.concat (tab, "") + return tableconcat (tab, "") end local corresponding = { @@ -640,7 +641,7 @@ function rst_context.paragraph (data) if not data then return "" elseif type(data) == "table" then - str = #data > 1 and helpers.string.wrapat(inline_parser:match(table.concat(data, " ")), 65) + str = #data > 1 and helpers.string.wrapat(inline_parser:match(tableconcat(data, " ")), 65) or inline_parser:match(data[1]) else str = data @@ -1245,7 +1246,7 @@ function rst_context.footnote (label, content) end function rst_context.substitution_definition (subtext, directive, data) - data = table.concat(data, "\n") + data = tableconcat(data, "\n") local rs = rst_context.substitutions rs[subtext] = { directive = directive, data = data } return "" @@ -1253,12 +1254,13 @@ end -- not to be confused with the directive definition table rst_directives function rst_context.directive(directive, ...) - local rd = rst_directives - rst_context.addsetups("directive") - local data = {...} - local result = "" - if rd[directive] then - result = rd[directive](data) + local d = rst_directives[directive] + if d then + rst_context.addsetups("directive") + local data = {...} + local result = "" + result = d(data) + return result end - return result + return "" end diff --git a/mod/tex/context/third/rst/rst_directives.lua b/mod/tex/context/third/rst/rst_directives.lua index 9ece1db..c5f0b68 100644 --- a/mod/tex/context/third/rst/rst_directives.lua +++ b/mod/tex/context/third/rst/rst_directives.lua @@ -20,6 +20,8 @@ local rst_context = thirddata.rst local stringstrip = string.strip local stringformat = string.format +local tableconcat = table.concat +local lpegmatch = lpeg.match rst_directives.anonymous = 0 rst_directives.images = {} @@ -84,9 +86,10 @@ rst_directives.image = function(name, data) local processed = "" -- stub; TODO do something useful with optional dimension specifications if type(data) == "table" then -- should always be true local p = helpers.patterns - for _, str in ipairs(data) do + for i=1, #data do + local str = data[i] local key, val - key, val = p.colon_keyval:match(str) + key, val = lpegmatch(p.colon_keyval, str) local rdi = rst_directives.images if key and val then key = rdi.keys[key] -- sanitize key expression @@ -118,12 +121,12 @@ rst_directives.image = function(name, data) \def\RSTsubstitution%s{%% \placefigure[here]{%s}{\externalfigure[%s]%s} } -]], name, rst_context.escape(inline_parser:match(properties.caption)), name, properties.setup) +]], name, rst_context.escape(lpegmatch(inline_parser, properties.caption)), name, properties.setup) else -- image won't be referenced but used instantly img = img .. stringformat([[ \placefigure[here]{%s}{\externalfigure[%s]%s} -]], rst_context.escape(inline_parser:match(properties.caption)), data, properties.setup) +]], rst_context.escape(lpegmatch(inline_parser, properties.caption)), data, properties.setup) end return img end @@ -134,8 +137,9 @@ rst_directives.caution = function(raw) rst_context.addsetups("caution") local text local first = true - for _, line in ipairs(raw) do - if not helpers.patterns.spacesonly:match(line) then + for i=1, #raw do + local line = raw[i] + if not lpegmatch(helpers.patterns.spacesonly, line) then if first then text = line first = false @@ -144,7 +148,7 @@ rst_directives.caution = function(raw) end end end - text = rst_context.escape(helpers.string.wrapat(inline_parser:match(text))) + text = rst_context.escape(helpers.string.wrapat(lpegmatch(inline_parser, text))) return stringformat([[ \startRSTcaution %s @@ -158,8 +162,9 @@ rst_directives.danger = function(raw) rst_context.addsetups("danger") local text local first = true - for _, line in ipairs(raw) do - if not helpers.patterns.spacesonly:match(line) then + for i=1, #raw do + local line = raw[i] + if not lpegmatch(helpers.patterns.spacesonly, line) then if first then text = line first = false @@ -168,7 +173,7 @@ rst_directives.danger = function(raw) end end end - text = rst_context.escape(helpers.string.wrapat(inline_parser:match(text))) + text = rst_context.escape(helpers.string.wrapat(lpegmatch(inline_parser, text))) return stringformat([[ \startRSTdanger %s @@ -179,7 +184,8 @@ end -- http://docutils.sourceforge.net/docs/ref/rst/directives.html rst_directives.DANGER = function(addendum) local result = "" - for _,str in ipairs(addendum) do + for i=1, #addendum do + local str = addendum[i] result = result .. (stringstrip(str)) end return stringformat([[ @@ -264,7 +270,7 @@ rst_directives.math = function (name, data) data = data or name local formula if type(data) == "table" then - local last, i = table.maxn(data), 1 + local last, i = #data, 1 while i <= last do local line = stringstrip(data[i]) if line and line ~= "" then @@ -291,3 +297,28 @@ rst_directives.replace = function(name, data) ]], name, data) end +-------------------------------------------------------------------------------- +--- Containers. +-------------------------------------------------------------------------------- + +rst_directives.container = function(data) + local inline_parser = rst_context.inline_parser + local name, content = stringstrip(data[1]), "" + local tmp = { } + for i=2, #data do + tmp[#tmp+1] = data[i] + end + content = tableconcat(tmp, " ") + content = lpegmatch(inline_parser, content) + return stringformat([[ +\ifcsname %s\endcsname%% + \csname %s\endcsname%% +\else + \relax +\fi%% +{%s}%% +]], name, name, content) +end + +-- vim:ft=lua:sw=4:ts=4:expandtab + diff --git a/mod/tex/context/third/rst/rst_setups.lua b/mod/tex/context/third/rst/rst_setups.lua index 93084d9..64e9171 100644 --- a/mod/tex/context/third/rst/rst_setups.lua +++ b/mod/tex/context/third/rst/rst_setups.lua @@ -126,12 +126,13 @@ function optional_setups.substitutions () ]] local rs = rst_context.substitutions for name, content in next, rs do - local directive, data = content.directive, content.data + local id, data = content.directive, content.data name, data = name:gsub("%s", ""), stringstrip(data) - if directives[directive] then - substitutions = substitutions .. directives[directive](name, data) + local directive = directives[id] + if directive then + substitutions = substitutions .. directive(name, data) else - err(directive .. " does not exist.") + err(id .. " does not exist.") end end return substitutions -- cgit v1.2.3