X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-jfont.lua;h=e18fece15bb4da1b00be78e038579539b80afd4a;hb=d177010c46e52e722b4752eded1ae4a6807953df;hp=3bd4322d284addf1c3c13cc5e38100497390804a;hpb=94187c262d30e2c509b87705824547a052ebbcad;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-jfont.lua b/src/ltj-jfont.lua index 3bd4322..e18fece 100644 --- a/src/ltj-jfont.lua +++ b/src/ltj-jfont.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.jfont', - date = '2017/08/09', + date = '2017/09/04', description = 'Loader for Japanese fonts', }) module('luatexja.jfont', package.seeall) @@ -365,11 +365,19 @@ do end do + local gmatch = string.gmatch -- extract jfm_file_name and jfm_var -- normalize position of 'jfm=' and 'jfmvar=' keys local function extract_metric(name) - local is_braced = name:match('^{(.*)}$') - name= is_braced or name + do + local nametemp + nametemp = name:match('^{(.*)}$') + if nametemp then name = nametemp + else + nametemp = name:match('^"(.*)"$') + name = nametemp or name + end + end jfm_file_name = ''; jfm_var = ''; jfm_ksp = true local tmp, index = name:sub(1, 5), 1 if tmp == 'file:' or tmp == 'name:' or tmp == 'psft:' then @@ -378,7 +386,7 @@ do local p = name:find(":", index); index = p and (p+1) or index while index do local l = name:len()+1 - local q = name:find(";", index+1) or l + local q = name:find(";", index) or l if name:sub(index, index+3)=='jfm=' and q>index+4 then jfm_file_name = name:sub(index+4, q-1) if l~=q then @@ -408,16 +416,17 @@ do name = name .. 'jfmvar=' .. jfm_var end end - for x in string.gmatch (name, "[:;]([+%%-]?)ltjks") do + for x in gmatch (name, "[:;]([+%%-]?)ltjks") do jfm_ksp = not (x=='-') end if jfm_dir == 'tate' then is_vert_enabled = (not name:match('[:;]%-vert')) and (not name:match('[:;]%-vrt2')) - auto_enable_vrt2 = (not name:match('vert') and not name:match('vrt2')) + auto_enable_vrt2 + = (not name:match('[:;][+%-]?vert')) and (not name:match('[:;][+%-]?vrt2')) else is_vert_enabled, auto_enable_vrt2 = nil, nil end - return is_braced and ('{' .. name .. '}') or name + return name end -- define_font callback @@ -744,7 +753,7 @@ do if i.order[1]== 'vert' and i.type == 'gsub_single' and i.steps then for _,j in pairs(i.steps) do if type(j)=='table' then - if type(j,coverage)=='table' then + if type(j.coverage)=='table' then for i,_ in pairs(j.coverage) do rot[i]=nil end end end @@ -850,12 +859,21 @@ do end prepare_fl_data = function (dest, id) local t = fontloader.info(id.filename) + if not t then return dest end local fl - if t.filename then + if t.fontname then fl = fontloader.open(id.filename) else - fl = fontloader.open(id.filename, id.fullname) + fl = fontloader.open(id.filename, id.fontname) -- マニュアルにはこっちで書いてあるが? + if not fl then + local index + for i,v in ipairs(t) do + if v.fontname == id.fontname then index=i; break end + end + fl = fontloader.open(id.filename, index) + end end + if not fl then fontloader.close(fl); return dest end local ind_to_uni, unicodes = {}, {} for i,v in pairs(id.characters) do ind_to_uni[v.index] = i @@ -931,7 +949,7 @@ do font_extra_basename[bname] = dat or {} ltjb.save_cache( v, { - chksum = checksum(id.filename), + chksum = newsum, version = cache_ver, dat, }) @@ -1039,6 +1057,7 @@ do ------------------------------------------------------------------------ -- VERT VARIANT TABLE ------------------------------------------------------------------------ + local provides_feature = luaotfload.aux.provides_feature local vert_form_table = { [0x3001]=0xFE11, [0x3002]=0xFE12, [0x3016]=0xFE17, [0x3017]=0xFE18, [0x2026]=0xFE19, @@ -1049,27 +1068,34 @@ do [0x300C]=0xFE41, [0x300D]=0xFE42, [0x300E]=0xFE43, [0x300F]=0xFE44, [0xFF3B]=0xFE47, [0xFF3D]=0xFE48, } - local function add_vform(coverage, vform, ft) + local function add_vform(coverage, vform, ft, add_vert) if type(coverage)~='table' then return end for i,v in pairs(vert_form_table) do - if (not coverage[i]) and ft.characters[v] then + if not coverage[i] and ft.characters[v] then vform[i] = v end end + if add_vert then -- vert feature が有効にならない場合 + for i,v in pairs(coverage) do vform[i] = vform[i] or v end + end end luatexbase.add_to_callback( "luatexja.define_jfont", function (fmtable, fnum) local vform = {}; fmtable.vform = vform - local ft = font_getfont(fnum) - if ft.specification and ft.resources then - for _,i in pairs(ft.resources.sequences) do - if i.order[1]== 'vert' and i.type == 'gsub_single' and i.steps then - for _,j in pairs(i.steps) do - if type(j)=='table' then add_vform(j.coverage,vform, ft) end - end - end + local t = font_getfont(fnum) + if t.specification and t.resources then + local add_vert + = not (provides_feature(fnum, t.properties.script, t.properties.language, 'vert')) + and not (provides_feature(fnum, t.properties.script, t.properties.language, 'vrt2')) + -- 現在の language, script で vert もvrt2 も有効にできない場合,強制的に vert 適用 + for _,i in pairs(t.resources.sequences) do + if i.order[1]== 'vert' and i.type == 'gsub_single' and i.steps then + for _,j in pairs(i.steps) do + if type(j)=='table' then add_vform(j.coverage,vform, t, add_vert) end + end + end end end return fmtable