summaryrefslogtreecommitdiff
path: root/tex/context/modules/mkiv/m-steps.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-06-25 15:40:51 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-06-25 15:40:51 +0200
commitb2a2304cbb0c65040d7b118ac9b857d304e333e6 (patch)
treeed5212e37a91ec78c12d9f72ca1186a59c139b40 /tex/context/modules/mkiv/m-steps.lua
parentb2276ae7a04a9f9c35403e508670049d8c3e4b3e (diff)
downloadcontext-b2a2304cbb0c65040d7b118ac9b857d304e333e6.tar.gz
2016-06-25 14:42:00
Diffstat (limited to 'tex/context/modules/mkiv/m-steps.lua')
-rw-r--r--tex/context/modules/mkiv/m-steps.lua463
1 files changed, 374 insertions, 89 deletions
diff --git a/tex/context/modules/mkiv/m-steps.lua b/tex/context/modules/mkiv/m-steps.lua
index 8eb481550..f492c6c42 100644
--- a/tex/context/modules/mkiv/m-steps.lua
+++ b/tex/context/modules/mkiv/m-steps.lua
@@ -10,9 +10,13 @@ if not modules then modules = { } end modules ['x-flow'] = {
moduledata.steps = moduledata.steps or { }
+local context = context
local variables = interfaces.variables
-local trace_charts = false
+local report = logs.reporter("stepcharts")
+local trace = false
+
+trackers.register("stepcharts",function(v) trace = v end)
local defaults = {
chart = {
@@ -48,92 +52,206 @@ 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)
name = name or ""
- steps = { }
- charts[name] = {
+ 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,
}
+ 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
--
+ -- just process MP directly so that we can pass an array
+ --
context.startMPcode()
context("if unknown context_cell : input mp-step.mpiv ; fi ;")
context("step_begin_chart ;")
--
- if chartsettings.alternative == variables.vertical then
+ local alternative = utilities.parsers.settings_to_hash(chartsettings.alternative)
+ local vertical = alternative[variables.vertical]
+ local align = alternative[variables.three]
+ local category = chartsettings.category
+ --
+ context('chart_category := "%s" ;',category)
+ --
+ if vertical then
context("chart_vertical := true ;")
end
+ if align then
+ context("chart_align := true ;")
+ end
--
context("text_line_color := \\MPcolor{%s} ;", textsettings.framecolor)
- context("text_line_width := %p ;", textsettings.rulethickness)
+ 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)
+ context("text_offset := %p ;", textsettings.offset)
+ context("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)
+ 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)
--
- 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)
+ 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)
+ context("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))
+ 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
+ context('step_cell_ali(%s,%s,%s,\\MPcolor{%s},\\MPcolor{%s},%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
+ context('step_cell_top(%s,\\MPcolor{%s},\\MPcolor{%s},%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
+ context('step_cell_bot(%s,\\MPcolor{%s},\\MPcolor{%s},%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 vertical then
+-- top, bot, s_t, s_b = bot, top, s_b, s_t
+-- end
+ if top then
+ local shape = top.shape
+ local line = top.line
+ context('step_text_top(%s,\\MPcolor{%s},\\MPcolor{%s},%p,%i,\\MPcolor{%s},%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
+ context('step_text_mid(%s,\\MPcolor{%s},\\MPcolor{%s},%p,%i,\\MPcolor{%s},%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
+ if bot then
+ local shape = bot.shape
+ local line = bot.line
+ context('step_text_bot(%s,\\MPcolor{%s},\\MPcolor{%s},%p,%i,\\MPcolor{%s},%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
+ context('start_t[%i] := %i ;',i,s_t)
+ context('start_m[%i] := %i ;',i,s_m)
+ context('start_b[%i] := %i ;',i,s_b)
context("step_end_cell ;")
end
--
@@ -141,86 +259,253 @@ function commands.step_make_chart(settings)
context.stopMPcode()
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 ""
+local function step_cells_three(spec)
+ count = count + 1
+ local step = steps[count]
+ step.cell_ali = spec
+end
+
+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_cell(top)
- steps[#steps+1] = {
- cell_top = top or "",
- cell_bot = "",
- text_top = "",
- text_mid = "",
- text_bot = "",
- }
+local function step_cell(spec)
+ count = count + 1
+ steps[count].cell_top = spec
end
-function commands.step_text(top)
- if #steps > 0 then
- steps[#steps].text_top = top 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_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_textset(spec)
+ if count > 0 then
+ count = count + 1
+ local step = steps[count]
+ step.text_top = spec
+ step.text_mid = spec
+ step.text_bot = spec
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",
+ 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_textset",
+ arguments = step_spec,
+ actions = step_textset,
+}
+
+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,
+}