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
|
--
-- polyglossia-tibt.lua
-- part of polyglossia v2.2 -- 2024/07/15
--
require('polyglossia') -- just in case...
local add_to_callback = luatexbase.add_to_callback
local remove_from_callback = luatexbase.remove_from_callback
local declare_callback_rule = luatexbase.declare_callback_rule
local priority_in_callback = luatexbase.priority_in_callback
local next, type = next, type
local node = node
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
local remove_node = node.remove
local copy_node = node.copy
local has_attribute = node.has_attribute
local end_of_math = node.end_of_math
if not end_of_math then -- luatex < .76
local traverse_nodes = node.traverse_id
local math_code = node.id('math_char')
local end_of_math = function (n)
for n in traverse_nodes(math_code, n.next) do
return n
end
end
end
-- node types as of April 2024
local glyph_code = node.id('glyph')
local penalty_code = node.id('penalty')
local kern_code = node.id('kern')
-- we make a new node, so that we can copy it later on
local penalty_node = node.new(penalty_code)
penalty_node.penalty = 50 -- corresponds to the penalty LaTeX sets at explicit hyphens
local function get_penalty_node()
return copy_node(penalty_node)
end
local xpgtibtattr = luatexbase.attributes['xpg@tibteol']
local tsheg = unicode.utf8.byte('་')
-- from typo-spa.lua
local function process(head)
local start = head
-- head is always begin of par (whatsit), so we have at least two prev nodes
-- penalty followed by glue
while start do
local id = start.id
if id == glyph_code then
local attr = has_attribute(start, xpgtibtattr)
if attr and attr > 0 then
if start.char == tsheg then
if start.next then
insert_node_after(head,start,get_penalty_node())
end
end
end
elseif id == math_code then
start = end_of_math(start) -- weird, can return nil .. no math end?
end
if start then
start = start.next
end
end
return head
end
local callback_name = "pre_linebreak_filter"
local function activate()
add_to_callback(callback_name, process, "polyglossia-tibt.process")
declare_callback_rule(callback_name,
"polyglossia-tibt.process", "before", "luaotfload.node_processor")
end
local function desactivate()
remove_from_callback(callback_name, "polyglossia-tibt.process")
end
polyglossia.activate_tibt_eol = activate
polyglossia.desactivate_tibt_eol = desactivate
|