diff options
Diffstat (limited to 'tex')
| -rw-r--r-- | tex/context/base/char-cmp.lua | 261 | ||||
| -rw-r--r-- | tex/context/base/char-def.lua | 2 | ||||
| -rw-r--r-- | tex/context/base/char-ini.lua | 79 | ||||
| -rw-r--r-- | tex/context/base/char-ini.mkiv | 12 | ||||
| -rw-r--r-- | tex/context/base/core-con.lua | 19 | ||||
| -rw-r--r-- | tex/context/base/core-fnt.mkiv | 7 | ||||
| -rw-r--r-- | tex/context/base/font-afm.lua | 243 | ||||
| -rw-r--r-- | tex/context/base/sort-ini.lua | 3 | ||||
| -rw-r--r-- | tex/context/base/status-files.pdf | bin | 23256 -> 23236 bytes | |||
| -rw-r--r-- | tex/context/base/syst-aux.mkiv | 20 | ||||
| -rw-r--r-- | tex/context/base/syst-lua.lua | 22 | ||||
| -rw-r--r-- | tex/context/base/typo-cap.lua | 49 | ||||
| -rw-r--r-- | tex/context/base/typo-cln.lua | 16 | ||||
| -rw-r--r-- | tex/context/base/typo-krn.lua | 12 | 
14 files changed, 352 insertions, 393 deletions
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-- -<p>The code defined here may move to the big character table.</p> ---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-- -<p>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).</p> ---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-- -<p>The following function is used in the indexing code, where we -need some sort of default fallback mapping. (This is obsolete!)</p> ---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-- -<p>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.</p> ---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-- -<p>Requesting lower and uppercase codes:</p> ---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-- +<p>Requesting lower and uppercase codes:</p> +--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.</p>  --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.</p>  --ldx]]-- -addligatures = function(afmdata,ligatures) +--[[ldx-- +<p>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.</p> +--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--  <p>We keep the extra kerns in separate kerning tables so that we can use  them selectively.</p>  --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 Binary files differindex 56441cb1e..e9fde1cd5 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf 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  | 
