1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
if not modules then modules = { } end modules ['node-typ'] = {
version = 1.001,
comment = "companion to node-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- code has been moved to blob-ini.lua
local typesetters = nodes.typesetters or { }
nodes.typesetters = typesetters
local nuts = nodes.nuts
local tonode = nuts.tonode
local tonut = nuts.tonut
local setlink = nuts.setlink
local setchar = nuts.setchar
local setattrlist = nuts.setattrlist
local getfont = nuts.getfont
local hpack_node_list = nuts.hpack
local vpack_node_list = nuts.vpack
local full_hpack_list = nuts.fullhpack
local nodepool = nuts.pool
local new_glyph = nodepool.glyph
local new_glue = nodepool.glue
local utfvalues = utf.values
local currentfont = font.current
local currentattributes = nodes.currentattributes
local fontparameters = fonts.hashes.parameters
-- when attrid == true then take from glyph or current else use the given value
-- todo: glyphscale etc
local function tonodes(str,fontid,spacing,templateglyph,attrid) -- quick and dirty
local head, prev = nil, nil
if not fontid then
fontid = templateglyph and getfont(templateglyph) or currentfont()
end
if attrid == true then
if templateglyph then
attrid = false -- we copy with the glyph
else
attrid = currentattributes()
end
end
local fp = fontparameters[fontid]
local s, p, m
if spacing then
s, p, m = spacing, 0, 0
else
s, p, m = fp.space, fp.space_stretch, fp.space_shrink
end
local spacedone = false
for c in utfvalues(str) do
local next
if c == 32 then
if not spacedone then
next = new_glue(s,p,m)
spacedone = true
end
elseif templateglyph then
next = copy_glyph(templateglyph)
setchar(next,c)
spacedone = false
else
next = new_glyph(fontid or 1,c)
spacedone = false
end
if not next then
-- nothing
elseif not head then
if attrid then
setattrlist(next,attrid)
end
head = next
else
if attrid then
setattrlist(next,attrid)
end
setlink(prev,next)
end
prev = next
end
return head
end
local function tohpack(str,fontid,spacing)
return hpack_node_list(tonodes(str,fontid,spacing),"exactly")
end
local function tohbox(str,fontid,spacing)
return full_hpack_list(tonodes(str,fontid,spacing),"exactly")
end
local function tovpack(str,fontid,spacing)
-- vpack is just a hack, and a proper implementation is on the agenda
-- as it needs more info etc than currently available
return vpack_node_list(tonodes(str,fontid,spacing))
end
local tovbox = tovpack -- for now no vpack filter
local tnuts = { }
nuts.typesetters = tnuts
tnuts.tonodes = tonodes
tnuts.tohpack = tohpack
tnuts.tohbox = tohbox
tnuts.tovpack = tovpack
tnuts.tovbox = tovbox
typesetters.tonodes = function(...) local h, b = tonodes(...) return tonode(h), b end
typesetters.tohpack = function(...) local h, b = tohpack(...) return tonode(h), b end
typesetters.tohbox = function(...) local h, b = tohbox (...) return tonode(h), b end
typesetters.tovpack = function(...) local h, b = tovpack(...) return tonode(h), b end
typesetters.tovbox = function(...) local h, b = tovbox (...) return tonode(h), b end
typesetters.hpack = typesetters.tohpack -- obsolete
typesetters.hbox = typesetters.tohbox -- obsolete
typesetters.vpack = typesetters.tovpack -- obsolete
-- context(nodes.typesetters.tohpack("Hello World!"))
-- context(nodes.typesetters.tohbox ("Hello World!"))
-- context(nodes.typesetters.tohpack("Hello World!",1,100*1024*10))
-- context(nodes.typesetters.tohbox ("Hello World!",1,100*1024*10))
string.tonodes = function(...) return tonode(tonodes(...)) end -- quite convenient
|