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
|
if not modules then modules = { } end modules ['supp-box'] = {
version = 1.001,
comment = "companion to supp-box.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- this is preliminary code
local report_hyphenation = logs.reporter("languages","hyphenation")
local nodecodes = nodes.nodecodes
local disc_code = nodecodes.disc
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local glue_code = nodecodes.glue
local glyph_code = nodecodes.glyph
local new_penalty = nodes.pool.penalty
local free_node = node.free
local copynodelist = node.copy_list
local copynode = node.copy
local texbox = tex.box
local function hyphenatedlist(list)
while list do
local id, next, prev = list.id, list.next, list.prev
if id == disc_code then
local hyphen = list.pre
if hyphen then
local penalty = new_penalty(-500)
hyphen.next, penalty.prev = penalty, hyphen
prev.next, next.prev = hyphen, penalty
penalty.next, hyphen.prev = next, prev
list.pre = nil
free_node(list)
end
elseif id == vlist_code or id == hlist_code then
hyphenatedlist(list.list)
end
list = next
end
end
commands.hyphenatedlist = hyphenatedlist
function commands.showhyphenatedinlist(list)
report_hyphenation("show: %s",nodes.listtoutf(list))
end
local function checkedlist(list)
if type(list) == "number" then
return texbox[list].list
else
return list
end
end
local function applytochars(list,what,nested)
local doaction = context[what or "ruledhbox"]
local noaction = context
local current = checkedlist(list)
while current do
local id = current.id
if nested and (id == hlist_code or id == vlist_code) then
context.hbox()
context.bgroup()
applytochars(current.list,what,nested)
context.egroup()
elseif id ~= glyph_code then
noaction(copynode(current))
else
doaction(copynode(current))
end
current = current.next
end
end
local function applytowords(list,what,nested)
local doaction = context[what or "ruledhbox"]
local noaction = context
local current = checkedlist(list)
local start
while current do
local id = current.id
if id == glue_code then
if start then
doaction(copynodelist(start,current))
start = nil
end
noaction(copynode(current))
elseif nested and (id == hlist_code or id == vlist_code) then
context.hbox()
context.bgroup()
applytowords(current.list,what,nested)
context.egroup()
elseif not start then
start = current
end
current = current.next
end
if start then
doaction(copynodelist(start))
end
end
commands.applytochars = applytochars
commands.applytowords = applytowords
|