diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/scrp-cjk.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/scrp-cjk.lua | 237 |
1 files changed, 126 insertions, 111 deletions
diff --git a/Master/texmf-dist/tex/context/base/scrp-cjk.lua b/Master/texmf-dist/tex/context/base/scrp-cjk.lua index 997baaa962b..d817c28cf86 100644 --- a/Master/texmf-dist/tex/context/base/scrp-cjk.lua +++ b/Master/texmf-dist/tex/context/base/scrp-cjk.lua @@ -7,28 +7,28 @@ if not modules then modules = { } end modules ['scrp-cjk'] = { } local has_attribute = node.has_attribute -local make_glue_node = nodes.glue -local make_penalty_node = nodes.penalty local insert_node_after = node.insert_after local insert_node_before = node.insert_before local remove_node = nodes.remove -local glyph = node.id('glyph') -local glue = node.id('glue') -local penalty = node.id('penalty') +local nodepool = nodes.pool +local new_glue = nodepool.glue +local new_penalty = nodepool.penalty -local preproc = attributes.private('preproc') -local prestat = attributes.private('prestat') +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph -scripts.cjk = scripts.cjk or { } +local a_prestat = attributes.private('prestat') +local a_preproc = attributes.private('preproc') -local kind_to_number = scripts.kind_to_number -local number_to_kind = scripts.number_to_kind -local hash = scripts.hash -local cjk = scripts.cjk +local categorytonumber = scripts.categorytonumber +local numbertocategory = scripts.numbertocategory +local hash = scripts.hash +local numbertodataset = scripts.numbertodataset -local fontdata = fonts.identifiers -local quaddata = fonts.quads +local fonthashes = fonts.hashes +local fontdata = fonthashes.identifiers +local quaddata = fonthashes.quads -- raggedleft is controlled by leftskip and we might end up with a situation where -- the intercharacter spacing interferes with this; the solution is to patch the @@ -50,123 +50,135 @@ end -- at font definition time and/or just assume a correct font local function nobreak(head,current) - insert_node_before(head,current,make_penalty_node(10000)) + insert_node_before(head,current,new_penalty(10000)) end + local function stretch_break(head,current) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end + local function shrink_break(head,current) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end + local function nobreak_stretch(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end + local function korean_break(head,current) - insert_node_before(head,current,make_penalty_node(inter_char_hangul_penalty)) + insert_node_before(head,current,new_penalty(inter_char_hangul_penalty)) end local function nobreak_shrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end + local function nobreak_autoshrink(head,current) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end end local function nobreak_stretch_nobreak_shrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end + local function nobreak_stretch_nobreak_autoshrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end end local function nobreak_shrink_nobreak_stretch(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end + local function nobreak_autoshrink_nobreak_stretch(head,current) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end local function nobreak_shrink_break_stretch(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end + local function nobreak_autoshrink_break_stretch(head,current) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end local function nobreak_shrink_break_stretch_nobreak_shrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end + local function nobreak_autoshrink_break_stretch_nobreak_autoshrink(head,current) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end end + local function nobreak_autoshrink_break_stretch_nobreak_shrink(head,current) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end + local function nobreak_shrink_break_stretch_nobreak_autoshrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) if true then - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) end end local function nobreak_stretch_break_shrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end + local function nobreak_stretch_break_autoshrink(head,current) - insert_node_before(head,current,make_penalty_node(10000)) - insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0)) + insert_node_before(head,current,new_penalty(10000)) + insert_node_before(head,current,new_glue(0,inter_char_stretch,0)) if true then - insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink)) + insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink)) end end @@ -307,28 +319,22 @@ local injectors = { -- [previous] [current] }, } -local dataset = { - inter_char_stretch_factor = 0.50, -- of quad - inter_char_half_shrink_factor = 0.50, -- of quad - inter_char_hangul_penalty = 50, -} - local function process(head,first,last) if first ~= last then - local lastfont, previous, originals, last = nil, "start", nil, nil + local lastfont, previous, last = nil, "start", nil while true do local upcoming, id = first.next, first.id - if id == glyph then - local a = has_attribute(first,prestat) - local current = number_to_kind[a] + if id == glyph_code then + local a = has_attribute(first,a_prestat) + local current = numbertocategory[a] local action = injectors[previous] if action then action = action[current] if action then local font = first.font if font ~= lastfont then - lastfont, done = font, true - set_parameters(font,dataset) + lastfont = font + set_parameters(font,numbertodataset[has_attribute(first,a_preproc)]) end action(head,first) end @@ -338,9 +344,9 @@ local function process(head,first,last) local p, n = first.prev, upcoming if p and n then local pid, nid = p.id, n.id - if pid == glyph and nid == glyph then - local pa, na = has_attribute(p,prestat), has_attribute(n,prestat) - local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na] + if pid == glyph_code and nid == glyph_code then + local pa, na = has_attribute(p,a_prestat), has_attribute(n,a_prestat) + local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" or pcjk == "other" or ncjk == "other" @@ -359,7 +365,7 @@ local function process(head,first,last) previous = "start" end end - if upcoming == stop then + if upcoming == last then -- was stop break else first = upcoming @@ -368,9 +374,16 @@ local function process(head,first,last) end end -scripts.install { - name = "hangul", - process = process, +scripts.installmethod { + name = "hangul", + process = process, + datasets = { + default = { + inter_char_stretch_factor = 0.50, -- of quad + inter_char_half_shrink_factor = 0.50, -- of quad + inter_char_hangul_penalty = 50, + }, + }, } -- hanzi (chinese) @@ -510,28 +523,22 @@ local injectors = { -- [previous] [current] }, } -local dataset = { - inter_char_stretch_factor = 0.50, -- of quad - inter_char_half_shrink_factor = 0.50, -- of quad - inter_char_hangul_penalty = 50, -} - local function process(head,first,last) if first ~= last then - local lastfont, previous, originals, last = nil, "start", nil, nil + local lastfont, previous, last = nil, "start", nil while true do local upcoming, id = first.next, first.id - if id == glyph then - local a = has_attribute(first,prestat) - local current = number_to_kind[a] + if id == glyph_code then + local a = has_attribute(first,a_prestat) + local current = numbertocategory[a] local action = injectors[previous] if action then action = action[current] if action then local font = first.font if font ~= lastfont then - lastfont, done = font, true - set_parameters(font,dataset) + lastfont = font + set_parameters(font,numbertodataset[has_attribute(first,a_preproc)]) end action(head,first) end @@ -541,13 +548,14 @@ local function process(head,first,last) local p, n = first.prev, upcoming if p and n then local pid, nid = p.id, n.id - if pid == glyph and nid == glyph then - local pa, na = has_attribute(p,prestat), has_attribute(n,prestat) - local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na] + if pid == glyph_code and nid == glyph_code then + local pa, na = has_attribute(p,a_prestat), has_attribute(n,a_prestat) + local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" or pcjk == "other" or ncjk == "other" - or pcjk == "jamo_final" or ncjk == "jamo_initial" then + -- or pcjk == "jamo_final" or ncjk == "jamo_initial" then + or pcjk == "jamo_final" or ncjk == "jamo_initial" or pcjk == "half_width_close" or ncjk == "half_width_open" then previous = "start" else -- if head ~= first then remove_node(head,first,true) @@ -562,7 +570,7 @@ local function process(head,first,last) previous = "start" end end - if upcoming == stop then + if upcoming == last then -- was stop break else first = upcoming @@ -571,7 +579,14 @@ local function process(head,first,last) end end -scripts.install { - name = "hanzi", - process = process, +scripts.installmethod { + name = "hanzi", + process = process, + datasets = { + default = { + inter_char_stretch_factor = 0.50, -- of quad + inter_char_half_shrink_factor = 0.50, -- of quad + inter_char_hangul_penalty = 50, + }, + }, } |