From 6a5523efcc3df3f9d51d2a98360825904df56630 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 6 Sep 2011 14:02:00 +0200 Subject: beta 2011.09.06 14:02 --- tex/context/base/char-utf.lua | 61 ++++++++++----- tex/context/base/context-version.pdf | Bin 4093 -> 4086 bytes tex/context/base/context-version.png | Bin 105624 -> 104502 bytes tex/context/base/font-mis.lua | 2 +- tex/context/base/font-otc.lua | 86 ++++++++++++++++----- tex/context/base/font-otf.lua | 2 +- tex/context/base/font-otn.lua | 71 ++++++++--------- tex/context/base/status-files.pdf | Bin 23918 -> 23932 bytes tex/context/base/status-lua.pdf | Bin 162240 -> 162268 bytes tex/generic/context/luatex/luatex-fonts-merged.lua | 75 +++++++++--------- 10 files changed, 181 insertions(+), 116 deletions(-) (limited to 'tex') diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua index 43591dd76..4817c3537 100644 --- a/tex/context/base/char-utf.lua +++ b/tex/context/base/char-utf.lua @@ -35,6 +35,9 @@ local characters = characters characters.graphemes = allocate() local graphemes = characters.graphemes +characters.combined = allocate() +local combined = characters.combined + characters.decomposed = allocate() local decomposed = characters.decomposed @@ -73,32 +76,45 @@ local decomposed = allocate { } characters.decomposed = decomposed -local function initialize() - for unicode, v in next, characters.data do +local function initialize() -- maybe only 'mn' + local data = characters.data + for unicode, v in next, data do -- using vs and first testing for length is faster (.02->.01 s) local vs = v.specials - if vs and #vs == 3 and vs[1] == 'char' then + if vs and #vs == 3 and vs[1] == "char" then local one, two = vs[2], vs[3] - local first, second, combined = utfchar(one), utfchar(two), utfchar(unicode) + if data[two].category == "mn" then + local cgf = combined[one] + if not cgf then + cgf = { [two] = unicode } + combined[one] = cgf + else + cgf[two] = unicode + end + end + local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) local cgf = graphemes[first] if not cgf then - cgf = { } + cgf = { [second] = combination } graphemes[first] = cgf + else + cgf[second] = combination end - cgf[second] = combined if v.mathclass or v.mathspec then local mps = mathpairs[two] if not mps then - mps = { } + mps = { [one] = unicode } mathpairs[two] = mps + else + mps[one] = unicode -- here unicode end - mps[one] = unicode -- here unicode local mps = mathpairs[second] if not mps then - mps = { } + mps = { [first] = combination } mathpairs[second] = mps + else + mps[first] = combination end - mps[first] = combined end -- else -- local description = v.description @@ -123,8 +139,11 @@ local function initialize() end end initialize = false + characters.initialize = function() end -- when used outside tex end +characters.initialize = initialize + -- utffilters.addgrapheme(utfchar(318),'l','\string~') -- utffilters.addgrapheme('c','a','b') @@ -441,17 +460,23 @@ function utffilters.decompose(str) return str end -local textfileactions = resolvers.openers.helpers.textfileactions +local sequencers = utilities.sequencers + +if sequencers then + + local textfileactions = resolvers.openers.helpers.textfileactions -utilities.sequencers.appendaction (textfileactions,"system","characters.filters.utf.collapse") -utilities.sequencers.disableaction(textfileactions,"characters.filters.utf.collapse") + sequencers.appendaction (textfileactions,"system","characters.filters.utf.collapse") + sequencers.disableaction(textfileactions,"characters.filters.utf.collapse") -utilities.sequencers.appendaction (textfileactions,"system","characters.filters.utf.decompose") -utilities.sequencers.disableaction(textfileactions,"characters.filters.utf.decompose") + sequencers.appendaction (textfileactions,"system","characters.filters.utf.decompose") + sequencers.disableaction(textfileactions,"characters.filters.utf.decompose") + + function characters.filters.utf.enable() + sequencers.enableaction(textfileactions,"characters.filters.utf.collapse") + sequencers.enableaction(textfileactions,"characters.filters.utf.decompose") + end -function characters.filters.utf.enable() - utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.collapse") - utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.decompose") end --[[ldx-- diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 9535172fd..fe96d9b72 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png index 9aa06a1a6..f9dc15ab5 100644 Binary files a/tex/context/base/context-version.png and b/tex/context/base/context-version.png differ diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua index b3147ede3..fdb44bb12 100644 --- a/tex/context/base/font-mis.lua +++ b/tex/context/base/font-mis.lua @@ -22,7 +22,7 @@ local handlers = fonts.handlers handlers.otf = handlers.otf or { } local otf = handlers.otf -otf.version = otf.version or 2.733 +otf.version = otf.version or 2.735 otf.cache = otf.cache or containers.define("fonts", "otf", otf.version, true) function otf.loadcached(filename,format,sub) diff --git a/tex/context/base/font-otc.lua b/tex/context/base/font-otc.lua index fd3d7a761..ae463e750 100644 --- a/tex/context/base/font-otc.lua +++ b/tex/context/base/font-otc.lua @@ -51,7 +51,8 @@ local function addfeature(data,feature,specifications) local unicodes = resources.unicodes local lookuptypes = resources.lookuptypes local splitter = lpeg.splitter(" ",unicodes) - local done = 0 + local done = 0 + local skip = 0 if not specifications[1] then -- so we accept a one entry specification specifications = { specifications } @@ -61,6 +62,11 @@ local function addfeature(data,feature,specifications) local specification = specifications[s] local valid = specification.valid if not valid or valid(data,specification,feature) then + local initialize = specification.initialize + if initialize then + -- when false is returned we initialize only once + specification.initialize = initialize(specification) and initialize or nil + end local askedfeatures = specification.features or everywhere local subtables = specification.subtables or { specification.data } or { } local featuretype = types[specification.type or "substitution"] @@ -82,12 +88,23 @@ local function addfeature(data,feature,specifications) if type(ligature) == "string" then ligature = { lpegmatch(splitter,ligature) } end - if slookups then - slookups[full] = ligature + local present = true + for i=1,#ligature do + if not descriptions[ligature[i]] then + present = false + break + end + end + if present then + if slookups then + slookups[full] = ligature + else + description.slookups = { [full] = ligature } + end + done, added = done + 1, true else - description.slookups = { [full] = ligature } + skip = skip + 1 end - done, added = done + 1, true end end elseif featuretype == "gsub_single" then @@ -98,14 +115,14 @@ local function addfeature(data,feature,specifications) if description then local slookups = description.slookups replacement = tonumber(replacement) or unicodes[replacement] - if descriptions[replacement] then - if slookups then - slookups[full] = replacement - else - description.slookups = { [full] = replacement } + if descriptions[replacement] then + if slookups then + slookups[full] = replacement + else + description.slookups = { [full] = replacement } + end + done, added = done + 1, true end - done, added = done + 1, true - end end end end @@ -148,8 +165,8 @@ local function addfeature(data,feature,specifications) end end end - if done > 0 and trace_loading then - report_otf("enhance: registering %s feature (%s glyphs affected)",feature,done) + if trace_loading then + report_otf("enhance: registering feature '%s', %s glyphs affected, %s glyphs skipped",feature,done,skip) end end end @@ -184,9 +201,9 @@ local tlig = { local tlig_specification = { type = "ligature", - features = everywhere, -- { ["*"] = { ["*"] = true } }, + features = everywhere, data = tlig, - flags = noflags, -- { }, + flags = noflags, } otf.addfeature("tlig",tlig_specification) @@ -206,9 +223,9 @@ local trep = { local trep_specification = { type = "substitution", - features = everywhere, -- { ["*"] = { ["*"] = true } }, + features = everywhere, data = trep, - flags = noflags, -- { }, + flags = noflags, } otf.addfeature("trep",trep_specification) @@ -218,6 +235,39 @@ registerotffeature { description = 'tex replacements', } +-- tcom + +if characters.combined then + + local tcom = { } + + local function initialize() + characters.initialize() + for first, seconds in next, characters.combined do + for second, combination in next, seconds do + tcom[combination] = { first, second } + end + end + -- return false + end + + local tcom_specification = { + type = "ligature", + features = everywhere, + data = tcom, + flags = noflags, + initialize = initialize, + } + + otf.addfeature("tcom",tcom_specification) + + registerotffeature { + name = 'tcom', + description = 'tex combinations', + } + +end + -- anum local anum_arabic = { diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index fe81f8bb1..319cae65b 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -47,7 +47,7 @@ local otf = fonts.handlers.otf otf.glists = { "gsub", "gpos" } -otf.version = 2.733 -- beware: also sync font-mis.lua +otf.version = 2.735 -- beware: also sync font-mis.lua otf.cache = containers.define("fonts", "otf", otf.version, true) local fontdata = fonts.hashes.identifiers diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua index 0cbdea839..a972d50e7 100644 --- a/tex/context/base/font-otn.lua +++ b/tex/context/base/font-otn.lua @@ -901,33 +901,6 @@ end local logwarning = report_subchain -function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n) - logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname)) - return start, false -end - --- handled later: --- --- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- end - -function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) - logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname)) - return start, false -end - -function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) - logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname)) - return start, false -end - --- handled later: --- --- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- end - local function logprocess(...) if trace_steps then registermessage(...) @@ -945,6 +918,11 @@ function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,lookuphash return start, false end +function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n) + logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname)) + return start, false +end + -- The reversesub is a special case, which is why we need to store the replacements -- in a bit weird way. There is no lookup and the replacement comes from the lookup -- itself. It is meant mostly for dealing with Urdu. @@ -1057,7 +1035,7 @@ the match.

