OSDN Git Service

lltjext.sty: robustify \parbox and other fix
[luatex-ja/luatexja.git] / src / ltj-otf.lua
index 75494d6..6a1447a 100644 (file)
@@ -15,30 +15,26 @@ local id_glyph = node.id('glyph')
 local id_whatsit = node.id('whatsit')
 local sid_user = node.subtype('user_defined')
 
-local Dnode = node.direct or node
+local setfield = node.direct.setfield
+local getfield = node.direct.getfield
+local getid = node.direct.getid
+local getfont = node.direct.getfont
+local getchar = node.direct.getchar
+local getsubtype = node.direct.getsubtype
 
-local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end
-local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end
-local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end
-local getfont = (Dnode ~= node) and Dnode.getfont or function(n) return n.font end
---local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end
-local getchar = (Dnode ~= node) and Dnode.getchar or function(n) return n.char end
-local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end
+local to_node = node.direct.tonode
+local to_direct = node.direct.todirect
 
-local nullfunc = function(n) return n end
-local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc
-local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc
-
-local node_new = Dnode.new
-local node_remove = Dnode.remove
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local node_free = Dnode.free
-local has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local unset_attr = Dnode.unset_attribute
-local node_insert_after = Dnode.insert_after
-local node_write = Dnode.write
-local node_traverse_id = Dnode.traverse_id
+local node_new = node.direct.new
+local node_remove = node.direct.remove
+local node_next = node.direct.getnext
+local node_free = node.direct.free
+local has_attr = node.direct.has_attribute
+local set_attr = node.direct.set_attribute
+local unset_attr = node.direct.unset_attribute
+local node_insert_after = node.direct.insert_after
+local node_write = node.direct.write
+local node_traverse_id = node.direct.traverse_id
 
 
 local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
@@ -100,19 +96,24 @@ do
    local tex_get_attr = tex.getattribute
    cid = function (key)
       if key==0 then return append_jglyph(char) end
-      local curjfnt = identifiers[tex_get_attr((ltjd_get_dir_count()==dir_tate)
-                                                  and attr_curtfnt or attr_curjfnt)]
-      if not curjfnt.cidinfo or
-         curjfnt.cidinfo.ordering ~= "Japan1" and
-         curjfnt.cidinfo.ordering ~= "GB1" and
-         curjfnt.cidinfo.ordering ~= "CNS1" and
-         curjfnt.cidinfo.ordering ~= "Korea1" then
+      local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
+                                        and attr_curtfnt or attr_curjfnt)
+      local curjfnt = identifiers[curjfnt_num]
+      local cidinfo = curjfnt.resources.cidinfo
+      if not cidinfo or
+         cidinfo.ordering ~= "Japan1" and
+         cidinfo.ordering ~= "GB1" and
+         cidinfo.ordering ~= "CNS1" and
+         cidinfo.ordering ~= "Korea1" then
          --      ltjb.package_warning('luatexja-otf',
          --                       'Current Japanese font (or other CJK font) "'
          --                          ..curjfnt.psname..'" is not a CID-Keyed font (Adobe-Japan1 etc.)')
             return append_jglyph(get_ucs_from_rmlgbm(key))
       end
-      local char = curjfnt.resources.unicodes[curjfnt.cidinfo.ordering..'.'..tostring(key)]
+      local fe, char = ltjf_font_extra_info[curjfnt_num], nil
+      if fe and fe.unicodes then 
+         char = fe.unicodes[cidinfo.ordering..'.'..tostring(key)]
+      end
       if not char then
          ltjb.package_warning('luatexja-otf',
                               'Current Japanese font (or other CJK font) "'
@@ -171,11 +172,13 @@ ltjb.add_to_callback('pre_linebreak_filter', extract,'ltj.otf',
 -- 和文フォント読み込み時に,CID -> unicode 対応をとっておく.
 local function cid_to_char(fmtable, fn)
    local fi = identifiers[fn]
-   if fi.cidinfo and fi.cidinfo.ordering == "Japan1" then
+   local fe = ltjf_font_extra_info[fn]
+   if (fi.resources and fi.resources.cidinfo and fi.resources.cidinfo.ordering == "Japan1" )
+      and (fe and fe.unicodes) then
       for i, v in pairs(fmtable.chars) do
         local j = string.match(i, "^AJ1%-([0-9]*)")
         if j then
-           j = tonumber(fi.resources.unicodes['Japan1.'..tostring(j)])
+           j = tonumber(fe.unicodes['Japan1.'..tostring(j)])
            if j then
               fmtable.cid_char_type = fmtable.cid_char_type  or {}
               fmtable.cid_char_type[j] = v
@@ -234,7 +237,7 @@ do
                   if qc>=0xE0100 then qc = qc - 0xE0100 end
                   local pf = getfont(p)
                   local pt = ltjf_font_extra_info[pf]
-                  pt = pt and pt[getchar(p)];  pt = pt and  pt[qc]
+                 pt = pt and pt[getchar(p)];  pt = pt and  pt[qc]
                   head, r = node_remove(head,q)
                  node_free(q)
                   if pt then