diff options
Diffstat (limited to 'tex/context/base/font-otx.lua')
-rw-r--r-- | tex/context/base/font-otx.lua | 130 |
1 files changed, 73 insertions, 57 deletions
diff --git a/tex/context/base/font-otx.lua b/tex/context/base/font-otx.lua index f39045223..b7d2ae0bc 100644 --- a/tex/context/base/font-otx.lua +++ b/tex/context/base/font-otx.lua @@ -30,15 +30,29 @@ analyzers.methods = methods local a_state = attributes.private('state') +local nuts = nodes.nuts +local tonut = nuts.tonut + +local getfield = nuts.getfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getattr = nuts.getattr +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local setattr = nuts.setattr + +local traverse_id = nuts.traverse_id +local traverse_node_list = nuts.traverse +local end_of_math = nuts.end_of_math + local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local disc_code = nodecodes.disc local math_code = nodecodes.math -local traverse_id = node.traverse_id -local traverse_node_list = node.traverse -local end_of_math = node.end_of_math - local fontdata = fonts.hashes.identifiers local categories = characters and characters.categories or { } -- sorry, only in context local chardata = characters and characters.data @@ -95,60 +109,61 @@ analyzers.useunicodemarks = false -- todo: analyzers per script/lang, cross font, so we need an font id hash -> script -- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace -function analyzers.setstate(head,font) +function analyzers.setstate(head,font) -- we can skip math local useunicodemarks = analyzers.useunicodemarks local tfmdata = fontdata[font] local descriptions = tfmdata.descriptions local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean + current = tonut(current) while current do - local id = current.id - if id == glyph_code and current.font == font then + local id = getid(current) + if id == glyph_code and getfont(current) == font then done = true - local char = current.char + local char = getchar(current) local d = descriptions[char] if d then if d.class == "mark" then done = true - current[a_state] = s_mark + setattr(current,a_state,s_mark) elseif useunicodemarks and categories[char] == "mn" then done = true - current[a_state] = s_mark + setattr(current,a_state,s_mark) elseif n == 0 then first, last, n = current, current, 1 - current[a_state] = s_init + setattr(current,a_state,s_init) else last, n = current, n+1 - current[a_state] = s_medi + setattr(current,a_state,s_medi) end else -- finish if first and first == last then - last[a_state] = s_isol + setattr(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setattr(last,a_state,s_fina) end first, last, n = nil, nil, 0 end elseif id == disc_code then -- always in the middle - current[a_state] = s_medi + setattr(current,a_state,s_medi) last = current else -- finish if first and first == last then - last[a_state] = s_isol + setattr(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setattr(last,a_state,s_fina) end first, last, n = nil, nil, 0 if id == math_code then current = end_of_math(current) end end - current = current.next + current = getnext(current) end if first and first == last then - last[a_state] = s_isol + setattr(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setattr(last,a_state,s_fina) end return head, done end @@ -209,7 +224,7 @@ methods.latn = analyzers.setstate local arab_warned = { } local function warning(current,what) - local char = current.char + local char = getchar(current) if not arab_warned[char] then log.report("analyze","arab: character %C has no %a class",char,what) arab_warned[char] = true @@ -261,94 +276,95 @@ function methods.arab(head,font,attr) local first, last = nil, nil local c_first, c_last = nil, nil local current, done = head, false + current = tonut(current) while current do - local id = current.id - if id == glyph_code and current.font == font and current.subtype<256 and not current[a_state] then + local id = getid(current) + if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getattr(current,a_state) then done = true - local char = current.char + local char = getchar(current) local classifier = classifiers[char] if not classifier then if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setattr(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setattr(last,a_state,s_error) end first, last = nil, nil elseif first then if c_first == s_medi or c_first == s_fina then - first[a_state] = s_isol + setattr(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setattr(first,a_state,s_error) end first = nil end elseif classifier == s_mark then - current[a_state] = s_mark + setattr(current,a_state,s_mark) elseif classifier == s_isol then if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setattr(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setattr(last,a_state,s_error) end first, last = nil, nil elseif first then if c_first == s_medi or c_first == s_fina then - first[a_state] = s_isol + setattr(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setattr(first,a_state,s_error) end first = nil end - current[a_state] = s_isol + setattr(current,a_state,s_isol) elseif classifier == s_medi then if first then last = current c_last = classifier - current[a_state] = s_medi + setattr(current,a_state,s_medi) else - current[a_state] = s_init + setattr(current,a_state,s_init) first = current c_first = classifier end elseif classifier == s_fina then if last then - if last[a_state] ~= s_init then - last[a_state] = s_medi + if getattr(last,a_state) ~= s_init then + setattr(last,a_state,s_medi) end - current[a_state] = s_fina + setattr(current,a_state,s_fina) first, last = nil, nil elseif first then - -- if first[a_state] ~= s_init then + -- if getattr(first,a_state) ~= s_init then -- -- needs checking - -- first[a_state] = s_medi + -- setattr(first,a_state,s_medi) -- end - current[a_state] = s_fina + setattr(current,a_state,s_fina) first = nil else - current[a_state] = s_isol + setattr(current,a_state,s_isol) end else -- classifier == s_rest - current[a_state] = s_rest + setattr(current,a_state,s_rest) if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setattr(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setattr(last,a_state,s_error) end first, last = nil, nil elseif first then if c_first == s_medi or c_first == s_fina then - first[a_state] = s_isol + setattr(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setattr(first,a_state,s_error) end first = nil end @@ -356,18 +372,18 @@ function methods.arab(head,font,attr) else if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setattr(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setattr(last,a_state,s_error) end first, last = nil, nil elseif first then if c_first == s_medi or c_first == s_fina then - first[a_state] = s_isol + setattr(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setattr(first,a_state,s_error) end first = nil end @@ -375,21 +391,21 @@ function methods.arab(head,font,attr) current = end_of_math(current) end end - current = current.next + current = getnext(current) end if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setattr(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setattr(last,a_state,s_error) end elseif first then if c_first == s_medi or c_first == s_fina then - first[a_state] = s_isol + setattr(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setattr(first,a_state,s_error) end end return head, done |