diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua | 530 |
1 files changed, 427 insertions, 103 deletions
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua b/Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua index 8eb4815506e..ce84866a4d5 100644 --- a/Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua +++ b/Master/texmf-dist/tex/context/modules/mkiv/m-steps.lua @@ -8,11 +8,20 @@ if not modules then modules = { } end modules ['x-flow'] = { -- when we can resolve mpcolor at the lua end we will use metapost.graphic(....) directly +local tonumber = tonumber + moduledata.steps = moduledata.steps or { } -local variables = interfaces.variables +local context = context +local variables = interfaces.variables +local formatters = string.formatters +----- mpcolor = attributes.colors.mpnamedcolor +local concat = table.concat + +local report = logs.reporter("stepcharts") +local trace = false -local trace_charts = false +trackers.register("stepcharts",function(v) trace = v end) local defaults = { chart = { @@ -48,179 +57,494 @@ local defaults = { -- maybe: includes -- maybe: flush ranges -local charts = { } +local charts = { } -- not used but we could support nesting +local chart = nil local steps = { } +local count = 0 -function commands.step_start_chart(name) +local function step_start_chart(name,alternative) name = name or "" - steps = { } - charts[name] = { - steps = steps, + steps = table.setmetatableindex(function(t,k) + local v = { -- could be metatable + cell_top = false, + cell_bot = false, + text_top = false, + text_mid = false, + text_bot = false, + start_t = k, + start_m = k, + start_b = k, + cell_ali = false, + } + t[k] = v + return v + end) + count = 0 + chart = { + steps = steps, + count = count, + alternative = alternative, } + charts[name] = chart end -function commands.step_stop_chart() +local function step_stop_chart() + chart.count = count end -function commands.step_make_chart(settings) +local function step_make_chart(settings) local chartsettings = settings.chart if not chartsettings then - print("no chart") + if trace then + report("no chart") + end return end local chartname = chartsettings.name if not chartname then - print("no name given") + if trace then + report("no name given") + end return end local chart = charts[chartname] if not chart then - print("no such chart",chartname) + if trace then + report("no such chart: %s",chartname) + end return end local steps = chart.steps or { } -- table.setmetatableindex(settings,defaults) -- - if trace_charts then - inspect(steps) + if trace then + report(table.serialize(steps,"chartdata")) end -- local textsettings = settings.text local cellsettings = settings.cell local linesettings = settings.line + + local start = nil + local stop = nil + local flush = nil + + if false then + + -- some 2% faster at most, so neglectable as this kind of graphics + -- is hardly used in quantity but it saves mem and tokens in tracing + -- and we lose some aspects, like outer color and so (currently) + + local mpcode = false + + start = function() + mpcode = { } + end + stop = function() + local code = concat(mpcode,"\n") + -- print(code) + metapost.graphic { + -- instance = "metafun", + instance = "steps", + format = "metafun", + data = code, + -- initializations = "", + -- extensions = "", + -- inclusions = "", + definitions = 'loadmodule "step" ;', + -- figure = "", + method = "double", + } + mpcode = false + end + flush = function(fmt,first,...) + if first then + mpcode[#mpcode+1] = formatters[fmt](first,...) + else + mpcode[#mpcode+1] = fmt + end + end + + else + + start = function() context.startMPcode("steps") end + stop = context.stopMPcode + flush = context + + end + -- + start() + flush("step_begin_chart ;") + -- + local alternative = chartsettings.alternative + if not alternative or alternative == "" then + alternative = chart.alternative + end + if not alternative or alternative == "" then + alternative = variables.horizontal + end + local alternative = utilities.parsers.settings_to_hash(alternative) + local vertical = alternative[variables.vertical] + local align = alternative[variables.three] + local category = chartsettings.category -- - context.startMPcode() - context("if unknown context_cell : input mp-step.mpiv ; fi ;") - context("step_begin_chart ;") + flush('chart_category := "%s" ;',category) -- - if chartsettings.alternative == variables.vertical then - context("chart_vertical := true ;") + if vertical then + flush("chart_vertical := true ;") + end + if align then + flush("chart_align := true ;") end -- - context("text_line_color := \\MPcolor{%s} ;", textsettings.framecolor) - context("text_line_width := %p ;", textsettings.rulethickness) - context("text_fill_color := \\MPcolor{%s} ;", textsettings.backgroundcolor) - context("text_offset := %p ;", textsettings.offset) - context("text_distance_set := %p ;", textsettings.distance) + flush("text_line_color := %q ;", textsettings.framecolor) + flush("text_line_width := %p ;", textsettings.rulethickness) + flush("text_fill_color := %q ;", textsettings.backgroundcolor) + flush("text_offset := %p ;", textsettings.offset) + flush("text_distance_set := %p ;", textsettings.distance) -- - context("cell_line_color := \\MPcolor{%s} ;", cellsettings.framecolor) - context("cell_line_width := %p ;", cellsettings.rulethickness) - context("cell_fill_color := \\MPcolor{%s} ;", cellsettings.backgroundcolor) - context("cell_offset := %p ;", cellsettings.offset) - context("cell_distance_x := %p ;", cellsettings.dx) - context("cell_distance_y := %p ;", cellsettings.dy) + flush("cell_line_color := %q ;", cellsettings.framecolor) + flush("cell_line_width := %p ;", cellsettings.rulethickness) + flush("cell_fill_color := %q ;", cellsettings.backgroundcolor) + flush("cell_offset := %p ;", cellsettings.offset) + flush("cell_distance_x := %p ;", cellsettings.dx) + flush("cell_distance_y := %p ;", cellsettings.dy) -- - context("line_line_color := \\MPcolor{%s} ;", linesettings.color) - context("line_line_width := %p ;", linesettings.rulethickness) - context("line_distance := %p ;", linesettings.distance) - context("line_offset := %p ;", linesettings.offset) + flush("line_line_color := %q ;", linesettings.color) + flush("line_line_width := %p ;", linesettings.rulethickness) + flush("line_distance := %p ;", linesettings.distance) + flush("line_offset := %p ;", linesettings.offset) + flush("line_height := %p ;", linesettings.height) -- - for i=1,#steps do + for i=1,chart.count do local step = steps[i] - context("step_begin_cell ;") - if step.cell_top ~= "" then - context('step_cell_top("%s") ;',string.strip(step.cell_top)) + flush("step_begin_cell ;") + local ali = step.cell_ali + local top = step.cell_top + local bot = step.cell_bot + if ali then + local text = ali.text + local shape = ali.shape + flush('step_cell_ali(%s,%s,%s,%q,%q,%p,%i) ;', + tonumber(text.left) or 0, + tonumber(text.middle) or 0, + tonumber(text.right) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24 + ) end - if step.cell_bot ~= "" then - context('step_cell_bot("%s") ;',string.strip(step.cell_bot)) + if top then + local shape = top.shape + flush('step_cell_top(%s,%q,%q,%p,%i) ;', + tonumber(top.text.top) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24 + ) end - if step.text_top ~= "" then - context('step_text_top("%s") ;',string.strip(step.text_top)) + if bot then + local shape = bot.shape + flush('step_cell_bot(%s,%q,%q,%p,%i) ;', + tonumber(bot.text.bot) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24 + ) end - if step.text_mid ~= "" then - context('step_text_mid("%s") ;',string.strip(step.text_mid)) + local top = step.text_top + local mid = step.text_mid + local bot = step.text_bot + local s_t = step.start_t + local s_m = step.start_m + local s_b = step.start_b + if top then + local shape = top.shape + local line = top.line + flush('step_text_top(%s,%q,%q,%p,%i,%q,%p,%i) ;', + tonumber(top.text.top) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24, + line.color, + line.rulethickness, + tonumber(line.alternative) or 1 + ) end - if step.text_bot ~= "" then - context('step_text_bot("%s") ;',string.strip(step.text_bot)) + if mid then -- used ? + local shape = mid.shape + local line = mid.line + flush('step_text_mid(%s,%q,%q,%p,%i,%q,%p,%i) ;', + tonumber(mid.text.mid) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24, + line.color, + line.rulethickness, + tonumber(line.alternative) or 1 + ) end - context("step_end_cell ;") + if bot then + local shape = bot.shape + local line = bot.line + flush('step_text_bot(%s,%q,%q,%p,%i,%q,%p,%i) ;', + tonumber(bot.text.bot) or 0, + shape.framecolor, + shape.backgroundcolor, + shape.rulethickness, + tonumber(shape.alternative) or 24, + line.color, + line.rulethickness, + tonumber(line.alternative) or 1 + ) + end + flush('start_t[%i] := %i ;',i,s_t) + flush('start_m[%i] := %i ;',i,s_m) + flush('start_b[%i] := %i ;',i,s_b) + flush("step_end_cell ;") end -- - context("step_end_chart ;") - context.stopMPcode() + flush("step_end_chart ;") + stop() end -function commands.step_cells(top,bot) - steps[#steps+1] = { - cell_top = top or "", - cell_bot = bot or "", - text_top = "", - text_mid = "", - text_bot = "", - } +local function step_cells(spec) + count = count + 1 + local step = steps[count] + step.cell_top = spec + step.cell_bot = spec end -function commands.step_texts(top,bot) - if #steps > 0 then - steps[#steps].text_top = top or "" - steps[#steps].text_bot = bot or "" - end +local function step_cells_three(spec) + count = count + 1 + local step = steps[count] + step.cell_ali = spec end -function commands.step_cell(top) - steps[#steps+1] = { - cell_top = top or "", - cell_bot = "", - text_top = "", - text_mid = "", - text_bot = "", - } +local function step_texts(spec) + if count > 0 then + local step = steps[count] + step.text_top = spec + step.text_bot = spec + end end -function commands.step_text(top) - if #steps > 0 then - steps[#steps].text_top = top or "" - end +local function step_cell(spec) + count = count + 1 + steps[count].cell_top = spec end -function commands.step_textset(left,middle,right) - if #steps > 0 then - steps[#steps].text_top = left or "" - steps[#steps].text_mid = middle or "" - steps[#steps].text_bot = right or "" +local function step_text(spec) + if count > 0 then + local c = count + while true do + local step = steps[c] + if step.text_top then + c = c + 1 + step = steps[c] + else + step.text_top = spec + step.start_b = count + break + end + end end end -function commands.step_start_cell() - steps[#steps+1] = { - cell_top = "", - cell_bot = "", - text_top = "", - text_mid = "", - text_bot = "", - } +local function step_start_cell() + count = count + 1 + local step = steps[count] -- creates end -function commands.step_stop_cell() +local function step_stop_cell() end -function commands.step_text_top(str) - if #steps > 0 then - steps[#steps].text_top = str or "" +local function step_text_top(spec) + if count > 0 then + steps[count].text_top = spec end end -function commands.step_text_mid(str) - if #steps > 0 then - steps[#steps].text_mid = str or "" +local function step_text_mid(spec) + if count > 0 then + steps[count].text_mid = spec end end -function commands.step_text_bot(str) - if #steps > 0 then - steps[#steps].text_bot = str or "" +local function step_text_bot(spec) + if count > 0 then + steps[count].text_bot = spec end end -function commands.step_cell_top(str) - if #steps > 0 then - steps[#steps].cell_top = str or "" +local function step_cell_top(spec) + if count > 0 then + steps[count].cell_top = spec end end -function commands.step_cell_bot(str) - if #steps > 0 then - steps[#steps].cell_bot = str or "" +local function step_cell_bot(spec) + if count > 0 then + steps[count].cell_bot = spec end end + +-- + +interfaces.implement { + name = "step_start_chart", + arguments = { "string", "string" }, + actions = step_start_chart, +} + +interfaces.implement { + name = "step_stop_chart", + actions = step_stop_chart, +} + +interfaces.implement { + name = "step_make_chart", + actions = step_make_chart, + arguments = { + { + { "chart", { + { "category" }, + { "name" }, + { "alternative" }, + } + }, + { "cell", { + { "alternative" }, + { "offset", "dimension" }, + { "rulethickness", "dimension" }, + { "framecolor" }, + { "backgroundcolor" }, + { "dx", "dimension" }, + { "dy", "dimension" }, + } + }, + { "text", { + { "alternative" }, + { "offset", "dimension" }, + { "distance", "dimension" }, + { "rulethickness", "dimension" }, + { "framecolor" }, + { "backgroundcolor" }, + } + }, + { "line", { + { "alternative" }, + { "rulethickness", "dimension" }, + { "height", "dimension" }, + { "distance", "dimension" }, + { "offset", "dimension" }, + { "color" }, + } + } + } + } +} + +local step_spec = { + { + { "text", { + { "top" }, + { "middle" }, + { "mid" }, + { "bot" }, + { "left" }, + { "right" }, + } + }, + { "shape", { + { "rulethickness", "dimension" }, + { "alternative" }, + { "framecolor" }, + { "backgroundcolor" }, + } + }, + { "line", { + { "alternative" }, + { "rulethickness", "dimension" }, + { "color" }, + { "offset", "dimension" }, + } + } + } +} + +interfaces.implement { + name = "step_cell", + arguments = step_spec, + actions = step_cell, +} + +interfaces.implement { + name = "step_text", + arguments = step_spec, + actions = step_text, +} + +interfaces.implement { + name = "step_text_top", + arguments = step_spec, + actions = step_text_top, +} + +interfaces.implement { + name = "step_text_mid", + arguments = step_spec, + actions = step_text_mid, +} + +interfaces.implement { + name = "step_text_bot", + arguments = step_spec, + actions = step_text_bot, +} + +interfaces.implement { + name = "step_cell_top", + arguments = step_spec, + actions = step_cell_top, +} + +interfaces.implement { + name = "step_cell_bot", + arguments = step_spec, + actions = step_cell_bot, +} + +interfaces.implement { + name = "step_start_cell", + actions = step_start_cell, +} + +interfaces.implement { + name = "step_stop_cell", + actions = step_stop_cell, +} + +interfaces.implement { + name = "step_texts", + arguments = step_spec, + actions = step_texts, +} + +interfaces.implement { + name = "step_cells", + arguments = step_spec, + actions = step_cells, +} + +interfaces.implement { + name = "step_cells_three", + arguments = step_spec, + actions = step_cells_three, +} |