From 84b147aa9d550cbe549d68b00143201f4b68dddc Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 14 Feb 2011 23:30:00 +0100 Subject: beta 2011.02.14 23:30 --- tex/context/base/char-cmp.lua | 261 -------------------------------------- tex/context/base/char-def.lua | 2 +- tex/context/base/char-ini.lua | 79 +++++++----- tex/context/base/char-ini.mkiv | 12 +- tex/context/base/core-con.lua | 19 +-- tex/context/base/core-fnt.mkiv | 7 +- tex/context/base/font-afm.lua | 243 ++++++++++++++++++++++++++++++++--- tex/context/base/sort-ini.lua | 3 + tex/context/base/status-files.pdf | Bin 23256 -> 23236 bytes tex/context/base/syst-aux.mkiv | 20 +-- tex/context/base/syst-lua.lua | 22 +++- tex/context/base/typo-cap.lua | 49 +++---- tex/context/base/typo-cln.lua | 16 ++- tex/context/base/typo-krn.lua | 12 +- 14 files changed, 352 insertions(+), 393 deletions(-) delete mode 100644 tex/context/base/char-cmp.lua diff --git a/tex/context/base/char-cmp.lua b/tex/context/base/char-cmp.lua deleted file mode 100644 index d972788c9..000000000 --- a/tex/context/base/char-cmp.lua +++ /dev/null @@ -1,261 +0,0 @@ -if not modules then modules = { } end modules ['char-cmp'] = { - version = 1.001, - comment = "companion to char-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- There is some overlap here with shcodes ... this file is only used --- for afm loading. - -local type = type -local utfchar, utfbyte = utf.char, utf.byte -local unpack = unpack or table.unpack - -local allocate = utilities.storage.allocate - -local characters = characters -local chardata = characters.data - -characters.uncomposed = allocate() -local uncomposed = characters.uncomposed - ---[[ldx-- -

The code defined here may move to the big character table.

---ldx]]-- - -characters.basedigits = allocate { - ['zero'] = 48, ['one'] = 49, - ['two'] = 50, ['three'] = 51, - ['four'] = 52, ['five'] = 53, - ['six'] = 54, ['seven'] = 55, - ['eight'] = 56, ['nine'] = 57 -} - ---[[ldx-- -

The next three tables can for instance be be used to enhance -kerning tables that lack kerning pairs for these special characters. -Of course they may come in handy elsewhere too. Using shcodes is -not handy here (incpmplete).

---ldx]]-- - -local left = allocate { - AEligature = "A", aeligature = "a", - OEligature = "O", oeligature = "o", - IJligature = "I", ijligature = "i", - AE = "A", ae = "a", - OE = "O", oe = "o", - IJ = "I", ij = "i", - Ssharp = "S", ssharp = "s", -} - -local right = allocate { - AEligature = "E", aeligature = "e", - OEligature = "E", oeligature = "e", - IJligature = "J", ijligature = "j", - AE = "E", ae = "e", - OE = "E", oe = "e", - IJ = "J", ij = "j", - Ssharp = "S", ssharp = "s", -} - -local both = allocate { - Acircumflex = "A", acircumflex = "a", - Ccircumflex = "C", ccircumflex = "c", - Ecircumflex = "E", ecircumflex = "e", - Gcircumflex = "G", gcircumflex = "g", - Hcircumflex = "H", hcircumflex = "h", - Icircumflex = "I", icircumflex = "i", - Jcircumflex = "J", jcircumflex = "j", - Ocircumflex = "O", ocircumflex = "o", - Scircumflex = "S", scircumflex = "s", - Ucircumflex = "U", ucircumflex = "u", - Wcircumflex = "W", wcircumflex = "w", - Ycircumflex = "Y", ycircumflex = "y", - - Agrave = "A", agrave = "a", - Egrave = "E", egrave = "e", - Igrave = "I", igrave = "i", - Ograve = "O", ograve = "o", - Ugrave = "U", ugrave = "u", - Ygrave = "Y", ygrave = "y", - - Atilde = "A", atilde = "a", - Itilde = "I", itilde = "i", - Otilde = "O", otilde = "o", - Utilde = "U", utilde = "u", - Ntilde = "N", ntilde = "n", - - Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a", - Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e", - Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i", - Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o", - Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u", - Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y", - - Aacute = "A", aacute = "a", - Cacute = "C", cacute = "c", - Eacute = "E", eacute = "e", - Iacute = "I", iacute = "i", - Lacute = "L", lacute = "l", - Nacute = "N", nacute = "n", - Oacute = "O", oacute = "o", - Racute = "R", racute = "r", - Sacute = "S", sacute = "s", - Uacute = "U", uacute = "u", - Yacute = "Y", yacute = "y", - Zacute = "Z", zacute = "z", - - Dstroke = "D", dstroke = "d", - Hstroke = "H", hstroke = "h", - Tstroke = "T", tstroke = "t", - - Cdotaccent = "C", cdotaccent = "c", - Edotaccent = "E", edotaccent = "e", - Gdotaccent = "G", gdotaccent = "g", - Idotaccent = "I", idotaccent = "i", - Zdotaccent = "Z", zdotaccent = "z", - - Amacron = "A", amacron = "a", - Emacron = "E", emacron = "e", - Imacron = "I", imacron = "i", - Omacron = "O", omacron = "o", - Umacron = "U", umacron = "u", - - Ccedilla = "C", ccedilla = "c", - Kcedilla = "K", kcedilla = "k", - Lcedilla = "L", lcedilla = "l", - Ncedilla = "N", ncedilla = "n", - Rcedilla = "R", rcedilla = "r", - Scedilla = "S", scedilla = "s", - Tcedilla = "T", tcedilla = "t", - - Ohungarumlaut = "O", ohungarumlaut = "o", - Uhungarumlaut = "U", uhungarumlaut = "u", - - Aogonek = "A", aogonek = "a", - Eogonek = "E", eogonek = "e", - Iogonek = "I", iogonek = "i", - Uogonek = "U", uogonek = "u", - - Aring = "A", aring = "a", - Uring = "U", uring = "u", - - Abreve = "A", abreve = "a", - Ebreve = "E", ebreve = "e", - Gbreve = "G", gbreve = "g", - Ibreve = "I", ibreve = "i", - Obreve = "O", obreve = "o", - Ubreve = "U", ubreve = "u", - - Ccaron = "C", ccaron = "c", - Dcaron = "D", dcaron = "d", - Ecaron = "E", ecaron = "e", - Lcaron = "L", lcaron = "l", - Ncaron = "N", ncaron = "n", - Rcaron = "R", rcaron = "r", - Scaron = "S", scaron = "s", - Tcaron = "T", tcaron = "t", - Zcaron = "Z", zcaron = "z", - - dotlessI = "I", dotlessi = "i", - dotlessJ = "J", dotlessj = "j", - - AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae", - OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe", - IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij", - - Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l", - Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o", - - Ssharp = "SS", ssharp = "ss", - - Aumlaut = "A", aumlaut = "a", - Eumlaut = "E", eumlaut = "e", - Iumlaut = "I", iumlaut = "i", - Oumlaut = "O", oumlaut = "o", - Uumlaut = "U", uumlaut = "u", - -} - -uncomposed.left = left -uncomposed.right = right -uncomposed.both = both - ---[[ldx-- -

The following function is used in the indexing code, where we -need some sort of default fallback mapping. (This is obsolete!)

---ldx]]-- - -function characters.uncompose(n) -- n == string|number, returns string - local cdn = type(n) == "string" and chardata[utfbyte(n)] or chardata[n] - if cdn then - local shcode = cdn.shcode - if not shcode then - return both[cdn.contextname] or n - elseif type(shcode) == "table" then - return utfchar(unpack(cdn.shcode)) - else - return utfchar(cdn.shcode) - end - end - return n -end - ---[[ldx-- -

Only characters with a code smaller than 128 make sense, -anything larger is encoding dependent. An interesting complication -is that a character can be in an encoding twice but is hashed -once.

---ldx]]-- - -characters.ligatures = allocate { - ['f'] = { - { 'f', 'ff' }, - { 'i', 'fi' }, - { 'l', 'fl' }, - }, - ['ff'] = { - { 'i', 'ffi' } - }, - ['fi'] = { - { 'i', 'fii' } - }, - ['fl'] = { - { 'i', 'fli' } - }, - ['s'] = { - { 't', 'st' } - }, - ['i'] = { - { 'j', 'ij' } - }, -} - -characters.texligatures = allocate { - -- ['space'] = { - -- { 'L', 'Lslash' }, - -- { 'l', 'lslash' } - -- }, - -- ['question'] = { - -- { 'quoteleft', 'questiondown' } - -- }, - -- ['exclam'] = { - -- { 'quoteleft', 'exclamdown' } - -- }, - ['quoteleft'] = { - { 'quoteleft', 'quotedblleft' } - }, - ['quoteright'] = { - { 'quoteright', 'quotedblright' } - }, - ['hyphen'] = { - { 'hyphen', 'endash' } - }, - ['endash'] = { - { 'hyphen', 'emdash' } - } -} - ---~ U+2019: right single quotation mark / quoteright diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua index e63024e6d..9549cab68 100644 --- a/tex/context/base/char-def.lua +++ b/tex/context/base/char-def.lua @@ -2245,7 +2245,7 @@ characters.data={ description="LATIN SMALL LETTER SHARP S", direction="l", linebreak="al", - uccodes={ 0x0053, 0x0053 }, + uccode={ 0x0053, 0x0053 }, unicodeslot=0x00DF, }, { diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua index 8e94d5917..798e79e18 100644 --- a/tex/context/base/char-ini.lua +++ b/tex/context/base/char-ini.lua @@ -647,6 +647,12 @@ function characters.setcodes() if not lc then chr.lccode, lc = code, code end if not uc then chr.uccode, uc = code, code end texsetcatcode(code,11) -- letter + if type(lc) == "table" then + lc = code + end + if type(uc) == "table" then + uc = code + end texsetlccode(code,lc,uc) if cc == "lu" then texsetsfcode(code,999) @@ -691,38 +697,6 @@ function characters.category(n,verbose) end end ---[[ldx-- -

Requesting lower and uppercase codes:

---ldx]]-- - -function characters.uccode(n) return data[n].uccode or n end -function characters.lccode(n) return data[n].lccode or n end - -function characters.flush(n,direct) - local c = data[n] - if c and c.contextname then - c = "\\" .. c.contextname - else - c = utfchar(n) - end - if direct then - return c - else - texsprint(c) - end -end - -function characters.shape(n) - local shcode = data[n].shcode - if not shcode then - return n, nil - elseif type(shcode) == "table" then - return shcode[1], shcode[#shcode] - else - return shcode, nil - end -end - -- xml support (moved) function characters.remapentity(chr,slot) @@ -753,7 +727,7 @@ characters.activeoffset = 0x10000 -- there will be remapped in that byte range local function utfstring(s) if type(s) == "table" then - return concat { utfchar( unpack(s) ) } + return utfchar(unpack(s)) -- concat { utfchar( unpack(s) ) } else return utfchar(s) end @@ -777,8 +751,12 @@ characters.lcchars = allocate() local lcchars = characters.lcchars -- lazy tabl characters.ucchars = allocate() local ucchars = characters.ucchars -- lazy table characters.shchars = allocate() local shchars = characters.shchars -- lazy table -setmetatable(lcchars, { __index = function(t,u) if u then local c = data[u] c = c and c.lccode c = c and utfchar (c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) -setmetatable(ucchars, { __index = function(t,u) if u then local c = data[u] c = c and c.uccode c = c and utfchar (c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) +--~ setmetatable(lcchars, { __index = function(t,u) if u then local c = data[u] c = c and c.lccode c = c and utfchar (c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) +--~ setmetatable(ucchars, { __index = function(t,u) if u then local c = data[u] c = c and c.uccode c = c and utfchar (c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) +--~ setmetatable(shchars, { __index = function(t,u) if u then local c = data[u] c = c and c.shcode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) + +setmetatable(lcchars, { __index = function(t,u) if u then local c = data[u] c = c and c.lccode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) +setmetatable(ucchars, { __index = function(t,u) if u then local c = data[u] c = c and c.uccode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) setmetatable(shchars, { __index = function(t,u) if u then local c = data[u] c = c and c.shcode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end } ) characters.specialchars = allocate() local specialchars = characters.specialchars -- lazy table @@ -865,6 +843,37 @@ function characters.lettered(str,spacing) end return concat(new) end +--[[ldx-- +

Requesting lower and uppercase codes:

+--ldx]]-- + +function characters.uccode(n) return uccodes[n] end -- obsolete +function characters.lccode(n) return lccodes[n] end -- obsolete + +function characters.flush(n,direct) + local c = data[n] + if c and c.contextname then + c = "\\" .. c.contextname + else + c = utfchar(n) + end + if direct then + return c + else + texsprint(c) + end +end + +function characters.shape(n) + local shcode = shcodes[n] + if not shcode then + return n, nil + elseif type(shcode) == "table" then + return shcode[1], shcode[#shcode] + else + return shcode, nil + end +end -- -- some day we might go this route, but it does not really save that much -- -- so not now (we can generate a lot using mtx-unicode that operates on the diff --git a/tex/context/base/char-ini.mkiv b/tex/context/base/char-ini.mkiv index 67ba25173..cf27fdc14 100644 --- a/tex/context/base/char-ini.mkiv +++ b/tex/context/base/char-ini.mkiv @@ -15,7 +15,6 @@ \registerctxluafile{char-def}{1.001} % let's load this one first \registerctxluafile{char-ini}{1.001} -\registerctxluafile{char-cmp}{1.001} % maybe we will load this someplace else \registerctxluafile{char-map}{1.001} % maybe we will load this someplace else \registerctxluafile{char-tex}{1.001} @@ -49,18 +48,11 @@ %D them (unless of course we have adapted the table). It is on the agenda %D to do this with \type {tex.lccode} cum suis once they're available. -\def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax} -\def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax } +% \def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax} +% \def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax } \ctxlua{characters.setcodes()} -%D There may be a problem with the turkisch patterns. By now it's taken care of in -%D ctxtools (thanks to Mojca). There seems to be a bug in the patterns (^^11 refers -%D to a double quote but it should be ^^19 since the original is in ec encoding). - -% \setcclcuc "201C "201C "201C -% \setcclcuc "201D "201D "201D - % Is setting up vrb tpa and tpb needed? \ctxlua { diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua index e2f0b164e..277a7354d 100644 --- a/tex/context/base/core-con.lua +++ b/tex/context/base/core-con.lua @@ -166,11 +166,10 @@ converters.chr = chr converters.chrs = chrs converters.maxchrs = maxchrs -local flushcharacter = characters and characters.flush or function(s) return utfchar(s) end -local lowercharacter = characters and characters.lccode or function(s) return s end -local uppercharacter = characters and characters.uccode or function(s) return s end +local lowercharacter = characters.lcchars +local uppercharacter = characters.ucchars -local function do_alphabetic(n,mapping,mapper,verbose,t) +local function do_alphabetic(n,mapping,mapper,t) if not t then t = { } end @@ -180,14 +179,10 @@ local function do_alphabetic(n,mapping,mapper,verbose,t) end local max = #mapping if n > max then - do_alphabetic(floor((n-1)/max),mapping,mapper,verbose,t) - n = (n-1)%max+1 - end - if verbose or type(chr) ~= "number" then - t[#t+1] = chr - else - t[#t+1] = utfchar(chr) + do_alphabetic(floor((n-1)/max),mapping,mapper,t) + n = (n-1) % max + 1 end + t[#t+1] = chr if n <= max then return concat(t) end @@ -543,7 +538,7 @@ local function convert(method,n) -- todo: language local lowermethod = lower(method) local linguistic = counters[lowermethod] if linguistic then - return do_alphabetic(n,linguistic,lowermethod == method and lowercharacter or uppercharacter,false) + return do_alphabetic(n,linguistic,lowermethod == method and lowercharacter or uppercharacter) end local sequence = sequences[method] if sequence then diff --git a/tex/context/base/core-fnt.mkiv b/tex/context/base/core-fnt.mkiv index bd91b5578..90dd93496 100644 --- a/tex/context/base/core-fnt.mkiv +++ b/tex/context/base/core-fnt.mkiv @@ -32,10 +32,13 @@ %D for verbatim data. \appendtoks - \disablecompoundcharacters - \disablediscretionaries + \disablecompoundcharacters + \disablediscretionaries \to \everycleanupfeatures +%D The following code will me mkiv'd when needed. It's rather easy to +%D extend the kerner with glue. + %D \macros %D {stretched} %D diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua index a9d03b47e..3e6625386 100644 --- a/tex/context/base/font-afm.lua +++ b/tex/context/base/font-afm.lua @@ -37,6 +37,8 @@ fonts.afm = fonts.afm or { } local afm = fonts.afm local tfm = fonts.tfm +-- so far + afm.version = 1.403 -- incrementing this number one up will force a re-cache afm.syncspace = true -- when true, nicer stretch values afm.addligatures = true -- best leave this set to true @@ -270,7 +272,7 @@ by adding ligatures and kern information to the afm derived data. That way we can set them faster when defining a font.

--ldx]]-- -local addkerns, addligatures, unify -- we will implement these later +local addkerns, addligatures, addtexligatures, unify -- we will implement these later function afm.load(filename) -- hm, for some reasons not resolved yet @@ -306,15 +308,15 @@ function afm.load(filename) unify(data,filename) if afm.addligatures then report_afm( "add ligatures") - addligatures(data,'ligatures') -- easier this way + addligatures(data) end if afm.addtexligatures then - report_afm( "add tex-ligatures") - addligatures(data,'texligatures') -- easier this way + report_afm( "add tex ligatures") + addtexligatures(data) end if afm.addkerns then report_afm( "add extra kerns") - addkerns(data) -- faster this way + addkerns(data) end report_afm( "add tounicode data") fonts.map.addtounicode(data,filename) @@ -388,22 +390,77 @@ end and extra kerns. This saves quite some lookups later.

