lpdf-nod.lua /size: 4054 b    last modification: 2023-12-21 09:44
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
31local lateliteralwhatsit_code = whatsitcodes.lateliteral
32
33local literalvalues         = nodes.literalvalues
34local originliteral_code    = literalvalues.origin
35local pageliteral_code      = literalvalues.page
36local directliteral_code    = literalvalues.direct
37local rawliteral_code       = literalvalues.raw
38
39local tomatrix              = drivers.helpers.tomatrix
40
41local originliteralnode     = register(new_node(whatsit_code, literalwhatsit_code))  setfield(originliteralnode,"mode",originliteral_code)
42local pageliteralnode       = register(new_node(whatsit_code, literalwhatsit_code))  setfield(pageliteralnode,  "mode",pageliteral_code)
43local directliteralnode     = register(new_node(whatsit_code, literalwhatsit_code))  setfield(directliteralnode,"mode",directliteral_code)
44local rawliteralnode        = register(new_node(whatsit_code, literalwhatsit_code))  setfield(rawliteralnode,   "mode",rawliteral_code)
45
46function nodepool.originliteral(str) local t = copy_node(originliteralnode) setdata(t,str) return t end
47function nodepool.pageliteral  (str) local t = copy_node(pageliteralnode  ) setdata(t,str) return t end
48function nodepool.directliteral(str) local t = copy_node(directliteralnode) setdata(t,str) return t end
49function nodepool.rawliteral   (str) local t = copy_node(rawliteralnode   ) setdata(t,str) return t end
50
51local literals = {
52    [originliteral_code] = originliteralnode, [literalvalues[originliteral_code]] = originliteralnode,
53    [pageliteral_code]   = pageliteralnode,   [literalvalues[pageliteral_code]]   = pageliteralnode,
54    [directliteral_code] = directliteralnode, [literalvalues[directliteral_code]] = directliteralnode,
55    [rawliteral_code]    = rawliteralnode,    [literalvalues[rawliteral_code]]    = rawliteralnode,
56}
57
58function nodepool.literal(mode,str)
59    if str then
60        local t = copy_node(literals[mode] or pageliteralnode)
61        setdata(t,str)
62        return t
63    else
64        local t = copy_node(pageliteralnode)
65        setdata(t,mode)
66        return t
67    end
68end
69
70-- We only define this for testing as we don't need it:
71
72if lateliteralwhatsit_code then
73
74    local lateliteralnode = register(new_node(whatsit_code, lateliteralwhatsit_code))
75
76    function nodepool.lateliteral(mode,str)
77        local t = copy_node(lateliteralnode)
78        if str then
79            setfield(t,"mode",literals[mode] and mode or pageliteral_code)
80            setdata(t,str)
81        else
82            setfield(t,"mode",pageliteral_code)
83            setdata(t,mode)
84        end
85        return t
86    end
87
88end
89
90local savenode      = register(new_node(whatsit_code, savewhatsit_code))
91local restorenode   = register(new_node(whatsit_code, restorewhatsit_code))
92local setmatrixnode = register(new_node(whatsit_code, setmatrixwhatsit_code))
93
94function nodepool.save()
95    return copy_node(savenode)
96end
97
98function nodepool.restore()
99    return copy_node(restorenode)
100end
101
102function nodepool.setmatrix(rx,sx,sy,ry,tx,ty)
103    local t = copy_node(setmatrixnode)
104    setdata(t,tomatrix(rx,sx,sy,ry,tx,ty))
105    return t
106end
107