summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/node-typ.lua
blob: 2d84e07a3fc25c1a87c3f739c6c512d7df398659 (plain)
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
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 setfield        = nuts.setfield
local setlink         = nuts.setlink
local setchar         = nuts.setchar

local getfield        = nuts.getfield
local getfont         = nuts.getfont

local hpack_node_list = nuts.hpack
local vpack_node_list = nuts.vpack
local full_hpack_list = nuts.fullhpack
local copy_node       = nuts.copy

local nodepool        = nuts.pool
local new_glyph       = nodepool.glyph
local new_glue        = nodepool.glue

local utfvalues       = utf.values

local currentfont     = font.current
local currentattr     = node.current_attr
local fontparameters  = fonts.hashes.parameters

local function tonodes(str,fontid,spacing,templateglyph) -- quick and dirty
    local head, prev = nil, nil
--     local attrid = nil
    if not fontid then
        if templateglyph then
            fontid = getfont(templateglyph)
--             attrid = getfield(templateglyph,"attr")
        else
            fontid = currentfont()
--             attrid = currentattr()
        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
-- setfield(next,"attr",attrid)
            head = next
        else
-- setfield(next,"attr",attrid)
            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 implemtation 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

-- node.write(nodes.typesetters.tohpack("Hello World!"))
-- node.write(nodes.typesetters.tohbox ("Hello World!"))
-- node.write(nodes.typesetters.tohpack("Hello World!",1,100*1024*10))
-- node.write(nodes.typesetters.tohbox ("Hello World!",1,100*1024*10))

string.tonodes = function(...) return tonode(tonodes(...)) end  -- quite convenient