diff options
Diffstat (limited to 'macros/luatex/generic/cstypo/cstypo.lua')
-rw-r--r-- | macros/luatex/generic/cstypo/cstypo.lua | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/macros/luatex/generic/cstypo/cstypo.lua b/macros/luatex/generic/cstypo/cstypo.lua new file mode 100644 index 0000000000..4ad6f651fb --- /dev/null +++ b/macros/luatex/generic/cstypo/cstypo.lua @@ -0,0 +1,176 @@ +--[[-- +(c) 2016 Václav Haisman + +This program can be redistributed and/or modified under the terms of the MIT +license. See LICENSE file. +--]]-- + +local GLYPH = node.id("glyph") +--print('GLYPH value: ', GLYPH) + +local GLUE = node.id("glue") +--print('GLUE value: ', GLUE) + +local CZECH_ID = cstypo_czech_language_id +--print('CZECH_ID value: ', CZECH_ID) + +local function prevent_single_letter (head) + while head do + -- glyph + if (head.id == GLYPH + -- and in Czech or unspecified (???) + and (head.lang == nil + or head.lang == CZECH_ID)) then + -- only if we are at one letter word + if unicode.utf8.match(unicode.utf8.char(head.char), "[zZsSuUkKoOvViI]") then + -- and left of it is either a space + if ((head.prev.id == GLUE + -- or one of '{[(' + or (head.prev.id == GLYPH + and unicode.utf8.match(unicode.utf8.char(head.prev.char), + "[%[%]()%{%}]"))) + -- and right of the one letter word is also a space + and head.next.id == GLUE) then + -- then avoid line break between the single letter word and the + -- word following it + local p = node.new("penalty") + p.penalty = 10000 + node.insert_after(head, head, p) + --print('inserting penalty at ', head) + end + end + end + head = head.next + end + return true +end + +function cstypo_single_letter_enable () + print('cstypo: Enabling single letter hook.') + luatexbase.add_to_callback("pre_linebreak_filter", prevent_single_letter, + "cstyposingleletter") +end + +function cstypo_single_letter_disable () + print('cstypo: Disabling single letter hook.') + luatexbase.remove_from_callback("pre_linebreak_filter", "cstyposingleletter") +end + + +local function prevent_a_letter (head) + while head do + -- glyph + if (head.id == GLYPH + -- and in Czech or unspecified (???) + and (head.lang == nil + or head.lang == CZECH_ID)) then + -- only if we are at one letter word + if unicode.utf8.match(unicode.utf8.char(head.char), "[aA]") then + -- and previous is space + if ((head.prev.id == GLUE + -- or previous is one of '{[(' + or (head.prev.id == GLYPH + and unicode.utf8.match(unicode.utf8.char(head.prev.char), + "[%[%]()%{%}]"))) + -- and right of the one letter word is also a space + and head.next.id == GLUE) then + -- then avoid line break between the single letter word and the + -- word following it + local p = node.new("penalty") + p.penalty = 10000 + node.insert_after(head, head, p) + end + end + end + head = head.next + end + return true +end + +function cstypo_a_letter_enable () + print('cstypo: Enabling \'a\' letter hook.') + luatexbase.add_to_callback("pre_linebreak_filter", prevent_a_letter, + "cstypoaletter") +end + +function cstypo_a_letter_disable () + print('cstypo: Disabling \'a\' letter hook.') + luatexbase.remove_from_callback("pre_linebreak_filter", "cstypoaletter") +end + + +local function prevent_percents (head) + while head do + -- glyph + if (head.id == GLYPH + -- and in Czech or unspecified (???) + and (head.lang == nil + or head.lang == CZECH_ID)) then + -- only if we are at percentage sign + if unicode.utf8.match(unicode.utf8.char(head.char), "[%%‰°℃℉]") then + -- and left of it is a space + if (head.prev.id == GLUE + -- and left of the space is a digit. + and head.prev.prev.id == GLYPH + and unicode.utf8.match(unicode.utf8.char(head.prev.prev.char), + "[0-9]")) then + local p = node.new("penalty") + p.penalty = 10000 + node.insert_after(head.prev.prev, head.prev.prev, p) + end + end + end + head = head.next + end + return true +end + +function cstypo_percents_enable() + print('cstypo: Enabling percents hook.') + luatexbase.add_to_callback("pre_linebreak_filter", prevent_percents, + "cstypopercents") +end + +function cstypo_percents_disable() + print('cstypo: Disabling percents hook.') + luatexbase.remove_from_callback("pre_linebreak_filter", "cstypopercents") +end + + +local function prevent_paragraph (head) + while head do + -- glyph + if (head.id == GLYPH + -- and in Czech or unspecified (???) + and (head.lang == nil + or head.lang == CZECH_ID)) then + -- only if we are at paragraph symbol + if unicode.utf8.match(unicode.utf8.char(head.char), "[§]") then + -- and right of it is a space + if (head.next.id == GLUE + and (head.next.next.id == GLYPH + and unicode.utf8.match(unicode.utf8.char(head.next.next.char), + "[0-9]"))) then + -- then avoid line break between the paragraph and the number + -- following it + local p = node.new("penalty") + p.penalty = 10000 + node.insert_after(head, head, p) + end + end + end + head = head.next + end + return true +end + +function cstypo_paragraph_enable() + print('cstypo: Enabling paragraph hook.') + luatexbase.add_to_callback("pre_linebreak_filter", prevent_paragraph, + "cstypoparagraph") +end + +function cstypo_paragraph_disable() + print('cstypo: Disabling paragraph hook.') + luatexbase.remove_from_callback("pre_linebreak_filter", "cstypoparagraph") +end |