lpdf-nod.lua /size: 3469 b    last modification: 2020-07-01 14:35
1if not modules then modules = { } end modules ['lpdf-nod'] = {
2    version   = 1.001,
3    comment   = "companion to lpdf-ini.mkiv",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files"
7}
8
9local nodecodes             = nodes.nodecodes
10local whatsitcodes          = nodes.whatsitcodes
11
12local nodeinjections        = backends.nodeinjections
13
14local nuts                  = nodes.nuts
15
16local setfield              = nuts.setfield
17local setdata               = nuts.setdata
18
19local copy_node             = nuts.copy
20local new_node              = nuts.new
21
22local nodepool              = nuts.pool
23local register              = nodepool.register
24
25local whatsit_code          = nodecodes.whatsit
26
27local savewhatsit_code      = whatsitcodes.save
28local restorewhatsit_code   = whatsitcodes.restore
29local setmatrixwhatsit_code = whatsitcodes.setmatrix
30local literalwhatsit_code   = whatsitcodes.literal
31
32local literalvalues         = nodes.literalvalues
33local originliteral_code    = literalvalues.origin
34local pageliteral_code      = literalvalues.page
35local directliteral_code    = literalvalues.direct
36local rawliteral_code       = literalvalues.raw
37
38local tomatrix              = drivers.helpers.tomatrix
39
40local originliteralnode     = register(new_node(whatsit_code, literalwhatsit_code))  setfield(originliteralnode,"mode",originliteral_code)
41local pageliteralnode       = register(new_node(whatsit_code, literalwhatsit_code))  setfield(pageliteralnode,  "mode",pageliteral_code)
42local directliteralnode     = register(new_node(whatsit_code, literalwhatsit_code))  setfield(directliteralnode,"mode",directliteral_code)
43local rawliteralnode        = register(new_node(whatsit_code, literalwhatsit_code))  setfield(rawliteralnode,   "mode",rawliteral_code)
44
45function nodepool.originliteral(str) local t = copy_node(originliteralnode) setdata(t,str) return t end
46function nodepool.pageliteral  (str) local t = copy_node(pageliteralnode  ) setdata(t,str) return t end
47function nodepool.directliteral(str) local t = copy_node(directliteralnode) setdata(t,str) return t end
48function nodepool.rawliteral   (str) local t = copy_node(rawliteralnode   ) setdata(t,str) return t end
49
50local literals = {
51    [originliteral_code] = originliteralnode, [literalvalues[originliteral_code]] = originliteralnode,
52    [pageliteral_code]   = pageliteralnode,   [literalvalues[pageliteral_code]]   = pageliteralnode,
53    [directliteral_code] = directliteralnode, [literalvalues[directliteral_code]] = directliteralnode,
54    [rawliteral_code]    = rawliteralnode,    [literalvalues[rawliteral_code]]    = rawliteralnode,
55}
56
57function nodepool.literal(mode,str)
58    if str then
59        local t = copy_node(literals[mode] or pageliteralnode)
60        setdata(t,str)
61        return t
62    else
63        local t = copy_node(pageliteralnode)
64        setdata(t,mode)
65        return t
66    end
67end
68
69local savenode      = register(new_node(whatsit_code, savewhatsit_code))
70local restorenode   = register(new_node(whatsit_code, restorewhatsit_code))
71local setmatrixnode = register(new_node(whatsit_code, setmatrixwhatsit_code))
72
73function nodepool.save()
74    return copy_node(savenode)
75end
76
77function nodepool.restore()
78    return copy_node(restorenode)
79end
80
81function nodepool.setmatrix(rx,sx,sy,ry,tx,ty)
82    local t = copy_node(setmatrixnode)
83    setdata(t,tomatrix(rx,sx,sy,ry,tx,ty))
84    return t
85end
86