diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-otx.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/font-otx.lua | 138 |
1 files changed, 80 insertions, 58 deletions
diff --git a/Master/texmf-dist/tex/context/base/font-otx.lua b/Master/texmf-dist/tex/context/base/font-otx.lua index 5c41ad66faf..dc0469e398e 100644 --- a/Master/texmf-dist/tex/context/base/font-otx.lua +++ b/Master/texmf-dist/tex/context/base/font-otx.lua @@ -30,14 +30,28 @@ 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 getprop = nuts.getprop +local setprop = nuts.setprop +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +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 @@ -79,6 +93,12 @@ local features = { fina = s_fina, isol = s_isol, -- mark = s_mark, + -- rest = s_rest, + rphf = s_rphf, + half = s_half, + pref = s_pref, + blwf = s_blwf, + pstf = s_pstf, } analyzers.states = states @@ -88,60 +108,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 + setprop(current,a_state,s_mark) elseif useunicodemarks and categories[char] == "mn" then done = true - current[a_state] = s_mark + setprop(current,a_state,s_mark) elseif n == 0 then first, last, n = current, current, 1 - current[a_state] = s_init + setprop(current,a_state,s_init) else last, n = current, n+1 - current[a_state] = s_medi + setprop(current,a_state,s_medi) end else -- finish if first and first == last then - last[a_state] = s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(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_midi + setprop(current,a_state,s_medi) last = current else -- finish if first and first == last then - last[a_state] = s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(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 + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(last,a_state,s_fina) end return head, done end @@ -184,7 +205,7 @@ end registerotffeature { name = "analyze", - description = "analysis of (for instance) character classes", + description = "analysis of character classes", default = true, initializers = { node = analyzeinitializer, @@ -202,7 +223,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 @@ -254,94 +275,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 getprop(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 + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setprop(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 + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setprop(first,a_state,s_error) end first = nil end elseif classifier == s_mark then - current[a_state] = s_mark + setprop(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 + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setprop(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 + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setprop(first,a_state,s_error) end first = nil end - current[a_state] = s_isol + setprop(current,a_state,s_isol) elseif classifier == s_medi then if first then last = current c_last = classifier - current[a_state] = s_medi + setprop(current,a_state,s_medi) else - current[a_state] = s_init + setprop(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 getprop(last,a_state) ~= s_init then + setprop(last,a_state,s_medi) end - current[a_state] = s_fina + setprop(current,a_state,s_fina) first, last = nil, nil elseif first then - -- if first[a_state] ~= s_init then + -- if getprop(first,a_state) ~= s_init then -- -- needs checking - -- first[a_state] = s_medi + -- setprop(first,a_state,s_medi) -- end - current[a_state] = s_fina + setprop(current,a_state,s_fina) first = nil else - current[a_state] = s_isol + setprop(current,a_state,s_isol) end else -- classifier == s_rest - current[a_state] = s_rest + setprop(current,a_state,s_rest) if last then if c_last == s_medi or c_last == s_fina then - last[a_state] = s_fina + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setprop(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 + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setprop(first,a_state,s_error) end first = nil end @@ -349,18 +371,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 + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setprop(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 + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setprop(first,a_state,s_error) end first = nil end @@ -368,21 +390,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 + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state] = s_error + setprop(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 + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state] = s_error + setprop(first,a_state,s_error) end end return head, done |