You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.7 KiB
89 lines
2.7 KiB
require('polyglossia') -- just in case...
|
|
|
|
local add_to_callback = luatexbase.add_to_callback
|
|
local remove_from_callback = luatexbase.remove_from_callback
|
|
local priority_in_callback = luatexbase.priority_in_callback
|
|
|
|
local next, type = next, type
|
|
|
|
local nodes, fonts, node = nodes, fonts, node
|
|
|
|
local nodecodes = nodes.nodecodes --- <= preloaded node.types()
|
|
|
|
local insert_node_before = node.insert_before
|
|
local insert_node_after = node.insert_after
|
|
local remove_node = nodes.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 = nodecodes.math
|
|
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 2013
|
|
local glyph_code = nodecodes.glyph
|
|
local penalty_code = nodecodes.penalty
|
|
local kern_code = nodecodes.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
|
|
-- warning: this is a feature of luatex > 0.76
|
|
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()
|
|
if not priority_in_callback (callback_name, "polyglossia-tibt.process") then
|
|
add_to_callback(callback_name, process, "polyglossia-tibt.process", 1)
|
|
end
|
|
end
|
|
|
|
local function desactivate()
|
|
if priority_in_callback (callback_name, "polyglossia-tibt.process") then
|
|
remove_from_callback(callback_name, "polyglossia-tibt.process")
|
|
end
|
|
end
|
|
|
|
polyglossia.activate_tibt_eol = activate
|
|
polyglossia.desactivate_tibt_eol = desactivate
|
|
|