--ldx]]-- function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - delete_till_stop(start,stop) + delete_till_stop(start,stop) -- we can assume that marks are to be deleted local startchar = start.char local subtables = currentlookup.subtables local lookupname = subtables[1] @@ -1082,39 +1060,49 @@ function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,looku return start, false end +-- function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) +-- logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname)) +-- return start, false +-- end + +chainmores.gsub_multiple = chainprocs.gsub_multiple + --[[ldx--

Here we replace start by new glyph. First we delete the rest of the match.

--ldx]]-- +-- char_1 mark_1 -> char_x mark_1 (ignore marks) +-- char_1 mark_1 -> char_x + +-- to be checked: do we always have just one glyph? +-- we can also have alternates for marks +-- marks come last anyway +-- are there cases where we need to delete the mark + function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - -- todo: marks ? - local n = delete_till_stop(start,stop) local current = start local subtables = currentlookup.subtables - local m = 0 while current do - if current.id == glyph_code then - m = m + 1 + if current.id == glyph_code then -- is this check needed? local currentchar = current.char local lookupname = subtables[1] local alternatives = lookuphash[lookupname] if not alternatives then if trace_bugs then - logwarning("%s: %s of %s, no alternative hit",cref(kind,chainname,chainlookupname,lookupname),m,n) + logwarning("%s: no alternative hit",cref(kind,chainname,chainlookupname,lookupname)) end else alternatives = alternatives[currentchar] if not alternatives then if trace_bugs then - logwarning("%s: %s of %s, no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),m,n,gref(currentchar)) + logwarning("%s: no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),gref(currentchar)) end else local choice, index = alternative_glyph(current,alternatives,kind,chainname,chainlookupname,lookupname) current.char = choice if trace_alternatives then - m = m + 1 - logprocess("%s: %s of %s, replacing single %s by alternative %s (%s)", - cref(kind,chainname,chainlookupname,lookupname),m,n,index,gref(currentchar),gref(choice)) + logprocess("%s: replacing single %s by alternative %s (%s)", + cref(kind,chainname,chainlookupname,lookupname),index,gref(currentchar),gref(choice)) end end end @@ -1128,6 +1116,13 @@ function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,look return start, false end +-- function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) +-- logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname)) +-- return start, false +-- end + +chainmores.gsub_alternate = chainprocs.gsub_alternate + --[[ldx--

When we replace ligatures we use a helper that handles the marks. I might change this function (move code inline and handle the marks by a separate function). We diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index c8a94ddc3..aaaede636 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf index 876b2a00b..fa9d18a12 100644 Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 928da0e83..b5fc340a2 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 09/05/11 23:49:07 +-- merge date : 09/06/11 14:02:36 do -- begin closure to overcome local limits and interference @@ -5012,7 +5012,7 @@ local otf = fonts.handlers.otf otf.glists = { "gsub", "gpos" } -otf.version = 2.733 -- beware: also sync font-mis.lua +otf.version = 2.735 -- beware: also sync font-mis.lua otf.cache = containers.define("fonts", "otf", otf.version, true) local fontdata = fonts.hashes.identifiers @@ -8983,33 +8983,6 @@ end local logwarning = report_subchain -function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n) - logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname)) - return start, false -end - --- handled later: --- --- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- end - -function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) - logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname)) - return start, false -end - -function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) - logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname)) - return start, false -end - --- handled later: --- --- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) --- end - local function logprocess(...) if trace_steps then registermessage(...) @@ -9027,6 +9000,11 @@ function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,lookuphash return start, false end +function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n) + logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname)) + return start, false +end + -- The reversesub is a special case, which is why we need to store the replacements -- in a bit weird way. There is no lookup and the replacement comes from the lookup -- itself. It is meant mostly for dealing with Urdu. @@ -9139,7 +9117,7 @@ the match.

