summaryrefslogtreecommitdiff
path: root/tex/context/base/m-nodechart.mkvi
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2012-11-05 20:00:32 +0200
committerMarius <mariausol@gmail.com>2012-11-05 20:00:32 +0200
commit4a0adb91322b32b5cc86405ddf2b29b2876c144e (patch)
tree39279644270ad252eeb5867a3af817f5749da9a3 /tex/context/base/m-nodechart.mkvi
parent5e471aeaf55b23ad2c794745ae8719cb3ae75d9b (diff)
downloadcontext-4a0adb91322b32b5cc86405ddf2b29b2876c144e.tar.gz
beta 2012.11.05 17:38
Diffstat (limited to 'tex/context/base/m-nodechart.mkvi')
-rw-r--r--tex/context/base/m-nodechart.mkvi257
1 files changed, 257 insertions, 0 deletions
diff --git a/tex/context/base/m-nodechart.mkvi b/tex/context/base/m-nodechart.mkvi
new file mode 100644
index 000000000..359d598ce
--- /dev/null
+++ b/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