X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-pretreat.lua;h=695749ddf6d03f4058678d49d3ec4069440b968c;hb=b0e23554957e57c3bbafa1ac664319e4f4af249b;hp=fa0573c93c23a0f151ccc7f934c3d63d362ffe65;hpb=3bf83dda88318aa0dbd05c198bb267ee1c6eca98;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-pretreat.lua b/src/ltj-pretreat.lua index fa0573c..695749d 100644 --- a/src/ltj-pretreat.lua +++ b/src/ltj-pretreat.lua @@ -1,5 +1,5 @@ -- --- luatexja/ltj-pretreat.lua +-- ltj-pretreat.lua -- luatexja.load_module('base'); local ltjb = luatexja.base @@ -43,10 +43,9 @@ local attr_icflag = luatexbase.attributes['ltj@icflag'] local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct local ltjs_orig_char_table = ltjs.orig_char_table local ltjf_replace_altfont = ltjf.replace_altfont -local ltjf_font_extra_info = ltjf.font_extra_info -local attr_orig_char = luatexbase.attributes['ltj@origchar'] local STCK = luatexja.userid_table.STCK local DIR = luatexja.userid_table.DIR +local JA_AL_BDD = luatexja.userid_table.JA_AL_BDD local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG local dir_tate = luatexja.dir_table.dir_tate @@ -87,6 +86,9 @@ do { __index = function() return node_next end, }) + local id_boundary = node.id('boundary') + local node_new, insert_before = node.direct.new, node.direct.insert_before + local setsubtype = node.direct.setsubtype or function(n,l) setfield(n,'subtype',l) end local function suppress_hyphenate_ja (h) start_time_measure('ltj_hyphenate') head = to_direct(h) @@ -99,13 +101,26 @@ do do local p = head while p do - local pid = getid(p) + local pid, prev_chartype = getid(p), 0 + -- prev_chartype: 0: not char 1: ALchar 2: JAchar while pid==id_glyph do local pc = getchar(p) - if (has_attr(p, attr_icflag) or 0)<=0 and is_ucs_in_japanese_char(p, pc) then - setfont(p, ltjf_replace_altfont(has_attr(p, attr_curjfnt) or getfont(p), pc)) + if has_attr(p, attr_icflag, 0) and is_ucs_in_japanese_char(p, pc) then + if prev_chartype==1 then + local b = node_new(id_whatsit,sid_user); + setfield(b, 'type', 100); setfield(b, 'user_id', JA_AL_BDD); + insert_before(head, p, b) + end + local pf = has_attr(p, attr_curjfnt) + pf = (pf and pf>0 and pf) or getfont(p) + setfont(p, ltjf_replace_altfont(pf, pc)) setlang(p, lang_ja) - ltjs_orig_char_table[p] = pc + ltjs_orig_char_table[p], prev_chartype = pc, 2 + elseif prev_chartype==2 then + local b = node_new(id_whatsit,sid_user); + setfield(b, 'type', 100); setfield(b, 'user_id', JA_AL_BDD); + insert_before(head, p, b); prev_chartype = 1 + else prev_chartype = 1 end p = node_next(p); pid = getid(p) end @@ -130,8 +145,12 @@ local ltjf_font_metric_table = ltjf.font_metric_table local font_getfont = font.getfont local function set_box_stack_level(head, mode) local box_set, cl = 0, tex.currentgrouplevel + 1 - for _,p in pairs(wt) do - if mode and getfield(p, 'value')==cl then box_set = 1 end; node_free(p) + if mode then + for _,p in pairs(wt) do + if getfield(p, 'value')==cl then box_set = 1 end; node_free(p) + end + else + for _,p in pairs(wt) do node_free(p) end end ltjs_report_stack_level(tex_getcount('ltj@@stack') + box_set) for _,p in pairs(wtd) do @@ -139,14 +158,13 @@ local function set_box_stack_level(head, mode) end if ltjs.list_dir == dir_tate then for p in node.direct.traverse_id(id_glyph,to_direct(head)) do - if (has_attr(p, attr_icflag) or 0)<=0 and getlang(p)==lang_ja then - local pc = ltjs_orig_char_table[p] - local nf = ltjf_replace_altfont( has_attr(p, attr_curtfnt) or getfont(p) , pc) + if has_attr(p, attr_icflag, 0) and getlang(p)==lang_ja then + local nf = ltjf_replace_altfont( has_attr(p, attr_curtfnt) or getfont(p) , ltjs_orig_char_table[p]) setfont(p, nf) if ltjf_font_metric_table[nf].vert_activated then local pc = getchar(p) - pc = (ltjf_font_extra_info[nf] and ltjf_font_extra_info[nf][pc] and ltjf_font_extra_info[nf][pc].vform) - if pc and font_getfont(nf).characters[pc] then setchar(p, pc) end + pc = ltjf_font_metric_table[nf].vform[pc] + if pc then setchar(p, pc) end end end end