From 15ab7c153a96a9befc4e2c1774e701f3c941cc2d Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 2 Apr 2018 16:25:10 +0200 Subject: 2018-04-02 15:51:00 --- tex/context/base/mkii/cont-new.mkii | 2 +- tex/context/base/mkii/context.mkii | 2 +- tex/context/base/mkiv/anch-pgr.lua | 2 +- tex/context/base/mkiv/attr-ini.lua | 2 +- tex/context/base/mkiv/back-exp.lua | 2 +- tex/context/base/mkiv/buff-ini.lua | 2 +- tex/context/base/mkiv/buff-par.lua | 6 +- tex/context/base/mkiv/char-def.lua | 1194 +++++++++++++- tex/context/base/mkiv/char-tex.lua | 4 +- tex/context/base/mkiv/char-utf.lua | 2 +- tex/context/base/mkiv/chem-str.lua | 4 +- tex/context/base/mkiv/cldf-ini.lua | 72 +- tex/context/base/mkiv/cldf-scn.lua | 4 +- tex/context/base/mkiv/colo-ini.lua | 10 +- tex/context/base/mkiv/cont-new.mkiv | 2 +- tex/context/base/mkiv/context.mkiv | 2 +- tex/context/base/mkiv/core-con.lua | 6 +- tex/context/base/mkiv/core-dat.lua | 10 +- tex/context/base/mkiv/core-sys.lua | 2 +- tex/context/base/mkiv/core-two.lua | 8 +- tex/context/base/mkiv/core-uti.lua | 40 +- tex/context/base/mkiv/file-job.lua | 8 +- tex/context/base/mkiv/file-res.lua | 2 +- tex/context/base/mkiv/file-syn.lua | 4 +- tex/context/base/mkiv/font-cft.lua | 2 + tex/context/base/mkiv/font-col.lua | 4 +- tex/context/base/mkiv/font-con.lua | 28 +- tex/context/base/mkiv/font-ctx.lua | 10 +- tex/context/base/mkiv/font-ext.lua | 194 ++- tex/context/base/mkiv/font-map.lua | 6 +- tex/context/base/mkiv/font-osd.lua | 882 +++++----- tex/context/base/mkiv/font-ota.lua | 10 +- tex/context/base/mkiv/font-ots.lua | 2 +- tex/context/base/mkiv/font-pre.mkiv | 138 +- tex/context/base/mkiv/font-sel.lua | 2 +- tex/context/base/mkiv/grph-fil.lua | 2 +- tex/context/base/mkiv/grph-inc.lua | 4 +- tex/context/base/mkiv/java-ini.lua | 4 +- tex/context/base/mkiv/l-macro.lua | 72 +- tex/context/base/mkiv/l-package.lua | 6 +- tex/context/base/mkiv/l-table.lua | 10 +- tex/context/base/mkiv/lang-hyp.lua | 4 +- tex/context/base/mkiv/lang-ini.lua | 10 +- tex/context/base/mkiv/lang-rep.lua | 4 +- tex/context/base/mkiv/lang-url.lua | 2 +- tex/context/base/mkiv/lang-wrd.lua | 2 +- tex/context/base/mkiv/lpdf-epd.lua | 2 + tex/context/base/mkiv/lpdf-ini.lua | 30 +- tex/context/base/mkiv/lpdf-mis.lua | 32 +- tex/context/base/mkiv/lpdf-pda.xml | 9 +- tex/context/base/mkiv/lpdf-pdx.xml | 9 +- tex/context/base/mkiv/lpdf-pua.xml | 9 +- tex/context/base/mkiv/lpdf-xmp.lua | 123 +- tex/context/base/mkiv/luat-ini.mkiv | 40 +- tex/context/base/mkiv/luat-usr.lua | 4 +- tex/context/base/mkiv/lxml-css.lua | 4 +- tex/context/base/mkiv/lxml-ini.lua | 114 +- tex/context/base/mkiv/lxml-ini.mkiv | 4 + tex/context/base/mkiv/lxml-tex.lua | 44 +- tex/context/base/mkiv/lxml-xml.lua | 23 + tex/context/base/mkiv/math-map.lua | 2 +- tex/context/base/mkiv/math-noa.lua | 3 + tex/context/base/mkiv/meta-grd.mkiv | 220 ++- tex/context/base/mkiv/meta-imp-mat.mkiv | 152 +- tex/context/base/mkiv/meta-ini.mkiv | 6 + tex/context/base/mkiv/meta-tex.lua | 4 +- tex/context/base/mkiv/mlib-ctx.lua | 4 +- tex/context/base/mkiv/mlib-lua.lua | 2 +- tex/context/base/mkiv/mult-aux.lua | 2 +- tex/context/base/mkiv/mult-aux.mkiv | 9 +- tex/context/base/mkiv/mult-chk.lua | 6 +- tex/context/base/mkiv/mult-ini.lua | 20 +- tex/context/base/mkiv/mult-low.lua | 9 +- tex/context/base/mkiv/mult-prm.lua | 1 + tex/context/base/mkiv/pack-obj.lua | 12 +- tex/context/base/mkiv/page-cst.lua | 10 +- tex/context/base/mkiv/page-ini.lua | 2 +- tex/context/base/mkiv/page-inj.mkvi | 20 +- tex/context/base/mkiv/page-ins.lua | 2 +- tex/context/base/mkiv/page-sid.mkiv | 5 +- tex/context/base/mkiv/phys-dim.lua | 2 +- tex/context/base/mkiv/publ-aut.lua | 2 +- tex/context/base/mkiv/publ-ini.lua | 56 +- tex/context/base/mkiv/publ-jrn.lua | 2 +- tex/context/base/mkiv/publ-reg.lua | 4 +- tex/context/base/mkiv/scrn-but.lua | 2 +- tex/context/base/mkiv/scrn-fld.lua | 2 +- tex/context/base/mkiv/scrn-fld.mkvi | 2 +- tex/context/base/mkiv/scrn-pag.mkvi | 13 +- tex/context/base/mkiv/scrn-wid.lua | 2 +- tex/context/base/mkiv/scrp-ini.lua | 2 +- tex/context/base/mkiv/sort-ini.lua | 58 +- tex/context/base/mkiv/spac-ver.lua | 4 +- tex/context/base/mkiv/status-files.pdf | Bin 25832 -> 26081 bytes tex/context/base/mkiv/status-lua.pdf | Bin 254074 -> 255107 bytes tex/context/base/mkiv/strc-bkm.lua | 2 +- tex/context/base/mkiv/strc-blk.lua | 6 +- tex/context/base/mkiv/strc-doc.lua | 8 +- tex/context/base/mkiv/strc-lev.lua | 2 +- tex/context/base/mkiv/strc-lst.lua | 2 +- tex/context/base/mkiv/strc-mar.lua | 20 +- tex/context/base/mkiv/strc-not.lua | 8 +- tex/context/base/mkiv/strc-ref.lua | 18 +- tex/context/base/mkiv/strc-reg.lua | 8 +- tex/context/base/mkiv/strc-syn.lua | 12 +- tex/context/base/mkiv/strc-tag.lua | 17 +- tex/context/base/mkiv/supp-box.lua | 6 +- tex/context/base/mkiv/syst-aux.lua | 24 +- tex/context/base/mkiv/toks-ini.lua | 2 + tex/context/base/mkiv/toks-scn.lua | 18 + tex/context/base/mkiv/trac-ctx.lua | 4 +- tex/context/base/mkiv/trac-inf.lua | 5 +- tex/context/base/mkiv/trac-log.lua | 10 +- tex/context/base/mkiv/typo-inj.lua | 4 +- tex/context/base/mkiv/util-lua.lua | 14 +- tex/context/base/mkiv/util-sql-imp-ffi.lua | 4 +- tex/context/base/mkiv/util-str.lua | 61 +- tex/context/fonts/mkiv/type-imp-modernlatin.mkiv | 69 + tex/context/interface/mkiv/i-context.pdf | Bin 848123 -> 846098 bytes tex/context/interface/mkiv/i-readme.pdf | Bin 60774 -> 61032 bytes tex/context/modules/common/s-faq-01.tex | 12 +- tex/context/modules/common/s-faq-02.tex | 6 +- tex/context/modules/mkiv/m-punk.mkiv | 6 + tex/context/modules/mkiv/s-fonts-basics.mkiv | 175 ++ tex/context/modules/mkiv/s-fonts-overlay.mkiv | 107 ++ tex/context/modules/mkiv/s-fonts-shapes.lua | 115 +- tex/context/modules/mkiv/s-fonts-shapes.mkiv | 6 +- tex/context/modules/mkiv/s-tugboat.mkiv | 15 +- tex/context/modules/mkiv/x-asciimath.lua | 13 +- tex/context/modules/mkiv/x-asciimath.mkiv | 17 + tex/generic/context/luatex/luatex-basics-chr.lua | 1072 +++++++++++++ .../context/luatex/luatex-basics-prepare.tex | 8 +- tex/generic/context/luatex/luatex-fonts-merged.lua | 1680 ++++++++++++++++---- tex/generic/context/luatex/luatex-fonts.lua | 2 +- 134 files changed, 5972 insertions(+), 1465 deletions(-) create mode 100644 tex/context/fonts/mkiv/type-imp-modernlatin.mkiv create mode 100644 tex/context/modules/mkiv/s-fonts-basics.mkiv create mode 100644 tex/context/modules/mkiv/s-fonts-overlay.mkiv (limited to 'tex') diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 0c189965f..082e39ee4 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2018.03.16 22:20} +\newcontextversion{2018.04.02 15:43} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 2dcc7482e..4e087c1c8 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2018.03.16 22:20} +\edef\contextversion{2018.04.02 15:43} %D For those who want to use this: diff --git a/tex/context/base/mkiv/anch-pgr.lua b/tex/context/base/mkiv/anch-pgr.lua index 18a915692..ca5a5a8af 100644 --- a/tex/context/base/mkiv/anch-pgr.lua +++ b/tex/context/base/mkiv/anch-pgr.lua @@ -222,7 +222,7 @@ end interfaces.implement { name = "registerbackground", actions = registerbackground, - arguments = { "string" } + arguments = "string", } -- optimized already but we can assume a cycle i.e. prune the last point and then diff --git a/tex/context/base/mkiv/attr-ini.lua b/tex/context/base/mkiv/attr-ini.lua index 2a11558a5..67faa9fc0 100644 --- a/tex/context/base/mkiv/attr-ini.lua +++ b/tex/context/base/mkiv/attr-ini.lua @@ -170,7 +170,7 @@ end implement { name = "defineattribute", - arguments = { "string", "string" }, + arguments = "2 strings", actions = { attributes.define, context } } diff --git a/tex/context/base/mkiv/back-exp.lua b/tex/context/base/mkiv/back-exp.lua index 2d51d933d..b18679fa2 100644 --- a/tex/context/base/mkiv/back-exp.lua +++ b/tex/context/base/mkiv/back-exp.lua @@ -3876,7 +3876,7 @@ implement { implement { name = "settagfloat", actions = structurestags.setfloat, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/buff-ini.lua b/tex/context/base/mkiv/buff-ini.lua index 2bbec2e4a..1c7912773 100644 --- a/tex/context/base/mkiv/buff-ini.lua +++ b/tex/context/base/mkiv/buff-ini.lua @@ -492,7 +492,7 @@ end implement { name = "savebuffer", actions = savebuffer, - arguments = { "string", "string", "string" } + arguments = "3 strings", } -- we can consider adding a size to avoid unlikely clashes diff --git a/tex/context/base/mkiv/buff-par.lua b/tex/context/base/mkiv/buff-par.lua index 33ed4baf0..a2b300a2b 100644 --- a/tex/context/base/mkiv/buff-par.lua +++ b/tex/context/base/mkiv/buff-par.lua @@ -203,7 +203,7 @@ end implement { name = "defineparallel", actions = parallel.define, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -236,11 +236,11 @@ implement { implement { name = "resetparallel", actions = parallel.reset, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "doifelseparallel", actions = { parallel.hassomecontent, commands.doifelse } , - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/char-def.lua b/tex/context/base/mkiv/char-def.lua index a305ee202..fcbf01900 100644 --- a/tex/context/base/mkiv/char-def.lua +++ b/tex/context/base/mkiv/char-def.lua @@ -16,6 +16,9 @@ now and then using mtx-unicode where we check against the latest unicode txt fil (normally once per year around the tex live code freeze) and checked afterwards for differences. We could save some bytes by sharing variant tables but it's not worth the trouble. Some additional data is kept in other files. + +For a generic subset of the data here, run "context luatex-basics-prepare.tex" after +adapting this file. ]]-- local variants_emoji={ @@ -15430,8 +15433,8 @@ characters.data={ }, [0x60C]={ adobename="commaarabic", - contextname="arabiccomma", category="po", + contextname="arabiccomma", description="ARABIC COMMA", direction="cs", linebreak="is", @@ -20729,6 +20732,8 @@ characters.data={ category="mn", description="DEVANAGARI SIGN INVERTED CANDRABINDU", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0x900, }, @@ -20737,6 +20742,8 @@ characters.data={ category="mn", description="DEVANAGARI SIGN CANDRABINDU", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", synonyms={ "devanagari anunasika" }, unicodeslot=0x901, @@ -20746,6 +20753,8 @@ characters.data={ category="mn", description="DEVANAGARI SIGN ANUSVARA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", synonyms={ "devanagari bindu" }, unicodeslot=0x902, @@ -20755,6 +20764,8 @@ characters.data={ category="mc", description="DEVANAGARI SIGN VISARGA", direction="l", + indic="m", + indicmark="r", linebreak="cm", unicodeslot=0x903, }, @@ -20762,6 +20773,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SHORT A", direction="l", + indic="i", linebreak="al", unicodeslot=0x904, }, @@ -20770,6 +20782,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0x905, }, @@ -20778,6 +20791,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0x906, }, @@ -20786,6 +20800,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0x907, }, @@ -20794,6 +20809,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0x908, }, @@ -20802,6 +20818,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0x909, }, @@ -20810,6 +20827,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0x90A, }, @@ -20818,6 +20836,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0x90B, }, @@ -20826,6 +20845,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0x90C, }, @@ -20834,6 +20854,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER CANDRA E", direction="l", + indic="i", linebreak="al", unicodeslot=0x90D, }, @@ -20842,6 +20863,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SHORT E", direction="l", + indic="i", linebreak="al", unicodeslot=0x90E, }, @@ -20850,6 +20872,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0x90F, }, @@ -20858,6 +20881,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0x910, }, @@ -20866,6 +20890,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER CANDRA O", direction="l", + indic="i", linebreak="al", unicodeslot=0x911, }, @@ -20874,6 +20899,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SHORT O", direction="l", + indic="i", linebreak="al", unicodeslot=0x912, }, @@ -20882,6 +20908,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0x913, }, @@ -20890,6 +20917,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0x914, }, @@ -20898,6 +20926,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0x915, }, @@ -20906,6 +20935,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x916, }, @@ -20914,6 +20944,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0x917, }, @@ -20922,6 +20953,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x918, }, @@ -20930,6 +20962,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0x919, }, @@ -20938,6 +20971,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91A, }, @@ -20946,6 +20980,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91B, }, @@ -20954,6 +20989,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91C, }, @@ -20962,6 +20998,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91D, }, @@ -20970,6 +21007,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91E, }, @@ -20978,6 +21016,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0x91F, }, @@ -20986,6 +21025,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x920, }, @@ -20994,6 +21034,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0x921, }, @@ -21002,6 +21043,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x922, }, @@ -21010,6 +21052,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0x923, }, @@ -21018,6 +21061,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0x924, }, @@ -21026,6 +21070,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0x925, }, @@ -21034,6 +21079,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0x926, }, @@ -21042,6 +21088,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x927, }, @@ -21050,6 +21097,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0x928, }, @@ -21058,6 +21106,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER NNNA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x928, 0x93C }, unicodeslot=0x929, @@ -21067,6 +21116,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92A, }, @@ -21075,6 +21125,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92B, }, @@ -21083,6 +21134,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92C, }, @@ -21091,6 +21143,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92D, }, @@ -21099,6 +21152,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92E, }, @@ -21107,6 +21161,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0x92F, }, @@ -21115,6 +21170,9 @@ characters.data={ category="lo", description="DEVANAGARI LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="bp", linebreak="al", unicodeslot=0x930, }, @@ -21123,6 +21181,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER RRA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x930, 0x93C }, unicodeslot=0x931, @@ -21132,6 +21191,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0x932, }, @@ -21140,6 +21200,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0x933, }, @@ -21148,6 +21209,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER LLLA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x933, 0x93C }, unicodeslot=0x934, @@ -21157,6 +21219,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0x935, }, @@ -21165,6 +21228,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x936, }, @@ -21173,6 +21237,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0x937, }, @@ -21181,6 +21246,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0x938, }, @@ -21189,6 +21255,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0x939, }, @@ -21196,6 +21263,8 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN OE", direction="nsm", + indic="d", + indicmark="t", linebreak="cm", unicodeslot=0x93A, }, @@ -21203,6 +21272,8 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN OOE", direction="l", + indic="d", + indicmark="r", linebreak="cm", unicodeslot=0x93B, }, @@ -21212,6 +21283,9 @@ characters.data={ combining=0x7, description="DEVANAGARI SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0x93C, }, @@ -21220,6 +21294,7 @@ characters.data={ category="lo", description="DEVANAGARI SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0x93D, }, @@ -21228,6 +21303,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x93E, }, @@ -21236,6 +21314,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN I", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0x93F, }, @@ -21244,6 +21325,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x940, }, @@ -21252,6 +21336,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x941, }, @@ -21260,6 +21347,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x942, }, @@ -21268,6 +21358,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC R", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x943, }, @@ -21276,6 +21369,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC RR", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x944, }, @@ -21284,6 +21380,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN CANDRA E", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0x945, }, @@ -21292,6 +21391,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN SHORT E", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0x946, }, @@ -21300,6 +21402,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN E", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0x947, }, @@ -21308,6 +21413,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN AI", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0x948, }, @@ -21316,6 +21424,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN CANDRA O", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x949, }, @@ -21324,6 +21435,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN SHORT O", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x94A, }, @@ -21332,6 +21446,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN O", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x94B, }, @@ -21340,6 +21457,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN AU", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0x94C, }, @@ -21349,6 +21469,9 @@ characters.data={ combining=0x9, description="DEVANAGARI SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="b", linebreak="cm", synonyms={ "halant" }, unicodeslot=0x94D, @@ -21357,6 +21480,9 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN PRISHTHAMATRA E", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0x94E, }, @@ -21364,6 +21490,8 @@ characters.data={ category="mc", description="DEVANAGARI VOWEL SIGN AW", direction="l", + indic="d", + indicmark="r", linebreak="cm", unicodeslot=0x94F, }, @@ -21372,6 +21500,7 @@ characters.data={ category="lo", description="DEVANAGARI OM", direction="l", + indic="o", linebreak="al", unicodeslot=0x950, }, @@ -21381,6 +21510,8 @@ characters.data={ combining=0xE6, description="DEVANAGARI STRESS SIGN UDATTA", direction="nsm", + indic="s", + indicmark="t", linebreak="cm", unicodeslot=0x951, }, @@ -21390,6 +21521,9 @@ characters.data={ combining=0xDC, description="DEVANAGARI STRESS SIGN ANUDATTA", direction="nsm", + indic="s", + indicmark="b", + indicclass="anudatta", linebreak="cm", unicodeslot=0x952, }, @@ -21399,6 +21533,8 @@ characters.data={ combining=0xE6, description="DEVANAGARI GRAVE ACCENT", direction="nsm", + indic="s", + indicmark="t", linebreak="cm", unicodeslot=0x953, }, @@ -21408,6 +21544,8 @@ characters.data={ combining=0xE6, description="DEVANAGARI ACUTE ACCENT", direction="nsm", + indic="s", + indicmark="t", linebreak="cm", unicodeslot=0x954, }, @@ -21415,6 +21553,8 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN CANDRA LONG E", direction="nsm", + indic="d", + indicmark="t", linebreak="cm", unicodeslot=0x955, }, @@ -21422,6 +21562,8 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN UE", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0x956, }, @@ -21429,6 +21571,8 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN UUE", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0x957, }, @@ -21437,6 +21581,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER QA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x915, 0x93C }, unicodeslot=0x958, @@ -21446,6 +21591,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER KHHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x916, 0x93C }, unicodeslot=0x959, @@ -21455,6 +21601,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER GHHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x917, 0x93C }, unicodeslot=0x95A, @@ -21464,6 +21611,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER ZA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x91C, 0x93C }, unicodeslot=0x95B, @@ -21473,6 +21621,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DDDHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x921, 0x93C }, unicodeslot=0x95C, @@ -21482,6 +21631,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER RHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x922, 0x93C }, unicodeslot=0x95D, @@ -21491,6 +21641,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER FA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x92B, 0x93C }, unicodeslot=0x95E, @@ -21500,6 +21651,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER YYA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x92F, 0x93C }, unicodeslot=0x95F, @@ -21509,6 +21661,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0x960, }, @@ -21517,6 +21670,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0x961, }, @@ -21525,6 +21679,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC L", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x962, }, @@ -21533,6 +21690,9 @@ characters.data={ category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC LL", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x963, }, @@ -21541,6 +21701,7 @@ characters.data={ category="po", description="DEVANAGARI DANDA", direction="l", + indic="o", linebreak="ba", synonyms={ "devanagari phrase separator", "devanagari purna viram" }, unicodeslot=0x964, @@ -21550,6 +21711,7 @@ characters.data={ category="po", description="DEVANAGARI DOUBLE DANDA", direction="l", + indic="o", linebreak="ba", synonyms={ "devanagari deergh viram" }, unicodeslot=0x965, @@ -21559,6 +21721,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0x966, }, @@ -21567,6 +21730,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x967, }, @@ -21575,6 +21739,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0x968, }, @@ -21583,6 +21748,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x969, }, @@ -21591,6 +21757,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96A, }, @@ -21599,6 +21766,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96B, }, @@ -21607,6 +21775,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96C, }, @@ -21615,6 +21784,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96D, }, @@ -21623,6 +21793,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96E, }, @@ -21631,6 +21802,7 @@ characters.data={ category="nd", description="DEVANAGARI DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x96F, }, @@ -21639,6 +21811,7 @@ characters.data={ category="po", description="DEVANAGARI ABBREVIATION SIGN", direction="l", + indic="o", linebreak="al", unicodeslot=0x970, }, @@ -21646,6 +21819,7 @@ characters.data={ category="lm", description="DEVANAGARI SIGN HIGH SPACING DOT", direction="l", + indic="o", linebreak="al", unicodeslot=0x971, }, @@ -21653,6 +21827,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER CANDRA A", direction="l", + indic="i", linebreak="al", unicodeslot=0x972, }, @@ -21660,6 +21835,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER OE", direction="l", + indic="i", linebreak="al", unicodeslot=0x973, }, @@ -21667,6 +21843,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER OOE", direction="l", + indic="i", linebreak="al", unicodeslot=0x974, }, @@ -21674,6 +21851,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER AW", direction="l", + indic="i", linebreak="al", unicodeslot=0x975, }, @@ -21681,6 +21859,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER UE", direction="l", + indic="i", linebreak="al", unicodeslot=0x976, }, @@ -21688,6 +21867,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER UUE", direction="l", + indic="i", linebreak="al", unicodeslot=0x977, }, @@ -21695,6 +21875,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER MARWARI DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0x978, }, @@ -21702,6 +21883,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER ZHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x979, }, @@ -21709,6 +21891,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER HEAVY YA", direction="l", + indic="c", linebreak="al", unicodeslot=0x97A, }, @@ -21716,6 +21899,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER GGA", direction="l", + indic="o", linebreak="al", unicodeslot=0x97B, }, @@ -21723,6 +21907,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER JJA", direction="l", + indic="o", linebreak="al", unicodeslot=0x97C, }, @@ -21730,6 +21915,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER GLOTTAL STOP", direction="l", + indic="o", linebreak="al", unicodeslot=0x97D, }, @@ -21737,6 +21923,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER DDDA", direction="l", + indic="o", linebreak="al", unicodeslot=0x97E, }, @@ -21744,6 +21931,7 @@ characters.data={ category="lo", description="DEVANAGARI LETTER BBA", direction="l", + indic="o", linebreak="al", unicodeslot=0x97F, }, @@ -21751,6 +21939,7 @@ characters.data={ category="lo", description="BENGALI ANJI", direction="l", + indic="o", linebreak="al", unicodeslot=0x980, }, @@ -21759,6 +21948,8 @@ characters.data={ category="mn", description="BENGALI SIGN CANDRABINDU", direction="nsm", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0x981, }, @@ -21767,6 +21958,7 @@ characters.data={ category="mc", description="BENGALI SIGN ANUSVARA", direction="l", + indic="o", linebreak="cm", unicodeslot=0x982, }, @@ -21775,6 +21967,7 @@ characters.data={ category="mc", description="BENGALI SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0x983, }, @@ -21783,6 +21976,7 @@ characters.data={ category="lo", description="BENGALI LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0x985, }, @@ -21791,6 +21985,7 @@ characters.data={ category="lo", description="BENGALI LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0x986, }, @@ -21799,6 +21994,7 @@ characters.data={ category="lo", description="BENGALI LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0x987, }, @@ -21807,6 +22003,7 @@ characters.data={ category="lo", description="BENGALI LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0x988, }, @@ -21815,6 +22012,7 @@ characters.data={ category="lo", description="BENGALI LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0x989, }, @@ -21823,6 +22021,7 @@ characters.data={ category="lo", description="BENGALI LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0x98A, }, @@ -21831,6 +22030,7 @@ characters.data={ category="lo", description="BENGALI LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0x98B, }, @@ -21839,6 +22039,7 @@ characters.data={ category="lo", description="BENGALI LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0x98C, }, @@ -21847,6 +22048,7 @@ characters.data={ category="lo", description="BENGALI LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0x98F, }, @@ -21855,6 +22057,7 @@ characters.data={ category="lo", description="BENGALI LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0x990, }, @@ -21863,6 +22066,7 @@ characters.data={ category="lo", description="BENGALI LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0x993, }, @@ -21871,6 +22075,7 @@ characters.data={ category="lo", description="BENGALI LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0x994, }, @@ -21879,6 +22084,7 @@ characters.data={ category="lo", description="BENGALI LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0x995, }, @@ -21887,6 +22093,7 @@ characters.data={ category="lo", description="BENGALI LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x996, }, @@ -21895,6 +22102,7 @@ characters.data={ category="lo", description="BENGALI LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0x997, }, @@ -21903,6 +22111,7 @@ characters.data={ category="lo", description="BENGALI LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x998, }, @@ -21911,6 +22120,7 @@ characters.data={ category="lo", description="BENGALI LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0x999, }, @@ -21919,6 +22129,7 @@ characters.data={ category="lo", description="BENGALI LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99A, }, @@ -21927,6 +22138,7 @@ characters.data={ category="lo", description="BENGALI LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99B, }, @@ -21935,6 +22147,7 @@ characters.data={ category="lo", description="BENGALI LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99C, }, @@ -21943,6 +22156,7 @@ characters.data={ category="lo", description="BENGALI LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99D, }, @@ -21951,6 +22165,7 @@ characters.data={ category="lo", description="BENGALI LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99E, }, @@ -21959,6 +22174,7 @@ characters.data={ category="lo", description="BENGALI LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0x99F, }, @@ -21967,6 +22183,7 @@ characters.data={ category="lo", description="BENGALI LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A0, }, @@ -21975,6 +22192,7 @@ characters.data={ category="lo", description="BENGALI LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A1, }, @@ -21983,6 +22201,7 @@ characters.data={ category="lo", description="BENGALI LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A2, }, @@ -21991,6 +22210,7 @@ characters.data={ category="lo", description="BENGALI LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A3, }, @@ -21999,6 +22219,7 @@ characters.data={ category="lo", description="BENGALI LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A4, }, @@ -22007,6 +22228,7 @@ characters.data={ category="lo", description="BENGALI LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A5, }, @@ -22015,6 +22237,7 @@ characters.data={ category="lo", description="BENGALI LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A6, }, @@ -22023,6 +22246,7 @@ characters.data={ category="lo", description="BENGALI LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A7, }, @@ -22031,6 +22255,7 @@ characters.data={ category="lo", description="BENGALI LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9A8, }, @@ -22039,6 +22264,7 @@ characters.data={ category="lo", description="BENGALI LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AA, }, @@ -22047,6 +22273,7 @@ characters.data={ category="lo", description="BENGALI LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AB, }, @@ -22055,6 +22282,7 @@ characters.data={ category="lo", description="BENGALI LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AC, }, @@ -22063,6 +22291,7 @@ characters.data={ category="lo", description="BENGALI LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AD, }, @@ -22071,6 +22300,7 @@ characters.data={ category="lo", description="BENGALI LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AE, }, @@ -22079,6 +22309,7 @@ characters.data={ category="lo", description="BENGALI LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9AF, }, @@ -22087,6 +22318,9 @@ characters.data={ category="lo", description="BENGALI LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="as", linebreak="al", unicodeslot=0x9B0, }, @@ -22095,6 +22329,7 @@ characters.data={ category="lo", description="BENGALI LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9B2, }, @@ -22103,6 +22338,7 @@ characters.data={ category="lo", description="BENGALI LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9B6, }, @@ -22111,6 +22347,7 @@ characters.data={ category="lo", description="BENGALI LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9B7, }, @@ -22119,6 +22356,7 @@ characters.data={ category="lo", description="BENGALI LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9B8, }, @@ -22127,6 +22365,7 @@ characters.data={ category="lo", description="BENGALI LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9B9, }, @@ -22136,6 +22375,9 @@ characters.data={ combining=0x7, description="BENGALI SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0x9BC, }, @@ -22143,6 +22385,7 @@ characters.data={ category="lo", description="BENGALI SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0x9BD, }, @@ -22151,6 +22394,9 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0x9BE, }, @@ -22159,6 +22405,9 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN I", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0x9BF, }, @@ -22167,6 +22416,9 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0x9C0, }, @@ -22175,6 +22427,9 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x9C1, }, @@ -22183,6 +22438,9 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x9C2, }, @@ -22191,6 +22449,9 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN VOCALIC R", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x9C3, }, @@ -22199,6 +22460,9 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN VOCALIC RR", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0x9C4, }, @@ -22207,6 +22471,9 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN E", direction="l", + indic="d", + indicmark="r", + indicorder="bh", linebreak="cm", unicodeslot=0x9C7, }, @@ -22215,6 +22482,9 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN AI", direction="l", + indic="d", + indicmark="r", + indicorder="bh", linebreak="cm", unicodeslot=0x9C8, }, @@ -22223,6 +22493,7 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN O", direction="l", + indic="s", linebreak="cm", specials={ "char", 0x9C7, 0x9BE }, unicodeslot=0x9CB, @@ -22232,6 +22503,7 @@ characters.data={ category="mc", description="BENGALI VOWEL SIGN AU", direction="l", + indic="s", linebreak="cm", specials={ "char", 0x9C7, 0x9D7 }, unicodeslot=0x9CC, @@ -22242,6 +22514,9 @@ characters.data={ combining=0x9, description="BENGALI SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="b", linebreak="cm", synonyms={ "bengali hasant" }, unicodeslot=0x9CD, @@ -22250,6 +22525,7 @@ characters.data={ category="lo", description="BENGALI LETTER KHANDA TA", direction="l", + indic="c", linebreak="al", unicodeslot=0x9CE, }, @@ -22258,6 +22534,8 @@ characters.data={ category="mc", description="BENGALI AU LENGTH MARK", direction="l", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0x9D7, }, @@ -22266,6 +22544,7 @@ characters.data={ category="lo", description="BENGALI LETTER RRA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x9A1, 0x9BC }, unicodeslot=0x9DC, @@ -22275,6 +22554,7 @@ characters.data={ category="lo", description="BENGALI LETTER RHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x9A2, 0x9BC }, unicodeslot=0x9DD, @@ -22284,6 +22564,7 @@ characters.data={ category="lo", description="BENGALI LETTER YYA", direction="l", + indic="c", linebreak="al", specials={ "char", 0x9AF, 0x9BC }, unicodeslot=0x9DF, @@ -22293,6 +22574,7 @@ characters.data={ category="lo", description="BENGALI LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0x9E0, }, @@ -22301,6 +22583,7 @@ characters.data={ category="lo", description="BENGALI LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0x9E1, }, @@ -22309,6 +22592,8 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN VOCALIC L", direction="nsm", + indic="i", + indicorder="as", linebreak="cm", unicodeslot=0x9E2, }, @@ -22317,6 +22602,8 @@ characters.data={ category="mn", description="BENGALI VOWEL SIGN VOCALIC LL", direction="nsm", + indic="i", + indicorder="as", linebreak="cm", unicodeslot=0x9E3, }, @@ -22325,6 +22612,7 @@ characters.data={ category="nd", description="BENGALI DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9E6, }, @@ -22333,6 +22621,7 @@ characters.data={ category="nd", description="BENGALI DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9E7, }, @@ -22341,6 +22630,7 @@ characters.data={ category="nd", description="BENGALI DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9E8, }, @@ -22349,6 +22639,7 @@ characters.data={ category="nd", description="BENGALI DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9E9, }, @@ -22357,6 +22648,7 @@ characters.data={ category="nd", description="BENGALI DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9EA, }, @@ -22365,6 +22657,7 @@ characters.data={ category="nd", description="BENGALI DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9EB, }, @@ -22373,6 +22666,7 @@ characters.data={ category="nd", description="BENGALI DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9EC, }, @@ -22381,6 +22675,7 @@ characters.data={ category="nd", description="BENGALI DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9ED, }, @@ -22389,6 +22684,7 @@ characters.data={ category="nd", description="BENGALI DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9EE, }, @@ -22397,6 +22693,7 @@ characters.data={ category="nd", description="BENGALI DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0x9EF, }, @@ -22405,6 +22702,8 @@ characters.data={ category="lo", description="BENGALI LETTER RA WITH MIDDLE DIAGONAL", direction="l", + indic="o", + indicorder="as", linebreak="al", shcode=0x9B0, unicodeslot=0x9F0, @@ -22414,6 +22713,7 @@ characters.data={ category="lo", description="BENGALI LETTER RA WITH LOWER DIAGONAL", direction="l", + indic="o", linebreak="al", shcode=0x9B0, unicodeslot=0x9F1, @@ -22423,6 +22723,7 @@ characters.data={ category="sc", description="BENGALI RUPEE MARK", direction="et", + indic="o", linebreak="po", unicodeslot=0x9F2, }, @@ -22431,6 +22732,7 @@ characters.data={ category="sc", description="BENGALI RUPEE SIGN", direction="et", + indic="o", linebreak="po", unicodeslot=0x9F3, }, @@ -22439,6 +22741,7 @@ characters.data={ category="no", description="BENGALI CURRENCY NUMERATOR ONE", direction="l", + indic="o", linebreak="al", unicodeslot=0x9F4, }, @@ -22447,6 +22750,7 @@ characters.data={ category="no", description="BENGALI CURRENCY NUMERATOR TWO", direction="l", + indic="o", linebreak="al", unicodeslot=0x9F5, }, @@ -22455,6 +22759,7 @@ characters.data={ category="no", description="BENGALI CURRENCY NUMERATOR THREE", direction="l", + indic="o", linebreak="al", unicodeslot=0x9F6, }, @@ -22463,6 +22768,7 @@ characters.data={ category="no", description="BENGALI CURRENCY NUMERATOR FOUR", direction="l", + indic="o", linebreak="al", unicodeslot=0x9F7, }, @@ -22471,6 +22777,7 @@ characters.data={ category="no", description="BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR", direction="l", + indic="o", linebreak="al", unicodeslot=0x9F8, }, @@ -22479,6 +22786,7 @@ characters.data={ category="no", description="BENGALI CURRENCY DENOMINATOR SIXTEEN", direction="l", + indic="o", linebreak="po", unicodeslot=0x9F9, }, @@ -22487,6 +22795,7 @@ characters.data={ category="so", description="BENGALI ISSHAR", direction="l", + indic="o", linebreak="al", unicodeslot=0x9FA, }, @@ -22494,6 +22803,7 @@ characters.data={ category="sc", description="BENGALI GANDA MARK", direction="et", + indic="o", linebreak="pr", unicodeslot=0x9FB, }, @@ -22501,6 +22811,7 @@ characters.data={ category="lo", description="BENGALI LETTER VEDIC ANUSVARA", direction="l", + indic="o", linebreak="al", unicodeslot=0x9FC, }, @@ -22508,6 +22819,7 @@ characters.data={ category="po", description="BENGALI ABBREVIATION SIGN", direction="l", + indic="o", linebreak="al", unicodeslot=0x9FD, }, @@ -22515,6 +22827,8 @@ characters.data={ category="mn", description="GURMUKHI SIGN ADAK BINDI", direction="nsm", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xA01, }, @@ -22523,6 +22837,8 @@ characters.data={ category="mn", description="GURMUKHI SIGN BINDI", direction="nsm", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xA02, }, @@ -22530,6 +22846,7 @@ characters.data={ category="mc", description="GURMUKHI SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xA03, }, @@ -22538,6 +22855,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xA05, }, @@ -22546,6 +22864,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xA06, }, @@ -22554,6 +22873,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xA07, }, @@ -22562,6 +22882,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xA08, }, @@ -22570,6 +22891,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xA09, }, @@ -22578,6 +22900,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xA0A, }, @@ -22586,6 +22909,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER EE", direction="l", + indic="i", linebreak="al", unicodeslot=0xA0F, }, @@ -22594,6 +22918,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xA10, }, @@ -22602,6 +22927,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER OO", direction="l", + indic="i", linebreak="al", unicodeslot=0xA13, }, @@ -22610,6 +22936,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xA14, }, @@ -22618,6 +22945,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA15, }, @@ -22626,6 +22954,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA16, }, @@ -22634,6 +22963,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA17, }, @@ -22642,6 +22972,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA18, }, @@ -22650,6 +22981,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA19, }, @@ -22658,6 +22990,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1A, }, @@ -22666,6 +22999,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1B, }, @@ -22674,6 +23008,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1C, }, @@ -22682,6 +23017,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1D, }, @@ -22690,6 +23026,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1E, }, @@ -22698,6 +23035,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA1F, }, @@ -22706,6 +23044,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA20, }, @@ -22714,6 +23053,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA21, }, @@ -22722,6 +23062,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA22, }, @@ -22730,6 +23071,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA23, }, @@ -22738,6 +23080,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA24, }, @@ -22746,6 +23089,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA25, }, @@ -22754,6 +23098,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA26, }, @@ -22762,6 +23107,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA27, }, @@ -22770,6 +23116,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA28, }, @@ -22778,6 +23125,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2A, }, @@ -22786,6 +23134,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2B, }, @@ -22794,6 +23143,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2C, }, @@ -22802,6 +23152,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2D, }, @@ -22810,6 +23161,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2E, }, @@ -22818,6 +23170,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA2F, }, @@ -22826,6 +23179,9 @@ characters.data={ category="lo", description="GURMUKHI LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="bs", linebreak="al", unicodeslot=0xA30, }, @@ -22834,6 +23190,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA32, }, @@ -22841,6 +23198,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER LLA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA32, 0xA3C }, unicodeslot=0xA33, @@ -22850,6 +23208,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA35, }, @@ -22858,6 +23217,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER SHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA38, 0xA3C }, unicodeslot=0xA36, @@ -22867,6 +23227,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA38, }, @@ -22875,6 +23236,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA39, }, @@ -22884,6 +23246,9 @@ characters.data={ combining=0x7, description="GURMUKHI SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0xA3C, }, @@ -22892,6 +23257,9 @@ characters.data={ category="mc", description="GURMUKHI VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xA3E, }, @@ -22900,6 +23268,9 @@ characters.data={ category="mc", description="GURMUKHI VOWEL SIGN I", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0xA3F, }, @@ -22908,6 +23279,9 @@ characters.data={ category="mc", description="GURMUKHI VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xA40, }, @@ -22916,6 +23290,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xA41, }, @@ -22924,6 +23301,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xA42, }, @@ -22932,6 +23312,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN EE", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xA47, }, @@ -22940,6 +23323,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN AI", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xA48, }, @@ -22948,6 +23334,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN OO", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xA4B, }, @@ -22956,6 +23345,9 @@ characters.data={ category="mn", description="GURMUKHI VOWEL SIGN AU", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xA4C, }, @@ -22965,6 +23357,9 @@ characters.data={ combining=0x9, description="GURMUKHI SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="b", linebreak="cm", unicodeslot=0xA4D, }, @@ -22972,6 +23367,7 @@ characters.data={ category="mn", description="GURMUKHI SIGN UDAAT", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xA51, }, @@ -22980,6 +23376,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER KHHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA16, 0xA3C }, unicodeslot=0xA59, @@ -22989,6 +23386,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER GHHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA17, 0xA3C }, unicodeslot=0xA5A, @@ -22998,6 +23396,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER ZA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA1C, 0xA3C }, unicodeslot=0xA5B, @@ -23007,6 +23406,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER RRA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA5C, }, @@ -23015,6 +23415,7 @@ characters.data={ category="lo", description="GURMUKHI LETTER FA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xA2B, 0xA3C }, unicodeslot=0xA5E, @@ -23024,6 +23425,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA66, }, @@ -23032,6 +23434,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA67, }, @@ -23040,6 +23443,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA68, }, @@ -23048,6 +23452,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA69, }, @@ -23056,6 +23461,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6A, }, @@ -23064,6 +23470,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6B, }, @@ -23072,6 +23479,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6C, }, @@ -23080,6 +23488,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6D, }, @@ -23088,6 +23497,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6E, }, @@ -23096,6 +23506,7 @@ characters.data={ category="nd", description="GURMUKHI DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA6F, }, @@ -23104,6 +23515,8 @@ characters.data={ category="mn", description="GURMUKHI TIPPI", direction="nsm", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xA70, }, @@ -23112,6 +23525,8 @@ characters.data={ category="mn", description="GURMUKHI ADDAK", direction="nsm", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xA71, }, @@ -23120,6 +23535,7 @@ characters.data={ category="lo", description="GURMUKHI IRI", direction="l", + indic="o", linebreak="al", unicodeslot=0xA72, }, @@ -23128,6 +23544,7 @@ characters.data={ category="lo", description="GURMUKHI URA", direction="l", + indic="o", linebreak="al", unicodeslot=0xA73, }, @@ -23136,6 +23553,7 @@ characters.data={ category="lo", description="GURMUKHI EK ONKAR", direction="l", + indic="o", linebreak="al", unicodeslot=0xA74, }, @@ -23143,6 +23561,7 @@ characters.data={ category="mn", description="GURMUKHI SIGN YAKASH", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xA75, }, @@ -23151,6 +23570,7 @@ characters.data={ category="mn", description="GUJARATI SIGN CANDRABINDU", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xA81, }, @@ -23159,6 +23579,7 @@ characters.data={ category="mn", description="GUJARATI SIGN ANUSVARA", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xA82, }, @@ -23167,6 +23588,7 @@ characters.data={ category="mc", description="GUJARATI SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xA83, }, @@ -23175,6 +23597,7 @@ characters.data={ category="lo", description="GUJARATI LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xA85, }, @@ -23183,6 +23606,7 @@ characters.data={ category="lo", description="GUJARATI LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xA86, }, @@ -23191,6 +23615,7 @@ characters.data={ category="lo", description="GUJARATI LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xA87, }, @@ -23199,6 +23624,7 @@ characters.data={ category="lo", description="GUJARATI LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xA88, }, @@ -23207,6 +23633,7 @@ characters.data={ category="lo", description="GUJARATI LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xA89, }, @@ -23215,6 +23642,7 @@ characters.data={ category="lo", description="GUJARATI LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xA8A, }, @@ -23223,6 +23651,7 @@ characters.data={ category="lo", description="GUJARATI LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0xA8B, }, @@ -23230,6 +23659,7 @@ characters.data={ category="lo", description="GUJARATI LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0xA8C, }, @@ -23238,6 +23668,7 @@ characters.data={ category="lo", description="GUJARATI VOWEL CANDRA E", direction="l", + indic="i", linebreak="al", unicodeslot=0xA8D, }, @@ -23246,6 +23677,7 @@ characters.data={ category="lo", description="GUJARATI LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xA8F, }, @@ -23254,6 +23686,7 @@ characters.data={ category="lo", description="GUJARATI LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xA90, }, @@ -23262,6 +23695,7 @@ characters.data={ category="lo", description="GUJARATI VOWEL CANDRA O", direction="l", + indic="i", linebreak="al", unicodeslot=0xA91, }, @@ -23270,6 +23704,7 @@ characters.data={ category="lo", description="GUJARATI LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xA93, }, @@ -23278,6 +23713,7 @@ characters.data={ category="lo", description="GUJARATI LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xA94, }, @@ -23286,6 +23722,7 @@ characters.data={ category="lo", description="GUJARATI LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA95, }, @@ -23294,6 +23731,7 @@ characters.data={ category="lo", description="GUJARATI LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA96, }, @@ -23302,6 +23740,7 @@ characters.data={ category="lo", description="GUJARATI LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA97, }, @@ -23310,6 +23749,7 @@ characters.data={ category="lo", description="GUJARATI LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA98, }, @@ -23318,6 +23758,7 @@ characters.data={ category="lo", description="GUJARATI LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA99, }, @@ -23326,6 +23767,7 @@ characters.data={ category="lo", description="GUJARATI LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9A, }, @@ -23334,6 +23776,7 @@ characters.data={ category="lo", description="GUJARATI LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9B, }, @@ -23342,6 +23785,7 @@ characters.data={ category="lo", description="GUJARATI LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9C, }, @@ -23350,6 +23794,7 @@ characters.data={ category="lo", description="GUJARATI LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9D, }, @@ -23358,6 +23803,7 @@ characters.data={ category="lo", description="GUJARATI LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9E, }, @@ -23366,6 +23812,7 @@ characters.data={ category="lo", description="GUJARATI LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xA9F, }, @@ -23374,6 +23821,7 @@ characters.data={ category="lo", description="GUJARATI LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA0, }, @@ -23382,6 +23830,7 @@ characters.data={ category="lo", description="GUJARATI LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA1, }, @@ -23390,6 +23839,7 @@ characters.data={ category="lo", description="GUJARATI LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA2, }, @@ -23398,6 +23848,7 @@ characters.data={ category="lo", description="GUJARATI LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA3, }, @@ -23406,6 +23857,7 @@ characters.data={ category="lo", description="GUJARATI LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA4, }, @@ -23414,6 +23866,7 @@ characters.data={ category="lo", description="GUJARATI LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA5, }, @@ -23422,6 +23875,7 @@ characters.data={ category="lo", description="GUJARATI LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA6, }, @@ -23430,6 +23884,7 @@ characters.data={ category="lo", description="GUJARATI LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA7, }, @@ -23438,6 +23893,7 @@ characters.data={ category="lo", description="GUJARATI LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAA8, }, @@ -23446,6 +23902,7 @@ characters.data={ category="lo", description="GUJARATI LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAA, }, @@ -23454,6 +23911,7 @@ characters.data={ category="lo", description="GUJARATI LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAB, }, @@ -23462,6 +23920,7 @@ characters.data={ category="lo", description="GUJARATI LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAC, }, @@ -23470,6 +23929,7 @@ characters.data={ category="lo", description="GUJARATI LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAD, }, @@ -23478,6 +23938,7 @@ characters.data={ category="lo", description="GUJARATI LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAE, }, @@ -23486,6 +23947,7 @@ characters.data={ category="lo", description="GUJARATI LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAAF, }, @@ -23494,6 +23956,9 @@ characters.data={ category="lo", description="GUJARATI LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="bp", linebreak="al", unicodeslot=0xAB0, }, @@ -23502,6 +23967,7 @@ characters.data={ category="lo", description="GUJARATI LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB2, }, @@ -23510,6 +23976,7 @@ characters.data={ category="lo", description="GUJARATI LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB3, }, @@ -23518,6 +23985,7 @@ characters.data={ category="lo", description="GUJARATI LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB5, }, @@ -23526,6 +23994,7 @@ characters.data={ category="lo", description="GUJARATI LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB6, }, @@ -23534,6 +24003,7 @@ characters.data={ category="lo", description="GUJARATI LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB7, }, @@ -23542,6 +24012,7 @@ characters.data={ category="lo", description="GUJARATI LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB8, }, @@ -23550,6 +24021,7 @@ characters.data={ category="lo", description="GUJARATI LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xAB9, }, @@ -23559,6 +24031,9 @@ characters.data={ combining=0x7, description="GUJARATI SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0xABC, }, @@ -23566,6 +24041,7 @@ characters.data={ category="lo", description="GUJARATI SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0xABD, }, @@ -23574,6 +24050,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xABE, }, @@ -23582,6 +24061,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN I", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0xABF, }, @@ -23590,6 +24072,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xAC0, }, @@ -23598,6 +24083,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xAC1, }, @@ -23606,6 +24094,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xAC2, }, @@ -23614,6 +24105,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC R", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xAC3, }, @@ -23622,6 +24116,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC RR", direction="nsm", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xAC4, }, @@ -23630,6 +24127,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN CANDRA E", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xAC5, }, @@ -23638,6 +24138,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN E", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xAC7, }, @@ -23646,6 +24149,9 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN AI", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xAC8, }, @@ -23654,6 +24160,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN CANDRA O", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xAC9, }, @@ -23662,6 +24171,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN O", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xACB, }, @@ -23670,6 +24182,9 @@ characters.data={ category="mc", description="GUJARATI VOWEL SIGN AU", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xACC, }, @@ -23679,6 +24194,9 @@ characters.data={ combining=0x9, description="GUJARATI SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="b", linebreak="cm", unicodeslot=0xACD, }, @@ -23687,6 +24205,7 @@ characters.data={ category="lo", description="GUJARATI OM", direction="l", + indic="o", linebreak="al", unicodeslot=0xAD0, }, @@ -23695,6 +24214,7 @@ characters.data={ category="lo", description="GUJARATI LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0xAE0, }, @@ -23702,6 +24222,7 @@ characters.data={ category="lo", description="GUJARATI LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0xAE1, }, @@ -23709,6 +24230,8 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC L", direction="nsm", + indic="i", + indicorder="ap", linebreak="cm", unicodeslot=0xAE2, }, @@ -23716,6 +24239,8 @@ characters.data={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC LL", direction="nsm", + indic="i", + indicorder="ap", linebreak="cm", unicodeslot=0xAE3, }, @@ -23724,6 +24249,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAE6, }, @@ -23732,6 +24258,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAE7, }, @@ -23740,6 +24267,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAE8, }, @@ -23748,6 +24276,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAE9, }, @@ -23756,6 +24285,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAEA, }, @@ -23764,6 +24294,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAEB, }, @@ -23772,6 +24303,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAEC, }, @@ -23780,6 +24312,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAED, }, @@ -23788,6 +24321,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAEE, }, @@ -23796,6 +24330,7 @@ characters.data={ category="nd", description="GUJARATI DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xAEF, }, @@ -23803,6 +24338,7 @@ characters.data={ category="po", description="GUJARATI ABBREVIATION SIGN", direction="l", + indic="o", linebreak="al", unicodeslot=0xAF0, }, @@ -23810,6 +24346,7 @@ characters.data={ category="sc", description="GUJARATI RUPEE SIGN", direction="et", + indic="o", linebreak="pr", unicodeslot=0xAF1, }, @@ -23817,6 +24354,7 @@ characters.data={ category="lo", description="GUJARATI LETTER ZHA", direction="l", + indic="o", linebreak="al", unicodeslot=0xAF9, }, @@ -23824,6 +24362,7 @@ characters.data={ category="mn", description="GUJARATI SIGN SUKUN", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFA, }, @@ -23831,6 +24370,7 @@ characters.data={ category="mn", description="GUJARATI SIGN SHADDA", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFB, }, @@ -23838,6 +24378,7 @@ characters.data={ category="mn", description="GUJARATI SIGN MADDAH", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFC, }, @@ -23845,6 +24386,7 @@ characters.data={ category="mn", description="GUJARATI SIGN THREE-DOT NUKTA ABOVE", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFD, }, @@ -23852,6 +24394,7 @@ characters.data={ category="mn", description="GUJARATI SIGN CIRCLE NUKTA ABOVE", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFE, }, @@ -23859,6 +24402,7 @@ characters.data={ category="mn", description="GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xAFF, }, @@ -23866,6 +24410,8 @@ characters.data={ category="mn", description="ORIYA SIGN CANDRABINDU", direction="nsm", + indic="o", + indicorder="bs", linebreak="cm", unicodeslot=0xB01, }, @@ -23873,6 +24419,7 @@ characters.data={ category="mc", description="ORIYA SIGN ANUSVARA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xB02, }, @@ -23880,6 +24427,7 @@ characters.data={ category="mc", description="ORIYA SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xB03, }, @@ -23887,6 +24435,7 @@ characters.data={ category="lo", description="ORIYA LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xB05, }, @@ -23894,6 +24443,7 @@ characters.data={ category="lo", description="ORIYA LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xB06, }, @@ -23901,6 +24451,7 @@ characters.data={ category="lo", description="ORIYA LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xB07, }, @@ -23908,6 +24459,7 @@ characters.data={ category="lo", description="ORIYA LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xB08, }, @@ -23915,6 +24467,7 @@ characters.data={ category="lo", description="ORIYA LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xB09, }, @@ -23922,6 +24475,7 @@ characters.data={ category="lo", description="ORIYA LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xB0A, }, @@ -23929,6 +24483,7 @@ characters.data={ category="lo", description="ORIYA LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0xB0B, }, @@ -23936,6 +24491,7 @@ characters.data={ category="lo", description="ORIYA LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0xB0C, }, @@ -23943,6 +24499,7 @@ characters.data={ category="lo", description="ORIYA LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xB0F, }, @@ -23950,6 +24507,7 @@ characters.data={ category="lo", description="ORIYA LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xB10, }, @@ -23957,6 +24515,7 @@ characters.data={ category="lo", description="ORIYA LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xB13, }, @@ -23964,6 +24523,7 @@ characters.data={ category="lo", description="ORIYA LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xB14, }, @@ -23971,6 +24531,7 @@ characters.data={ category="lo", description="ORIYA LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB15, }, @@ -23978,6 +24539,7 @@ characters.data={ category="lo", description="ORIYA LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB16, }, @@ -23985,6 +24547,7 @@ characters.data={ category="lo", description="ORIYA LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB17, }, @@ -23992,6 +24555,7 @@ characters.data={ category="lo", description="ORIYA LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB18, }, @@ -23999,6 +24563,7 @@ characters.data={ category="lo", description="ORIYA LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB19, }, @@ -24006,6 +24571,7 @@ characters.data={ category="lo", description="ORIYA LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1A, }, @@ -24013,6 +24579,7 @@ characters.data={ category="lo", description="ORIYA LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1B, }, @@ -24020,6 +24587,7 @@ characters.data={ category="lo", description="ORIYA LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1C, }, @@ -24027,6 +24595,7 @@ characters.data={ category="lo", description="ORIYA LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1D, }, @@ -24034,6 +24603,7 @@ characters.data={ category="lo", description="ORIYA LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1E, }, @@ -24041,6 +24611,7 @@ characters.data={ category="lo", description="ORIYA LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB1F, }, @@ -24048,6 +24619,7 @@ characters.data={ category="lo", description="ORIYA LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB20, }, @@ -24055,6 +24627,7 @@ characters.data={ category="lo", description="ORIYA LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB21, }, @@ -24062,6 +24635,7 @@ characters.data={ category="lo", description="ORIYA LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB22, }, @@ -24069,6 +24643,7 @@ characters.data={ category="lo", description="ORIYA LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB23, }, @@ -24076,6 +24651,7 @@ characters.data={ category="lo", description="ORIYA LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB24, }, @@ -24083,6 +24659,7 @@ characters.data={ category="lo", description="ORIYA LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB25, }, @@ -24090,6 +24667,7 @@ characters.data={ category="lo", description="ORIYA LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB26, }, @@ -24097,6 +24675,7 @@ characters.data={ category="lo", description="ORIYA LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB27, }, @@ -24104,6 +24683,7 @@ characters.data={ category="lo", description="ORIYA LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB28, }, @@ -24111,6 +24691,7 @@ characters.data={ category="lo", description="ORIYA LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2A, }, @@ -24118,6 +24699,7 @@ characters.data={ category="lo", description="ORIYA LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2B, }, @@ -24125,6 +24707,7 @@ characters.data={ category="lo", description="ORIYA LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2C, }, @@ -24132,6 +24715,7 @@ characters.data={ category="lo", description="ORIYA LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2D, }, @@ -24139,6 +24723,7 @@ characters.data={ category="lo", description="ORIYA LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2E, }, @@ -24146,6 +24731,7 @@ characters.data={ category="lo", description="ORIYA LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB2F, }, @@ -24153,6 +24739,9 @@ characters.data={ category="lo", description="ORIYA LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="am", linebreak="al", unicodeslot=0xB30, }, @@ -24160,6 +24749,7 @@ characters.data={ category="lo", description="ORIYA LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB32, }, @@ -24167,6 +24757,7 @@ characters.data={ category="lo", description="ORIYA LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB33, }, @@ -24174,6 +24765,7 @@ characters.data={ category="lo", description="ORIYA LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB35, }, @@ -24181,6 +24773,7 @@ characters.data={ category="lo", description="ORIYA LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB36, }, @@ -24188,6 +24781,7 @@ characters.data={ category="lo", description="ORIYA LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB37, }, @@ -24195,6 +24789,7 @@ characters.data={ category="lo", description="ORIYA LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB38, }, @@ -24202,6 +24797,7 @@ characters.data={ category="lo", description="ORIYA LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB39, }, @@ -24210,6 +24806,9 @@ characters.data={ combining=0x7, description="ORIYA SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0xB3C, }, @@ -24217,6 +24816,7 @@ characters.data={ category="lo", description="ORIYA SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0xB3D, }, @@ -24224,6 +24824,9 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xB3E, }, @@ -24231,6 +24834,9 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN I", direction="nsm", + indic="d", + indicmark="t", + indicorder="am", linebreak="cm", unicodeslot=0xB3F, }, @@ -24238,6 +24844,9 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xB40, }, @@ -24245,6 +24854,9 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0xB41, }, @@ -24252,6 +24864,9 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0xB42, }, @@ -24259,6 +24874,9 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN VOCALIC R", direction="nsm", + indic="d", + indicmark="b", + indicorder="as", linebreak="cm", unicodeslot=0xB43, }, @@ -24266,6 +24884,8 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN VOCALIC RR", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xB44, }, @@ -24273,6 +24893,9 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN E", direction="l", + indic="d", + indicmark="l", + indicorder="bh", linebreak="cm", unicodeslot=0xB47, }, @@ -24280,6 +24903,8 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN AI", direction="l", + indic="d", + indicmark="l", linebreak="cm", specials={ "char", 0xB47, 0xB56 }, unicodeslot=0xB48, @@ -24288,6 +24913,8 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN O", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xB47, 0xB3E }, unicodeslot=0xB4B, @@ -24296,6 +24923,8 @@ characters.data={ category="mc", description="ORIYA VOWEL SIGN AU", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xB47, 0xB57 }, unicodeslot=0xB4C, @@ -24305,6 +24934,9 @@ characters.data={ combining=0x9, description="ORIYA SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="b", linebreak="cm", unicodeslot=0xB4D, }, @@ -24312,6 +24944,8 @@ characters.data={ category="mn", description="ORIYA AI LENGTH MARK", direction="nsm", + indic="o", + indicorder="am", linebreak="cm", unicodeslot=0xB56, }, @@ -24319,6 +24953,8 @@ characters.data={ category="mc", description="ORIYA AU LENGTH MARK", direction="l", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xB57, }, @@ -24326,6 +24962,7 @@ characters.data={ category="lo", description="ORIYA LETTER RRA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xB21, 0xB3C }, unicodeslot=0xB5C, @@ -24334,6 +24971,7 @@ characters.data={ category="lo", description="ORIYA LETTER RHA", direction="l", + indic="c", linebreak="al", specials={ "char", 0xB22, 0xB3C }, unicodeslot=0xB5D, @@ -24342,6 +24980,7 @@ characters.data={ category="lo", description="ORIYA LETTER YYA", direction="l", + indic="o", linebreak="al", unicodeslot=0xB5F, }, @@ -24349,6 +24988,7 @@ characters.data={ category="lo", description="ORIYA LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0xB60, }, @@ -24356,6 +24996,7 @@ characters.data={ category="lo", description="ORIYA LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0xB61, }, @@ -24363,6 +25004,8 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN VOCALIC L", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xB62, }, @@ -24370,6 +25013,8 @@ characters.data={ category="mn", description="ORIYA VOWEL SIGN VOCALIC LL", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xB63, }, @@ -24377,6 +25022,7 @@ characters.data={ category="nd", description="ORIYA DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB66, }, @@ -24384,6 +25030,7 @@ characters.data={ category="nd", description="ORIYA DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB67, }, @@ -24391,6 +25038,7 @@ characters.data={ category="nd", description="ORIYA DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB68, }, @@ -24398,6 +25046,7 @@ characters.data={ category="nd", description="ORIYA DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB69, }, @@ -24405,6 +25054,7 @@ characters.data={ category="nd", description="ORIYA DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6A, }, @@ -24412,6 +25062,7 @@ characters.data={ category="nd", description="ORIYA DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6B, }, @@ -24419,6 +25070,7 @@ characters.data={ category="nd", description="ORIYA DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6C, }, @@ -24426,6 +25078,7 @@ characters.data={ category="nd", description="ORIYA DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6D, }, @@ -24433,6 +25086,7 @@ characters.data={ category="nd", description="ORIYA DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6E, }, @@ -24440,6 +25094,7 @@ characters.data={ category="nd", description="ORIYA DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xB6F, }, @@ -24447,6 +25102,7 @@ characters.data={ category="so", description="ORIYA ISSHAR", direction="l", + indic="o", linebreak="al", unicodeslot=0xB70, }, @@ -24454,6 +25110,7 @@ characters.data={ category="lo", description="ORIYA LETTER WA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB71, }, @@ -24461,6 +25118,7 @@ characters.data={ category="no", description="ORIYA FRACTION ONE QUARTER", direction="l", + indic="o", linebreak="al", unicodeslot=0xB72, }, @@ -24468,6 +25126,7 @@ characters.data={ category="no", description="ORIYA FRACTION ONE HALF", direction="l", + indic="o", linebreak="al", unicodeslot=0xB73, }, @@ -24475,6 +25134,7 @@ characters.data={ category="no", description="ORIYA FRACTION THREE QUARTERS", direction="l", + indic="o", linebreak="al", unicodeslot=0xB74, }, @@ -24482,6 +25142,7 @@ characters.data={ category="no", description="ORIYA FRACTION ONE SIXTEENTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xB75, }, @@ -24489,6 +25150,7 @@ characters.data={ category="no", description="ORIYA FRACTION ONE EIGHTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xB76, }, @@ -24496,6 +25158,7 @@ characters.data={ category="no", description="ORIYA FRACTION THREE SIXTEENTHS", direction="l", + indic="o", linebreak="al", unicodeslot=0xB77, }, @@ -24503,6 +25166,7 @@ characters.data={ category="mn", description="TAMIL SIGN ANUSVARA", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xB82, }, @@ -24510,6 +25174,7 @@ characters.data={ category="lo", description="TAMIL SIGN VISARGA", direction="l", + indic="o", linebreak="al", synonyms={ "tamil aytham" }, unicodeslot=0xB83, @@ -24518,6 +25183,7 @@ characters.data={ category="lo", description="TAMIL LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xB85, }, @@ -24525,6 +25191,7 @@ characters.data={ category="lo", description="TAMIL LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xB86, }, @@ -24532,6 +25199,7 @@ characters.data={ category="lo", description="TAMIL LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xB87, }, @@ -24539,6 +25207,7 @@ characters.data={ category="lo", description="TAMIL LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xB88, }, @@ -24546,6 +25215,7 @@ characters.data={ category="lo", description="TAMIL LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xB89, }, @@ -24553,6 +25223,7 @@ characters.data={ category="lo", description="TAMIL LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xB8A, }, @@ -24560,6 +25231,7 @@ characters.data={ category="lo", description="TAMIL LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xB8E, }, @@ -24567,6 +25239,7 @@ characters.data={ category="lo", description="TAMIL LETTER EE", direction="l", + indic="i", linebreak="al", unicodeslot=0xB8F, }, @@ -24574,6 +25247,7 @@ characters.data={ category="lo", description="TAMIL LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xB90, }, @@ -24581,6 +25255,7 @@ characters.data={ category="lo", description="TAMIL LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xB92, }, @@ -24588,6 +25263,7 @@ characters.data={ category="lo", description="TAMIL LETTER OO", direction="l", + indic="i", linebreak="al", unicodeslot=0xB93, }, @@ -24595,6 +25271,7 @@ characters.data={ category="lo", description="TAMIL LETTER AU", direction="l", + indic="i", linebreak="al", specials={ "char", 0xB92, 0xBD7 }, unicodeslot=0xB94, @@ -24603,6 +25280,7 @@ characters.data={ category="lo", description="TAMIL LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB95, }, @@ -24610,6 +25288,7 @@ characters.data={ category="lo", description="TAMIL LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB99, }, @@ -24617,6 +25296,7 @@ characters.data={ category="lo", description="TAMIL LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB9A, }, @@ -24624,6 +25304,7 @@ characters.data={ category="lo", description="TAMIL LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB9C, }, @@ -24631,6 +25312,7 @@ characters.data={ category="lo", description="TAMIL LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB9E, }, @@ -24638,6 +25320,7 @@ characters.data={ category="lo", description="TAMIL LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xB9F, }, @@ -24645,6 +25328,7 @@ characters.data={ category="lo", description="TAMIL LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBA3, }, @@ -24652,6 +25336,7 @@ characters.data={ category="lo", description="TAMIL LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBA4, }, @@ -24659,6 +25344,7 @@ characters.data={ category="lo", description="TAMIL LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBA8, }, @@ -24666,6 +25352,7 @@ characters.data={ category="lo", description="TAMIL LETTER NNNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBA9, }, @@ -24673,6 +25360,7 @@ characters.data={ category="lo", description="TAMIL LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBAA, }, @@ -24680,6 +25368,7 @@ characters.data={ category="lo", description="TAMIL LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBAE, }, @@ -24687,6 +25376,7 @@ characters.data={ category="lo", description="TAMIL LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBAF, }, @@ -24694,6 +25384,9 @@ characters.data={ category="lo", description="TAMIL LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="ap", linebreak="al", unicodeslot=0xBB0, }, @@ -24701,6 +25394,7 @@ characters.data={ category="lo", description="TAMIL LETTER RRA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB1, }, @@ -24708,6 +25402,7 @@ characters.data={ category="lo", description="TAMIL LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB2, }, @@ -24715,6 +25410,7 @@ characters.data={ category="lo", description="TAMIL LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB3, }, @@ -24722,6 +25418,7 @@ characters.data={ category="lo", description="TAMIL LETTER LLLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB4, }, @@ -24729,6 +25426,7 @@ characters.data={ category="lo", description="TAMIL LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB5, }, @@ -24736,6 +25434,7 @@ characters.data={ category="lo", description="TAMIL LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB6, }, @@ -24743,6 +25442,7 @@ characters.data={ category="lo", description="TAMIL LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB7, }, @@ -24750,6 +25450,7 @@ characters.data={ category="lo", description="TAMIL LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB8, }, @@ -24757,6 +25458,7 @@ characters.data={ category="lo", description="TAMIL LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xBB9, }, @@ -24764,6 +25466,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xBBE, }, @@ -24771,6 +25476,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN I", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xBBF, }, @@ -24778,6 +25486,9 @@ characters.data={ category="mn", description="TAMIL VOWEL SIGN II", direction="nsm", + indic="d", + indicmark="t", + indicorder="as", linebreak="cm", unicodeslot=0xBC0, }, @@ -24785,6 +25496,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN U", direction="l", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xBC1, }, @@ -24792,6 +25506,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN UU", direction="l", + indic="d", + indicmark="b", + indicorder="ap", linebreak="cm", unicodeslot=0xBC2, }, @@ -24799,6 +25516,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN E", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xBC6, }, @@ -24806,6 +25526,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN EE", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xBC7, }, @@ -24813,6 +25536,9 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN AI", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xBC8, }, @@ -24820,6 +25546,8 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN O", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xBC6, 0xBBE }, unicodeslot=0xBCA, @@ -24828,6 +25556,8 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN OO", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xBC7, 0xBBE }, unicodeslot=0xBCB, @@ -24836,6 +25566,8 @@ characters.data={ category="mc", description="TAMIL VOWEL SIGN AU", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xBC6, 0xBD7 }, unicodeslot=0xBCC, @@ -24845,6 +25577,9 @@ characters.data={ combining=0x9, description="TAMIL SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="t", linebreak="cm", unicodeslot=0xBCD, }, @@ -24852,6 +25587,7 @@ characters.data={ category="lo", description="TAMIL OM", direction="l", + indic="o", linebreak="al", unicodeslot=0xBD0, }, @@ -24859,6 +25595,8 @@ characters.data={ category="mc", description="TAMIL AU LENGTH MARK", direction="l", + indic="o", + indicorder="ap", linebreak="cm", unicodeslot=0xBD7, }, @@ -24866,6 +25604,7 @@ characters.data={ category="nd", description="TAMIL DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBE6, }, @@ -24873,6 +25612,7 @@ characters.data={ category="nd", description="TAMIL DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBE7, }, @@ -24880,6 +25620,7 @@ characters.data={ category="nd", description="TAMIL DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBE8, }, @@ -24887,6 +25628,7 @@ characters.data={ category="nd", description="TAMIL DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBE9, }, @@ -24894,6 +25636,7 @@ characters.data={ category="nd", description="TAMIL DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBEA, }, @@ -24901,6 +25644,7 @@ characters.data={ category="nd", description="TAMIL DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBEB, }, @@ -24908,6 +25652,7 @@ characters.data={ category="nd", description="TAMIL DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBEC, }, @@ -24915,6 +25660,7 @@ characters.data={ category="nd", description="TAMIL DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBED, }, @@ -24922,6 +25668,7 @@ characters.data={ category="nd", description="TAMIL DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBEE, }, @@ -24929,6 +25676,7 @@ characters.data={ category="nd", description="TAMIL DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xBEF, }, @@ -24936,6 +25684,7 @@ characters.data={ category="no", description="TAMIL NUMBER TEN", direction="l", + indic="o", linebreak="al", unicodeslot=0xBF0, }, @@ -24943,6 +25692,7 @@ characters.data={ category="no", description="TAMIL NUMBER ONE HUNDRED", direction="l", + indic="o", linebreak="al", unicodeslot=0xBF1, }, @@ -24950,6 +25700,7 @@ characters.data={ category="no", description="TAMIL NUMBER ONE THOUSAND", direction="l", + indic="o", linebreak="al", unicodeslot=0xBF2, }, @@ -24957,6 +25708,7 @@ characters.data={ category="so", description="TAMIL DAY SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil naal" }, unicodeslot=0xBF3, @@ -24965,6 +25717,7 @@ characters.data={ category="so", description="TAMIL MONTH SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil maatham" }, unicodeslot=0xBF4, @@ -24973,6 +25726,7 @@ characters.data={ category="so", description="TAMIL YEAR SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil varudam" }, unicodeslot=0xBF5, @@ -24981,6 +25735,7 @@ characters.data={ category="so", description="TAMIL DEBIT SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil patru" }, unicodeslot=0xBF6, @@ -24989,6 +25744,7 @@ characters.data={ category="so", description="TAMIL CREDIT SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil varavu" }, unicodeslot=0xBF7, @@ -24997,6 +25753,7 @@ characters.data={ category="so", description="TAMIL AS ABOVE SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil merpadi" }, unicodeslot=0xBF8, @@ -25005,6 +25762,7 @@ characters.data={ category="sc", description="TAMIL RUPEE SIGN", direction="et", + indic="o", linebreak="pr", synonyms={ "tamil rupai" }, unicodeslot=0xBF9, @@ -25013,6 +25771,7 @@ characters.data={ category="so", description="TAMIL NUMBER SIGN", direction="on", + indic="o", linebreak="al", synonyms={ "tamil enn" }, unicodeslot=0xBFA, @@ -25021,6 +25780,7 @@ characters.data={ category="mn", description="TELUGU SIGN COMBINING CANDRABINDU ABOVE", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xC00, }, @@ -25028,6 +25788,7 @@ characters.data={ category="mc", description="TELUGU SIGN CANDRABINDU", direction="l", + indic="o", linebreak="cm", unicodeslot=0xC01, }, @@ -25035,6 +25796,7 @@ characters.data={ category="mc", description="TELUGU SIGN ANUSVARA", direction="l", + indic="o", linebreak="cm", synonyms={ "telugu sunna" }, unicodeslot=0xC02, @@ -25043,6 +25805,7 @@ characters.data={ category="mc", description="TELUGU SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xC03, }, @@ -25050,6 +25813,7 @@ characters.data={ category="lo", description="TELUGU LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xC05, }, @@ -25057,6 +25821,7 @@ characters.data={ category="lo", description="TELUGU LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xC06, }, @@ -25064,6 +25829,7 @@ characters.data={ category="lo", description="TELUGU LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xC07, }, @@ -25071,6 +25837,7 @@ characters.data={ category="lo", description="TELUGU LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xC08, }, @@ -25078,6 +25845,7 @@ characters.data={ category="lo", description="TELUGU LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xC09, }, @@ -25085,6 +25853,7 @@ characters.data={ category="lo", description="TELUGU LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xC0A, }, @@ -25092,6 +25861,7 @@ characters.data={ category="lo", description="TELUGU LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0xC0B, }, @@ -25099,6 +25869,7 @@ characters.data={ category="lo", description="TELUGU LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0xC0C, }, @@ -25106,6 +25877,7 @@ characters.data={ category="lo", description="TELUGU LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xC0E, }, @@ -25113,6 +25885,7 @@ characters.data={ category="lo", description="TELUGU LETTER EE", direction="l", + indic="i", linebreak="al", unicodeslot=0xC0F, }, @@ -25120,6 +25893,7 @@ characters.data={ category="lo", description="TELUGU LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xC10, }, @@ -25127,6 +25901,7 @@ characters.data={ category="lo", description="TELUGU LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xC12, }, @@ -25134,6 +25909,7 @@ characters.data={ category="lo", description="TELUGU LETTER OO", direction="l", + indic="i", linebreak="al", unicodeslot=0xC13, }, @@ -25141,6 +25917,7 @@ characters.data={ category="lo", description="TELUGU LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xC14, }, @@ -25148,6 +25925,7 @@ characters.data={ category="lo", description="TELUGU LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC15, }, @@ -25155,6 +25933,7 @@ characters.data={ category="lo", description="TELUGU LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC16, }, @@ -25162,6 +25941,7 @@ characters.data={ category="lo", description="TELUGU LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC17, }, @@ -25169,6 +25949,7 @@ characters.data={ category="lo", description="TELUGU LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC18, }, @@ -25176,6 +25957,7 @@ characters.data={ category="lo", description="TELUGU LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC19, }, @@ -25183,6 +25965,7 @@ characters.data={ category="lo", description="TELUGU LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1A, }, @@ -25190,6 +25973,7 @@ characters.data={ category="lo", description="TELUGU LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1B, }, @@ -25197,6 +25981,7 @@ characters.data={ category="lo", description="TELUGU LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1C, }, @@ -25204,6 +25989,7 @@ characters.data={ category="lo", description="TELUGU LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1D, }, @@ -25211,6 +25997,7 @@ characters.data={ category="lo", description="TELUGU LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1E, }, @@ -25218,6 +26005,7 @@ characters.data={ category="lo", description="TELUGU LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC1F, }, @@ -25225,6 +26013,7 @@ characters.data={ category="lo", description="TELUGU LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC20, }, @@ -25232,6 +26021,7 @@ characters.data={ category="lo", description="TELUGU LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC21, }, @@ -25239,6 +26029,7 @@ characters.data={ category="lo", description="TELUGU LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC22, }, @@ -25246,6 +26037,7 @@ characters.data={ category="lo", description="TELUGU LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC23, }, @@ -25253,6 +26045,7 @@ characters.data={ category="lo", description="TELUGU LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC24, }, @@ -25260,6 +26053,7 @@ characters.data={ category="lo", description="TELUGU LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC25, }, @@ -25267,6 +26061,7 @@ characters.data={ category="lo", description="TELUGU LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC26, }, @@ -25274,6 +26069,7 @@ characters.data={ category="lo", description="TELUGU LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC27, }, @@ -25281,6 +26077,7 @@ characters.data={ category="lo", description="TELUGU LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC28, }, @@ -25288,6 +26085,7 @@ characters.data={ category="lo", description="TELUGU LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2A, }, @@ -25295,6 +26093,7 @@ characters.data={ category="lo", description="TELUGU LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2B, }, @@ -25302,6 +26101,7 @@ characters.data={ category="lo", description="TELUGU LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2C, }, @@ -25309,6 +26109,7 @@ characters.data={ category="lo", description="TELUGU LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2D, }, @@ -25316,6 +26117,7 @@ characters.data={ category="lo", description="TELUGU LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2E, }, @@ -25323,6 +26125,7 @@ characters.data={ category="lo", description="TELUGU LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC2F, }, @@ -25330,6 +26133,9 @@ characters.data={ category="lo", description="TELUGU LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="ap", linebreak="al", unicodeslot=0xC30, }, @@ -25337,6 +26143,7 @@ characters.data={ category="lo", description="TELUGU LETTER RRA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC31, }, @@ -25344,6 +26151,7 @@ characters.data={ category="lo", description="TELUGU LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC32, }, @@ -25351,6 +26159,7 @@ characters.data={ category="lo", description="TELUGU LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC33, }, @@ -25358,6 +26167,7 @@ characters.data={ category="lo", description="TELUGU LETTER LLLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC34, }, @@ -25367,11 +26177,13 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0xC35, + indic="c", }, [0xC36]={ category="lo", description="TELUGU LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC36, }, @@ -25379,6 +26191,7 @@ characters.data={ category="lo", description="TELUGU LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC37, }, @@ -25386,6 +26199,7 @@ characters.data={ category="lo", description="TELUGU LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC38, }, @@ -25393,6 +26207,7 @@ characters.data={ category="lo", description="TELUGU LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC39, }, @@ -25400,6 +26215,7 @@ characters.data={ category="lo", description="TELUGU SIGN AVAGRAHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC3D, }, @@ -25407,6 +26223,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN AA", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC3E, }, @@ -25414,6 +26233,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN I", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC3F, }, @@ -25421,6 +26243,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN II", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC40, }, @@ -25428,6 +26253,9 @@ characters.data={ category="mc", description="TELUGU VOWEL SIGN U", direction="l", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xC41, }, @@ -25435,6 +26263,9 @@ characters.data={ category="mc", description="TELUGU VOWEL SIGN UU", direction="l", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xC42, }, @@ -25442,6 +26273,9 @@ characters.data={ category="mc", description="TELUGU VOWEL SIGN VOCALIC R", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0xC43, }, @@ -25449,6 +26283,9 @@ characters.data={ category="mc", description="TELUGU VOWEL SIGN VOCALIC RR", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0xC44, }, @@ -25456,6 +26293,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN E", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC46, }, @@ -25463,6 +26303,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN EE", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC47, }, @@ -25470,6 +26313,8 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN AI", direction="nsm", + indic="d", + indicmark="t", linebreak="cm", specials={ "char", 0xC46, 0xC56 }, unicodeslot=0xC48, @@ -25478,6 +26323,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN O", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC4A, }, @@ -25485,6 +26333,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN OO", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC4B, }, @@ -25492,6 +26343,9 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN AU", direction="nsm", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xC4C, }, @@ -25500,6 +26354,9 @@ characters.data={ combining=0x9, description="TELUGU SIGN VIRAMA", direction="nsm", + indic="o", + indicclass="halant", + indicmark="t", linebreak="cm", unicodeslot=0xC4D, }, @@ -25508,6 +26365,8 @@ characters.data={ combining=0x54, description="TELUGU LENGTH MARK", direction="nsm", + indic="o", + indicorder="bs", linebreak="cm", unicodeslot=0xC55, }, @@ -25516,6 +26375,8 @@ characters.data={ combining=0x5B, description="TELUGU AI LENGTH MARK", direction="nsm", + indic="o", + indicorder="bs", linebreak="cm", unicodeslot=0xC56, }, @@ -25523,6 +26384,7 @@ characters.data={ category="lo", description="TELUGU LETTER TSA", direction="l", + indic="o", linebreak="al", unicodeslot=0xC58, }, @@ -25530,6 +26392,7 @@ characters.data={ category="lo", description="TELUGU LETTER DZA", direction="l", + indic="o", linebreak="al", unicodeslot=0xC59, }, @@ -25537,6 +26400,7 @@ characters.data={ category="lo", description="TELUGU LETTER RRRA", direction="l", + indic="o", linebreak="al", unicodeslot=0xC5A, }, @@ -25544,6 +26408,7 @@ characters.data={ category="lo", description="TELUGU LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0xC60, }, @@ -25551,6 +26416,7 @@ characters.data={ category="lo", description="TELUGU LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0xC61, }, @@ -25558,6 +26424,8 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN VOCALIC L", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xC62, }, @@ -25565,6 +26433,8 @@ characters.data={ category="mn", description="TELUGU VOWEL SIGN VOCALIC LL", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xC63, }, @@ -25572,6 +26442,7 @@ characters.data={ category="nd", description="TELUGU DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC66, }, @@ -25579,6 +26450,7 @@ characters.data={ category="nd", description="TELUGU DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC67, }, @@ -25586,6 +26458,7 @@ characters.data={ category="nd", description="TELUGU DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC68, }, @@ -25593,6 +26466,7 @@ characters.data={ category="nd", description="TELUGU DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC69, }, @@ -25600,6 +26474,7 @@ characters.data={ category="nd", description="TELUGU DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6A, }, @@ -25607,6 +26482,7 @@ characters.data={ category="nd", description="TELUGU DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6B, }, @@ -25614,6 +26490,7 @@ characters.data={ category="nd", description="TELUGU DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6C, }, @@ -25621,6 +26498,7 @@ characters.data={ category="nd", description="TELUGU DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6D, }, @@ -25628,6 +26506,7 @@ characters.data={ category="nd", description="TELUGU DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6E, }, @@ -25635,6 +26514,7 @@ characters.data={ category="nd", description="TELUGU DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xC6F, }, @@ -25642,6 +26522,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC78, }, @@ -25649,6 +26530,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC79, }, @@ -25656,6 +26538,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC7A, }, @@ -25663,6 +26546,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC7B, }, @@ -25670,6 +26554,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC7C, }, @@ -25677,6 +26562,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC7D, }, @@ -25684,6 +26570,7 @@ characters.data={ category="no", description="TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR", direction="on", + indic="o", linebreak="al", unicodeslot=0xC7E, }, @@ -25691,6 +26578,7 @@ characters.data={ category="so", description="TELUGU SIGN TUUMU", direction="l", + indic="o", linebreak="al", unicodeslot=0xC7F, }, @@ -25698,6 +26586,7 @@ characters.data={ category="lo", description="KANNADA SIGN SPACING CANDRABINDU", direction="l", + indic="o", linebreak="al", unicodeslot=0xC80, }, @@ -25705,6 +26594,7 @@ characters.data={ category="mn", description="KANNADA SIGN CANDRABINDU", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xC81, }, @@ -25712,6 +26602,7 @@ characters.data={ category="mc", description="KANNADA SIGN ANUSVARA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xC82, }, @@ -25719,6 +26610,7 @@ characters.data={ category="mc", description="KANNADA SIGN VISARGA", direction="l", + indic="o", linebreak="cm", unicodeslot=0xC83, }, @@ -25726,6 +26618,7 @@ characters.data={ category="lo", description="KANNADA LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xC85, }, @@ -25733,6 +26626,7 @@ characters.data={ category="lo", description="KANNADA LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xC86, }, @@ -25740,6 +26634,7 @@ characters.data={ category="lo", description="KANNADA LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xC87, }, @@ -25747,6 +26642,7 @@ characters.data={ category="lo", description="KANNADA LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xC88, }, @@ -25754,6 +26650,7 @@ characters.data={ category="lo", description="KANNADA LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xC89, }, @@ -25761,6 +26658,7 @@ characters.data={ category="lo", description="KANNADA LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xC8A, }, @@ -25768,6 +26666,7 @@ characters.data={ category="lo", description="KANNADA LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0xC8B, }, @@ -25775,6 +26674,7 @@ characters.data={ category="lo", description="KANNADA LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0xC8C, }, @@ -25782,6 +26682,7 @@ characters.data={ category="lo", description="KANNADA LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xC8E, }, @@ -25789,6 +26690,7 @@ characters.data={ category="lo", description="KANNADA LETTER EE", direction="l", + indic="i", linebreak="al", unicodeslot=0xC8F, }, @@ -25796,6 +26698,7 @@ characters.data={ category="lo", description="KANNADA LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xC90, }, @@ -25803,6 +26706,7 @@ characters.data={ category="lo", description="KANNADA LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xC92, }, @@ -25810,6 +26714,7 @@ characters.data={ category="lo", description="KANNADA LETTER OO", direction="l", + indic="i", linebreak="al", unicodeslot=0xC93, }, @@ -25817,6 +26722,7 @@ characters.data={ category="lo", description="KANNADA LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xC94, }, @@ -25824,6 +26730,7 @@ characters.data={ category="lo", description="KANNADA LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC95, }, @@ -25831,6 +26738,7 @@ characters.data={ category="lo", description="KANNADA LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC96, }, @@ -25838,6 +26746,7 @@ characters.data={ category="lo", description="KANNADA LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC97, }, @@ -25845,6 +26754,7 @@ characters.data={ category="lo", description="KANNADA LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC98, }, @@ -25852,6 +26762,7 @@ characters.data={ category="lo", description="KANNADA LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC99, }, @@ -25859,6 +26770,7 @@ characters.data={ category="lo", description="KANNADA LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9A, }, @@ -25866,6 +26778,7 @@ characters.data={ category="lo", description="KANNADA LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9B, }, @@ -25873,6 +26786,7 @@ characters.data={ category="lo", description="KANNADA LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9C, }, @@ -25880,6 +26794,7 @@ characters.data={ category="lo", description="KANNADA LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9D, }, @@ -25887,6 +26802,7 @@ characters.data={ category="lo", description="KANNADA LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9E, }, @@ -25894,6 +26810,7 @@ characters.data={ category="lo", description="KANNADA LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC9F, }, @@ -25901,6 +26818,7 @@ characters.data={ category="lo", description="KANNADA LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA0, }, @@ -25908,6 +26826,7 @@ characters.data={ category="lo", description="KANNADA LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA1, }, @@ -25915,6 +26834,7 @@ characters.data={ category="lo", description="KANNADA LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA2, }, @@ -25922,6 +26842,7 @@ characters.data={ category="lo", description="KANNADA LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA3, }, @@ -25929,6 +26850,7 @@ characters.data={ category="lo", description="KANNADA LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA4, }, @@ -25936,6 +26858,7 @@ characters.data={ category="lo", description="KANNADA LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA5, }, @@ -25943,6 +26866,7 @@ characters.data={ category="lo", description="KANNADA LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA6, }, @@ -25950,6 +26874,7 @@ characters.data={ category="lo", description="KANNADA LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA7, }, @@ -25957,6 +26882,7 @@ characters.data={ category="lo", description="KANNADA LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCA8, }, @@ -25964,6 +26890,7 @@ characters.data={ category="lo", description="KANNADA LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAA, }, @@ -25971,6 +26898,7 @@ characters.data={ category="lo", description="KANNADA LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAB, }, @@ -25978,6 +26906,7 @@ characters.data={ category="lo", description="KANNADA LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAC, }, @@ -25985,6 +26914,7 @@ characters.data={ category="lo", description="KANNADA LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAD, }, @@ -25992,6 +26922,7 @@ characters.data={ category="lo", description="KANNADA LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAE, }, @@ -25999,6 +26930,7 @@ characters.data={ category="lo", description="KANNADA LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCAF, }, @@ -26006,6 +26938,9 @@ characters.data={ category="lo", description="KANNADA LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="ap", linebreak="al", unicodeslot=0xCB0, }, @@ -26013,6 +26948,7 @@ characters.data={ category="lo", description="KANNADA LETTER RRA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB1, }, @@ -26020,6 +26956,7 @@ characters.data={ category="lo", description="KANNADA LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB2, }, @@ -26027,6 +26964,7 @@ characters.data={ category="lo", description="KANNADA LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB3, }, @@ -26034,6 +26972,7 @@ characters.data={ category="lo", description="KANNADA LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB5, }, @@ -26041,6 +26980,7 @@ characters.data={ category="lo", description="KANNADA LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB6, }, @@ -26048,6 +26988,7 @@ characters.data={ category="lo", description="KANNADA LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB7, }, @@ -26055,6 +26996,7 @@ characters.data={ category="lo", description="KANNADA LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB8, }, @@ -26062,6 +27004,7 @@ characters.data={ category="lo", description="KANNADA LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCB9, }, @@ -26070,6 +27013,9 @@ characters.data={ combining=0x7, description="KANNADA SIGN NUKTA", direction="nsm", + indic="o", + indicmark="b", + indicclass="nukta", linebreak="cm", unicodeslot=0xCBC, }, @@ -26077,6 +27023,7 @@ characters.data={ category="lo", description="KANNADA SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0xCBD, }, @@ -26084,6 +27031,9 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xCBE, }, @@ -26091,6 +27041,9 @@ characters.data={ category="mn", description="KANNADA VOWEL SIGN I", direction="l", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xCBF, }, @@ -26098,6 +27051,8 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", linebreak="cm", specials={ "char", 0xCBF, 0xCD5 }, unicodeslot=0xCC0, @@ -26106,6 +27061,9 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN U", direction="l", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xCC1, }, @@ -26113,6 +27071,9 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN UU", direction="l", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xCC2, }, @@ -26120,6 +27081,9 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN VOCALIC R", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0xCC3, }, @@ -26127,6 +27091,9 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN VOCALIC RR", direction="l", + indic="d", + indicmark="r", + indicorder="as", linebreak="cm", unicodeslot=0xCC4, }, @@ -26134,6 +27101,9 @@ characters.data={ category="mn", description="KANNADA VOWEL SIGN E", direction="l", + indic="d", + indicmark="t", + indicorder="bs", linebreak="cm", unicodeslot=0xCC6, }, @@ -26141,6 +27111,8 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN EE", direction="l", + indic="d", + indicmark="r", linebreak="cm", specials={ "char", 0xCC6, 0xCD5 }, unicodeslot=0xCC7, @@ -26149,6 +27121,8 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN AI", direction="l", + indic="d", + indicmark="r", linebreak="cm", specials={ "char", 0xCC6, 0xCD6 }, unicodeslot=0xCC8, @@ -26157,6 +27131,8 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN O", direction="l", + indic="d", + indicmark="r", linebreak="cm", specials={ "char", 0xCC6, 0xCC2 }, unicodeslot=0xCCA, @@ -26165,6 +27141,8 @@ characters.data={ category="mc", description="KANNADA VOWEL SIGN OO", direction="l", + indic="d", + indicmark="r", linebreak="cm", specials={ "char", 0xCCA, 0xCD5 }, unicodeslot=0xCCB, @@ -26173,6 +27151,9 @@ characters.data={ category="mn", description="KANNADA VOWEL SIGN AU", direction="nsm", + indic="d", + indicmark="r", + indicorder="bs", linebreak="cm", unicodeslot=0xCCC, }, @@ -26181,6 +27162,8 @@ characters.data={ combining=0x9, description="KANNADA SIGN VIRAMA", direction="nsm", + indic="s", + indicclass="halant", linebreak="cm", unicodeslot=0xCCD, }, @@ -26188,6 +27171,8 @@ characters.data={ category="mc", description="KANNADA LENGTH MARK", direction="l", + indic="o", + indicorder="as", linebreak="cm", unicodeslot=0xCD5, }, @@ -26195,6 +27180,8 @@ characters.data={ category="mc", description="KANNADA AI LENGTH MARK", direction="l", + indic="o", + indicorder="as", linebreak="cm", unicodeslot=0xCD6, }, @@ -26202,6 +27189,7 @@ characters.data={ category="lo", description="KANNADA LETTER FA", direction="l", + indic="c", linebreak="al", unicodeslot=0xCDE, }, @@ -26209,6 +27197,7 @@ characters.data={ category="lo", description="KANNADA LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0xCE0, }, @@ -26216,6 +27205,7 @@ characters.data={ category="lo", description="KANNADA LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0xCE1, }, @@ -26223,6 +27213,9 @@ characters.data={ category="mn", description="KANNADA VOWEL SIGN VOCALIC L", direction="nsm", + indic="d", + indicmark="b", + indicorder="bs", linebreak="cm", unicodeslot=0xCE2, }, @@ -26230,6 +27223,9 @@ characters.data={ category="mn", description="KANNADA VOWEL SIGN VOCALIC LL", direction="nsm", + indic="d", + indicmark="b", + indicorder="bs", linebreak="cm", unicodeslot=0xCE3, }, @@ -26237,6 +27233,7 @@ characters.data={ category="nd", description="KANNADA DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCE6, }, @@ -26244,6 +27241,7 @@ characters.data={ category="nd", description="KANNADA DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCE7, }, @@ -26251,6 +27249,7 @@ characters.data={ category="nd", description="KANNADA DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCE8, }, @@ -26258,6 +27257,7 @@ characters.data={ category="nd", description="KANNADA DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCE9, }, @@ -26265,6 +27265,7 @@ characters.data={ category="nd", description="KANNADA DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCEA, }, @@ -26272,6 +27273,7 @@ characters.data={ category="nd", description="KANNADA DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCEB, }, @@ -26279,6 +27281,7 @@ characters.data={ category="nd", description="KANNADA DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCEC, }, @@ -26286,6 +27289,7 @@ characters.data={ category="nd", description="KANNADA DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCED, }, @@ -26293,6 +27297,7 @@ characters.data={ category="nd", description="KANNADA DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCEE, }, @@ -26300,6 +27305,7 @@ characters.data={ category="nd", description="KANNADA DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xCEF, }, @@ -26307,6 +27313,7 @@ characters.data={ category="so", description="KANNADA SIGN JIHVAMULIYA", direction="l", + indic="o", linebreak="al", unicodeslot=0xCF1, }, @@ -26314,6 +27321,7 @@ characters.data={ category="so", description="KANNADA SIGN UPADHMANIYA", direction="l", + indic="o", linebreak="al", unicodeslot=0xCF2, }, @@ -26321,6 +27329,7 @@ characters.data={ category="mn", description="MALAYALAM SIGN COMBINING ANUSVARA ABOVE", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xD00, }, @@ -26328,6 +27337,7 @@ characters.data={ category="mn", description="MALAYALAM SIGN CANDRABINDU", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xD01, }, @@ -26335,6 +27345,7 @@ characters.data={ category="mc", description="MALAYALAM SIGN ANUSVARA", direction="l", + indic="m", linebreak="cm", unicodeslot=0xD02, }, @@ -26342,6 +27353,7 @@ characters.data={ category="mc", description="MALAYALAM SIGN VISARGA", direction="l", + indic="m", linebreak="cm", unicodeslot=0xD03, }, @@ -26349,6 +27361,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER A", direction="l", + indic="i", linebreak="al", unicodeslot=0xD05, }, @@ -26356,6 +27369,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER AA", direction="l", + indic="i", linebreak="al", unicodeslot=0xD06, }, @@ -26363,6 +27377,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER I", direction="l", + indic="i", linebreak="al", unicodeslot=0xD07, }, @@ -26370,6 +27385,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER II", direction="l", + indic="i", linebreak="al", unicodeslot=0xD08, }, @@ -26377,6 +27393,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER U", direction="l", + indic="i", linebreak="al", unicodeslot=0xD09, }, @@ -26384,6 +27401,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER UU", direction="l", + indic="i", linebreak="al", unicodeslot=0xD0A, }, @@ -26391,6 +27409,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER VOCALIC R", direction="l", + indic="i", linebreak="al", unicodeslot=0xD0B, }, @@ -26398,6 +27417,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER VOCALIC L", direction="l", + indic="i", linebreak="al", unicodeslot=0xD0C, }, @@ -26405,6 +27425,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER E", direction="l", + indic="i", linebreak="al", unicodeslot=0xD0E, }, @@ -26412,6 +27433,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER EE", direction="l", + indic="i", linebreak="al", unicodeslot=0xD0F, }, @@ -26419,6 +27441,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER AI", direction="l", + indic="i", linebreak="al", unicodeslot=0xD10, }, @@ -26426,6 +27449,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER O", direction="l", + indic="i", linebreak="al", unicodeslot=0xD12, }, @@ -26433,6 +27457,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER OO", direction="l", + indic="i", linebreak="al", unicodeslot=0xD13, }, @@ -26440,6 +27465,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER AU", direction="l", + indic="i", linebreak="al", unicodeslot=0xD14, }, @@ -26447,6 +27473,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER KA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD15, }, @@ -26454,6 +27481,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER KHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD16, }, @@ -26461,6 +27489,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER GA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD17, }, @@ -26468,6 +27497,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER GHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD18, }, @@ -26475,6 +27505,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER NGA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD19, }, @@ -26482,6 +27513,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1A, }, @@ -26489,6 +27521,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1B, }, @@ -26496,6 +27529,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER JA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1C, }, @@ -26503,6 +27537,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER JHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1D, }, @@ -26510,6 +27545,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER NYA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1E, }, @@ -26517,6 +27553,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER TTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD1F, }, @@ -26524,6 +27561,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER TTHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD20, }, @@ -26531,6 +27569,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER DDA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD21, }, @@ -26538,6 +27577,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER DDHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD22, }, @@ -26545,6 +27585,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER NNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD23, }, @@ -26552,6 +27593,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER TA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD24, }, @@ -26559,6 +27601,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER THA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD25, }, @@ -26566,6 +27609,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER DA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD26, }, @@ -26573,6 +27617,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER DHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD27, }, @@ -26580,6 +27625,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER NA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD28, }, @@ -26587,6 +27633,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER NNNA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD29, }, @@ -26594,6 +27641,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER PA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2A, }, @@ -26601,6 +27649,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER PHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2B, }, @@ -26608,6 +27657,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER BA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2C, }, @@ -26615,6 +27665,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER BHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2D, }, @@ -26622,6 +27673,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER MA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2E, }, @@ -26629,6 +27681,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER YA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD2F, }, @@ -26636,6 +27689,9 @@ characters.data={ category="lo", description="MALAYALAM LETTER RA", direction="l", + indic="c", + indicclass="ra", + indicorder="am", linebreak="al", unicodeslot=0xD30, }, @@ -26643,6 +27699,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER RRA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD31, }, @@ -26650,6 +27707,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER LA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD32, }, @@ -26657,6 +27715,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER LLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD33, }, @@ -26664,6 +27723,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER LLLA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD34, }, @@ -26671,6 +27731,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD35, }, @@ -26678,6 +27739,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER SHA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD36, }, @@ -26685,6 +27747,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER SSA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD37, }, @@ -26692,6 +27755,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER SA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD38, }, @@ -26699,6 +27763,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER HA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD39, }, @@ -26706,6 +27771,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER TTTA", direction="l", + indic="c", linebreak="al", unicodeslot=0xD3A, }, @@ -26714,6 +27780,7 @@ characters.data={ combining=0x9, description="MALAYALAM SIGN VERTICAL BAR VIRAMA", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xD3B, }, @@ -26722,6 +27789,7 @@ characters.data={ combining=0x9, description="MALAYALAM SIGN CIRCULAR VIRAMA", direction="nsm", + indic="o", linebreak="cm", unicodeslot=0xD3C, }, @@ -26729,6 +27797,7 @@ characters.data={ category="lo", description="MALAYALAM SIGN AVAGRAHA", direction="l", + indic="o", linebreak="al", unicodeslot=0xD3D, }, @@ -26736,6 +27805,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN AA", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD3E, }, @@ -26743,6 +27815,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN I", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD3F, }, @@ -26750,6 +27825,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN II", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD40, }, @@ -26757,6 +27835,9 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN U", direction="nsm", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD41, }, @@ -26764,6 +27845,9 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN UU", direction="nsm", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD42, }, @@ -26771,6 +27855,9 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC R", direction="nsm", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD43, }, @@ -26778,6 +27865,8 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC RR", direction="nsm", + indic="d", + indicmark="r", linebreak="cm", unicodeslot=0xD44, }, @@ -26785,6 +27874,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN E", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xD46, }, @@ -26792,6 +27884,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN EE", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xD47, }, @@ -26799,6 +27894,9 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN AI", direction="l", + indic="d", + indicmark="l", + indicorder="bm", linebreak="cm", unicodeslot=0xD48, }, @@ -26806,6 +27904,8 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN O", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xD46, 0xD3E }, unicodeslot=0xD4A, @@ -26814,6 +27914,8 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN OO", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xD47, 0xD3E }, unicodeslot=0xD4B, @@ -26822,6 +27924,8 @@ characters.data={ category="mc", description="MALAYALAM VOWEL SIGN AU", direction="l", + indic="d", + indicmark="s", linebreak="cm", specials={ "char", 0xD46, 0xD57 }, unicodeslot=0xD4C, @@ -26831,6 +27935,8 @@ characters.data={ combining=0x9, description="MALAYALAM SIGN VIRAMA", direction="nsm", + indic="s", + indicclass="halant", linebreak="cm", synonyms={ "malayalam chandrakkala", "malayalam vowel half-u" }, unicodeslot=0xD4D, @@ -26839,6 +27945,8 @@ characters.data={ category="lo", description="MALAYALAM LETTER DOT REPH", direction="l", + indic="o", + indicmark="t", linebreak="al", unicodeslot=0xD4E, }, @@ -26846,6 +27954,7 @@ characters.data={ category="so", description="MALAYALAM SIGN PARA", direction="l", + indic="o", linebreak="al", unicodeslot=0xD4F, }, @@ -26853,6 +27962,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU M", direction="l", + indic="o", linebreak="al", unicodeslot=0xD54, }, @@ -26860,6 +27970,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU Y", direction="l", + indic="o", linebreak="al", unicodeslot=0xD55, }, @@ -26867,6 +27978,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU LLL", direction="l", + indic="o", linebreak="al", unicodeslot=0xD56, }, @@ -26874,6 +27986,9 @@ characters.data={ category="mc", description="MALAYALAM AU LENGTH MARK", direction="l", + indic="d", + indicmark="r", + indicorder="ap", linebreak="cm", unicodeslot=0xD57, }, @@ -26881,6 +27996,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD58, }, @@ -26888,6 +28004,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE FORTIETH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD59, }, @@ -26895,6 +28012,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION THREE EIGHTIETHS", direction="l", + indic="o", linebreak="al", unicodeslot=0xD5A, }, @@ -26902,6 +28020,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE TWENTIETH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD5B, }, @@ -26909,6 +28028,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE TENTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD5C, }, @@ -26916,6 +28036,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION THREE TWENTIETHS", direction="l", + indic="o", linebreak="al", unicodeslot=0xD5D, }, @@ -26923,6 +28044,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE FIFTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD5E, }, @@ -26930,6 +28052,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER ARCHAIC II", direction="l", + indic="i", linebreak="al", unicodeslot=0xD5F, }, @@ -26937,6 +28060,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER VOCALIC RR", direction="l", + indic="i", linebreak="al", unicodeslot=0xD60, }, @@ -26944,6 +28068,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER VOCALIC LL", direction="l", + indic="i", linebreak="al", unicodeslot=0xD61, }, @@ -26951,6 +28076,8 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC L", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xD62, }, @@ -26958,6 +28085,8 @@ characters.data={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC LL", direction="nsm", + indic="d", + indicmark="b", linebreak="cm", unicodeslot=0xD63, }, @@ -26965,6 +28094,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT ZERO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD66, }, @@ -26972,6 +28102,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT ONE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD67, }, @@ -26979,6 +28110,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT TWO", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD68, }, @@ -26986,6 +28118,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT THREE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD69, }, @@ -26993,6 +28126,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT FOUR", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6A, }, @@ -27000,6 +28134,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT FIVE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6B, }, @@ -27007,6 +28142,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT SIX", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6C, }, @@ -27014,6 +28150,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT SEVEN", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6D, }, @@ -27021,6 +28158,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT EIGHT", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6E, }, @@ -27028,6 +28166,7 @@ characters.data={ category="nd", description="MALAYALAM DIGIT NINE", direction="l", + indic="o", linebreak="nu", unicodeslot=0xD6F, }, @@ -27035,6 +28174,7 @@ characters.data={ category="no", description="MALAYALAM NUMBER TEN", direction="l", + indic="o", linebreak="al", unicodeslot=0xD70, }, @@ -27042,6 +28182,7 @@ characters.data={ category="no", description="MALAYALAM NUMBER ONE HUNDRED", direction="l", + indic="o", linebreak="al", unicodeslot=0xD71, }, @@ -27049,6 +28190,7 @@ characters.data={ category="no", description="MALAYALAM NUMBER ONE THOUSAND", direction="l", + indic="o", linebreak="al", unicodeslot=0xD72, }, @@ -27056,6 +28198,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE QUARTER", direction="l", + indic="o", linebreak="al", unicodeslot=0xD73, }, @@ -27063,6 +28206,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE HALF", direction="l", + indic="o", linebreak="al", unicodeslot=0xD74, }, @@ -27070,6 +28214,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION THREE QUARTERS", direction="l", + indic="o", linebreak="al", unicodeslot=0xD75, }, @@ -27077,6 +28222,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE SIXTEENTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD76, }, @@ -27084,6 +28230,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION ONE EIGHTH", direction="l", + indic="o", linebreak="al", unicodeslot=0xD77, }, @@ -27091,6 +28238,7 @@ characters.data={ category="no", description="MALAYALAM FRACTION THREE SIXTEENTHS", direction="l", + indic="o", linebreak="al", unicodeslot=0xD78, }, @@ -27098,6 +28246,7 @@ characters.data={ category="so", description="MALAYALAM DATE MARK", direction="l", + indic="o", linebreak="po", unicodeslot=0xD79, }, @@ -27105,6 +28254,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU NN", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7A, }, @@ -27112,6 +28262,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU N", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7B, }, @@ -27119,6 +28270,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU RR", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7C, }, @@ -27126,6 +28278,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU L", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7D, }, @@ -27133,6 +28286,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU LL", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7E, }, @@ -27140,6 +28294,7 @@ characters.data={ category="lo", description="MALAYALAM LETTER CHILLU K", direction="l", + indic="o", linebreak="al", unicodeslot=0xD7F, }, @@ -72295,6 +73450,7 @@ characters.data={ }, [0x25CC]={ adobename="dottedcircle", + contextname="dottedcircle", category="so", description="DOTTED CIRCLE", direction="on", @@ -117560,6 +118716,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT ZERO", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E0, }, @@ -117568,6 +118726,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT ONE", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E1, }, @@ -117576,6 +118736,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT TWO", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E2, }, @@ -117584,6 +118746,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT THREE", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E3, }, @@ -117592,6 +118756,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT FOUR", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E4, }, @@ -117600,6 +118766,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT FIVE", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E5, }, @@ -117608,6 +118776,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT SIX", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E6, }, @@ -117616,6 +118786,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT SEVEN", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E7, }, @@ -117624,6 +118796,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT EIGHT", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E8, }, @@ -117632,6 +118806,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI DIGIT NINE", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8E9, }, @@ -117640,6 +118816,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER A", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8EA, }, @@ -117648,6 +118826,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER U", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8EB, }, @@ -117656,6 +118836,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER KA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8EC, }, @@ -117664,6 +118846,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER NA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8ED, }, @@ -117672,6 +118856,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER PA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8EE, }, @@ -117680,6 +118866,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER RA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8EF, }, @@ -117688,6 +118876,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI LETTER VI", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8F0, }, @@ -117696,6 +118886,8 @@ characters.data={ combining=0xE6, description="COMBINING DEVANAGARI SIGN AVAGRAHA", direction="nsm", + indic="m", + indicmark="t", linebreak="cm", unicodeslot=0xA8F1, }, diff --git a/tex/context/base/mkiv/char-tex.lua b/tex/context/base/mkiv/char-tex.lua index f123f0092..065152881 100644 --- a/tex/context/base/mkiv/char-tex.lua +++ b/tex/context/base/mkiv/char-tex.lua @@ -847,7 +847,7 @@ end interfaces.implement { name = "overloaduppercase", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(c,u) overload(c,u,"uccode","uccodes") end @@ -855,7 +855,7 @@ interfaces.implement { interfaces.implement { name = "overloadlowercase", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(c,u) overload(c,u,"lccode","lccodes") end diff --git a/tex/context/base/mkiv/char-utf.lua b/tex/context/base/mkiv/char-utf.lua index 8f46ae98f..4dc7eba7a 100644 --- a/tex/context/base/mkiv/char-utf.lua +++ b/tex/context/base/mkiv/char-utf.lua @@ -269,7 +269,7 @@ if interfaces then -- eventually this goes to char-ctx.lua interfaces.implement { name = "addgrapheme", actions = utffilters.addgrapheme, - arguments = { "string", "string", "string" } + arguments = "3 strings", } end diff --git a/tex/context/base/mkiv/chem-str.lua b/tex/context/base/mkiv/chem-str.lua index 1ad16564c..7581a61d1 100644 --- a/tex/context/base/mkiv/chem-str.lua +++ b/tex/context/base/mkiv/chem-str.lua @@ -808,7 +808,7 @@ implement { implement { name = "definechemical", actions = chemistry.define, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { @@ -843,7 +843,7 @@ implement { implement { name = "chemicalcomponent", actions = chemistry.component, - arguments = { "string", "string", "string", "string" } + arguments = "4 strings", } -- todo: top / bottom diff --git a/tex/context/base/mkiv/cldf-ini.lua b/tex/context/base/mkiv/cldf-ini.lua index a2814877d..8cd6408d3 100644 --- a/tex/context/base/mkiv/cldf-ini.lua +++ b/tex/context/base/mkiv/cldf-ini.lua @@ -319,7 +319,43 @@ local interfacescanners = setmetatablenewindex(function(t,k,v) rawset(t,k,v) end) +function interfaces.registerscanner(name,action,protected,public,call) + if storedscanners[name] then + -- report_cld("warning: scanner %a is already set",k) + -- os.exit() + -- \scan_ is already in the format + -- report_cld("using interface scanner: %s",k) + else + storedscanners[name] = true +-- if protected then +-- -- report_cld("installing expandable interface scanner: %s",k) +-- if public then +-- context("\\installprotectedctxscanner{%s}{interfaces.scanners.%s}",name,name) +-- else +-- context("\\installprotectedctxscanner{clf_%s}{interfaces.scanners.%s}",name,name) +-- end +-- else +-- -- report_cld("installing protected interface scanner: %s",k) +-- if public then +-- context("\\installctxscanner{%s}{interfaces.scanners.%s}",name,name) +-- else +-- context("\\installctxscanner{clf_%s}{interfaces.scanners.%s}",name,name) +-- end +-- end + -- report_cld("installing interface scanner: %s",k) + context("\\install%sctxscanner%s{%s%s}{interfaces.scanners.%s}", + protected and "protected" or "", + call and "call" or "", + public and "" or "clf_", + name, + name + ) + end + rawset(interfacescanners,name,action) +end + interfaces.scanners = storage.mark(interfacescanners) +interfaces._ = interfaces.scanners context.functions = { register = registerfunction, @@ -633,6 +669,20 @@ end local containseol = patterns.containseol +local s_cldl_option_b = "[\\cldl" +local s_cldl_option_f = "[\\cldl" -- add space (not needed) +local s_cldl_option_e = "]" +local s_cldl_option_s = "\\cldl" +local s_cldl_argument_b = "{\\cldl" +local s_cldl_argument_f = "{\\cldl " +local s_cldl_argument_e = "}" + +-- local s_cldl_option_b = "[" +-- local s_cldl_option_f = "" -- add space (not needed) +-- local s_cldl_option_s = "" +-- local s_cldl_argument_b = "{" +-- local s_cldl_argument_f = "{ " + local function writer(parent,command,...) -- already optimized before call flush(currentcatcodes,command) -- todo: ctx|prt|texcatcodes local direct = false @@ -699,8 +749,7 @@ local function writer(parent,command,...) -- already optimized before call elseif tn == 1 then -- some 20% faster than the next loop local tj = ti[1] if type(tj) == "function" then - flush(currentcatcodes,"[\\cldl",storefunction(tj),"]") - -- flush(currentcatcodes,"[",storefunction(tj),"]") + flush(currentcatcodes,s_cldl_option_b,storefunction(tj),s_cldl_option_e) else flush(currentcatcodes,"[",tj,"]") end @@ -710,11 +759,9 @@ local function writer(parent,command,...) -- already optimized before call local tj = ti[j] if type(tj) == "function" then if j == tn then - flush(currentcatcodes,"\\cldl",storefunction(tj),"]") - -- flush(currentcatcodes,"",storefunction(tj),"]") + flush(currentcatcodes,s_cldl_option_s,storefunction(tj),"]") else - flush(currentcatcodes,"\\cldl",storefunction(tj),",") - -- flush(currentcatcodes,"",storefunction(tj),",") + flush(currentcatcodes,s_cldl_option_s,storefunction(tj),",") end else if j == tn then @@ -726,8 +773,8 @@ local function writer(parent,command,...) -- already optimized before call end end elseif typ == "function" then - flush(currentcatcodes,"{\\cldl ",storefunction(ti),"}") -- todo: ctx|prt|texcatcodes - -- flush(currentcatcodes,"{",storefunction(ti),"}") -- todo: ctx|prt|texcatcodes + -- todo: ctx|prt|texcatcodes + flush(currentcatcodes,s_cldl_argument_f,storefunction(ti),s_cldl_argument_e) elseif typ == "boolean" then if ti then flushdirect(currentcatcodes,"\r") @@ -737,8 +784,7 @@ local function writer(parent,command,...) -- already optimized before call elseif typ == "thread" then report_context("coroutines not supported as we cannot yield across boundaries") elseif isnode(ti) then -- slow - flush(currentcatcodes,"{\\cldl",storenode(ti),"}") - -- flush(currentcatcodes,"{",storenode(ti),"}") + flush(currentcatcodes,s_cldl_argument_b,storenode(ti),s_cldl_argument_e) else report_context("error: %a gets a weird argument %a",command,ti) end @@ -762,11 +808,9 @@ end -- if tp == "string" or tp == "number"then -- flush(prtcatcodes,"{",ti,"}") -- elseif tp == "function" then --- flush(prtcatcodes,"{\\cldl ",storefunction(ti),"}") --- -- flush(currentcatcodes,"{",storefunction(ti),"}") -- todo: ctx|prt|texcatcodes +-- flush(prtcatcodes,s_cldl_argument_f,storefunction(ti),s_cldl_argument_e) -- elseif isnode(ti) then --- flush(prtcatcodes,"{\\cldl",storenode(ti),"}") --- -- flush(currentcatcodes,"{",storenode(ti),"}") +-- flush(prtcatcodes,s_cldl_argument_b,storenode(ti),s_cldl_argument_e) -- else -- report_context("fatal error: prt %a gets a weird argument %a",command,ti) -- end diff --git a/tex/context/base/mkiv/cldf-scn.lua b/tex/context/base/mkiv/cldf-scn.lua index beeb8c8c9..ccf1f01c6 100644 --- a/tex/context/base/mkiv/cldf-scn.lua +++ b/tex/context/base/mkiv/cldf-scn.lua @@ -22,6 +22,7 @@ local f_command = formatters["local action = tokens._action\n%\nt\nreturn func local interfaces = interfaces local commands = commands local scanners = interfaces.scanners +local register = interfaces.registerscanner local compile = tokens.compile or function() end @@ -71,7 +72,8 @@ function interfaces.implement(specification) if scanners[name] and not specification.overload then report("warning: 'scanners.%s' is redefined",name) end - scanners[name] = scanner +-- scanners[name] = scanner + register(name,scanner,specification.protected,specification.public,specification.call) if private then return end diff --git a/tex/context/base/mkiv/colo-ini.lua b/tex/context/base/mkiv/colo-ini.lua index ca00ae72f..921612b0f 100644 --- a/tex/context/base/mkiv/colo-ini.lua +++ b/tex/context/base/mkiv/colo-ini.lua @@ -1058,12 +1058,12 @@ implement { implement { name = "synccolorclone", actions = synccolorclone, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "setcolormodel", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(model,weight) texsetattribute(a_colormodel,setcolormodel(model,weight)) end @@ -1072,7 +1072,7 @@ implement { implement { name = "setpagecolormodel", actions = colors.setpagecolormodel, - arguments = { "string" }, + arguments = "string", } implement { @@ -1110,13 +1110,13 @@ implement { actions = function(main) colors.main = main end, - arguments = { "integer" } + arguments = "integer" } implement { name = "definetransparency", actions = definetransparency, - arguments = { "string", "string" } + arguments = "2 strings" } implement { diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index aef280dc3..c705c3afc 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2018.03.16 22:20} +\newcontextversion{2018.04.02 15:43} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 1ff75e083..2adc6b3ee 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -42,7 +42,7 @@ %D has to match \type {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2018.03.16 22:20} +\edef\contextversion{2018.04.02 15:43} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/mkiv/core-con.lua b/tex/context/base/mkiv/core-con.lua index edba24f10..87b4c063e 100644 --- a/tex/context/base/mkiv/core-con.lua +++ b/tex/context/base/mkiv/core-con.lua @@ -644,7 +644,7 @@ end implement { name = "defineconversion", actions = converters.define, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -685,7 +685,7 @@ end implement { name = "doifelseconverter", actions = { valid, commands.doifelse }, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -1398,7 +1398,7 @@ end implement { name = "currentdate", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(pattern,default,language) currentdate( pattern == "" and default or pattern, diff --git a/tex/context/base/mkiv/core-dat.lua b/tex/context/base/mkiv/core-dat.lua index c3b00a7c0..fa4d089d0 100644 --- a/tex/context/base/mkiv/core-dat.lua +++ b/tex/context/base/mkiv/core-dat.lua @@ -192,9 +192,9 @@ implement { } implement { - name = "datasetvariable", - actions = datasetvariable, - arguments = { "string", "string", "string" } + name = "datasetvariable", + actions = datasetvariable, + arguments = "3 strings", } --[[ldx-- @@ -305,11 +305,11 @@ implement { implement { name = "pagestaterealpage", actions = pagestaterealpage, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "setpagestaterealpageno", actions = setpagestaterealpageno, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/core-sys.lua b/tex/context/base/mkiv/core-sys.lua index 523b47298..26229235b 100644 --- a/tex/context/base/mkiv/core-sys.lua +++ b/tex/context/base/mkiv/core-sys.lua @@ -84,7 +84,7 @@ end) implement { name = "systemlog", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(whereto,category,text) logs.system(whereto,"context",tex.jobname,category,text) end, diff --git a/tex/context/base/mkiv/core-two.lua b/tex/context/base/mkiv/core-two.lua index 5192677b2..1e59004be 100644 --- a/tex/context/base/mkiv/core-two.lua +++ b/tex/context/base/mkiv/core-two.lua @@ -150,7 +150,7 @@ local implement = interfaces.implement implement { name = "gettwopassdata", actions = { get , context }, arguments = "string" } implement { name = "getfirsttwopassdata",actions = { first, context }, arguments = "string" } implement { name = "getlasttwopassdata", actions = { last , context }, arguments = "string" } -implement { name = "findtwopassdata", actions = { find , context }, arguments = { "string", "string" } } +implement { name = "findtwopassdata", actions = { find , context }, arguments = "2 strings" } implement { name = "gettwopassdatalist", actions = { list , context }, arguments = "string" } implement { name = "counttwopassdata", actions = { count, context }, arguments = "string" } implement { name = "checktwopassdata", actions = { check, context }, arguments = "string" } @@ -164,17 +164,17 @@ implement { implement { name = "savetwopassdata", actions = jobpasses.save, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "savetaggedtwopassdata", actions = jobpasses.savetagged, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { name = "doifelseintwopassdata", actions = { inlist, commands.doifelse }, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/core-uti.lua b/tex/context/base/mkiv/core-uti.lua index fda66ed73..b281b81a4 100644 --- a/tex/context/base/mkiv/core-uti.lua +++ b/tex/context/base/mkiv/core-uti.lua @@ -384,15 +384,37 @@ statistics.register("jobdata time",function() end end) -statistics.register("callbacks", function() - local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0 - local pages = texgetcount('realpageno') - 1 - if pages > 1 then - return format("direct: %s, indirect: %s, total: %s (%i per page)", total-indirect, indirect, total, total/pages) - else - return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total) +-- statistics.register("callbacks", function() +-- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0 +-- local pages = texgetcount('realpageno') - 1 +-- if pages > 1 then +-- return format("direct: %s, indirect: %s, total: %s (%i per page)", total-indirect, indirect, total, total/pages) +-- else +-- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total) +-- end +-- end) + +function statistics.callbacks() + local c_internal = status.callbacks or 0 + local c_file = status.indirect_callbacks or 0 + local c_direct = status.direct_callbacks or 0 + local c_late = status.late_callbacks or 0 + local c_function = status.function_callbacks or 0 + local c_total = c_internal + c_file + c_direct + c_late + c_function + local n_pages = texgetcount('realpageno') - 1 + local c_average = n_pages > 0 and math.round(c_total/n_pages) or 0 + local s_result = format ( + c_average > 0 and "internal: %s, file: %s, direct: %s, late: %s, function %s, total: %s (%s per page)" + or "internal: %s, file: %s, direct: %s, late: %s, function %s, total: %s", + c_internal, c_file, c_direct, c_late, c_function, c_total, c_average + ) + statistics.callbacks = function() + return s_result end -end) + return s_result +end + +statistics.register("callbacks", statistics.callbacks) statistics.register("randomizer", function() if rmethod and rvalue then @@ -436,7 +458,7 @@ end implement { name = "savevariable", actions = job.variables.save, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/file-job.lua b/tex/context/base/mkiv/file-job.lua index af15eff56..dbf6da9b4 100644 --- a/tex/context/base/mkiv/file-job.lua +++ b/tex/context/base/mkiv/file-job.lua @@ -160,7 +160,7 @@ implement { implement { name = "usezipfile", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(name,tree) if tree and tree ~= "" then resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree)) @@ -923,13 +923,13 @@ end implement { name = "setdocumentargument", actions = document.setargument, - arguments = { "string", "string" } + arguments = "2 strings" } implement { name = "setdocumentdefaultargument", actions = document.setdefaultargument, - arguments = { "string", "string" } + arguments = "2 strings" } implement { @@ -941,7 +941,7 @@ implement { implement { name = "getdocumentargument", actions = { document.getargument, context }, - arguments = { "string", "string" } + arguments = "2 strings" } implement { diff --git a/tex/context/base/mkiv/file-res.lua b/tex/context/base/mkiv/file-res.lua index cf76d2d8b..16afae4c7 100644 --- a/tex/context/base/mkiv/file-res.lua +++ b/tex/context/base/mkiv/file-res.lua @@ -161,7 +161,7 @@ local implement = interfaces.implement implement { name = "getreadfilename", actions = { getreadfilename, context }, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { diff --git a/tex/context/base/mkiv/file-syn.lua b/tex/context/base/mkiv/file-syn.lua index 7b000f9ad..c1c25bab3 100644 --- a/tex/context/base/mkiv/file-syn.lua +++ b/tex/context/base/mkiv/file-syn.lua @@ -60,11 +60,11 @@ implement { implement { name = "definefilesynonym", actions = environment.definefilesynonym, - arguments = { "string", "string" } + arguments = "2 strings" } implement { name = "definefilefallback", actions = environment,definefilefallback, - arguments = { "string", "string" } + arguments = "2 strings" } diff --git a/tex/context/base/mkiv/font-cft.lua b/tex/context/base/mkiv/font-cft.lua index 30221cbaa..83227ca4a 100644 --- a/tex/context/base/mkiv/font-cft.lua +++ b/tex/context/base/mkiv/font-cft.lua @@ -266,6 +266,8 @@ do }, slantfactor = t_float, extendfactor = t_float, + mode = t_cardinal, + width = t_scale, factor = t_float, hfactor = t_float, vfactor = t_float, diff --git a/tex/context/base/mkiv/font-col.lua b/tex/context/base/mkiv/font-col.lua index 8d3152df4..7bbaf31cb 100644 --- a/tex/context/base/mkiv/font-col.lua +++ b/tex/context/base/mkiv/font-col.lua @@ -363,13 +363,13 @@ end implement { name = "fontcollectiondefine", actions = collections.define, - arguments = { "string", "string", "string", "string" } + arguments = "4 strings", } implement { name = "fontcollectionreset", actions = collections.reset, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/font-con.lua b/tex/context/base/mkiv/font-con.lua index 9cffa5927..add646da1 100644 --- a/tex/context/base/mkiv/font-con.lua +++ b/tex/context/base/mkiv/font-con.lua @@ -492,6 +492,15 @@ function constructors.scale(tfmdata,specification) else target.slant = 0 end + -- effects + local mode = parameters.mode or 0 + if mode ~= 0 then + target.mode = mode + end + local width = parameters.width or 0 + if width ~= 0 then + target.width = width + end -- targetparameters.factor = delta targetparameters.hfactor = hdelta @@ -499,6 +508,8 @@ function constructors.scale(tfmdata,specification) targetparameters.size = scaledpoints targetparameters.units = units targetparameters.scaledpoints = askedscaledpoints + targetparameters.mode = mode + targetparameters.width = width -- local isvirtual = properties.virtualized or tfmdata.type == "virtual" local hasquality = parameters.expansion or parameters.protrusion @@ -875,12 +886,15 @@ function constructors.scale(tfmdata,specification) -- constructors.aftercopyingcharacters(target,tfmdata) -- - constructors.trytosharefont(target,tfmdata) + constructors.trytosharefont(target,tfmdata) -- -- catch inconsistencies -- local vfonts = target.fonts - if isvirtual then +-- if isvirtual then +if isvirtual or target.type == "virtual" or properties.virtualized then + properties.virtualized = true +target.type = "virtual" if not vfonts or #vfonts == 0 then target.fonts = { { id = 0 } } end @@ -925,6 +939,14 @@ function constructors.finalize(tfmdata) parameters.size = tfmdata.size end -- + if not parameters.mode then + parameters.mode = 0 + end + -- + if not parameters.width then + parameters.width = 0 + end + -- if not parameters.extendfactor then parameters.extendfactor = tfmdata.extend or 0 end @@ -1023,6 +1045,8 @@ function constructors.finalize(tfmdata) tfmdata.step = nil tfmdata.extend = nil tfmdata.slant = nil + tfmdata.mode = nil + tfmdata.width = nil tfmdata.units = nil tfmdata.units_per_em = nil -- diff --git a/tex/context/base/mkiv/font-ctx.lua b/tex/context/base/mkiv/font-ctx.lua index bc562d0d0..87885f64f 100644 --- a/tex/context/base/mkiv/font-ctx.lua +++ b/tex/context/base/mkiv/font-ctx.lua @@ -2249,7 +2249,7 @@ end implement { name = "definetypeface", actions = fonts.definetypeface, - arguments = { "string", "string" } + arguments = "2 strings" } function fonts.current() -- todo: also handle name @@ -2442,13 +2442,13 @@ do implement { name = "definefontfeature", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = presetcontext } implement { name = "adaptfontfeature", - arguments = { "string", "string" }, + arguments = "2 strings", actions = adaptcontext } @@ -2919,7 +2919,7 @@ do -- implement { -- name = "definefontcolorpalette", - -- arguments = { "string", "string" }, + -- arguments = "2 strings", -- actions = function(name,set) -- set = settings_to_array(set) -- for i=1,#set do @@ -2938,7 +2938,7 @@ do implement { name = "definefontcolorpalette", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(name,set) otf.registerpalette(name,settings_to_array(set)) end diff --git a/tex/context/base/mkiv/font-ext.lua b/tex/context/base/mkiv/font-ext.lua index f9db5e0d9..d873dccd4 100644 --- a/tex/context/base/mkiv/font-ext.lua +++ b/tex/context/base/mkiv/font-ext.lua @@ -30,9 +30,10 @@ of neutral.

local handlers = fonts.handlers local hashes = fonts.hashes local otf = handlers.otf +local afm = handlers.afm -local registerotffeature = handlers.otf.features.register -local registerafmfeature = handlers.afm.features.register +local registerotffeature = otf.features.register +local registerafmfeature = afm.features.register local fontdata = hashes.identifiers local fontproperties = hashes.properties @@ -181,7 +182,7 @@ fonts.goodies.register("expansions", function(...) return fonts.goodies.report( implement { name = "setupfontexpansion", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(class,settings) getparameters(classes,class,'preset',settings) end } @@ -492,7 +493,7 @@ fonts.goodies.register("protrusions", function(...) return fonts.goodies.report( implement { name = "setupfontprotrusion", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(class,settings) getparameters(classes,class,'preset',settings) end } @@ -671,15 +672,15 @@ local function manipulatedimensions(tfmdata,key,value) local width = newwidth or oldwidth or 0 local height = newheight or oldheight or 0 local depth = newdepth or olddepth or 0 - if oldwidth ~= width then - -- Defining the tables in one step is more efficient - -- than adding fields later. + if oldwidth ~= width or oldheight ~= height or olddepth ~= depth then local private = getprivate(tfmdata) + local newslot = { "slot", 1, private } -- { "slot", 0, private } local new_c - local commands = { + local commands = oldwidth ~= width and { { "right", (width - oldwidth) / 2 }, - { "slot", 1, private }, - -- { "slot", 0, private }, + newslot, + } or { + newslot, } if height > 0 then if depth > 0 then @@ -718,19 +719,19 @@ local function manipulatedimensions(tfmdata,key,value) for k, v in next, additions do characters[k] = v end - elseif height > 0 and depth > 0 then - for unicode, old_c in next, characters do - old_c.height = height - old_c.depth = depth - end - elseif height > 0 then - for unicode, old_c in next, characters do - old_c.height = height - end - elseif depth > 0 then - for unicode, old_c in next, characters do - old_c.depth = depth - end + -- elseif height > 0 and depth > 0 then + -- for unicode, old_c in next, characters do + -- old_c.height = height + -- old_c.depth = depth + -- end + -- elseif height > 0 then + -- for unicode, old_c in next, characters do + -- old_c.height = height + -- end + -- elseif depth > 0 then + -- for unicode, old_c in next, characters do + -- old_c.depth = depth + -- end end end end @@ -1706,3 +1707,150 @@ do } end + +-- maybe useful + +local function initializeoutline(tfmdata,value) + value = tonumber(value) + if not value then + value = 0 + else + value = tonumber(value) or 0 + end + if value then + value = value * 1000 + end + tfmdata.parameters.mode = 1 + tfmdata.parameters.width = value +end + +local outline_specification = { + name = "outline", + description = "outline glyphs", + initializers = { + base = initializeoutline, + node = initializeoutline, + } +} + +registerotffeature(outline_specification) +registerafmfeature(outline_specification) + +-- definitely ugly + +local report_effect = logs.reporter("fonts","effect") +local trace_effect = false + +trackers.register("fonts.effect", function(v) trace_effect = v end) + +local effects = { + inner = 0, + normal = 0, + outer = 1, + outline = 1, + both = 2, + hidden = 3, +} + +local function initializeeffect(tfmdata,value) + local spec + if type(value) == "number" then + spec = { width = value } + else + spec = settings_to_hash(value) + end + local effect = spec.effect or "both" + local width = tonumber(spec.width) or 0 + local mode = effects[effect] + if not mode then + report_effect("invalid effect %a",effect) + elseif width == 0 and mode == 0 then + report_effect("invalid width %a for effect %a",width,effect) + else + local parameters = tfmdata.parameters + local properties = tfmdata.properties + parameters.mode = mode + parameters.width = width * 1000 + local factor = tonumber(spec.factor) or 0 + local hfactor = tonumber(spec.vfactor) or factor + local vfactor = tonumber(spec.hfactor) or factor + local delta = tonumber(spec.delta) or 1 + local wdelta = tonumber(spec.wdelta) or delta + local hdelta = tonumber(spec.hdelta) or delta + local ddelta = tonumber(spec.ddelta) or hdelta + properties.effect = { + effect = effect, + width = width, + factor = factor, + hfactor = hfactor, + vfactor = vfactor, + wdelta = wdelta, + hdelta = hdelta, + ddelta = ddelta, + } + end +end + +local function manipulateeffect(tfmdata) + local effect = tfmdata.properties.effect + if effect then + local characters = tfmdata.characters + local parameters = tfmdata.parameters + local multiplier = effect.width * 100 + local wdelta = effect.wdelta * parameters.hfactor * multiplier + local hdelta = effect.hdelta * parameters.vfactor * multiplier + local ddelta = effect.ddelta * parameters.vfactor * multiplier + local hshift = wdelta / 2 + local factor = (1 + effect.factor) * parameters.factor + local hfactor = (1 + effect.hfactor) * parameters.hfactor + local vfactor = (1 + effect.vfactor) * parameters.vfactor + for unicode, old_c in next, characters do + local oldwidth = old_c.width + local oldheight = old_c.height + local olddepth = old_c.depth + if oldwidth and oldwidth > 0 then + old_c.width = oldwidth + wdelta + old_c.commands = { + { "right", hshift }, + { "char", unicode }, + } + end + if oldheight and oldheight > 0 then + old_c.height = oldheight + hdelta + end + if olddepth and olddepth > 0 then + old_c.depth = olddepth + ddelta + end + end + parameters.factor = factor + parameters.hfactor = hfactor + parameters.vfactor = vfactor + if trace_effect then + report_effect("applying effect") + report_effect(" effect : %s", effect.effect) + report_effect(" width : %s => %s", effect.width, multiplier) + report_effect(" factor : %s => %s", effect.factor, factor ) + report_effect(" hfactor : %s => %s", effect.hfactor,hfactor) + report_effect(" vfactor : %s => %s", effect.vfactor,vfactor) + report_effect(" wdelta : %s => %s", effect.wdelta, wdelta) + report_effect(" hdelta : %s => %s", effect.hdelta, hdelta) + report_effect(" ddelta : %s => %s", effect.ddelta, ddelta) + end + end +end + +local effect_specification = { + name = "effect", + description = "apply effects to glyphs", + initializers = { + base = initializeeffect, + node = initializeeffect, + }, + manipulators = { + base = manipulateeffect, + node = manipulateeffect, + }, +} + +registerotffeature(effect_specification) +registerafmfeature(effect_specification) diff --git a/tex/context/base/mkiv/font-map.lua b/tex/context/base/mkiv/font-map.lua index d4a1b4594..66cf2db39 100644 --- a/tex/context/base/mkiv/font-map.lua +++ b/tex/context/base/mkiv/font-map.lua @@ -192,8 +192,8 @@ local function tounicode(unicode) end -- no real gain on runs --- --- local hash = setmetatableindex(function(t,u) + +-- local hash = table.setmetatableindex(function(t,u) -- local v -- if u < 0xD7FF or (u > 0xDFFF and u <= 0xFFFF) then -- v = f_single(u) @@ -209,7 +209,7 @@ end -- if type(unicode) == "table" then -- local t = { } -- for l=1,#unicode do --- t[l] = hash[u] +-- t[l] = hash[unicode[l]] -- end -- return concat(t) -- else diff --git a/tex/context/base/mkiv/font-osd.lua b/tex/context/base/mkiv/font-osd.lua index 04fbf88f5..9f99fd57f 100644 --- a/tex/context/base/mkiv/font-osd.lua +++ b/tex/context/base/mkiv/font-osd.lua @@ -8,64 +8,80 @@ if not modules then modules = { } end modules ['font-osd'] = { -- script devanag -- A few remarks: -- --- This code is a partial rewrite of the code that deals with devanagari. The data and logic --- is by Kai Eigner and based based on Microsoft's OpenType specifications for specific --- scripts, but with a few improvements. More information can be found at: +-- This code is a partial rewrite of the code that deals with devanagari. The data +-- and logic is by Kai Eigner and based based on Microsoft's OpenType specifications +-- for specific scripts, but with a few improvements. More information can be found +-- at: -- -- deva: http://www.microsoft.com/typography/OpenType%20Dev/devanagari/introO.mspx -- dev2: http://www.microsoft.com/typography/OpenType%20Dev/devanagari/intro.mspx -- --- Rajeesh Nambiar provided patches for the malayalam variant. Thanks to feedback from --- the mailing list some aspects could be improved. +-- Rajeesh Nambiar provided patches for the malayalam variant. Thanks to feedback +-- from the mailing list some aspects could be improved. -- --- As I touched nearly all code, reshuffled it, optimized a lot, etc. etc. (imagine how --- much can get messed up in over a week work) it could be that I introduced bugs. There --- is more to gain (esp in the functions applied to a range) but I'll do that when --- everything works as expected. Kai's original code is kept in font-odk.lua as a reference --- so blame me (HH) for bugs. (We no longer ship that file as the code below has diverted --- too much and in the meantime has more than doubled in size.) +-- As I touched nearly all code, reshuffled it, optimized a lot, etc. etc. (imagine +-- how much can get messed up in over a week work) it could be that I introduced +-- bugs. There is more to gain (esp in the functions applied to a range) but I'll do +-- that when everything works as expected. Kai's original code is kept in +-- font-odk.lua as a reference so blame me (HH) for bugs. (We no longer ship that +-- file as the code below has diverted too much and in the meantime has more than +-- doubled in size.) -- --- Interesting is that Kai managed to write this on top of the existing otf handler. Only a --- few extensions were needed, like a few more analyzing states and dealing with changed --- head nodes in the core scanner as that only happens here. There's a lot going on here --- and it's only because I touched nearly all code that I got a bit of a picture of what --- happens. For in-depth knowledge one needs to consult Kai. +-- Interesting is that Kai managed to write this on top of the existing otf handler. +-- Only a few extensions were needed, like a few more analyzing states and dealing +-- with changed head nodes in the core scanner as that only happens here. There's a +-- lot going on here and it's only because I touched nearly all code that I got a +-- bit of a picture of what happens. For in-depth knowledge one needs to consult +-- Kai. -- --- The rewrite mostly deals with efficiency, both in terms of speed and code. We also made --- sure that it suits generic use as well as use in ConTeXt. I removed some buglets but can --- as well have messed up the logic by doing this. For this we keep the original around --- as that serves as reference. Due to the lots of reshuffling glyphs quite some leaks --- occur(red) but once I'm satisfied with the rewrite I'll weed them. I also integrated --- initialization etc into the regular mechanisms. +-- The rewrite mostly deals with efficiency, both in terms of speed and code. We +-- also made sure that it suits generic use as well as use in ConTeXt. I removed +-- some buglets but can as well have messed up the logic by doing this. For this we +-- keep the original around as that serves as reference. Due to the lots of +-- reshuffling glyphs quite some leaks occur(red) but once I'm satisfied with the +-- rewrite I'll weed them. I also integrated initialization etc into the regular +-- mechanisms. -- --- In the meantime, we're down from 25.5-3.5=22 seconds to 17.7-3.5=14.2 seconds for a 100 --- page sample (mid 2012) with both variants so it's worth the effort. Some more speedup is --- to be expected. Due to the method chosen it will never be real fast. If I ever become a --- power user I'll have a go at some further speed up. I will rename some functions (and --- features) once we don't need to check the original code. We now use a special subset --- sequence for use inside the analyzer (after all we could can store this in the dataset --- and save redundant analysis). +-- In the meantime, we're down from 25.5-3.5=22 seconds to 17.7-3.5=14.2 seconds for +-- a 100 page sample (mid 2012) with both variants so it's worth the effort. Some +-- more speedup is to be expected. Due to the method chosen it will never be real +-- fast. If I ever become a power user I'll have a go at some further speed up. I +-- will rename some functions (and features) once we don't need to check the +-- original code. We now use a special subset sequence for use inside the analyzer +-- (after all we could can store this in the dataset and save redundant analysis). -- --- I might go for an array approach with respect to attributes (and reshuffling). Easier. +-- By now we have yet another incremental improved version. In the end I might +-- rewrite the code. -- --- Some data will move to char-def.lua (some day). --- --- By now we have yet another incremental improved version. In the end I might rewrite the --- code. - -- Hans Hagen, PRAGMA-ADE, Hasselt NL --- --- We could have c_nukta, c_halant, c_ra is we know that they are never used mixed within --- one script .. yes or no? + +-- Todo: -- -- Matras: according to Microsoft typography specifications "up to one of each type: -- pre-, above-, below- or post- base", but that does not seem to be right. It could -- become an option. +-- +-- Resources: +-- +-- The tables that we had here are now generated from char-def.lua or in the case of +-- generic usage loaded from luatex-basics-chr.lua. Still a couple of entries need +-- to be added to char-def.lua but finally I moved the indic specific tables there. +-- For generic usage one can create the relevant resources by running: +-- +-- context luatex-basics-prepare.tex +-- +-- and an overview with: +-- +-- context --global s-fonts-basics.mkiv +-- +-- For now we have defined: bengali, devanagari, gujarati, gurmukhi, kannada, +-- malayalam, oriya, tamil and tolugu but not all are checked. Also, some of the +-- code below might need to be adapted to the extra scripts. local insert, imerge, copy = table.insert, table.imerge, table.copy local next, type = next, type -local report_devanagari = logs.reporter("otf","devanagari") +local report = logs.reporter("otf","devanagari") fonts = fonts or { } fonts.analyzers = fonts.analyzers or { } @@ -115,6 +131,9 @@ local a_state = attributes.private('state') local a_syllabe = attributes.private('syllabe') local dotted_circle = 0x25CC +local c_nbsp = 0x00A0 +local c_zwnj = 0x200C +local c_zwj = 0x200D local states = fonts.analyzers.states -- not features @@ -151,309 +170,199 @@ local function processcharacters(head,font) return tonut(xprocesscharacters(tonode(head))) -- can be more efficient in context, just direct call end --- local fontprocesses = fonts.hashes.processes +-- to be tested: -- --- function processcharacters(head,font) --- local processors = fontprocesses[font] --- for i=1,#processors do --- head = processors[i](head,font,0) +-- local processcharacters = nil +-- +-- if context then +-- local fontprocesses = fonts.hashes.processes +-- function processcharacters(head,font) +-- local processors = fontprocesses[font] +-- for i=1,#processors do +-- head = processors[i](head,font,0) +-- end +-- return head, true +-- end +-- else +-- function processcharacters(head,font) +-- local processors = fontdata[font].shared.processes +-- for i=1,#processors do +-- head = processors[i](head,font,0) +-- end +-- return head, true -- end --- return head, true -- end --- In due time there will be entries here for scripts like Bengali, Gujarati, --- Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu. Feel free to provide the --- code points. - -- We can assume that script are not mixed in the source but if that is the case -- we might need to have consonants etc per script and initialize a local table --- pointing to the right one. +-- pointing to the right one. But not now. --- new, to be checked: --- --- U+00978 : DEVANAGARI LETTER MARWARI DDA --- U+00980 : BENGALI ANJI --- U+00C00 : TELUGU SIGN COMBINING CANDRABINDU ABOVE --- U+00C34 : TELUGU LETTER LLLA --- U+00C81 : KANNADA SIGN CANDRABINDU --- U+00D01 : MALAYALAM SIGN CANDRABINDU --- U+00DE6 : SINHALA LITH DIGIT ZERO --- U+00DE7 : SINHALA LITH DIGIT ONE --- U+00DE8 : SINHALA LITH DIGIT TWO --- U+00DE9 : SINHALA LITH DIGIT THREE --- U+00DEA : SINHALA LITH DIGIT FOUR --- U+00DEB : SINHALA LITH DIGIT FIVE --- U+00DEC : SINHALA LITH DIGIT SIX --- U+00DED : SINHALA LITH DIGIT SEVEN --- U+00DEE : SINHALA LITH DIGIT EIGHT --- U+00DEF : SINHALA LITH DIGIT NINE - -local consonant = { - -- devanagari - [0x0915] = true, [0x0916] = true, [0x0917] = true, [0x0918] = true, - [0x0919] = true, [0x091A] = true, [0x091B] = true, [0x091C] = true, - [0x091D] = true, [0x091E] = true, [0x091F] = true, [0x0920] = true, - [0x0921] = true, [0x0922] = true, [0x0923] = true, [0x0924] = true, - [0x0925] = true, [0x0926] = true, [0x0927] = true, [0x0928] = true, - [0x0929] = true, [0x092A] = true, [0x092B] = true, [0x092C] = true, - [0x092D] = true, [0x092E] = true, [0x092F] = true, [0x0930] = true, - [0x0931] = true, [0x0932] = true, [0x0933] = true, [0x0934] = true, - [0x0935] = true, [0x0936] = true, [0x0937] = true, [0x0938] = true, - [0x0939] = true, [0x0958] = true, [0x0959] = true, [0x095A] = true, - [0x095B] = true, [0x095C] = true, [0x095D] = true, [0x095E] = true, - [0x095F] = true, [0x0979] = true, [0x097A] = true, - -- kannada - [0x0C95] = true, [0x0C96] = true, [0x0C97] = true, [0x0C98] = true, - [0x0C99] = true, [0x0C9A] = true, [0x0C9B] = true, [0x0C9C] = true, - [0x0C9D] = true, [0x0C9E] = true, [0x0C9F] = true, [0x0CA0] = true, - [0x0CA1] = true, [0x0CA2] = true, [0x0CA3] = true, [0x0CA4] = true, - [0x0CA5] = true, [0x0CA6] = true, [0x0CA7] = true, [0x0CA8] = true, - [0x0CA9] = true, [0x0CAA] = true, [0x0CAB] = true, [0x0CAC] = true, - [0x0CAD] = true, [0x0CAE] = true, [0x0CAF] = true, [0x0CB0] = true, - [0x0CB1] = true, [0x0CB2] = true, [0x0CB3] = true, [0x0CB4] = true, - [0x0CB5] = true, [0x0CB6] = true, [0x0CB7] = true, [0x0CB8] = true, - [0x0CB9] = true, - [0x0CDE] = true, -- obsolete - -- malayalam - [0x0D15] = true, [0x0D16] = true, [0x0D17] = true, [0x0D18] = true, - [0x0D19] = true, [0x0D1A] = true, [0x0D1B] = true, [0x0D1C] = true, - [0x0D1D] = true, [0x0D1E] = true, [0x0D1F] = true, [0x0D20] = true, - [0x0D21] = true, [0x0D22] = true, [0x0D23] = true, [0x0D24] = true, - [0x0D25] = true, [0x0D26] = true, [0x0D27] = true, [0x0D28] = true, - [0x0D29] = true, [0x0D2A] = true, [0x0D2B] = true, [0x0D2C] = true, - [0x0D2D] = true, [0x0D2E] = true, [0x0D2F] = true, [0x0D30] = true, - [0x0D31] = true, [0x0D32] = true, [0x0D33] = true, [0x0D34] = true, - [0x0D35] = true, [0x0D36] = true, [0x0D37] = true, [0x0D38] = true, - [0x0D39] = true, [0x0D3A] = true, -} +local indicgroups = characters and characters.indicgroups -local independent_vowel = { - -- devanagari - [0x0904] = true, [0x0905] = true, [0x0906] = true, [0x0907] = true, - [0x0908] = true, [0x0909] = true, [0x090A] = true, [0x090B] = true, - [0x090C] = true, [0x090D] = true, [0x090E] = true, [0x090F] = true, - [0x0910] = true, [0x0911] = true, [0x0912] = true, [0x0913] = true, - [0x0914] = true, [0x0960] = true, [0x0961] = true, [0x0972] = true, - [0x0973] = true, [0x0974] = true, [0x0975] = true, [0x0976] = true, - [0x0977] = true, - -- kannada - [0x0C85] = true, [0x0C86] = true, [0x0C87] = true, [0x0C88] = true, - [0x0C89] = true, [0x0C8A] = true, [0x0C8B] = true, [0x0C8C] = true, - [0x0C8D] = true, [0x0C8E] = true, [0x0C8F] = true, [0x0C90] = true, - [0x0C91] = true, [0x0C92] = true, [0x0C93] = true, [0x0C94] = true, - -- malayalam - [0x0D05] = true, [0x0D06] = true, [0x0D07] = true, [0x0D08] = true, - [0x0D09] = true, [0x0D0A] = true, [0x0D0B] = true, [0x0D0C] = true, - [0x0D0E] = true, [0x0D0F] = true, [0x0D10] = true, [0x0D12] = true, - [0x0D13] = true, [0x0D14] = true, -} +if not indicgroups and characters then -local dependent_vowel = { -- matra - -- devanagari - [0x093A] = true, [0x093B] = true, [0x093E] = true, [0x093F] = true, - [0x0940] = true, [0x0941] = true, [0x0942] = true, [0x0943] = true, - [0x0944] = true, [0x0945] = true, [0x0946] = true, [0x0947] = true, - [0x0948] = true, [0x0949] = true, [0x094A] = true, [0x094B] = true, - [0x094C] = true, [0x094E] = true, [0x094F] = true, [0x0955] = true, - [0x0956] = true, [0x0957] = true, [0x0962] = true, [0x0963] = true, - -- kannada - [0x0CBE] = true, [0x0CBF] = true, [0x0CC0] = true, [0x0CC1] = true, - [0x0CC2] = true, [0x0CC3] = true, [0x0CC4] = true, [0x0CC5] = true, - [0x0CC6] = true, [0x0CC7] = true, [0x0CC8] = true, [0x0CC9] = true, - [0x0CCA] = true, [0x0CCB] = true, [0x0CCC] = true, - -- malayalam - [0x0D3E] = true, [0x0D3F] = true, [0x0D40] = true, [0x0D41] = true, - [0x0D42] = true, [0x0D43] = true, [0x0D44] = true, [0x0D46] = true, - [0x0D47] = true, [0x0D48] = true, [0x0D4A] = true, [0x0D4B] = true, - [0x0D4C] = true, [0x0D57] = true, -} + local indic = { + c = { }, -- consonant + i = { }, -- independent vowel + d = { }, -- dependent vowel + m = { }, -- vowel modifier + s = { }, -- stress tone mark + o = { }, -- other + } -local vowel_modifier = { - -- devanagari - [0x0900] = true, [0x0901] = true, [0x0902] = true, [0x0903] = true, - -- A8E0 - A8F1 are cantillation marks for the Samaveda and may not belong here. - [0xA8E0] = true, [0xA8E1] = true, [0xA8E2] = true, [0xA8E3] = true, - [0xA8E4] = true, [0xA8E5] = true, [0xA8E6] = true, [0xA8E7] = true, - [0xA8E8] = true, [0xA8E9] = true, [0xA8EA] = true, [0xA8EB] = true, - [0xA8EC] = true, [0xA8ED] = true, [0xA8EE] = true, [0xA8EF] = true, - [0xA8F0] = true, [0xA8F1] = true, - -- malayalam - [0x0D02] = true, [0x0D03] = true, -} + local indicmarks = { + l = { }, -- left | pre_mark + t = { }, -- top | above_mark + b = { }, -- bottom | below_mark + r = { }, -- right | post_mark + s = { }, -- split | twopart_mark + } -local stress_tone_mark = { - [0x0951] = true, [0x0952] = true, [0x0953] = true, [0x0954] = true, - -- kannada - [0x0CCD] = true, - -- malayalam - [0x0D4D] = true, -} + local indicclasses = { + nukta = { }, + halant = { }, + ra = { }, + anudatta = { }, + } -local nukta = { - -- devanagari - [0x093C] = true, - -- kannada: - [0x0CBC] = true, -} + local indicorders = { + bp = { }, -- before_postscript + ap = { }, -- after_postscript + bs = { }, -- before_half + as = { }, -- after_half + bh = { }, -- before_subscript + ah = { }, -- after_subscript + bm = { }, -- before_main + am = { }, -- after_main + } -local halant = { - -- devanagari - [0x094D] = true, - -- kannada - [0x0CCD] = true, - -- malayalam - [0x0D4D] = true, -} + for k, v in next, characters.data do + local i = v.indic + if i then + indic[i][k] = true + i = v.indicmark + if i then + if i == "s" then + local s = v.specials + indicmarks[i][k] = { s[2], s[3] } + else + indicmarks[i][k] = true + end + end + i = v.indicclass + if i then + indicclasses[i][k] = true + end + i = v.indicorder + if i then + indicorders[i][k] = true + end + end + end -local ra = { - -- devanagari - [0x0930] = true, - -- kannada - [0x0CB0] = true, - -- malayalam - [0x0D30] = true, -} + indicgroups = { + consonant = indic.c, + independent_vowel = indic.i, + dependent_vowel = indic.d, + vowel_modifier = indic.m, + stress_tone_mark = indic.s, + -- other = indic.o, + pre_mark = indicmarks.l, + above_mark = indicmarks.t, + below_mark = indicmarks.b, + post_mark = indicmarks.r, + twopart_mark = indicmarks.s, + nukta = indicclasses.nukta, + halant = indicclasses.halant, + ra = indicclasses.ra, + anudatta = indicclasses.anudatta, + before_postscript = indicorders.bp, + after_postscript = indicorders.ap, + before_half = indicorders.bh, + after_half = indicorders.ah, + before_subscript = indicorders.bs, + after_subscript = indicorders.as, + before_main = indicorders.bm, + after_main = indicorders.am, + } -local c_anudatta = 0x0952 -- used to be tables -local c_nbsp = 0x00A0 -- used to be tables -local c_zwnj = 0x200C -- used to be tables -local c_zwj = 0x200D -- used to be tables + indic = nil + indicmarks = nil + indicclasses = nil + indicorders = nil -local zw_char = { -- could also be inlined - [0x200C] = true, - [0x200D] = true, -} + characters.indicgroups = indicgroups --- 0C82 anusvara --- 0C83 visarga --- 0CBD avagraha --- 0CD5 length mark --- 0CD6 ai length mark --- 0CE0 letter ll --- 0CE1 letter rr --- 0CE2 vowel sign l --- 0CE2 vowel sign ll --- 0CF1 sign --- 0CF2 sign --- OCE6 - OCEF digits - -local pre_mark = { - [0x093F] = true, [0x094E] = true, - -- malayalam - [0x0D46] = true, [0x0D47] = true, [0x0D48] = true, -} +else -local above_mark = { - [0x0900] = true, [0x0901] = true, [0x0902] = true, [0x093A] = true, - [0x0945] = true, [0x0946] = true, [0x0947] = true, [0x0948] = true, - [0x0951] = true, [0x0953] = true, [0x0954] = true, [0x0955] = true, - [0xA8E0] = true, [0xA8E1] = true, [0xA8E2] = true, [0xA8E3] = true, - [0xA8E4] = true, [0xA8E5] = true, [0xA8E6] = true, [0xA8E7] = true, - [0xA8E8] = true, [0xA8E9] = true, [0xA8EA] = true, [0xA8EB] = true, - [0xA8EC] = true, [0xA8ED] = true, [0xA8EE] = true, [0xA8EF] = true, - [0xA8F0] = true, [0xA8F1] = true, - -- malayalam - [0x0D4E] = true, -} + indicgroups = table.setmetatableindex("table") -local below_mark = { - [0x093C] = true, [0x0941] = true, [0x0942] = true, [0x0943] = true, - [0x0944] = true, [0x094D] = true, [0x0952] = true, [0x0956] = true, - [0x0957] = true, [0x0962] = true, [0x0963] = true, -} +end -local post_mark = { - [0x0903] = true, [0x093B] = true, [0x093E] = true, [0x0940] = true, - [0x0949] = true, [0x094A] = true, [0x094B] = true, [0x094C] = true, - [0x094F] = true, -} +local consonant = indicgroups.consonant +local independent_vowel = indicgroups.independent_vowel +local dependent_vowel = indicgroups.dependent_vowel +local vowel_modifier = indicgroups.vowel_modifier +local stress_tone_mark = indicgroups.stress_tone_mark +local pre_mark = indicgroups.pre_mark +local above_mark = indicgroups.above_mark +local below_mark = indicgroups.below_mark +local post_mark = indicgroups.post_mark +local twopart_mark = indicgroups.twopart_mark +local nukta = indicgroups.nukta +local halant = indicgroups.halant +local ra = indicgroups.ra +local anudatta = indicgroups.anudatta + +local before_postscript = indicgroups.before_postscript +local after_postscript = indicgroups.after_postscript +local before_half = indicgroups.before_half +local after_half = indicgroups.after_half +local before_subscript = indicgroups.before_subscript +local after_subscript = indicgroups.after_subscript +local before_main = indicgroups.before_main +local after_main = indicgroups.after_main + +local mark_four = table.merged ( + pre_mark, + above_mark, + below_mark, + post_mark +) + +local mark_above_below_post = table.merged ( + above_mark, + below_mark, + post_mark +) -local twopart_mark = { - -- malayalam - [0x0D4A] = { 0x0D46, 0x0D3E, }, -- ൊ - [0x0D4B] = { 0x0D47, 0x0D3E, }, -- ോ - [0x0D4C] = { 0x0D46, 0x0D57, }, -- ൌ -} +-- We use some pseudo features as we need to manipulate the nodelist based +-- on information in the font as well as already applied features. We can +-- probably replace some of the code below by injecting 'real' features +-- using the extension mechanism. -local mark_four = { } -- As we access these frequently an extra hash is used. - -for k, v in next, pre_mark do mark_four[k] = pre_mark end -for k, v in next, above_mark do mark_four[k] = above_mark end -for k, v in next, below_mark do mark_four[k] = below_mark end -for k, v in next, post_mark do mark_four[k] = post_mark end - -local mark_above_below_post = { } - -for k, v in next, above_mark do mark_above_below_post[k] = above_mark end -for k, v in next, below_mark do mark_above_below_post[k] = below_mark end -for k, v in next, post_mark do mark_above_below_post[k] = post_mark end - --- Again, this table can be extended for other scripts than devanagari. Actually, --- for ConTeXt this kind of data is kept elsewhere so eventually we might move --- tables to someplace else. - -local reorder_class = { - -- devanagari - [0x0930] = "before postscript", - [0x093F] = "before half", - [0x0940] = "after subscript", - [0x0941] = "after subscript", - [0x0942] = "after subscript", - [0x0943] = "after subscript", - [0x0944] = "after subscript", - [0x0945] = "after subscript", - [0x0946] = "after subscript", - [0x0947] = "after subscript", - [0x0948] = "after subscript", - [0x0949] = "after subscript", - [0x094A] = "after subscript", - [0x094B] = "after subscript", - [0x094C] = "after subscript", - [0x0962] = "after subscript", - [0x0963] = "after subscript", - [0x093E] = "after subscript", - -- kannada: - [0x0CB0] = "after postscript", -- todo in code below - [0x0CBF] = "before subscript", -- todo in code below - [0x0CC6] = "before subscript", -- todo in code below - [0x0CCC] = "before subscript", -- todo in code below - [0x0CBE] = "before subscript", -- todo in code below - [0x0CE2] = "before subscript", -- todo in code below - [0x0CE3] = "before subscript", -- todo in code below - [0x0CC1] = "before subscript", -- todo in code below - [0x0CC2] = "before subscript", -- todo in code below - [0x0CC3] = "after subscript", - [0x0CC4] = "after subscript", - [0x0CD5] = "after subscript", - [0x0CD6] = "after subscript", - -- malayalam +local zw_char = { -- both_joiners_true + [c_zwnj] = true, + [c_zwj ] = true, } --- We use some pseudo features as we need to manipulate the nodelist based --- on information in the font as well as already applied features. - local dflt_true = { dflt = true } -local dev2_defaults = { +local two_defaults = { dev2 = dflt_true, } -local deva_defaults = { +local one_defaults = { dev2 = dflt_true, deva = dflt_true, } local false_flags = { false, false, false, false } -local both_joiners_true = { - [0x200C] = true, - [0x200D] = true, -} - local sequence_reorder_matras = { - features = { dv01 = dev2_defaults }, + features = { dv01 = two_defaults }, flags = false_flags, name = "dv01_reorder_matras", order = { "dv01" }, @@ -467,7 +376,7 @@ local sequence_reorder_matras = { } local sequence_reorder_reph = { - features = { dv02 = dev2_defaults }, + features = { dv02 = two_defaults }, flags = false_flags, name = "dv02_reorder_reph", order = { "dv02" }, @@ -481,7 +390,7 @@ local sequence_reorder_reph = { } local sequence_reorder_pre_base_reordering_consonants = { - features = { dv03 = dev2_defaults }, + features = { dv03 = two_defaults }, flags = false_flags, name = "dv03_reorder_pre_base_reordering_consonants", order = { "dv03" }, @@ -495,7 +404,7 @@ local sequence_reorder_pre_base_reordering_consonants = { } local sequence_remove_joiners = { - features = { dv04 = deva_defaults }, + features = { dv04 = one_defaults }, flags = false_flags, name = "dv04_remove_joiners", order = { "dv04" }, @@ -503,7 +412,7 @@ local sequence_remove_joiners = { nofsteps = 1, steps = { { - coverage = both_joiners_true, + coverage = zw_char, -- both_joiners_true }, } } @@ -513,38 +422,85 @@ local sequence_remove_joiners = { -- as it might depends on the font. Not that it's a bottleneck. local basic_shaping_forms = { - nukt = true, + init = true, -- new + abvs = true, -- new akhn = true, - rphf = true, - pref = true, - rkrf = true, blwf = true, + calt = true, -- new + cjct = true, half = true, + haln = true, -- new + nukt = true, + pref = true, + pres = true, -- new pstf = true, + psts = true, -- new + rkrf = true, + rphf = true, vatu = true, - cjct = true, } local valid = { - akhn = true, -- malayalam - rphf = true, - pref = true, - half = true, + -- akhn = true, -- malayalam + -- rphf = true, + -- pref = true, + -- half = true, + -- blwf = true, + -- pstf = true, + -- pres = true, -- malayalam + -- blws = true, -- malayalam + -- psts = true, -- malayalam + abvs = true, + akhn = true, blwf = true, + calt = true, + cjct = true, + half = true, + haln = true, + nukt = true, + pref = true, + pres = true, pstf = true, - pres = true, -- malayalam - blws = true, -- malayalam - psts = true, -- malayalam + psts = true, + rkrf = true, + rphf = true, + vatu = true, + pres = true, + abvs = true, + blws = true, + psts = true, + haln = true, + calt = true, } +local scripts = { } + +local scripts_one = { "deva", "mlym", "beng", "gujr", "guru", "knda", "orya", "taml", "telu" } +local scripts_two = { "dev2", "mlm2", "bng2", "gjr2", "gur2", "knd2", "ory2", "tml2", "tel2" } + +local nofscripts = #scripts_one + +for i=1,nofscripts do + local one = scripts_one[i] + local two = scripts_two[i] + scripts[one] = true + scripts[two] = true + two_defaults[one] = dflt_true + one_defaults[one] = dflt_true + one_defaults[two] = dflt_true +end + +local function valid_one(s) for i=1,nofscripts do if s[scripts_one[i]] then return true end end end +local function valid_two(s) for i=1,nofscripts do if s[scripts_two[i]] then return true end end end + local function initializedevanagi(tfmdata) local script, language = otf.scriptandlanguage(tfmdata,attr) -- todo: take fast variant - if script == "deva" or script == "dev2" or script =="mlym" or script == "mlm2" then + if scripts[script] then local resources = tfmdata.resources local devanagari = resources.devanagari if not devanagari then -- - report_devanagari("adding devanagari features to font") + report("adding devanagari features to font") -- local gsubfeatures = resources.features.gsub local sequences = resources.sequences @@ -563,10 +519,10 @@ local function initializedevanagi(tfmdata) end local insertindex = lastmatch + 1 -- - gsubfeatures["dv01"] = dev2_defaults -- reorder matras - gsubfeatures["dv02"] = dev2_defaults -- reorder reph - gsubfeatures["dv03"] = dev2_defaults -- reorder pre base reordering consonants - gsubfeatures["dv04"] = deva_defaults -- remove joiners + gsubfeatures["dv01"] = two_defaults -- reorder matras + gsubfeatures["dv02"] = two_defaults -- reorder reph + gsubfeatures["dv03"] = two_defaults -- reorder pre base reordering consonants + gsubfeatures["dv04"] = one_defaults -- remove joiners -- local reorder_pre_base_reordering_consonants = copy(sequence_reorder_pre_base_reordering_consonants) local reorder_reph = copy(sequence_reorder_reph) @@ -622,8 +578,9 @@ local function initializedevanagi(tfmdata) end end end - for kind, spec in next, features do -- beware, this is - if spec.dev2 and valid[kind] then + for kind, spec in next, features do + -- if spec.dev2 and valid[kind] then + if valid[kind] and valid_two(spec)then for i=1,nofsteps do local step = steps[i] local coverage = step.coverage @@ -648,7 +605,9 @@ local function initializedevanagi(tfmdata) end end end - seqsubset[#seqsubset+1] = { kind, coverage, reph } +if reph then + seqsubset[#seqsubset+1] = { kind, coverage, reph } +end end end end @@ -694,8 +653,30 @@ local function initializedevanagi(tfmdata) sharedfeatures["pstf"] = true sharedfeatures["pref"] = true sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants - gsubfeatures ["dv03"] = dev2_defaults -- reorder pre base reordering consonants + gsubfeatures ["dv03"] = two_defaults -- reorder pre base reordering consonants insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants) + -- elseif script == "beng" then + -- elseif script == "bng2" then + -- elseif script == "gujr" then + -- elseif script == "gjr2" then + -- elseif script == "guru" then + -- elseif script == "gur2" then + -- elseif script == "knda" then + -- elseif script == "knd2" then + elseif script == "taml" then + sharedfeatures["dv04"] = true -- dv04_remove_joiners +sharedfeatures["pstf"] = true + elseif script == "tml2" then +-- sharedfeatures["pstf"] = true +-- sharedfeatures["pref"] = true +-- sharedfeatures["dv01"] = true -- dv01_reorder_matras +-- sharedfeatures["dv02"] = true -- dv02_reorder_reph +-- sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants +-- sharedfeatures["dv04"] = true -- dv04_remove_joiners + -- elseif script == "telu" then + -- elseif script == "tel2" then + else + report("todo: enable the right features for script %a",script) end end end @@ -712,7 +693,7 @@ registerotffeature { -- hm, this is applied to one character: -local function deva_initialize(font,attr) -- we need a proper hook into the dataset initializer +local function initialize_one(font,attr) -- we need a proper hook into the dataset initializer local tfmdata = fontdata[font] local datasets = otf.dataset(tfmdata,font,attr) -- don't we know this one? @@ -751,9 +732,9 @@ local function deva_initialize(font,attr) -- we need a proper hook into the data end -local function deva_reorder(head,start,stop,font,attr,nbspaces) +local function reorder_one(head,start,stop,font,attr,nbspaces) - local reph, vattu, blwfcache = deva_initialize(font,attr) -- todo: a hash[font] + local reph, vattu, blwfcache = initialize_one(font,attr) -- todo: a hash[font] local current = start local n = getnext(start) @@ -790,40 +771,40 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) lastcons = current current = getnext(current) if current ~= stop then - if nukta[getchar(current)] then + local char = getchar(current) + if nukta[char] then current = getnext(current) + char = getchar(current) end - if getchar(current) == c_zwj then - if current ~= stop then - local next = getnext(current) - if next ~= stop and halant[getchar(next)] then - current = next - next = getnext(current) - local tmp = next and getnext(next) or nil -- needs checking - local changestop = next == stop - local tempcurrent = copy_node(next) - copyinjection(tempcurrent,next) - local nextcurrent = copy_node(current) - copyinjection(nextcurrent,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set - setlink(tempcurrent,nextcurrent) - setprop(tempcurrent,a_state,s_blwf) - tempcurrent = processcharacters(tempcurrent,font) - setprop(tempcurrent,a_state,unsetvalue) - if getchar(next) == getchar(tempcurrent) then - flush_list(tempcurrent) - local n = copy_node(current) - copyinjection(n,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set - setchar(current,dotted_circle) - head = insert_node_after(head, current, n) - else - setchar(current,getchar(tempcurrent)) -- we assumes that the result of blwf consists of one node - local freenode = getnext(current) - setlink(current,tmp) - flush_node(freenode) - flush_list(tempcurrent) - if changestop then - stop = current - end + if char == c_zwj and current ~= stop then + local next = getnext(current) + if next ~= stop and halant[getchar(next)] then + current = next + next = getnext(current) + local tmp = next and getnext(next) or nil -- needs checking + local changestop = next == stop + local tempcurrent = copy_node(next) + copyinjection(tempcurrent,next) + local nextcurrent = copy_node(current) + copyinjection(nextcurrent,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set + setlink(tempcurrent,nextcurrent) + setprop(tempcurrent,a_state,s_blwf) + tempcurrent = processcharacters(tempcurrent,font) + setprop(tempcurrent,a_state,unsetvalue) + if getchar(next) == getchar(tempcurrent) then + flush_list(tempcurrent) + local n = copy_node(current) + copyinjection(n,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set + setchar(current,dotted_circle) + head = insert_node_after(head, current, n) + else + setchar(current,getchar(tempcurrent)) -- we assumes that the result of blwf consists of one node + local freenode = getnext(current) + setlink(current,tmp) + flush_node(freenode) + flush_list(tempcurrent) + if changestop then + stop = current end end end @@ -1130,41 +1111,39 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak return head, start, true end --- todo: way more caching of attributes and font - --- Reph’s original position is always at the beginning of the syllable, (i.e. it is not reordered at the character reordering stage). --- However, it will be reordered according to the basic-forms shaping results. --- Possible positions for reph, depending on the script, are; after main, before post-base consonant forms, --- and after post-base consonant forms. - --- 1 If reph should be positioned after post-base consonant forms, proceed to step 5. --- 2 If the reph repositioning class is not after post-base: target position is after the first explicit halant glyph between --- the first post-reph consonant and last main consonant. If ZWJ or ZWNJ are following this halant, position is moved after it. --- If such position is found, this is the target position. Otherwise, proceed to the next step. --- Note: in old-implementation fonts, where classifications were fixed in shaping engine, --- there was no case where reph position will be found on this step. --- 3 If reph should be repositioned after the main consonant: from the first consonant not ligated with main, --- or find the first consonant that is not a potential pre-base reordering Ra. --- 4 If reph should be positioned before post-base consonant, find first post-base classified consonant not ligated with main. --- If no consonant is found, the target position should be before the first matra, syllable modifier sign or vedic sign. --- 5 If no consonant is found in steps 3 or 4, move reph to a position immediately before the first post-base matra, --- syllable modifier sign or vedic sign that has a reordering class after the intended reph position. --- For example, if the reordering position for reph is post-main, it will skip above-base matras that also have a post-main position. --- 6 Otherwise, reorder reph to the end of the syllable. - --- hm, this only looks at the start of a nodelist ... is this supposed to be line based? +-- Reph’s original position is always at the beginning of the syllable, (i.e. it is +-- not reordered at the character reordering stage). However, it will be reordered +-- according to the basic-forms shaping results. Possible positions for reph, +-- depending on the script, are; after main, before post-base consonant forms, and +-- after post-base consonant forms. + +-- In Devanagari reph has reordering position 'before postscript' and dev2 only +-- follows step 2, 4, and 6. function handlers.devanagari_reorder_reph(head,start) - -- since in Devanagari reph has reordering position 'before postscript' dev2 only follows step 2, 4, and 6, - -- the other steps are still ToDo (required for scripts other than dev2) local current = getnext(start) local startnext = nil local startprev = nil local startfont = getfont(start) local startattr = getprop(start,a_syllabe) + -- + ::step_1:: + -- + -- If reph should be positioned after post-base consonant forms, proceed to step 5. + -- + ::step_2:: + -- + -- If the reph repositioning class is not after post-base: target position is after + -- the first explicit halant glyph between the first post-reph consonant and last + -- main consonant. If ZWJ or ZWNJ are following this halant, position is moved after + -- it. If such position is found, this is the target position. Otherwise, proceed to + -- the next step. Note: in old-implementation fonts, where classifications were + -- fixed in shaping engine, there was no case where reph position will be found on + -- this step. + -- while current do local char = ischar(current,startfont) - if char and getprop(current,a_syllabe) == startattr then -- step 2 + if char and getprop(current,a_syllabe) == startattr then if halant[char] and not getprop(current,a_state) then local next = getnext(current) if next then @@ -1188,11 +1167,25 @@ function handlers.devanagari_reorder_reph(head,start) break end end + ::step_3:: + -- + -- If reph should be repositioned after the main consonant: from the first consonant + -- not ligated with main, or find the first consonant that is not a potential + -- pre-base reordering Ra. + -- + -- Kai: todo + -- + ::step_4:: + -- + -- If reph should be positioned before post-base consonant, find first post-base + -- classified consonant not ligated with main. If no consonant is found, the target + -- position should be before the first matra, syllable modifier sign or vedic sign. + -- if not startnext then current = getnext(start) while current do local char = ischar(current,startfont) - if char and getprop(current,a_syllabe) == startattr then -- step 4 + if char and getprop(current,a_syllabe) == startattr then if getprop(current,a_state) == s_pstf then -- post-base startnext = getnext(start) head = remove_node(head,start) @@ -1209,16 +1202,22 @@ function handlers.devanagari_reorder_reph(head,start) end end end - -- todo: determine position for reph with reordering position other than 'before postscript' - -- (required for scripts other than dev2) - -- leaks + -- + ::step_5:: + -- + -- If no consonant is found in steps 3 or 4, move reph to a position immediately + -- before the first post-base matra, syllable modifier sign or vedic sign that has a + -- reordering class after the intended reph position. For example, if the reordering + -- position for reph is post-main, it will skip above-base matras that also have a + -- post-main position. + -- if not startnext then current = getnext(start) local c = nil while current do local char = ischar(current,startfont) - if char and getprop(current,a_syllabe) == startattr then -- step 5 - if not c and mark_above_below_post[char] and reorder_class[char] ~= "after subscript" then + if char and getprop(current,a_syllabe) == startattr then + if not c and mark_above_below_post[char] and after_subscript[char] then c = current end current = getnext(current) @@ -1238,13 +1237,17 @@ function handlers.devanagari_reorder_reph(head,start) startattr = getprop(start,a_syllabe) end end - -- leaks + -- + ::step_6:: + -- + -- Otherwise, reorder reph to the end of the syllable. + -- if not startnext then current = start local next = getnext(current) while next do local nextchar = ischar(next,startfont) - if nextchar and getprop(next,a_syllabe) == startattr then --step 6 + if nextchar and getprop(next,a_syllabe) == startattr then current = next next = getnext(current) else @@ -1264,13 +1267,13 @@ function handlers.devanagari_reorder_reph(head,start) return head, start, true end --- we can cache some checking (v) - -- If a pre-base reordering consonant is found, reorder it according to the following rules: -- --- 1 Only reorder a glyph produced by substitution during application of the feature. --- (Note that a font may shape a Ra consonant with the feature generally but block it in certain contexts.) --- 2 Try to find a target position the same way as for pre-base matra. If it is found, reorder pre-base consonant glyph. +-- 1 Only reorder a glyph produced by substitution during application of the feature. (Note +-- that a font may shape a Ra consonant with the feature generally but block it in certain +-- contexts.) +-- 2 Try to find a target position the same way as for pre-base matra. If it is found, reorder +-- pre-base consonant glyph. -- 3 If position is not found, reorder immediately before main consonant. -- Here we implement a few handlers: @@ -1358,13 +1361,13 @@ function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replaceme setnext(prev) end if head == start then - head = stop + head = stop end flush_list(start) return head, stop, true end -local function dev2_initialize(font,attr) +local function initialize_two(font,attr) local devanagari = fontdata[font].resources.devanagari @@ -1379,9 +1382,9 @@ end -- this one will be merged into the caller: it saves a call, but we will then make function -- of the actions -local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pass over (determine stop in sweep) +local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pass over (determine stop in sweep) - local seqsubset, reorderreph = dev2_initialize(font,attr) + local seqsubset, reorderreph = initialize_two(font,attr) local reph = false -- was nil ... probably went unnoticed because never assigned local halfpos = nil @@ -1392,7 +1395,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa for i=1,#seqsubset do - -- maybe quit if start == stop + -- this can be done more efficient, the last test and less getnext local subset = seqsubset[i] local kind = subset[1] @@ -1411,8 +1414,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa if found[n] then --above-base: rphf Consonant + Halant local afternext = next ~= stop and getnext(next) if afternext and zw_char[getchar(afternext)] then -- ZWJ and ZWNJ prevent creation of reph - current = next - current = getnext(current) + current = afternext -- getnext(next) elseif current == start then setprop(current,a_state,s_rphf) current = next @@ -1559,7 +1561,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa if halant[getchar(current)] then setnext(getnext(current),tmp) local nc = copy_node(current) - copyinjection(nc,current) + copyinjection(nc,current) setchar(current,dotted_circle) head = insert_node_after(head,current,nc) else @@ -1957,7 +1959,7 @@ local function analyze_next_chars_two(c,font) if not v then return c end - if v == c_anudatta then + if anudatta[v] then c = n n = getnext(c) if not n then @@ -2056,10 +2058,12 @@ local function analyze_next_chars_two(c,font) end end -local function inject_syntax_error(head,current,mark) +local show_syntax_errors = false + +local function inject_syntax_error(head,current,char) local signal = copy_node(current) - copyinjection(signal,current) - if mark == pre_mark then -- THIS IS WRONG: pre_mark is a table + copyinjection(signal,current) + if pre_mark[char] then setchar(signal,dotted_circle) else setchar(current,dotted_circle) @@ -2070,21 +2074,21 @@ end -- It looks like these two analyzers were written independently but they share -- a lot. Common code has been synced. -function methods.deva(head,font,attr) +local function method_one(head,font,attr) head = tonut(head) local current = head local start = true local done = false local nbspaces = 0 while current do - local char = ischar(current,font) + local char = ischar(current,font) if char then done = true local syllablestart = current local syllableend = nil local c = current local n = getnext(c) - local first = char + local first = char if n and ra[first] then local second = ischar(n,font) if second and halant[second] then @@ -2116,10 +2120,10 @@ function methods.deva(head,font,attr) end if standalone then -- stand alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] - local syllableend = analyze_next_chars_one(c,font,2) - current = getnext(syllableend) + local syllableend = analyze_next_chars_one(c,font,2) + current = getnext(syllableend) if syllablestart ~= syllableend then - head, current, nbspaces = deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head, current, nbspaces = reorder_one(head,syllablestart,syllableend,font,attr,nbspaces) current = getnext(current) end else @@ -2225,7 +2229,7 @@ function methods.deva(head,font,attr) end end if syllablestart ~= syllableend then - head, current, nbspaces = deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head, current, nbspaces = reorder_one(head,syllablestart,syllableend,font,attr,nbspaces) current = getnext(current) end elseif independent_vowel[char] then @@ -2247,9 +2251,11 @@ function methods.deva(head,font,attr) end end else - local mark = mark_four[char] - if mark then - head, current = inject_syntax_error(head,current,mark) + if show_syntax_errors then + local mark = mark_four[char] + if mark then + head, current = inject_syntax_error(head,current,char) + end end current = getnext(current) end @@ -2264,15 +2270,13 @@ function methods.deva(head,font,attr) head = replace_all_nbsp(head) end - head = tonode(head) - - return head, done + return tonode(head), done end -- there is a good change that when we run into one with subtype < 256 that the rest is also done -- so maybe we can omit this check (it's pretty hard to get glyphs in the stream out of the blue) -function methods.dev2(head,font,attr) +local function method_two(head,font,attr) head = tonut(head) local current = head local start = true @@ -2296,7 +2300,7 @@ function methods.dev2(head,font,attr) local nextnextchar = ischar(n,font) if nextnextchar then c = n - char = nextnextchar + char = nextnextchar end end end @@ -2343,14 +2347,14 @@ function methods.dev2(head,font,attr) end end if syllableend and syllablestart ~= syllableend then - head, current, nbspaces = dev2_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head, current, nbspaces = reorder_two(head,syllablestart,syllableend,font,attr,nbspaces) end - if not syllableend then + if not syllableend and show_syntax_errors then local char = ischar(current,font) if char and not getprop(current,a_state) then local mark = mark_four[char] if mark then - head, current = inject_syntax_error(head,current,mark) + head, current = inject_syntax_error(head,current,char) end end end @@ -2362,10 +2366,10 @@ function methods.dev2(head,font,attr) head = replace_all_nbsp(head) end - head = tonode(head) - - return head, done + return tonode(head), done end -methods.mlym = methods.deva -methods.mlm2 = methods.dev2 +for i=1,nofscripts do + methods[scripts_one[i]] = method_one + methods[scripts_two[i]] = method_two +end diff --git a/tex/context/base/mkiv/font-ota.lua b/tex/context/base/mkiv/font-ota.lua index 9c6ee7403..de626c120 100644 --- a/tex/context/base/mkiv/font-ota.lua +++ b/tex/context/base/mkiv/font-ota.lua @@ -248,11 +248,11 @@ local function warning(current,what) end local mappers = allocate { - l = s_init, -- left - d = s_medi, -- double - c = s_medi, -- joiner - r = s_fina, -- right - u = s_isol, -- nonjoiner + l = s_init, -- left + d = s_medi, -- double + c = s_medi, -- joiner + r = s_fina, -- right + u = s_isol, -- nonjoiner } -- we can also use this trick for devanagari diff --git a/tex/context/base/mkiv/font-ots.lua b/tex/context/base/mkiv/font-ots.lua index 3e338f614..25083dfce 100644 --- a/tex/context/base/mkiv/font-ots.lua +++ b/tex/context/base/mkiv/font-ots.lua @@ -936,7 +936,7 @@ function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,st elseif b then -- #b > 0 local x, y, w, h = setposition(2,snext,factor,rlmode,b,injection) if trace_kerns then - local startchar = getchar(snext) + local startchar = getchar(start) logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") end start = snext -- cf spec diff --git a/tex/context/base/mkiv/font-pre.mkiv b/tex/context/base/mkiv/font-pre.mkiv index d09d871f0..b49bc560e 100644 --- a/tex/context/base/mkiv/font-pre.mkiv +++ b/tex/context/base/mkiv/font-pre.mkiv @@ -191,59 +191,139 @@ [semitic-simple] [script=hebr] -% \definefont [DevaOne] [file:chandas.ttf*devanagari-one at 12pt] -% \definefont [DevaTwo] [file:kokila.ttf*devanagari-two at 18pt] +% indic \definefontfeature - [devanagari-one] + [indic-common] [mode=node, language=dflt, - script=deva, + % localized + locl=yes, + % positioning + kern=yes, + dist=yes, + % above/below base marks + abvm=yes, + blwm=yes, + % basic shaping nukt=yes, akhn=yes, rphf=yes, - blwf=yes, - half=yes, - vatu=yes, + % presentation pres=yes, abvs=yes, blws=yes, psts=yes, haln=yes, - abvm=yes, - blwm=yes, - dist=yes] + calt=yes] \definefontfeature - [devanagari-two] [devanagari-one] - [script=dev2, - locl=yes, - pref=yes, + [indic-common] + [script=deva, + % basic shaping rkrf=yes, + blwf=yes, + half=yes, + vatu=yes, + cjct=yes] + +\definefontfeature + [bengali-one] + [indic-common] + [script=beng, + % basic shaping + blwf=yes, + half=yes, pstf=yes, + vatu=yes, cjct=yes, - init=yes, - calt=yes, - kern=yes] + % presentation + init=yes] \definefontfeature - [malayalam-one] - [mode=node, - language=dflt, - script=mlym, - akhn=yes, + [gujarati-one] + [indic-common] + [script=gujr, + % basic shaping + rkrf=yes, blwf=yes, half=yes, - pres=yes, - blws=yes, - psts=yes, - haln=no] + vatu=yes, + cjct=yes] + +\definefontfeature + [gurmukhi-one] + [indic-common] + [script=guru, + % basic shaping + blwf=yes, + half=yes, + pstf=yes, + vatu=yes, + cjct=yes] + +\definefontfeature + [kannada-one] + [indic-common] + [script=knda, + % basic shaping + pref=yes, + blwf=yes, + half=yes, + pstf=yes, + cjct=yes] \definefontfeature - [malayalam-two] [malayalam-one] - [script=mlm2] + [indic-common] + [script=mlym, + % basic shaping + pref=yes, + blwf=yes, + half=yes, + pstf=yes, + cjct=yes] + +\definefontfeature + [oriya-one] + [indic-common] + [script=orya, + % basic shaping + blwf=yes, + pstf=yes, + cjct=yes] + +\definefontfeature + [tamil-one] + [indic-common] + [script=taml, + % basic shaping + pref=yes, + half=yes] + +\definefontfeature + [telugu-one] + [indic-common] + [script=telu, + % basic shaping + pref=yes, + blwf=yes, + half=yes, + pstf=yes, + cjct=yes] + +\definefontfeature [devanagari-two] [devanagari-one] [script=dev2] +\definefontfeature [bengali-two] [bengali-one] [script=bng2] +\definefontfeature [gujarati-two] [gujarati-one] [script=gjr2] +\definefontfeature [gurmukhi-two] [gurmukhi-one] [script=gur2] +\definefontfeature [kannada-two] [kannada-one] [script=knd2] +\definefontfeature [malayalam-two] [malayalam-one] [script=mlm2] +\definefontfeature [oriya-two] [oriya-one] [script=ory2] +\definefontfeature [tamil-two] [tamil-one] [script=tml2] +\definefontfeature [telugu-two] [telugu-one] [script=tel2] + +% cjk \definefontfeature [jamoforms] @@ -251,8 +331,6 @@ tjmo=yes, vjmo=yes] -% cjk - % \definefontfeature % [japanese] % [default] diff --git a/tex/context/base/mkiv/font-sel.lua b/tex/context/base/mkiv/font-sel.lua index 0cf51cad3..e7f56047b 100644 --- a/tex/context/base/mkiv/font-sel.lua +++ b/tex/context/base/mkiv/font-sel.lua @@ -943,5 +943,5 @@ implement { implement { name = "definefontfamilypreset", actions = selectfont.definefontfamilypreset, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/grph-fil.lua b/tex/context/base/mkiv/grph-fil.lua index 3c069da37..540356c46 100644 --- a/tex/context/base/mkiv/grph-fil.lua +++ b/tex/context/base/mkiv/grph-fil.lua @@ -101,6 +101,6 @@ end interfaces.implement { name = "runcontextjob", - arguments = { "string", "string" }, + arguments = "2 strings", actions = { jobfiles.context, context } } diff --git a/tex/context/base/mkiv/grph-inc.lua b/tex/context/base/mkiv/grph-inc.lua index 47eb7bbbb..f2d7847eb 100644 --- a/tex/context/base/mkiv/grph-inc.lua +++ b/tex/context/base/mkiv/grph-inc.lua @@ -487,7 +487,7 @@ function figures.setpaths(locationset,pathlist) end end -implement { name = "setfigurepaths", actions = figures.setpaths, arguments = { "string", "string" } } +implement { name = "setfigurepaths", actions = figures.setpaths, arguments = "2 strings" } -- check conversions and handle it here @@ -2014,7 +2014,7 @@ local ctx_doexternalfigurerepeat = context.doexternalfigurerepeat implement { name = "figure_register_page", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(a,b,c) registered[#registered+1] = { a, b, c } context(#registered) diff --git a/tex/context/base/mkiv/java-ini.lua b/tex/context/base/mkiv/java-ini.lua index 069eb5ab6..61ab15e7a 100644 --- a/tex/context/base/mkiv/java-ini.lua +++ b/tex/context/base/mkiv/java-ini.lua @@ -246,13 +246,13 @@ implement { implement { name = "setjavascriptpreamble", actions = javascripts.setpreamble, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "addtojavascriptpreamble", actions = javascripts.addtopreamble, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/l-macro.lua b/tex/context/base/mkiv/l-macro.lua index d2b8c7ae4..30c7cbec6 100644 --- a/tex/context/base/mkiv/l-macro.lua +++ b/tex/context/base/mkiv/l-macro.lua @@ -14,7 +14,8 @@ if not modules then modules = { } end modules ['l-macros'] = { local S, P, R, V, C, Cs, Cc, Ct, Carg = lpeg.S, lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Carg local lpegmatch = lpeg.match local concat = table.concat -local next = next +local format, sub = string.format, string.sub +local next, load, type = next, load, type local newline = S("\n\r")^1 local continue = P("\\") * newline @@ -41,6 +42,15 @@ local definitions = { } local resolve local subparser +local report_lua = function(...) + if logs and logs.reporter then + report_lua = logs.reporter("system","lua") + report_lua(...) + else + print(format(...)) + end +end + -- todo: zero case resolve = C(C(name) * arguments^-1) / function(raw,s,a) @@ -160,6 +170,66 @@ function macros.resolving() return next(patterns) end +local function loaded(name,trace,detail) + -- local c = io.loaddata(fullname) -- not yet available + local f = io.open(name,"rb") + if not f then + return false, format("file '%s' not found",name) + end + local c = f:read("*a") + if not c then + return false, format("file '%s' is invalid",name) + end + f:close() + local n = lpegmatch(parser,c) + if trace then + if #n ~= #c then + report_lua("macros expanded in '%s' (%i => %i bytes)",name,#c,#n) + if detail then + report_lua() + report_lua(n) + report_lua() + end + elseif detail then + report_lua("no macros expanded in '%s'",name) + end + end + if #name > 30 then + n = "--[[" .. sub(name,-30) .. "]] " .. n + else + n = "--[[" .. name .. "]] " .. n + end + return load(n) +end + +macros.loaded = loaded + +function required(name,trace) + local filename = file.addsuffix(name,"lua") + local fullname = resolvers and resolvers.find_file(filename) or filename + if not fullname or fullname == "" then + return false + end + local codeblob = package.loaded[fullname] + if codeblob then + return codeblob + end + local code, message = loaded(fullname,macros,trace,trace) + if type(code) == "function" then + code = code() + else + report_lua("error when loading '%s'",fullname) + return false, message + end + if code == nil then + code = false + end + package.loaded[fullname] = code + return code +end + +macros.required = required + -- local str = [[ -- #define check(p,q) (p ~= 0) and (p > q) -- diff --git a/tex/context/base/mkiv/l-package.lua b/tex/context/base/mkiv/l-package.lua index d43c5c5c6..4faee76bf 100644 --- a/tex/context/base/mkiv/l-package.lua +++ b/tex/context/base/mkiv/l-package.lua @@ -18,12 +18,12 @@ if not modules then modules = { } end modules ['l-package'] = { local type = type local gsub, format, find = string.gsub, string.format, string.find +local insert, remove = table.insert, table.remove local P, S, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.Cs, lpeg.match -local package = package -local searchers = package.searchers or package.loaders -local insert, remove = table.insert, table.remove +local package = package +local searchers = package.searchers or package.loaders -------.loaders = nil -- old stuff that we don't want -------.seeall = nil -- old stuff that we don't want diff --git a/tex/context/base/mkiv/l-table.lua b/tex/context/base/mkiv/l-table.lua index 9d7152544..5cd65dd67 100644 --- a/tex/context/base/mkiv/l-table.lua +++ b/tex/context/base/mkiv/l-table.lua @@ -420,7 +420,7 @@ end -- todo : copy without metatable -local function copy(t, tables) -- taken from lua wiki, slightly adapted +local function copy(t,tables) -- taken from lua wiki, slightly adapted tables = tables or { } local tcopy = { } if not tables[t] then @@ -431,7 +431,7 @@ local function copy(t, tables) -- taken from lua wiki, slightly adapted if tables[i] then i = tables[i] else - i = copy(i, tables) + i = copy(i,tables) end end if type(v) ~= "table" then @@ -439,7 +439,7 @@ local function copy(t, tables) -- taken from lua wiki, slightly adapted elseif tables[v] then tcopy[i] = tables[v] else - tcopy[i] = copy(v, tables) + tcopy[i] = copy(v,tables) end end local mt = getmetatable(t) @@ -1225,10 +1225,10 @@ function table.reversed(t) end end -function table.reverse(t) +function table.reverse(t) -- check with 5.3 ? if t then local n = #t - for i=1,floor(n/2) do + for i=1,floor(n/2) do -- maybe just n//2 local j = n - i + 1 t[i], t[j] = t[j], t[i] end diff --git a/tex/context/base/mkiv/lang-hyp.lua b/tex/context/base/mkiv/lang-hyp.lua index f73a51b3a..e29446b65 100644 --- a/tex/context/base/mkiv/lang-hyp.lua +++ b/tex/context/base/mkiv/lang-hyp.lua @@ -980,7 +980,7 @@ featureset.hyphenonly = hyphenonly == v_yes implement { name = "registerhyphenationexception", actions = traditional.registerexception, - arguments = { "string", "string" } + arguments = "2 strings", } -- This is a relative large function with local variables and local functions. A previous @@ -1725,7 +1725,7 @@ featureset.hyphenonly = hyphenonly == v_yes implement { name = "showhyphenationtrace", actions = hyphenators.showhyphenationtrace, - arguments = { "string", "string" } + arguments = "2 strings", } function nodes.stripdiscretionaries(head) diff --git a/tex/context/base/mkiv/lang-ini.lua b/tex/context/base/mkiv/lang-ini.lua index 6d202ff5a..30e086e15 100644 --- a/tex/context/base/mkiv/lang-ini.lua +++ b/tex/context/base/mkiv/lang-ini.lua @@ -612,7 +612,7 @@ end) implement { name = "languagenumber", actions = { languages.getnumber, context }, - arguments = { "string", "string", "string", "string" } + arguments = "4 strings" } implement { @@ -623,25 +623,25 @@ implement { implement { name = "definelanguage", actions = languages.define, - arguments = { "string", "string" } + arguments = "2 strings" } implement { name = "setlanguagesynonym", actions = languages.setsynonym, - arguments = { "string", "string" } + arguments = "2 strings" } implement { name = "unloadlanguage", actions = languages.unload, - arguments = { "string" } + arguments = "string" } implement { name = "setlanguageexceptions", actions = languages.setexceptions, - arguments = { "string", "string" } + arguments = "2 strings" } implement { diff --git a/tex/context/base/mkiv/lang-rep.lua b/tex/context/base/mkiv/lang-rep.lua index 172454fc2..a5c4d97c8 100644 --- a/tex/context/base/mkiv/lang-rep.lua +++ b/tex/context/base/mkiv/lang-rep.lua @@ -366,11 +366,11 @@ implement { implement { name = "addreplacements", actions = replacements.add, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { name = "addreplacementslist", actions = replacements.addlist, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/lang-url.lua b/tex/context/base/mkiv/lang-url.lua index 651c6bd52..95d959206 100644 --- a/tex/context/base/mkiv/lang-url.lua +++ b/tex/context/base/mkiv/lang-url.lua @@ -214,7 +214,7 @@ end implement { name = "sethyphenatedurlcharacters", actions = urls.setcharacters, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/lang-wrd.lua b/tex/context/base/mkiv/lang-wrd.lua index b00375cc0..7363dbb31 100644 --- a/tex/context/base/mkiv/lang-wrd.lua +++ b/tex/context/base/mkiv/lang-wrd.lua @@ -420,6 +420,6 @@ implement { implement { name = "loadspellchecklist", - arguments = { "string", "string" }, + arguments = "2 strings", actions = words.load } diff --git a/tex/context/base/mkiv/lpdf-epd.lua b/tex/context/base/mkiv/lpdf-epd.lua index 2fcd28473..cf02b5a22 100644 --- a/tex/context/base/mkiv/lpdf-epd.lua +++ b/tex/context/base/mkiv/lpdf-epd.lua @@ -374,6 +374,8 @@ local function get_array(object,document) end end +-- todo: collect chunks + local function streamaccess(s,_,what) if not what or what == "all" or what == "*all" then local t, n = { }, 0 diff --git a/tex/context/base/mkiv/lpdf-ini.lua b/tex/context/base/mkiv/lpdf-ini.lua index f8cff2032..8af1fb409 100644 --- a/tex/context/base/mkiv/lpdf-ini.lua +++ b/tex/context/base/mkiv/lpdf-ini.lua @@ -1082,10 +1082,28 @@ end do + -- It's a bit of a historical mess here. + + local metadata = nil local timestamp = backends.timestamp() - function lpdf.timestamp() - return timestamp + function lpdf.getmetadata() + if not metadata then + local contextversion = environment.version + local luatexversion = format("%1.2f",LUATEXVERSION) + local luatexfunctionality = tostring(LUATEXFUNCTIONALITY) + metadata = { + producer = format("LuaTeX-%s",luatexversion), + creator = format("LuaTeX %s %s + ConTeXt MkIV %s",luatexversion,luatexfunctionality,contextversion), + luatexversion = luatexversion, + contextversion = contextversion, + luatexfunctionality = luatexfunctionality, + luaversion = tostring(LUAVERSION), + platform = os.platform, + time = timestamp, + } + end + return metadata end function lpdf.settime(n) @@ -1096,6 +1114,9 @@ do timestamp = backends.timestamp() end end + if metadata then + metadata.time = timestamp + end return timestamp end @@ -1107,10 +1128,11 @@ do end function lpdf.id(nodate) + local banner = environment.jobname or tex.jobname or "unknown" if nodate then - return tex.jobname + return banner else - return format("%s.%s",tex.jobname,timestamp) + return format("%s.%s",banner,timestamp) end end diff --git a/tex/context/base/mkiv/lpdf-mis.lua b/tex/context/base/mkiv/lpdf-mis.lua index 07dc3dcf1..6d1b09ca0 100644 --- a/tex/context/base/mkiv/lpdf-mis.lua +++ b/tex/context/base/mkiv/lpdf-mis.lua @@ -52,6 +52,8 @@ local addtoinfo = lpdf.addtoinfo local addtopageattributes = lpdf.addtopageattributes local addtonames = lpdf.addtonames +local pdfgetmetadata = lpdf.getmetadata + local variables = interfaces.variables local v_stop = variables.stop @@ -189,6 +191,12 @@ local done = false -- using "setupidentity = function() end" fails as the meani local function setupidentity() if not done then + local metadata = pdfgetmetadata() + local creator = metadata.creator + local version = metadata.contextversion + local time = metadata.time + local jobname = environment.jobname or tex.jobname or "unknown" + -- local title = identity.title if not title or title == "" then title = tex.jobname @@ -202,21 +210,16 @@ local function setupidentity() if author ~= "" then addtoinfo("Author", pdfunicode(author), author) -- '/Author' in /Info, 'Creator' in XMP end - -- local creator = identity.creator or "" - local creator = "LuaTeX + ConTeXt MkIV" -- has to be the same in CreatorTool - if creator ~= "" then - addtoinfo("Creator", pdfunicode(creator), creator) -- '/Creator' in /Info, 'CreatorTool' in XMP - end - local currenttimestamp = lpdf.timestamp() - addtoinfo("CreationDate", pdfstring(formattedtimestamp(currenttimestamp))) + addtoinfo("Creator", pdfunicode(creator), creator) + addtoinfo("CreationDate", pdfstring(formattedtimestamp(time))) local date = identity.date or "" - local pdfdate = formattedtimestamp(date) + local pdfdate = date and formattedtimestamp(date) if pdfdate then addtoinfo("ModDate", pdfstring(pdfdate), date) else -- users should enter the date in 2010-01-19T23:27:50+01:00 format -- and if not provided that way we use the creation time instead - addtoinfo("ModDate", pdfstring(formattedtimestamp(currenttimestamp)), currenttimestamp) + addtoinfo("ModDate", pdfstring(formattedtimestamp(time)),time) end local keywords = identity.keywords or "" if keywords ~= "" then @@ -226,11 +229,12 @@ local function setupidentity() local id = lpdf.id() addtoinfo("ID", pdfstring(id), id) -- needed for pdf/x -- - addtoinfo("ConTeXt.Version", environment.version) - addtoinfo("ConTeXt.Time", os.date("%Y-%m-%d %H:%M")) - addtoinfo("ConTeXt.Jobname", environment.jobname or tex.jobname) - addtoinfo("ConTeXt.Url", "www.pragma-ade.com") - addtoinfo("ConTeXt.Support", "contextgarden.net") + addtoinfo("ConTeXt.Version",version) + addtoinfo("ConTeXt.Time",os.date("%Y-%m-%d %H:%M")) + addtoinfo("ConTeXt.Jobname",jobname) + addtoinfo("ConTeXt.Url","www.pragma-ade.com") + addtoinfo("ConTeXt.Support","contextgarden.net") + addtoinfo("TeX.Support","tug.org") -- done = true else diff --git a/tex/context/base/mkiv/lpdf-pda.xml b/tex/context/base/mkiv/lpdf-pda.xml index 78ad47f21..efdfc4d7d 100644 --- a/tex/context/base/mkiv/lpdf-pda.xml +++ b/tex/context/base/mkiv/lpdf-pda.xml @@ -24,12 +24,17 @@ + + - - + + + + + diff --git a/tex/context/base/mkiv/lpdf-pdx.xml b/tex/context/base/mkiv/lpdf-pdx.xml index d55e1fdf3..889862c76 100644 --- a/tex/context/base/mkiv/lpdf-pdx.xml +++ b/tex/context/base/mkiv/lpdf-pdx.xml @@ -23,12 +23,17 @@ + + - - + + + + + diff --git a/tex/context/base/mkiv/lpdf-pua.xml b/tex/context/base/mkiv/lpdf-pua.xml index c50e1f05b..f985b54d3 100644 --- a/tex/context/base/mkiv/lpdf-pua.xml +++ b/tex/context/base/mkiv/lpdf-pua.xml @@ -23,12 +23,17 @@ + + - - + + + + + diff --git a/tex/context/base/mkiv/lpdf-xmp.lua b/tex/context/base/mkiv/lpdf-xmp.lua index 2eb573acb..eb15a3582 100644 --- a/tex/context/base/mkiv/lpdf-xmp.lua +++ b/tex/context/base/mkiv/lpdf-xmp.lua @@ -27,6 +27,8 @@ local pdfconstant = lpdf.constant local pdfreference = lpdf.reference local pdfflushstreamobject = lpdf.flushstreamobject +local pdfgetmetadata = lpdf.getmetadata + -- The XMP packet wrapper is kind of fixed, see page 10 of XMPSpecificationsPart1.pdf from -- XMP-Toolkit-SDK-CC201607.zip. So we hardcode the id. @@ -39,47 +41,52 @@ local xpacket = format ( [[ local mapping = { -- user defined keys (pdfx:) - ["ConTeXt.Jobname"] = { "context", "rdf:Description/pdfx:ConTeXt.Jobname" }, - ["ConTeXt.Time"] = { "date", "rdf:Description/pdfx:ConTeXt.Time" }, - ["ConTeXt.Url"] = { "context", "rdf:Description/pdfx:ConTeXt.Url" }, - ["ConTeXt.Version"] = { "context", "rdf:Description/pdfx:ConTeXt.Version" }, - ["ID"] = { "id", "rdf:Description/pdfx:ID" }, -- has date - ["PTEX.Fullbanner"] = { "metadata","rdf:Description/pdfx:PTEX.Fullbanner" }, + ["ConTeXt.Jobname"] = { "context", "rdf:Description/pdfx:ConTeXt.Jobname" }, + ["ConTeXt.Time"] = { "date", "rdf:Description/pdfx:ConTeXt.Time" }, + ["ConTeXt.Url"] = { "context", "rdf:Description/pdfx:ConTeXt.Url" }, + ["ConTeXt.Support"] = { "context", "rdf:Description/pdfx:ConTeXt.Support" }, + ["ConTeXt.Version"] = { "context", "rdf:Description/pdfx:ConTeXt.Version" }, + ["TeX.Support"] = { "metadata", "rdf:Description/pdfx:TeX.Support" }, + ["LuaTeX.Version"] = { "metadata","rdf:Description/pdfx:LuaTeX.Version" }, + ["LuaTeX.Functionality"] = { "metadata","rdf:Description/pdfx:LuaTeX.Functionality" }, + ["LuaTeX.LuaVersion"] = { "metadata","rdf:Description/pdfx:LuaTeX.LuaVersion" }, + ["LuaTeX.Platform"] = { "metadata","rdf:Description/pdfx:LuaTeX.Platform" }, + ["ID"] = { "id", "rdf:Description/pdfx:ID" }, -- has date -- Adobe PDF schema - ["Keywords"] = { "metadata","rdf:Description/pdf:Keywords" }, - ["Producer"] = { "metadata","rdf:Description/pdf:Producer" }, - -- ["Trapped"] = { "pdf", "rdf:Description/pdf:Trapped" }, -- '/False' in /Info, but 'False' in XMP + ["Keywords"] = { "metadata","rdf:Description/pdf:Keywords" }, + ["Producer"] = { "metadata","rdf:Description/pdf:Producer" }, + -- ["Trapped"] = { "pdf", "rdf:Description/pdf:Trapped" }, -- '/False' in /Info, but 'False' in XMP -- Dublin Core schema - ["Author"] = { "metadata","rdf:Description/dc:creator/rdf:Seq/rdf:li" }, - ["Format"] = { "metadata","rdf:Description/dc:format" }, -- optional, but nice to have - ["Subject"] = { "metadata","rdf:Description/dc:description/rdf:Alt/rdf:li" }, - ["Title"] = { "metadata","rdf:Description/dc:title/rdf:Alt/rdf:li" }, + ["Author"] = { "metadata","rdf:Description/dc:creator/rdf:Seq/rdf:li" }, + ["Format"] = { "metadata","rdf:Description/dc:format" }, -- optional, but nice to have + ["Subject"] = { "metadata","rdf:Description/dc:description/rdf:Alt/rdf:li" }, + ["Title"] = { "metadata","rdf:Description/dc:title/rdf:Alt/rdf:li" }, -- XMP Basic schema - ["CreateDate"] = { "date", "rdf:Description/xmp:CreateDate" }, - ["CreationDate"] = { "date", "rdf:Description/xmp:CreationDate" }, -- dummy - ["Creator"] = { "metadata","rdf:Description/xmp:CreatorTool" }, - ["MetadataDate"] = { "date", "rdf:Description/xmp:MetadataDate" }, - ["ModDate"] = { "date", "rdf:Description/xmp:ModDate" }, -- dummy - ["ModifyDate"] = { "date", "rdf:Description/xmp:ModifyDate" }, + ["CreateDate"] = { "date", "rdf:Description/xmp:CreateDate" }, + ["CreationDate"] = { "date", "rdf:Description/xmp:CreationDate" }, -- dummy + ["Creator"] = { "metadata","rdf:Description/xmp:CreatorTool" }, + ["MetadataDate"] = { "date", "rdf:Description/xmp:MetadataDate" }, + ["ModDate"] = { "date", "rdf:Description/xmp:ModDate" }, -- dummy + ["ModifyDate"] = { "date", "rdf:Description/xmp:ModifyDate" }, -- XMP Media Management schema - ["DocumentID"] = { "id", "rdf:Description/xmpMM:DocumentID" }, -- uuid - ["InstanceID"] = { "id", "rdf:Description/xmpMM:InstanceID" }, -- uuid - ["RenditionClass"] = { "pdf", "rdf:Description/xmpMM:RenditionClass" }, -- PDF/X-4 - ["VersionID"] = { "pdf", "rdf:Description/xmpMM:VersionID" }, -- PDF/X-4 + ["DocumentID"] = { "id", "rdf:Description/xmpMM:DocumentID" }, -- uuid + ["InstanceID"] = { "id", "rdf:Description/xmpMM:InstanceID" }, -- uuid + ["RenditionClass"] = { "pdf", "rdf:Description/xmpMM:RenditionClass" }, -- PDF/X-4 + ["VersionID"] = { "pdf", "rdf:Description/xmpMM:VersionID" }, -- PDF/X-4 -- additional entries -- PDF/X - ["GTS_PDFXVersion"] = { "pdf", "rdf:Description/pdfxid:GTS_PDFXVersion" }, + ["GTS_PDFXVersion"] = { "pdf", "rdf:Description/pdfxid:GTS_PDFXVersion" }, -- optional entries -- all what is visible in the 'document properties --> additional metadata' window -- XMP Rights Management schema (optional) - ["Marked"] = { "pdf", "rdf:Description/xmpRights:Marked" }, - -- ["Owner"] = { "metadata", "rdf:Description/xmpRights:Owner/rdf:Bag/rdf:li" }, -- maybe useful (not visible) - -- ["UsageTerms"] = { "metadata", "rdf:Description/xmpRights:UsageTerms" }, -- maybe useful (not visible) - ["WebStatement"] = { "metadata", "rdf:Description/xmpRights:WebStatement" }, + ["Marked"] = { "pdf", "rdf:Description/xmpRights:Marked" }, + -- ["Owner"] = { "metadata", "rdf:Description/xmpRights:Owner/rdf:Bag/rdf:li" }, -- maybe useful (not visible) + -- ["UsageTerms"] = { "metadata", "rdf:Description/xmpRights:UsageTerms" }, -- maybe useful (not visible) + ["WebStatement"] = { "metadata", "rdf:Description/xmpRights:WebStatement" }, -- Photoshop PDF schema (optional) - ["AuthorsPosition"] = { "metadata", "rdf:Description/photoshop:AuthorsPosition" }, - ["Copyright"] = { "metadata", "rdf:Description/photoshop:Copyright" }, - ["CaptionWriter"] = { "metadata", "rdf:Description/photoshop:CaptionWriter" }, + ["AuthorsPosition"] = { "metadata", "rdf:Description/photoshop:AuthorsPosition" }, + ["Copyright"] = { "metadata", "rdf:Description/photoshop:Copyright" }, + ["CaptionWriter"] = { "metadata", "rdf:Description/photoshop:CaptionWriter" }, } pdf.setsuppressoptionalinfo( @@ -100,6 +107,12 @@ local included = backends.included local pdfsettrailerid = pdf.settrailerid +local lpdfid = lpdf.id + +function lpdf.id() -- overload of ini + return lpdfid(included.date) +end + pdf.disablecommand("settrailerid") function lpdf.settrailerid(v) @@ -144,14 +157,6 @@ function lpdf.setdates(v) end end -function lpdf.id() -- overload of ini - local banner = tex.jobname - if included.date then - return format("%s.%s",banner,lpdf.timestamp()) - else - return banner - end -end directives.register("backend.trailerid", lpdf.settrailerid) directives.register("backend.date", lpdf.setdates) @@ -251,38 +256,36 @@ local function flushxmpinfo() commands.pushrandomseed() commands.setrandomseed(os.time()) - local version = status.luatex_version - local revision = status.luatex_revision - local documentid = "no unique document id here" local instanceid = "no unique instance id here" - -- local producer = format("LuaTeX-%i.%02i.%s",math.div(version,100),math.mod(version,100),revision) - local producer = format("LuaTeX-%0.2f.%s",version/100,revision) - local creator = "LuaTeX + ConTeXt MkIV" - local time = lpdf.timestamp() - local fullbanner = status.banner + local metadata = pdfgetmetadata() + local time = metadata.time + local producer = metadata.producer + local creator = metadata.creator if included.id ~= "fake" then documentid = "uuid:" .. os.uuid() instanceid = "uuid:" .. os.uuid() end - pdfaddtoinfo("Producer", producer) - pdfaddtoinfo("Creator", creator) - pdfaddtoinfo("CreationDate", time) - pdfaddtoinfo("ModDate", time) - -- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence + pdfaddtoinfo("Producer",producer) + pdfaddtoinfo("Creator",creator) + pdfaddtoinfo("CreationDate",time) + pdfaddtoinfo("ModDate",time) if add_xmp_blob then - pdfaddxmpinfo("DocumentID", documentid) - pdfaddxmpinfo("InstanceID", instanceid) - pdfaddxmpinfo("Producer", producer) - pdfaddxmpinfo("CreatorTool", creator) - pdfaddxmpinfo("CreateDate", time) - pdfaddxmpinfo("ModifyDate", time) - pdfaddxmpinfo("MetadataDate", time) - pdfaddxmpinfo("PTEX.Fullbanner", fullbanner) + pdfaddxmpinfo("DocumentID",documentid) + pdfaddxmpinfo("InstanceID",instanceid) + pdfaddxmpinfo("Producer",producer) + pdfaddxmpinfo("CreatorTool",creator) + pdfaddxmpinfo("CreateDate",time) + pdfaddxmpinfo("ModifyDate",time) + pdfaddxmpinfo("MetadataDate",time) + pdfaddxmpinfo("LuaTeX.Version",metadata.luatexversion) + pdfaddxmpinfo("LuaTeX.Functionality",metadata.luatexfunctionality) + pdfaddxmpinfo("LuaTeX.LuaVersion",metadata.luaversion) + pdfaddxmpinfo("LuaTeX.Platform",metadata.platform) local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta")) local md = pdfdictionary { diff --git a/tex/context/base/mkiv/luat-ini.mkiv b/tex/context/base/mkiv/luat-ini.mkiv index 25ad7e139..872d27e77 100644 --- a/tex/context/base/mkiv/luat-ini.mkiv +++ b/tex/context/base/mkiv/luat-ini.mkiv @@ -265,16 +265,52 @@ % \def\syst_helpers_checked_stripped_csname#1% % {\if\noexpand#1\letterbackslash\else#1\fi} -\normalprotected\def\installctxfunction#1#2% +\normalprotected\def\installctxfunction#1#2% expandable {\edef\m_syst_name{\csstring#1}% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}} -\normalprotected\def\installctxscanner#1#2% +\normalprotected\def\installctxscanner#1#2% expandable {\edef\m_syst_name{\csstring#1}% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}} +\normalprotected\def\installprotectedctxfunction#1#2% protected + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax + \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}} + +\normalprotected\def\installprotectedctxscanner#1#2% protected + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax + \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}} + +% not yet used + +\ifdefined\luafunctioncall \else + \protected\def\luafunctioncall{\luafunctioncall} +\fi + +\normalprotected\def\installctxfunctioncall#1#2% + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax + \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}} + +\normalprotected\def\installctxscannercall#1#2% + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax + \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}} + +\normalprotected\def\installprotectedctxfunctioncall#1#2% + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax + \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}} + +\normalprotected\def\installprotectedctxscannercall#1#2% + {\edef\m_syst_name{\csstring#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax + \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}} + \normalprotected\def\resetctxscanner#1% {\edef\m_syst_name{\csstring#1}% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\zerocount diff --git a/tex/context/base/mkiv/luat-usr.lua b/tex/context/base/mkiv/luat-usr.lua index e7406782b..ebcb0f0e8 100644 --- a/tex/context/base/mkiv/luat-usr.lua +++ b/tex/context/base/mkiv/luat-usr.lua @@ -101,7 +101,7 @@ interfaces.implement { interfaces.implement { name = "luathread", actions = runthread, - arguments = { "string", "string" } + arguments = "2 strings", } -- local scanners = interfaces.scanners @@ -177,7 +177,7 @@ lua.registername = registername implement { name = "registernamedlua", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(name,message,csname) if csname and csname ~= "" then implement { diff --git a/tex/context/base/mkiv/lxml-css.lua b/tex/context/base/mkiv/lxml-css.lua index a4d15ba1f..1787c53df 100644 --- a/tex/context/base/mkiv/lxml-css.lua +++ b/tex/context/base/mkiv/lxml-css.lua @@ -985,11 +985,11 @@ end interfaces.implement { name = "xmlstylevalue", actions = css.stylevalue, - arguments = { "string", "string" }, + arguments = "2 strings", } interfaces.implement { name = "xmlmappedstylevalue", actions = css.mappedstylevalue, - arguments = { "string", "string", "string" }, + arguments = "3 strings", } diff --git a/tex/context/base/mkiv/lxml-ini.lua b/tex/context/base/mkiv/lxml-ini.lua index f7f882cee..b255477cb 100644 --- a/tex/context/base/mkiv/lxml-ini.lua +++ b/tex/context/base/mkiv/lxml-ini.lua @@ -23,16 +23,16 @@ local implement = interfaces.implement implement { name = "lxmlid", actions = lxml.getid, arguments = "string" } -implement { name = "xmldoif", actions = lxml.doif, arguments = { "string", "string" } } -implement { name = "xmldoifnot", actions = lxml.doifnot, arguments = { "string", "string" } } -implement { name = "xmldoifelse", actions = lxml.doifelse, arguments = { "string", "string" } } -implement { name = "xmldoiftext", actions = lxml.doiftext, arguments = { "string", "string" } } -implement { name = "xmldoifnottext", actions = lxml.doifnottext, arguments = { "string", "string" } } -implement { name = "xmldoifelsetext", actions = lxml.doifelsetext, arguments = { "string", "string" } } - -implement { name = "xmldoifempty", actions = lxml.doifempty, arguments = { "string", "string" } } -implement { name = "xmldoifnotempty", actions = lxml.doifnotempty, arguments = { "string", "string" } } -implement { name = "xmldoifelseempty", actions = lxml.doifelseempty, arguments = { "string", "string" } } +implement { name = "xmldoif", actions = lxml.doif, arguments = "2 strings" } +implement { name = "xmldoifnot", actions = lxml.doifnot, arguments = "2 strings" } +implement { name = "xmldoifelse", actions = lxml.doifelse, arguments = "2 strings" } +implement { name = "xmldoiftext", actions = lxml.doiftext, arguments = "2 strings" } +implement { name = "xmldoifnottext", actions = lxml.doifnottext, arguments = "2 strings" } +implement { name = "xmldoifelsetext", actions = lxml.doifelsetext, arguments = "2 strings" } + +implement { name = "xmldoifempty", actions = lxml.doifempty, arguments = "2 strings" } +implement { name = "xmldoifnotempty", actions = lxml.doifnotempty, arguments = "2 strings" } +implement { name = "xmldoifelseempty", actions = lxml.doifelseempty, arguments = "2 strings" } implement { name = "xmldoifselfempty", actions = lxml.doifempty, arguments = "string" } -- second arg is not passed (used) implement { name = "xmldoifnotselfempty", actions = lxml.doifnotempty, arguments = "string" } -- second arg is not passed (used) implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arguments = "string" } -- second arg is not passed (used) @@ -40,88 +40,88 @@ implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arg --------- { name = "xmlcontent", actions = lxml.content, arguments = "string" } --------- { name = "xmlflushstripped", actions = lxml.strip, arguments = { "string", true } } -implement { name = "xmlall", actions = lxml.all, arguments = { "string", "string" } } -implement { name = "xmlatt", actions = lxml.att, arguments = { "string", "string" } } -implement { name = "xmlattdef", actions = lxml.att, arguments = { "string", "string", "string" } } -implement { name = "xmlattribute", actions = lxml.attribute, arguments = { "string", "string", "string" } } -implement { name = "xmlattributedef", actions = lxml.attribute, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlall", actions = lxml.all, arguments = "2 strings" } +implement { name = "xmlatt", actions = lxml.att, arguments = "2 strings" } +implement { name = "xmlattdef", actions = lxml.att, arguments = "3 strings" } +implement { name = "xmlattribute", actions = lxml.attribute, arguments = "3 strings" } +implement { name = "xmlattributedef", actions = lxml.attribute, arguments = "4 strings" } implement { name = "xmlbadinclusions", actions = lxml.badinclusions, arguments = "string" } implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "'/'", "string" } } implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "'/'", "string", "string" } } implement { name = "xmlchecknamespace", actions = xml.checknamespace, arguments = { "lxmlid", "string", "string" } } -implement { name = "xmlcommand", actions = lxml.command, arguments = { "string", "string", "string" } } -implement { name = "xmlconcat", actions = lxml.concat, arguments = { "string", "string", "string" } } -- \detokenize{#3} +implement { name = "xmlcommand", actions = lxml.command, arguments = "3 strings" } +implement { name = "xmlconcat", actions = lxml.concat, arguments = "3 strings" } -- \detokenize{#3} implement { name = "xmlconcatrange", actions = lxml.concatrange, arguments = { "string", "string", "string", "string", "string" } } -- \detokenize{#5} -implement { name = "xmlcontext", actions = lxml.context, arguments = { "string", "string" } } -implement { name = "xmlcount", actions = lxml.count, arguments = { "string", "string" } } -implement { name = "xmldelete", actions = lxml.delete, arguments = { "string", "string" } } +implement { name = "xmlcontext", actions = lxml.context, arguments = "2 strings" } +implement { name = "xmlcount", actions = lxml.count, arguments = "2 strings" } +implement { name = "xmldelete", actions = lxml.delete, arguments = "2 strings" } implement { name = "xmldirect", actions = lxml.direct, arguments = "string" } implement { name = "xmldirectives", actions = lxml.directives.setup, arguments = "string" } implement { name = "xmldirectivesafter", actions = lxml.directives.after, arguments = "string" } implement { name = "xmldirectivesbefore", actions = lxml.directives.before, arguments = "string" } implement { name = "xmldisplayverbatim", actions = lxml.displayverbatim, arguments = "string" } -implement { name = "xmlelement", actions = lxml.element, arguments = { "string", "string" } } -- could be integer but now we can alias -implement { name = "xmlfilter", actions = lxml.filter, arguments = { "string", "string" } } -implement { name = "xmlfilterlist", actions = lxml.filterlist, arguments = { "string", "string" } } -implement { name = "xmlfirst", actions = lxml.first, arguments = { "string", "string" } } +implement { name = "xmlelement", actions = lxml.element, arguments = "2 strings" } -- could be integer but now we can alias +implement { name = "xmlfilter", actions = lxml.filter, arguments = "2 strings" } +implement { name = "xmlfilterlist", actions = lxml.filterlist, arguments = "2 strings" } +implement { name = "xmlfirst", actions = lxml.first, arguments = "2 strings" } implement { name = "xmlflush", actions = lxml.flush, arguments = "string" } implement { name = "xmlflushcontext", actions = lxml.context, arguments = "string" } implement { name = "xmlflushlinewise", actions = lxml.flushlinewise, arguments = "string" } implement { name = "xmlflushpure", actions = lxml.pure, arguments = "string" } implement { name = "xmlflushspacewise", actions = lxml.flushspacewise, arguments = "string" } implement { name = "xmlflushtext", actions = lxml.text, arguments = "string" } -implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = { "string", "string" } } +implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = "2 strings" } implement { name = "xmlinclude", actions = lxml.include, arguments = { "string", "string", "string", true } } -implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlincludeoptions", actions = lxml.include, arguments = "4 strings" } implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" } implement { name = "xmlinclusionbase", actions = lxml.inclusion, arguments = { "string", false, true } } implement { name = "xmlinclusions", actions = lxml.inclusions, arguments = "string" } -implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "string" } } -- can be integer but now we can alias +implement { name = "xmlindex", actions = lxml.index, arguments = "3 strings" } -- can be integer but now we can alias implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" } -implement { name = "xmllast", actions = lxml.last, arguments = { "string", "string" } } +implement { name = "xmllast", actions = lxml.last, arguments = "2 strings" } implement { name = "xmllastatt", actions = lxml.lastatt } implement { name = "xmllastmatch", actions = lxml.lastmatch } implement { name = "xmllastpar", actions = lxml.lastpar } -implement { name = "xmlload", actions = lxml.load, arguments = { "string", "string", "string" } } -implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = { "string", "string", "string" } } -implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = { "string", "string", "string" } } +implement { name = "xmlload", actions = lxml.load, arguments = "3 strings" } +implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = "3 strings" } +implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = "3 strings" } implement { name = "xmlloaddirectives", actions = lxml.directives.load, arguments = "string" } implement { name = "xmlmain", actions = lxml.main, arguments = "string" } implement { name = "xmlmatch", actions = lxml.match, arguments = "string" } implement { name = "xmlname", actions = lxml.name, arguments = "string" } implement { name = "xmlnamespace", actions = lxml.namespace, arguments = "string" } -implement { name = "xmlnonspace", actions = lxml.nonspace, arguments = { "string", "string" } } -implement { name = "xmlpar", actions = lxml.par, arguments = { "string", "string" } } -implement { name = "xmlparam", actions = lxml.param, arguments = { "string", "string", "string" } } +implement { name = "xmlnonspace", actions = lxml.nonspace, arguments = "2 strings" } +implement { name = "xmlpar", actions = lxml.par, arguments = "2 strings" } +implement { name = "xmlparam", actions = lxml.param, arguments = "3 strings" } implement { name = "xmlpath", actions = lxml.path, arguments = { "string", "'/'" } } implement { name = "xmlpopmatch", actions = lxml.popmatch } implement { name = "xmlpos", actions = lxml.pos, arguments = "string" } -implement { name = "xmlpure", actions = lxml.pure, arguments = { "string", "string" } } +implement { name = "xmlpure", actions = lxml.pure, arguments = "2 strings" } implement { name = "xmlpushmatch", actions = lxml.pushmatch } -implement { name = "xmlraw", actions = lxml.raw, arguments = { "string", "string" } } -implement { name = "xmlrawtex", actions = lxml.rawtex, arguments = { "string", "string" } } -implement { name = "xmlrefatt", actions = lxml.refatt, arguments = { "string", "string" } } -implement { name = "xmlregisterns", actions = xml.registerns, arguments = { "string", "string" } } +implement { name = "xmlraw", actions = lxml.raw, arguments = "2 strings" } +implement { name = "xmlrawtex", actions = lxml.rawtex, arguments = "2 strings" } +implement { name = "xmlrefatt", actions = lxml.refatt, arguments = "2 strings" } +implement { name = "xmlregisterns", actions = xml.registerns, arguments = "2 strings" } implement { name = "xmlremapname", actions = xml.remapname, arguments = { "lxmlid", "string","string","string" } } implement { name = "xmlremapnamespace", actions = xml.renamespace, arguments = { "lxmlid", "string", "string" } } -implement { name = "xmlsave", actions = lxml.save, arguments = { "string", "string" } } -implement { name = "xmlsetatt", actions = lxml.setatt, arguments = { "string", "string", "string" } } -implement { name = "xmlsetattribute", actions = lxml.setattribute, arguments = { "string", "string", "string", "string" } } -implement { name = "xmlsetpar", actions = lxml.setpar, arguments = { "string", "string", "string" } } -implement { name = "xmlsetparam", actions = lxml.setparam, arguments = { "string", "string", "string", "string" } } -implement { name = "xmlsetsetup", actions = lxml.setsetup, arguments = { "string", "string", "string" } } -implement { name = "xmlsnippet", actions = lxml.snippet, arguments = { "string", "string" } } -implement { name = "xmlstrip", actions = lxml.strip, arguments = { "string", "string" } } +implement { name = "xmlsave", actions = lxml.save, arguments = "2 strings" } +implement { name = "xmlsetatt", actions = lxml.setatt, arguments = "3 strings" } +implement { name = "xmlsetattribute", actions = lxml.setattribute, arguments = "4 strings" } +implement { name = "xmlsetpar", actions = lxml.setpar, arguments = "3 strings" } +implement { name = "xmlsetparam", actions = lxml.setparam, arguments = "4 strings" } +implement { name = "xmlsetsetup", actions = lxml.setsetup, arguments = "3 strings" } +implement { name = "xmlsnippet", actions = lxml.snippet, arguments = "2 strings" } +implement { name = "xmlstrip", actions = lxml.strip, arguments = "2 strings" } implement { name = "xmlstripanywhere", actions = lxml.strip, arguments = { "string", "string", true, true } } implement { name = "xmlstripnolines", actions = lxml.strip, arguments = { "string", "string", true } } -implement { name = "xmlstripped", actions = lxml.stripped, arguments = { "string", "string" } } +implement { name = "xmlstripped", actions = lxml.stripped, arguments = "2 strings" } implement { name = "xmlstrippednolines", actions = lxml.stripped, arguments = { "string", "string", true } } implement { name = "xmltag", actions = lxml.tag, arguments = "string" } -implement { name = "xmltext", actions = lxml.text, arguments = { "string", "string" } } -implement { name = "xmltobuffer", actions = lxml.tobuffer, arguments = { "string", "string", "string" } } +implement { name = "xmltext", actions = lxml.text, arguments = "2 strings" } +implement { name = "xmltobuffer", actions = lxml.tobuffer, arguments = "3 strings" } implement { name = "xmltobuffertextonly", actions = lxml.tobuffer, arguments = { "string", "string", "string", false } } implement { name = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true, true } } -implement { name = "xmltofile", actions = lxml.tofile, arguments = { "string", "string", "string" } } +implement { name = "xmltofile", actions = lxml.tofile, arguments = "3 strings" } implement { name = "xmltoparameters", actions = lxml.toparameters, arguments = "string" } implement { name = "xmlverbatim", actions = lxml.verbatim, arguments = "string" } @@ -132,15 +132,15 @@ implement { name = "xmlprependsetup", actions = lxml.installsetup, arg implement { name = "xmlappendsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } } -- 2:* implement { name = "xmlbeforesetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } } -- 2:* implement { name = "xmlaftersetup", actions = lxml.installsetup, arguments = { 4, "string", "string", "string" } } -- 2:* -implement { name = "xmlremovesetup", actions = lxml.removesetup, arguments = { "string", "string" } } -- 1:* -implement { name = "xmlflushsetups", actions = lxml.flushsetups, arguments = { "string", "string", "string" } } -- 2:* +implement { name = "xmlremovesetup", actions = lxml.removesetup, arguments = "2 strings" } -- 1:* +implement { name = "xmlflushsetups", actions = lxml.flushsetups, arguments = "3 strings" } -- 2:* implement { name = "xmlresetsetups", actions = lxml.resetsetups, arguments = "string" } -implement { name = "xmlgetindex", actions = lxml.getindex, arguments = { "string", "string" } } -implement { name = "xmlwithindex", actions = lxml.withindex, arguments = { "string", "string", "string" } } +implement { name = "xmlgetindex", actions = lxml.getindex, arguments = "2 strings" } +implement { name = "xmlwithindex", actions = lxml.withindex, arguments = "3 strings" } -implement { name = "xmlsetentity", actions = xml.registerentity, arguments = { "string", "string" } } -implement { name = "xmltexentity", actions = lxml.registerentity, arguments = { "string", "string" } } +implement { name = "xmlsetentity", actions = xml.registerentity, arguments = "2 strings" } +implement { name = "xmltexentity", actions = lxml.registerentity, arguments = "2 strings" } implement { name = "xmlsetcommandtotext", actions = lxml.setcommandtotext, arguments = "string" } implement { name = "xmlsetcommandtonone", actions = lxml.setcommandtonone, arguments = "string" } diff --git a/tex/context/base/mkiv/lxml-ini.mkiv b/tex/context/base/mkiv/lxml-ini.mkiv index 6f64e545b..7c97ffb2c 100644 --- a/tex/context/base/mkiv/lxml-ini.mkiv +++ b/tex/context/base/mkiv/lxml-ini.mkiv @@ -187,6 +187,10 @@ \let\xmldoifnottext \clf_xmldoifnottext \let\xmldoifelsetext \clf_xmldoifelsetext +\let\xmldoifatt \clf_xmldoifatt +\let\xmldoifnotatt \clf_xmldoifnotatt +\let\xmldoifelseatt \clf_xmldoifelseatt + \let\xmldoifempty \clf_xmldoifempty \let\xmldoifnotempty \clf_xmldoifnotempty \let\xmldoifelseempty \clf_xmldoifelseempty diff --git a/tex/context/base/mkiv/lxml-tex.lua b/tex/context/base/mkiv/lxml-tex.lua index f1abab9e7..b8280ba9c 100644 --- a/tex/context/base/mkiv/lxml-tex.lua +++ b/tex/context/base/mkiv/lxml-tex.lua @@ -64,10 +64,11 @@ local xmlrename = xml.rename local variables = interfaces and interfaces.variables or { } -local settings_to_hash = utilities.parsers.settings_to_hash -local settings_to_set = utilities.parsers.settings_to_set -local options_to_hash = utilities.parsers.options_to_hash -local options_to_array = utilities.parsers.options_to_array +local parsers = utilities.parsers +local settings_to_hash = parsers.settings_to_hash +local settings_to_set = parsers.settings_to_set +local options_to_hash = parsers.options_to_hash +local options_to_array = parsers.options_to_array local insertbeforevalue = utilities.tables.insertbeforevalue local insertaftervalue = utilities.tables.insertaftervalue @@ -468,7 +469,7 @@ lxml.addindex = addindex implement { name = "xmladdindex", - arguments = { "string" }, + arguments = "string", actions = addindex, } @@ -820,7 +821,7 @@ local k_parser = class * spaces * key * spaces * rest --value implement { name = "xmlinstalldirective", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(name,csname) if csname then local keyvalueparser = k_parser / context[csname] @@ -1989,6 +1990,37 @@ do contextsprint(notcatcodes,att) end + local ctx_doif = commands.doif + local ctx_doifnot = commands.doifnot + local ctx_doifelse = commands.doifelse + + implement { + name = "xmldoifatt", + arguments = "3 strings", + actions = function(id,l,v) + local e = getid(id) + ctx_doif(e and e.at[k] == v or false) + end + } + + implement { + name = "xmldoifnotatt", + arguments = "3 strings", + actions = function(id,l,v) + local e = getid(id) + ctx_doifnot(e and e.at[k] == v or false) + end + } + + implement { + name = "xmldoifelseatt", + arguments = "3 strings", + actions = function(id,l,v) + local e = getid(id) + ctx_doifelse(e and e.at[k] == v or false) + end + } + end do diff --git a/tex/context/base/mkiv/lxml-xml.lua b/tex/context/base/mkiv/lxml-xml.lua index d1520800f..47a6e8c85 100644 --- a/tex/context/base/mkiv/lxml-xml.lua +++ b/tex/context/base/mkiv/lxml-xml.lua @@ -19,6 +19,10 @@ local xmlserialize = xml.serialize local xmlcollected = xml.collected local xmlnewhandlers = xml.newhandlers +local reparsedentity = xml.reparsedentitylpeg -- \Ux{...} +local unescapedentity = xml.unescapedentitylpeg +local parsedentity = reparsedentity + local function first(collected) -- wrong ? return collected and collected[1] end @@ -355,6 +359,25 @@ function xml.text(id,pattern) -- brrr either content or element (when cdata) end end +function xml.pure(id,pattern) + if pattern then + local collected = xmlfilter(id,pattern) + if collected and #collected > 0 then + parsedentity = unescapedentity + local s = collected and #collected > 0 and xmltotext(collected[1]) or "" + parsedentity = reparsedentity + return s + else + return "" + end + else + parsedentity = unescapedentity + local s = xmltotext(id) or "" + parsedentity = reparsedentity + return s + end +end + xml.content = text -- diff --git a/tex/context/base/mkiv/math-map.lua b/tex/context/base/mkiv/math-map.lua index 47e5cda0b..2233722a0 100644 --- a/tex/context/base/mkiv/math-map.lua +++ b/tex/context/base/mkiv/math-map.lua @@ -651,7 +651,7 @@ end implement { name = "setmathattribute", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(alphabet,style) local data = alphabets[alphabet] or regular data = data[style] or data.tf diff --git a/tex/context/base/mkiv/math-noa.lua b/tex/context/base/mkiv/math-noa.lua index 4c1997a64..529837cfa 100644 --- a/tex/context/base/mkiv/math-noa.lua +++ b/tex/context/base/mkiv/math-noa.lua @@ -100,6 +100,7 @@ local setchar = nuts.setchar local setfam = nuts.setfam local setsubtype = nuts.setsubtype local setattr = nuts.setattr +local setattrlist = nuts.setattrlist local getfield = nuts.getfield local getnext = nuts.getnext @@ -809,6 +810,8 @@ do setfield(d,"small_fam",fam) flush_node(sym) end + setattrlist(d,char) + setattrlist(f,char) setsubtype(f,what) setfield(f,"delim",d) setfield(f,"class",-1) -- tex itself does this, so not fenceclasses[what] diff --git a/tex/context/base/mkiv/meta-grd.mkiv b/tex/context/base/mkiv/meta-grd.mkiv index 8b1a934d6..15a4471e7 100644 --- a/tex/context/base/mkiv/meta-grd.mkiv +++ b/tex/context/base/mkiv/meta-grd.mkiv @@ -13,6 +13,8 @@ \writestatus{loading}{MetaPost Graphics / Grids} +\unprotect + %D This used to be a \TEX\ method, and a rather old one too. We keep it around but %D in a more modern way. %D @@ -31,85 +33,177 @@ %D {An example of a grid.} %D {\getbuffer} -\startuseMPgraphic{grid}{nx,ny,dx,dy,factor,scale,xstep,ystep,xoffset,yoffset,align} +% \startuseMPgraphic{grid}{nx,ny,dx,dy,factor,scale,xstep,ystep,xoffset,yoffset,align,s:textcolor,s:rulecolor,rulethickness} +% begingroup ; +% save dx, dy, wd, ht, ox, oy, ax, ay ; +% +% (dx,dy) = (\MPvar{dx},\MPvar{dy})*\MPvar{factor}*\MPvar{scale} ; +% (wd,ht) = (\MPvar{nx}*dx,\MPvar{ny}*dy) ; +% (ox,oy) = (\MPvar{xoffset},\MPvar{yoffset}) ; +% (ax,ay) = if \MPvar{align} = 1 : (dx,dy)/2 else : origin fi ; +% +% draw image ( +% for i=0 step dx until wd : draw (i,0) -- (i,ht) ; endfor ; +% for i=0 step dy until ht : draw (0,i) -- (wd,i) ; endfor ; +% ) +% withpen pencircle scaled \MPvar{rulethickness} +% withcolor "\MPvar{rulecolor}" ; +% draw image ( +% if \MPvar{xstep} > 0 : +% for i=1 step \MPvar{xstep} until \MPvar{nx} : +% draw thetextext.bot(decimal i,(i*dx-ax,-ox)); +% endfor ; +% fi ; +% if \MPvar{ystep} > 0 : +% for i=1 step \MPvar{ystep} until \MPvar{ny} : +% draw thetextext.lft(decimal i,(-oy,i*dy-ay)) ; +% endfor ; +% fi ; +% ) +% withcolor "\MPvar{color}" ; +% endgroup ; +% \stopuseMPgraphic +% +% less tokens (not used often): +% +% \startuseMPgraphic{grid}{\c!nx,\c!ny,\c!dx,\c!dy,\c!factor,\c!scale,\c!xstep,\c!ystep,\c!xoffset,\c!yoffset,\c!align,s:\c!textcolor,s:\c!rulecolor,\c!rulethickness} +% begingroup ; +% save dx, dy, wd, ht, ox, oy, ax, ay ; +% +% (dx,dy) = (\MPvar\c!dx,\MPvar\c!dy)*\MPvar\c!factor*\MPvar\c!scale ; +% (wd,ht) = (\MPvar\c!nx*dx,\MPvar\c!ny*dy) ; +% (ox,oy) = (\MPvar\c!xoffset,\MPvar\c!yoffset) ; +% (ax,ay) = if \MPvar\c!align = 1 : (\c!dx,\c!dy)/2 else : origin fi ; +% +% draw image ( +% for i=0 step dx until wd : draw (i,0) -- (i,ht) ; endfor ; +% for i=0 step dy until ht : draw (0,i) -- (wd,i) ; endfor ; +% ) +% withpen pencircle scaled \MPvar\c!rulethickness\space +% withcolor "\MPvar\c!rulecolor" ; +% draw image ( +% if \MPvar\c!xstep > 0 : +% for i=1 step \MPvar\c!xstep until \MPvar\c!nx : +% draw thetextext.bot(decimal i,(i*dx-ax,-ox)); +% endfor ; +% fi ; +% if \MPvar\c!ystep > 0 : +% for i=1 step \MPvar\c!ystep until \MPvar\c!ny : +% draw thetextext.lft(decimal i,(-oy,i*dy-ay)) ; +% endfor ; +% fi ; +% ) +% withcolor "\MPvar\c!color" ; +% endgroup ; +% \stopuseMPgraphic +% +% \def\typo_grid_base[#1]% +% {\dontleavehmode +% \hbox\bgroup +% \getdummyparameters +% [\c!nx=10,\c!ny=10,\c!dx=.5,\c!dy=.5,\c!xstep=0,\c!ystep=0,% +% \c!unit=\s!cm,\c!scale=1,\c!factor=1,% +% \c!offset=.25ex,% +% \c!xoffset=\directdummyparameter\c!offset,% +% \c!yoffset=\directdummyparameter\c!offset,% +% \c!align=,% +% \c!color=\currentcolorname,% +% \c!rulecolor=\currentcolorname,% +% \c!rulethickness=\linewidth,% +% #1]% +% \usedummystyleandcolor\c!style\c!color +% \edef\p_align{\directdummyparameter\c!align}% +% \edef\p_unit {\directdummyparameter\c!unit}% +% \useMPgraphic +% {grid}% +% {nx=\directdummyparameter\c!nx,% +% ny=\directdummyparameter\c!ny,% +% dx=\directdummyparameter\c!dx\p_unit,% +% dy=\directdummyparameter\c!dy\p_unit,% +% factor=\directdummyparameter\c!factor,% +% scale=\directdummyparameter\c!scale,% +% xstep=\directdummyparameter\c!xstep,% +% ystep=\directdummyparameter\c!ystep,% +% xoffset=\directdummyparameter\c!xoffset,% +% yoffset=\directdummyparameter\c!yoffset,% +% color=\directdummyparameter\c!color,% +% rulecolor=\directdummyparameter\c!rulecolor,% +% rulethickness=\directdummyparameter\c!rulethickness,% +% align=\ifx\p_align\v!middle\!!plusone\else\!!zerocount\fi}% +% \egroup} +% +% even less tokens wasted (no need to clog the core with hardly +% used code): + +\startuseMPgraphic{meta:grd:basegrid} begingroup ; - save nx, ny, dx, dy, wd, ht, xstep, ystep, xoffset, yoffset, align, xalign, yalign ; + save sc, dx, dy, wd, ht, ox, oy, ax, ay ; - numeric nx ; nx := \MPvar{nx} ; - numeric ny ; ny := \MPvar{ny} ; - numeric dx ; dx := \MPvar{factor} * \MPvar{scale} * \MPvar{dx} ; - numeric dy ; dy := \MPvar{factor} * \MPvar{scale} * \MPvar{dy} ; - numeric wd ; wd := nx * dx ; - numeric ht ; ht := ny * dy ; - numeric xstep ; xstep := \MPvar{xstep} ; - numeric ystep ; ystep := \MPvar{ystep} ; - numeric xoffset ; xoffset := \MPvar{xoffset} ; - numeric yoffset ; yoffset := \MPvar{yoffset} ; - numeric align ; align := \MPvar{align} ; - numeric xalign ; xalign := 0 ; - numeric yalign ; yalign := 0 ; + sc = \directdummyparameter\c!factor*\directdummyparameter\c!scale ; + dx = \MPdpar\directdummyparameter\c!dx*sc ; + dy = \MPdpar\directdummyparameter\c!dy*sc ; + wd = \directdummyparameter\c!nx*dx ; + ht = \directdummyparameter\c!ny*dy ; + ox = \MPdpar\directdummyparameter\c!xoffset\relax ; + oy = \MPdpar\directdummyparameter\c!yoffset\relax ; - if align = 1 : - xalign := dx/2 ; - yalign := dy/2 ; + if "\directdummyparameter\c!align" = "\v!middle" : + ax = \MPdpar\directdummyparameter\c!dx/2 + ay = \MPdpar\directdummyparameter\c!dy/2 + else : + ax = 0 ; + ay = 0 ; fi ; - for i=0 step dx until wd : - draw (i,0) -- (i,ht) ; - endfor ; - for i=0 step dy until ht : - draw (0,i) -- (wd,i) ; - endfor ; + draw image ( + for i=0 step dx until wd : draw (i,0) -- (i,ht) ; endfor ; + for i=0 step dy until ht : draw (0,i) -- (wd,i) ; endfor ; + ) + withpen pencircle scaled \MPdpar\directdummyparameter\c!rulethickness\space + withcolor "\directdummyparameter\c!rulecolor" ; - if xstep > 0 : - for i=1 step xstep until nx : - draw thetextext.bot(decimal i,(i*dx-xalign,-xoffset)) ; - endfor ; - fi ; - if ystep > 0 : - for i=1 step ystep until ny : - draw thetextext.lft(decimal i,(-yoffset,i*dy-yalign)) ; - endfor ; - fi ; + draw image ( + if \directdummyparameter\c!xstep > 0 : + for i=1 step \directdummyparameter\c!xstep until \directdummyparameter\c!nx : + draw thetextext.bot(decimal i,(i*dx-ax,oy)); + endfor ; + fi ; + if \directdummyparameter\c!ystep > 0 : + for i=1 step \directdummyparameter\c!ystep until \directdummyparameter\c!ny : + draw thetextext.lft(decimal i,(ox,i*dy-ay)) ; + endfor ; + fi ; + ) + withcolor "\directdummyparameter\c!color" ; endgroup ; \stopuseMPgraphic -\unprotect - -\unexpanded\def\basegrid - {\dosingleempty\typo_grid_base} - \def\typo_grid_base[#1]% - {\hbox\bgroup + {\dontleavehmode + \hbox\bgroup \getdummyparameters - [\c!nx=10,\c!ny=10,\c!dx=.5,\c!dy=.5,\c!xstep=0,\c!ystep=0,% + [\c!nx=10,\c!ny=10,% + \c!dx=.5,\c!dy=.5,% + \c!xstep=0,\c!ystep=0,% \c!unit=\s!cm,\c!scale=1,\c!factor=1,% - \c!offset=.25ex,\c!xoffset=\directdummyparameter\c!offset,\c!yoffset=\directdummyparameter\c!offset,% - \c!align=, + \c!offset=.25\exheight,% + \c!xoffset=\directdummyparameter\c!offset,% + \c!yoffset=\directdummyparameter\c!offset,% + \c!align=,% + \c!color=\currentcolorname,% + \c!rulecolor=\currentcolorname,% + \c!rulethickness=\linewidth,% #1]% \usedummystyleandcolor\c!style\c!color - \edef\p_align{\directdummyparameter\c!align}% - \ifx\p_align\v!middle - \let\p_align\!!plusone - \else - \let\p_align\!!zerocount - \fi - \useMPgraphic - {grid}% - {nx=\directdummyparameter\c!nx,% - ny=\directdummyparameter\c!ny,% - dx=\directdummyparameter\c!dx\directdummyparameter\c!unit,% - dy=\directdummyparameter\c!dy\directdummyparameter\c!unit,% - factor=\directdummyparameter\c!factor,% - scale=\directdummyparameter\c!scale,% - xstep=\directdummyparameter\c!xstep,% - ystep=\directdummyparameter\c!ystep,% - xoffset=\directdummyparameter\c!xoffset,% - yoffset=\directdummyparameter\c!yoffset,% - align=\p_align}% - \egroup} + \setexpandeddummyparameter\c!dx{\directdummyparameter\c!dx\directdummyparameter\c!unit}% + \setexpandeddummyparameter\c!dy{\directdummyparameter\c!dy\directdummyparameter\c!unit}% + \useMPgraphic{meta:grd:basegrid}% + \egroup} + +\unexpanded\def\basegrid + {\dosingleempty\typo_grid_base} \let\grid\basegrid diff --git a/tex/context/base/mkiv/meta-imp-mat.mkiv b/tex/context/base/mkiv/meta-imp-mat.mkiv index 11a9ded34..19a5ba385 100644 --- a/tex/context/base/mkiv/meta-imp-mat.mkiv +++ b/tex/context/base/mkiv/meta-imp-mat.mkiv @@ -11,78 +11,74 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This is just an example library not meant for production. - % A few accents: - +% % / for cambria \startMPextensions - vardef math_stacker_overbracket_shape = + vardef math_stacker_bracket_shape(expr delta, rotate) = image ( draw (0,OverlayOffset) -- - (0,OverlayHeight-OverlayOffset) -- - (OverlayWidth,OverlayHeight-OverlayOffset) -- + (0,delta-OverlayOffset) -- + (OverlayWidth,delta-OverlayOffset) -- (OverlayWidth,OverlayOffset) withcolor OverlayLineColor ; setbounds currentpicture to boundingbox currentpicture bottomenlarged OverlayOffset ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_underbracket_shape = - math_stacker_overbracket_shape rotated 180 - enddef ; - vardef math_stacker_overparent_shape = + vardef math_stacker_parent_shape(expr delta, rotate) = image ( draw (0,OverlayOffset) ... - (OverlayWidth/2,OverlayHeight-OverlayOffset) ... + (OverlayWidth/2,delta-OverlayOffset) ... (OverlayWidth,OverlayOffset) withcolor OverlayLineColor ; setbounds currentpicture to boundingbox currentpicture bottomenlarged OverlayOffset ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_underparent_shape = - math_stacker_overparent_shape rotated 180 - enddef ; - vardef math_stacker_overbrace_shape = + vardef math_stacker_brace_shape(expr delta, rotate) = image ( draw (0,OverlayOffset) ... - (OverlayWidth/4-OverlayOffset,OverlayHeight-OverlayOffset) ... - (OverlayWidth/2-OverlayOffset,OverlayHeight-OverlayOffset) ... - (OverlayWidth/2,OverlayHeight) & - (OverlayWidth/2,OverlayHeight) ... - (OverlayWidth/2+OverlayOffset,OverlayHeight-OverlayOffset) ... - (3OverlayWidth/4+OverlayOffset,OverlayHeight-OverlayOffset) ... + (OverlayWidth/4-OverlayOffset,delta-OverlayOffset) ... + (OverlayWidth/2-OverlayOffset,delta-OverlayOffset) ... + (OverlayWidth/2,delta) & + (OverlayWidth/2,delta) ... + (OverlayWidth/2+OverlayOffset,delta-OverlayOffset) ... + (3OverlayWidth/4+OverlayOffset,delta-OverlayOffset) ... (OverlayWidth,OverlayOffset) withcolor OverlayLineColor ; setbounds currentpicture to boundingbox currentpicture bottomenlarged OverlayOffset ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_underbrace_shape = - math_stacker_overbrace_shape rotated 180 - enddef ; - vardef math_stacker_overbar_shape = + vardef math_stacker_bar_shape(expr rotate) = image ( draw (0,OverlayOffset) -- (OverlayWidth,OverlayOffset) withcolor OverlayLineColor ; setbounds currentpicture to boundingbox currentpicture bottomenlarged OverlayOffset ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_underbar_shape = - math_stacker_overbar_shape rotated 180 - enddef ; - % arrows - - vardef math_stacker_arrow_shape(expr axis, ex, em) = + vardef math_stacker_arrow_shape(expr axis, ex, em, rotate) = image ( interim ahlength := ex/2; drawarrow @@ -90,9 +86,12 @@ withcolor OverlayLineColor ; setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_leftrightarrow_shape(expr axis, ex, em) = + vardef math_stacker_leftrightarrow_shape(expr axis, ex, em, rotate) = image ( interim ahlength := ex/2; drawdblarrow @@ -100,9 +99,12 @@ withcolor OverlayLineColor ; setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_rightoverleftarrow_shape(expr axis, ex, em) = + vardef math_stacker_rightoverleftarrow_shape(expr axis, ex, em, rotate) = image ( interim ahlength := ex/2; drawdoublearrows @@ -110,14 +112,11 @@ withcolor OverlayLineColor ; setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; + if rotate : + currentpicture := currentpicture rotated 180 ; + fi ; ) enddef ; - vardef math_stacker_leftarrow_shape(expr axis, ex, em) = - math_stacker_arrow_shape(axis,ex,em) - enddef ; - vardef math_stacker_rightarrow_shape(expr axis, ex, em) = - math_stacker_arrow_shape(axis,ex,em) rotated 180 - enddef ; % main handler @@ -131,55 +130,55 @@ \stopMPextensions \startuniqueMPgraphic{math:stacker:\number"FE3B4}{axis,ex,em} - math_stacker_draw_accent(math_stacker_overbracket_shape) ; + math_stacker_draw_accent(math_stacker_bracket_shape(OverlayHeight,false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE3B5}{axis,ex,em} - math_stacker_draw_accent(math_stacker_underbracket_shape) ; + math_stacker_draw_accent(math_stacker_bracket_shape(OverlayDepth,true)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE3DC}{axis,ex,em} - math_stacker_draw_accent(math_stacker_overparent_shape) ; + math_stacker_draw_accent(math_stacker_parent_shape(OverlayHeight,false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE3DD}{axis,ex,em} - math_stacker_draw_accent(math_stacker_underparent_shape) ; + math_stacker_draw_accent(math_stacker_parent_shape(OverlayDepth,true)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE3DE}{axis,ex,em} - math_stacker_draw_accent(math_stacker_overbrace_shape) ; + math_stacker_draw_accent(math_stacker_brace_shape(OverlayHeight,false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE3DF}{axis,ex,em} - math_stacker_draw_accent(math_stacker_underbrace_shape) ; + math_stacker_draw_accent(math_stacker_brace_shape(OverlayDepth,true)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE33E}{axis,ex,em} - math_stacker_draw_accent(math_stacker_overbar_shape) ; + math_stacker_draw_accent(math_stacker_bar_shape(false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"FE33F}{axis,ex,em} - math_stacker_draw_accent(math_stacker_underbar_shape) ; + math_stacker_draw_accent(math_stacker_bar_shape(true)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"2190}{axis,ex,em} - math_stacker_draw_arrow(math_stacker_leftarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; + math_stacker_draw_arrow(math_stacker_arrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em},false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"2192}{axis,ex,em} - math_stacker_draw_arrow(math_stacker_rightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; + math_stacker_draw_arrow(math_stacker_arrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em},true)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"2194}{axis,ex,em} - math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; + math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em},false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"27F7}{axis,ex,em} - math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; + math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em},false)) ; \stopuniqueMPgraphic \startuniqueMPgraphic{math:stacker:\number"21C4}{axis,ex,em} - math_stacker_draw_arrow(math_stacker_rightoverleftarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; + math_stacker_draw_arrow(math_stacker_rightoverleftarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em},false)) ; \stopuniqueMPgraphic %D Radicals: @@ -202,9 +201,46 @@ withcolor OverlayLineColor ; \stopuniqueMPgraphic -% \setupmathstackers -% [vfenced] -% [color=darkred, -% alternative=mp] - -\endinput +\continueifinputfile{meta-imp-mat.mkiv} + +\setupmathstackers [both] [color=darkred,alternative=mp] +\setupmathstackers [top] [color=darkred,alternative=mp] +\setupmathstackers [bottom] [color=darkred,alternative=mp] + +\startTEXpage[offset=10pt] + +$ + \overbracket {a+b+c+d} \quad + \underbracket {a+b+c+d} \quad + \doublebracket {a+b+c+d} +$ +\blank[2*big] +$ + \overparent {a+b+c+d} \quad + \underparent {a+b+c+d} \quad + \doubleparent {a+b+c+d} +$ +\blank[2*big] +$ + \overbrace {a+b+c+d} \quad + \underbrace {a+b+c+d} \quad + \doublebrace {a+b+c+d} +$ +\blank[2*big] +$ + \overbar {a+b+c+d} \quad + \underbar {a+b+c+d} \quad + \doublebar {a+b+c+d} +$ +\blank[2*big] +$ + \overleftarrow {a+b+c+d} \quad + \overrightarrow {a+b+c+d} +$ +\blank[2*big] +$ + \underleftarrow {a+b+c+d} \quad + \underrightarrow {a+b+c+d} +$ + +\stopTEXpage diff --git a/tex/context/base/mkiv/meta-ini.mkiv b/tex/context/base/mkiv/meta-ini.mkiv index 5fc89e2f6..61e3523e6 100644 --- a/tex/context/base/mkiv/meta-ini.mkiv +++ b/tex/context/base/mkiv/meta-ini.mkiv @@ -1481,6 +1481,12 @@ \fi \to \everysetupMPgraphics +%D Some more helpers (see \type {meta-grd.mkiv} for an example of usage): + +\def\MPdpar#1#2{\the\dimexpr#1#2\relax\empty} +\def\MPnpar#1#2{\the\numexpr#1#2\relax\empty} +\def\MPspar#1#2{"#1#2"} + %D Done. \protect \endinput diff --git a/tex/context/base/mkiv/meta-tex.lua b/tex/context/base/mkiv/meta-tex.lua index d66eab069..fdf118424 100644 --- a/tex/context/base/mkiv/meta-tex.lua +++ b/tex/context/base/mkiv/meta-tex.lua @@ -117,13 +117,13 @@ do implement { name = "metapostformatted", actions = metapost.svformat, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "metapostgraphformat", actions = metapost.nvformat, - arguments = { "string", "string" } + arguments = "2 strings", } if LUAVERSION < 5.2 then diff --git a/tex/context/base/mkiv/mlib-ctx.lua b/tex/context/base/mkiv/mlib-ctx.lua index 0ff28c1c4..c568b92a3 100644 --- a/tex/context/base/mkiv/mlib-ctx.lua +++ b/tex/context/base/mkiv/mlib-ctx.lua @@ -87,7 +87,7 @@ end implement { name = "setmpextensions", actions = metapost.setextensions, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -172,7 +172,7 @@ implement { implement { name = "mprunset", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(name,connector) local value = metapost.variables[name] if value ~= nil then diff --git a/tex/context/base/mkiv/mlib-lua.lua b/tex/context/base/mkiv/mlib-lua.lua index 5e6be614b..19e731b85 100644 --- a/tex/context/base/mkiv/mlib-lua.lua +++ b/tex/context/base/mkiv/mlib-lua.lua @@ -696,7 +696,7 @@ do interfaces.implement { name = "getMPstored", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(name,key) context(stores[name][key]) end diff --git a/tex/context/base/mkiv/mult-aux.lua b/tex/context/base/mkiv/mult-aux.lua index bcd5ae5be..96cc056ac 100644 --- a/tex/context/base/mkiv/mult-aux.lua +++ b/tex/context/base/mkiv/mult-aux.lua @@ -159,7 +159,7 @@ end interfaces.implement { name = "definenamespace", - arguments = { "string", "string" }, + arguments = "2 strings", actions = namespaces.define } diff --git a/tex/context/base/mkiv/mult-aux.mkiv b/tex/context/base/mkiv/mult-aux.mkiv index 96609c4f0..a1aecc354 100644 --- a/tex/context/base/mkiv/mult-aux.mkiv +++ b/tex/context/base/mkiv/mult-aux.mkiv @@ -802,10 +802,11 @@ \letvalue\??dummy\empty - \def\dummyparameter #1{\begincsname\??dummy#1\endcsname} - \def\directdummyparameter#1{\begincsname\??dummy#1\endcsname} -\unexpanded\def\setdummyparameter #1{\expandafter\def\csname\??dummy#1\endcsname} -\unexpanded\def\letdummyparameter #1{\expandafter\let\csname\??dummy#1\endcsname} + \def\dummyparameter #1{\begincsname\??dummy#1\endcsname} + \def\directdummyparameter #1{\begincsname\??dummy#1\endcsname} +\unexpanded\def\setdummyparameter #1{\expandafter\def\csname\??dummy#1\endcsname} +\unexpanded\def\setexpandeddummyparameter#1{\expandafter\edef\csname\??dummy#1\endcsname} +\unexpanded\def\letdummyparameter #1{\expandafter\let\csname\??dummy#1\endcsname} % \unexpanded\def\getdummyparameters % {\mult_interfaces_get_parameters\??dummy} diff --git a/tex/context/base/mkiv/mult-chk.lua b/tex/context/base/mkiv/mult-chk.lua index 44a9f739f..712d91f81 100644 --- a/tex/context/base/mkiv/mult-chk.lua +++ b/tex/context/base/mkiv/mult-chk.lua @@ -52,13 +52,13 @@ end implement { name = "setvalidinterfacekeys", actions = interfaces.setvalidkeys, - arguments = { "string", "string" } + arguments = "2 strings" } implement { name = "addvalidinterfacekeys", actions = interfaces.addvalidkeys, - arguments = { "string", "string" } + arguments = "2 strings" } -- weird code, looks incomplete ... probably an experiment @@ -89,5 +89,5 @@ end implement { name = "getcheckedinterfaceparameters", actions = interfaces.getcheckedparameters, - arguments = { "string", "string", "string" } + arguments = "3 strings" } diff --git a/tex/context/base/mkiv/mult-ini.lua b/tex/context/base/mkiv/mult-ini.lua index b899d25f2..3f320bf7f 100644 --- a/tex/context/base/mkiv/mult-ini.lua +++ b/tex/context/base/mkiv/mult-ini.lua @@ -346,7 +346,7 @@ end interfaces.implement { name = "setuserinterface", actions = interfaces.setuserinterface, - arguments = { "string", "string" } + arguments = "2 strings", } interfaces.cachedsetups = interfaces.cachedsetups or { } @@ -387,30 +387,30 @@ function interfaces.message(str) end implement { name = "registernamespace", actions = interfaces.registernamespace, arguments = { "integer", "string" } } -implement { name = "setinterfaceconstant", actions = interfaces.setconstant, arguments = { "string", "string" } } -implement { name = "setinterfacevariable", actions = interfaces.setvariable, arguments = { "string", "string" } } -implement { name = "setinterfaceelement", actions = interfaces.setelement, arguments = { "string", "string" } } -implement { name = "setinterfacemessage", actions = interfaces.setmessage, arguments = { "string", "string", "string" } } -implement { name = "setinterfacemessages", actions = interfaces.setmessages, arguments = { "string", "string" } } -implement { name = "showmessage", actions = interfaces.showmessage, arguments = { "string", "string", "string" } } +implement { name = "setinterfaceconstant", actions = interfaces.setconstant, arguments = "2 strings" } +implement { name = "setinterfacevariable", actions = interfaces.setvariable, arguments = "2 strings" } +implement { name = "setinterfaceelement", actions = interfaces.setelement, arguments = "2 strings" } +implement { name = "setinterfacemessage", actions = interfaces.setmessage, arguments = "3 strings" } +implement { name = "setinterfacemessages", actions = interfaces.setmessages, arguments = "2 strings" } +implement { name = "showmessage", actions = interfaces.showmessage, arguments = "3 strings" } implement { name = "doifelsemessage", actions = { interfaces.doifelsemessage, commands.doifelse }, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "getmessage", actions = { interfaces.getmessage, context }, - arguments = { "string", "string", "string" }, + arguments = "3 strings", } implement { name = "writestatus", overload = true, actions = interfaces.writestatus, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua index 84b4189dc..0acba3b87 100644 --- a/tex/context/base/mkiv/mult-low.lua +++ b/tex/context/base/mkiv/mult-low.lua @@ -294,7 +294,7 @@ return { -- "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", -- - "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", + "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "setexpandeddummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", -- "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", @@ -402,7 +402,12 @@ return { "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction","stopctxfunction","ctxfunction", - "startctxfunctiondefinition","stopctxfunctiondefinition", "installctxfunction", + "startctxfunctiondefinition","stopctxfunctiondefinition", + "installctxfunction", "installctxfunctioncall", + "installprotectedctxfunction", "installprotectedctxfunctioncall", + "installctxscanner", "installctxscannercall", + "resetctxscanner", + "installprotectedctxscanner", "installprotectedctxscannercall", "cldprocessfile", "cldloadfile", "cldcontext", "cldcommand", -- "carryoverpar", diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua index 601a615a0..1cd5f5810 100644 --- a/tex/context/base/mkiv/mult-prm.lua +++ b/tex/context/base/mkiv/mult-prm.lua @@ -282,6 +282,7 @@ return { "lpcode", "luaescapestring", "luafunction", + "luafunctioncall", "luatexbanner", "luatexrevision", "luatexversion", diff --git a/tex/context/base/mkiv/pack-obj.lua b/tex/context/base/mkiv/pack-obj.lua index f68c1ba0c..3f2b2edfe 100644 --- a/tex/context/base/mkiv/pack-obj.lua +++ b/tex/context/base/mkiv/pack-obj.lua @@ -96,13 +96,13 @@ jobobjects.page = getobjectpage -- implement { -- name = "objectnumber", -- actions = { getobjectnumber, context }, --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- } -- -- implement { -- name = "objectpage", -- actions = { getobjectpage, context }, --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- } -- -- implement { @@ -212,13 +212,13 @@ implement { implement { name = "restoreobject", - arguments = { "string", "string" }, + arguments = "2 strings", actions = objects.restore, } implement { name = "doifelseobject", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(ns,id) ctx_doifelse(data[ns][id]) -- ctx_doifelse(objects.reference(ns,id)) @@ -227,7 +227,7 @@ implement { implement { name = "doifelseobjectreference", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(ns,id) -- ctx_doifelse(data[ns][id]) ctx_doifelse(objects.reference(ns,id)) @@ -252,7 +252,7 @@ implement { implement { name = "getobjectdimensions", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(ns,id) local object = data[ns][id] local w, h, d, o = 0, 0, 0, 0 diff --git a/tex/context/base/mkiv/page-cst.lua b/tex/context/base/mkiv/page-cst.lua index 8b8214ab3..155d6e8b0 100644 --- a/tex/context/base/mkiv/page-cst.lua +++ b/tex/context/base/mkiv/page-cst.lua @@ -1271,13 +1271,13 @@ interfaces.implement { interfaces.implement { name = "preparecolumnsetflush", actions = columnsets.prepareflush, - arguments = { "string" }, + arguments = "string", } interfaces.implement { name = "finishcolumnsetflush", actions = columnsets.finishflush, - arguments = { "string" }, + arguments = "string", } interfaces.implement { @@ -1289,13 +1289,13 @@ interfaces.implement { interfaces.implement { name = "setvsizecolumnset", actions = columnsets.setvsize, - arguments = { "string" }, + arguments = "string", } interfaces.implement { name = "sethsizecolumnset", actions = columnsets.sethsize, - arguments = { "string" }, + arguments = "string", } interfaces.implement { @@ -1423,7 +1423,7 @@ interfaces.implement { interfaces.implement { name = "columnsetgoto", actions = columnsets["goto"], - arguments = { "string" , "string" }, + arguments = "2 strings", } interfaces.implement { diff --git a/tex/context/base/mkiv/page-ini.lua b/tex/context/base/mkiv/page-ini.lua index 6325e1d39..5b73c9729 100644 --- a/tex/context/base/mkiv/page-ini.lua +++ b/tex/context/base/mkiv/page-ini.lua @@ -164,7 +164,7 @@ end) interfaces.implement { name = "markpage", - arguments = { "string", "string" }, + arguments = "2 strings", actions = pages.mark } diff --git a/tex/context/base/mkiv/page-inj.mkvi b/tex/context/base/mkiv/page-inj.mkvi index e03569f23..cabd07bac 100644 --- a/tex/context/base/mkiv/page-inj.mkvi +++ b/tex/context/base/mkiv/page-inj.mkvi @@ -32,6 +32,11 @@ \let\page_boxes_flush_before\clf_flushpageinjectionsbefore \let\page_boxes_flush_after \clf_flushpageinjectionsafter +\def\page_injections_flush_indeed + {\scrn_canvas_synchronize_set{\pageinjectionparameter\c!width}{\pageinjectionparameter\c!height}% + \invokepagehandler\v!normal{\inheritedpageinjectionframed{\texsetup\p_page_injectionalternative_rederingsetup}}% + \scrn_canvas_synchronize_reset} + \def\page_injections_flush_saved#name#parameters% {\begingroup \edef\currentpageinjection{#name}% @@ -39,7 +44,7 @@ \edef\currentpageinjectionalternative {\pageinjectionparameter \c!alternative }% \edef\p_page_injectionalternative_rederingsetup{\pageinjectionalternativeparameter\c!renderingsetup}% \page_injections_nextpage - \invokepagehandler\v!normal{\inheritedpageinjectionframed{\texsetup\p_page_injectionalternative_rederingsetup}}% + \page_injections_flush_indeed \endgroup} \unexpanded\def\pageinjection @@ -104,12 +109,23 @@ \page_injections_place \endgroup} +% \def\page_injections_place +% {\edef\currentpageinjectionalternative {\pageinjectionparameter \c!alternative }% +% \edef\p_page_injectionalternative_rederingsetup{\pageinjectionalternativeparameter\c!renderingsetup}% +% \page_injections_nextpage +% \ifx\currentpageinjectionalternative\v!none \else % increment counter but don’t generate output +% \invokepagehandler\v!normal{\inheritedpageinjectionframed{\texsetup\p_page_injectionalternative_rederingsetup}}% +% \fi} + \def\page_injections_place {\edef\currentpageinjectionalternative {\pageinjectionparameter \c!alternative }% \edef\p_page_injectionalternative_rederingsetup{\pageinjectionalternativeparameter\c!renderingsetup}% \page_injections_nextpage \ifx\currentpageinjectionalternative\v!none \else % increment counter but don’t generate output - \invokepagehandler\v!normal{\inheritedpageinjectionframed{\texsetup\p_page_injectionalternative_rederingsetup}}% + \forgetparindent + \dontcomplain + \setconstant\shipoutfinalizemethod\zerocount + \page_injections_flush_indeed \fi} \def\page_injections_nextpage diff --git a/tex/context/base/mkiv/page-ins.lua b/tex/context/base/mkiv/page-ins.lua index 4791bc69b..0323952d0 100644 --- a/tex/context/base/mkiv/page-ins.lua +++ b/tex/context/base/mkiv/page-ins.lua @@ -102,7 +102,7 @@ implement { implement { name = "setinsertionlocation", actions = inserts.setlocation, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/page-sid.mkiv b/tex/context/base/mkiv/page-sid.mkiv index 5742ce8c4..a0fb63ca2 100644 --- a/tex/context/base/mkiv/page-sid.mkiv +++ b/tex/context/base/mkiv/page-sid.mkiv @@ -737,8 +737,9 @@ \def\page_sides_wrapup {% we need to do this aftergroup - \ignoreparskip \aftergroup\ignoreparskip - \ignorespaces \aftergroup\ignorespaces + \aftergroup\par + \aftergroup\ignoreparskip + \aftergroup\ignorespaces } \def\page_sides_check_floats_indeed diff --git a/tex/context/base/mkiv/phys-dim.lua b/tex/context/base/mkiv/phys-dim.lua index 71c9b0bd4..363b4a79c 100644 --- a/tex/context/base/mkiv/phys-dim.lua +++ b/tex/context/base/mkiv/phys-dim.lua @@ -966,4 +966,4 @@ implement { name = "digits_normal", actions = makedigits, arguments = "string implement { name = "digits_reverse", actions = makedigits, arguments = { "string", true } } implement { name = "unit_normal", actions = makeunit, arguments = "string"} implement { name = "unit_reverse", actions = makeunit, arguments = { "string", true } } -implement { name = "registerunit", actions = registerunit, arguments = { "string", "string" } } +implement { name = "registerunit", actions = registerunit, arguments = "2 strings" } diff --git a/tex/context/base/mkiv/publ-aut.lua b/tex/context/base/mkiv/publ-aut.lua index 91d38a8d9..be0c771a3 100644 --- a/tex/context/base/mkiv/publ-aut.lua +++ b/tex/context/base/mkiv/publ-aut.lua @@ -975,7 +975,7 @@ publications.sortmethods.authoryear = { implement { name = "btxremapauthor", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(k,v) local a = { splitauthor(k,true) } local s1 = sequentialhash(a) diff --git a/tex/context/base/mkiv/publ-ini.lua b/tex/context/base/mkiv/publ-ini.lua index 038a15d5a..8497b190f 100644 --- a/tex/context/base/mkiv/publ-ini.lua +++ b/tex/context/base/mkiv/publ-ini.lua @@ -648,7 +648,7 @@ local findallused do implement { name = "btxdoifelsematches", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(dataset,tag,expression) local find = publications.finder(dataset,expression) local okay = false @@ -1009,30 +1009,28 @@ function publications.lastofrange(dataset,tag,name) end end -local three_strings = { "string", "string", "string" } - implement { name = "btxsingularorplural", actions = { publications.singularorplural, ctx_doifelse }, - arguments = three_strings + arguments = "3 strings" } implement { name = "btxoneorrange", actions = { publications.oneorrange, function(b) if b == nil then ctx_gobbletwoarguments() else ctx_doifelse(b) end end }, - arguments = three_strings + arguments = "3 strings" } implement { name = "btxfirstofrange", actions = { publications.firstofrange, context }, - arguments = three_strings + arguments = "3 strings" } implement { name = "btxlastofrange", actions = { publications.lastofrange, context }, - arguments = three_strings + arguments = "3 strings" } -- basic loading @@ -1237,13 +1235,13 @@ end implement { name = "btxaddentry", + arguments = "3 strings", actions = function(name,settings,content) local dataset = datasets[name] if dataset then publications.addtexentry(dataset,settings,content) end end, - arguments = { "string", "string", "string" } } function publications.checkeddataset(name,default) @@ -1260,12 +1258,13 @@ end implement { name = "btxsetdataset", + arguments = "2 strings", actions = { publications.checkeddataset, context }, - arguments = { "string", "string"} } implement { name = "btxsetentry", + arguments = "2 strings", actions = function(name,tag) local dataset = rawget(datasets,name) if dataset then @@ -1278,7 +1277,6 @@ implement { report("unknown dataset %a",name) end end, - arguments = { "string", "string" }, } -- rendering of fields @@ -1558,19 +1556,19 @@ do publications.okay = okay - implement { name = "btxfield", actions = btxfield, arguments = { "string", "string", "string" } } - implement { name = "btxdetail", actions = btxdetail, arguments = { "string", "string", "string" } } - implement { name = "btxflush", actions = btxflush, arguments = { "string", "string", "string" } } - implement { name = "btxdirect", actions = btxdirect, arguments = { "string", "string", "string" } } + implement { name = "btxfield", actions = btxfield, arguments = "3 strings" } + implement { name = "btxdetail", actions = btxdetail, arguments = "3 strings" } + implement { name = "btxflush", actions = btxflush, arguments = "3 strings" } + implement { name = "btxdirect", actions = btxdirect, arguments = "3 strings" } implement { name = "btxfieldname", actions = { get, context }, arguments = { "string", "string", "string", false, false } } implement { name = "btxfieldtype", actions = { get, context }, arguments = { "string", "string", "string", true, false } } implement { name = "btxfoundname", actions = { get, context }, arguments = { "string", "string", "string", false, true } } implement { name = "btxfoundtype", actions = { get, context }, arguments = { "string", "string", "string", true, true } } - implement { name = "btxdoifelse", actions = { okay, ctx_doifelse }, arguments = { "string", "string", "string" } } - implement { name = "btxdoif", actions = { okay, ctx_doif }, arguments = { "string", "string", "string" } } - implement { name = "btxdoifnot", actions = { okay, ctx_doifnot }, arguments = { "string", "string", "string" } } + implement { name = "btxdoifelse", actions = { okay, ctx_doifelse }, arguments = "3 strings" } + implement { name = "btxdoif", actions = { okay, ctx_doif }, arguments = "3 strings" } + implement { name = "btxdoifnot", actions = { okay, ctx_doifnot }, arguments = "3 strings" } end @@ -2041,8 +2039,8 @@ do implement { name = "btxflushpages", + arguments = "2 strings", actions = btxflushpages, - arguments = { "string", "string" } } local function identical(a,b) @@ -2277,20 +2275,20 @@ do implement { name = "btxuservariable", + arguments = "2 strings", actions = { getuserdata, context }, - arguments = { "string", "string" } } implement { name = "btxdoifelseuservariable", + arguments = "2 strings", actions = { getuserdata, ctx_doifelse }, - arguments = { "string", "string" } } -- implement { -- name = "btxresolvelistreference", + -- arguments = "2 strings", -- actions = lists.resolve, - -- arguments = { "string", "string" } -- } implement { @@ -2315,32 +2313,32 @@ do implement { name = "btxpreparelistentries", + arguments = "string", actions = lists.prepareentries, - arguments = { "string" }, } implement { name = "btxfetchlistentries", + arguments = "string", actions = lists.fetchentries, - arguments = { "string" }, } implement { name = "btxflushlistentry", + arguments = "2 strings", actions = lists.flushentry, - arguments = { "string", "integer" } } implement { name = "btxflushlisttag", + arguments = "2 strings", actions = lists.flushtag, - arguments = { "string", "integer" } } implement { name = "btxflushlistcombi", + arguments = "2 strings", actions = lists.flushcombi, - arguments = { "string", "string" } } implement { @@ -2351,8 +2349,8 @@ do implement { name = "btxdoifelsecombiinlist", + arguments = "2 strings", actions = { lists.combiinlist, ctx_doifelse }, - arguments = { "string", "string" } } end @@ -3374,8 +3372,8 @@ do implement { name = "btxlistvariant", + arguments = "5 strings", actions = btxlistvariant, - arguments = { "string", "string", "string", "string", "string" } -- not integer here } function listvariants.default(dataset,block,tag,variant) @@ -3440,7 +3438,7 @@ do implement { name = "checkinterfacechain", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(str,command) local chain = lpegmatch(splitter,str) if #chain > 0 then diff --git a/tex/context/base/mkiv/publ-jrn.lua b/tex/context/base/mkiv/publ-jrn.lua index 0cc41862f..fba994466 100644 --- a/tex/context/base/mkiv/publ-jrn.lua +++ b/tex/context/base/mkiv/publ-jrn.lua @@ -156,7 +156,7 @@ if implement then implement { name = "btxaddjournal", - arguments = { "string", "string" }, + arguments = "2 strings", actions = { journals.add, context } } diff --git a/tex/context/base/mkiv/publ-reg.lua b/tex/context/base/mkiv/publ-reg.lua index b40fbc80a..9ee574929 100644 --- a/tex/context/base/mkiv/publ-reg.lua +++ b/tex/context/base/mkiv/publ-reg.lua @@ -121,7 +121,7 @@ implement { implement { name = "btxtoregister", actions = btxtoregister, - arguments = { "string", "string" } + arguments = "2 strings", } -- context.setregisterentry ( @@ -221,5 +221,5 @@ publications.authortoregister = authortoregister implement { name = "btxauthortoregister", actions = authortoregister, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/scrn-but.lua b/tex/context/base/mkiv/scrn-but.lua index c791f9718..da0d5e9f4 100644 --- a/tex/context/base/mkiv/scrn-but.lua +++ b/tex/context/base/mkiv/scrn-but.lua @@ -22,5 +22,5 @@ end interfaces.implement { name = "registerbuttons", actions = registerbuttons, - arguments = { "string", "string", "string" } + arguments = "3 strings", } diff --git a/tex/context/base/mkiv/scrn-fld.lua b/tex/context/base/mkiv/scrn-fld.lua index f68cc039d..046b7864f 100644 --- a/tex/context/base/mkiv/scrn-fld.lua +++ b/tex/context/base/mkiv/scrn-fld.lua @@ -66,7 +66,7 @@ implement { implement { name = "definefieldset", actions = defineset, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/scrn-fld.mkvi b/tex/context/base/mkiv/scrn-fld.mkvi index 38c4e1461..dec334209 100644 --- a/tex/context/base/mkiv/scrn-fld.mkvi +++ b/tex/context/base/mkiv/scrn-fld.mkvi @@ -47,7 +47,7 @@ %D A definition can refer to this category: %D %D \starttyping -%D \definefieldbody [email] [type=line,category=all-email,default=pragma@wxs.nl] +%D \definefieldbody [email] [type=line,category=all-email,default=pragma@xs4all.nl] %D \stoptyping %D %D A copy of a field is made as follows: diff --git a/tex/context/base/mkiv/scrn-pag.mkvi b/tex/context/base/mkiv/scrn-pag.mkvi index d96d8d3c1..7695443ad 100644 --- a/tex/context/base/mkiv/scrn-pag.mkvi +++ b/tex/context/base/mkiv/scrn-pag.mkvi @@ -203,11 +203,16 @@ paperheight \printpaperheight \relax} -\def\scrn_canvas_synchronize_simple_indeed +\def\scrn_canvas_synchronize_set#1#2% {\clf_setupcanvas - paperwidth \printpaperwidth - paperheight \printpaperheight - \relax + paperwidth \dimexpr#1\relax + paperheight \dimexpr#2\relax + \relax} + +\let\scrn_canvas_synchronize_reset\scrn_canvas_synchronize_only + +\def\scrn_canvas_synchronize_simple_indeed + {\scrn_canvas_synchronize_only %\global\let\scrn_canvas_synchronize_simple \relax \global\let\scrn_canvas_synchronize_complex\relax} diff --git a/tex/context/base/mkiv/scrn-wid.lua b/tex/context/base/mkiv/scrn-wid.lua index 636d547da..5b70bec75 100644 --- a/tex/context/base/mkiv/scrn-wid.lua +++ b/tex/context/base/mkiv/scrn-wid.lua @@ -288,7 +288,7 @@ end implement { name = "renderingvar", actions = { renderings.var, context }, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/scrp-ini.lua b/tex/context/base/mkiv/scrp-ini.lua index d5cad643f..9bd70e30a 100644 --- a/tex/context/base/mkiv/scrp-ini.lua +++ b/tex/context/base/mkiv/scrp-ini.lua @@ -973,7 +973,7 @@ implement { implement { name = "setscript", actions = scripts.set, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { diff --git a/tex/context/base/mkiv/sort-ini.lua b/tex/context/base/mkiv/sort-ini.lua index 7cd28d08f..f90b70be5 100644 --- a/tex/context/base/mkiv/sort-ini.lua +++ b/tex/context/base/mkiv/sort-ini.lua @@ -53,14 +53,15 @@ have language etc properties that then can be used.

local gsub, find, rep, sub, sort, concat, tohash, format = string.gsub, string.find, string.rep, string.sub, table.sort, table.concat, table.tohash, string.format local utfbyte, utfchar, utfcharacters, utfvalues = utf.byte, utf.char, utf.characters, utf.values local next, type, tonumber, rawget, rawset = next, type, tonumber, rawget, rawset -local P, Cs, R, S, lpegmatch = lpeg.P, lpeg.Cs, lpeg.R, lpeg.S, lpeg.match +local P, Cs, R, S, lpegmatch, lpegpatterns = lpeg.P, lpeg.Cs, lpeg.R, lpeg.S, lpeg.match, lpeg.patterns local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex -local trace_tests = false trackers.register("sorters.tests", function(v) trace_tests = v end) -local trace_methods = false trackers.register("sorters.methods", function(v) trace_methods = v end) -local trace_orders = false trackers.register("sorters.orders", function(v) trace_orders = v end) +local trace_tests = false trackers.register("sorters.tests", function(v) trace_tests = v end) +local trace_methods = false trackers.register("sorters.methods", function(v) trace_methods = v end) +local trace_orders = false trackers.register("sorters.orders", function(v) trace_orders = v end) +local trace_replacements= false trackers.register("sorters.replacements", function(v) trace_replacements = v end) local report_sorters = logs.reporter("languages","sorters") @@ -523,7 +524,7 @@ local function prepare() -- todo: test \Ux{hex} return pattern end -function sorters.strip(str) -- todo: only letters and such +local function strip(str) -- todo: only letters and such if str and str ~= "" then return lpegmatch(pattern or prepare(),str) else @@ -531,6 +532,8 @@ function sorters.strip(str) -- todo: only letters and such end end +sorters.strip = strip + local function firstofsplit(entry) -- numbers are left padded by spaces local split = entry.split @@ -553,15 +556,35 @@ sorters.firstofsplit = firstofsplit -- we know what combinations make sense we can optimize this function splitters.utf(str,checked) -- we could append m and u but this is cleaner, s is for tracing - if #replacements > 0 then + local nofreplacements = #replacements + if nofreplacements > 0 then -- todo make an lpeg for this - for k=1,#replacements do - local v = replacements[k] - local s = v[1] - if find(str,s) then - str = gsub(str,s,v[2]) + local replacer = replacements.replacer + if not replacer then + local rep = { } + for i=1,nofreplacements do + local r = replacements[i] + rep[strip(r[1])] = strip(r[2]) + end + replacer = lpeg.utfchartabletopattern(rep) + replacer = Cs((replacer/rep + lpegpatterns.utf8character)^0) + replacements.replacer = replacer + end + local rep = lpegmatch(replacer,str) + if rep and rep ~= str then + if trace_replacements then + report_sorters("original : %s",str) + report_sorters("replacement: %s",rep) end + str = rep end + -- for k=1,#replacements do + -- local v = replacements[k] + -- local s = v[1] + -- if find(str,s) then + -- str = gsub(str,s,v[2]) + -- end + -- end end local m_case, z_case, p_case, m_mapping, z_mapping, p_mapping, char, byte, n = { }, { }, { }, { }, { }, { }, { }, { }, 0 local nm, nz, np = 0, 0, 0 @@ -797,3 +820,16 @@ function sorters.sort(entries,cmp) end) end end + +-- helper + +function sorters.replacementlist(list) + local replacements = { } + for i=1,#list do + replacements[i] = { + list[i], + utfchar(replacementoffset+i), + } + end + return replacements +end diff --git a/tex/context/base/mkiv/spac-ver.lua b/tex/context/base/mkiv/spac-ver.lua index 288630a5d..969a195e1 100644 --- a/tex/context/base/mkiv/spac-ver.lua +++ b/tex/context/base/mkiv/spac-ver.lua @@ -2180,7 +2180,7 @@ do name = "vspacingdefine", actions = vspacing.setmap, scope = "private", - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -2208,7 +2208,7 @@ do name = "definesnapmethod", actions = vspacing.definesnapmethod, scope = "private", - arguments = { "string", "string" } + arguments = "2 strings", } -- local remove_node = nodes.remove diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf index 531068f8a..aa6ed92ea 100644 Binary files a/tex/context/base/mkiv/status-files.pdf and b/tex/context/base/mkiv/status-files.pdf differ diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf index 22eee2a81..70204080a 100644 Binary files a/tex/context/base/mkiv/status-lua.pdf and b/tex/context/base/mkiv/status-lua.pdf differ diff --git a/tex/context/base/mkiv/strc-bkm.lua b/tex/context/base/mkiv/strc-bkm.lua index e30a91820..ee9233a9a 100644 --- a/tex/context/base/mkiv/strc-bkm.lua +++ b/tex/context/base/mkiv/strc-bkm.lua @@ -523,5 +523,5 @@ implement { implement { name = "overloadbookmark", actions = bookmarks.overload, - arguments = { "string", "string" } + arguments = "2 strings", } diff --git a/tex/context/base/mkiv/strc-blk.lua b/tex/context/base/mkiv/strc-blk.lua index 492abc768..703d36379 100644 --- a/tex/context/base/mkiv/strc-blk.lua +++ b/tex/context/base/mkiv/strc-blk.lua @@ -157,6 +157,6 @@ end -- interface implement { name = "definestructureblock", actions = blocks.define, arguments = "string" } -implement { name = "savestructureblock", actions = blocks.save, arguments = { "string", "string" ,"string" } } -implement { name = "selectstructureblock", actions = blocks.select, arguments = { "string", "string" ,"string", "string" } } -implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = { "string", "string" ,"string" } } +implement { name = "savestructureblock", actions = blocks.save, arguments = "3 strings" } +implement { name = "selectstructureblock", actions = blocks.select, arguments = "4 strings" } +implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = "3 strings" } diff --git a/tex/context/base/mkiv/strc-doc.lua b/tex/context/base/mkiv/strc-doc.lua index 93d8db56b..2de26ac64 100644 --- a/tex/context/base/mkiv/strc-doc.lua +++ b/tex/context/base/mkiv/strc-doc.lua @@ -1029,11 +1029,11 @@ implement { name = "structurecatcodedget", actions = sections.structuredat implement { name = "structuregivencatcodedget", actions = sections.structuredata, arguments = { false, "string", false, "integer" } } implement { name = "structureautocatcodedget", actions = sections.structuredata, arguments = { false, "string", false, "string" } } -implement { name = "namedstructurevariable", actions = sections.structuredata, arguments = { "string", "string" } } -implement { name = "namedstructureuservariable", actions = sections.userdata, arguments = { "string", "string" } } +implement { name = "namedstructurevariable", actions = sections.structuredata, arguments = "2 strings" } +implement { name = "namedstructureuservariable", actions = sections.userdata, arguments = "2 strings" } -implement { name = "setstructurelevel", actions = sections.setlevel, arguments = { "string", "string" } } -implement { name = "getstructurelevel", actions = sections.getcurrentlevel, arguments = { "string" } } +implement { name = "setstructurelevel", actions = sections.setlevel, arguments = "2 strings" } +implement { name = "getstructurelevel", actions = sections.getcurrentlevel, arguments = "string" } implement { name = "setstructurenumber", actions = sections.setnumber, arguments = { "integer", "string" } } -- string as we support +- implement { name = "getstructurenumber", actions = sections.getnumber, arguments = { "integer" } } implement { name = "getsomestructurenumber", actions = sections.getnumber, arguments = { "integer", "string" } } diff --git a/tex/context/base/mkiv/strc-lev.lua b/tex/context/base/mkiv/strc-lev.lua index c06e209f6..74b64a09c 100644 --- a/tex/context/base/mkiv/strc-lev.lua +++ b/tex/context/base/mkiv/strc-lev.lua @@ -83,7 +83,7 @@ end implement { name = "definesectionlevels", actions = definesectionlevels, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/strc-lst.lua b/tex/context/base/mkiv/strc-lst.lua index a235fac75..13bdf7786 100644 --- a/tex/context/base/mkiv/strc-lst.lua +++ b/tex/context/base/mkiv/strc-lst.lua @@ -1159,7 +1159,7 @@ implement { name = "listsize", actions = { lists.size, context } } implement { name = "listlocation", actions = { lists.location, context }, arguments = "integer" } implement { name = "listlabel", actions = { lists.label, context }, arguments = { "integer", "string" } } implement { name = "listrealpage", actions = { lists.realpage, context }, arguments = { "string", "integer" } } -implement { name = "listgroupindex", actions = { lists.groupindex, context }, arguments = { "string", "string" } } +implement { name = "listgroupindex", actions = { lists.groupindex, context }, arguments = "2 strings", } implement { name = "currentsectiontolist", diff --git a/tex/context/base/mkiv/strc-mar.lua b/tex/context/base/mkiv/strc-mar.lua index 80fcf126a..24a7fd491 100644 --- a/tex/context/base/mkiv/strc-mar.lua +++ b/tex/context/base/mkiv/strc-mar.lua @@ -714,17 +714,17 @@ end -- interface -implement { name = "markingtitle", actions = marks.title, arguments = { "string", "string" } } -implement { name = "markingnumber", actions = marks.number, arguments = { "string", "string" } } +implement { name = "markingtitle", actions = marks.title, arguments = "2 strings" } +implement { name = "markingnumber", actions = marks.number, arguments = "2 strings" } -implement { name = "definemarking", actions = marks.define, arguments = { "string", "string" } } -implement { name = "relatemarking", actions = marks.relate, arguments = { "string", "string" } } -implement { name = "setmarking", actions = marks.set, arguments = { "string", "string" } } -implement { name = "resetmarking", actions = marks.reset, arguments = { "string" } } +implement { name = "definemarking", actions = marks.define, arguments = "2 strings" } +implement { name = "relatemarking", actions = marks.relate, arguments = "2 strings" } +implement { name = "setmarking", actions = marks.set, arguments = "2 strings" } +implement { name = "resetmarking", actions = marks.reset, arguments = "string" } implement { name = "synchronizemarking", actions = marks.synchronize, arguments = { "string", "integer", "string" } } -implement { name = "getmarking", actions = marks.fetch, arguments = { "string", "string", "string" } } -implement { name = "fetchonemark", actions = marks.fetchonemark, arguments = { "string", "string", "string" } } -implement { name = "fetchtwomarks", actions = marks.fetchtwomarks, arguments = { "string", "string" } } -implement { name = "fetchallmarks", actions = marks.fetchallmarks, arguments = { "string", "string" } } +implement { name = "getmarking", actions = marks.fetch, arguments = "3 strings" } +implement { name = "fetchonemark", actions = marks.fetchonemark, arguments = "3 strings" } +implement { name = "fetchtwomarks", actions = marks.fetchtwomarks, arguments = "2 strings" } +implement { name = "fetchallmarks", actions = marks.fetchallmarks, arguments = "2 strings" } implement { name = "doifelsemarking", actions = { marks.exists, commands.doifelse }, arguments = "string" } diff --git a/tex/context/base/mkiv/strc-not.lua b/tex/context/base/mkiv/strc-not.lua index eff357eea..bb9d64beb 100644 --- a/tex/context/base/mkiv/strc-not.lua +++ b/tex/context/base/mkiv/strc-not.lua @@ -151,7 +151,7 @@ notes.getstate = getstate implement { name = "setnotestate", actions = setstate, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -199,8 +199,8 @@ function notes.restore(tag,forcedstate) end end -implement { name = "savenote", actions = notes.save, arguments = { "string", "string" } } -implement { name = "restorenote", actions = notes.restore, arguments = { "string", "string" } } +implement { name = "savenote", actions = notes.save, arguments = "2 strings" } +implement { name = "restorenote", actions = notes.restore, arguments = "2 strings" } local function hascontent(tag) local ok = notestates[tag] @@ -420,7 +420,7 @@ implement { implement { name = "flushnotes", actions = flushnotes, - arguments = { "string", "string", "string" } + arguments = "3 strings", } function notes.resetpostponed() diff --git a/tex/context/base/mkiv/strc-ref.lua b/tex/context/base/mkiv/strc-ref.lua index 73f1ca886..f20d93161 100644 --- a/tex/context/base/mkiv/strc-ref.lua +++ b/tex/context/base/mkiv/strc-ref.lua @@ -355,19 +355,19 @@ references.setcomponent = setcomponent implement { name = "setnextreferenceorder", actions = setnextorder, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "setnextinternalreference", actions = setnextinternal, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "currentreferenceorder", actions = { currentorder, context }, - arguments = { "string", "string" } + arguments = "2 strings", } function references.set(data) @@ -432,7 +432,7 @@ end implement { name = "enhancereference", actions = references.enhance, - arguments = { "string", "string" } + arguments = "2 strings", } -- -- -- related to strc-ini.lua -- -- -- @@ -633,7 +633,7 @@ implement { implement { name = "useurl", actions = urls.define, - arguments = { "string", "string", "string", "string" } + arguments = "4 strings", } implement { @@ -684,7 +684,7 @@ implement { implement { name = "usefile", actions = files.define, - arguments = { "string", "string", "string" } + arguments = "3 strings" } implement { @@ -774,7 +774,7 @@ end implement { name = "defineprogram", actions = programs.define, - arguments = { "string", "string", "string" } + arguments = "3 strings", } local function getprogram(name) @@ -863,13 +863,13 @@ end implement { name = "definereference", actions = references.define, - arguments = { "string", "string", "string" } + arguments = "3 strings", } implement { name = "resetreference", actions = references.reset, - arguments = { "string", "string" } + arguments = "2 strings", } setmetatableindex(defined,"table") diff --git a/tex/context/base/mkiv/strc-reg.lua b/tex/context/base/mkiv/strc-reg.lua index 51771e3b8..2c667fba3 100644 --- a/tex/context/base/mkiv/strc-reg.lua +++ b/tex/context/base/mkiv/strc-reg.lua @@ -428,13 +428,13 @@ registers.setmethod = defineregister -- and we might have a difference so implement { name = "defineregister", actions = defineregister, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "setregistermethod", actions = defineregister, -- duplicate use - arguments = { "string", "string" } + arguments = "2 strings", } @@ -643,13 +643,13 @@ end implement { name = "enhanceregister", actions = registers.enhance, - arguments = { "string", "integer" } + arguments = { "string", "integer" }, } implement { name = "extendregister", actions = registers.extend, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/strc-syn.lua b/tex/context/base/mkiv/strc-syn.lua index ecc5e19ae..eec025593 100644 --- a/tex/context/base/mkiv/strc-syn.lua +++ b/tex/context/base/mkiv/strc-syn.lua @@ -259,23 +259,23 @@ end -- todo: local higher up -implement { name = "registerusedsynonym", actions = synonyms.registerused, arguments = { "string", "string" } } -implement { name = "registershownsynonym", actions = synonyms.registershown, arguments = { "string", "string" } } -implement { name = "synonymmeaning", actions = synonyms.meaning, arguments = { "string", "string" } } -implement { name = "synonymname", actions = synonyms.synonym, arguments = { "string", "string" } } +implement { name = "registerusedsynonym", actions = synonyms.registerused, arguments = "2 strings" } +implement { name = "registershownsynonym", actions = synonyms.registershown, arguments = "2 strings" } +implement { name = "synonymmeaning", actions = synonyms.meaning, arguments = "2 strings" } +implement { name = "synonymname", actions = synonyms.synonym, arguments = "2 strings" } implement { name = "resetusedsynonyms", actions = synonyms.resetused, arguments = "string" } implement { name = "resetshownsynonyms", actions = synonyms.resetshown, arguments = "string" } implement { name = "doifelsesynonymused", actions = { synonyms.isused, commands.doifelse }, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "doifelsesynonymshown", actions = { synonyms.isshown, commands.doifelse }, - arguments = { "string", "string" } + arguments = "2 strings", } implement { diff --git a/tex/context/base/mkiv/strc-tag.lua b/tex/context/base/mkiv/strc-tag.lua index 1be44821e..649465a6a 100644 --- a/tex/context/base/mkiv/strc-tag.lua +++ b/tex/context/base/mkiv/strc-tag.lua @@ -464,7 +464,7 @@ local starttag = tags.start implement { name = "starttag", actions = starttag, - arguments = { "string" } + arguments = "string", } implement { @@ -476,26 +476,25 @@ implement { name = "starttag_u", scope = "private", actions = function(tag,userdata) starttag(tag,{ userdata = userdata }) end, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "starttag_d", scope = "private", actions = function(tag,detail) starttag(tag,{ detail = detail }) end, - arguments = { "string", "string" } + arguments = "2 strings", } implement { name = "starttag_c", scope = "private", actions = function(tag,detail,parents) starttag(tag,{ detail = detail, parents = parents }) end, - arguments = { "string", "string", "string" } + arguments = "3 strings", } -implement { name = "settagaspect", actions = tags.setaspect, arguments = { "string", "string" } } - -implement { name = "settagproperty", actions = tags.setproperty, arguments = { "string", "string", "string" } } +implement { name = "settagaspect", actions = tags.setaspect, arguments = "2 strings" } +implement { name = "settagproperty", actions = tags.setproperty, arguments = "3 strings" } implement { name = "settagproperty_b", actions = tags.setproperty, arguments = { "string", "'backend'", "string" }, scope = "private" } implement { name = "settagproperty_n", actions = tags.setproperty, arguments = { "string", "'nature'", "string" }, scope = "private" } @@ -505,7 +504,7 @@ implement { name = "setelementuserproperties", scope = "private", actions = tags.setuserproperties, - arguments = { "string", "string" } + arguments = "2 strings", } implement { @@ -517,5 +516,5 @@ implement { implement { name = "settaggedmetadata", actions = tags.registermetadata, - arguments = "string" + arguments = "string", } diff --git a/tex/context/base/mkiv/supp-box.lua b/tex/context/base/mkiv/supp-box.lua index 664477cfc..40047167c 100644 --- a/tex/context/base/mkiv/supp-box.lua +++ b/tex/context/base/mkiv/supp-box.lua @@ -562,7 +562,7 @@ do implement { name = "directboxfromcache", - arguments = { "string", "string" }, + arguments = "2 strings", actions = { boxes.direct, context }, -- actions = function(category,name) local b = boxes.direct(category,name) if b then context(b) end end, } @@ -582,13 +582,13 @@ do implement { name = "doifelseboxincache", - arguments = { "string", "string" }, + arguments = "2 strings", actions = { boxes.found, doifelse }, } implement { name = "resetboxesincache", - arguments = { "string" }, + arguments = "string", actions = boxes.reset, } diff --git a/tex/context/base/mkiv/syst-aux.lua b/tex/context/base/mkiv/syst-aux.lua index 06f6176b1..f9d8505f1 100644 --- a/tex/context/base/mkiv/syst-aux.lua +++ b/tex/context/base/mkiv/syst-aux.lua @@ -61,7 +61,7 @@ local ctx_doifelse = commands.doifelse implement { name = "doifelsefirstchar", - arguments = { "string", "string" }, + arguments = "2 strings", actions = function(str,chr) ctx_doifelse(lpegmatch(pattern,str) == chr) end @@ -69,7 +69,7 @@ implement { implement { name = "getsubstring", - arguments = { "string", "string", "string" }, + arguments = "3 strings", actions = function(str,first,last) context(utfsub(str,tonumber(first),tonumber(last))) end @@ -581,42 +581,42 @@ end implement { name = "doifelsecommon", actions = doifelsecommon, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "doifcommon", actions = doifcommon, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "doifnotcommon", actions = doifnotcommon, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "doifelseinset", actions = doifelseinset, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "doifinset", actions = doifinset, - arguments = { "string", "string" }, + arguments = "2 strings", } implement { name = "doifnotinset", actions = doifnotinset, - arguments = { "string", "string" }, + arguments = "2 strings", } -- implement { -- name = "stringcompare", --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- actions = function(a,b) -- context((a == b and 0) or (a > b and 1) or -1) -- end @@ -624,7 +624,7 @@ implement { -- -- implement { -- name = "doifelsestringafter", --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- actions = function(a,b) -- ctx_doifelse((a == b and 0) or (a > b and 1) or -1) -- end @@ -632,7 +632,7 @@ implement { -- -- implement { -- name = "doifelsestringbefore", --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- actions = function(a,b) -- ctx_doifelse((a == b and 0) or (a < b and -1) or 1) -- end @@ -640,7 +640,7 @@ implement { -- implement { -- not faster than addtocommalist -- name = "additemtolist", -- unique --- arguments = { "string", "string" }, +-- arguments = "2 strings", -- actions = function(l,s) -- if l == "" or s == l then -- -- s = s diff --git a/tex/context/base/mkiv/toks-ini.lua b/tex/context/base/mkiv/toks-ini.lua index 8f95f6692..15e5df267 100644 --- a/tex/context/base/mkiv/toks-ini.lua +++ b/tex/context/base/mkiv/toks-ini.lua @@ -58,6 +58,7 @@ end local scan_toks = token.scan_toks local scan_string = token.scan_string +local scan_argument = token.scan_argument local scan_int = token.scan_int local scan_code = token.scan_code local scan_dimen = token.scan_dimen @@ -241,6 +242,7 @@ tokens.scanners = { -- these expand integer = scan_int, count = scan_int, string = scan_string, + argument = scan_argument, code = scan_code, word = scan_word, number = scan_number, diff --git a/tex/context/base/mkiv/toks-scn.lua b/tex/context/base/mkiv/toks-scn.lua index f3781d022..fe32a1de4 100644 --- a/tex/context/base/mkiv/toks-scn.lua +++ b/tex/context/base/mkiv/toks-scn.lua @@ -21,6 +21,7 @@ local scanners = tokens.scanners local tokenbits = tokens.bits local scanstring = scanners.string +local scanargument = scanners.argument local scaninteger = scanners.integer local scannumber = scanners.number local scankeyword = scanners.keyword @@ -240,6 +241,19 @@ local f_check = formatters[ [[ end ]] ] +-- using these shortcuts saves temporary small tables (okay, it looks uglier) + +local presets = { + ["1 string" ] = { "string" }, + ["2 strings"] = { "string", "string" }, + ["3 strings"] = { "string", "string", "string" }, + ["4 strings"] = { "string", "string", "string", "string" }, + ["5 strings"] = { "string", "string", "string", "string", "string" }, + ["6 strings"] = { "string", "string", "string", "string", "string", "string" }, + ["7 strings"] = { "string", "string", "string", "string", "string", "string", "string" }, + ["8 strings"] = { "string", "string", "string", "string", "string", "string", "string", "string" }, +} + function tokens.compile(specification) local f = { } local n = 0 @@ -305,6 +319,10 @@ function tokens.compile(specification) return c end end + local p = t and presets[t] + if p then + t = p + end local tt = type(t) if tt == "string" then if a then diff --git a/tex/context/base/mkiv/trac-ctx.lua b/tex/context/base/mkiv/trac-ctx.lua index 29159d130..33637fd66 100644 --- a/tex/context/base/mkiv/trac-ctx.lua +++ b/tex/context/base/mkiv/trac-ctx.lua @@ -57,16 +57,16 @@ implement { implement { name = "installtextracker", + arguments = "3 strings", actions = function(tag,enable,disable) install(textrackers,trackers.register,tag,enable,disable) end, - arguments = { "string", "string", "string" } } implement { name = "installtexdirective", + arguments = "3 strings", actions = function(tag,enable,disable) install(texdirectives,directives.register,tag,enable,disable) end, - arguments = { "string", "string", "string" } } diff --git a/tex/context/base/mkiv/trac-inf.lua b/tex/context/base/mkiv/trac-inf.lua index 5810e2059..439e8b2dc 100644 --- a/tex/context/base/mkiv/trac-inf.lua +++ b/tex/context/base/mkiv/trac-inf.lua @@ -177,10 +177,7 @@ function statistics.show() register("control sequences", function() return format("%s of %s + %s", status.cs_count, status.hash_size,status.hash_extra) end) - register("callbacks", function() - local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0 - return format("%s direct, %s indirect, %s total", total-indirect, indirect, total) - end) + register("callbacks", statistics.callbacks) if TEXENGINE == "luajittex" and JITSUPPORTED then local jitstatus = jit.status if jitstatus then diff --git a/tex/context/base/mkiv/trac-log.lua b/tex/context/base/mkiv/trac-log.lua index c7b6f6d2d..1471bd4c7 100644 --- a/tex/context/base/mkiv/trac-log.lua +++ b/tex/context/base/mkiv/trac-log.lua @@ -10,7 +10,6 @@ if not modules then modules = { } end modules ['trac-log'] = { -- terminal handler in lua then. Ok, maybe it's slower then, so a no-go. local next, type, select, print = next, type, select, print -local write_nl, write = texio and texio.write_nl or print, texio and texio.write or io.write local format, gmatch, find = string.format, string.gmatch, string.find local concat, insert, remove = table.concat, table.insert, table.remove local topattern = string.topattern @@ -18,6 +17,13 @@ local utfchar = utf.char local datetime = os.date local openfile = io.open +local runningtex = tex and (tex.jobname or tex.formatname) +-- local write_nl = texio and texio.write_nl or print +-- local write = texio and texio.write or io.write + +local write_nl = runningtex and texio and texio.write_nl or print +local write = runningtex and texio and texio.write or io.write + local setmetatableindex = table.setmetatableindex local formatters = string.formatters local settings_to_hash = utilities.parsers.settings_to_hash @@ -108,7 +114,7 @@ local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog, -- we don't want this overhead for single messages (not that there are that -- many; we could have a special weak table) -if tex and (tex.jobname or tex.formatname) then +if runningtex then if texio.setescape then texio.setescape(0) -- or (false) diff --git a/tex/context/base/mkiv/typo-inj.lua b/tex/context/base/mkiv/typo-inj.lua index 786c3c287..44b6c0a14 100644 --- a/tex/context/base/mkiv/typo-inj.lua +++ b/tex/context/base/mkiv/typo-inj.lua @@ -91,8 +91,8 @@ end implement { name = "resetinjector", actions = injectors.reset, arguments = "string" } implement { name = "showinjector", actions = injectors.show, arguments = "string" } -implement { name = "setinjector", actions = injectors.set, arguments = { "string", "string", "string" } } +implement { name = "setinjector", actions = injectors.set, arguments = "3 strings" } implement { name = "markinjector", actions = injectors.mark, arguments = "string" } -implement { name = "checkinjector", actions = injectors.check, arguments = { "string", "string" } } +implement { name = "checkinjector", actions = injectors.check, arguments = "2 strings" } --------- { name = "checkpreviousinjector", actions = injectors.check, arguments = { "string", tokens.constant(v_previous) } } --------- { name = "checknextinjector", actions = injectors.check, arguments = { "string", tokens.constant(v_next) } } diff --git a/tex/context/base/mkiv/util-lua.lua b/tex/context/base/mkiv/util-lua.lua index bd74d0843..b7de11936 100644 --- a/tex/context/base/mkiv/util-lua.lua +++ b/tex/context/base/mkiv/util-lua.lua @@ -42,7 +42,7 @@ luautilities.suffixes = { -- environment.loadpreprocessedfile can be set to a preprocessor -local function register(name) +local function register(name) -- makes no sense runtime if tracestripping then report_lua("stripped bytecode from %a",name or "unknown") end @@ -75,18 +75,12 @@ end function luautilities.loadedluacode(fullname,forcestrip,name,macros) -- quite subtle ... doing this wrong incidentally can give more bytes name = name or fullname - local code, message if macros then macros = lua.macros end - if macros and macros.enabled then - -- local c = io.loaddata(fullname) -- not yet available - local f = io.open(fullname,"rb") local c = f:read("*a") f:close() - local n = c and macros.resolvestring("--[["..fullname.."]] "..c) - if n and #n ~= #c then - report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) - end - code, message = load(n or c) + local code, message + if macros then + code, message = macros.loaded(fullname,true,false) else code, message = loadfile(fullname) end diff --git a/tex/context/base/mkiv/util-sql-imp-ffi.lua b/tex/context/base/mkiv/util-sql-imp-ffi.lua index 07c4752cd..2a2bc6569 100644 --- a/tex/context/base/mkiv/util-sql-imp-ffi.lua +++ b/tex/context/base/mkiv/util-sql-imp-ffi.lua @@ -365,10 +365,10 @@ local function connect(session,specification) end local function error_in_connection(specification,action) - report_state("error in connection: [%s] %s@%s to %s:%s", + report_state("error in connection: [%s] user %s into %s at %s:%s", action or "unknown", - specification.database or "no database", specification.username or "no username", + specification.database or "no database", specification.host or "no host", specification.port or "no port" ) diff --git a/tex/context/base/mkiv/util-str.lua b/tex/context/base/mkiv/util-str.lua index 9da0c6a2f..f76895aaf 100644 --- a/tex/context/base/mkiv/util-str.lua +++ b/tex/context/base/mkiv/util-str.lua @@ -12,7 +12,8 @@ local strings = utilities.strings local format, gsub, rep, sub, find = string.format, string.gsub, string.rep, string.sub, string.find local load, dump = load, string.dump -local tonumber, type, tostring, next = tonumber, type, tostring, next +local tonumber, type, tostring, next, setmetatable = tonumber, type, tostring, next, setmetatable +local unpack, concat = table.unpack, table.concat local unpack, concat = table.unpack, table.concat local P, V, C, S, R, Ct, Cs, Cp, Carg, Cc = lpeg.P, lpeg.V, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cs, lpeg.Cp, lpeg.Carg, lpeg.Cc local patterns, lpegmatch = lpeg.patterns, lpeg.match @@ -22,8 +23,9 @@ local utfchar, utfbyte, utflen = utf.char, utf.byte, utf.len ----- setmetatableindex = table.setmetatableindex local loadstripped = nil +local oldfashioned = LUAVERSION < 5.2 -if LUAVERSION < 5.2 then +if oldfashioned then loadstripped = function(str,shortcuts) return load(str) @@ -296,7 +298,7 @@ end -- -- integer %...i number -- integer %...d number --- unsigned %...u number -- no tused +-- unsigned %...u number -- not used -- character %...c number -- hexadecimal %...x number -- HEXADECIMAL %...X number @@ -524,7 +526,7 @@ return function(%s) return %s end local preamble, environment = "", { } -if LUAVERSION < 5.2 then +if oldfashioned then preamble = [[ local lpeg=lpeg @@ -574,7 +576,7 @@ else sequenced = table.sequenced, formattednumber = number.formatted, sparseexponent = number.sparseexponent, - formattedfloat = number.formattedfloat + formattedfloat = number.formattedfloat, } end @@ -1044,42 +1046,31 @@ local builder = Cs { "start", ["!"] = Carg(2) * prefix_any * P("!") * C((1-P("!"))^1) * P("!") / format_extension, } --- we can be clever and only alias what is needed - --- local direct = Cs ( --- P("%")/"" --- * Cc([[local format = string.format return function(str) return format("%]]) --- * (S("+- .") + R("09"))^0 --- * S("sqidfgGeExXo") --- * Cc([[",str) end]]) --- * P(-1) --- ) - -local direct = Cs ( - P("%") - * (S("+- .") + R("09"))^0 - * S("sqidfgGeExXo") - * P(-1) / [[local format = string.format return function(str) return format("%0",str) end]] -) +-- We can be clever and only alias what is needed: + +local xx = setmetatable({ }, { __index = function(t,k) local v = format("%02x",k) t[k] = v return v end }) +local XX = setmetatable({ }, { __index = function(t,k) local v = format("%02X",k) t[k] = v return v end }) --- local direct = Cs ( --- P("%") --- * (S("+- .") + R("09"))^0 --- * S("sqidfgGeExXo") --- * (1-P("%"))^0 --- * P(-1) / [[local format = string.format return function(str) return format([==[%0]==],str) end]] --- ) +local preset = { + ["%02x"] = function(n) return xx[n] end, + ["%02X"] = function(n) return XX[n] end, +} + +local direct = + P("%") * (S("+- .") + R("09"))^0 * S("sqidfgGeExXo") * P(-1) + / [[local format = string.format return function(str) return format("%0",str) end]] local function make(t,str) - local f - local p + local f = preset[str] + if f then + return f + end local p = lpegmatch(direct,str) if p then - -- f = loadstripped(p)() -- print("builder 1 >",p) f = loadstripped(p)() else - n = 0 + n = 0 -- used in patterns -- p = lpegmatch(builder,str,1,"..",t._extensions_) -- after this we know n p = lpegmatch(builder,str,1,t._connector_,t._extensions_) -- after this we know n if n > 0 then @@ -1142,7 +1133,7 @@ strings.formatters = { } -- _connector_ is an experiment -if LUAVERSION < 5.2 then +if oldfashioned then function strings.formatters.new(noconcat) local t = { _type_ = "formatter", _connector_ = noconcat and "," or "..", _extensions_ = { }, _preamble_ = preamble, _environment_ = { } } @@ -1202,7 +1193,7 @@ patterns.luaquoted = Cs(Cc('"') * ((1-S('"\n'))^1 + P('"')/'\\"' + P('\n')/'\\n" -- escaping by lpeg is faster for strings without quotes, slower on a string with quotes, but -- faster again when other q-escapables are found (the ones we don't need to escape) -if LUAVERSION < 5.2 then +if oldfashioned then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") diff --git a/tex/context/fonts/mkiv/type-imp-modernlatin.mkiv b/tex/context/fonts/mkiv/type-imp-modernlatin.mkiv new file mode 100644 index 000000000..a3f4762f1 --- /dev/null +++ b/tex/context/fonts/mkiv/type-imp-modernlatin.mkiv @@ -0,0 +1,69 @@ +%D \module +%D [ file=type-imp-modernlatin, +%D version=2018.03.25, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Modern Latin Modern, +%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[modernlatin] + + \definefontfeature[lm-rm-regular][effect={width=0.15,delta=1.00}] + \definefontfeature[lm-rm-bold] [effect={width=0.30,delta=1.00}] + \definefontfeature[lm-ss-regular][effect={width=0.10,delta=1.00}] + \definefontfeature[lm-ss-bold] [effect={width=0.20,delta=1.00}] + \definefontfeature[lm-tt-regular][effect={width=0.20,delta=1.00}] + \definefontfeature[lm-tt-bold] [effect={width=0.30,delta=1.00}] + + \starttypescript [\s!serif] [modern-latin] + % \loadfontgoodies[lm] + \definefontsynonym [Serif] [\s!file:lmroman10-regular] [\s!features={\s!default,lm-rm-regular}] + \definefontsynonym [SerifItalic] [\s!file:lmroman10-italic] [\s!features={\s!default,lm-rm-regular}] + \definefontsynonym [SerifSlanted] [\s!file:lmromanslant10-regular] [\s!features={\s!default,lm-rm-regular}] + \definefontsynonym [SerifBold] [\s!file:lmroman10-regular] [\s!features={\s!default,lm-rm-bold}] + \definefontsynonym [SerifBoldItalic] [\s!file:lmroman10-italic] [\s!features={\s!default,lm-rm-bold}] + \definefontsynonym [SerifBoldSlanted][\s!file:lmromanslant10-regular] [\s!features={\s!default,lm-rm-bold}] + \stoptypescript + + \starttypescript [\s!sans] [modern-latin] + % \loadfontgoodies[lm] + \definefontsynonym [Sans] [\s!file:lmsans10-regular] [\s!features={\s!default,lm-ss-regular}] + \definefontsynonym [SansItalic] [\s!file:lmsans10-oblique] [\s!features={\s!default,lm-ss-regular}] + \definefontsynonym [SansSlanted] [\s!file:lmsans10-oblique] [\s!features={\s!default,lm-ss-regular}] + \definefontsynonym [SansBold] [\s!file:lmsans10-regular] [\s!features={\s!default,lm-ss-bold}] + \definefontsynonym [SansBoldItalic] [\s!file:lmsans10-oblique] [\s!features={\s!default,lm-ss-bold}] + \definefontsynonym [SansBoldSlanted][\s!file:lmsans10-oblique] [\s!features={\s!default,lm-ss-bold}] + \stoptypescript + + \starttypescript [\s!mono] [modern-latin] + % \loadfontgoodies[lm] + \definefontsynonym [Mono] [\s!file:lmmono10-regular] [\s!features={\s!default,lm-tt-regular}] + \definefontsynonym [MonoItalic] [\s!file:lmmono10-italic] [\s!features={\s!default,lm-tt-regular}] + \definefontsynonym [MonoSlanted] [\s!file:lmmonoslant10-regular] [\s!features={\s!default,lm-tt-regular}] + \definefontsynonym [MonoBold] [\s!file:lmmono10-regular] [\s!features={\s!default,lm-tt-bold}] + \definefontsynonym [MonoBoldItalic] [\s!file:lmmono10-italic] [\s!features={\s!default,lm-tt-bold}] + \definefontsynonym [MonoBoldSlanted][\s!file:lmmonoslant10-regular] [\s!features={\s!default,lm-tt-bold}] + \stoptypescript + + \starttypescript [\s!math] [modern-latin] + \loadfontgoodies[lm] + \definefontsynonym [LMMathRoman-Regular] [\v!file:latinmodern-math-regular.otf] [\s!features={\s!math\mathsizesuffix,lm-math,mathextra},\s!goodies=lm] + \definefontsynonym [LMMathRoman-Bold] [\v!file:latinmodern-math-regular.otf] [\s!features={\s!math\mathsizesuffix,lm-math,mathextra},\s!goodies=lm] + \stoptypescript + + \starttypescript [modern-latin] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [modern-latin] [\s!default] + \definetypeface [\typescriptone] [\s!ss] [\s!sans] [modern-latin] [\s!default] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [modern-latin] [\s!default] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [modern-latin] [\s!default] + \quittypescriptscanning + \stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf index 7b808f8da..6ff801846 100644 Binary files a/tex/context/interface/mkiv/i-context.pdf and b/tex/context/interface/mkiv/i-context.pdf differ diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf index aad96f1a7..f86da332a 100644 Binary files a/tex/context/interface/mkiv/i-readme.pdf and b/tex/context/interface/mkiv/i-readme.pdf differ diff --git a/tex/context/modules/common/s-faq-01.tex b/tex/context/modules/common/s-faq-01.tex index f6ee3ce06..e031d79d5 100644 --- a/tex/context/modules/common/s-faq-01.tex +++ b/tex/context/modules/common/s-faq-01.tex @@ -8,8 +8,8 @@ %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. +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. \usemodule[faq-00] @@ -25,7 +25,7 @@ width=fit, footer=0pt, bottomdistance=12pt, - bottom=18pt] + bottom=18pt] \setupinteractionscreen [width=fit, @@ -152,7 +152,7 @@ \blank[3*big] \midaligned{\tta \ListOfFAQ} \vfill - \midaligned{\tta pragma@wxs.nl} + \midaligned{\tta pragma@xs4all.nl} \blank[3*big] \stopstandardmakeup} @@ -187,7 +187,7 @@ \def\EndFAQ {\stopframedtext - \egroup + \egroup \button [color=,contrastcolor=,frame=overlay,offset=overlay] {\copy0} @@ -205,7 +205,7 @@ \startuniqueMPgraphic{Frame} path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; - pickup pencircle scaled 2pt ; + pickup pencircle scaled 2pt ; fill p withcolor \MPcolor{\overlaycolor} ; draw p withcolor \MPcolor{\overlaylinecolor} ; \stopuniqueMPgraphic diff --git a/tex/context/modules/common/s-faq-02.tex b/tex/context/modules/common/s-faq-02.tex index 92aa1eca2..c39ae1046 100644 --- a/tex/context/modules/common/s-faq-02.tex +++ b/tex/context/modules/common/s-faq-02.tex @@ -8,8 +8,8 @@ %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. +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. \usemodule[faq-00] @@ -37,7 +37,7 @@ \blank[3*big] \midaligned{\tta \ListOfFAQ} \vfill - \midaligned{\tta pragma@wxs.nl} + \midaligned{\tta pragma@xs4all.nl} \blank[3*big] \stopstandardmakeup} diff --git a/tex/context/modules/mkiv/m-punk.mkiv b/tex/context/modules/mkiv/m-punk.mkiv index b72abd64d..08a066359 100644 --- a/tex/context/modules/mkiv/m-punk.mkiv +++ b/tex/context/modules/mkiv/m-punk.mkiv @@ -11,6 +11,12 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D You can actually turn a punk font into music (wintergatan): +%D +%D \starttyping +%D https://www.youtube.com/watch?v=g5c2Htj8Vtw +%D \stoptyping + \startluacode local concat = table.concat local round = math.round diff --git a/tex/context/modules/mkiv/s-fonts-basics.mkiv b/tex/context/modules/mkiv/s-fonts-basics.mkiv new file mode 100644 index 000000000..e9d0a21a2 --- /dev/null +++ b/tex/context/modules/mkiv/s-fonts-basics.mkiv @@ -0,0 +1,175 @@ +%D \module +%D [ file=s-fnt-01, +%D version=2006.10.10, % guess +%D title=\CONTEXT\ Style File, +%D subtitle=Listing Glyphs in Large 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 module is just a check for \type {luatex-basics-prepare}. + +\usemodule[article] + +\setupbodyfont[9pt] + +\starttext + +\definefontfeature + [boundingbox] + [boundingbox=yes] + +\definefont + [TestFont] + [file:arialuni.ttf*boundingbox] + +\startluacode + +local data = characters.data + +local indicscripts = table.sorted { + "devanagari", + "kannada", + "malayalam", + "tamil", + "bengali", + "gurmukhi", + "gujarati", + "oriya", + "telugu", +} + +local arabicscripts = table.sorted { + "arabic", + "syriac", + "mandiac", + "nko", +} + +local allindic = true +local allarabic = true +local dotted = utf.char(0x25CC) + +local left = table.setmetatableindex ( + { r = dotted, b = dotted, t = dotted, s = dotted }, + function(t,k) local v = "" if k then t[k] = v end return v end +) + +local right = table.setmetatableindex ( + { l = dotted }, + function(t,k) local v = "" if k then t[k] = v end return v end +) + +for i=1,#indicscripts do + local script = indicscripts[i] + local first, last = characters.blockrange(script) + context.starttitle { title = script } + context.starttabulate { "|Tc|Tc|Tc|Tc|Tc|Tc|Tc|Tp|" } + context.FL() + context.BC() context("unicode") + context.BC() context("glyph") + context.BC() context("category") + context.BC() context("indic") + context.BC() context("mark") + context.BC() context("class") + context.BC() context("order") + context.BC() context("description") + context.NC() context.NR() + context.ML() + for i=first,last do + local d = data[i] + if d and d.unicodeslot then + local indic = d.indic + local category = d.category or "?" + local description = d.description + if not indic then + context.NC() context("\\red %U",i) + context.NC() context("\\red\\showstruts\\strut\\TestFont %c",i) + context.NC() context("\\red %s",category) + context.NC() + context.NC() + context.NC() + context.NC() + context.NC() context(description) + context.NC() context.NR() + else + local indicclass = d.indicclass + local indicmark = d.indicmark + local indicorder = d.indicorder + if allindic or indic == "d" or indicmark or indicclass or indicorder then + local l = left [indicmark] + local r = right[indicmark] + context.NC() context("%U",i) + context.NC() context("\\showstruts\\strut\\TestFont %s%c%s",l,i,r) + context.NC() context(category) + context.NC() context(indic or "?") + context.NC() context(indicmark or "") + context.NC() context(indicclass or "") + context.NC() context(indicorder or "") + context.NC() context(description) + context.NC() context.NR() + end + end + end + end + context.LL() + context.stoptabulate() + context.stoptitle() +end + +for i=1,#arabicscripts do + local script = arabicscripts[i] + local first, last = characters.blockrange(script) + context.starttitle { title = script } + context.starttabulate { "|Tc|Tc|Tc|Tc|Tp|" } + context.FL() + context.BC() context("unicode") + context.BC() context("glyph") + context.BC() context("category") + context.BC() context("arabic") + context.BC() context("description") + context.NC() context.NR() + context.ML() + for i=first,last do + local d = data[i] + if d and d.unicodeslot then + local arabic = d.arabic + local category = d.category or "" + local description = d.description or "" + if arabic then + context.NC() context("%U",i) + context.NC() context("\\showstruts\\strut\\TestFont %c",i) + context.NC() context(category) + context.NC() context(arabic) + context.NC() context(description) + context.NC() context.NR() + elseif allarabic then + context.NC() context("\\red %U",i) + context.NC() context("\\red\\showstruts\\strut\\TestFont %c",i) + context.NC() context("\\red %s",category) + context.NC() + context.NC() context("\\red %s",description) + context.NC() context.NR() + end + end + end + context.LL() + context.stoptabulate() + context.stoptitle() +end + +-- local olddata = io.loaddata("char-def.lua") +-- local preamble = string.gsub(olddata,"characters%.data%s*=%s*%{.*","") + +-- local newdata = table.serialize(data,"characters.data", { hexify = true, noquotes = true }) +-- local newdata = string.gsub(newdata,"%{%s+%[0xFE0E%]=\"text style\",%s+%[0xFE0F%]=\"emoji style\",%s+%}","variants_emoji") + +-- io.savedata("char-def-new.lua",newdata) + +\stopluacode + +\stoptext diff --git a/tex/context/modules/mkiv/s-fonts-overlay.mkiv b/tex/context/modules/mkiv/s-fonts-overlay.mkiv new file mode 100644 index 000000000..fccc977d4 --- /dev/null +++ b/tex/context/modules/mkiv/s-fonts-overlay.mkiv @@ -0,0 +1,107 @@ +%D \module +%D [ file=s-fonts-overlay, +%D version=2018.03.25, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Glyph Similarity, +%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 : overlay glyphs in fonts +% +% comment : show glyphs in two fonts +% status : experimental, used for font feature development +% +% end info + +%D This module is for Luigi/Idris as part of the Husayni development where the +%D gpos pair, single, mark and cursive features are just linear transformations. + +\startmodule[fonts-coverage] + +\unprotect + +\definecolor[ColorOne][r=1,t=.5,a=1] +\definecolor[ColorTwo][b=1,t=.5,a=1] + +\startluacode + moduledata.fonts = moduledata.fonts or { } + moduledata.fonts.overlay = moduledata.fonts.overlay or { } + + function moduledata.fonts.overlay(id) + for k, v in table.sortedhash(fonts.hashes.identifiers[id or true].characters) do + context.showoverlayedglyphs(k) + end + end +\stopluacode + +\starttexdefinition unexpanded showoverlayedglyphs#1 + \startTEXpage[offset=.25\scratchdimentwo,height=10\scratchdimentwo,width=4\scratchdimenone] + \ruledhbox to \hsize\bgroup + \hss + \FontOne\setstrut\strut\showglyphs + \startoverlay + {\ColorOne\ruledhbox{\FontOne\char#1}} + {\ColorTwo\ruledhbox{\FontTwo\char#1}} + \stopoverlay + \hss + \egroup + \vfill + \dontleavehmode + \hbox to \hsize\bgroup + \hss + \infofont0x\uchexnumbers{#1} + \hss + \egroup + \stopTEXpage +\stoptexdefinition + +\starttexdefinition unexpanded showoverlayedfonts[#1] + \start + \getdummyparameters[\c!list=,#1] + \doifsomething {\dummyparameter\c!list} { + \page + \getfromcommacommand[\dummyparameter\c!list][1]\let\NameOne\commalistelement + \getfromcommacommand[\dummyparameter\c!list][2]\let\NameTwo\commalistelement + \definefont[FontOne][\NameOne] + \definefont[FontTwo][\NameTwo] + \FontOne\expandafter\edef\expandafter\OneID\expandafter{\number\fontid\font}% + \FontTwo\expandafter\edef\expandafter\TwoID\expandafter{\number\fontid\font}% + \scratchdimenone\emwidth + \scratchdimentwo\exheight + \ctxlua{moduledata.fonts.overlay(\OneID)}% + \page + % \startTEXpage[offset=.25\scratchdimentwo,height=10\scratchdimentwo,width=4\scratchdimenone] + % \vfill + % \hbox to \hsize{\ColorOne\infofont\hss\OneN\hss} + % \vfill + % \hbox to \hsize{\ColorTwo\infofont\hss\TwoN\hss} + % \vfill + % \stopTEXpage + % \page + } + \stop +\stoptexdefinition + +\protect + +\stopmodule + +\continueifinputfile{s-fonts-overlay.mkiv} + +\starttext + +% \showoverlayedfonts +% [list={file:husayni-script-regular.ttf @ 48.0pt, +% file:husayni-note-bold.ttf @ 34.2pt}] % 34.18726pt + + \showoverlayedfonts + [list={Serif,SerifBold}] + +\stoptext diff --git a/tex/context/modules/mkiv/s-fonts-shapes.lua b/tex/context/modules/mkiv/s-fonts-shapes.lua index ebdf04c22..748c5a92a 100644 --- a/tex/context/modules/mkiv/s-fonts-shapes.lua +++ b/tex/context/modules/mkiv/s-fonts-shapes.lua @@ -109,12 +109,9 @@ local characters = nil local function showglyphshape(specification) specification = interfaces.checkedspecification(specification) - local id, cs = fonts.definers.internal(specification,"") + local id, cs = fonts.definers.internal(specification,"") local tfmdata = fontdata[id] - local charnum = tonumber(specification.character) - if not charnum then - charnum = fonts.helpers.nametoslot(specification.character) - end + local charnum = tonumber(specification.character) or fonts.helpers.nametoslot(specification.character) local characters = tfmdata.characters local descriptions = tfmdata.descriptions local parameters = tfmdata.parameters @@ -133,64 +130,75 @@ local function showglyphshape(specification) context.startMPcode() context("numeric lw ; lw := .125bp ;") context("pickup pencircle scaled lw ;") - context('picture p ; p := image(draw textext.drt("\\getuvalue{%s}\\gray\\char%s");); draw p ;',cs,charnum) + if width < 0.01 then + -- catches zero width marks + context('picture p ; p := textext.drt("\\hskip5sp\\getuvalue{%s}\\gray\\char%s"); draw p ;',cs,charnum) + else + context('picture p ; p := textext.drt("\\getuvalue{%s}\\gray\\char%s"); draw p ;',cs,charnum) + end 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 or 0, vv.kern or 0 - if h and k then - l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) + local slant = { + function(v,dx,dy,txt,xsign,ysign,loc,labloc) + local n = #v + if n > 0 then + local l = { } + for i=1,n do + local c = v[i] + local h = c.height or 0 + local k = c.kern or 0 + l[i] = 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 1/16) 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 1/16) 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 2lw ;",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 or 0, vv.kern or 0 - if h and k then - l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) + context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled 1/16) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1]) +-- context("draw laddered (%s) withcolor .5white ;",table.concat(l,"..")) + context("draw laddered (%..t) withcolor .5white ;",l) + context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled 1/16) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l]) + for i=1,n do + context("draw %s withcolor blue withpen pencircle scaled 2lw ;",l[i]) 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 or 0, vv.kern or 0 - if h and k then - context('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk]) + end, + function(v,dx,dy,txt,xsign,ysign,loc,labloc) + local n = #v + if n > 0 then + local l = { } + for i=1,n do + local c = v[i] + local h = c.height or 0 + local k = c.kern or 0 + l[i] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) + end + if loc == "top" then + context('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[n]) + else + context('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1]) + end + for i=1,n do + local c = v[i] + local h = c.height or 0 + local k = c.kern or 0 + context('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[i]) end 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 + for i=1,#slant do + local s = slant[i] + for k, v in next, kerns do if k == "topright" then - slant(v,width+italic,0,k,1,1,"top","ulft") + s(v,width+italic,0,k,1,1,"top","ulft") elseif k == "bottomright" then - slant(v,width,0,k,1,1,"bot","lrt") + s(v,width,0,k,1,1,"bot","lrt") elseif k == "topleft" then - slant(v,0,0,k,-1,1,"top","ulft") + s(v,0,0,k,-1,1,"top","ulft") elseif k == "bottomleft" then - slant(v,0,0,k,-1,1,"bot","lrt") + s(v,0,0,k,-1,1,"bot","lrt") end end end @@ -205,33 +213,34 @@ local function showglyphshape(specification) 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) + for k, v in next, a do + for i=1,#v do + local p = v[i] + show(p[1],p[2],k .. ":" .. i) end end end local a = anchors.mark if a then - for k, v in pairs(a) do + for k, v in next, a do show(v[1],v[2],k) end end local a = anchors.basechar if a then - for k, v in pairs(a) do + for k, v in next, a do show(v[1],v[2],k) end end local ba = anchors.centry if a then - for k, v in pairs(a) do + for k, v in next, a do show(v[1],v[2],k) end end local a = anchors.cexit if a then - for k, v in pairs(a) do + for k, v in next, a do show(v[1],v[2],k) end end diff --git a/tex/context/modules/mkiv/s-fonts-shapes.mkiv b/tex/context/modules/mkiv/s-fonts-shapes.mkiv index 4a0377ada..53ed1b426 100644 --- a/tex/context/modules/mkiv/s-fonts-shapes.mkiv +++ b/tex/context/modules/mkiv/s-fonts-shapes.mkiv @@ -109,7 +109,11 @@ % \startTEXpage[offset=0pt]\ShowGlyphShape{name:cambria-math}{50bp}{0x1D45D}\stopTEXpage % \page -\showallglyphshapes[name=name:cambria-math,size=100bp] +\startTEXpage[offset=0pt]\ShowGlyphShape{file:husayninotebold.ttf}{50bp}{0xF034A}\stopTEXpage +\startTEXpage[offset=0pt]\ShowGlyphShape{file:husayninotebold.ttf}{50bp}{0x006DD}\stopTEXpage + +% \showallglyphshapes[name=name:cambria-math,size=100bp] +% \showallglyphshapes[name=file:husayninotebold.ttf,size=100bp] % \showallglyphshapes[name=name:dejavuserif,size=100bp] % \showallglyphshapes[name=file:brill.otf,size=100bp] diff --git a/tex/context/modules/mkiv/s-tugboat.mkiv b/tex/context/modules/mkiv/s-tugboat.mkiv index 2b3b07d11..d3d15c3e7 100644 --- a/tex/context/modules/mkiv/s-tugboat.mkiv +++ b/tex/context/modules/mkiv/s-tugboat.mkiv @@ -23,8 +23,7 @@ [tugboat] [type=article, columns=no, - grid=yes - ] + grid=yes] \setvariables [tugboat] @@ -45,7 +44,7 @@ email={tugboat@tug.org}] %D \section Font Setup %<<<1 -%D +%D %D \TUGBOAT\ uses slightly different interline space than the default. %D So we change the interline space. @@ -121,7 +120,7 @@ \setupdescriptions [indentnext=no] -%D \section Itemize +%D \section Itemize %D %D And these. We typeset itemizations ragged right. @@ -158,7 +157,7 @@ subject, subsubject, subsubsubject] [style=bold, align=right, - before={\blank[8pt]}, + before={\blank[8pt]}, after={\blank[4pt]}] %D \section Spacing <<<1 @@ -173,8 +172,8 @@ \setupitemize[1][before={\blank[tugblank]},after={\blank[tugblank]}, inbetween={\blank[tugblank]}] -\setuplines[before={\blank[tugblank]},after={\blank[tugblank]}, - inbetween={\blank[tugblank]}] +\setuplines[before={\blank[tugblank]},after={\blank[tugblank]}, + inbetween={\blank[tugblank]}] %D \section Typing %<<<1 %D @@ -232,7 +231,7 @@ \definereferenceformat[cite][left={[},right={]}] \defineitemgroup [bibliography] [levels=1] -\setupitemgroup [bibliography] +\setupitemgroup [bibliography] [symbol=n, left={[}, right={]}, diff --git a/tex/context/modules/mkiv/x-asciimath.lua b/tex/context/modules/mkiv/x-asciimath.lua index 7785d5587..b0d45659e 100644 --- a/tex/context/modules/mkiv/x-asciimath.lua +++ b/tex/context/modules/mkiv/x-asciimath.lua @@ -50,9 +50,12 @@ local formatters = string.formatters local entities = characters.entities or { } local xmltext = xml.text +local xmlpure = xml.pure local xmlinclusion = xml.inclusion local xmlcollected = xml.collected +local lxmlgetid = lxml.getid + -- todo: use private unicodes as temporary slots ... easier to compare local s_lparent = "\\left\\lparent" @@ -2089,6 +2092,14 @@ interfaces.implement { arguments = { "string", true }, } +interfaces.implement { + name = "xmlasciimath", + actions = function(id) + convert(xmlpure(lxmlgetid(id))) + end, + arguments = "string" +} + local ctx_typebuffer = context.typebuffer local ctx_mathematics = context.mathematics local ctx_color = context.color @@ -2192,7 +2203,7 @@ end function show.filter(id,element) collected, indexed, ignored = { }, { }, { } - asciimath.filter(lxml.getid(id),element or "am",collected,indexed) + asciimath.filter(lxmlgetid(id),element or "am",collected,indexed) end function show.max() diff --git a/tex/context/modules/mkiv/x-asciimath.mkiv b/tex/context/modules/mkiv/x-asciimath.mkiv index 1b0567dbd..32eaf2af2 100644 --- a/tex/context/modules/mkiv/x-asciimath.mkiv +++ b/tex/context/modules/mkiv/x-asciimath.mkiv @@ -182,6 +182,23 @@ {\the\everyasciimath \clf_justasciimath{\detokenize\expandafter{\normalexpanded{#1}}}}} +% \unexpanded\def\xmlasciimath +% {\clf_xmlasciimath} + +\unexpanded\def\xmlasciimath + {\doifnextoptionalelse\xmlasciimath_yes\xmlasciimath_nop} + +\def\xmlasciimath_yes[#1]#2% + {\mathematics + [#1]% + {\the\everyasciimath% + \clf_xmlasciimath{#2}}} + +\def\xmlasciimath_nop#1% + {\mathematics + {\the\everyasciimath + \clf_xmlasciimath{#1}}} + \unexpanded\def\ctxmoduleasciimath#1% {\ctxlua{moduledata.asciimath.#1}} diff --git a/tex/generic/context/luatex/luatex-basics-chr.lua b/tex/generic/context/luatex/luatex-basics-chr.lua index 75dffd192..14a55d7b0 100644 --- a/tex/generic/context/luatex/luatex-basics-chr.lua +++ b/tex/generic/context/luatex/luatex-basics-chr.lua @@ -676,6 +676,17 @@ characters.classifiers={ [2137]=5, [2138]=5, [2139]=5, + [2144]=2, + [2145]=4, + [2146]=2, + [2147]=2, + [2148]=2, + [2149]=2, + [2150]=4, + [2151]=3, + [2152]=2, + [2153]=3, + [2154]=3, [2208]=2, [2209]=2, [2210]=2, @@ -808,6 +819,12 @@ characters.classifiers={ [2765]=5, [2786]=5, [2787]=5, + [2810]=5, + [2811]=5, + [2812]=5, + [2813]=5, + [2814]=5, + [2815]=5, [2817]=5, [2876]=5, [2879]=5, @@ -845,7 +862,10 @@ characters.classifiers={ [3277]=5, [3298]=5, [3299]=5, + [3328]=5, [3329]=5, + [3387]=5, + [3388]=5, [3393]=5, [3394]=5, [3395]=5, @@ -1342,6 +1362,10 @@ characters.classifiers={ [7667]=5, [7668]=5, [7669]=5, + [7670]=5, + [7671]=5, + [7672]=5, + [7673]=5, [7675]=5, [7676]=5, [7677]=5, @@ -1831,6 +1855,49 @@ characters.classifiers={ [71465]=5, [71466]=5, [71467]=5, + [72193]=5, + [72194]=5, + [72195]=5, + [72196]=5, + [72197]=5, + [72198]=5, + [72201]=5, + [72202]=5, + [72243]=5, + [72244]=5, + [72245]=5, + [72246]=5, + [72247]=5, + [72248]=5, + [72251]=5, + [72252]=5, + [72253]=5, + [72254]=5, + [72263]=5, + [72273]=5, + [72274]=5, + [72275]=5, + [72276]=5, + [72277]=5, + [72278]=5, + [72281]=5, + [72282]=5, + [72283]=5, + [72330]=5, + [72331]=5, + [72332]=5, + [72333]=5, + [72334]=5, + [72335]=5, + [72336]=5, + [72337]=5, + [72338]=5, + [72339]=5, + [72340]=5, + [72341]=5, + [72342]=5, + [72344]=5, + [72345]=5, [72752]=5, [72753]=5, [72754]=5, @@ -1878,6 +1945,23 @@ characters.classifiers={ [72883]=5, [72885]=5, [72886]=5, + [73009]=5, + [73010]=5, + [73011]=5, + [73012]=5, + [73013]=5, + [73014]=5, + [73018]=5, + [73020]=5, + [73021]=5, + [73023]=5, + [73024]=5, + [73025]=5, + [73026]=5, + [73027]=5, + [73028]=5, + [73029]=5, + [73031]=5, [92912]=5, [92913]=5, [92914]=5, @@ -2171,4 +2255,992 @@ characters.classifiers={ [1042752]=5, } +characters.indicgroups={ + ["above_mark"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2362]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2385]=true, + [2387]=true, + [2388]=true, + [2389]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2879]=true, + [3008]=true, + [3021]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3149]=true, + [3263]=true, + [3270]=true, + [3406]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, + ["after_half"]={}, + ["after_main"]={ + [2864]=true, + [2879]=true, + [2902]=true, + [3376]=true, + }, + ["after_postscript"]={ + [2433]=true, + [2494]=true, + [2496]=true, + [2519]=true, + [2561]=true, + [2562]=true, + [2622]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2672]=true, + [2673]=true, + [2750]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2786]=true, + [2787]=true, + [2878]=true, + [2880]=true, + [2903]=true, + [2992]=true, + [3006]=true, + [3007]=true, + [3009]=true, + [3010]=true, + [3031]=true, + [3120]=true, + [3248]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3415]=true, + }, + ["after_subscript"]={ + [2366]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2402]=true, + [2403]=true, + [2480]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2530]=true, + [2531]=true, + [2544]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [3008]=true, + [3139]=true, + [3140]=true, + [3267]=true, + [3268]=true, + [3285]=true, + [3286]=true, + }, + ["anudatta"]={ + [2386]=true, + }, + ["before_half"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2503]=true, + [2504]=true, + [2623]=true, + [2751]=true, + [2887]=true, + }, + ["before_main"]={ + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["before_postscript"]={ + [2352]=true, + [2736]=true, + }, + ["before_subscript"]={ + [2608]=true, + [2817]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3142]=true, + [3143]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3157]=true, + [3158]=true, + [3262]=true, + [3263]=true, + [3265]=true, + [3266]=true, + [3270]=true, + [3276]=true, + [3298]=true, + [3299]=true, + }, + ["below_mark"]={ + [2364]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2381]=true, + [2386]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2492]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2509]=true, + [2620]=true, + [2625]=true, + [2626]=true, + [2637]=true, + [2748]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2765]=true, + [2876]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2893]=true, + [2914]=true, + [2915]=true, + [3009]=true, + [3010]=true, + [3170]=true, + [3171]=true, + [3260]=true, + [3298]=true, + [3299]=true, + [3426]=true, + [3427]=true, + }, + ["consonant"]={ + [2325]=true, + [2326]=true, + [2327]=true, + [2328]=true, + [2329]=true, + [2330]=true, + [2331]=true, + [2332]=true, + [2333]=true, + [2334]=true, + [2335]=true, + [2336]=true, + [2337]=true, + [2338]=true, + [2339]=true, + [2340]=true, + [2341]=true, + [2342]=true, + [2343]=true, + [2344]=true, + [2345]=true, + [2346]=true, + [2347]=true, + [2348]=true, + [2349]=true, + [2350]=true, + [2351]=true, + [2352]=true, + [2353]=true, + [2354]=true, + [2355]=true, + [2356]=true, + [2357]=true, + [2358]=true, + [2359]=true, + [2360]=true, + [2361]=true, + [2392]=true, + [2393]=true, + [2394]=true, + [2395]=true, + [2396]=true, + [2397]=true, + [2398]=true, + [2399]=true, + [2424]=true, + [2425]=true, + [2426]=true, + [2453]=true, + [2454]=true, + [2455]=true, + [2456]=true, + [2457]=true, + [2458]=true, + [2459]=true, + [2460]=true, + [2461]=true, + [2462]=true, + [2463]=true, + [2464]=true, + [2465]=true, + [2466]=true, + [2467]=true, + [2468]=true, + [2469]=true, + [2470]=true, + [2471]=true, + [2472]=true, + [2474]=true, + [2475]=true, + [2476]=true, + [2477]=true, + [2478]=true, + [2479]=true, + [2480]=true, + [2482]=true, + [2486]=true, + [2487]=true, + [2488]=true, + [2489]=true, + [2510]=true, + [2524]=true, + [2525]=true, + [2527]=true, + [2581]=true, + [2582]=true, + [2583]=true, + [2584]=true, + [2585]=true, + [2586]=true, + [2587]=true, + [2588]=true, + [2589]=true, + [2590]=true, + [2591]=true, + [2592]=true, + [2593]=true, + [2594]=true, + [2595]=true, + [2596]=true, + [2597]=true, + [2598]=true, + [2599]=true, + [2600]=true, + [2602]=true, + [2603]=true, + [2604]=true, + [2605]=true, + [2606]=true, + [2607]=true, + [2608]=true, + [2610]=true, + [2611]=true, + [2613]=true, + [2614]=true, + [2616]=true, + [2617]=true, + [2649]=true, + [2650]=true, + [2651]=true, + [2652]=true, + [2654]=true, + [2709]=true, + [2710]=true, + [2711]=true, + [2712]=true, + [2713]=true, + [2714]=true, + [2715]=true, + [2716]=true, + [2717]=true, + [2718]=true, + [2719]=true, + [2720]=true, + [2721]=true, + [2722]=true, + [2723]=true, + [2724]=true, + [2725]=true, + [2726]=true, + [2727]=true, + [2728]=true, + [2730]=true, + [2731]=true, + [2732]=true, + [2733]=true, + [2734]=true, + [2735]=true, + [2736]=true, + [2738]=true, + [2739]=true, + [2741]=true, + [2742]=true, + [2743]=true, + [2744]=true, + [2745]=true, + [2837]=true, + [2838]=true, + [2839]=true, + [2840]=true, + [2841]=true, + [2842]=true, + [2843]=true, + [2844]=true, + [2845]=true, + [2846]=true, + [2847]=true, + [2848]=true, + [2849]=true, + [2850]=true, + [2851]=true, + [2852]=true, + [2853]=true, + [2854]=true, + [2855]=true, + [2856]=true, + [2858]=true, + [2859]=true, + [2860]=true, + [2861]=true, + [2862]=true, + [2863]=true, + [2864]=true, + [2866]=true, + [2867]=true, + [2869]=true, + [2870]=true, + [2871]=true, + [2872]=true, + [2873]=true, + [2908]=true, + [2909]=true, + [2929]=true, + [2965]=true, + [2969]=true, + [2970]=true, + [2972]=true, + [2974]=true, + [2975]=true, + [2979]=true, + [2980]=true, + [2984]=true, + [2985]=true, + [2986]=true, + [2990]=true, + [2991]=true, + [2992]=true, + [2993]=true, + [2994]=true, + [2995]=true, + [2996]=true, + [2997]=true, + [2998]=true, + [2999]=true, + [3000]=true, + [3001]=true, + [3093]=true, + [3094]=true, + [3095]=true, + [3096]=true, + [3097]=true, + [3098]=true, + [3099]=true, + [3100]=true, + [3101]=true, + [3102]=true, + [3103]=true, + [3104]=true, + [3105]=true, + [3106]=true, + [3107]=true, + [3108]=true, + [3109]=true, + [3110]=true, + [3111]=true, + [3112]=true, + [3114]=true, + [3115]=true, + [3116]=true, + [3117]=true, + [3118]=true, + [3119]=true, + [3120]=true, + [3121]=true, + [3122]=true, + [3123]=true, + [3124]=true, + [3125]=true, + [3126]=true, + [3127]=true, + [3128]=true, + [3129]=true, + [3133]=true, + [3221]=true, + [3222]=true, + [3223]=true, + [3224]=true, + [3225]=true, + [3226]=true, + [3227]=true, + [3228]=true, + [3229]=true, + [3230]=true, + [3231]=true, + [3232]=true, + [3233]=true, + [3234]=true, + [3235]=true, + [3236]=true, + [3237]=true, + [3238]=true, + [3239]=true, + [3240]=true, + [3242]=true, + [3243]=true, + [3244]=true, + [3245]=true, + [3246]=true, + [3247]=true, + [3248]=true, + [3249]=true, + [3250]=true, + [3251]=true, + [3253]=true, + [3254]=true, + [3255]=true, + [3256]=true, + [3257]=true, + [3294]=true, + [3349]=true, + [3350]=true, + [3351]=true, + [3352]=true, + [3353]=true, + [3354]=true, + [3355]=true, + [3356]=true, + [3357]=true, + [3358]=true, + [3359]=true, + [3360]=true, + [3361]=true, + [3362]=true, + [3363]=true, + [3364]=true, + [3365]=true, + [3366]=true, + [3367]=true, + [3368]=true, + [3369]=true, + [3370]=true, + [3371]=true, + [3372]=true, + [3373]=true, + [3374]=true, + [3375]=true, + [3376]=true, + [3377]=true, + [3378]=true, + [3379]=true, + [3380]=true, + [3381]=true, + [3382]=true, + [3383]=true, + [3384]=true, + [3385]=true, + [3386]=true, + }, + ["dependent_vowel"]={ + [2362]=true, + [2363]=true, + [2366]=true, + [2367]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2382]=true, + [2383]=true, + [2389]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2494]=true, + [2495]=true, + [2496]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2623]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2750]=true, + [2751]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2879]=true, + [2880]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2887]=true, + [2888]=true, + [2891]=true, + [2892]=true, + [2914]=true, + [2915]=true, + [3006]=true, + [3007]=true, + [3008]=true, + [3009]=true, + [3010]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3018]=true, + [3019]=true, + [3020]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3170]=true, + [3171]=true, + [3262]=true, + [3263]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3270]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3298]=true, + [3299]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3398]=true, + [3399]=true, + [3400]=true, + [3402]=true, + [3403]=true, + [3404]=true, + [3415]=true, + [3426]=true, + [3427]=true, + }, + ["halant"]={ + [2381]=true, + [2509]=true, + [2637]=true, + [2765]=true, + [2893]=true, + [3021]=true, + [3149]=true, + [3277]=true, + [3405]=true, + }, + ["independent_vowel"]={ + [2308]=true, + [2309]=true, + [2310]=true, + [2311]=true, + [2312]=true, + [2313]=true, + [2314]=true, + [2315]=true, + [2316]=true, + [2317]=true, + [2318]=true, + [2319]=true, + [2320]=true, + [2321]=true, + [2322]=true, + [2323]=true, + [2324]=true, + [2400]=true, + [2401]=true, + [2418]=true, + [2419]=true, + [2420]=true, + [2421]=true, + [2422]=true, + [2423]=true, + [2437]=true, + [2438]=true, + [2439]=true, + [2440]=true, + [2441]=true, + [2442]=true, + [2443]=true, + [2444]=true, + [2447]=true, + [2448]=true, + [2451]=true, + [2452]=true, + [2528]=true, + [2529]=true, + [2530]=true, + [2531]=true, + [2565]=true, + [2566]=true, + [2567]=true, + [2568]=true, + [2569]=true, + [2570]=true, + [2575]=true, + [2576]=true, + [2579]=true, + [2580]=true, + [2693]=true, + [2694]=true, + [2695]=true, + [2696]=true, + [2697]=true, + [2698]=true, + [2699]=true, + [2700]=true, + [2701]=true, + [2703]=true, + [2704]=true, + [2705]=true, + [2707]=true, + [2708]=true, + [2784]=true, + [2785]=true, + [2786]=true, + [2787]=true, + [2821]=true, + [2822]=true, + [2823]=true, + [2824]=true, + [2825]=true, + [2826]=true, + [2827]=true, + [2828]=true, + [2831]=true, + [2832]=true, + [2835]=true, + [2836]=true, + [2912]=true, + [2913]=true, + [2949]=true, + [2950]=true, + [2951]=true, + [2952]=true, + [2953]=true, + [2954]=true, + [2958]=true, + [2959]=true, + [2960]=true, + [2962]=true, + [2963]=true, + [2964]=true, + [3077]=true, + [3078]=true, + [3079]=true, + [3080]=true, + [3081]=true, + [3082]=true, + [3083]=true, + [3084]=true, + [3086]=true, + [3087]=true, + [3088]=true, + [3090]=true, + [3091]=true, + [3092]=true, + [3168]=true, + [3169]=true, + [3205]=true, + [3206]=true, + [3207]=true, + [3208]=true, + [3209]=true, + [3210]=true, + [3211]=true, + [3212]=true, + [3214]=true, + [3215]=true, + [3216]=true, + [3218]=true, + [3219]=true, + [3220]=true, + [3296]=true, + [3297]=true, + [3333]=true, + [3334]=true, + [3335]=true, + [3336]=true, + [3337]=true, + [3338]=true, + [3339]=true, + [3340]=true, + [3342]=true, + [3343]=true, + [3344]=true, + [3346]=true, + [3347]=true, + [3348]=true, + [3423]=true, + [3424]=true, + [3425]=true, + }, + ["nukta"]={ + [2364]=true, + [2492]=true, + [2620]=true, + [2748]=true, + [2876]=true, + [3260]=true, + }, + ["post_mark"]={ + [2307]=true, + [2363]=true, + [2366]=true, + [2368]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2383]=true, + [2494]=true, + [2496]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2624]=true, + [2750]=true, + [2752]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2880]=true, + [3006]=true, + [3007]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3262]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3415]=true, + }, + ["pre_mark"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2623]=true, + [2751]=true, + [2887]=true, + [2888]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["ra"]={ + [2352]=true, + [2480]=true, + [2608]=true, + [2736]=true, + [2864]=true, + [2992]=true, + [3120]=true, + [3248]=true, + [3376]=true, + }, + ["stress_tone_mark"]={ + [2385]=true, + [2386]=true, + [2387]=true, + [2388]=true, + [2507]=true, + [2508]=true, + [3277]=true, + [3405]=true, + }, + ["twopart_mark"]={ + [2891]={ 2887, 2878 }, + [2892]={ 2887, 2903 }, + [3018]={ 3014, 3006 }, + [3019]={ 3015, 3006 }, + [3020]={ 3014, 3031 }, + [3402]={ 3398, 3390 }, + [3403]={ 3399, 3390 }, + [3404]={ 3398, 3415 }, + }, + ["vowel_modifier"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2307]=true, + [3330]=true, + [3331]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, +} + -- done diff --git a/tex/generic/context/luatex/luatex-basics-prepare.tex b/tex/generic/context/luatex/luatex-basics-prepare.tex index 76a35cc94..47eaa7341 100644 --- a/tex/generic/context/luatex/luatex-basics-prepare.tex +++ b/tex/generic/context/luatex/luatex-basics-prepare.tex @@ -15,6 +15,8 @@ %D is needed because we don't want to load the (mostly not used in generic) data %D files. +%D Indicorder is not yet filled in completely. + \startluacode -- dofile("t:/sources/char-ini.lua") @@ -43,6 +45,7 @@ local first_mandiac, last_mandiac = characters.blockrange("mandiac") local first_nko, last_nko = characters.blockrange("nko") local classifiers = { } +local indicgroups = characters.indicgroups for k, c in next, chardata do if k > 0 then @@ -78,11 +81,14 @@ characters.blockrange = { } %s +%s + -- done ]] ] io.savedata("luatex-basics-chr.lua",template( - table.serialize(classifiers,"characters.classifiers") + table.serialize(classifiers,"characters.classifiers"), + table.serialize(indicgroups,"characters.indicgroups") )) \stopluacode diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index e91fdbd93..97503d8a7 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 03/16/18 22:20:58 +-- merge date : 04/02/18 15:43:20 do -- begin closure to overcome local limits and interference @@ -1976,10 +1976,10 @@ function table.reversed(t) return tt end end -function table.reverse(t) +function table.reverse(t) if t then local n=#t - for i=1,floor(n/2) do + for i=1,floor(n/2) do local j=n-i+1 t[i],t[j]=t[j],t[i] end @@ -3745,13 +3745,15 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring,next=tonumber,type,tostring,next +local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable +local unpack,concat=table.unpack,table.concat local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if LUAVERSION<5.2 then +local oldfashioned=LUAVERSION<5.2 +if oldfashioned then loadstripped=function(str,shortcuts) return load(str) end @@ -4023,7 +4025,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if LUAVERSION<5.2 then +if oldfashioned then preamble=[[ local lpeg=lpeg local type=type @@ -4070,7 +4072,7 @@ else sequenced=table.sequenced, formattednumber=number.formatted, sparseexponent=number.sparseexponent, - formattedfloat=number.formattedfloat + formattedfloat=number.formattedfloat, } end local arguments={ "a1" } @@ -4427,12 +4429,18 @@ local builder=Cs { "start", ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, } -local direct=Cs ( - P("%")*(S("+- .")+R("09"))^0*S("sqidfgGeExXo")*P(-1)/[[local format = string.format return function(str) return format("%0",str) end]] -) +local xx=setmetatable({},{ __index=function(t,k) local v=format("%02x",k) t[k]=v return v end }) +local XX=setmetatable({},{ __index=function(t,k) local v=format("%02X",k) t[k]=v return v end }) +local preset={ + ["%02x"]=function(n) return xx[n] end, + ["%02X"]=function(n) return XX[n] end, +} +local direct=P("%")*(S("+- .")+R("09"))^0*S("sqidfgGeExXo")*P(-1)/[[local format = string.format return function(str) return format("%0",str) end]] local function make(t,str) - local f - local p + local f=preset[str] + if f then + return f + end local p=lpegmatch(direct,str) if p then f=loadstripped(p)() @@ -4453,7 +4461,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if LUAVERSION<5.2 then +if oldfashioned then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -4490,7 +4498,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if LUAVERSION<5.2 then +if oldfashioned then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -6274,6 +6282,17 @@ characters.classifiers={ [2137]=5, [2138]=5, [2139]=5, + [2144]=2, + [2145]=4, + [2146]=2, + [2147]=2, + [2148]=2, + [2149]=2, + [2150]=4, + [2151]=3, + [2152]=2, + [2153]=3, + [2154]=3, [2208]=2, [2209]=2, [2210]=2, @@ -6406,6 +6425,12 @@ characters.classifiers={ [2765]=5, [2786]=5, [2787]=5, + [2810]=5, + [2811]=5, + [2812]=5, + [2813]=5, + [2814]=5, + [2815]=5, [2817]=5, [2876]=5, [2879]=5, @@ -6443,7 +6468,10 @@ characters.classifiers={ [3277]=5, [3298]=5, [3299]=5, + [3328]=5, [3329]=5, + [3387]=5, + [3388]=5, [3393]=5, [3394]=5, [3395]=5, @@ -6940,6 +6968,10 @@ characters.classifiers={ [7667]=5, [7668]=5, [7669]=5, + [7670]=5, + [7671]=5, + [7672]=5, + [7673]=5, [7675]=5, [7676]=5, [7677]=5, @@ -7429,6 +7461,49 @@ characters.classifiers={ [71465]=5, [71466]=5, [71467]=5, + [72193]=5, + [72194]=5, + [72195]=5, + [72196]=5, + [72197]=5, + [72198]=5, + [72201]=5, + [72202]=5, + [72243]=5, + [72244]=5, + [72245]=5, + [72246]=5, + [72247]=5, + [72248]=5, + [72251]=5, + [72252]=5, + [72253]=5, + [72254]=5, + [72263]=5, + [72273]=5, + [72274]=5, + [72275]=5, + [72276]=5, + [72277]=5, + [72278]=5, + [72281]=5, + [72282]=5, + [72283]=5, + [72330]=5, + [72331]=5, + [72332]=5, + [72333]=5, + [72334]=5, + [72335]=5, + [72336]=5, + [72337]=5, + [72338]=5, + [72339]=5, + [72340]=5, + [72341]=5, + [72342]=5, + [72344]=5, + [72345]=5, [72752]=5, [72753]=5, [72754]=5, @@ -7476,6 +7551,23 @@ characters.classifiers={ [72883]=5, [72885]=5, [72886]=5, + [73009]=5, + [73010]=5, + [73011]=5, + [73012]=5, + [73013]=5, + [73014]=5, + [73018]=5, + [73020]=5, + [73021]=5, + [73023]=5, + [73024]=5, + [73025]=5, + [73026]=5, + [73027]=5, + [73028]=5, + [73029]=5, + [73031]=5, [92912]=5, [92913]=5, [92914]=5, @@ -7768,6 +7860,993 @@ characters.classifiers={ [125258]=5, [1042752]=5, } +characters.indicgroups={ + ["above_mark"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2362]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2385]=true, + [2387]=true, + [2388]=true, + [2389]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2879]=true, + [3008]=true, + [3021]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3149]=true, + [3263]=true, + [3270]=true, + [3406]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, + ["after_half"]={}, + ["after_main"]={ + [2864]=true, + [2879]=true, + [2902]=true, + [3376]=true, + }, + ["after_postscript"]={ + [2433]=true, + [2494]=true, + [2496]=true, + [2519]=true, + [2561]=true, + [2562]=true, + [2622]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2672]=true, + [2673]=true, + [2750]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2786]=true, + [2787]=true, + [2878]=true, + [2880]=true, + [2903]=true, + [2992]=true, + [3006]=true, + [3007]=true, + [3009]=true, + [3010]=true, + [3031]=true, + [3120]=true, + [3248]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3415]=true, + }, + ["after_subscript"]={ + [2366]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2402]=true, + [2403]=true, + [2480]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2530]=true, + [2531]=true, + [2544]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [3008]=true, + [3139]=true, + [3140]=true, + [3267]=true, + [3268]=true, + [3285]=true, + [3286]=true, + }, + ["anudatta"]={ + [2386]=true, + }, + ["before_half"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2503]=true, + [2504]=true, + [2623]=true, + [2751]=true, + [2887]=true, + }, + ["before_main"]={ + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["before_postscript"]={ + [2352]=true, + [2736]=true, + }, + ["before_subscript"]={ + [2608]=true, + [2817]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3142]=true, + [3143]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3157]=true, + [3158]=true, + [3262]=true, + [3263]=true, + [3265]=true, + [3266]=true, + [3270]=true, + [3276]=true, + [3298]=true, + [3299]=true, + }, + ["below_mark"]={ + [2364]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2381]=true, + [2386]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2492]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2509]=true, + [2620]=true, + [2625]=true, + [2626]=true, + [2637]=true, + [2748]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2765]=true, + [2876]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2893]=true, + [2914]=true, + [2915]=true, + [3009]=true, + [3010]=true, + [3170]=true, + [3171]=true, + [3260]=true, + [3298]=true, + [3299]=true, + [3426]=true, + [3427]=true, + }, + ["consonant"]={ + [2325]=true, + [2326]=true, + [2327]=true, + [2328]=true, + [2329]=true, + [2330]=true, + [2331]=true, + [2332]=true, + [2333]=true, + [2334]=true, + [2335]=true, + [2336]=true, + [2337]=true, + [2338]=true, + [2339]=true, + [2340]=true, + [2341]=true, + [2342]=true, + [2343]=true, + [2344]=true, + [2345]=true, + [2346]=true, + [2347]=true, + [2348]=true, + [2349]=true, + [2350]=true, + [2351]=true, + [2352]=true, + [2353]=true, + [2354]=true, + [2355]=true, + [2356]=true, + [2357]=true, + [2358]=true, + [2359]=true, + [2360]=true, + [2361]=true, + [2392]=true, + [2393]=true, + [2394]=true, + [2395]=true, + [2396]=true, + [2397]=true, + [2398]=true, + [2399]=true, + [2424]=true, + [2425]=true, + [2426]=true, + [2453]=true, + [2454]=true, + [2455]=true, + [2456]=true, + [2457]=true, + [2458]=true, + [2459]=true, + [2460]=true, + [2461]=true, + [2462]=true, + [2463]=true, + [2464]=true, + [2465]=true, + [2466]=true, + [2467]=true, + [2468]=true, + [2469]=true, + [2470]=true, + [2471]=true, + [2472]=true, + [2474]=true, + [2475]=true, + [2476]=true, + [2477]=true, + [2478]=true, + [2479]=true, + [2480]=true, + [2482]=true, + [2486]=true, + [2487]=true, + [2488]=true, + [2489]=true, + [2510]=true, + [2524]=true, + [2525]=true, + [2527]=true, + [2581]=true, + [2582]=true, + [2583]=true, + [2584]=true, + [2585]=true, + [2586]=true, + [2587]=true, + [2588]=true, + [2589]=true, + [2590]=true, + [2591]=true, + [2592]=true, + [2593]=true, + [2594]=true, + [2595]=true, + [2596]=true, + [2597]=true, + [2598]=true, + [2599]=true, + [2600]=true, + [2602]=true, + [2603]=true, + [2604]=true, + [2605]=true, + [2606]=true, + [2607]=true, + [2608]=true, + [2610]=true, + [2611]=true, + [2613]=true, + [2614]=true, + [2616]=true, + [2617]=true, + [2649]=true, + [2650]=true, + [2651]=true, + [2652]=true, + [2654]=true, + [2709]=true, + [2710]=true, + [2711]=true, + [2712]=true, + [2713]=true, + [2714]=true, + [2715]=true, + [2716]=true, + [2717]=true, + [2718]=true, + [2719]=true, + [2720]=true, + [2721]=true, + [2722]=true, + [2723]=true, + [2724]=true, + [2725]=true, + [2726]=true, + [2727]=true, + [2728]=true, + [2730]=true, + [2731]=true, + [2732]=true, + [2733]=true, + [2734]=true, + [2735]=true, + [2736]=true, + [2738]=true, + [2739]=true, + [2741]=true, + [2742]=true, + [2743]=true, + [2744]=true, + [2745]=true, + [2837]=true, + [2838]=true, + [2839]=true, + [2840]=true, + [2841]=true, + [2842]=true, + [2843]=true, + [2844]=true, + [2845]=true, + [2846]=true, + [2847]=true, + [2848]=true, + [2849]=true, + [2850]=true, + [2851]=true, + [2852]=true, + [2853]=true, + [2854]=true, + [2855]=true, + [2856]=true, + [2858]=true, + [2859]=true, + [2860]=true, + [2861]=true, + [2862]=true, + [2863]=true, + [2864]=true, + [2866]=true, + [2867]=true, + [2869]=true, + [2870]=true, + [2871]=true, + [2872]=true, + [2873]=true, + [2908]=true, + [2909]=true, + [2929]=true, + [2965]=true, + [2969]=true, + [2970]=true, + [2972]=true, + [2974]=true, + [2975]=true, + [2979]=true, + [2980]=true, + [2984]=true, + [2985]=true, + [2986]=true, + [2990]=true, + [2991]=true, + [2992]=true, + [2993]=true, + [2994]=true, + [2995]=true, + [2996]=true, + [2997]=true, + [2998]=true, + [2999]=true, + [3000]=true, + [3001]=true, + [3093]=true, + [3094]=true, + [3095]=true, + [3096]=true, + [3097]=true, + [3098]=true, + [3099]=true, + [3100]=true, + [3101]=true, + [3102]=true, + [3103]=true, + [3104]=true, + [3105]=true, + [3106]=true, + [3107]=true, + [3108]=true, + [3109]=true, + [3110]=true, + [3111]=true, + [3112]=true, + [3114]=true, + [3115]=true, + [3116]=true, + [3117]=true, + [3118]=true, + [3119]=true, + [3120]=true, + [3121]=true, + [3122]=true, + [3123]=true, + [3124]=true, + [3125]=true, + [3126]=true, + [3127]=true, + [3128]=true, + [3129]=true, + [3133]=true, + [3221]=true, + [3222]=true, + [3223]=true, + [3224]=true, + [3225]=true, + [3226]=true, + [3227]=true, + [3228]=true, + [3229]=true, + [3230]=true, + [3231]=true, + [3232]=true, + [3233]=true, + [3234]=true, + [3235]=true, + [3236]=true, + [3237]=true, + [3238]=true, + [3239]=true, + [3240]=true, + [3242]=true, + [3243]=true, + [3244]=true, + [3245]=true, + [3246]=true, + [3247]=true, + [3248]=true, + [3249]=true, + [3250]=true, + [3251]=true, + [3253]=true, + [3254]=true, + [3255]=true, + [3256]=true, + [3257]=true, + [3294]=true, + [3349]=true, + [3350]=true, + [3351]=true, + [3352]=true, + [3353]=true, + [3354]=true, + [3355]=true, + [3356]=true, + [3357]=true, + [3358]=true, + [3359]=true, + [3360]=true, + [3361]=true, + [3362]=true, + [3363]=true, + [3364]=true, + [3365]=true, + [3366]=true, + [3367]=true, + [3368]=true, + [3369]=true, + [3370]=true, + [3371]=true, + [3372]=true, + [3373]=true, + [3374]=true, + [3375]=true, + [3376]=true, + [3377]=true, + [3378]=true, + [3379]=true, + [3380]=true, + [3381]=true, + [3382]=true, + [3383]=true, + [3384]=true, + [3385]=true, + [3386]=true, + }, + ["dependent_vowel"]={ + [2362]=true, + [2363]=true, + [2366]=true, + [2367]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2382]=true, + [2383]=true, + [2389]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2494]=true, + [2495]=true, + [2496]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2623]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2750]=true, + [2751]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2879]=true, + [2880]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2887]=true, + [2888]=true, + [2891]=true, + [2892]=true, + [2914]=true, + [2915]=true, + [3006]=true, + [3007]=true, + [3008]=true, + [3009]=true, + [3010]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3018]=true, + [3019]=true, + [3020]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3170]=true, + [3171]=true, + [3262]=true, + [3263]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3270]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3298]=true, + [3299]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3398]=true, + [3399]=true, + [3400]=true, + [3402]=true, + [3403]=true, + [3404]=true, + [3415]=true, + [3426]=true, + [3427]=true, + }, + ["halant"]={ + [2381]=true, + [2509]=true, + [2637]=true, + [2765]=true, + [2893]=true, + [3021]=true, + [3149]=true, + [3277]=true, + [3405]=true, + }, + ["independent_vowel"]={ + [2308]=true, + [2309]=true, + [2310]=true, + [2311]=true, + [2312]=true, + [2313]=true, + [2314]=true, + [2315]=true, + [2316]=true, + [2317]=true, + [2318]=true, + [2319]=true, + [2320]=true, + [2321]=true, + [2322]=true, + [2323]=true, + [2324]=true, + [2400]=true, + [2401]=true, + [2418]=true, + [2419]=true, + [2420]=true, + [2421]=true, + [2422]=true, + [2423]=true, + [2437]=true, + [2438]=true, + [2439]=true, + [2440]=true, + [2441]=true, + [2442]=true, + [2443]=true, + [2444]=true, + [2447]=true, + [2448]=true, + [2451]=true, + [2452]=true, + [2528]=true, + [2529]=true, + [2530]=true, + [2531]=true, + [2565]=true, + [2566]=true, + [2567]=true, + [2568]=true, + [2569]=true, + [2570]=true, + [2575]=true, + [2576]=true, + [2579]=true, + [2580]=true, + [2693]=true, + [2694]=true, + [2695]=true, + [2696]=true, + [2697]=true, + [2698]=true, + [2699]=true, + [2700]=true, + [2701]=true, + [2703]=true, + [2704]=true, + [2705]=true, + [2707]=true, + [2708]=true, + [2784]=true, + [2785]=true, + [2786]=true, + [2787]=true, + [2821]=true, + [2822]=true, + [2823]=true, + [2824]=true, + [2825]=true, + [2826]=true, + [2827]=true, + [2828]=true, + [2831]=true, + [2832]=true, + [2835]=true, + [2836]=true, + [2912]=true, + [2913]=true, + [2949]=true, + [2950]=true, + [2951]=true, + [2952]=true, + [2953]=true, + [2954]=true, + [2958]=true, + [2959]=true, + [2960]=true, + [2962]=true, + [2963]=true, + [2964]=true, + [3077]=true, + [3078]=true, + [3079]=true, + [3080]=true, + [3081]=true, + [3082]=true, + [3083]=true, + [3084]=true, + [3086]=true, + [3087]=true, + [3088]=true, + [3090]=true, + [3091]=true, + [3092]=true, + [3168]=true, + [3169]=true, + [3205]=true, + [3206]=true, + [3207]=true, + [3208]=true, + [3209]=true, + [3210]=true, + [3211]=true, + [3212]=true, + [3214]=true, + [3215]=true, + [3216]=true, + [3218]=true, + [3219]=true, + [3220]=true, + [3296]=true, + [3297]=true, + [3333]=true, + [3334]=true, + [3335]=true, + [3336]=true, + [3337]=true, + [3338]=true, + [3339]=true, + [3340]=true, + [3342]=true, + [3343]=true, + [3344]=true, + [3346]=true, + [3347]=true, + [3348]=true, + [3423]=true, + [3424]=true, + [3425]=true, + }, + ["nukta"]={ + [2364]=true, + [2492]=true, + [2620]=true, + [2748]=true, + [2876]=true, + [3260]=true, + }, + ["post_mark"]={ + [2307]=true, + [2363]=true, + [2366]=true, + [2368]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2383]=true, + [2494]=true, + [2496]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2624]=true, + [2750]=true, + [2752]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2880]=true, + [3006]=true, + [3007]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3262]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3415]=true, + }, + ["pre_mark"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2623]=true, + [2751]=true, + [2887]=true, + [2888]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["ra"]={ + [2352]=true, + [2480]=true, + [2608]=true, + [2736]=true, + [2864]=true, + [2992]=true, + [3120]=true, + [3248]=true, + [3376]=true, + }, + ["stress_tone_mark"]={ + [2385]=true, + [2386]=true, + [2387]=true, + [2388]=true, + [2507]=true, + [2508]=true, + [3277]=true, + [3405]=true, + }, + ["twopart_mark"]={ + [2891]={ 2887,2878 }, + [2892]={ 2887,2903 }, + [3018]={ 3014,3006 }, + [3019]={ 3015,3006 }, + [3020]={ 3014,3031 }, + [3402]={ 3398,3390 }, + [3403]={ 3399,3390 }, + [3404]={ 3398,3415 }, + }, + ["vowel_modifier"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2307]=true, + [3330]=true, + [3331]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, +} end -- closure @@ -8167,12 +9246,22 @@ function constructors.scale(tfmdata,specification) else target.slant=0 end + local mode=parameters.mode or 0 + if mode~=0 then + target.mode=mode + end + local width=parameters.width or 0 + if width~=0 then + target.width=width + end targetparameters.factor=delta targetparameters.hfactor=hdelta targetparameters.vfactor=vdelta targetparameters.size=scaledpoints targetparameters.units=units targetparameters.scaledpoints=askedscaledpoints + targetparameters.mode=mode + targetparameters.width=width local isvirtual=properties.virtualized or tfmdata.type=="virtual" local hasquality=parameters.expansion or parameters.protrusion local hasitalics=properties.hasitalics @@ -8508,7 +9597,9 @@ function constructors.scale(tfmdata,specification) constructors.aftercopyingcharacters(target,tfmdata) constructors.trytosharefont(target,tfmdata) local vfonts=target.fonts - if isvirtual then +if isvirtual or target.type=="virtual" or properties.virtualized then + properties.virtualized=true +target.type="virtual" if not vfonts or #vfonts==0 then target.fonts={ { id=0 } } end @@ -8545,6 +9636,12 @@ function constructors.finalize(tfmdata) if not parameters.size then parameters.size=tfmdata.size end + if not parameters.mode then + parameters.mode=0 + end + if not parameters.width then + parameters.width=0 + end if not parameters.extendfactor then parameters.extendfactor=tfmdata.extend or 0 end @@ -8627,6 +9724,8 @@ function constructors.finalize(tfmdata) tfmdata.step=nil tfmdata.extend=nil tfmdata.slant=nil + tfmdata.mode=nil + tfmdata.width=nil tfmdata.units=nil tfmdata.units_per_em=nil tfmdata.cache=nil @@ -23720,7 +24819,7 @@ function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,st elseif b then local x,y,w,h=setposition(2,snext,factor,rlmode,b,injection) if trace_kerns then - local startchar=getchar(snext) + local startchar=getchar(start) logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") end start=snext @@ -26618,7 +27717,7 @@ if not modules then modules={} end modules ['font-osd']={ } local insert,imerge,copy=table.insert,table.imerge,table.copy local next,type=next,type -local report_devanagari=logs.reporter("otf","devanagari") +local report=logs.reporter("otf","devanagari") fonts=fonts or {} fonts.analyzers=fonts.analyzers or {} fonts.analyzers.methods=fonts.analyzers.methods or { node={ otf={} } } @@ -26655,6 +27754,9 @@ local fontdata=fonts.hashes.identifiers local a_state=attributes.private('state') local a_syllabe=attributes.private('syllabe') local dotted_circle=0x25CC +local c_nbsp=0x00A0 +local c_zwnj=0x200C +local c_zwj=0x200D local states=fonts.analyzers.states local s_rphf=states.rphf local s_half=states.half @@ -26683,199 +27785,144 @@ end local function processcharacters(head,font) return tonut(xprocesscharacters(tonode(head))) end -local consonant={ - [0x0915]=true,[0x0916]=true,[0x0917]=true,[0x0918]=true, - [0x0919]=true,[0x091A]=true,[0x091B]=true,[0x091C]=true, - [0x091D]=true,[0x091E]=true,[0x091F]=true,[0x0920]=true, - [0x0921]=true,[0x0922]=true,[0x0923]=true,[0x0924]=true, - [0x0925]=true,[0x0926]=true,[0x0927]=true,[0x0928]=true, - [0x0929]=true,[0x092A]=true,[0x092B]=true,[0x092C]=true, - [0x092D]=true,[0x092E]=true,[0x092F]=true,[0x0930]=true, - [0x0931]=true,[0x0932]=true,[0x0933]=true,[0x0934]=true, - [0x0935]=true,[0x0936]=true,[0x0937]=true,[0x0938]=true, - [0x0939]=true,[0x0958]=true,[0x0959]=true,[0x095A]=true, - [0x095B]=true,[0x095C]=true,[0x095D]=true,[0x095E]=true, - [0x095F]=true,[0x0979]=true,[0x097A]=true, - [0x0C95]=true,[0x0C96]=true,[0x0C97]=true,[0x0C98]=true, - [0x0C99]=true,[0x0C9A]=true,[0x0C9B]=true,[0x0C9C]=true, - [0x0C9D]=true,[0x0C9E]=true,[0x0C9F]=true,[0x0CA0]=true, - [0x0CA1]=true,[0x0CA2]=true,[0x0CA3]=true,[0x0CA4]=true, - [0x0CA5]=true,[0x0CA6]=true,[0x0CA7]=true,[0x0CA8]=true, - [0x0CA9]=true,[0x0CAA]=true,[0x0CAB]=true,[0x0CAC]=true, - [0x0CAD]=true,[0x0CAE]=true,[0x0CAF]=true,[0x0CB0]=true, - [0x0CB1]=true,[0x0CB2]=true,[0x0CB3]=true,[0x0CB4]=true, - [0x0CB5]=true,[0x0CB6]=true,[0x0CB7]=true,[0x0CB8]=true, - [0x0CB9]=true, - [0x0CDE]=true, - [0x0D15]=true,[0x0D16]=true,[0x0D17]=true,[0x0D18]=true, - [0x0D19]=true,[0x0D1A]=true,[0x0D1B]=true,[0x0D1C]=true, - [0x0D1D]=true,[0x0D1E]=true,[0x0D1F]=true,[0x0D20]=true, - [0x0D21]=true,[0x0D22]=true,[0x0D23]=true,[0x0D24]=true, - [0x0D25]=true,[0x0D26]=true,[0x0D27]=true,[0x0D28]=true, - [0x0D29]=true,[0x0D2A]=true,[0x0D2B]=true,[0x0D2C]=true, - [0x0D2D]=true,[0x0D2E]=true,[0x0D2F]=true,[0x0D30]=true, - [0x0D31]=true,[0x0D32]=true,[0x0D33]=true,[0x0D34]=true, - [0x0D35]=true,[0x0D36]=true,[0x0D37]=true,[0x0D38]=true, - [0x0D39]=true,[0x0D3A]=true, -} -local independent_vowel={ - [0x0904]=true,[0x0905]=true,[0x0906]=true,[0x0907]=true, - [0x0908]=true,[0x0909]=true,[0x090A]=true,[0x090B]=true, - [0x090C]=true,[0x090D]=true,[0x090E]=true,[0x090F]=true, - [0x0910]=true,[0x0911]=true,[0x0912]=true,[0x0913]=true, - [0x0914]=true,[0x0960]=true,[0x0961]=true,[0x0972]=true, - [0x0973]=true,[0x0974]=true,[0x0975]=true,[0x0976]=true, - [0x0977]=true, - [0x0C85]=true,[0x0C86]=true,[0x0C87]=true,[0x0C88]=true, - [0x0C89]=true,[0x0C8A]=true,[0x0C8B]=true,[0x0C8C]=true, - [0x0C8D]=true,[0x0C8E]=true,[0x0C8F]=true,[0x0C90]=true, - [0x0C91]=true,[0x0C92]=true,[0x0C93]=true,[0x0C94]=true, - [0x0D05]=true,[0x0D06]=true,[0x0D07]=true,[0x0D08]=true, - [0x0D09]=true,[0x0D0A]=true,[0x0D0B]=true,[0x0D0C]=true, - [0x0D0E]=true,[0x0D0F]=true,[0x0D10]=true,[0x0D12]=true, - [0x0D13]=true,[0x0D14]=true, -} -local dependent_vowel={ - [0x093A]=true,[0x093B]=true,[0x093E]=true,[0x093F]=true, - [0x0940]=true,[0x0941]=true,[0x0942]=true,[0x0943]=true, - [0x0944]=true,[0x0945]=true,[0x0946]=true,[0x0947]=true, - [0x0948]=true,[0x0949]=true,[0x094A]=true,[0x094B]=true, - [0x094C]=true,[0x094E]=true,[0x094F]=true,[0x0955]=true, - [0x0956]=true,[0x0957]=true,[0x0962]=true,[0x0963]=true, - [0x0CBE]=true,[0x0CBF]=true,[0x0CC0]=true,[0x0CC1]=true, - [0x0CC2]=true,[0x0CC3]=true,[0x0CC4]=true,[0x0CC5]=true, - [0x0CC6]=true,[0x0CC7]=true,[0x0CC8]=true,[0x0CC9]=true, - [0x0CCA]=true,[0x0CCB]=true,[0x0CCC]=true, - [0x0D3E]=true,[0x0D3F]=true,[0x0D40]=true,[0x0D41]=true, - [0x0D42]=true,[0x0D43]=true,[0x0D44]=true,[0x0D46]=true, - [0x0D47]=true,[0x0D48]=true,[0x0D4A]=true,[0x0D4B]=true, - [0x0D4C]=true,[0x0D57]=true, -} -local vowel_modifier={ - [0x0900]=true,[0x0901]=true,[0x0902]=true,[0x0903]=true, - [0xA8E0]=true,[0xA8E1]=true,[0xA8E2]=true,[0xA8E3]=true, - [0xA8E4]=true,[0xA8E5]=true,[0xA8E6]=true,[0xA8E7]=true, - [0xA8E8]=true,[0xA8E9]=true,[0xA8EA]=true,[0xA8EB]=true, - [0xA8EC]=true,[0xA8ED]=true,[0xA8EE]=true,[0xA8EF]=true, - [0xA8F0]=true,[0xA8F1]=true, - [0x0D02]=true,[0x0D03]=true, -} -local stress_tone_mark={ - [0x0951]=true,[0x0952]=true,[0x0953]=true,[0x0954]=true, - [0x0CCD]=true, - [0x0D4D]=true, -} -local nukta={ - [0x093C]=true, - [0x0CBC]=true, -} -local halant={ - [0x094D]=true, - [0x0CCD]=true, - [0x0D4D]=true, -} -local ra={ - [0x0930]=true, - [0x0CB0]=true, - [0x0D30]=true, -} -local c_anudatta=0x0952 -local c_nbsp=0x00A0 -local c_zwnj=0x200C -local c_zwj=0x200D +local indicgroups=characters and characters.indicgroups +if not indicgroups and characters then + local indic={ + c={}, + i={}, + d={}, + m={}, + s={}, + o={}, + } + local indicmarks={ + l={}, + t={}, + b={}, + r={}, + s={}, + } + local indicclasses={ + nukta={}, + halant={}, + ra={}, + anudatta={}, + } + local indicorders={ + bp={}, + ap={}, + bs={}, + as={}, + bh={}, + ah={}, + bm={}, + am={}, + } + for k,v in next,characters.data do + local i=v.indic + if i then + indic[i][k]=true + i=v.indicmark + if i then + if i=="s" then + local s=v.specials + indicmarks[i][k]={ s[2],s[3] } + else + indicmarks[i][k]=true + end + end + i=v.indicclass + if i then + indicclasses[i][k]=true + end + i=v.indicorder + if i then + indicorders[i][k]=true + end + end + end + indicgroups={ + consonant=indic.c, + independent_vowel=indic.i, + dependent_vowel=indic.d, + vowel_modifier=indic.m, + stress_tone_mark=indic.s, + pre_mark=indicmarks.l, + above_mark=indicmarks.t, + below_mark=indicmarks.b, + post_mark=indicmarks.r, + twopart_mark=indicmarks.s, + nukta=indicclasses.nukta, + halant=indicclasses.halant, + ra=indicclasses.ra, + anudatta=indicclasses.anudatta, + before_postscript=indicorders.bp, + after_postscript=indicorders.ap, + before_half=indicorders.bh, + after_half=indicorders.ah, + before_subscript=indicorders.bs, + after_subscript=indicorders.as, + before_main=indicorders.bm, + after_main=indicorders.am, + } + indic=nil + indicmarks=nil + indicclasses=nil + indicorders=nil + characters.indicgroups=indicgroups +else + indicgroups=table.setmetatableindex("table") +end +local consonant=indicgroups.consonant +local independent_vowel=indicgroups.independent_vowel +local dependent_vowel=indicgroups.dependent_vowel +local vowel_modifier=indicgroups.vowel_modifier +local stress_tone_mark=indicgroups.stress_tone_mark +local pre_mark=indicgroups.pre_mark +local above_mark=indicgroups.above_mark +local below_mark=indicgroups.below_mark +local post_mark=indicgroups.post_mark +local twopart_mark=indicgroups.twopart_mark +local nukta=indicgroups.nukta +local halant=indicgroups.halant +local ra=indicgroups.ra +local anudatta=indicgroups.anudatta +local before_postscript=indicgroups.before_postscript +local after_postscript=indicgroups.after_postscript +local before_half=indicgroups.before_half +local after_half=indicgroups.after_half +local before_subscript=indicgroups.before_subscript +local after_subscript=indicgroups.after_subscript +local before_main=indicgroups.before_main +local after_main=indicgroups.after_main +local mark_four=table.merged ( + pre_mark, + above_mark, + below_mark, + post_mark +) +local mark_above_below_post=table.merged ( + above_mark, + below_mark, + post_mark +) local zw_char={ - [0x200C]=true, - [0x200D]=true, -} -local pre_mark={ - [0x093F]=true,[0x094E]=true, - [0x0D46]=true,[0x0D47]=true,[0x0D48]=true, -} -local above_mark={ - [0x0900]=true,[0x0901]=true,[0x0902]=true,[0x093A]=true, - [0x0945]=true,[0x0946]=true,[0x0947]=true,[0x0948]=true, - [0x0951]=true,[0x0953]=true,[0x0954]=true,[0x0955]=true, - [0xA8E0]=true,[0xA8E1]=true,[0xA8E2]=true,[0xA8E3]=true, - [0xA8E4]=true,[0xA8E5]=true,[0xA8E6]=true,[0xA8E7]=true, - [0xA8E8]=true,[0xA8E9]=true,[0xA8EA]=true,[0xA8EB]=true, - [0xA8EC]=true,[0xA8ED]=true,[0xA8EE]=true,[0xA8EF]=true, - [0xA8F0]=true,[0xA8F1]=true, - [0x0D4E]=true, -} -local below_mark={ - [0x093C]=true,[0x0941]=true,[0x0942]=true,[0x0943]=true, - [0x0944]=true,[0x094D]=true,[0x0952]=true,[0x0956]=true, - [0x0957]=true,[0x0962]=true,[0x0963]=true, -} -local post_mark={ - [0x0903]=true,[0x093B]=true,[0x093E]=true,[0x0940]=true, - [0x0949]=true,[0x094A]=true,[0x094B]=true,[0x094C]=true, - [0x094F]=true, -} -local twopart_mark={ - [0x0D4A]={ 0x0D46,0x0D3E,}, - [0x0D4B]={ 0x0D47,0x0D3E,}, - [0x0D4C]={ 0x0D46,0x0D57,}, -} -local mark_four={} -for k,v in next,pre_mark do mark_four[k]=pre_mark end -for k,v in next,above_mark do mark_four[k]=above_mark end -for k,v in next,below_mark do mark_four[k]=below_mark end -for k,v in next,post_mark do mark_four[k]=post_mark end -local mark_above_below_post={} -for k,v in next,above_mark do mark_above_below_post[k]=above_mark end -for k,v in next,below_mark do mark_above_below_post[k]=below_mark end -for k,v in next,post_mark do mark_above_below_post[k]=post_mark end -local reorder_class={ - [0x0930]="before postscript", - [0x093F]="before half", - [0x0940]="after subscript", - [0x0941]="after subscript", - [0x0942]="after subscript", - [0x0943]="after subscript", - [0x0944]="after subscript", - [0x0945]="after subscript", - [0x0946]="after subscript", - [0x0947]="after subscript", - [0x0948]="after subscript", - [0x0949]="after subscript", - [0x094A]="after subscript", - [0x094B]="after subscript", - [0x094C]="after subscript", - [0x0962]="after subscript", - [0x0963]="after subscript", - [0x093E]="after subscript", - [0x0CB0]="after postscript", - [0x0CBF]="before subscript", - [0x0CC6]="before subscript", - [0x0CCC]="before subscript", - [0x0CBE]="before subscript", - [0x0CE2]="before subscript", - [0x0CE3]="before subscript", - [0x0CC1]="before subscript", - [0x0CC2]="before subscript", - [0x0CC3]="after subscript", - [0x0CC4]="after subscript", - [0x0CD5]="after subscript", - [0x0CD6]="after subscript", + [c_zwnj]=true, + [c_zwj ]=true, } local dflt_true={ dflt=true } -local dev2_defaults={ +local two_defaults={ dev2=dflt_true, } -local deva_defaults={ +local one_defaults={ dev2=dflt_true, deva=dflt_true, } local false_flags={ false,false,false,false } -local both_joiners_true={ - [0x200C]=true, - [0x200D]=true, -} local sequence_reorder_matras={ - features={ dv01=dev2_defaults }, + features={ dv01=two_defaults }, flags=false_flags, name="dv01_reorder_matras", order={ "dv01" }, @@ -26888,7 +27935,7 @@ local sequence_reorder_matras={ } } local sequence_reorder_reph={ - features={ dv02=dev2_defaults }, + features={ dv02=two_defaults }, flags=false_flags, name="dv02_reorder_reph", order={ "dv02" }, @@ -26901,7 +27948,7 @@ local sequence_reorder_reph={ } } local sequence_reorder_pre_base_reordering_consonants={ - features={ dv03=dev2_defaults }, + features={ dv03=two_defaults }, flags=false_flags, name="dv03_reorder_pre_base_reordering_consonants", order={ "dv03" }, @@ -26914,7 +27961,7 @@ local sequence_reorder_pre_base_reordering_consonants={ } } local sequence_remove_joiners={ - features={ dv04=deva_defaults }, + features={ dv04=one_defaults }, flags=false_flags, name="dv04_remove_joiners", order={ "dv04" }, @@ -26922,40 +27969,73 @@ local sequence_remove_joiners={ nofsteps=1, steps={ { - coverage=both_joiners_true, + coverage=zw_char, }, } } local basic_shaping_forms={ - nukt=true, + init=true, + abvs=true, akhn=true, - rphf=true, - pref=true, - rkrf=true, blwf=true, + calt=true, + cjct=true, half=true, + haln=true, + nukt=true, + pref=true, + pres=true, pstf=true, + psts=true, + rkrf=true, + rphf=true, vatu=true, - cjct=true, } local valid={ + abvs=true, akhn=true, - rphf=true, - pref=true, - half=true, blwf=true, + calt=true, + cjct=true, + half=true, + haln=true, + nukt=true, + pref=true, + pres=true, pstf=true, + psts=true, + rkrf=true, + rphf=true, + vatu=true, pres=true, + abvs=true, blws=true, psts=true, + haln=true, + calt=true, } +local scripts={} +local scripts_one={ "deva","mlym","beng","gujr","guru","knda","orya","taml","telu" } +local scripts_two={ "dev2","mlm2","bng2","gjr2","gur2","knd2","ory2","tml2","tel2" } +local nofscripts=#scripts_one +for i=1,nofscripts do + local one=scripts_one[i] + local two=scripts_two[i] + scripts[one]=true + scripts[two]=true + two_defaults[one]=dflt_true + one_defaults[one]=dflt_true + one_defaults[two]=dflt_true +end +local function valid_one(s) for i=1,nofscripts do if s[scripts_one[i]] then return true end end end +local function valid_two(s) for i=1,nofscripts do if s[scripts_two[i]] then return true end end end local function initializedevanagi(tfmdata) local script,language=otf.scriptandlanguage(tfmdata,attr) - if script=="deva" or script=="dev2" or script=="mlym" or script=="mlm2" then + if scripts[script] then local resources=tfmdata.resources local devanagari=resources.devanagari if not devanagari then - report_devanagari("adding devanagari features to font") + report("adding devanagari features to font") local gsubfeatures=resources.features.gsub local sequences=resources.sequences local sharedfeatures=tfmdata.shared.features @@ -26971,10 +28051,10 @@ local function initializedevanagi(tfmdata) end end local insertindex=lastmatch+1 - gsubfeatures["dv01"]=dev2_defaults - gsubfeatures["dv02"]=dev2_defaults - gsubfeatures["dv03"]=dev2_defaults - gsubfeatures["dv04"]=deva_defaults + gsubfeatures["dv01"]=two_defaults + gsubfeatures["dv02"]=two_defaults + gsubfeatures["dv03"]=two_defaults + gsubfeatures["dv04"]=one_defaults local reorder_pre_base_reordering_consonants=copy(sequence_reorder_pre_base_reordering_consonants) local reorder_reph=copy(sequence_reorder_reph) local reorder_matras=copy(sequence_reorder_matras) @@ -27022,8 +28102,8 @@ local function initializedevanagi(tfmdata) end end end - for kind,spec in next,features do - if spec.dev2 and valid[kind] then + for kind,spec in next,features do + if valid[kind] and valid_two(spec)then for i=1,nofsteps do local step=steps[i] local coverage=step.coverage @@ -27047,7 +28127,9 @@ local function initializedevanagi(tfmdata) end end end - seqsubset[#seqsubset+1]={ kind,coverage,reph } +if reph then + seqsubset[#seqsubset+1]={ kind,coverage,reph } +end end end end @@ -27092,8 +28174,14 @@ local function initializedevanagi(tfmdata) sharedfeatures["pstf"]=true sharedfeatures["pref"]=true sharedfeatures["dv03"]=true - gsubfeatures ["dv03"]=dev2_defaults + gsubfeatures ["dv03"]=two_defaults insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants) + elseif script=="taml" then + sharedfeatures["dv04"]=true +sharedfeatures["pstf"]=true + elseif script=="tml2" then + else + report("todo: enable the right features for script %a",script) end end end @@ -27106,7 +28194,7 @@ registerotffeature { node=initializedevanagi, }, } -local function deva_initialize(font,attr) +local function initialize_one(font,attr) local tfmdata=fontdata[font] local datasets=otf.dataset(tfmdata,font,attr) local devanagaridata=datasets.devanagari @@ -27134,8 +28222,8 @@ local function deva_initialize(font,attr) end return devanagaridata.reph,devanagaridata.vattu,devanagaridata.blwfcache end -local function deva_reorder(head,start,stop,font,attr,nbspaces) - local reph,vattu,blwfcache=deva_initialize(font,attr) +local function reorder_one(head,start,stop,font,attr,nbspaces) + local reph,vattu,blwfcache=initialize_one(font,attr) local current=start local n=getnext(start) local base=nil @@ -27166,40 +28254,40 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) lastcons=current current=getnext(current) if current~=stop then - if nukta[getchar(current)] then + local char=getchar(current) + if nukta[char] then current=getnext(current) + char=getchar(current) end - if getchar(current)==c_zwj then - if current~=stop then - local next=getnext(current) - if next~=stop and halant[getchar(next)] then - current=next - next=getnext(current) - local tmp=next and getnext(next) or nil - local changestop=next==stop - local tempcurrent=copy_node(next) - copyinjection(tempcurrent,next) - local nextcurrent=copy_node(current) - copyinjection(nextcurrent,current) - setlink(tempcurrent,nextcurrent) - setprop(tempcurrent,a_state,s_blwf) - tempcurrent=processcharacters(tempcurrent,font) - setprop(tempcurrent,a_state,unsetvalue) - if getchar(next)==getchar(tempcurrent) then - flush_list(tempcurrent) - local n=copy_node(current) - copyinjection(n,current) - setchar(current,dotted_circle) - head=insert_node_after(head,current,n) - else - setchar(current,getchar(tempcurrent)) - local freenode=getnext(current) - setlink(current,tmp) - flush_node(freenode) - flush_list(tempcurrent) - if changestop then - stop=current - end + if char==c_zwj and current~=stop then + local next=getnext(current) + if next~=stop and halant[getchar(next)] then + current=next + next=getnext(current) + local tmp=next and getnext(next) or nil + local changestop=next==stop + local tempcurrent=copy_node(next) + copyinjection(tempcurrent,next) + local nextcurrent=copy_node(current) + copyinjection(nextcurrent,current) + setlink(tempcurrent,nextcurrent) + setprop(tempcurrent,a_state,s_blwf) + tempcurrent=processcharacters(tempcurrent,font) + setprop(tempcurrent,a_state,unsetvalue) + if getchar(next)==getchar(tempcurrent) then + flush_list(tempcurrent) + local n=copy_node(current) + copyinjection(n,current) + setchar(current,dotted_circle) + head=insert_node_after(head,current,n) + else + setchar(current,getchar(tempcurrent)) + local freenode=getnext(current) + setlink(current,tmp) + flush_node(freenode) + flush_list(tempcurrent) + if changestop then + stop=current end end end @@ -27472,9 +28560,11 @@ function handlers.devanagari_reorder_reph(head,start) local startprev=nil local startfont=getfont(start) local startattr=getprop(start,a_syllabe) + ::step_1:: + ::step_2:: while current do local char=ischar(current,startfont) - if char and getprop(current,a_syllabe)==startattr then + if char and getprop(current,a_syllabe)==startattr then if halant[char] and not getprop(current,a_state) then local next=getnext(current) if next then @@ -27497,11 +28587,13 @@ function handlers.devanagari_reorder_reph(head,start) break end end + ::step_3:: + ::step_4:: if not startnext then current=getnext(start) while current do local char=ischar(current,startfont) - if char and getprop(current,a_syllabe)==startattr then + if char and getprop(current,a_syllabe)==startattr then if getprop(current,a_state)==s_pstf then startnext=getnext(start) head=remove_node(head,start) @@ -27517,13 +28609,14 @@ function handlers.devanagari_reorder_reph(head,start) end end end + ::step_5:: if not startnext then current=getnext(start) local c=nil while current do local char=ischar(current,startfont) - if char and getprop(current,a_syllabe)==startattr then - if not c and mark_above_below_post[char] and reorder_class[char]~="after subscript" then + if char and getprop(current,a_syllabe)==startattr then + if not c and mark_above_below_post[char] and after_subscript[char] then c=current end current=getnext(current) @@ -27540,12 +28633,13 @@ function handlers.devanagari_reorder_reph(head,start) startattr=getprop(start,a_syllabe) end end + ::step_6:: if not startnext then current=start local next=getnext(current) while next do local nextchar=ischar(next,startfont) - if nextchar and getprop(next,a_syllabe)==startattr then + if nextchar and getprop(next,a_syllabe)==startattr then current=next next=getnext(current) else @@ -27637,12 +28731,12 @@ function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replaceme setnext(prev) end if head==start then - head=stop + head=stop end flush_list(start) return head,stop,true end -local function dev2_initialize(font,attr) +local function initialize_two(font,attr) local devanagari=fontdata[font].resources.devanagari if devanagari then return devanagari.seqsubset or {},devanagari.reorderreph or {} @@ -27650,8 +28744,8 @@ local function dev2_initialize(font,attr) return {},{} end end -local function dev2_reorder(head,start,stop,font,attr,nbspaces) - local seqsubset,reorderreph=dev2_initialize(font,attr) +local function reorder_two(head,start,stop,font,attr,nbspaces) + local seqsubset,reorderreph=initialize_two(font,attr) local reph=false local halfpos=nil local basepos=nil @@ -27676,8 +28770,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) if found[n] then local afternext=next~=stop and getnext(next) if afternext and zw_char[getchar(afternext)] then - current=next - current=getnext(current) + current=afternext elseif current==start then setprop(current,a_state,s_rphf) current=next @@ -27814,7 +28907,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) if halant[getchar(current)] then setnext(getnext(current),tmp) local nc=copy_node(current) - copyinjection(nc,current) + copyinjection(nc,current) setchar(current,dotted_circle) head=insert_node_after(head,current,nc) else @@ -28185,7 +29278,7 @@ local function analyze_next_chars_two(c,font) if not v then return c end - if v==c_anudatta then + if anudatta[v] then c=n n=getnext(c) if not n then @@ -28280,31 +29373,32 @@ local function analyze_next_chars_two(c,font) return c end end -local function inject_syntax_error(head,current,mark) +local show_syntax_errors=false +local function inject_syntax_error(head,current,char) local signal=copy_node(current) - copyinjection(signal,current) - if mark==pre_mark then + copyinjection(signal,current) + if pre_mark[char] then setchar(signal,dotted_circle) else setchar(current,dotted_circle) end return insert_node_after(head,current,signal) end -function methods.deva(head,font,attr) +local function method_one(head,font,attr) head=tonut(head) local current=head local start=true local done=false local nbspaces=0 while current do - local char=ischar(current,font) + local char=ischar(current,font) if char then done=true local syllablestart=current local syllableend=nil local c=current local n=getnext(c) - local first=char + local first=char if n and ra[first] then local second=ischar(n,font) if second and halant[second] then @@ -28332,10 +29426,10 @@ function methods.deva(head,font,attr) end end if standalone then - local syllableend=analyze_next_chars_one(c,font,2) - current=getnext(syllableend) + local syllableend=analyze_next_chars_one(c,font,2) + current=getnext(syllableend) if syllablestart~=syllableend then - head,current,nbspaces=deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces) current=getnext(current) end else @@ -28432,7 +29526,7 @@ function methods.deva(head,font,attr) end end if syllablestart~=syllableend then - head,current,nbspaces=deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces) current=getnext(current) end elseif independent_vowel[char] then @@ -28453,9 +29547,11 @@ function methods.deva(head,font,attr) end end else - local mark=mark_four[char] - if mark then - head,current=inject_syntax_error(head,current,mark) + if show_syntax_errors then + local mark=mark_four[char] + if mark then + head,current=inject_syntax_error(head,current,char) + end end current=getnext(current) end @@ -28468,10 +29564,9 @@ function methods.deva(head,font,attr) if nbspaces>0 then head=replace_all_nbsp(head) end - head=tonode(head) - return head,done + return tonode(head),done end -function methods.dev2(head,font,attr) +local function method_two(head,font,attr) head=tonut(head) local current=head local start=true @@ -28495,7 +29590,7 @@ function methods.dev2(head,font,attr) local nextnextchar=ischar(n,font) if nextnextchar then c=n - char=nextnextchar + char=nextnextchar end end end @@ -28534,14 +29629,14 @@ function methods.dev2(head,font,attr) end end if syllableend and syllablestart~=syllableend then - head,current,nbspaces=dev2_reorder(head,syllablestart,syllableend,font,attr,nbspaces) + head,current,nbspaces=reorder_two(head,syllablestart,syllableend,font,attr,nbspaces) end - if not syllableend then + if not syllableend and show_syntax_errors then local char=ischar(current,font) if char and not getprop(current,a_state) then local mark=mark_four[char] if mark then - head,current=inject_syntax_error(head,current,mark) + head,current=inject_syntax_error(head,current,char) end end end @@ -28551,11 +29646,12 @@ function methods.dev2(head,font,attr) if nbspaces>0 then head=replace_all_nbsp(head) end - head=tonode(head) - return head,done + return tonode(head),done +end +for i=1,nofscripts do + methods[scripts_one[i]]=method_one + methods[scripts_two[i]]=method_two end -methods.mlym=methods.deva -methods.mlm2=methods.dev2 end -- closure diff --git a/tex/generic/context/luatex/luatex-fonts.lua b/tex/generic/context/luatex/luatex-fonts.lua index ef3bb74dc..5806debd2 100644 --- a/tex/generic/context/luatex/luatex-fonts.lua +++ b/tex/generic/context/luatex/luatex-fonts.lua @@ -226,7 +226,7 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then loadmodule('font-map.lua') -- for loading lum file (will be stripped) -- We use a bit simpler database because using the context one demands loading more helper - -- code and although it is more flexible (more wauys to resolve and so) it will never be + -- code and although it is more flexible (more ways to resolve and so) it will never be -- uses in plain/latex anyway, so let's stick to a simple approach. loadmodule('luatex-fonts-syn.lua') -- cgit v1.2.3