diff options
Diffstat (limited to 'rst_directives.lua')
-rw-r--r-- | rst_directives.lua | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/rst_directives.lua b/rst_directives.lua new file mode 100644 index 0000000..0b042df --- /dev/null +++ b/rst_directives.lua @@ -0,0 +1,242 @@ +#!/usr/bin/env texlua +-------------------------------------------------------------------------------- +-- FILE: rst_directives.lua +-- USAGE: ./rst_directives.lua +-- AUTHOR: Philipp Gesang (Phg), <megas.kapaneus@gmail.com> +-- VERSION: 1.0 +-- CREATED: 22/09/10 20:26:40 CEST +-------------------------------------------------------------------------------- +-- + +-------------------------------------------------------------------------------- +-- Directives for use with |substitutions| +-------------------------------------------------------------------------------- + +rst_directives = {} +rst_directives.anonymous = 0 +rst_directives.images = {} +rst_directives.images.done = {} +rst_directives.images.values = {} + + +rst_directives.images.keys = { + ["width"] = "width", + ["size"] = "width", + ["caption"] = "caption", + ["alt"] = "caption", + ["scale"] = "scale", +} + +rst_directives.images.values.scale = function (orig) + -- http://wiki.contextgarden.net/Reference/en/useexternalfigure + -- scale=1000 is original size; to get 72%, use scale=720. + return tonumber(orig) * 1000 +end + +rst_directives.images.values.width = { + ["fit"] = "\\hsize", + ["hsize"] = "\\hsize", + ["broad"] = "\\hsize", + ["normal"] = "local", + ["normal"] = "local", +} + +-- we won't allow passing arbitrary setups to context +rst_directives.images.permitted_setups = { + "width", "scale" +} + +local function img_setup (properties) + local result = "" + for _, prop in next, rst_directives.images.permitted_setups do + if properties[prop] then + result = result .. prop .. "=" .. properties[prop] .. "," + end + end + if result ~= "" then + result = "[" .. result .. "]" + end + return result +end + +rst_directives.image = function(name, data) + local inline_parser = rst_context.inline_parser + local properties = {} + local anon = false + local rd = rst_directives + if not data then -- this makes the “name” argument optional + data = name + rd.anonymous = rd.anonymous + 1 + anon = true -- indicates a nameless picture + name = "anonymous" .. rd.anonymous + end + properties.caption = name + --properties.width = "\\local" + + 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 + local key, val + key, val = p.colon_keyval:match(str) + local rdi = rst_directives.images + if key and val then + key = rdi.keys[key] -- sanitize key expression + if type(rdi.values[key]) == "table" then + val = rdi.values[key][val] + elseif type(rdi.values[key]) == "function" then + val = rdi.values[key](val) + end + properties[key] = val + else + processed = processed .. (str and str ~= "" and string.strip(str)) + end + end + end + properties.setup = img_setup(properties) or "" + data = processed + processed = nil + local img = "" + local images_done = rd.images.done + if not anon then + if not images_done[name] then + img = img .. string.format([[ + +\useexternalfigure[%s][%s][] +]], name, data) + images_done[name] = true + end + img = img .. string.format([[ +\def\RSTsubstitution%s{%% + \placefigure[here]{%s}{\externalfigure[%s]%s} +} +]], name, rst_context.escape(inline_parser:match(properties.caption)), name, properties.setup) + else -- image won't be referenced but used instantly + img = img .. string.format([[ + +\placefigure[here]{%s}{\externalfigure[%s]%s} +]], rst_context.escape(inline_parser:match(properties.caption)), data, properties.setup) + end + return img +end + +rst_directives.caution = function(raw) + local inline_parser = rst_context.inline_parser + rst_context.addsetups("dbend") + rst_context.addsetups("caution") + local text + local first = true + for _, line in ipairs(raw) do + if not helpers.patterns.spacesonly:match(line) then + if first then + text = line + first = false + else + text = text .. " " .. line + end + end + end + text = rst_context.escape(helpers.string.wrapat(inline_parser:match(text))) + return string.format([[ +\startRSTcaution +%s +\stopRSTcaution +]], text) +end + +rst_directives.danger = function(raw) + local inline_parser = rst_context.inline_parser + rst_context.addsetups("dbend") + rst_context.addsetups("danger") + local text + local first = true + for _, line in ipairs(raw) do + if not helpers.patterns.spacesonly:match(line) then + if first then + text = line + first = false + else + text = text .. " " .. line + end + end + end + text = rst_context.escape(helpers.string.wrapat(inline_parser:match(text))) + return string.format([[ +\startRSTdanger +%s +\stopRSTdanger +]], text) +end + +-- http://docutils.sourceforge.net/docs/ref/rst/directives.html +rst_directives.DANGER = function(addendum) + local result = "" + for _,str in ipairs(addendum) do + result = result .. (string.strip(str)) + end + return string.format([[ + +%% The Rabbit of Caerbannog +\startlinecorrection +\blank[force,big] +\framed[frame=on, + corner=round, + rulethickness=5pt, + align=middle, + width=\hsize, + frameoffset=.5em, + backgroundoffset=1em, + background=color, + backgroundcolor=red, + foreground=color, + foregroundcolor=black]{%% + \language[en-gb]\tfb\bf + Follow only if ye be men of valour, for the entrance to this cave is guarded + by a creature so foul, so cruel that no man yet has fought with it and lived. + Bones of full fifty men lie strewn about its lair. So, brave knights, if you + do doubt your courage or your strength, come no further, for death awaits you + all with nasty, big, pointy teeth.%% + \blank[force,big] + %s%% +} +\blank[force,big] +\stoplinecorrection +]], result) +end + +rst_directives.ctx = function(name, data) + local ctx = string.format([[ + +\startbuffer[%s] +%s +\stopbuffer +\def\RSTsubstitution%s{%% + \getbuffer[%s] +} +]], name, data, name, name) + return ctx +end + +rst_directives.lua = function(name, data) + local luacode = string.format([[ + +\startbuffer[%s] +\startluacode +%s +\stopluacode +\stopbuffer +\def\RSTsubstitution%s{%% + \getbuffer[%s]%% +} +]], name, data, name, name) + return luacode +end + +rst_directives.replace = function(name, data) + return string.format([[ + +\def\RSTsubstitution%s{%s} +]], name, data) +end + +return rst_directives |