--ldx]]-- function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - delete_till_stop(start,stop) + delete_till_stop(start,stop) -- we can assume that marks are to be deleted local startchar = start.char local subtables = currentlookup.subtables local lookupname = subtables[1] @@ -9164,39 +9142,49 @@ function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,looku return start, false end +-- function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) +-- logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname)) +-- return start, false +-- end + +chainmores.gsub_multiple = chainprocs.gsub_multiple + --[[ldx--

Here we replace start by new glyph. First we delete the rest of the match.

--ldx]]-- +-- char_1 mark_1 -> char_x mark_1 (ignore marks) +-- char_1 mark_1 -> char_x + +-- to be checked: do we always have just one glyph? +-- we can also have alternates for marks +-- marks come last anyway +-- are there cases where we need to delete the mark + function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - -- todo: marks ? - local n = delete_till_stop(start,stop) local current = start local subtables = currentlookup.subtables - local m = 0 while current do - if current.id == glyph_code then - m = m + 1 + if current.id == glyph_code then -- is this check needed? local currentchar = current.char local lookupname = subtables[1] local alternatives = lookuphash[lookupname] if not alternatives then if trace_bugs then - logwarning("%s: %s of %s, no alternative hit",cref(kind,chainname,chainlookupname,lookupname),m,n) + logwarning("%s: no alternative hit",cref(kind,chainname,chainlookupname,lookupname)) end else alternatives = alternatives[currentchar] if not alternatives then if trace_bugs then - logwarning("%s: %s of %s, no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),m,n,gref(currentchar)) + logwarning("%s: no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),gref(currentchar)) end else local choice, index = alternative_glyph(current,alternatives,kind,chainname,chainlookupname,lookupname) current.char = choice if trace_alternatives then - m = m + 1 - logprocess("%s: %s of %s, replacing single %s by alternative %s (%s)", - cref(kind,chainname,chainlookupname,lookupname),m,n,index,gref(currentchar),gref(choice)) + logprocess("%s: replacing single %s by alternative %s (%s)", + cref(kind,chainname,chainlookupname,lookupname),index,gref(currentchar),gref(choice)) end end end @@ -9210,6 +9198,13 @@ function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,look return start, false end +-- function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n) +-- logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname)) +-- return start, false +-- end + +chainmores.gsub_alternate = chainprocs.gsub_alternate + --[[ldx--

When we replace ligatures we use a helper that handles the marks. I might change this function (move code inline and handle the marks by a separate function). We -- cgit v1.2.3