--ldx]]-- -addligatures = function(afmdata,ligatures) +--[[ldx-- +

Only characters with a code smaller than 128 make sense, +anything larger is encoding dependent. An interesting complication +is that a character can be in an encoding twice but is hashed +once.

+--ldx]]-- + +local ligatures = { -- okay, nowadays we could parse the name + ['f'] = { + { 'f', 'ff' }, + { 'i', 'fi' }, + { 'l', 'fl' }, + }, + ['ff'] = { + { 'i', 'ffi' } + }, + ['fi'] = { + { 'i', 'fii' } + }, + ['fl'] = { + { 'i', 'fli' } + }, + ['s'] = { + { 't', 'st' } + }, + ['i'] = { + { 'j', 'ij' } + }, +} + +local texligatures = { + -- ['space'] = { + -- { 'L', 'Lslash' }, + -- { 'l', 'lslash' } + -- }, + -- ['question'] = { + -- { 'quoteleft', 'questiondown' } + -- }, + -- ['exclam'] = { + -- { 'quoteleft', 'exclamdown' } + -- }, + ['quoteleft'] = { + { 'quoteleft', 'quotedblleft' } + }, + ['quoteright'] = { + { 'quoteright', 'quotedblright' } + }, + ['hyphen'] = { + { 'hyphen', 'endash' } + }, + ['endash'] = { + { 'hyphen', 'emdash' } + } +} + +local addthem = function(afmdata,ligatures) local glyphs, luatex = afmdata.glyphs, afmdata.luatex local indices, unicodes, names = luatex.indices, luatex.unicodes, luatex.names - for k,v in next, characters[ligatures] do -- main characters table - local one = glyphs[names[k]] + for ligname, ligdata in next, ligatures do + local one = glyphs[names[ligname]] if one then - for _, b in next, v do - two, three = b[1], b[2] + for _, pair in next, ligdata do + local two, three = pair[1], pair[2] if two and three and names[two] and names[three] then - local ol = one[ligatures] + local ol = one.ligatures if ol then if not ol[two] then -- was one.ligatures ... bug ol[two] = three end else - one[ligatures] = { [two] = three } + one.ligatures = { [two] = three } end end end @@ -411,22 +468,168 @@ addligatures = function(afmdata,ligatures) end end +addligatures = function(afmdata) addthem(afmdata,ligatures ) end +addtexligatures = function(afmdata) addthem(afmdata,texligatures) end + --[[ldx--

We keep the extra kerns in separate kerning tables so that we can use them selectively.

--ldx]]-- +-- This is rather old code (from the beginning when we had only tfm). If +-- we unify the afm data (now we have names all over the place) then +-- we can use shcodes but there will be many more looping then. But we +-- could get rid of the tables in char-cmp then. + +local left = { + AEligature = "A", aeligature = "a", + OEligature = "O", oeligature = "o", + IJligature = "I", ijligature = "i", + AE = "A", ae = "a", + OE = "O", oe = "o", + IJ = "I", ij = "i", + Ssharp = "S", ssharp = "s", +} + +local right = { + AEligature = "E", aeligature = "e", + OEligature = "E", oeligature = "e", + IJligature = "J", ijligature = "j", + AE = "E", ae = "e", + OE = "E", oe = "e", + IJ = "J", ij = "j", + Ssharp = "S", ssharp = "s", +} + +local both = { + Acircumflex = "A", acircumflex = "a", + Ccircumflex = "C", ccircumflex = "c", + Ecircumflex = "E", ecircumflex = "e", + Gcircumflex = "G", gcircumflex = "g", + Hcircumflex = "H", hcircumflex = "h", + Icircumflex = "I", icircumflex = "i", + Jcircumflex = "J", jcircumflex = "j", + Ocircumflex = "O", ocircumflex = "o", + Scircumflex = "S", scircumflex = "s", + Ucircumflex = "U", ucircumflex = "u", + Wcircumflex = "W", wcircumflex = "w", + Ycircumflex = "Y", ycircumflex = "y", + + Agrave = "A", agrave = "a", + Egrave = "E", egrave = "e", + Igrave = "I", igrave = "i", + Ograve = "O", ograve = "o", + Ugrave = "U", ugrave = "u", + Ygrave = "Y", ygrave = "y", + + Atilde = "A", atilde = "a", + Itilde = "I", itilde = "i", + Otilde = "O", otilde = "o", + Utilde = "U", utilde = "u", + Ntilde = "N", ntilde = "n", + + Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a", + Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e", + Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i", + Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o", + Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u", + Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y", + + Aacute = "A", aacute = "a", + Cacute = "C", cacute = "c", + Eacute = "E", eacute = "e", + Iacute = "I", iacute = "i", + Lacute = "L", lacute = "l", + Nacute = "N", nacute = "n", + Oacute = "O", oacute = "o", + Racute = "R", racute = "r", + Sacute = "S", sacute = "s", + Uacute = "U", uacute = "u", + Yacute = "Y", yacute = "y", + Zacute = "Z", zacute = "z", + + Dstroke = "D", dstroke = "d", + Hstroke = "H", hstroke = "h", + Tstroke = "T", tstroke = "t", + + Cdotaccent = "C", cdotaccent = "c", + Edotaccent = "E", edotaccent = "e", + Gdotaccent = "G", gdotaccent = "g", + Idotaccent = "I", idotaccent = "i", + Zdotaccent = "Z", zdotaccent = "z", + + Amacron = "A", amacron = "a", + Emacron = "E", emacron = "e", + Imacron = "I", imacron = "i", + Omacron = "O", omacron = "o", + Umacron = "U", umacron = "u", + + Ccedilla = "C", ccedilla = "c", + Kcedilla = "K", kcedilla = "k", + Lcedilla = "L", lcedilla = "l", + Ncedilla = "N", ncedilla = "n", + Rcedilla = "R", rcedilla = "r", + Scedilla = "S", scedilla = "s", + Tcedilla = "T", tcedilla = "t", + + Ohungarumlaut = "O", ohungarumlaut = "o", + Uhungarumlaut = "U", uhungarumlaut = "u", + + Aogonek = "A", aogonek = "a", + Eogonek = "E", eogonek = "e", + Iogonek = "I", iogonek = "i", + Uogonek = "U", uogonek = "u", + + Aring = "A", aring = "a", + Uring = "U", uring = "u", + + Abreve = "A", abreve = "a", + Ebreve = "E", ebreve = "e", + Gbreve = "G", gbreve = "g", + Ibreve = "I", ibreve = "i", + Obreve = "O", obreve = "o", + Ubreve = "U", ubreve = "u", + + Ccaron = "C", ccaron = "c", + Dcaron = "D", dcaron = "d", + Ecaron = "E", ecaron = "e", + Lcaron = "L", lcaron = "l", + Ncaron = "N", ncaron = "n", + Rcaron = "R", rcaron = "r", + Scaron = "S", scaron = "s", + Tcaron = "T", tcaron = "t", + Zcaron = "Z", zcaron = "z", + + dotlessI = "I", dotlessi = "i", + dotlessJ = "J", dotlessj = "j", + + AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae", + OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe", + IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij", + + Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l", + Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o", + + Ssharp = "SS", ssharp = "ss", + + Aumlaut = "A", aumlaut = "a", + Eumlaut = "E", eumlaut = "e", + Iumlaut = "I", iumlaut = "i", + Oumlaut = "O", oumlaut = "o", + Uumlaut = "U", uumlaut = "u", + +} + addkerns = function(afmdata) -- using shcodes is not robust here local glyphs = afmdata.glyphs local names = afmdata.luatex.names - local uncomposed = characters.uncomposed local function do_it_left(what) for index, glyph in next, glyphs do local kerns = glyph.kerns if kerns then local extrakerns = glyph.extrakerns or { } - for complex, simple in next, uncomposed[what] do - if names[compex] then + for complex, simple in next, what do + if names[complex] then local ks = kerns[simple] if ks and not kerns[complex] then extrakerns[complex] = ks @@ -440,7 +643,7 @@ addkerns = function(afmdata) -- using shcodes is not robust here end end local function do_it_copy(what) - for complex, simple in next, uncomposed[what] do + for complex, simple in next, what do local c = glyphs[names[complex]] if c then -- optional local s = glyphs[names[simple]] @@ -462,11 +665,11 @@ addkerns = function(afmdata) -- using shcodes is not robust here end end -- add complex with values of simplified when present - do_it_left("left") - do_it_left("both") + do_it_left(left) + do_it_left(both) -- copy kerns from simple char to complex char unless set - do_it_copy("both") - do_it_copy("right") + do_it_copy(both) + do_it_copy(right) end --[[ldx-- diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index f08ba0e26..dc6765c79 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -479,6 +479,9 @@ function splitters.utf(str) -- we could append m and u but this is cleaner, s is local l = lower[sc] n = n + 1 l = l and utfbyte(l) or lccodes[b] + if type(l) == "table" then + l = l[1] -- there are currently no tables in lccodes but it can be some, day + end z_case[n] = l if l ~= b then m_case[n] = l - 1 diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index 56441cb1e..e9fde1cd5 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/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 17169acbf..f9c339dff 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -59,23 +59,15 @@ %D to use development versions of \MKIV\ for real documents. %D %D \starttyping -%D \doifolderversionelse\contextversion{2001.02.03}{yes}{no} -%D \doifolderversionelse\contextversion{3001.02.03}{yes}{no} +%D \doifolderversionelse\contextversion{1010.10.10} {OLDER} {OKAY} => OLDER +%D \doifolderversionelse\contextversion{2020.20.20} {OLDER} {OKAY} => OKAY +%D \doifolderversionelse\contextversion{2020} {OLDER} {OKAY} => OKAY %D \stoptyping %D -%D The \type {yyyy.mm.dd} syntax is rather strict. +%D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional). -% todo: lua - -\def\@@versiontonumber#1.#2.#3#4#5\relax - {\numexpr#1*\plustenthousand+#2*\plushundred+#3#4\relax} - -\def\doifolderversionelse#1#2% - {\normalexpanded{\noexpand\ifnum\noexpand\@@versiontonumber#1\relax<\noexpand\@@versiontonumber#2\relax}\relax - \expandafter\firstoftwoarguments - \else - \expandafter\secondoftwoarguments - \fi} +\def\doifolderversionelse#1#2{\ctxcommand{doifolderversionelse("#1","#2")}} +\def\doifoldercontextelse #1{\ctxcommand{doifolderversionelse("#1")}} %D \macros %D {normalspace} diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua index fefe415cf..7c619b6d3 100644 --- a/tex/context/base/syst-lua.lua +++ b/tex/context/base/syst-lua.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['syst-lua'] = { local texsprint, texprint, texwrite, texiowrite_nl = tex.sprint, tex.print, tex.write, texio.write_nl local format, find = string.format, string.find -local lpegmatch = lpeg.match +local tonumber = tonumber +local S, Ct, lpegmatch, lpegsplitat = lpeg.S, lpeg.Ct, lpeg.match, lpeg.splitat local ctxcatcodes = tex.ctxcatcodes @@ -53,7 +54,7 @@ function commands.doifelsespaces(str) return commands.doifelse(find(str,"^ +$")) end -local s = lpeg.Ct(lpeg.splitat(",")) +local s = Ct(lpegsplitat(",")) local h = { } function commands.doifcommonelse(a,b) @@ -87,3 +88,20 @@ local pattern = lpeg.patterns.validdimen function commands.doifdimenstringelse(str) testcase(lpegmatch(pattern,str)) end + +local splitter = lpegsplitat(S(". ")) + +function commands.doifolderversionelse(one,two) -- no checking done + if not two then + one, two = environment.version, one + elseif one == "" then + one = environment.version + end + local y_1, m_1, d_1 = lpeg.match(splitter,one) + local y_2, m_2, d_2 = lpeg.match(splitter,two) + commands.testcase ( not ( + (tonumber(y_2) or 0) >= (tonumber(y_1) or 0) and + (tonumber(m_2) or 99) >= (tonumber(m_1) or 0) and + (tonumber(d_2) or 99) >= (tonumber(d_1) or 0) + ) ) +end diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua index aaa9de933..a8e714a9b 100644 --- a/tex/context/base/typo-cap.lua +++ b/tex/context/base/typo-cap.lua @@ -63,9 +63,12 @@ local lastfont = nil -- -- \WORD {far too \Word{many \WORD{more \word{pushed} in between} useless} words} -local function helper(start, code, codes, special, attribute, once) +local uccodes = characters.uccodes +local lccodes = characters.lccodes + +local function helper(start, codes, special, attribute, once) local char = start.char - local dc = chardata[char] + local dc = codes[char] if dc then local fnt = start.font if special then @@ -84,16 +87,16 @@ local function helper(start, code, codes, special, attribute, once) end end local ifc = fontchar[fnt] - local ucs = dc[codes] - if ucs then + if type(dc) == "table" then local ok = true - for i=1,#ucs do - ok = ok and ifc[ucs[i]] + for i=1,#dc do + ok = ok and ifc[dc[i]] end if ok then + -- tood; use generic injector local prev, original = start, start - for i=1,#ucs do - local chr = ucs[i] + for i=1,#dc do + local chr = dc[i] prev = start if i == 1 then start.char = chr @@ -115,10 +118,8 @@ local function helper(start, code, codes, special, attribute, once) end if once then lastfont = nil end return start, false - end - local uc = dc[code] - if uc and ifc[uc] then - start.char = uc + elseif ifc[dc] then + start.char = dc if once then lastfont = nil end return start, true end @@ -129,12 +130,12 @@ end actions[1] = function(start,attribute) lastfont = nil - return helper(start,'uccode','uccodes') + return helper(start,uccodes) end actions[2] = function(start,attribute) lastfont = nil - return helper(start,'lccode','lccodes') + return helper(start,lccodes) end actions[3] = function(start,attribute,attr) @@ -154,7 +155,7 @@ actions[3] = function(start,attribute,attr) end -- we could return the last in the range and save some scanning -- but why bother - return helper(start,'uccode','uccodes') + return helper(start,uccodes) else return start, false end @@ -167,18 +168,18 @@ actions[4] = function(start,attribute) prev = prev.prev end if not prev or prev.id ~= glyph_code then - return helper(start,'uccode','uccodes') + return helper(start,uccodes) else return start, false end end actions[5] = function(start,attribute) -- 3 - return helper(start,'uccode','uccodes',true,attribute,true) + return helper(start,uccodes,true,attribute,true) end actions[6] = function(start,attribute) -- 4 - return helper(start,'uccode','uccodes',true,attribute,false) + return helper(start,uccodes,true,attribute,false) end actions[8] = function(start) @@ -187,23 +188,23 @@ actions[8] = function(start) local mr = math.random -- local tfm = fontdata[start.font].characters local tfm = fontchar[start.font] - if chardata[ch].lccode then + if lccodes[ch] then while true do local d = chardata[mr(1,0xFFFF)] if d then - local uc = d.uccode - if uc and tfm[uc] then + local uc = uccodes[d] + if uc and tfm[uc] then -- this also intercepts tables start.char = uc return start, true end end end - elseif chardata[ch].uccode then + elseif uccodes[ch] then while true do local d = chardata[mr(1,0xFFFF)] if d then - local lc = d.lccode - if lc and tfm[lc] then + local lc = lccodes[d] + if lc and tfm[lc] then -- this also intercepts tables start.char = lc return start, true end diff --git a/tex/context/base/typo-cln.lua b/tex/context/base/typo-cln.lua index 09e8744ea..2327ef6be 100644 --- a/tex/context/base/typo-cln.lua +++ b/tex/context/base/typo-cln.lua @@ -32,7 +32,7 @@ local traverse_id = node.traverse_id local glyph_code = nodecodes.glyph local uccodes = characters.uccodes -local a_cleaner = attributes.private("cleaner") +local a_cleaner = attributes.private("cleaner") local resetter = { -- this will become an entry in char-def [utfbyte(".")] = true @@ -53,11 +53,15 @@ local function process(namespace,attribute,head) local a = has_attribute(n,attribute) if a == 1 then -- currently only one cleaner so no need to be fancy local upper = uccodes[char] - n.char = upper - inline = true - done = true - if trace_autocase then - report_autocase("") + if type(upper) == "table" then + -- some day, not much change that \SS ends up here + else + n.char = upper + inline = true + done = true + if trace_autocase then + report_autocase("") + end end end end diff --git a/tex/context/base/typo-krn.lua b/tex/context/base/typo-krn.lua index 9bf3cb1f5..597950c6a 100644 --- a/tex/context/base/typo-krn.lua +++ b/tex/context/base/typo-krn.lua @@ -80,7 +80,7 @@ kerns.keeptogether = false -- just for fun (todo: control setting with key/value -- can be optimized .. the prev thing .. but hardly worth the effort -local function do_process(namespace,attribute,head,force) +local function do_process(namespace,attribute,head,force) -- todo: glue so that we can fully stretch local start, done, lastfont = head, false, nil local keepligature = kerns.keepligature local keeptogether = kerns.keeptogether @@ -130,7 +130,7 @@ if keeptogether and prev.prev.id == glyph_code and keeptogether(prev.prev,start) -- keep 'm else prev.subtype = userkern_code - prev.kern = prev.kern + quaddata[lastfont]*krn + prev.kern = prev.kern + quaddata[lastfont]*krn -- here done = true end elseif pid == glyph_code then @@ -141,12 +141,12 @@ if keeptogether and keeptogether(prev,start) then else local kerns = chardata[lastfont][prevchar].kerns local kern = kerns and kerns[lastchar] or 0 - krn = kern + quaddata[lastfont]*krn + krn = kern + quaddata[lastfont]*krn -- here insert_node_before(head,start,new_kern(krn)) done = true end else - krn = quaddata[lastfont]*krn + krn = quaddata[lastfont]*krn -- here insert_node_before(head,start,new_kern(krn)) done = true end @@ -201,9 +201,9 @@ end local prevchar, lastchar = prv.char, start.char local kerns = chardata[lastfont][prevchar].kerns local kern = kerns and kerns[lastchar] or 0 - krn = kern + quaddata[lastfont]*krn + krn = kern + quaddata[lastfont]*krn -- here else - krn = quaddata[lastfont]*krn + krn = quaddata[lastfont]*krn -- here end disc.replace = new_kern(krn) end -- cgit v1.2.3