diff options
author | Karl Berry <karl@freefriends.org> | 2013-06-23 23:38:05 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-06-23 23:38:05 +0000 |
commit | 60f28f85f2707b6a48c3b5aec0ea68b8ee21e466 (patch) | |
tree | ab34d8d573457bea6a804ee3d5de48dd500bf028 /Master/texmf-dist/tex/context/base | |
parent | ac5882d0cb115e11b5cc2e62107ef5822f3507f5 (diff) |
context
git-svn-id: svn://tug.org/texlive/trunk@30865 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base')
165 files changed, 10202 insertions, 6131 deletions
diff --git a/Master/texmf-dist/tex/context/base/char-def.lua b/Master/texmf-dist/tex/context/base/char-def.lua index 8580fb6990b..7d2df5d41e4 100644 --- a/Master/texmf-dist/tex/context/base/char-def.lua +++ b/Master/texmf-dist/tex/context/base/char-def.lua @@ -78726,6 +78726,8 @@ characters.data={ description="DOUBLE COLON EQUAL", direction="on", linebreak="al", + mathclass="relation", + mathname="coloncolonequals", specials={ "compat", 0x003A, 0x003A, 0x003D }, unicodeslot=0x2A74, }, diff --git a/Master/texmf-dist/tex/context/base/cldf-bas.lua b/Master/texmf-dist/tex/context/base/cldf-bas.lua index 298b374f045..6adeb227233 100644 --- a/Master/texmf-dist/tex/context/base/cldf-bas.lua +++ b/Master/texmf-dist/tex/context/base/cldf-bas.lua @@ -29,12 +29,16 @@ local format = string.format local utfchar = utf.char local concat = table.concat -local context = context -local generics = context.generics -local variables = interfaces.variables +local context = context +local generics = context.generics +local variables = interfaces.variables -local new_rule = nodes.pool.rule -local texcount = tex.count +local nodepool = nodes.pool +local new_rule = nodepool.rule +local new_glyph = nodepool.glyph + +local current_font = font.current +local texcount = tex.count function context.char(k) -- used as escape too, so don't change to utf if type(k) == "table" then @@ -72,7 +76,7 @@ function context.egroup() end function context.space() - context(" ") + context("\\space") -- no " " as that gets intercepted end function context.hrule(w,h,d,dir) @@ -83,6 +87,15 @@ function context.hrule(w,h,d,dir) end end +function context.glyph(id,k) + if id then + if not k then + id, k = current_font(), id + end + context(new_glyph(id,k)) + end +end + context.vrule = context.hrule --~ local hbox, bgroup, egroup = context.hbox, context.bgroup, context.egroup diff --git a/Master/texmf-dist/tex/context/base/colo-ini.lua b/Master/texmf-dist/tex/context/base/colo-ini.lua index 14873393216..b9e8eb203d6 100644 --- a/Master/texmf-dist/tex/context/base/colo-ini.lua +++ b/Master/texmf-dist/tex/context/base/colo-ini.lua @@ -39,8 +39,6 @@ local attributes_list = attributes.list local colorvalues = colors.values local transparencyvalues = transparencies.values -local texattribute = tex.attribute - colors.sets = colors.sets or { } -- sets are mostly used for local colorsets = colors.sets -- showing lists of defined local colorset = { } -- colors @@ -500,7 +498,7 @@ local function mpcolor(model,ca,ta,default) end local function mpnamedcolor(name) - return mpcolor(texattribute[a_colorspace],l_color[name] or l_color.black) + return mpcolor(gettexattribute(a_colorspace),l_color[name] or l_color.black) end local function mpoptions(model,ca,ta,default) -- will move to mlib-col diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkiv b/Master/texmf-dist/tex/context/base/cont-fil.mkiv index db7505bcbd3..8e9be155bfe 100644 --- a/Master/texmf-dist/tex/context/base/cont-fil.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-fil.mkiv @@ -81,6 +81,8 @@ %definefilesynonym [pre-more] [pre-29] %definefilesynonym [pre-more] [pre-30] +\definefilesynonym [pre-tiles] [pre-41] + \definefilesynonym [pre-stepwise] [pre-60] \definefilesynonym [pre-stepper] [pre-61] @@ -100,4 +102,19 @@ \definefilesynonym [memo] [cor-02] \definefilesynonym [resume] [cor-03] +% downward compatible mapping: + +\definefilesynonym [pre-41] [present-tiles] +\definefilesynonym [fnt-29] [fonts-shapes] +\definefilesynonym [fnt-33] [math-coverage] +\definefilesynonym [mat-12] [math-parameters] +\definefilesynonym [mat-20] [math-parameters] +\definefilesynonym [fnt-25] [math-characters] +\definefilesynonym [fnt-28] [fonts-goodies] +\definefilesynonym [fnt-31] [fonts-coverage] +\definefilesynonym [mat-10] [math-characters] +\definefilesynonym [mat-11] [math-characters] +\definefilesynonym [fnt-11] [fonts-system] +\definefilesynonym [fnt-23] [fonts-shapes] + \endinput diff --git a/Master/texmf-dist/tex/context/base/cont-new.mkiv b/Master/texmf-dist/tex/context/base/cont-new.mkiv index 5734855aebe..7f241e357aa 100644 --- a/Master/texmf-dist/tex/context/base/cont-new.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2013.04.20 01:15} +\newcontextversion{2013.05.28 00:36} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/Master/texmf-dist/tex/context/base/cont-new.tmp b/Master/texmf-dist/tex/context/base/cont-new.tmp index 4838c5219c8..5d4fcd60a0a 100644 --- a/Master/texmf-dist/tex/context/base/cont-new.tmp +++ b/Master/texmf-dist/tex/context/base/cont-new.tmp @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2013.04.20 01:08} +\newcontextversion{2013.05.28 00:34} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/Master/texmf-dist/tex/context/base/context-version.pdf b/Master/texmf-dist/tex/context/base/context-version.pdf Binary files differindex a91d22aaa6b..1c70a39fc64 100644 --- a/Master/texmf-dist/tex/context/base/context-version.pdf +++ b/Master/texmf-dist/tex/context/base/context-version.pdf diff --git a/Master/texmf-dist/tex/context/base/context-version.png b/Master/texmf-dist/tex/context/base/context-version.png Binary files differindex d3ced9ec12b..67edf8a5340 100644 --- a/Master/texmf-dist/tex/context/base/context-version.png +++ b/Master/texmf-dist/tex/context/base/context-version.png diff --git a/Master/texmf-dist/tex/context/base/context.mkiv b/Master/texmf-dist/tex/context/base/context.mkiv index 9945f2a15b7..eaa4311228a 100644 --- a/Master/texmf-dist/tex/context/base/context.mkiv +++ b/Master/texmf-dist/tex/context/base/context.mkiv @@ -25,7 +25,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2013.04.20 01:15} +\edef\contextversion{2013.05.28 00:36} \edef\contextkind {current} %D For those who want to use this: @@ -198,7 +198,6 @@ \loadmarkfile{lang-mis} \loadmarkfile{lang-url} \loadmarkfile{lang-def} -\loadmarkfile{lang-wrd} % can be optional \loadmkvifile{file-job} % why so late? @@ -392,6 +391,9 @@ \loadmarkfile{scrp-ini} +\loadmarkfile{lang-wrd} % can be optional (discussion with mm sideeffect) +%loadmarkfile{lang-rep} % can be optional (bt 2013 side effect) + \loadmarkfile{prop-ini} % only for downward compatibility \loadmarkfile{mlib-ctx} diff --git a/Master/texmf-dist/tex/context/base/context.tmp b/Master/texmf-dist/tex/context/base/context.tmp index 144f265ae50..7976b46413b 100644 --- a/Master/texmf-dist/tex/context/base/context.tmp +++ b/Master/texmf-dist/tex/context/base/context.tmp @@ -25,7 +25,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2013.04.20 01:08} +\edef\contextversion{2013.05.28 00:34} \edef\contextkind {beta} %D For those who want to use this: @@ -198,7 +198,6 @@ \loadmarkfile{lang-mis} \loadmarkfile{lang-url} \loadmarkfile{lang-def} -\loadmarkfile{lang-wrd} % can be optional \loadmkvifile{file-job} % why so late? @@ -392,6 +391,9 @@ \loadmarkfile{scrp-ini} +\loadmarkfile{lang-wrd} % can be optional (discussion with mm sideeffect) +%loadmarkfile{lang-rep} % can be optional (bt 2013 side effect) + \loadmarkfile{prop-ini} % only for downward compatibility \loadmarkfile{mlib-ctx} diff --git a/Master/texmf-dist/tex/context/base/data-con.lua b/Master/texmf-dist/tex/context/base/data-con.lua index 354c6807d9f..240538df2db 100644 --- a/Master/texmf-dist/tex/context/base/data-con.lua +++ b/Master/texmf-dist/tex/context/base/data-con.lua @@ -74,11 +74,11 @@ function containers.define(category, subcategory, version, enabled) end end -function containers.is_usable(container, name) +function containers.is_usable(container,name) return container.enabled and caches and caches.is_writable(container.writable, name) end -function containers.is_valid(container, name) +function containers.is_valid(container,name) if name and name ~= "" then local storage = container.storage[name] return storage and storage.cache_version == container.version @@ -133,5 +133,6 @@ function containers.content(container,name) end function containers.cleanname(name) - return (gsub(lower(name),"[^%w%d]+","-")) + -- return (gsub(lower(name),"[^%w]+","-")) + return (gsub(lower(name),"[^%w\128-\255]+","-")) -- more utf friendly end diff --git a/Master/texmf-dist/tex/context/base/file-mod.mkvi b/Master/texmf-dist/tex/context/base/file-mod.mkvi index 92b8a895940..0dbd14bdbe9 100644 --- a/Master/texmf-dist/tex/context/base/file-mod.mkvi +++ b/Master/texmf-dist/tex/context/base/file-mod.mkvi @@ -238,6 +238,52 @@ \unexpanded\def\doifolderversionelse#parent#child{\ctxcommand{doifolderversionelse("#parent","#child")}} \unexpanded\def\doifoldercontextelse #child{\ctxcommand{doifolderversionelse("#child")}} +%D Relatively new: + +\unexpanded\def\syst_modules_direct_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function()}% + \directsetup{module:\m_module_command_command:stop}} + +\unexpanded\def\syst_modules_single_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \dosingleempty\syst_modules_single_lua_indeed} + +\unexpanded\def\syst_modules_single_lua_indeed[#1]% + {\directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function(\!!bs#1\!!es)}% + \directsetup{module:\m_module_command_command:stop}} + +\unexpanded\def\syst_modules_double_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \dodoubleempty\syst_modules_double_lua_indeed} + +\unexpanded\def\syst_modules_double_lua_indeed[#1][#2]% + {\directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function(\!!bs#1\!!es,\!!bs#2\!!es)}% + \directsetup{module:\m_module_command_command:stop}} + +\def\installmodulecommandlua #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_direct_lua{\strippedcsname#1}{#2}}}} +\def\installmodulecommandluasingle#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_single_lua{\strippedcsname#1}{#2}}}} +\def\installmodulecommandluadouble#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_double_lua{\strippedcsname#1}{#2}}}} + +\unexpanded\def\syst_modules_one_lua#1#2#3% + {\directsetup{module:#1:start}% + \ctxlua{#2(\!!bs#3\!!es)}% + \directsetup{module:#1:stop}} + +\unexpanded\def\syst_modules_two_lua#1#2#3#4% + {\directsetup{module:#1:start}% + \ctxlua{#2(\!!bs#3\!!es,\!!bs#4\!!es)}% + \directsetup{module:#1:stop}} + +\def\installmodulecommandluaone #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_one_lua {\strippedcsname#1}{#2}}}} +\def\installmodulecommandluatwo #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_two_lua {\strippedcsname#1}{#2}}}} + % obsolete % % \def\documentresources{\@@erurl} diff --git a/Master/texmf-dist/tex/context/base/font-age.lua b/Master/texmf-dist/tex/context/base/font-age.lua index ba8f0bb0b84..bb6883a7470 100644 --- a/Master/texmf-dist/tex/context/base/font-age.lua +++ b/Master/texmf-dist/tex/context/base/font-age.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-age'] = { version = 1.001, - comment = "companion to font-gee.lua", + comment = "companion to luatex-fonts.lua", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", original = "Adobe Glyph List, version 2.0, September 20, 2002", @@ -12,3734 +12,4104 @@ if context then os.exit() end -return { -- generated - ["A"]=65, - ["AE"]=198, - ["AEacute"]=508, - ["AEmacron"]=482, - ["Aacute"]=193, - ["Abreve"]=258, - ["Abreveacute"]=7854, - ["Abrevecyrillic"]=1232, - ["Abrevedotbelow"]=7862, - ["Abrevegrave"]=7856, - ["Abrevehookabove"]=7858, - ["Abrevetilde"]=7860, - ["Acaron"]=461, - ["Acircle"]=9398, - ["Acircumflex"]=194, - ["Acircumflexacute"]=7844, - ["Acircumflexdotbelow"]=7852, - ["Acircumflexgrave"]=7846, - ["Acircumflexhookabove"]=7848, - ["Acircumflextilde"]=7850, - ["Adblgrave"]=512, - ["Adieresis"]=196, - ["Adieresiscyrillic"]=1234, - ["Adieresismacron"]=478, - ["Adotbelow"]=7840, - ["Adotmacron"]=480, - ["Agrave"]=192, - ["Ahookabove"]=7842, - ["Aiecyrillic"]=1236, - ["Ainvertedbreve"]=514, - ["Alpha"]=913, - ["Alphatonos"]=902, - ["Amacron"]=256, - ["Amonospace"]=65313, - ["Aogonek"]=260, - ["Aring"]=197, - ["Aringacute"]=506, - ["Aringbelow"]=7680, - ["Atilde"]=195, - ["Aybarmenian"]=1329, - ["B"]=66, - ["Bcircle"]=9399, - ["Bdotaccent"]=7682, - ["Bdotbelow"]=7684, - ["Benarmenian"]=1330, - ["Beta"]=914, - ["Bhook"]=385, - ["Blinebelow"]=7686, - ["Bmonospace"]=65314, - ["Btopbar"]=386, - ["C"]=67, - ["Caarmenian"]=1342, - ["Cacute"]=262, - ["Ccaron"]=268, - ["Ccedilla"]=199, - ["Ccedillaacute"]=7688, - ["Ccircle"]=9400, - ["Ccircumflex"]=264, - ["Cdotaccent"]=266, - ["Chaarmenian"]=1353, - ["Cheabkhasiancyrillic"]=1212, - ["Chedescenderabkhasiancyrillic"]=1214, - ["Chedescendercyrillic"]=1206, - ["Chedieresiscyrillic"]=1268, - ["Cheharmenian"]=1347, - ["Chekhakassiancyrillic"]=1227, - ["Cheverticalstrokecyrillic"]=1208, - ["Chi"]=935, - ["Chook"]=391, - ["Cmonospace"]=65315, - ["Coarmenian"]=1361, - ["D"]=68, - ["DZ"]=497, - ["DZcaron"]=452, - ["Daarmenian"]=1332, - ["Dafrican"]=393, - ["Dcaron"]=270, - ["Dcedilla"]=7696, - ["Dcircle"]=9401, - ["Dcircumflexbelow"]=7698, - ["Ddotaccent"]=7690, - ["Ddotbelow"]=7692, - ["Deicoptic"]=1006, - ["Deltagreek"]=916, - ["Dhook"]=394, - ["Digammagreek"]=988, - ["Dlinebelow"]=7694, - ["Dmonospace"]=65316, - ["Dslash"]=272, - ["Dtopbar"]=395, - ["Dz"]=498, - ["Dzcaron"]=453, - ["Dzeabkhasiancyrillic"]=1248, - ["E"]=69, - ["Eacute"]=201, - ["Ebreve"]=276, - ["Ecaron"]=282, - ["Ecedillabreve"]=7708, - ["Echarmenian"]=1333, - ["Ecircle"]=9402, - ["Ecircumflex"]=202, - ["Ecircumflexacute"]=7870, - ["Ecircumflexbelow"]=7704, - ["Ecircumflexdotbelow"]=7878, - ["Ecircumflexgrave"]=7872, - ["Ecircumflexhookabove"]=7874, - ["Ecircumflextilde"]=7876, - ["Edblgrave"]=516, - ["Edieresis"]=203, - ["Edotaccent"]=278, - ["Edotbelow"]=7864, - ["Egrave"]=200, - ["Eharmenian"]=1335, - ["Ehookabove"]=7866, - ["Eightroman"]=8551, - ["Einvertedbreve"]=518, - ["Eiotifiedcyrillic"]=1124, - ["Elevenroman"]=8554, - ["Emacron"]=274, - ["Emacronacute"]=7702, - ["Emacrongrave"]=7700, - ["Emonospace"]=65317, - ["Endescendercyrillic"]=1186, - ["Eng"]=330, - ["Enghecyrillic"]=1188, - ["Enhookcyrillic"]=1223, - ["Eogonek"]=280, - ["Eopen"]=400, - ["Epsilon"]=917, - ["Epsilontonos"]=904, - ["Ereversed"]=398, - ["Esdescendercyrillic"]=1194, - ["Esh"]=425, - ["Eta"]=919, - ["Etarmenian"]=1336, - ["Etatonos"]=905, - ["Eth"]=208, - ["Etilde"]=7868, - ["Etildebelow"]=7706, - ["Ezh"]=439, - ["Ezhcaron"]=494, - ["Ezhreversed"]=440, - ["F"]=70, - ["Fcircle"]=9403, - ["Fdotaccent"]=7710, - ["Feharmenian"]=1366, - ["Feicoptic"]=996, - ["Fhook"]=401, - ["Fiveroman"]=8548, - ["Fmonospace"]=65318, - ["Fourroman"]=8547, - ["G"]=71, - ["GBsquare"]=13191, - ["Gacute"]=500, - ["Gamma"]=915, - ["Gammaafrican"]=404, - ["Gangiacoptic"]=1002, - ["Gbreve"]=286, - ["Gcaron"]=486, - ["Gcircle"]=9404, - ["Gcircumflex"]=284, - ["Gcommaaccent"]=290, - ["Gdotaccent"]=288, - ["Ghadarmenian"]=1346, - ["Ghemiddlehookcyrillic"]=1172, - ["Ghestrokecyrillic"]=1170, - ["Ghook"]=403, - ["Gimarmenian"]=1331, - ["Gmacron"]=7712, - ["Gmonospace"]=65319, - ["Gsmallhook"]=667, - ["Gstroke"]=484, - ["H"]=72, - ["HPsquare"]=13259, - ["Haabkhasiancyrillic"]=1192, - ["Hadescendercyrillic"]=1202, - ["Hbar"]=294, - ["Hbrevebelow"]=7722, - ["Hcedilla"]=7720, - ["Hcircle"]=9405, - ["Hcircumflex"]=292, - ["Hdieresis"]=7718, - ["Hdotaccent"]=7714, - ["Hdotbelow"]=7716, - ["Hmonospace"]=65320, - ["Hoarmenian"]=1344, - ["Horicoptic"]=1000, - ["Hzsquare"]=13200, - ["I"]=73, - ["IJ"]=306, - ["Iacute"]=205, - ["Ibreve"]=300, - ["Icaron"]=463, - ["Icircle"]=9406, - ["Icircumflex"]=206, - ["Idblgrave"]=520, - ["Idieresis"]=207, - ["Idieresisacute"]=7726, - ["Idieresiscyrillic"]=1252, - ["Idotaccent"]=304, - ["Idotbelow"]=7882, - ["Iebrevecyrillic"]=1238, - ["Ifraktur"]=8465, - ["Igrave"]=204, - ["Ihookabove"]=7880, - ["Iinvertedbreve"]=522, - ["Imacron"]=298, - ["Imacroncyrillic"]=1250, - ["Imonospace"]=65321, - ["Iniarmenian"]=1339, - ["Iogonek"]=302, - ["Iota"]=921, - ["Iotaafrican"]=406, - ["Iotadieresis"]=938, - ["Iotatonos"]=906, - ["Istroke"]=407, - ["Itilde"]=296, - ["Itildebelow"]=7724, - ["Izhitsadblgravecyrillic"]=1142, - ["J"]=74, - ["Jaarmenian"]=1345, - ["Jcircle"]=9407, - ["Jcircumflex"]=308, - ["Jheharmenian"]=1355, - ["Jmonospace"]=65322, - ["K"]=75, - ["KBsquare"]=13189, - ["KKsquare"]=13261, - ["Kabashkircyrillic"]=1184, - ["Kacute"]=7728, - ["Kadescendercyrillic"]=1178, - ["Kahookcyrillic"]=1219, - ["Kappa"]=922, - ["Kastrokecyrillic"]=1182, - ["Kaverticalstrokecyrillic"]=1180, - ["Kcaron"]=488, - ["Kcircle"]=9408, - ["Kcommaaccent"]=310, - ["Kdotbelow"]=7730, - ["Keharmenian"]=1364, - ["Kenarmenian"]=1343, - ["Kheicoptic"]=998, - ["Khook"]=408, - ["Klinebelow"]=7732, - ["Kmonospace"]=65323, - ["Koppacyrillic"]=1152, - ["Koppagreek"]=990, - ["Ksicyrillic"]=1134, - ["L"]=76, - ["LJ"]=455, - ["Lacute"]=313, - ["Lambda"]=923, - ["Lcaron"]=317, - ["Lcircle"]=9409, - ["Lcircumflexbelow"]=7740, - ["Lcommaaccent"]=315, - ["Ldotaccent"]=319, - ["Ldotbelow"]=7734, - ["Ldotbelowmacron"]=7736, - ["Liwnarmenian"]=1340, - ["Lj"]=456, - ["Llinebelow"]=7738, - ["Lmonospace"]=65324, - ["Lslash"]=321, - ["M"]=77, - ["MBsquare"]=13190, - ["Macute"]=7742, - ["Mcircle"]=9410, - ["Mdotaccent"]=7744, - ["Mdotbelow"]=7746, - ["Menarmenian"]=1348, - ["Mmonospace"]=65325, - ["Mturned"]=412, - ["Mu"]=924, - ["N"]=78, - ["NJ"]=458, - ["Nacute"]=323, - ["Ncaron"]=327, - ["Ncircle"]=9411, - ["Ncircumflexbelow"]=7754, - ["Ncommaaccent"]=325, - ["Ndotaccent"]=7748, - ["Ndotbelow"]=7750, - ["Nhookleft"]=413, - ["Nineroman"]=8552, - ["Nj"]=459, - ["Nlinebelow"]=7752, - ["Nmonospace"]=65326, - ["Nowarmenian"]=1350, - ["Ntilde"]=209, - ["Nu"]=925, - ["O"]=79, - ["OE"]=338, - ["Oacute"]=211, - ["Obarredcyrillic"]=1256, - ["Obarreddieresiscyrillic"]=1258, - ["Obreve"]=334, - ["Ocaron"]=465, - ["Ocenteredtilde"]=415, - ["Ocircle"]=9412, - ["Ocircumflex"]=212, - ["Ocircumflexacute"]=7888, - ["Ocircumflexdotbelow"]=7896, - ["Ocircumflexgrave"]=7890, - ["Ocircumflexhookabove"]=7892, - ["Ocircumflextilde"]=7894, - ["Odblgrave"]=524, - ["Odieresis"]=214, - ["Odieresiscyrillic"]=1254, - ["Odotbelow"]=7884, - ["Ograve"]=210, - ["Oharmenian"]=1365, - ["Ohookabove"]=7886, - ["Ohorn"]=416, - ["Ohornacute"]=7898, - ["Ohorndotbelow"]=7906, - ["Ohorngrave"]=7900, - ["Ohornhookabove"]=7902, - ["Ohorntilde"]=7904, - ["Ohungarumlaut"]=336, - ["Oi"]=418, - ["Oinvertedbreve"]=526, - ["Omacron"]=332, - ["Omacronacute"]=7762, - ["Omacrongrave"]=7760, - ["Omega"]=8486, - ["Omegacyrillic"]=1120, - ["Omegagreek"]=937, - ["Omegaroundcyrillic"]=1146, - ["Omegatitlocyrillic"]=1148, - ["Omegatonos"]=911, - ["Omicron"]=927, - ["Omicrontonos"]=908, - ["Omonospace"]=65327, - ["Oneroman"]=8544, - ["Oogonek"]=490, - ["Oogonekmacron"]=492, - ["Oopen"]=390, - ["Oslash"]=216, - ["Ostrokeacute"]=510, - ["Otcyrillic"]=1150, - ["Otilde"]=213, - ["Otildeacute"]=7756, - ["Otildedieresis"]=7758, - ["P"]=80, - ["Pacute"]=7764, - ["Pcircle"]=9413, - ["Pdotaccent"]=7766, - ["Peharmenian"]=1354, - ["Pemiddlehookcyrillic"]=1190, - ["Phi"]=934, - ["Phook"]=420, - ["Pi"]=928, - ["Piwrarmenian"]=1363, - ["Pmonospace"]=65328, - ["Psi"]=936, - ["Psicyrillic"]=1136, - ["Q"]=81, - ["Qcircle"]=9414, - ["Qmonospace"]=65329, - ["R"]=82, - ["Raarmenian"]=1356, - ["Racute"]=340, - ["Rcaron"]=344, - ["Rcircle"]=9415, - ["Rcommaaccent"]=342, - ["Rdblgrave"]=528, - ["Rdotaccent"]=7768, - ["Rdotbelow"]=7770, - ["Rdotbelowmacron"]=7772, - ["Reharmenian"]=1360, - ["Rfraktur"]=8476, - ["Rho"]=929, - ["Rinvertedbreve"]=530, - ["Rlinebelow"]=7774, - ["Rmonospace"]=65330, - ["Rsmallinverted"]=641, - ["Rsmallinvertedsuperior"]=694, - ["S"]=83, - ["SF010000"]=9484, - ["SF020000"]=9492, - ["SF030000"]=9488, - ["SF040000"]=9496, - ["SF050000"]=9532, - ["SF060000"]=9516, - ["SF070000"]=9524, - ["SF080000"]=9500, - ["SF090000"]=9508, - ["SF100000"]=9472, - ["SF110000"]=9474, - ["SF190000"]=9569, - ["SF200000"]=9570, - ["SF210000"]=9558, - ["SF220000"]=9557, - ["SF230000"]=9571, - ["SF240000"]=9553, - ["SF250000"]=9559, - ["SF260000"]=9565, - ["SF270000"]=9564, - ["SF280000"]=9563, - ["SF360000"]=9566, - ["SF370000"]=9567, - ["SF380000"]=9562, - ["SF390000"]=9556, - ["SF400000"]=9577, - ["SF410000"]=9574, - ["SF420000"]=9568, - ["SF430000"]=9552, - ["SF440000"]=9580, - ["SF450000"]=9575, - ["SF460000"]=9576, - ["SF470000"]=9572, - ["SF480000"]=9573, - ["SF490000"]=9561, - ["SF500000"]=9560, - ["SF510000"]=9554, - ["SF520000"]=9555, - ["SF530000"]=9579, - ["SF540000"]=9578, - ["Sacute"]=346, - ["Sacutedotaccent"]=7780, - ["Sampigreek"]=992, - ["Scaron"]=352, - ["Scarondotaccent"]=7782, - ["Scedilla"]=350, - ["Schwa"]=399, - ["Schwacyrillic"]=1240, - ["Schwadieresiscyrillic"]=1242, - ["Scircle"]=9416, - ["Scircumflex"]=348, - ["Scommaaccent"]=536, - ["Sdotaccent"]=7776, - ["Sdotbelow"]=7778, - ["Sdotbelowdotaccent"]=7784, - ["Seharmenian"]=1357, - ["Sevenroman"]=8550, - ["Shaarmenian"]=1351, - ["Sheicoptic"]=994, - ["Shhacyrillic"]=1210, - ["Shimacoptic"]=1004, - ["Sigma"]=931, - ["Sixroman"]=8549, - ["Smonospace"]=65331, - ["Stigmagreek"]=986, - ["T"]=84, - ["Tau"]=932, - ["Tbar"]=358, - ["Tcaron"]=356, - ["Tcircle"]=9417, - ["Tcircumflexbelow"]=7792, - ["Tcommaaccent"]=354, - ["Tdotaccent"]=7786, - ["Tdotbelow"]=7788, - ["Tedescendercyrillic"]=1196, - ["Tenroman"]=8553, - ["Tetsecyrillic"]=1204, - ["Theta"]=920, - ["Thook"]=428, - ["Thorn"]=222, - ["Threeroman"]=8546, - ["Tiwnarmenian"]=1359, - ["Tlinebelow"]=7790, - ["Tmonospace"]=65332, - ["Toarmenian"]=1337, - ["Tonefive"]=444, - ["Tonesix"]=388, - ["Tonetwo"]=423, - ["Tretroflexhook"]=430, - ["Twelveroman"]=8555, - ["Tworoman"]=8545, - ["U"]=85, - ["Uacute"]=218, - ["Ubreve"]=364, - ["Ucaron"]=467, - ["Ucircle"]=9418, - ["Ucircumflex"]=219, - ["Ucircumflexbelow"]=7798, - ["Udblgrave"]=532, - ["Udieresis"]=220, - ["Udieresisacute"]=471, - ["Udieresisbelow"]=7794, - ["Udieresiscaron"]=473, - ["Udieresiscyrillic"]=1264, - ["Udieresisgrave"]=475, - ["Udieresismacron"]=469, - ["Udotbelow"]=7908, - ["Ugrave"]=217, - ["Uhookabove"]=7910, - ["Uhorn"]=431, - ["Uhornacute"]=7912, - ["Uhorndotbelow"]=7920, - ["Uhorngrave"]=7914, - ["Uhornhookabove"]=7916, - ["Uhorntilde"]=7918, - ["Uhungarumlaut"]=368, - ["Uhungarumlautcyrillic"]=1266, - ["Uinvertedbreve"]=534, - ["Ukcyrillic"]=1144, - ["Umacron"]=362, - ["Umacroncyrillic"]=1262, - ["Umacrondieresis"]=7802, - ["Umonospace"]=65333, - ["Uogonek"]=370, - ["Upsilon"]=933, - ["Upsilonacutehooksymbolgreek"]=979, - ["Upsilonafrican"]=433, - ["Upsilondieresis"]=939, - ["Upsilondieresishooksymbolgreek"]=980, - ["Upsilonhooksymbol"]=978, - ["Upsilontonos"]=910, - ["Uring"]=366, - ["Ustraightcyrillic"]=1198, - ["Ustraightstrokecyrillic"]=1200, - ["Utilde"]=360, - ["Utildeacute"]=7800, - ["Utildebelow"]=7796, - ["V"]=86, - ["Vcircle"]=9419, - ["Vdotbelow"]=7806, - ["Vewarmenian"]=1358, - ["Vhook"]=434, - ["Vmonospace"]=65334, - ["Voarmenian"]=1352, - ["Vtilde"]=7804, - ["W"]=87, - ["Wacute"]=7810, - ["Wcircle"]=9420, - ["Wcircumflex"]=372, - ["Wdieresis"]=7812, - ["Wdotaccent"]=7814, - ["Wdotbelow"]=7816, - ["Wgrave"]=7808, - ["Wmonospace"]=65335, - ["X"]=88, - ["Xcircle"]=9421, - ["Xdieresis"]=7820, - ["Xdotaccent"]=7818, - ["Xeharmenian"]=1341, - ["Xi"]=926, - ["Xmonospace"]=65336, - ["Y"]=89, - ["Yacute"]=221, - ["Ycircle"]=9422, - ["Ycircumflex"]=374, - ["Ydieresis"]=376, - ["Ydotaccent"]=7822, - ["Ydotbelow"]=7924, - ["Yerudieresiscyrillic"]=1272, - ["Ygrave"]=7922, - ["Yhook"]=435, - ["Yhookabove"]=7926, - ["Yiarmenian"]=1349, - ["Yiwnarmenian"]=1362, - ["Ymonospace"]=65337, - ["Ytilde"]=7928, - ["Yusbigcyrillic"]=1130, - ["Yusbigiotifiedcyrillic"]=1132, - ["Yuslittlecyrillic"]=1126, - ["Yuslittleiotifiedcyrillic"]=1128, - ["Z"]=90, - ["Zaarmenian"]=1334, - ["Zacute"]=377, - ["Zcaron"]=381, - ["Zcircle"]=9423, - ["Zcircumflex"]=7824, - ["Zdotaccent"]=379, - ["Zdotbelow"]=7826, - ["Zedescendercyrillic"]=1176, - ["Zedieresiscyrillic"]=1246, - ["Zeta"]=918, - ["Zhearmenian"]=1338, - ["Zhebrevecyrillic"]=1217, - ["Zhedescendercyrillic"]=1174, - ["Zhedieresiscyrillic"]=1244, - ["Zlinebelow"]=7828, - ["Zmonospace"]=65338, - ["Zstroke"]=437, - ["a"]=97, - ["aabengali"]=2438, - ["aacute"]=225, - ["aadeva"]=2310, - ["aagujarati"]=2694, - ["aagurmukhi"]=2566, - ["aamatragurmukhi"]=2622, - ["aarusquare"]=13059, - ["aavowelsignbengali"]=2494, - ["aavowelsigndeva"]=2366, - ["aavowelsigngujarati"]=2750, - ["abbreviationmarkarmenian"]=1375, - ["abbreviationsigndeva"]=2416, - ["abengali"]=2437, - ["abopomofo"]=12570, - ["abreve"]=259, - ["abreveacute"]=7855, - ["abrevecyrillic"]=1233, - ["abrevedotbelow"]=7863, - ["abrevegrave"]=7857, - ["abrevehookabove"]=7859, - ["abrevetilde"]=7861, - ["acaron"]=462, - ["acircle"]=9424, - ["acircumflex"]=226, - ["acircumflexacute"]=7845, - ["acircumflexdotbelow"]=7853, - ["acircumflexgrave"]=7847, - ["acircumflexhookabove"]=7849, - ["acircumflextilde"]=7851, - ["acute"]=180, - ["acutebelowcmb"]=791, - ["acutecomb"]=769, - ["acutedeva"]=2388, - ["acutelowmod"]=719, - ["acutetonecmb"]=833, - ["adblgrave"]=513, - ["addakgurmukhi"]=2673, - ["adeva"]=2309, - ["adieresis"]=228, - ["adieresiscyrillic"]=1235, - ["adieresismacron"]=479, - ["adotbelow"]=7841, - ["adotmacron"]=481, - ["ae"]=230, - ["aeacute"]=509, - ["aekorean"]=12624, - ["aemacron"]=483, - ["afii10017"]=1040, - ["afii10018"]=1041, - ["afii10019"]=1042, - ["afii10020"]=1043, - ["afii10021"]=1044, - ["afii10022"]=1045, - ["afii10023"]=1025, - ["afii10024"]=1046, - ["afii10025"]=1047, - ["afii10026"]=1048, - ["afii10027"]=1049, - ["afii10028"]=1050, - ["afii10029"]=1051, - ["afii10030"]=1052, - ["afii10031"]=1053, - ["afii10032"]=1054, - ["afii10033"]=1055, - ["afii10034"]=1056, - ["afii10035"]=1057, - ["afii10036"]=1058, - ["afii10037"]=1059, - ["afii10038"]=1060, - ["afii10039"]=1061, - ["afii10040"]=1062, - ["afii10041"]=1063, - ["afii10042"]=1064, - ["afii10043"]=1065, - ["afii10044"]=1066, - ["afii10045"]=1067, - ["afii10046"]=1068, - ["afii10047"]=1069, - ["afii10048"]=1070, - ["afii10049"]=1071, - ["afii10050"]=1168, - ["afii10051"]=1026, - ["afii10052"]=1027, - ["afii10053"]=1028, - ["afii10054"]=1029, - ["afii10055"]=1030, - ["afii10056"]=1031, - ["afii10057"]=1032, - ["afii10058"]=1033, - ["afii10059"]=1034, - ["afii10060"]=1035, - ["afii10061"]=1036, - ["afii10062"]=1038, - ["afii10065"]=1072, - ["afii10145"]=1039, - ["afii10146"]=1122, - ["afii10147"]=1138, - ["afii10148"]=1140, - ["afii299"]=8206, - ["afii300"]=8207, - ["afii301"]=8205, - ["afii57534"]=1749, - ["afii61573"]=8236, - ["afii61574"]=8237, - ["afii61575"]=8238, - ["agrave"]=224, - ["agujarati"]=2693, - ["agurmukhi"]=2565, - ["ahiragana"]=12354, - ["ahookabove"]=7843, - ["aibengali"]=2448, - ["aibopomofo"]=12574, - ["aideva"]=2320, - ["aiecyrillic"]=1237, - ["aigujarati"]=2704, - ["aigurmukhi"]=2576, - ["aimatragurmukhi"]=2632, - ["ainarabic"]=1593, - ["ainfinalarabic"]=65226, - ["aininitialarabic"]=65227, - ["ainmedialarabic"]=65228, - ["ainvertedbreve"]=515, - ["aivowelsignbengali"]=2504, - ["aivowelsigndeva"]=2376, - ["aivowelsigngujarati"]=2760, - ["akatakana"]=12450, - ["akatakanahalfwidth"]=65393, - ["akorean"]=12623, - ["alefarabic"]=1575, - ["alefdageshhebrew"]=64304, - ["aleffinalarabic"]=65166, - ["alefhamzaabovearabic"]=1571, - ["alefhamzaabovefinalarabic"]=65156, - ["alefhamzabelowarabic"]=1573, - ["alefhamzabelowfinalarabic"]=65160, - ["alefhebrew"]=1488, - ["aleflamedhebrew"]=64335, - ["alefmaddaabovearabic"]=1570, - ["alefmaddaabovefinalarabic"]=65154, - ["alefmaksuraarabic"]=1609, - ["alefmaksurafinalarabic"]=65264, - ["alefpatahhebrew"]=64302, - ["alefqamatshebrew"]=64303, - ["aleph"]=8501, - ["allequal"]=8780, - ["alpha"]=945, - ["alphatonos"]=940, - ["amacron"]=257, - ["amonospace"]=65345, - ["ampersand"]=38, - ["ampersandmonospace"]=65286, - ["amsquare"]=13250, - ["anbopomofo"]=12578, - ["angbopomofo"]=12580, - ["angkhankhuthai"]=3674, - ["angle"]=8736, - ["anglebracketleft"]=12296, - ["anglebracketleftvertical"]=65087, - ["anglebracketright"]=12297, - ["anglebracketrightvertical"]=65088, - ["angleleft"]=9001, - ["angleright"]=9002, - ["angstrom"]=8491, - ["anoteleia"]=903, - ["anudattadeva"]=2386, - ["anusvarabengali"]=2434, - ["anusvaradeva"]=2306, - ["anusvaragujarati"]=2690, - ["aogonek"]=261, - ["apaatosquare"]=13056, - ["aparen"]=9372, - ["apostrophearmenian"]=1370, - ["apostrophemod"]=700, - ["apple"]=63743, - ["approaches"]=8784, - ["approxequal"]=8776, - ["approxequalorimage"]=8786, - ["araeaekorean"]=12686, - ["araeakorean"]=12685, - ["arc"]=8978, - ["arighthalfring"]=7834, - ["aring"]=229, - ["aringacute"]=507, - ["aringbelow"]=7681, - ["arrowboth"]=8596, - ["arrowdashdown"]=8675, - ["arrowdashleft"]=8672, - ["arrowdashright"]=8674, - ["arrowdashup"]=8673, - ["arrowdbldown"]=8659, - ["arrowdblup"]=8657, - ["arrowdown"]=8595, - ["arrowdownleft"]=8601, - ["arrowdownright"]=8600, - ["arrowdownwhite"]=8681, - ["arrowheaddownmod"]=709, - ["arrowheadleftmod"]=706, - ["arrowheadrightmod"]=707, - ["arrowheadupmod"]=708, - ["arrowleft"]=8592, - ["arrowleftdbl"]=8656, - ["arrowleftdblstroke"]=8653, - ["arrowleftoverright"]=8646, - ["arrowleftwhite"]=8678, - ["arrowright"]=8594, - ["arrowrightdblstroke"]=8655, - ["arrowrightheavy"]=10142, - ["arrowrightoverleft"]=8644, - ["arrowrightwhite"]=8680, - ["arrowtableft"]=8676, - ["arrowtabright"]=8677, - ["arrowup"]=8593, - ["arrowupdn"]=8597, - ["arrowupdownbase"]=8616, - ["arrowupleft"]=8598, - ["arrowupleftofdown"]=8645, - ["arrowupright"]=8599, - ["arrowupwhite"]=8679, - ["asciicircum"]=94, - ["asciicircummonospace"]=65342, - ["asciitilde"]=126, - ["asciitildemonospace"]=65374, - ["ascript"]=593, - ["ascriptturned"]=594, - ["asmallhiragana"]=12353, - ["asmallkatakana"]=12449, - ["asmallkatakanahalfwidth"]=65383, - ["asterisk"]=42, - ["asteriskarabic"]=1645, - ["asteriskmath"]=8727, - ["asteriskmonospace"]=65290, - ["asterisksmall"]=65121, - ["asterism"]=8258, - ["asymptoticallyequal"]=8771, - ["at"]=64, - ["atilde"]=227, - ["atmonospace"]=65312, - ["atsmall"]=65131, - ["aturned"]=592, - ["aubengali"]=2452, - ["aubopomofo"]=12576, - ["audeva"]=2324, - ["augujarati"]=2708, - ["augurmukhi"]=2580, - ["aulengthmarkbengali"]=2519, - ["aumatragurmukhi"]=2636, - ["auvowelsignbengali"]=2508, - ["auvowelsigndeva"]=2380, - ["auvowelsigngujarati"]=2764, - ["avagrahadeva"]=2365, - ["aybarmenian"]=1377, - ["ayinaltonehebrew"]=64288, - ["ayinhebrew"]=1506, - ["b"]=98, - ["babengali"]=2476, - ["backslash"]=92, - ["backslashmonospace"]=65340, - ["badeva"]=2348, - ["bagujarati"]=2732, - ["bagurmukhi"]=2604, - ["bahiragana"]=12400, - ["bahtthai"]=3647, - ["bakatakana"]=12496, - ["barmonospace"]=65372, - ["bbopomofo"]=12549, - ["bcircle"]=9425, - ["bdotaccent"]=7683, - ["bdotbelow"]=7685, - ["beamedsixteenthnotes"]=9836, - ["because"]=8757, - ["becyrillic"]=1073, - ["beharabic"]=1576, - ["behfinalarabic"]=65168, - ["behinitialarabic"]=65169, - ["behiragana"]=12409, - ["behmedialarabic"]=65170, - ["behmeeminitialarabic"]=64671, - ["behmeemisolatedarabic"]=64520, - ["behnoonfinalarabic"]=64621, - ["bekatakana"]=12505, - ["benarmenian"]=1378, - ["beta"]=946, - ["betasymbolgreek"]=976, - ["betdageshhebrew"]=64305, - ["bethebrew"]=1489, - ["betrafehebrew"]=64332, - ["bhabengali"]=2477, - ["bhadeva"]=2349, - ["bhagujarati"]=2733, - ["bhagurmukhi"]=2605, - ["bhook"]=595, - ["bihiragana"]=12403, - ["bikatakana"]=12499, - ["bilabialclick"]=664, - ["bindigurmukhi"]=2562, - ["birusquare"]=13105, - ["blackcircle"]=9679, - ["blackdiamond"]=9670, - ["blackleftpointingtriangle"]=9664, - ["blacklenticularbracketleft"]=12304, - ["blacklenticularbracketleftvertical"]=65083, - ["blacklenticularbracketright"]=12305, - ["blacklenticularbracketrightvertical"]=65084, - ["blacklowerlefttriangle"]=9699, - ["blacklowerrighttriangle"]=9698, - ["blackrightpointingtriangle"]=9654, - ["blacksmallsquare"]=9642, - ["blackstar"]=9733, - ["blackupperlefttriangle"]=9700, - ["blackupperrighttriangle"]=9701, - ["blackuppointingsmalltriangle"]=9652, - ["blank"]=9251, - ["blinebelow"]=7687, - ["block"]=9608, - ["bmonospace"]=65346, - ["bobaimaithai"]=3610, - ["bohiragana"]=12412, - ["bokatakana"]=12508, - ["bparen"]=9373, - ["bqsquare"]=13251, - ["braceleft"]=123, - ["braceleftmonospace"]=65371, - ["braceleftsmall"]=65115, - ["braceleftvertical"]=65079, - ["braceright"]=125, - ["bracerightmonospace"]=65373, - ["bracerightsmall"]=65116, - ["bracerightvertical"]=65080, - ["bracketleft"]=91, - ["bracketleftmonospace"]=65339, - ["bracketright"]=93, - ["bracketrightmonospace"]=65341, - ["breve"]=728, - ["brevebelowcmb"]=814, - ["brevecmb"]=774, - ["breveinvertedbelowcmb"]=815, - ["breveinvertedcmb"]=785, - ["breveinverteddoublecmb"]=865, - ["bridgebelowcmb"]=810, - ["bridgeinvertedbelowcmb"]=826, - ["brokenbar"]=166, - ["bstroke"]=384, - ["btopbar"]=387, - ["buhiragana"]=12406, - ["bukatakana"]=12502, - ["bullet"]=8226, - ["bulletoperator"]=8729, - ["bullseye"]=9678, - ["c"]=99, - ["caarmenian"]=1390, - ["cabengali"]=2458, - ["cacute"]=263, - ["cadeva"]=2330, - ["cagujarati"]=2714, - ["cagurmukhi"]=2586, - ["calsquare"]=13192, - ["candrabindubengali"]=2433, - ["candrabinducmb"]=784, - ["candrabindudeva"]=2305, - ["candrabindugujarati"]=2689, - ["capslock"]=8682, - ["careof"]=8453, - ["caron"]=711, - ["caronbelowcmb"]=812, - ["caroncmb"]=780, - ["carriagereturn"]=8629, - ["cbopomofo"]=12568, - ["ccaron"]=269, - ["ccedilla"]=231, - ["ccedillaacute"]=7689, - ["ccircle"]=9426, - ["ccircumflex"]=265, - ["ccurl"]=597, - ["cdotaccent"]=267, - ["cdsquare"]=13253, - ["cedilla"]=184, - ["cedillacmb"]=807, - ["cent"]=162, - ["centigrade"]=8451, - ["centmonospace"]=65504, - ["chaarmenian"]=1401, - ["chabengali"]=2459, - ["chadeva"]=2331, - ["chagujarati"]=2715, - ["chagurmukhi"]=2587, - ["chbopomofo"]=12564, - ["cheabkhasiancyrillic"]=1213, - ["checkmark"]=10003, - ["checyrillic"]=1095, - ["chedescenderabkhasiancyrillic"]=1215, - ["chedescendercyrillic"]=1207, - ["chedieresiscyrillic"]=1269, - ["cheharmenian"]=1395, - ["chekhakassiancyrillic"]=1228, - ["cheverticalstrokecyrillic"]=1209, - ["chi"]=967, - ["chieuchacirclekorean"]=12919, - ["chieuchaparenkorean"]=12823, - ["chieuchcirclekorean"]=12905, - ["chieuchkorean"]=12618, - ["chieuchparenkorean"]=12809, - ["chochangthai"]=3594, - ["chochanthai"]=3592, - ["chochingthai"]=3593, - ["chochoethai"]=3596, - ["chook"]=392, - ["cieucacirclekorean"]=12918, - ["cieucaparenkorean"]=12822, - ["cieuccirclekorean"]=12904, - ["cieuckorean"]=12616, - ["cieucparenkorean"]=12808, - ["cieucuparenkorean"]=12828, - ["circleot"]=8857, - ["circlepostalmark"]=12342, - ["circlewithlefthalfblack"]=9680, - ["circlewithrighthalfblack"]=9681, - ["circumflex"]=710, - ["circumflexbelowcmb"]=813, - ["circumflexcmb"]=770, - ["clear"]=8999, - ["clickalveolar"]=450, - ["clickdental"]=448, - ["clicklateral"]=449, - ["clickretroflex"]=451, - ["clubsuitblack"]=9827, - ["clubsuitwhite"]=9831, - ["cmcubedsquare"]=13220, - ["cmonospace"]=65347, - ["cmsquaredsquare"]=13216, - ["coarmenian"]=1409, - ["colon"]=58, - ["colonmonospace"]=65306, - ["colonsign"]=8353, - ["colonsmall"]=65109, - ["colontriangularhalfmod"]=721, - ["colontriangularmod"]=720, - ["comma"]=44, - ["commaabovecmb"]=787, - ["commaaboverightcmb"]=789, - ["commaarabic"]=1548, - ["commaarmenian"]=1373, - ["commamonospace"]=65292, - ["commareversedabovecmb"]=788, - ["commareversedmod"]=701, - ["commasmall"]=65104, - ["commaturnedabovecmb"]=786, - ["commaturnedmod"]=699, - ["congruent"]=8773, - ["contourintegral"]=8750, - ["control"]=8963, - ["controlACK"]=6, - ["controlBEL"]=7, - ["controlBS"]=8, - ["controlCAN"]=24, - ["controlCR"]=13, - ["controlDC1"]=17, - ["controlDC2"]=18, - ["controlDC3"]=19, - ["controlDC4"]=20, - ["controlDEL"]=127, - ["controlDLE"]=16, - ["controlEM"]=25, - ["controlENQ"]=5, - ["controlEOT"]=4, - ["controlESC"]=27, - ["controlETB"]=23, - ["controlETX"]=3, - ["controlFF"]=12, - ["controlFS"]=28, - ["controlGS"]=29, - ["controlHT"]=9, - ["controlLF"]=10, - ["controlNAK"]=21, - ["controlRS"]=30, - ["controlSI"]=15, - ["controlSO"]=14, - ["controlSOT"]=2, - ["controlSTX"]=1, - ["controlSUB"]=26, - ["controlSYN"]=22, - ["controlUS"]=31, - ["controlVT"]=11, - ["copyright"]=169, - ["cornerbracketleft"]=12300, - ["cornerbracketlefthalfwidth"]=65378, - ["cornerbracketleftvertical"]=65089, - ["cornerbracketright"]=12301, - ["cornerbracketrighthalfwidth"]=65379, - ["cornerbracketrightvertical"]=65090, - ["corporationsquare"]=13183, - ["cosquare"]=13255, - ["coverkgsquare"]=13254, - ["cparen"]=9374, - ["cruzeiro"]=8354, - ["cstretched"]=663, - ["curlyand"]=8911, - ["curlyor"]=8910, - ["currency"]=164, - ["d"]=100, - ["daarmenian"]=1380, - ["dabengali"]=2470, - ["dadarabic"]=1590, - ["dadeva"]=2342, - ["dadfinalarabic"]=65214, - ["dadinitialarabic"]=65215, - ["dadmedialarabic"]=65216, - ["dageshhebrew"]=1468, - ["dagger"]=8224, - ["daggerdbl"]=8225, - ["dagujarati"]=2726, - ["dagurmukhi"]=2598, - ["dahiragana"]=12384, - ["dakatakana"]=12480, - ["dalarabic"]=1583, - ["daletdageshhebrew"]=64307, - ["dalettserehebrew"]=1491, - ["dalfinalarabic"]=65194, - ["dammalowarabic"]=1615, - ["dammatanarabic"]=1612, - ["danda"]=2404, - ["dargalefthebrew"]=1447, - ["dasiapneumatacyrilliccmb"]=1157, - ["dblanglebracketleft"]=12298, - ["dblanglebracketleftvertical"]=65085, - ["dblanglebracketright"]=12299, - ["dblanglebracketrightvertical"]=65086, - ["dblarchinvertedbelowcmb"]=811, - ["dblarrowleft"]=8660, - ["dblarrowright"]=8658, - ["dbldanda"]=2405, - ["dblgravecmb"]=783, - ["dblintegral"]=8748, - ["dbllowlinecmb"]=819, - ["dbloverlinecmb"]=831, - ["dblprimemod"]=698, - ["dblverticalbar"]=8214, - ["dblverticallineabovecmb"]=782, - ["dbopomofo"]=12553, - ["dbsquare"]=13256, - ["dcaron"]=271, - ["dcedilla"]=7697, - ["dcircle"]=9427, - ["dcircumflexbelow"]=7699, - ["ddabengali"]=2465, - ["ddadeva"]=2337, - ["ddagujarati"]=2721, - ["ddagurmukhi"]=2593, - ["ddalarabic"]=1672, - ["ddalfinalarabic"]=64393, - ["dddhadeva"]=2396, - ["ddhabengali"]=2466, - ["ddhadeva"]=2338, - ["ddhagujarati"]=2722, - ["ddhagurmukhi"]=2594, - ["ddotaccent"]=7691, - ["ddotbelow"]=7693, - ["decimalseparatorpersian"]=1643, - ["decyrillic"]=1076, - ["degree"]=176, - ["dehihebrew"]=1453, - ["dehiragana"]=12391, - ["deicoptic"]=1007, - ["dekatakana"]=12487, - ["deleteleft"]=9003, - ["deleteright"]=8998, - ["delta"]=948, - ["deltaturned"]=397, - ["denominatorminusonenumeratorbengali"]=2552, - ["dezh"]=676, - ["dhabengali"]=2471, - ["dhadeva"]=2343, - ["dhagujarati"]=2727, - ["dhagurmukhi"]=2599, - ["dhook"]=599, - ["dialytikatonoscmb"]=836, - ["diamond"]=9830, - ["diamondsuitwhite"]=9826, - ["dieresis"]=168, - ["dieresisbelowcmb"]=804, - ["dieresiscmb"]=776, - ["dieresistonos"]=901, - ["dihiragana"]=12386, - ["dikatakana"]=12482, - ["dittomark"]=12291, - ["divide"]=247, - ["divides"]=8739, - ["divisionslash"]=8725, - ["djecyrillic"]=1106, - ["dlinebelow"]=7695, - ["dlsquare"]=13207, - ["dmacron"]=273, - ["dmonospace"]=65348, - ["dnblock"]=9604, - ["dochadathai"]=3598, - ["dodekthai"]=3604, - ["dohiragana"]=12393, - ["dokatakana"]=12489, - ["dollar"]=36, - ["dollarmonospace"]=65284, - ["dollarsmall"]=65129, - ["dong"]=8363, - ["dorusquare"]=13094, - ["dotaccent"]=729, - ["dotaccentcmb"]=775, - ["dotbelowcomb"]=803, - ["dotkatakana"]=12539, - ["dotlessi"]=305, - ["dotlessjstrokehook"]=644, - ["dotmath"]=8901, - ["dottedcircle"]=9676, - ["downtackbelowcmb"]=798, - ["downtackmod"]=725, - ["dparen"]=9375, - ["dtail"]=598, - ["dtopbar"]=396, - ["duhiragana"]=12389, - ["dukatakana"]=12485, - ["dz"]=499, - ["dzaltone"]=675, - ["dzcaron"]=454, - ["dzcurl"]=677, - ["dzeabkhasiancyrillic"]=1249, - ["dzecyrillic"]=1109, - ["dzhecyrillic"]=1119, - ["e"]=101, - ["eacute"]=233, - ["earth"]=9793, - ["ebengali"]=2447, - ["ebopomofo"]=12572, - ["ebreve"]=277, - ["ecandradeva"]=2317, - ["ecandragujarati"]=2701, - ["ecandravowelsigndeva"]=2373, - ["ecandravowelsigngujarati"]=2757, - ["ecaron"]=283, - ["ecedillabreve"]=7709, - ["echarmenian"]=1381, - ["echyiwnarmenian"]=1415, - ["ecircle"]=9428, - ["ecircumflex"]=234, - ["ecircumflexacute"]=7871, - ["ecircumflexbelow"]=7705, - ["ecircumflexdotbelow"]=7879, - ["ecircumflexgrave"]=7873, - ["ecircumflexhookabove"]=7875, - ["ecircumflextilde"]=7877, - ["ecyrillic"]=1108, - ["edblgrave"]=517, - ["edeva"]=2319, - ["edieresis"]=235, - ["edotaccent"]=279, - ["edotbelow"]=7865, - ["eegurmukhi"]=2575, - ["eematragurmukhi"]=2631, - ["efcyrillic"]=1092, - ["egrave"]=232, - ["egujarati"]=2703, - ["eharmenian"]=1383, - ["ehbopomofo"]=12573, - ["ehiragana"]=12360, - ["ehookabove"]=7867, - ["eibopomofo"]=12575, - ["eight"]=56, - ["eightbengali"]=2542, - ["eightcircle"]=9319, - ["eightcircleinversesansserif"]=10129, - ["eightdeva"]=2414, - ["eighteencircle"]=9329, - ["eighteenparen"]=9349, - ["eighteenperiod"]=9369, - ["eightgujarati"]=2798, - ["eightgurmukhi"]=2670, - ["eighthackarabic"]=1640, - ["eighthangzhou"]=12328, - ["eightideographicparen"]=12839, - ["eightinferior"]=8328, - ["eightmonospace"]=65304, - ["eightparen"]=9339, - ["eightperiod"]=9359, - ["eightpersian"]=1784, - ["eightroman"]=8567, - ["eightsuperior"]=8312, - ["eightthai"]=3672, - ["einvertedbreve"]=519, - ["eiotifiedcyrillic"]=1125, - ["ekatakana"]=12456, - ["ekatakanahalfwidth"]=65396, - ["ekonkargurmukhi"]=2676, - ["ekorean"]=12628, - ["elcyrillic"]=1083, - ["element"]=8712, - ["elevencircle"]=9322, - ["elevenparen"]=9342, - ["elevenperiod"]=9362, - ["elevenroman"]=8570, - ["ellipsis"]=8230, - ["ellipsisvertical"]=8942, - ["emacron"]=275, - ["emacronacute"]=7703, - ["emacrongrave"]=7701, - ["emcyrillic"]=1084, - ["emdash"]=8212, - ["emdashvertical"]=65073, - ["emonospace"]=65349, - ["emphasismarkarmenian"]=1371, - ["emptyset"]=8709, - ["enbopomofo"]=12579, - ["encyrillic"]=1085, - ["endash"]=8211, - ["endashvertical"]=65074, - ["endescendercyrillic"]=1187, - ["eng"]=331, - ["engbopomofo"]=12581, - ["enghecyrillic"]=1189, - ["enhookcyrillic"]=1224, - ["enspace"]=8194, - ["eogonek"]=281, - ["eokorean"]=12627, - ["eopen"]=603, - ["eopenclosed"]=666, - ["eopenreversed"]=604, - ["eopenreversedclosed"]=606, - ["eopenreversedhook"]=605, - ["eparen"]=9376, - ["epsilon"]=949, - ["epsilontonos"]=941, - ["equal"]=61, - ["equalmonospace"]=65309, - ["equalsmall"]=65126, - ["equalsuperior"]=8316, - ["equivalence"]=8801, - ["erbopomofo"]=12582, - ["ercyrillic"]=1088, - ["ereversed"]=600, - ["ereversedcyrillic"]=1101, - ["escyrillic"]=1089, - ["esdescendercyrillic"]=1195, - ["esh"]=643, - ["eshcurl"]=646, - ["eshortdeva"]=2318, - ["eshortvowelsigndeva"]=2374, - ["eshreversedloop"]=426, - ["eshsquatreversed"]=645, - ["esmallhiragana"]=12359, - ["esmallkatakana"]=12455, - ["esmallkatakanahalfwidth"]=65386, - ["estimated"]=8494, - ["eta"]=951, - ["etarmenian"]=1384, - ["etatonos"]=942, - ["eth"]=240, - ["etilde"]=7869, - ["etildebelow"]=7707, - ["etnahtalefthebrew"]=1425, - ["eturned"]=477, - ["eukorean"]=12641, - ["euro"]=8364, - ["evowelsignbengali"]=2503, - ["evowelsigndeva"]=2375, - ["evowelsigngujarati"]=2759, - ["exclam"]=33, - ["exclamarmenian"]=1372, - ["exclamdbl"]=8252, - ["exclamdown"]=161, - ["exclammonospace"]=65281, - ["ezh"]=658, - ["ezhcaron"]=495, - ["ezhcurl"]=659, - ["ezhreversed"]=441, - ["ezhtail"]=442, - ["f"]=102, - ["fadeva"]=2398, - ["fagurmukhi"]=2654, - ["fahrenheit"]=8457, - ["fathalowarabic"]=1614, - ["fathatanarabic"]=1611, - ["fbopomofo"]=12552, - ["fcircle"]=9429, - ["fdotaccent"]=7711, - ["feharabic"]=1601, - ["feharmenian"]=1414, - ["fehfinalarabic"]=65234, - ["fehinitialarabic"]=65235, - ["fehmedialarabic"]=65236, - ["feicoptic"]=997, - ["ff"]=64256, - ["ffi"]=64259, - ["ffl"]=64260, - ["fi"]=64257, - ["fifteencircle"]=9326, - ["fifteenparen"]=9346, - ["fifteenperiod"]=9366, - ["figuredash"]=8210, - ["filledbox"]=9632, - ["filledrect"]=9644, - ["finalkafdageshhebrew"]=64314, - ["finalkafshevahebrew"]=1498, - ["finalmemhebrew"]=1501, - ["finalnunhebrew"]=1503, - ["finalpehebrew"]=1507, - ["finaltsadihebrew"]=1509, - ["firsttonechinese"]=713, - ["fisheye"]=9673, - ["fitacyrillic"]=1139, - ["five"]=53, - ["fivebengali"]=2539, - ["fivecircle"]=9316, - ["fivecircleinversesansserif"]=10126, - ["fivedeva"]=2411, - ["fiveeighths"]=8541, - ["fivegujarati"]=2795, - ["fivegurmukhi"]=2667, - ["fivehackarabic"]=1637, - ["fivehangzhou"]=12325, - ["fiveideographicparen"]=12836, - ["fiveinferior"]=8325, - ["fivemonospace"]=65301, - ["fiveparen"]=9336, - ["fiveperiod"]=9356, - ["fivepersian"]=1781, - ["fiveroman"]=8564, - ["fivesuperior"]=8309, - ["fivethai"]=3669, - ["fl"]=64258, - ["florin"]=402, - ["fmonospace"]=65350, - ["fmsquare"]=13209, - ["fofanthai"]=3615, - ["fofathai"]=3613, - ["fongmanthai"]=3663, - ["four"]=52, - ["fourbengali"]=2538, - ["fourcircle"]=9315, - ["fourcircleinversesansserif"]=10125, - ["fourdeva"]=2410, - ["fourgujarati"]=2794, - ["fourgurmukhi"]=2666, - ["fourhackarabic"]=1636, - ["fourhangzhou"]=12324, - ["fourideographicparen"]=12835, - ["fourinferior"]=8324, - ["fourmonospace"]=65300, - ["fournumeratorbengali"]=2551, - ["fourparen"]=9335, - ["fourperiod"]=9355, - ["fourpersian"]=1780, - ["fourroman"]=8563, - ["foursuperior"]=8308, - ["fourteencircle"]=9325, - ["fourteenparen"]=9345, - ["fourteenperiod"]=9365, - ["fourthai"]=3668, - ["fourthtonechinese"]=715, - ["fparen"]=9377, - ["fraction"]=8260, - ["franc"]=8355, - ["g"]=103, - ["gabengali"]=2455, - ["gacute"]=501, - ["gadeva"]=2327, - ["gafarabic"]=1711, - ["gaffinalarabic"]=64403, - ["gafinitialarabic"]=64404, - ["gafmedialarabic"]=64405, - ["gagujarati"]=2711, - ["gagurmukhi"]=2583, - ["gahiragana"]=12364, - ["gakatakana"]=12460, - ["gamma"]=947, - ["gammalatinsmall"]=611, - ["gammasuperior"]=736, - ["gangiacoptic"]=1003, - ["gbopomofo"]=12557, - ["gbreve"]=287, - ["gcaron"]=487, - ["gcircle"]=9430, - ["gcircumflex"]=285, - ["gcommaaccent"]=291, - ["gdotaccent"]=289, - ["gecyrillic"]=1075, - ["gehiragana"]=12370, - ["gekatakana"]=12466, - ["geometricallyequal"]=8785, - ["gereshaccenthebrew"]=1436, - ["gereshhebrew"]=1523, - ["gereshmuqdamhebrew"]=1437, - ["germandbls"]=223, - ["gershayimaccenthebrew"]=1438, - ["gershayimhebrew"]=1524, - ["getamark"]=12307, - ["ghabengali"]=2456, - ["ghadarmenian"]=1394, - ["ghadeva"]=2328, - ["ghagujarati"]=2712, - ["ghagurmukhi"]=2584, - ["ghainarabic"]=1594, - ["ghainfinalarabic"]=65230, - ["ghaininitialarabic"]=65231, - ["ghainmedialarabic"]=65232, - ["ghemiddlehookcyrillic"]=1173, - ["ghestrokecyrillic"]=1171, - ["gheupturncyrillic"]=1169, - ["ghhadeva"]=2394, - ["ghhagurmukhi"]=2650, - ["ghook"]=608, - ["ghzsquare"]=13203, - ["gihiragana"]=12366, - ["gikatakana"]=12462, - ["gimarmenian"]=1379, - ["gimeldageshhebrew"]=64306, - ["gimelhebrew"]=1490, - ["gjecyrillic"]=1107, - ["glottalinvertedstroke"]=446, - ["glottalstop"]=660, - ["glottalstopinverted"]=662, - ["glottalstopmod"]=704, - ["glottalstopreversed"]=661, - ["glottalstopreversedmod"]=705, - ["glottalstopreversedsuperior"]=740, - ["glottalstopstroke"]=673, - ["glottalstopstrokereversed"]=674, - ["gmacron"]=7713, - ["gmonospace"]=65351, - ["gohiragana"]=12372, - ["gokatakana"]=12468, - ["gparen"]=9378, - ["gpasquare"]=13228, - ["grave"]=96, - ["gravebelowcmb"]=790, - ["gravecomb"]=768, - ["gravedeva"]=2387, - ["gravelowmod"]=718, - ["gravemonospace"]=65344, - ["gravetonecmb"]=832, - ["greater"]=62, - ["greaterequal"]=8805, - ["greaterequalorless"]=8923, - ["greatermonospace"]=65310, - ["greaterorequivalent"]=8819, - ["greaterorless"]=8823, - ["greateroverequal"]=8807, - ["greatersmall"]=65125, - ["gscript"]=609, - ["gstroke"]=485, - ["guhiragana"]=12368, - ["guillemotleft"]=171, - ["guillemotright"]=187, - ["guilsinglleft"]=8249, - ["guilsinglright"]=8250, - ["gukatakana"]=12464, - ["guramusquare"]=13080, - ["gysquare"]=13257, - ["h"]=104, - ["haabkhasiancyrillic"]=1193, - ["habengali"]=2489, - ["hadescendercyrillic"]=1203, - ["hadeva"]=2361, - ["hagujarati"]=2745, - ["hagurmukhi"]=2617, - ["haharabic"]=1581, - ["hahfinalarabic"]=65186, - ["hahinitialarabic"]=65187, - ["hahiragana"]=12399, - ["hahmedialarabic"]=65188, - ["haitusquare"]=13098, - ["hakatakana"]=12495, - ["hakatakanahalfwidth"]=65418, - ["halantgurmukhi"]=2637, - ["hamzasukunarabic"]=1569, - ["hangulfiller"]=12644, - ["hardsigncyrillic"]=1098, - ["harpoonleftbarbup"]=8636, - ["harpoonrightbarbup"]=8640, - ["hasquare"]=13258, - ["hatafpatahwidehebrew"]=1458, - ["hatafqamatswidehebrew"]=1459, - ["hatafsegolwidehebrew"]=1457, - ["hbar"]=295, - ["hbopomofo"]=12559, - ["hbrevebelow"]=7723, - ["hcedilla"]=7721, - ["hcircle"]=9431, - ["hcircumflex"]=293, - ["hdieresis"]=7719, - ["hdotaccent"]=7715, - ["hdotbelow"]=7717, - ["heartsuitblack"]=9829, - ["heartsuitwhite"]=9825, - ["hedageshhebrew"]=64308, - ["hehaltonearabic"]=1729, - ["heharabic"]=1607, - ["hehebrew"]=1492, - ["hehfinalaltonearabic"]=64423, - ["hehfinalarabic"]=65258, - ["hehhamzaabovefinalarabic"]=64421, - ["hehhamzaaboveisolatedarabic"]=64420, - ["hehinitialaltonearabic"]=64424, - ["hehinitialarabic"]=65259, - ["hehiragana"]=12408, - ["hehmedialaltonearabic"]=64425, - ["hehmedialarabic"]=65260, - ["heiseierasquare"]=13179, - ["hekatakana"]=12504, - ["hekatakanahalfwidth"]=65421, - ["hekutaarusquare"]=13110, - ["henghook"]=615, - ["herutusquare"]=13113, - ["hethebrew"]=1495, - ["hhook"]=614, - ["hhooksuperior"]=689, - ["hieuhacirclekorean"]=12923, - ["hieuhaparenkorean"]=12827, - ["hieuhcirclekorean"]=12909, - ["hieuhkorean"]=12622, - ["hieuhparenkorean"]=12813, - ["hihiragana"]=12402, - ["hikatakana"]=12498, - ["hikatakanahalfwidth"]=65419, - ["hiriqwidehebrew"]=1460, - ["hlinebelow"]=7830, - ["hmonospace"]=65352, - ["hoarmenian"]=1392, - ["hohipthai"]=3627, - ["hohiragana"]=12411, - ["hokatakana"]=12507, - ["hokatakanahalfwidth"]=65422, - ["holamwidehebrew"]=1465, - ["honokhukthai"]=3630, - ["hookcmb"]=777, - ["hookpalatalizedbelowcmb"]=801, - ["hookretroflexbelowcmb"]=802, - ["hoonsquare"]=13122, - ["horicoptic"]=1001, - ["horizontalbar"]=8213, - ["horncmb"]=795, - ["hotsprings"]=9832, - ["house"]=8962, - ["hparen"]=9379, - ["hsuperior"]=688, - ["hturned"]=613, - ["huhiragana"]=12405, - ["huiitosquare"]=13107, - ["hukatakana"]=12501, - ["hukatakanahalfwidth"]=65420, - ["hungarumlaut"]=733, - ["hungarumlautcmb"]=779, - ["hv"]=405, - ["hyphen"]=45, - ["hyphenmonospace"]=65293, - ["hyphensmall"]=65123, - ["hyphentwo"]=8208, - ["i"]=105, - ["iacute"]=237, - ["iacyrillic"]=1103, - ["ibengali"]=2439, - ["ibopomofo"]=12583, - ["ibreve"]=301, - ["icaron"]=464, - ["icircle"]=9432, - ["icircumflex"]=238, - ["icyrillic"]=1110, - ["idblgrave"]=521, - ["ideographearthcircle"]=12943, - ["ideographfirecircle"]=12939, - ["ideographicallianceparen"]=12863, - ["ideographiccallparen"]=12858, - ["ideographiccentrecircle"]=12965, - ["ideographicclose"]=12294, - ["ideographiccomma"]=12289, - ["ideographiccommaleft"]=65380, - ["ideographiccongratulationparen"]=12855, - ["ideographiccorrectcircle"]=12963, - ["ideographicearthparen"]=12847, - ["ideographicenterpriseparen"]=12861, - ["ideographicexcellentcircle"]=12957, - ["ideographicfestivalparen"]=12864, - ["ideographicfinancialcircle"]=12950, - ["ideographicfinancialparen"]=12854, - ["ideographicfireparen"]=12843, - ["ideographichaveparen"]=12850, - ["ideographichighcircle"]=12964, - ["ideographiciterationmark"]=12293, - ["ideographiclaborcircle"]=12952, - ["ideographiclaborparen"]=12856, - ["ideographicleftcircle"]=12967, - ["ideographiclowcircle"]=12966, - ["ideographicmedicinecircle"]=12969, - ["ideographicmetalparen"]=12846, - ["ideographicmoonparen"]=12842, - ["ideographicnameparen"]=12852, - ["ideographicperiod"]=12290, - ["ideographicprintcircle"]=12958, - ["ideographicreachparen"]=12867, - ["ideographicrepresentparen"]=12857, - ["ideographicresourceparen"]=12862, - ["ideographicrightcircle"]=12968, - ["ideographicsecretcircle"]=12953, - ["ideographicselfparen"]=12866, - ["ideographicsocietyparen"]=12851, - ["ideographicspace"]=12288, - ["ideographicspecialparen"]=12853, - ["ideographicstockparen"]=12849, - ["ideographicstudyparen"]=12859, - ["ideographicsunparen"]=12848, - ["ideographicsuperviseparen"]=12860, - ["ideographicwaterparen"]=12844, - ["ideographicwoodparen"]=12845, - ["ideographiczero"]=12295, - ["ideographmetalcircle"]=12942, - ["ideographmooncircle"]=12938, - ["ideographnamecircle"]=12948, - ["ideographsuncircle"]=12944, - ["ideographwatercircle"]=12940, - ["ideographwoodcircle"]=12941, - ["ideva"]=2311, - ["idieresis"]=239, - ["idieresisacute"]=7727, - ["idieresiscyrillic"]=1253, - ["idotbelow"]=7883, - ["iebrevecyrillic"]=1239, - ["iecyrillic"]=1077, - ["ieungacirclekorean"]=12917, - ["ieungaparenkorean"]=12821, - ["ieungcirclekorean"]=12903, - ["ieungkorean"]=12615, - ["ieungparenkorean"]=12807, - ["igrave"]=236, - ["igujarati"]=2695, - ["igurmukhi"]=2567, - ["ihiragana"]=12356, - ["ihookabove"]=7881, - ["iibengali"]=2440, - ["iicyrillic"]=1080, - ["iideva"]=2312, - ["iigujarati"]=2696, - ["iigurmukhi"]=2568, - ["iimatragurmukhi"]=2624, - ["iinvertedbreve"]=523, - ["iishortcyrillic"]=1081, - ["iivowelsignbengali"]=2496, - ["iivowelsigndeva"]=2368, - ["iivowelsigngujarati"]=2752, - ["ij"]=307, - ["ikatakana"]=12452, - ["ikatakanahalfwidth"]=65394, - ["ikorean"]=12643, - ["iluyhebrew"]=1452, - ["imacron"]=299, - ["imacroncyrillic"]=1251, - ["imageorapproximatelyequal"]=8787, - ["imatragurmukhi"]=2623, - ["imonospace"]=65353, - ["increment"]=8710, - ["infinity"]=8734, - ["iniarmenian"]=1387, - ["integral"]=8747, - ["integralbt"]=8993, - ["integraltp"]=8992, - ["intersection"]=8745, - ["intisquare"]=13061, - ["invbullet"]=9688, - ["invsmileface"]=9787, - ["iocyrillic"]=1105, - ["iogonek"]=303, - ["iota"]=953, - ["iotadieresis"]=970, - ["iotadieresistonos"]=912, - ["iotalatin"]=617, - ["iotatonos"]=943, - ["iparen"]=9380, - ["irigurmukhi"]=2674, - ["ismallhiragana"]=12355, - ["ismallkatakana"]=12451, - ["ismallkatakanahalfwidth"]=65384, - ["issharbengali"]=2554, - ["istroke"]=616, - ["iterationhiragana"]=12445, - ["iterationkatakana"]=12541, - ["itilde"]=297, - ["itildebelow"]=7725, - ["iubopomofo"]=12585, - ["iucyrillic"]=1102, - ["ivowelsignbengali"]=2495, - ["ivowelsigndeva"]=2367, - ["ivowelsigngujarati"]=2751, - ["izhitsacyrillic"]=1141, - ["izhitsadblgravecyrillic"]=1143, - ["j"]=106, - ["jaarmenian"]=1393, - ["jabengali"]=2460, - ["jadeva"]=2332, - ["jagujarati"]=2716, - ["jagurmukhi"]=2588, - ["jbopomofo"]=12560, - ["jcaron"]=496, - ["jcircle"]=9433, - ["jcircumflex"]=309, - ["jcrossedtail"]=669, - ["jdotlessstroke"]=607, - ["jecyrillic"]=1112, - ["jeemarabic"]=1580, - ["jeemfinalarabic"]=65182, - ["jeeminitialarabic"]=65183, - ["jeemmedialarabic"]=65184, - ["jeharabic"]=1688, - ["jehfinalarabic"]=64395, - ["jhabengali"]=2461, - ["jhadeva"]=2333, - ["jhagujarati"]=2717, - ["jhagurmukhi"]=2589, - ["jheharmenian"]=1403, - ["jis"]=12292, - ["jmonospace"]=65354, - ["jparen"]=9381, - ["jsuperior"]=690, - ["k"]=107, - ["kabashkircyrillic"]=1185, - ["kabengali"]=2453, - ["kacute"]=7729, - ["kacyrillic"]=1082, - ["kadescendercyrillic"]=1179, - ["kadeva"]=2325, - ["kafarabic"]=1603, - ["kafdageshhebrew"]=64315, - ["kaffinalarabic"]=65242, - ["kafhebrew"]=1499, - ["kafinitialarabic"]=65243, - ["kafmedialarabic"]=65244, - ["kafrafehebrew"]=64333, - ["kagujarati"]=2709, - ["kagurmukhi"]=2581, - ["kahiragana"]=12363, - ["kahookcyrillic"]=1220, - ["kakatakana"]=12459, - ["kakatakanahalfwidth"]=65398, - ["kappa"]=954, - ["kappasymbolgreek"]=1008, - ["kapyeounmieumkorean"]=12657, - ["kapyeounphieuphkorean"]=12676, - ["kapyeounpieupkorean"]=12664, - ["kapyeounssangpieupkorean"]=12665, - ["karoriisquare"]=13069, - ["kasmallkatakana"]=12533, - ["kasquare"]=13188, - ["kasraarabic"]=1616, - ["kasratanarabic"]=1613, - ["kastrokecyrillic"]=1183, - ["katahiraprolongmarkhalfwidth"]=65392, - ["kaverticalstrokecyrillic"]=1181, - ["kbopomofo"]=12558, - ["kcalsquare"]=13193, - ["kcaron"]=489, - ["kcircle"]=9434, - ["kcommaaccent"]=311, - ["kdotbelow"]=7731, - ["keharmenian"]=1412, - ["kehiragana"]=12369, - ["kekatakana"]=12465, - ["kekatakanahalfwidth"]=65401, - ["kenarmenian"]=1391, - ["kesmallkatakana"]=12534, - ["kgreenlandic"]=312, - ["khabengali"]=2454, - ["khacyrillic"]=1093, - ["khadeva"]=2326, - ["khagujarati"]=2710, - ["khagurmukhi"]=2582, - ["khaharabic"]=1582, - ["khahfinalarabic"]=65190, - ["khahinitialarabic"]=65191, - ["khahmedialarabic"]=65192, - ["kheicoptic"]=999, - ["khhadeva"]=2393, - ["khhagurmukhi"]=2649, - ["khieukhacirclekorean"]=12920, - ["khieukhaparenkorean"]=12824, - ["khieukhcirclekorean"]=12906, - ["khieukhkorean"]=12619, - ["khieukhparenkorean"]=12810, - ["khokhaithai"]=3586, - ["khokhonthai"]=3589, - ["khokhuatthai"]=3587, - ["khokhwaithai"]=3588, - ["khomutthai"]=3675, - ["khook"]=409, - ["khorakhangthai"]=3590, - ["khzsquare"]=13201, - ["kihiragana"]=12365, - ["kikatakana"]=12461, - ["kikatakanahalfwidth"]=65399, - ["kiroguramusquare"]=13077, - ["kiromeetorusquare"]=13078, - ["kirosquare"]=13076, - ["kiyeokacirclekorean"]=12910, - ["kiyeokaparenkorean"]=12814, - ["kiyeokcirclekorean"]=12896, - ["kiyeokkorean"]=12593, - ["kiyeokparenkorean"]=12800, - ["kiyeoksioskorean"]=12595, - ["kjecyrillic"]=1116, - ["klinebelow"]=7733, - ["klsquare"]=13208, - ["kmcubedsquare"]=13222, - ["kmonospace"]=65355, - ["kmsquaredsquare"]=13218, - ["kohiragana"]=12371, - ["kohmsquare"]=13248, - ["kokaithai"]=3585, - ["kokatakana"]=12467, - ["kokatakanahalfwidth"]=65402, - ["kooposquare"]=13086, - ["koppacyrillic"]=1153, - ["koreanstandardsymbol"]=12927, - ["koroniscmb"]=835, - ["kparen"]=9382, - ["kpasquare"]=13226, - ["ksicyrillic"]=1135, - ["ktsquare"]=13263, - ["kturned"]=670, - ["kuhiragana"]=12367, - ["kukatakana"]=12463, - ["kukatakanahalfwidth"]=65400, - ["kvsquare"]=13240, - ["kwsquare"]=13246, - ["l"]=108, - ["labengali"]=2482, - ["lacute"]=314, - ["ladeva"]=2354, - ["lagujarati"]=2738, - ["lagurmukhi"]=2610, - ["lakkhangyaothai"]=3653, - ["lamaleffinalarabic"]=65276, - ["lamalefhamzaabovefinalarabic"]=65272, - ["lamalefhamzaaboveisolatedarabic"]=65271, - ["lamalefhamzabelowfinalarabic"]=65274, - ["lamalefhamzabelowisolatedarabic"]=65273, - ["lamalefisolatedarabic"]=65275, - ["lamalefmaddaabovefinalarabic"]=65270, - ["lamalefmaddaaboveisolatedarabic"]=65269, - ["lamarabic"]=1604, - ["lambda"]=955, - ["lambdastroke"]=411, - ["lameddageshhebrew"]=64316, - ["lamedholamhebrew"]=1500, - ["lamfinalarabic"]=65246, - ["lamhahinitialarabic"]=64714, - ["lamjeeminitialarabic"]=64713, - ["lamkhahinitialarabic"]=64715, - ["lamlamhehisolatedarabic"]=65010, - ["lammedialarabic"]=65248, - ["lammeemhahinitialarabic"]=64904, - ["lammeeminitialarabic"]=64716, - ["lammeemkhahinitialarabic"]=65247, - ["largecircle"]=9711, - ["lbar"]=410, - ["lbelt"]=620, - ["lbopomofo"]=12556, - ["lcaron"]=318, - ["lcircle"]=9435, - ["lcircumflexbelow"]=7741, - ["lcommaaccent"]=316, - ["ldotaccent"]=320, - ["ldotbelow"]=7735, - ["ldotbelowmacron"]=7737, - ["leftangleabovecmb"]=794, - ["lefttackbelowcmb"]=792, - ["less"]=60, - ["lessequal"]=8804, - ["lessequalorgreater"]=8922, - ["lessmonospace"]=65308, - ["lessorequivalent"]=8818, - ["lessorgreater"]=8822, - ["lessoverequal"]=8806, - ["lesssmall"]=65124, - ["lezh"]=622, - ["lfblock"]=9612, - ["lhookretroflex"]=621, - ["lira"]=8356, - ["liwnarmenian"]=1388, - ["lj"]=457, - ["ljecyrillic"]=1113, - ["lladeva"]=2355, - ["llagujarati"]=2739, - ["llinebelow"]=7739, - ["llladeva"]=2356, - ["llvocalicbengali"]=2529, - ["llvocalicdeva"]=2401, - ["llvocalicvowelsignbengali"]=2531, - ["llvocalicvowelsigndeva"]=2403, - ["lmiddletilde"]=619, - ["lmonospace"]=65356, - ["lmsquare"]=13264, - ["lochulathai"]=3628, - ["logicaland"]=8743, - ["logicalnot"]=172, - ["logicalor"]=8744, - ["lolingthai"]=3621, - ["lowlinecenterline"]=65102, - ["lowlinecmb"]=818, - ["lowlinedashed"]=65101, - ["lozenge"]=9674, - ["lparen"]=9383, - ["lslash"]=322, - ["lsquare"]=8467, - ["luthai"]=3622, - ["lvocalicbengali"]=2444, - ["lvocalicdeva"]=2316, - ["lvocalicvowelsignbengali"]=2530, - ["lvocalicvowelsigndeva"]=2402, - ["lxsquare"]=13267, - ["m"]=109, - ["mabengali"]=2478, - ["macron"]=175, - ["macronbelowcmb"]=817, - ["macroncmb"]=772, - ["macronlowmod"]=717, - ["macronmonospace"]=65507, - ["macute"]=7743, - ["madeva"]=2350, - ["magujarati"]=2734, - ["magurmukhi"]=2606, - ["mahapakhlefthebrew"]=1444, - ["mahiragana"]=12414, - ["maichattawathai"]=3659, - ["maiekthai"]=3656, - ["maihanakatthai"]=3633, - ["maitaikhuthai"]=3655, - ["maithothai"]=3657, - ["maitrithai"]=3658, - ["maiyamokthai"]=3654, - ["makatakana"]=12510, - ["makatakanahalfwidth"]=65423, - ["mansyonsquare"]=13127, - ["maqafhebrew"]=1470, - ["mars"]=9794, - ["masoracirclehebrew"]=1455, - ["masquare"]=13187, - ["mbopomofo"]=12551, - ["mbsquare"]=13268, - ["mcircle"]=9436, - ["mcubedsquare"]=13221, - ["mdotaccent"]=7745, - ["mdotbelow"]=7747, - ["meemarabic"]=1605, - ["meemfinalarabic"]=65250, - ["meeminitialarabic"]=65251, - ["meemmedialarabic"]=65252, - ["meemmeeminitialarabic"]=64721, - ["meemmeemisolatedarabic"]=64584, - ["meetorusquare"]=13133, - ["mehiragana"]=12417, - ["meizierasquare"]=13182, - ["mekatakana"]=12513, - ["mekatakanahalfwidth"]=65426, - ["memdageshhebrew"]=64318, - ["memhebrew"]=1502, - ["menarmenian"]=1396, - ["merkhakefulalefthebrew"]=1446, - ["merkhalefthebrew"]=1445, - ["mhook"]=625, - ["mhzsquare"]=13202, - ["middledotkatakanahalfwidth"]=65381, - ["mieumacirclekorean"]=12914, - ["mieumaparenkorean"]=12818, - ["mieumcirclekorean"]=12900, - ["mieumkorean"]=12609, - ["mieumpansioskorean"]=12656, - ["mieumparenkorean"]=12804, - ["mieumpieupkorean"]=12654, - ["mieumsioskorean"]=12655, - ["mihiragana"]=12415, - ["mikatakana"]=12511, - ["mikatakanahalfwidth"]=65424, - ["minus"]=8722, - ["minusbelowcmb"]=800, - ["minuscircle"]=8854, - ["minusmod"]=727, - ["minusplus"]=8723, - ["minute"]=8242, - ["miribaarusquare"]=13130, - ["mirisquare"]=13129, - ["mlonglegturned"]=624, - ["mlsquare"]=13206, - ["mmcubedsquare"]=13219, - ["mmonospace"]=65357, - ["mmsquaredsquare"]=13215, - ["mohiragana"]=12418, - ["mohmsquare"]=13249, - ["mokatakana"]=12514, - ["mokatakanahalfwidth"]=65427, - ["molsquare"]=13270, - ["momathai"]=3617, - ["moverssquare"]=13223, - ["moverssquaredsquare"]=13224, - ["mparen"]=9384, - ["mpasquare"]=13227, - ["mssquare"]=13235, - ["mturned"]=623, - ["mu1"]=181, - ["muasquare"]=13186, - ["muchgreater"]=8811, - ["muchless"]=8810, - ["mufsquare"]=13196, - ["mugreek"]=956, - ["mugsquare"]=13197, - ["muhiragana"]=12416, - ["mukatakana"]=12512, - ["mukatakanahalfwidth"]=65425, - ["mulsquare"]=13205, - ["multiply"]=215, - ["mumsquare"]=13211, - ["munahlefthebrew"]=1443, - ["musicalnote"]=9834, - ["musicalnotedbl"]=9835, - ["musicflatsign"]=9837, - ["musicsharpsign"]=9839, - ["mussquare"]=13234, - ["muvsquare"]=13238, - ["muwsquare"]=13244, - ["mvmegasquare"]=13241, - ["mvsquare"]=13239, - ["mwmegasquare"]=13247, - ["mwsquare"]=13245, - ["n"]=110, - ["nabengali"]=2472, - ["nabla"]=8711, - ["nacute"]=324, - ["nadeva"]=2344, - ["nagujarati"]=2728, - ["nagurmukhi"]=2600, - ["nahiragana"]=12394, - ["nakatakana"]=12490, - ["nakatakanahalfwidth"]=65413, - ["nasquare"]=13185, - ["nbopomofo"]=12555, - ["ncaron"]=328, - ["ncircle"]=9437, - ["ncircumflexbelow"]=7755, - ["ncommaaccent"]=326, - ["ndotaccent"]=7749, - ["ndotbelow"]=7751, - ["nehiragana"]=12397, - ["nekatakana"]=12493, - ["nekatakanahalfwidth"]=65416, - ["nfsquare"]=13195, - ["ngabengali"]=2457, - ["ngadeva"]=2329, - ["ngagujarati"]=2713, - ["ngagurmukhi"]=2585, - ["ngonguthai"]=3591, - ["nhiragana"]=12435, - ["nhookleft"]=626, - ["nhookretroflex"]=627, - ["nieunacirclekorean"]=12911, - ["nieunaparenkorean"]=12815, - ["nieuncieuckorean"]=12597, - ["nieuncirclekorean"]=12897, - ["nieunhieuhkorean"]=12598, - ["nieunkorean"]=12596, - ["nieunpansioskorean"]=12648, - ["nieunparenkorean"]=12801, - ["nieunsioskorean"]=12647, - ["nieuntikeutkorean"]=12646, - ["nihiragana"]=12395, - ["nikatakana"]=12491, - ["nikatakanahalfwidth"]=65414, - ["nikhahitthai"]=3661, - ["nine"]=57, - ["ninebengali"]=2543, - ["ninecircle"]=9320, - ["ninecircleinversesansserif"]=10130, - ["ninedeva"]=2415, - ["ninegujarati"]=2799, - ["ninegurmukhi"]=2671, - ["ninehackarabic"]=1641, - ["ninehangzhou"]=12329, - ["nineideographicparen"]=12840, - ["nineinferior"]=8329, - ["ninemonospace"]=65305, - ["nineparen"]=9340, - ["nineperiod"]=9360, - ["ninepersian"]=1785, - ["nineroman"]=8568, - ["ninesuperior"]=8313, - ["nineteencircle"]=9330, - ["nineteenparen"]=9350, - ["nineteenperiod"]=9370, - ["ninethai"]=3673, - ["nj"]=460, - ["njecyrillic"]=1114, - ["nkatakana"]=12531, - ["nkatakanahalfwidth"]=65437, - ["nlegrightlong"]=414, - ["nlinebelow"]=7753, - ["nmonospace"]=65358, - ["nmsquare"]=13210, - ["nnabengali"]=2467, - ["nnadeva"]=2339, - ["nnagujarati"]=2723, - ["nnagurmukhi"]=2595, - ["nnnadeva"]=2345, - ["nohiragana"]=12398, - ["nokatakana"]=12494, - ["nokatakanahalfwidth"]=65417, - ["nonbreakingspace"]=160, - ["nonenthai"]=3603, - ["nonuthai"]=3609, - ["noonarabic"]=1606, - ["noonfinalarabic"]=65254, - ["noonghunnaarabic"]=1722, - ["noonghunnafinalarabic"]=64415, - ["nooninitialarabic"]=65255, - ["noonjeeminitialarabic"]=64722, - ["noonjeemisolatedarabic"]=64587, - ["noonmedialarabic"]=65256, - ["noonmeeminitialarabic"]=64725, - ["noonmeemisolatedarabic"]=64590, - ["noonnoonfinalarabic"]=64653, - ["notcontains"]=8716, - ["notelementof"]=8713, - ["notequal"]=8800, - ["notgreater"]=8815, - ["notgreaternorequal"]=8817, - ["notgreaternorless"]=8825, - ["notidentical"]=8802, - ["notless"]=8814, - ["notlessnorequal"]=8816, - ["notparallel"]=8742, - ["notprecedes"]=8832, - ["notsubset"]=8836, - ["notsucceeds"]=8833, - ["notsuperset"]=8837, - ["nowarmenian"]=1398, - ["nparen"]=9385, - ["nssquare"]=13233, - ["nsuperior"]=8319, - ["ntilde"]=241, - ["nu"]=957, - ["nuhiragana"]=12396, - ["nukatakana"]=12492, - ["nukatakanahalfwidth"]=65415, - ["nuktabengali"]=2492, - ["nuktadeva"]=2364, - ["nuktagujarati"]=2748, - ["nuktagurmukhi"]=2620, - ["numbersign"]=35, - ["numbersignmonospace"]=65283, - ["numbersignsmall"]=65119, - ["numeralsigngreek"]=884, - ["numeralsignlowergreek"]=885, - ["numero"]=8470, - ["nundageshhebrew"]=64320, - ["nunhebrew"]=1504, - ["nvsquare"]=13237, - ["nwsquare"]=13243, - ["nyabengali"]=2462, - ["nyadeva"]=2334, - ["nyagujarati"]=2718, - ["nyagurmukhi"]=2590, - ["o"]=111, - ["oacute"]=243, - ["oangthai"]=3629, - ["obarred"]=629, - ["obarredcyrillic"]=1257, - ["obarreddieresiscyrillic"]=1259, - ["obengali"]=2451, - ["obopomofo"]=12571, - ["obreve"]=335, - ["ocandradeva"]=2321, - ["ocandragujarati"]=2705, - ["ocandravowelsigndeva"]=2377, - ["ocandravowelsigngujarati"]=2761, - ["ocaron"]=466, - ["ocircle"]=9438, - ["ocircumflex"]=244, - ["ocircumflexacute"]=7889, - ["ocircumflexdotbelow"]=7897, - ["ocircumflexgrave"]=7891, - ["ocircumflexhookabove"]=7893, - ["ocircumflextilde"]=7895, - ["ocyrillic"]=1086, - ["odblgrave"]=525, - ["odeva"]=2323, - ["odieresis"]=246, - ["odieresiscyrillic"]=1255, - ["odotbelow"]=7885, - ["oe"]=339, - ["oekorean"]=12634, - ["ogonek"]=731, - ["ogonekcmb"]=808, - ["ograve"]=242, - ["ogujarati"]=2707, - ["oharmenian"]=1413, - ["ohiragana"]=12362, - ["ohookabove"]=7887, - ["ohorn"]=417, - ["ohornacute"]=7899, - ["ohorndotbelow"]=7907, - ["ohorngrave"]=7901, - ["ohornhookabove"]=7903, - ["ohorntilde"]=7905, - ["ohungarumlaut"]=337, - ["oi"]=419, - ["oinvertedbreve"]=527, - ["okatakana"]=12458, - ["okatakanahalfwidth"]=65397, - ["okorean"]=12631, - ["olehebrew"]=1451, - ["omacron"]=333, - ["omacronacute"]=7763, - ["omacrongrave"]=7761, - ["omdeva"]=2384, - ["omega"]=969, - ["omegacyrillic"]=1121, - ["omegalatinclosed"]=631, - ["omegaroundcyrillic"]=1147, - ["omegatitlocyrillic"]=1149, - ["omegatonos"]=974, - ["omgujarati"]=2768, - ["omicron"]=959, - ["omicrontonos"]=972, - ["omonospace"]=65359, - ["one"]=49, - ["onebengali"]=2535, - ["onecircle"]=9312, - ["onecircleinversesansserif"]=10122, - ["onedeva"]=2407, - ["onedotenleader"]=8228, - ["oneeighth"]=8539, - ["onegujarati"]=2791, - ["onegurmukhi"]=2663, - ["onehackarabic"]=1633, - ["onehalf"]=189, - ["onehangzhou"]=12321, - ["oneideographicparen"]=12832, - ["oneinferior"]=8321, - ["onemonospace"]=65297, - ["onenumeratorbengali"]=2548, - ["oneparen"]=9332, - ["oneperiod"]=9352, - ["onepersian"]=1777, - ["onequarter"]=188, - ["oneroman"]=8560, - ["onesuperior"]=185, - ["onethai"]=3665, - ["onethird"]=8531, - ["oogonek"]=491, - ["oogonekmacron"]=493, - ["oogurmukhi"]=2579, - ["oomatragurmukhi"]=2635, - ["oopen"]=596, - ["oparen"]=9386, - ["option"]=8997, - ["ordfeminine"]=170, - ["ordmasculine"]=186, - ["oshortdeva"]=2322, - ["oshortvowelsigndeva"]=2378, - ["oslash"]=248, - ["osmallhiragana"]=12361, - ["osmallkatakana"]=12457, - ["osmallkatakanahalfwidth"]=65387, - ["ostrokeacute"]=511, - ["otcyrillic"]=1151, - ["otilde"]=245, - ["otildeacute"]=7757, - ["otildedieresis"]=7759, - ["oubopomofo"]=12577, - ["overline"]=8254, - ["overlinecenterline"]=65098, - ["overlinecmb"]=773, - ["overlinedashed"]=65097, - ["overlinedblwavy"]=65100, - ["overlinewavy"]=65099, - ["ovowelsignbengali"]=2507, - ["ovowelsigndeva"]=2379, - ["ovowelsigngujarati"]=2763, - ["p"]=112, - ["paampssquare"]=13184, - ["paasentosquare"]=13099, - ["pabengali"]=2474, - ["pacute"]=7765, - ["padeva"]=2346, - ["pagedown"]=8671, - ["pageup"]=8670, - ["pagujarati"]=2730, - ["pagurmukhi"]=2602, - ["pahiragana"]=12401, - ["paiyannoithai"]=3631, - ["pakatakana"]=12497, - ["palatalizationcyrilliccmb"]=1156, - ["palochkacyrillic"]=1216, - ["pansioskorean"]=12671, - ["paragraph"]=182, - ["parallel"]=8741, - ["parenleft"]=40, - ["parenleftaltonearabic"]=64830, - ["parenleftinferior"]=8333, - ["parenleftmonospace"]=65288, - ["parenleftsmall"]=65113, - ["parenleftsuperior"]=8317, - ["parenleftvertical"]=65077, - ["parenright"]=41, - ["parenrightaltonearabic"]=64831, - ["parenrightinferior"]=8334, - ["parenrightmonospace"]=65289, - ["parenrightsmall"]=65114, - ["parenrightsuperior"]=8318, - ["parenrightvertical"]=65078, - ["partialdiff"]=8706, - ["paseqhebrew"]=1472, - ["pashtahebrew"]=1433, - ["pasquare"]=13225, - ["patahwidehebrew"]=1463, - ["pazerhebrew"]=1441, - ["pbopomofo"]=12550, - ["pcircle"]=9439, - ["pdotaccent"]=7767, - ["pecyrillic"]=1087, - ["pedageshhebrew"]=64324, - ["peezisquare"]=13115, - ["pefinaldageshhebrew"]=64323, - ["peharabic"]=1662, - ["peharmenian"]=1402, - ["pehebrew"]=1508, - ["pehfinalarabic"]=64343, - ["pehinitialarabic"]=64344, - ["pehiragana"]=12410, - ["pehmedialarabic"]=64345, - ["pekatakana"]=12506, - ["pemiddlehookcyrillic"]=1191, - ["perafehebrew"]=64334, - ["percent"]=37, - ["percentarabic"]=1642, - ["percentmonospace"]=65285, - ["percentsmall"]=65130, - ["period"]=46, - ["periodarmenian"]=1417, - ["periodcentered"]=183, - ["periodhalfwidth"]=65377, - ["periodmonospace"]=65294, - ["periodsmall"]=65106, - ["perispomenigreekcmb"]=834, - ["perpendicular"]=8869, - ["perthousand"]=8240, - ["peseta"]=8359, - ["pfsquare"]=13194, - ["phabengali"]=2475, - ["phadeva"]=2347, - ["phagujarati"]=2731, - ["phagurmukhi"]=2603, - ["phi"]=966, - ["phieuphacirclekorean"]=12922, - ["phieuphaparenkorean"]=12826, - ["phieuphcirclekorean"]=12908, - ["phieuphkorean"]=12621, - ["phieuphparenkorean"]=12812, - ["philatin"]=632, - ["phinthuthai"]=3642, - ["phisymbolgreek"]=981, - ["phook"]=421, - ["phophanthai"]=3614, - ["phophungthai"]=3612, - ["phosamphaothai"]=3616, - ["pi"]=960, - ["pieupacirclekorean"]=12915, - ["pieupaparenkorean"]=12819, - ["pieupcieuckorean"]=12662, - ["pieupcirclekorean"]=12901, - ["pieupkiyeokkorean"]=12658, - ["pieupkorean"]=12610, - ["pieupparenkorean"]=12805, - ["pieupsioskiyeokkorean"]=12660, - ["pieupsioskorean"]=12612, - ["pieupsiostikeutkorean"]=12661, - ["pieupthieuthkorean"]=12663, - ["pieuptikeutkorean"]=12659, - ["pihiragana"]=12404, - ["pikatakana"]=12500, - ["pisymbolgreek"]=982, - ["piwrarmenian"]=1411, - ["plus"]=43, - ["plusbelowcmb"]=799, - ["pluscircle"]=8853, - ["plusminus"]=177, - ["plusmod"]=726, - ["plusmonospace"]=65291, - ["plussmall"]=65122, - ["plussuperior"]=8314, - ["pmonospace"]=65360, - ["pmsquare"]=13272, - ["pohiragana"]=12413, - ["pointingindexdownwhite"]=9759, - ["pointingindexleftwhite"]=9756, - ["pointingindexrightwhite"]=9758, - ["pointingindexupwhite"]=9757, - ["pokatakana"]=12509, - ["poplathai"]=3611, - ["postalmark"]=12306, - ["postalmarkface"]=12320, - ["pparen"]=9387, - ["precedes"]=8826, - ["prescription"]=8478, - ["primemod"]=697, - ["primereversed"]=8245, - ["product"]=8719, - ["projective"]=8965, - ["prolongedkana"]=12540, - ["propellor"]=8984, - ["proportion"]=8759, - ["proportional"]=8733, - ["psi"]=968, - ["psicyrillic"]=1137, - ["psilipneumatacyrilliccmb"]=1158, - ["pssquare"]=13232, - ["puhiragana"]=12407, - ["pukatakana"]=12503, - ["pvsquare"]=13236, - ["pwsquare"]=13242, - ["q"]=113, - ["qadeva"]=2392, - ["qadmahebrew"]=1448, - ["qafarabic"]=1602, - ["qaffinalarabic"]=65238, - ["qafinitialarabic"]=65239, - ["qafmedialarabic"]=65240, - ["qamatswidehebrew"]=1464, - ["qarneyparahebrew"]=1439, - ["qbopomofo"]=12561, - ["qcircle"]=9440, - ["qhook"]=672, - ["qmonospace"]=65361, - ["qofdageshhebrew"]=64327, - ["qoftserehebrew"]=1511, - ["qparen"]=9388, - ["quarternote"]=9833, - ["qubutswidehebrew"]=1467, - ["question"]=63, - ["questionarabic"]=1567, - ["questionarmenian"]=1374, - ["questiondown"]=191, - ["questiongreek"]=894, - ["questionmonospace"]=65311, - ["quotedbl"]=34, - ["quotedblbase"]=8222, - ["quotedblleft"]=8220, - ["quotedblmonospace"]=65282, - ["quotedblprime"]=12318, - ["quotedblprimereversed"]=12317, - ["quotedblright"]=8221, - ["quoteleft"]=8216, - ["quotereversed"]=8219, - ["quoteright"]=8217, - ["quoterightn"]=329, - ["quotesinglbase"]=8218, - ["quotesingle"]=39, - ["quotesinglemonospace"]=65287, - ["r"]=114, - ["raarmenian"]=1404, - ["rabengali"]=2480, - ["racute"]=341, - ["radeva"]=2352, - ["radical"]=8730, - ["radoverssquare"]=13230, - ["radoverssquaredsquare"]=13231, - ["radsquare"]=13229, - ["rafehebrew"]=1471, - ["ragujarati"]=2736, - ["ragurmukhi"]=2608, - ["rahiragana"]=12425, - ["rakatakana"]=12521, - ["rakatakanahalfwidth"]=65431, - ["ralowerdiagonalbengali"]=2545, - ["ramiddlediagonalbengali"]=2544, - ["ramshorn"]=612, - ["ratio"]=8758, - ["rbopomofo"]=12566, - ["rcaron"]=345, - ["rcircle"]=9441, - ["rcommaaccent"]=343, - ["rdblgrave"]=529, - ["rdotaccent"]=7769, - ["rdotbelow"]=7771, - ["rdotbelowmacron"]=7773, - ["referencemark"]=8251, - ["registered"]=174, - ["reharmenian"]=1408, - ["rehfinalarabic"]=65198, - ["rehiragana"]=12428, - ["rehyehaleflamarabic"]=1585, - ["rekatakana"]=12524, - ["rekatakanahalfwidth"]=65434, - ["reshdageshhebrew"]=64328, - ["reshtserehebrew"]=1512, - ["reversedtilde"]=8765, - ["reviamugrashhebrew"]=1431, - ["revlogicalnot"]=8976, - ["rfishhook"]=638, - ["rfishhookreversed"]=639, - ["rhabengali"]=2525, - ["rhadeva"]=2397, - ["rho"]=961, - ["rhook"]=637, - ["rhookturned"]=635, - ["rhookturnedsuperior"]=693, - ["rhosymbolgreek"]=1009, - ["rhotichookmod"]=734, - ["rieulacirclekorean"]=12913, - ["rieulaparenkorean"]=12817, - ["rieulcirclekorean"]=12899, - ["rieulhieuhkorean"]=12608, - ["rieulkiyeokkorean"]=12602, - ["rieulkiyeoksioskorean"]=12649, - ["rieulkorean"]=12601, - ["rieulmieumkorean"]=12603, - ["rieulpansioskorean"]=12652, - ["rieulparenkorean"]=12803, - ["rieulphieuphkorean"]=12607, - ["rieulpieupkorean"]=12604, - ["rieulpieupsioskorean"]=12651, - ["rieulsioskorean"]=12605, - ["rieulthieuthkorean"]=12606, - ["rieultikeutkorean"]=12650, - ["rieulyeorinhieuhkorean"]=12653, - ["rightangle"]=8735, - ["righttackbelowcmb"]=793, - ["righttriangle"]=8895, - ["rihiragana"]=12426, - ["rikatakana"]=12522, - ["rikatakanahalfwidth"]=65432, - ["ring"]=730, - ["ringbelowcmb"]=805, - ["ringcmb"]=778, - ["ringhalfleft"]=703, - ["ringhalfleftarmenian"]=1369, - ["ringhalfleftbelowcmb"]=796, - ["ringhalfleftcentered"]=723, - ["ringhalfright"]=702, - ["ringhalfrightbelowcmb"]=825, - ["ringhalfrightcentered"]=722, - ["rinvertedbreve"]=531, - ["rittorusquare"]=13137, - ["rlinebelow"]=7775, - ["rlongleg"]=636, - ["rlonglegturned"]=634, - ["rmonospace"]=65362, - ["rohiragana"]=12429, - ["rokatakana"]=12525, - ["rokatakanahalfwidth"]=65435, - ["roruathai"]=3619, - ["rparen"]=9389, - ["rrabengali"]=2524, - ["rradeva"]=2353, - ["rragurmukhi"]=2652, - ["rreharabic"]=1681, - ["rrehfinalarabic"]=64397, - ["rrvocalicbengali"]=2528, - ["rrvocalicdeva"]=2400, - ["rrvocalicgujarati"]=2784, - ["rrvocalicvowelsignbengali"]=2500, - ["rrvocalicvowelsigndeva"]=2372, - ["rrvocalicvowelsigngujarati"]=2756, - ["rtblock"]=9616, - ["rturned"]=633, - ["rturnedsuperior"]=692, - ["ruhiragana"]=12427, - ["rukatakana"]=12523, - ["rukatakanahalfwidth"]=65433, - ["rupeemarkbengali"]=2546, - ["rupeesignbengali"]=2547, - ["ruthai"]=3620, - ["rvocalicbengali"]=2443, - ["rvocalicdeva"]=2315, - ["rvocalicgujarati"]=2699, - ["rvocalicvowelsignbengali"]=2499, - ["rvocalicvowelsigndeva"]=2371, - ["rvocalicvowelsigngujarati"]=2755, - ["s"]=115, - ["sabengali"]=2488, - ["sacute"]=347, - ["sacutedotaccent"]=7781, - ["sadarabic"]=1589, - ["sadeva"]=2360, - ["sadfinalarabic"]=65210, - ["sadinitialarabic"]=65211, - ["sadmedialarabic"]=65212, - ["sagujarati"]=2744, - ["sagurmukhi"]=2616, - ["sahiragana"]=12373, - ["sakatakana"]=12469, - ["sakatakanahalfwidth"]=65403, - ["sallallahoualayhewasallamarabic"]=65018, - ["samekhdageshhebrew"]=64321, - ["samekhhebrew"]=1505, - ["saraaathai"]=3634, - ["saraaethai"]=3649, - ["saraaimaimalaithai"]=3652, - ["saraaimaimuanthai"]=3651, - ["saraamthai"]=3635, - ["saraathai"]=3632, - ["saraethai"]=3648, - ["saraiithai"]=3637, - ["saraithai"]=3636, - ["saraothai"]=3650, - ["saraueethai"]=3639, - ["sarauethai"]=3638, - ["sarauthai"]=3640, - ["sarauuthai"]=3641, - ["sbopomofo"]=12569, - ["scaron"]=353, - ["scarondotaccent"]=7783, - ["scedilla"]=351, - ["schwa"]=601, - ["schwacyrillic"]=1241, - ["schwadieresiscyrillic"]=1243, - ["schwahook"]=602, - ["scircle"]=9442, - ["scircumflex"]=349, - ["scommaaccent"]=537, - ["sdotaccent"]=7777, - ["sdotbelow"]=7779, - ["sdotbelowdotaccent"]=7785, - ["seagullbelowcmb"]=828, - ["second"]=8243, - ["secondtonechinese"]=714, - ["section"]=167, - ["seenarabic"]=1587, - ["seenfinalarabic"]=65202, - ["seeninitialarabic"]=65203, - ["seenmedialarabic"]=65204, - ["segoltahebrew"]=1426, - ["segolwidehebrew"]=1462, - ["seharmenian"]=1405, - ["sehiragana"]=12379, - ["sekatakana"]=12475, - ["sekatakanahalfwidth"]=65406, - ["semicolon"]=59, - ["semicolonarabic"]=1563, - ["semicolonmonospace"]=65307, - ["semicolonsmall"]=65108, - ["semivoicedmarkkana"]=12444, - ["semivoicedmarkkanahalfwidth"]=65439, - ["sentisquare"]=13090, - ["sentosquare"]=13091, - ["seven"]=55, - ["sevenbengali"]=2541, - ["sevencircle"]=9318, - ["sevencircleinversesansserif"]=10128, - ["sevendeva"]=2413, - ["seveneighths"]=8542, - ["sevengujarati"]=2797, - ["sevengurmukhi"]=2669, - ["sevenhackarabic"]=1639, - ["sevenhangzhou"]=12327, - ["sevenideographicparen"]=12838, - ["seveninferior"]=8327, - ["sevenmonospace"]=65303, - ["sevenparen"]=9338, - ["sevenperiod"]=9358, - ["sevenpersian"]=1783, - ["sevenroman"]=8566, - ["sevensuperior"]=8311, - ["seventeencircle"]=9328, - ["seventeenparen"]=9348, - ["seventeenperiod"]=9368, - ["seventhai"]=3671, - ["shaarmenian"]=1399, - ["shabengali"]=2486, - ["shacyrillic"]=1096, - ["shaddadammaarabic"]=64609, - ["shaddadammatanarabic"]=64606, - ["shaddafathaarabic"]=64608, - ["shaddafathatanarabic"]=1617, - ["shaddakasraarabic"]=64610, - ["shaddakasratanarabic"]=64607, - ["shadedark"]=9619, - ["shadelight"]=9617, - ["shademedium"]=9618, - ["shadeva"]=2358, - ["shagujarati"]=2742, - ["shagurmukhi"]=2614, - ["shalshelethebrew"]=1427, - ["shbopomofo"]=12565, - ["shchacyrillic"]=1097, - ["sheenarabic"]=1588, - ["sheenfinalarabic"]=65206, - ["sheeninitialarabic"]=65207, - ["sheenmedialarabic"]=65208, - ["sheicoptic"]=995, - ["sheqelhebrew"]=8362, - ["shevawidehebrew"]=1456, - ["shhacyrillic"]=1211, - ["shimacoptic"]=1005, - ["shindageshhebrew"]=64329, - ["shindageshshindothebrew"]=64300, - ["shindageshsindothebrew"]=64301, - ["shindothebrew"]=1473, - ["shinhebrew"]=1513, - ["shinshindothebrew"]=64298, - ["shinsindothebrew"]=64299, - ["shook"]=642, - ["sigma"]=963, - ["sigmafinal"]=962, - ["sigmalunatesymbolgreek"]=1010, - ["sihiragana"]=12375, - ["sikatakana"]=12471, - ["sikatakanahalfwidth"]=65404, - ["siluqlefthebrew"]=1469, - ["sindothebrew"]=1474, - ["siosacirclekorean"]=12916, - ["siosaparenkorean"]=12820, - ["sioscieuckorean"]=12670, - ["sioscirclekorean"]=12902, - ["sioskiyeokkorean"]=12666, - ["sioskorean"]=12613, - ["siosnieunkorean"]=12667, - ["siosparenkorean"]=12806, - ["siospieupkorean"]=12669, - ["siostikeutkorean"]=12668, - ["six"]=54, - ["sixbengali"]=2540, - ["sixcircle"]=9317, - ["sixcircleinversesansserif"]=10127, - ["sixdeva"]=2412, - ["sixgujarati"]=2796, - ["sixgurmukhi"]=2668, - ["sixhackarabic"]=1638, - ["sixhangzhou"]=12326, - ["sixideographicparen"]=12837, - ["sixinferior"]=8326, - ["sixmonospace"]=65302, - ["sixparen"]=9337, - ["sixperiod"]=9357, - ["sixpersian"]=1782, - ["sixroman"]=8565, - ["sixsuperior"]=8310, - ["sixteencircle"]=9327, - ["sixteencurrencydenominatorbengali"]=2553, - ["sixteenparen"]=9347, - ["sixteenperiod"]=9367, - ["sixthai"]=3670, - ["slash"]=47, - ["slashmonospace"]=65295, - ["slong"]=383, - ["slongdotaccent"]=7835, - ["smonospace"]=65363, - ["sofpasuqhebrew"]=1475, - ["softhyphen"]=173, - ["softsigncyrillic"]=1100, - ["sohiragana"]=12381, - ["sokatakana"]=12477, - ["sokatakanahalfwidth"]=65407, - ["soliduslongoverlaycmb"]=824, - ["solidusshortoverlaycmb"]=823, - ["sorusithai"]=3625, - ["sosalathai"]=3624, - ["sosothai"]=3595, - ["sosuathai"]=3626, - ["space"]=32, - ["spadesuitblack"]=9824, - ["spadesuitwhite"]=9828, - ["sparen"]=9390, - ["squarebelowcmb"]=827, - ["squarecc"]=13252, - ["squarecm"]=13213, - ["squarediagonalcrosshatchfill"]=9641, - ["squarehorizontalfill"]=9636, - ["squarekg"]=13199, - ["squarekm"]=13214, - ["squarekmcapital"]=13262, - ["squareln"]=13265, - ["squarelog"]=13266, - ["squaremg"]=13198, - ["squaremil"]=13269, - ["squaremm"]=13212, - ["squaremsquared"]=13217, - ["squareorthogonalcrosshatchfill"]=9638, - ["squareupperlefttolowerrightfill"]=9639, - ["squareupperrighttolowerleftfill"]=9640, - ["squareverticalfill"]=9637, - ["squarewhitewithsmallblack"]=9635, - ["srsquare"]=13275, - ["ssabengali"]=2487, - ["ssadeva"]=2359, - ["ssagujarati"]=2743, - ["ssangcieuckorean"]=12617, - ["ssanghieuhkorean"]=12677, - ["ssangieungkorean"]=12672, - ["ssangkiyeokkorean"]=12594, - ["ssangnieunkorean"]=12645, - ["ssangpieupkorean"]=12611, - ["ssangsioskorean"]=12614, - ["ssangtikeutkorean"]=12600, - ["sterling"]=163, - ["sterlingmonospace"]=65505, - ["strokelongoverlaycmb"]=822, - ["strokeshortoverlaycmb"]=821, - ["subset"]=8834, - ["subsetnotequal"]=8842, - ["subsetorequal"]=8838, - ["succeeds"]=8827, - ["suchthat"]=8715, - ["suhiragana"]=12377, - ["sukatakana"]=12473, - ["sukatakanahalfwidth"]=65405, - ["sukunarabic"]=1618, - ["summation"]=8721, - ["sun"]=9788, - ["superset"]=8835, - ["supersetnotequal"]=8843, - ["supersetorequal"]=8839, - ["svsquare"]=13276, - ["syouwaerasquare"]=13180, - ["t"]=116, - ["tabengali"]=2468, - ["tackdown"]=8868, - ["tackleft"]=8867, - ["tadeva"]=2340, - ["tagujarati"]=2724, - ["tagurmukhi"]=2596, - ["taharabic"]=1591, - ["tahfinalarabic"]=65218, - ["tahinitialarabic"]=65219, - ["tahiragana"]=12383, - ["tahmedialarabic"]=65220, - ["taisyouerasquare"]=13181, - ["takatakana"]=12479, - ["takatakanahalfwidth"]=65408, - ["tatweelarabic"]=1600, - ["tau"]=964, - ["tavdageshhebrew"]=64330, - ["tavhebrew"]=1514, - ["tbar"]=359, - ["tbopomofo"]=12554, - ["tcaron"]=357, - ["tccurl"]=680, - ["tcheharabic"]=1670, - ["tchehfinalarabic"]=64379, - ["tchehmedialarabic"]=64381, - ["tchehmeeminitialarabic"]=64380, - ["tcircle"]=9443, - ["tcircumflexbelow"]=7793, - ["tcommaaccent"]=355, - ["tdieresis"]=7831, - ["tdotaccent"]=7787, - ["tdotbelow"]=7789, - ["tecyrillic"]=1090, - ["tedescendercyrillic"]=1197, - ["teharabic"]=1578, - ["tehfinalarabic"]=65174, - ["tehhahinitialarabic"]=64674, - ["tehhahisolatedarabic"]=64524, - ["tehinitialarabic"]=65175, - ["tehiragana"]=12390, - ["tehjeeminitialarabic"]=64673, - ["tehjeemisolatedarabic"]=64523, - ["tehmarbutaarabic"]=1577, - ["tehmarbutafinalarabic"]=65172, - ["tehmedialarabic"]=65176, - ["tehmeeminitialarabic"]=64676, - ["tehmeemisolatedarabic"]=64526, - ["tehnoonfinalarabic"]=64627, - ["tekatakana"]=12486, - ["tekatakanahalfwidth"]=65411, - ["telephone"]=8481, - ["telephoneblack"]=9742, - ["telishagedolahebrew"]=1440, - ["telishaqetanahebrew"]=1449, - ["tencircle"]=9321, - ["tenideographicparen"]=12841, - ["tenparen"]=9341, - ["tenperiod"]=9361, - ["tenroman"]=8569, - ["tesh"]=679, - ["tetdageshhebrew"]=64312, - ["tethebrew"]=1496, - ["tetsecyrillic"]=1205, - ["tevirlefthebrew"]=1435, - ["thabengali"]=2469, - ["thadeva"]=2341, - ["thagujarati"]=2725, - ["thagurmukhi"]=2597, - ["thalarabic"]=1584, - ["thalfinalarabic"]=65196, - ["thanthakhatthai"]=3660, - ["theharabic"]=1579, - ["thehfinalarabic"]=65178, - ["thehinitialarabic"]=65179, - ["thehmedialarabic"]=65180, - ["thereexists"]=8707, - ["therefore"]=8756, - ["theta"]=952, - ["thetasymbolgreek"]=977, - ["thieuthacirclekorean"]=12921, - ["thieuthaparenkorean"]=12825, - ["thieuthcirclekorean"]=12907, - ["thieuthkorean"]=12620, - ["thieuthparenkorean"]=12811, - ["thirteencircle"]=9324, - ["thirteenparen"]=9344, - ["thirteenperiod"]=9364, - ["thonangmonthothai"]=3601, - ["thook"]=429, - ["thophuthaothai"]=3602, - ["thorn"]=254, - ["thothahanthai"]=3607, - ["thothanthai"]=3600, - ["thothongthai"]=3608, - ["thothungthai"]=3606, - ["thousandcyrillic"]=1154, - ["thousandsseparatorpersian"]=1644, - ["three"]=51, - ["threebengali"]=2537, - ["threecircle"]=9314, - ["threecircleinversesansserif"]=10124, - ["threedeva"]=2409, - ["threeeighths"]=8540, - ["threegujarati"]=2793, - ["threegurmukhi"]=2665, - ["threehackarabic"]=1635, - ["threehangzhou"]=12323, - ["threeideographicparen"]=12834, - ["threeinferior"]=8323, - ["threemonospace"]=65299, - ["threenumeratorbengali"]=2550, - ["threeparen"]=9334, - ["threeperiod"]=9354, - ["threepersian"]=1779, - ["threequarters"]=190, - ["threeroman"]=8562, - ["threesuperior"]=179, - ["threethai"]=3667, - ["thzsquare"]=13204, - ["tihiragana"]=12385, - ["tikatakana"]=12481, - ["tikatakanahalfwidth"]=65409, - ["tikeutacirclekorean"]=12912, - ["tikeutaparenkorean"]=12816, - ["tikeutcirclekorean"]=12898, - ["tikeutkorean"]=12599, - ["tikeutparenkorean"]=12802, - ["tilde"]=732, - ["tildebelowcmb"]=816, - ["tildecomb"]=771, - ["tildedoublecmb"]=864, - ["tildeoperator"]=8764, - ["tildeoverlaycmb"]=820, - ["tildeverticalcmb"]=830, - ["timescircle"]=8855, - ["tipehalefthebrew"]=1430, - ["tippigurmukhi"]=2672, - ["titlocyrilliccmb"]=1155, - ["tiwnarmenian"]=1407, - ["tlinebelow"]=7791, - ["tmonospace"]=65364, - ["toarmenian"]=1385, - ["tohiragana"]=12392, - ["tokatakana"]=12488, - ["tokatakanahalfwidth"]=65412, - ["tonebarextrahighmod"]=741, - ["tonebarextralowmod"]=745, - ["tonebarhighmod"]=742, - ["tonebarlowmod"]=744, - ["tonebarmidmod"]=743, - ["tonefive"]=445, - ["tonesix"]=389, - ["tonetwo"]=424, - ["tonos"]=900, - ["tonsquare"]=13095, - ["topatakthai"]=3599, - ["tortoiseshellbracketleft"]=12308, - ["tortoiseshellbracketleftsmall"]=65117, - ["tortoiseshellbracketleftvertical"]=65081, - ["tortoiseshellbracketright"]=12309, - ["tortoiseshellbracketrightsmall"]=65118, - ["tortoiseshellbracketrightvertical"]=65082, - ["totaothai"]=3605, - ["tpalatalhook"]=427, - ["tparen"]=9391, - ["trademark"]=8482, - ["tretroflexhook"]=648, - ["triagdn"]=9660, - ["triaglf"]=9668, - ["triagrt"]=9658, - ["triagup"]=9650, - ["ts"]=678, - ["tsadidageshhebrew"]=64326, - ["tsadihebrew"]=1510, - ["tsecyrillic"]=1094, - ["tserewidehebrew"]=1461, - ["tshecyrillic"]=1115, - ["ttabengali"]=2463, - ["ttadeva"]=2335, - ["ttagujarati"]=2719, - ["ttagurmukhi"]=2591, - ["tteharabic"]=1657, - ["ttehfinalarabic"]=64359, - ["ttehinitialarabic"]=64360, - ["ttehmedialarabic"]=64361, - ["tthabengali"]=2464, - ["tthadeva"]=2336, - ["tthagujarati"]=2720, - ["tthagurmukhi"]=2592, - ["tturned"]=647, - ["tuhiragana"]=12388, - ["tukatakana"]=12484, - ["tukatakanahalfwidth"]=65410, - ["tusmallhiragana"]=12387, - ["tusmallkatakana"]=12483, - ["tusmallkatakanahalfwidth"]=65391, - ["twelvecircle"]=9323, - ["twelveparen"]=9343, - ["twelveperiod"]=9363, - ["twelveroman"]=8571, - ["twentycircle"]=9331, - ["twentyparen"]=9351, - ["twentyperiod"]=9371, - ["two"]=50, - ["twobengali"]=2536, - ["twocircle"]=9313, - ["twocircleinversesansserif"]=10123, - ["twodeva"]=2408, - ["twodotleader"]=8229, - ["twodotleadervertical"]=65072, - ["twogujarati"]=2792, - ["twogurmukhi"]=2664, - ["twohackarabic"]=1634, - ["twohangzhou"]=12322, - ["twoideographicparen"]=12833, - ["twoinferior"]=8322, - ["twomonospace"]=65298, - ["twonumeratorbengali"]=2549, - ["twoparen"]=9333, - ["twoperiod"]=9353, - ["twopersian"]=1778, - ["tworoman"]=8561, - ["twostroke"]=443, - ["twosuperior"]=178, - ["twothai"]=3666, - ["twothirds"]=8532, - ["u"]=117, - ["uacute"]=250, - ["ubar"]=649, - ["ubengali"]=2441, - ["ubopomofo"]=12584, - ["ubreve"]=365, - ["ucaron"]=468, - ["ucircle"]=9444, - ["ucircumflex"]=251, - ["ucircumflexbelow"]=7799, - ["ucyrillic"]=1091, - ["udattadeva"]=2385, - ["udblgrave"]=533, - ["udeva"]=2313, - ["udieresis"]=252, - ["udieresisacute"]=472, - ["udieresisbelow"]=7795, - ["udieresiscaron"]=474, - ["udieresiscyrillic"]=1265, - ["udieresisgrave"]=476, - ["udieresismacron"]=470, - ["udotbelow"]=7909, - ["ugrave"]=249, - ["ugujarati"]=2697, - ["ugurmukhi"]=2569, - ["uhiragana"]=12358, - ["uhookabove"]=7911, - ["uhorn"]=432, - ["uhornacute"]=7913, - ["uhorndotbelow"]=7921, - ["uhorngrave"]=7915, - ["uhornhookabove"]=7917, - ["uhorntilde"]=7919, - ["uhungarumlaut"]=369, - ["uhungarumlautcyrillic"]=1267, - ["uinvertedbreve"]=535, - ["ukatakana"]=12454, - ["ukatakanahalfwidth"]=65395, - ["ukcyrillic"]=1145, - ["ukorean"]=12636, - ["umacron"]=363, - ["umacroncyrillic"]=1263, - ["umacrondieresis"]=7803, - ["umatragurmukhi"]=2625, - ["umonospace"]=65365, - ["underscore"]=95, - ["underscoredbl"]=8215, - ["underscoremonospace"]=65343, - ["underscorevertical"]=65075, - ["underscorewavy"]=65103, - ["union"]=8746, - ["universal"]=8704, - ["uogonek"]=371, - ["uparen"]=9392, - ["upblock"]=9600, - ["upperdothebrew"]=1476, - ["upsilon"]=965, - ["upsilondieresis"]=971, - ["upsilondieresistonos"]=944, - ["upsilonlatin"]=650, - ["upsilontonos"]=973, - ["uptackbelowcmb"]=797, - ["uptackmod"]=724, - ["uragurmukhi"]=2675, - ["uring"]=367, - ["ushortcyrillic"]=1118, - ["usmallhiragana"]=12357, - ["usmallkatakana"]=12453, - ["usmallkatakanahalfwidth"]=65385, - ["ustraightcyrillic"]=1199, - ["ustraightstrokecyrillic"]=1201, - ["utilde"]=361, - ["utildeacute"]=7801, - ["utildebelow"]=7797, - ["uubengali"]=2442, - ["uudeva"]=2314, - ["uugujarati"]=2698, - ["uugurmukhi"]=2570, - ["uumatragurmukhi"]=2626, - ["uuvowelsignbengali"]=2498, - ["uuvowelsigndeva"]=2370, - ["uuvowelsigngujarati"]=2754, - ["uvowelsignbengali"]=2497, - ["uvowelsigndeva"]=2369, - ["uvowelsigngujarati"]=2753, - ["v"]=118, - ["vadeva"]=2357, - ["vagujarati"]=2741, - ["vagurmukhi"]=2613, - ["vakatakana"]=12535, - ["vavdageshhebrew"]=64309, - ["vavhebrew"]=1493, - ["vavholamhebrew"]=64331, - ["vavvavhebrew"]=1520, - ["vavyodhebrew"]=1521, - ["vcircle"]=9445, - ["vdotbelow"]=7807, - ["vecyrillic"]=1074, - ["veharabic"]=1700, - ["vehfinalarabic"]=64363, - ["vehinitialarabic"]=64364, - ["vehmedialarabic"]=64365, - ["vekatakana"]=12537, - ["venus"]=9792, - ["verticalbar"]=124, - ["verticallineabovecmb"]=781, - ["verticallinebelowcmb"]=809, - ["verticallinelowmod"]=716, - ["verticallinemod"]=712, - ["vewarmenian"]=1406, - ["vhook"]=651, - ["vikatakana"]=12536, - ["viramabengali"]=2509, - ["viramadeva"]=2381, - ["viramagujarati"]=2765, - ["visargabengali"]=2435, - ["visargadeva"]=2307, - ["visargagujarati"]=2691, - ["vmonospace"]=65366, - ["voarmenian"]=1400, - ["voicediterationhiragana"]=12446, - ["voicediterationkatakana"]=12542, - ["voicedmarkkana"]=12443, - ["voicedmarkkanahalfwidth"]=65438, - ["vokatakana"]=12538, - ["vparen"]=9393, - ["vtilde"]=7805, - ["vturned"]=652, - ["vuhiragana"]=12436, - ["vukatakana"]=12532, - ["w"]=119, - ["wacute"]=7811, - ["waekorean"]=12633, - ["wahiragana"]=12431, - ["wakatakana"]=12527, - ["wakatakanahalfwidth"]=65436, - ["wakorean"]=12632, - ["wasmallhiragana"]=12430, - ["wasmallkatakana"]=12526, - ["wattosquare"]=13143, - ["wavedash"]=12316, - ["wavyunderscorevertical"]=65076, - ["wawarabic"]=1608, - ["wawfinalarabic"]=65262, - ["wawhamzaabovearabic"]=1572, - ["wawhamzaabovefinalarabic"]=65158, - ["wbsquare"]=13277, - ["wcircle"]=9446, - ["wcircumflex"]=373, - ["wdieresis"]=7813, - ["wdotaccent"]=7815, - ["wdotbelow"]=7817, - ["wehiragana"]=12433, - ["weierstrass"]=8472, - ["wekatakana"]=12529, - ["wekorean"]=12638, - ["weokorean"]=12637, - ["wgrave"]=7809, - ["whitebullet"]=9702, - ["whitecircle"]=9675, - ["whitecircleinverse"]=9689, - ["whitecornerbracketleft"]=12302, - ["whitecornerbracketleftvertical"]=65091, - ["whitecornerbracketright"]=12303, - ["whitecornerbracketrightvertical"]=65092, - ["whitediamond"]=9671, - ["whitediamondcontainingblacksmalldiamond"]=9672, - ["whitedownpointingsmalltriangle"]=9663, - ["whitedownpointingtriangle"]=9661, - ["whiteleftpointingsmalltriangle"]=9667, - ["whiteleftpointingtriangle"]=9665, - ["whitelenticularbracketleft"]=12310, - ["whitelenticularbracketright"]=12311, - ["whiterightpointingsmalltriangle"]=9657, - ["whiterightpointingtriangle"]=9655, - ["whitesmallsquare"]=9643, - ["whitesmilingface"]=9786, - ["whitesquare"]=9633, - ["whitestar"]=9734, - ["whitetelephone"]=9743, - ["whitetortoiseshellbracketleft"]=12312, - ["whitetortoiseshellbracketright"]=12313, - ["whiteuppointingsmalltriangle"]=9653, - ["whiteuppointingtriangle"]=9651, - ["wihiragana"]=12432, - ["wikatakana"]=12528, - ["wikorean"]=12639, - ["wmonospace"]=65367, - ["wohiragana"]=12434, - ["wokatakana"]=12530, - ["wokatakanahalfwidth"]=65382, - ["won"]=8361, - ["wonmonospace"]=65510, - ["wowaenthai"]=3623, - ["wparen"]=9394, - ["wring"]=7832, - ["wsuperior"]=695, - ["wturned"]=653, - ["wynn"]=447, - ["x"]=120, - ["xabovecmb"]=829, - ["xbopomofo"]=12562, - ["xcircle"]=9447, - ["xdieresis"]=7821, - ["xdotaccent"]=7819, - ["xeharmenian"]=1389, - ["xi"]=958, - ["xmonospace"]=65368, - ["xparen"]=9395, - ["xsuperior"]=739, - ["y"]=121, - ["yaadosquare"]=13134, - ["yabengali"]=2479, - ["yacute"]=253, - ["yadeva"]=2351, - ["yaekorean"]=12626, - ["yagujarati"]=2735, - ["yagurmukhi"]=2607, - ["yahiragana"]=12420, - ["yakatakana"]=12516, - ["yakatakanahalfwidth"]=65428, - ["yakorean"]=12625, - ["yamakkanthai"]=3662, - ["yasmallhiragana"]=12419, - ["yasmallkatakana"]=12515, - ["yasmallkatakanahalfwidth"]=65388, - ["yatcyrillic"]=1123, - ["ycircle"]=9448, - ["ycircumflex"]=375, - ["ydieresis"]=255, - ["ydotaccent"]=7823, - ["ydotbelow"]=7925, - ["yeharabic"]=1610, - ["yehbarreearabic"]=1746, - ["yehbarreefinalarabic"]=64431, - ["yehfinalarabic"]=65266, - ["yehhamzaabovearabic"]=1574, - ["yehhamzaabovefinalarabic"]=65162, - ["yehhamzaaboveinitialarabic"]=65163, - ["yehhamzaabovemedialarabic"]=65164, - ["yehinitialarabic"]=65267, - ["yehmedialarabic"]=65268, - ["yehmeeminitialarabic"]=64733, - ["yehmeemisolatedarabic"]=64600, - ["yehnoonfinalarabic"]=64660, - ["yehthreedotsbelowarabic"]=1745, - ["yekorean"]=12630, - ["yen"]=165, - ["yenmonospace"]=65509, - ["yeokorean"]=12629, - ["yeorinhieuhkorean"]=12678, - ["yerahbenyomolefthebrew"]=1450, - ["yericyrillic"]=1099, - ["yerudieresiscyrillic"]=1273, - ["yesieungkorean"]=12673, - ["yesieungpansioskorean"]=12675, - ["yesieungsioskorean"]=12674, - ["yetivhebrew"]=1434, - ["ygrave"]=7923, - ["yhook"]=436, - ["yhookabove"]=7927, - ["yiarmenian"]=1397, - ["yicyrillic"]=1111, - ["yikorean"]=12642, - ["yinyang"]=9775, - ["yiwnarmenian"]=1410, - ["ymonospace"]=65369, - ["yoddageshhebrew"]=64313, - ["yodhebrew"]=1497, - ["yodyodhebrew"]=1522, - ["yodyodpatahhebrew"]=64287, - ["yohiragana"]=12424, - ["yoikorean"]=12681, - ["yokatakana"]=12520, - ["yokatakanahalfwidth"]=65430, - ["yokorean"]=12635, - ["yosmallhiragana"]=12423, - ["yosmallkatakana"]=12519, - ["yosmallkatakanahalfwidth"]=65390, - ["yotgreek"]=1011, - ["yoyaekorean"]=12680, - ["yoyakorean"]=12679, - ["yoyakthai"]=3618, - ["yoyingthai"]=3597, - ["yparen"]=9396, - ["ypogegrammeni"]=890, - ["ypogegrammenigreekcmb"]=837, - ["yr"]=422, - ["yring"]=7833, - ["ysuperior"]=696, - ["ytilde"]=7929, - ["yturned"]=654, - ["yuhiragana"]=12422, - ["yuikorean"]=12684, - ["yukatakana"]=12518, - ["yukatakanahalfwidth"]=65429, - ["yukorean"]=12640, - ["yusbigcyrillic"]=1131, - ["yusbigiotifiedcyrillic"]=1133, - ["yuslittlecyrillic"]=1127, - ["yuslittleiotifiedcyrillic"]=1129, - ["yusmallhiragana"]=12421, - ["yusmallkatakana"]=12517, - ["yusmallkatakanahalfwidth"]=65389, - ["yuyekorean"]=12683, - ["yuyeokorean"]=12682, - ["yyabengali"]=2527, - ["yyadeva"]=2399, - ["z"]=122, - ["zaarmenian"]=1382, - ["zacute"]=378, - ["zadeva"]=2395, - ["zagurmukhi"]=2651, - ["zaharabic"]=1592, - ["zahfinalarabic"]=65222, - ["zahinitialarabic"]=65223, - ["zahiragana"]=12374, - ["zahmedialarabic"]=65224, - ["zainarabic"]=1586, - ["zainfinalarabic"]=65200, - ["zakatakana"]=12470, - ["zaqefgadolhebrew"]=1429, - ["zaqefqatanhebrew"]=1428, - ["zarqahebrew"]=1432, - ["zayindageshhebrew"]=64310, - ["zayinhebrew"]=1494, - ["zbopomofo"]=12567, - ["zcaron"]=382, - ["zcircle"]=9449, - ["zcircumflex"]=7825, - ["zcurl"]=657, - ["zdotaccent"]=380, - ["zdotbelow"]=7827, - ["zecyrillic"]=1079, - ["zedescendercyrillic"]=1177, - ["zedieresiscyrillic"]=1247, - ["zehiragana"]=12380, - ["zekatakana"]=12476, - ["zero"]=48, - ["zerobengali"]=2534, - ["zerodeva"]=2406, - ["zerogujarati"]=2790, - ["zerogurmukhi"]=2662, - ["zerohackarabic"]=1632, - ["zeroinferior"]=8320, - ["zeromonospace"]=65296, - ["zeropersian"]=1776, - ["zerosuperior"]=8304, - ["zerothai"]=3664, - ["zerowidthjoiner"]=65279, - ["zerowidthnonjoiner"]=8204, - ["zerowidthspace"]=8203, - ["zeta"]=950, - ["zhbopomofo"]=12563, - ["zhearmenian"]=1386, - ["zhebrevecyrillic"]=1218, - ["zhecyrillic"]=1078, - ["zhedescendercyrillic"]=1175, - ["zhedieresiscyrillic"]=1245, - ["zihiragana"]=12376, - ["zikatakana"]=12472, - ["zinorhebrew"]=1454, - ["zlinebelow"]=7829, - ["zmonospace"]=65370, - ["zohiragana"]=12382, - ["zokatakana"]=12478, - ["zparen"]=9397, - ["zretroflexhook"]=656, - ["zstroke"]=438, - ["zuhiragana"]=12378, - ["zukatakana"]=12474, - - -- extras - - ["Dcroat"]=272, - ["Delta"]=8710, - ["Euro"]=8364, - ["H18533"]=9679, - ["H18543"]=9642, - ["H18551"]=9643, - ["H22073"]=9633, - ["Ldot"]=319, - ["Oslashacute"]=510, - ["SF10000"]=9484, - ["SF20000"]=9492, - ["SF30000"]=9488, - ["SF40000"]=9496, - ["SF50000"]=9532, - ["SF60000"]=9516, - ["SF70000"]=9524, - ["SF80000"]=9500, - ["SF90000"]=9508, - ["Upsilon1"]=978, - ["afii10066"]=1073, - ["afii10067"]=1074, - ["afii10068"]=1075, - ["afii10069"]=1076, - ["afii10070"]=1077, - ["afii10071"]=1105, - ["afii10072"]=1078, - ["afii10073"]=1079, - ["afii10074"]=1080, - ["afii10075"]=1081, - ["afii10076"]=1082, - ["afii10077"]=1083, - ["afii10078"]=1084, - ["afii10079"]=1085, - ["afii10080"]=1086, - ["afii10081"]=1087, - ["afii10082"]=1088, - ["afii10083"]=1089, - ["afii10084"]=1090, - ["afii10085"]=1091, - ["afii10086"]=1092, - ["afii10087"]=1093, - ["afii10088"]=1094, - ["afii10089"]=1095, - ["afii10090"]=1096, - ["afii10091"]=1097, - ["afii10092"]=1098, - ["afii10093"]=1099, - ["afii10094"]=1100, - ["afii10095"]=1101, - ["afii10096"]=1102, - ["afii10097"]=1103, - ["afii10098"]=1169, - ["afii10099"]=1106, - ["afii10100"]=1107, - ["afii10101"]=1108, - ["afii10102"]=1109, - ["afii10103"]=1110, - ["afii10104"]=1111, - ["afii10105"]=1112, - ["afii10106"]=1113, - ["afii10107"]=1114, - ["afii10108"]=1115, - ["afii10109"]=1116, - ["afii10110"]=1118, - ["afii10193"]=1119, - ["afii10194"]=1123, - ["afii10195"]=1139, - ["afii10196"]=1141, - ["afii10846"]=1241, - ["afii208"]=8213, - ["afii57381"]=1642, - ["afii57388"]=1548, - ["afii57392"]=1632, - ["afii57393"]=1633, - ["afii57394"]=1634, - ["afii57395"]=1635, - ["afii57396"]=1636, - ["afii57397"]=1637, - ["afii57398"]=1638, - ["afii57399"]=1639, - ["afii57400"]=1640, - ["afii57401"]=1641, - ["afii57403"]=1563, - ["afii57407"]=1567, - ["afii57409"]=1569, - ["afii57410"]=1570, - ["afii57411"]=1571, - ["afii57412"]=1572, - ["afii57413"]=1573, - ["afii57414"]=1574, - ["afii57415"]=1575, - ["afii57416"]=1576, - ["afii57417"]=1577, - ["afii57418"]=1578, - ["afii57419"]=1579, - ["afii57420"]=1580, - ["afii57421"]=1581, - ["afii57422"]=1582, - ["afii57423"]=1583, - ["afii57424"]=1584, - ["afii57425"]=1585, - ["afii57426"]=1586, - ["afii57427"]=1587, - ["afii57428"]=1588, - ["afii57429"]=1589, - ["afii57430"]=1590, - ["afii57431"]=1591, - ["afii57432"]=1592, - ["afii57433"]=1593, - ["afii57434"]=1594, - ["afii57440"]=1600, - ["afii57441"]=1601, - ["afii57442"]=1602, - ["afii57443"]=1603, - ["afii57444"]=1604, - ["afii57445"]=1605, - ["afii57446"]=1606, - ["afii57448"]=1608, - ["afii57449"]=1609, - ["afii57450"]=1610, - ["afii57451"]=1611, - ["afii57452"]=1612, - ["afii57453"]=1613, - ["afii57454"]=1614, - ["afii57455"]=1615, - ["afii57456"]=1616, - ["afii57457"]=1617, - ["afii57458"]=1618, - ["afii57470"]=1607, - ["afii57505"]=1700, - ["afii57506"]=1662, - ["afii57507"]=1670, - ["afii57508"]=1688, - ["afii57509"]=1711, - ["afii57511"]=1657, - ["afii57512"]=1672, - ["afii57513"]=1681, - ["afii57514"]=1722, - ["afii57519"]=1746, - ["afii57636"]=8362, - ["afii57645"]=1470, - ["afii57658"]=1475, - ["afii57664"]=1488, - ["afii57665"]=1489, - ["afii57666"]=1490, - ["afii57667"]=1491, - ["afii57668"]=1492, - ["afii57669"]=1493, - ["afii57670"]=1494, - ["afii57671"]=1495, - ["afii57672"]=1496, - ["afii57673"]=1497, - ["afii57674"]=1498, - ["afii57675"]=1499, - ["afii57676"]=1500, - ["afii57677"]=1501, - ["afii57678"]=1502, - ["afii57679"]=1503, - ["afii57680"]=1504, - ["afii57681"]=1505, - ["afii57682"]=1506, - ["afii57683"]=1507, - ["afii57684"]=1508, - ["afii57685"]=1509, - ["afii57686"]=1510, - ["afii57687"]=1511, - ["afii57688"]=1512, - ["afii57689"]=1513, - ["afii57690"]=1514, - ["afii57716"]=1520, - ["afii57717"]=1521, - ["afii57718"]=1522, - ["afii57793"]=1460, - ["afii57794"]=1461, - ["afii57795"]=1462, - ["afii57796"]=1467, - ["afii57797"]=1464, - ["afii57798"]=1463, - ["afii57799"]=1456, - ["afii57800"]=1458, - ["afii57801"]=1457, - ["afii57802"]=1459, - ["afii57803"]=1474, - ["afii57804"]=1473, - ["afii57806"]=1465, - ["afii57807"]=1468, - ["afii57839"]=1469, - ["afii57841"]=1471, - ["afii57842"]=1472, - ["afii57929"]=700, - ["afii61248"]=8453, - ["afii61289"]=8467, - ["afii61352"]=8470, - ["afii61664"]=8204, - ["afii63167"]=1645, - ["afii64937"]=701, - ["arrowdblboth"]=8660, - ["arrowdblleft"]=8656, - ["arrowdblright"]=8658, - ["arrowupdnbse"]=8616, - ["bar"]=124, - ["circle"]=9675, - ["circlemultiply"]=8855, - ["circleplus"]=8853, - ["club"]=9827, - ["colonmonetary"]=8353, - ["dcroat"]=273, - ["dkshade"]=9619, - ["existential"]=8707, - ["female"]=9792, - ["gradient"]=8711, - ["heart"]=9829, - ["hookabovecomb"]=777, - ["invcircle"]=9689, - ["ldot"]=320, - ["longs"]=383, - ["ltshade"]=9617, - ["male"]=9794, - ["mu"]=181, - ["napostrophe"]=329, - ["notelement"]=8713, - ["omega1"]=982, - ["openbullet"]=9702, - ["orthogonal"]=8735, - ["oslashacute"]=511, - ["phi1"]=981, - ["propersubset"]=8834, - ["propersuperset"]=8835, - ["reflexsubset"]=8838, - ["reflexsuperset"]=8839, - ["shade"]=9618, - ["sigma1"]=962, - ["similar"]=8764, - ["smileface"]=9786, - ["spacehackarabic"]=32, - ["spade"]=9824, - ["theta1"]=977, - ["twodotenleader"]=8229, +return { -- generated: inspect(fonts.encodings.agl.unicodes) + ["A"]=65, + ["AE"]=198, + ["AEacute"]=508, + ["AEmacron"]=482, + ["Aacute"]=193, + ["Abreve"]=258, + ["Abreveacute"]=7854, + ["Abrevecyrillic"]=1232, + ["Abrevedotbelow"]=7862, + ["Abrevegrave"]=7856, + ["Abrevehookabove"]=7858, + ["Abrevetilde"]=7860, + ["Acaron"]=461, + ["Acircle"]=9398, + ["Acircumflex"]=194, + ["Acircumflexacute"]=7844, + ["Acircumflexdotbelow"]=7852, + ["Acircumflexgrave"]=7846, + ["Acircumflexhookabove"]=7848, + ["Acircumflextilde"]=7850, + ["Acyrillic"]=1040, + ["Adblgrave"]=512, + ["Adieresis"]=196, + ["Adieresiscyrillic"]=1234, + ["Adieresismacron"]=478, + ["Adotbelow"]=7840, + ["Adotmacron"]=480, + ["Agrave"]=192, + ["Ahookabove"]=7842, + ["Aiecyrillic"]=1236, + ["Ainvertedbreve"]=514, + ["Alpha"]=913, + ["Alphatonos"]=902, + ["Amacron"]=256, + ["Amonospace"]=65313, + ["Aogonek"]=260, + ["Aring"]=197, + ["Aringacute"]=506, + ["Aringbelow"]=7680, + ["Atilde"]=195, + ["Aybarmenian"]=1329, + ["B"]=66, + ["Bcircle"]=9399, + ["Bdotaccent"]=7682, + ["Bdotbelow"]=7684, + ["Becyrillic"]=1041, + ["Benarmenian"]=1330, + ["Beta"]=914, + ["Bhook"]=385, + ["Blinebelow"]=7686, + ["Bmonospace"]=65314, + ["Btopbar"]=386, + ["C"]=67, + ["Caarmenian"]=1342, + ["Cacute"]=262, + ["Ccaron"]=268, + ["Ccedilla"]=199, + ["Ccedillaacute"]=7688, + ["Ccircle"]=9400, + ["Ccircumflex"]=264, + ["Cdot"]=266, + ["Cdotaccent"]=266, + ["Chaarmenian"]=1353, + ["Cheabkhasiancyrillic"]=1212, + ["Checyrillic"]=1063, + ["Chedescenderabkhasiancyrillic"]=1214, + ["Chedescendercyrillic"]=1206, + ["Chedieresiscyrillic"]=1268, + ["Cheharmenian"]=1347, + ["Chekhakassiancyrillic"]=1227, + ["Cheverticalstrokecyrillic"]=1208, + ["Chi"]=935, + ["Chook"]=391, + ["Cmonospace"]=65315, + ["Coarmenian"]=1361, + ["D"]=68, + ["DZ"]=497, + ["DZcaron"]=452, + ["Daarmenian"]=1332, + ["Dafrican"]=393, + ["Dcaron"]=270, + ["Dcedilla"]=7696, + ["Dcircle"]=9401, + ["Dcircumflexbelow"]=7698, + ["Dcroat"]=272, + ["Ddotaccent"]=7690, + ["Ddotbelow"]=7692, + ["Decyrillic"]=1044, + ["Deicoptic"]=1006, + ["Delta"]=8710, + ["Deltagreek"]=916, + ["Dhook"]=394, + ["Digammagreek"]=988, + ["Djecyrillic"]=1026, + ["Dlinebelow"]=7694, + ["Dmonospace"]=65316, + ["Dslash"]=272, + ["Dtopbar"]=395, + ["Dz"]=498, + ["Dzcaron"]=453, + ["Dzeabkhasiancyrillic"]=1248, + ["Dzecyrillic"]=1029, + ["Dzhecyrillic"]=1039, + ["E"]=69, + ["Eacute"]=201, + ["Ebreve"]=276, + ["Ecaron"]=282, + ["Ecedillabreve"]=7708, + ["Echarmenian"]=1333, + ["Ecircle"]=9402, + ["Ecircumflex"]=202, + ["Ecircumflexacute"]=7870, + ["Ecircumflexbelow"]=7704, + ["Ecircumflexdotbelow"]=7878, + ["Ecircumflexgrave"]=7872, + ["Ecircumflexhookabove"]=7874, + ["Ecircumflextilde"]=7876, + ["Ecyrillic"]=1028, + ["Edblgrave"]=516, + ["Edieresis"]=203, + ["Edot"]=278, + ["Edotaccent"]=278, + ["Edotbelow"]=7864, + ["Efcyrillic"]=1060, + ["Egrave"]=200, + ["Eharmenian"]=1335, + ["Ehookabove"]=7866, + ["Eightroman"]=8551, + ["Einvertedbreve"]=518, + ["Eiotifiedcyrillic"]=1124, + ["Elcyrillic"]=1051, + ["Elevenroman"]=8554, + ["Emacron"]=274, + ["Emacronacute"]=7702, + ["Emacrongrave"]=7700, + ["Emcyrillic"]=1052, + ["Emonospace"]=65317, + ["Encyrillic"]=1053, + ["Endescendercyrillic"]=1186, + ["Eng"]=330, + ["Enghecyrillic"]=1188, + ["Enhookcyrillic"]=1223, + ["Eogonek"]=280, + ["Eopen"]=400, + ["Epsilon"]=917, + ["Epsilontonos"]=904, + ["Ercyrillic"]=1056, + ["Ereversed"]=398, + ["Ereversedcyrillic"]=1069, + ["Escyrillic"]=1057, + ["Esdescendercyrillic"]=1194, + ["Esh"]=425, + ["Eta"]=919, + ["Etarmenian"]=1336, + ["Etatonos"]=905, + ["Eth"]=208, + ["Etilde"]=7868, + ["Etildebelow"]=7706, + ["Euro"]=8364, + ["Ezh"]=439, + ["Ezhcaron"]=494, + ["Ezhreversed"]=440, + ["F"]=70, + ["Fcircle"]=9403, + ["Fdotaccent"]=7710, + ["Feharmenian"]=1366, + ["Feicoptic"]=996, + ["Fhook"]=401, + ["Fitacyrillic"]=1138, + ["Fiveroman"]=8548, + ["Fmonospace"]=65318, + ["Fourroman"]=8547, + ["G"]=71, + ["GBsquare"]=13191, + ["Gacute"]=500, + ["Gamma"]=915, + ["Gammaafrican"]=404, + ["Gangiacoptic"]=1002, + ["Gbreve"]=286, + ["Gcaron"]=486, + ["Gcedilla"]=290, + ["Gcircle"]=9404, + ["Gcircumflex"]=284, + ["Gcommaaccent"]=290, + ["Gdot"]=288, + ["Gdotaccent"]=288, + ["Gecyrillic"]=1043, + ["Ghadarmenian"]=1346, + ["Ghemiddlehookcyrillic"]=1172, + ["Ghestrokecyrillic"]=1170, + ["Gheupturncyrillic"]=1168, + ["Ghook"]=403, + ["Gimarmenian"]=1331, + ["Gjecyrillic"]=1027, + ["Gmacron"]=7712, + ["Gmonospace"]=65319, + ["Gsmallhook"]=667, + ["Gstroke"]=484, + ["H"]=72, + ["H18533"]=9679, + ["H18543"]=9642, + ["H18551"]=9643, + ["H22073"]=9633, + ["HPsquare"]=13259, + ["Haabkhasiancyrillic"]=1192, + ["Hadescendercyrillic"]=1202, + ["Hardsigncyrillic"]=1066, + ["Hbar"]=294, + ["Hbrevebelow"]=7722, + ["Hcedilla"]=7720, + ["Hcircle"]=9405, + ["Hcircumflex"]=292, + ["Hdieresis"]=7718, + ["Hdotaccent"]=7714, + ["Hdotbelow"]=7716, + ["Hmonospace"]=65320, + ["Hoarmenian"]=1344, + ["Horicoptic"]=1000, + ["Hzsquare"]=13200, + ["I"]=73, + ["IAcyrillic"]=1071, + ["IJ"]=306, + ["IUcyrillic"]=1070, + ["Iacute"]=205, + ["Ibreve"]=300, + ["Icaron"]=463, + ["Icircle"]=9406, + ["Icircumflex"]=206, + ["Icyrillic"]=1030, + ["Idblgrave"]=520, + ["Idieresis"]=207, + ["Idieresisacute"]=7726, + ["Idieresiscyrillic"]=1252, + ["Idot"]=304, + ["Idotaccent"]=304, + ["Idotbelow"]=7882, + ["Iebrevecyrillic"]=1238, + ["Iecyrillic"]=1045, + ["Ifraktur"]=8465, + ["Igrave"]=204, + ["Ihookabove"]=7880, + ["Iicyrillic"]=1048, + ["Iinvertedbreve"]=522, + ["Iishortcyrillic"]=1049, + ["Imacron"]=298, + ["Imacroncyrillic"]=1250, + ["Imonospace"]=65321, + ["Iniarmenian"]=1339, + ["Iocyrillic"]=1025, + ["Iogonek"]=302, + ["Iota"]=921, + ["Iotaafrican"]=406, + ["Iotadieresis"]=938, + ["Iotatonos"]=906, + ["Istroke"]=407, + ["Itilde"]=296, + ["Itildebelow"]=7724, + ["Izhitsacyrillic"]=1140, + ["Izhitsadblgravecyrillic"]=1142, + ["J"]=74, + ["Jaarmenian"]=1345, + ["Jcircle"]=9407, + ["Jcircumflex"]=308, + ["Jecyrillic"]=1032, + ["Jheharmenian"]=1355, + ["Jmonospace"]=65322, + ["K"]=75, + ["KBsquare"]=13189, + ["KKsquare"]=13261, + ["Kabashkircyrillic"]=1184, + ["Kacute"]=7728, + ["Kacyrillic"]=1050, + ["Kadescendercyrillic"]=1178, + ["Kahookcyrillic"]=1219, + ["Kappa"]=922, + ["Kastrokecyrillic"]=1182, + ["Kaverticalstrokecyrillic"]=1180, + ["Kcaron"]=488, + ["Kcedilla"]=310, + ["Kcircle"]=9408, + ["Kcommaaccent"]=310, + ["Kdotbelow"]=7730, + ["Keharmenian"]=1364, + ["Kenarmenian"]=1343, + ["Khacyrillic"]=1061, + ["Kheicoptic"]=998, + ["Khook"]=408, + ["Kjecyrillic"]=1036, + ["Klinebelow"]=7732, + ["Kmonospace"]=65323, + ["Koppacyrillic"]=1152, + ["Koppagreek"]=990, + ["Ksicyrillic"]=1134, + ["L"]=76, + ["LJ"]=455, + ["Lacute"]=313, + ["Lambda"]=923, + ["Lcaron"]=317, + ["Lcedilla"]=315, + ["Lcircle"]=9409, + ["Lcircumflexbelow"]=7740, + ["Lcommaaccent"]=315, + ["Ldot"]=319, + ["Ldotaccent"]=319, + ["Ldotbelow"]=7734, + ["Ldotbelowmacron"]=7736, + ["Liwnarmenian"]=1340, + ["Lj"]=456, + ["Ljecyrillic"]=1033, + ["Llinebelow"]=7738, + ["Lmonospace"]=65324, + ["Lslash"]=321, + ["M"]=77, + ["MBsquare"]=13190, + ["Macute"]=7742, + ["Mcircle"]=9410, + ["Mdotaccent"]=7744, + ["Mdotbelow"]=7746, + ["Menarmenian"]=1348, + ["Mmonospace"]=65325, + ["Mturned"]=412, + ["Mu"]=924, + ["N"]=78, + ["NJ"]=458, + ["Nacute"]=323, + ["Ncaron"]=327, + ["Ncedilla"]=325, + ["Ncircle"]=9411, + ["Ncircumflexbelow"]=7754, + ["Ncommaaccent"]=325, + ["Ndotaccent"]=7748, + ["Ndotbelow"]=7750, + ["Nhookleft"]=413, + ["Nineroman"]=8552, + ["Nj"]=459, + ["Njecyrillic"]=1034, + ["Nlinebelow"]=7752, + ["Nmonospace"]=65326, + ["Nowarmenian"]=1350, + ["Ntilde"]=209, + ["Nu"]=925, + ["O"]=79, + ["OE"]=338, + ["Oacute"]=211, + ["Obarredcyrillic"]=1256, + ["Obarreddieresiscyrillic"]=1258, + ["Obreve"]=334, + ["Ocaron"]=465, + ["Ocenteredtilde"]=415, + ["Ocircle"]=9412, + ["Ocircumflex"]=212, + ["Ocircumflexacute"]=7888, + ["Ocircumflexdotbelow"]=7896, + ["Ocircumflexgrave"]=7890, + ["Ocircumflexhookabove"]=7892, + ["Ocircumflextilde"]=7894, + ["Ocyrillic"]=1054, + ["Odblacute"]=336, + ["Odblgrave"]=524, + ["Odieresis"]=214, + ["Odieresiscyrillic"]=1254, + ["Odotbelow"]=7884, + ["Ograve"]=210, + ["Oharmenian"]=1365, + ["Ohm"]=8486, + ["Ohookabove"]=7886, + ["Ohorn"]=416, + ["Ohornacute"]=7898, + ["Ohorndotbelow"]=7906, + ["Ohorngrave"]=7900, + ["Ohornhookabove"]=7902, + ["Ohorntilde"]=7904, + ["Ohungarumlaut"]=336, + ["Oi"]=418, + ["Oinvertedbreve"]=526, + ["Omacron"]=332, + ["Omacronacute"]=7762, + ["Omacrongrave"]=7760, + ["Omega"]=8486, + ["Omegacyrillic"]=1120, + ["Omegagreek"]=937, + ["Omegaroundcyrillic"]=1146, + ["Omegatitlocyrillic"]=1148, + ["Omegatonos"]=911, + ["Omicron"]=927, + ["Omicrontonos"]=908, + ["Omonospace"]=65327, + ["Oneroman"]=8544, + ["Oogonek"]=490, + ["Oogonekmacron"]=492, + ["Oopen"]=390, + ["Oslash"]=216, + ["Oslashacute"]=510, + ["Ostrokeacute"]=510, + ["Otcyrillic"]=1150, + ["Otilde"]=213, + ["Otildeacute"]=7756, + ["Otildedieresis"]=7758, + ["P"]=80, + ["Pacute"]=7764, + ["Pcircle"]=9413, + ["Pdotaccent"]=7766, + ["Pecyrillic"]=1055, + ["Peharmenian"]=1354, + ["Pemiddlehookcyrillic"]=1190, + ["Phi"]=934, + ["Phook"]=420, + ["Pi"]=928, + ["Piwrarmenian"]=1363, + ["Pmonospace"]=65328, + ["Psi"]=936, + ["Psicyrillic"]=1136, + ["Q"]=81, + ["Qcircle"]=9414, + ["Qmonospace"]=65329, + ["R"]=82, + ["Raarmenian"]=1356, + ["Racute"]=340, + ["Rcaron"]=344, + ["Rcedilla"]=342, + ["Rcircle"]=9415, + ["Rcommaaccent"]=342, + ["Rdblgrave"]=528, + ["Rdotaccent"]=7768, + ["Rdotbelow"]=7770, + ["Rdotbelowmacron"]=7772, + ["Reharmenian"]=1360, + ["Rfraktur"]=8476, + ["Rho"]=929, + ["Rinvertedbreve"]=530, + ["Rlinebelow"]=7774, + ["Rmonospace"]=65330, + ["Rsmallinverted"]=641, + ["Rsmallinvertedsuperior"]=694, + ["S"]=83, + ["SF010000"]=9484, + ["SF020000"]=9492, + ["SF030000"]=9488, + ["SF040000"]=9496, + ["SF050000"]=9532, + ["SF060000"]=9516, + ["SF070000"]=9524, + ["SF080000"]=9500, + ["SF090000"]=9508, + ["SF10000"]=9484, + ["SF100000"]=9472, + ["SF110000"]=9474, + ["SF190000"]=9569, + ["SF20000"]=9492, + ["SF200000"]=9570, + ["SF210000"]=9558, + ["SF220000"]=9557, + ["SF230000"]=9571, + ["SF240000"]=9553, + ["SF250000"]=9559, + ["SF260000"]=9565, + ["SF270000"]=9564, + ["SF280000"]=9563, + ["SF30000"]=9488, + ["SF360000"]=9566, + ["SF370000"]=9567, + ["SF380000"]=9562, + ["SF390000"]=9556, + ["SF40000"]=9496, + ["SF400000"]=9577, + ["SF410000"]=9574, + ["SF420000"]=9568, + ["SF430000"]=9552, + ["SF440000"]=9580, + ["SF450000"]=9575, + ["SF460000"]=9576, + ["SF470000"]=9572, + ["SF480000"]=9573, + ["SF490000"]=9561, + ["SF50000"]=9532, + ["SF500000"]=9560, + ["SF510000"]=9554, + ["SF520000"]=9555, + ["SF530000"]=9579, + ["SF540000"]=9578, + ["SF60000"]=9516, + ["SF70000"]=9524, + ["SF80000"]=9500, + ["SF90000"]=9508, + ["Sacute"]=346, + ["Sacutedotaccent"]=7780, + ["Sampigreek"]=992, + ["Scaron"]=352, + ["Scarondotaccent"]=7782, + ["Scedilla"]=350, + ["Schwa"]=399, + ["Schwacyrillic"]=1240, + ["Schwadieresiscyrillic"]=1242, + ["Scircle"]=9416, + ["Scircumflex"]=348, + ["Scommaaccent"]=536, + ["Sdotaccent"]=7776, + ["Sdotbelow"]=7778, + ["Sdotbelowdotaccent"]=7784, + ["Seharmenian"]=1357, + ["Sevenroman"]=8550, + ["Shaarmenian"]=1351, + ["Shacyrillic"]=1064, + ["Shchacyrillic"]=1065, + ["Sheicoptic"]=994, + ["Shhacyrillic"]=1210, + ["Shimacoptic"]=1004, + ["Sigma"]=931, + ["Sixroman"]=8549, + ["Smonospace"]=65331, + ["Softsigncyrillic"]=1068, + ["Stigmagreek"]=986, + ["T"]=84, + ["Tau"]=932, + ["Tbar"]=358, + ["Tcaron"]=356, + ["Tcedilla"]=354, + ["Tcircle"]=9417, + ["Tcircumflexbelow"]=7792, + ["Tcommaaccent"]=354, + ["Tdotaccent"]=7786, + ["Tdotbelow"]=7788, + ["Tecyrillic"]=1058, + ["Tedescendercyrillic"]=1196, + ["Tenroman"]=8553, + ["Tetsecyrillic"]=1204, + ["Theta"]=920, + ["Thook"]=428, + ["Thorn"]=222, + ["Threeroman"]=8546, + ["Tiwnarmenian"]=1359, + ["Tlinebelow"]=7790, + ["Tmonospace"]=65332, + ["Toarmenian"]=1337, + ["Tonefive"]=444, + ["Tonesix"]=388, + ["Tonetwo"]=423, + ["Tretroflexhook"]=430, + ["Tsecyrillic"]=1062, + ["Tshecyrillic"]=1035, + ["Twelveroman"]=8555, + ["Tworoman"]=8545, + ["U"]=85, + ["Uacute"]=218, + ["Ubreve"]=364, + ["Ucaron"]=467, + ["Ucircle"]=9418, + ["Ucircumflex"]=219, + ["Ucircumflexbelow"]=7798, + ["Ucyrillic"]=1059, + ["Udblacute"]=368, + ["Udblgrave"]=532, + ["Udieresis"]=220, + ["Udieresisacute"]=471, + ["Udieresisbelow"]=7794, + ["Udieresiscaron"]=473, + ["Udieresiscyrillic"]=1264, + ["Udieresisgrave"]=475, + ["Udieresismacron"]=469, + ["Udotbelow"]=7908, + ["Ugrave"]=217, + ["Uhookabove"]=7910, + ["Uhorn"]=431, + ["Uhornacute"]=7912, + ["Uhorndotbelow"]=7920, + ["Uhorngrave"]=7914, + ["Uhornhookabove"]=7916, + ["Uhorntilde"]=7918, + ["Uhungarumlaut"]=368, + ["Uhungarumlautcyrillic"]=1266, + ["Uinvertedbreve"]=534, + ["Ukcyrillic"]=1144, + ["Umacron"]=362, + ["Umacroncyrillic"]=1262, + ["Umacrondieresis"]=7802, + ["Umonospace"]=65333, + ["Uogonek"]=370, + ["Upsilon"]=933, + ["Upsilon1"]=978, + ["Upsilonacutehooksymbolgreek"]=979, + ["Upsilonafrican"]=433, + ["Upsilondieresis"]=939, + ["Upsilondieresishooksymbolgreek"]=980, + ["Upsilonhooksymbol"]=978, + ["Upsilontonos"]=910, + ["Uring"]=366, + ["Ushortcyrillic"]=1038, + ["Ustraightcyrillic"]=1198, + ["Ustraightstrokecyrillic"]=1200, + ["Utilde"]=360, + ["Utildeacute"]=7800, + ["Utildebelow"]=7796, + ["V"]=86, + ["Vcircle"]=9419, + ["Vdotbelow"]=7806, + ["Vecyrillic"]=1042, + ["Vewarmenian"]=1358, + ["Vhook"]=434, + ["Vmonospace"]=65334, + ["Voarmenian"]=1352, + ["Vtilde"]=7804, + ["W"]=87, + ["Wacute"]=7810, + ["Wcircle"]=9420, + ["Wcircumflex"]=372, + ["Wdieresis"]=7812, + ["Wdotaccent"]=7814, + ["Wdotbelow"]=7816, + ["Wgrave"]=7808, + ["Wmonospace"]=65335, + ["X"]=88, + ["Xcircle"]=9421, + ["Xdieresis"]=7820, + ["Xdotaccent"]=7818, + ["Xeharmenian"]=1341, + ["Xi"]=926, + ["Xmonospace"]=65336, + ["Y"]=89, + ["Yacute"]=221, + ["Yatcyrillic"]=1122, + ["Ycircle"]=9422, + ["Ycircumflex"]=374, + ["Ydieresis"]=376, + ["Ydotaccent"]=7822, + ["Ydotbelow"]=7924, + ["Yericyrillic"]=1067, + ["Yerudieresiscyrillic"]=1272, + ["Ygrave"]=7922, + ["Yhook"]=435, + ["Yhookabove"]=7926, + ["Yiarmenian"]=1349, + ["Yicyrillic"]=1031, + ["Yiwnarmenian"]=1362, + ["Ymonospace"]=65337, + ["Ytilde"]=7928, + ["Yusbigcyrillic"]=1130, + ["Yusbigiotifiedcyrillic"]=1132, + ["Yuslittlecyrillic"]=1126, + ["Yuslittleiotifiedcyrillic"]=1128, + ["Z"]=90, + ["Zaarmenian"]=1334, + ["Zacute"]=377, + ["Zcaron"]=381, + ["Zcircle"]=9423, + ["Zcircumflex"]=7824, + ["Zdot"]=379, + ["Zdotaccent"]=379, + ["Zdotbelow"]=7826, + ["Zecyrillic"]=1047, + ["Zedescendercyrillic"]=1176, + ["Zedieresiscyrillic"]=1246, + ["Zeta"]=918, + ["Zhearmenian"]=1338, + ["Zhebrevecyrillic"]=1217, + ["Zhecyrillic"]=1046, + ["Zhedescendercyrillic"]=1174, + ["Zhedieresiscyrillic"]=1244, + ["Zlinebelow"]=7828, + ["Zmonospace"]=65338, + ["Zstroke"]=437, + ["a"]=97, + ["aabengali"]=2438, + ["aacute"]=225, + ["aadeva"]=2310, + ["aagujarati"]=2694, + ["aagurmukhi"]=2566, + ["aamatragurmukhi"]=2622, + ["aarusquare"]=13059, + ["aavowelsignbengali"]=2494, + ["aavowelsigndeva"]=2366, + ["aavowelsigngujarati"]=2750, + ["abbreviationmarkarmenian"]=1375, + ["abbreviationsigndeva"]=2416, + ["abengali"]=2437, + ["abopomofo"]=12570, + ["abreve"]=259, + ["abreveacute"]=7855, + ["abrevecyrillic"]=1233, + ["abrevedotbelow"]=7863, + ["abrevegrave"]=7857, + ["abrevehookabove"]=7859, + ["abrevetilde"]=7861, + ["acaron"]=462, + ["acircle"]=9424, + ["acircumflex"]=226, + ["acircumflexacute"]=7845, + ["acircumflexdotbelow"]=7853, + ["acircumflexgrave"]=7847, + ["acircumflexhookabove"]=7849, + ["acircumflextilde"]=7851, + ["acute"]=180, + ["acutebelowcmb"]=791, + ["acutecmb"]=769, + ["acutecomb"]=769, + ["acutedeva"]=2388, + ["acutelowmod"]=719, + ["acutetonecmb"]=833, + ["acyrillic"]=1072, + ["adblgrave"]=513, + ["addakgurmukhi"]=2673, + ["adeva"]=2309, + ["adieresis"]=228, + ["adieresiscyrillic"]=1235, + ["adieresismacron"]=479, + ["adotbelow"]=7841, + ["adotmacron"]=481, + ["ae"]=230, + ["aeacute"]=509, + ["aekorean"]=12624, + ["aemacron"]=483, + ["afii00208"]=8213, + ["afii08941"]=8356, + ["afii10017"]=1040, + ["afii10018"]=1041, + ["afii10019"]=1042, + ["afii10020"]=1043, + ["afii10021"]=1044, + ["afii10022"]=1045, + ["afii10023"]=1025, + ["afii10024"]=1046, + ["afii10025"]=1047, + ["afii10026"]=1048, + ["afii10027"]=1049, + ["afii10028"]=1050, + ["afii10029"]=1051, + ["afii10030"]=1052, + ["afii10031"]=1053, + ["afii10032"]=1054, + ["afii10033"]=1055, + ["afii10034"]=1056, + ["afii10035"]=1057, + ["afii10036"]=1058, + ["afii10037"]=1059, + ["afii10038"]=1060, + ["afii10039"]=1061, + ["afii10040"]=1062, + ["afii10041"]=1063, + ["afii10042"]=1064, + ["afii10043"]=1065, + ["afii10044"]=1066, + ["afii10045"]=1067, + ["afii10046"]=1068, + ["afii10047"]=1069, + ["afii10048"]=1070, + ["afii10049"]=1071, + ["afii10050"]=1168, + ["afii10051"]=1026, + ["afii10052"]=1027, + ["afii10053"]=1028, + ["afii10054"]=1029, + ["afii10055"]=1030, + ["afii10056"]=1031, + ["afii10057"]=1032, + ["afii10058"]=1033, + ["afii10059"]=1034, + ["afii10060"]=1035, + ["afii10061"]=1036, + ["afii10062"]=1038, + ["afii10065"]=1072, + ["afii10066"]=1073, + ["afii10067"]=1074, + ["afii10068"]=1075, + ["afii10069"]=1076, + ["afii10070"]=1077, + ["afii10071"]=1105, + ["afii10072"]=1078, + ["afii10073"]=1079, + ["afii10074"]=1080, + ["afii10075"]=1081, + ["afii10076"]=1082, + ["afii10077"]=1083, + ["afii10078"]=1084, + ["afii10079"]=1085, + ["afii10080"]=1086, + ["afii10081"]=1087, + ["afii10082"]=1088, + ["afii10083"]=1089, + ["afii10084"]=1090, + ["afii10085"]=1091, + ["afii10086"]=1092, + ["afii10087"]=1093, + ["afii10088"]=1094, + ["afii10089"]=1095, + ["afii10090"]=1096, + ["afii10091"]=1097, + ["afii10092"]=1098, + ["afii10093"]=1099, + ["afii10094"]=1100, + ["afii10095"]=1101, + ["afii10096"]=1102, + ["afii10097"]=1103, + ["afii10098"]=1169, + ["afii10099"]=1106, + ["afii10100"]=1107, + ["afii10101"]=1108, + ["afii10102"]=1109, + ["afii10103"]=1110, + ["afii10104"]=1111, + ["afii10105"]=1112, + ["afii10106"]=1113, + ["afii10107"]=1114, + ["afii10108"]=1115, + ["afii10109"]=1116, + ["afii10110"]=1118, + ["afii10145"]=1039, + ["afii10146"]=1122, + ["afii10147"]=1138, + ["afii10148"]=1140, + ["afii10193"]=1119, + ["afii10194"]=1123, + ["afii10195"]=1139, + ["afii10196"]=1141, + ["afii10846"]=1241, + ["afii208"]=8213, + ["afii299"]=8206, + ["afii300"]=8207, + ["afii301"]=8205, + ["afii57381"]=1642, + ["afii57388"]=1548, + ["afii57392"]=1632, + ["afii57393"]=1633, + ["afii57394"]=1634, + ["afii57395"]=1635, + ["afii57396"]=1636, + ["afii57397"]=1637, + ["afii57398"]=1638, + ["afii57399"]=1639, + ["afii57400"]=1640, + ["afii57401"]=1641, + ["afii57403"]=1563, + ["afii57407"]=1567, + ["afii57409"]=1569, + ["afii57410"]=1570, + ["afii57411"]=1571, + ["afii57412"]=1572, + ["afii57413"]=1573, + ["afii57414"]=1574, + ["afii57415"]=1575, + ["afii57416"]=1576, + ["afii57417"]=1577, + ["afii57418"]=1578, + ["afii57419"]=1579, + ["afii57420"]=1580, + ["afii57421"]=1581, + ["afii57422"]=1582, + ["afii57423"]=1583, + ["afii57424"]=1584, + ["afii57425"]=1585, + ["afii57426"]=1586, + ["afii57427"]=1587, + ["afii57428"]=1588, + ["afii57429"]=1589, + ["afii57430"]=1590, + ["afii57431"]=1591, + ["afii57432"]=1592, + ["afii57433"]=1593, + ["afii57434"]=1594, + ["afii57440"]=1600, + ["afii57441"]=1601, + ["afii57442"]=1602, + ["afii57443"]=1603, + ["afii57444"]=1604, + ["afii57445"]=1605, + ["afii57446"]=1606, + ["afii57448"]=1608, + ["afii57449"]=1609, + ["afii57450"]=1610, + ["afii57451"]=1611, + ["afii57452"]=1612, + ["afii57453"]=1613, + ["afii57454"]=1614, + ["afii57455"]=1615, + ["afii57456"]=1616, + ["afii57457"]=1617, + ["afii57458"]=1618, + ["afii57470"]=1607, + ["afii57505"]=1700, + ["afii57506"]=1662, + ["afii57507"]=1670, + ["afii57508"]=1688, + ["afii57509"]=1711, + ["afii57511"]=1657, + ["afii57512"]=1672, + ["afii57513"]=1681, + ["afii57514"]=1722, + ["afii57519"]=1746, + ["afii57534"]=1749, + ["afii57636"]=8362, + ["afii57645"]=1470, + ["afii57658"]=1475, + ["afii57664"]=1488, + ["afii57665"]=1489, + ["afii57666"]=1490, + ["afii57667"]=1491, + ["afii57668"]=1492, + ["afii57669"]=1493, + ["afii57670"]=1494, + ["afii57671"]=1495, + ["afii57672"]=1496, + ["afii57673"]=1497, + ["afii57674"]=1498, + ["afii57675"]=1499, + ["afii57676"]=1500, + ["afii57677"]=1501, + ["afii57678"]=1502, + ["afii57679"]=1503, + ["afii57680"]=1504, + ["afii57681"]=1505, + ["afii57682"]=1506, + ["afii57683"]=1507, + ["afii57684"]=1508, + ["afii57685"]=1509, + ["afii57686"]=1510, + ["afii57687"]=1511, + ["afii57688"]=1512, + ["afii57689"]=1513, + ["afii57690"]=1514, + ["afii57694"]=64298, + ["afii57695"]=64299, + ["afii57700"]=64331, + ["afii57705"]=64287, + ["afii57716"]=1520, + ["afii57717"]=1521, + ["afii57718"]=1522, + ["afii57723"]=64309, + ["afii57793"]=1460, + ["afii57794"]=1461, + ["afii57795"]=1462, + ["afii57796"]=1467, + ["afii57797"]=1464, + ["afii57798"]=1463, + ["afii57799"]=1456, + ["afii57800"]=1458, + ["afii57801"]=1457, + ["afii57802"]=1459, + ["afii57803"]=1474, + ["afii57804"]=1473, + ["afii57806"]=1465, + ["afii57807"]=1468, + ["afii57839"]=1469, + ["afii57841"]=1471, + ["afii57842"]=1472, + ["afii57929"]=700, + ["afii61248"]=8453, + ["afii61289"]=8467, + ["afii61352"]=8470, + ["afii61573"]=8236, + ["afii61574"]=8237, + ["afii61575"]=8238, + ["afii61664"]=8204, + ["afii63167"]=1645, + ["afii64937"]=701, + ["agrave"]=224, + ["agujarati"]=2693, + ["agurmukhi"]=2565, + ["ahiragana"]=12354, + ["ahookabove"]=7843, + ["aibengali"]=2448, + ["aibopomofo"]=12574, + ["aideva"]=2320, + ["aiecyrillic"]=1237, + ["aigujarati"]=2704, + ["aigurmukhi"]=2576, + ["aimatragurmukhi"]=2632, + ["ainarabic"]=1593, + ["ainfinalarabic"]=65226, + ["aininitialarabic"]=65227, + ["ainmedialarabic"]=65228, + ["ainvertedbreve"]=515, + ["aivowelsignbengali"]=2504, + ["aivowelsigndeva"]=2376, + ["aivowelsigngujarati"]=2760, + ["akatakana"]=12450, + ["akatakanahalfwidth"]=65393, + ["akorean"]=12623, + ["alef"]=1488, + ["alefarabic"]=1575, + ["alefdageshhebrew"]=64304, + ["aleffinalarabic"]=65166, + ["alefhamzaabovearabic"]=1571, + ["alefhamzaabovefinalarabic"]=65156, + ["alefhamzabelowarabic"]=1573, + ["alefhamzabelowfinalarabic"]=65160, + ["alefhebrew"]=1488, + ["aleflamedhebrew"]=64335, + ["alefmaddaabovearabic"]=1570, + ["alefmaddaabovefinalarabic"]=65154, + ["alefmaksuraarabic"]=1609, + ["alefmaksurafinalarabic"]=65264, + ["alefmaksurainitialarabic"]=65267, + ["alefmaksuramedialarabic"]=65268, + ["alefpatahhebrew"]=64302, + ["alefqamatshebrew"]=64303, + ["aleph"]=8501, + ["allequal"]=8780, + ["alpha"]=945, + ["alphatonos"]=940, + ["amacron"]=257, + ["amonospace"]=65345, + ["ampersand"]=38, + ["ampersandmonospace"]=65286, + ["amsquare"]=13250, + ["anbopomofo"]=12578, + ["angbopomofo"]=12580, + ["angkhankhuthai"]=3674, + ["angle"]=8736, + ["anglebracketleft"]=12296, + ["anglebracketleftvertical"]=65087, + ["anglebracketright"]=12297, + ["anglebracketrightvertical"]=65088, + ["angleleft"]=9001, + ["angleright"]=9002, + ["angstrom"]=8491, + ["anoteleia"]=903, + ["anudattadeva"]=2386, + ["anusvarabengali"]=2434, + ["anusvaradeva"]=2306, + ["anusvaragujarati"]=2690, + ["aogonek"]=261, + ["apaatosquare"]=13056, + ["aparen"]=9372, + ["apostrophearmenian"]=1370, + ["apostrophemod"]=700, + ["apple"]=63743, + ["approaches"]=8784, + ["approxequal"]=8776, + ["approxequalorimage"]=8786, + ["approximatelyequal"]=8773, + ["araeaekorean"]=12686, + ["araeakorean"]=12685, + ["arc"]=8978, + ["arighthalfring"]=7834, + ["aring"]=229, + ["aringacute"]=507, + ["aringbelow"]=7681, + ["arrowboth"]=8596, + ["arrowdashdown"]=8675, + ["arrowdashleft"]=8672, + ["arrowdashright"]=8674, + ["arrowdashup"]=8673, + ["arrowdblboth"]=8660, + ["arrowdbldown"]=8659, + ["arrowdblleft"]=8656, + ["arrowdblright"]=8658, + ["arrowdblup"]=8657, + ["arrowdown"]=8595, + ["arrowdownleft"]=8601, + ["arrowdownright"]=8600, + ["arrowdownwhite"]=8681, + ["arrowheaddownmod"]=709, + ["arrowheadleftmod"]=706, + ["arrowheadrightmod"]=707, + ["arrowheadupmod"]=708, + ["arrowleft"]=8592, + ["arrowleftdbl"]=8656, + ["arrowleftdblstroke"]=8653, + ["arrowleftoverright"]=8646, + ["arrowleftwhite"]=8678, + ["arrowright"]=8594, + ["arrowrightdblstroke"]=8655, + ["arrowrightheavy"]=10142, + ["arrowrightoverleft"]=8644, + ["arrowrightwhite"]=8680, + ["arrowtableft"]=8676, + ["arrowtabright"]=8677, + ["arrowup"]=8593, + ["arrowupdn"]=8597, + ["arrowupdnbse"]=8616, + ["arrowupdownbase"]=8616, + ["arrowupleft"]=8598, + ["arrowupleftofdown"]=8645, + ["arrowupright"]=8599, + ["arrowupwhite"]=8679, + ["asciicircum"]=94, + ["asciicircummonospace"]=65342, + ["asciitilde"]=126, + ["asciitildemonospace"]=65374, + ["ascript"]=593, + ["ascriptturned"]=594, + ["asmallhiragana"]=12353, + ["asmallkatakana"]=12449, + ["asmallkatakanahalfwidth"]=65383, + ["asterisk"]=42, + ["asteriskaltonearabic"]=1645, + ["asteriskarabic"]=1645, + ["asteriskmath"]=8727, + ["asteriskmonospace"]=65290, + ["asterisksmall"]=65121, + ["asterism"]=8258, + ["asymptoticallyequal"]=8771, + ["at"]=64, + ["atilde"]=227, + ["atmonospace"]=65312, + ["atsmall"]=65131, + ["aturned"]=592, + ["aubengali"]=2452, + ["aubopomofo"]=12576, + ["audeva"]=2324, + ["augujarati"]=2708, + ["augurmukhi"]=2580, + ["aulengthmarkbengali"]=2519, + ["aumatragurmukhi"]=2636, + ["auvowelsignbengali"]=2508, + ["auvowelsigndeva"]=2380, + ["auvowelsigngujarati"]=2764, + ["avagrahadeva"]=2365, + ["aybarmenian"]=1377, + ["ayin"]=1506, + ["ayinaltonehebrew"]=64288, + ["ayinhebrew"]=1506, + ["b"]=98, + ["babengali"]=2476, + ["backslash"]=92, + ["backslashmonospace"]=65340, + ["badeva"]=2348, + ["bagujarati"]=2732, + ["bagurmukhi"]=2604, + ["bahiragana"]=12400, + ["bahtthai"]=3647, + ["bakatakana"]=12496, + ["bar"]=124, + ["barmonospace"]=65372, + ["bbopomofo"]=12549, + ["bcircle"]=9425, + ["bdotaccent"]=7683, + ["bdotbelow"]=7685, + ["beamedsixteenthnotes"]=9836, + ["because"]=8757, + ["becyrillic"]=1073, + ["beharabic"]=1576, + ["behfinalarabic"]=65168, + ["behinitialarabic"]=65169, + ["behiragana"]=12409, + ["behmedialarabic"]=65170, + ["behmeeminitialarabic"]=64671, + ["behmeemisolatedarabic"]=64520, + ["behnoonfinalarabic"]=64621, + ["bekatakana"]=12505, + ["benarmenian"]=1378, + ["bet"]=1489, + ["beta"]=946, + ["betasymbolgreek"]=976, + ["betdagesh"]=64305, + ["betdageshhebrew"]=64305, + ["bethebrew"]=1489, + ["betrafehebrew"]=64332, + ["bhabengali"]=2477, + ["bhadeva"]=2349, + ["bhagujarati"]=2733, + ["bhagurmukhi"]=2605, + ["bhook"]=595, + ["bihiragana"]=12403, + ["bikatakana"]=12499, + ["bilabialclick"]=664, + ["bindigurmukhi"]=2562, + ["birusquare"]=13105, + ["blackcircle"]=9679, + ["blackdiamond"]=9670, + ["blackdownpointingtriangle"]=9660, + ["blackleftpointingpointer"]=9668, + ["blackleftpointingtriangle"]=9664, + ["blacklenticularbracketleft"]=12304, + ["blacklenticularbracketleftvertical"]=65083, + ["blacklenticularbracketright"]=12305, + ["blacklenticularbracketrightvertical"]=65084, + ["blacklowerlefttriangle"]=9699, + ["blacklowerrighttriangle"]=9698, + ["blackrectangle"]=9644, + ["blackrightpointingpointer"]=9658, + ["blackrightpointingtriangle"]=9654, + ["blacksmallsquare"]=9642, + ["blacksmilingface"]=9787, + ["blacksquare"]=9632, + ["blackstar"]=9733, + ["blackupperlefttriangle"]=9700, + ["blackupperrighttriangle"]=9701, + ["blackuppointingsmalltriangle"]=9652, + ["blackuppointingtriangle"]=9650, + ["blank"]=9251, + ["blinebelow"]=7687, + ["block"]=9608, + ["bmonospace"]=65346, + ["bobaimaithai"]=3610, + ["bohiragana"]=12412, + ["bokatakana"]=12508, + ["bparen"]=9373, + ["bqsquare"]=13251, + ["braceleft"]=123, + ["braceleftmonospace"]=65371, + ["braceleftsmall"]=65115, + ["braceleftvertical"]=65079, + ["braceright"]=125, + ["bracerightmonospace"]=65373, + ["bracerightsmall"]=65116, + ["bracerightvertical"]=65080, + ["bracketleft"]=91, + ["bracketleftmonospace"]=65339, + ["bracketright"]=93, + ["bracketrightmonospace"]=65341, + ["breve"]=728, + ["brevebelowcmb"]=814, + ["brevecmb"]=774, + ["breveinvertedbelowcmb"]=815, + ["breveinvertedcmb"]=785, + ["breveinverteddoublecmb"]=865, + ["bridgebelowcmb"]=810, + ["bridgeinvertedbelowcmb"]=826, + ["brokenbar"]=166, + ["bstroke"]=384, + ["btopbar"]=387, + ["buhiragana"]=12406, + ["bukatakana"]=12502, + ["bullet"]=8226, + ["bulletinverse"]=9688, + ["bulletoperator"]=8729, + ["bullseye"]=9678, + ["c"]=99, + ["caarmenian"]=1390, + ["cabengali"]=2458, + ["cacute"]=263, + ["cadeva"]=2330, + ["cagujarati"]=2714, + ["cagurmukhi"]=2586, + ["calsquare"]=13192, + ["candrabindubengali"]=2433, + ["candrabinducmb"]=784, + ["candrabindudeva"]=2305, + ["candrabindugujarati"]=2689, + ["capslock"]=8682, + ["careof"]=8453, + ["caron"]=711, + ["caronbelowcmb"]=812, + ["caroncmb"]=780, + ["carriagereturn"]=8629, + ["cbopomofo"]=12568, + ["ccaron"]=269, + ["ccedilla"]=231, + ["ccedillaacute"]=7689, + ["ccircle"]=9426, + ["ccircumflex"]=265, + ["ccurl"]=597, + ["cdot"]=267, + ["cdotaccent"]=267, + ["cdsquare"]=13253, + ["cedilla"]=184, + ["cedillacmb"]=807, + ["cent"]=162, + ["centigrade"]=8451, + ["centmonospace"]=65504, + ["chaarmenian"]=1401, + ["chabengali"]=2459, + ["chadeva"]=2331, + ["chagujarati"]=2715, + ["chagurmukhi"]=2587, + ["chbopomofo"]=12564, + ["cheabkhasiancyrillic"]=1213, + ["checkmark"]=10003, + ["checyrillic"]=1095, + ["chedescenderabkhasiancyrillic"]=1215, + ["chedescendercyrillic"]=1207, + ["chedieresiscyrillic"]=1269, + ["cheharmenian"]=1395, + ["chekhakassiancyrillic"]=1228, + ["cheverticalstrokecyrillic"]=1209, + ["chi"]=967, + ["chieuchacirclekorean"]=12919, + ["chieuchaparenkorean"]=12823, + ["chieuchcirclekorean"]=12905, + ["chieuchkorean"]=12618, + ["chieuchparenkorean"]=12809, + ["chochangthai"]=3594, + ["chochanthai"]=3592, + ["chochingthai"]=3593, + ["chochoethai"]=3596, + ["chook"]=392, + ["cieucacirclekorean"]=12918, + ["cieucaparenkorean"]=12822, + ["cieuccirclekorean"]=12904, + ["cieuckorean"]=12616, + ["cieucparenkorean"]=12808, + ["cieucuparenkorean"]=12828, + ["circle"]=9675, + ["circlemultiply"]=8855, + ["circleot"]=8857, + ["circleplus"]=8853, + ["circlepostalmark"]=12342, + ["circlewithlefthalfblack"]=9680, + ["circlewithrighthalfblack"]=9681, + ["circumflex"]=710, + ["circumflexbelowcmb"]=813, + ["circumflexcmb"]=770, + ["clear"]=8999, + ["clickalveolar"]=450, + ["clickdental"]=448, + ["clicklateral"]=449, + ["clickretroflex"]=451, + ["club"]=9827, + ["clubsuitblack"]=9827, + ["clubsuitwhite"]=9831, + ["cmcubedsquare"]=13220, + ["cmonospace"]=65347, + ["cmsquaredsquare"]=13216, + ["coarmenian"]=1409, + ["colon"]=58, + ["colonmonetary"]=8353, + ["colonmonospace"]=65306, + ["colonsign"]=8353, + ["colonsmall"]=65109, + ["colontriangularhalfmod"]=721, + ["colontriangularmod"]=720, + ["comma"]=44, + ["commaabovecmb"]=787, + ["commaaboverightcmb"]=789, + ["commaarabic"]=1548, + ["commaarmenian"]=1373, + ["commamonospace"]=65292, + ["commareversedabovecmb"]=788, + ["commareversedmod"]=701, + ["commasmall"]=65104, + ["commaturnedabovecmb"]=786, + ["commaturnedmod"]=699, + ["compass"]=9788, + ["congruent"]=8773, + ["contourintegral"]=8750, + ["control"]=8963, + ["controlACK"]=6, + ["controlBEL"]=7, + ["controlBS"]=8, + ["controlCAN"]=24, + ["controlCR"]=13, + ["controlDC1"]=17, + ["controlDC2"]=18, + ["controlDC3"]=19, + ["controlDC4"]=20, + ["controlDEL"]=127, + ["controlDLE"]=16, + ["controlEM"]=25, + ["controlENQ"]=5, + ["controlEOT"]=4, + ["controlESC"]=27, + ["controlETB"]=23, + ["controlETX"]=3, + ["controlFF"]=12, + ["controlFS"]=28, + ["controlGS"]=29, + ["controlHT"]=9, + ["controlLF"]=10, + ["controlNAK"]=21, + ["controlRS"]=30, + ["controlSI"]=15, + ["controlSO"]=14, + ["controlSOT"]=2, + ["controlSTX"]=1, + ["controlSUB"]=26, + ["controlSYN"]=22, + ["controlUS"]=31, + ["controlVT"]=11, + ["copyright"]=169, + ["cornerbracketleft"]=12300, + ["cornerbracketlefthalfwidth"]=65378, + ["cornerbracketleftvertical"]=65089, + ["cornerbracketright"]=12301, + ["cornerbracketrighthalfwidth"]=65379, + ["cornerbracketrightvertical"]=65090, + ["corporationsquare"]=13183, + ["cosquare"]=13255, + ["coverkgsquare"]=13254, + ["cparen"]=9374, + ["cruzeiro"]=8354, + ["cstretched"]=663, + ["curlyand"]=8911, + ["curlyor"]=8910, + ["currency"]=164, + ["d"]=100, + ["daarmenian"]=1380, + ["dabengali"]=2470, + ["dadarabic"]=1590, + ["dadeva"]=2342, + ["dadfinalarabic"]=65214, + ["dadinitialarabic"]=65215, + ["dadmedialarabic"]=65216, + ["dagesh"]=1468, + ["dageshhebrew"]=1468, + ["dagger"]=8224, + ["daggerdbl"]=8225, + ["dagujarati"]=2726, + ["dagurmukhi"]=2598, + ["dahiragana"]=12384, + ["dakatakana"]=12480, + ["dalarabic"]=1583, + ["dalet"]=1491, + ["daletdagesh"]=64307, + ["daletdageshhebrew"]=64307, + ["dalethatafpatah"]=1491, + ["dalethatafpatahhebrew"]=1491, + ["dalethatafsegol"]=1491, + ["dalethatafsegolhebrew"]=1491, + ["dalethebrew"]=1491, + ["dalethiriq"]=1491, + ["dalethiriqhebrew"]=1491, + ["daletholam"]=1491, + ["daletholamhebrew"]=1491, + ["daletpatah"]=1491, + ["daletpatahhebrew"]=1491, + ["daletqamats"]=1491, + ["daletqamatshebrew"]=1491, + ["daletqubuts"]=1491, + ["daletqubutshebrew"]=1491, + ["daletsegol"]=1491, + ["daletsegolhebrew"]=1491, + ["daletsheva"]=1491, + ["daletshevahebrew"]=1491, + ["dalettsere"]=1491, + ["dalettserehebrew"]=1491, + ["dalfinalarabic"]=65194, + ["dammaarabic"]=1615, + ["dammalowarabic"]=1615, + ["dammatanaltonearabic"]=1612, + ["dammatanarabic"]=1612, + ["danda"]=2404, + ["dargahebrew"]=1447, + ["dargalefthebrew"]=1447, + ["dasiapneumatacyrilliccmb"]=1157, + ["dblanglebracketleft"]=12298, + ["dblanglebracketleftvertical"]=65085, + ["dblanglebracketright"]=12299, + ["dblanglebracketrightvertical"]=65086, + ["dblarchinvertedbelowcmb"]=811, + ["dblarrowleft"]=8660, + ["dblarrowright"]=8658, + ["dbldanda"]=2405, + ["dblgravecmb"]=783, + ["dblintegral"]=8748, + ["dbllowline"]=8215, + ["dbllowlinecmb"]=819, + ["dbloverlinecmb"]=831, + ["dblprimemod"]=698, + ["dblverticalbar"]=8214, + ["dblverticallineabovecmb"]=782, + ["dbopomofo"]=12553, + ["dbsquare"]=13256, + ["dcaron"]=271, + ["dcedilla"]=7697, + ["dcircle"]=9427, + ["dcircumflexbelow"]=7699, + ["dcroat"]=273, + ["ddabengali"]=2465, + ["ddadeva"]=2337, + ["ddagujarati"]=2721, + ["ddagurmukhi"]=2593, + ["ddalarabic"]=1672, + ["ddalfinalarabic"]=64393, + ["dddhadeva"]=2396, + ["ddhabengali"]=2466, + ["ddhadeva"]=2338, + ["ddhagujarati"]=2722, + ["ddhagurmukhi"]=2594, + ["ddotaccent"]=7691, + ["ddotbelow"]=7693, + ["decimalseparatorarabic"]=1643, + ["decimalseparatorpersian"]=1643, + ["decyrillic"]=1076, + ["degree"]=176, + ["dehihebrew"]=1453, + ["dehiragana"]=12391, + ["deicoptic"]=1007, + ["dekatakana"]=12487, + ["deleteleft"]=9003, + ["deleteright"]=8998, + ["delta"]=948, + ["deltaturned"]=397, + ["denominatorminusonenumeratorbengali"]=2552, + ["dezh"]=676, + ["dhabengali"]=2471, + ["dhadeva"]=2343, + ["dhagujarati"]=2727, + ["dhagurmukhi"]=2599, + ["dhook"]=599, + ["dialytikatonos"]=901, + ["dialytikatonoscmb"]=836, + ["diamond"]=9830, + ["diamondsuitwhite"]=9826, + ["dieresis"]=168, + ["dieresisbelowcmb"]=804, + ["dieresiscmb"]=776, + ["dieresistonos"]=901, + ["dihiragana"]=12386, + ["dikatakana"]=12482, + ["dittomark"]=12291, + ["divide"]=247, + ["divides"]=8739, + ["divisionslash"]=8725, + ["djecyrillic"]=1106, + ["dkshade"]=9619, + ["dlinebelow"]=7695, + ["dlsquare"]=13207, + ["dmacron"]=273, + ["dmonospace"]=65348, + ["dnblock"]=9604, + ["dochadathai"]=3598, + ["dodekthai"]=3604, + ["dohiragana"]=12393, + ["dokatakana"]=12489, + ["dollar"]=36, + ["dollarmonospace"]=65284, + ["dollarsmall"]=65129, + ["dong"]=8363, + ["dorusquare"]=13094, + ["dotaccent"]=729, + ["dotaccentcmb"]=775, + ["dotbelowcmb"]=803, + ["dotbelowcomb"]=803, + ["dotkatakana"]=12539, + ["dotlessi"]=305, + ["dotlessjstrokehook"]=644, + ["dotmath"]=8901, + ["dottedcircle"]=9676, + ["doubleyodpatah"]=64287, + ["doubleyodpatahhebrew"]=64287, + ["downtackbelowcmb"]=798, + ["downtackmod"]=725, + ["dparen"]=9375, + ["dtail"]=598, + ["dtopbar"]=396, + ["duhiragana"]=12389, + ["dukatakana"]=12485, + ["dz"]=499, + ["dzaltone"]=675, + ["dzcaron"]=454, + ["dzcurl"]=677, + ["dzeabkhasiancyrillic"]=1249, + ["dzecyrillic"]=1109, + ["dzhecyrillic"]=1119, + ["e"]=101, + ["eacute"]=233, + ["earth"]=9793, + ["ebengali"]=2447, + ["ebopomofo"]=12572, + ["ebreve"]=277, + ["ecandradeva"]=2317, + ["ecandragujarati"]=2701, + ["ecandravowelsigndeva"]=2373, + ["ecandravowelsigngujarati"]=2757, + ["ecaron"]=283, + ["ecedillabreve"]=7709, + ["echarmenian"]=1381, + ["echyiwnarmenian"]=1415, + ["ecircle"]=9428, + ["ecircumflex"]=234, + ["ecircumflexacute"]=7871, + ["ecircumflexbelow"]=7705, + ["ecircumflexdotbelow"]=7879, + ["ecircumflexgrave"]=7873, + ["ecircumflexhookabove"]=7875, + ["ecircumflextilde"]=7877, + ["ecyrillic"]=1108, + ["edblgrave"]=517, + ["edeva"]=2319, + ["edieresis"]=235, + ["edot"]=279, + ["edotaccent"]=279, + ["edotbelow"]=7865, + ["eegurmukhi"]=2575, + ["eematragurmukhi"]=2631, + ["efcyrillic"]=1092, + ["egrave"]=232, + ["egujarati"]=2703, + ["eharmenian"]=1383, + ["ehbopomofo"]=12573, + ["ehiragana"]=12360, + ["ehookabove"]=7867, + ["eibopomofo"]=12575, + ["eight"]=56, + ["eightarabic"]=1640, + ["eightbengali"]=2542, + ["eightcircle"]=9319, + ["eightcircleinversesansserif"]=10129, + ["eightdeva"]=2414, + ["eighteencircle"]=9329, + ["eighteenparen"]=9349, + ["eighteenperiod"]=9369, + ["eightgujarati"]=2798, + ["eightgurmukhi"]=2670, + ["eighthackarabic"]=1640, + ["eighthangzhou"]=12328, + ["eighthnotebeamed"]=9835, + ["eightideographicparen"]=12839, + ["eightinferior"]=8328, + ["eightmonospace"]=65304, + ["eightparen"]=9339, + ["eightperiod"]=9359, + ["eightpersian"]=1784, + ["eightroman"]=8567, + ["eightsuperior"]=8312, + ["eightthai"]=3672, + ["einvertedbreve"]=519, + ["eiotifiedcyrillic"]=1125, + ["ekatakana"]=12456, + ["ekatakanahalfwidth"]=65396, + ["ekonkargurmukhi"]=2676, + ["ekorean"]=12628, + ["elcyrillic"]=1083, + ["element"]=8712, + ["elevencircle"]=9322, + ["elevenparen"]=9342, + ["elevenperiod"]=9362, + ["elevenroman"]=8570, + ["ellipsis"]=8230, + ["ellipsisvertical"]=8942, + ["emacron"]=275, + ["emacronacute"]=7703, + ["emacrongrave"]=7701, + ["emcyrillic"]=1084, + ["emdash"]=8212, + ["emdashvertical"]=65073, + ["emonospace"]=65349, + ["emphasismarkarmenian"]=1371, + ["emptyset"]=8709, + ["enbopomofo"]=12579, + ["encyrillic"]=1085, + ["endash"]=8211, + ["endashvertical"]=65074, + ["endescendercyrillic"]=1187, + ["eng"]=331, + ["engbopomofo"]=12581, + ["enghecyrillic"]=1189, + ["enhookcyrillic"]=1224, + ["enspace"]=8194, + ["eogonek"]=281, + ["eokorean"]=12627, + ["eopen"]=603, + ["eopenclosed"]=666, + ["eopenreversed"]=604, + ["eopenreversedclosed"]=606, + ["eopenreversedhook"]=605, + ["eparen"]=9376, + ["epsilon"]=949, + ["epsilontonos"]=941, + ["equal"]=61, + ["equalmonospace"]=65309, + ["equalsmall"]=65126, + ["equalsuperior"]=8316, + ["equivalence"]=8801, + ["erbopomofo"]=12582, + ["ercyrillic"]=1088, + ["ereversed"]=600, + ["ereversedcyrillic"]=1101, + ["escyrillic"]=1089, + ["esdescendercyrillic"]=1195, + ["esh"]=643, + ["eshcurl"]=646, + ["eshortdeva"]=2318, + ["eshortvowelsigndeva"]=2374, + ["eshreversedloop"]=426, + ["eshsquatreversed"]=645, + ["esmallhiragana"]=12359, + ["esmallkatakana"]=12455, + ["esmallkatakanahalfwidth"]=65386, + ["estimated"]=8494, + ["eta"]=951, + ["etarmenian"]=1384, + ["etatonos"]=942, + ["eth"]=240, + ["etilde"]=7869, + ["etildebelow"]=7707, + ["etnahtafoukhhebrew"]=1425, + ["etnahtafoukhlefthebrew"]=1425, + ["etnahtahebrew"]=1425, + ["etnahtalefthebrew"]=1425, + ["eturned"]=477, + ["eukorean"]=12641, + ["euro"]=8364, + ["evowelsignbengali"]=2503, + ["evowelsigndeva"]=2375, + ["evowelsigngujarati"]=2759, + ["exclam"]=33, + ["exclamarmenian"]=1372, + ["exclamdbl"]=8252, + ["exclamdown"]=161, + ["exclammonospace"]=65281, + ["existential"]=8707, + ["ezh"]=658, + ["ezhcaron"]=495, + ["ezhcurl"]=659, + ["ezhreversed"]=441, + ["ezhtail"]=442, + ["f"]=102, + ["fadeva"]=2398, + ["fagurmukhi"]=2654, + ["fahrenheit"]=8457, + ["fathaarabic"]=1614, + ["fathalowarabic"]=1614, + ["fathatanarabic"]=1611, + ["fbopomofo"]=12552, + ["fcircle"]=9429, + ["fdotaccent"]=7711, + ["feharabic"]=1601, + ["feharmenian"]=1414, + ["fehfinalarabic"]=65234, + ["fehinitialarabic"]=65235, + ["fehmedialarabic"]=65236, + ["feicoptic"]=997, + ["female"]=9792, + ["ff"]=64256, + ["ffi"]=64259, + ["ffl"]=64260, + ["fi"]=64257, + ["fifteencircle"]=9326, + ["fifteenparen"]=9346, + ["fifteenperiod"]=9366, + ["figuredash"]=8210, + ["filledbox"]=9632, + ["filledrect"]=9644, + ["finalkaf"]=1498, + ["finalkafdagesh"]=64314, + ["finalkafdageshhebrew"]=64314, + ["finalkafhebrew"]=1498, + ["finalkafqamats"]=1498, + ["finalkafqamatshebrew"]=1498, + ["finalkafsheva"]=1498, + ["finalkafshevahebrew"]=1498, + ["finalmem"]=1501, + ["finalmemhebrew"]=1501, + ["finalnun"]=1503, + ["finalnunhebrew"]=1503, + ["finalpe"]=1507, + ["finalpehebrew"]=1507, + ["finaltsadi"]=1509, + ["finaltsadihebrew"]=1509, + ["firsttonechinese"]=713, + ["fisheye"]=9673, + ["fitacyrillic"]=1139, + ["five"]=53, + ["fivearabic"]=1637, + ["fivebengali"]=2539, + ["fivecircle"]=9316, + ["fivecircleinversesansserif"]=10126, + ["fivedeva"]=2411, + ["fiveeighths"]=8541, + ["fivegujarati"]=2795, + ["fivegurmukhi"]=2667, + ["fivehackarabic"]=1637, + ["fivehangzhou"]=12325, + ["fiveideographicparen"]=12836, + ["fiveinferior"]=8325, + ["fivemonospace"]=65301, + ["fiveparen"]=9336, + ["fiveperiod"]=9356, + ["fivepersian"]=1781, + ["fiveroman"]=8564, + ["fivesuperior"]=8309, + ["fivethai"]=3669, + ["fl"]=64258, + ["florin"]=402, + ["fmonospace"]=65350, + ["fmsquare"]=13209, + ["fofanthai"]=3615, + ["fofathai"]=3613, + ["fongmanthai"]=3663, + ["forall"]=8704, + ["four"]=52, + ["fourarabic"]=1636, + ["fourbengali"]=2538, + ["fourcircle"]=9315, + ["fourcircleinversesansserif"]=10125, + ["fourdeva"]=2410, + ["fourgujarati"]=2794, + ["fourgurmukhi"]=2666, + ["fourhackarabic"]=1636, + ["fourhangzhou"]=12324, + ["fourideographicparen"]=12835, + ["fourinferior"]=8324, + ["fourmonospace"]=65300, + ["fournumeratorbengali"]=2551, + ["fourparen"]=9335, + ["fourperiod"]=9355, + ["fourpersian"]=1780, + ["fourroman"]=8563, + ["foursuperior"]=8308, + ["fourteencircle"]=9325, + ["fourteenparen"]=9345, + ["fourteenperiod"]=9365, + ["fourthai"]=3668, + ["fourthtonechinese"]=715, + ["fparen"]=9377, + ["fraction"]=8260, + ["franc"]=8355, + ["g"]=103, + ["gabengali"]=2455, + ["gacute"]=501, + ["gadeva"]=2327, + ["gafarabic"]=1711, + ["gaffinalarabic"]=64403, + ["gafinitialarabic"]=64404, + ["gafmedialarabic"]=64405, + ["gagujarati"]=2711, + ["gagurmukhi"]=2583, + ["gahiragana"]=12364, + ["gakatakana"]=12460, + ["gamma"]=947, + ["gammalatinsmall"]=611, + ["gammasuperior"]=736, + ["gangiacoptic"]=1003, + ["gbopomofo"]=12557, + ["gbreve"]=287, + ["gcaron"]=487, + ["gcedilla"]=291, + ["gcircle"]=9430, + ["gcircumflex"]=285, + ["gcommaaccent"]=291, + ["gdot"]=289, + ["gdotaccent"]=289, + ["gecyrillic"]=1075, + ["gehiragana"]=12370, + ["gekatakana"]=12466, + ["geometricallyequal"]=8785, + ["gereshaccenthebrew"]=1436, + ["gereshhebrew"]=1523, + ["gereshmuqdamhebrew"]=1437, + ["germandbls"]=223, + ["gershayimaccenthebrew"]=1438, + ["gershayimhebrew"]=1524, + ["getamark"]=12307, + ["ghabengali"]=2456, + ["ghadarmenian"]=1394, + ["ghadeva"]=2328, + ["ghagujarati"]=2712, + ["ghagurmukhi"]=2584, + ["ghainarabic"]=1594, + ["ghainfinalarabic"]=65230, + ["ghaininitialarabic"]=65231, + ["ghainmedialarabic"]=65232, + ["ghemiddlehookcyrillic"]=1173, + ["ghestrokecyrillic"]=1171, + ["gheupturncyrillic"]=1169, + ["ghhadeva"]=2394, + ["ghhagurmukhi"]=2650, + ["ghook"]=608, + ["ghzsquare"]=13203, + ["gihiragana"]=12366, + ["gikatakana"]=12462, + ["gimarmenian"]=1379, + ["gimel"]=1490, + ["gimeldagesh"]=64306, + ["gimeldageshhebrew"]=64306, + ["gimelhebrew"]=1490, + ["gjecyrillic"]=1107, + ["glottalinvertedstroke"]=446, + ["glottalstop"]=660, + ["glottalstopinverted"]=662, + ["glottalstopmod"]=704, + ["glottalstopreversed"]=661, + ["glottalstopreversedmod"]=705, + ["glottalstopreversedsuperior"]=740, + ["glottalstopstroke"]=673, + ["glottalstopstrokereversed"]=674, + ["gmacron"]=7713, + ["gmonospace"]=65351, + ["gohiragana"]=12372, + ["gokatakana"]=12468, + ["gparen"]=9378, + ["gpasquare"]=13228, + ["gradient"]=8711, + ["grave"]=96, + ["gravebelowcmb"]=790, + ["gravecmb"]=768, + ["gravecomb"]=768, + ["gravedeva"]=2387, + ["gravelowmod"]=718, + ["gravemonospace"]=65344, + ["gravetonecmb"]=832, + ["greater"]=62, + ["greaterequal"]=8805, + ["greaterequalorless"]=8923, + ["greatermonospace"]=65310, + ["greaterorequivalent"]=8819, + ["greaterorless"]=8823, + ["greateroverequal"]=8807, + ["greatersmall"]=65125, + ["gscript"]=609, + ["gstroke"]=485, + ["guhiragana"]=12368, + ["guillemotleft"]=171, + ["guillemotright"]=187, + ["guilsinglleft"]=8249, + ["guilsinglright"]=8250, + ["gukatakana"]=12464, + ["guramusquare"]=13080, + ["gysquare"]=13257, + ["h"]=104, + ["haabkhasiancyrillic"]=1193, + ["haaltonearabic"]=1729, + ["habengali"]=2489, + ["hadescendercyrillic"]=1203, + ["hadeva"]=2361, + ["hagujarati"]=2745, + ["hagurmukhi"]=2617, + ["haharabic"]=1581, + ["hahfinalarabic"]=65186, + ["hahinitialarabic"]=65187, + ["hahiragana"]=12399, + ["hahmedialarabic"]=65188, + ["haitusquare"]=13098, + ["hakatakana"]=12495, + ["hakatakanahalfwidth"]=65418, + ["halantgurmukhi"]=2637, + ["hamzaarabic"]=1569, + ["hamzadammaarabic"]=1569, + ["hamzadammatanarabic"]=1569, + ["hamzafathaarabic"]=1569, + ["hamzafathatanarabic"]=1569, + ["hamzalowarabic"]=1569, + ["hamzalowkasraarabic"]=1569, + ["hamzalowkasratanarabic"]=1569, + ["hamzasukunarabic"]=1569, + ["hangulfiller"]=12644, + ["hardsigncyrillic"]=1098, + ["harpoonleftbarbup"]=8636, + ["harpoonrightbarbup"]=8640, + ["hasquare"]=13258, + ["hatafpatah"]=1458, + ["hatafpatah16"]=1458, + ["hatafpatah23"]=1458, + ["hatafpatah2f"]=1458, + ["hatafpatahhebrew"]=1458, + ["hatafpatahnarrowhebrew"]=1458, + ["hatafpatahquarterhebrew"]=1458, + ["hatafpatahwidehebrew"]=1458, + ["hatafqamats"]=1459, + ["hatafqamats1b"]=1459, + ["hatafqamats28"]=1459, + ["hatafqamats34"]=1459, + ["hatafqamatshebrew"]=1459, + ["hatafqamatsnarrowhebrew"]=1459, + ["hatafqamatsquarterhebrew"]=1459, + ["hatafqamatswidehebrew"]=1459, + ["hatafsegol"]=1457, + ["hatafsegol17"]=1457, + ["hatafsegol24"]=1457, + ["hatafsegol30"]=1457, + ["hatafsegolhebrew"]=1457, + ["hatafsegolnarrowhebrew"]=1457, + ["hatafsegolquarterhebrew"]=1457, + ["hatafsegolwidehebrew"]=1457, + ["hbar"]=295, + ["hbopomofo"]=12559, + ["hbrevebelow"]=7723, + ["hcedilla"]=7721, + ["hcircle"]=9431, + ["hcircumflex"]=293, + ["hdieresis"]=7719, + ["hdotaccent"]=7715, + ["hdotbelow"]=7717, + ["he"]=1492, + ["heart"]=9829, + ["heartsuitblack"]=9829, + ["heartsuitwhite"]=9825, + ["hedagesh"]=64308, + ["hedageshhebrew"]=64308, + ["hehaltonearabic"]=1729, + ["heharabic"]=1607, + ["hehebrew"]=1492, + ["hehfinalaltonearabic"]=64423, + ["hehfinalalttwoarabic"]=65258, + ["hehfinalarabic"]=65258, + ["hehhamzaabovefinalarabic"]=64421, + ["hehhamzaaboveisolatedarabic"]=64420, + ["hehinitialaltonearabic"]=64424, + ["hehinitialarabic"]=65259, + ["hehiragana"]=12408, + ["hehmedialaltonearabic"]=64425, + ["hehmedialarabic"]=65260, + ["heiseierasquare"]=13179, + ["hekatakana"]=12504, + ["hekatakanahalfwidth"]=65421, + ["hekutaarusquare"]=13110, + ["henghook"]=615, + ["herutusquare"]=13113, + ["het"]=1495, + ["hethebrew"]=1495, + ["hhook"]=614, + ["hhooksuperior"]=689, + ["hieuhacirclekorean"]=12923, + ["hieuhaparenkorean"]=12827, + ["hieuhcirclekorean"]=12909, + ["hieuhkorean"]=12622, + ["hieuhparenkorean"]=12813, + ["hihiragana"]=12402, + ["hikatakana"]=12498, + ["hikatakanahalfwidth"]=65419, + ["hiriq"]=1460, + ["hiriq14"]=1460, + ["hiriq21"]=1460, + ["hiriq2d"]=1460, + ["hiriqhebrew"]=1460, + ["hiriqnarrowhebrew"]=1460, + ["hiriqquarterhebrew"]=1460, + ["hiriqwidehebrew"]=1460, + ["hlinebelow"]=7830, + ["hmonospace"]=65352, + ["hoarmenian"]=1392, + ["hohipthai"]=3627, + ["hohiragana"]=12411, + ["hokatakana"]=12507, + ["hokatakanahalfwidth"]=65422, + ["holam"]=1465, + ["holam19"]=1465, + ["holam26"]=1465, + ["holam32"]=1465, + ["holamhebrew"]=1465, + ["holamnarrowhebrew"]=1465, + ["holamquarterhebrew"]=1465, + ["holamwidehebrew"]=1465, + ["honokhukthai"]=3630, + ["hookabovecomb"]=777, + ["hookcmb"]=777, + ["hookpalatalizedbelowcmb"]=801, + ["hookretroflexbelowcmb"]=802, + ["hoonsquare"]=13122, + ["horicoptic"]=1001, + ["horizontalbar"]=8213, + ["horncmb"]=795, + ["hotsprings"]=9832, + ["house"]=8962, + ["hparen"]=9379, + ["hsuperior"]=688, + ["hturned"]=613, + ["huhiragana"]=12405, + ["huiitosquare"]=13107, + ["hukatakana"]=12501, + ["hukatakanahalfwidth"]=65420, + ["hungarumlaut"]=733, + ["hungarumlautcmb"]=779, + ["hv"]=405, + ["hyphen"]=45, + ["hyphenmonospace"]=65293, + ["hyphensmall"]=65123, + ["hyphentwo"]=8208, + ["i"]=105, + ["iacute"]=237, + ["iacyrillic"]=1103, + ["ibengali"]=2439, + ["ibopomofo"]=12583, + ["ibreve"]=301, + ["icaron"]=464, + ["icircle"]=9432, + ["icircumflex"]=238, + ["icyrillic"]=1110, + ["idblgrave"]=521, + ["ideographearthcircle"]=12943, + ["ideographfirecircle"]=12939, + ["ideographicallianceparen"]=12863, + ["ideographiccallparen"]=12858, + ["ideographiccentrecircle"]=12965, + ["ideographicclose"]=12294, + ["ideographiccomma"]=12289, + ["ideographiccommaleft"]=65380, + ["ideographiccongratulationparen"]=12855, + ["ideographiccorrectcircle"]=12963, + ["ideographicearthparen"]=12847, + ["ideographicenterpriseparen"]=12861, + ["ideographicexcellentcircle"]=12957, + ["ideographicfestivalparen"]=12864, + ["ideographicfinancialcircle"]=12950, + ["ideographicfinancialparen"]=12854, + ["ideographicfireparen"]=12843, + ["ideographichaveparen"]=12850, + ["ideographichighcircle"]=12964, + ["ideographiciterationmark"]=12293, + ["ideographiclaborcircle"]=12952, + ["ideographiclaborparen"]=12856, + ["ideographicleftcircle"]=12967, + ["ideographiclowcircle"]=12966, + ["ideographicmedicinecircle"]=12969, + ["ideographicmetalparen"]=12846, + ["ideographicmoonparen"]=12842, + ["ideographicnameparen"]=12852, + ["ideographicperiod"]=12290, + ["ideographicprintcircle"]=12958, + ["ideographicreachparen"]=12867, + ["ideographicrepresentparen"]=12857, + ["ideographicresourceparen"]=12862, + ["ideographicrightcircle"]=12968, + ["ideographicsecretcircle"]=12953, + ["ideographicselfparen"]=12866, + ["ideographicsocietyparen"]=12851, + ["ideographicspace"]=12288, + ["ideographicspecialparen"]=12853, + ["ideographicstockparen"]=12849, + ["ideographicstudyparen"]=12859, + ["ideographicsunparen"]=12848, + ["ideographicsuperviseparen"]=12860, + ["ideographicwaterparen"]=12844, + ["ideographicwoodparen"]=12845, + ["ideographiczero"]=12295, + ["ideographmetalcircle"]=12942, + ["ideographmooncircle"]=12938, + ["ideographnamecircle"]=12948, + ["ideographsuncircle"]=12944, + ["ideographwatercircle"]=12940, + ["ideographwoodcircle"]=12941, + ["ideva"]=2311, + ["idieresis"]=239, + ["idieresisacute"]=7727, + ["idieresiscyrillic"]=1253, + ["idotbelow"]=7883, + ["iebrevecyrillic"]=1239, + ["iecyrillic"]=1077, + ["ieungacirclekorean"]=12917, + ["ieungaparenkorean"]=12821, + ["ieungcirclekorean"]=12903, + ["ieungkorean"]=12615, + ["ieungparenkorean"]=12807, + ["igrave"]=236, + ["igujarati"]=2695, + ["igurmukhi"]=2567, + ["ihiragana"]=12356, + ["ihookabove"]=7881, + ["iibengali"]=2440, + ["iicyrillic"]=1080, + ["iideva"]=2312, + ["iigujarati"]=2696, + ["iigurmukhi"]=2568, + ["iimatragurmukhi"]=2624, + ["iinvertedbreve"]=523, + ["iishortcyrillic"]=1081, + ["iivowelsignbengali"]=2496, + ["iivowelsigndeva"]=2368, + ["iivowelsigngujarati"]=2752, + ["ij"]=307, + ["ikatakana"]=12452, + ["ikatakanahalfwidth"]=65394, + ["ikorean"]=12643, + ["ilde"]=732, + ["iluyhebrew"]=1452, + ["imacron"]=299, + ["imacroncyrillic"]=1251, + ["imageorapproximatelyequal"]=8787, + ["imatragurmukhi"]=2623, + ["imonospace"]=65353, + ["increment"]=8710, + ["infinity"]=8734, + ["iniarmenian"]=1387, + ["integral"]=8747, + ["integralbottom"]=8993, + ["integralbt"]=8993, + ["integraltop"]=8992, + ["integraltp"]=8992, + ["intersection"]=8745, + ["intisquare"]=13061, + ["invbullet"]=9688, + ["invcircle"]=9689, + ["invsmileface"]=9787, + ["iocyrillic"]=1105, + ["iogonek"]=303, + ["iota"]=953, + ["iotadieresis"]=970, + ["iotadieresistonos"]=912, + ["iotalatin"]=617, + ["iotatonos"]=943, + ["iparen"]=9380, + ["irigurmukhi"]=2674, + ["ismallhiragana"]=12355, + ["ismallkatakana"]=12451, + ["ismallkatakanahalfwidth"]=65384, + ["issharbengali"]=2554, + ["istroke"]=616, + ["iterationhiragana"]=12445, + ["iterationkatakana"]=12541, + ["itilde"]=297, + ["itildebelow"]=7725, + ["iubopomofo"]=12585, + ["iucyrillic"]=1102, + ["ivowelsignbengali"]=2495, + ["ivowelsigndeva"]=2367, + ["ivowelsigngujarati"]=2751, + ["izhitsacyrillic"]=1141, + ["izhitsadblgravecyrillic"]=1143, + ["j"]=106, + ["jaarmenian"]=1393, + ["jabengali"]=2460, + ["jadeva"]=2332, + ["jagujarati"]=2716, + ["jagurmukhi"]=2588, + ["jbopomofo"]=12560, + ["jcaron"]=496, + ["jcircle"]=9433, + ["jcircumflex"]=309, + ["jcrossedtail"]=669, + ["jdotlessstroke"]=607, + ["jecyrillic"]=1112, + ["jeemarabic"]=1580, + ["jeemfinalarabic"]=65182, + ["jeeminitialarabic"]=65183, + ["jeemmedialarabic"]=65184, + ["jeharabic"]=1688, + ["jehfinalarabic"]=64395, + ["jhabengali"]=2461, + ["jhadeva"]=2333, + ["jhagujarati"]=2717, + ["jhagurmukhi"]=2589, + ["jheharmenian"]=1403, + ["jis"]=12292, + ["jmonospace"]=65354, + ["jparen"]=9381, + ["jsuperior"]=690, + ["k"]=107, + ["kabashkircyrillic"]=1185, + ["kabengali"]=2453, + ["kacute"]=7729, + ["kacyrillic"]=1082, + ["kadescendercyrillic"]=1179, + ["kadeva"]=2325, + ["kaf"]=1499, + ["kafarabic"]=1603, + ["kafdagesh"]=64315, + ["kafdageshhebrew"]=64315, + ["kaffinalarabic"]=65242, + ["kafhebrew"]=1499, + ["kafinitialarabic"]=65243, + ["kafmedialarabic"]=65244, + ["kafrafehebrew"]=64333, + ["kagujarati"]=2709, + ["kagurmukhi"]=2581, + ["kahiragana"]=12363, + ["kahookcyrillic"]=1220, + ["kakatakana"]=12459, + ["kakatakanahalfwidth"]=65398, + ["kappa"]=954, + ["kappasymbolgreek"]=1008, + ["kapyeounmieumkorean"]=12657, + ["kapyeounphieuphkorean"]=12676, + ["kapyeounpieupkorean"]=12664, + ["kapyeounssangpieupkorean"]=12665, + ["karoriisquare"]=13069, + ["kashidaautoarabic"]=1600, + ["kashidaautonosidebearingarabic"]=1600, + ["kasmallkatakana"]=12533, + ["kasquare"]=13188, + ["kasraarabic"]=1616, + ["kasratanarabic"]=1613, + ["kastrokecyrillic"]=1183, + ["katahiraprolongmarkhalfwidth"]=65392, + ["kaverticalstrokecyrillic"]=1181, + ["kbopomofo"]=12558, + ["kcalsquare"]=13193, + ["kcaron"]=489, + ["kcedilla"]=311, + ["kcircle"]=9434, + ["kcommaaccent"]=311, + ["kdotbelow"]=7731, + ["keharmenian"]=1412, + ["kehiragana"]=12369, + ["kekatakana"]=12465, + ["kekatakanahalfwidth"]=65401, + ["kenarmenian"]=1391, + ["kesmallkatakana"]=12534, + ["kgreenlandic"]=312, + ["khabengali"]=2454, + ["khacyrillic"]=1093, + ["khadeva"]=2326, + ["khagujarati"]=2710, + ["khagurmukhi"]=2582, + ["khaharabic"]=1582, + ["khahfinalarabic"]=65190, + ["khahinitialarabic"]=65191, + ["khahmedialarabic"]=65192, + ["kheicoptic"]=999, + ["khhadeva"]=2393, + ["khhagurmukhi"]=2649, + ["khieukhacirclekorean"]=12920, + ["khieukhaparenkorean"]=12824, + ["khieukhcirclekorean"]=12906, + ["khieukhkorean"]=12619, + ["khieukhparenkorean"]=12810, + ["khokhaithai"]=3586, + ["khokhonthai"]=3589, + ["khokhuatthai"]=3587, + ["khokhwaithai"]=3588, + ["khomutthai"]=3675, + ["khook"]=409, + ["khorakhangthai"]=3590, + ["khzsquare"]=13201, + ["kihiragana"]=12365, + ["kikatakana"]=12461, + ["kikatakanahalfwidth"]=65399, + ["kiroguramusquare"]=13077, + ["kiromeetorusquare"]=13078, + ["kirosquare"]=13076, + ["kiyeokacirclekorean"]=12910, + ["kiyeokaparenkorean"]=12814, + ["kiyeokcirclekorean"]=12896, + ["kiyeokkorean"]=12593, + ["kiyeokparenkorean"]=12800, + ["kiyeoksioskorean"]=12595, + ["kjecyrillic"]=1116, + ["klinebelow"]=7733, + ["klsquare"]=13208, + ["kmcubedsquare"]=13222, + ["kmonospace"]=65355, + ["kmsquaredsquare"]=13218, + ["kohiragana"]=12371, + ["kohmsquare"]=13248, + ["kokaithai"]=3585, + ["kokatakana"]=12467, + ["kokatakanahalfwidth"]=65402, + ["kooposquare"]=13086, + ["koppacyrillic"]=1153, + ["koreanstandardsymbol"]=12927, + ["koroniscmb"]=835, + ["kparen"]=9382, + ["kpasquare"]=13226, + ["ksicyrillic"]=1135, + ["ktsquare"]=13263, + ["kturned"]=670, + ["kuhiragana"]=12367, + ["kukatakana"]=12463, + ["kukatakanahalfwidth"]=65400, + ["kvsquare"]=13240, + ["kwsquare"]=13246, + ["l"]=108, + ["labengali"]=2482, + ["lacute"]=314, + ["ladeva"]=2354, + ["lagujarati"]=2738, + ["lagurmukhi"]=2610, + ["lakkhangyaothai"]=3653, + ["lamaleffinalarabic"]=65276, + ["lamalefhamzaabovefinalarabic"]=65272, + ["lamalefhamzaaboveisolatedarabic"]=65271, + ["lamalefhamzabelowfinalarabic"]=65274, + ["lamalefhamzabelowisolatedarabic"]=65273, + ["lamalefisolatedarabic"]=65275, + ["lamalefmaddaabovefinalarabic"]=65270, + ["lamalefmaddaaboveisolatedarabic"]=65269, + ["lamarabic"]=1604, + ["lambda"]=955, + ["lambdastroke"]=411, + ["lamed"]=1500, + ["lameddagesh"]=64316, + ["lameddageshhebrew"]=64316, + ["lamedhebrew"]=1500, + ["lamedholam"]=1500, + ["lamedholamdagesh"]=1500, + ["lamedholamdageshhebrew"]=1500, + ["lamedholamhebrew"]=1500, + ["lamfinalarabic"]=65246, + ["lamhahinitialarabic"]=64714, + ["laminitialarabic"]=65247, + ["lamjeeminitialarabic"]=64713, + ["lamkhahinitialarabic"]=64715, + ["lamlamhehisolatedarabic"]=65010, + ["lammedialarabic"]=65248, + ["lammeemhahinitialarabic"]=64904, + ["lammeeminitialarabic"]=64716, + ["lammeemjeeminitialarabic"]=65247, + ["lammeemkhahinitialarabic"]=65247, + ["largecircle"]=9711, + ["lbar"]=410, + ["lbelt"]=620, + ["lbopomofo"]=12556, + ["lcaron"]=318, + ["lcedilla"]=316, + ["lcircle"]=9435, + ["lcircumflexbelow"]=7741, + ["lcommaaccent"]=316, + ["ldot"]=320, + ["ldotaccent"]=320, + ["ldotbelow"]=7735, + ["ldotbelowmacron"]=7737, + ["leftangleabovecmb"]=794, + ["lefttackbelowcmb"]=792, + ["less"]=60, + ["lessequal"]=8804, + ["lessequalorgreater"]=8922, + ["lessmonospace"]=65308, + ["lessorequivalent"]=8818, + ["lessorgreater"]=8822, + ["lessoverequal"]=8806, + ["lesssmall"]=65124, + ["lezh"]=622, + ["lfblock"]=9612, + ["lhookretroflex"]=621, + ["lira"]=8356, + ["liwnarmenian"]=1388, + ["lj"]=457, + ["ljecyrillic"]=1113, + ["lladeva"]=2355, + ["llagujarati"]=2739, + ["llinebelow"]=7739, + ["llladeva"]=2356, + ["llvocalicbengali"]=2529, + ["llvocalicdeva"]=2401, + ["llvocalicvowelsignbengali"]=2531, + ["llvocalicvowelsigndeva"]=2403, + ["lmiddletilde"]=619, + ["lmonospace"]=65356, + ["lmsquare"]=13264, + ["lochulathai"]=3628, + ["logicaland"]=8743, + ["logicalnot"]=172, + ["logicalnotreversed"]=8976, + ["logicalor"]=8744, + ["lolingthai"]=3621, + ["longs"]=383, + ["lowlinecenterline"]=65102, + ["lowlinecmb"]=818, + ["lowlinedashed"]=65101, + ["lozenge"]=9674, + ["lparen"]=9383, + ["lslash"]=322, + ["lsquare"]=8467, + ["ltshade"]=9617, + ["luthai"]=3622, + ["lvocalicbengali"]=2444, + ["lvocalicdeva"]=2316, + ["lvocalicvowelsignbengali"]=2530, + ["lvocalicvowelsigndeva"]=2402, + ["lxsquare"]=13267, + ["m"]=109, + ["mabengali"]=2478, + ["macron"]=175, + ["macronbelowcmb"]=817, + ["macroncmb"]=772, + ["macronlowmod"]=717, + ["macronmonospace"]=65507, + ["macute"]=7743, + ["madeva"]=2350, + ["magujarati"]=2734, + ["magurmukhi"]=2606, + ["mahapakhhebrew"]=1444, + ["mahapakhlefthebrew"]=1444, + ["mahiragana"]=12414, + ["maichattawathai"]=3659, + ["maiekthai"]=3656, + ["maihanakatthai"]=3633, + ["maitaikhuthai"]=3655, + ["maithothai"]=3657, + ["maitrithai"]=3658, + ["maiyamokthai"]=3654, + ["makatakana"]=12510, + ["makatakanahalfwidth"]=65423, + ["male"]=9794, + ["mansyonsquare"]=13127, + ["maqafhebrew"]=1470, + ["mars"]=9794, + ["masoracirclehebrew"]=1455, + ["masquare"]=13187, + ["mbopomofo"]=12551, + ["mbsquare"]=13268, + ["mcircle"]=9436, + ["mcubedsquare"]=13221, + ["mdotaccent"]=7745, + ["mdotbelow"]=7747, + ["meemarabic"]=1605, + ["meemfinalarabic"]=65250, + ["meeminitialarabic"]=65251, + ["meemmedialarabic"]=65252, + ["meemmeeminitialarabic"]=64721, + ["meemmeemisolatedarabic"]=64584, + ["meetorusquare"]=13133, + ["mehiragana"]=12417, + ["meizierasquare"]=13182, + ["mekatakana"]=12513, + ["mekatakanahalfwidth"]=65426, + ["mem"]=1502, + ["memdagesh"]=64318, + ["memdageshhebrew"]=64318, + ["memhebrew"]=1502, + ["menarmenian"]=1396, + ["merkhahebrew"]=1445, + ["merkhakefulahebrew"]=1446, + ["merkhakefulalefthebrew"]=1446, + ["merkhalefthebrew"]=1445, + ["mhook"]=625, + ["mhzsquare"]=13202, + ["middledotkatakanahalfwidth"]=65381, + ["middot"]=183, + ["mieumacirclekorean"]=12914, + ["mieumaparenkorean"]=12818, + ["mieumcirclekorean"]=12900, + ["mieumkorean"]=12609, + ["mieumpansioskorean"]=12656, + ["mieumparenkorean"]=12804, + ["mieumpieupkorean"]=12654, + ["mieumsioskorean"]=12655, + ["mihiragana"]=12415, + ["mikatakana"]=12511, + ["mikatakanahalfwidth"]=65424, + ["minus"]=8722, + ["minusbelowcmb"]=800, + ["minuscircle"]=8854, + ["minusmod"]=727, + ["minusplus"]=8723, + ["minute"]=8242, + ["miribaarusquare"]=13130, + ["mirisquare"]=13129, + ["mlonglegturned"]=624, + ["mlsquare"]=13206, + ["mmcubedsquare"]=13219, + ["mmonospace"]=65357, + ["mmsquaredsquare"]=13215, + ["mohiragana"]=12418, + ["mohmsquare"]=13249, + ["mokatakana"]=12514, + ["mokatakanahalfwidth"]=65427, + ["molsquare"]=13270, + ["momathai"]=3617, + ["moverssquare"]=13223, + ["moverssquaredsquare"]=13224, + ["mparen"]=9384, + ["mpasquare"]=13227, + ["mssquare"]=13235, + ["mturned"]=623, + ["mu"]=181, + ["mu1"]=181, + ["muasquare"]=13186, + ["muchgreater"]=8811, + ["muchless"]=8810, + ["mufsquare"]=13196, + ["mugreek"]=956, + ["mugsquare"]=13197, + ["muhiragana"]=12416, + ["mukatakana"]=12512, + ["mukatakanahalfwidth"]=65425, + ["mulsquare"]=13205, + ["multiply"]=215, + ["mumsquare"]=13211, + ["munahhebrew"]=1443, + ["munahlefthebrew"]=1443, + ["musicalnote"]=9834, + ["musicalnotedbl"]=9835, + ["musicflatsign"]=9837, + ["musicsharpsign"]=9839, + ["mussquare"]=13234, + ["muvsquare"]=13238, + ["muwsquare"]=13244, + ["mvmegasquare"]=13241, + ["mvsquare"]=13239, + ["mwmegasquare"]=13247, + ["mwsquare"]=13245, + ["n"]=110, + ["nabengali"]=2472, + ["nabla"]=8711, + ["nacute"]=324, + ["nadeva"]=2344, + ["nagujarati"]=2728, + ["nagurmukhi"]=2600, + ["nahiragana"]=12394, + ["nakatakana"]=12490, + ["nakatakanahalfwidth"]=65413, + ["napostrophe"]=329, + ["nasquare"]=13185, + ["nbopomofo"]=12555, + ["nbspace"]=160, + ["ncaron"]=328, + ["ncedilla"]=326, + ["ncircle"]=9437, + ["ncircumflexbelow"]=7755, + ["ncommaaccent"]=326, + ["ndotaccent"]=7749, + ["ndotbelow"]=7751, + ["nehiragana"]=12397, + ["nekatakana"]=12493, + ["nekatakanahalfwidth"]=65416, + ["newsheqelsign"]=8362, + ["nfsquare"]=13195, + ["ngabengali"]=2457, + ["ngadeva"]=2329, + ["ngagujarati"]=2713, + ["ngagurmukhi"]=2585, + ["ngonguthai"]=3591, + ["nhiragana"]=12435, + ["nhookleft"]=626, + ["nhookretroflex"]=627, + ["nieunacirclekorean"]=12911, + ["nieunaparenkorean"]=12815, + ["nieuncieuckorean"]=12597, + ["nieuncirclekorean"]=12897, + ["nieunhieuhkorean"]=12598, + ["nieunkorean"]=12596, + ["nieunpansioskorean"]=12648, + ["nieunparenkorean"]=12801, + ["nieunsioskorean"]=12647, + ["nieuntikeutkorean"]=12646, + ["nihiragana"]=12395, + ["nikatakana"]=12491, + ["nikatakanahalfwidth"]=65414, + ["nikhahitthai"]=3661, + ["nine"]=57, + ["ninearabic"]=1641, + ["ninebengali"]=2543, + ["ninecircle"]=9320, + ["ninecircleinversesansserif"]=10130, + ["ninedeva"]=2415, + ["ninegujarati"]=2799, + ["ninegurmukhi"]=2671, + ["ninehackarabic"]=1641, + ["ninehangzhou"]=12329, + ["nineideographicparen"]=12840, + ["nineinferior"]=8329, + ["ninemonospace"]=65305, + ["nineparen"]=9340, + ["nineperiod"]=9360, + ["ninepersian"]=1785, + ["nineroman"]=8568, + ["ninesuperior"]=8313, + ["nineteencircle"]=9330, + ["nineteenparen"]=9350, + ["nineteenperiod"]=9370, + ["ninethai"]=3673, + ["nj"]=460, + ["njecyrillic"]=1114, + ["nkatakana"]=12531, + ["nkatakanahalfwidth"]=65437, + ["nlegrightlong"]=414, + ["nlinebelow"]=7753, + ["nmonospace"]=65358, + ["nmsquare"]=13210, + ["nnabengali"]=2467, + ["nnadeva"]=2339, + ["nnagujarati"]=2723, + ["nnagurmukhi"]=2595, + ["nnnadeva"]=2345, + ["nohiragana"]=12398, + ["nokatakana"]=12494, + ["nokatakanahalfwidth"]=65417, + ["nonbreakingspace"]=160, + ["nonenthai"]=3603, + ["nonuthai"]=3609, + ["noonarabic"]=1606, + ["noonfinalarabic"]=65254, + ["noonghunnaarabic"]=1722, + ["noonghunnafinalarabic"]=64415, + ["noonhehinitialarabic"]=65255, + ["nooninitialarabic"]=65255, + ["noonjeeminitialarabic"]=64722, + ["noonjeemisolatedarabic"]=64587, + ["noonmedialarabic"]=65256, + ["noonmeeminitialarabic"]=64725, + ["noonmeemisolatedarabic"]=64590, + ["noonnoonfinalarabic"]=64653, + ["notcontains"]=8716, + ["notelement"]=8713, + ["notelementof"]=8713, + ["notequal"]=8800, + ["notgreater"]=8815, + ["notgreaternorequal"]=8817, + ["notgreaternorless"]=8825, + ["notidentical"]=8802, + ["notless"]=8814, + ["notlessnorequal"]=8816, + ["notparallel"]=8742, + ["notprecedes"]=8832, + ["notsubset"]=8836, + ["notsucceeds"]=8833, + ["notsuperset"]=8837, + ["nowarmenian"]=1398, + ["nparen"]=9385, + ["nssquare"]=13233, + ["nsuperior"]=8319, + ["ntilde"]=241, + ["nu"]=957, + ["nuhiragana"]=12396, + ["nukatakana"]=12492, + ["nukatakanahalfwidth"]=65415, + ["nuktabengali"]=2492, + ["nuktadeva"]=2364, + ["nuktagujarati"]=2748, + ["nuktagurmukhi"]=2620, + ["numbersign"]=35, + ["numbersignmonospace"]=65283, + ["numbersignsmall"]=65119, + ["numeralsigngreek"]=884, + ["numeralsignlowergreek"]=885, + ["numero"]=8470, + ["nun"]=1504, + ["nundagesh"]=64320, + ["nundageshhebrew"]=64320, + ["nunhebrew"]=1504, + ["nvsquare"]=13237, + ["nwsquare"]=13243, + ["nyabengali"]=2462, + ["nyadeva"]=2334, + ["nyagujarati"]=2718, + ["nyagurmukhi"]=2590, + ["o"]=111, + ["oacute"]=243, + ["oangthai"]=3629, + ["obarred"]=629, + ["obarredcyrillic"]=1257, + ["obarreddieresiscyrillic"]=1259, + ["obengali"]=2451, + ["obopomofo"]=12571, + ["obreve"]=335, + ["ocandradeva"]=2321, + ["ocandragujarati"]=2705, + ["ocandravowelsigndeva"]=2377, + ["ocandravowelsigngujarati"]=2761, + ["ocaron"]=466, + ["ocircle"]=9438, + ["ocircumflex"]=244, + ["ocircumflexacute"]=7889, + ["ocircumflexdotbelow"]=7897, + ["ocircumflexgrave"]=7891, + ["ocircumflexhookabove"]=7893, + ["ocircumflextilde"]=7895, + ["ocyrillic"]=1086, + ["odblacute"]=337, + ["odblgrave"]=525, + ["odeva"]=2323, + ["odieresis"]=246, + ["odieresiscyrillic"]=1255, + ["odotbelow"]=7885, + ["oe"]=339, + ["oekorean"]=12634, + ["ogonek"]=731, + ["ogonekcmb"]=808, + ["ograve"]=242, + ["ogujarati"]=2707, + ["oharmenian"]=1413, + ["ohiragana"]=12362, + ["ohookabove"]=7887, + ["ohorn"]=417, + ["ohornacute"]=7899, + ["ohorndotbelow"]=7907, + ["ohorngrave"]=7901, + ["ohornhookabove"]=7903, + ["ohorntilde"]=7905, + ["ohungarumlaut"]=337, + ["oi"]=419, + ["oinvertedbreve"]=527, + ["okatakana"]=12458, + ["okatakanahalfwidth"]=65397, + ["okorean"]=12631, + ["olehebrew"]=1451, + ["omacron"]=333, + ["omacronacute"]=7763, + ["omacrongrave"]=7761, + ["omdeva"]=2384, + ["omega"]=969, + ["omega1"]=982, + ["omegacyrillic"]=1121, + ["omegalatinclosed"]=631, + ["omegaroundcyrillic"]=1147, + ["omegatitlocyrillic"]=1149, + ["omegatonos"]=974, + ["omgujarati"]=2768, + ["omicron"]=959, + ["omicrontonos"]=972, + ["omonospace"]=65359, + ["one"]=49, + ["onearabic"]=1633, + ["onebengali"]=2535, + ["onecircle"]=9312, + ["onecircleinversesansserif"]=10122, + ["onedeva"]=2407, + ["onedotenleader"]=8228, + ["oneeighth"]=8539, + ["onegujarati"]=2791, + ["onegurmukhi"]=2663, + ["onehackarabic"]=1633, + ["onehalf"]=189, + ["onehangzhou"]=12321, + ["oneideographicparen"]=12832, + ["oneinferior"]=8321, + ["onemonospace"]=65297, + ["onenumeratorbengali"]=2548, + ["oneparen"]=9332, + ["oneperiod"]=9352, + ["onepersian"]=1777, + ["onequarter"]=188, + ["oneroman"]=8560, + ["onesuperior"]=185, + ["onethai"]=3665, + ["onethird"]=8531, + ["oogonek"]=491, + ["oogonekmacron"]=493, + ["oogurmukhi"]=2579, + ["oomatragurmukhi"]=2635, + ["oopen"]=596, + ["oparen"]=9386, + ["openbullet"]=9702, + ["option"]=8997, + ["ordfeminine"]=170, + ["ordmasculine"]=186, + ["orthogonal"]=8735, + ["oshortdeva"]=2322, + ["oshortvowelsigndeva"]=2378, + ["oslash"]=248, + ["oslashacute"]=511, + ["osmallhiragana"]=12361, + ["osmallkatakana"]=12457, + ["osmallkatakanahalfwidth"]=65387, + ["ostrokeacute"]=511, + ["otcyrillic"]=1151, + ["otilde"]=245, + ["otildeacute"]=7757, + ["otildedieresis"]=7759, + ["oubopomofo"]=12577, + ["overline"]=8254, + ["overlinecenterline"]=65098, + ["overlinecmb"]=773, + ["overlinedashed"]=65097, + ["overlinedblwavy"]=65100, + ["overlinewavy"]=65099, + ["overscore"]=175, + ["ovowelsignbengali"]=2507, + ["ovowelsigndeva"]=2379, + ["ovowelsigngujarati"]=2763, + ["p"]=112, + ["paampssquare"]=13184, + ["paasentosquare"]=13099, + ["pabengali"]=2474, + ["pacute"]=7765, + ["padeva"]=2346, + ["pagedown"]=8671, + ["pageup"]=8670, + ["pagujarati"]=2730, + ["pagurmukhi"]=2602, + ["pahiragana"]=12401, + ["paiyannoithai"]=3631, + ["pakatakana"]=12497, + ["palatalizationcyrilliccmb"]=1156, + ["palochkacyrillic"]=1216, + ["pansioskorean"]=12671, + ["paragraph"]=182, + ["parallel"]=8741, + ["parenleft"]=40, + ["parenleftaltonearabic"]=64830, + ["parenleftinferior"]=8333, + ["parenleftmonospace"]=65288, + ["parenleftsmall"]=65113, + ["parenleftsuperior"]=8317, + ["parenleftvertical"]=65077, + ["parenright"]=41, + ["parenrightaltonearabic"]=64831, + ["parenrightinferior"]=8334, + ["parenrightmonospace"]=65289, + ["parenrightsmall"]=65114, + ["parenrightsuperior"]=8318, + ["parenrightvertical"]=65078, + ["partialdiff"]=8706, + ["paseqhebrew"]=1472, + ["pashtahebrew"]=1433, + ["pasquare"]=13225, + ["patah"]=1463, + ["patah11"]=1463, + ["patah1d"]=1463, + ["patah2a"]=1463, + ["patahhebrew"]=1463, + ["patahnarrowhebrew"]=1463, + ["patahquarterhebrew"]=1463, + ["patahwidehebrew"]=1463, + ["pazerhebrew"]=1441, + ["pbopomofo"]=12550, + ["pcircle"]=9439, + ["pdotaccent"]=7767, + ["pe"]=1508, + ["pecyrillic"]=1087, + ["pedagesh"]=64324, + ["pedageshhebrew"]=64324, + ["peezisquare"]=13115, + ["pefinaldageshhebrew"]=64323, + ["peharabic"]=1662, + ["peharmenian"]=1402, + ["pehebrew"]=1508, + ["pehfinalarabic"]=64343, + ["pehinitialarabic"]=64344, + ["pehiragana"]=12410, + ["pehmedialarabic"]=64345, + ["pekatakana"]=12506, + ["pemiddlehookcyrillic"]=1191, + ["perafehebrew"]=64334, + ["percent"]=37, + ["percentarabic"]=1642, + ["percentmonospace"]=65285, + ["percentsmall"]=65130, + ["period"]=46, + ["periodarmenian"]=1417, + ["periodcentered"]=183, + ["periodhalfwidth"]=65377, + ["periodmonospace"]=65294, + ["periodsmall"]=65106, + ["perispomenigreekcmb"]=834, + ["perpendicular"]=8869, + ["perthousand"]=8240, + ["peseta"]=8359, + ["pfsquare"]=13194, + ["phabengali"]=2475, + ["phadeva"]=2347, + ["phagujarati"]=2731, + ["phagurmukhi"]=2603, + ["phi"]=966, + ["phi1"]=981, + ["phieuphacirclekorean"]=12922, + ["phieuphaparenkorean"]=12826, + ["phieuphcirclekorean"]=12908, + ["phieuphkorean"]=12621, + ["phieuphparenkorean"]=12812, + ["philatin"]=632, + ["phinthuthai"]=3642, + ["phisymbolgreek"]=981, + ["phook"]=421, + ["phophanthai"]=3614, + ["phophungthai"]=3612, + ["phosamphaothai"]=3616, + ["pi"]=960, + ["pieupacirclekorean"]=12915, + ["pieupaparenkorean"]=12819, + ["pieupcieuckorean"]=12662, + ["pieupcirclekorean"]=12901, + ["pieupkiyeokkorean"]=12658, + ["pieupkorean"]=12610, + ["pieupparenkorean"]=12805, + ["pieupsioskiyeokkorean"]=12660, + ["pieupsioskorean"]=12612, + ["pieupsiostikeutkorean"]=12661, + ["pieupthieuthkorean"]=12663, + ["pieuptikeutkorean"]=12659, + ["pihiragana"]=12404, + ["pikatakana"]=12500, + ["pisymbolgreek"]=982, + ["piwrarmenian"]=1411, + ["plus"]=43, + ["plusbelowcmb"]=799, + ["pluscircle"]=8853, + ["plusminus"]=177, + ["plusmod"]=726, + ["plusmonospace"]=65291, + ["plussmall"]=65122, + ["plussuperior"]=8314, + ["pmonospace"]=65360, + ["pmsquare"]=13272, + ["pohiragana"]=12413, + ["pointingindexdownwhite"]=9759, + ["pointingindexleftwhite"]=9756, + ["pointingindexrightwhite"]=9758, + ["pointingindexupwhite"]=9757, + ["pokatakana"]=12509, + ["poplathai"]=3611, + ["postalmark"]=12306, + ["postalmarkface"]=12320, + ["pparen"]=9387, + ["precedes"]=8826, + ["prescription"]=8478, + ["primemod"]=697, + ["primereversed"]=8245, + ["product"]=8719, + ["projective"]=8965, + ["prolongedkana"]=12540, + ["propellor"]=8984, + ["propersubset"]=8834, + ["propersuperset"]=8835, + ["proportion"]=8759, + ["proportional"]=8733, + ["psi"]=968, + ["psicyrillic"]=1137, + ["psilipneumatacyrilliccmb"]=1158, + ["pssquare"]=13232, + ["puhiragana"]=12407, + ["pukatakana"]=12503, + ["pvsquare"]=13236, + ["pwsquare"]=13242, + ["q"]=113, + ["qadeva"]=2392, + ["qadmahebrew"]=1448, + ["qafarabic"]=1602, + ["qaffinalarabic"]=65238, + ["qafinitialarabic"]=65239, + ["qafmedialarabic"]=65240, + ["qamats"]=1464, + ["qamats10"]=1464, + ["qamats1a"]=1464, + ["qamats1c"]=1464, + ["qamats27"]=1464, + ["qamats29"]=1464, + ["qamats33"]=1464, + ["qamatsde"]=1464, + ["qamatshebrew"]=1464, + ["qamatsnarrowhebrew"]=1464, + ["qamatsqatanhebrew"]=1464, + ["qamatsqatannarrowhebrew"]=1464, + ["qamatsqatanquarterhebrew"]=1464, + ["qamatsqatanwidehebrew"]=1464, + ["qamatsquarterhebrew"]=1464, + ["qamatswidehebrew"]=1464, + ["qarneyparahebrew"]=1439, + ["qbopomofo"]=12561, + ["qcircle"]=9440, + ["qhook"]=672, + ["qmonospace"]=65361, + ["qof"]=1511, + ["qofdagesh"]=64327, + ["qofdageshhebrew"]=64327, + ["qofhatafpatah"]=1511, + ["qofhatafpatahhebrew"]=1511, + ["qofhatafsegol"]=1511, + ["qofhatafsegolhebrew"]=1511, + ["qofhebrew"]=1511, + ["qofhiriq"]=1511, + ["qofhiriqhebrew"]=1511, + ["qofholam"]=1511, + ["qofholamhebrew"]=1511, + ["qofpatah"]=1511, + ["qofpatahhebrew"]=1511, + ["qofqamats"]=1511, + ["qofqamatshebrew"]=1511, + ["qofqubuts"]=1511, + ["qofqubutshebrew"]=1511, + ["qofsegol"]=1511, + ["qofsegolhebrew"]=1511, + ["qofsheva"]=1511, + ["qofshevahebrew"]=1511, + ["qoftsere"]=1511, + ["qoftserehebrew"]=1511, + ["qparen"]=9388, + ["quarternote"]=9833, + ["qubuts"]=1467, + ["qubuts18"]=1467, + ["qubuts25"]=1467, + ["qubuts31"]=1467, + ["qubutshebrew"]=1467, + ["qubutsnarrowhebrew"]=1467, + ["qubutsquarterhebrew"]=1467, + ["qubutswidehebrew"]=1467, + ["question"]=63, + ["questionarabic"]=1567, + ["questionarmenian"]=1374, + ["questiondown"]=191, + ["questiongreek"]=894, + ["questionmonospace"]=65311, + ["quotedbl"]=34, + ["quotedblbase"]=8222, + ["quotedblleft"]=8220, + ["quotedblmonospace"]=65282, + ["quotedblprime"]=12318, + ["quotedblprimereversed"]=12317, + ["quotedblright"]=8221, + ["quoteleft"]=8216, + ["quoteleftreversed"]=8219, + ["quotereversed"]=8219, + ["quoteright"]=8217, + ["quoterightn"]=329, + ["quotesinglbase"]=8218, + ["quotesingle"]=39, + ["quotesinglemonospace"]=65287, + ["r"]=114, + ["raarmenian"]=1404, + ["rabengali"]=2480, + ["racute"]=341, + ["radeva"]=2352, + ["radical"]=8730, + ["radoverssquare"]=13230, + ["radoverssquaredsquare"]=13231, + ["radsquare"]=13229, + ["rafe"]=1471, + ["rafehebrew"]=1471, + ["ragujarati"]=2736, + ["ragurmukhi"]=2608, + ["rahiragana"]=12425, + ["rakatakana"]=12521, + ["rakatakanahalfwidth"]=65431, + ["ralowerdiagonalbengali"]=2545, + ["ramiddlediagonalbengali"]=2544, + ["ramshorn"]=612, + ["ratio"]=8758, + ["rbopomofo"]=12566, + ["rcaron"]=345, + ["rcedilla"]=343, + ["rcircle"]=9441, + ["rcommaaccent"]=343, + ["rdblgrave"]=529, + ["rdotaccent"]=7769, + ["rdotbelow"]=7771, + ["rdotbelowmacron"]=7773, + ["referencemark"]=8251, + ["reflexsubset"]=8838, + ["reflexsuperset"]=8839, + ["registered"]=174, + ["reharabic"]=1585, + ["reharmenian"]=1408, + ["rehfinalarabic"]=65198, + ["rehiragana"]=12428, + ["rehyehaleflamarabic"]=1585, + ["rekatakana"]=12524, + ["rekatakanahalfwidth"]=65434, + ["resh"]=1512, + ["reshdageshhebrew"]=64328, + ["reshhatafpatah"]=1512, + ["reshhatafpatahhebrew"]=1512, + ["reshhatafsegol"]=1512, + ["reshhatafsegolhebrew"]=1512, + ["reshhebrew"]=1512, + ["reshhiriq"]=1512, + ["reshhiriqhebrew"]=1512, + ["reshholam"]=1512, + ["reshholamhebrew"]=1512, + ["reshpatah"]=1512, + ["reshpatahhebrew"]=1512, + ["reshqamats"]=1512, + ["reshqamatshebrew"]=1512, + ["reshqubuts"]=1512, + ["reshqubutshebrew"]=1512, + ["reshsegol"]=1512, + ["reshsegolhebrew"]=1512, + ["reshsheva"]=1512, + ["reshshevahebrew"]=1512, + ["reshtsere"]=1512, + ["reshtserehebrew"]=1512, + ["reversedtilde"]=8765, + ["reviahebrew"]=1431, + ["reviamugrashhebrew"]=1431, + ["revlogicalnot"]=8976, + ["rfishhook"]=638, + ["rfishhookreversed"]=639, + ["rhabengali"]=2525, + ["rhadeva"]=2397, + ["rho"]=961, + ["rhook"]=637, + ["rhookturned"]=635, + ["rhookturnedsuperior"]=693, + ["rhosymbolgreek"]=1009, + ["rhotichookmod"]=734, + ["rieulacirclekorean"]=12913, + ["rieulaparenkorean"]=12817, + ["rieulcirclekorean"]=12899, + ["rieulhieuhkorean"]=12608, + ["rieulkiyeokkorean"]=12602, + ["rieulkiyeoksioskorean"]=12649, + ["rieulkorean"]=12601, + ["rieulmieumkorean"]=12603, + ["rieulpansioskorean"]=12652, + ["rieulparenkorean"]=12803, + ["rieulphieuphkorean"]=12607, + ["rieulpieupkorean"]=12604, + ["rieulpieupsioskorean"]=12651, + ["rieulsioskorean"]=12605, + ["rieulthieuthkorean"]=12606, + ["rieultikeutkorean"]=12650, + ["rieulyeorinhieuhkorean"]=12653, + ["rightangle"]=8735, + ["righttackbelowcmb"]=793, + ["righttriangle"]=8895, + ["rihiragana"]=12426, + ["rikatakana"]=12522, + ["rikatakanahalfwidth"]=65432, + ["ring"]=730, + ["ringbelowcmb"]=805, + ["ringcmb"]=778, + ["ringhalfleft"]=703, + ["ringhalfleftarmenian"]=1369, + ["ringhalfleftbelowcmb"]=796, + ["ringhalfleftcentered"]=723, + ["ringhalfright"]=702, + ["ringhalfrightbelowcmb"]=825, + ["ringhalfrightcentered"]=722, + ["rinvertedbreve"]=531, + ["rittorusquare"]=13137, + ["rlinebelow"]=7775, + ["rlongleg"]=636, + ["rlonglegturned"]=634, + ["rmonospace"]=65362, + ["rohiragana"]=12429, + ["rokatakana"]=12525, + ["rokatakanahalfwidth"]=65435, + ["roruathai"]=3619, + ["rparen"]=9389, + ["rrabengali"]=2524, + ["rradeva"]=2353, + ["rragurmukhi"]=2652, + ["rreharabic"]=1681, + ["rrehfinalarabic"]=64397, + ["rrvocalicbengali"]=2528, + ["rrvocalicdeva"]=2400, + ["rrvocalicgujarati"]=2784, + ["rrvocalicvowelsignbengali"]=2500, + ["rrvocalicvowelsigndeva"]=2372, + ["rrvocalicvowelsigngujarati"]=2756, + ["rtblock"]=9616, + ["rturned"]=633, + ["rturnedsuperior"]=692, + ["ruhiragana"]=12427, + ["rukatakana"]=12523, + ["rukatakanahalfwidth"]=65433, + ["rupeemarkbengali"]=2546, + ["rupeesignbengali"]=2547, + ["ruthai"]=3620, + ["rvocalicbengali"]=2443, + ["rvocalicdeva"]=2315, + ["rvocalicgujarati"]=2699, + ["rvocalicvowelsignbengali"]=2499, + ["rvocalicvowelsigndeva"]=2371, + ["rvocalicvowelsigngujarati"]=2755, + ["s"]=115, + ["sabengali"]=2488, + ["sacute"]=347, + ["sacutedotaccent"]=7781, + ["sadarabic"]=1589, + ["sadeva"]=2360, + ["sadfinalarabic"]=65210, + ["sadinitialarabic"]=65211, + ["sadmedialarabic"]=65212, + ["sagujarati"]=2744, + ["sagurmukhi"]=2616, + ["sahiragana"]=12373, + ["sakatakana"]=12469, + ["sakatakanahalfwidth"]=65403, + ["sallallahoualayhewasallamarabic"]=65018, + ["samekh"]=1505, + ["samekhdagesh"]=64321, + ["samekhdageshhebrew"]=64321, + ["samekhhebrew"]=1505, + ["saraaathai"]=3634, + ["saraaethai"]=3649, + ["saraaimaimalaithai"]=3652, + ["saraaimaimuanthai"]=3651, + ["saraamthai"]=3635, + ["saraathai"]=3632, + ["saraethai"]=3648, + ["saraiithai"]=3637, + ["saraithai"]=3636, + ["saraothai"]=3650, + ["saraueethai"]=3639, + ["sarauethai"]=3638, + ["sarauthai"]=3640, + ["sarauuthai"]=3641, + ["sbopomofo"]=12569, + ["scaron"]=353, + ["scarondotaccent"]=7783, + ["scedilla"]=351, + ["schwa"]=601, + ["schwacyrillic"]=1241, + ["schwadieresiscyrillic"]=1243, + ["schwahook"]=602, + ["scircle"]=9442, + ["scircumflex"]=349, + ["scommaaccent"]=537, + ["sdotaccent"]=7777, + ["sdotbelow"]=7779, + ["sdotbelowdotaccent"]=7785, + ["seagullbelowcmb"]=828, + ["second"]=8243, + ["secondtonechinese"]=714, + ["section"]=167, + ["seenarabic"]=1587, + ["seenfinalarabic"]=65202, + ["seeninitialarabic"]=65203, + ["seenmedialarabic"]=65204, + ["segol"]=1462, + ["segol13"]=1462, + ["segol1f"]=1462, + ["segol2c"]=1462, + ["segolhebrew"]=1462, + ["segolnarrowhebrew"]=1462, + ["segolquarterhebrew"]=1462, + ["segoltahebrew"]=1426, + ["segolwidehebrew"]=1462, + ["seharmenian"]=1405, + ["sehiragana"]=12379, + ["sekatakana"]=12475, + ["sekatakanahalfwidth"]=65406, + ["semicolon"]=59, + ["semicolonarabic"]=1563, + ["semicolonmonospace"]=65307, + ["semicolonsmall"]=65108, + ["semivoicedmarkkana"]=12444, + ["semivoicedmarkkanahalfwidth"]=65439, + ["sentisquare"]=13090, + ["sentosquare"]=13091, + ["seven"]=55, + ["sevenarabic"]=1639, + ["sevenbengali"]=2541, + ["sevencircle"]=9318, + ["sevencircleinversesansserif"]=10128, + ["sevendeva"]=2413, + ["seveneighths"]=8542, + ["sevengujarati"]=2797, + ["sevengurmukhi"]=2669, + ["sevenhackarabic"]=1639, + ["sevenhangzhou"]=12327, + ["sevenideographicparen"]=12838, + ["seveninferior"]=8327, + ["sevenmonospace"]=65303, + ["sevenparen"]=9338, + ["sevenperiod"]=9358, + ["sevenpersian"]=1783, + ["sevenroman"]=8566, + ["sevensuperior"]=8311, + ["seventeencircle"]=9328, + ["seventeenparen"]=9348, + ["seventeenperiod"]=9368, + ["seventhai"]=3671, + ["sfthyphen"]=173, + ["shaarmenian"]=1399, + ["shabengali"]=2486, + ["shacyrillic"]=1096, + ["shaddaarabic"]=1617, + ["shaddadammaarabic"]=64609, + ["shaddadammatanarabic"]=64606, + ["shaddafathaarabic"]=64608, + ["shaddafathatanarabic"]=1617, + ["shaddakasraarabic"]=64610, + ["shaddakasratanarabic"]=64607, + ["shade"]=9618, + ["shadedark"]=9619, + ["shadelight"]=9617, + ["shademedium"]=9618, + ["shadeva"]=2358, + ["shagujarati"]=2742, + ["shagurmukhi"]=2614, + ["shalshelethebrew"]=1427, + ["shbopomofo"]=12565, + ["shchacyrillic"]=1097, + ["sheenarabic"]=1588, + ["sheenfinalarabic"]=65206, + ["sheeninitialarabic"]=65207, + ["sheenmedialarabic"]=65208, + ["sheicoptic"]=995, + ["sheqel"]=8362, + ["sheqelhebrew"]=8362, + ["sheva"]=1456, + ["sheva115"]=1456, + ["sheva15"]=1456, + ["sheva22"]=1456, + ["sheva2e"]=1456, + ["shevahebrew"]=1456, + ["shevanarrowhebrew"]=1456, + ["shevaquarterhebrew"]=1456, + ["shevawidehebrew"]=1456, + ["shhacyrillic"]=1211, + ["shimacoptic"]=1005, + ["shin"]=1513, + ["shindagesh"]=64329, + ["shindageshhebrew"]=64329, + ["shindageshshindot"]=64300, + ["shindageshshindothebrew"]=64300, + ["shindageshsindot"]=64301, + ["shindageshsindothebrew"]=64301, + ["shindothebrew"]=1473, + ["shinhebrew"]=1513, + ["shinshindot"]=64298, + ["shinshindothebrew"]=64298, + ["shinsindot"]=64299, + ["shinsindothebrew"]=64299, + ["shook"]=642, + ["sigma"]=963, + ["sigma1"]=962, + ["sigmafinal"]=962, + ["sigmalunatesymbolgreek"]=1010, + ["sihiragana"]=12375, + ["sikatakana"]=12471, + ["sikatakanahalfwidth"]=65404, + ["siluqhebrew"]=1469, + ["siluqlefthebrew"]=1469, + ["similar"]=8764, + ["sindothebrew"]=1474, + ["siosacirclekorean"]=12916, + ["siosaparenkorean"]=12820, + ["sioscieuckorean"]=12670, + ["sioscirclekorean"]=12902, + ["sioskiyeokkorean"]=12666, + ["sioskorean"]=12613, + ["siosnieunkorean"]=12667, + ["siosparenkorean"]=12806, + ["siospieupkorean"]=12669, + ["siostikeutkorean"]=12668, + ["six"]=54, + ["sixarabic"]=1638, + ["sixbengali"]=2540, + ["sixcircle"]=9317, + ["sixcircleinversesansserif"]=10127, + ["sixdeva"]=2412, + ["sixgujarati"]=2796, + ["sixgurmukhi"]=2668, + ["sixhackarabic"]=1638, + ["sixhangzhou"]=12326, + ["sixideographicparen"]=12837, + ["sixinferior"]=8326, + ["sixmonospace"]=65302, + ["sixparen"]=9337, + ["sixperiod"]=9357, + ["sixpersian"]=1782, + ["sixroman"]=8565, + ["sixsuperior"]=8310, + ["sixteencircle"]=9327, + ["sixteencurrencydenominatorbengali"]=2553, + ["sixteenparen"]=9347, + ["sixteenperiod"]=9367, + ["sixthai"]=3670, + ["slash"]=47, + ["slashmonospace"]=65295, + ["slong"]=383, + ["slongdotaccent"]=7835, + ["smileface"]=9786, + ["smonospace"]=65363, + ["sofpasuqhebrew"]=1475, + ["softhyphen"]=173, + ["softsigncyrillic"]=1100, + ["sohiragana"]=12381, + ["sokatakana"]=12477, + ["sokatakanahalfwidth"]=65407, + ["soliduslongoverlaycmb"]=824, + ["solidusshortoverlaycmb"]=823, + ["sorusithai"]=3625, + ["sosalathai"]=3624, + ["sosothai"]=3595, + ["sosuathai"]=3626, + ["space"]=32, + ["spacehackarabic"]=32, + ["spade"]=9824, + ["spadesuitblack"]=9824, + ["spadesuitwhite"]=9828, + ["sparen"]=9390, + ["squarebelowcmb"]=827, + ["squarecc"]=13252, + ["squarecm"]=13213, + ["squarediagonalcrosshatchfill"]=9641, + ["squarehorizontalfill"]=9636, + ["squarekg"]=13199, + ["squarekm"]=13214, + ["squarekmcapital"]=13262, + ["squareln"]=13265, + ["squarelog"]=13266, + ["squaremg"]=13198, + ["squaremil"]=13269, + ["squaremm"]=13212, + ["squaremsquared"]=13217, + ["squareorthogonalcrosshatchfill"]=9638, + ["squareupperlefttolowerrightfill"]=9639, + ["squareupperrighttolowerleftfill"]=9640, + ["squareverticalfill"]=9637, + ["squarewhitewithsmallblack"]=9635, + ["srsquare"]=13275, + ["ssabengali"]=2487, + ["ssadeva"]=2359, + ["ssagujarati"]=2743, + ["ssangcieuckorean"]=12617, + ["ssanghieuhkorean"]=12677, + ["ssangieungkorean"]=12672, + ["ssangkiyeokkorean"]=12594, + ["ssangnieunkorean"]=12645, + ["ssangpieupkorean"]=12611, + ["ssangsioskorean"]=12614, + ["ssangtikeutkorean"]=12600, + ["sterling"]=163, + ["sterlingmonospace"]=65505, + ["strokelongoverlaycmb"]=822, + ["strokeshortoverlaycmb"]=821, + ["subset"]=8834, + ["subsetnotequal"]=8842, + ["subsetorequal"]=8838, + ["succeeds"]=8827, + ["suchthat"]=8715, + ["suhiragana"]=12377, + ["sukatakana"]=12473, + ["sukatakanahalfwidth"]=65405, + ["sukunarabic"]=1618, + ["summation"]=8721, + ["sun"]=9788, + ["superset"]=8835, + ["supersetnotequal"]=8843, + ["supersetorequal"]=8839, + ["svsquare"]=13276, + ["syouwaerasquare"]=13180, + ["t"]=116, + ["tabengali"]=2468, + ["tackdown"]=8868, + ["tackleft"]=8867, + ["tadeva"]=2340, + ["tagujarati"]=2724, + ["tagurmukhi"]=2596, + ["taharabic"]=1591, + ["tahfinalarabic"]=65218, + ["tahinitialarabic"]=65219, + ["tahiragana"]=12383, + ["tahmedialarabic"]=65220, + ["taisyouerasquare"]=13181, + ["takatakana"]=12479, + ["takatakanahalfwidth"]=65408, + ["tatweelarabic"]=1600, + ["tau"]=964, + ["tav"]=1514, + ["tavdages"]=64330, + ["tavdagesh"]=64330, + ["tavdageshhebrew"]=64330, + ["tavhebrew"]=1514, + ["tbar"]=359, + ["tbopomofo"]=12554, + ["tcaron"]=357, + ["tccurl"]=680, + ["tcedilla"]=355, + ["tcheharabic"]=1670, + ["tchehfinalarabic"]=64379, + ["tchehinitialarabic"]=64380, + ["tchehmedialarabic"]=64381, + ["tchehmeeminitialarabic"]=64380, + ["tcircle"]=9443, + ["tcircumflexbelow"]=7793, + ["tcommaaccent"]=355, + ["tdieresis"]=7831, + ["tdotaccent"]=7787, + ["tdotbelow"]=7789, + ["tecyrillic"]=1090, + ["tedescendercyrillic"]=1197, + ["teharabic"]=1578, + ["tehfinalarabic"]=65174, + ["tehhahinitialarabic"]=64674, + ["tehhahisolatedarabic"]=64524, + ["tehinitialarabic"]=65175, + ["tehiragana"]=12390, + ["tehjeeminitialarabic"]=64673, + ["tehjeemisolatedarabic"]=64523, + ["tehmarbutaarabic"]=1577, + ["tehmarbutafinalarabic"]=65172, + ["tehmedialarabic"]=65176, + ["tehmeeminitialarabic"]=64676, + ["tehmeemisolatedarabic"]=64526, + ["tehnoonfinalarabic"]=64627, + ["tekatakana"]=12486, + ["tekatakanahalfwidth"]=65411, + ["telephone"]=8481, + ["telephoneblack"]=9742, + ["telishagedolahebrew"]=1440, + ["telishaqetanahebrew"]=1449, + ["tencircle"]=9321, + ["tenideographicparen"]=12841, + ["tenparen"]=9341, + ["tenperiod"]=9361, + ["tenroman"]=8569, + ["tesh"]=679, + ["tet"]=1496, + ["tetdagesh"]=64312, + ["tetdageshhebrew"]=64312, + ["tethebrew"]=1496, + ["tetsecyrillic"]=1205, + ["tevirhebrew"]=1435, + ["tevirlefthebrew"]=1435, + ["thabengali"]=2469, + ["thadeva"]=2341, + ["thagujarati"]=2725, + ["thagurmukhi"]=2597, + ["thalarabic"]=1584, + ["thalfinalarabic"]=65196, + ["thanthakhatthai"]=3660, + ["theharabic"]=1579, + ["thehfinalarabic"]=65178, + ["thehinitialarabic"]=65179, + ["thehmedialarabic"]=65180, + ["thereexists"]=8707, + ["therefore"]=8756, + ["theta"]=952, + ["theta1"]=977, + ["thetasymbolgreek"]=977, + ["thieuthacirclekorean"]=12921, + ["thieuthaparenkorean"]=12825, + ["thieuthcirclekorean"]=12907, + ["thieuthkorean"]=12620, + ["thieuthparenkorean"]=12811, + ["thirteencircle"]=9324, + ["thirteenparen"]=9344, + ["thirteenperiod"]=9364, + ["thonangmonthothai"]=3601, + ["thook"]=429, + ["thophuthaothai"]=3602, + ["thorn"]=254, + ["thothahanthai"]=3607, + ["thothanthai"]=3600, + ["thothongthai"]=3608, + ["thothungthai"]=3606, + ["thousandcyrillic"]=1154, + ["thousandsseparatorarabic"]=1644, + ["thousandsseparatorpersian"]=1644, + ["three"]=51, + ["threearabic"]=1635, + ["threebengali"]=2537, + ["threecircle"]=9314, + ["threecircleinversesansserif"]=10124, + ["threedeva"]=2409, + ["threeeighths"]=8540, + ["threegujarati"]=2793, + ["threegurmukhi"]=2665, + ["threehackarabic"]=1635, + ["threehangzhou"]=12323, + ["threeideographicparen"]=12834, + ["threeinferior"]=8323, + ["threemonospace"]=65299, + ["threenumeratorbengali"]=2550, + ["threeparen"]=9334, + ["threeperiod"]=9354, + ["threepersian"]=1779, + ["threequarters"]=190, + ["threeroman"]=8562, + ["threesuperior"]=179, + ["threethai"]=3667, + ["thzsquare"]=13204, + ["tihiragana"]=12385, + ["tikatakana"]=12481, + ["tikatakanahalfwidth"]=65409, + ["tikeutacirclekorean"]=12912, + ["tikeutaparenkorean"]=12816, + ["tikeutcirclekorean"]=12898, + ["tikeutkorean"]=12599, + ["tikeutparenkorean"]=12802, + ["tilde"]=732, + ["tildebelowcmb"]=816, + ["tildecmb"]=771, + ["tildecomb"]=771, + ["tildedoublecmb"]=864, + ["tildeoperator"]=8764, + ["tildeoverlaycmb"]=820, + ["tildeverticalcmb"]=830, + ["timescircle"]=8855, + ["tipehahebrew"]=1430, + ["tipehalefthebrew"]=1430, + ["tippigurmukhi"]=2672, + ["titlocyrilliccmb"]=1155, + ["tiwnarmenian"]=1407, + ["tlinebelow"]=7791, + ["tmonospace"]=65364, + ["toarmenian"]=1385, + ["tohiragana"]=12392, + ["tokatakana"]=12488, + ["tokatakanahalfwidth"]=65412, + ["tonebarextrahighmod"]=741, + ["tonebarextralowmod"]=745, + ["tonebarhighmod"]=742, + ["tonebarlowmod"]=744, + ["tonebarmidmod"]=743, + ["tonefive"]=445, + ["tonesix"]=389, + ["tonetwo"]=424, + ["tonos"]=900, + ["tonsquare"]=13095, + ["topatakthai"]=3599, + ["tortoiseshellbracketleft"]=12308, + ["tortoiseshellbracketleftsmall"]=65117, + ["tortoiseshellbracketleftvertical"]=65081, + ["tortoiseshellbracketright"]=12309, + ["tortoiseshellbracketrightsmall"]=65118, + ["tortoiseshellbracketrightvertical"]=65082, + ["totaothai"]=3605, + ["tpalatalhook"]=427, + ["tparen"]=9391, + ["trademark"]=8482, + ["tretroflexhook"]=648, + ["triagdn"]=9660, + ["triaglf"]=9668, + ["triagrt"]=9658, + ["triagup"]=9650, + ["ts"]=678, + ["tsadi"]=1510, + ["tsadidagesh"]=64326, + ["tsadidageshhebrew"]=64326, + ["tsadihebrew"]=1510, + ["tsecyrillic"]=1094, + ["tsere"]=1461, + ["tsere12"]=1461, + ["tsere1e"]=1461, + ["tsere2b"]=1461, + ["tserehebrew"]=1461, + ["tserenarrowhebrew"]=1461, + ["tserequarterhebrew"]=1461, + ["tserewidehebrew"]=1461, + ["tshecyrillic"]=1115, + ["ttabengali"]=2463, + ["ttadeva"]=2335, + ["ttagujarati"]=2719, + ["ttagurmukhi"]=2591, + ["tteharabic"]=1657, + ["ttehfinalarabic"]=64359, + ["ttehinitialarabic"]=64360, + ["ttehmedialarabic"]=64361, + ["tthabengali"]=2464, + ["tthadeva"]=2336, + ["tthagujarati"]=2720, + ["tthagurmukhi"]=2592, + ["tturned"]=647, + ["tuhiragana"]=12388, + ["tukatakana"]=12484, + ["tukatakanahalfwidth"]=65410, + ["tusmallhiragana"]=12387, + ["tusmallkatakana"]=12483, + ["tusmallkatakanahalfwidth"]=65391, + ["twelvecircle"]=9323, + ["twelveparen"]=9343, + ["twelveperiod"]=9363, + ["twelveroman"]=8571, + ["twentycircle"]=9331, + ["twentyparen"]=9351, + ["twentyperiod"]=9371, + ["two"]=50, + ["twoarabic"]=1634, + ["twobengali"]=2536, + ["twocircle"]=9313, + ["twocircleinversesansserif"]=10123, + ["twodeva"]=2408, + ["twodotenleader"]=8229, + ["twodotleader"]=8229, + ["twodotleadervertical"]=65072, + ["twogujarati"]=2792, + ["twogurmukhi"]=2664, + ["twohackarabic"]=1634, + ["twohangzhou"]=12322, + ["twoideographicparen"]=12833, + ["twoinferior"]=8322, + ["twomonospace"]=65298, + ["twonumeratorbengali"]=2549, + ["twoparen"]=9333, + ["twoperiod"]=9353, + ["twopersian"]=1778, + ["tworoman"]=8561, + ["twostroke"]=443, + ["twosuperior"]=178, + ["twothai"]=3666, + ["twothirds"]=8532, + ["u"]=117, + ["uacute"]=250, + ["ubar"]=649, + ["ubengali"]=2441, + ["ubopomofo"]=12584, + ["ubreve"]=365, + ["ucaron"]=468, + ["ucircle"]=9444, + ["ucircumflex"]=251, + ["ucircumflexbelow"]=7799, + ["ucyrillic"]=1091, + ["udattadeva"]=2385, + ["udblacute"]=369, + ["udblgrave"]=533, + ["udeva"]=2313, + ["udieresis"]=252, + ["udieresisacute"]=472, + ["udieresisbelow"]=7795, + ["udieresiscaron"]=474, + ["udieresiscyrillic"]=1265, + ["udieresisgrave"]=476, + ["udieresismacron"]=470, + ["udotbelow"]=7909, + ["ugrave"]=249, + ["ugujarati"]=2697, + ["ugurmukhi"]=2569, + ["uhiragana"]=12358, + ["uhookabove"]=7911, + ["uhorn"]=432, + ["uhornacute"]=7913, + ["uhorndotbelow"]=7921, + ["uhorngrave"]=7915, + ["uhornhookabove"]=7917, + ["uhorntilde"]=7919, + ["uhungarumlaut"]=369, + ["uhungarumlautcyrillic"]=1267, + ["uinvertedbreve"]=535, + ["ukatakana"]=12454, + ["ukatakanahalfwidth"]=65395, + ["ukcyrillic"]=1145, + ["ukorean"]=12636, + ["umacron"]=363, + ["umacroncyrillic"]=1263, + ["umacrondieresis"]=7803, + ["umatragurmukhi"]=2625, + ["umonospace"]=65365, + ["underscore"]=95, + ["underscoredbl"]=8215, + ["underscoremonospace"]=65343, + ["underscorevertical"]=65075, + ["underscorewavy"]=65103, + ["union"]=8746, + ["universal"]=8704, + ["uogonek"]=371, + ["uparen"]=9392, + ["upblock"]=9600, + ["upperdothebrew"]=1476, + ["upsilon"]=965, + ["upsilondieresis"]=971, + ["upsilondieresistonos"]=944, + ["upsilonlatin"]=650, + ["upsilontonos"]=973, + ["uptackbelowcmb"]=797, + ["uptackmod"]=724, + ["uragurmukhi"]=2675, + ["uring"]=367, + ["ushortcyrillic"]=1118, + ["usmallhiragana"]=12357, + ["usmallkatakana"]=12453, + ["usmallkatakanahalfwidth"]=65385, + ["ustraightcyrillic"]=1199, + ["ustraightstrokecyrillic"]=1201, + ["utilde"]=361, + ["utildeacute"]=7801, + ["utildebelow"]=7797, + ["uubengali"]=2442, + ["uudeva"]=2314, + ["uugujarati"]=2698, + ["uugurmukhi"]=2570, + ["uumatragurmukhi"]=2626, + ["uuvowelsignbengali"]=2498, + ["uuvowelsigndeva"]=2370, + ["uuvowelsigngujarati"]=2754, + ["uvowelsignbengali"]=2497, + ["uvowelsigndeva"]=2369, + ["uvowelsigngujarati"]=2753, + ["v"]=118, + ["vadeva"]=2357, + ["vagujarati"]=2741, + ["vagurmukhi"]=2613, + ["vakatakana"]=12535, + ["vav"]=1493, + ["vavdagesh"]=64309, + ["vavdagesh65"]=64309, + ["vavdageshhebrew"]=64309, + ["vavhebrew"]=1493, + ["vavholam"]=64331, + ["vavholamhebrew"]=64331, + ["vavvavhebrew"]=1520, + ["vavyodhebrew"]=1521, + ["vcircle"]=9445, + ["vdotbelow"]=7807, + ["vecyrillic"]=1074, + ["veharabic"]=1700, + ["vehfinalarabic"]=64363, + ["vehinitialarabic"]=64364, + ["vehmedialarabic"]=64365, + ["vekatakana"]=12537, + ["venus"]=9792, + ["verticalbar"]=124, + ["verticallineabovecmb"]=781, + ["verticallinebelowcmb"]=809, + ["verticallinelowmod"]=716, + ["verticallinemod"]=712, + ["vewarmenian"]=1406, + ["vhook"]=651, + ["vikatakana"]=12536, + ["viramabengali"]=2509, + ["viramadeva"]=2381, + ["viramagujarati"]=2765, + ["visargabengali"]=2435, + ["visargadeva"]=2307, + ["visargagujarati"]=2691, + ["vmonospace"]=65366, + ["voarmenian"]=1400, + ["voicediterationhiragana"]=12446, + ["voicediterationkatakana"]=12542, + ["voicedmarkkana"]=12443, + ["voicedmarkkanahalfwidth"]=65438, + ["vokatakana"]=12538, + ["vparen"]=9393, + ["vtilde"]=7805, + ["vturned"]=652, + ["vuhiragana"]=12436, + ["vukatakana"]=12532, + ["w"]=119, + ["wacute"]=7811, + ["waekorean"]=12633, + ["wahiragana"]=12431, + ["wakatakana"]=12527, + ["wakatakanahalfwidth"]=65436, + ["wakorean"]=12632, + ["wasmallhiragana"]=12430, + ["wasmallkatakana"]=12526, + ["wattosquare"]=13143, + ["wavedash"]=12316, + ["wavyunderscorevertical"]=65076, + ["wawarabic"]=1608, + ["wawfinalarabic"]=65262, + ["wawhamzaabovearabic"]=1572, + ["wawhamzaabovefinalarabic"]=65158, + ["wbsquare"]=13277, + ["wcircle"]=9446, + ["wcircumflex"]=373, + ["wdieresis"]=7813, + ["wdotaccent"]=7815, + ["wdotbelow"]=7817, + ["wehiragana"]=12433, + ["weierstrass"]=8472, + ["wekatakana"]=12529, + ["wekorean"]=12638, + ["weokorean"]=12637, + ["wgrave"]=7809, + ["whitebullet"]=9702, + ["whitecircle"]=9675, + ["whitecircleinverse"]=9689, + ["whitecornerbracketleft"]=12302, + ["whitecornerbracketleftvertical"]=65091, + ["whitecornerbracketright"]=12303, + ["whitecornerbracketrightvertical"]=65092, + ["whitediamond"]=9671, + ["whitediamondcontainingblacksmalldiamond"]=9672, + ["whitedownpointingsmalltriangle"]=9663, + ["whitedownpointingtriangle"]=9661, + ["whiteleftpointingsmalltriangle"]=9667, + ["whiteleftpointingtriangle"]=9665, + ["whitelenticularbracketleft"]=12310, + ["whitelenticularbracketright"]=12311, + ["whiterightpointingsmalltriangle"]=9657, + ["whiterightpointingtriangle"]=9655, + ["whitesmallsquare"]=9643, + ["whitesmilingface"]=9786, + ["whitesquare"]=9633, + ["whitestar"]=9734, + ["whitetelephone"]=9743, + ["whitetortoiseshellbracketleft"]=12312, + ["whitetortoiseshellbracketright"]=12313, + ["whiteuppointingsmalltriangle"]=9653, + ["whiteuppointingtriangle"]=9651, + ["wihiragana"]=12432, + ["wikatakana"]=12528, + ["wikorean"]=12639, + ["wmonospace"]=65367, + ["wohiragana"]=12434, + ["wokatakana"]=12530, + ["wokatakanahalfwidth"]=65382, + ["won"]=8361, + ["wonmonospace"]=65510, + ["wowaenthai"]=3623, + ["wparen"]=9394, + ["wring"]=7832, + ["wsuperior"]=695, + ["wturned"]=653, + ["wynn"]=447, + ["x"]=120, + ["xabovecmb"]=829, + ["xbopomofo"]=12562, + ["xcircle"]=9447, + ["xdieresis"]=7821, + ["xdotaccent"]=7819, + ["xeharmenian"]=1389, + ["xi"]=958, + ["xmonospace"]=65368, + ["xparen"]=9395, + ["xsuperior"]=739, + ["y"]=121, + ["yaadosquare"]=13134, + ["yabengali"]=2479, + ["yacute"]=253, + ["yadeva"]=2351, + ["yaekorean"]=12626, + ["yagujarati"]=2735, + ["yagurmukhi"]=2607, + ["yahiragana"]=12420, + ["yakatakana"]=12516, + ["yakatakanahalfwidth"]=65428, + ["yakorean"]=12625, + ["yamakkanthai"]=3662, + ["yasmallhiragana"]=12419, + ["yasmallkatakana"]=12515, + ["yasmallkatakanahalfwidth"]=65388, + ["yatcyrillic"]=1123, + ["ycircle"]=9448, + ["ycircumflex"]=375, + ["ydieresis"]=255, + ["ydotaccent"]=7823, + ["ydotbelow"]=7925, + ["yeharabic"]=1610, + ["yehbarreearabic"]=1746, + ["yehbarreefinalarabic"]=64431, + ["yehfinalarabic"]=65266, + ["yehhamzaabovearabic"]=1574, + ["yehhamzaabovefinalarabic"]=65162, + ["yehhamzaaboveinitialarabic"]=65163, + ["yehhamzaabovemedialarabic"]=65164, + ["yehinitialarabic"]=65267, + ["yehmedialarabic"]=65268, + ["yehmeeminitialarabic"]=64733, + ["yehmeemisolatedarabic"]=64600, + ["yehnoonfinalarabic"]=64660, + ["yehthreedotsbelowarabic"]=1745, + ["yekorean"]=12630, + ["yen"]=165, + ["yenmonospace"]=65509, + ["yeokorean"]=12629, + ["yeorinhieuhkorean"]=12678, + ["yerahbenyomohebrew"]=1450, + ["yerahbenyomolefthebrew"]=1450, + ["yericyrillic"]=1099, + ["yerudieresiscyrillic"]=1273, + ["yesieungkorean"]=12673, + ["yesieungpansioskorean"]=12675, + ["yesieungsioskorean"]=12674, + ["yetivhebrew"]=1434, + ["ygrave"]=7923, + ["yhook"]=436, + ["yhookabove"]=7927, + ["yiarmenian"]=1397, + ["yicyrillic"]=1111, + ["yikorean"]=12642, + ["yinyang"]=9775, + ["yiwnarmenian"]=1410, + ["ymonospace"]=65369, + ["yod"]=1497, + ["yoddagesh"]=64313, + ["yoddageshhebrew"]=64313, + ["yodhebrew"]=1497, + ["yodyodhebrew"]=1522, + ["yodyodpatahhebrew"]=64287, + ["yohiragana"]=12424, + ["yoikorean"]=12681, + ["yokatakana"]=12520, + ["yokatakanahalfwidth"]=65430, + ["yokorean"]=12635, + ["yosmallhiragana"]=12423, + ["yosmallkatakana"]=12519, + ["yosmallkatakanahalfwidth"]=65390, + ["yotgreek"]=1011, + ["yoyaekorean"]=12680, + ["yoyakorean"]=12679, + ["yoyakthai"]=3618, + ["yoyingthai"]=3597, + ["yparen"]=9396, + ["ypogegrammeni"]=890, + ["ypogegrammenigreekcmb"]=837, + ["yr"]=422, + ["yring"]=7833, + ["ysuperior"]=696, + ["ytilde"]=7929, + ["yturned"]=654, + ["yuhiragana"]=12422, + ["yuikorean"]=12684, + ["yukatakana"]=12518, + ["yukatakanahalfwidth"]=65429, + ["yukorean"]=12640, + ["yusbigcyrillic"]=1131, + ["yusbigiotifiedcyrillic"]=1133, + ["yuslittlecyrillic"]=1127, + ["yuslittleiotifiedcyrillic"]=1129, + ["yusmallhiragana"]=12421, + ["yusmallkatakana"]=12517, + ["yusmallkatakanahalfwidth"]=65389, + ["yuyekorean"]=12683, + ["yuyeokorean"]=12682, + ["yyabengali"]=2527, + ["yyadeva"]=2399, + ["z"]=122, + ["zaarmenian"]=1382, + ["zacute"]=378, + ["zadeva"]=2395, + ["zagurmukhi"]=2651, + ["zaharabic"]=1592, + ["zahfinalarabic"]=65222, + ["zahinitialarabic"]=65223, + ["zahiragana"]=12374, + ["zahmedialarabic"]=65224, + ["zainarabic"]=1586, + ["zainfinalarabic"]=65200, + ["zakatakana"]=12470, + ["zaqefgadolhebrew"]=1429, + ["zaqefqatanhebrew"]=1428, + ["zarqahebrew"]=1432, + ["zayin"]=1494, + ["zayindagesh"]=64310, + ["zayindageshhebrew"]=64310, + ["zayinhebrew"]=1494, + ["zbopomofo"]=12567, + ["zcaron"]=382, + ["zcircle"]=9449, + ["zcircumflex"]=7825, + ["zcurl"]=657, + ["zdot"]=380, + ["zdotaccent"]=380, + ["zdotbelow"]=7827, + ["zecyrillic"]=1079, + ["zedescendercyrillic"]=1177, + ["zedieresiscyrillic"]=1247, + ["zehiragana"]=12380, + ["zekatakana"]=12476, + ["zero"]=48, + ["zeroarabic"]=1632, + ["zerobengali"]=2534, + ["zerodeva"]=2406, + ["zerogujarati"]=2790, + ["zerogurmukhi"]=2662, + ["zerohackarabic"]=1632, + ["zeroinferior"]=8320, + ["zeromonospace"]=65296, + ["zeropersian"]=1776, + ["zerosuperior"]=8304, + ["zerothai"]=3664, + ["zerowidthjoiner"]=65279, + ["zerowidthnonjoiner"]=8204, + ["zerowidthspace"]=8203, + ["zeta"]=950, + ["zhbopomofo"]=12563, + ["zhearmenian"]=1386, + ["zhebrevecyrillic"]=1218, + ["zhecyrillic"]=1078, + ["zhedescendercyrillic"]=1175, + ["zhedieresiscyrillic"]=1245, + ["zihiragana"]=12376, + ["zikatakana"]=12472, + ["zinorhebrew"]=1454, + ["zlinebelow"]=7829, + ["zmonospace"]=65370, + ["zohiragana"]=12382, + ["zokatakana"]=12478, + ["zparen"]=9397, + ["zretroflexhook"]=656, + ["zstroke"]=438, + ["zuhiragana"]=12378, + ["zukatakana"]=12474, } diff --git a/Master/texmf-dist/tex/context/base/font-agl.lua b/Master/texmf-dist/tex/context/base/font-agl.lua index ca7fb61cbef..5ee34b0287c 100644 --- a/Master/texmf-dist/tex/context/base/font-agl.lua +++ b/Master/texmf-dist/tex/context/base/font-agl.lua @@ -15,6 +15,382 @@ local unicodes = allocate { -- filled from char-def.lua } +local synonyms = { + Acyrillic = 0x0410, + Becyrillic = 0x0411, + Cdot = 0x010A, + Checyrillic = 0x0427, + Decyrillic = 0x0414, + Djecyrillic = 0x0402, + Dzecyrillic = 0x0405, + Dzhecyrillic = 0x040F, + Ecyrillic = 0x0404, + Edot = 0x0116, + Efcyrillic = 0x0424, + Elcyrillic = 0x041B, + Emcyrillic = 0x041C, + Encyrillic = 0x041D, + Ercyrillic = 0x0420, + Ereversedcyrillic = 0x042D, + Escyrillic = 0x0421, + Fitacyrillic = 0x0472, + Gcedilla = 0x0122, + Gdot = 0x0120, + Gecyrillic = 0x0413, + Gheupturncyrillic = 0x0490, + Gjecyrillic = 0x0403, + Hardsigncyrillic = 0x042A, + IAcyrillic = 0x042F, + IUcyrillic = 0x042E, + Icyrillic = 0x0406, + Idot = 0x0130, + Iecyrillic = 0x0415, + Iicyrillic = 0x0418, + Iishortcyrillic = 0x0419, + Iocyrillic = 0x0401, + Izhitsacyrillic = 0x0474, + Jecyrillic = 0x0408, + Kacyrillic = 0x041A, + Kcedilla = 0x0136, + Khacyrillic = 0x0425, + Kjecyrillic = 0x040C, + Lcedilla = 0x013B, + Ljecyrillic = 0x0409, + Ncedilla = 0x0145, + Njecyrillic = 0x040A, + Ocyrillic = 0x041E, + Odblacute = 0x0150, + Ohm = 0x2126, + Pecyrillic = 0x041F, + Rcedilla = 0x0156, + Shacyrillic = 0x0428, + Shchacyrillic = 0x0429, + Softsigncyrillic = 0x042C, + Tcedilla = 0x0162, + Tecyrillic = 0x0422, + Tsecyrillic = 0x0426, + Tshecyrillic = 0x040B, + Ucyrillic = 0x0423, + Udblacute = 0x0170, + Ushortcyrillic = 0x040E, + Vecyrillic = 0x0412, + Yatcyrillic = 0x0462, + Yericyrillic = 0x042B, + Yicyrillic = 0x0407, + Zdot = 0x017B, + Zecyrillic = 0x0417, + Zhecyrillic = 0x0416, + acutecmb = 0x0301, + acyrillic = 0x0430, + afii00208 = 0x2015, + afii08941 = 0x20A4, + afii57694 = 0xFB2A, + afii57695 = 0xFB2B, + afii57700 = 0xFB4B, + afii57705 = 0xFB1F, + afii57723 = 0xFB35, + alef = 0x05D0, + alefmaksurainitialarabic = 0xFEF3, + alefmaksuramedialarabic = 0xFEF4, + approximatelyequal = 0x2245, + asteriskaltonearabic = 0x066D, + ayin = 0x05E2, + bet = 0x05D1, + betdagesh = 0xFB31, + blackdownpointingtriangle = 0x25BC, + blackleftpointingpointer = 0x25C4, + blackrectangle = 0x25AC, + blackrightpointingpointer = 0x25BA, + blacksmilingface = 0x263B, + blacksquare = 0x25A0, + blackuppointingtriangle = 0x25B2, + bulletinverse = 0x25D8, + cdot = 0x010B, + compass = 0x263C, + dagesh = 0x05BC, + dalet = 0x05D3, + daletdagesh = 0xFB33, + dalethatafpatah = 0x05D3, + dalethatafpatahhebrew = 0x05D3, + dalethatafsegol = 0x05D3, + dalethatafsegolhebrew = 0x05D3, + dalethebrew = 0x05D3, + dalethiriq = 0x05D3, + dalethiriqhebrew = 0x05D3, + daletholam = 0x05D3, + daletholamhebrew = 0x05D3, + daletpatah = 0x05D3, + daletpatahhebrew = 0x05D3, + daletqamats = 0x05D3, + daletqamatshebrew = 0x05D3, + daletqubuts = 0x05D3, + daletqubutshebrew = 0x05D3, + daletsegol = 0x05D3, + daletsegolhebrew = 0x05D3, + daletsheva = 0x05D3, + daletshevahebrew = 0x05D3, + dalettsere = 0x05D3, + dammaarabic = 0x064F, + dammatanaltonearabic = 0x064C, + dargahebrew = 0x05A7, + dbllowline = 0x2017, + decimalseparatorarabic = 0x066B, + dialytikatonos = 0x0385, + dotbelowcmb = 0x0323, + doubleyodpatah = 0xFB1F, + doubleyodpatahhebrew = 0xFB1F, + edot = 0x0117, + eightarabic = 0x0668, + eighthnotebeamed = 0x266B, + etnahtafoukhhebrew = 0x0591, + etnahtafoukhlefthebrew = 0x0591, + etnahtahebrew = 0x0591, + fathaarabic = 0x064E, + finalkaf = 0x05DA, + finalkafdagesh = 0xFB3A, + finalkafhebrew = 0x05DA, + finalkafqamats = 0x05DA, + finalkafqamatshebrew = 0x05DA, + finalkafsheva = 0x05DA, + finalmem = 0x05DD, + finalnun = 0x05DF, + finalpe = 0x05E3, + finaltsadi = 0x05E5, + fivearabic = 0x0665, + forall = 0x2200, + fourarabic = 0x0664, + gcedilla = 0x0123, + gdot = 0x0121, + gimel = 0x05D2, + gimeldagesh = 0xFB32, + gravecmb = 0x0300, + haaltonearabic = 0x06C1, + hamzaarabic = 0x0621, + hamzadammaarabic = 0x0621, + hamzadammatanarabic = 0x0621, + hamzafathaarabic = 0x0621, + hamzafathatanarabic = 0x0621, + hamzalowarabic = 0x0621, + hamzalowkasraarabic = 0x0621, + hamzalowkasratanarabic = 0x0621, + hatafpatah = 0x05B2, + hatafpatah16 = 0x05B2, + hatafpatah23 = 0x05B2, + hatafpatah2f = 0x05B2, + hatafpatahhebrew = 0x05B2, + hatafpatahnarrowhebrew = 0x05B2, + hatafpatahquarterhebrew = 0x05B2, + hatafqamats = 0x05B3, + hatafqamats1b = 0x05B3, + hatafqamats28 = 0x05B3, + hatafqamats34 = 0x05B3, + hatafqamatshebrew = 0x05B3, + hatafqamatsnarrowhebrew = 0x05B3, + hatafqamatsquarterhebrew = 0x05B3, + hatafsegol = 0x05B1, + hatafsegol17 = 0x05B1, + hatafsegol24 = 0x05B1, + hatafsegol30 = 0x05B1, + hatafsegolhebrew = 0x05B1, + hatafsegolnarrowhebrew = 0x05B1, + hatafsegolquarterhebrew = 0x05B1, + he = 0x05D4, + hedagesh = 0xFB34, + hehfinalalttwoarabic = 0xFEEA, + het = 0x05D7, + hiriq = 0x05B4, + hiriq14 = 0x05B4, + hiriq21 = 0x05B4, + hiriq2d = 0x05B4, + hiriqhebrew = 0x05B4, + hiriqnarrowhebrew = 0x05B4, + hiriqquarterhebrew = 0x05B4, + holam = 0x05B9, + holam19 = 0x05B9, + holam26 = 0x05B9, + holam32 = 0x05B9, + holamhebrew = 0x05B9, + holamnarrowhebrew = 0x05B9, + holamquarterhebrew = 0x05B9, + ilde = 0x02DC, + integralbottom = 0x2321, + integraltop = 0x2320, + kaf = 0x05DB, + kafdagesh = 0xFB3B, + kashidaautoarabic = 0x0640, + kashidaautonosidebearingarabic = 0x0640, + kcedilla = 0x0137, + lamed = 0x05DC, + lameddagesh = 0xFB3C, + lamedhebrew = 0x05DC, + lamedholam = 0x05DC, + lamedholamdagesh = 0x05DC, + lamedholamdageshhebrew = 0x05DC, + laminitialarabic = 0xFEDF, + lammeemjeeminitialarabic = 0xFEDF, + lcedilla = 0x013C, + logicalnotreversed = 0x2310, + mahapakhhebrew = 0x05A4, + mem = 0x05DE, + memdagesh = 0xFB3E, + merkhahebrew = 0x05A5, + merkhakefulahebrew = 0x05A6, + middot = 0x00B7, + munahhebrew = 0x05A3, + nbspace = 0x00A0, + ncedilla = 0x0146, + newsheqelsign = 0x20AA, + ninearabic = 0x0669, + noonhehinitialarabic = 0xFEE7, + nun = 0x05E0, + nundagesh = 0xFB40, + odblacute = 0x0151, + onearabic = 0x0661, + overscore = 0x00AF, + patah = 0x05B7, + patah11 = 0x05B7, + patah1d = 0x05B7, + patah2a = 0x05B7, + patahhebrew = 0x05B7, + patahnarrowhebrew = 0x05B7, + patahquarterhebrew = 0x05B7, + pe = 0x05E4, + pedagesh = 0xFB44, + qamats = 0x05B8, + qamats10 = 0x05B8, + qamats1a = 0x05B8, + qamats1c = 0x05B8, + qamats27 = 0x05B8, + qamats29 = 0x05B8, + qamats33 = 0x05B8, + qamatsde = 0x05B8, + qamatshebrew = 0x05B8, + qamatsnarrowhebrew = 0x05B8, + qamatsqatanhebrew = 0x05B8, + qamatsqatannarrowhebrew = 0x05B8, + qamatsqatanquarterhebrew = 0x05B8, + qamatsqatanwidehebrew = 0x05B8, + qamatsquarterhebrew = 0x05B8, + qof = 0x05E7, + qofdagesh = 0xFB47, + qofhatafpatah = 0x05E7, + qofhatafpatahhebrew = 0x05E7, + qofhatafsegol = 0x05E7, + qofhatafsegolhebrew = 0x05E7, + qofhebrew = 0x05E7, + qofhiriq = 0x05E7, + qofhiriqhebrew = 0x05E7, + qofholam = 0x05E7, + qofholamhebrew = 0x05E7, + qofpatah = 0x05E7, + qofpatahhebrew = 0x05E7, + qofqamats = 0x05E7, + qofqamatshebrew = 0x05E7, + qofqubuts = 0x05E7, + qofqubutshebrew = 0x05E7, + qofsegol = 0x05E7, + qofsegolhebrew = 0x05E7, + qofsheva = 0x05E7, + qofshevahebrew = 0x05E7, + qoftsere = 0x05E7, + qubuts = 0x05BB, + qubuts18 = 0x05BB, + qubuts25 = 0x05BB, + qubuts31 = 0x05BB, + qubutshebrew = 0x05BB, + qubutsnarrowhebrew = 0x05BB, + qubutsquarterhebrew = 0x05BB, + quoteleftreversed = 0x201B, + rafe = 0x05BF, + rcedilla = 0x0157, + reharabic = 0x0631, + resh = 0x05E8, + reshhatafpatah = 0x05E8, + reshhatafpatahhebrew = 0x05E8, + reshhatafsegol = 0x05E8, + reshhatafsegolhebrew = 0x05E8, + reshhebrew = 0x05E8, + reshhiriq = 0x05E8, + reshhiriqhebrew = 0x05E8, + reshholam = 0x05E8, + reshholamhebrew = 0x05E8, + reshpatah = 0x05E8, + reshpatahhebrew = 0x05E8, + reshqamats = 0x05E8, + reshqamatshebrew = 0x05E8, + reshqubuts = 0x05E8, + reshqubutshebrew = 0x05E8, + reshsegol = 0x05E8, + reshsegolhebrew = 0x05E8, + reshsheva = 0x05E8, + reshshevahebrew = 0x05E8, + reshtsere = 0x05E8, + reviahebrew = 0x0597, + samekh = 0x05E1, + samekhdagesh = 0xFB41, + segol = 0x05B6, + segol13 = 0x05B6, + segol1f = 0x05B6, + segol2c = 0x05B6, + segolhebrew = 0x05B6, + segolnarrowhebrew = 0x05B6, + segolquarterhebrew = 0x05B6, + sevenarabic = 0x0667, + sfthyphen = 0x00AD, + shaddaarabic = 0x0651, + sheqel = 0x20AA, + sheva = 0x05B0, + sheva115 = 0x05B0, + sheva15 = 0x05B0, + sheva22 = 0x05B0, + sheva2e = 0x05B0, + shevahebrew = 0x05B0, + shevanarrowhebrew = 0x05B0, + shevaquarterhebrew = 0x05B0, + shin = 0x05E9, + shindagesh = 0xFB49, + shindageshshindot = 0xFB2C, + shindageshsindot = 0xFB2D, + shinshindot = 0xFB2A, + shinsindot = 0xFB2B, + siluqhebrew = 0x05BD, + sixarabic = 0x0666, + tav = 0x05EA, + tavdages = 0xFB4A, + tavdagesh = 0xFB4A, + tcedilla = 0x0163, + tchehinitialarabic = 0xFB7C, + tet = 0x05D8, + tetdagesh = 0xFB38, + tevirhebrew = 0x059B, + thousandsseparatorarabic = 0x066C, + threearabic = 0x0663, + tildecmb = 0x0303, + tipehahebrew = 0x0596, + tsadi = 0x05E6, + tsadidagesh = 0xFB46, + tsere = 0x05B5, + tsere12 = 0x05B5, + tsere1e = 0x05B5, + tsere2b = 0x05B5, + tserehebrew = 0x05B5, + tserenarrowhebrew = 0x05B5, + tserequarterhebrew = 0x05B5, + twoarabic = 0x0662, + udblacute = 0x0171, + vav = 0x05D5, + vavdagesh = 0xFB35, + vavdagesh65 = 0xFB35, + vavholam = 0xFB4B, + yerahbenyomohebrew = 0x05AA, + yod = 0x05D9, + yoddagesh = 0xFB39, + zayin = 0x05D6, + zayindagesh = 0xFB36, + zdot = 0x017C, + zeroarabic = 0x0660, +} + local extras = allocate { -- private extensions Dcroat = 0x0110, Delta = 0x2206, @@ -271,6 +647,13 @@ for a, u in next, extras do end end +for s, u in next, synonyms do + unicodes[s] = u + if not names[u] then + names[u] = s + end +end + -- We load this table only when needed. We could use a loading mechanism -- return the table but there are no more vectors like this so why bother. @@ -279,5 +662,6 @@ fonts.encodings = fonts.encodings or { } fonts.encodings.agl = { names = names, -- unicode -> name unicodes = unicodes, -- name -> unicode + synonyms = synonyms, -- merged into the other two extras = extras, -- merged into the other two } diff --git a/Master/texmf-dist/tex/context/base/font-chk.lua b/Master/texmf-dist/tex/context/base/font-chk.lua index 9e7e31affaf..1b89366fd23 100644 --- a/Master/texmf-dist/tex/context/base/font-chk.lua +++ b/Master/texmf-dist/tex/context/base/font-chk.lua @@ -49,7 +49,7 @@ local action = false -- to tfmdata.properties ? -local function onetimemessage(font,char,message) +local function onetimemessage(font,char,message) -- char == false returns table local tfmdata = fontdata[font] local shared = tfmdata.shared local messages = shared.messages @@ -62,7 +62,9 @@ local function onetimemessage(font,char,message) category = { } messages[message] = category end - if not category[char] then + if char == false then + return table.sortedkeys(category) + elseif not category[char] then report_fonts("char %U in font %a with id %a: %s",char,tfmdata.properties.fullname,font,message) category[char] = true end @@ -189,8 +191,15 @@ registerotffeature { } } +fonts.loggers.add_placeholders = function(id) addmissingsymbols(fontdata[id or true]) end fonts.loggers.category_to_placeholder = mapping +function commands.getplaceholderchar(name) + local id = font.current() + addmissingsymbols(fontdata[id]) + context(fonts.helpers.getprivatenode(fontdata[id],name)) +end + function checkers.missing(head) local lastfont, characters, found = nil, nil, nil for n in traverse_id(glyph_code,head) do -- faster than while loop so we delay removal @@ -251,9 +260,48 @@ function checkers.missing(head) return head, false end +local relevant = { "missing (will be deleted)", "missing (will be flagged)", "missing" } + +function checkers.getmissing(id) + if id then + local list = checkers.getmissing(font.current()) + if list then + local _, list = next(checkers.getmissing(font.current())) + return list + else + return { } + end + else + local t = { } + for id, d in next, fontdata do + local shared = d.shared + local messages = shared.messages + if messages then + local tf = t[d.properties.filename] or { } + for i=1,#relevant do + local tm = messages[relevant[i]] + if tm then + tf = table.merged(tf,tm) + end + end + if next(tf) then + t[d.properties.filename] = tf + end + end + end + for k, v in next, t do + t[k] = table.sortedkeys(v) + end + return t + end +end + +local tracked = false + trackers.register("fonts.missing", function(v) if v then enableaction("processors","fonts.checkers.missing") + tracked = true else disableaction("processors","fonts.checkers.missing") end @@ -265,15 +313,47 @@ end) function commands.checkcharactersinfont() enableaction("processors","fonts.checkers.missing") + tracked = true end function commands.removemissingcharacters() enableaction("processors","fonts.checkers.missing") action = "remove" + tracked = true end function commands.replacemissingcharacters() enableaction("processors","fonts.checkers.missing") action = "replace" otffeatures.defaults.missing = true + tracked = true end + +local report_characters = logs.reporter("fonts","characters") +local report_character = logs.reporter("missing") + +local logsnewline = logs.newline +local logspushtarget = logs.pushtarget +local logspoptarget = logs.poptarget + +luatex.registerstopactions(function() + if tracked then + local collected = checkers.getmissing() + if next(collected) then + logspushtarget("logfile") + for filename, list in table.sortedhash(collected) do + logsnewline() + report_characters("start missing characters: %s",filename) + logsnewline() + for i=1,#list do + local u = list[i] + report_character("%U %c %s",u,u,chardata[u].description) + end + logsnewline() + report_characters("stop missing characters") + logsnewline() + end + logspoptarget() + end + end +end) diff --git a/Master/texmf-dist/tex/context/base/font-con.lua b/Master/texmf-dist/tex/context/base/font-con.lua index 618bc8f2856..790d4877ac9 100644 --- a/Master/texmf-dist/tex/context/base/font-con.lua +++ b/Master/texmf-dist/tex/context/base/font-con.lua @@ -203,7 +203,7 @@ wasted day but an experience richer.</p> -- we can get rid of the tfm instance when we have fast access to the -- scaled character dimensions at the tex end, e.g. a fontobject.width --- actually we already have soem of that now as virtual keys in glyphs +-- actually we already have some of that now as virtual keys in glyphs -- -- flushing the kern and ligature tables from memory saves a lot (only -- base mode) but it complicates vf building where the new characters diff --git a/Master/texmf-dist/tex/context/base/font-ctx.lua b/Master/texmf-dist/tex/context/base/font-ctx.lua index c894660d5b2..2583c652062 100644 --- a/Master/texmf-dist/tex/context/base/font-ctx.lua +++ b/Master/texmf-dist/tex/context/base/font-ctx.lua @@ -21,8 +21,9 @@ local sortedhash, sortedkeys, sequenced = table.sortedhash, table.sortedkeys, ta local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, utilities.parsers.hash_to_string local formatcolumns = utilities.formatters.formatcolumns local mergehashes = utilities.parsers.mergehashes +local formatters = string.formatters -local tostring, next, type, rawget = tostring, next, type, rawget +local tostring, next, type, rawget, tonumber = tostring, next, type, rawget, tonumber local utfchar, utfbyte = utf.char, utf.byte local round = math.round @@ -56,6 +57,7 @@ local helpers = fonts.helpers local hashes = fonts.hashes local currentfont = font.current local texattribute = tex.attribute +local texdimen = tex.dimen local fontdata = hashes.identifiers local characters = hashes.chardata @@ -68,7 +70,9 @@ local lastmathids = hashes.lastmathids local designsizefilename = fontgoodies.designsizes.filename -local otffeatures = handlers.otf.features +local otffeatures = otf.features +local otftables = otf.tables + local registerotffeature = otffeatures.register local baseprocessors = otffeatures.processors.base local baseinitializers = otffeatures.initializers.base @@ -110,8 +114,8 @@ end -- this will move elsewhere ... -utilities.strings.formatters.add(string.formatters,"font:name", [["'"..file.basename(%s.properties.name).."'"]]) -utilities.strings.formatters.add(string.formatters,"font:features",[["'"..table.sequenced(%s," ",true).."'"]]) +utilities.strings.formatters.add(formatters,"font:name", [["'"..file.basename(%s.properties.name).."'"]]) +utilities.strings.formatters.add(formatters,"font:features",[["'"..table.sequenced(%s," ",true).."'"]]) -- ... like font-sfm or so @@ -159,7 +163,9 @@ local needsnodemode = { gpos_mark2ligature = true, } -fonts.handlers.otf.tables.scripts.auto = "automatic fallback to latn when no dflt present" +otftables.scripts.auto = "automatic fallback to latn when no dflt present" + +-- setmetatableindex(otffeatures.descriptions,otftables.features) local privatefeatures = { tlig = true, @@ -1034,7 +1040,9 @@ function definers.define(specification) -- -- we don't care about mathsize textsize goodies fallbacks -- - if specification.cs == "" then + local cs = specification.cs + if cs == "" then + cs = nil specification.cs = nil specification.global = false elseif specification.global == nil then @@ -1045,16 +1053,18 @@ function definers.define(specification) if not tfmdata then return -1, nil elseif type(tfmdata) == "number" then - if specification.cs then - tex.definefont(specification.global,specification.cs,tfmdata) + if cs then + tex.definefont(specification.global,cs,tfmdata) + csnames[tfmdata] = cs end return tfmdata, fontdata[tfmdata] else local id = font.define(tfmdata) tfmdata.properties.id = id definers.register(tfmdata,id) - if specification.cs then - tex.definefont(specification.global,specification.cs,id) + if cs then + tex.definefont(specification.global,cs,id) + csnames[id] = cs end constructors.cleanuptable(tfmdata) constructors.finalize(tfmdata) @@ -1064,6 +1074,41 @@ function definers.define(specification) end end +-- local id, cs = fonts.definers.internal { } +-- local id, cs = fonts.definers.internal { number = 2 } +-- local id, cs = fonts.definers.internal { name = "dejavusans" } + +local n = 0 + +function definers.internal(specification,cs) + specification = specification or { } + local name = specification.name + local size = specification.size and number.todimen(specification.size) or texdimen.bodyfontsize + local number = tonumber(specification.number) + local id = nil + if number then + id = number + elseif name and name ~= "" then + local cs = cs or specification.cs + if not cs then + n = n + 1 -- beware ... there can be many and they are often used once + -- cs = formatters["internal font %s"](n) + cs = "internal font " .. n + else + specification.cs = cs + end + id = definers.define { + name = name, + size = size, + cs = cs, + } + end + if not id then + id = currentfont() + end + return id, csnames[id] +end + local enable_auto_r_scale = false experiments.register("fonts.autorscale", function(v) @@ -1121,7 +1166,7 @@ function definers.resolve(specification) -- overload function in font-con.lua elseif not normal.goodies then local g = normal.goodies if g and g ~= "" then - normal.goodies = format("%s,%s",g,goodies) + normal.goodies = formatters["%s,%s"](g,goodies) else normal.goodies = goodies end @@ -1341,16 +1386,16 @@ function commands.doifelsecurrentfonthasfeature(name) -- can be made faster with commands.doifelse(f and (f.gpos[name] or f.gsub[name])) end -local p, f = 1, "%0.1fpt" -- normally this value is changed only once +local p, f = 1, formatters["%0.1fpt"] -- normally this value is changed only once local stripper = lpeg.patterns.stripzeros function commands.nbfs(amount,precision) if precision ~= p then p = precision - f = "%0." .. p .. "fpt" + f = formatters["%0." .. p .. "fpt"] end - context(lpegmatch(stripper,format(f,amount/65536))) + context(lpegmatch(stripper,f(amount/65536))) end function commands.featureattribute(tag) @@ -1512,8 +1557,6 @@ end local quads = hashes.quads local xheights = hashes.xheights -local currentfont = font.current -local texdimen = tex.dimen setmetatableindex(number.dimenfactors, function(t,k) if k == "ex" then diff --git a/Master/texmf-dist/tex/context/base/font-def.lua b/Master/texmf-dist/tex/context/base/font-def.lua index cb056ff1bce..bee02e8dc49 100644 --- a/Master/texmf-dist/tex/context/base/font-def.lua +++ b/Master/texmf-dist/tex/context/base/font-def.lua @@ -174,7 +174,7 @@ function resolvers.file(specification) specification.forced = suffix specification.name = file.removesuffix(name) else - specification.name = name -- cna be resolved + specification.name = name -- can be resolved end end diff --git a/Master/texmf-dist/tex/context/base/font-enc.lua b/Master/texmf-dist/tex/context/base/font-enc.lua index a6f9250e758..5305f0736a6 100644 --- a/Master/texmf-dist/tex/context/base/font-enc.lua +++ b/Master/texmf-dist/tex/context/base/font-enc.lua @@ -107,7 +107,7 @@ function encodings.load(filename) end --[[ldx-- -<p>There is no unicode encoding but for practical purposed we define +<p>There is no unicode encoding but for practical purposes we define one.</p> --ldx]]-- diff --git a/Master/texmf-dist/tex/context/base/font-gds.lua b/Master/texmf-dist/tex/context/base/font-gds.lua index 91a5ea66c30..6332f40b043 100644 --- a/Master/texmf-dist/tex/context/base/font-gds.lua +++ b/Master/texmf-dist/tex/context/base/font-gds.lua @@ -604,6 +604,21 @@ end fontgoodies.register("compositions", initialize) +-- extra treatments (on top of defaults): \loadfontgoodies[mytreatments] + +local treatmentdata = fonts.treatments.data + +local function initialize(goodies) + local treatments = goodies.treatments + if treatments then + for name, data in next, treatments do + treatmentdata[name] = data -- always wins + end + end +end + +fontgoodies.register("treatments", initialize) + local filenames = fontgoodies.filenames or allocate() fontgoodies.filenames = filenames diff --git a/Master/texmf-dist/tex/context/base/font-ini.mkvi b/Master/texmf-dist/tex/context/base/font-ini.mkvi index 63b7863c8cc..5f7aaa92f52 100644 --- a/Master/texmf-dist/tex/context/base/font-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/font-ini.mkvi @@ -2297,4 +2297,18 @@ \unexpanded\def\font_basics_predefined#1% {\font_basics_predefine{\??predefinedfont#1}{#1}} +%D Handy helper: + +\unexpanded\def\savedefinedfont[#1]% + {\bgroup + \definedfont[#1]% + \xdef\saveddefinedfontid {\number\fontid\font}% + \xdef\saveddefinedfontname{\fontname\font}% + \egroup} + +\def\saveddefinedfontid {\number\fontid\font} +\def\saveddefinedfontname{\fontname\font} + + + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/font-lib.mkvi b/Master/texmf-dist/tex/context/base/font-lib.mkvi index da930da7846..4bacef10b71 100644 --- a/Master/texmf-dist/tex/context/base/font-lib.mkvi +++ b/Master/texmf-dist/tex/context/base/font-lib.mkvi @@ -56,7 +56,8 @@ \registerctxluafile{font-vf} {1.001} \registerctxluafile{font-enh}{1.001} -\registerctxluafile{font-gds}{1.001} % currently only otf +\registerctxluafile{font-trt}{1.001} +\registerctxluafile{font-gds}{1.001} \registerctxluafile{font-def}{1.001} \registerctxluafile{font-ctx}{1.001} % after def as it overloads diff --git a/Master/texmf-dist/tex/context/base/font-log.lua b/Master/texmf-dist/tex/context/base/font-log.lua index 773108e443e..41da75378f9 100644 --- a/Master/texmf-dist/tex/context/base/font-log.lua +++ b/Master/texmf-dist/tex/context/base/font-log.lua @@ -67,14 +67,20 @@ end statistics.register("loaded fonts", function() if next(usedfonts) then local t, n = { }, 0 + local treatmentdata = fonts.treatments.data for name, used in table.sortedhash(usedfonts) do n = n + 1 + local base = basename(name) if complete then - t[n] = used .. "->" .. basename(name) + t[n] = format("%s -> %s",used,base) else - t[n] = basename(name) + t[n] = base + end + local treatment = treatmentdata[base] + if treatment and treatment.comment then + t[n] = format("%s (%s)",t[n],treatment.comment) end end - return n > 0 and format("%s files: %s",n,concat(t," ")) or "none" + return n > 0 and format("%s files: %s",n,concat(t,", ")) or "none" end end) diff --git a/Master/texmf-dist/tex/context/base/font-map.lua b/Master/texmf-dist/tex/context/base/font-map.lua index 29b9ecd35c3..b3c8da0f6c7 100644 --- a/Master/texmf-dist/tex/context/base/font-map.lua +++ b/Master/texmf-dist/tex/context/base/font-map.lua @@ -18,7 +18,7 @@ local trace_mapping = false trackers.register("fonts.mapping", function(v) trac local report_fonts = logs.reporter("fonts","loading") -- not otf only -local fonts = fonts +local fonts = fonts or { } local mappings = fonts.mappings or { } fonts.mappings = mappings @@ -41,8 +41,8 @@ local function loadlumtable(filename) -- will move to font goodies end local hex = R("AF","09") -local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end -local hexsix = (hex^1) / function(s) return tonumber(s,16) end +local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end +local hexsix = (hex*hex*hex*hex*hex*hex) / function(s) return tonumber(s,16) end local dec = (R("09")^1) / tonumber local period = P(".") local unicode = P("uni") * (hexfour * (period + P(-1)) * Cc(false) + Ct(hexfour^1) * Cc(true)) @@ -66,8 +66,8 @@ local function makenameparser(str) end end --- local parser = mappings.makenameparser("Japan1") --- local parser = mappings.makenameparser() +-- local parser = makenameparser("Japan1") +-- local parser = makenameparser() -- local function test(str) -- local b, a = lpegmatch(parser,str) -- print((a and table.serialize(b)) or b) @@ -77,20 +77,21 @@ end -- test("uni1234") -- test("uni1234.xx") -- test("uni12349876") +-- test("u123400987600") -- test("index1234") -- test("Japan1.123") -local function tounicode16(unicode) +local function tounicode16(unicode,name) if unicode < 0x10000 then return format("%04X",unicode) elseif unicode < 0x1FFFFFFFFF then return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) else - report_fonts("can't convert %a into tounicode",unicode) + report_fonts("can't convert %a in %a into tounicode",unicode,name) end end -local function tounicode16sequence(unicodes) +local function tounicode16sequence(unicodes,name) local t = { } for l=1,#unicodes do local unicode = unicodes[l] @@ -99,7 +100,7 @@ local function tounicode16sequence(unicodes) elseif unicode < 0x1FFFFFFFFF then t[l] = format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) else - report_fonts ("can't convert %a into tounicode",unicode) + report_fonts ("can't convert %a in %a into tounicode",unicode,name) end end return concat(t) @@ -110,29 +111,43 @@ local function fromunicode16(str) return tonumber(str,16) else local l, r = match(str,"(....)(....)") - return (tonumber(l,16)- 0xD800)*0x400 + tonumber(r,16) - 0xDC00 + return (tonumber(l,16))*0x400 + tonumber(r,16) - 0xDC00 end end ---~ This is quite a bit faster but at the cost of some memory but if we ---~ do this we will also use it elsewhere so let's not follow this route ---~ now. I might use this method in the plain variant (no caching there) ---~ but then I need a flag that distinguishes between code branches. ---~ ---~ local cache = { } ---~ ---~ function mappings.tounicode16(unicode) ---~ local s = cache[unicode] ---~ if not s then ---~ if unicode < 0x10000 then ---~ s = format("%04X",unicode) ---~ else ---~ s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) ---~ end ---~ cache[unicode] = s ---~ end ---~ return s ---~ end +-- Slightly slower: +-- +-- local p = C(4) * (C(4)^-1) / function(l,r) +-- if r then +-- return (tonumber(l,16))*0x400 + tonumber(r,16) - 0xDC00 +-- else +-- return tonumber(l,16) +-- end +-- end +-- +-- local function fromunicode16(str) +-- return lpegmatch(p,str) +-- end + +-- This is quite a bit faster but at the cost of some memory but if we +-- do this we will also use it elsewhere so let's not follow this route +-- now. I might use this method in the plain variant (no caching there) +-- but then I need a flag that distinguishes between code branches. +-- +-- local cache = { } +-- +-- function mappings.tounicode16(unicode) +-- local s = cache[unicode] +-- if not s then +-- if unicode < 0x10000 then +-- s = format("%04X",unicode) +-- else +-- s = format("%04X%04X",unicode/0x400+0xD800,unicode%0x400+0xDC00) +-- end +-- cache[unicode] = s +-- end +-- return s +-- end mappings.loadlumtable = loadlumtable mappings.makenameparser = makenameparser @@ -140,15 +155,21 @@ mappings.tounicode16 = tounicode16 mappings.tounicode16sequence = tounicode16sequence mappings.fromunicode16 = fromunicode16 -local separator = S("_.") -local other = C((1 - separator)^1) -local ligsplitter = Ct(other * (separator * other)^0) +local ligseparator = P("_") +local varseparator = P(".") +local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator * C((1 - ligseparator - varseparator)^1))^0) + +-- local function test(name) +-- local split = lpegmatch(namesplitter,name) +-- print(string.formatters["%s: [% t]"](name,split)) +-- end ---~ print(table.serialize(lpegmatch(ligsplitter,"this"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"this.that"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that"))) +-- test("i.f_") +-- test("this") +-- test("this.that") +-- test("japan1.123") +-- test("such_so_more") +-- test("such_so_more.that") function mappings.addtounicode(data,filename) local resources = data.resources @@ -195,7 +216,7 @@ function mappings.addtounicode(data,filename) local unicode = lumunic and lumunic[name] or unicodevector[name] if unicode then originals[index] = unicode - tounicode[index] = tounicode16(unicode) + tounicode[index] = tounicode16(unicode,name) ns = ns + 1 end -- cidmap heuristics, beware, there is no guarantee for a match unless @@ -206,7 +227,7 @@ function mappings.addtounicode(data,filename) unicode = cidcodes[foundindex] -- name to number if unicode then originals[index] = unicode - tounicode[index] = tounicode16(unicode) + tounicode[index] = tounicode16(unicode,name) ns = ns + 1 else local reference = cidnames[foundindex] -- number to name @@ -216,11 +237,11 @@ function mappings.addtounicode(data,filename) unicode = cidcodes[foundindex] if unicode then originals[index] = unicode - tounicode[index] = tounicode16(unicode) + tounicode[index] = tounicode16(unicode,name) ns = ns + 1 end end - if not unicode then + if not unicode or unicode == "" then local foundcodes, multiple = lpegmatch(uparser,reference) if foundcodes then originals[index] = foundcodes @@ -229,7 +250,7 @@ function mappings.addtounicode(data,filename) nl = nl + 1 unicode = true else - tounicode[index] = tounicode16(foundcodes) + tounicode[index] = tounicode16(foundcodes,name) ns = ns + 1 unicode = foundcodes end @@ -239,13 +260,13 @@ function mappings.addtounicode(data,filename) end end end - -- a.whatever or a_b_c.whatever or a_b_c (no numbers) - if not unicode then - local split = lpegmatch(ligsplitter,name) - local nplit = split and #split or 0 - if nplit >= 2 then + -- a.whatever or a_b_c.whatever or a_b_c (no numbers) a.b_ + if not unicode or unicode == "" then + local split = lpegmatch(namesplitter,name) + local nsplit = split and #split or 0 + if nsplit >= 2 then local t, n = { }, 0 - for l=1,nplit do + for l=1,nsplit do local base = split[l] local u = unicodes[base] or unicodevector[base] if not u then @@ -262,7 +283,7 @@ function mappings.addtounicode(data,filename) -- nothing elseif n == 1 then originals[index] = t[1] - tounicode[index] = tounicode16(t[1]) + tounicode[index] = tounicode16(t[1],name) else originals[index] = t tounicode[index] = tounicode16sequence(t) @@ -274,17 +295,17 @@ function mappings.addtounicode(data,filename) end end -- last resort (we might need to catch private here as well) - if not unicode then + if not unicode or unicode == "" then local foundcodes, multiple = lpegmatch(uparser,name) if foundcodes then if multiple then originals[index] = foundcodes - tounicode[index] = tounicode16sequence(foundcodes) + tounicode[index] = tounicode16sequence(foundcodes,name) nl = nl + 1 unicode = true else originals[index] = foundcodes - tounicode[index] = tounicode16(foundcodes) + tounicode[index] = tounicode16(foundcodes,name) ns = ns + 1 unicode = foundcodes end diff --git a/Master/texmf-dist/tex/context/base/font-mis.lua b/Master/texmf-dist/tex/context/base/font-mis.lua index c22548ac51c..83df65341be 100644 --- a/Master/texmf-dist/tex/context/base/font-mis.lua +++ b/Master/texmf-dist/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.742 +otf.version = otf.version or 2.743 otf.cache = otf.cache or containers.define("fonts", "otf", otf.version, true) function otf.loadcached(filename,format,sub) diff --git a/Master/texmf-dist/tex/context/base/font-otb.lua b/Master/texmf-dist/tex/context/base/font-otb.lua index 6abe7c6f4e1..2a7b821eaef 100644 --- a/Master/texmf-dist/tex/context/base/font-otb.lua +++ b/Master/texmf-dist/tex/context/base/font-otb.lua @@ -617,8 +617,8 @@ local function featuresinitializer(tfmdata,value) end end end - if basepositions then - for feature, data in next, basepositions do + if basepositionings then + for feature, data in next, basepositionings do local value = features[feature] if value then local validlookups, lookuplist = collectlookups(rawdata,feature,script,language) diff --git a/Master/texmf-dist/tex/context/base/font-otf.lua b/Master/texmf-dist/tex/context/base/font-otf.lua index 8a6183180ea..c1f2f14fc6f 100644 --- a/Master/texmf-dist/tex/context/base/font-otf.lua +++ b/Master/texmf-dist/tex/context/base/font-otf.lua @@ -48,7 +48,7 @@ local otf = fonts.handlers.otf otf.glists = { "gsub", "gpos" } -otf.version = 2.742 -- beware: also sync font-mis.lua +otf.version = 2.743 -- beware: also sync font-mis.lua otf.cache = containers.define("fonts", "otf", otf.version, true) local fontdata = fonts.hashes.identifiers @@ -72,6 +72,7 @@ local usemetatables = false -- .4 slower on mk but 30 M less mem so we migh local packdata = true local syncspace = true local forcenotdef = false +local includesubfonts = false local wildcard = "*" local default = "dflt" @@ -207,6 +208,7 @@ local valid_fields = table.tohash { local ordered_enhancers = { "prepare tables", + "prepare glyphs", "prepare lookups", @@ -232,8 +234,8 @@ local ordered_enhancers = { "check metadata", "check extra features", -- after metadata + "check encoding", -- moved "add duplicates", - "check encoding", "cleanup tables", } @@ -603,8 +605,7 @@ local function somecopy(old) -- fast one end end --- not setting hasitalics and class (when nil) during --- table cronstruction can save some mem +-- not setting hasitalics and class (when nil) during table cronstruction can save some mem actions["prepare glyphs"] = function(data,filename,raw) local rawglyphs = raw.glyphs @@ -623,7 +624,7 @@ actions["prepare glyphs"] = function(data,filename,raw) if rawsubfonts then - metadata.subfonts = { } + metadata.subfonts = includesubfonts and { } properties.cidinfo = rawcidinfo if rawcidinfo.registry then @@ -635,7 +636,9 @@ actions["prepare glyphs"] = function(data,filename,raw) for cidindex=1,#rawsubfonts do local subfont = rawsubfonts[cidindex] local cidglyphs = subfont.glyphs - metadata.subfonts[cidindex] = somecopy(subfont) + if includesubfonts then + metadata.subfonts[cidindex] = somecopy(subfont) + end for index=0,subfont.glyphcnt-1 do -- we could take the previous glyphcnt instead of 0 local glyph = cidglyphs[index] if glyph then @@ -644,6 +647,10 @@ actions["prepare glyphs"] = function(data,filename,raw) if not unicode or unicode == -1 or unicode >= criterium then unicode = cidunicodes[index] end + if unicode and descriptions[unicode] then + report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + unicode = -1 + end if not unicode or unicode == -1 or unicode >= criterium then if not name then name = format("u%06X",private) @@ -725,6 +732,8 @@ actions["prepare glyphs"] = function(data,filename,raw) local u = a.unicode local v = a.variant if v then + -- tricky: no addition to d? needs checking but in practice such dups are either very simple + -- shapes or e.g cjk with not that many features local vv = variants[v] if vv then vv[u] = unicode @@ -762,6 +771,7 @@ actions["check encoding"] = function(data,filename,raw) local properties = data.properties local unicodes = resources.unicodes -- name to unicode local indices = resources.indices -- index to unicodes + local duplicates = resources.duplicates -- begin of messy (not needed when cidmap) @@ -780,10 +790,36 @@ actions["check encoding"] = function(data,filename,raw) for unicode, index in next, unicodetoindex do -- altuni already covers this if unicode <= criterium and not descriptions[unicode] then local parent = indices[index] -- why nil? - if parent then - report_otf("weird, unicode %U points to %U with index %H",unicode,parent,index) - else + if not parent then report_otf("weird, unicode %U points to nowhere with index %H",unicode,index) + else + local parentdescription = descriptions[parent] + if parentdescription then + local altuni = parentdescription.altuni + if not altuni then + altuni = { { unicode = parent } } + parentdescription.altuni = altuni + duplicates[parent] = { unicode } + else + local done = false + for i=1,#altuni do + if altuni[i].unicode == parent then + done = true + break + end + end + if not done then + -- let's assume simple cjk reuse + altuni[#altuni+1] = { unicode = parent } + table.insert(duplicates[parent],unicode) + end + end + if trace_loading then + report_otf("weird, unicode %U points to nowhere with index %H",unicode,index) + end + else + report_otf("weird, unicode %U points to %U with index %H",unicode,index) + end end end end @@ -798,7 +834,7 @@ actions["check encoding"] = function(data,filename,raw) end end --- for the moment we assume that a fotn with lookups will not use +-- for the moment we assume that a font with lookups will not use -- altuni so we stick to kerns only actions["add duplicates"] = function(data,filename,raw) @@ -1251,9 +1287,11 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo if current then for i=1,#current do current[i] = current_class[current[i]] or { } + -- let's not be sparse if lookups and not lookups[i] then lookups[i] = "" -- (was: false) e.g. we can have two lookups and one replacement end + -- end of fix end rule.current = t_hashed(current,t_h_cache) end @@ -1283,6 +1321,16 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo local current = coverage.current if current then current = t_uncover(splitter,t_u_cache,current) + -- let's not be sparse + local lookups = rule.lookups + if lookups then + for i=1,#current do + if not lookups[i] then + lookups[i] = "" -- fix sparse array + end + end + end + -- rule.current = t_hashed(current,t_h_cache) end local after = coverage.after @@ -2017,7 +2065,7 @@ end registerotffeature { name = "mathsize", - description = "apply mathsize as specified in the font", + description = "apply mathsize specified in the font", initializers = { base = checkmathsize, node = checkmathsize, diff --git a/Master/texmf-dist/tex/context/base/font-otn.lua b/Master/texmf-dist/tex/context/base/font-otn.lua index 39a3f77dda0..5da0cf798f0 100644 --- a/Master/texmf-dist/tex/context/base/font-otn.lua +++ b/Master/texmf-dist/tex/context/base/font-otn.lua @@ -233,7 +233,7 @@ local fontdata = fonthashes.identifiers local otffeatures = fonts.constructors.newfeatures("otf") local registerotffeature = otffeatures.register -local onetimemessage = fonts.loggers.onetimemessage +local onetimemessage = fonts.loggers.onetimemessage or function() end otf.defaultnodealternate = "none" -- first last @@ -271,9 +271,9 @@ local function logwarning(...) report_direct(...) end -local f_unicode = formatters["%U"] -local f_uniname = formatters["%U (%s)"] -local f_unilist = formatters["% t (% t)"] +local f_unicode = formatters["%U"] +local f_uniname = formatters["%U (%s)"] +local f_unilist = formatters["% t (% t)"] local function gref(n) -- currently the same as in font-otb if type(n) == "number" then @@ -393,6 +393,8 @@ local function getcomponentindex(start) end end +-- eventually we will do positioning in an other way (needs addional w/h/d fields) + local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head if start == stop and start.char == char then start.char = char @@ -424,6 +426,7 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun local componentindex = 0 local head = base local current = base + -- first we loop over the glyphs in start .. stop while start do local char = start.char if not marks[char] then @@ -435,16 +438,20 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) end head, current = insert_node_after(head,current,copy_node(start)) -- unlikely that mark has components + elseif trace_marks then + logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) end start = start.next end - local start = components - while start and start.id == glyph_code do -- hm, is id test needed ? + -- we can have one accent as part of a lookup and another following + -- local start = components -- was wrong (component scanning was introduced when more complex ligs in devanagari was added) + local start = current.next + while start and start.id == glyph_code do local char = start.char if marks[char] then start[a_ligacomp] = baseindex + (start[a_ligacomp] or componentindex) if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) end else break @@ -613,10 +620,10 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) if lig then if trace_ligatures then local stopchar = stop.char - head, start = toligature(kind,lookupname,head, start,stop,lig,skipmark,discfound) + head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char)) else - head, start = toligature(kind,lookupname,head, start,stop,lig,skipmark,discfound) + head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) end return head, start, true else @@ -679,7 +686,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence logwarning("%s, no matching anchors for mark %s and base %s",pref(kind,lookupname),gref(markchar),gref(basechar)) end end - else -- if trace_bugs then + elseif trace_bugs then -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) onetimemessage(currentfont,basechar,"no base anchors",report_fonts) end @@ -723,7 +730,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ local baseanchors = baseanchors['baselig'] if baseanchors then local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do + for anchor, ba in next, baseanchors do if al[anchor] then local ma = markanchors[anchor] if ma then @@ -735,6 +742,10 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) end return head, start, true + else + if trace_bugs then + logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(kind,lookupname),gref(markchar),gref(basechar),index) + end end end end @@ -744,7 +755,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ end end end - else -- if trace_bugs then + elseif trace_bugs then -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) onetimemessage(currentfont,basechar,"no base anchors",report_fonts) end @@ -799,7 +810,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence end end end - else -- if trace_bugs then + elseif trace_bugs then -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) onetimemessage(currentfont,basechar,"no base anchors",report_fonts) end @@ -851,7 +862,7 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) end end end - else -- if trace_bugs then + elseif trace_bugs then -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar)) onetimemessage(currentfont,startchar,"no entry anchors",report_fonts) end @@ -1394,8 +1405,8 @@ end function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) local markchar = start.char if marks[markchar] then ---~ local alreadydone = markonce and start[a_markmark] ---~ if not alreadydone then + -- local alreadydone = markonce and start[a_markmark] + -- if not alreadydone then -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark local subtables = currentlookup.subtables local lookupname = subtables[1] @@ -1447,9 +1458,9 @@ function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext elseif trace_bugs then logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) end ---~ elseif trace_marks and trace_details then ---~ logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone) ---~ end + -- elseif trace_marks and trace_details then + -- logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone) + -- end elseif trace_bugs then logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) end @@ -1502,7 +1513,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l end end end - else -- if trace_bugs then + elseif trace_bugs then -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar)) onetimemessage(currentfont,startchar,"no entry anchors",report_fonts) end @@ -1896,7 +1907,6 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end else -- is valid - -- logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup and chainlookup.type or "?") i = i + 1 end if start then @@ -2277,6 +2287,9 @@ for s=1,#datasets do if ok then success = true break + elseif not start then + -- don't ask why ... shouldn't happen + break end end else diff --git a/Master/texmf-dist/tex/context/base/font-otp.lua b/Master/texmf-dist/tex/context/base/font-otp.lua index c07d9ad4e70..217bb7535fa 100644 --- a/Master/texmf-dist/tex/context/base/font-otp.lua +++ b/Master/texmf-dist/tex/context/base/font-otp.lua @@ -354,6 +354,12 @@ local function packdata(data) end end end + local altuni = description.altuni + if altuni then + for i=1,#altuni do + altuni[i] = pack_flat(altuni[i]) + end + end end local lookups = data.lookups if lookups then @@ -366,8 +372,8 @@ local function packdata(data) local r = rule.after if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end local r = rule.current if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end local r = rule.replacements if r then rule.replacements = pack_flat (r) end -- can have holes - -- local r = rule.lookups if r then rule.lookups = pack_mixed (r) end -- can have false local r = rule.lookups if r then rule.lookups = pack_indexed(r) end -- can have "" + -- local r = rule.lookups if r then rule.lookups = pack_flat(r) end -- can have holes (already taken care of some cases) end end end @@ -459,6 +465,10 @@ local function packdata(data) mlookups[tag] = pack_normal(mlookup) end end + local altuni = description.altuni + if altuni then + description.altuni = pack_normal(altuni) + end end local lookups = data.lookups if lookups then @@ -656,6 +666,19 @@ local function unpackdata(data) end end end + local altuni = description.altuni + if altuni then + local altuni = tables[altuni] + if altuni then + description.altuni = altuni + for i=1,#altuni do + local tv = tables[altuni[i]] + if tv then + altuni[i] = tv + end + end + end + end end local lookups = data.lookups if lookups then diff --git a/Master/texmf-dist/tex/context/base/font-ott.lua b/Master/texmf-dist/tex/context/base/font-ott.lua index 8a5579c0212..e3aacd0d1bd 100644 --- a/Master/texmf-dist/tex/context/base/font-ott.lua +++ b/Master/texmf-dist/tex/context/base/font-ott.lua @@ -771,7 +771,7 @@ local function resolve(t,k) end end end - return "dflt" + return k -- "dflt" end setmetatableindex(features, resolve) diff --git a/Master/texmf-dist/tex/context/base/font-otx.lua b/Master/texmf-dist/tex/context/base/font-otx.lua index d276b8a1524..5c41ad66faf 100644 --- a/Master/texmf-dist/tex/context/base/font-otx.lua +++ b/Master/texmf-dist/tex/context/base/font-otx.lua @@ -81,8 +81,9 @@ local features = { -- mark = s_mark, } -analyzers.states = states -analyzers.features = features +analyzers.states = states +analyzers.features = features +analyzers.useunicodemarks = false -- todo: analyzers per script/lang, cross font, so we need an font id hash -> script -- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace @@ -99,7 +100,10 @@ function analyzers.setstate(head,font) local char = current.char local d = descriptions[char] if d then - if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then + if d.class == "mark" then + done = true + current[a_state] = s_mark + elseif useunicodemarks and categories[char] == "mn" then done = true current[a_state] = s_mark elseif n == 0 then @@ -388,6 +392,6 @@ methods.syrc = methods.arab methods.mand = methods.arab methods.nko = methods.arab --- directives.register("otf.analyze.useunicodemarks",function(v) --- analyzers.useunicodemarks = v --- end) +directives.register("otf.analyze.useunicodemarks",function(v) + analyzers.useunicodemarks = v +end) diff --git a/Master/texmf-dist/tex/context/base/font-pre.mkiv b/Master/texmf-dist/tex/context/base/font-pre.mkiv index 74c39722f8f..b03abed7d4c 100644 --- a/Master/texmf-dist/tex/context/base/font-pre.mkiv +++ b/Master/texmf-dist/tex/context/base/font-pre.mkiv @@ -87,8 +87,9 @@ \definefontfeature % might move [simplearabic] [mode=node,language=dflt,script=arab, - init=yes,medi=yes,fina=yes,calt=yes, - rlig=yes,curs=yes,mark=yes,mkmk=yes] + init=yes,medi=yes,fina=yes, + rlig=yes,calt=yes, + mark=yes,mkmk=yes,curs=yes] \definefontfeature [simplehebrew] @@ -190,6 +191,10 @@ % \definefontfeature[mathscript] [math-script] % \definefontfeature[mathscriptscript] [math-scriptscript] +\definefontfeature + [missing] + [missing=yes] + %D We define some colors that are used in tracing (for instance \OPENTYPE\ %D features). We cannot yet inherit because no colors are predefined. @@ -501,8 +506,11 @@ \definefontfeature[f:smallcaps][smcp=yes] \definefontfeature[f:oldstyle] [onum=yes] -\definealternativestyle [\v!smallcaps] [\doaddfeature{f:smallcaps}] [\doaddfeature{f:smallcaps}] -\definealternativestyle [\v!oldstyle] [\doaddfeature{f:oldstyle}] [\doaddfeature{f:oldstyle}] +\definealternativestyle [\v!smallcaps] [\setsmallcaps] [\setsmallcaps] +\definealternativestyle [\v!oldstyle] [\setoldstyle ] [\setoldstyle ] + +\unexpanded\def\setsmallcaps{\doaddfeature{f:smallcaps}} +\unexpanded\def\setoldstyle {\doaddfeature{f:oldstyle}} %D \macros %D {tinyfont} diff --git a/Master/texmf-dist/tex/context/base/font-syn.lua b/Master/texmf-dist/tex/context/base/font-syn.lua index 81e27afd603..27176dade05 100644 --- a/Master/texmf-dist/tex/context/base/font-syn.lua +++ b/Master/texmf-dist/tex/context/base/font-syn.lua @@ -28,6 +28,7 @@ local nameonly = file.nameonly local pathpart = file.pathpart local filejoin = file.join local is_qualified_path = file.is_qualified_path +local exists = io.exists local findfile = resolvers.findfile local cleanpath = resolvers.cleanpath @@ -719,17 +720,24 @@ local function analyzefiles(olddata) local oldindices = olddata and olddata.indices or { } local oldspecifications = olddata and olddata.specifications or { } local oldrejected = olddata and olddata.rejected or { } + local treatmentdata = fonts.treatments.data local function identify(completename,name,suffix,storedname) local pathpart, basepart = splitbase(completename) nofread = nofread + 1 - if done[name] then + local treatment = treatmentdata[completename] or treatmentdata[basepart] + if treatment and treatment.ignored then + if trace_names then + report_names("%s font %a is ignored, reason %a",suffix,completename,treatment.comment or "unknown") + end + nofskipped = nofskipped + 1 + elseif done[name] then -- already done (avoid otf afm clash) if trace_names then report_names("%s font %a already done",suffix,completename) end nofduplicates = nofduplicates + 1 nofskipped = nofskipped + 1 - elseif not io.exists(completename) then + elseif not exists(completename) then -- weird error if trace_names then report_names("%s font %a does not really exist",suffix,completename) diff --git a/Master/texmf-dist/tex/context/base/font-trt.lua b/Master/texmf-dist/tex/context/base/font-trt.lua new file mode 100644 index 00000000000..6fc8028d128 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/font-trt.lua @@ -0,0 +1,57 @@ +if not modules then modules = { } end modules ['font-trt'] = { + version = 1.001, + comment = "companion to font-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local rawget, dofile, next = rawget, dofile, next + +--[[ldx-- +<p>We provide a simple treatment mechanism (mostly because I want to demonstrate +something in a manual). It's one of the few places where an lfg file gets loaded +outside the goodies manager.</p> +--ldx]]-- + +local treatments = utilities.storage.allocate() +fonts.treatments = treatments +local treatmentdata = { } +treatments.data = treatmentdata +treatments.filename = "treatments.lfg" + +-- function treatments.load(name) +-- local filename = resolvers.findfile(name) +-- if filename and filename ~= "" then +-- local goodies = dofile(filename) +-- if goodies then +-- local treatments = goodies.treatments +-- if treatments then +-- for name, data in next, treatments do +-- treatmentdata[name] = data -- always wins +-- end +-- end +-- end +-- end +-- end + +table.setmetatableindex(treatmentdata,function(t,k) + local files = resolvers.findfiles(treatments.filename) + if files then + for i=1,#files do + local goodies = dofile(files[i]) + if goodies then + local treatments = goodies.treatments + if treatments then + for name, data in next, treatments do + if not rawget(t,name) then + t[name] = data + end + end + end + end + end + end + table.setmetatableindex(treatmentdata,nil) + return treatmentdata[k] +end) diff --git a/Master/texmf-dist/tex/context/base/l-file.lua b/Master/texmf-dist/tex/context/base/l-file.lua index 29416caf03b..a64ee86564c 100644 --- a/Master/texmf-dist/tex/context/base/l-file.lua +++ b/Master/texmf-dist/tex/context/base/l-file.lua @@ -62,7 +62,7 @@ elseif not lfs.isfile then end local insert, concat = table.insert, table.concat -local match, find = string.match, string.find +local match, find, gmatch = string.match, string.find, string.gmatch local lpegmatch = lpeg.match local getcurrentdir, attributes = lfs.currentdir, lfs.attributes local checkedsplit = string.checkedsplit @@ -115,11 +115,23 @@ local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end -file.pathpart = pathpart -file.basename = basename -file.nameonly = nameonly -file.suffixonly = suffixonly -file.suffix = suffixonly +local pattern = (noslashes^0 * slashes)^0 * noperiod^1 * ((period * C(noperiod^1))^1) * -1 + Cc("") + +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end + +file.pathpart = pathpart +file.basename = basename +file.nameonly = nameonly +file.suffixonly = suffixonly +file.suffix = suffixonly +file.suffixesonly = suffixesonly +file.suffixes = suffixesonly file.dirname = pathpart -- obsolete file.extname = suffixonly -- obsolete @@ -153,7 +165,11 @@ function file.splitname(str,splitdrive) end function file.splitbase(str) - return str and lpegmatch(pattern_d,str) -- returns path, base+suffix + if str then + return lpegmatch(pattern_d,str) -- returns path, base+suffix (path has / appended, might change at some point) + else + return "", str -- assume no path + end end ---- stripslash = C((1 - P("/")^1*P(-1))^0) @@ -568,3 +584,16 @@ end -- return f(...) -- end -- end + +-- a goodie: a dumb version of mkdirs (not used in context itself, only +-- in generic usage) + +function lfs.mkdirs(path) + local full = "" + for sub in gmatch(path,"(/*[^\\/]+)") do -- accepts leading c: and / + full = full .. sub + -- lfs.isdir("/foo") mistakenly returns true on windows so + -- so we don't test and just make as that one is not too picky + lfs.mkdir(full) + end +end diff --git a/Master/texmf-dist/tex/context/base/l-gzip.lua b/Master/texmf-dist/tex/context/base/l-gzip.lua new file mode 100644 index 00000000000..5100e47222c --- /dev/null +++ b/Master/texmf-dist/tex/context/base/l-gzip.lua @@ -0,0 +1,54 @@ +if not modules then modules = { } end modules ['l-gzip'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if not gzip then + + -- no fallback yet + + return + +end + +local suffix, suffixes = file.suffix, file.suffixes + +function gzip.load(filename) + local f = io.open(filename,"rb") + if not f then + -- invalid file + elseif suffix(filename) == "gz" then + f:close() + local g = gzip.open(filename,"rb") + if g then + local str = g:read("*all") + g:close() + return str + end + else + local str = f:read("*all") + f:close() + return str + end +end + +function gzip.save(filename,data) + if suffix(filename) ~= "gz" then + filename = filename .. ".gz" + end + local f = io.open(filename,"wb") + if f then + local s = zlib.compress(data or "",9,nil,15+16) + f:write(s) + f:close() + return #s + end +end + +function gzip.suffix(filename) + local suffix, extra = suffixes(filename) + local gzipped = extra == "gz" + return suffix, gzipped +end diff --git a/Master/texmf-dist/tex/context/base/l-package.lua b/Master/texmf-dist/tex/context/base/l-package.lua index 09e65f9c896..579fd3941c6 100644 --- a/Master/texmf-dist/tex/context/base/l-package.lua +++ b/Master/texmf-dist/tex/context/base/l-package.lua @@ -50,16 +50,18 @@ local function lualibfile(name) return lpegmatch(pattern,name) or name end +local offset = luarocks and 1 or 0 -- todo: also check other extras + local helpers = package.helpers or { cleanpath = cleanpath, lualibfile = lualibfile, trace = false, report = function(...) print(format(...)) end, builtin = { - ["preload table"] = searchers[1], -- special case, built-in libs - ["path specification"] = searchers[2], - ["cpath specification"] = searchers[3], - ["all in one fallback"] = searchers[4], -- special case, combined libs + ["preload table"] = searchers[1+offset], -- special case, built-in libs + ["path specification"] = searchers[2+offset], + ["cpath specification"] = searchers[3+offset], + ["all in one fallback"] = searchers[4+offset], -- special case, combined libs }, methods = { }, @@ -279,6 +281,9 @@ methods["not loaded"] = function(name) end local level = 0 +local used = { } + +helpers.traceused = false function helpers.loaded(name) local sequence = helpers.sequence @@ -293,6 +298,9 @@ function helpers.loaded(name) if helpers.trace then helpers.report("%s, level '%s', method '%s', name '%s'","found",level,method,name) end + if helpers.traceused then + used[#used+1] = { level = level, name = name } + end level = level - 1 return result, rest end @@ -302,6 +310,19 @@ function helpers.loaded(name) return nil end +function helpers.showused() + local n = #used + if n > 0 then + helpers.report("%s libraries loaded:",n) + helpers.report() + for i=1,n do + local u = used[i] + helpers.report("%i %a",u.level,u.name) + end + helpers.report() + end +end + function helpers.unload(name) if helpers.trace then if package.loaded[name] then diff --git a/Master/texmf-dist/tex/context/base/l-pdfview.lua b/Master/texmf-dist/tex/context/base/l-pdfview.lua index e42462a3d1d..6e0259299ce 100644 --- a/Master/texmf-dist/tex/context/base/l-pdfview.lua +++ b/Master/texmf-dist/tex/context/base/l-pdfview.lua @@ -19,30 +19,37 @@ pdfview = pdfview or { } local opencalls, closecalls, allcalls, runner +-- this might become template based + if os.type == "windows" then opencalls = { ['default'] = "pdfopen --rxi --file", ['acrobat'] = "pdfopen --rxi --file", ['fullacrobat'] = "pdfopen --axi --file", - ['okular'] = 'start "test" "c:/data/system/kde/bin/okular.exe" --unique' -- todo! + ['okular'] = 'start "test" "c:/data/system/kde/bin/okular.exe" --unique', -- todo! + ['sumatra'] = 'start "test" "c:/data/system/sumatrapdf/sumatrapdf.exe" -reuse-instance', + ['okular'] = 'start "test" "okular.exe" --unique', + ['sumatra'] = 'start "test" "sumatrapdf.exe" -reuse-instance -bg-color 0xCCCCCC', } closecalls= { ['default'] = "pdfclose --file", ['acrobat'] = "pdfclose --file", ['okular'] = false, + ['sumatra'] = false, } allcalls = { ['default'] = "pdfclose --all", ['acrobat'] = "pdfclose --all", ['okular'] = false, + ['sumatra'] = false, } - pdfview.method = "acrobat" + pdfview.method = "acrobat" -- no longer usefull due to green pop up line and clasing reader/full + pdfview.method = "sumatra" - runner = function(...) --- os.spawn(...) - os.execute(...) + runner = function(cmd) + os.execute(cmd) -- .. " > /null" end else @@ -62,8 +69,8 @@ else pdfview.method = "okular" - runner = function(...) - os.spawn(...) + runner = function(cmd) + os.execute(cmd .. " 1>/dev/null 2>/dev/null &") end end diff --git a/Master/texmf-dist/tex/context/base/l-table.lua b/Master/texmf-dist/tex/context/base/l-table.lua index e57abe854c0..9a1b97fff78 100644 --- a/Master/texmf-dist/tex/context/base/l-table.lua +++ b/Master/texmf-dist/tex/context/base/l-table.lua @@ -120,7 +120,7 @@ local function sortedhash(t,cmp) if t then local s if cmp then - -- it would be nice if teh sort function would accept a third argument (or nicer, an optional first) + -- it would be nice if the sort function would accept a third argument (or nicer, an optional first) s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end) else s = sortedkeys(t) -- the robust one diff --git a/Master/texmf-dist/tex/context/base/lang-def.lua b/Master/texmf-dist/tex/context/base/lang-def.lua index 6656d8ed978..c0c3981f7df 100644 --- a/Master/texmf-dist/tex/context/base/lang-def.lua +++ b/Master/texmf-dist/tex/context/base/lang-def.lua @@ -342,6 +342,15 @@ local specifications = allocate { ["variant"] = "sv", }, { + ["description"] = "Thai", + ["script"] = "thai", + -- ["bibliographical"] = "", + -- ["terminological"] = "", + ["context"] = "th", + ["opentype"] = "tha", + -- ["variant"] = "", + }, + { ["description"] = "Turkish", ["script"] = "latn", ["bibliographical"] = "tur", diff --git a/Master/texmf-dist/tex/context/base/lang-def.mkiv b/Master/texmf-dist/tex/context/base/lang-def.mkiv index d4e40dad1e7..9f84e90f01c 100644 --- a/Master/texmf-dist/tex/context/base/lang-def.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-def.mkiv @@ -678,6 +678,26 @@ \installlanguage [\s!vietnamese] [\s!vi] +% Thai (teaser for Mojca) + +\installlanguage + [\s!th] + [\c!spacing=\v!broad, + \c!leftsentence=\emdash, + \c!rightsentence=\emdash, + \c!leftsubsentence=\emdash, + \c!rightsubsentence=\emdash, + \c!leftquote=\upperleftsinglesixquote, + \c!rightquote=\upperrightsingleninequote, + \c!leftquotation=\upperleftdoublesixquote, + \c!rightquotation=\upperrightdoubleninequote, + \c!date={\v!month,\space,\v!day,{,\space},\v!year}, + \s!patterns=\s!th, + \s!lefthyphenmin=2, + \s!righthyphenmin=3] + +\installlanguage [\s!thai] [\s!th] + %D Todo: generate this one from languages.data \installlanguage[nld][\s!nl] diff --git a/Master/texmf-dist/tex/context/base/lang-ini.lua b/Master/texmf-dist/tex/context/base/lang-ini.lua index 4ae7656d354..64221325338 100644 --- a/Master/texmf-dist/tex/context/base/lang-ini.lua +++ b/Master/texmf-dist/tex/context/base/lang-ini.lua @@ -91,6 +91,23 @@ end -- patterns=en -- patterns=en,de +local function validdata(dataset,what,tag) + if dataset then + local data = dataset.data + if not data or data == "" then + return nil + elseif dataset.compression == "zlib" then + data = zlib.decompress(data) + if dataset.length and dataset.length ~= #data then + report_initialization("compression error in %a for language %a","patterns",what,tag) + end + return data + else + return data + end + end +end + local function loaddefinitions(tag,specification) statistics.starttiming(languages) local data, instance = resolve(tag) @@ -113,15 +130,21 @@ local function loaddefinitions(tag,specification) dataused[definition] = definition local filename = "lang-" .. definition .. ".lua" local fullname = resolvers.findfile(filename) or "" + if fullname == "" then + fullname = resolvers.findfile(filename .. ".gz") or "" + end if fullname ~= "" then if trace_patterns then report_initialization("loading definition %a for language %a from %a",definition,tag,fullname) end - local defs = dofile(fullname) -- use regular loader instead + local suffix, gzipped = gzip.suffix(fullname) + local defs = table.load(fullname,gzipped and gzip.load) if defs then -- todo: version test ok, nofloaded = true, nofloaded + 1 - instance:patterns (defs.patterns and defs.patterns .data or "") - instance:hyphenation(defs.exceptions and defs.exceptions.data or "") + -- instance:patterns (defs.patterns and defs.patterns .data or "") + -- instance:hyphenation(defs.exceptions and defs.exceptions.data or "") + instance:patterns (validdata(defs.patterns, "patterns", tag) or "") + instance:hyphenation(validdata(defs.exceptions,"exceptions",tag) or "") else report_initialization("invalid definition %a for language %a in %a",definition,tag,filename) end @@ -329,13 +352,15 @@ languages.associate('fr','latn','fra') statistics.register("loaded patterns", function() local result = languages.logger.report() if result ~= "none" then - return result +-- return result + return format("%s, load time: %s",result,statistics.elapsedtime(languages)) end end) -statistics.register("language load time", function() - return statistics.elapsedseconds(languages, format(", nofpatterns: %s",nofloaded)) -end) +-- statistics.register("language load time", function() +-- -- often zero so we can merge that in the above +-- return statistics.elapsedseconds(languages, format(", nofpatterns: %s",nofloaded)) +-- end) -- interface diff --git a/Master/texmf-dist/tex/context/base/lang-ini.mkiv b/Master/texmf-dist/tex/context/base/lang-ini.mkiv index 3226c1255ce..1297fe23ebc 100644 --- a/Master/texmf-dist/tex/context/base/lang-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-ini.mkiv @@ -398,6 +398,9 @@ \lang_basics_synchronize_min_max \to \everylanguage +\unexpanded\def\unhyphenated + {\groupedcommand{\lefthyphenmin\maxdimen}\donothing} + % \appendtoks % \setups[\languageparameter\c!setups]% % \to \everylanguage diff --git a/Master/texmf-dist/tex/context/base/luat-bas.mkiv b/Master/texmf-dist/tex/context/base/luat-bas.mkiv index ddf90142423..a3891271619 100644 --- a/Master/texmf-dist/tex/context/base/luat-bas.mkiv +++ b/Master/texmf-dist/tex/context/base/luat-bas.mkiv @@ -26,6 +26,7 @@ \registerctxluafile{l-io} {1.001} \registerctxluafile{l-os} {1.001} \registerctxluafile{l-file} {1.001} +\registerctxluafile{l-gzip} {1.001} \registerctxluafile{l-md5} {1.001} \registerctxluafile{l-dir} {1.001} \registerctxluafile{l-unicode} {1.001} diff --git a/Master/texmf-dist/tex/context/base/luat-cbk.lua b/Master/texmf-dist/tex/context/base/luat-cbk.lua index f8c6926f075..5aa12005b78 100644 --- a/Master/texmf-dist/tex/context/base/luat-cbk.lua +++ b/Master/texmf-dist/tex/context/base/luat-cbk.lua @@ -194,11 +194,11 @@ if trace_calls then end) end ---~ -- somehow crashes later on ---~ ---~ callbacks.freeze("find_.*_file","finding file") ---~ callbacks.freeze("read_.*_file","reading file") ---~ callbacks.freeze("open_.*_file","opening file") +-- -- somehow crashes later on +-- +-- callbacks.freeze("find_.*_file","finding file") +-- callbacks.freeze("read_.*_file","reading file") +-- callbacks.freeze("open_.*_file","opening file") --[[ldx-- <p>The simple case is to remove the callback:</p> diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv index 8889d906ba4..d2d64aa8d52 100644 --- a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv @@ -74,8 +74,8 @@ \def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element \def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document \def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element -\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1","#2",#3)}} -\def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1","#2","#3")}} +\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1",\!!bs#2\!!es,#3)}} +\def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1",\!!bs#2\!!es,"#3")}} \def\xmlstrip #1#2{\ctxlxml{strip("#1","#2")}} \def\xmlstripnolines #1#2{\ctxlxml{strip("#1","#2",true)}} \def\xmlstripanywhere #1#2{\ctxlxml{strip("#1","#2",true,true)}} diff --git a/Master/texmf-dist/tex/context/base/m-graph.mkiv b/Master/texmf-dist/tex/context/base/m-graph.mkiv index 25933d9ebae..c15262cac71 100644 --- a/Master/texmf-dist/tex/context/base/m-graph.mkiv +++ b/Master/texmf-dist/tex/context/base/m-graph.mkiv @@ -67,7 +67,7 @@ if unknown context_grap: input "mp-grap.mpiv" ; fi ; \stopMPdefinitions -% For backwards compatibility (for the moment), also load the graph macros in +% For backwards compatibility (for the moment), also load the graph macros in % the standard MP instance (scaled integer): \startMPdefinitions diff --git a/Master/texmf-dist/tex/context/base/m-sql.mkiv b/Master/texmf-dist/tex/context/base/m-sql.mkiv new file mode 100644 index 00000000000..60cbdd1be3b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/m-sql.mkiv @@ -0,0 +1,17 @@ +%D \module +%D [ file=m-sql, +%D version=2012.07.12, +%D title=\CONTEXT\ Extra Modules, +%D subtitle=SQL, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\registerctxluafile{util-tpl}{} +\registerctxluafile{util-sql}{} + +\endinput diff --git a/Master/texmf-dist/tex/context/base/math-def.mkiv b/Master/texmf-dist/tex/context/base/math-def.mkiv index cc2a8fae6c5..9201fc5404a 100644 --- a/Master/texmf-dist/tex/context/base/math-def.mkiv +++ b/Master/texmf-dist/tex/context/base/math-def.mkiv @@ -270,13 +270,14 @@ \definemathcommand [colonsep] {\mkern-1.2mu} \definemathcommand [doublecolonsep] {\mkern-0.9mu} -%D Now we define all the colon relations .. needs checking with char-def.lua: +%D Now we define all the colon relations .. needs checking with char-def.lua ... +%d will move to a separate module. \definemathcommand [centercolon] [rel] {\mathstylevcenteredhbox\colon} \definemathcommand [colonminus] [rel] {\centercolon\colonsep\mathrel{-}} -\definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon} -\definemathcommand [colonequals] [rel] {\centercolon\colonsep=} -\definemathcommand [equalscolon] [rel] {=\centercolon\colonsep} +\definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon} % native char +\definemathcommand [colonequals] [rel] {\centercolon\colonsep=} % native char +\definemathcommand [equalscolon] [rel] {=\centercolon\colonsep} % native char \definemathcommand [colonapprox] [rel] {\centercolon\colonsep\approx} \definemathcommand [approxcolon] [rel] {\approx\centercolon\colonsep} \definemathcommand [colonsim] [rel] {\centercolon\colonsep\sim} @@ -285,7 +286,7 @@ \definemathcommand [coloncolon] [rel] {\centercolon\doublecolonsep\centercolon} \definemathcommand [coloncolonminus] [rel] {\coloncolon\colonsep\mathrel{-}} \definemathcommand [minuscoloncolon] [rel] {\mathrel{-}\colonsep\coloncolon} -\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=} +\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=} % native char \definemathcommand [equalscoloncolon] [rel] {=\coloncolon\colonsep} \definemathcommand [coloncolonapprox] [rel] {\coloncolon\colonsep\approx} \definemathcommand [approxcoloncolon] [rel] {\approx\coloncolon\colonsep} diff --git a/Master/texmf-dist/tex/context/base/math-ini.lua b/Master/texmf-dist/tex/context/base/math-ini.lua index 530e685685e..7ba1d451463 100644 --- a/Master/texmf-dist/tex/context/base/math-ini.lua +++ b/Master/texmf-dist/tex/context/base/math-ini.lua @@ -10,11 +10,15 @@ if not modules then modules = { } end modules ['math-ini'] = { -- the "8000 hackery influences direct characters (utf) as indirect \char's -- -- isn't characters.data loaded already ... shortcut it here +-- +-- replace code 7 by 0 as we don't use it anyway (chars with code 7 will adapt to +-- to the fam when set ... we use other means .. ok, we could use it for spacing but +-- then we also have to set the other characters (only a subset done now) -local formatters = string.formatters +local formatters, find = string.formatters, string.find local utfchar, utfbyte = utf.char, utf.byte local setmathcode, setdelcode = tex.setmathcode, tex.setdelcode -local texattribute = tex.attribute +local settexattribute = tex.setattribute local floor = math.floor local context = context @@ -22,25 +26,27 @@ local context = context local contextsprint = context.sprint local contextfprint = context.fprint -- a bit inefficient -local allocate = utilities.storage.allocate - local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) local report_math = logs.reporter("mathematics","initializing") -mathematics = mathematics or { } -local mathematics = mathematics +mathematics = mathematics or { } +local mathematics = mathematics mathematics.extrabase = 0xFE000 -- here we push some virtuals mathematics.privatebase = 0xFF000 -- here we push the ex -local chardata = characters.data +local unsetvalue = attributes.unsetvalue +local allocate = utilities.storage.allocate +local chardata = characters.data local families = allocate { mr = 0, mb = 1, } +--- to be checked .. afew defaults in char-def that should be alpha + local classes = allocate { ord = 0, -- mathordcomm mathord op = 1, -- mathopcomm mathop @@ -197,10 +203,10 @@ local setmathsymbol = function(name,class,family,slot) -- hex is nicer for traci elseif class == classes.under then contextsprint(formatters[ [[\ugdef\%s{\Udelimiterunder "%X "%X }]] ](name,family,slot)) elseif class == open_class or class == close_class or class == middle_class then - setdelcode(slot,{family,slot,0,0}) + setdelcode("global",slot,{family,slot,0,0}) contextsprint(formatters[ [[\ugdef\%s{\Udelimiter "%X "%X "%X }]] ](name,class,family,slot)) elseif class == classes.delimiter then - setdelcode(slot,{family,slot,0,0}) + setdelcode("global",slot,{family,slot,0,0}) contextsprint(formatters[ [[\ugdef\%s{\Udelimiter 0 "%X "%X }]] ](name,family,slot)) elseif class == classes.radical then contextsprint(formatters[ [[\ugdef\%s{\Uradical "%X "%X }]] ](name,family,slot)) @@ -485,10 +491,10 @@ end -- -- function commands.taggedmathfunction(tag,label) -- if label then --- texattribute[a_mathcategory] = registercategory(1,tag,tag) +-- settexattribute(a_mathcategory,registercategory(1,tag,tag)) -- context.mathlabeltext(tag) -- else --- texattribute[a_mathcategory] = 1 +-- settexattribute(a_mathcategory,1) -- context(tag) -- end -- end @@ -511,13 +517,31 @@ function commands.taggedmathfunction(tag,label,apply) noffunctions = noffunctions + 1 functions[noffunctions] = tag functions[tag] = noffunctions - texattribute[a_mathcategory] = noffunctions + delta + settexattribute(a_mathcategory,noffunctions + delta) else - texattribute[a_mathcategory] = n + delta + settexattribute(a_mathcategory,n + delta) end context.mathlabeltext(tag) else - texattribute[a_mathcategory] = 1000 + delta + settexattribute(a_mathcategory,1000 + delta) context(tag) end end + +-- + +local list + +function commands.resetmathattributes() + if not list then + list = { } + for k, v in next, attributes.numbers do + if find(k,"^math") then + list[#list+1] = v + end + end + end + for i=1,#list do + settexattribute(list[i],unsetvalue) + end +end diff --git a/Master/texmf-dist/tex/context/base/math-ini.mkiv b/Master/texmf-dist/tex/context/base/math-ini.mkiv index 72daa83415c..81ec339d658 100644 --- a/Master/texmf-dist/tex/context/base/math-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/math-ini.mkiv @@ -71,6 +71,26 @@ \setnewconstant\defaultmathfamily \zerocount % 255 +\unexpanded\def\resetmathattributes{\ctxcommand{resetmathattributes()}} + +% \unexpanded\def\rawmathcharacter#1% slow but only for tracing +% {\begingroup +% \ifmmode +% \resetmathattributes\Uchar#1% +% \else +% \startimath\resetmathattributes\Uchar#1\stopimath +% \fi +% \endgroup} + +\unexpanded\def\rawmathematics#1% slow but only for tracing + {\begingroup + \ifmmode + \resetmathattributes#1% + \else + \startimath\resetmathattributes#1\stopimath + \fi + \endgroup} + %D Some measures (maybe spac-mth): % \def\mathskipsmall {\mskip\thinmuskip} @@ -594,7 +614,7 @@ ^\bgroup \expandafter\math_prime_indeed_virtual % virtual mess (using funny signal) \else -% \expandafter\math_prime_indeed_normal % gets collapsed + % \expandafter\math_prime_indeed_normal % gets collapsed \expandafter\math_prime_indeed_crapped % gets collapsed \fi} diff --git a/Master/texmf-dist/tex/context/base/math-map.lua b/Master/texmf-dist/tex/context/base/math-map.lua index 9a8c8a69c2a..a0d7457d199 100644 --- a/Master/texmf-dist/tex/context/base/math-map.lua +++ b/Master/texmf-dist/tex/context/base/math-map.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['math-map'] = { license = "see context related readme files" } +-- todo: make sparse .. if self + --[[ldx-- <p>Remapping mathematics alphabets.</p> --ldx]]-- diff --git a/Master/texmf-dist/tex/context/base/meta-ini.mkiv b/Master/texmf-dist/tex/context/base/meta-ini.mkiv index 00b1da032ab..6502047fbc0 100644 --- a/Master/texmf-dist/tex/context/base/meta-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-ini.mkiv @@ -110,7 +110,7 @@ \let\stopMPextensions\relax -\unexpanded\def\startMPinitializations#1\stopMPinitializations % for all instances, when enables +\unexpanded\def\startMPinitializations#1\stopMPinitializations % for all instances, when enabled {\global\t_meta_initializations\expandafter{\the\t_meta_initializations#1}} \let\stopMPinitializations\relax @@ -190,6 +190,16 @@ %{\normalexpanded{\meta_analyze_graphicname_indeed[#1::::]}} {\normalexpanded{\meta_analyze_graphicname_indeed[#1}::::]} +\def\meta_show_properties_indeed + {\writestatus{metapost}{name: \currentMPgraphicname, instance: \currentMPinstance, format: \currentMPformat}} + +\let\meta_show_properties\donothing + +\installtextracker + {metapost.properties} + {\let\meta_show_properties\meta_show_properties_indeed} + {\let\meta_show_properties\donothing} + \unexpanded\def\meta_analyze_graphicname_indeed[#1::#2::#3]% instance :: {\edef\currentMPgraphicname{#2}% \ifx\currentMPgraphicname\empty @@ -200,10 +210,12 @@ \else \let\currentMPinstance\defaultMPinstance \fi\fi - \edef\currentMPformat{\MPinstanceparameter\s!format}} + \edef\currentMPformat{\MPinstanceparameter\s!format}% + \meta_show_properties} -\def\currentMPinstance{\defaultMPinstance} -\def\currentMPformat {\currentMPinstance} +\def\currentMPgraphicname{\s!unknown} +\def\currentMPinstance {\defaultMPinstance} +\def\currentMPformat {\currentMPinstance} \defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] \defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] @@ -432,7 +444,7 @@ \startMPextensions string contextversion; - contextversion:="\contextversion"; + contextversion:="\contextversion"; % expanded \stopMPextensions %D \macros @@ -838,12 +850,12 @@ \def\MPdataMPOfile{\jobname-mpgraph.mpo} \def\MPdataMPYfile{\jobname-mpgraph.mpy} -\startMPextensions +\startMPinitializations boolean collapse_data; collapse_data:=true; def data_mpd_file = "\MPdataMPDfile" enddef ; def data_mpo_file = "\MPdataMPOfile" enddef ; def data_mpy_file = "\MPdataMPYfile" enddef ; -\stopMPextensions +\stopMPinitializations \unexpanded\def\getMPdata {\let\MPdata\secondoftwoarguments @@ -1175,11 +1187,13 @@ vardef ForegroundBox = unitsquare xysized(HSize,VSize) enddef ; - vardef PageFraction = - if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi - enddef ; + PageFraction := 1 ; \stopMPextensions +\startMPinitializations + PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ; +\stopMPinitializations + %D And some more. These are not really needed since we %D don't use the normal figure inclusion macros any longer. diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.lua b/Master/texmf-dist/tex/context/base/meta-pdf.lua index 32e48902a1a..e51290e4214 100644 --- a/Master/texmf-dist/tex/context/base/meta-pdf.lua +++ b/Master/texmf-dist/tex/context/base/meta-pdf.lua @@ -162,19 +162,19 @@ function mps.rlineto(x,y) dx = msp[1] dy = msp[2] end - m_stack_path[topofstack+1] = {dx,dy,"l"} + m_stack_path[topofstack+1] = { dx, dy, "l" } end function mps.translate(tx,ty) - mpscode(f_translate(tx,ty) + mpscode(f_translate(tx,ty)) end function mps.scale(sx,sy) - m_stack_concat = {sx,0,0,sy,0,0} + m_stack_concat = { sx, 0, 0, sy, 0, 0 } end function mps.concat(sx, rx, ry, sy, tx, ty) - m_stack_concat = {sx,rx,ry,sy,tx,ty} + m_stack_concat = { sx, rx, ry, sy, tx, ty } end function mps.setlinejoin(d) diff --git a/Master/texmf-dist/tex/context/base/mlib-run.lua b/Master/texmf-dist/tex/context/base/mlib-run.lua index 4ff16b18efe..1fc36dd80aa 100644 --- a/Master/texmf-dist/tex/context/base/mlib-run.lua +++ b/Master/texmf-dist/tex/context/base/mlib-run.lua @@ -116,15 +116,16 @@ local function i_finder(name,mode,ftype) -- fake message for mpost.map and metaf return finder(specification,name,mode,ftype) end -local function o_finder(name, mode, ftype) +local function o_finder(name,mode,ftype) + -- report_metapost("output file %a, mode %a, ftype %a",name,mode,ftype) return name end local function finder(name, mode, ftype) if mode == "w" then - return o_finder(name, mode, ftype) + return o_finder(name,mode,ftype) else - return i_finder(name, mode, ftype) + return i_finder(name,mode,ftype) end end diff --git a/Master/texmf-dist/tex/context/base/mtx-context-sql.tex b/Master/texmf-dist/tex/context/base/mtx-context-sql.tex new file mode 100644 index 00000000000..16613c2453a --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mtx-context-sql.tex @@ -0,0 +1,64 @@ +%D \module +%D [ file=mtx-context-sql-tables, +%D version=2012.10.19, +%D title=\CONTEXT\ Extra Trickry, +%D subtitle=SQL Tables, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin help +% +% usage: context --extra=sql --tables [options] +% +% --host : hostname (default: localhost) +% --username : username (default: root) +% --password : password +% --database : database of which we want tables +% +% example: context --extra=sql --tables --host=localhost --username=root --password=*** --database=test +% +% end help + +\usemodule + [art-01,sql-tables] + +\setupbodyfont + [10pt] + +\setupheader + [state=high] + +\setuptabulate + [before={\blank[big,samepage]}] + +\starttext + +\startluacode + + require("s-sql-tables") + + local arguments = environment.arguments + + local presets = arguments.presets + local preloaded = presets and table.load(presets) or { } + + local presets = { + host = preloaded.host or arguments.host or "localhost", + username = preloaded.username or arguments.username or "root", + password = preloaded.password or arguments.password or "", + database = preloaded.database or arguments.database or "", + } + + + if arguments.tables then + moduledata.sql.tables.showdefined(presets) + end + +\stopluacode + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/mult-aux.mkiv b/Master/texmf-dist/tex/context/base/mult-aux.mkiv index 43d34e08726..6c44a0ec9d0 100644 --- a/Master/texmf-dist/tex/context/base/mult-aux.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-aux.mkiv @@ -245,9 +245,9 @@ \unexpanded\def\mult_interfaces_install_style_and_color_handler#1#2#3#4% {\unexpanded\def#2##1##2% style color - {\edef\currentstyleparameter{#1{##1}}% this name is public - \edef\currentcolorparameter{#1{##2}}% this name is public + {\edef\currentstyleparameter{#1{##1}}% this name is public (can also set color e.g. in underline) \ifx\currentstyleparameter\empty\else\dousecurrentstyleparameter\fi + \edef\currentcolorparameter{#1{##2}}% this name is public (so we do this after the style switch) \ifx\currentcolorparameter\empty\else\dousecurrentcolorparameter\fi}% \unexpanded\def#3##1% style {\edef\currentstyleparameter{#1{##1}}% this name is public diff --git a/Master/texmf-dist/tex/context/base/mult-def.mkiv b/Master/texmf-dist/tex/context/base/mult-def.mkiv index ec33171da8c..cb165b055d8 100644 --- a/Master/texmf-dist/tex/context/base/mult-def.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-def.mkiv @@ -71,6 +71,7 @@ \def\v!chemicals {chemicals} \def\v!words {words} \def\v!combination {combination} +\def\v!norepeat {norepeat} \def\s!lcgreek {lcgreek} \def\s!ucgreek {ucgreek} diff --git a/Master/texmf-dist/tex/context/base/mult-ini.lua b/Master/texmf-dist/tex/context/base/mult-ini.lua index 5571ee3b948..3b18738debf 100644 --- a/Master/texmf-dist/tex/context/base/mult-ini.lua +++ b/Master/texmf-dist/tex/context/base/mult-ini.lua @@ -307,3 +307,27 @@ function commands.showassignerror(namespace,key,value,line) context.writestatus("setup",formatters["error in line %a, namespace %a, key %a"](line,namespace,key)) end end + +-- a simple helper + +local settings_to_hash = utilities.parsers.settings_to_hash + +local makesparse = function(t) + for k, v in next, t do + if not v or v == "" then + t[k] = nil + end + end + return t +end + +function interfaces.checkedspecification(specification) + local kind = type(specification) + if kind == "table" then + return makesparse(specification) + elseif kind == "string" and specification ~= "" then + return makesparse(settings_to_hash(specification)) + else + return { } + end +end diff --git a/Master/texmf-dist/tex/context/base/mult-ini.mkiv b/Master/texmf-dist/tex/context/base/mult-ini.mkiv index 52f9255c8ec..09fc5daf0ae 100644 --- a/Master/texmf-dist/tex/context/base/mult-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-ini.mkiv @@ -203,7 +203,7 @@ \unexpanded\def\definesystemvariable#1{\expandafter\edef\csname\??prefix#1\endcsname{\@@prefix#1}} \definesystemvariable{ms} - + %D \macros %D {selectinterface, %D defaultinterface, currentinterface, currentresponses} diff --git a/Master/texmf-dist/tex/context/base/mult-low.lua b/Master/texmf-dist/tex/context/base/mult-low.lua index d5848e5c70f..47e31978bfe 100644 --- a/Master/texmf-dist/tex/context/base/mult-low.lua +++ b/Master/texmf-dist/tex/context/base/mult-low.lua @@ -140,6 +140,9 @@ return { "newlanguage", "newfamily", "newfam", "newhelp", -- not used -- "then", + "begcsname", + -- + "strippedcsname", -- "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", @@ -232,11 +235,11 @@ return { -- "wait", "writestatus", "define", "defineexpandable", "redefine", -- - "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", + "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", -- "installcorenamespace", -- - "getvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", + "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", -- @@ -264,7 +267,7 @@ return { "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", -- - "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", + "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", -- "newconstant", "setnewconstant", "newconditional", "settrue", "setfalse", "setconstant", "newmacro", "setnewmacro", "newfraction", diff --git a/Master/texmf-dist/tex/context/base/mult-sys.mkiv b/Master/texmf-dist/tex/context/base/mult-sys.mkiv index c184d91b5c9..f0db9fa6708 100644 --- a/Master/texmf-dist/tex/context/base/mult-sys.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-sys.mkiv @@ -81,6 +81,7 @@ \definesystemconstant {chinese} \definesystemconstant {cn} \definesystemconstant {japanese} \definesystemconstant {ja} \definesystemconstant {korean} \definesystemconstant {kr} +\definesystemconstant {thai} \definesystemconstant {th} % mojca mentioned it at BT2013 but we need more info %D For proper \UNICODE\ support we need a few font related constants. diff --git a/Master/texmf-dist/tex/context/base/node-inj.lua b/Master/texmf-dist/tex/context/base/node-inj.lua index 3e1687426f4..697370cfb25 100644 --- a/Master/texmf-dist/tex/context/base/node-inj.lua +++ b/Master/texmf-dist/tex/context/base/node-inj.lua @@ -28,6 +28,7 @@ local injections = nodes.injections local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph +local kern_code = nodecodes.kern local nodepool = nodes.pool local newkern = nodepool.kern @@ -147,7 +148,7 @@ local function trace(head) local cb = n[a_cursbase] local cc = n[a_curscurs] local char = n.char - report_injections("font %s, char %U, glyph %c",char,n.font,char) + report_injections("font %s, char %U, glyph %c",n.font,char,char) if kp then local k = kerns[kp] if k[3] then @@ -191,6 +192,25 @@ end -- We can have a fast test on a font being processed, so we can check faster for marks etc -- but I'll make a context variant anyway. +local function show_result(head) + local current = head + local skipping = false + while current do + local id = current.id + if id == glyph_code then + report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset) + skipping = false + elseif id == kern_code then + report_injections("kern: %p",current.kern) + skipping = false + elseif not skipping then + report_injections() + skipping = true + end + current = current.next + end +end + function injections.handler(head,where,keep) local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) if has_marks or has_cursives then @@ -335,32 +355,42 @@ function injections.handler(head,where,keep) local d = mrks[index] if d then local rlmode = d[3] - if rlmode and rlmode >= 0 then - -- new per 2010-10-06, width adapted per 2010-02-03 - -- we used to negate the width of marks because in tfm - -- that makes sense but we no longer do that so as a - -- consequence the sign of p.width was changed - local k = wx[p] - if k then - -- brill roman: A\char"0300 (but ugly anyway) - n.xoffset = p.xoffset - p.width + d[1] - k[2] -- was + p.width + -- + local k = wx[p] + if k then + local x = k[2] + local w = k[4] + if w then + if rlmode and rlmode >= 0 then + -- kern(x) glyph(p) kern(w-x) mark(n) + n.xoffset = p.xoffset - p.width + d[1] - (w-x) + else + -- kern(w-x) glyph(p) kern(x) mark(n) + n.xoffset = p.xoffset - d[1] - x + end else - -- lucida: U\char"032F (default+mark) - n.xoffset = p.xoffset - p.width + d[1] -- 01-05-2011 + if rlmode and rlmode >= 0 then + -- okay for husayni + n.xoffset = p.xoffset - p.width + d[1] + else + -- needs checking: is x ok here? + n.xoffset = p.xoffset - d[1] - x + end end else - local k = wx[p] - if k then - n.xoffset = p.xoffset - d[1] - k[2] + if rlmode and rlmode >= 0 then + n.xoffset = p.xoffset - p.width + d[1] else n.xoffset = p.xoffset - d[1] end end + -- -- if mk[p] then n.yoffset = p.yoffset + d[2] else n.yoffset = n.yoffset + p.yoffset + d[2] end + -- if nofmarks == 1 then break else @@ -381,23 +411,24 @@ function injections.handler(head,where,keep) if next(wx) then for n, k in next, wx do -- only w can be nil (kernclasses), can be sped up when w == nil - local x, w = k[2] or 0, k[4] + local x = k[2] + local w = k[4] if w then local rl = k[1] -- r2l = k[6] local wx = w - x if rl < 0 then -- KE: don't use r2l here if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) + insert_node_before(head,n,newkern(wx)) -- type 0/2 end if x ~= 0 then - insert_node_after (head,n,newkern(x)) + insert_node_after (head,n,newkern(x)) -- type 0/2 end else if x ~= 0 then - insert_node_before(head,n,newkern(x)) + insert_node_before(head,n,newkern(x)) -- type 0/2 end if wx ~= 0 then - insert_node_after(head,n,newkern(wx)) + insert_node_after (head,n,newkern(wx)) -- type 0/2 end end elseif x ~= 0 then @@ -405,7 +436,7 @@ function injections.handler(head,where,keep) -- uses kernclasses between glyphs so we're probably safe (KE has a -- problematic font where marks interfere with rl < 0 in the previous -- case) - insert_node_before(head,n,newkern(x)) + insert_node_before(head,n,newkern(x)) -- a real font kern, type 0 end end end @@ -414,9 +445,9 @@ function injections.handler(head,where,keep) if k ~= 0 then local rln = rl[n] if rln and rln < 0 then - insert_node_before(head,n,newkern(-k)) + insert_node_before(head,n,newkern(-k)) -- type 0/2 else - insert_node_before(head,n,newkern(k)) + insert_node_before(head,n,newkern(k)) -- type 0/2 end end end @@ -424,6 +455,9 @@ function injections.handler(head,where,keep) if not keep then kerns = { } end + -- if trace_injections then + -- show_result(head) + -- end return head, true elseif not keep then kerns, cursives, marks = { }, { }, { } @@ -474,6 +508,9 @@ function injections.handler(head,where,keep) if not keep then kerns = { } end + -- if trace_injections then + -- show_result(head) + -- end return head, true else -- no tracing needed diff --git a/Master/texmf-dist/tex/context/base/node-rul.lua b/Master/texmf-dist/tex/context/base/node-rul.lua index 09300964ed3..953beb18666 100644 --- a/Master/texmf-dist/tex/context/base/node-rul.lua +++ b/Master/texmf-dist/tex/context/base/node-rul.lua @@ -236,7 +236,6 @@ end local a_viewerlayer = attributes.private("viewerlayer") local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but acceptable for this purpose --- check for f and l if f.id ~= glyph_code then -- saveguard ... we need to deal with rules and so (math) return head @@ -259,9 +258,9 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a local method, offset, continue, dy, order, max = d.method, d.offset, d.continue, d.dy, d.order, d.max local rulethickness, unit = d.rulethickness, d.unit local ma, ca, ta = d.ma, d.ca, d.ta - local colorspace = (ma > 0 and ma) or f[a_colorspace] or 1 - local color = (ca > 0 and ca) or f[a_color] - local transparency = (ta > 0 and ta) or f[a_transparency] + local colorspace = ma > 0 and ma or f[a_colorspace] or 1 + local color = ca > 0 and ca or f[a_color] + local transparency = ta > 0 and ta or f[a_transparency] local foreground = order == variables.foreground local e = dimenfactor(unit,fontdata[f.font]) -- what if no glyph node @@ -283,14 +282,11 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a end if method == 0 then -- center offset = 2*offset --- m = (offset+(level-1)*dy+rulethickness)*e/2 m = (offset+(level-1)*dy)*e/2 + rulethickness/2 else m = 0 end for i=1,level do --- local ht = (offset+(i-1)*dy+rulethickness)*e - m --- local dp = -(offset+(i-1)*dy-rulethickness)*e + m local ht = (offset+(i-1)*dy)*e + rulethickness - m local dp = -(offset+(i-1)*dy)*e + rulethickness + m local r = new_rule(w,ht,dp) diff --git a/Master/texmf-dist/tex/context/base/node-rul.mkiv b/Master/texmf-dist/tex/context/base/node-rul.mkiv index 54a43a006a8..640cc54fe6a 100644 --- a/Master/texmf-dist/tex/context/base/node-rul.mkiv +++ b/Master/texmf-dist/tex/context/base/node-rul.mkiv @@ -12,6 +12,7 @@ %C details. % todo: ex and and em traveling with attribute +% todo: this will move to typo-rul + ctxcommands \writestatus{loading}{ConTeXt Core Macros / Bars} @@ -153,6 +154,9 @@ \unexpanded\def\stopbar {\endgroup} +\unexpanded\def\setbar[#1]% + {\node_rules_set{#1}} + % ungrouped \newcount\c_node_rules_nesting % todo: same as colors diff --git a/Master/texmf-dist/tex/context/base/pack-rul.mkiv b/Master/texmf-dist/tex/context/base/pack-rul.mkiv index 7b040a40038..f2b332b14c8 100644 --- a/Master/texmf-dist/tex/context/base/pack-rul.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-rul.mkiv @@ -567,7 +567,7 @@ {\anch_mark_region_box\b_framed_normal} \def\pack_framed_add_background - {\setbox\b_framed_normal\hbox % was vbox + {\setbox\b_framed_normal\hbox % was vbox % see also *1* {%\pack_framed_forgetall % can be relaxed \boxmaxdepth\maxdimen \framedbackgroundoffset\d_framed_backgroundoffset @@ -1510,20 +1510,43 @@ % \framed[width=2cm,align=middle,location=middle] {location\\equals\\middle} % B} -\installframedlocator \v!hanging % best with strut=no +% \installframedlocator \v!hanging % best with strut=no +% {} +% {\dp\b_framed_normal\ht\b_framed_normal +% \ht\b_framed_normal\zeropoint} +% +% \installframedlocator \v!depth +% {} +% {\ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax +% \dp\b_framed_normal\strutdp +% \box\b_framed_normal} +% +% \installframedlocator \v!height +% {} +% {\dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax +% \ht\b_framed_normal\strutht +% \box\b_framed_normal} + +\installframedlocator \v!hanging % best with strut=no *1* / see mail to list by SB {} - {\dp\b_framed_normal\ht\b_framed_normal - \ht\b_framed_normal\zeropoint} + {\scratchdimen\ht\b_framed_normal + \setbox\b_framed_normal\hbox{\lower\scratchdimen\box\b_framed_normal}% + \dp\b_framed_normal\scratchdimen + \ht\b_framed_normal\zeropoint + \box\b_framed_normal} -\installframedlocator \v!depth +\installframedlocator \v!depth % *1* {} - {\ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax + {\setbox\b_framed_normal\hbox{\lower\strutdp\box\b_framed_normal}% + \ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax \dp\b_framed_normal\strutdp \box\b_framed_normal} -\installframedlocator \v!height +\installframedlocator \v!height % *1* {} - {\dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax + {\scratchdimen\dimexpr \ht\b_framed_normal - \strutht \relax + \setbox\b_framed_normal\hbox{\lower\scratchdimen\box\b_framed_normal}% + \dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax \ht\b_framed_normal\strutht \box\b_framed_normal} diff --git a/Master/texmf-dist/tex/context/base/page-lay.mkiv b/Master/texmf-dist/tex/context/base/page-lay.mkiv index bbe60eec5e2..c0d897522e8 100644 --- a/Master/texmf-dist/tex/context/base/page-lay.mkiv +++ b/Master/texmf-dist/tex/context/base/page-lay.mkiv @@ -1417,8 +1417,9 @@ \definepapersize [S5] [\c!width=500pt,\c!height=375pt] \definepapersize [S6] [\c!width=600pt,\c!height=450pt] \definepapersize [S8] [\c!width=800pt,\c!height=600pt] -\definepapersize [SW] [\c!width=800pt,\c!height=450pt] -\definepapersize [SM] [\c!width=720pt,\c!height=450pt] +\definepapersize [SL] [\c!width=640pt,\c!height=400pt] % low +\definepapersize [SM] [\c!width=720pt,\c!height=450pt] % medium +\definepapersize [SW] [\c!width=800pt,\c!height=450pt] % wide \definepapersize [HD] [\c!width=1920pt,\c!height=1080pt] \definepapersize [HD+] [\c!width=1920pt,\c!height=1200pt] diff --git a/Master/texmf-dist/tex/context/base/page-mix.lua b/Master/texmf-dist/tex/context/base/page-mix.lua index c2cd74b99cc..cf009478736 100644 --- a/Master/texmf-dist/tex/context/base/page-mix.lua +++ b/Master/texmf-dist/tex/context/base/page-mix.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['page-mix'] = { +if not modules then modules = { } end modules ["page-mix"] = { version = 1.001, comment = "companion to page-mix.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -122,9 +122,11 @@ local function appendinserts(ri,inserts) end local function discardtopglue(current,discarded) + local size = 0 while current do local id = current.id if id == glue_code then + size = size + current.spec.width discarded[#discarded+1] = current current = current.next elseif id == penalty_code then @@ -134,6 +136,7 @@ local function discardtopglue(current,discarded) while current do local id = current.id if id == glue_code then + size = size + current.spec.width discarded[#discarded+1] = current current = current.next else @@ -148,7 +151,7 @@ local function discardtopglue(current,discarded) break end end - return current + return current, size end local function stripbottomglue(results,discarded) @@ -160,7 +163,9 @@ local function stripbottomglue(results,discarded) local prev = t.prev if not prev then break - elseif t.id == penalty_code then + end + local id = t.id + if id == penalty_code then if t.penalty == forcedbreak then break else @@ -168,9 +173,13 @@ local function stripbottomglue(results,discarded) r.tail = prev t = prev end - elseif t.id == glue_code then + elseif id == glue_code then discarded[#discarded+1] = t - r.height = r.height - t.spec.width + local width = t.spec.width + if trace_state then + report_state("columns %s, discarded bottom glue %p",i,width) + end + r.height = r.height - width r.tail = prev t = prev else @@ -205,6 +214,7 @@ local function setsplit(specification) -- a rather large function local originalwidth = specification.originalwidth or list.width local originalheight = specification.originalheight or list.height local current = head + local skipped = 0 local height = 0 local depth = 0 local skip = 0 @@ -243,17 +253,18 @@ local function setsplit(specification) -- a rather large function delta = 0, } end - local column = 1 - local result = results[column] + local column = 1 + local line = 0 + local result = results[column] local lasthead = nil - local rest = nil + local rest = nil local function gotonext() if head == lasthead then if trace_state then report_state("empty column %s, needs more work",column) end rest = current - return false + return false, 0 else lasthead = head result.head = head @@ -265,74 +276,69 @@ local function setsplit(specification) -- a rather large function result.height = height result.depth = depth end - head = current - height = 0 - depth = 0 - skip = 0 + head = current + height = 0 + depth = 0 if column == nofcolumns then column = 0 -- nicer in trace rest = head -- lasthead = head - return false + return false, 0 else + local skipped column = column + 1 result = results[column] - current = discardtopglue(current,discarded) + current, skipped = discardtopglue(current,discarded) head = current -- lasthead = head - return true + return true, skipped end end - local function checked(advance) - local total = skip + height + depth + advance - local delta = total - target - if trace_detail then - local currentcolumn = column - local state - if delta > threshold then - result.delta = delta - if gotonext() then - state = "next" - else - state = "quit" - end + local function checked(advance,where) + local total = skip + height + depth + advance + local delta = total - target + local state = "same" + local okay = false + local skipped = 0 + local curcol = column + if delta > threshold then + result.delta = delta + okay, skipped = gotonext() + if okay then + state = "next" else - state = "same" - end - if trace_detail then - report_state("check > column %s, advance %p, total %p, target %p => %a (height %p, depth %p, skip %p)", - currentcolumn,advance,total,target,state,height,depth,skip) - end - return state - else - if delta > threshold then - result.delta = delta - if gotonext() then - return "next" - else - return "quit" - end - else - return "same" + state = "quit" end end + if trace_detail then + report_state("%-7s > column %s, delta %p, threshold %p, advance %p, total %p, target %p, discarded %p => %a (height %p, depth %p, skip %p)", + where,curcol,delta,threshold,advance,total,target,state,skipped,height,depth,skip) + end + return state, skipped + end + current, skipped = discardtopglue(current,discarded) + if trace_detail and skipped ~= 0 then + report_state("check > column 1, discarded %p",skipped) end - current = discardtopglue(current,discarded) head = current while current do local id = current.id local nxt = current.next +local lastcolumn = column if id == hlist_code or id == vlist_code then + line = line + 1 local nxtid = nxt and nxt.id local inserts, currentskips, nextskips, inserttotal = nil, 0, 0, 0 local advance = current.height -- + current.depth if nxt and (nxtid == insert_code or nxtid == mark_code) then nxt, inserts, localskips, insertskips, inserttotal = collectinserts(result,nxt,nxtid) end - local state = checked(advance+inserttotal+currentskips) + local state, skipped = checked(advance+inserttotal+currentskips,"line") if trace_state then - report_state('line > column %s, advance %p, insert %p, height %p, state %a', - column,advance,inserttotal,height,state) + report_state("%-7s > column %s, state %a, line %s, advance %p, insert %p, height %p","line",column,state,line,advance,inserttotal,height) + if skipped ~= 0 then + report_state("%-7s > column %s, discarded %p","line",column,skipped) + end end if state == "quit" then break @@ -352,10 +358,12 @@ local function setsplit(specification) -- a rather large function elseif id == glue_code then local advance = current.spec.width if advance ~= 0 then - local state = checked(advance) + local state, skipped = checked(advance,"glue") if trace_state then - report_state('glue > column %s, advance %p, height %p, state %a', - column,advance,height,state) + report_state("%-7s > column %s, state %a, advance %p, height %p","glue",column,state,advance,height) + if skipped ~= 0 then + report_state("%-7s > column %s, discarded %p","glue",column,skipped) + end end if state == "quit" then break @@ -367,10 +375,12 @@ local function setsplit(specification) -- a rather large function elseif id == kern_code then local advance = current.kern if advance ~= 0 then - local state = checked(advance) + local state, skipped = checked(advance,"kern") if trace_state then - report_state('kern > column %s, advance %p, height %p, state %a', - column,advance,height,state) + report_state("%-7s > column %s, state %a, advance %p, height %p, state %a","kern",column,state,advance,height) + if skipped ~= 0 then + report_state("%-7s > column %s, discarded %p","kern",column,skipped) + end end if state == "quit" then break @@ -384,13 +394,20 @@ local function setsplit(specification) -- a rather large function if penalty == 0 then -- don't bother elseif penalty == forcedbreak then - if gotonext() then + local okay, skipped = gotonext() + if okay then if trace_state then report_state("cycle: %s, forced column break (same page)",cycle) + if skipped ~= 0 then + report_state("%-7s > column %s, discarded %p","penalty",column,skipped) + end end else if trace_state then report_state("cycle: %s, forced column break (next page)",cycle) + if skipped ~= 0 then + report_state("%-7s > column %s, discarded %p","penalty",column,skipped) + end end break end @@ -400,7 +417,9 @@ local function setsplit(specification) -- a rather large function -- club and widow and such i.e. resulting penalties (if we care) end end +if lastcolumn == column then nxt = current.next -- can have changed +end if nxt then current = nxt elseif head == lasthead then @@ -554,15 +573,6 @@ function mixedcolumns.getsplit(result,n) return new_glue(result.originalwidth) end - if trace_state then - local id = h.id - if id == hlist_code then - report_state("flush, column %s, top line: %s",n,nodes.toutf(h.list)) - else - report_state("flush, column %s, head node: %s",n,nodecodes[id]) - end - end - h.prev = nil -- move up local strutht = result.strutht local strutdp = result.strutdp @@ -573,19 +583,44 @@ function mixedcolumns.getsplit(result,n) -- local v = vpack(h,"exactly",height) - v.width = result.originalwidth if result.alternative == v_global then -- option result.height = result.maxheight end - v.height = lineheight * math.ceil(result.height/lineheight) - strutdp - v.depth = strutdp + + local ht = 0 + local dp = 0 + local wd = result.originalwidth + + local grid = result.grid + + if grid then + ht = lineheight * math.ceil(result.height/lineheight) - strutdp + dp = strutdp + else + ht = result.height + dp = result.depth + end + + v.width = wd + v.height = ht + v.depth = dp + + if trace_state then + local id = h.id + if id == hlist_code then + report_state("flush, column %s, grid %a, width %p, height %p, depth %p, %s: %s",n,grid,wd,ht,dp,"top line",nodes.toutf(h.list)) + else + report_state("flush, column %s, grid %a, width %p, height %p, depth %p, %s: %s",n,grid,wd,ht,dp,"head node",nodecodes[id]) + end + end for c, list in next, r.inserts do - -- tex.setbox("global",c,vpack(nodes.concat(list))) - -- tex.setbox(c,vpack(nodes.concat(list))) + -- tex.setbox("global",c,vpack(nodes.concat(list))) + -- tex.setbox(c,vpack(nodes.concat(list))) texbox[c] = vpack(nodes.concat(list)) r.inserts[c] = nil end + return v end diff --git a/Master/texmf-dist/tex/context/base/page-mix.mkiv b/Master/texmf-dist/tex/context/base/page-mix.mkiv index a4a9bab0987..abdcced1f0d 100644 --- a/Master/texmf-dist/tex/context/base/page-mix.mkiv +++ b/Master/texmf-dist/tex/context/base/page-mix.mkiv @@ -41,7 +41,7 @@ %D started out in \MKII. One of the complications of a routine is that it needs %D to align nicely when mixed in a single column layout. Instead of using all %D kind of shift juggling in this mechanism we simply switch to grid mode -%D locally. After all, columns don't look nice when not on a grid. As the grid +%D locally. After all, columns don't look nice when not on a. As the grid %D snapper in \MKIV\ is more advanced not that much extra code is needed. %D We use the command handler but the parent settings are not to be changed. @@ -257,7 +257,7 @@ \def\page_mix_enable_grid_snapping {\edef\p_grid{\mixedcolumnsparameter\c!grid}% \ifx\p_grid\empty - % maybe listen to main grid setting + % just follow the default grid settings \else \gridsnappingtrue \setsystemmode\v!grid @@ -513,6 +513,7 @@ threshold = \number\d_page_mix_threshold, balance = "#1", alternative = "\mixedcolumnsparameter\c!alternative", + grid = \ifgridsnapping true\else false\fi, }}% \deadcycles\zerocount} diff --git a/Master/texmf-dist/tex/context/base/phys-dim.mkiv b/Master/texmf-dist/tex/context/base/phys-dim.mkiv index 4efaa65a8a9..3de6b23449d 100644 --- a/Master/texmf-dist/tex/context/base/phys-dim.mkiv +++ b/Master/texmf-dist/tex/context/base/phys-dim.mkiv @@ -159,6 +159,21 @@ \expandafter\high \fi} +% we could use a symbolset but how many symbols are there ? + +% \definesymbol[units][times][\times] +% \definesymbol[units][times][\cdots] + +% \def\digitstimessymbol{\symbol[units][times]} + +% \definesymbol[units][times][\times] +% \definesymbol[units][times][\cdots] +% \definesymbol[units][times][\ifmmode\cdot\else\kern.2\emwidth\cdot\kern.2\emwidth\fi] + +\def\digitstimessymbol{\times} +% \def\digitstimessymbol{\cdot} +% \def\digitstimessymbol{\ifmmode\cdot\else\kern.2\emwidth\cdot\kern.2\emwidth\fi} + \unexpanded\def\digitszeropadding {\hphantom{0}} \unexpanded\def\digitsnegative {\phys_digits_normalized{0}{\phys_digits_raised{\textminus}}} \unexpanded\def\digitspositive {\phys_digits_normalized{0}{\phys_digits_raised{\textplus}}} @@ -170,9 +185,9 @@ \unexpanded\def\digitsseparatorspace{\hphantom{.}} \unexpanded\def\digitssignspace {\hphantom{\digitsminus}} \unexpanded\def\digitshighspace {\hphantom{\digitspositive}} -\unexpanded\def\digitspower #1{\times10\phys_digits_raised{#1}} -\unexpanded\def\digitspowerplus #1{\times10\phys_digits_raised{\digitsplus#1}} -\unexpanded\def\digitspowerminus #1{\times10\phys_digits_raised{\digitsminus#1}} +\unexpanded\def\digitspower #1{\digitstimessymbol10\phys_digits_raised{#1}} +\unexpanded\def\digitspowerplus #1{\digitstimessymbol10\phys_digits_raised{\digitsplus#1}} +\unexpanded\def\digitspowerminus #1{\digitstimessymbol10\phys_digits_raised{\digitsminus#1}} \unexpanded\def\digitsdigit #1{#1} \unexpanded\def\normaldigitscommasymbol {,} @@ -518,15 +533,24 @@ ″\else\phys_units_text_doubleprime\fi\else\phys_units_text_doubleprime \fi} -\unexpanded\def\checkedtextcelsius - {\iffontchar\font"2103\relax\iffontchar\font"2109\relax - ℉\else\phys_units_text_celsius\fi\else\phys_units_text_celsius - \fi} - -\unexpanded\def\checkedtextfahrenheit - {\iffontchar\font"2109\relax\iffontchar\font"2103\relax - ℉\else\phys_units_text_fahrenheit\fi\else\phys_units_text_fahrenheit - \fi} +% \unexpanded\def\checkedtextcelsius +% {\ifmmode +% \phys_units_text_celsius +% \else\iffontchar\font"2103\relax +% ℃\else\phys_units_text_celsius +% \fi\fi} +% +% \unexpanded\def\checkedtextfahrenheit +% {\ifmmode +% \phys_units_text_fahrenheit +% \else\iffontchar\font"2109\relax +% ℉\else\phys_units_text_fahrenheit +% \fi\fi} +% +% % but, as users don't like this ... + +\let\checkedtextcelsius \phys_units_text_celsius +\let\checkedtextfahrenheit\phys_units_text_fahrenheit \setelementnature[unit] [mixed] \setelementnature[quantity][mixed] diff --git a/Master/texmf-dist/tex/context/base/s-art-01.mkiv b/Master/texmf-dist/tex/context/base/s-art-01.mkiv index 046c35cc1e4..e2584a35784 100644 --- a/Master/texmf-dist/tex/context/base/s-art-01.mkiv +++ b/Master/texmf-dist/tex/context/base/s-art-01.mkiv @@ -1,18 +1,36 @@ +\unprotect + \startmodule[art-01] -% \showframe +\definemeasure [article:margin] [\paperheight/15] +\definemeasure [overview:margin] [\paperheight/30] -\unprotect +\definelayout + [article] + [\c!topspace=\measure{article:margin}, + \c!bottomspace=\measure{article:margin}, + \c!backspace=\measure{article:margin}, + \c!header=\measure{overview:margin}, + \c!footer=0pt, + \c!width=\v!middle, + \c!height=\v!middle] -\setuplayout - [\c!topspace=2cm, - \c!bottomspace=2.5cm, + +\definelayout + [overview] + [\c!topspace=\measure{overview:margin}, + \c!bottomspace=\measure{overview:margin}, + \c!backspace=\measure{overview:margin}, + \c!header=\measure{overview:margin}, + \c!footer=0pt, \c!width=\v!middle, - \c!height=\v!middle, - \c!footer=0pt] + \c!height=\v!middle] + +\setuplayout + [article] \setupbodyfont - [dejavu] + [dejavu,10pt] % 12pt is just to large and we use this for all kind of demos \setupwhitespace [\v!big] @@ -37,7 +55,7 @@ \c!after=] \setuplist - [\c!interaction=\v!all] + [\c!interaction=\v!all] \protect diff --git a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv index 0edb19120f9..9b6211c2b57 100644 --- a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv +++ b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +% sort of obsolete + \startluacode local fontdata = fonts.hashes.identifiers diff --git a/Master/texmf-dist/tex/context/base/s-fnt-11.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-11.mkiv deleted file mode 100644 index a91e069ea64..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-11.mkiv +++ /dev/null @@ -1,73 +0,0 @@ -%D \module -%D [ file=s-fnt-11, -%D version=2006.02.01, % or so -%D title=\CONTEXT\ Style File, -%D subtitle=Listing Installed Fonts, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D This code usd to be in the kernel but since it's hardly used -%D it's now a module. -%D -%D \starttyping -%D \showinstalledfonts[officinasans.*][all] -%D \showinstalledfonts[officinaserif.*][all] -%D \showinstalledfonts[officina.*itc.*][all] -%D -%D \showinstalledfonts[officina.*itc.*][all,new] -%D \stoptyping - -\startluacode -function fonts.names.table(pattern,reload,all) - local t = fonts.names.list(pattern,reload) - if t then - local NC, NR, HL = context.NC, context.NR, context.HL - context.start() - context.nonknuthmode() - context.starttabulate { "|T|T|T|T|T|" } - NC(false,hashname) - NC(false,type) - NC(false,fontname) - NC(false,filename) - NC() NR() HL() - for v,tv in table.sortedpairs(t) do - local kind, name, file = tv[1], tv[2], tv[3] - if all or v == string.lower(name) then - if kind and name and file then - NC(false,v) - NC(false,kind) - NC(false,name) - NC(false,file) - NC() NR() - else - logs.report("font table", "skipping %s", v) - end - end - end - context.stoptabulate() - context.stop() - end -end -\stopluacode - -\unprotect - -\def\showinstalledfonts - {\dodoubleempty\doshowinstalledfonts} - -\def\doshowinstalledfonts[#1][#2]% - {\bgroup - \def\pattern{#1}% - \def\all{false}% - \def\reload{false}% - \doifnothing\pattern{\def\pattern{.*}}% - \processallactionsinset[#2][\v!new=>\def\reload{true},\v!all=>\def\all{true}]% - \ctxlua{fonts.names.table("#1",\reload,\all)}% - \egroup} - -\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv deleted file mode 100644 index 17fc5463d86..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv +++ /dev/null @@ -1,290 +0,0 @@ -%D \module -%D [ file=s-fnt-23, -%D version=2009.03.04, -%D title=\CONTEXT\ Style File, -%D subtitle=Tracing Feature Application (3), -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - moduledata.fonts = moduledata.fonts or { } - - local fontdata = fonts.hashes.identifiers - - local last_data = nil -- still relevant - local format = string.format - - function moduledata.fonts.show_shape(n) - local tfmdata = fontdata[font.current()] - -- local _, tfmdata = fonts.definers.define { name = fontname, size = fontsize } - last_data = tfmdata - local charnum = tonumber(n) - if not charnum then - -- charnum = tfmdata.unicodes[n] - charnum = fonts.helpers.nametoslot(n) - end - local c = tfmdata.characters[charnum] - local d = tfmdata.descriptions[charnum] - local parameters = tfmdata.parameters - if d then - local factor = (parameters.size/parameters.units)*((7200/7227)/65536) - local llx, lly, urx, ury = unpack(d.boundingbox) - llx, lly, urx, ury = llx*factor, lly*factor, urx*factor, ury*factor - local width, italic = (d.width or 0)*factor, (d.italic or 0)*factor - local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor - local anchors, math = d.anchors, d.math - context.startMPcode() - context("pickup pencircle scaled .25bp ; ") - context('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum) - context('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury) - context('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0) - context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;') - context("defaultscale := 0.05 ; ") - -- inefficient but non critical - local function slant_1(v,dx,dy,txt,xsign,ysign,loc,labloc) - if #v > 0 then - local l = { } - for kk, vv in ipairs(v) do - local h, k = vv.height, vv.kern - if h and k then - l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy) - end - end - context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1]) - context("draw laddered (%s) withcolor .5white ;",table.concat(l,"..")) - context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l]) - for k, v in ipairs(l) do - context("draw %s withcolor blue withpen pencircle scaled 1bp;",v) - end - end - end - local function slant_2(v,dx,dy,txt,xsign,ysign,loc,labloc) - if #v > 0 then - local l = { } - for kk, vv in ipairs(v) do - local h, k = vv.height, vv.kern - if h and k then - l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy) - end - end - if loc == "top" then - context('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[#l]) - else - context('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1]) - end - for kk, vv in ipairs(v) do - local h, k = vv.height, vv.kern - if h and k then - context('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk]) - end - end - end - end - if math then - local kerns = math.kerns - if kerns then - for _, slant in ipairs { slant_1, slant_2 } do - for k,v in pairs(kerns) do - if k == "top_right" then - slant(v,width+italic,0,k,1,1,"top","ulft") - elseif k == "bottom_right" then - slant(v,width,0,k,1,1,"bot","lrt") - elseif k == "top_left" then - slant(v,0,0,k,-1,1,"top","ulft") - elseif k == "bottom_left" then - slant(v,0,0,k,-1,1,"bot","lrt") - end - end - end - end - end - local function show(x,y,txt) - local xx, yy = x*factor, y*factor - context("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy) - context('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy) - context('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy) - end - if anchors then - local a = anchors.baselig - if a then - for k, v in pairs(a) do - for kk, vv in ipairs(v) do - show(vv[1],vv[2],k .. ":" .. kk) - end - end - end - local a = anchors.mark - if a then - for k, v in pairs(a) do - show(v[1],v[2],k) - end - end - local a = anchors.basechar - if a then - for k, v in pairs(a) do - show(v[1],v[2],k) - end - end - local ba = anchors.centry - if a then - for k, v in pairs(a) do - show(v[1],v[2],k) - end - end - local a = anchors.cexit - if a then - for k, v in pairs(a) do - show(v[1],v[2],k) - end - end - end - if italic ~= 0 then - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury) - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury) - context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury) - context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury) - context('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury) - end - if top_accent ~= 0 then - context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,ury) - context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,ury) - context('label.top("%s",(%s,%s-1bp));',d.top_accent,top_accent,ury) - end - if bot_accent ~= 0 then - context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,lly) - context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury) - context('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly) - end - context('draw origin withcolor red withpen pencircle scaled 1bp;') - context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;") - context("currentpicture := currentpicture scaled 8 ;") - context.stopMPcode() - elseif c then - local factor = (7200/7227)/65536 - context.startMPcode() - context("pickup pencircle scaled .25bp ; ") - context('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum) - context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;') - context("defaultscale := 0.05 ; ") - local italic, top_accent, bot_accent = (c.italic or 0)*factor, (c.top_accent or 0)*factor, (c.bot_accent or 0)*factor - local width, height, depth = (c.width or 0)*factor, (c.height or 0)*factor, (c.depth or 0)*factor - local ury = height - if italic ~= 0 then - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury) - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury) - context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,height) - context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,height) - context('label.rt("%6.3f bp",(%s-2bp,%s-1bp));',italic,width+italic,height) - end - if top_accent ~= 0 then - context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,height) - context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,height) - context('label.top("%6.3f bp",(%s,%s-1bp));',top_accent,top_accent,height) - end - if bot_accent ~= 0 then - context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,height) - context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,height) - context('label.bot("%6.3f bp",(%s,%s+1bp));',bot_accent,bot_accent,height) - end - context('draw origin withcolor red withpen pencircle scaled 1bp;') - context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;") - context("currentpicture := currentpicture scaled 8 ;") - context.stopMPcode() - else - context("no such shape: %s",n) - end - end - - function moduledata.fonts.show_all_shapes() - local tfmdata = fontdata[font.current()] - -- local _, tfmdata = fonts.definers.define { name = fontname, size = fontsize } - last_data = tfmdata - local unicodes, descriptions = tfmdata.unicodes, tfmdata.descriptions - for unicode, description in fonts.iterators.descriptions(tfmdata) do - local name = description.name - context.StartShowGlyphShape(unicode) - moduledata.fonts.show_shape(unicode) - context.StopShowGlyphShape() - end - end - - function moduledata.fonts.show_shape_field(unicode,name) - local tfmdata = last_data or fontdata[font.current()] - -- local _, tfmdata = fonts.definers.define { name = fontname, size = fontsize } - local d = tfmdata.descriptions[unicode] - if d then - if name == "unicode" then - context("U+%04X",unicode) - else - d = d[name] - if d then - context(d) - end - end - end - end -\stopluacode - -% we can move all to lua (cld) - -\def\GetGlyphField#1#2% - {\ctxlua{moduledata.fonts.show_shape_field(#1,"#2")}} - -\def\StartShowGlyphShape#1% - {\startTEXpage - \nonknuthmode % default anyway - \def\GlyphUnicode{#1}} - -\def\StopShowGlyphShape - {\par - \midaligned{\tttf\setstrut\strut\GetGlyphField\GlyphUnicode{unicode}: \GetGlyphField\GlyphUnicode{name}}% - \stopTEXpage} - -\def\ShowGlyphShape#1#2#3% name size glyph - {\begingroup - \definedfont[#1 at #2]% - \obeyMPboxdepth - \ctxlua{moduledata.fonts.show_shape("#3")}% - \endgroup} - -\def\ShowAllGlyphShapes#1#2% name size - {\begingroup - \nonknuthmode % default anyway - \definedfont[#1 at #2]% - \ctxlua{moduledata.fonts.show_all_shapes()}% - \endgroup} - -\setupcolors - [state=start] - -\continueifinputfile{s-fnt-23.mkiv} - -\starttext - -% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x62A} \stopTEXpage -% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x2004} \stopTEXpage -% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0xF0299} \stopTEXpage -% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{NameMe.1190} \stopTEXpage - -% \ShowAllGlyphShapes{simplenaskhi}{100bp} -% \ShowAllGlyphShapes{xits}{100bp} - -\switchtobodyfont[cambria,10pt] - -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math} {40bp}{0x00066}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math} {40bp}{0x1D453}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math} {40bp}{0x1D43F}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D444}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D447}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x02112}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D432}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D43D}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D44A}\stopTEXpage -\startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{100bp}{0x1D45D}\stopTEXpage - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fnt-26.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-26.mkiv deleted file mode 100644 index 904091f0671..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-26.mkiv +++ /dev/null @@ -1,82 +0,0 @@ -%D \module -%D [ file=s-fnt-26, -%D version=2009.10.26, -%D title=\CONTEXT\ Style File, -%D subtitle=Goodies Tables, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - - function document.show_goodies_stylistics(name) - local goodies = fonts.goodies.load(name) - local stylistics = goodies and goodies.stylistics - if stylistics then - local col, row, type = context.NC, context.NR, context.type - context.starttabulate { "|l|pl|" } - col() context("feature") col() context("meaning") col() row() - for feature, meaning in table.sortedpairs(stylistics) do - col() type(feature) col() type(meaning) col() row() - end - context.stoptabulate() - end - end - - function document.show_goodies_featuresets(name) - local goodies = fonts.goodies.load(name) - local featuresets = goodies and goodies.featuresets - if featuresets then - local col, row, type = context.NC, context.NR, context.type - context.starttabulate { "|l|pl|" } - col() context("featureset") col() context("definitions") col() row() - for featureset, definitions in table.sortedpairs(featuresets) do - col() type(featureset) col() - for k, v in table.sortedpairs(definitions) do - type(string.format("%s=%s",k,tostring(v))) - context.quad() - end - col() row() - end - context.stoptabulate() - end - end - - function document.show_goodies_colorschemes(name) - local goodies = fonts.goodies.load(name) - local colorschemes = goodies and goodies.colorschemes - if colorschemes then - local col, row, type = context.NC, context.NR, context.type - context.starttabulate { "|l|pl|" } - col() context("colorscheme") col() context("numbers") col() row() - for colorscheme, numbers in table.sortedpairs(colorschemes) do - col() type(colorscheme) col() - for i=1,#numbers do - type(i) - context.quad() - end - col() row() - end - context.stoptabulate() - end - end - -\stopluacode - -\def\showgoodiesstylistics #1{\ctxlua{document.show_goodies_stylistics ("#1")}} -\def\showgoodiesfeaturesets #1{\ctxlua{document.show_goodies_featuresets ("#1")}} -\def\showgoodiescolorschemes#1{\ctxlua{document.show_goodies_colorschemes("#1")}} - -\continueifinputfile{s-fnt-26.mkiv} - -\starttext - - \showgoodiesstylistics {husayni} - \showgoodiesfeaturesets {husayni} - \showgoodiescolorschemes{husayni} - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv deleted file mode 100644 index 778a4c39000..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv +++ /dev/null @@ -1,46 +0,0 @@ -%D \module -%D [ file=s-fnt-28, -%D version=2010.09.22, -%D title=\CONTEXT\ Style File, -%D subtitle=Tracing Names, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - function fonts.tracers.files(goodyfile) - local goodies = fonts.goodies.load(goodyfile) - if goodies then - local files = goodies.files - if files and files.list then - for filename, specification in table.sortedpairs(files.list) do - context.start() - context.dontleavehmode() - context.definedfont{ filename .. "*default" } - context("%s-%s-%s-%s-%s", - specification.name or files.name, - specification.weight or "normal", - specification.style or "normal", - specification.width or "normal", - specification.variant or "normal") - context.par() - context.stop() - end - end - end - end -\stopluacode - -\continueifinputfile{s-fnt-28.mkiv} - -\starttext - - \loadfontgoodies[antykwapoltawskiego] - - \ctxlua{fonts.tracers.files("antykwapoltawskiego")} - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv deleted file mode 100644 index f9e0a165879..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv +++ /dev/null @@ -1,71 +0,0 @@ -%D \module -%D [ file=s-fnt-29, -%D version=2010.09.27, -%D title=\CONTEXT\ Style File, -%D subtitle=Tracing Shapes, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - - local fontdata = fonts.hashes.identifiers - - function fonts.tracers.shapes() -- todo: ranges - local NC, NR = context.NC, context.NR - local char = context.char - local chrs = fontdata[font.current()].characters - -- local desc = fontdata[font.current()].descriptions - context.starttabulate { "|l|c|c|c|c|l|" } - context.FL() - NC() context("unicode") - NC() context("glyph") - NC() context("shape") - NC() context("lower") - NC() context("upper") - -- NC() context("name") - NC() context("description") - NC() NR() - context.TL() - for k, v in next, characters.data do - if chrs[k] then - NC() context("0x%05X",k) - NC() char(k) - NC() char(v.shcode) - NC() char(v.lccode or k) - NC() char(v.uccode or k) - -- NC() context(desc[k].name) - NC() context(v.description) - NC() NR() - end - end - context.stoptabulate() - end - -\stopluacode - -\continueifinputfile{s-fnt-29.mkiv} - -\setupbodyfont[dejavu,tt,9pt] - -\setuplayout - [backspace=1cm, - topspace=1cm, - footer=1cm, - header=0cm, - height=middle, - width=middle] - -\setupfootertexts - [] - [\fontname\font\quad\pagenumber] - -\starttext - - \ctxlua{fonts.tracers.shapes()} - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fnt-30.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-30.mkiv deleted file mode 100644 index 1de27aed378..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-30.mkiv +++ /dev/null @@ -1,54 +0,0 @@ -%D \module -%D [ file=s-fnt-30, -%D version=2006.05.10, % abou tthen, quite old already -%D title=\CONTEXT\ Style File, -%D subtitle=Showing Character Data, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -% begin info -% -% title : show character data -% -% comment : show some info about characters in the character database -% status : experimental, used for luatex testing -% -% end info - -\startluacode -function document.show_character_data(n) - local n = characters.number(n) - local d = characters.data[n] - local NC, NR = context.NC, context.NR - if d then - local function entry(label,name) - NC() context(label) - NC() context(d[name]) - NC() NR() - end - context.starttabulate { "|Tl|Tl|]" } - entry("unicode index" , "unicodeslot") - entry("context name" , "contextname") - entry("adobe name" , "adobename") - entry("category" , "category") - entry("description" , "description") - entry("uppercase code", "uccode") - entry("lowercase code", "lccode") - entry("specials" , "specials") - context.stoptabulate() - end -end -\stopluacode - -\def\ShowCharacterData#1% - {\ctxlua{document.show_character_data(#1)}} - -% \ShowCharacterData{123} -% \ShowCharacterData{0x7B} - -% \dostepwiserecurse{`A}{`Z}{1}{\ShowCharacterData{#1}} diff --git a/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv deleted file mode 100644 index 24f7f2d7e50..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv +++ /dev/null @@ -1,180 +0,0 @@ -%D \module -%D [ file=s-fnt-31, -%D version=2011.01.02, % about -%D title=\CONTEXT\ Style File, -%D subtitle=Comparing Fonts, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -% begin info -% -% title : compare glyphs in fonts -% -% comment : show glyphs in several fonts alongside in order to to compare coverage -% status : experimental, used for luatex testing -% -% end info - -\startluacode - -local format, upper, find = string.format, string.upper, string.find -local chardata = characters.data - -function fonts.tracers.coverage(fontfiles,pattern) -- todo: patterns - - local present, names = { }, { } - local pattern = pattern and upper(pattern) - - for i=1,#fontfiles do - local fontname = format("testfont-%s",i) - local fontfile = fontfiles[i] - local fontsize = tex.dimen.bodyfontsize - local id, fontdata = fonts.definers.define { - name = fontfile, - size = fontsize, - cs = fontname, - } - for k, v in next, fontdata.characters do - present[k] = true - end - names[i] = fontname - end - - local t = { } - - context.starttabulate {"|Tr" .. string.rep("|l",#names) .. "|" } - for i=1,#fontfiles do - local file = fontfiles[i] - t[#t+1] = i .. "=" .. file - context.NC() - context(i) - context.NC() - context.type(file) - context.NC() - context.NR() - end - context.stoptabulate() - - context.setupfootertexts { - table.concat(t," ") - } - - context.starttabulate {"|Tl" .. string.rep("|c",#names) .. "|Tl|" } - context.NC() - context.type("unicode") - context.NC() - for i=1,#names do - context.type(i) - context.NC() - end - context.type("description") - context.NC() - context.NR() - context.HL() - for k, v in table.sortedpairs(present) do - local description = chardata[k].description - if not pattern or (pattern == k) or (description and find(description,pattern)) then - context.NC() - context(format("%05X",k)) - context.NC() - for i=1,#names do - context.getvalue(names[i]) - context.char(k) - context.NC() - end - context(description) - context.NC() - context.NR() - end - end - context.stoptabulate() - -end - -\stopluacode - -\continueifinputfile{s-fnt-31.mkiv} - -\setupbodyfont[10pt] - -\setupfootertexts - [style=\ttx] - -\setuplayout - [backspace=1cm, - topspace=1cm, - footer=1cm, - header=0cm, - height=middle, - width=middle] - -\starttext - -% \startluacode -% fonts.tracers.coverage { -% "pirat.ttf", -% } -% \stopluacode - -% \startluacode -% fonts.tracers.coverage { -% -- "cambria.ttf", -% "lbr.afm", -% "LucidaBrightRegular.ttf", -% "lbi.afm", -% "LucidaBrightItalic.ttf", -% "lbd.afm", -% "LucidaBrightDemiBold.ttf", -% "lbdi.afm", -% "LucidaBrightDemiItalic.ttf", -% } -% \stopluacode - -% \startluacode -% fonts.tracers.coverage ( { -% "LucidaBrightRegular.ttf", -% "cambria.ttf", -% "iwona-regular.otf", -% "texgyrepagella-regular.otf", -% "texgyretermes-regular.otf", -% "texgyrebonum-regular.otf", -% "antpolt-regular.otf", -% }, "OGONEK") -% \stopluacode - -% \loadfontgoodies[lucida-math] -% \loadfontgoodies[lm-math] - -% \startluacode -% fonts.tracers.coverage { -% "LucidaBrightRegular.ttf", -% "LucidaBrightOne@lucida-math", -% "cambria.ttc(Cambria Math)", -% "xits-math.otf", -% "LMMath10-Regular@lmroman10-math", -% } -% \stopluacode - -% \loadfontgoodies[px-math] -% \loadfontgoodies[lm-math] - -\startluacode - fonts.tracers.coverage { - "cambria.ttc(Cambria Math)", - "xits-math.otf", - "stixmath-regular.otf", - -- "lmmath-regular", - -- "LMMath10-Regular@lmroman10-math", - -- "pxmath@px-math", - -- "lucida-math.otf", - -- "lucida-math-demi.otf", - -- "LinLibertine_Re-4.7.5.otf", - } -\stopluacode - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv deleted file mode 100644 index 20a939a9771..00000000000 --- a/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv +++ /dev/null @@ -1,60 +0,0 @@ -%D \module -%D [ file=s-fnt-31, -%D version=2011.05.12, -%D title=\CONTEXT\ Style File, -%D subtitle=Unicode Math Scripts, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - function fonts.tracers.mathscripts() - context.starttabulate { "|cT|c|cT|c|c|l|" } - for k, v in table.sortedpairs(table.merged(characters.superscripts,characters.subscripts)) do - local ck = utf.char(k) - local cv = utf.char(v) - local ss = characters.superscripts[k] and "^" or "_" - context.NC() context("U+%05X",k) - context.NC() context(ck) - context.NC() context("U+%05X",v) - context.NC() context(cv) - context.NC() context("$x%s = x%s%s$",ck,ss,cv) - context.NC() context(string.lower(characters.data[k].description)) - context.NC() context.NR() - end - context.stoptabulate() - end -\stopluacode - -\continueifinputfile{s-fnt-32.mkiv} - -\setupbodyfont[dejavu,10pt] - -% \enabletrackers[math.normalizing] -% \setupbackend[export=yes] - -\setuplayout - [backspace=1cm, - topspace=1cm, - footer=1cm, - header=0cm, - height=middle, - width=middle] - -\starttext - -\startbuffer -$e=mc²$ ${}²$ $²$ $x²ᶞ$ $x⁽²⁺²⁼²⁺²⁾$ $x²⁺²⁼²⁺²$ $x₅²$ $x²₅²$ -\stopbuffer - -\typebuffer \getbuffer - -\startluacode - fonts.tracers.mathscripts() -\stopluacode - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua new file mode 100644 index 00000000000..db47e57c43f --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua @@ -0,0 +1,113 @@ +if not modules then modules = { } end modules ['s-fonts-coverage'] = { + version = 1.001, + comment = "companion to s-fonts-coverage.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.coverage = moduledata.fonts.coverage or { } + +local upper, format = string.upper, string.format +local lpegmatch = lpeg.match +local concat = table.concat + +local context = context +local NC, NR, HL = context.NC, context.NR, context.HL +local char, bold, getvalue = context.char, context.bold, context.getvalue + +local chardata = characters.data + +function moduledata.fonts.coverage.showcomparison(specification) + + specification = interfaces.checkedspecification(specification) + + local fontfiles = utilities.parsers.settings_to_array(specification.list or "") + local pattern = upper(specification.pattern or "") + + local present = { } + local names = { } + local files = { } + + if not pattern then + -- skip + elseif pattern == "" then + pattern = nil + elseif tonumber(pattern) then + pattern = tonumber(pattern) + else + pattern = lpeg.oneof(utilities.parsers.settings_to_array(pattern)) + pattern = (1-pattern)^0 * pattern + end + + for i=1,#fontfiles do + local fontname = format("testfont-%s",i) + local fontfile = fontfiles[i] + local fontsize = tex.dimen.bodyfontsize + local id, fontdata = fonts.definers.define { + name = fontfile, + size = fontsize, + cs = fontname, + } + if id and fontdata then + for k, v in next, fontdata.characters do + present[k] = true + end + names[#names+1] = fontname + files[#files+1] = fontfile + end + end + + local t = { } + + context.starttabulate { "|Tr" .. string.rep("|l",#names) .. "|" } + for i=1,#files do + local file = files[i] + t[#t+1] = i .. "=" .. file + NC() + context(i) + NC() + context(file) + NC() + NR() + end + context.stoptabulate() + + context.setupfootertexts { + table.concat(t," ") + } + + context.starttabulate { "|Tl" .. string.rep("|c",#names) .. "|Tl|" } + NC() + bold("unicode") + NC() + for i=1,#names do + bold(i) + NC() + end + bold("description") + NC() + NR() + HL() + for k, v in table.sortedpairs(present) do + if k > 0 then + local description = chardata[k].description + if not pattern or (pattern == k) or (description and lpegmatch(pattern,description)) then + NC() + context("%05X",k) + NC() + for i=1,#names do + getvalue(names[i]) + char(k) + NC() + end + context(description) + NC() + NR() + end + end + end + context.stoptabulate() + +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-coverage.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-coverage.mkiv new file mode 100644 index 00000000000..c09d943bcca --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-coverage.mkiv @@ -0,0 +1,131 @@ +%D \module +%D [ file=s-fonts-coverage, % s-fnt-31 +%D version=2011.01.02, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Fonts Coverage, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin info +% +% title : compare glyphs in fonts +% +% comment : show glyphs in several fonts alongside in order to to compare coverage +% status : experimental, used for luatex testing +% +% end info + +\startmodule[fonts-coverage] + +\registerctxluafile{s-fonts-coverage}{} + +\installmodulecommandluasingle \showfontcomparison {moduledata.fonts.coverage.showcomparison} + +\stopmodule + +\continueifinputfile{s-fonts-coverage.mkiv} + +\usemodule[art-01] + +\starttext + + \showfontcomparison + [list={texgyrepagella-regular.otf,texgyretermes-regular.otf,texgyrebonum-regular.otf}, + pattern=ogonek] + + \page + + % $e=mc²$ ${}²$ $²$ $x²ᶞ$ $x⁽²⁺²⁼²⁺²⁾$ $x²⁺²⁼²⁺²$ $x₅²$ $x²₅²$ + + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = { + % "texgyrepagella-math.otf", + % "texgyretermes-math.otf", + % "texgyrebonum-math.otf", + % } + % } + % \stopluacode + + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = "pirat.ttf", + % } + % \stopluacode + + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = { + % "lucidabrightot.otf", + % "cambria.ttf", + % "iwona-regular.otf", + % "texgyrepagella-regular.otf", + % "texgyretermes-regular.otf", + % "texgyrebonum-regular.otf", + % "antpolt-regular.otf", + % }, + % pattern = "OGONEK" + % } + % \stopluacode + + % \loadfontgoodies[lucida-math] + % \loadfontgoodies[lm-math] + % + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = { + % "LucidaBrightRegular.ttf", + % "LucidaBrightOne@lucida-math", + % "cambria.ttc(Cambria Math)", + % "xits-math.otf", + % "LMMath10-Regular@lmroman10-math", + % }, + % } + % \stopluacode + + % \loadfontgoodies[px-math] + % \loadfontgoodies[lm-math] + % + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = { + % "cambria.ttc(Cambria Math)", + % "xits-math.otf", + % -- "stixmath-regular.otf", + % "latinmodern-math.otf", + % -- "lucidabrightmathot.otf", + % -- "lucidabrightmathot-demi.otf", + % "texgyrepagella-math.otf", + % "texgyretermes-math.otf", + % "texgyrebonum-math.otf", + % -- "LMMath10-Regular@lmroman10-math", + % -- "pxmath@px-math", + % -- "txmath@tx-math", + % }, + % } + % \stopluacode + + % \startluacode + % moduledata.fonts.coverage.showcomparison { + % list = { + % "dejavuserif.ttf", + % "dejavusans.ttf", + % "dejavusansmono.ttf", + % "lucidabrightot.otf", + % "cambria.ttf", + % "iwona-regular.otf", + % "texgyrepagella-regular.otf", + % "texgyretermes-regular.otf", + % "texgyrebonum-regular.otf", + % "antpolt-regular.otf", + % }, + % pattern = "CELSIUS,FAHRENHEIT" + % } + % \stopluacode + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-features.lua b/Master/texmf-dist/tex/context/base/s-fonts-features.lua new file mode 100644 index 00000000000..0a7cf8b132c --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-features.lua @@ -0,0 +1,161 @@ +if not modules then modules = { } end modules ['s-fonts-features'] = { + version = 1.001, + comment = "companion to s-fonts-features.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.features = moduledata.fonts.features or { } + +-- for the moment only otf + +local sortedhash = table.sortedhash + +local NC, NR, bold = context.NC, context.NR, context.bold + +function moduledata.fonts.features.showused(specification) + + specification = interfaces.checkedspecification(specification) + + -- local list = utilities.parsers.settings_to_set(specification.list or "all") + + context.starttabulate { "|T|T|T|T|T|" } + + context.HL() + + NC() bold("feature") + NC() + NC() bold("description") + NC() bold("value") + NC() bold("internal") + NC() NR() + + context.HL() + + local usedfeatures = fonts.handlers.otf.statistics.usedfeatures + local features = fonts.handlers.otf.tables.features + local descriptions = fonts.handlers.otf.features.descriptions + + for feature, keys in sortedhash(usedfeatures) do + -- if list.all or (list.otf and rawget(features,feature)) or (list.extra and rawget(descriptions,feature)) then + local done = false + for k, v in sortedhash(keys) do + if done then + NC() + NC() + NC() + elseif rawget(descriptions,feature) then + NC() context(feature) + NC() context("+") -- extra + NC() context(descriptions[feature]) + done = true + elseif rawget(features,feature) then + NC() context(feature) + NC() -- otf + NC() context(features[feature]) + done = true + else + NC() context(feature) + NC() context("-") -- unknown + NC() + done = true + end + NC() context(k) + NC() context(tostring(v)) + NC() NR() + end + -- end + end + + context.HL() + + context.stoptabulate() + +end + +local function collectkerns(tfmdata,feature) + local combinations = { } + local resources = tfmdata.resources + local characters = tfmdata.characters + local sequences = resources.sequences + local lookuphash = resources.lookuphash + local feature = feature or "kern" + if sequences then + for i=1,#sequences do + local sequence = sequences[i] + if sequence.features and sequence.features[feature] then + local lookuplist = sequence.subtables + if lookuplist then + for l=1,#lookuplist do + local lookupname = lookuplist[l] + local lookupdata = lookuphash[lookupname] + for unicode, data in next, lookupdata do + local kerns = combinations[unicode] + if not kerns then + kerns = { } + combinations[unicode] = kerns + end + for otherunicode, kern in next, data do + if not kerns[otherunicode] and kern ~= 0 then + kerns[otherunicode] = kern + end + end + end + end + end + end + end + end + return combinations +end + +local showkernpair = context.showkernpair + +function moduledata.fonts.features.showbasekerns(specification) + -- assumes that the font is loaded in base mode + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>") + local tfmdata = fonts.hashes.identifiers[id] + local done = false + for unicode, character in sortedhash(tfmdata.characters) do + local kerns = character.kerns + if kerns then + context.par() + for othercode, kern in sortedhash(kerns) do + showkernpair(unicode,kern,othercode) + end + context.par() + done = true + end + end + if not done then + context("no kern pairs found") + context.par() + end +end + +function moduledata.fonts.features.showallkerns(specification) + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>") + local tfmdata = fonts.hashes.identifiers[id] + local allkerns = collectkerns(tfmdata) + local characters = tfmdata.characters + if next(allkerns) then + for first, pairs in sortedhash(allkerns) do + context.par() + for second, kern in sortedhash(pairs) do + -- local kerns = characters[first].kerns + -- if not kerns and pairs[second] then + -- -- weird + -- end + showkernpair(first,kern,second,0) + end + context.par() + end + else + context("no kern pairs found") + context.par() + end +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-features.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-features.mkiv new file mode 100644 index 00000000000..8982f734747 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-features.mkiv @@ -0,0 +1,82 @@ +%D \module +%D [ file=s-fonts-features, % was s-fnt-41, s-fnt-27 +%D version=2012.11.27, % 2010.02.22 +%D title=\CONTEXT\ Style File, +%D subtitle=Features, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[s-fonts-features] + +\registerctxluafile{s-fonts-features}{} + +\installmodulecommandluasingle \showusedfeatures {moduledata.fonts.features.showused} +\installmodulecommandluasingle \showallkerns {moduledata.fonts.features.showallkerns} +\installmodulecommandluasingle \showbasekerns {moduledata.fonts.features.showbasekerns} + +\def\kernpairheight{\strutheight} +\def\kernpairdepth {\strutdepth} +\def\kernpairwidth {\onepoint} + +\unexpanded\def\showkernpair#1#2#3% first second kern + {\dontleavehmode + \hbox \bgroup + \scratchdimen#2\scaledpoint + \kern\fontcharwd\font#1\relax + \ifdim\scratchdimen>\zeropoint + \bgroup + \darkgreen + \vrule width \scratchdimen height \kernpairheight depth \kernpairdepth + \egroup + \kern-\scratchdimen + \else\ifdim\scratchdimen<\zeropoint + \kern\scratchdimen + \bgroup + \darkred + \vrule width -\scratchdimen height \kernpairheight depth \kernpairdepth + \egroup + \else + \kern-.5\dimexpr\kernpairwidth\relax + \bgroup + \darkblue + \vrule width \kernpairwidth height \kernpairheight depth \kernpairdepth + \egroup + \kern-.5\dimexpr\kernpairwidth\relax + \fi\fi + \kern-\fontcharwd\font#1\relax + \char#1\relax + \char#3\relax + \egroup + \space} + +\stopmodule + +\continueifinputfile{s-fonts-features.mkiv} + +\usemodule + [art-01] + +\starttext + + \showusedfeatures \page + + \definefontfeature[default-base][default][mode=base] + + \start + \definedfont[Serif*default-base] + \showbasekerns + \page + \stop + + \start + \bf + \showallkerns + \page + \stop + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-goodies.lua b/Master/texmf-dist/tex/context/base/s-fonts-goodies.lua new file mode 100644 index 00000000000..381fc45eabf --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-goodies.lua @@ -0,0 +1,117 @@ +if not modules then modules = { } end modules['s-fonts-goodies'] = { + version = 1.001, + comment = "companion to s-fonts-goodies.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.goodies = moduledata.fonts.goodies or { } + +local NC, NR, HL = context.NC, context.NR, context.HL + +local function initialized(specification) + specification = interfaces.checkedspecification(specification) + local name = specification.name + if name then + local goodies = fonts.goodies.load(name) + if goodies then + return specification, goodies + end + end +end + +function moduledata.fonts.goodies.showstylistics(specification) + local specification, goodies = initialized(specification) + if goodies then + local stylistics = goodies.stylistics + if stylistics then + context.starttabulate { "|Tl|Tpl|" } + HL() + NC() context.bold("feature") + NC() context.bold("meaning") + NC() NR() + HL() + for feature, meaning in table.sortedpairs(stylistics) do + NC() context(feature) + NC() context(string.lower(meaning)) + NC() NR() + end + HL() + context.stoptabulate() + end + end +end + +function moduledata.fonts.goodies.showfeaturesets(specification) + local specification, goodies = initialized(specification) + if goodies then + local featuresets = goodies.featuresets + if featuresets then + context.starttabulate { "|Tl|Tpl|" } + HL() + NC() context.bold("featureset") + NC() context.bold("definitions") + NC() NR() + HL() + for featureset, definitions in table.sortedpairs(featuresets) do + NC() context.type(featureset) NC() + for k, v in table.sortedpairs(definitions) do + context("%s=%S",k,v) + context.quad() + end + NC() NR() + end + HL() + context.stoptabulate() + end + end +end + +function moduledata.fonts.goodies.showcolorschemes(specification) + local specification, goodies = initialized(specification) + if goodies then + local colorschemes = goodies.colorschemes + if colorschemes then + context.starttabulate { "|Tl|Tpl|" } + HL() + NC() context.bold("colorscheme") + NC() context.bold("numbers") + NC() NR() + HL() + for colorscheme, numbers in table.sortedpairs(colorschemes) do + NC() context.type(colorscheme) NC() + for i=1,#numbers do + context(i) + context.quad() + end + NC() NR() + end + HL() + context.stoptabulate() + end + end +end + +function moduledata.fonts.goodies.showfiles(specification) + local specification, goodies = initialized(specification) + if goodies then + local files = goodies.files + if files and files.list then + for filename, specification in table.sortedpairs(files.list) do + context.start() + context.dontleavehmode() + context.definedfont{ filename .. "*default" } + context("%s-%s-%s-%s-%s", + specification.name or files.name, + specification.weight or "normal", + specification.style or "normal", + specification.width or "normal", + specification.variant or "normal") + context.par() + context.stop() + end + end + end +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-goodies.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-goodies.mkiv new file mode 100644 index 00000000000..f070818251b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-goodies.mkiv @@ -0,0 +1,37 @@ +%D \module +%D [ file=s-fonts-goodies, % s-fnt-26, s-fnt-28 +%D version=2009.10.26, +%D title=\CONTEXT\ Style File, +%D subtitle=Goodies Tables, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D More tables will follow here as we have many more goodies by now. + +\startmodule[s-fonts-goodies] + +\registerctxluafile{s-fonts-goodies}{} + +\installmodulecommandluasingle \showfontgoodiesstylistics {moduledata.fonts.goodies.showstylistics} +\installmodulecommandluasingle \showfontgoodiesfeaturesets {moduledata.fonts.goodies.showfeaturesets} +\installmodulecommandluasingle \showfontgoodiescolorschemes {moduledata.fonts.goodies.showcolorschemes} +\installmodulecommandluasingle \showfontgoodiesfiles {moduledata.fonts.goodies.showfiles} + +\stopmodule + +\continueifinputfile{s-fonts-goodies.mkiv} + +\starttext + + \showfontgoodiesstylistics [name=husayni] \page + \showfontgoodiesfeaturesets [name=husayni] \page + \showfontgoodiescolorschemes[name=husayni] \page + + \showfontgoodiesfiles [name=antykwapoltawskiego] \page + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-missing.lua b/Master/texmf-dist/tex/context/base/s-fonts-missing.lua new file mode 100644 index 00000000000..829fed45f9e --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-missing.lua @@ -0,0 +1,101 @@ +if not modules then modules = { } end modules ['s-fonts-missing'] = { + version = 1.001, + comment = "companion to s-fonts-missing.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.missing = moduledata.fonts.missing or { } + +local function legend(id) + local c = fonts.hashes.identifiers[id] + local privates = c.properties.privates + if privates then + local categories = table.swapped(fonts.loggers.category_to_placeholder) + -- context.starttabulate { "|l|c|c|l|" } + context.starttabulate { "|l|c|l|" } + context.HL() + context.NC() + context.bold("name") + context.NC() + context.bold("symbol") + context.NC() + -- context.bold("node") + -- context.NC() + context.bold("category") + context.NC() + context.NR() + context.HL() + for k, v in table.sortedhash(privates) do + local tag = characters.categorytags[categories[k]] + if tag and tag ~= "" then + context.NC() + context(k) + context.NC() + context.dontleavehmode() + context.char(v) + context.NC() + -- context.dontleavehmode() + -- commands.getprivatechar(k) + -- context.NC() + context(string.lower(tag)) + context.NC() + context.NR() + end + end + context.HL() + context.stoptabulate() + end +end + +function moduledata.fonts.missing.showlegend(specification) + specification = interfaces.checkedspecification(specification) + context.begingroup() + context.definedfont { "Mono*missing" } -- otherwise no privates added + context(function() legend(specification.id or font.current()) end) + context.endgroup() +end + +local function missings() + local collected = fonts.checkers.getmissing() + for filename, list in table.sortedhash(collected) do + if #list > 0 then + context.starttabulate { "|l|l|" } + context.NC() + context.bold("filename") + context.NC() + context(file.basename(filename)) + context.NC() + context.NR() + context.NC() + context.bold("missing") + context.NC() + context(#list) + context.NC() + context.NR() + context.stoptabulate() + context.starttabulate { "|l|c|l|" } + for i=1,#list do + local u = list[i] + context.NC() + context("%U",u) + context.NC() + context.char(u) + context.NC() + context(characters.data[u].description) + context.NC() + context.NR() + end + context.stoptabulate() + end + end +end + +function moduledata.fonts.missing.showcharacters(specification) + context.begingroup() + context.definedfont { "Mono*missing" } -- otherwise no privates added + context(function() missings() end) + context.endgroup() +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-missing.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-missing.mkiv index ef45383a01a..6acef819ed7 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-missing.mkiv +++ b/Master/texmf-dist/tex/context/base/s-fonts-missing.mkiv @@ -11,59 +11,32 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\startluacode - - moduledata.fonts = moduledata.fonts or { } - moduledata.fonts.tracers = moduledata.fonts.tracers or { } - moduledata.fonts.tracers.missing = moduledata.fonts.tracers.missing or { } - - function moduledata.fonts.tracers.missing.legend() - local c = fonts.hashes.identifiers[font.current()] - local p = c.properties.privates - if p then - context.starttabulate { "|Tl|c|c|" } - context.NC() - context.bold("name") - context.NC() - context.bold("character") - context.NC() - context.bold("node") - context.NC() - context.NR() - for k, v in table.sortedhash(p) do - context.NC() - context(k) - context.NC() - context.dontleavehmode() - context.char(v) - context.NC() - context.dontleavehmode() - commands.getprivatechar(k) - context.NC() - context.NR() - end - context.stoptabulate() - end - end +\startmodule[s-fonts-missing] -\stopluacode +\registerctxluafile{s-fonts-missing}{} -\def\ModuleFontsTracersMissingLegend - {\ctxlua{moduledata.fonts.tracers.missing.legend()}} +\installmodulecommandluasingle \showmissingcharacterslegend {moduledata.fonts.missing.showlegend} +\installmodulecommandluasingle \showmissingcharacters {moduledata.fonts.missing.showcharacters} + +\stopmodule \continueifinputfile{s-fonts-missing.mkiv} -\enabletrackers[fonts.missing=replace] % the sooner, the more efficient +% the sooner, the more efficient, see log for details -% \usemodule[art-01] +\enabletrackers[fonts.missing=replace] % \definefontfeature[default][default][missing=yes] % automatically when enabled \starttext - \ModuleFontsTracersMissingLegend + \page legend: \blank + + \showmissingcharacterslegend - ½ ⅓ ¼ ⅕ ⅙ ⅛ + \page sample: \blank + + ½ ⅓ ¼ ⅕ ⅙ ⅛ {\bf ½ ⅓ ¼ ⅕ ⅙ ⅛} \blank \startluacode for i=1,1000 do @@ -75,5 +48,9 @@ end \stopluacode + \page characters: \blank + + \showmissingcharacters + \stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua new file mode 100644 index 00000000000..b387c11ddd7 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua @@ -0,0 +1,328 @@ +if not modules then modules = { } end modules['s-fonts-shapes'] = { + version = 1.001, + comment = "companion to s-fonts-shapes.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.shapes = moduledata.fonts.shapes or { } + +local fontdata = fonts.hashes.identifiers + +local context = context +local NC, NR = context.NC, context.NR +local space, dontleavehmode, glyph, getvalue = context.space, context.dontleavehmode, context.glyph, context.getvalue +local formatters = string.formatters + +function moduledata.fonts.shapes.showlist(specification) -- todo: ranges + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>") + local chrs = fontdata[id].characters + function char(k) + dontleavehmode() + glyph(id,k) + end + local function special(v) + local specials = v.specials + if specials and #specials > 1 then + context("%s:",specials[1]) + for i=2,#specials do + space() + char(specials[i]) + end + end + end + context.begingroup() + context.tt() + context.starttabulate { "|l|c|c|c|c|l|l|" } + context.FL() + NC() context.bold("unicode") + NC() context.bold("glyph") + NC() context.bold("shape") + NC() context.bold("lower") + NC() context.bold("upper") + NC() context.bold("specials") + NC() context.bold("description") + NC() NR() + context.TL() + for k, v in next, characters.data do + if chrs[k] then + NC() context("0x%05X",k) + NC() char(k) -- getvalue(cs) context.char(k) + NC() char(v.shcode) + NC() char(v.lccode or k) + NC() char(v.uccode or k) + NC() special(v) + NC() context.tx(v.description) + NC() NR() + end + end + context.stoptabulate() + context.endgroup() +end + +function moduledata.fonts.shapes.showlist(specification) -- todo: ranges + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>") + local chrs = fontdata[id].characters + function char(k) + dontleavehmode() + glyph(id,k) + end + local function special(v) + local specials = v.specials + if specials and #specials > 1 then + context("%s:",specials[1]) + for i=2,#specials do + space() + char(specials[i]) + end + end + end + context.begingroup() + context.tt() + context.starttabulate { "|l|c|c|c|c|l|l|" } + context.FL() + NC() context.bold("unicode") + NC() context.bold("glyph") + NC() context.bold("shape") + NC() context.bold("lower") + NC() context.bold("upper") + NC() context.bold("specials") + NC() context.bold("description") + NC() NR() + context.TL() + for k, v in next, characters.data do + if chrs[k] then + NC() context("0x%05X",k) + NC() char(k) + NC() char(v.shcode) + NC() char(v.lccode or k) + NC() char(v.uccode or k) + NC() special(v) + NC() context.tx(v.description) + NC() NR() + end + end + context.stoptabulate() + context.endgroup() +end + +local descriptions = nil +local characters = nil + +local function showglyphshape(specification) + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>") + local tfmdata = fontdata[id] + local charnum = tonumber(specification.character) + if not charnum then + charnum = fonts.helpers.nametoslot(n) + end + context.start() + context.dontleavehmode() + context.obeyMPboxdepth() + local characters = tfmdata.characters + local descriptions = tfmdata.descriptions + local parameters = tfmdata.parameters + local c = characters[charnum] + local d = descriptions[charnum] + if d then + local factor = (parameters.size/parameters.units)*((7200/7227)/65536) + local llx, lly, urx, ury = unpack(d.boundingbox) + llx, lly, urx, ury = llx*factor, lly*factor, urx*factor, ury*factor + local width, italic = (d.width or 0)*factor, (d.italic or 0)*factor + local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor + local anchors, math = d.anchors, d.math + context.startMPcode() + context("pickup pencircle scaled .25bp ;") + context('picture p ; p := image(draw textext.drt("\\getuvalue{%s}\\gray\\char%s");); draw p ;',cs,charnum) + context('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury) + context('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0) + context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;') + context("defaultscale := 0.05 ; ") + -- inefficient but non critical + local function slant_1(v,dx,dy,txt,xsign,ysign,loc,labloc) + if #v > 0 then + local l = { } + for kk, vv in ipairs(v) do + local h, k = vv.height, vv.kern + if h and k then + l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) + end + end + context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1]) + context("draw laddered (%s) withcolor .5white ;",table.concat(l,"..")) + context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l]) + for k, v in ipairs(l) do + context("draw %s withcolor blue withpen pencircle scaled 1bp;",v) + end + end + end + local function slant_2(v,dx,dy,txt,xsign,ysign,loc,labloc) + if #v > 0 then + local l = { } + for kk, vv in ipairs(v) do + local h, k = vv.height, vv.kern + if h and k then + l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) + end + end + if loc == "top" then + context('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[#l]) + else + context('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1]) + end + for kk, vv in ipairs(v) do + local h, k = vv.height, vv.kern + if h and k then + context('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk]) + end + end + end + end + if math then + local kerns = math.kerns + if kerns then + for _, slant in ipairs { slant_1, slant_2 } do + for k,v in pairs(kerns) do + if k == "top_right" then + slant(v,width+italic,0,k,1,1,"top","ulft") + elseif k == "bottom_right" then + slant(v,width,0,k,1,1,"bot","lrt") + elseif k == "top_left" then + slant(v,0,0,k,-1,1,"top","ulft") + elseif k == "bottom_left" then + slant(v,0,0,k,-1,1,"bot","lrt") + end + end + end + end + end + local function show(x,y,txt) + local xx, yy = x*factor, y*factor + context("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy) + context('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy) + context('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy) + end + if anchors then + local a = anchors.baselig + if a then + for k, v in pairs(a) do + for kk, vv in ipairs(v) do + show(vv[1],vv[2],k .. ":" .. kk) + end + end + end + local a = anchors.mark + if a then + for k, v in pairs(a) do + show(v[1],v[2],k) + end + end + local a = anchors.basechar + if a then + for k, v in pairs(a) do + show(v[1],v[2],k) + end + end + local ba = anchors.centry + if a then + for k, v in pairs(a) do + show(v[1],v[2],k) + end + end + local a = anchors.cexit + if a then + for k, v in pairs(a) do + show(v[1],v[2],k) + end + end + end + if italic ~= 0 then + context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury) + context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury) + context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury) + context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury) + context('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury) + end + if top_accent ~= 0 then + context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,ury) + context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,ury) + context('label.top("%s",(%s,%s-1bp));',d.top_accent,top_accent,ury) + end + if bot_accent ~= 0 then + context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,lly) + context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury) + context('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly) + end + context('draw origin withcolor red withpen pencircle scaled 1bp;') + context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;") + context("currentpicture := currentpicture scaled 8 ;") + context.stopMPcode() + -- elseif c then + -- lastdata, lastunicode = nil, nil + -- local factor = (7200/7227)/65536 + -- context.startMPcode() + -- context("pickup pencircle scaled .25bp ; ") + -- context('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum) + -- context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;') + -- context("defaultscale := 0.05 ; ") + -- local italic, top_accent, bot_accent = (c.italic or 0)*factor, (c.top_accent or 0)*factor, (c.bot_accent or 0)*factor + -- local width, height, depth = (c.width or 0)*factor, (c.height or 0)*factor, (c.depth or 0)*factor + -- local ury = height + -- if italic ~= 0 then + -- context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury) + -- context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury) + -- context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,height) + -- context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,height) + -- context('label.rt("%6.3f bp",(%s-2bp,%s-1bp));',italic,width+italic,height) + -- end + -- if top_accent ~= 0 then + -- context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,height) + -- context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,height) + -- context('label.top("%6.3f bp",(%s,%s-1bp));',top_accent,top_accent,height) + -- end + -- if bot_accent ~= 0 then + -- context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,height) + -- context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,height) + -- context('label.bot("%6.3f bp",(%s,%s+1bp));',bot_accent,bot_accent,height) + -- end + -- context('draw origin withcolor red withpen pencircle scaled 1bp;') + -- context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;") + -- context("currentpicture := currentpicture scaled 8 ;") + -- context.stopMPcode() + else + lastdata, lastunicode = nil, nil + context("no such shape: 0x%05X",charnum) + end + context.stop() +end + +moduledata.fonts.shapes.showglyphshape = showglyphshape + +function moduledata.fonts.shapes.showallglypshapes(specification) + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>") + local descriptions = fontdata[id].descriptions + for unicode, description in fonts.iterators.descriptions(tfmdata) do + context.modulefontsstartshowglyphshape(unicode,description.name) + showglyphshape { number = id, character = unicode } + context.modulefontsstopshowglyphshape() + end +end + +function moduledata.fonts.shapes.showlastglyphshapefield(unicode,name) + if not descriptions then + -- bad news + elseif name == "unicode" then + context("U+%05X",descriptions.unicode) + else + local d = descriptions[name] + if d then + context(d) + end + end +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-shapes.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-shapes.mkiv new file mode 100644 index 00000000000..56e3d80a745 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-shapes.mkiv @@ -0,0 +1,117 @@ +%D \module +%D [ file=s-fonts-shapes, % s-fnt-29, +%D version=2010.09.27, +%D title=\CONTEXT\ Style File, +%D subtitle=Tracing Shapes, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[s-fonts-shapes] + +\registerctxluafile{s-fonts-shapes}{} + +\installmodulecommandluasingle \showfontshapes {moduledata.fonts.shapes.showlist} +\installmodulecommandluasingle \showglyphshape {moduledata.fonts.shapes.showglypshape} +\installmodulecommandluatwo \showlastglyphshapefield {moduledata.fonts.shapes.showlastglyphshapefield} +\installmodulecommandluasingle \showallglyphshapes {moduledata.fonts.shapes.showallglypshapes} + +\let\modulefontsstartshowglyphshape\relax +\let\modulefontsstopshowglyphshape \relax + +\unprotect + +\startsetups module:showallglyphshapes:start + + \def\modulefontsstartshowglyphshape##1##2{ + \startTEXpage[\c!offset=\exheight] + \edef\lastshownglyphshapefieldunicode{##1}% + \edef\lastshownglyphshapefieldname {##2}% + \raggedcenter + } + + \def\modulefontsstopshowglyphshape { + \par + \doifsomething {\lastshownglyphshapefieldunicode} { + \begingroup + \dontleavehmode + \tttf + \setstrut + \strut + 0x\uchexnumbers\lastshownglyphshapefieldunicode + :\space + \lastshownglyphshapefieldname + \par + \endgroup + } + \stopTEXpage + } + +\stopsetups + +\protect + +% downward compatibility: + +\unexpanded\def\ShowGlyphShape#1#2#3% name size glyph + {\ctxlua{moduledata.fonts.shapes.showglyphshape { name = "#1", size = "#2", character = "#3" } }} + +\stopmodule + +\continueifinputfile{s-fonts-shapes.mkiv} + +\setupbodyfont[dejavu,9pt] + +\setuplayout + [backspace=1cm, + topspace=1cm, + footer=1cm, + header=0cm, + height=middle, + width=middle] + +\setupfootertexts + [] + [\saveddefinedfontname\quad\pagenumber] + +\starttext + + \savedefinedfont[Bold*default] + + \showfontshapes[number=\saveddefinedfontid] + + \page + + \showfontshapes[name=BoldItalic*default] + + \page + + % \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x62A} \stopTEXpage + % \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x2004} \stopTEXpage + % \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0xF0299} \stopTEXpage + % \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{NameMe.1190} \stopTEXpage + + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{20bp}{0x00066}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{20bp}{0x1D453}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{20bp}{0x1D43F}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D444}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D447}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x02112}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D432}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D43D}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D44A}\stopTEXpage + \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D45D}\stopTEXpage + + \page + + % \showallglyphshapes[name=name:cambria-math,size=100bp] + % \showallglyphshapes[name=name:dejavuserif,size=100bp] + +\stoptext + + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-system.lua b/Master/texmf-dist/tex/context/base/s-fonts-system.lua new file mode 100644 index 00000000000..0c0ad4d863c --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-system.lua @@ -0,0 +1,68 @@ +if not modules then modules = { } end modules ['s-fonts-system'] = { + version = 1.001, + comment = "companion to s-fonts-system.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- ["zapfinoforteltpro"]={ +-- ["designsize"]=0, +-- ["familyname"]="zapfinoforteltpro", +-- ["filename"]="zapfinoforteltpro.otf", +-- ["fontname"]="zapfinoforteltpro", +-- ["fontweight"]="regular", +-- ["format"]="otf", +-- ["fullname"]="zapfinoforteltpro", +-- ["maxsize"]=0, +-- ["minsize"]=0, +-- ["modification"]=1105543074, +-- ["modifiers"]="regular", +-- ["rawname"]="ZapfinoForteLTPro", +-- ["style"]="normal", +-- ["subfamily"]="regular", +-- ["variant"]="normal", +-- ["weight"]="normal", +-- ["width"]="normal", +-- } + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.system = moduledata.fonts.system or { } + +local lower = string.lower + +local context = context +local NC, NR, HL = context.NC, context.NR, context.HL +local bold = context.bold + +function moduledata.fonts.system.showinstalled(specification) + specification = interfaces.checkedspecification(specification) + local pattern = lower(specification.pattern or "") + local list = fonts.names.list(pattern,false,true) + if list then + local files = { } + for k, v in next, list do + files[file.basename(string.lower(v.filename))] = v + end + context.starttabulate { "|Tl|Tl|Tl|Tl|Tl|Tl|" } + HL() + NC() bold("filename") + NC() bold("fontname") + NC() bold("subfamily") + NC() bold("variant") + NC() bold("weight") + NC() bold("width") + NC() NR() + HL() + for filename, data in table.sortedpairs(files) do + NC() context(filename) + NC() context(data.fontname) + NC() context(data.subfamily) + NC() context(data.variant) + NC() context(data.weight) + NC() context(data.width) + NC() NR() + end + context.stoptabulate() + end +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-system.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-system.mkiv new file mode 100644 index 00000000000..6d9082a6bdc --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-system.mkiv @@ -0,0 +1,39 @@ +%D \module +%D [ file=s-fonts0system, % s-fnt-11, +%D version=2006.02.01, % or so +%D title=\CONTEXT\ Style File, +%D subtitle=Listing Installed Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This code usd to be in the kernel but since it's hardly used +%D it's now a module. +%D +%D \starttyping +%D \showinstalledfonts[pattern={officinasans.*}] +%D \showinstalledfonts[pattern={officinaserif.*}] +%D \showinstalledfonts[pattern={officina.*itc.*}] +%D \stoptyping + +\startmodule[fonts-system] + +\registerctxluafile{s-fonts-system}{} + +\installmodulecommandluasingle \showinstalledfonts {moduledata.fonts.system.showinstalled} + +\stopmodule + +\continueifinputfile{s-fonts-system.mkiv} + +\usemodule[art-01] \setuplayout[overview] \setupbodyfont[7pt] + +\starttext + + \showinstalledfonts + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua index 3cf1286a7e3..5c91d5ee72c 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua +++ b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua @@ -6,17 +6,16 @@ if not modules then modules = { } end modules ['s-fonts-tables'] = { license = "see context related readme files" } +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.tables = moduledata.fonts.tables or { } + local setmetatableindex = table.setmetatableindex local sortedhash = table.sortedhash local sortedkeys = table.sortedkeys local format = string.format local concat = table.concat -moduledata.fonts = moduledata.fonts or { } -moduledata.fonts.tracers = moduledata.fonts.tracers or { } -moduledata.fonts.tracers.tables = moduledata.fonts.tracers.tables or { } - -local tabletracers = moduledata.fonts.tracers.tables +local tabletracers = moduledata.fonts.tables local digits = { dflt = { @@ -165,17 +164,17 @@ end tabletracers.typeset = typeset -function tabletracers.properties(nesting) +function tabletracers.showproperties(nesting) local tfmdata = fonts.hashes.identifiers[font.current()] typeset(tfmdata.properties,fonts.constructors.keys.properties,nesting) end -function tabletracers.parameters(nesting) +function tabletracers.showparameters(nesting) local tfmdata = fonts.hashes.identifiers[font.current()] typeset(tfmdata.parameters,fonts.constructors.keys.parameters,nesting) end -function tabletracers.positionalfeatures() +function tabletracers.showpositionings() local tfmdata = fonts.hashes.identifiers[font.current()] local resources = tfmdata.resources if resources then @@ -187,11 +186,11 @@ function tabletracers.positionalfeatures() for feature, scripts in sortedhash(gpos) do for script, languages in sortedhash(scripts) do context.NC() - context(feature) + context(feature) context.NC() - context(script) + context(script) context.NC() - context(concat(sortedkeys(languages)," ")) + context(concat(sortedkeys(languages)," ")) context.NC() context.NR() end @@ -207,7 +206,7 @@ end local dynamics = true -function tabletracers.substitutionfeatures() +function tabletracers.showsubstitutions() local tfmdata = fonts.hashes.identifiers[font.current()] local resources = tfmdata.resources if resources then @@ -282,34 +281,28 @@ function tabletracers.substitutionfeatures() end end -function tabletracers.all(settings) -- not interfaced +function tabletracers.showall(specification) -- not interfaced - if type(settings) == "string" then - settings = utilities.parsers.settings_to_hash(settings) - end + specification = interfaces.checkedspecification(specification) - local title = settings and settings.title or "" - - if title == "" then title = false end - - if title then - context.starttitle { title = title } + if specification.title then + context.starttitle { title = specification.title } end context.startsubject { title = "Properties" } - tabletracers.properties() + tabletracers.showproperties() context.stopsubject() context.startsubject { title = "Parameters" } - tabletracers.parameters() + tabletracers.showparameters() context.stopsubject() - context.startsubject { title = "Positional features" } - tabletracers.positionalfeatures() + context.startsubject { title = "Positioning features" } + tabletracers.showpositionings() context.stopsubject() context.startsubject { title = "Substitution features" } - tabletracers.substitutionfeatures() + tabletracers.showsubstitutions() context.stopsubject() if title then diff --git a/Master/texmf-dist/tex/context/base/s-fonts-tables.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-tables.mkiv index efe1500fb5b..98f9052ca37 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-tables.mkiv +++ b/Master/texmf-dist/tex/context/base/s-fonts-tables.mkiv @@ -11,12 +11,19 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% todo: make a mtxrun --script --font <name> option +% todo: make a mtxrun --script font <name> option + +\startmodule[s-fonts-tables] \registerctxluafile{s-fonts-tables}{} -\def\ModuleFontsTracersTablesAll[#1]% - {\ctxlua{moduledata.fonts.tracers.tables.all("#1")}} +\installmodulecommandluasingle \showfonttables {moduledata.fonts.tables.showall} +\installmodulecommandluasingle \showfontproperties {moduledata.fonts.tables.showproperties} +\installmodulecommandluasingle \showfontparameters {moduledata.fonts.tables.showparameters} +\installmodulecommandluasingle \showfontpositionings {moduledata.fonts.tables.showpositionings} +\installmodulecommandluasingle \showfontsubstitutions {moduledata.fonts.tables.showsubstitutions} + +\stopmodule \continueifinputfile{s-fonts-tables.mkiv} @@ -26,5 +33,5 @@ [cambria] \starttext - \ModuleFontsTracersTablesAll[title=Cambria] + \showfonttables[title=Cambria] \stoptext diff --git a/Master/texmf-dist/tex/context/base/s-fonts-vectors.lua b/Master/texmf-dist/tex/context/base/s-fonts-vectors.lua new file mode 100644 index 00000000000..1bac0ae8bad --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-vectors.lua @@ -0,0 +1,104 @@ +if not modules then modules = { } end modules ['s-fonts-vectors'] = { + version = 1.001, + comment = "companion to s-fonts-vectors.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.protrusions = moduledata.fonts.protrusions or { } +moduledata.fonts.expansions = moduledata.fonts.expansions or { } + +local NC, NR = context.NC, context.NR + +local classes = fonts.protrusions.classes +local vectors = fonts.protrusions.vectors + +function moduledata.fonts.protrusions.showvector(specification) + specification = interfaces.checkedspecification(specification) + local vector = vectors[specification.name or "?"] + if vector then + context.blank() + context.startcolumns { n = specification.columns or 3 } + context.starttabulate { "|T||cw(.5em)||" } + for unicode, values in table.sortedhash(vector) do + NC() context("%U",unicode) + NC() context("%.02f",values[1]) + NC() context("%c",unicode) + NC() context("%.02f",values[2]) + NC() NR() + end + context.stoptabulate() + context.stopcolumns() + context.blank() + end +end + +function moduledata.fonts.protrusions.showclass(specification) + specification = interfaces.checkedspecification(specification) + local class = specification.name and classes[specification.name] + local classes = class and { class} or classes + context.starttabulate { "|l|l|r|r|r|" } + NC() context.bold("name") + NC() context.bold("vector") + NC() context.bold("factor") + NC() context.bold("left") + NC() context.bold("right") + NC() NR() + for name, class in table.sortedhash(classes) do + NC() context(name) + NC() context(class.vector) + NC() context("%.02f",class.factor) + NC() context("%.02f",class.left) + NC() context("%.02f",class.right) + NC() NR() + end + context.stoptabulate() +end + +local classes = fonts.expansions.classes +local vectors = fonts.expansions.vectors + +function moduledata.fonts.expansions.showvector(specification) + specification = interfaces.checkedspecification(specification) + local vector = vectors[specification.name or "?"] + if vector then + context.blank() + context.startcolumns { n = specification.columns or 3 } + context.starttabulate { "|T|cw(.5em)||" } + for unicode, value in table.sortedhash(vector) do + NC() context("%U",unicode) + NC() context("%c",unicode) + NC() context("%.02f",value) + NC() NR() + end + context.stoptabulate() + context.stopcolumns() + context.blank() + end +end + +function moduledata.fonts.expansions.showclass(specification) + specification = interfaces.checkedspecification(specification) + local class = specification.name and classes[specification.name] + local classes = class and { class} or classes + context.starttabulate { "|l|l|r|r|r|" } + NC() context.bold("name") + NC() context.bold("vector") + NC() context.bold("step") + NC() context.bold("factor") + NC() context.bold("stretch") + NC() context.bold("shrink") + NC() NR() + for name, class in table.sortedhash(classes) do + NC() context(name) + NC() context(class.vector) + NC() context("%.02f",class.step) + NC() context("%.02f",class.factor) + NC() context("% 2i",class.stretch) + NC() context("% 2i",class.shrink) + NC() NR() + end + context.stoptabulate() +end diff --git a/Master/texmf-dist/tex/context/base/s-fonts-vectors.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-vectors.mkiv new file mode 100644 index 00000000000..371a30cc569 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-vectors.mkiv @@ -0,0 +1,72 @@ +%D \module +%D [ file=s-fonts-vectors, % was s-fnt-51, +%D version=2012.11.27, +%D title=\CONTEXT\ Style File, +%D subtitle=Protrusion and Expansion, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This code is used in the \MKIV\ fonts manual. + +\startmodule[s-fonts-vectors] + +\registerctxluafile{s-fonts-vectors}{} + +\installmodulecommandluasingle \showprotrusionclass {moduledata.fonts.protrusions.showclass} +\installmodulecommandluasingle \showprotrusionvector {moduledata.fonts.protrusions.showvector} +\installmodulecommandluasingle \showexpansionclass {moduledata.fonts.expansions.showclass} +\installmodulecommandluasingle \showexpansionvector {moduledata.fonts.expansions.showvector} + +\stopmodule + +\continueifinputfile{s-fonts-vectors.mkiv} + +\usemodule[art-01] + +\starttext + + \startsubject[title=protrusion] + + \startsubsubject[title=class] + \showprotrusionclass + \stopsubsubject + + \startsubsubject[title=vector pure] + \showprotrusionvector[name=pure] + \stopsubsubject + + \startsubsubject[title=vector punctuation] + \showprotrusionvector[name=punctuation] + \stopsubsubject + + \startsubsubject[title=vector alpha] + \showprotrusionvector[name=alpha] + \stopsubsubject + + \startsubsubject[title=vector quality] + \showprotrusionvector[name=quality] + \stopsubsubject + + \stopsubject + + \page + + \startsubject[title=expansion] + + \startsubsubject[title=class] + \showprotrusionclass + \stopsubsubject + + \startsubsubject[title=vector quality] + \showprotrusionvector[name=quality] + \stopsubsubject + + \stopsubject + +\stoptext + diff --git a/Master/texmf-dist/tex/context/base/s-lan-03.mkiv b/Master/texmf-dist/tex/context/base/s-lan-03.mkiv deleted file mode 100644 index a490261f47a..00000000000 --- a/Master/texmf-dist/tex/context/base/s-lan-03.mkiv +++ /dev/null @@ -1,40 +0,0 @@ -%D \module -%D [ file=s-lan-03, -%D version=2010.10.21, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 3, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode -languages.words.tracers = languages.words.tracers or { } - -function languages.words.tracers.showwords(filename) - filename = filename or file.addsuffix(tex.jobname,"words") - if lfs.isfile(filename) then - local w = dofile(filename) - if w then - -- table.print(w) - for cname, category in table.sortedpairs(w.categories) do - for lname, language in table.sortedpairs(category.languages) do - context.bold(string.format("category: %s, language: %s, total: %s, unique: %s:", - cname, lname, language.total or 0, language.unique or 0) - ) - for word, n in table.sortedpairs(language.list) do - context(" %s (%s)",word,n) - end - context.par() - end - end - end - end -end -\stopluacode - -% \ctxlua{languages.words.tracers.showwords("words-003.words")} - diff --git a/Master/texmf-dist/tex/context/base/s-lan-04.mkiv b/Master/texmf-dist/tex/context/base/s-lan-04.mkiv deleted file mode 100644 index c04be94667d..00000000000 --- a/Master/texmf-dist/tex/context/base/s-lan-04.mkiv +++ /dev/null @@ -1,153 +0,0 @@ -%D \module -%D [ file=s-lan-04, -%D version=2011.05.01, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 4, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D For Mojca. - -\startluacode - local a_colormodel = attributes.private('colormodel') - - local nodecodes = nodes.nodecodes - local nodepool = nodes.pool - local disc = nodecodes.disc - local glyph = nodecodes.glyph - local quads = fonts.hashes.quads - local newkern = nodepool.kern - local newrule = nodepool.rule - local newglue = nodepool.glue - - local get_attribute = node.has_attribute - - local tracers = nodes.tracers - local colortracers = tracers and tracers.colors - local setnodecolor = colortracers.set - - local function identify(head,marked) - local current, prev = head, nil - while current do - local id = current.id - local next = current.next - if id == disc then - if prev and next.id == glyph then -- catch other usage of disc - marked[#marked+1] = prev - end - elseif id == glyph then - prev = current - end - current = next - end - end - - local function strip(head,marked) - for i=1,#marked do - local prev = marked[i] - nodes.remove(head,prev.next,true) - end - end - - local function mark(head,marked,what,how) - for i=1,#marked do - local prev = marked[i] - local font = prev.font - local quad = quads[font] - head, prev = node.insert_after(head,prev,newkern(-quad/40)) - if what then - local rule = newrule(quad/20,.75*quad,0) - head, prev = node.insert_after(head,prev,rule) - setnodecolor(rule,how,get_attribute(prev,a_colormodel)) - else - local rule = newrule(quad/20,0,.5*quad) - head, prev = node.insert_after(head,prev,rule) - setnodecolor(rule,how,get_attribute(prev,a_colormodel)) - end - head, prev = node.insert_after(head,prev,newkern(-quad/40)) - head, prev = node.insert_after(head,prev,newglue(0)) - end - end - - local language_one, language_two, tag_one, tag_two - - function nodes.showhyphens(head) - local marked_1, marked_2 = { }, { } - if language_one then - for n in node.traverse_id(glyph,head) do - n.lang = language_one - end - lang.hyphenate(head,node.slide(head)) - identify(head,marked_1) - strip(head,marked_1) - end - if language_two then - for n in node.traverse_id(glyph,head) do - n.lang = language_two - end - lang.hyphenate(head,node.slide(head)) - identify(head,marked_2) - strip(head,marked_2) - end - if tag_one then - mark(head,marked_1,true,"hyphenation:"..tag_one) - end - if tag_two then - mark(head,marked_2,false,"hyphenation:"..tag_two) - end - return head, true - end - - function languages.startcomparepatterns(list) - local list = utilities.parsers.settings_to_array(list) - tag_one = list[1] - tag_two = list[2] - language_one = tag_one and languages.getnumber(tag_one) - language_two = tag_two and languages.getnumber(tag_two) - -- nodes.tasks.appendaction("processors","words","nodes.showhyphens") - nodes.tasks.appendaction("processors","before","nodes.showhyphens") - nodes.tasks.enableaction("processors","nodes.showhyphens") - end - - function languages.stopcomparepatterns() - nodes.tasks.disableaction("processors","nodes.showhyphens") - end - -\stopluacode - -\unprotect - -\def\startcomparepatterns[#1]% - {\bgroup - \language\zerocount - \setupalign[\v!nothyphenated]% - \ctxlua{languages.startcomparepatterns("#1")}} - -\def\stopcomparepatterns - {\ctxlua{languages.stopcomparepatterns()}% - \egroup} - -\protect - -\definecolor[hyphenation:en] [r=.8] -\definecolor[hyphenation:de] [g=.8] -\definecolor[hyphenation:nl] [b=.8] - -\continueifinputfile{s-lan-04.mkiv} - -\starttext - - \startcomparepatterns[en,de] - \input tufte\par - \stopcomparepatterns - - \startcomparepatterns[de,nl] - \input tufte\par - \stopcomparepatterns - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-lan-06.mkiv b/Master/texmf-dist/tex/context/base/s-lan-06.mkiv deleted file mode 100644 index 43d59a2d131..00000000000 --- a/Master/texmf-dist/tex/context/base/s-lan-06.mkiv +++ /dev/null @@ -1,53 +0,0 @@ -%D \module -%D [ file=s-lan-06, -%D version=2013.03.22, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 6, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - -languages.tracers = languages.tracers or { } - -function languages.tracers.showfrequencies(language) - local t = languages.frequencies.getdata(language or "en") - context.starttabulate { "|lT|cw(2em)|r|" } - context.NC() - context.formatted.rlap("%s: %p",t.language,languages.frequencies.averagecharwidth(t.language)) - context.NC() - context.NC() - context.NR() - context.HL() - for k, v in table.sortedhash(t.frequencies) do - context.NC() - context("%U",k) - context.NC() - context("%c",k) - context.NC() - context("%0.3f",v) - context.NC() - context.NR() - end - context.stoptabulate() -end - -\stopluacode - -\unexpanded\def\ShowLanguageFrequencies#1% - {\ctxlua{languages.tracers.showfrequencies("#1")}} - -\continueifinputfile{s-lan-06.mkiv} - -\starttext - - \hsize65\averagecharwidth \input ward \par - - \ShowLanguageFrequencies\currentmainlanguage - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-counters.lua b/Master/texmf-dist/tex/context/base/s-languages-counters.lua new file mode 100644 index 00000000000..436e64a6405 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-counters.lua @@ -0,0 +1,52 @@ +if not modules then modules = { } end modules ['s-languages-counters'] = { + version = 1.001, + comment = "companion to s-languages-counters.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.counters = moduledata.languages.counters or { } + +local data = converters.verbose.data + +function moduledata.languages.counters.showverbose(specification) + specification = interfaces.checkedspecification(specification) + local list = utilities.parsers.settings_to_array(specification.language or "") + if #list == 0then + return + end + local used = { } + local words = { } + for i=1,#list do + local ai = list[i] + local di = data[ai] + if di and di.words then + used[#used+1] = ai + table.merge(words,di.words) + end + end + context.starttabulate { string.rep("|l",#used) .. "|r|" } + context.HL() + context.NC() + for i=1,#used do + context.bold(used[i]) + context.NC() + end + context.bold("number") + context.NC() + context.NR() + context.HL() + for k, v in table.sortedhash(words) do + context.NC() + for i=1,#used do + context(data[used[i]].words[k] or "") + context.NC() + end + context(k) + context.NC() + context.NR() + end + context.stoptabulate() +end diff --git a/Master/texmf-dist/tex/context/base/s-languages-counters.mkiv b/Master/texmf-dist/tex/context/base/s-languages-counters.mkiv new file mode 100644 index 00000000000..fa938d65a87 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-counters.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-languages-counters, % s-lan-05, +%D version=2011.05.01, % older +%D title=\CONTEXT\ Style File, +%D subtitle=Language Counters, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-counters] + +\registerctxluafile{s-languages-counters}{} + +\installmodulecommandluasingle \showverbosecounters {moduledata.languages.counters.showverbose} + +\stopmodule + +\continueifinputfile{s-languages-counters.mkiv} + +\usemodule[art-01] + +\starttext + + \showverbosecounters[language={en,es}] + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-frequencies.lua b/Master/texmf-dist/tex/context/base/s-languages-frequencies.lua new file mode 100644 index 00000000000..16213a41271 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-frequencies.lua @@ -0,0 +1,33 @@ +if not modules then modules = { } end modules ['s-languages-frequencies'] = { + version = 1.001, + comment = "companion to s-languages-frequencies.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.frequencies = moduledata.languages.frequencies or { } + +function moduledata.languages.frequencies.showlist(specification) + specification = interfaces.checkedspecification(specification) + local t = languages.frequencies.getdata(specification.language or languages.current()) + context.starttabulate { "|lT|cw(2em)|r|" } + context.NC() + context.formatted.rlap("%s: %p",t.language,languages.frequencies.averagecharwidth(t.language)) + context.NC() + context.NC() + context.NR() + context.HL() + for k, v in table.sortedhash(t.frequencies) do + context.NC() + context("%U",k) + context.NC() + context("%c",k) + context.NC() + context("%0.3f",v) + context.NC() + context.NR() + end + context.stoptabulate() +end diff --git a/Master/texmf-dist/tex/context/base/s-languages-frequencies.mkiv b/Master/texmf-dist/tex/context/base/s-languages-frequencies.mkiv new file mode 100644 index 00000000000..01a1f5682e2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-frequencies.mkiv @@ -0,0 +1,38 @@ +%D \module +%D [ file=s-languages-frequencies, % s-lan-06, +%D version=2013.03.22, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Frequencies, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-frequencies] + +\registerctxluafile{s-languages-frequencies}{} + +\installmodulecommandluasingle \showfrequencies {moduledata.languages.frequencies.showlist} + +\stopmodule + +\continueifinputfile{s-languages-frequencies.mkiv} + +\usemodule[art-01] + +\starttext + + \hsize65\averagecharwidth \the\hsize: \input ward \par + + \showfrequencies \page + + \mainlanguage[de] + + \hsize65\averagecharwidth \the\hsize: \input ward \par + + \showfrequencies \page + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua new file mode 100644 index 00000000000..660392f802b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua @@ -0,0 +1,135 @@ +if not modules then modules = { } end modules ['s-languages-hyphenation'] = { + version = 1.001, + comment = "companion to s-languages-hyphenation.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.hyphenation = moduledata.languages.hyphenation or { } + +local a_colormodel = attributes.private('colormodel') + +local nodecodes = nodes.nodecodes +local nodepool = nodes.pool +local disc = nodecodes.disc +local glyph = nodecodes.glyph +local emwidths = fonts.hashes.emwidths +local exheights = fonts.hashes.exheights +local newkern = nodepool.kern +local newrule = nodepool.rule +local newglue = nodepool.glue + +local insert_node_after = node.insert_after +local traverse_by_id = node.traverse_id +local hyphenate = lang.hyphenate +local find_tail = node.slide +local remove_node = nodes.remove + +local tracers = nodes.tracers +local colortracers = tracers and tracers.colors +local setnodecolor = colortracers.set + +local function identify(head,marked) + local current, prev = head, nil + while current do + local id = current.id + local next = current.next + if id == disc then + if prev and next.id == glyph then -- catch other usage of disc + marked[#marked+1] = prev + end + elseif id == glyph then + prev = current + end + current = next + end +end + +local function strip(head,marked) + for i=1,#marked do + local prev = marked[i] + remove_node(head,prev.next,true) + end +end + +local function mark(head,marked,w,h,d,how) + for i=1,#marked do + local prev = marked[i] + local font = prev.font + local em = emwidths[font] + local ex = exheights[font] + local width = w*em + local rule = newrule(width,h*ex,d*ex) + head, prev = insert_node_after(head,prev,newkern(-width/2)) + head, prev = insert_node_after(head,prev,rule) + head, prev = insert_node_after(head,prev,newkern(-width/2)) + head, prev = insert_node_after(head,prev,newglue(0)) + setnodecolor(rule,how,prev[a_colormodel]) + end +end + +local langs, tags, noflanguages = { }, { }, 0 + +local colorbytag = false + +function moduledata.languages.hyphenation.showhyphens(head) + if noflanguages > 0 then + local marked = { } + for i=1,noflanguages do + local m = { } + local l = langs[i] + marked[i] = m + for n in traverse_by_id(glyph,head) do + n.lang = l + end + hyphenate(head,find_tail(head)) + identify(head,m) + strip(head,m) + end + for i=noflanguages,1,-1 do + local l = noflanguages - i + 1 + mark(head,marked[i],1/16,l/2,l/4,"hyphenation:"..(colorbytag and tags[i] or i)) + end + return head, true + else + return head, false + end +end + +local savedlanguage + +function moduledata.languages.hyphenation.startcomparepatterns(list) + if list and list ~= "" then + tags = utilities.parsers.settings_to_array(list) + end + savedlanguage = tex.language + tex.language = 0 + noflanguages = #tags + for i=1,noflanguages do + langs[i] = tags[i] and languages.getnumber(tags[i]) + end + nodes.tasks.enableaction("processors","moduledata.languages.hyphenation.showhyphens") +end + +function moduledata.languages.hyphenation.stopcomparepatterns() + noflanguages = 0 + tex.language = savedlanguage or tex.language + nodes.tasks.disableaction("processors","moduledata.languages.hyphenation.showhyphens") +end + +function moduledata.languages.hyphenation.showcomparelegend(list) + if list and list ~= "" then + tags = utilities.parsers.settings_to_array(list) + end + for i=1,#tags do + if i > 1 then + context.enspace() + end + context.color( { "hyphenation:"..(colorbytag and tags[i] or i) }, tags[i]) + end +end + +nodes.tasks.appendaction("processors","before","moduledata.languages.hyphenation.showhyphens") +nodes.tasks.disableaction("processors","moduledata.languages.hyphenation.showhyphens") diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv new file mode 100644 index 00000000000..769c3d05904 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv @@ -0,0 +1,75 @@ +%D \module +%D [ file=s-languages-hyphenation, % s-lan-04, +%D version=2011.05.01, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Hyphenation, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D For Mojca. + +\startmodule[languages-hyphenation] + +\registerctxluafile{s-languages-hyphenation}{} + +\unprotect + +\unexpanded\def\startcomparepatterns + {\dosingleempty\module_languages_hyphenation_start} + +\unexpanded\def\module_languages_hyphenation_start[#1]% + {\begingroup + \par + % \language\zerocount + \setupalign[\v!nothyphenated]% + \ctxlua{moduledata.languages.hyphenation.startcomparepatterns("#1")}} + +\unexpanded\def\stopcomparepatterns + {\par + \ctxlua{moduledata.languages.hyphenation.stopcomparepatterns()}% + \endgroup} + +\installmodulecommandluasingle \showcomparepatternslegend {moduledata.languages.hyphenation.showcomparelegend} + +\protect + +\definecolor[hyphenation:1] [r=.8] +\definecolor[hyphenation:2] [g=.8] +\definecolor[hyphenation:3] [b=.8] +\definecolor[hyphenation:4] [r=.4,g=.4] + +\definecolor[hyphenation:en] [hyphenation:1] +\definecolor[hyphenation:de] [hyphenation:2] +\definecolor[hyphenation:nl] [hyphenation:3] +\definecolor[hyphenation:fr] [hyphenation:4] + +\stopmodule + +\continueifinputfile{s-languages-hyphenation.mkiv} + +\usemodule[art-01] + +\starttext + + \startsubject{Normal text} + \input tufte + \stopsubject + + \startsubject{Compare hyphenation points of \showcomparepatternslegend[en,de]} + \startcomparepatterns + \input tufte \quad (\showcomparepatternslegend) + \stopcomparepatterns + \stopsubject + + \startsubject{Compare hyphenation points} + \startcomparepatterns[de,nl,en,fr] + \input tufte \quad (\showcomparepatternslegend) + \stopcomparepatterns + \stopsubject + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-sorting.lua b/Master/texmf-dist/tex/context/base/s-languages-sorting.lua new file mode 100644 index 00000000000..82a0827bbd2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-sorting.lua @@ -0,0 +1,118 @@ +if not modules then modules = { } end modules ['s-languages-system'] = { + version = 1.001, + comment = "companion to s-languages-system.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.sorting = moduledata.languages.sorting or { } + +local formatters = string.formatters +local utfbyte, utfcharacters = utf.byte, utf.characters +local sortedpairs = table.sortedpairs + +local definitions = sorters.definitions +local constants = sorters.constants +local replacementoffset = constants.replacementoffset + +local currentfont = font.current +local fontchars = fonts.hashes.characters + +local c_darkblue = { "darkblue" } +local c_darkred = { "darkred" } +local f_chr = formatters["\\tttf%H"] + +local function chr(str,done) + if done then + context.space() + end + local c = fontchars[currentfont()] + for s in utfcharacters(str) do + local u = utfbyte(s) + if c[u] then + context(s) + elseif u > replacementoffset then + context.color(c_darkblue, f_chr(u)) + else + context.color(c_darkred, f_chr(u)) + end + end + return true +end + +local function map(a,b,done) + if done then + context.space() + end + -- context.tttf() + chr(a) + context("=") + chr(b) + return true +end + +local function nop() + -- context.tttf() + context("none") +end + +local function key(data,field) + context.NC() + context(field) + context.NC() + context(data[field]) + context.NC() + context.NR() +end + +function moduledata.languages.sorting.showinstalled(tag) + if not tag or tag == "" or tag == interfaces.variables.all then + for tag, data in sortedpairs(definitions) do + moduledata.languages.sorting.showinstalled (tag) + end + else + sorters.update() -- syncs data + local data = definitions[tag] + if data then + context.starttabulate { "|lB|pl|" } + key(data,"language") + key(data,"parent") + key(data,"method") + context.NC() + context("replacements") + context.NC() + local replacements = data.replacements + if #replacements == 0 then + nop() + else + for i=1,#replacements do + local r = replacements[i] + map(r[1],r[2],i > 1) + end + end + context.NC() + context.NR() + context.NC() + context("order") + context.NC() + local orders = data.orders + for i=1,#orders do + chr(orders[i],i > 1) + end + context.NC() + context.NR() + context.NC() + context("entries") + context.NC() + local done = false + for k, e in sortedpairs(data.entries) do + done = map(k,e,done) + end + context.NC() + context.NR() + context.stoptabulate() + end + end +end diff --git a/Master/texmf-dist/tex/context/base/s-languages-sorting.mkiv b/Master/texmf-dist/tex/context/base/s-languages-sorting.mkiv new file mode 100644 index 00000000000..67acda6f972 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-sorting.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-languages-sorting, % s-lan-02.mkiv +%D version=2010.09.21, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Sorting, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-sorting] + +\registerctxluafile{s-languages-sorting}{} + +\installmodulecommandluasingle \showinstalledsorting {moduledata.languages.sorting.showinstalled} + +\stopmodule + +\continueifinputfile{s-languages-sorting.mkiv} + +\usemodule[art-01] + +\starttext + + \showinstalledsorting + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.lua b/Master/texmf-dist/tex/context/base/s-languages-system.lua new file mode 100644 index 00000000000..5afc4d4036f --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-system.lua @@ -0,0 +1,35 @@ +if not modules then modules = { } end modules ['s-languages-system'] = { + version = 1.001, + comment = "companion to s-languages-system.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.system = moduledata.languages.system or { } + +local NC, NR, HL = context.NC, context.NR, context.HL + +function moduledata.languages.system.showinstalled() + local numbers = languages.numbers + local registered = languages.registered + context.starttabulate { "|r|l|l|l|l|" } + NC() context("id") + NC() context("tag") + NC() context("synonyms") + NC() context("parent") + NC() context("loaded") + NC() NR() HL() + for i=1,#numbers do + local tag = numbers[i] + local data = registered[tag] + NC() context(data.number) + NC() context(tag) + NC() context("% t",table.sortedkeys(data.synonyms)) + NC() context(data.parent) + NC() context("%+t",table.sortedkeys(data.used)) + NC() NR() + end + context.stoptabulate() +end diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.mkiv b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv new file mode 100644 index 00000000000..36372037433 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-languages-system, % moved from local s-lan-01 +%D version=2013.05.19, +%D title=\CONTEXT\ Style File, +%D subtitle=Installed Languages, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-system] + +\registerctxluafile{s-languages-system}{} + +\installmodulecommandluasingle \showinstalledlanguages {moduledata.languages.system.showinstalled} + +\stopmodule + +\continueifinputfile{s-languages-system.mkiv} + +\usemodule[art-01] + +\starttext + + \showinstalledlanguages + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-mat-11.mkiv b/Master/texmf-dist/tex/context/base/s-mat-11.mkiv deleted file mode 100644 index 862872499dc..00000000000 --- a/Master/texmf-dist/tex/context/base/s-mat-11.mkiv +++ /dev/null @@ -1,104 +0,0 @@ -\usemodule[s][mat-10] - -% rendering - -\def\startmathfontlist - {} - -\def\stopmathfontlist - {} - -\def\startmathfontlistentry - {\blank - \begingroup} - -\def\stopmathfontlistentry - {\endgroup - \blank} - -\def\mathfontlistentryhexdectit#1#2#3% - {#1: \char#2\enspace\ruledhbox{\char#2}\enspace#3\par - \advance\leftskip 1em\relax} - -\def\mathfontlistentrywdhtdpic#1#2#3#4% - {width: #1, height: #2, depth: #3, italic: #4\par} - -\def\mathfontlistentryresource#1% - {virtual: #1\par} - -\def\startmathfontlistnext - {next: } - -\def\mathfontlistnextentry#1#2#3% - {\ifnum#1>1 \space=>\space\fi#2~\ruledhbox{\char#3}} - -\def\mathfontlistnextcycle#1% - {\ifnum#1>1 \space=>\space\fi cycle} - -\def\stopmathfontlistnext - {\par} - -\def\startmathfontlisthvariants - {variants: } - -\def\mathfontlisthvariantsentry#1#2#3% - {\ifnum#1>1 \space=>\space\fi#2~\ruledhbox{\char#3}} - -\def\stopmathfontlisthvariants - {\par} - -\def\startmathfontlistvvariants{\startmathfontlisthvariants} -\def\mathfontlistvvariantsentry{\mathfontlisthvariantsentry} -\def\stopmathfontlistvvariants {\stopmathfontlisthvariants } - -\def\mathfontlistbetweennextandvariants - {\space=>\space} - -\def\startmathfontlistentryclassspec - {} - -\def\stopmathfontlistentryclassspec - {} - -\def\mathfontlistentryclassname#1#2% - {mathclass: #1, mathname: #2\par} - -\def\mathfontlistentrysymbol#1#2% - {mathsymbol: #1~\ruledhbox{\char#2}\par} - -\def\startmathfontlookupvariants - {lookupvariants: } - -\def\stopmathfontlookupvariants - {\par} - -\def\mathfontlookupvariant#1#2#3#4% - {\ifnum#1>1 ,\space\fi#2:~\char#3 (#4)} - -% done - -\continueifinputfile{s-mat-11.mkiv} - -\setuplayout - [width=middle, - height=middle, - topspace=15mm, - backspace=15mm, - bottomspace=15mm, - header=1cm, - headerdistance=0.5cm, - footer=0pt] - -\starttext -% \setupbodyfont[cambria, 12pt] \showmathfontcharacters -% \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters -% \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters -% \setupbodyfont[txvirtual,12pt] \showmathfontcharacters - \setupbodyfont[palatino, 12pt] \showmathfontcharacters -% \setupbodyfont[mathtimes,12pt] \showmathfontcharacters -% \setupbodyfont[stix, 12pt] \showmathfontcharacters -% \setupbodyfont[xits, 12pt] \showmathfontcharacters -% \setupbodyfont[lucida, 12pt] \showmathfontcharacters -% \setupbodyfont[lucidanova, 12pt] \showmathfontcharacters -\stoptext - diff --git a/Master/texmf-dist/tex/context/base/s-mat-10.mkiv b/Master/texmf-dist/tex/context/base/s-math-characters.lua index 3eaaf688bab..b0a79fcb6e5 100644 --- a/Master/texmf-dist/tex/context/base/s-mat-10.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-characters.lua @@ -1,66 +1,16 @@ -%D \module -%D [ file=s-mat-10.mkiv, % was: s-fnt-25 -%D version=2009.01.25, -%D title=\CONTEXT\ Style File, -%D subtitle=Math Glyph Checking, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. +if not modules then modules = { } end modules['s-math-characters'] = { + version = 1.001, + comment = "companion to s-math-characters.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} -%D This base module will be cleaned up and extended. +-- This is one of the oldest cld files but I'm not going to clean it up. -\unexpanded\def\enableshowmathfontvirtual - {\ctxlua{fonts.constructors.autocleanup=false}} +moduledata.math = moduledata.math or { } +moduledata.math.characters = moduledata.math.characters or { } -\unexpanded\def\showmathfontcharacters - {\dodoubleempty\doshowmathfontcharacters} - -\def\doshowmathfontcharacters[#1][#2]% - {\begingroup - \dontcomplain - \doifelsenothing{#1} - {\definedfont[MathRoman*math-text]} - {\definedfont[#1]}% - \doifelsenothing{#2} - {\ctxlua{document.showmathfont(font.current())}} - {\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}% - \processcommalist[#2]\dodoshowmathfontcharacters}% - \endgroup} - -% the interface might (and will) change - -\let\startmathfontlist \relax -\let\stopmathfontlist \relax -\let\mathfontlistreference \gobbleoneargument -\let\startmathfontlistentry \relax -\let\stopmathfontlistentry \relax -\let\mathfontlistentryhexdectit \gobblethreearguments -\let\mathfontlistentrywdhtdpic \gobblefourarguments -\let\mathfontlistentryresource \gobbleoneargument -\let\startmathfontlistnext \relax -\let\mathfontlistnextentry \gobblethreearguments -\let\mathfontlistnextcycle \gobbleonearguments -\let\stopmathfontlistnext \relax -\let\startmathfontlisthvariants \relax -\let\mathfontlisthvariantsentry \gobblethreearguments -\let\stopmathfontlisthvariants \relax -\let\startmathfontlistvvariants \startmathfontlisthvariants -\let\mathfontlistvvariantsentry \mathfontlisthvariantsentry -\let\stopmathfontlistvvariants \stopmathfontlisthvariants -\let\mathfontlistbetweennextandvariants\relax -\let\startmathfontlistentryclassspec \relax -\let\stopmathfontlistentryclassspec \relax -\let\mathfontlistentryclassname \gobbletwoarguments -\let\mathfontlistentrysymbol \gobbletwoarguments -\let\startmathfontlookupvariants \relax -\let\stopmathfontlookupvariants \relax -\let\mathfontlookupvariant \gobblefourarguments - -\startluacode local concat = table.concat local lower = string.lower local utfchar = utf.char @@ -79,7 +29,16 @@ local upperlimit = 0xF0000 local f_unicode = string.formatters["%U"] local f_slot = string.formatters["%s/%0X"] -function document.showmathfont(id,slot) +function moduledata.math.characters.showlist(specification) + specification = interfaces.checkedspecification(specification) + local id = specification.number -- or specification.id + local list = specification.list + if not id then + id = font.current() + end + if list == "" then + list = nil + end local tfmdata = fontdata[id] local characters = tfmdata.characters local descriptions = tfmdata.descriptions @@ -89,8 +48,10 @@ function document.showmathfont(id,slot) local names = { } local gaps = mathematics.gaps local sorted = { } - if slot then - sorted = { slot } + if type(list) == "string" then + sorted = utilities.parsers.settings_to_array(list) + elseif type(list) == "table" then + sorted = list elseif fillinthegaps then sorted = table.keys(characters) for k, v in next, gaps do @@ -109,7 +70,7 @@ function document.showmathfont(id,slot) names[k] = (name and file.basename(name)) or id end end - context.startmathfontlist() + context.showmathcharactersstart() for _, unicode in next, sorted do if not limited or unicode < upperlimit then local code = gaps[unicode] or unicode @@ -127,10 +88,10 @@ function document.showmathfont(id,slot) local mathspec = info.mathspec local mathsymbol = info.mathsymbol local description = info.description or no_description - context.startmathfontlistentry() - context.mathfontlistreference(f_unicode(unicode)) - context.mathfontlistentryhexdectit(f_unicode(code),code,lower(description)) - context.mathfontlistentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) + context.showmathcharactersstartentry() + context.showmathcharactersreference(f_unicode(unicode)) + context.showmathcharactersentryhexdectit(f_unicode(code),code,lower(description)) + context.showmathcharactersentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) if virtual and commands then local t = { } for i=1,#commands do @@ -141,36 +102,36 @@ function document.showmathfont(id,slot) end end if #t > 0 then - context.mathfontlistentryresource(concat(t,", ")) + context.showmathcharactersentryresource(concat(t,", ")) end end if mathclass or mathspec then - context.startmathfontlistentryclassspec() + context.showmathcharactersstartentryclassspec() if mathclass then - context.mathfontlistentryclassname(mathclass,info.mathname or "no name") + context.showmathcharactersentryclassname(mathclass,info.mathname or "no name") end if mathspec then for i=1,#mathspec do local mi = mathspec[i] - context.mathfontlistentryclassname(mi.class,mi.name or "no name") + context.showmathcharactersentryclassname(mi.class,mi.name or "no name") end end - context.stopmathfontlistentryclassspec() + context.showmathcharactersstopentryclassspec() end if mathsymbol then - context.mathfontlistentrysymbol(f_unicode(mathsymbol),mathsymbol) + context.showmathcharactersentrysymbol(f_unicode(mathsymbol),mathsymbol) end if next_sizes then local n, done = 0, { } - context.startmathfontlistnext() + context.showmathcharactersstartnext() while next_sizes do n = n + 1 if done[next_sizes] then - context.mathfontlistnextcycle(n) + context.showmathcharactersnextcycle(n) break else done[next_sizes] = true - context.mathfontlistnextentry(n,f_unicode(next_sizes),next_sizes) + context.showmathcharactersnextentry(n,f_unicode(next_sizes),next_sizes) next_sizes = characters[next_sizes] v_variants = next_sizes.vert_variants or v_variants h_variants = next_sizes.horiz_variants or h_variants @@ -179,25 +140,25 @@ function document.showmathfont(id,slot) end end end - context.stopmathfontlistnext() + context.showmathcharactersstopnext() if h_variants or v_variants then - context.mathfontlistbetweennextandvariants() + context.showmathcharactersbetweennextandvariants() end end if h_variants then - context.startmathfontlisthvariants() + context.showmathcharactersstarthvariants() for i=1,#h_variants do -- we might go top-down in the original local vi = h_variants[i] - context.mathfontlisthvariantsentry(i,f_unicode(vi.glyph),vi.glyph) + context.showmathcharactershvariantsentry(i,f_unicode(vi.glyph),vi.glyph) end - context.stopmathfontlisthvariants() + context.showmathcharactersstophvariants() elseif v_variants then - context.startmathfontlistvvariants() + context.showmathcharactersstartvvariants() for i=1,#v_variants do local vi = v_variants[#v_variants-i+1] - context.mathfontlistvvariantsentry(i,f_unicode(vi.glyph),vi.glyph) + context.showmathcharactersvvariantsentry(i,f_unicode(vi.glyph),vi.glyph) end - context.stopmathfontlistvvariants() + context.showmathcharactersstopvvariants() end if slookups or mlookups then local variants = { } @@ -229,20 +190,17 @@ function document.showmathfont(id,slot) end end end - context.startmathfontlookupvariants() + context.showmathcharactersstartlookupvariants() local i = 0 for variant, lookuptype in table.sortedpairs(variants) do i = i + 1 - context.mathfontlookupvariant(i,f_unicode(variant),variant,lookuptype) + context.showmathcharacterslookupvariant(i,f_unicode(variant),variant,lookuptype) end - context.stopmathfontlookupvariants() + context.showmathcharactersstoplookupvariants() end - context.stopmathfontlistentry() + context.showmathcharactersstopentry() end end end - context.stopmathfontlist() + context.showmathcharactersstop() end -\stopluacode - -\endinput diff --git a/Master/texmf-dist/tex/context/base/s-math-characters.mkiv b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv new file mode 100644 index 00000000000..1c415954453 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv @@ -0,0 +1,184 @@ +%D \module +%D [ file=s-math-characters.mkiv, % was: s-fnt-25 and later s-mat-10 +%D version=2009.01.25, +%D title=\CONTEXT\ Style File, +%D subtitle=Math Glyph Checking, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[math-characters] + +\registerctxluafile{s-math-characters}{} + +% context --jit --global --bodyfont=cambria --result=math-characters-cambria s-math-characters.mkiv +% context --jit --global --bodyfont=modern --result=math-characters-modern s-math-characters.mkiv + +\startsetups s-math-characters:reset + + \let\showmathcharactersstart \relax + \let\showmathcharactersstop \relax + \let\showmathcharactersreference \gobbleoneargument + \let\showmathcharactersstartentry \relax + \let\showmathcharactersstopentry \relax + \let\showmathcharactersentryhexdectit \gobblethreearguments + \let\showmathcharactersentrywdhtdpic \gobblefourarguments + \let\showmathcharactersentryresource \gobbleoneargument + \let\showmathcharactersstartnext \relax + \let\showmathcharactersnextentry \gobblethreearguments + \let\showmathcharactersnextcycle \gobbleonearguments + \let\showmathcharactersstopnext \relax + \let\showmathcharactersstarthvariants \relax + \let\showmathcharactershvariantsentry \gobblethreearguments + \let\showmathcharactersstophvariants \relax + \let\showmathcharactersstartvvariants \showmathcharactersstarthvariants + \let\showmathcharactersvvariantsentry \showmathcharactershvariantsentry + \let\showmathcharactersstopvvariants \showmathcharactersstophvariants + \let\showmathcharactersbetweennextandvariants\relax + \let\showmathcharactersstartentryclassspec \relax + \let\showmathcharactersstopentryclassspec \relax + \let\showmathcharactersentryclassname \gobbletwoarguments + \let\showmathcharactersentrysymbol \gobbletwoarguments + \let\showmathcharactersstartlookupvariants \relax + \let\showmathcharacterslookupvariant \gobblefourarguments + \let\showmathcharactersstoplookupvariants \relax + +\stopsetups + +\directsetup{s-math-characters:reset} + +\startsetups s-math-characters:default + + \directsetup{s-math-characters:reset} + + \unexpanded\def\showmathcharactersstartentry {\blank\begingroup\raggedright} + \unexpanded\def\showmathcharactersstopentry {\endgroup\blank} + + \def\showmathcharactersentryhexdectit##1##2##3% + {##1:\space{\char##2}\space\ruledhbox{\char##2}\space##3\par + \advance\leftskip\emwidth\relax} + + \def\showmathcharactersentrywdhtdpic##1##2##3##4% + {width:\space##1,\space height:\space##2,\space depth:\space##3,\space italic:\space##4\par} + + \def\showmathcharactersentryresource##1% + {virtual:\space##1\par} + + \def\showmathcharactersstartnext + {\par\begingroup\hangindent\emwidth\hangafter-\plushundred\hskip-\emwidth + next:\space} + + \def\showmathcharactersnextentry##1##2##3% + {\ifnum##1>\plusone \space=>\space\fi##2~\ruledhbox{\char##3}} + + \def\showmathcharactersnextcycle##1% + {\ifnum##1>\plusone \space=>\space\fi cycle} + + \def\showmathcharactersstopnext + {\par\endgroup} + + \def\showmathcharactersstarthvariants + {\par\begingroup\hangindent\emwidth\hangafter-\plushundred\hskip-\emwidth + variants:\space} + + \def\showmathcharactershvariantsentry##1##2##3% + {\ifnum##1>\plusone \space=>\space\fi##2~\ruledhbox{\char##3}} + + \def\showmathcharactersstophvariants + {\par\endgroup} + + \let\showmathcharactersstartvvariants\showmathcharactersstarthvariants + \let\showmathcharactersvvariantsentry\showmathcharactershvariantsentry + \let\showmathcharactersstopvvariants \showmathcharactersstophvariants + + \def\showmathcharactersbetweennextandvariants + {}% \space=>\space} + + \def\showmathcharactersentryclassname##1##2% + {mathclass:\space##1,\space mathname:\space##2\par} + + \def\showmathcharactersentrysymbol##1##2% + {mathsymbol:\space##1~\ruledhbox{\char##2}\par} + + \def\showmathcharactersstartlookupvariants + {\par\begingroup\hangindent\emwidth\hangafter-\plushundred\hskip-\emwidth + lookupvariants:\space} + + \def\showmathcharacterslookupvariant##1##2##3##4% + {\ifnum##1>\plusone,\space\fi##2:~{\char##3}\space(##4)} + + \def\showmathcharactersstoplookupvariants + {\par\endgroup} + +\stopsetups + +\unprotect + +\unexpanded\def\enableshowmathfontvirtual + {\ctxlua{fonts.constructors.autocleanup=false}} + +\unexpanded\def\showmathfontcharacters + {\dosingleempty\module_math_characters_show} + +\def\module_math_characters_show[#1]% + {\begingroup + \getdummyparameters[\c!bodyfont=,\c!list=,\c!alternative=default,#1]% + \directsetup{s-math-characters:\dummyparameter\c!alternative}% + \doifelsenothing{\dummyparameter\c!bodyfont} + {\definedfont[MathRoman*math-text]} + {\definedfont[\dummyparameter\c!bodyfont]}% + \dontcomplain + \ctxlua{moduledata.math.characters.showlist { + number = false, + list = "\dummyparameter\c!list", + }}% + \endgroup} + +\protect + +\stopmodule + +\continueifinputfile{s-math-characters.mkiv} + +\setuplayout + [width=middle, + height=middle, + topspace=15mm, + backspace=15mm, + bottomspace=15mm, + header=1cm, + headerdistance=0.5cm, + footer=0pt] + +\starttext + + \doifelse {\getdocumentargument{bodyfont}} {} { + + \setupbodyfont[cambria, 12pt] + % \setupbodyfont[modern, 12pt] + % \setupbodyfont[lmvirtual, 12pt] + % \setupbodyfont[pxvirtual, 12pt] + % \setupbodyfont[txvirtual, 12pt] + % \setupbodyfont[palatino, 10pt] + % \setupbodyfont[mathtimes, 12pt] + % \setupbodyfont[stix, 12pt] + % \setupbodyfont[xits, 12pt] + % \setupbodyfont[lucida, 12pt] + % \setupbodyfont[lucidanova,12pt] + % \setupbodyfont[pagella, 12pt] + % \setupbodyfont[bonum, 12pt] + + } { + + \normalexpanded{\setupbodyfont[\getdocumentargument{bodyfont},12pt]} + + } + + \showmathfontcharacters + +\stoptext + diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.lua b/Master/texmf-dist/tex/context/base/s-math-coverage.lua new file mode 100644 index 00000000000..258019c9d58 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-math-coverage.lua @@ -0,0 +1,180 @@ +if not modules then modules = { } end modules ['s-math-coverage'] = { + version = 1.001, + comment = "companion to s-math-coverage.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.math = moduledata.math or { } +moduledata.math.coverage = moduledata.math.coverage or { } + +local utfchar, utfbyte = utf.char, utf.byte +local formatters, lower = string.formatters, string.lower +local concat = table.concat + +local context = context +local NC, NR, HL = context.NC, context.NR, context.HL +local char, getglyph, bold = context.char, context.getglyph, context.bold + +local ucgreek = { + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, + 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, + 0x03A6, 0x03A7, 0x03A8, 0x03A9 +} + +local lcgreek = { + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, + 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, + 0x03D1, 0x03D5, 0x03D6, 0x03F0, 0x03F1, + 0x03F4, 0x03F5 +} + +local ucletters = { + 0x00041, 0x00042, 0x00043, 0x00044, 0x00045, + 0x00046, 0x00047, 0x00048, 0x00049, 0x0004A, + 0x0004B, 0x0004C, 0x0004D, 0x0004E, 0x0004F, + 0x00050, 0x00051, 0x00052, 0x00053, 0x00054, + 0x00055, 0x00056, 0x00057, 0x00058, 0x00059, + 0x0005A, +} + +local lcletters = { + 0x00061, 0x00062, 0x00063, 0x00064, 0x00065, + 0x00066, 0x00067, 0x00068, 0x00069, 0x0006A, + 0x0006B, 0x0006C, 0x0006D, 0x0006E, 0x0006F, + 0x00070, 0x00071, 0x00072, 0x00073, 0x00074, + 0x00075, 0x00076, 0x00077, 0x00078, 0x00079, + 0x0007A, +} + +local digits = { + 0x00030, 0x00031, 0x00032, 0x00033, 0x00034, + 0x00035, 0x00036, 0x00037, 0x00038, 0x00039, +} + +local styles = { + "regular", "sansserif", "monospaced", "fraktur", "script", "blackboard" +} + +local alternatives = { + "normal", "bold", "italic", "bolditalic" +} + +local alphabets = { + ucletters, lcletters, ucgreek, lcgreek, digits, +} + +local getboth = mathematics.getboth +local remapalphabets = mathematics.remapalphabets + +local chardata = characters.data +local superscripts = characters.superscripts +local subscripts = characters.subscripts + +function moduledata.math.coverage.showalphabets() + context.starttabulate { "|lT|l|Tl|" } + for i=1,#styles do + local style = styles[i] + for i=1,#alternatives do + local alternative = alternatives[i] + for i=1,#alphabets do + local alphabet = alphabets[i] + NC() + if i == 1 then + context("%s %s",style,alternative) + end + NC() + context.startimath() + context.setmathattribute(style,alternative) + for i=1,#alphabet do + local letter = alphabet[i] + local id = getboth(style,alternative) + local unicode = remapalphabets(letter,id) + if not unicode then + context.underbar(utfchar(letter)) + elseif unicode == letter then + context(utfchar(unicode)) + else + context(utfchar(unicode)) + end + end + context.stopimath() + NC() + local first = alphabet[1] + local last = alphabet[#alphabet] + local id = getboth(style,alternative) + local f_unicode = remapalphabets(first,id) or utfbyte(first) + local l_unicode = remapalphabets(last,id) or utfbyte(last) + context("%05X - %05X",f_unicode,l_unicode) + NC() + NR() + end + end + end + context.stoptabulate() +end + +function moduledata.math.coverage.showcharacters() + context.startcolumns() + context.setupalign { "nothyphenated" } + context.starttabulate { "|T|i2|Tpl|" } + for u, d in table.sortedpairs(chardata) do + local mathclass = d.mathclass + local mathspec = d.mathspec + if mathclass or mathspec then + NC() + context("%05X",u) + NC() + getglyph("MathRoman",u) + NC() + if mathspec then + local t = { } + for i=1,#mathspec do + t[mathspec[i].class] = true + end + t = table.sortedkeys(t) + context("% t",t) + else + context(mathclass) + end + NC() + NR() + end + end + context.stoptabulate() + context.stopcolumns() +end + +-- This is a somewhat tricky table as we need to bypass the math machinery. + +function moduledata.math.coverage.showscripts() + context.starttabulate { "|cT|c|cT|c|c|c|l|" } + for k, v in table.sortedpairs(table.merged(superscripts,subscripts)) do + local ck = utfchar(k) + local cv = utfchar(v) + local ss = superscripts[k] and "^" or "_" + NC() + context("%05X",k) + NC() + context(ck) + NC() + context("%05X",v) + NC() + context(cv) + NC() + context.formatted.rawmathematics("x%s = x%s%s",ck,ss,cv) + NC() + context.formatted.mathematics("x%s = x%s%s",ck,ss,cv) + NC() + context(lower(chardata[k].description)) + NC() + NR() + end + context.stoptabulate() +end diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv new file mode 100644 index 00000000000..d68ffe58751 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv @@ -0,0 +1,34 @@ +%D \module +%D [ file=s-math-coverage, % s-fnt-33, s-fnt-32 +%D version=2011.05.10, % and older +%D title=\CONTEXT\ Style File, +%D subtitle=Show Math Coverage, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[math-coverage] + +\registerctxluafile{s-math-coverage}{} + +\installmodulecommandluasingle \showmathalphabets {moduledata.math.coverage.showalphabets} +\installmodulecommandluasingle \showmathcharacters {moduledata.math.coverage.showcharacters} +\installmodulecommandluasingle \showmathscripts {moduledata.math.coverage.showscripts} + +\stopmodule + +\continueifinputfile{s-math-coverage.mkiv} + +\usemodule[art-01] + +\starttext + + \showmathalphabets \page + \showmathcharacters \page + \showmathscripts \page + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-math-extensibles.mkiv b/Master/texmf-dist/tex/context/base/s-math-extensibles.mkiv new file mode 100644 index 00000000000..f9ff8547ae1 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-math-extensibles.mkiv @@ -0,0 +1,145 @@ +%D \module +%D [ file=s-math-extensibles.mkiv, +%D version=2013.02.03, +%D title=\CONTEXT\ Style File, +%D subtitle=Math Stackers Checking, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This module provides a macro that will typeset a table of (horizontal) +%D extensibles including some tracing. You can set up the \type {demo} +%D stacker category to tweak things. +%D +%D \starttyping +%D \showmathextensibles[alternative=a|b] +%D \stoptyping + +\startmodule[math-extensibles] + +\unprotect + +\definemathstackers + [demo] + [math] + [\c!offset=\v!max] + +\installcorenamespace{modulemathextensibles} +\installcorenamespace{modulemathextensiblesalternative} + +\installdirectsetuphandler \??modulemathextensibles {modulemathextensibles} + +\setupmodulemathextensibles + [\c!alternative=\v!a] + +\unexpanded\def\showmathextensibles + {\dosingleempty\module_math_extensibles_show_all} + +\def\module_math_extensibles_show_all[#1]% + {\begingroup + \setupcurrentmodulemathextensibles[#1]% + \expandnamespacevalue\??modulemathextensiblesalternative\c!alternative\v!a + \endgroup} + +\def\modulemathextensiblesalternativea#1#2#3% + {\NC U+#1 + \NC \filledhboxm{\math{\char"#1}} + \NC \hbox{\math{\mathextensible[demo]{"#1}{top}{bottom}}} + \NC \hbox{\math{\mathextensible[demo]{"#1}{}{bottom}}} + \NC \hbox{\math{\mathextensible[demo]{"#1}{top}{}}} + \NC \nohyphens \veryraggedright #2 + \NC\NR} + +\setvalue{\??modulemathextensiblesalternative\v!a}% + {\enabletrackers[math.stackers.texts] + \starttabulate[|Tl|l|l|l|l|Tp|] + \ctxlua { moduledata.math.extensibles.show { + command = "modulemathextensiblesalternativea", + } } + \stoptabulate + \disabletrackers[math.stackers.texts]} + +\def\modulemathextensiblesalternativeb#1#2#3% + {\NC U+#1 + \NC \math{\char"#1} + \NC \nohyphens \veryraggedright #3 + \NC \NR} + +\setvalue{\??modulemathextensiblesalternative\v!b}% + {\enabletrackers[math.stackers.texts] + \starttabulate[|Tl|l|Tp|] + \ctxlua { moduledata.math.extensibles.show { + command = "modulemathextensiblesalternativeb", + sparse = true, + } } + \stoptabulate + \disabletrackers[math.stackers.texts]} + +\startluacode + moduledata.math = moduledata.math or { } + moduledata.math.extensibles = moduledata.math.extensibles or { } + + function moduledata.math.extensibles.show(settings) + local command = settings.command + local sparse = settings.sparse + for k, v in table.sortedhash(characters.data) do + local mathextensible = v.mathextensible + if mathextensible == "r" or mathextensible == "l" or mathextensible == "h" then + local names = { } + local mathname = v.mathname + if mathname then + names[#names+1] = v.mathclass .. ":" .. mathname + end + local mathspec = v.mathspec + if mathspec then + for i=1,#mathspec do + local v = mathspec[i] + names[#names+1] = v.class .. ":" .. v.name + end + end + local mathfiller = v.mathfiller + if mathfiller then + names[#names+1] = "filler:" .. mathfiller + end + if not sparse or #names > 0 then + context[command](string.format("%04X",k),v.description,table.concat(names," ")) + end + end + end + end +\stopluacode + +\protect + +\stopmodule + +\continueifinputfile{s-math-extensibles.mkiv} + +\setuplayout + [width=middle, + height=middle, + footer=0cm, + backspace=1.5cm, + topspace=1.5cm] + +\setuphead[chapter][style=\bfc] +\setuphead[section][style=\bfa] + +\starttext + + \dowith {a,b} { + + \page \title {Latin Modern} \showmathextensibles[alternative=#1] + \page \setupbodyfont[pagella] \title {Pagella} \showmathextensibles[alternative=#1] + \page \setupbodyfont[termes] \title {Termes} \showmathextensibles[alternative=#1] + \page \setupbodyfont[dejavu] \title {Xits} \showmathextensibles[alternative=#1] + \page \setupbodyfont[cambria] \title {Cambria} \showmathextensibles[alternative=#1] + \page \setupbodyfont[lucidaot] \title {Lucida} \showmathextensibles[alternative=#1] + + } + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-mat-20.mkiv b/Master/texmf-dist/tex/context/base/s-math-parameters.lua index 544612fec43..8e8c15a2d37 100644 --- a/Master/texmf-dist/tex/context/base/s-mat-20.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-parameters.lua @@ -1,17 +1,13 @@ -%D \module -%D [ file=s-mat-20.mkiv, -%D version=2012.12.05, -%D title=\CONTEXT\ Style File, -%D subtitle=Math Tracing Macros, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. +if not modules then modules = { } end modules ['s-math-coverage'] = { + version = 1.001, + comment = "companion to s-math-coverage.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} -\startluacode +moduledata.math = moduledata.math or { } +moduledata.math.parameters = moduledata.math.parameters or { } local tables = utilities.tables.definedtable("math","tracing","spacing","tables") @@ -61,7 +57,7 @@ function tables.strippt(old) return new end -function tables.showspacing() +function moduledata.math.parameters.showspacing() local styles = tables.styles local styleaxis = tables.styleaxis @@ -103,7 +99,7 @@ function tables.showspacing() context.stoptabulate() end -function tables.showparameters() +function moduledata.math.parameters.showparameters() local styles = tables.styles local parameters = tables.parameters @@ -137,25 +133,3 @@ function tables.showparameters() context.stoptabulate() end - -\stopluacode - -\continueifinputfile{s-mat-20.mkiv} - -\setuplayout - [width=middle, - height=middle, - backspace=1cm, - topspace=1cm, - footer=0pt, - header=0pt] - -\setupbodyfont - [dejavu,8pt] - -\starttext - - \ctxlua{math.tracing.spacing.tables.showspacing()} - % \ctxlua{math.tracing.spacing.tables.showparameters()} - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-math-parameters.mkiv b/Master/texmf-dist/tex/context/base/s-math-parameters.mkiv new file mode 100644 index 00000000000..f2fde5d8384 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-math-parameters.mkiv @@ -0,0 +1,41 @@ +%D \module +%D [ file=s-math-parameters.mkiv, +%D version=2012.12.05, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Math Parameters, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[math-parameters] + +\registerctxluafile{s-math-parameters}{} + +\installmodulecommandluasingle \showmathspacing {moduledata.math.parameters.showspacing} +\installmodulecommandluasingle \showmathparameters {moduledata.math.parameters.showparameters} + +\stopmodule + +\continueifinputfile{s-math-parameters.mkiv} + +\setuplayout + [width=middle, + height=middle, + backspace=1cm, + topspace=1cm, + footer=0pt, + header=0pt] + +\setupbodyfont + [dejavu,8pt] + +\starttext + + \showmathspacing \page + \showmathparameters \page + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-mat-12.mkiv b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv index deb28975cb3..a66d7fc6d0d 100644 --- a/Master/texmf-dist/tex/context/base/s-mat-12.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv @@ -1,9 +1,27 @@ -\usemodule[s][mat-10] - -% \enabletrackers[pages.timing] - -% todo: mode for screen -% todo: variant for HD with one menu at the right (with include menu) +%D \module +%D [ file=s-math-parameters.mkiv, % was s-mat-12.mkiv +%D version=2012.06.06, % whatever, probably a bit earlier +%D title=\CONTEXT\ Style File, +%D subtitle=Show Math Character Repertoire, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\usemodule[s][math-characters] + +% context --jit --global --bodyfont=lucidanova --result=math-repertoire-lucidanova s-math-repertoire.mkiv +% context --jit --global --bodyfont=cambria --result=math-repertoire-cambria s-math-repertoire.mkiv +% context --jit --global --bodyfont=xits --result=math-repertoire-xits s-math-repertoire.mkiv +% context --jit --global --bodyfont=modern --result=math-repertoire-modern s-math-repertoire.mkiv +% context --jit --global --bodyfont=pagella --result=math-repertoire-pagella s-math-repertoire.mkiv +% context --jit --global --bodyfont=termes --result=math-repertoire-termes s-math-repertoire.mkiv +% context --jit --global --bodyfont=bonum --result=math-repertoire-bonum s-math-repertoire.mkiv + +\startmodule[math-repertoire] % layout @@ -49,7 +67,9 @@ \setupbackgrounds [text][text] - [bottomframe=on,framecolor=textcolor,rulethickness=0.025ex] + [bottomframe=on, + framecolor=textcolor, + rulethickness=0.025ex] \setupmakeup [standard] @@ -163,10 +183,10 @@ % helpers -\def\mathfontlisttxt#1% +\unexpanded\def\showmathcharacterstxt#1% {{\tttf#1}} -\def\mathfontlistchr#1#2% +\unexpanded\def\showmathcharacterschr#1#2% {\iffontchar\font#2\relax \scale [sx=#1,sy=#1] @@ -190,40 +210,39 @@ \endgroup}% \fi} -\def\mathfontlistmth#1#2% - {\setbox\scratchbox\hbox{\mathfontlistchr{#1}{#2}}% +\unexpanded\def\showmathcharactersmth#1#2% + {\setbox\scratchbox\hbox{\showmathcharacterschr{#1}{#2}}% \ht\scratchbox\strutht \dp\scratchbox\strutdp \box\scratchbox} -\let\mathfontlistbodyfonts\empty +\let\showmathcharactersbodyfonts\empty -\def\mathfontlistbodyfontentry#1#2% +\unexpanded\def\showmathcharactersbodyfontentry#1#2% {\somedata [align={none,middle},background=,height=5cm] {\begingroup \switchtobodyfont[#2,12pt]% \definedfont[MathRoman*math-text]% - \mathfontlistmth{10}{#1}% + \showmathcharactersmth{10}{#1}% \endgroup \vfilll \doifmodeelse{crosslink} - {\goto{\strut\textcolor\mathfontlisttxt{#2}}[#2::#1]}% - {\strut\textcolor\mathfontlisttxt{#2}}}% + {\goto{\strut\textcolor\showmathcharacterstxt{#2}}[#2::#1]}% + {\strut\textcolor\showmathcharacterstxt{#2}}}% \hskip1ex} -\def\setmathfontlistbodyfonts#1% - {\edef\mathfontlistbodyfonts{#1}% - \def\dosetmathfontlistbodyfonts##1% - {\setupbodyfont[##1,12pt]}% - \processcommacommand[\mathfontlistbodyfonts]\dosetmathfontlistbodyfonts} +\unexpanded\def\showmathcharacterssetbodyfonts#1% + {\edef\showmathcharactersbodyfonts{#1}% + \def\doshowmathcharacterssetbodyfonts##1{\setupbodyfont[##1,12pt]}% + \processcommacommand[\showmathcharactersbodyfonts]\doshowmathcharacterssetbodyfonts} -\def\mathfontlistbodyfontschars#1% - {\processcommacommand[\mathfontlistbodyfonts]{\mathfontlistbodyfontentry{#1}}} +\unexpanded\def\showmathcharactersbodyfontschars#1% + {\processcommacommand[\showmathcharactersbodyfonts]{\showmathcharactersbodyfontentry{#1}}} % main -\def\startmathfontlist +\unexpanded\def\showmathcharactersstart {\starttext \startstandardmakeup % we use baselinecolor so that we have a transparency on page 1 \setupalign[middle] @@ -235,43 +254,43 @@ \vfil \stopstandardmakeup} -\def\stopmathfontlist +\unexpanded\def\showmathcharactersstop {\stoptext} % entry -\def\startmathfontlistentry +\unexpanded\def\showmathcharactersstartentry {\startstandardmakeup} -\def\stopmathfontlistentry +\unexpanded\def\showmathcharactersstopentry {\tightlayer[page] \stopstandardmakeup} -\def\mathfontlistreference#1% +\unexpanded\def\showmathcharactersreference#1% {\setlayer[page]{\pagereference[#1]}} -\def\mathfontlistentryhexdectit#1#2#3% +\unexpanded\def\showmathcharactersentryhexdectit#1#2#3% {\setlayer [page] [preset=middletop,voffset=5mm] - {\somedata[height=1cm]{\mathfontlisttxt{#1}}} + {\somedata[height=1cm]{\showmathcharacterstxt{#1}}} \setlayer [page] [preset=middle,y=2cm] - {\mathfontlistmth{25}{#2}} + {\showmathcharactersmth{25}{#2}} \setlayer [page] [preset=righttop,offset=5mm] - {\somedata[height=1cm]{\mathfontlisttxt{#3}}} - \doifsomething\mathfontlistbodyfonts + {\somedata[height=1cm]{\showmathcharacterstxt{#3}}} + \doifsomething\showmathcharactersbodyfonts {\setlayer [page] [preset=middlebottom,voffset=5mm] - {\mathfontlistbodyfontschars{#2}}}} + {\showmathcharactersbodyfontschars{#2}}}} % dimensions -\def\mathfontlistentrywdhtdpic#1#2#3#4% +\unexpanded\def\showmathcharactersentrywdhtdpic#1#2#3#4% {\setlayer [page] [preset=leftbottom,offset=5mm] @@ -281,126 +300,151 @@ \strut depth \hfill \the\dimexpr#3sp\par \strut italic\hfill \the\dimexpr#4sp}}} -\def\mathfontlistentryresource#1% +\unexpanded\def\showmathcharactersentryresource#1% {} % {virtual: #1\par} % next -\def\startmathfontlistnext +\unexpanded\def\showmathcharactersstartnext {\setlayer [page] [preset=middleleft,hoffset=5mm] \bgroup\vbox\bgroup} -\def\stopmathfontlistnext +\unexpanded\def\showmathcharactersstopnext {\egroup\egroup} -\def\mathfontlistnextentry#1#2#3% +\unexpanded\def\showmathcharactersnextentry#1#2#3% {\ifnum#1>1 \vskip1ex \fi \dontleavehmode\somedata [align=normal,width=4cm] - {\strut\mathfontlisttxt{#2}\hfill\mathfontlistchr{2}{#3}}\par} + {\strut\showmathcharacterstxt{#2}\hfill\showmathcharacterschr{2}{#3}}\par} -\def\mathfontlistnextcycle#1% +\unexpanded\def\showmathcharactersnextcycle#1% {\ifnum#1>1 \vskip1ex \fi \dontleavehmode\somedata [align=normal,width=4cm] - {\strut\mathfontlisttxt{cycle}}\par} + {\strut\showmathcharacterstxt{cycle}}\par} % variants -\def\startmathfontlistvvariants +\unexpanded\def\showmathcharactersstartvvariants {\setlayer [page] [preset=lefttop,offset=5mm] \bgroup\vbox\bgroup} -\def\startmathfontlisthvariants +\unexpanded\def\showmathcharactersstarthvariants {\setlayer [page] [preset=lefttop,offset=5mm] \bgroup\hbox\bgroup} -\def\mathfontlistvvariantsentry#1#2#3% +\unexpanded\def\showmathcharactersvvariantsentry#1#2#3% {\ifnum#1>1 \vskip1ex \fi \dontleavehmode\somedata [align=middle,width=4cm] - {\strut\mathfontlisttxt{#2}\hfilll\mathfontlistchr{2}{#3}}} + {\strut\showmathcharacterstxt{#2}\hfilll\showmathcharacterschr{2}{#3}}} -\def\mathfontlisthvariantsentry#1#2#3% +\unexpanded\def\showmathcharactershvariantsentry#1#2#3% {\ifnum#1>1 \hskip1ex \else \dontleavehmode \fi \somedata [align={none,middle},height=2cm] - {\strut\mathfontlisttxt{#2}\vfilll\mathfontlistchr{2}{#3}}} + {\strut\showmathcharacterstxt{#2}\vfilll\showmathcharacterschr{2}{#3}}} -\def\stopmathfontlistvvariants +\unexpanded\def\showmathcharactersstopvvariants {\egroup\egroup} -\def\stopmathfontlisthvariants +\unexpanded\def\showmathcharactersstophvariants {\egroup\egroup} -\def\mathfontlistbetweennextandvariants +\unexpanded\def\showmathcharactersbetweennextandvariants {} % classes -\def\startmathfontlistentryclassspec +\unexpanded\def\showmathcharactersstartentryclassspec {\setlayer [page] [preset=rightbottom,offset=5mm] \bgroup\somedata[align=normal,width=8cm]\bgroup} -\def\stopmathfontlistentryclassspec +\unexpanded\def\showmathcharactersstopentryclassspec {\egroup\egroup} -\def\mathfontlistentryclassname#1#2% - {\strut{\mathfontlisttxt#1}\hfill\mathfontlisttxt{#2}\par} +\unexpanded\def\showmathcharactersentryclassname#1#2% + {\strut{\showmathcharacterstxt#1}\hfill\showmathcharacterstxt{#2}\par} % symbols -\def\mathfontlistentrysymbol#1#2% +\unexpanded\def\showmathcharactersentrysymbol#1#2% {\setlayer [page] [preset=leftbottom,hoffset=5mm,voffset=50mm] {\somedata [align=normal,width=5cm] - {\mathfontlisttxt{#1}\hfill\mathfontlistchr{4}{#2}}}} + {\showmathcharacterstxt{#1}\hfill\showmathcharacterschr{4}{#2}}}} % alternates -\def\startmathfontlookupvariants +\unexpanded\def\showmathcharactersstartlookupvariants {\setlayer [page] [preset=middleright,hoffset=5mm] \bgroup\vbox\bgroup} -\def\stopmathfontlookupvariants +\unexpanded\def\showmathcharactersstoplookupvariants {\egroup\egroup} -\def\mathfontlookupvariant#1#2#3#4% +\unexpanded\def\showmathcharacterslookupvariant#1#2#3#4% {\ifnum#1>1 \vskip1ex \fi \somedata [align=normal,width=7cm] - {\mathfontlisttxt{#4:} \mathfontlisttxt{#2}\hfill\mathfontlistchr{4}{#3}}} + {\showmathcharacterstxt{#4:} \showmathcharacterstxt{#2}\hfill\showmathcharacterschr{4}{#3}}} + +% main + +\unprotect + +\unexpanded\def\showmathfontrepertoire + {\dosingleempty\module_math_repertoire_show} + +\def\module_math_repertoire_show[#1]% % this is a one-run style so we can forget about an alternative + {\showmathfontcharacters[\c!alternative=,#1]} % just assume that the previous definitions are global + +\protect -% done +\stopmodule -\continueifinputfile{s-mat-12.mkiv} +\continueifinputfile{s-math-repertoire.mkiv} -\setmathfontlistbodyfonts{lucidanova,cambria,xits,modern,pagella} +\showmathcharacterssetbodyfonts{lucidanova,cambria,xits,modern,pagella,termes,bonum} \starttext -% \setupbodyfont[cambria, 12pt] \showmathfontcharacters -% \setupbodyfont[modern, 12pt] \showmathfontcharacters -% \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters -% \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters -% \setupbodyfont[txvirtual,12pt] \showmathfontcharacters -% \setupbodyfont[palatino, 10pt] \showmathfontcharacters -% \setupbodyfont[mathtimes,12pt] \showmathfontcharacters -% \setupbodyfont[stix, 12pt] \showmathfontcharacters -% \setupbodyfont[xits, 12pt] \showmathfontcharacters -% \setupbodyfont[lucida, 12pt] \showmathfontcharacters -% \setupbodyfont[lucidanova, 12pt] \showmathfontcharacters - \setupbodyfont[pagella, 12pt] \showmathfontcharacters + + \doifelse {\getdocumentargument{bodyfont}} {} { + + \setupbodyfont[cambria, 12pt] + % \setupbodyfont[modern, 12pt] + % \setupbodyfont[lmvirtual, 12pt] + % \setupbodyfont[pxvirtual, 12pt] + % \setupbodyfont[txvirtual, 12pt] + % \setupbodyfont[palatino, 10pt] + % \setupbodyfont[mathtimes, 12pt] + % \setupbodyfont[stix, 12pt] + % \setupbodyfont[xits, 12pt] + % \setupbodyfont[lucida, 12pt] + % \setupbodyfont[lucidanova,12pt] + % \setupbodyfont[pagella, 12pt] + % \setupbodyfont[bonum, 12pt] + + } { + + \normalexpanded{\setupbodyfont[\getdocumentargument{bodyfont},12pt]} + + } + + \showmathfontrepertoire + \stoptext diff --git a/Master/texmf-dist/tex/context/base/s-pages-statistics.mkiv b/Master/texmf-dist/tex/context/base/s-pages-statistics.mkiv new file mode 100644 index 00000000000..375dd9949f2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-pages-statistics.mkiv @@ -0,0 +1,134 @@ +%D \module +%D [ file=s-pages-statistics, % s-otr-01, +%D version=2012.02.02, +%D title=\CONTEXT\ Style File, +%D subtitle=Page Statistics, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\defineframed + [otrstatistics] + [\c!offset=\bodyfontsize, + \c!background=\v!color, + \c!strut=\v!no, + \c!backgroundcolor=white, + \c!frame=\v!off, + \c!align=\v!middle] + +\definecombination + [otrstatistics] + [\c!nx=2, + \c!ny=2, + \c!location=\v!top] + +% expansion is neeed because tabulate sets some penalties + +\startsetups system:page:otr:statistics + \normalexpanded { + \startcombination[otrstatistics] { + \otrstatistics { + \starttabulate[|Tw(10em)|Trw(8em)|] + \NC \string\textwidth \NC \the\textwidth \NC \NR + \NC \string\textheight \NC \the\textheight \NC \NR + \NC \string\lineheight \NC \the\lineheight \NC \NR + \NC \string\strutheight \NC \strutheight \NC \NR + \NC \string\strutdepth \NC \strutdepth \NC \NR + % \NC \string\vsize \NC \the\vsize \NC \NR + \NC \string\topskip \NC \the\topskip \NC \NR + \stoptabulate + } + } {} + { + \otrstatistics { + \starttabulate[|Tw(10em)|Trw(8em)|] + \NC \string\pagegoal \NC \the\pagegoal \NC \NR + \NC \string\pagetotal \NC \the\pagetotal \NC \NR + \NC \string\pagedepth \NC \the\pagedepth \NC \NR + \NC \string\pageshrink \NC \the\pageshrink \NC \NR + \NC \string\pagestretch \NC \the\pagestretch \NC \NR + \NC \string\pagefilstretch \NC \the\pagefilstretch \NC \NR + \NC \string\pagefillstretch \NC \the\pagefillstretch \NC \NR + \NC \string\pagefilllstretch \NC \the\pagefilllstretch \NC \NR + \stoptabulate + } + } {} + { + \otrstatistics { + \starttabulate[|Tw(10em)|Trw(8em)|] + \NC \string\widowpenalty \NC \the\widowpenalty \NC \NR + \NC \string\clubpenalty \NC \the\clubpenalty \NC \NR + \NC \string\displaywidowpenalty \NC \the\displaywidowpenalty \NC \NR + \NC \string\brokenpenalty \NC \the\brokenpenalty \NC \NR + \NC \string\interlinepenalty \NC \the\interlinepenalty \NC \NR + \stoptabulate + } + } {} + { + \otrstatistics[\c!foregroundcolor=darkred] { + \starttabulate[|Tw(10em)|Trw(8em)|] + \NC page \NC \the\realpageno \NC \NR + \NC delta \NC \the\dimexpr\pagegoal-\pagetotal\relax \NC \NR + \stoptabulate + } + } {} + \stopcombination + } +\stopsetups + +\defineoverlay + [system:page:otr:statistics] + [{\framed + [\c!offset=\bodyfontsize, + \c!background=\v!color, + \c!strut=\v!no, + %\c!frame=\v!off, + \c!framecolor=white, + \c!frameoffset=\onepoint, + \c!rulethickness=2\onepoint, + \c!backgroundcolor=darkblue, + \c!align=\v!middle] + {\forgetall + \insidefloattrue + \setups{system:page:otr:statistics}}}] + +\unexpanded\def\page_one_command_package_show_state_indeed + {\scratchheight\ht\b_page_one_contents + \scratchdepth \dp\b_page_one_contents + \setbox\b_page_one_contents\vbox\framed + [\c!offset=\v!overlay, + \c!framecolor=darkred, + \c!rulethickness=\onepoint, + \c!background={\v!foreground,system:page:otr:statistics}] + {\lower\scratchdepth\box\b_page_one_contents}% + \ht\b_page_one_contents\scratchheight + \dp\b_page_one_contents\scratchdepth} + +\let\page_one_command_package_show_state\relax + +\unexpanded\def\showpageproperties + {\let\page_one_command_package_show_state\page_one_command_package_show_state_indeed} + +\protect + +\continueifinputfile{s-pages-statistics.mkiv} + +\setupbodyfont[dejavu,11pt] \dontcomplain \showpageproperties + +\starttext + +\dorecurse {100} { \input tufte + + \startitemize[packed,intro] + \startitem test \stopitem \startitem test \stopitem + \startitem test \stopitem \startitem test \stopitem + \stopitemize +} + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-phy-01.mkiv b/Master/texmf-dist/tex/context/base/s-phy-01.mkiv deleted file mode 100644 index dde3f9bbb32..00000000000 --- a/Master/texmf-dist/tex/context/base/s-phy-01.mkiv +++ /dev/null @@ -1,111 +0,0 @@ -%D \module -%D [ file=s-phy-01, -%D version=2011-11-24, -%D title=\CONTEXT\ Modules, -%D subtitle=Units Tables, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\unprotect - -% todo: better breaks of head line - -\startluacode -moduledata.units = moduledata.units or { } - -local tables = physics.units.tables -local units = tables.units -local shortcuts = tables.shortcuts - -local HL = context.HL -local NC = context.NC -local NR = context.NR - -local function typeset(list,followup,name,category) - if list then - if followup then - context.TB() - end - if category then - HL() - NC() - context.rlap(category .. ":" .. name) - NC() - NC() - NR() - HL() - end - for k, v in table.sortedhash(list) do - NC() - context(k) - NC() - if isunit then - context(v) - else - context.type(v) - end - NC() - if name == "units" or name == "symbols" or name == "packaged" then - context.unittext(v) - elseif name == "prefixes" then - context.prefixtext(v) - elseif name == "operators" then - context.operatortext(v) - elseif name == "suffixes" then - context.suffixtext(v) - end - NC() - NR() - end - if category and name then - HL() - end - end -end - -function moduledata.units.show_table(name) - context.starttabulate { "|lT|l|c|" } - if name and name ~= "" then - local first, second = string.match(name,"(.-):(.-)") -- [units|shortcuts]:[units|...] - if first then - typeset(tables[first] and tables[first][second],false) - else - typeset(units[name],false) - typeset(shortcuts[name],true) - end - else - local done = false - for what, list in table.sortedhash(units) do - typeset(list,done,what,"units") - done = true - end - for what, list in table.sortedhash(shortcuts) do - typeset(list,done,what,"shortcuts") - done = true - end - end - context.stoptabulate() -end - -\stopluacode - -\unexpanded\def\ShowUnitsTable - {\dosingleempty\Show_Units_Table} - -\def\Show_Units_Table[#1]% - {\ctxlua{moduledata.units.show_table("#1")}} - -\protect - -\continueifinputfile{s-phy-01.mkiv} - -\usemodule[art-01] - -\starttext - \ShowUnitsTable -\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-physics-units.mkiv b/Master/texmf-dist/tex/context/base/s-physics-units.mkiv new file mode 100644 index 00000000000..50adc801431 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-physics-units.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-physics-units, % s-phy-01, +%D version=2011-11-24, +%D title=\CONTEXT\ Modules, +%D subtitle=Physics Units, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[physics-units] + +\registerctxluafile{s-physics-units}{} + +\installmodulecommandluasingle \showunits {moduledata.physics.units.showlist} + +\stopmodule + +\continueifinputfile{s-physics-units.mkiv} + +\usemodule[art-01] + +\starttext + + \showunits + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-present-tiles.mkiv b/Master/texmf-dist/tex/context/base/s-present-tiles.mkiv new file mode 100644 index 00000000000..80ea5249f77 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-present-tiles.mkiv @@ -0,0 +1,297 @@ +%D \module +%D [ file=s-present-tiles, % was s-pre-41 +%D version=2013.03.24, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment Tiles, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D The Bacho\TeX\ 2013 style. + +\setupbodyfont[palatino,14.4pt] + +\setuppapersize[S6][S6] + +\definecolor[primarycolor] [.50(darkblue,darkgreen)] +\definecolor[secondarycolor][.25(darkblue,darkyellow)] +\definecolor[mixedcolor] [s=.35] + +\setupcolors + [textcolor=white] + +\setupalign + [flushleft,nothyphenated] + +\definemeasure[layoutunit][\dimexpr\paperheight/25] + +\setuplayout + [backspace=\measured{layoutunit}, + topspace=\measured{layoutunit}, + width=middle, + height=middle, + header=0pt, + footer=0pt] + +\definelayout + [content] + [backspace=.5\measured{layoutunit}, + topspace=.5\measured{layoutunit}] + +\definemeasure [topiclistwidth] [ + (\textwidth+\backspace)/ + \ifcase\numexpr\structurelistsize\relax 1 % 0 + \or1\or1\or1\or2\or1\or3\or3\or3\or3 % 1 - 9 + \or3\or3\or3\or3\or3\or3\or4 % 10 - 16 + \or4\or4\or4\or4\or % 17 - 20 + \else5 % 21 - 25 + \fi + -\backspace +] + +\definemeasure [topiclistheight] [ + (\textheight+\topspace)/ + \ifcase\numexpr\structurelistsize\relax 1 % 0 + \or1\or2\or3\or2\or5\or2\or3\or3\or3 % 1 - 9 + \or4\or4\or4\or4\or4\or4\or4 % 10 - 16 + \or5\or5\or5\or5\or5 % 17 - 20 + \else5 % 21 - 25 + \fi + -\topspace +] + +\definemeasure [topiclistfont] [\measured{topiclistwidth}/10] +\definemeasure [titlepagefont] [2\measured{layoutunit}] + +\defineframed + [topiclistentry] + [width=\measure{topiclistwidth}, + height=\measure{topiclistheight}, + background=color, + frame=off, + foregroundstyle={\definedfont[Bold at \measure{topiclistfont}]}, + backgroundcolor=primarycolor, + foregroundcolor=white] + +\setupwhitespace + [big] + +\setupblank + [big] + +\setupinteraction + [state=start, + color=, + contrastcolor=, + click=off] + +\definemakeup + [topic] + [standard] + [top=,bottom=] + +\definemakeup + [content] + [standard] + [top=,bottom=] + +\startsetups[topic:start] + \starttopicmakeup +\stopsetups + +\startsetups[topic:stop] + \vfill + \stoptopicmakeup +\stopsetups + +\predefinefont[MyTopicTitleFont][SerifBold*default at \measure{layoutunit}] + +\definehead + [topic] + [chapter] + [before=, + style=MyTopicTitleFont, + page=, + number=off, + interaction=list, + beforesection=\directsetup{topic:start}, + aftersection=\directsetup{topic:stop}] + +\setuplist + [topic] + [alternative=topic, + interaction=all] + +\definelistalternative + [topic] + [alternative=horizontal, + renderingsetup=topic:list] + +\startsetups[topic:list] + \dontleavehmode + \startcurrentlistentrywrapper + \topiclistentry{\currentlistentrytitle} + \stopcurrentlistentrywrapper + \blankspace +\stopsetups + +\defineoverlay[nextpage][\overlaybutton{nextpage}] +\defineoverlay[prevpage][\overlaybutton{prevpage}] +\defineoverlay[menupage][\overlaybutton{menupage}] +\defineoverlay[homepage][\overlaybutton{homepage}] + +\setupbackgrounds + [text] + [backgroundoffset=.5\measured{layoutunit}] + +% begin of buttons + +\defineframed + [bb] + [width=\dimexpr\overlaywidth/10, + height=\dimexpr\overlayheight/10, + background=color, + foregroundstyle=\bfa, + frame=off] + +\defineframed[nb] [bb] [empty=yes] +\defineframed[rb] [bb] [backgroundcolor=white,foregroundcolor=secondarycolor] +\defineframed[db] [bb] [backgroundcolor=mixedcolor,foregroundcolor=white] + +\definepushbutton [prev] +\definepushbutton [next] +\definepushbutton [menu] +\definepushbutton [home] + +\definepushsymbol [prev] [n] [\nb{prev}] +\definepushsymbol [prev] [r] [\rb{prev}] +\definepushsymbol [prev] [d] [\db{prev}] + +\definepushsymbol [next] [n] [\nb{next}] +\definepushsymbol [next] [r] [\rb{next}] +\definepushsymbol [next] [d] [\db{next}] + +\definepushsymbol [menu] [n] [\nb{menu}] +\definepushsymbol [menu] [r] [\rb{menu}] +\definepushsymbol [menu] [d] [\db{menu}] + +\definepushsymbol [home] [n] [\nb{home}] +\definepushsymbol [home] [r] [\rb{home}] +\definepushsymbol [home] [d] [\db{home}] + +\definelayer + [buttons] + [width=\dimexpr\textwidth+\measured{layoutunit}\relax, + height=\dimexpr\textheight+\measured{layoutunit}\relax] % a setups + +\startsetups [document:buttons] + + \setlayer + [buttons] + [preset=leftbottom,offset=-.25\measured{layoutunit}] + {\pushbutton[prev][previouspage]} + + \setlayer + [buttons] + [preset=rightbottom,offset=-.25\measured{layoutunit}] + {\pushbutton[next][nextpage]} + + \setlayer + [buttons] + [preset=lefttop,offset=-.25\measured{layoutunit}] + {\pushbutton[home][homepage]} + + \setlayer + [buttons] + [preset=righttop,offset=-.25\measured{layoutunit}] + {\pushbutton[menu][menupage]} + +\stopsetups + +\defineoverlay[setbuttons][\directsetup{document:buttons}] + +% end of buttons + +\startsetups [document:titlepage] + + \definebodyfontenvironment + [\measure{titlepagefont}] + + \setupbackgrounds + [page] + [background={color,menupage}, + backgroundcolor=secondarycolor] + + \setupbackgrounds + [text] + [background={color,menupage}, + backgroundcolor=secondarycolor] + + \starttopicmakeup[reference=homepage] + + \switchtobodyfont[\measure{titlepagefont}] + + \let\\=\crlf + + \startalignment[flushleft] + \bf + \setupinterlinespace + \begstrut\getvariable{document}{title}\endstrut\par + \stopalignment + + \vfill + + \startalignment[flushright] + \bf + \setupinterlinespace + \begstrut\getvariable{document}{subtitle}\endstrut\par + \stopalignment + + \stoptopicmakeup + + \setupbackgrounds + [page] + [background={color,homepage}, + backgroundcolor=secondarycolor] + + \setupbackgrounds + [text] + [background={color,menupage}, + backgroundcolor=secondarycolor] + + \startcontentmakeup[reference=menupage] + + \setupalign[tolerant,stretch,paragraph] + \flexiblebaselines + \placelist[topic][criterium=text] + + \stopcontentmakeup + + \setupbackgrounds + [page] + % [background={color,menupage}, + [background={color,invoke}, + backgroundcolor=primarycolor] + + \setupbackgrounds + [text] + % [background={color,nextpage,setbuttons,buttons}, + [background={color,setbuttons,buttons}, + backgroundcolor=secondarycolor] + +\stopsetups + +\setupdocument + [before=\directsetup{document:titlepage}] + +\continueifinputfile{s-present-tiles.mkiv} + +\startdocument[title=Whatever We\\Want Here,subtitle=Whatever We\\Want There] + + \dorecurse{12}{\starttopic[title=Topic #1]\input tufte \stoptopic} + +\stopdocument diff --git a/Master/texmf-dist/tex/context/base/s-sql-tables.lua b/Master/texmf-dist/tex/context/base/s-sql-tables.lua new file mode 100644 index 00000000000..43410354134 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-sql-tables.lua @@ -0,0 +1,152 @@ +if not modules then modules = { } end modules ['s-languages-counters'] = { + version = 1.001, + comment = "companion to s-languages-counters.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +require("util-tpl") +require("util-sql") +require("util-sql-tracers") + +moduledata = moduledata or { } +moduledata.sql = moduledata.sql or { } +moduledata.sql.tables = moduledata.sql.tables or { } + +local context = context + +function moduledata.sql.showfields(specification) -- not that sql specific + local data = specification.data + if data and #data > 0 then + local keys = specification.order or table.sortedkeys(data[1]) + local align = specification.align + local template = "|" + if type(align) == "table" then + for i=1,#keys do + template = template .. (align[keys[i]] or "c") .. "|" + end + else + template = template .. string.rep((align or "c").. "|",#keys) + end + context.starttabulate { template } + context.NC() + for i=1,#keys do + context(keys[i]) + context.NC() + end + context.NR() + context.HL() + for i=specification.first or 1,specification.last or #data do + local d = data[i] + context.NC() + for i=1,#keys do + context(d[keys[i]]) + context.NC() + end + context.NR() + end + context.stoptabulate() + end +end + +function moduledata.sql.validpresets(presets) + local okay = true + if presets.database == "" then + context("No database given.") + context.blank() + okay = false + end + if presets.password == "" then + context("No password given") + context.blank() + okay = false + end + return okay +end + +function moduledata.sql.tables.showdefined(presets) -- key=value string | { presets = "name" } | { presets } + + if type(presets) == "string" then + local specification = interfaces.checkedspecification(presets) + if specification.presets then + presets = table.load(specification.presets) or { } + end + end + + if type(presets.presets) == "string" then + presets = table.load(presets.presets) or { } + end + + if not moduledata.sql.validpresets(presets) then + return + end + + local sql_tables = utilities.sql.tracers.gettables(presets) + + context.starttitle { title = presets.database } + + for name, fields in table.sortedhash(sql_tables) do + + context.startsubject { title = name } + + context.starttabulate { format = "|l|l|l|l|l|p|" } + context.FL() + context.NC() context.bold("field") + context.NC() context.bold("type") + context.NC() context.bold("default") + context.NC() context.bold("null") + context.NC() context.bold("key") + context.NC() context.bold("extra") + context.NC() context.NR() + context.TL() + for i=1,#fields do + local field = fields[i] + context.NC() context(field.field) + context.NC() context(field.type) + context.NC() context(field.default) + context.NC() context(field.null) + context.NC() context(field.key) + context.NC() context(field.extra) + context.NC() context.NR() + end + context.LL() + context.stoptabulate() + + context.stopsubject() + end + + context.stoptitle() + +end + +function moduledata.sql.tables.showconstants(list) + + context.starttitle { title = "Constants" } + + for name, fields in table.sortedhash(list) do + + if type(fields) == "table" and #fields > 0 then + + context.startsubject { title = name } + + context.starttabulate { format = "|l|l|" } + for i=0,#fields do + local field = fields[i] + if field then + context.NC() context(i) + context.NC() context(field) + context.NC() context.NR() + end + end + context.stoptabulate() + + context.stopsubject() + + end + + end + + context.stoptitle() + +end diff --git a/Master/texmf-dist/tex/context/base/s-sql-tables.mkiv b/Master/texmf-dist/tex/context/base/s-sql-tables.mkiv new file mode 100644 index 00000000000..6f507e8b595 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-sql-tables.mkiv @@ -0,0 +1,24 @@ +%D \module +%D [ file=s-sql-tables, +%D version=2012.07.12, +%D title=\CONTEXT\ Extra Modules, +%D subtitle=SQL, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% for the moment no helpers + +\startmodule[s-sql-tables] + +\registerctxluafile{s-sql-tables}{} + +\installmodulecommandluasingle \showdefinedsqltables {moduledata.sql.tables.showdefined} + +\stopmodule + + diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi index 88b52868667..f5b29462436 100644 --- a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi @@ -192,9 +192,10 @@ % this comes before starttext \appendtoks % not interfaced i.e. english - \doifvariable{document}{metadata:author} {\setupinteraction [\c!author=\documentvariable{metadata:author}]}% - \doifvariable{document}{metadata:title} {\setupinteraction [\c!title=\documentvariable{metadata:title}]}% - \doifvariable{document}{metadata:subject}{\setupinteraction[\c!subject=\documentvariable{metadata:subject}]}% + \doifvariable{document}{metadata:author} {\setupinteraction [\c!author=\documentvariable{metadata:author}]}% + \doifvariable{document}{metadata:title} {\setupinteraction [\c!title=\documentvariable{metadata:title}]}% + \doifvariable{document}{metadata:subject} {\setupinteraction[\c!subject=\documentvariable{metadata:subject}]}% + \doifvariable{document}{metadata:keywords}{\setupinteraction[\c!keyword=\documentvariable{metadata:keywords}]}% \to \everysetupdocument \setupinteraction diff --git a/Master/texmf-dist/tex/context/base/scrp-cjk.lua b/Master/texmf-dist/tex/context/base/scrp-cjk.lua index 487d5a2672c..f7167b45c0b 100644 --- a/Master/texmf-dist/tex/context/base/scrp-cjk.lua +++ b/Master/texmf-dist/tex/context/base/scrp-cjk.lua @@ -31,8 +31,8 @@ local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue local userskip_code = skipcodes.userskip -local a_prestat = attributes.private('prestat') -local a_preproc = attributes.private('preproc') +local a_scriptstatus = attributes.private('scriptstatus') +local a_scriptinjection = attributes.private('scriptinjection') local categorytonumber = scripts.categorytonumber local numbertocategory = scripts.numbertocategory @@ -425,7 +425,7 @@ local function process(head,first,last) while true do local upcoming, id = first.next, first.id if id == glyph_code then - local a = first[a_prestat] + local a = first[a_scriptstatus] local current = numbertocategory[a] local action = injectors[previous] if action then @@ -434,7 +434,7 @@ local function process(head,first,last) local font = first.font if font ~= lastfont then lastfont = font - set_parameters(font,numbertodataset[first[a_preproc]]) + set_parameters(font,numbertodataset[first[a_scriptinjection]]) end action(head,first) end @@ -445,7 +445,7 @@ local function process(head,first,last) if p and n then local pid, nid = p.id, n.id if pid == glyph_code and nid == glyph_code then - local pa, na = p[a_prestat], n[a_prestat] + local pa, na = p[a_scriptstatus], n[a_scriptstatus] local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" @@ -476,7 +476,7 @@ end scripts.installmethod { name = "hangul", - process = process, + injector = process, datasets = { -- todo: metatables default = { inter_char_shrink_factor = 0.50, -- of quad @@ -646,7 +646,7 @@ local function process(head,first,last) while true do local upcoming, id = first.next, first.id if id == glyph_code then - local a = first[a_prestat] + local a = first[a_scriptstatus] local current = numbertocategory[a] local action = injectors[previous] if action then @@ -655,7 +655,7 @@ local function process(head,first,last) local font = first.font if font ~= lastfont then lastfont = font - set_parameters(font,numbertodataset[first[a_preproc]]) + set_parameters(font,numbertodataset[first[a_scriptinjection]]) end action(head,first) end @@ -666,7 +666,7 @@ local function process(head,first,last) if p and n then local pid, nid = p.id, n.id if pid == glyph_code and nid == glyph_code then - local pa, na = p[a_prestat], n[a_prestat] + local pa, na = p[a_scriptstatus], n[a_scriptstatus] local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" @@ -698,7 +698,7 @@ end scripts.installmethod { name = "hanzi", - process = process, + injector = process, datasets = { default = { inter_char_shrink_factor = 0.50, -- of quad @@ -868,7 +868,7 @@ local function process(head,first,last) while true do local upcoming, id = first.next, first.id if id == glyph_code then - local a = first[a_prestat] + local a = first[a_scriptstatus] local current = numbertocategory[a] local action = injectors[previous] if action then @@ -877,7 +877,7 @@ local function process(head,first,last) local font = first.font if font ~= lastfont then lastfont = font - set_parameters(font,numbertodataset[first[a_preproc]]) + set_parameters(font,numbertodataset[first[a_scriptinjection]]) end action(head,first) end @@ -893,7 +893,7 @@ local function process(head,first,last) if p and n then local pid, nid = p.id, n.id if pid == glyph_code and nid == glyph_code then - local pa, na = p[a_prestat], n[a_prestat] + local pa, na = p[a_scriptstatus], n[a_scriptstatus] local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" @@ -902,7 +902,7 @@ local function process(head,first,last) or pcjk == "half_width_close" or ncjk == "half_width_open" then -- extra compared to korean previous = "start" else -- if head ~= first then -if id == glue_code and first.subtype == userskip_code then -- also prestat check? +if id == glue_code and first.subtype == userskip_code then -- also scriptstatus check? -- for the moment no distinction possible between space and userskip local w = first.spec.width local s = spacedata[p.font] @@ -935,7 +935,7 @@ end scripts.installmethod { name = "nihongo", -- what name to use? - process = process, + injector = process, datasets = { default = { inter_char_shrink_factor = 0.50, -- of quad diff --git a/Master/texmf-dist/tex/context/base/scrp-eth.lua b/Master/texmf-dist/tex/context/base/scrp-eth.lua index e1b8df43232..597afa1b558 100644 --- a/Master/texmf-dist/tex/context/base/scrp-eth.lua +++ b/Master/texmf-dist/tex/context/base/scrp-eth.lua @@ -19,8 +19,8 @@ local new_penalty = nodepool.penalty local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph -local a_prestat = attributes.private('prestat') -local a_preproc = attributes.private('preproc') +local a_scriptstatus = attributes.private('scriptstatus') +local a_scriptinjection = attributes.private('scriptinjection') local categorytonumber = scripts.categorytonumber local numbertocategory = scripts.numbertocategory @@ -37,7 +37,7 @@ local inter_character_stretch_factor = 1 local inter_character_shrink_factor = 1 local function space_glue(current) - local data = numbertodataset[current[a_preproc]] + local data = numbertodataset[current[a_scriptinjection]] if data then inter_character_space_factor = data.inter_character_space_factor or 1 inter_character_stretch_factor = data.inter_character_stretch_factor or 1 @@ -106,8 +106,8 @@ local function process(head,first,last) while current do local id = current.id if id == glyph_code then - local prestat = current[a_prestat] - local category = numbertocategory[prestat] + local scriptstatus = current[a_scriptstatus] + local category = numbertocategory[scriptstatus] if injector then local action = injector[category] if action then @@ -129,7 +129,7 @@ end scripts.installmethod { name = "ethiopic", - process = process, + injector = process, datasets = { default = { inter_character_space_factor = 1, diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.lua b/Master/texmf-dist/tex/context/base/scrp-ini.lua index c375e2ec3d7..18f86475ffc 100644 --- a/Master/texmf-dist/tex/context/base/scrp-ini.lua +++ b/Master/texmf-dist/tex/context/base/scrp-ini.lua @@ -29,14 +29,18 @@ local unsetvalue = attributes.unsetvalue local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue -local a_preproc = attributes.private('preproc') -local a_prestat = attributes.private('prestat') +local a_scriptinjection = attributes.private('scriptinjection') +local a_scriptsplitting = attributes.private('scriptsplitting') +local a_scriptstatus = attributes.private('scriptstatus') local fontdata = fonts.hashes.identifiers local allocate = utilities.storage.allocate local setnodecolor = nodes.tracers.colors.set local setmetatableindex = table.setmetatableindex +local enableaction = nodes.tasks.enableaction +local disableaction = nodes.tasks.disableaction + scripts = scripts or { } local scripts = scripts @@ -46,6 +50,12 @@ local hash = scripts.hash local handlers = allocate() scripts.handlers = handlers +local injectors = allocate() +scripts.injectors = handlers + +local splitters = allocate() +scripts.splitters = splitters + local hash = { -- we could put these presets in char-def.lua -- -- half width opening parenthesis @@ -198,15 +208,19 @@ local numbertohandler = allocate() --~ storage.register("scripts/hash", hash, "scripts.hash") scripts.numbertodataset = numbertodataset +scripts.numbertohandler = numbertohandler local defaults = { inter_char_shrink_factor = 0, + inter_char_shrink_factor = 0, inter_char_stretch_factor = 0, inter_char_half_shrink_factor = 0, inter_char_half_stretch_factor = 0, inter_char_quarter_shrink_factor = 0, inter_char_quarter_stretch_factor = 0, inter_char_hangul_penalty = 0, + + inter_word_stretch_factor = 0, } scripts.defaults = defaults -- so we can add more @@ -283,13 +297,39 @@ function scripts.installdataset(specification) -- global overload end end +local injectorenabled = false +local splitterenabled = false + function scripts.set(name,method,preset) local handler = handlers[method] - texsetattribute(a_preproc,handler and handler.attributes[preset] or unsetvalue) + if handler then + if handler.injector then + if not injectorenabled then + enableaction("processors","scripts.injectors.handler") + injectorenabled = true + end + texsetattribute(a_scriptinjection,handler.attributes[preset] or unsetvalue) + end + if handler.splitter then + if not splitterenabled then + enableaction("processors","scripts.splitters.handler") + splitterenabled = true + end + texsetattribute(a_scriptsplitting,handler.attributes[preset] or unsetvalue) + end + if handler.initializer then + handler.initializer(handler) + handler.initializer = nil + end + else + texsetattribute(a_scriptinjection,unsetvalue) + texsetattribute(a_scriptsplitting,unsetvalue) + end end function scripts.reset() - texsetattribute(handler.attributes[preset]) + texsetattribute(a_scriptinjection,unsetvalue) + texsetattribute(a_scriptsplitting,unsetvalue) end -- the following tables will become a proper installer (move to cjk/eth) @@ -345,7 +385,7 @@ scripts.numbertocategory = numbertocategory local function colorize(start,stop) for n in traverse_id(glyph_code,start) do - local kind = numbertocategory[n[a_prestat]] + local kind = numbertocategory[n[a_scriptstatus]] if kind then local ac = scriptcolors[kind] if ac then @@ -376,7 +416,7 @@ end -- we can have a fonts.hashes.originals -function scripts.preprocess(head) +function scripts.injectors.handler(head) local start = first_glyph(head) -- we already have glyphs here (subtype 1) if not start then return head, false @@ -386,7 +426,7 @@ function scripts.preprocess(head) while start do local id = start.id if id == glyph_code then - local a = start[a_preproc] + local a = start[a_scriptinjection] if a then if a ~= last_a then if first then @@ -405,7 +445,7 @@ function scripts.preprocess(head) end last_a = a local handler = numbertohandler[a] - normal_process = handler.process + normal_process = handler.injector end if normal_process then local f = start.font @@ -424,7 +464,7 @@ function scripts.preprocess(head) end local h = hash[c] if h then - start[a_prestat] = categorytonumber[h] + start[a_scriptstatus] = categorytonumber[h] if not first then first, last = start, start else @@ -502,6 +542,10 @@ function scripts.preprocess(head) end end +function scripts.splitters.handler(head) + return head, false +end + -- new plugin: local registercontext = fonts.specifiers.registercontext @@ -526,14 +570,14 @@ setmetatableindex(cache_nop,function(t,k) local v = { } t[k] = v return v end) -- -- we can consider merging this in handlers.characters(head) at some point as there -- already check for the dynamic attribute so it saves a pass, however, then we also --- need to check for a_preproc there which nils the benefit +-- need to check for a_scriptinjection there which nils the benefit -- -- we can consider cheating: set all glyphs in a word as the first one but it's not -- playing nice function autofontfeature.handler(head) for n in traverse_id(glyph_code,head) do - -- if n[a_preproc] then + -- if n[a_scriptinjection] then -- -- already tagged by script feature, maybe some day adapt -- else local char = n.char @@ -553,7 +597,7 @@ function autofontfeature.handler(head) end if attr ~= 0 then n[0] = attr - -- maybe set preproc when associated + -- maybe set scriptinjection when associated end else local slot = cache_nop[font] @@ -567,7 +611,7 @@ function autofontfeature.handler(head) end if attr ~= 0 then n[0] = attr - -- maybe set preproc when associated + -- maybe set scriptinjection when associated end end end @@ -578,12 +622,12 @@ end function autofontfeature.enable() report_scripts("globally enabled") - nodes.tasks.enableaction("processors","scripts.autofontfeature.handler") + enableaction("processors","scripts.autofontfeature.handler") end function autofontfeature.disable() report_scripts("globally disabled") - nodes.tasks.disableaction("processors","scripts.autofontfeature.handler") + disableaction("processors","scripts.autofontfeature.handler") end commands.enableautofontscript = autofontfeature.enable diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv index bf8b580c79a..fe62295bb62 100644 --- a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv @@ -17,8 +17,9 @@ \registerctxluafile{scrp-cjk}{1.001} \registerctxluafile{scrp-eth}{1.001} -\definesystemattribute[preproc][public] -\definesystemattribute[prestat][public] +\definesystemattribute[scriptinjection][public] +\definesystemattribute[scriptsplitting][public] +\definesystemattribute[scriptstatus] [public] %D Since scripts need specific \LUA\ code we use hard coded attribute %D values, but we might have more tricks at some time, so we use a @@ -56,15 +57,25 @@ \unexpanded\def\stopscript {\endgroup} +% % todo: +% +% \unexpanded\def\setscriptsplitterlist +% {\dodoubleargument\scripts_basics_set_splitter_list} +% +% \def\scripts_basics_set_splitter_list[#1][#2]% +% {\ctxcommand{setscriptsplitterlist("#1","#2")} + % \setscript[hangul] \hangul \startscript[hangul] -\definescript[hangul] [\c!method=hangul] -\definescript[hanzi] [\c!method=hanzi] -\definescript[nihongo] [\c!method=nihongo] +\definescript [hangul] [\c!method=hangul] +\definescript [hanzi] [\c!method=hanzi] +\definescript [nihongo] [\c!method=nihongo] +\definescript [ethiopic] [\c!method=ethiopic] +\definescript [thai] [\c!method=thai] -\definescript[ethiopic][\c!method=ethiopic] +\definescript [latin] [\c!method=] % resets the attribute (also currentscript) -\definescript[latin] [\c!method=] % resets the attribute (also currentscript) +\definescript [test] [\c!method=test] % a new trick (at some point we will predefine more scripts and consider a link with the above) diff --git a/Master/texmf-dist/tex/context/base/status-files.pdf b/Master/texmf-dist/tex/context/base/status-files.pdf Binary files differindex c946b365c08..097fe5a2dca 100644 --- a/Master/texmf-dist/tex/context/base/status-files.pdf +++ b/Master/texmf-dist/tex/context/base/status-files.pdf diff --git a/Master/texmf-dist/tex/context/base/status-lua.pdf b/Master/texmf-dist/tex/context/base/status-lua.pdf Binary files differindex 0a20f8d0366..f727ca843ec 100644 --- a/Master/texmf-dist/tex/context/base/status-lua.pdf +++ b/Master/texmf-dist/tex/context/base/status-lua.pdf diff --git a/Master/texmf-dist/tex/context/base/status-mkiv.lua b/Master/texmf-dist/tex/context/base/status-mkiv.lua index 95139d1d4e2..443eee60ec4 100644 --- a/Master/texmf-dist/tex/context/base/status-mkiv.lua +++ b/Master/texmf-dist/tex/context/base/status-mkiv.lua @@ -3255,6 +3255,12 @@ return { }, { category = "lua", + filename = "font-trt", + loading = "font-lib", + status = "okay", + }, + { + category = "lua", filename = "font-vf", loading = "font-lib", status = "pending", @@ -4261,8 +4267,93 @@ return { }, { category = "lua", + filename = "s-fonts-coverage", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-features", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-missing", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-shapes", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-system", + status = "okay", + }, + { + category = "lua", filename = "s-fonts-tables", - status = "todo", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-vectors", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-counters", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-frequencies", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-hyphenation", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-sorting", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-system", + status = "okay", + }, + { + category = "lua", + filename = "s-math-characters", + status = "okay", + }, + { + category = "lua", + filename = "s-math-coverage", + status = "okay", + }, + { + category = "lua", + filename = "s-math-extensibles", + status = "okay", + }, + { + category = "lua", + filename = "s-fonts-goodies", + status = "okay", + }, + { + category = "lua", + filename = "s-math-parameters", + status = "okay", + }, + { + category = "lua", + filename = "s-physics-units", + status = "okay", }, { category = "lua", @@ -4271,6 +4362,11 @@ return { }, { category = "lua", + filename = "s-sql-tables", + status = "okay", + }, + { + category = "lua", filename = "scrn-but", status = "todo", }, @@ -5250,11 +5346,6 @@ return { }, { category = "mkiv", - filename = "s-fnt-11", - status = "todo", - }, - { - category = "mkiv", filename = "s-fnt-20", status = "todo", }, @@ -5265,53 +5356,61 @@ return { }, { category = "mkiv", - filename = "s-fnt-23", + filename = "s-fnt-24", status = "todo", }, { category = "mkiv", - filename = "s-fnt-24", + filename = "s-fnt-30", status = "todo", }, { category = "mkiv", - filename = "s-fnt-26", - status = "todo", + filename = "s-fonts-coverage", + loading = "s-fonts-coverage", + status = "okay", }, { category = "mkiv", - filename = "s-fnt-28", - status = "todo", + filename = "s-fonts-features", + loading = "s-fonts-features", + status = "okay", }, { category = "mkiv", - filename = "s-fnt-29", - status = "todo", + filename = "s-fonts-goodies", + loading = "s-fonts-goodies", + status = "okay", }, { category = "mkiv", - filename = "s-fnt-30", - status = "todo", + filename = "s-fonts-missing", + loading = "s-fonts-missing", + status = "okay", }, { category = "mkiv", - filename = "s-fnt-31", - status = "todo", + filename = "s-fonts-shapes", + loading = "s-fonts-shapes", + status = "okay", }, { category = "mkiv", - filename = "s-fnt-32", - status = "todo", + filename = "s-fonts-system", + loading = "s-fonts-system", + status = "okay", }, { category = "mkiv", - filename = "s-fonts-missing", - status = "todo", + filename = "s-fonts-tables", + loading = "s-fonts-tables", + status = "okay", }, { category = "mkiv", - filename = "s-fonts-tables", - status = "todo", + filename = "s-fonts-vectors", + loading = "s-fonts-vectors", + status = "okay", }, { category = "mkvi", @@ -5334,6 +5433,36 @@ return { status = "todo", }, { + category = "lua", + filename = "s-languages-counters", + loading = "s-languages-counters", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-frequencies", + loading = "s-languages-frequencies", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-hyphenation", + loading = "s-languages-hyphenation", + status = "okay", + }, + { + category = "mkiv", + filename = "s-languages-sorting", + loading = "s-languages-sorting", + status = "okay", + }, + { + category = "mkiv", + filename = "s-languages-system", + loading = "s-languages-system", + status = "okay", + }, + { category = "mkiv", filename = "s-lan-03", status = "todo", @@ -5360,23 +5489,33 @@ return { }, { category = "mkiv", - filename = "s-mat-10", - status = "todo", + filename = "s-math-characters", + loading = "s-math-characters", + status = "okay", }, { category = "mkiv", - filename = "s-mat-20", + filename = "s-math-coverage", + loading = "s-math-coverage", status = "okay", }, { category = "mkiv", - filename = "s-mat-11", - status = "todo", + filename = "s-math-extensibles", + loading = "s-math-extensibles", + status = "okay", }, { category = "mkiv", - filename = "s-mat-12", - status = "todo", + filename = "s-math-parameters", + loading = "s-math-parameters", + status = "okay", + }, + { + category = "mkiv", + filename = "s-math-repertoire", + loading = "s-math-repertoire", + status = "okay", }, { category = "mkiv", @@ -5395,8 +5534,14 @@ return { }, { category = "mkiv", - filename = "s-phy-01", - status = "todo", + filename = "s-pages-statistics", + status = "okay", + }, + { + category = "mkiv", + filename = "s-physics-units", + loading = "s-physics-units", + status = "okay", }, { category = "tex", @@ -5524,6 +5669,11 @@ return { status = "todo", }, { + category = "mkiv", + filename = "s-present-tiles", + status = "okay", + }, + { category = "tex", filename = "s-pre-50", status = "todo", @@ -5615,6 +5765,12 @@ return { }, { category = "mkiv", + filename = "s-sql-tables", + loading = "s-sql-tables", + status = "okay", + }, + { + category = "mkiv", filename = "x-asciimath", status = "okay", }, diff --git a/Master/texmf-dist/tex/context/base/strc-itm.mkvi b/Master/texmf-dist/tex/context/base/strc-itm.mkvi index 5840ee73ea3..85ec4bc456d 100644 --- a/Master/texmf-dist/tex/context/base/strc-itm.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-itm.mkvi @@ -430,6 +430,7 @@ \setvalue{\??itemgroupkeyword\v!stopper }{\letitemgroupparameter\c!placestopper\v!yes} % keep {} \setvalue{\??itemgroupkeyword\v!unpacked }{\setfalse\c_strc_itemgroups_pack} \setvalue{\??itemgroupkeyword\v!repeat }{\settrue\c_strc_itemgroups_repeat} +\setvalue{\??itemgroupkeyword\v!norepeat }{\setfalse\c_strc_itemgroups_repeat} \setvalue{\??itemgroupkeyword\v!reverse }{\settrue\c_strc_itemgroups_reverse} \setvalue{\??itemgroupkeyword\v!columns }{\settrue\c_strc_itemgroups_columns} \setvalue{\??itemgroupkeyword\v!one }{\letitemgroupparameter\c!n\plusone} @@ -1306,6 +1307,8 @@ \ifx\m_strc_itemgroups_repeat_start\empty \edef\m_strc_itemgroups_repeat_start{\currentitemlevel}% \fi + \else + \let\m_strc_itemgroups_repeat_start\empty \fi} \def\strc_itemgroups_insert_item diff --git a/Master/texmf-dist/tex/context/base/strc-lst.lua b/Master/texmf-dist/tex/context/base/strc-lst.lua index ad7dc0f5413..305b6a6fa5b 100644 --- a/Master/texmf-dist/tex/context/base/strc-lst.lua +++ b/Master/texmf-dist/tex/context/base/strc-lst.lua @@ -679,12 +679,16 @@ commands.listprefixednumber = lists.prefixednumber commands.listprefixedpage = lists.prefixedpage -function commands.addtolist (...) context(lists.addto (...)) end -- we could use variables instead of print -function commands.listsize (...) context(lists.size (...)) end -function commands.listlocation (...) context(lists.location (...)) end -function commands.listlabel (...) context(lists.label (...)) end -function commands.listrealpage (...) context(lists.realpage (...)) end -function commands.listgroupindex(...) context(lists.groupindex(...)) end +function commands.addtolist (...) context(lists.addto (...)) end +function commands.listsize (...) context(lists.size (...)) end +function commands.listlocation (...) context(lists.location (...)) end +function commands.listlabel (...) context(lists.label (...)) end +function commands.listrealpage (...) context(lists.realpage (...)) end +function commands.listgroupindex (...) context(lists.groupindex(...)) end + +function commands.currentsectiontolist() + context(lists.addto(sections.current())) +end function commands.listuserdata(...) local str, metadata = lists.userdata(...) diff --git a/Master/texmf-dist/tex/context/base/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/strc-sec.mkiv index dd51451b9b1..a5ff2084e5a 100644 --- a/Master/texmf-dist/tex/context/base/strc-sec.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-sec.mkiv @@ -204,7 +204,8 @@ userdata = \!!bs\detokenize{#3}\!!es % will be converted to table at the lua end } }}% - \xdef\currentstructurelistnumber{\ctxcommand{addtolist(structures.sections.current())}}% + % \xdef\currentstructurelistnumber{\ctxcommand{addtolist(structures.sections.current())}}% + \xdef\currentstructurelistnumber{\ctxcommand{currentsectiontolist()}}% % \currentstructuresynchronize has to be called someplace, since it introduces a node \setstructuresynchronization\currentstructurelistnumber \endgroup} @@ -722,7 +723,6 @@ \unexpanded\def\placeheadtext {\dosingleempty\strc_sectioning_place_head_text } % use with care \unexpanded\def\placeheadnumber{\dosingleempty\strc_sectioning_place_head_number} % use with care - \unexpanded\def\strc_sectioning_report{\ctxlua{structures.sections.reportstructure()}} \ifdefined\strc_rendering_initialize_style_and_color \else diff --git a/Master/texmf-dist/tex/context/base/supp-box.mkiv b/Master/texmf-dist/tex/context/base/supp-box.mkiv index 25c7764f8d9..83309622261 100644 --- a/Master/texmf-dist/tex/context/base/supp-box.mkiv +++ b/Master/texmf-dist/tex/context/base/supp-box.mkiv @@ -271,15 +271,17 @@ \box\nextbox \endgroup} -\def\syst_boxes_s_w{\wd\nextbox\zeropoint} -\def\syst_boxes_s_h{\ht\nextbox\zeropoint} -\def\syst_boxes_s_d{\dp\nextbox\zeropoint} -\def\syst_boxes_s_t{\ht\nextbox\zeropoint} -\def\syst_boxes_s_b{\dp\nextbox\zeropoint} +\installcorenamespace {smashoptions} + +\setvalue{\??smashoptions w}{\wd\nextbox\zeropoint} +\setvalue{\??smashoptions h}{\ht\nextbox\zeropoint} +\setvalue{\??smashoptions d}{\dp\nextbox\zeropoint} +\setvalue{\??smashoptions t}{\ht\nextbox\zeropoint} +\setvalue{\??smashoptions b}{\dp\nextbox\zeropoint} \def\syst_boxes_smash_process_option#1% {\ifx#1\relax\else - \csname boxes_s_#1\endcsname + \ifcsname\??smashoptions#1\endcsname\csname\??smashoptions#1\endcsname\fi \expandafter\syst_boxes_smash_process_option \fi} diff --git a/Master/texmf-dist/tex/context/base/syst-aux.mkiv b/Master/texmf-dist/tex/context/base/syst-aux.mkiv index 4a8c8d32f26..542b132ae9a 100644 --- a/Master/texmf-dist/tex/context/base/syst-aux.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-aux.mkiv @@ -470,6 +470,8 @@ \def\setugvalue #1{\normalprotected\expandafter\gdef\csname#1\endcsname} \def\setuxvalue #1{\normalprotected\expandafter\xdef\csname#1\endcsname} +\unexpanded\def\getuvalue#1{\csname#1\endcsname} + %D \macros %D {globallet,glet} %D @@ -3494,6 +3496,19 @@ \global\advance\outerrecurse \minusone } %D \macros +%D {dowith} +%D +%D Here's a loop over whatever is in a list: +%D +%D \starttyping +%D \dowith{a,b,c}{[#1]} +%D \stoptyping + +\unexpanded\def\dowith#1#2% + {\def\syst_helpers_with##1{#2}% + \normalexpanded{\processcommalist[#1]}\syst_helpers_with} + +%D \macros %D {doloop,exitloop} %D %D Sometimes loops are not determined by counters, but by @@ -6284,7 +6299,7 @@ \unexpanded\def\freezemeasure {\dodoubleargument\syst_helpers_freeze_measure} -\def\syst_helpers_freede_measure[#1][#2]% +\def\syst_helpers_freeze_measure[#1][#2]% {\expandafter\edef\csname\??measure#1\endcsname{\the\dimexpr#2}} \unexpanded\def\setmeasure #1#2{\expandafter\def \csname\??measure#1\endcsname{#2}} % quick way @@ -6292,8 +6307,11 @@ \unexpanded\def\setemeasure#1#2{\expandafter\edef\csname\??measure#1\endcsname{\the\dimexpr#2}} % quick way \unexpanded\def\setxmeasure#1#2{\expandafter\xdef\csname\??measure#1\endcsname{\the\dimexpr#2}} % quick way -\def\measure#1% maybe \dimexpr ... \relax - {\ifcsname\??measure#1\endcsname\csname\??measure#1\endcsname\else\zeropoint\fi} +\def\measure + {\the\measured} + +\def\measured#1% + {\dimexpr\ifcsname\??measure#1\endcsname\csname\??measure#1\endcsname\else\zeropoint\fi\relax} % #2 could be omitted, but we want to support spaces % diff --git a/Master/texmf-dist/tex/context/base/syst-ini.mkiv b/Master/texmf-dist/tex/context/base/syst-ini.mkiv index 59313ba494c..ab1c53131de 100644 --- a/Master/texmf-dist/tex/context/base/syst-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-ini.mkiv @@ -87,37 +87,42 @@ \expandafter\end \fi -\ifnum\texengine=\luatexengine - \directlua 0 { % this info is stored in the format - lua.name[0] = "main ctx instance" - local extraprimitives = tex.extraprimitives - local enableprimitives = tex.enableprimitives - local core = extraprimitives('core') - local btex = extraprimitives('tex') - local etex = extraprimitives('etex') - local pdftex = extraprimitives('pdftex') - local luatex = extraprimitives('luatex') - local omega = { - "textdir", "pagedir", "mathdir", "pardir", "bodydir", - "leftghost", "rightghost", "localleftbox", "localrightbox", - "localinterlinepenalty", "localbrokenpenalty", - } - local aleph = { - "boxdir", "pagebottomoffset", "pagerightoffset", - } - for _, subset in next, { etex, pdftex, luatex, omega, aleph } do - enableprimitives('',subset) - end - for _, subset in next, { core, btex, etex, pdftex, luatex, omega, aleph } do - enableprimitives('normal',subset) - end +%D Initialization of primitives. + +\directlua 0 { % this info is stored in the format + lua.name[0] = "main ctx instance" + local extraprimitives = tex.extraprimitives + local enableprimitives = tex.enableprimitives + local core = extraprimitives("core") + local btex = extraprimitives("tex") + local etex = extraprimitives("etex") + local pdftex = extraprimitives("pdftex") + local luatex = extraprimitives("luatex") + local omega = { + "textdir", "pagedir", "mathdir", "pardir", "bodydir", + "leftghost", "rightghost", "localleftbox", "localrightbox", + "localinterlinepenalty", "localbrokenpenalty", } -\fi + local aleph = { + "boxdir", "pagebottomoffset", "pagerightoffset", + } + for _, subset in next, { etex, pdftex, luatex, omega, aleph } do + enableprimitives("",subset) + end + for _, subset in next, { core, btex, etex, pdftex, luatex, omega, aleph } do + enableprimitives("normal",subset) + end +} + +%D Handy. + +\suppresslongerror = 1 +\suppressoutererror = 1 %D \ETEX\ has a not so handy way of telling you the version number, i.e. the revision %D number has a period in it: -\long\def\gobbleoneargument#1{} % will be defined later on anyway +\def\gobbleoneargument#1{} % will be defined later on anyway \mathchardef\etexversion = \numexpr\eTeXversion*100+\expandafter\gobbleoneargument\eTeXrevision\relax @@ -286,20 +291,16 @@ %D Since the number of chars exceed 256 now, we can use \type {\chardef} instead of %D the more limited \type {\mathchardef}. -\ifnum\texengine>\pdftexengine - \normalprotected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \chardef\c_syst_max_allocated_register} - \normalprotected\def\newmarks{\syst_basics_allocate\c_syst_last_allocated_marks\marks\chardef\c_syst_max_allocated_register} -\fi +\normalprotected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \chardef\c_syst_max_allocated_register} +\normalprotected\def\newmarks{\syst_basics_allocate\c_syst_last_allocated_marks\marks\chardef\c_syst_max_allocated_register} %D Attributes are something very \LUATEX. In \CONTEXT\ you are not supposed to use %D the attributes directly but always allocate then first. For instance attribute~0 %D is reserved for special purposes (this might change). Attributes in the range %D 128-1023 are private and should not be touched. -\ifnum\texengine=\luatexengine - \let\attributeunsetvalue\c_syst_min_counter_value % used to be \minusone - \normalprotected\def\newattribute{\syst_basics_allocate\c_syst_min_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register} -\fi +\let\attributeunsetvalue\c_syst_min_counter_value % used to be \minusone +\normalprotected\def\newattribute{\syst_basics_allocate\c_syst_min_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register} %D Not used by \CONTEXT\ but for instance \PICTEX\ needs it. It's a trick to force %D strings instead of tokens that take more memory. It's a trick to trick to force @@ -409,22 +410,12 @@ \chardef \pluscxxvii = 127 \chardef \pluscxxviii = 128 \chardef \pluscclv = 255 - -\ifnum\texengine=\luatexengine - \chardef \pluscclvi = 256 - \chardef \plusthousand = 1000 - \chardef \plustenthousand = 10000 - \chardef \plustwentythousand = 20000 - \chardef \medcard = 32768 - \chardef \maxcard = 65536 % pdftex has less mathchars -\else - \mathchardef\pluscclvi = 256 - \mathchardef\plusthousand = 1000 - \mathchardef\plustenthousand = 10000 - \mathchardef\plustwentythousand = 20000 - \newcount \medcard \medcard = 32768 % pdftex has less mathchars - \newcount \maxcard \maxcard = 65536 % pdftex has less mathchars -\fi +\chardef \pluscclvi = 256 +\chardef \plusthousand = 1000 +\chardef \plustenthousand = 10000 +\chardef \plustwentythousand = 20000 +\chardef \medcard = 32768 +\chardef \maxcard = 65536 % pdftex has less mathchars %D \macros %D {doubleexpandafter,tripleexpandafter,expanded,startexpanded} @@ -875,7 +866,7 @@ %D get. Beware: this macro does not support nested loops. We use a namespace %D prefix \type {@@pln}. -\long\def\loop#1\repeat{\long\def\@@plnbody{#1}\@@plniterate} % might go +\def\loop#1\repeat{\def\@@plnbody{#1}\@@plniterate} % might go %D The following makes \type {\loop} \unknown\ \type {\if} \unknown\ \type %D {\repeat} skippable (clever trick): @@ -905,7 +896,7 @@ %D Although we don't add pagenumbers yet we alias the default register used %D for counting pages: -\countdef\pageno=0 \pageno=1 % first page is number 1 +\countdef\pageno\zerocount \pageno\plusone % first page is number 1 %D Beside the raw counter \type {\pageno} the \type {\folio} macro provides %D the value. @@ -923,7 +914,8 @@ \lineskip = 1pt \lineskiplimit = 0pt -%D Again a few kind-of-extensions the core: (might go away) +%D Again a few kind-of-extensions the core. These come from plain \TEX\ but +%D are probably not used in \CONTEXT. \newskip \hideskip \hideskip = -1000pt plus 1fill \newskip \centering \centering = 0pt plus 1000pt minus 1000pt @@ -959,12 +951,12 @@ {\egroup} \egroup -\let\endTEX \relax \long\def\beginTEX #1\endTEX {} -\let\endETEX \relax \long\def\beginETEX #1\endETEX {} -\let\endXETEX \relax \long\def\beginXETEX #1\endXETEX {} -\let\endLUATEX\relax \long\def\beginLUATEX#1\endLUATEX{} -\let\endOLDTEX\relax \long\def\beginOLDTEX#1\endOLDTEX{} -\let\endNEWTEX\relax \long\def\beginNEWTEX#1\endNEWTEX{} +\let\endTEX \relax \def\beginTEX #1\endTEX {} +\let\endETEX \relax \def\beginETEX #1\endETEX {} +\let\endXETEX \relax \def\beginXETEX #1\endXETEX {} +\let\endLUATEX\relax \def\beginLUATEX#1\endLUATEX{} +\let\endOLDTEX\relax \def\beginOLDTEX#1\endOLDTEX{} +\let\endNEWTEX\relax \def\beginNEWTEX#1\endNEWTEX{} \pickupSOMETEX{ETEX} @@ -1019,76 +1011,61 @@ % \bindprimitive ifabsdim ifpdfabsdim % \bindprimitive ifabsnum ifpdfabsnum -\ifnum\texengine=\xetexengine \else % this test might disappear some day - - \pdfminorversion \plusfive - - \ifdefined\pdfcompresslevel \else \newcount\pdfcompresslevel \fi - \ifdefined\pdfobjcompresslevel \else \newcount\pdfobjcompresslevel \fi - \ifdefined\pdfgentounicode \else \newcount\pdfgentounicode \fi \pdfgentounicode \plusone - \ifdefined\pdfinclusioncopyfonts\else \newcount\pdfinclusioncopyfonts \fi \pdfinclusioncopyfonts\plusone - - \normalprotected\def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount} - \normalprotected\def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine } - \normalprotected\def\normalpdfcompression {\pdfobjcompresslevel\plusthree \pdfcompresslevel\plusthree} - - \normalpdfcompression +%D We need to make sure that we start up in \DVI\ mode, so, after testing for running +%D \PDFTEX, we default to \DVI. - \let\normalsetrandomseed \setrandomseed - \let\normaluniformdeviate\uniformdeviate +\pdfoutput \zerocount +\pdfminorversion \plusfive +\pdfgentounicode \plusone +\pdfinclusioncopyfonts\plusone -\fi +\normalprotected\def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount} +\normalprotected\def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine } +\normalprotected\def\normalpdfcompression {\pdfobjcompresslevel\plusthree \pdfcompresslevel\plusthree} -%D Handy. +\normalpdfcompression -\ifnum\texengine=\luatexengine - \ifdefined\suppresslongerror % for the moment test - \suppresslongerror\plusone - \fi -\fi +\let\normalsetrandomseed \setrandomseed +\let\normaluniformdeviate\uniformdeviate %D Basic status stuff. \newif\ifproductionrun -%D We need to make sure that we start up in \DVI\ mode, so, after testing for running -%D \PDFTEX, we default to \DVI. - -\ifx\pdftexversion\undefined \newcount\pdfoutput \fi \pdfoutput=0 - %D For those who expect this \unknown -\ifx\fmtname \undefined \def\fmtname {ConTeXt Minimized Plain TeX} \fi -\ifx\fmtversion\undefined \def\fmtversion{3.1415926} \fi - -\let\normalfmtversion\fmtversion % still needed ? +\ifx\fmtname \undefined \def\fmtname {ConTeXt Initial TeX} \fi +\ifx\fmtversion\undefined \def\fmtversion{3.1415926} \fi %D A few bonus macros: \def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax} \def\dividenumber#1#2{\the\numexpr(#2-(#1/2))/#1\relax} -\ifnum\texengine=\xetexengine - \edef\xetexversion {\numexpr\XeTeXversion*100+(\expandafter\gobbleoneargument\XeTeXrevision-5)/10\relax} - \edef\xetexrevision {\the\numexpr(\expandafter\gobbleoneargument\XeTeXrevision-50)/100\relax} -\fi - -\ifcase\texengine - \def \texenginename {impossible} - \edef\texengineversion{0} -\or - \def \texenginename {pdfTeX} - \edef\texengineversion{\dividenumber{100}\pdftexversion.\modulonumber{100}\pdftexversion.\pdftexrevision} -\or - \def \texenginename {XeTeX} - \edef\texengineversion{\dividenumber{100}\xetexversion .\modulonumber{100}\xetexversion .\xetexrevision} -\or - \def \texenginename {LuaTeX} - \edef\texengineversion{\dividenumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision} -\else - \def \texenginename {impossible} - \edef\texengineversion{0} -\fi +% \ifnum\texengine=\xetexengine +% \edef\xetexversion {\numexpr\XeTeXversion*100+(\expandafter\gobbleoneargument\XeTeXrevision-5)/10\relax} +% \edef\xetexrevision {\the\numexpr(\expandafter\gobbleoneargument\XeTeXrevision-50)/100\relax} +% \fi +% +% \ifcase\texengine +% \def \texenginename {impossible} +% \edef\texengineversion{0} +% \or +% \def \texenginename {pdfTeX} +% \edef\texengineversion{\dividenumber{100}\pdftexversion.\modulonumber{100}\pdftexversion.\pdftexrevision} +% \or +% \def \texenginename {XeTeX} +% \edef\texengineversion{\dividenumber{100}\xetexversion .\modulonumber{100}\xetexversion .\xetexrevision} +% \or +% \def \texenginename {LuaTeX} +% \edef\texengineversion{\dividenumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision} +% \else +% \def \texenginename {impossible} +% \edef\texengineversion{0} +% \fi + +\def \texenginename {LuaTeX} +\edef\texengineversion{\dividenumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision} %D We have no reason not to enable this: diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv index ec1b78b13cd..57134cb53aa 100644 --- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv @@ -1706,8 +1706,8 @@ [\c!frameoffset=.5\linewidth, \c!backgroundoffset=\v!frame, \c!framecolor=\s!black, - \c!width=fit, - \c!height=fit, + \c!width=\v!fit, + \c!height=\v!fit, \c!autowidth=\v!yes, % \c!rulethickness=\linewidth, \c!strut=\v!no, diff --git a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi index 03c68e60332..aba4e502718 100644 --- a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi +++ b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi @@ -168,17 +168,17 @@ % really need them and use the embeddedxtable command when nesting them. % Implementing nesting would be slower than not using direct buffers. -\def\tabl_x_process_buffer_directly[#name]% +\unexpanded\def\tabl_x_process_buffer_directly[#name]% {\bgroup \let\tabl_x_start_table\tabl_x_process_buffer \edef\tabl_x_current_buffer{#name}% \tabl_x_get_buffer % pickup settings \tabl_x_process} -\def\tabl_x_start_ignore[#settings]% +\unexpanded\def\tabl_x_start_ignore[#settings]% {} -\def\tabl_x_process_buffer[#settings]% +\unexpanded\def\tabl_x_process_buffer[#settings]% {\tabl_x_prepare{#settings}% \let\tabl_x_start_table\tabl_x_start_ignore \gobbleuntil\stopxtable} % nested xtables are not supported, @@ -189,7 +189,7 @@ \unexpanded\def\startembeddedxtable {\dosingleempty\tabl_x_embedded_start} -\def\tabl_x_embedded_start[#settings]#content\stopembeddedxtable +\unexpanded\def\tabl_x_embedded_start[#settings]#content\stopembeddedxtable {\tabl_x_prepare{#settings}% \ctxcommand{assignbuffer("embedded_x_table",\!!bs\detokenize{#content}\!!es)}% \bgroup @@ -227,7 +227,7 @@ %D Now we come to processing: -\def\tabl_x_check_textwidth +\unexpanded\def\tabl_x_check_textwidth {\edef\p_textwidth{\xtableparameter\c!textwidth}% \ifx\p_textwidth\v!local \d_tabl_x_textwidth\availablehsize @@ -235,7 +235,7 @@ \d_tabl_x_textwidth\p_textwidth \fi} -\def\tabl_x_prepare#settings% assumes \iffirstargument to be set +\unexpanded\def\tabl_x_prepare#settings% assumes \iffirstargument to be set {\advance\c_tabl_x_nesting\plusone \dostarttagged\t!table\empty \iffirstargument @@ -247,7 +247,12 @@ \def\tabl_x_get_buffer {\ctxcommand{gettexbuffer("\tabl_x_current_buffer")}} -\let\tabl_x_stop_cell\relax +\let\tabl_x_start_row_yes \relax +\let\tabl_x_start_row_nop \relax +\let\tabl_x_stop_row \relax +\let\tabl_x_start_cell_yes\relax +\let\tabl_x_start_cell_nop\relax +\let\tabl_x_stop_cell \relax \unexpanded\def\tabl_x_process {\begingroup % * @@ -322,7 +327,7 @@ \installcorenamespace{xtableflushsplit} -\def\tabl_x_flush_text_checked +\unexpanded\def\tabl_x_flush_text_checked {\expandnamespaceparameter\??xtableflushsplit\xtableparameter\c!split\v!no} % in text flow: headers and footers only once @@ -371,10 +376,10 @@ \let\extratxtablesplitheight\zeropoint % might disappear so don't depend on it -\def\tabl_x_flush_float_normal +\unexpanded\def\tabl_x_flush_float_normal {\ctxcommand{x_table_flush{ method = "\v!normal" }}} -\def\tabl_x_flush_float_split +\unexpanded\def\tabl_x_flush_float_split {\resetdirecttsplit \edef\extrasplitfloatlines {\xtableparameter\c!split}% \edef\tsplitminimumfreespace{\the\dimexpr\extratxtablesplitheight+\xtableparameter\c!splitoffset\relax}% @@ -383,7 +388,7 @@ \let\tsplitdirectwidth \d_tabl_x_final_width \handledirecttsplit} -\def\tabl_x_split_splitter#vsize% +\unexpanded\def\tabl_x_split_splitter#vsize% {\setbox\tsplitresult\vbox {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr#vsize }}}% \ifcase\c_tabl_x_state @@ -396,30 +401,30 @@ {\begingroup \doifnextoptionalelse\tabl_x_start_row_yes\tabl_x_start_row_nop} -\def\tabl_x_start_row_reflow_width_yes[#settings]% +\unexpanded\def\tabl_x_start_row_reflow_width_yes[#settings]% {\setupcurrentxtable[#settings]% \ctxcommand{x_table_next_row()}} -\def\tabl_x_start_row_reflow_width_nop +\unexpanded\def\tabl_x_start_row_reflow_width_nop {\ctxcommand{x_table_next_row()}} -\def\tabl_x_stop_row_reflow_width +\unexpanded\def\tabl_x_stop_row_reflow_width {} \let\tabl_x_start_row_reflow_height_yes\tabl_x_start_row_reflow_width_yes \let\tabl_x_start_row_reflow_height_nop\tabl_x_start_row_reflow_width_nop \let\tabl_x_stop_row_reflow_height \tabl_x_stop_row_reflow_width -\def\tabl_x_start_row_construct_yes[#settings]% +\unexpanded\def\tabl_x_start_row_construct_yes[#settings]% {\setupcurrentxtable[#settings]% \dostarttagged\t!tablerow\empty \ctxcommand{x_table_next_row()}} -\def\tabl_x_start_row_construct_nop +\unexpanded\def\tabl_x_start_row_construct_nop {\dostarttagged\t!tablerow\empty \ctxcommand{x_table_next_row()}} -\def\tabl_x_stop_row_construct +\unexpanded\def\tabl_x_stop_row_construct {\dostoptagged} \unexpanded\def\stopxrow @@ -432,11 +437,11 @@ \unexpanded\def\stopxcell {\tabl_x_stop_cell} -\def\tabl_x_begin_of_cell +\unexpanded\def\tabl_x_begin_of_cell {\inhibitblank \everypar{\delayedbegstrut}} -\def\tabl_x_end_of_cell +\unexpanded\def\tabl_x_end_of_cell {\ifhmode \delayedendstrut \par @@ -674,7 +679,7 @@ \unexpanded\def\stopxgroup {\endgroup} -\def\tabl_x_start_group_delayed_one[#tag]% +\unexpanded\def\tabl_x_start_group_delayed_one[#tag]% % {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname {\ifcsname\??xtablecheck#tag\endcsname \expandafter\tabl_x_start_group_delayed_two @@ -682,7 +687,7 @@ \expandafter\setupcurrentxtable \fi[#tag]} -\def\tabl_x_start_group_delayed_two[#tag]% +\unexpanded\def\tabl_x_start_group_delayed_two[#tag]% {\ifx\currentxtable\empty \else \chaintocurrentxtable{#tag}% \fi @@ -700,7 +705,7 @@ {\begingroup \doifnextoptionalelse\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop} -\def\tabl_x_start_cell_delayed_one[#tag]% +\unexpanded\def\tabl_x_start_cell_delayed_one[#tag]% % {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname {\ifcsname\??xtablecheck#tag\endcsname \expandafter\tabl_x_start_cell_delayed_two @@ -708,7 +713,7 @@ \expandafter\tabl_x_start_cell_yes \fi[#tag]} -\def\tabl_x_start_cell_delayed_two[#tag]% +\unexpanded\def\tabl_x_start_cell_delayed_two[#tag]% {\ifx\currentxtable\empty \else \chaintocurrentxtable{#tag}% \fi @@ -725,7 +730,7 @@ {\begingroup \doifnextoptionalelse\tabl_x_start_row_delayed_one\tabl_x_start_row_nop} -\def\tabl_x_start_row_delayed_one[#tag]% +\unexpanded\def\tabl_x_start_row_delayed_one[#tag]% % {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname {\ifcsname\??xtablecheck#tag\endcsname \expandafter\tabl_x_start_row_delayed_two @@ -733,7 +738,7 @@ \expandafter\tabl_x_start_row_yes \fi[#tag]} -\def\tabl_x_start_row_delayed_two[#tag]% +\unexpanded\def\tabl_x_start_row_delayed_two[#tag]% {\ifx\currentxtable\empty \else \chaintocurrentxtable{#tag}% \fi diff --git a/Master/texmf-dist/tex/context/base/task-ini.lua b/Master/texmf-dist/tex/context/base/task-ini.lua index 011ed50ca81..0f477cb6eb3 100644 --- a/Master/texmf-dist/tex/context/base/task-ini.lua +++ b/Master/texmf-dist/tex/context/base/task-ini.lua @@ -24,11 +24,12 @@ appendaction("processors", "normalizers", "fonts.collections.process") appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled appendaction("processors", "characters", "scripts.autofontfeature.handler") +appendaction("processors", "characters", "scripts.splitters.handler") -- disabled appendaction("processors", "characters", "typesetters.cleaners.handler") -- disabled appendaction("processors", "characters", "typesetters.directions.handler") -- disabled appendaction("processors", "characters", "typesetters.cases.handler") -- disabled appendaction("processors", "characters", "typesetters.breakpoints.handler") -- disabled -appendaction("processors", "characters", "scripts.preprocess") +appendaction("processors", "characters", "scripts.injectors.handler") -- disabled appendaction("processors", "words", "builders.kernel.hyphenation") -- always on appendaction("processors", "words", "languages.words.check") -- disabled @@ -108,6 +109,8 @@ appendaction("vboxbuilders","normalizers","typesetters.checkers.handler") -- speedup: only kick in when used disableaction("processors", "scripts.autofontfeature.handler") +disableaction("processors", "scripts.splitters.handler") +disableaction("processors", "scripts.injectors.handler") -- was enabled disableaction("processors", "fonts.collections.process") disableaction("processors", "fonts.checkers.missing") disableaction("processors", "chars.handle_breakpoints") diff --git a/Master/texmf-dist/tex/context/base/trac-log.lua b/Master/texmf-dist/tex/context/base/trac-log.lua index be2a954e3e9..1f2520130c5 100644 --- a/Master/texmf-dist/tex/context/base/trac-log.lua +++ b/Master/texmf-dist/tex/context/base/trac-log.lua @@ -14,7 +14,7 @@ if not modules then modules = { } end modules ['trac-log'] = { -- local texio_write_nl = texio.write_nl -- local texio_write = texio.write -- local io_write = io.write --- + -- local write_nl = function(target,...) -- if not io_write then -- io_write = io.write @@ -34,7 +34,7 @@ if not modules then modules = { } end modules ['trac-log'] = { -- io_write(target,...) -- end -- end --- + -- local write = function(target,...) -- if not io_write then -- io_write = io.write @@ -51,7 +51,7 @@ if not modules then modules = { } end modules ['trac-log'] = { -- io_write(target,...) -- end -- end --- + -- texio.write = write -- texio.write_nl = write_nl -- diff --git a/Master/texmf-dist/tex/context/base/type-imp-cow.mkiv b/Master/texmf-dist/tex/context/base/type-imp-cow.mkiv index 1cb825a1192..f93e36428c0 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-cow.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-cow.mkiv @@ -77,7 +77,7 @@ \definetypeface [sheep][rm][serif][sheep] [default] \definetypeface [sheep][ss][serif][sheep] [default] \definetypeface [sheep][mm][math] [sheep] [default] - \definetypeface [sheep][tt][mono] [modern][default][,rscale=0.85] + \definetypeface [sheep][tt][mono] [modern][default][rscale=0.85] \stoptypescript \stoptypescriptcollection diff --git a/Master/texmf-dist/tex/context/base/type-imp-husayni.mkiv b/Master/texmf-dist/tex/context/base/type-imp-husayni.mkiv index b81996c3379..76cbf77db65 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-husayni.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-husayni.mkiv @@ -20,40 +20,40 @@ mode=node, language=dflt, script=arab, - ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement - init=yes, % contextual analysis - medi=yes, % contextual analysis - fina=yes, % contextual analysis - rlig=yes, % indispensable - calt=yes, % ayah+numerals - salt=yes, % includes manual justification with Tatwiil - anum=yes, % replace latin numerals with arabic-script ones - ss01=yes, % Allah, Muhammad, - ss03=yes, % level-1 stack over Jiim, initial entry only - ss10=yes, % basic dipped Miim, initial-entry B_S-stack over Miim - ss12=yes, % XBM_im initial-medial entry B_S-stack over Miim, - ss15=yes, % full stacked Laam-on-Miim - ss16=yes, % initial entry, stacked Ayn-on-Miim - ss19=yes, % LM_im - ss24=yes, % BR_i_mf, BN_i_mf - ss25=yes, % basic LH_im % might merge with ss24 - ss26=yes, % full Yaa.final special strings: BY_if, BY_mf, LY_mf - ss27=yes, % basic thin Miim.final - ss31=yes, % basic Raa.final strings: JR and SR - ss34=yes, % AyR style % also available in jsnn - ss35=yes, % full Kaaf contexts - ss36=yes, % full Laam contexts - ss37=yes, % Miim-Miim contexts - ss38=yes, % basic dipped Haa, B_SH_mm - ss41=yes, % high and low Baa strings - ss42=yes, % diagonal entry - ss43=yes, % initial alternates - ss60=yes, % - js16=yes, % aesthetic medial Faa/Qaaf - kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings - curs=yes, % we don't curs final pairs, padj for that - mark=yes, % vowels - mkmk=yes, % stacked vowels + ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement + init=yes, % contextual analysis + medi=yes, % contextual analysis + fina=yes, % contextual analysis + rlig=yes, % indispensable + calt=yes, % ayah+numerals + salt=yes, % includes manual justification with Tatwiil + anum=yes, % replace latin numerals with arabic-script ones + ss01=yes, % Allah, Muhammad, + ss03=yes, % level-1 stack over Jiim, initial entry only + ss10=yes, % basic dipped Miim, initial-entry B_S-stack over Miim + ss12=yes, % XBM_im initial-medial entry B_S-stack over Miim, + ss15=yes, % full stacked Laam-on-Miim + ss16=yes, % initial entry, stacked Ayn-on-Miim + ss19=yes, % LM_im + ss24=yes, % BR_i_mf, BN_i_mf + ss25=yes, % basic LH_im % might merge with ss24 + ss26=yes, % full Yaa.final special strings: BY_if, BY_mf, LY_mf + ss27=yes, % basic thin Miim.final + ss31=yes, % basic Raa.final strings: JR and SR + ss34=yes, % AyR style % also available in jsnn + ss35=yes, % full Kaaf contexts + ss36=yes, % full Laam contexts + ss37=yes, % Miim-Miim contexts + ss38=yes, % basic dipped Haa, B_SH_mm + ss41=yes, % high and low Baa strings + ss42=yes, % diagonal entry + ss43=yes, % initial alternates + ss60=yes, % + js16=yes, % aesthetic medial Faa/Qaaf + kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings + curs=yes, % we don't curs final pairs, padj for that + mark=yes, % vowels + mkmk=yes, % stacked vowels tlig=yes, goodies=husayni, colorscheme=default] @@ -64,40 +64,40 @@ mode=node, language=dflt, script=arab, - ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement - init=yes, % contextual analysis - medi=yes, % contextual analysis - fina=yes, % contextual analysis - rlig=yes, % indispensable - calt=yes, % ayah+numerals - salt=yes, % includes manual justification with Tatwiil - anum=yes, % replace latin numerals with arabic-script ones - ss01=yes, % Allah, Muhammad, - ss03=yes, % level-1 stack over Jiim, initial entry only - ss10=yes, % basic dipped Miim, initial-entry B_S-stack over Miim - ss12=yes, % XBM_im initial-medial entry B_S-stack over Miim, - ss15=yes, % full stacked Laam-on-Miim - ss16=yes, % initial entry, stacked Ayn-on-Miim - ss19=yes, % LM_im - ss24=yes, % BR_i_mf, BN_i_mf - ss25=yes, % basic LH_im % might merge with ss24 - ss26=yes, % full Yaa.final special strings: BY_if, BY_mf, LY_mf - ss27=yes, % basic thin Miim.final - ss31=yes, % basic Raa.final strings: JR and SR - ss34=yes, % AyR style % also available in jsnn - ss35=yes, % full Kaaf contexts - ss36=yes, % full Laam contexts - ss37=yes, % Miim-Miim contexts - ss38=yes, % basic dipped Haa, B_SH_mm - ss41=yes, % high and low Baa strings - ss42=yes, % diagonal entry - ss43=yes, % initial alternates - ss60=yes, % - js16=yes, % aesthetic medial Faa/Qaaf - kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings - curs=yes, % we don't curs final pairs, padj for that - mark=yes, % vowels - mkmk=yes, % stacked vowels + ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement + init=yes, % contextual analysis + medi=yes, % contextual analysis + fina=yes, % contextual analysis + rlig=yes, % indispensable + calt=yes, % ayah+numerals + salt=yes, % includes manual justification with Tatwiil + anum=yes, % replace latin numerals with arabic-script ones + ss01=yes, % Allah, Muhammad, + ss03=yes, % level-1 stack over Jiim, initial entry only + ss10=yes, % basic dipped Miim, initial-entry B_S-stack over Miim + ss12=yes, % XBM_im initial-medial entry B_S-stack over Miim, + ss15=yes, % full stacked Laam-on-Miim + ss16=yes, % initial entry, stacked Ayn-on-Miim + ss19=yes, % LM_im + ss24=yes, % BR_i_mf, BN_i_mf + ss25=yes, % basic LH_im % might merge with ss24 + ss26=yes, % full Yaa.final special strings: BY_if, BY_mf, LY_mf + ss27=yes, % basic thin Miim.final + ss31=yes, % basic Raa.final strings: JR and SR + ss34=yes, % AyR style % also available in jsnn + ss35=yes, % full Kaaf contexts + ss36=yes, % full Laam contexts + ss37=yes, % Miim-Miim contexts + ss38=yes, % basic dipped Haa, B_SH_mm + ss41=yes, % high and low Baa strings + ss42=yes, % diagonal entry + ss43=yes, % initial alternates + ss60=yes, % + js16=yes, % aesthetic medial Faa/Qaaf + kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings + curs=yes, % we don't curs final pairs, padj for that + mark=yes, % vowels + mkmk=yes, % stacked vowels tlig=yes] \definefontfeature diff --git a/Master/texmf-dist/tex/context/base/type-imp-latinmodern.mkiv b/Master/texmf-dist/tex/context/base/type-imp-latinmodern.mkiv index b0e25e82ca1..afe2c641778 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-latinmodern.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-latinmodern.mkiv @@ -230,8 +230,6 @@ %D It doesn't hurt to have these, at least for the moment (can go to type-imp-symbol) -\definefontsynonym [ZapfDingbats] [\s!file:uzdr] [\s!features=dingbats] % [\s!goodies=dingbats] -%definefontsynonym [MartinVogel] [\s!file:marvosym.ttf] -%definefontsynonym [RalfSmithFormalScript] [\s!file:rsfs10] +\definefontsynonym [ZapfDingbats] [\s!file:uzdr] [\s!features=dingbats]% [\s!goodies=dingbats] \endinput diff --git a/Master/texmf-dist/tex/context/base/type-imp-lmnames.mkiv b/Master/texmf-dist/tex/context/base/type-imp-lmnames.mkiv index 620c5d03b3e..11ba93c348b 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-lmnames.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-lmnames.mkiv @@ -15,63 +15,63 @@ \starttypescript [\s!serif] [modern,latin-modern-designsize,latin-modern] - \definefontsynonym [LMRoman5-Regular] [\s!file:lmroman5-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman6-Regular] [\s!file:lmroman6-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman7-Regular] [\s!file:lmroman7-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman8-Regular] [\s!file:lmroman8-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman9-Regular] [\s!file:lmroman9-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Regular] [\s!file:lmroman10-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman12-Regular] [\s!file:lmroman12-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman17-Regular] [\s!file:lmroman17-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman5-Bold] [\s!file:lmroman5-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman6-Bold] [\s!file:lmroman6-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman7-Bold] [\s!file:lmroman7-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman8-Bold] [\s!file:lmroman8-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman9-Bold] [\s!file:lmroman9-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Bold] [\s!file:lmroman10-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman12-Bold] [\s!file:lmroman12-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman7-Italic] [\s!file:lmroman7-italic] [\s!features=\s!default] - \definefontsynonym [LMRoman8-Italic] [\s!file:lmroman8-italic] [\s!features=\s!default] - \definefontsynonym [LMRoman9-Italic] [\s!file:lmroman9-italic] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Italic] [\s!file:lmroman10-italic] [\s!features=\s!default] - \definefontsynonym [LMRoman12-Italic] [\s!file:lmroman12-italic] [\s!features=\s!default] - \definefontsynonym [LMRoman10-BoldItalic] [\s!file:lmroman10-bolditalic] [\s!features=\s!default] - \definefontsynonym [LMRoman8-Oblique] [\s!file:lmromanslant8-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman9-Oblique] [\s!file:lmromanslant9-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Oblique] [\s!file:lmromanslant10-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman12-Oblique] [\s!file:lmromanslant12-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman17-Oblique] [\s!file:lmromanslant17-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-BoldOblique] [\s!file:lmromanslant10-bold] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Demi] [\s!file:lmromandemi10-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-DemiOblique] [\s!file:lmromandemi10-oblique] [\s!features=\s!default] - \definefontsynonym [LMRoman10-CapsRegular] [\s!file:lmromancaps10-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-CapsOblique] [\s!file:lmromancaps10-oblique] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Dunhill] [\s!file:lmromandunh10-regular] [\s!features=\s!default] - \definefontsynonym [LMRoman10-DunhillOblique] [\s!file:lmromandunh10-oblique] [\s!features=\s!default] - \definefontsynonym [LMRoman10-Unslanted] [\s!file:lmromanunsl10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman5-Regular] [\s!file:lmroman5-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman6-Regular] [\s!file:lmroman6-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman7-Regular] [\s!file:lmroman7-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman8-Regular] [\s!file:lmroman8-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman9-Regular] [\s!file:lmroman9-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Regular] [\s!file:lmroman10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman12-Regular] [\s!file:lmroman12-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman17-Regular] [\s!file:lmroman17-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman5-Bold] [\s!file:lmroman5-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman6-Bold] [\s!file:lmroman6-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman7-Bold] [\s!file:lmroman7-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman8-Bold] [\s!file:lmroman8-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman9-Bold] [\s!file:lmroman9-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Bold] [\s!file:lmroman10-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman12-Bold] [\s!file:lmroman12-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman7-Italic] [\s!file:lmroman7-italic] [\s!features=\s!default] + \definefontsynonym [LMRoman8-Italic] [\s!file:lmroman8-italic] [\s!features=\s!default] + \definefontsynonym [LMRoman9-Italic] [\s!file:lmroman9-italic] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Italic] [\s!file:lmroman10-italic] [\s!features=\s!default] + \definefontsynonym [LMRoman12-Italic] [\s!file:lmroman12-italic] [\s!features=\s!default] + \definefontsynonym [LMRoman10-BoldItalic] [\s!file:lmroman10-bolditalic] [\s!features=\s!default] + \definefontsynonym [LMRoman8-Oblique] [\s!file:lmromanslant8-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman9-Oblique] [\s!file:lmromanslant9-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Oblique] [\s!file:lmromanslant10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman12-Oblique] [\s!file:lmromanslant12-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman17-Oblique] [\s!file:lmromanslant17-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-BoldOblique] [\s!file:lmromanslant10-bold] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Demi] [\s!file:lmromandemi10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-DemiOblique] [\s!file:lmromandemi10-oblique] [\s!features=\s!default] + \definefontsynonym [LMRoman10-CapsRegular] [\s!file:lmromancaps10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-CapsOblique] [\s!file:lmromancaps10-oblique] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Dunhill] [\s!file:lmromandunh10-regular] [\s!features=\s!default] + \definefontsynonym [LMRoman10-DunhillOblique] [\s!file:lmromandunh10-oblique] [\s!features=\s!default] + \definefontsynonym [LMRoman10-Unslanted] [\s!file:lmromanunsl10-regular] [\s!features=\s!default] \stoptypescript \starttypescript [\s!sans] [modern,latin-modern-designsize,latin-modern] - \definefontsynonym [LMSans8-Regular] [\s!file:lmsans8-regular] [\s!features=\s!default] - \definefontsynonym [LMSans9-Regular] [\s!file:lmsans9-regular] [\s!features=\s!default] - \definefontsynonym [LMSans10-Regular] [\s!file:lmsans10-regular] [\s!features=\s!default] - \definefontsynonym [LMSans12-Regular] [\s!file:lmsans12-regular] [\s!features=\s!default] - \definefontsynonym [LMSans17-Regular] [\s!file:lmsans17-regular] [\s!features=\s!default] - \definefontsynonym [LMSans10-Bold] [\s!file:lmsans10-bold] [\s!features=\s!default] - \definefontsynonym [LMSans8-Oblique] [\s!file:lmsans8-oblique] [\s!features=\s!default] - \definefontsynonym [LMSans9-Oblique] [\s!file:lmsans9-oblique] [\s!features=\s!default] - \definefontsynonym [LMSans10-Oblique] [\s!file:lmsans10-oblique] [\s!features=\s!default] - \definefontsynonym [LMSans12-Oblique] [\s!file:lmsans12-oblique] [\s!features=\s!default] - \definefontsynonym [LMSans17-Oblique] [\s!file:lmsans17-oblique] [\s!features=\s!default] - \definefontsynonym [LMSans10-BoldOblique] [\s!file:lmsans10-boldoblique] [\s!features=\s!default] - \definefontsynonym [LMSans10-DemiCondensed] [\s!file:lmsansdemicond10-regular] [\s!features=\s!default] - \definefontsynonym [LMSans10-DemiCondensedOblique] [\s!file:lmsansdemicond10-oblique] [\s!features=\s!default] - \definefontsynonym [LMSansQuotation8-Regular] [\s!file:lmsansquot8-regular] [\s!features=\s!default] - \definefontsynonym [LMSansQuotation8-Bold] [\s!file:lmsansquot8-bold] [\s!features=\s!default] - \definefontsynonym [LMSansQuotation8-Oblique] [\s!file:lmsansquot8-oblique] [\s!features=\s!default] - \definefontsynonym [LMSansQuotation8-BoldOblique] [\s!file:lmsansquot8-boldoblique] [\s!features=\s!default] + \definefontsynonym [LMSans8-Regular] [\s!file:lmsans8-regular] [\s!features=\s!default] + \definefontsynonym [LMSans9-Regular] [\s!file:lmsans9-regular] [\s!features=\s!default] + \definefontsynonym [LMSans10-Regular] [\s!file:lmsans10-regular] [\s!features=\s!default] + \definefontsynonym [LMSans12-Regular] [\s!file:lmsans12-regular] [\s!features=\s!default] + \definefontsynonym [LMSans17-Regular] [\s!file:lmsans17-regular] [\s!features=\s!default] + \definefontsynonym [LMSans10-Bold] [\s!file:lmsans10-bold] [\s!features=\s!default] + \definefontsynonym [LMSans8-Oblique] [\s!file:lmsans8-oblique] [\s!features=\s!default] + \definefontsynonym [LMSans9-Oblique] [\s!file:lmsans9-oblique] [\s!features=\s!default] + \definefontsynonym [LMSans10-Oblique] [\s!file:lmsans10-oblique] [\s!features=\s!default] + \definefontsynonym [LMSans12-Oblique] [\s!file:lmsans12-oblique] [\s!features=\s!default] + \definefontsynonym [LMSans17-Oblique] [\s!file:lmsans17-oblique] [\s!features=\s!default] + \definefontsynonym [LMSans10-BoldOblique] [\s!file:lmsans10-boldoblique] [\s!features=\s!default] + \definefontsynonym [LMSans10-DemiCondensed] [\s!file:lmsansdemicond10-regular] [\s!features=\s!default] + \definefontsynonym [LMSans10-DemiCondensedOblique] [\s!file:lmsansdemicond10-oblique] [\s!features=\s!default] + \definefontsynonym [LMSansQuotation8-Regular] [\s!file:lmsansquot8-regular] [\s!features=\s!default] + \definefontsynonym [LMSansQuotation8-Bold] [\s!file:lmsansquot8-bold] [\s!features=\s!default] + \definefontsynonym [LMSansQuotation8-Oblique] [\s!file:lmsansquot8-oblique] [\s!features=\s!default] + \definefontsynonym [LMSansQuotation8-BoldOblique] [\s!file:lmsansquot8-boldoblique] [\s!features=\s!default] \stoptypescript @@ -102,25 +102,25 @@ \starttypescript [\s!math] [modern,latin-modern] - \definefontsynonym [LMMathRoman5-Regular] [LMMath5-Regular@lmroman5-math] - \definefontsynonym [LMMathRoman6-Regular] [LMMath6-Regular@lmroman6-math] - \definefontsynonym [LMMathRoman7-Regular] [LMMath7-Regular@lmroman7-math] - \definefontsynonym [LMMathRoman8-Regular] [LMMath8-Regular@lmroman8-math] - \definefontsynonym [LMMathRoman9-Regular] [LMMath9-Regular@lmroman9-math] - \definefontsynonym [LMMathRoman10-Regular] [LMMath10-Regular@lmroman10-math] - \definefontsynonym [LMMathRoman12-Regular] [LMMath12-Regular@lmroman12-math] - \definefontsynonym [LMMathRoman17-Regular] [LMMath17-Regular@lmroman17-math] + \definefontsynonym [LMMathRoman5-Regular] [LMMath5-Regular@lmroman5-math] + \definefontsynonym [LMMathRoman6-Regular] [LMMath6-Regular@lmroman6-math] + \definefontsynonym [LMMathRoman7-Regular] [LMMath7-Regular@lmroman7-math] + \definefontsynonym [LMMathRoman8-Regular] [LMMath8-Regular@lmroman8-math] + \definefontsynonym [LMMathRoman9-Regular] [LMMath9-Regular@lmroman9-math] + \definefontsynonym [LMMathRoman10-Regular] [LMMath10-Regular@lmroman10-math] + \definefontsynonym [LMMathRoman12-Regular] [LMMath12-Regular@lmroman12-math] + \definefontsynonym [LMMathRoman17-Regular] [LMMath17-Regular@lmroman17-math] % we no longer care to provide pseudo full bold - \definefontsynonym [LMMathRoman5-Bold] [LMMathRoman5-Regular] - \definefontsynonym [LMMathRoman6-Bold] [LMMathRoman6-Regular] - \definefontsynonym [LMMathRoman7-Bold] [LMMathRoman7-Regular] - \definefontsynonym [LMMathRoman8-Bold] [LMMathRoman8-Regular] - \definefontsynonym [LMMathRoman9-Bold] [LMMathRoman9-Regular] - \definefontsynonym [LMMathRoman10-Bold] [LMMathRoman10-Regular] - \definefontsynonym [LMMathRoman12-Bold] [LMMathRoman12-Regular] - \definefontsynonym [LMMathRoman17-Bold] [LMMathRoman17-Regular] + \definefontsynonym [LMMathRoman5-Bold] [LMMathRoman5-Regular] + \definefontsynonym [LMMathRoman6-Bold] [LMMathRoman6-Regular] + \definefontsynonym [LMMathRoman7-Bold] [LMMathRoman7-Regular] + \definefontsynonym [LMMathRoman8-Bold] [LMMathRoman8-Regular] + \definefontsynonym [LMMathRoman9-Bold] [LMMathRoman9-Regular] + \definefontsynonym [LMMathRoman10-Bold] [LMMathRoman10-Regular] + \definefontsynonym [LMMathRoman12-Bold] [LMMathRoman12-Regular] + \definefontsynonym [LMMathRoman17-Bold] [LMMathRoman17-Regular] \loadfontgoodies[lm-math] diff --git a/Master/texmf-dist/tex/context/base/type-imp-opendyslexic.mkiv b/Master/texmf-dist/tex/context/base/type-imp-opendyslexic.mkiv new file mode 100644 index 00000000000..770d43c6ce4 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/type-imp-opendyslexic.mkiv @@ -0,0 +1,39 @@ +%D \module +%D [ file=type-imp-opendyslexic, +%D version=2013.05.02, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Opendyslexic Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\starttypescriptcollection[opendyslexic] + + \starttypescript [\s!serif] [opendyslexic] [\s!name] + \setups[\s!font:\s!fallback:\s!serif] + \definefontsynonym [\s!Serif] [\s!file:opendyslexic-regular.otf] [\s!features=\s!default] + \definefontsynonym [\s!SerifBold] [\s!file:opendyslexic-bold.otf] [\s!features=\s!default] + \definefontsynonym [\s!SerifItalic] [\s!file:opendyslexic-italic.otf] [\s!features=\s!default] + \definefontsynonym [\s!SerifBoldItalic] [\s!file:opendyslexic-bolditalic.otf] [\s!features=\s!default] + \stoptypescript + + \starttypescript [\s!sans] [opendyslexic] [\s!name] + \setups[\s!font:\s!fallback:\s!sans] + \definefontsynonym [\s!Sans] [\s!file:opendyslexicalta-regular.otf] [\s!features=\s!default] + \definefontsynonym [\s!SansBold] [\s!file:opendyslexicalta-bold.otf] [\s!features=\s!default] + \definefontsynonym [\s!SansItalic] [\s!file:opendyslexicalta-italic.otf] [\s!features=\s!default] + \definefontsynonym [\s!SansBoldItalic] [\s!file:opendyslexicalta-bolditalic.otf] [\s!features=\s!default] + \stoptypescript + + \starttypescript[opendyslexic] + \definetypeface [opendyslexic] [\s!rm] [\s!serif] [opendyslexic] [\s!default] + \definetypeface [opendyslexic] [\s!ss] [\s!sans] [opendyslexic] [\s!default] + \definetypeface [opendyslexic] [\s!tt] [\s!mono] [dejavu] [\s!default]% [rscale=1.065] + \definetypeface [opendyslexic] [\s!mm] [\s!math] [xits] [\s!default]% [rscale=1.020] + \stoptypescript + +\stoptypescriptcollection diff --git a/Master/texmf-dist/tex/context/base/type-imp-texgyre.mkiv b/Master/texmf-dist/tex/context/base/type-imp-texgyre.mkiv index c404729a246..24185f41d35 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-texgyre.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-texgyre.mkiv @@ -16,23 +16,41 @@ \starttypescriptcollection[texgyre] - \definetypescriptprefix [f:pagella] [pagella] \definetypescriptprefix [f:palatino] [pagella] - \definetypescriptprefix [f:termes] [termes] \definetypescriptprefix [f:times] [termes] - \definetypescriptprefix [f:heros] [heros] \definetypescriptprefix [f:helvetica] [heros] - \definetypescriptprefix [f:bonum] [bonum] \definetypescriptprefix [f:bookman] [bonum] - \definetypescriptprefix [f:schola] [schola] \definetypescriptprefix [f:schoolbook] [schola] - \definetypescriptprefix [f:adventor][adventor] \definetypescriptprefix [f:avantgarde] [adventor] - \definetypescriptprefix [f:cursor] [cursor] \definetypescriptprefix [f:courier] [cursor] - \definetypescriptprefix [f:chorus] [chorus] \definetypescriptprefix [f:chancery] [chorus] - - \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella] - \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes] - \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros] - \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum] - \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola] - \definetypescriptprefix [n:adventor] [TeXGyreAdventor]% \definetypescriptprefix [n:adventor] [TeXGyreAdventor] - \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor] - \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set + \definetypescriptprefix [f:pagella] [pagella] + \definetypescriptprefix [f:termes] [termes] + \definetypescriptprefix [f:heros] [heros] + \definetypescriptprefix [f:bonum] [bonum] + \definetypescriptprefix [f:schola] [schola] + \definetypescriptprefix [f:adventor][adventor] + \definetypescriptprefix [f:cursor] [cursor] + \definetypescriptprefix [f:chorus] [chorus] + + \definetypescriptprefix [f:palatino] [pagella] + \definetypescriptprefix [f:times] [termes] + \definetypescriptprefix [f:helvetica] [heros] + \definetypescriptprefix [f:bookman] [bonum] + \definetypescriptprefix [f:schoolbook] [schola] + \definetypescriptprefix [f:avantgarde] [adventor] + \definetypescriptprefix [f:courier] [cursor] + \definetypescriptprefix [f:chancery] [chorus] + + \definetypescriptprefix [n:pagella] [TeXGyrePagella] + \definetypescriptprefix [n:termes] [TeXGyreTermes] + \definetypescriptprefix [n:heros] [TeXGyreHeros] + \definetypescriptprefix [n:bonum] [TeXGyreBonum] + \definetypescriptprefix [n:schola] [TeXGyreSchola] + \definetypescriptprefix [n:adventor] [TeXGyreAdventor] + \definetypescriptprefix [n:cursor] [TeXGyreCursor] + \definetypescriptprefix [n:chorus] [TeXGyreChorus] + + \definetypescriptprefix [n:palatino] [TeXGyrePagella] + \definetypescriptprefix [n:times] [TeXGyreTermes] + \definetypescriptprefix [n:helvetica] [TeXGyreHeros] + \definetypescriptprefix [n:bookman] [TeXGyreBonum] + \definetypescriptprefix [n:schoolbook] [TeXGyreSchola] + \definetypescriptprefix [n:adventor] [TeXGyreAdventor] + \definetypescriptprefix [n:courier] [TeXGyreCursor] + \definetypescriptprefix [n:chancery] [TeXGyreChorus] \starttypescript [\s!serif,\s!sans] [adventor,bonum,bookman,heros,helvetica,pagella,palatino,bonum,bookman,schola,schoolbook,termes,times] \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [\s!features=\s!default] @@ -159,7 +177,7 @@ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] \definetypeface [\typescriptone] [\s!ss] [\s!sans] [modern] [\s!default] [\s!rscale=1.1] \definetypeface [\typescriptone] [\s!tt] [\s!mono] [modern] [\s!default] [\s!rscale=1.1] - \definetypeface [\typescriptone] [\s!mm] [\s!math] [modern] [\s!default] [\s!rscale=1.1] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [bonum] [\s!default] \quittypescriptscanning \stoptypescript @@ -226,7 +244,7 @@ \startmode[pxmath] - \starttypescriptcollection[texgyre-math] + \starttypescriptcollection[texgyre-math-pagella] \starttypescript [\s!math][palatino,pagella][\s!all] \loadfontgoodies[px-math] @@ -240,7 +258,7 @@ \startnotmode[pxmath] - \starttypescriptcollection[texgyre-math] + \starttypescriptcollection[texgyre-math-pagella] \starttypescript [\s!math][palatino,pagella][\s!all] \loadfontgoodies[texgyre] @@ -250,3 +268,12 @@ \stoptypescriptcollection \stopnotmode + +\starttypescriptcollection[texgyre-math-bonum] + + \starttypescript [\s!math][bookman,bonum][\s!all] + \loadfontgoodies[texgyre] + \definefontsynonym[\s!MathRoman][file:texgyre-bonum-math-regular.otf][\s!features=\s!math\mathsizesuffix] + \stoptypescript + +\stoptypescriptcollection diff --git a/Master/texmf-dist/tex/context/base/type-ini.lua b/Master/texmf-dist/tex/context/base/type-ini.lua index 03cdb0fe571..9ee97acaed3 100644 --- a/Master/texmf-dist/tex/context/base/type-ini.lua +++ b/Master/texmf-dist/tex/context/base/type-ini.lua @@ -18,11 +18,11 @@ local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex", "type-%s.mkiv", "type- local function action(name,foundname) -- context.startreadingfile() - -- context.pushendofline() -- context.unprotect() + -- context.pushendofline() -- context.input(foundname) - -- context.protect() -- context.popendofline() + -- context.protect() -- context.stopreadingfile() context.loadfoundtypescriptfile(foundname) end diff --git a/Master/texmf-dist/tex/context/base/type-ini.mkvi b/Master/texmf-dist/tex/context/base/type-ini.mkvi index ddf7cad8f6f..0ce14ef9f90 100644 --- a/Master/texmf-dist/tex/context/base/type-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/type-ini.mkvi @@ -113,8 +113,11 @@ \iftracetypescripts \writestatus\m!fonts{request: [\m_font_typescripts_one] [\m_font_typescripts_two] [\m_font_typescripts_three]}% \fi - \processcommacommand[\typescriptfiles]\font_typescripts_load_file - \the\c_font_typescripts_document + \ifhmode + \font_typescripts_use_inline + \else + \font_typescripts_use_display + \fi \setfalse\c_font_typescripts_first_pass \popmacro\stoptypescript \popmacro\typescriptstate @@ -126,6 +129,36 @@ \popmacro\m_font_typescripts_two \popmacro\m_font_typescripts_one} +\def\font_typescripts_use_display + {\processcommacommand[\typescriptfiles]\font_typescripts_load_file + \the\c_font_typescripts_document} + +\let\font_typescripts_use_inline\font_typescripts_use_display + +% % not yet: +% +% \newsignal\d_font_typescripts_signal +% +% \def\font_typescripts_use_inline +% {\ifhmode +% \kern\d_font_typescripts_signal +% \fi +% \font_typescripts_use_display +% \ifhmode +% \ifdim\lastkern=\d_font_typescripts_signal +% \unkern +% \else +% \removeunwantedspaces +% \ifdim\lastkern=\d_font_typescripts_signal +% \unkern +% \else +% % messy typescript 2 +% \fi +% \fi +% \else +% % messy typescript 1 +% \fi} + \unexpanded\def\preloadtypescripts {\ifproductionrun\settrue\c_font_typescripts_preload\fi} @@ -144,11 +177,11 @@ \unexpanded\def\loadfoundtypescriptfile#1% {\startreadingfile - \pushendofline \unprotect + \pushendofline \input{#1}% - \protect \popendofline + \protect \stopreadingfile} \unexpanded\def\quittypescriptscanning diff --git a/Master/texmf-dist/tex/context/base/type-set.mkiv b/Master/texmf-dist/tex/context/base/type-set.mkiv index 99c38bc5d0f..bfbf7af9ed5 100644 --- a/Master/texmf-dist/tex/context/base/type-set.mkiv +++ b/Master/texmf-dist/tex/context/base/type-set.mkiv @@ -15,18 +15,30 @@ \ifnum\typescriptstate=\plustwo - % store - - \loadmarkfile{type-def} - \loadmarkfile{type-lua} - \loadmarkfile{type-siz} - \loadmarkfile{type-fbk} - - % \loadtypescriptfile[def] % meant for local usage only - % \loadtypescriptfile[lua] % meant for local usage only - % \loadtypescriptfile[siz] % meant for local usage only - \loadmarkfile{type-imp-latinmodern} - % \usetypescriptfile[latinmodern] + % we store some typescripts in the format + + % \loadmarkfile{type-def} + % \loadmarkfile{type-lua} + % \loadmarkfile{type-siz} + % \loadmarkfile{type-fbk} + % \loadmarkfile{type-imp-latinmodern} + + % but ... let's make sure that newlines are gone + + \loadfoundtypescriptfile{type-def.mkiv} + \loadfoundtypescriptfile{type-lua.mkiv} + \loadfoundtypescriptfile{type-siz.mkiv} + \loadfoundtypescriptfile{type-fbk.mkiv} + \loadfoundtypescriptfile{type-imp-latinmodern.mkiv} + + % and not: + + % \loadtypescriptfile[def] % meant for local usage only + % \loadtypescriptfile[fbk] % meant for local usage only + % \loadtypescriptfile[lua] % meant for local usage only + % \loadtypescriptfile[siz] % meant for local usage only + % \usetypescriptfile[latinmodern] + \usetypescriptfile[loc] % We want these names preset but they conflict with later loads so from now on @@ -40,7 +52,7 @@ \usetypescriptfile[fbk] \usetypescriptfile[lua] \usetypescriptfile[siz] - \usetypescriptfile[otf] + \usetypescriptfile[latinmodern] \usetypescriptfile[loc] \fi diff --git a/Master/texmf-dist/tex/context/base/typo-cap.mkiv b/Master/texmf-dist/tex/context/base/typo-cap.mkiv index 25a0ff9ee46..d2f1dc0e02e 100644 --- a/Master/texmf-dist/tex/context/base/typo-cap.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-cap.mkiv @@ -211,9 +211,9 @@ \appendtoks \doifelse{\directcapitalsparameter\c!title}\v!yes {\definealternativestyle[\v!capital ][\font_style_normalsmallcapped][\font_style_normalsmallcapped]% - \definealternativestyle[\v!smallcaps][\sc][\sc]} + \definealternativestyle[\v!smallcaps][\setsmallcaps][\setsmallcaps]} {\definealternativestyle[\v!capital ][\font_style_normalsmallcapped][\font_style_normalWORD]% - \definealternativestyle[\v!smallcaps][\sc][\font_style_normalWORD]}% + \definealternativestyle[\v!smallcaps][\setsmallcaps][\font_style_normalWORD]}% \doifelse{\directcapitalsparameter\s!sc}\v!yes \userealcaps \usepseudocaps diff --git a/Master/texmf-dist/tex/context/base/typo-dig.lua b/Master/texmf-dist/tex/context/base/typo-dig.lua index e6c65399d19..62d17fa3bb7 100644 --- a/Master/texmf-dist/tex/context/base/typo-dig.lua +++ b/Master/texmf-dist/tex/context/base/typo-dig.lua @@ -151,7 +151,7 @@ function digits.set(n) -- number or 'reset' texattribute[a_digits] = n end -digits.handler = nodes.installattributehandler { +digits.handler = nodes.installattributehandler { -- we could avoid this wrapper name = "digits", namespace = digits, processor = process, diff --git a/Master/texmf-dist/tex/context/base/typo-dig.mkiv b/Master/texmf-dist/tex/context/base/typo-dig.mkiv index 832ebbec4e1..71425c594a5 100644 --- a/Master/texmf-dist/tex/context/base/typo-dig.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-dig.mkiv @@ -52,7 +52,7 @@ \unexpanded\def\dummydigit {\hphantom {\setdigitsmanipulation[\number\plusone]0}} \appendtoks - \resetcharacterspacing + \resetdigitsmanipulation \to \everyinitializeverbatim \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/util-jsn.lua b/Master/texmf-dist/tex/context/base/util-jsn.lua index 7493f108d22..29587cd3834 100644 --- a/Master/texmf-dist/tex/context/base/util-jsn.lua +++ b/Master/texmf-dist/tex/context/base/util-jsn.lua @@ -11,6 +11,9 @@ if not modules then modules = { } end modules ['util-jsn'] = { -- a correct stream. If not, we have some fatal error anyway. So, we can just rely -- on strings being strings (apart from the unicode escape which is not in 5.1) and -- as we first catch known types we just assume that anything else is a number. +-- +-- Reminder for me: check usage in framework and extend when needed. Also document +-- it in the cld lib documentation. local P, V, R, S, C, Cc, Cs, Ct, Cf, Cg = lpeg.P, lpeg.V, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cg local lpegmatch = lpeg.match @@ -141,5 +144,3 @@ end -- inspect(tmp) -- inspect(json.tostring(true)) - -return json diff --git a/Master/texmf-dist/tex/context/base/util-lib.lua b/Master/texmf-dist/tex/context/base/util-lib.lua index 2ec3d395c28..c5c99911363 100644 --- a/Master/texmf-dist/tex/context/base/util-lib.lua +++ b/Master/texmf-dist/tex/context/base/util-lib.lua @@ -160,12 +160,12 @@ local function requireswiglib(required,version) return found end end - -- Check clib paths using name and version. + -- Check lib paths using name and version. if trace_swiglib then - report_swiglib("checking clib paths") + report_swiglib("checking lib paths") end - package.extraclibpath(environment.ownpath) - local paths = package.clibpaths() + package.extralibpath(environment.ownpath) + local paths = package.libpaths() for i=1,#paths do local found = check(lfs.isfile) if found and (not checkpattern or find(found,checkpattern)) then @@ -258,7 +258,9 @@ function swiglib(name,version) local library = swiglibs[name] if not library then statistics.starttiming(swiglibs) - report_swiglib("loading %a",name) + if trace_swiglib then + report_swiglib("loading %a",name) + end library = requireswiglib("swiglib." .. name,version) swiglibs[name] = library statistics.stoptiming(swiglibs) diff --git a/Master/texmf-dist/tex/context/base/util-prs.lua b/Master/texmf-dist/tex/context/base/util-prs.lua index 31e7ffa535b..9d2ffcc3ee7 100644 --- a/Master/texmf-dist/tex/context/base/util-prs.lua +++ b/Master/texmf-dist/tex/context/base/util-prs.lua @@ -93,7 +93,9 @@ patterns.settings_to_hash_b = pattern_b_s patterns.settings_to_hash_c = pattern_c_s function parsers.make_settings_to_hash_pattern(set,how) - if how == "strict" then + if type(str) == "table" then + return set + elseif how == "strict" then return (pattern_c/set)^1 elseif how == "tolerant" then return (pattern_b/set)^1 @@ -103,7 +105,16 @@ function parsers.make_settings_to_hash_pattern(set,how) end function parsers.settings_to_hash(str,existing) - if str and str ~= "" then + if type(str) == "table" then + if existing then + for k, v in next, str do + existing[k] = v + end + return exiting + else + return str + end + elseif str and str ~= "" then hash = existing or { } lpegmatch(pattern_a_s,str) return hash @@ -113,7 +124,16 @@ function parsers.settings_to_hash(str,existing) end function parsers.settings_to_hash_tolerant(str,existing) - if str and str ~= "" then + if type(str) == "table" then + if existing then + for k, v in next, str do + existing[k] = v + end + return exiting + else + return str + end + elseif str and str ~= "" then hash = existing or { } lpegmatch(pattern_b_s,str) return hash @@ -123,7 +143,16 @@ function parsers.settings_to_hash_tolerant(str,existing) end function parsers.settings_to_hash_strict(str,existing) - if str and str ~= "" then + if type(str) == "table" then + if existing then + for k, v in next, str do + existing[k] = v + end + return exiting + else + return str + end + elseif str and str ~= "" then hash = existing or { } lpegmatch(pattern_c_s,str) return next(hash) and hash @@ -144,7 +173,9 @@ patterns.settings_to_array = pattern -- we could use a weak table as cache function parsers.settings_to_array(str,strict) - if not str or str == "" then + if type(str) == "table" then + return str + elseif not str or str == "" then return { } elseif strict then if find(str,"{") then @@ -341,9 +372,8 @@ local separator = S(' ,') local key = C((1-equal)^1) local value = dquote * C((1-dquote-escape*dquote)^0) * dquote -local pattern = Cf(Ct("") * Cg(key * equal * value) * separator^0,rawset)^0 * P(-1) - -patterns.keq_to_hash_c = pattern +----- pattern = Cf(Ct("") * Cg(key * equal * value) * separator^0,rawset)^0 * P(-1) -- was wrong +local pattern = Cf(Ct("") * (Cg(key * equal * value) * separator^0)^1,rawset)^0 * P(-1) function parsers.keq_to_hash(str) if str and str ~= "" then @@ -353,7 +383,7 @@ function parsers.keq_to_hash(str) end end --- inspect(lpeg.match(pattern,[[key="value"]])) +-- inspect(lpeg.match(pattern,[[key="value" foo="bar"]])) local defaultspecification = { separator = ",", quote = '"' } @@ -361,7 +391,7 @@ local defaultspecification = { separator = ",", quote = '"' } -- database module function parsers.csvsplitter(specification) - specification = specification and table.setmetatableindex(specification,defaultspecification) or defaultspecification + specification = specification and table.setmetatableindex(specification,defaultspecification) or defaultspecification local separator = specification.separator local quotechar = specification.quote local separator = S(separator ~= "" and separator or ",") @@ -388,14 +418,14 @@ end -- and this is a slightly patched version of a version posted by Philipp Gesang -- local mycsvsplitter = utilities.parsers.rfc4180splitter() --- + -- local crap = [[ -- first,second,third,fourth -- "1","2","3","4" -- "a","b","c","d" -- "foo","bar""baz","boogie","xyzzy" -- ]] --- + -- local list, names = mycsvsplitter(crap,true) inspect(list) inspect(names) -- local list, names = mycsvsplitter(crap) inspect(list) inspect(names) diff --git a/Master/texmf-dist/tex/context/base/util-soc.lua b/Master/texmf-dist/tex/context/base/util-soc.lua new file mode 100644 index 00000000000..30301c51027 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/util-soc.lua @@ -0,0 +1,93 @@ +if not modules then modules = { } end modules ['util-soc'] = { + version = 1.001, + comment = "support for sockets / protocols", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format = string.format + +local smtp = require("socket.smtp") +local ltn12 = require("ltn12") +local mime = require("mime") + +local mail = utilities.mail or { } +utilities.mail = mail + +local report_mail = logs.reporter("mail") + +function mail.send(specification) + local presets = specification.presets + if presets then + table.setmetatableindex(specification,presets) + end + local server = specification.server or "" + if not server then + report_mail("no server specified") + return false + end + local to = specification.to or specification.recepient or "" + if to == "" then + report_mail("no recepient specified") + return false + end + local from = specification.from or specification.sender or "" + if from == "" then + report_mail("no sender specified") + return false + end + local message = { } + local body = specification.body + if body then + message[#message+1] = { + body = body + } + end + local files = specification.files + if files then + for i=1,#files do + local filename = files[i] + local handle = io.open(filename, "rb") + if handle then + report_mail("attaching file %a",filename) + message[#message+1] = { + headers = { + ["content-type"] = format('application/pdf; name="%s"',filename), + ["content-disposition"] = format('attachment; filename="%s"',filename), + ["content-description"] = format('file: %s',filename), + ["content-transfer-encoding"] = "BASE64" + }, + body = ltn12.source.chain( + ltn12.source.file(handle), + ltn12.filter.chain(mime.encode("base64"),mime.wrap()) + ) + } + else + report_mail("file %a not found",filename) + end + end + end + local result, detail = smtp.send { + server = specification.server, + port = specification.port, + user = specification.user, + password = specification.password, + from = from, + rcpt = to, + source = smtp.message { + headers = { + to = to, + from = from, + cc = specification.cc, + subject = specification.subject or "no subject", + }, + body = message + }, + } + if detail then + report_mail("error: %s",detail) + else + report_mail("message sent") + end +end diff --git a/Master/texmf-dist/tex/context/base/util-sql-imp-swiglib.lua b/Master/texmf-dist/tex/context/base/util-sql-imp-swiglib.lua index 719620a6f9c..758c817469d 100644 --- a/Master/texmf-dist/tex/context/base/util-sql-imp-swiglib.lua +++ b/Master/texmf-dist/tex/context/base/util-sql-imp-swiglib.lua @@ -23,6 +23,7 @@ local report_state = logs.reporter("sql","swiglib") local sql = utilities.sql local mysql = require("swiglib.mysql.core") -- "5.6" +----- mysql = swiglib("mysql.core") -- "5.6" -- inspect(table.sortedkeys(mysql)) diff --git a/Master/texmf-dist/tex/context/base/util-sql-tracers.lua b/Master/texmf-dist/tex/context/base/util-sql-tracers.lua new file mode 100644 index 00000000000..1bd133acba2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/util-sql-tracers.lua @@ -0,0 +1,48 @@ +if not modules then modules = { } end modules ['util-sql-tracers'] = { + version = 1.001, + comment = "companion to m-sql.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local sql = utilities.sql +local tracers = { } +sql.tracers = tracers + +sql.setmethod("swiglib") + +function sql.tracers.gettables(presets) + local results, keys = sql.execute { + presets = presets, + template = "SHOW TABLES FROM `%database%`", + variables = { + database = presets.database, + }, + } + + local key = keys[1] + local tables = { } + + for i=1,#results do + local name = results[i][key] + local results, keys = sql.execute { + presets = presets, + template = "SHOW FIELDS FROM `%database%`.`%table%` ", + variables = { + database = presets.database, + table = name + }, + } + if #results > 0 then + for i=1,#results do + results[i] = table.loweredkeys(results[i]) + end + tables[name] = results + else + -- a view + end + end + + return tables +end diff --git a/Master/texmf-dist/tex/context/base/util-tab.lua b/Master/texmf-dist/tex/context/base/util-tab.lua index ecf36b13726..a47c0cb77fd 100644 --- a/Master/texmf-dist/tex/context/base/util-tab.lua +++ b/Master/texmf-dist/tex/context/base/util-tab.lua @@ -406,9 +406,9 @@ end -- inspect(table.fastserialize { a = 1, b = { 4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } }) -function table.load(filename) +function table.load(filename,loader) if filename then - local t = io.loaddata(filename) + local t = (loader or io.loaddata)(filename) if t and t ~= "" then t = load(t) if type(t) == "function" then diff --git a/Master/texmf-dist/tex/context/base/x-cals.lua b/Master/texmf-dist/tex/context/base/x-cals.lua index 4051dd157e1..36bc1aaba2d 100644 --- a/Master/texmf-dist/tex/context/base/x-cals.lua +++ b/Master/texmf-dist/tex/context/base/x-cals.lua @@ -30,15 +30,15 @@ cals.stretch_widths = false -- has to happen at the core-ntb level (todo) local halignments = { - left = "flushleft", - right = "flushright", - center = "middle", - centre = "middle", + left = "flushleft", + right = "flushright", + center = "middle", + centre = "middle", justify = "normal", } local valignments = { - top = "high", + top = "high", bottom = "low", middle = "lohi", } diff --git a/Master/texmf-dist/tex/context/base/x-cals.mkiv b/Master/texmf-dist/tex/context/base/x-cals.mkiv index 4e68c34003d..31ba2d213a9 100644 --- a/Master/texmf-dist/tex/context/base/x-cals.mkiv +++ b/Master/texmf-dist/tex/context/base/x-cals.mkiv @@ -18,7 +18,7 @@ \registerctxluafile{x-cals}{} % \startxmlsetups xml:cals:process -% \xmlsetsetup {\xmldocument} {cals:table} {*} +% \xmlsetsetup {#1} {cals:table} {*} % \stopxmlsetups % \startxmlsetups cals:table % \ctxlua{moduledata.cals.table("#1")} diff --git a/Master/texmf-dist/tex/context/base/x-mathml.mkiv b/Master/texmf-dist/tex/context/base/x-mathml.mkiv index 99b9f92afde..a4eb0946740 100644 --- a/Master/texmf-dist/tex/context/base/x-mathml.mkiv +++ b/Master/texmf-dist/tex/context/base/x-mathml.mkiv @@ -16,6 +16,8 @@ % This module is under construction and will be cleaned up. We use a funny mix of % xml, tex and lua. I could rewrite the lot but it also shows how context evolves. % +% I might en dup with a lua-only implementation some day. +% % no m:text strip (needs checking, maybe nbsp is mandate % % todo: more will be moved to lua (less hassle) diff --git a/Master/texmf-dist/tex/context/base/x-set-02.mkii b/Master/texmf-dist/tex/context/base/x-set-02.mkii index 8af98c41263..7a2cd77016b 100644 --- a/Master/texmf-dist/tex/context/base/x-set-02.mkii +++ b/Master/texmf-dist/tex/context/base/x-set-02.mkii @@ -25,6 +25,6 @@ \def\setinterfaceelement {\setinterfacecomponent{string}} % element \def\setinterfacecommand {\setinterfacecomponent{string}} % command -\input mult-\userinterfacetag +\input mult-\userinterfacetag.mkii \egroup \protect \endinput |