diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/m-nodechart.mkvi')
-rw-r--r-- | Master/texmf-dist/tex/context/base/m-nodechart.mkvi | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/m-nodechart.mkvi b/Master/texmf-dist/tex/context/base/m-nodechart.mkvi new file mode 100644 index 00000000000..359d598ce62 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/m-nodechart.mkvi @@ -0,0 +1,257 @@ +\usemodule[chart] + +\startluacode + +local format = string.format +local points = number.nopts +local ptfactor = number.dimenfactors.pt + +local nodecodes = nodes.nodecodes +local kerncodes = nodes.kerncodes +local penaltycodes = nodes.penaltycodes +local gluecodes = nodes.gluecodes +local whatsitcodes = nodes.whatsitcodes + +local formatters = { } + +function formatters.glyph(n,comment) + -- subtype font char lang left right uchyph components xoffset yoffset width height depth + return format("\\doFLOWglyphnode{%s}{%s}{%s}{%s}{U+%05X}",comment,n.subtype,n.font,n.char,n.char) +end + +function formatters.disc(n,comment) + -- pre post replace + return format("\\doFLOWdiscnode{%s}{%s}",comment,n.subtype) +end + +function formatters.kern(n,comment) + -- subtype kern + -- return format("\\doFLOWkernnode{%s}{%s}{%s}",comment,kerncodes[n.subtype],points(n.kern)) + return format("\\doFLOWkernnode{%s}{%s}{%.4f}",comment,kerncodes[n.subtype],n.kern*ptfactor) +end + +function formatters.penalty(n,comment) + -- subtype penalty + return format("\\doFLOWpenaltynode{%s}{%s}{%s}",comment,"penalty",n.penalty) +end + +function formatters.glue(n,comment) + -- subtype width leader spec (stretch shrink ... + local s = n.spec + -- return format("\\doFLOWgluenode{%s}{%s}{%s}{%s}{%s}",comment,gluecodes[n.subtype],points(s.width),points(s.stretch),points(s.shrink)) + return format("\\doFLOWgluenode{%s}{%s}{%.4f}{%.4f}{%.4f}",comment,gluecodes[n.subtype],s.width*ptfactor,s.stretch*ptfactor,s.shrink*ptfactor) +end + +function formatters.whatsit(n,comment) + -- subtype width leader spec (stretch shrink ... + local subtype = n.subtype + local whatsit = whatsitcodes[subtype] + if whatsit == "dir" or whatsit == "localpar" then + return format("\\doFLOWdirnode{%s}{%s}{%s}",comment,whatsit,n.dir) + else + return nodecodes[n.id] + end +end + +local shapes = { -- I will make a dedicated set of shapes for this. + glyph = "procedure", + disc = "procedure", + kern = "action", + penalty = "action", + glue = "action", +} + +local function flow_nodes_to_chart(head,comment,x,y,how) + local current = head + while current do + local nodecode = nodecodes[current.id] + local formatter = formatters[nodecode] + local shape = shapes[nodecode] + y = y + 1 + local next = current.next + commands.flow_start_cell { shape = { framecolor = "nodechart:" .. nodecode } } + commands.flow_set_name(tostring(current)) + commands.flow_set_location(x,y) + if shape then + commands.flow_set_shape(shape) + end + if formatter then + commands.flow_set_text("node",formatter(current,comment)) + else + commands.flow_set_text("node",nodecode) + end + if next then + commands.flow_set_connection("bt","",tostring(next)) + end + if nodecode == "glyph" then + local components = current.components + if components then + commands.flow_set_connection("rl","",tostring(components)) + commands.flow_stop_cell() + n = flow_nodes_to_chart(components,"component",x+2,y-1) + else + commands.flow_stop_cell() + end + elseif nodecode == "disc" then + local pre = current.pre + local pos = current.post + local rep = current.replace + if pre and not rep and not rep then + if pre then + commands.flow_set_connection("rl","",tostring(pre)) + end + commands.flow_stop_cell() + if pre then + n = flow_nodes_to_chart(pre,"prebreak",x+1,y-1) + end + else + if pre then + commands.flow_set_connection("+rl","",tostring(pre)) + end + if rep then + commands.flow_set_connection("rl","",tostring(rep)) + end + if pos then + commands.flow_set_connection("-rl","",tostring(pos)) + end + commands.flow_stop_cell() + if pre then + n = flow_nodes_to_chart(pre,"prebreak",x+1,y-2) + end + if rep then + n = flow_nodes_to_chart(rep,"replacement",x+1,y-1) + end + if pos then + n = flow_nodes_to_chart(pos,"postbreak",x+1,y) + end + end + elseif nodecode == "hlist" then + local list = current.list + if list then + commands.flow_set_connection("rl","",tostring(list)) + commands.flow_stop_cell() + n = flow_nodes_to_chart(list,"list",x+2,y-1) + else + commands.flow_stop_cell() + end + else + commands.flow_stop_cell() + end + current = next + end + return n +end + +function commands.flow_nodes_to_chart(name,head,max) + commands.flow_start_chart(name) + flow_nodes_to_chart(head,"",1,0) + commands.flow_stop_chart() +end + +\stopluacode + +\unprotect + +\def\enspaceminus{\hskip.5em minus .25em\relax} + +\starttexdefinition unexpanded doFLOWglyphnode #comment #subtype #font #char #unicode + \dontleavehmode\hbox{\bf\setstrut\strut \doifsomething{#comment}{#comment\enspaceminus:\enspaceminus}glyph #subtype} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut font\enspaceminus#font:\enspace#unicode:\enspaceminus\setfontofid{#font}\char#char} +\stoptexdefinition + +\starttexdefinition unexpanded doFLOWdiscnode #comment #subtype + \dontleavehmode\hbox{\bf\setstrut\strut disc} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut} +\stoptexdefinition + +\starttexdefinition unexpanded doFLOWkernnode #comment #subtype #kern + \dontleavehmode\hbox{\bf\setstrut\strut#subtype} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut#kern} +\stoptexdefinition + +\starttexdefinition unexpanded doFLOWpenaltynode #comment #subtype #penalty + \dontleavehmode\hbox{\bf\setstrut\strut#subtype} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut#penalty} +\stoptexdefinition + +\starttexdefinition unexpanded doFLOWgluenode #comment #subtype #width #shrink #stretch + \dontleavehmode\hbox{\bf\setstrut\strut#subtype} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut#width\enspaceminus-\enspaceminus#shrink\enspaceminus+\enspaceminus#stretch} +\stoptexdefinition + +\starttexdefinition unexpanded doFLOWdirnode #comment #subtype #direction + \dontleavehmode\hbox{\bf\setstrut\strut#subtype} + \vss + \dontleavehmode\hbox{\tx\setstrut\strut#direction} +\stoptexdefinition + +\defineframed + [flowcell:node] + [flowcell:base] + [\c!top=\vss, + \c!bottom=\vss, + \c!align=\v!middle, + \c!foregroundstyle=\tt] + +% this is a temporary interface ... we will have instances and optional settings + +\unexpanded\def\boxtoFLOWchart#name#max#box% + {\ctxcommand{flow_nodes_to_chart("#name",tex.box[\number#box].list,\number#max)}} + +\unexpanded\def\nextboxtoFLOWchart#name#max% + {\dowithnextbox{\boxtoFLOWchart{#name}{#max}\nextbox}} + +\unexpanded\def\hboxtoFLOWchart#name#max% + {\nextboxtoFLOWchart{#name}{#max}\hbox} + +\unexpanded\def\vboxtoFLOWchart#name#max% + {\nextboxtoFLOWchart{#name}{#max}\vbox} + +\protect + +\continueifinputfile{m-nodechart.mkvi} + +\definecolor[nodechart:glyph][darkred] + +\setupbodyfont[dejavu,10pt] + +\starttext + +\startTEXpage[offset=10pt] + + \hboxtoFLOWchart{dummy}{3}{an affil\discretionary{-}{-}{!}iation} + + \FLOWchart[dummy][width=14em,height=3em,dx=1em,dy=.75em,hcompact=yes] + +\stopTEXpage + +\startTEXpage[offset=10pt] + + \hboxtoFLOWchart{dummy}{3}{an affiliation} + + \FLOWchart[dummy][width=14em,height=3em,dx=.5em,dy=.75em,hcompact=yes] + +\stopTEXpage + +\startTEXpage[offset=10pt] + + \hboxtoFLOWchart{dummy}{3}{\nl effe fijn fietsen} + + \FLOWchart[dummy][width=14em,height=3em,dx=.5em,dy=.75em,hcompact=yes] + +\stopTEXpage + +\startTEXpage[offset=10pt] + + \hboxtoFLOWchart{dummy}{3}{\righttoleft t\kern 1pt est} + + \FLOWchart[dummy][width=14em,height=3em,dx=.5em,dy=.75em,hcompact=yes] + +\stopTEXpage + +\stoptext |