From 16aa5a7c87f18a2483d0d61795899f886781b51c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 18 Apr 2015 22:52:45 +0000 Subject: context, from www.pragma-ade.com/context/beta/cont-tmf.zip (18apr15) git-svn-id: svn://tug.org/texlive/trunk@36923 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/context/base/anch-bar.mkiv | 4 +- Master/texmf-dist/tex/context/base/anch-bck.mkvi | 6 +- Master/texmf-dist/tex/context/base/anch-pgr.lua | 145 +- Master/texmf-dist/tex/context/base/anch-pgr.mkiv | 49 +- Master/texmf-dist/tex/context/base/anch-pos.lua | 361 +- Master/texmf-dist/tex/context/base/anch-pos.mkiv | 124 +- Master/texmf-dist/tex/context/base/anch-snc.mkiv | 4 +- Master/texmf-dist/tex/context/base/anch-tab.mkiv | 8 +- Master/texmf-dist/tex/context/base/attr-col.lua | 57 +- Master/texmf-dist/tex/context/base/attr-eff.lua | 41 +- Master/texmf-dist/tex/context/base/attr-eff.mkiv | 12 +- Master/texmf-dist/tex/context/base/attr-ini.lua | 60 +- Master/texmf-dist/tex/context/base/attr-ini.mkiv | 35 +- Master/texmf-dist/tex/context/base/attr-lay.lua | 88 +- Master/texmf-dist/tex/context/base/attr-lay.mkiv | 36 +- Master/texmf-dist/tex/context/base/attr-neg.lua | 12 +- Master/texmf-dist/tex/context/base/attr-neg.mkiv | 2 +- Master/texmf-dist/tex/context/base/back-exp.lua | 3946 +- Master/texmf-dist/tex/context/base/back-exp.mkiv | 157 +- Master/texmf-dist/tex/context/base/back-ini.lua | 17 +- Master/texmf-dist/tex/context/base/back-ini.mkiv | 8 +- Master/texmf-dist/tex/context/base/back-pdf.lua | 114 +- Master/texmf-dist/tex/context/base/back-pdf.mkiv | 272 +- Master/texmf-dist/tex/context/base/bibl-bib.mkiv | 24 +- Master/texmf-dist/tex/context/base/bibl-tra.mkii | 3 +- Master/texmf-dist/tex/context/base/bibl-tra.mkiv | 68 +- Master/texmf-dist/tex/context/base/blob-ini.lua | 21 +- Master/texmf-dist/tex/context/base/blob-ini.mkiv | 8 +- .../tex/context/base/buff-imp-default.lua | 2 +- .../texmf-dist/tex/context/base/buff-imp-lua.lua | 4 +- Master/texmf-dist/tex/context/base/buff-ini.lua | 301 +- Master/texmf-dist/tex/context/base/buff-ini.mkiv | 78 +- Master/texmf-dist/tex/context/base/buff-par.lua | 112 +- Master/texmf-dist/tex/context/base/buff-par.mkvi | 68 +- Master/texmf-dist/tex/context/base/buff-ver.lua | 133 +- Master/texmf-dist/tex/context/base/buff-ver.mkiv | 246 +- Master/texmf-dist/tex/context/base/bxml-apa.mkiv | 4 +- Master/texmf-dist/tex/context/base/catc-act.mkiv | 6 +- Master/texmf-dist/tex/context/base/catc-ini.mkiv | 32 +- Master/texmf-dist/tex/context/base/catc-sym.mkiv | 8 +- Master/texmf-dist/tex/context/base/char-act.mkiv | 7 +- Master/texmf-dist/tex/context/base/char-def.lua | 68494 ++++++++++++------- Master/texmf-dist/tex/context/base/char-enc.lua | 11 +- Master/texmf-dist/tex/context/base/char-ent.lua | 10 +- Master/texmf-dist/tex/context/base/char-fio.lua | 94 + Master/texmf-dist/tex/context/base/char-ini.lua | 1017 +- Master/texmf-dist/tex/context/base/char-ini.mkiv | 50 +- Master/texmf-dist/tex/context/base/char-tex.lua | 654 +- Master/texmf-dist/tex/context/base/char-utf.lua | 746 +- Master/texmf-dist/tex/context/base/char-utf.mkiv | 17 +- Master/texmf-dist/tex/context/base/chem-ini.lua | 37 +- Master/texmf-dist/tex/context/base/chem-ini.mkiv | 2 +- Master/texmf-dist/tex/context/base/chem-str.lua | 83 +- Master/texmf-dist/tex/context/base/chem-str.mkiv | 78 +- Master/texmf-dist/tex/context/base/cldf-bas.lua | 24 +- Master/texmf-dist/tex/context/base/cldf-ini.lua | 351 +- Master/texmf-dist/tex/context/base/cldf-prs.lua | 88 +- Master/texmf-dist/tex/context/base/cldf-scn.lua | 163 + Master/texmf-dist/tex/context/base/colo-ext.mkiv | 18 +- Master/texmf-dist/tex/context/base/colo-grp.mkiv | 2 +- .../texmf-dist/tex/context/base/colo-imp-rgb.mkiv | 4 +- Master/texmf-dist/tex/context/base/colo-ini.lua | 445 +- Master/texmf-dist/tex/context/base/colo-ini.mkiv | 151 +- Master/texmf-dist/tex/context/base/colo-run.mkiv | 8 +- Master/texmf-dist/tex/context/base/colo-xwi.mkii | 7 +- Master/texmf-dist/tex/context/base/cont-fil.mkii | 2 + Master/texmf-dist/tex/context/base/cont-fil.mkiv | 1 + Master/texmf-dist/tex/context/base/cont-log.mkiv | 141 +- Master/texmf-dist/tex/context/base/cont-new.mkiv | 57 +- Master/texmf-dist/tex/context/base/cont-run.lua | 252 + Master/texmf-dist/tex/context/base/cont-run.mkiv | 20 + Master/texmf-dist/tex/context/base/cont-yes.mkiv | 154 +- .../tex/context/base/context-version.pdf | Bin 4275 -> 4187 bytes Master/texmf-dist/tex/context/base/context.mkiv | 47 +- Master/texmf-dist/tex/context/base/core-con.lua | 284 +- Master/texmf-dist/tex/context/base/core-con.mkiv | 171 +- Master/texmf-dist/tex/context/base/core-ctx.lua | 76 +- Master/texmf-dist/tex/context/base/core-ctx.mkiv | 14 +- Master/texmf-dist/tex/context/base/core-dat.lua | 58 +- Master/texmf-dist/tex/context/base/core-dat.mkiv | 38 +- Master/texmf-dist/tex/context/base/core-def.mkiv | 12 +- Master/texmf-dist/tex/context/base/core-env.lua | 295 +- Master/texmf-dist/tex/context/base/core-env.mkiv | 211 +- Master/texmf-dist/tex/context/base/core-ini.mkiv | 3 + Master/texmf-dist/tex/context/base/core-sys.lua | 60 +- Master/texmf-dist/tex/context/base/core-sys.mkiv | 72 +- Master/texmf-dist/tex/context/base/core-two.lua | 52 +- Master/texmf-dist/tex/context/base/core-two.mkiv | 27 +- Master/texmf-dist/tex/context/base/core-uti.lua | 74 +- Master/texmf-dist/tex/context/base/core-uti.mkiv | 18 +- Master/texmf-dist/tex/context/base/data-crl.lua | 2 +- Master/texmf-dist/tex/context/base/data-env.lua | 19 +- Master/texmf-dist/tex/context/base/data-exp.lua | 355 +- Master/texmf-dist/tex/context/base/data-fil.lua | 28 +- Master/texmf-dist/tex/context/base/data-ini.lua | 150 +- Master/texmf-dist/tex/context/base/data-lst.lua | 26 +- Master/texmf-dist/tex/context/base/data-lua.lua | 23 +- Master/texmf-dist/tex/context/base/data-met.lua | 2 - Master/texmf-dist/tex/context/base/data-pre.lua | 234 +- Master/texmf-dist/tex/context/base/data-res.lua | 795 +- Master/texmf-dist/tex/context/base/data-sch.lua | 16 +- Master/texmf-dist/tex/context/base/data-tex.lua | 8 +- Master/texmf-dist/tex/context/base/data-tmf.lua | 2 +- Master/texmf-dist/tex/context/base/data-tmp.lua | 23 +- Master/texmf-dist/tex/context/base/data-tre.lua | 222 +- Master/texmf-dist/tex/context/base/data-vir.lua | 10 +- Master/texmf-dist/tex/context/base/data-zip.lua | 62 +- Master/texmf-dist/tex/context/base/enco-ini.mkiv | 238 +- .../texmf-dist/tex/context/base/export-example.css | 444 +- .../texmf-dist/tex/context/base/export-example.tex | 4 +- Master/texmf-dist/tex/context/base/file-ini.lua | 45 +- Master/texmf-dist/tex/context/base/file-ini.mkvi | 30 +- Master/texmf-dist/tex/context/base/file-job.lua | 589 +- Master/texmf-dist/tex/context/base/file-job.mkvi | 171 +- Master/texmf-dist/tex/context/base/file-lib.lua | 65 +- Master/texmf-dist/tex/context/base/file-mod.lua | 89 +- Master/texmf-dist/tex/context/base/file-mod.mkvi | 60 +- Master/texmf-dist/tex/context/base/file-res.lua | 35 +- Master/texmf-dist/tex/context/base/file-res.mkvi | 8 +- Master/texmf-dist/tex/context/base/file-syn.lua | 35 +- Master/texmf-dist/tex/context/base/file-syn.mkvi | 6 +- Master/texmf-dist/tex/context/base/font-afm.lua | 89 +- Master/texmf-dist/tex/context/base/font-agl.lua | 12 +- Master/texmf-dist/tex/context/base/font-chk.lua | 100 +- Master/texmf-dist/tex/context/base/font-chk.mkiv | 8 +- Master/texmf-dist/tex/context/base/font-cid.lua | 25 +- Master/texmf-dist/tex/context/base/font-col.lua | 43 +- Master/texmf-dist/tex/context/base/font-col.mkvi | 12 +- Master/texmf-dist/tex/context/base/font-con.lua | 112 +- Master/texmf-dist/tex/context/base/font-ctx.lua | 777 +- Master/texmf-dist/tex/context/base/font-def.lua | 4 +- Master/texmf-dist/tex/context/base/font-enc.lua | 8 +- Master/texmf-dist/tex/context/base/font-enh.lua | 28 +- Master/texmf-dist/tex/context/base/font-ext.lua | 95 +- Master/texmf-dist/tex/context/base/font-fbk.lua | 41 +- Master/texmf-dist/tex/context/base/font-fea.mkvi | 36 +- Master/texmf-dist/tex/context/base/font-fil.mkvi | 100 +- Master/texmf-dist/tex/context/base/font-gds.lua | 30 +- Master/texmf-dist/tex/context/base/font-gds.mkvi | 4 +- Master/texmf-dist/tex/context/base/font-hsh.lua | 44 +- Master/texmf-dist/tex/context/base/font-ini.lua | 2 +- Master/texmf-dist/tex/context/base/font-ini.mkvi | 194 +- Master/texmf-dist/tex/context/base/font-inj.lua | 1052 + Master/texmf-dist/tex/context/base/font-lib.mkvi | 28 +- Master/texmf-dist/tex/context/base/font-map.lua | 305 +- Master/texmf-dist/tex/context/base/font-mis.lua | 14 +- Master/texmf-dist/tex/context/base/font-nod.lua | 169 +- Master/texmf-dist/tex/context/base/font-odv.lua | 19 + Master/texmf-dist/tex/context/base/font-ota.lua | 430 +- Master/texmf-dist/tex/context/base/font-otb.lua | 111 +- Master/texmf-dist/tex/context/base/font-otf.lua | 545 +- Master/texmf-dist/tex/context/base/font-otn.lua | 1164 +- Master/texmf-dist/tex/context/base/font-otp.lua | 49 +- Master/texmf-dist/tex/context/base/font-ott.lua | 9 +- Master/texmf-dist/tex/context/base/font-otx.lua | 419 - Master/texmf-dist/tex/context/base/font-pre.mkiv | 76 +- Master/texmf-dist/tex/context/base/font-run.mkiv | 8 +- Master/texmf-dist/tex/context/base/font-sel.lua | 102 +- Master/texmf-dist/tex/context/base/font-sel.mkvi | 185 +- Master/texmf-dist/tex/context/base/font-set.mkvi | 23 +- Master/texmf-dist/tex/context/base/font-sol.lua | 56 +- Master/texmf-dist/tex/context/base/font-sol.mkvi | 32 +- Master/texmf-dist/tex/context/base/font-sty.mkvi | 4 +- Master/texmf-dist/tex/context/base/font-sym.mkvi | 18 +- Master/texmf-dist/tex/context/base/font-syn.lua | 101 +- Master/texmf-dist/tex/context/base/font-tfm.lua | 12 +- Master/texmf-dist/tex/context/base/font-tra.mkiv | 17 +- Master/texmf-dist/tex/context/base/font-uni.mkiv | 10 +- Master/texmf-dist/tex/context/base/grph-epd.lua | 9 + Master/texmf-dist/tex/context/base/grph-epd.mkiv | 6 +- Master/texmf-dist/tex/context/base/grph-fig.mkiv | 6 +- Master/texmf-dist/tex/context/base/grph-fil.lua | 6 + Master/texmf-dist/tex/context/base/grph-inc.lua | 717 +- Master/texmf-dist/tex/context/base/grph-inc.mkiv | 182 +- Master/texmf-dist/tex/context/base/grph-raw.lua | 15 + Master/texmf-dist/tex/context/base/grph-raw.mkiv | 16 +- Master/texmf-dist/tex/context/base/grph-trf.mkiv | 16 +- Master/texmf-dist/tex/context/base/hand-ini.mkiv | 12 +- .../texmf-dist/tex/context/base/java-imp-fld.mkiv | 33 +- Master/texmf-dist/tex/context/base/java-ini.lua | 52 +- Master/texmf-dist/tex/context/base/java-ini.mkiv | 20 +- Master/texmf-dist/tex/context/base/l-boolean.lua | 6 +- Master/texmf-dist/tex/context/base/l-dir.lua | 398 +- Master/texmf-dist/tex/context/base/l-file.lua | 193 +- Master/texmf-dist/tex/context/base/l-io.lua | 5 - Master/texmf-dist/tex/context/base/l-lpeg.lua | 250 +- Master/texmf-dist/tex/context/base/l-lua.lua | 11 + Master/texmf-dist/tex/context/base/l-math.lua | 4 + Master/texmf-dist/tex/context/base/l-md5.lua | 64 +- Master/texmf-dist/tex/context/base/l-os.lua | 14 +- Master/texmf-dist/tex/context/base/l-sandbox.lua | 271 + Master/texmf-dist/tex/context/base/l-string.lua | 2 +- Master/texmf-dist/tex/context/base/l-table.lua | 135 +- Master/texmf-dist/tex/context/base/l-unicode.lua | 689 +- Master/texmf-dist/tex/context/base/l-url.lua | 68 +- Master/texmf-dist/tex/context/base/lang-def.mkiv | 34 +- Master/texmf-dist/tex/context/base/lang-dis.lua | 203 + Master/texmf-dist/tex/context/base/lang-hyp.lua | 1648 + Master/texmf-dist/tex/context/base/lang-hyp.mkiv | 267 + Master/texmf-dist/tex/context/base/lang-ini.lua | 121 +- Master/texmf-dist/tex/context/base/lang-ini.mkiv | 138 +- Master/texmf-dist/tex/context/base/lang-lab.lua | 49 +- Master/texmf-dist/tex/context/base/lang-lab.mkiv | 49 +- Master/texmf-dist/tex/context/base/lang-mis.mkiv | 229 +- Master/texmf-dist/tex/context/base/lang-rep.lua | 21 +- Master/texmf-dist/tex/context/base/lang-rep.mkiv | 4 +- Master/texmf-dist/tex/context/base/lang-txt.lua | 222 +- Master/texmf-dist/tex/context/base/lang-url.lua | 93 +- Master/texmf-dist/tex/context/base/lang-url.mkiv | 73 +- Master/texmf-dist/tex/context/base/lang-wrd.lua | 29 +- Master/texmf-dist/tex/context/base/lang-wrd.mkiv | 9 +- Master/texmf-dist/tex/context/base/lpdf-ano.lua | 195 +- Master/texmf-dist/tex/context/base/lpdf-col.lua | 41 +- Master/texmf-dist/tex/context/base/lpdf-epa.lua | 240 +- Master/texmf-dist/tex/context/base/lpdf-epd.lua | 809 +- Master/texmf-dist/tex/context/base/lpdf-fld.lua | 8 +- Master/texmf-dist/tex/context/base/lpdf-fmt.lua | 12 +- Master/texmf-dist/tex/context/base/lpdf-grp.lua | 2 +- Master/texmf-dist/tex/context/base/lpdf-ini.lua | 589 +- Master/texmf-dist/tex/context/base/lpdf-mis.lua | 96 +- Master/texmf-dist/tex/context/base/lpdf-pda.xml | 9 +- Master/texmf-dist/tex/context/base/lpdf-pdx.xml | 8 +- Master/texmf-dist/tex/context/base/lpdf-ren.lua | 36 +- Master/texmf-dist/tex/context/base/lpdf-tag.lua | 422 +- Master/texmf-dist/tex/context/base/lpdf-xmp.lua | 18 +- Master/texmf-dist/tex/context/base/luat-bas.mkiv | 3 +- Master/texmf-dist/tex/context/base/luat-cnf.lua | 72 +- Master/texmf-dist/tex/context/base/luat-cod.lua | 2 +- Master/texmf-dist/tex/context/base/luat-exe.lua | 143 +- Master/texmf-dist/tex/context/base/luat-fmt.lua | 4 +- Master/texmf-dist/tex/context/base/luat-ini.lua | 186 +- Master/texmf-dist/tex/context/base/luat-ini.mkiv | 175 +- Master/texmf-dist/tex/context/base/luat-iop.lua | 203 +- Master/texmf-dist/tex/context/base/luat-lib.mkiv | 6 +- Master/texmf-dist/tex/context/base/luat-mac.lua | 11 +- Master/texmf-dist/tex/context/base/luat-run.lua | 31 +- Master/texmf-dist/tex/context/base/luat-usr.lua | 192 + Master/texmf-dist/tex/context/base/luat-usr.mkiv | 126 + Master/texmf-dist/tex/context/base/lxml-aux.lua | 314 +- Master/texmf-dist/tex/context/base/lxml-css.lua | 14 +- Master/texmf-dist/tex/context/base/lxml-ini.lua | 136 + Master/texmf-dist/tex/context/base/lxml-ini.mkiv | 337 +- Master/texmf-dist/tex/context/base/lxml-lpt.lua | 19 +- Master/texmf-dist/tex/context/base/lxml-sor.mkiv | 5 +- Master/texmf-dist/tex/context/base/lxml-tab.lua | 64 +- Master/texmf-dist/tex/context/base/lxml-tex.lua | 407 +- Master/texmf-dist/tex/context/base/m-chart.lua | 89 +- Master/texmf-dist/tex/context/base/m-chart.mkvi | 10 +- .../texmf-dist/tex/context/base/m-hemistich.mkiv | 10 +- Master/texmf-dist/tex/context/base/m-matrix.mkiv | 495 + Master/texmf-dist/tex/context/base/m-morse.mkvi | 273 - Master/texmf-dist/tex/context/base/m-oldfun.mkiv | 2 +- Master/texmf-dist/tex/context/base/m-oldnum.mkiv | 32 +- Master/texmf-dist/tex/context/base/m-scite.mkiv | 6 + .../texmf-dist/tex/context/base/m-spreadsheet.mkiv | 6 +- Master/texmf-dist/tex/context/base/m-steps.lua | 21 +- Master/texmf-dist/tex/context/base/m-steps.mkvi | 2 +- .../texmf-dist/tex/context/base/m-translate.mkiv | 31 +- Master/texmf-dist/tex/context/base/m-visual.mkiv | 4 +- Master/texmf-dist/tex/context/base/math-act.lua | 136 +- Master/texmf-dist/tex/context/base/math-ali.mkiv | 54 +- Master/texmf-dist/tex/context/base/math-arr.mkiv | 2 +- Master/texmf-dist/tex/context/base/math-def.mkiv | 3 + Master/texmf-dist/tex/context/base/math-dir.lua | 7 +- Master/texmf-dist/tex/context/base/math-fbk.lua | 74 +- Master/texmf-dist/tex/context/base/math-frc.lua | 18 +- Master/texmf-dist/tex/context/base/math-frc.mkiv | 230 +- Master/texmf-dist/tex/context/base/math-ini.lua | 160 +- Master/texmf-dist/tex/context/base/math-ini.mkiv | 334 +- Master/texmf-dist/tex/context/base/math-int.mkiv | 2 + Master/texmf-dist/tex/context/base/math-map.lua | 43 +- Master/texmf-dist/tex/context/base/math-noa.lua | 454 +- Master/texmf-dist/tex/context/base/math-rad.mkvi | 30 +- Master/texmf-dist/tex/context/base/math-ren.lua | 8 +- Master/texmf-dist/tex/context/base/math-stc.mkvi | 441 +- Master/texmf-dist/tex/context/base/math-tag.lua | 610 +- Master/texmf-dist/tex/context/base/math-vfu.lua | 46 +- Master/texmf-dist/tex/context/base/meta-fig.mkiv | 5 +- Master/texmf-dist/tex/context/base/meta-fnt.lua | 43 +- Master/texmf-dist/tex/context/base/meta-fnt.mkiv | 8 +- Master/texmf-dist/tex/context/base/meta-fun.lua | 4 +- .../texmf-dist/tex/context/base/meta-imp-dum.mkiv | 3 + .../texmf-dist/tex/context/base/meta-imp-tab.mkiv | 73 + .../texmf-dist/tex/context/base/meta-imp-txt.mkiv | 9 +- Master/texmf-dist/tex/context/base/meta-ini.lua | 28 - Master/texmf-dist/tex/context/base/meta-ini.mkiv | 330 +- Master/texmf-dist/tex/context/base/meta-pag.mkiv | 126 +- Master/texmf-dist/tex/context/base/meta-pdf.lua | 13 +- Master/texmf-dist/tex/context/base/meta-pdf.mkiv | 2 +- Master/texmf-dist/tex/context/base/meta-pdh.mkiv | 10 +- Master/texmf-dist/tex/context/base/meta-tex.lua | 47 +- Master/texmf-dist/tex/context/base/meta-tex.mkiv | 14 +- Master/texmf-dist/tex/context/base/mlib-ctx.lua | 226 +- Master/texmf-dist/tex/context/base/mlib-ctx.mkiv | 1 + Master/texmf-dist/tex/context/base/mlib-int.lua | 149 + Master/texmf-dist/tex/context/base/mlib-lua.lua | 203 +- Master/texmf-dist/tex/context/base/mlib-pdf.lua | 295 +- Master/texmf-dist/tex/context/base/mlib-pdf.mkiv | 59 +- Master/texmf-dist/tex/context/base/mlib-pps.lua | 471 +- Master/texmf-dist/tex/context/base/mlib-pps.mkiv | 35 +- Master/texmf-dist/tex/context/base/mlib-run.lua | 399 +- .../tex/context/base/mtx-context-arrange.tex | 25 +- .../tex/context/base/mtx-context-listing.tex | 9 +- .../tex/context/base/mtx-context-precache.tex | 161 + Master/texmf-dist/tex/context/base/mult-aux.lua | 12 + Master/texmf-dist/tex/context/base/mult-aux.mkiv | 163 +- Master/texmf-dist/tex/context/base/mult-chk.lua | 21 +- Master/texmf-dist/tex/context/base/mult-chk.mkiv | 7 +- Master/texmf-dist/tex/context/base/mult-de.mkii | 21 +- Master/texmf-dist/tex/context/base/mult-def.lua | 107 +- Master/texmf-dist/tex/context/base/mult-def.mkiv | 187 +- Master/texmf-dist/tex/context/base/mult-en.mkii | 19 +- Master/texmf-dist/tex/context/base/mult-fr.mkii | 23 +- Master/texmf-dist/tex/context/base/mult-fun.lua | 93 +- Master/texmf-dist/tex/context/base/mult-ini.lua | 62 +- Master/texmf-dist/tex/context/base/mult-ini.mkiv | 24 +- Master/texmf-dist/tex/context/base/mult-it.mkii | 23 +- Master/texmf-dist/tex/context/base/mult-low.lua | 83 +- Master/texmf-dist/tex/context/base/mult-mes.lua | 9 + Master/texmf-dist/tex/context/base/mult-mps.lua | 67 +- Master/texmf-dist/tex/context/base/mult-nl.mkii | 29 +- Master/texmf-dist/tex/context/base/mult-pe.mkii | 23 +- Master/texmf-dist/tex/context/base/mult-prm.lua | 5 +- Master/texmf-dist/tex/context/base/mult-ro.mkii | 21 +- Master/texmf-dist/tex/context/base/mult-sys.mkiv | 56 +- Master/texmf-dist/tex/context/base/node-aux.lua | 19 +- Master/texmf-dist/tex/context/base/node-bck.lua | 18 +- Master/texmf-dist/tex/context/base/node-bck.mkiv | 14 +- Master/texmf-dist/tex/context/base/node-fin.lua | 51 +- Master/texmf-dist/tex/context/base/node-fin.mkiv | 10 +- Master/texmf-dist/tex/context/base/node-fnt.lua | 212 +- Master/texmf-dist/tex/context/base/node-ini.lua | 8 +- Master/texmf-dist/tex/context/base/node-ini.mkiv | 2 +- Master/texmf-dist/tex/context/base/node-inj.lua | 33 +- Master/texmf-dist/tex/context/base/node-ltp.lua | 17 +- Master/texmf-dist/tex/context/base/node-nut.lua | 56 +- Master/texmf-dist/tex/context/base/node-pro.lua | 6 +- Master/texmf-dist/tex/context/base/node-ref.lua | 373 +- Master/texmf-dist/tex/context/base/node-res.lua | 12 + Master/texmf-dist/tex/context/base/node-rul.lua | 49 + Master/texmf-dist/tex/context/base/node-rul.mkiv | 88 +- Master/texmf-dist/tex/context/base/node-shp.lua | 144 +- Master/texmf-dist/tex/context/base/node-tex.lua | 27 +- Master/texmf-dist/tex/context/base/node-tra.lua | 239 +- Master/texmf-dist/tex/context/base/node-tsk.lua | 8 + Master/texmf-dist/tex/context/base/pack-bck.mkvi | 9 +- Master/texmf-dist/tex/context/base/pack-box.mkiv | 115 +- Master/texmf-dist/tex/context/base/pack-com.mkiv | 28 +- Master/texmf-dist/tex/context/base/pack-fen.mkiv | 18 +- Master/texmf-dist/tex/context/base/pack-lyr.mkiv | 33 +- Master/texmf-dist/tex/context/base/pack-mis.mkvi | 3 +- Master/texmf-dist/tex/context/base/pack-mrl.mkiv | 14 +- Master/texmf-dist/tex/context/base/pack-obj.lua | 67 +- Master/texmf-dist/tex/context/base/pack-obj.mkiv | 15 +- Master/texmf-dist/tex/context/base/pack-pos.mkiv | 2 +- Master/texmf-dist/tex/context/base/pack-rul.lua | 18 +- Master/texmf-dist/tex/context/base/pack-rul.mkiv | 277 +- Master/texmf-dist/tex/context/base/page-app.mkiv | 3 + Master/texmf-dist/tex/context/base/page-bck.mkiv | 56 +- Master/texmf-dist/tex/context/base/page-brk.mkiv | 16 +- Master/texmf-dist/tex/context/base/page-flt.lua | 128 +- Master/texmf-dist/tex/context/base/page-flt.mkiv | 30 +- Master/texmf-dist/tex/context/base/page-flw.mkiv | 7 +- Master/texmf-dist/tex/context/base/page-imp.mkiv | 14 +- Master/texmf-dist/tex/context/base/page-ini.mkiv | 13 +- Master/texmf-dist/tex/context/base/page-inj.lua | 29 +- Master/texmf-dist/tex/context/base/page-inj.mkvi | 20 +- Master/texmf-dist/tex/context/base/page-ins.lua | 54 +- Master/texmf-dist/tex/context/base/page-ins.mkiv | 22 +- Master/texmf-dist/tex/context/base/page-lay.mkiv | 61 +- Master/texmf-dist/tex/context/base/page-lin.lua | 46 +- Master/texmf-dist/tex/context/base/page-lin.mkvi | 76 +- Master/texmf-dist/tex/context/base/page-mak.mkvi | 5 +- Master/texmf-dist/tex/context/base/page-mbk.mkvi | 2 +- Master/texmf-dist/tex/context/base/page-mix.lua | 229 +- Master/texmf-dist/tex/context/base/page-mix.mkiv | 149 +- Master/texmf-dist/tex/context/base/page-mul.mkiv | 2 +- Master/texmf-dist/tex/context/base/page-one.mkiv | 15 +- Master/texmf-dist/tex/context/base/page-pst.lua | 41 +- Master/texmf-dist/tex/context/base/page-pst.mkiv | 7 +- Master/texmf-dist/tex/context/base/page-run.mkiv | 14 +- Master/texmf-dist/tex/context/base/page-sel.mkvi | 2 +- Master/texmf-dist/tex/context/base/page-set.mkiv | 12 +- Master/texmf-dist/tex/context/base/page-sid.mkiv | 101 +- Master/texmf-dist/tex/context/base/page-str.lua | 56 + Master/texmf-dist/tex/context/base/page-str.mkiv | 26 +- Master/texmf-dist/tex/context/base/page-txt.mkvi | 19 +- Master/texmf-dist/tex/context/base/phys-dim.lua | 58 +- Master/texmf-dist/tex/context/base/phys-dim.mkiv | 19 +- Master/texmf-dist/tex/context/base/ppchtex.mkiv | 38 +- Master/texmf-dist/tex/context/base/publ-aut.lua | 739 +- Master/texmf-dist/tex/context/base/publ-dat.lua | 1347 +- Master/texmf-dist/tex/context/base/publ-fnd.lua | 411 +- .../texmf-dist/tex/context/base/publ-imp-apa.lua | 521 + .../texmf-dist/tex/context/base/publ-imp-apa.mkiv | 547 - .../texmf-dist/tex/context/base/publ-imp-apa.mkvi | 1473 + .../texmf-dist/tex/context/base/publ-imp-aps.lua | 479 + .../texmf-dist/tex/context/base/publ-imp-aps.mkvi | 1156 + .../tex/context/base/publ-imp-author.mkvi | 303 + .../texmf-dist/tex/context/base/publ-imp-cite.mkiv | 256 - .../texmf-dist/tex/context/base/publ-imp-cite.mkvi | 314 + .../tex/context/base/publ-imp-commands.mkiv | 15 - .../tex/context/base/publ-imp-commands.mkvi | 15 + .../tex/context/base/publ-imp-default.lua | 124 + .../tex/context/base/publ-imp-default.mkvi | 594 + .../tex/context/base/publ-imp-definitions.mkiv | 68 - .../tex/context/base/publ-imp-definitions.mkvi | 123 + .../texmf-dist/tex/context/base/publ-imp-list.mkvi | 90 + .../texmf-dist/tex/context/base/publ-imp-page.mkvi | 78 + .../tex/context/base/publ-imp-replacements.lua | 13 + .../texmf-dist/tex/context/base/publ-imp-test.bib | 294 + Master/texmf-dist/tex/context/base/publ-ini.lua | 4239 +- Master/texmf-dist/tex/context/base/publ-ini.mkiv | 1963 +- Master/texmf-dist/tex/context/base/publ-jrn.lua | 188 + Master/texmf-dist/tex/context/base/publ-oth.lua | 16 +- Master/texmf-dist/tex/context/base/publ-reg.lua | 177 + Master/texmf-dist/tex/context/base/publ-sor.lua | 276 + Master/texmf-dist/tex/context/base/publ-tra.lua | 670 +- Master/texmf-dist/tex/context/base/publ-tra.mkiv | 70 +- Master/texmf-dist/tex/context/base/publ-usr.lua | 131 +- Master/texmf-dist/tex/context/base/publ-xml.mkiv | 2 +- Master/texmf-dist/tex/context/base/regi-ini.lua | 234 +- Master/texmf-dist/tex/context/base/regi-ini.mkiv | 32 +- Master/texmf-dist/tex/context/base/regi-pdfdoc.lua | 26 + Master/texmf-dist/tex/context/base/s-abr-01.tex | 6 + Master/texmf-dist/tex/context/base/s-art-01.mkiv | 4 +- .../tex/context/base/s-figures-names.mkiv | 99 + Master/texmf-dist/tex/context/base/s-fnt-10.mkiv | 4 +- Master/texmf-dist/tex/context/base/s-fnt-21.mkiv | 2 +- .../tex/context/base/s-fonts-coverage.lua | 14 +- .../tex/context/base/s-fonts-ligatures.mkiv | 292 + .../texmf-dist/tex/context/base/s-fonts-shapes.lua | 89 +- .../texmf-dist/tex/context/base/s-fonts-tables.lua | 9 + Master/texmf-dist/tex/context/base/s-inf-01.mkvi | 12 +- Master/texmf-dist/tex/context/base/s-inf-03.mkiv | 21 +- .../tex/context/base/s-languages-hyphenation.lua | 16 +- .../tex/context/base/s-languages-hyphenation.mkiv | 6 +- .../tex/context/base/s-languages-system.lua | 63 +- .../tex/context/base/s-languages-system.mkiv | 2 + .../tex/context/base/s-languages-words.lua | 32 + .../tex/context/base/s-languages-words.mkiv | 22 + Master/texmf-dist/tex/context/base/s-map-10.mkiv | 16 +- .../tex/context/base/s-math-characters.lua | 286 +- .../tex/context/base/s-math-characters.mkiv | 15 +- .../tex/context/base/s-math-coverage.lua | 121 +- .../tex/context/base/s-math-coverage.mkiv | 10 +- .../tex/context/base/s-math-repertoire.mkiv | 56 +- Master/texmf-dist/tex/context/base/s-pre-17.mkiv | 2 +- .../tex/context/base/s-references-show.mkiv | 132 + .../tex/context/base/s-structure-sections.mkiv | 80 + Master/texmf-dist/tex/context/base/s-syn-01.tex | 54 - Master/texmf-dist/tex/context/base/s-syntax.mkii | 54 + Master/texmf-dist/tex/context/base/s-syntax.mkiv | 96 + .../tex/context/base/s-typesetting-kerning.mkiv | 209 + Master/texmf-dist/tex/context/base/s-youless.mkiv | 11 +- Master/texmf-dist/tex/context/base/scrn-bar.mkvi | 2 +- Master/texmf-dist/tex/context/base/scrn-but.lua | 10 +- Master/texmf-dist/tex/context/base/scrn-but.mkvi | 30 +- Master/texmf-dist/tex/context/base/scrn-fld.lua | 163 +- Master/texmf-dist/tex/context/base/scrn-fld.mkvi | 139 +- Master/texmf-dist/tex/context/base/scrn-hlp.lua | 123 +- Master/texmf-dist/tex/context/base/scrn-hlp.mkvi | 18 +- Master/texmf-dist/tex/context/base/scrn-ini.lua | 19 +- Master/texmf-dist/tex/context/base/scrn-ini.mkvi | 18 +- Master/texmf-dist/tex/context/base/scrn-pag.lua | 37 +- Master/texmf-dist/tex/context/base/scrn-pag.mkvi | 77 +- Master/texmf-dist/tex/context/base/scrn-ref.lua | 18 +- Master/texmf-dist/tex/context/base/scrn-ref.mkvi | 14 +- Master/texmf-dist/tex/context/base/scrn-wid.lua | 211 +- Master/texmf-dist/tex/context/base/scrn-wid.mkvi | 195 +- Master/texmf-dist/tex/context/base/scrp-ini.lua | 28 +- Master/texmf-dist/tex/context/base/scrp-ini.mkiv | 8 +- Master/texmf-dist/tex/context/base/sort-ini.lua | 220 +- Master/texmf-dist/tex/context/base/spac-adj.lua | 8 + Master/texmf-dist/tex/context/base/spac-adj.mkiv | 7 +- Master/texmf-dist/tex/context/base/spac-ali.lua | 6 +- Master/texmf-dist/tex/context/base/spac-ali.mkiv | 16 +- Master/texmf-dist/tex/context/base/spac-chr.lua | 26 +- Master/texmf-dist/tex/context/base/spac-chr.mkiv | 1 + Master/texmf-dist/tex/context/base/spac-hor.lua | 23 +- Master/texmf-dist/tex/context/base/spac-hor.mkiv | 55 +- Master/texmf-dist/tex/context/base/spac-lin.mkiv | 10 +- Master/texmf-dist/tex/context/base/spac-pag.mkiv | 11 +- Master/texmf-dist/tex/context/base/spac-par.mkiv | 3 + Master/texmf-dist/tex/context/base/spac-ver.lua | 359 +- Master/texmf-dist/tex/context/base/spac-ver.mkiv | 135 +- .../texmf-dist/tex/context/base/status-files.pdf | Bin 24584 -> 24437 bytes Master/texmf-dist/tex/context/base/status-lua.pdf | Bin 244257 -> 250375 bytes Master/texmf-dist/tex/context/base/status-mkiv.lua | 68 +- Master/texmf-dist/tex/context/base/strc-bkm.lua | 425 +- Master/texmf-dist/tex/context/base/strc-bkm.mkiv | 68 +- Master/texmf-dist/tex/context/base/strc-blk.lua | 31 +- Master/texmf-dist/tex/context/base/strc-blk.mkiv | 12 +- Master/texmf-dist/tex/context/base/strc-con.mkvi | 144 +- Master/texmf-dist/tex/context/base/strc-def.mkiv | 20 +- Master/texmf-dist/tex/context/base/strc-des.mkvi | 15 +- Master/texmf-dist/tex/context/base/strc-doc.lua | 315 +- Master/texmf-dist/tex/context/base/strc-doc.mkiv | 9 +- Master/texmf-dist/tex/context/base/strc-enu.mkvi | 11 +- Master/texmf-dist/tex/context/base/strc-flt.mkvi | 228 +- Master/texmf-dist/tex/context/base/strc-ini.lua | 13 +- Master/texmf-dist/tex/context/base/strc-ini.mkvi | 10 +- Master/texmf-dist/tex/context/base/strc-itm.lua | 75 +- Master/texmf-dist/tex/context/base/strc-itm.mkvi | 175 +- Master/texmf-dist/tex/context/base/strc-lab.mkiv | 3 +- Master/texmf-dist/tex/context/base/strc-lev.lua | 43 +- Master/texmf-dist/tex/context/base/strc-lev.mkvi | 12 +- Master/texmf-dist/tex/context/base/strc-lnt.mkvi | 8 +- Master/texmf-dist/tex/context/base/strc-lst.lua | 971 +- Master/texmf-dist/tex/context/base/strc-lst.mkvi | 379 +- Master/texmf-dist/tex/context/base/strc-mar.lua | 40 +- Master/texmf-dist/tex/context/base/strc-mar.mkiv | 38 +- Master/texmf-dist/tex/context/base/strc-mat.lua | 48 +- Master/texmf-dist/tex/context/base/strc-mat.mkiv | 10 +- Master/texmf-dist/tex/context/base/strc-not.lua | 108 +- Master/texmf-dist/tex/context/base/strc-not.mkvi | 101 +- Master/texmf-dist/tex/context/base/strc-num.lua | 126 +- Master/texmf-dist/tex/context/base/strc-num.mkiv | 466 +- Master/texmf-dist/tex/context/base/strc-pag.lua | 82 +- Master/texmf-dist/tex/context/base/strc-pag.mkiv | 46 +- Master/texmf-dist/tex/context/base/strc-ref.lua | 866 +- Master/texmf-dist/tex/context/base/strc-ref.mkvi | 639 +- Master/texmf-dist/tex/context/base/strc-reg.lua | 436 +- Master/texmf-dist/tex/context/base/strc-reg.mkiv | 331 +- Master/texmf-dist/tex/context/base/strc-ren.mkiv | 40 +- Master/texmf-dist/tex/context/base/strc-rsc.lua | 47 +- Master/texmf-dist/tex/context/base/strc-sbe.mkiv | 12 +- Master/texmf-dist/tex/context/base/strc-sec.mkiv | 222 +- Master/texmf-dist/tex/context/base/strc-syn.lua | 277 +- Master/texmf-dist/tex/context/base/strc-syn.mkiv | 342 +- Master/texmf-dist/tex/context/base/strc-tag.lua | 633 +- Master/texmf-dist/tex/context/base/strc-tag.mkiv | 439 +- Master/texmf-dist/tex/context/base/supp-box.lua | 280 +- Master/texmf-dist/tex/context/base/supp-box.mkiv | 141 +- Master/texmf-dist/tex/context/base/supp-ran.lua | 42 +- Master/texmf-dist/tex/context/base/supp-ran.mkiv | 20 +- .../texmf-dist/tex/context/base/symb-imp-cc.mkiv | 4 +- Master/texmf-dist/tex/context/base/symb-ini.lua | 29 +- Master/texmf-dist/tex/context/base/symb-ini.mkiv | 13 +- Master/texmf-dist/tex/context/base/syst-aux.lua | 201 +- Master/texmf-dist/tex/context/base/syst-aux.mkiv | 492 +- Master/texmf-dist/tex/context/base/syst-con.lua | 86 +- Master/texmf-dist/tex/context/base/syst-con.mkiv | 37 +- Master/texmf-dist/tex/context/base/syst-ini.mkiv | 62 +- Master/texmf-dist/tex/context/base/syst-lua.lua | 151 +- Master/texmf-dist/tex/context/base/syst-lua.mkiv | 62 +- Master/texmf-dist/tex/context/base/syst-rtp.mkiv | 2 +- Master/texmf-dist/tex/context/base/tabl-ltb.mkiv | 4 +- Master/texmf-dist/tex/context/base/tabl-ntb.mkii | 29 +- Master/texmf-dist/tex/context/base/tabl-ntb.mkiv | 644 +- Master/texmf-dist/tex/context/base/tabl-tab.mkiv | 15 +- Master/texmf-dist/tex/context/base/tabl-tbl.lua | 9 +- Master/texmf-dist/tex/context/base/tabl-tbl.mkiv | 107 +- Master/texmf-dist/tex/context/base/tabl-tsp.mkiv | 2 +- Master/texmf-dist/tex/context/base/tabl-xtb.lua | 470 +- Master/texmf-dist/tex/context/base/tabl-xtb.mkvi | 167 +- Master/texmf-dist/tex/context/base/task-ini.lua | 38 +- Master/texmf-dist/tex/context/base/toks-ini.lua | 524 +- Master/texmf-dist/tex/context/base/toks-ini.mkiv | 52 +- Master/texmf-dist/tex/context/base/toks-map.lua | 70 + Master/texmf-dist/tex/context/base/toks-map.mkiv | 63 + Master/texmf-dist/tex/context/base/toks-scn.lua | 437 + Master/texmf-dist/tex/context/base/toks-tra.lua | 298 + Master/texmf-dist/tex/context/base/toks-tra.mkiv | 31 + Master/texmf-dist/tex/context/base/trac-ctx.lua | 42 +- Master/texmf-dist/tex/context/base/trac-ctx.mkiv | 8 +- Master/texmf-dist/tex/context/base/trac-deb.lua | 19 + Master/texmf-dist/tex/context/base/trac-deb.mkiv | 34 +- Master/texmf-dist/tex/context/base/trac-inf.lua | 14 - Master/texmf-dist/tex/context/base/trac-jus.lua | 9 +- Master/texmf-dist/tex/context/base/trac-jus.mkiv | 2 +- Master/texmf-dist/tex/context/base/trac-lmx.lua | 9 +- Master/texmf-dist/tex/context/base/trac-log.lua | 377 +- Master/texmf-dist/tex/context/base/trac-set.lua | 5 +- Master/texmf-dist/tex/context/base/trac-tex.lua | 77 +- Master/texmf-dist/tex/context/base/trac-vis.lua | 68 +- Master/texmf-dist/tex/context/base/trac-vis.mkiv | 30 +- .../tex/context/base/type-imp-dejavu.mkiv | 63 +- Master/texmf-dist/tex/context/base/type-ini.lua | 121 +- Master/texmf-dist/tex/context/base/type-ini.mkvi | 28 +- Master/texmf-dist/tex/context/base/type-run.mkiv | 4 +- Master/texmf-dist/tex/context/base/typo-bld.lua | 27 +- Master/texmf-dist/tex/context/base/typo-bld.mkiv | 14 +- Master/texmf-dist/tex/context/base/typo-brk.lua | 46 +- Master/texmf-dist/tex/context/base/typo-brk.mkiv | 28 +- Master/texmf-dist/tex/context/base/typo-cap.lua | 348 +- Master/texmf-dist/tex/context/base/typo-cap.mkiv | 11 +- Master/texmf-dist/tex/context/base/typo-chr.lua | 155 + Master/texmf-dist/tex/context/base/typo-chr.mkiv | 28 + Master/texmf-dist/tex/context/base/typo-cln.lua | 6 +- Master/texmf-dist/tex/context/base/typo-cln.mkiv | 2 +- Master/texmf-dist/tex/context/base/typo-del.mkiv | 250 +- Master/texmf-dist/tex/context/base/typo-dha.lua | 7 +- Master/texmf-dist/tex/context/base/typo-dig.lua | 13 +- Master/texmf-dist/tex/context/base/typo-dig.mkiv | 2 +- Master/texmf-dist/tex/context/base/typo-dir.lua | 22 +- Master/texmf-dist/tex/context/base/typo-dir.mkiv | 23 +- Master/texmf-dist/tex/context/base/typo-drp.lua | 31 +- Master/texmf-dist/tex/context/base/typo-drp.mkiv | 30 +- Master/texmf-dist/tex/context/base/typo-dua.lua | 8 +- Master/texmf-dist/tex/context/base/typo-dub.lua | 13 +- Master/texmf-dist/tex/context/base/typo-fln.lua | 27 +- Master/texmf-dist/tex/context/base/typo-fln.mkiv | 20 +- Master/texmf-dist/tex/context/base/typo-inj.lua | 94 + Master/texmf-dist/tex/context/base/typo-inj.mkiv | 77 + Master/texmf-dist/tex/context/base/typo-itc.lua | 406 +- Master/texmf-dist/tex/context/base/typo-itc.mkvi | 6 +- Master/texmf-dist/tex/context/base/typo-itm.mkiv | 4 +- Master/texmf-dist/tex/context/base/typo-krn.lua | 534 +- Master/texmf-dist/tex/context/base/typo-krn.mkiv | 9 +- Master/texmf-dist/tex/context/base/typo-lan.lua | 8 +- Master/texmf-dist/tex/context/base/typo-lan.mkiv | 2 +- Master/texmf-dist/tex/context/base/typo-lig.mkiv | 31 + Master/texmf-dist/tex/context/base/typo-man.lua | 113 + Master/texmf-dist/tex/context/base/typo-mar.lua | 105 +- Master/texmf-dist/tex/context/base/typo-mar.mkiv | 76 +- Master/texmf-dist/tex/context/base/typo-pag.lua | 23 +- Master/texmf-dist/tex/context/base/typo-prc.lua | 25 +- Master/texmf-dist/tex/context/base/typo-prc.mkvi | 15 +- Master/texmf-dist/tex/context/base/typo-rep.lua | 7 +- Master/texmf-dist/tex/context/base/typo-rep.mkiv | 2 +- Master/texmf-dist/tex/context/base/typo-spa.lua | 30 +- Master/texmf-dist/tex/context/base/typo-spa.mkiv | 18 +- Master/texmf-dist/tex/context/base/typo-sus.lua | 304 + Master/texmf-dist/tex/context/base/typo-sus.mkiv | 51 + Master/texmf-dist/tex/context/base/typo-tal.lua | 282 +- Master/texmf-dist/tex/context/base/typo-tal.mkiv | 61 +- Master/texmf-dist/tex/context/base/typo-txt.mkvi | 47 + Master/texmf-dist/tex/context/base/typo-wrp.lua | 76 + Master/texmf-dist/tex/context/base/typo-wrp.mkiv | 65 + Master/texmf-dist/tex/context/base/unic-ini.lua | 14 +- Master/texmf-dist/tex/context/base/unic-ini.mkiv | 3 +- Master/texmf-dist/tex/context/base/util-dim.lua | 97 +- Master/texmf-dist/tex/context/base/util-env.lua | 42 +- Master/texmf-dist/tex/context/base/util-prs.lua | 108 +- Master/texmf-dist/tex/context/base/util-sbx.lua | 415 + Master/texmf-dist/tex/context/base/util-seq.lua | 45 +- .../tex/context/base/util-sql-loggers.lua | 2 +- Master/texmf-dist/tex/context/base/util-sta.lua | 22 +- Master/texmf-dist/tex/context/base/util-str.lua | 49 +- Master/texmf-dist/tex/context/base/util-tab.lua | 19 +- Master/texmf-dist/tex/context/base/util-tpl.lua | 41 +- Master/texmf-dist/tex/context/base/x-asciimath.lua | 2242 +- .../texmf-dist/tex/context/base/x-asciimath.mkiv | 411 +- Master/texmf-dist/tex/context/base/x-cals.lua | 7 +- Master/texmf-dist/tex/context/base/x-ct.lua | 2 + Master/texmf-dist/tex/context/base/x-html.mkiv | 379 + Master/texmf-dist/tex/context/base/x-math-svg.lua | 169 + .../tex/context/base/x-mathml-basics.mkiv | 276 + Master/texmf-dist/tex/context/base/x-mathml.lua | 214 +- Master/texmf-dist/tex/context/base/x-mathml.mkiv | 436 +- Master/texmf-dist/tex/context/base/x-mathml.xsd | 6 +- Master/texmf-dist/tex/context/base/x-res-01.mkiv | 2 +- Master/texmf-dist/tex/context/base/x-set-11.mkiv | 97 +- Master/texmf-dist/tex/context/base/x-set-12.mkiv | 3 +- Master/texmf-dist/tex/context/base/x-xtag.mkiv | 2 +- Master/texmf-dist/tex/context/bib/bibl-apa-it.tex | 385 + Master/texmf-dist/tex/context/bib/sample.bib | 1 - Master/texmf-dist/tex/context/extra/showunic.tex | 130 - Master/texmf-dist/tex/context/fonts/treatments.lfg | 62 +- Master/texmf-dist/tex/context/foxet/fe-bryson.xml | 12 - Master/texmf-dist/tex/context/foxet/fe-ward.xml | 8 - Master/texmf-dist/tex/context/foxet/fe-zapf.xml | 14 - Master/texmf-dist/tex/context/foxet/fo-0101.fo | 17 - Master/texmf-dist/tex/context/foxet/fo-0102.fo | 25 - Master/texmf-dist/tex/context/foxet/fo-0103.fo | 21 - Master/texmf-dist/tex/context/foxet/fo-0201.fo | 22 - Master/texmf-dist/tex/context/foxet/fo-0301.fo | 56 - Master/texmf-dist/tex/context/foxet/fo-0601.fo | 29 - Master/texmf-dist/tex/context/foxet/fo-0602.fo | 27 - Master/texmf-dist/tex/context/foxet/fo-0603.fo | 26 - Master/texmf-dist/tex/context/foxet/fo-0604.fo | 26 - Master/texmf-dist/tex/context/foxet/fo-0611.fo | 21 - Master/texmf-dist/tex/context/foxet/fo-0612.fo | 21 - Master/texmf-dist/tex/context/foxet/fo-0613.fo | 21 - Master/texmf-dist/tex/context/foxet/fo-0621.fo | 106 - Master/texmf-dist/tex/context/foxet/fo-0641.fo | 25 - Master/texmf-dist/tex/context/foxet/fo-0642.fo | 27 - Master/texmf-dist/tex/context/foxet/fo-0643.fo | 27 - Master/texmf-dist/tex/context/foxet/fo-0644.fo | 27 - Master/texmf-dist/tex/context/foxet/fo-0650.fo | 26 - Master/texmf-dist/tex/context/foxet/fo-0651.fo | 26 - Master/texmf-dist/tex/context/foxet/fo-0701.fo | 39 - Master/texmf-dist/tex/context/foxet/fo-0801.fo | 55 - Master/texmf-dist/tex/context/foxet/fo-0901.fo | 58 - Master/texmf-dist/tex/context/foxet/fo-0902.fo | 33 - Master/texmf-dist/tex/context/foxet/fo-1001.fo | 63 - Master/texmf-dist/tex/context/foxet/fo-1002.fo | 31 - Master/texmf-dist/tex/context/foxet/fo-1003.fo | 31 - Master/texmf-dist/tex/context/foxet/fo-1004.fo | 35 - Master/texmf-dist/tex/context/foxet/fo-1101.fo | 63 - Master/texmf-dist/tex/context/foxet/fo-1102.fo | 128 - Master/texmf-dist/tex/context/foxet/fo-1103.fo | 85 - Master/texmf-dist/tex/context/foxet/fo-1104.fo | 28 - Master/texmf-dist/tex/context/foxet/fo-1201.fo | 40 - .../texmf-dist/tex/context/interface/keys-cs.xml | 21 +- .../texmf-dist/tex/context/interface/keys-de.xml | 21 +- .../texmf-dist/tex/context/interface/keys-en.xml | 19 +- .../texmf-dist/tex/context/interface/keys-fr.xml | 23 +- .../texmf-dist/tex/context/interface/keys-it.xml | 23 +- .../texmf-dist/tex/context/interface/keys-nl.xml | 29 +- .../texmf-dist/tex/context/interface/keys-pe.xml | 23 +- .../texmf-dist/tex/context/interface/keys-ro.xml | 21 +- Master/texmf-dist/tex/context/sample/darwin.tex | 19 + Master/texmf-dist/tex/context/sample/dawkins.tex | 6 +- Master/texmf-dist/tex/context/sample/douglas.tex | 8 +- Master/texmf-dist/tex/context/sample/sample.tex | 80 +- Master/texmf-dist/tex/context/sample/samples.bib | 29 + Master/texmf-dist/tex/context/sample/samples.tex | 78 + .../texmf-dist/tex/context/test/pdf-a1b-2005.mkiv | 6 +- .../generic/context/luatex/luatex-basics-gen.lua | 14 +- .../generic/context/luatex/luatex-basics-nod.lua | 108 +- .../generic/context/luatex/luatex-fonts-cbk.lua | 117 +- .../generic/context/luatex/luatex-fonts-inj.lua | 1293 +- .../generic/context/luatex/luatex-fonts-merged.lua | 3624 +- .../generic/context/luatex/luatex-fonts-ota.lua | 459 + .../generic/context/luatex/luatex-fonts-otn.lua | 809 +- .../tex/generic/context/luatex/luatex-fonts.lua | 19 +- .../tex/generic/context/luatex/luatex-test.tex | 19 +- 719 files changed, 114201 insertions(+), 51923 deletions(-) create mode 100644 Master/texmf-dist/tex/context/base/char-fio.lua create mode 100644 Master/texmf-dist/tex/context/base/cldf-scn.lua create mode 100644 Master/texmf-dist/tex/context/base/cont-run.lua create mode 100644 Master/texmf-dist/tex/context/base/cont-run.mkiv create mode 100644 Master/texmf-dist/tex/context/base/font-inj.lua delete mode 100644 Master/texmf-dist/tex/context/base/font-otx.lua create mode 100644 Master/texmf-dist/tex/context/base/l-sandbox.lua create mode 100644 Master/texmf-dist/tex/context/base/lang-dis.lua create mode 100644 Master/texmf-dist/tex/context/base/lang-hyp.lua create mode 100644 Master/texmf-dist/tex/context/base/lang-hyp.mkiv create mode 100644 Master/texmf-dist/tex/context/base/luat-usr.lua create mode 100644 Master/texmf-dist/tex/context/base/luat-usr.mkiv create mode 100644 Master/texmf-dist/tex/context/base/lxml-ini.lua create mode 100644 Master/texmf-dist/tex/context/base/m-matrix.mkiv delete mode 100644 Master/texmf-dist/tex/context/base/m-morse.mkvi create mode 100644 Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv create mode 100644 Master/texmf-dist/tex/context/base/mlib-int.lua create mode 100644 Master/texmf-dist/tex/context/base/mtx-context-precache.tex create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-apa.lua delete mode 100644 Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-aps.lua create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-author.mkvi delete mode 100644 Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi delete mode 100644 Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-default.lua create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-default.mkvi delete mode 100644 Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-list.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-page.mkvi create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-replacements.lua create mode 100644 Master/texmf-dist/tex/context/base/publ-imp-test.bib create mode 100644 Master/texmf-dist/tex/context/base/publ-jrn.lua create mode 100644 Master/texmf-dist/tex/context/base/publ-reg.lua create mode 100644 Master/texmf-dist/tex/context/base/publ-sor.lua create mode 100644 Master/texmf-dist/tex/context/base/regi-pdfdoc.lua create mode 100644 Master/texmf-dist/tex/context/base/s-figures-names.mkiv create mode 100644 Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv create mode 100644 Master/texmf-dist/tex/context/base/s-languages-words.lua create mode 100644 Master/texmf-dist/tex/context/base/s-languages-words.mkiv create mode 100644 Master/texmf-dist/tex/context/base/s-references-show.mkiv create mode 100644 Master/texmf-dist/tex/context/base/s-structure-sections.mkiv delete mode 100644 Master/texmf-dist/tex/context/base/s-syn-01.tex create mode 100644 Master/texmf-dist/tex/context/base/s-syntax.mkii create mode 100644 Master/texmf-dist/tex/context/base/s-syntax.mkiv create mode 100644 Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv create mode 100644 Master/texmf-dist/tex/context/base/toks-map.lua create mode 100644 Master/texmf-dist/tex/context/base/toks-map.mkiv create mode 100644 Master/texmf-dist/tex/context/base/toks-scn.lua create mode 100644 Master/texmf-dist/tex/context/base/toks-tra.lua create mode 100644 Master/texmf-dist/tex/context/base/toks-tra.mkiv create mode 100644 Master/texmf-dist/tex/context/base/typo-chr.lua create mode 100644 Master/texmf-dist/tex/context/base/typo-chr.mkiv create mode 100644 Master/texmf-dist/tex/context/base/typo-inj.lua create mode 100644 Master/texmf-dist/tex/context/base/typo-inj.mkiv create mode 100644 Master/texmf-dist/tex/context/base/typo-lig.mkiv create mode 100644 Master/texmf-dist/tex/context/base/typo-man.lua create mode 100644 Master/texmf-dist/tex/context/base/typo-sus.lua create mode 100644 Master/texmf-dist/tex/context/base/typo-sus.mkiv create mode 100644 Master/texmf-dist/tex/context/base/typo-wrp.lua create mode 100644 Master/texmf-dist/tex/context/base/typo-wrp.mkiv create mode 100644 Master/texmf-dist/tex/context/base/util-sbx.lua create mode 100644 Master/texmf-dist/tex/context/base/x-html.mkiv create mode 100644 Master/texmf-dist/tex/context/base/x-math-svg.lua create mode 100644 Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv create mode 100644 Master/texmf-dist/tex/context/bib/bibl-apa-it.tex delete mode 100644 Master/texmf-dist/tex/context/extra/showunic.tex delete mode 100644 Master/texmf-dist/tex/context/foxet/fe-bryson.xml delete mode 100644 Master/texmf-dist/tex/context/foxet/fe-ward.xml delete mode 100644 Master/texmf-dist/tex/context/foxet/fe-zapf.xml delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0101.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0102.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0103.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0201.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0301.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0601.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0602.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0603.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0604.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0611.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0612.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0613.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0621.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0641.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0642.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0643.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0644.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0650.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0651.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0701.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0801.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0901.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-0902.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1001.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1002.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1003.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1004.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1101.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1102.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1103.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1104.fo delete mode 100644 Master/texmf-dist/tex/context/foxet/fo-1201.fo create mode 100644 Master/texmf-dist/tex/context/sample/darwin.tex create mode 100644 Master/texmf-dist/tex/context/sample/samples.bib create mode 100644 Master/texmf-dist/tex/context/sample/samples.tex create mode 100644 Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/context/base/anch-bar.mkiv b/Master/texmf-dist/tex/context/base/anch-bar.mkiv index 84465515548..b5df21a0797 100644 --- a/Master/texmf-dist/tex/context/base/anch-bar.mkiv +++ b/Master/texmf-dist/tex/context/base/anch-bar.mkiv @@ -89,7 +89,7 @@ \advance\c_anch_sidebars_level\plusone \global\advance\c_anch_sidebars_n\plusone \c_anch_sidebars_current\c_anch_sidebars_n\relax % relax needed - \doifassignmentelse{#1} + \doifelseassignment{#1} {\edef\currentsidebar{\the\c_anch_sidebars_level}% \checksidebarparent \setupcurrentsidebar[#1]} @@ -213,7 +213,7 @@ \ifx\m_anch_marginrules_kind\empty \anch_sidebars_start[\v!margin][]% \else - \doifassignmentelse\m_anch_marginrules_kind + \doifelseassignment\m_anch_marginrules_kind {\anch_sidebars_start[\v!margin][#1]}% {\anch_marginrules_check{#1}% \anch_sidebars_start[\v!margin:#1][\c!level=#1]}% diff --git a/Master/texmf-dist/tex/context/base/anch-bck.mkvi b/Master/texmf-dist/tex/context/base/anch-bck.mkvi index cccf14ee438..273cf015968 100644 --- a/Master/texmf-dist/tex/context/base/anch-bck.mkvi +++ b/Master/texmf-dist/tex/context/base/anch-bck.mkvi @@ -20,10 +20,6 @@ \unprotect -% we can flush 5 in one call (saved 4 lua calls) .. brrr wself .. will change - -\def\MPposset#1{\ctxcommand{MPposset("#1")}} % will go - % This might be overloaded later on: % \defineoverlay[\v!text-2][\positionoverlay{\v!text-2}] @@ -50,7 +46,7 @@ % tricky: we need to catch newly set! otherwise an old run can have positions \unexpanded\def\anch_backgrounds_text_initialize - {\ctxcommand{doifelsepositionsused()}\enableparpositions\donothing + {\doifelsepositionsused\enableparpositions\donothing \global\let\anch_backgrounds_text_initialize\relax} \appendtoks diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.lua b/Master/texmf-dist/tex/context/base/anch-pgr.lua index c7f56a92bf9..b5c2ae6280a 100644 --- a/Master/texmf-dist/tex/context/base/anch-pgr.lua +++ b/Master/texmf-dist/tex/context/base/anch-pgr.lua @@ -8,8 +8,6 @@ if not modules then modules = { } end modules ['anch-pgr'] = { -- todo: we need to clean up lists (of previous pages) -local commands, context = commands, context - local format = string.format local abs = math.abs local concat, sort = table.concat, table.sort @@ -19,6 +17,11 @@ local lpegmatch = lpeg.match local jobpositions = job.positions local formatters = string.formatters +local commands = commands +local context = context + +local implement = interfaces.implement + local report_graphics = logs.reporter("graphics") local f_b_tag = formatters["b:%s"] @@ -59,7 +62,7 @@ local function add(t,x,y,last,direction) if x == lx and y == ly then -- quick skip elseif n == 1 then --- if abs(lx-x) <= eps or abs(ly-y) <= eps then + -- if abs(lx-x) <= eps or abs(ly-y) <= eps then if abs(lx-x) > eps or abs(ly-y) > eps then t[n+1] = { x, y } end @@ -67,10 +70,9 @@ local function add(t,x,y,last,direction) local tm = t[n-1] local px = tm[1] local py = tm[2] -if (direction == "down" and y > ly) or (direction == "up" and y < ly) then - -- move back from too much hang -else - if abs(lx-px) <= eps and abs(lx-x) <= eps then + if (direction == "down" and y > ly) or (direction == "up" and y < ly) then + -- move back from too much hang + elseif abs(lx-px) <= eps and abs(lx-x) <= eps then if abs(ly-y) > eps then tn[2] = y end @@ -81,7 +83,6 @@ else elseif not last then t[n+1] = { x, y } end -end end end end @@ -430,7 +431,6 @@ local function calculatemultipar(tag,obeyhang) end -- Obeying intermediate changes of left/rightskip makes no sense as it will -- look bad, so we only look at the begin situation. - -- local bn = b.n if bn then local bp = collected[f_p_tag(bn)] @@ -555,7 +555,7 @@ f_template_b = formatters[f_template_b] f_template_c = formatters[f_template_c] f_template_d = formatters[f_template_d] -function backgrounds.fetchmultipar(n,anchor,page,obeyhang) +local function fetchmultipar(n,anchor,page,obeyhang) local data = pbg[n] if not data then data = calculatemultipar(n,obeyhang) @@ -599,17 +599,25 @@ function backgrounds.fetchmultipar(n,anchor,page,obeyhang) return f_template_a(0,"origin",0,0,0) end +backgrounds.fetchmultipar = fetchmultipar + backgrounds.point = f_point backgrounds.pair = f_pair backgrounds.path = f_path -function commands.fetchmultipar(n,anchor,page) - context(backgrounds.fetchmultipar(n,anchor,page)) -end +-- n anchor page -function commands.fetchmultishape(n,anchor,page) - context(backgrounds.fetchmultipar(n,anchor,page,true)) -end +implement { + name = "fetchmultipar", + actions = { fetchmultipar, context }, + arguments = { "string", "string", "integer" } +} + +implement { + name = "fetchmultishape", + actions = { fetchmultipar, context }, + arguments = { "string", "string", "integer", true } +} local f_template_a = [[ path posboxes[], posregions[] ; @@ -628,67 +636,62 @@ posregions[%s] := (%p,%p)--(%p,%p)--(%p,%p)--(%p,%p)--cycle ; f_template_a = formatters[f_template_a] f_template_b = formatters[f_template_b] -function commands.fetchposboxes(tags,anchor,page) -- no caching (yet) / todo: anchor, page - local collected = jobpositions.collected - if type(tags) == "string" then - tags = utilities.parsers.settings_to_array(tags) - end - local list, nofboxes = { }, 0 - for i=1,#tags do - local tag= tags[i] - local c = collected[tag] - if c then - local r = c.r - if r then - r = collected[r] +implement { + name = "fetchposboxes", + arguments = { "string", "string", "integer" }, + actions = function(tags,anchor,page) -- no caching (yet) / todo: anchor, page + local collected = jobpositions.collected + if type(tags) == "string" then + tags = utilities.parsers.settings_to_array(tags) + end + local list, nofboxes = { }, 0 + for i=1,#tags do + local tag= tags[i] + local c = collected[tag] + if c then + local r = c.r if r then - local rx, ry, rw, rh, rd = r.x, r.y, r.w, r.h, r.d - local cx = c.x - rx - local cy = c.y - ry - local cw = cx + c.w - local ch = cy + c.h - local cd = cy - c.d - nofboxes = nofboxes + 1 - list[nofboxes] = f_template_b( - nofboxes,c.p, - nofboxes,cx,ch,cw,ch,cw,cd,cx,cd, - nofboxes,0,rh,rw,rh,rw,rd,0,rd - ) + r = collected[r] + if r then + local rx, ry, rw, rh, rd = r.x, r.y, r.w, r.h, r.d + local cx = c.x - rx + local cy = c.y - ry + local cw = cx + c.w + local ch = cy + c.h + local cd = cy - c.d + nofboxes = nofboxes + 1 + list[nofboxes] = f_template_b( + nofboxes,c.p, + nofboxes,cx,ch,cw,ch,cw,cd,cx,cd, + nofboxes,0,rh,rw,rh,rw,rd,0,rd + ) + end end + else + print("\n missing",tag) end - else - print("\n missing",tag) end + context(f_template_a(nofboxes,list)) end - context(f_template_a(nofboxes,list)) -end +} local doifelse = commands.doifelse -function commands.doifelsemultipar(n,page,obeyhang) - local data = pbg[n] - if not data then - data = calculatemultipar(n,obeyhang) - pbg[n] = data - end - if page then - doifelse(data and data[page] and true) - else - doifelse(data and next(data) and true) - end -end - -function commands.doifelserangeonpage(first,last,page) - local collected = jobpositions.collected - local f = collected[first] - if not f or f.p == true then - doifelse(false) - return - end - local l = collected[last] - if not l or l.p == true then - doifelse(false) - return +implement { + name = "doifelserangeonpage", + arguments = { "string", "string", "integer" }, + actions = function(first,last,page) + local collected = jobpositions.collected + local f = collected[first] + if not f or f.p == true then + doifelse(false) + return + end + local l = collected[last] + if not l or l.p == true then + doifelse(false) + return + end + doifelse(page >= f.p and page <= l.p) end - doifelse(page >= f.p and page <= l.p) -end +} diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv index c18a1b6699a..56ff656d96d 100644 --- a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv +++ b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv @@ -43,13 +43,15 @@ \expandafter\gobbleoneargument \fi} -\unexpanded\def\doifpositionactionelse#1% +\unexpanded\def\doifelsepositionaction#1% {\ifcsname\??positionaction#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifpositionactionelse\doifelsepositionaction + \unexpanded\def\dopositionaction#1% {\edef\currentpositionaction{#1}% \ifcsname\??positionaction\currentpositionaction\endcsname @@ -57,7 +59,7 @@ \fi} \def\anch_positions_action_indeed - {\doifpositionelse\currentpositionaction + {\doifelseposition\currentpositionaction \anch_positions_action_indeed_yes \anch_positions_action_indeed_nop} @@ -127,23 +129,26 @@ %D the head and tail anchors from this one. We set these %D anchors before and after each page. +\newdimen\c_anch_page_width +\newdimen\c_anch_page_height + \unexpanded\def\anch_positions_register_page#1% this one is flushed first ! ... can't we avoid this one {\ifpositioning\ifcase\realpageno\or - \ifdim\printpaperheight=\paperheight - \ifdim\printpaperwidth=\paperwidth - % not needed, + \ifdim\c_anch_page_height=\paperheight + \ifdim\c_anch_page_width=\paperwidth + % no change \else - \anch_positions_register_page_indeed{#1}% + \c_anch_page_width \paperwidth + \c_anch_page_height\paperheight + \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi \fi \else - \anch_positions_register_page_indeed{#1}% + \c_anch_page_width \paperwidth + \c_anch_page_height\paperheight + \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi \fi \fi\fi} -\def\anch_positions_register_page_indeed#1% maybe like text - {\ifvbox#1\setbox#1\hbox{\box#1}\fi - \anch_make_page_box{#1}} - \unexpanded\def\anch_positions_place_anchors {\ifpositioning \anch_positions_place_anchors_yes @@ -251,17 +256,17 @@ \def\MPoverlayanchor#1{\MPpos\MPanchorid} \def\anch_positions_overlay_compose - {\vbox to \overlayheight + {\vbox to \d_overlay_height {%\writestatus{!!!}{\currentpositionoverlay/\MPanchoridentifier/\MPanchornumber}% \edef\MPanchorid{\currentpositionoverlay::\MPanchoridentifier:\MPanchornumber}% realpageno % \edef\MPanchor##1{\MPpos\MPanchorid}% \let\MPanchor\MPoverlayanchor % no need to fetch it already, seldom used \the\everyinsertpositionaction \copyposition{\currentpositionoverlay::\MPanchoridentifier}\MPanchorid - \setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}% - \ht\scratchbox\overlayheight + \setbox\scratchbox\hbox to \d_overlay_width{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}% + \ht\scratchbox\d_overlay_height \dp\scratchbox\zeropoint - \ctxcommand{markregionbox(\number\scratchbox,"\MPanchorid")}% needs an hbox + \anch_mark_tagged_box\scratchbox\MPanchorid % needs an hbox \box\scratchbox \vfill}} @@ -284,13 +289,13 @@ \endgroup} \def\anch_positions_region_overlay_compose - {\vbox to \overlayheight + {\vbox to \d_overlay_height {\let\MPanchorid\currentpositionregion \let\MPanchor\MPoverlayanchor % no need to fetch it already, seldom used \the\everyinsertpositionaction \copyposition{\currentpositionoverlay::\MPanchoridentifier}\MPanchorid - \setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}% - \ht\scratchbox\overlayheight + \setbox\scratchbox\hbox to \d_overlay_width{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}% + \ht\scratchbox\d_overlay_height \dp\scratchbox\zeropoint \box\scratchbox \vfill}} @@ -475,7 +480,7 @@ {\handlepositionaction\anch_positions_meta_graphic_handle_range_indeed\with{#1}{#2}{#3}{#4}\on{#2}} \def\anch_positions_meta_graphic_insert_range#1#2#3#4% pos pos tag setups - {\ctxcommand{doifelserangeonpage("#1","#2",\number\realpageno)}% + {\clf_doifelserangeonpage{#1}{#2}\realpageno {\def\currentposition{#1}% \MPpositiongraphic{#3}{#4}}% {}} @@ -497,8 +502,8 @@ % Helpers: -\def\MPgetposboxes #1#2{\ctxcommand{fetchposboxes("#1","#2",\the\realpageno)}} -\def\MPgetmultipars #1#2{\ctxcommand{fetchmultipar("#1","#2",\the\realpageno)}} -\def\MPgetmultishapes#1#2{\ctxcommand{fetchmultishape("#1","#2",\the\realpageno)}} +\def\MPgetposboxes #1#2{\clf_fetchposboxes {#1}{#2}\realpageno} +\def\MPgetmultipars #1#2{\clf_fetchmultipar {#1}{#2}\realpageno} +\def\MPgetmultishapes#1#2{\clf_fetchmultishape{#1}{#2}\realpageno} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/anch-pos.lua b/Master/texmf-dist/tex/context/base/anch-pos.lua index c2b62bae7d4..77e36e85ece 100644 --- a/Master/texmf-dist/tex/context/base/anch-pos.lua +++ b/Master/texmf-dist/tex/context/base/anch-pos.lua @@ -21,8 +21,6 @@ more efficient.

-- maybe replace texsp by our own converter (stay at the lua end) -- eventually mp will have large numbers so we can use sp there too -local commands, context = commands, context - local tostring, next, rawget, setmetatable = tostring, next, rawget, setmetatable local sort = table.sort local format, gmatch, match = string.format, string.gmatch, string.match @@ -30,12 +28,24 @@ local rawget = rawget local lpegmatch = lpeg.match local insert, remove = table.insert, table.remove local allocate, mark = utilities.storage.allocate, utilities.storage.mark -local texsp = tex.sp ------ texsp = string.todimen -- because we cache this is much faster but no rounding +local scanners = tokens.scanners +local scanstring = scanners.string +local scaninteger = scanners.integer +local scandimen = scanners.dimen + +local compilescanner = tokens.compile +local scanners = interfaces.scanners + +local commands = commands +local context = context + +local tex = tex local texgetcount = tex.getcount local texsetcount = tex.setcount local texget = tex.get +local texsp = tex.sp +----- texsp = string.todimen -- because we cache this is much faster but no rounding local pdf = pdf -- h and v are variables @@ -118,11 +128,28 @@ local nofusedregions = 0 local nofmissingregions = 0 local nofregular = 0 +jobpositions.used = false + -- todo: register subsets and count them indepently local function initializer() tobesaved = jobpositions.tobesaved collected = jobpositions.collected + -- add sparse regions + local pages = structures.pages.collected + if pages then + local last = nil + for p=1,#pages do + local region = "page:" .. p + local data = collected[region] + if data then + last = data + last.p = nil -- no need for a page + elseif last then + collected[region] = last + end + end + end -- enhance regions with paragraphs for tag, data in next, collected do local region = data.r @@ -162,6 +189,7 @@ local function initializer() end -- so, we can be sparse and don't need 'or 0' code end + jobpositions.used = next(collected) end job.register('job.positions.collected', tobesaved, initializer) @@ -259,9 +287,15 @@ local function enhance(data) return data end -local function set(name,index,val) +-- analyze some files (with lots if margindata) and then when one key optionally +-- use that one instead of a table (so, a 3rd / 4th argument: key, e.g. "x") + +local function set(name,index,val) -- ,key local data = enhance(val or index) if val then +-- if data[key] and not next(next(data)) then +-- data = data[key] +-- end container = tobesaved[name] if not container then tobesaved[name] = { @@ -289,7 +323,26 @@ jobpositions.setall = setall jobpositions.set = set jobpositions.get = get -commands.setpos = setall +-- scanners.setpos = setall + +-- trackers.enable("tokens.compi*") + +-- something weird: the compiler fails us here + +scanners.dosaveposition = compilescanner { + actions = setall, -- name p x y + arguments = { "string", "integer", "dimen", "dimen" } +} + +scanners.dosavepositionwhd = compilescanner { -- somehow fails + actions = setall, -- name p x y w h d + arguments = { "string", "integer", "dimen", "dimen", "dimen", "dimen", "dimen" } +} + +scanners.dosavepositionplus = compilescanner { + actions = setall, -- name p x y w h d extra + arguments = { "string", "integer", "dimen", "dimen", "dimen", "dimen", "dimen", "string" } +} -- will become private table (could also become attribute driven but too nasty -- as attributes can bleed e.g. in margin stuff) @@ -318,18 +371,26 @@ function jobpositions.e_col(tag) column = columns[#columns] end -function commands.bcolumn(tag,register) -- name will change +scanners.bposcolumn = function() -- tag + local tag = scanstring() insert(columns,tag) column = tag - if register then - context(new_latelua_node(f_b_column(tag))) - end end -function commands.ecolumn(register) -- name will change - if register then - context(new_latelua_node(f_e_column())) - end +scanners.bposcolumnregistered = function() -- tag + local tag = scanstring() + insert(columns,tag) + column = tag + context(new_latelua_node(f_b_column(tag))) +end + +scanners.eposcolumn = function() + remove(columns) + column = columns[#columns] +end + +scanners.eposcolumnregistered = function() + context(new_latelua_node(f_e_column())) remove(columns) column = columns[#columns] end @@ -355,7 +416,7 @@ function jobpositions.e_region(correct) region = regions[#regions] end -function jobpositions.markregionbox(n,tag,correct) +local function setregionbox(n,tag) if not tag or tag == "" then nofregions = nofregions + 1 tag = f_region(nofregions) @@ -372,6 +433,11 @@ function jobpositions.markregionbox(n,tag,correct) h = h ~= 0 and h or nil, d = d ~= 0 and d or nil, } + return tag, box +end + +local function markregionbox(n,tag,correct) + local tag, box = setregionbox(n,tag) local push = new_latelua(f_b_region(tag)) local pop = new_latelua(f_e_region(tostring(correct))) -- todo: check if tostring is needed with formatter -- maybe we should construct a hbox first (needs experimenting) so that we can avoid some at the tex end @@ -389,18 +455,22 @@ function jobpositions.markregionbox(n,tag,correct) setfield(box,"list",push) end +jobpositions.markregionbox = markregionbox +jobpositions.setregionbox = setregionbox + function jobpositions.enhance(name) enhance(tobesaved[name]) end -function commands.pos(name,t) - tobesaved[name] = t - context(new_latelua_node(f_enhance(name))) -end +-- scanners.pos = function(name,t) -- name t +-- local name = scanstring() +-- tobesaved[name] = scanstring() +-- context(new_latelua_node(f_enhance(name))) +-- end local nofparagraphs = 0 -function commands.parpos() -- todo: relate to localpar (so this is an intermediate variant) +scanners.parpos = function() -- todo: relate to localpar (so this is an intermediate variant) nofparagraphs = nofparagraphs + 1 texsetcount("global","c_anch_positions_paragraph",nofparagraphs) local strutbox = getbox("strutbox") @@ -443,7 +513,8 @@ function commands.parpos() -- todo: relate to localpar (so this is an intermedia context(new_latelua_node(f_enhance(tag))) end -function commands.posxy(name) -- can node.write be used here? +scanners.dosetposition = function() -- name + local name = scanstring() tobesaved[name] = { p = true, c = column, @@ -455,38 +526,58 @@ function commands.posxy(name) -- can node.write be used here? context(new_latelua_node(f_enhance(name))) end -function commands.poswhd(name,w,h,d) +scanners.dosetpositionwhd = function() -- name w h d extra + local name = scanstring() tobesaved[name] = { p = true, c = column, r = true, x = true, y = true, - w = w, - h = h, - d = d, + w = scandimen(), + h = scandimen(), + d = scandimen(), n = nofparagraphs > 0 and nofparagraphs or nil, } context(new_latelua_node(f_enhance(name))) end -function commands.posplus(name,w,h,d,extra) +scanners.dosetpositionbox = function() -- name box + local name = scanstring() + local box = getbox(scaninteger()) tobesaved[name] = { p = true, c = column, r = true, x = true, y = true, - w = w, - h = h, - d = d, + w = getfield(box,"width"), + h = getfield(box,"height"), + d = getfield(box,"depth"), n = nofparagraphs > 0 and nofparagraphs or nil, - e = extra, } context(new_latelua_node(f_enhance(name))) end -function commands.posstrut(name,w,h,d) +scanners.dosetpositionplus = function() -- name w h d extra + local name = scanstring() + tobesaved[name] = { + p = true, + c = column, + r = true, + x = true, + y = true, + w = scandimen(), + h = scandimen(), + d = scandimen(), + n = nofparagraphs > 0 and nofparagraphs or nil, + e = scanstring(), + } + context(new_latelua_node(f_enhance(name))) +end + +scanners.dosetpositionstrut = function() -- name + local name = scanstring() local strutbox = getbox("strutbox") tobesaved[name] = { p = true, @@ -532,7 +623,17 @@ end function jobpositions.region(id) local jpi = collected[id] - return jpi and jpi.r or false + if jpi then + local r = jpi.r + if r then + return r + end + local p = jpi.p + if p then + return "page:" .. p + end + end + return false end function jobpositions.column(id) @@ -738,11 +839,23 @@ jobpositions.onsamepage = onsamepage -- interface -commands.replacepospxywhd = jobpositions.replace -commands.copyposition = jobpositions.copy +scanners.replacepospxywhd = function() -- name page x y w h d + collected[scanstring()] = { + p = scaninteger(), + x = scandimen(), + y = scandimen(), + w = scandimen(), + h = scandimen(), + d = scandimen(), + } +end -function commands.MPp(id) - local jpi = collected[id] +scanners.copyposition = function() -- target source + collected[scanstring()] = collected[scanstring()] +end + +scanners.MPp = function() -- name + local jpi = collected[scanstring()] if jpi then local p = jpi.p if p and p ~= true then @@ -753,8 +866,8 @@ function commands.MPp(id) context('0') end -function commands.MPx(id) - local jpi = collected[id] +scanners.MPx = function() -- name + local jpi = collected[scanstring()] if jpi then local x = jpi.x if x and x ~= true and x ~= 0 then @@ -765,8 +878,8 @@ function commands.MPx(id) context('0pt') end -function commands.MPy(id) - local jpi = collected[id] +scanners.MPy = function() -- name + local jpi = collected[scanstring()] if jpi then local y = jpi.y if y and y ~= true and y ~= 0 then @@ -777,8 +890,8 @@ function commands.MPy(id) context('0pt') end -function commands.MPw(id) - local jpi = collected[id] +scanners.MPw = function() -- name + local jpi = collected[scanstring()] if jpi then local w = jpi.w if w and w ~= 0 then @@ -789,8 +902,8 @@ function commands.MPw(id) context('0pt') end -function commands.MPh(id) - local jpi = collected[id] +scanners.MPh = function() -- name + local jpi = collected[scanstring()] if jpi then local h = jpi.h if h and h ~= 0 then @@ -801,8 +914,8 @@ function commands.MPh(id) context('0pt') end -function commands.MPd(id) - local jpi = collected[id] +scanners.MPd = function() -- name + local jpi = collected[scanstring()] if jpi then local d = jpi.d if d and d ~= 0 then @@ -813,8 +926,8 @@ function commands.MPd(id) context('0pt') end -function commands.MPxy(id) - local jpi = collected[id] +scanners.MPxy = function() -- name + local jpi = collected[scanstring()] if jpi then context('(%.5Fpt,%.5Fpt)', jpi.x*pt, @@ -825,8 +938,8 @@ function commands.MPxy(id) end end -function commands.MPll(id) - local jpi = collected[id] +scanners.MPll = function() -- name + local jpi = collected[scanstring()] if jpi then context('(%.5Fpt,%.5Fpt)', jpi.x *pt, @@ -837,8 +950,8 @@ function commands.MPll(id) end end -function commands.MPlr(id) - local jpi = collected[id] +scanners.MPlr = function() -- name + local jpi = collected[scanstring()] if jpi then context('(%.5Fpt,%.5Fpt)', (jpi.x + jpi.w)*pt, @@ -849,8 +962,8 @@ function commands.MPlr(id) end end -function commands.MPur(id) - local jpi = collected[id] +scanners.MPur = function() -- name + local jpi = collected[scanstring()] if jpi then context('(%.5Fpt,%.5Fpt)', (jpi.x + jpi.w)*pt, @@ -861,8 +974,8 @@ function commands.MPur(id) end end -function commands.MPul(id) - local jpi = collected[id] +scanners.MPul = function() -- name + local jpi = collected[scanstring()] if jpi then context('(%.5Fpt,%.5Fpt)', jpi.x *pt, @@ -892,10 +1005,12 @@ local function MPpos(id) context('0,0,0,0,0,0') -- for mp only end -commands.MPpos = MPpos +scanners.MPpos = function() -- name + MPpos(scanstring()) +end -function commands.MPn(id) - local jpi = collected[id] +scanners.MPn = function() -- name + local jpi = collected[scanstring()] if jpi then local n = jpi.n if n then @@ -906,25 +1021,28 @@ function commands.MPn(id) context(0) end -function commands.MPc(id) - local jpi = collected[id] +scanners.MPc = function() -- name + local jpi = collected[scanstring()] if jpi then local c = jpi.c - if c and p ~= true then + if c and c ~= true then context(c) return end end - context(c) -- number + context('0') -- okay ? end -function commands.MPr(id) - local jpi = collected[id] +scanners.MPr = function() -- name + local jpi = collected[scanstring()] if jpi then local r = jpi.r - if r and p ~= true then + if r and r ~= true then context(r) - return + end + local p = jpi.p + if p then + context("page:" .. p) end end end @@ -949,29 +1067,32 @@ local function MPpardata(n) end end -commands.MPpardata = MPpardata +scanners.MPpardata = function() -- name + MPpardata(scanstring()) +end -function commands.MPposset(id) -- special helper, used in backgrounds - local b = f_b_tag(id) - local e = f_e_tag(id) - local w = f_w_tag(id) +scanners.MPposset = function() -- name (special helper, used in backgrounds) + local name = scanstring() + local b = f_b_tag(name) + local e = f_e_tag(name) + local w = f_w_tag(name) local p = f_p_tag(jobpositions.n(b)) MPpos(b) context(",") MPpos(e) context(",") MPpos(w) context(",") MPpos(p) context(",") MPpardata(p) end -function commands.MPls(id) - local t = collected[id] - if t then - context("%.5Fpt",t.ls*pt) +scanners.MPls = function() -- name + local jpi = collected[scanstring()] + if jpi then + context("%.5Fpt",jpi.ls*pt) else context("0pt") end end -function commands.MPrs(id) - local t = collected[id] - if t then - context("%.5Fpt",t.rs*pt) +scanners.MPrs = function() -- name + local jpi = collected[scanstring()] + if jpi then + context("%.5Fpt",jpi.rs*pt) else context("0pt") end @@ -979,8 +1100,10 @@ end local splitter = lpeg.tsplitat(",") -function commands.MPplus(id,n,default) - local jpi = collected[id] +scanners.MPplus = function() -- name n default + local jpi = collected[scanstring()] + local n = scaninteger() + local default = scanstring() if jpi then local e = jpi.e if e then @@ -996,59 +1119,79 @@ function commands.MPplus(id,n,default) context(default) end -function commands.MPrest(id,default) - local jpi = collected[id] +scanners.MPrest = function() -- name default + local jpi = collected[scanstring()] + local default = scanstring() context(jpi and jpi.e or default) end -function commands.MPxywhd(id) - local t = collected[id] - if t then +scanners.MPxywhd = function() -- name + local jpi = collected[scanstring()] + if jpi then context("%.5Fpt,%.5Fpt,%.5Fpt,%.5Fpt,%.5Fpt", - t.x*pt, - t.y*pt, - t.w*pt, - t.h*pt, - t.d*pt + jpi.x*pt, + jpi.y*pt, + jpi.w*pt, + jpi.h*pt, + jpi.d*pt ) else context("0,0,0,0,0") -- for mp only end end -local doif, doifelse = commands.doif, commands.doifelse +local doif = commands.doif +local doifelse = commands.doifelse -function commands.doifpositionelse(name) - doifelse(collected[name]) +scanners.doifelseposition = function() -- name + doifelse(collected[scanstring()]) end -function commands.doifposition(name) - doif(collected[name]) +scanners.doifposition = function() -- name + doif(collected[scanstring()]) end -function commands.doifpositiononpage(name,page) -- probably always realpageno - local c = collected[name] - doifelse(c and c.p == page) +scanners.doifelsepositiononpage = function() -- name page -- probably always realpageno + local c = collected[scanstring()] + local p = scaninteger() + doifelse(c and c.p == p) end -function commands.doifoverlappingelse(one,two,overlappingmargin) - doifelse(overlapping(one,two,overlappingmargin)) +scanners.doifelseoverlapping = function() -- one two + doifelse(overlapping(scanstring(),scanstring())) end -function commands.doifpositionsonsamepageelse(list,page) - doifelse(onsamepage(list)) +scanners.doifelsepositionsonsamepage = function() -- list + doifelse(onsamepage(scanstring())) end -function commands.doifpositionsonthispageelse(list) - doifelse(onsamepage(list,tostring(texgetcount("realpageno")))) +scanners.doifelsepositionsonthispage = function() -- list + doifelse(onsamepage(scanstring(),tostring(texgetcount("realpageno")))) end -function commands.doifelsepositionsused() +scanners.doifelsepositionsused = function() doifelse(next(collected)) end -commands.markcolumnbox = jobpositions.markcolumnbox -commands.markregionbox = jobpositions.markregionbox +scanners.markregionbox = function() -- box + markregionbox(scaninteger()) +end + +scanners.setregionbox = function() -- box + setregionbox(scaninteger()) +end + +scanners.markregionboxtagged = function() -- box tag + markregionbox(scaninteger(),scanstring()) +end + +scanners.setregionboxtagged = function() -- box tag + setregionbox(scaninteger(),scanstring()) +end + +scanners.markregionboxcorrected = function() -- box tag + markregionbox(scaninteger(),scanstring(),true) +end -- statistics (at least for the moment, when testing) diff --git a/Master/texmf-dist/tex/context/base/anch-pos.mkiv b/Master/texmf-dist/tex/context/base/anch-pos.mkiv index 7ecaa296ed8..5d9c2fd3478 100644 --- a/Master/texmf-dist/tex/context/base/anch-pos.mkiv +++ b/Master/texmf-dist/tex/context/base/anch-pos.mkiv @@ -32,15 +32,15 @@ %D \dosetpositionplus {identifier} {width} {height} {depth} {list} %D \stoptyping -\def\dosaveposition #1#2#3#4{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4)}} -\def\dosavepositionwhd #1#2#3#4#5#6#7{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7)}} -\def\dosavepositionplus#1#2#3#4#5#6#7#8{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7,"#8")}} +\def\dosaveposition #1#2#3#4{\clf_dosaveposition {#1}#2 #3 #4\relax} +\def\dosavepositionwhd #1#2#3#4#5#6#7{\clf_dosavepositionwhd {#1}#2 #3 #4 #5 #6 #7\relax} +\def\dosavepositionplus#1#2#3#4#5#6#7#8{\clf_dosavepositionplus{#1}#2 #3 #4 #5 #6 #7{#8}} -\def\dosetposition #1{\ctxcommand{posxy("#1")}} -\def\dosetpositionwhd #1#2#3#4{\ctxcommand{poswhd("#1",\number\dimexpr#2,\number\dimexpr#3,\number\dimexpr#4)}} -\def\dosetpositionplus#1#2#3#4#5{\ctxcommand{posplus("#1",\number\dimexpr#2,\number\dimexpr#3,\number\dimexpr#4,"#5")}} -\def\dosetpositionbox #1#2{\ctxcommand{poswhd("#1",\number\wd#2,\number\ht#2,\number\dp#2)}} -\def\dosetpositionstrut #1{\ctxcommand{posstrut("#1")}} +\def\dosetposition #1{\clf_dosetposition {#1}} % {} expands +\def\dosetpositionwhd #1#2#3#4{\clf_dosetpositionwhd {#1}#2 #3 #4\relax} +\def\dosetpositionplus#1#2#3#4#5{\clf_dosetpositionplus {#1}#2 #3 #4{#5}} +\def\dosetpositionbox #1#2{\clf_dosetpositionbox {#1}#2\relax} +\def\dosetpositionstrut #1{\clf_dosetpositionstrut{#1}} \newbox\b_anch_position \newif \ifpositioning % sort of public @@ -48,7 +48,7 @@ %D Sometimes we want to trick the position handler a bit: \def\replacepospxywhd#1#2#3#4#5#6#7% when used we can better make a helper - {\ctxcommand{replacepospxywhd('#1',\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7)}} + {\clf_replacepospxywhd{#1}#2 #3 #4 #5 #6 #7\relax} %D \macros %D {MPp, MPx, MPy, MPw, MPh, MPd, MPxy, MPll, MPlr, MPur, MPul, MPpos, MPanchor} @@ -56,28 +56,35 @@ %D Access to the positional information is provided by macros with short names %S that are clearly meant for \METAPOST\ but nowadays also used for other purposes. -\def\MPp #1{\ctxcommand{MPp("#1")}} \let\MPpage \MPp -\def\MPr #1{\ctxcommand{MPr("#1")}} \let\MPregion \MPr -\def\MPc #1{\ctxcommand{MPc("#1")}} \let\MPcolumn \MPc -\def\MPn #1{\ctxcommand{MPn("#1")}} \let\MPparagraph\MPn -\def\MPx #1{\ctxcommand{MPx("#1")}} -\def\MPy #1{\ctxcommand{MPy("#1")}} -\def\MPw #1{\ctxcommand{MPw("#1")}} % first we need to replace \MPwidth etc -\def\MPh #1{\ctxcommand{MPh("#1")}} -\def\MPd #1{\ctxcommand{MPd("#1")}} -\def\MPxy #1{\ctxcommand{MPxy("#1")}} -\def\MPll #1{\ctxcommand{MPll("#1")}} -\def\MPlr #1{\ctxcommand{MPlr("#1")}} -\def\MPur #1{\ctxcommand{MPur("#1")}} -\def\MPul #1{\ctxcommand{MPul("#1")}} -\def\MPpos #1{\ctxcommand{MPpos("#1")}} \let\MPanchor\MPpos % overloaded locally when needed -\def\MPe #1{\ctxcommand{MPe("#1")}} - -\def\MPls #1{\ctxcommand{MPls("#1")}} \let\MPleftskip\MPls % compatible feature -\def\MPrs #1{\ctxcommand{MPrs("#1")}} \let\MPrightkip\MPrs % compatible feature - -\def\MPpardata#1{\ctxcommand{MPpardata("#1")}} -\def\MPxywhd #1{\ctxcommand{MPxywhd("#1")}} +\def\MPp #1{\clf_MPp {#1}} +\def\MPr #1{\clf_MPr {#1}} +\def\MPc #1{\clf_MPc {#1}} +\def\MPn #1{\clf_MPn {#1}} +\def\MPx #1{\clf_MPx {#1}} +\def\MPy #1{\clf_MPy {#1}} +\def\MPw #1{\clf_MPw {#1}} +\def\MPh #1{\clf_MPh {#1}} +\def\MPd #1{\clf_MPd {#1}} +\def\MPxy #1{\clf_MPxy {#1}} +\def\MPll #1{\clf_MPll {#1}} +\def\MPlr #1{\clf_MPlr {#1}} +\def\MPur #1{\clf_MPur {#1}} +\def\MPul #1{\clf_MPul {#1}} +\def\MPpos #1{\clf_MPpos {#1}} +\def\MPls #1{\clf_MPls {#1}} +\def\MPrs #1{\clf_MPrs {#1}} +\def\MPpardata#1{\clf_MPpardata{#1}} +\def\MPxywhd #1{\clf_MPxywhd {#1}} +\def\MPposset #1{\clf_MPposset {#1}} + +\let\MPpage \MPp +\let\MPregion \MPr +\let\MPcolumn \MPc +\let\MPparagraph\MPn + +\let\MPanchor \MPpos % overloaded locally when needed +\let\MPleftskip \MPls % compatible feature +\let\MPrightkip \MPrs % compatible feature %D \macros %D {MPplus, MPrest, MPv, MPvv} @@ -98,8 +105,8 @@ %D %D The extra parameters are not treated. -\def\MPplus#1#2#3{\ctxcommand{MPplus("#1",#2,"#3")}} \let\MPv \MPplus -\def\MPrest #1#2{\ctxcommand{MPrest("#1","#2")}} \let\MPvv\MPrest +\def\MPplus#1#2#3{\clf_MPplus{#1}#2{#3}} \let\MPv \MPplus +\def\MPrest #1#2{\clf_MPrest{#1}{#2}} \let\MPvv\MPrest %D There are two low level positioning macros. Both store the position as well %D as execute an action associated with that position. @@ -248,9 +255,11 @@ \newcount\c_anch_column % will be delegated to lua \newcount\c_anch_text % will be delegated to lua +% beware we need to pass \somethingexpanded or { } + \unexpanded\def\anch_mark_column_box#1% {\global\advance\c_anch_column\plusone - \ctxcommand{markregionbox(\number#1,"columnarea:\the\c_anch_column")}} % extra height + \clf_markregionboxtagged#1{columnarea:\the\c_anch_column}} % extra height \unexpanded\def\anch_mark_region_box {\iftrialtypesetting @@ -262,24 +271,27 @@ \fi\fi} \unexpanded\def\anch_mark_region_box_indeed#1% - {\ctxcommand{markregionbox(\number#1)}} + {\clf_markregionbox#1\relax} \unexpanded\def\anch_mark_flow_box#1% will be extended / renamed {\hbox\bgroup \global\advance\c_anch_text\plusone - \ctxcommand{markregionbox(\number#1,"textarea:\the\c_anch_text")}% + \clf_markregionboxtagged#1{textarea:\the\c_anch_text}% \box#1% \egroup} +\unexpanded\def\anch_mark_tagged_box#1#2% + {\clf_markregionboxtagged#1{#2}} + \unexpanded\def\anch_mark_flow_only#1% will be extended / renamed {\global\advance\c_anch_text\plusone - \ctxcommand{markregionbox(\number#1,"textarea:\the\c_anch_text",true)}} + \clf_markregionboxcorrected#1{textarea:\the\c_anch_text}} \unexpanded\def\anch_make_page_box#1% maybe like text - {\ctxcommand{markregionbox(\number#1,"\pageanchor")}} % needs an hbox + {\clf_setregionboxtagged#1{page:\the\realpageno}} \unexpanded\def\anch_mark_text_box#1% - {\ctxcommand{markregionbox(\number#1,"\textanchor")}} % needs an hbox + {\clf_markregionboxtagged#1{text:\the\realpageno}} % needs an hbox %D We can copy a position with: %D @@ -289,7 +301,8 @@ %D %D Again, this is a global operation. -\def\copyposition#1#2{\ctxcommand{copyposition('#1','#2')}} +\unexpanded\def\copyposition#1#2% + {\clf_copyposition{#1}{#2}} %D The fact that handling positions is a two pass operation, is one of the %D reasons why we need to be able to test for existence, using: @@ -298,8 +311,12 @@ %D \doifpositionelse {identifier} {found action} {not found action} %D \stoptyping -\def\doifpositionelse#1{\ctxcommand{doifpositionelse('#1')}} -\def\doifposition #1{\ctxcommand{doifposition('#1')}} +\unexpanded\def\doifposition #1{\clf_doifposition {#1}} +\unexpanded\def\doifelseposition #1{\clf_doifelseposition {#1}} +\unexpanded\def\doifelsepositiononpage#1#2{\clf_doifelsepositiononpage{#1}#2\relax} + +\let\doifpositionelse \doifelseposition +\let\doifpositiononpageelse\doifelsepositiononpage %D \macros %D {xypos} @@ -315,8 +332,8 @@ %D \NC \type {\epos} \NC e: \NC end point in a line \NC \NR %D \stoptabulate %D -%D Each macro takes an identifier as argument, and the \type -%D {\hpos} and \type {\vpos} also expect box content. +%D Each macro takes an identifier as argument, and the \type {\hpos} and +%D \type {\vpos} also expect box content. \let\xypos\setpositiononly @@ -352,7 +369,7 @@ \fi} \def\anch_positions_register_par_options_normal - {\dontleavehmode\ctxcommand{parpos()}} + {\dontleavehmode\clf_parpos} \def\anch_positions_register_par_options_traced {\anch_positions_register_par_options_normal @@ -407,7 +424,9 @@ %D {action when not overlapping} %D \stoptyping -\def\doifoverlappingelse#1#2{\ctxcommand{doifoverlappingelse("#1","#2")}} +\unexpanded\def\doifelseoverlapping#1#2{\clf_doifelseoverlapping{#1}{#2}} + +\let\doifoverlappingelse\doifelseoverlapping %D \macros %D {doifpositionsonsamepageelse, @@ -425,7 +444,16 @@ %D {action when not on this page} %D \stoptyping -\def\doifpositionsonsamepageelse#1{\ctxcommand{doifpositionsonsamepageelse("#1")}} -\def\doifpositionsonthispageelse#1{\ctxcommand{doifpositionsonthispageelse("#1")}} +\unexpanded\def\doifelsepositionsonsamepage#1{\clf_doifelsepositionsonsamepage{#1}} +\unexpanded\def\doifelsepositionsonthispage#1{\clf_doifelsepositionsonthispage{#1}} + +\let\doifpositionsonsamepageelse\doifelsepositionsonsamepage +\let\doifpositionsonthispageelse\doifelsepositionsonthispage + +%D Moved here: + +\unexpanded\def\doifelsepositionsused{\clf_doifelsepositionsused} + +\let\doifpositionsusedelse\doifelsepositionsused \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/anch-snc.mkiv b/Master/texmf-dist/tex/context/base/anch-snc.mkiv index 77ebc3e0e71..27769fbf935 100644 --- a/Master/texmf-dist/tex/context/base/anch-snc.mkiv +++ b/Master/texmf-dist/tex/context/base/anch-snc.mkiv @@ -51,6 +51,8 @@ \def\doifelselastsyncposition#1#2% {\doifelse{\lastsyncclass\lastsyncposition}{#1#2}} +\let\doiflastsyncpositionelse\doifelselastsyncposition + \def\dodosyncposition#1#2#3% {\letgvalue{\s!reset:\s!syncpos:#1}\relax \letgvalue{\s!preset:\s!syncpos:#1}\relax @@ -74,7 +76,7 @@ \!!counta\zerocount \!!countc\zerocount \doloop - {\doifpositionelse{\s!syncpos:#1:\recurselevel} + {\doifelseposition{\s!syncpos:#1:\recurselevel} {\!!dimenb\MPy{\s!syncpos:#1:\recurselevel}\relax \!!countb\MPp{\s!syncpos:#1:\recurselevel}\relax \ifnum\!!countb=\!!counta % same page diff --git a/Master/texmf-dist/tex/context/base/anch-tab.mkiv b/Master/texmf-dist/tex/context/base/anch-tab.mkiv index a70f63e24bf..da735b49de5 100644 --- a/Master/texmf-dist/tex/context/base/anch-tab.mkiv +++ b/Master/texmf-dist/tex/context/base/anch-tab.mkiv @@ -43,16 +43,16 @@ \fi} \unexpanded\def\tabl_tabulate_hook_b_first - {\ctxcommand{bcolumn("tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column",true)}} + {\clf_bposcolumnregistered{tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column}} \unexpanded\def\tabl_tabulate_hook_b_next - {\ctxcommand{bcolumn("tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column")}} + {\clf_bposcolumn{tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column}} \unexpanded\def\tabl_tabulate_hook_e_first - {\ctxcommand{ecolumn(true)}} + {\clf_eposcolumnregistered} \unexpanded\def\tabl_tabulate_hook_e_next - {\ctxcommand{ecolumn()}} + {\clf_eposcolumn} % \appendtoks \registerparoptions \to \everypar diff --git a/Master/texmf-dist/tex/context/base/attr-col.lua b/Master/texmf-dist/tex/context/base/attr-col.lua index 7c6b7909ba2..28eda5ca91f 100644 --- a/Master/texmf-dist/tex/context/base/attr-col.lua +++ b/Master/texmf-dist/tex/context/base/attr-col.lua @@ -17,9 +17,14 @@ local format = string.format local concat = table.concat local min, max, floor = math.min, math.max, math.floor -local attributes, nodes, utilities, logs, backends, storage = attributes, nodes, utilities, logs, backends, storage -local commands, context, interfaces = commands, context, interfaces -local tex = tex +local attributes = attributes +local nodes = nodes +local utilities = utilities +local logs = logs +local backends = backends +local storage = storage +local context = context +local tex = tex local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex @@ -43,6 +48,9 @@ local unsetvalue = attributes.unsetvalue local registerstorage = storage.register local formatters = string.formatters +local interfaces = interfaces +local implement = interfaces.implement + -- We can distinguish between rules and glyphs but it's not worth the trouble. A -- first implementation did that and while it saves a bit for glyphs and rules, it -- costs more resourses for transparencies. So why bother. @@ -246,7 +254,11 @@ end --~ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p } --~ end +local p_split = lpeg.tsplitat(",") +local lpegmatch = lpeg.match + function colors.spot(parent,f,d,p) + -- inspect(parent) inspect(f) inspect(d) inspect(p) if type(p) == "number" then local n = list[numbers.color][parent] -- hard coded ref to color number if n then @@ -261,6 +273,33 @@ function colors.spot(parent,f,d,p) end else -- todo, multitone (maybe p should be a table) + local ps = lpegmatch(p_split,p) + local ds = lpegmatch(p_split,d) + local c, m, y, k = 0, 0, 0, 0 + local done = false + for i=1,#ps do + local p = tonumber(ps[i]) + local d = ds[i] + if p and d then + local n = list[numbers.color][d] -- hard coded ref to color number + if n then + local v = values[n] + if v then + c = c + p*v[6] + m = m + p*v[7] + y = y + p*v[8] + k = k + p*v[8] + done = true + end + end + end + end + if done then + local r, g, b = cmyktorgb(c,m,y,k) + local s = cmyktogray(c,m,y,k) + local f = tonumber(f) + return { 5, s, r, g, b, c, m, y, k, parent, f, d, p } + end end return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p } end @@ -529,10 +568,10 @@ end -- interface -commands.enablecolor = colors.enable -commands.enabletransparency = transparencies.enable -commands.enablecolorintents = colorintents.enable +implement { name = "enablecolor", onlyonce = true, actions = colors.enable } +implement { name = "enabletransparency", onlyonce = true, actions = transparencies.enable } +implement { name = "enablecolorintents", onlyonce = true, actions = colorintents.enable } -function commands.registercolor (...) context(colors .register(...)) end -function commands.registertransparency(...) context(transparencies.register(...)) end -function commands.registercolorintent (...) context(colorintents .register(...)) end +--------- { name = "registercolor", actions = { colors .register, context }, arguments = "string" } +--------- { name = "registertransparency", actions = { transparencies.register, context }, arguments = { ... } } +implement { name = "registercolorintent", actions = { colorintents .register, context }, arguments = { ... } } diff --git a/Master/texmf-dist/tex/context/base/attr-eff.lua b/Master/texmf-dist/tex/context/base/attr-eff.lua index b187b64c79f..ff41e12de70 100644 --- a/Master/texmf-dist/tex/context/base/attr-eff.lua +++ b/Master/texmf-dist/tex/context/base/attr-eff.lua @@ -6,7 +6,6 @@ if not modules then modules = { } end modules ['attr-eff'] = { license = "see context related readme files" } -local commands, interfaces = commands, interfaces local attributes, nodes, backends, utilities = attributes, nodes, backends, utilities local tex = tex @@ -18,6 +17,9 @@ local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex local formatters = string.formatters +local interfaces = interfaces +local implement = interfaces.implement + local variables = interfaces.variables local v_normal = variables.normal @@ -91,8 +93,13 @@ local function register(specification) return n end +local enabled = false + local function enable() - tasks.enableaction("shipouts","attributes.effects.handler") + if not enabled then + tasks.enableaction("shipouts","attributes.effects.handler") + enabled = true + end end effects.register = register @@ -100,12 +107,28 @@ effects.enable = enable -- interface -local enabled = false +implement { + name = "seteffect", + actions = function(specification) + if not enabled then + enable() + end + texsetattribute(a_effect,register(specification)) + end, + arguments = { + { + { "alternative", "string" }, + { "stretch", "integer" }, + { "rulethickness", "dimen" } + } + } +} -function commands.triggereffect(specification) - if not enabled then - enable() - enabled = true +implement { + name = "reseteffect", + actions = function() + if enabled then + texsetattribute(a_effect,register()) + end end - texsetattribute(a_effect,register(specification)) -end +} diff --git a/Master/texmf-dist/tex/context/base/attr-eff.mkiv b/Master/texmf-dist/tex/context/base/attr-eff.mkiv index 43f575a7a69..bec8687ead5 100644 --- a/Master/texmf-dist/tex/context/base/attr-eff.mkiv +++ b/Master/texmf-dist/tex/context/base/attr-eff.mkiv @@ -36,14 +36,14 @@ \to \everydefineeffect \unexpanded\def\starteffect[#1]% - {\ctxcommand{triggereffect{ - alternative = "\namedeffectparameter{#1}\c!alternative", - stretch = \number\namedeffectparameter{#1}\c!stretch, - rulethickness = \number\dimexpr\namedeffectparameter{#1}\c!rulethickness\relax - }}} + {\clf_seteffect + alternative {\namedeffectparameter{#1}\c!alternative} + stretch \numexpr\namedeffectparameter{#1}\c!stretch\relax + rulethickness \dimexpr\namedeffectparameter{#1}\c!rulethickness\relax + \relax} \unexpanded\def\stopeffect % can be special - {\ctxcommand{triggereffect()}} % v!normal 0 0 + {\clf_reseteffect} % v!normal 0 0 \unexpanded\def\effect[#1]% {\groupedcommand{\starteffect[#1]}{\stopeffect}} diff --git a/Master/texmf-dist/tex/context/base/attr-ini.lua b/Master/texmf-dist/tex/context/base/attr-ini.lua index 1e518467cff..df7404d11b0 100644 --- a/Master/texmf-dist/tex/context/base/attr-ini.lua +++ b/Master/texmf-dist/tex/context/base/attr-ini.lua @@ -6,8 +6,6 @@ if not modules then modules = { } end modules ['attr-ini'] = { license = "see context related readme files" } -local commands, context, nodes, storage = commands, context, nodes, storage - local next, type = next, type --[[ldx-- @@ -15,6 +13,13 @@ local next, type = next, type symbolic names later on.

--ldx]]-- +local nodes = nodes +local context = context +local storage = storage +local commands = commands + +local implement = interfaces.implement + attributes = attributes or { } local attributes = attributes @@ -53,13 +58,13 @@ storage.register("attributes/list", list, "attributes.list") names[0], numbers["fontdynamic"] = "fontdynamic", 0 --[[ldx-- -

We can use the attributes in the range 127-255 (outside user space). These -are only used when no attribute is set at the \TEX\ end which normally -happens in .

+

private attributes are used by the system and public ones are for users. We use dedicated +ranges of numbers for them. Of course a the end a private attribute can be +accessible too, so a private attribute can have a public appearance.

--ldx]]-- -sharedstorage.attributes_last_private = sharedstorage.attributes_last_private or 127 -sharedstorage.attributes_last_public = sharedstorage.attributes_last_public or 1024 +sharedstorage.attributes_last_private = sharedstorage.attributes_last_private or 127 -- very private (can become 15) +sharedstorage.attributes_last_public = sharedstorage.attributes_last_public or 1024 -- less private function attributes.private(name) -- at the lua end (hidden from user) local number = numbers[name] @@ -97,8 +102,8 @@ end attributes.system = attributes.private -function attributes.define(name,number,category) - return (attributes[category or "public"] or attributes["public"])(name,number) +function attributes.define(name,category) + return (attributes[category or "public"] or attributes["public"])(name) end -- tracers @@ -126,19 +131,11 @@ function attributes.ofnode(n) showlist(n,n.attr) end --- interface - -commands.showattributes = attributes.showcurrent - -function commands.defineattribute(name,category) - context(attributes.define(name,category)) -end - -- rather special local store = { } -function commands.savecurrentattributes(name) +function attributes.save(name) name = name or "" local n = node.current_attr() n = n and n.next @@ -153,7 +150,7 @@ function commands.savecurrentattributes(name) } end -function commands.restorecurrentattributes(name) +function attributes.restore(name) name = name or "" local t = store[name] if t then @@ -171,3 +168,28 @@ function commands.restorecurrentattributes(name) end -- store[name] = nil end + +implement { + name = "defineattribute", + arguments = { "string", "string" }, + actions = { attributes.define, context } +} + +-- interface + +implement { + name = "showattributes", + actions = attributes.showcurrent +} + +implement { + name = "savecurrentattributes", + arguments = "string", + actions = attributes.save +} + +implement { + name = "restorecurrentattributes", + arguments = "string", + actions = attributes.restore +} diff --git a/Master/texmf-dist/tex/context/base/attr-ini.mkiv b/Master/texmf-dist/tex/context/base/attr-ini.mkiv index 0c576253415..f351a6800ee 100644 --- a/Master/texmf-dist/tex/context/base/attr-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/attr-ini.mkiv @@ -44,31 +44,6 @@ \ifdefined \s!public \else \def\s!public {public} \fi % for metatex % or hard check later \ifdefined \s!attribute \else \def\s!attribute{attribute} \fi % for metatex % or hard check later -% \unexpanded\def\defineattribute -% {\dodoubleempty\attr_basics_define} -% -% \unexpanded\def\definesystemattribute -% {\dodoubleempty\attr_basics_define_system} -% -% \def\attr_basics_define[#1]% -% {\expandafter\newattribute\csname\??attributecount#1\endcsname -% \expandafter\newconstant \csname\??attributeid#1\endcsname -% \csname\??attributeid#1\endcsname\c_syst_last_allocated_attribute -% \ctxcommand{defineattribute("#1",\number\csname\??attributeid#1\endcsname)}% -% \attr_basics_define_properties[#1]} -% -% \def\attr_basics_define_system[#1]% -% {\scratchcounter\ctxcommand{getprivateattribute("#1")}\relax -% \expandafter\attributedef\csname\??attributecount#1\endcsname\scratchcounter -% \expandafter\newconstant \csname\??attributeid#1\endcsname -% \csname\??attributeid#1\endcsname\scratchcounter -% %\writestatus\m!system{defining system attribute #1 with number \number\scratchcounter}% -% \attr_basics_define_properties[#1]} -% -% \def\attr_basics_define_properties[#1][#2]% -% {\doifnotinset\s!global{#2}{\appendetoks\csname\??attributecount#1\endcsname\attributeunsetvalue\to\attributesresetlist}% -% \doifinset \s!public{#2}{\expandafter\let\csname#1\s!attribute\expandafter\endcsname\csname\??attributeid#1\endcsname}} - \unexpanded\def\defineattribute {\dodoubleempty\attr_basics_define} \unexpanded\def\definesystemattribute{\dodoubleempty\attr_basics_define_system} @@ -76,12 +51,14 @@ \def\attr_basics_define_system{\attr_basics_define_indeed{private}} \def\attr_basics_define_indeed#1[#2][#3]% - {\scratchcounter\ctxcommand{defineattribute("#2","#1")}\relax + {\scratchcounter\clf_defineattribute{#2}{#1}\relax %\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}% \expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter \expandafter\newconstant \csname\??attributeid#2\endcsname \csname\??attributeid#2\endcsname\scratchcounter + % some attributes are always global \doifnotinset\s!global{#3}{\appendetoks\csname\??attributecount#2\endcsname\attributeunsetvalue\to\attributesresetlist}% + % here public means 'visible' so it's not to be confused with 'public' at the lua end \doifinset \s!public{#3}{\expandafter\let\csname#2\s!attribute\expandafter\endcsname\csname\??attributeid#2\endcsname}} \unexpanded\def\newattribute#1{\attr_basics_define_indeed{public}[\strippedcsname#1][]} @@ -99,8 +76,8 @@ %D Rather special. -\unexpanded\def\savecurrentattributes #1{\ctxcommand{savecurrentattributes ("#1")}} -\unexpanded\def\restorecurrentattributes#1{\ctxcommand{restorecurrentattributes("#1")}} +\unexpanded\def\savecurrentattributes #1{\clf_savecurrentattributes {#1}} +\unexpanded\def\restorecurrentattributes#1{\clf_restorecurrentattributes{#1}} %D For the moment we put this here (later it will move to where it's used): @@ -125,6 +102,6 @@ \definesystemattribute [checkedbreak] [public] \definesystemattribute [vboxtohboxseparator] [public] -\unexpanded\def\showattributes{\ctxcommand{showattributes()}} +\unexpanded\def\showattributes{\clf_showattributes} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/attr-lay.lua b/Master/texmf-dist/tex/context/base/attr-lay.lua index 176af1a2c0a..0d43979c813 100644 --- a/Master/texmf-dist/tex/context/base/attr-lay.lua +++ b/Master/texmf-dist/tex/context/base/attr-lay.lua @@ -15,9 +15,17 @@ if not modules then modules = { } end modules ['attr-lay'] = { local type = type local insert, remove = table.insert, table.remove -local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends -local commands, context, interfaces = commands, context, interfaces -local tex = tex +local attributes = attributes +local nodes = nodes +local utilities = utilities +local logs = logs +local backends = backends + +local context = context +local interfaces = interfaces +local tex = tex + +local implement = interfaces.implement local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex @@ -38,6 +46,8 @@ local viewerlayers = attributes.viewerlayers local variables = interfaces.variables local v_local = variables["local"] local v_global = variables["global"] +local v_start = variables["start"] +local v_yes = variables["yes"] local a_viewerlayer = attributes.private("viewerlayer") @@ -80,15 +90,11 @@ local layerstacker = utilities.stacker.new("layers") -- experiment layerstacker.mode = "stack" layerstacker.unset = attributes.unsetvalue +viewerlayers.resolve_reset = layerstacker.resolve_reset viewerlayers.resolve_begin = layerstacker.resolve_begin viewerlayers.resolve_step = layerstacker.resolve_step viewerlayers.resolve_end = layerstacker.resolve_end -function commands.cleanuplayers() - layerstacker.clean() - -- todo -end - -- stacked local function startlayer(...) startlayer = nodeinjections.startlayer return startlayer(...) end @@ -239,15 +245,63 @@ function viewerlayers.define(settings) end end -commands.defineviewerlayer = viewerlayers.define -commands.startviewerlayer = viewerlayers.start -commands.stopviewerlayer = viewerlayers.stop - -function commands.definedviewerlayer(settings) - viewerlayers.define(settings) - context(register(settings.tag,true)) -- true forces a use +function viewerlayers.definedlayoutcomponent(tag) + viewerlayers.define { + tag = tag, + title = utilities.strings.nice(tag), + visible = v_start, + editable = v_yes, + printable = v_yes, + } + return register(tag,true) -- true forces a use end -function commands.registeredviewerlayer(name) - context(register(name,true)) -- true forces a use +function viewerlayers.cleanup() + layerstacker.clean() + -- todo end + +implement { + name = "cleanuplayers", + actions = viewerlayers.cleanup +} + +implement { + name = "defineviewerlayer", + actions = viewerlayers.define, + arguments = { + { + { "tag" }, + { "title" }, + { "visible" }, + { "editable" }, + { "export" }, + { "printable" }, + { "scope" }, + }, + true + } +} + +implement { + name = "definedlayoutcomponent", + actions = { viewerlayers.definedlayoutcomponent, context }, + arguments = "string" +} + +implement { + name = "startviewerlayer", + actions = viewerlayers.start, + arguments = "string", +} + +implement { + name = "stopviewerlayer", + actions = viewerlayers.stop +} + +implement { + name = "registeredviewerlayer", + actions = { register, context }, + arguments = { "string", true } -- true forces a use +} diff --git a/Master/texmf-dist/tex/context/base/attr-lay.mkiv b/Master/texmf-dist/tex/context/base/attr-lay.mkiv index 6055c2a73d2..14ef4a6d40f 100644 --- a/Master/texmf-dist/tex/context/base/attr-lay.mkiv +++ b/Master/texmf-dist/tex/context/base/attr-lay.mkiv @@ -33,27 +33,31 @@ \setupviewerlayer [\c!state=\v!start, \c!title=, + \c!export=\v!yes, % exportable is ugly \c!printable=\v!yes, \c!scope=\v!local, % maybe global but needs checking with layout \c!method=\v!none] \appendtoks - \ctxcommand{defineviewerlayer{ - tag = "\currentviewerlayer", - title = "\viewerlayerparameter\c!title", - visible = "\viewerlayerparameter\c!state", - editable = "\v!yes", - printable = "\viewerlayerparameter\c!printable", - scope = "\viewerlayerparameter\c!scope" - }}% + \clf_defineviewerlayer + tag {\currentviewerlayer}% + title {\viewerlayerparameter\c!title}% + visible {\viewerlayerparameter\c!state}% + editable {\v!yes}% + export {\viewerlayerparameter\c!export}% + printable {\viewerlayerparameter\c!printable}% + scope {\viewerlayerparameter\c!scope}% + \relax \doif{\viewerlayerparameter\c!method}\v!command {\setuxvalue{\e!start#1}{\startviewerlayer[\currentviewerlayer]}% \setuxvalue{\e!stop #1}{\stopviewerlayer}}% \to \everydefineviewerlayer -\unexpanded\def\startviewerlayer[#1]{\ctxcommand{startviewerlayer("#1")}} % not grouped -\unexpanded\def\stopviewerlayer {\ctxcommand{stopviewerlayer()}} % not grouped -\unexpanded\def\viewerlayer [#1]{\groupedcommand{\startviewerlayer[#1]}{\stopviewerlayer}} % grouped +\unexpanded\def\startviewerlayer[#1]{\clf_startviewerlayer{#1}}% not grouped +\unexpanded\def\stopviewerlayer {\clf_stopviewerlayer} % not grouped +\unexpanded\def\viewerlayer [#1]{\groupedcommand + {\clf_startviewerlayer{#1}}% grouped + {\clf_stopviewerlayer}} % grouped % some day we will keep this at the lua end as the info is only needed there @@ -70,13 +74,7 @@ \installcorenamespace{layoutcomponentattribute} \def\attr_layoutcomponent_initialize#1% - {\edef\layoutcomponentboxattribute{\ctxcommand{definedviewerlayer{% - tag = "#1", - title = utilities.strings.nice("#1"), % only here as in steps we have step: - visible = "\v!start", - editable = "\v!yes", - printable = "\v!yes" - }}}% + {\edef\layoutcomponentboxattribute{\clf_definedlayoutcomponent{#1}}% \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \layoutcomponentboxattribute\relax}% \expandafter\glet\csname\??layoutcomponentattribute#1\endcsname\layoutcomponentboxattribute} @@ -98,7 +96,7 @@ \let\resetlayoutcomponentattribute\attr_layoutcomponent_reset} \unexpanded\def\attr_layoutcomponent_cleanup - {\ctxcommand{cleanuplayers()}} + {\clf_cleanuplayers} \appendtoks \attr_layoutcomponent_cleanup diff --git a/Master/texmf-dist/tex/context/base/attr-neg.lua b/Master/texmf-dist/tex/context/base/attr-neg.lua index c32cec956b2..1347c3d1ad8 100644 --- a/Master/texmf-dist/tex/context/base/attr-neg.lua +++ b/Master/texmf-dist/tex/context/base/attr-neg.lua @@ -18,7 +18,7 @@ local tex = tex local states = attributes.states local tasks = nodes.tasks local nodeinjections = backends.nodeinjections -local settexattribute = tex.setattribute +local texsetattribute = tex.setattribute local variables = interfaces.variables local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex @@ -89,10 +89,16 @@ negatives.enable = enable local enabled = false -function commands.triggernegative(stamp) +function negatives.set(stamp) if not enabled then enable() enabled = true end - settexattribute(a_negative,register(stamp)) + texsetattribute(a_negative,register(stamp)) end + +interfaces.implement { + name = "setnegative", + actions = negatives.set, + arguments = "string", +} diff --git a/Master/texmf-dist/tex/context/base/attr-neg.mkiv b/Master/texmf-dist/tex/context/base/attr-neg.mkiv index 102b220baca..ff1f52a96b4 100644 --- a/Master/texmf-dist/tex/context/base/attr-neg.mkiv +++ b/Master/texmf-dist/tex/context/base/attr-neg.mkiv @@ -25,6 +25,6 @@ \unexpanded\def\startpositive{\attr_trigger_negative\v!positive} \unexpanded\def\stoppositive {\attr_trigger_negative\v!negative} -\def\attr_trigger_negative#1{\ctxcommand{triggernegative('#1')}} +\def\attr_trigger_negative#1{\clf_setnegative{#1}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/back-exp.lua b/Master/texmf-dist/tex/context/base/back-exp.lua index 44c2cd539b2..a4127e6be67 100644 --- a/Master/texmf-dist/tex/context/base/back-exp.lua +++ b/Master/texmf-dist/tex/context/base/back-exp.lua @@ -6,7 +6,14 @@ if not modules then modules = { } end modules ['back-exp'] = { license = "see context related readme files" } --- beware: we run out of the 200 local limit +-- Todo: share properties more with tagged pdf (or thge reverse) + +-- Because we run into the 200 local limit we quite some do .. end wrappers .. not always +-- that nice but it has to be. + +-- Experiments demonstrated that mapping to
and classes is messy because we have to +-- package attributes (some 30) into one set of (space seperatated but prefixed classes) +-- which only makes things worse .. so if you want something else, use xslt to get there. -- language -> only mainlanguage, local languages should happen through start/stoplanguage -- tocs/registers -> maybe add a stripper (i.e. just don't flush entries in final tree) @@ -23,21 +30,29 @@ if not modules then modules = { } end modules ['back-exp'] = { -- todo: move critital formatters out of functions -- todo: delay loading (apart from basic tag stuff) -local next, type = next, type -local format, concat, sub, gsub = string.format, table.concat, string.sub, string.gsub +-- problem : too many local variables + +-- check setting __i__ + +local next, type, tonumber = next, type, tonumber +local concat, sub, gsub = table.concat, string.sub, string.gsub local validstring = string.valid local lpegmatch = lpeg.match local utfchar, utfvalues = utf.char, utf.values local insert, remove = table.insert, table.remove -local fromunicode16 = fonts.mappings.fromunicode16 local sortedhash = table.sortedhash local formatters = string.formatters +local todimen = number.todimen +local replacetemplate = utilities.templates.replace local trace_export = false trackers.register ("export.trace", function(v) trace_export = v end) local trace_spacing = false trackers.register ("export.trace.spacing", function(v) trace_spacing = v end) + local less_state = false directives.register("export.lessstate", function(v) less_state = v end) local show_comment = true directives.register("export.comment", function(v) show_comment = v end) +show_comment = false -- figure out why break comment + -- maybe we will also support these: -- -- local css_hyphens = false directives.register("export.css.hyphens", function(v) css_hyphens = v end) @@ -49,7 +64,16 @@ local report_export = logs.reporter("backend","export") local nodes = nodes local attributes = attributes + local variables = interfaces.variables +local v_yes = variables.yes +local v_no = variables.no +local v_normal = variables.normal +local v_flushright = variables.flushright +local v_middle = variables.middle +local v_flushleft = variables.flushleft + +local implement = interfaces.implement local settings_to_array = utilities.parsers.settings_to_array @@ -85,15 +109,14 @@ local line_code = listcodes.line local texgetcount = tex.getcount -local a_characters = attributes.private('characters') -local a_exportstatus = attributes.private('exportstatus') - -local a_tagged = attributes.private('tagged') -local a_taggedpar = attributes.private("taggedpar") -local a_image = attributes.private('image') -local a_reference = attributes.private('reference') - -local a_textblock = attributes.private("textblock") +local privateattribute = attributes.private +local a_characters = privateattribute('characters') +local a_exportstatus = privateattribute('exportstatus') +local a_tagged = privateattribute('tagged') +local a_taggedpar = privateattribute("taggedpar") +local a_image = privateattribute('image') +local a_reference = privateattribute('reference') +local a_textblock = privateattribute("textblock") local nuts = nodes.nuts local tonut = nuts.tonut @@ -115,18 +138,21 @@ local traverse_nodes = nuts.traverse local references = structures.references local structurestags = structures.tags local taglist = structurestags.taglist +local specifications = structurestags.specifications local properties = structurestags.properties -local userdata = structurestags.userdata -- might be combines with taglist -local tagdata = structurestags.data -local tagmetadata = structurestags.metadata -local detailedtag = structurestags.detailedtag +local locatedtag = structurestags.locatedtag local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming +local characterdata = characters.data +local overloads = fonts.mappings.overloads + -- todo: more locals (and optimize) -local exportversion = "0.30" +local exportversion = "0.34" +local mathmlns = "http://www.w3.org/1998/Math/MathML" +local contextns = "http://www.contextgarden.net/context/export" -- whatever suits local nofcurrentcontent = 0 -- so we don't free (less garbage collection) local currentcontent = { } @@ -137,14 +163,15 @@ local currentparagraph = nil local noftextblocks = 0 -local attributehash = { } -- to be considered: set the values at the tex end local hyphencode = 0xAD local hyphen = utfchar(0xAD) -- todo: also emdash etc -local colonsplitter = lpeg.splitat(":") -local dashsplitter = lpeg.splitat("-") +local tagsplitter = structurestags.patterns.splitter +----- colonsplitter = lpeg.splitat(":") +----- dashsplitter = lpeg.splitat("-") local threshold = 65536 local indexing = false local keephyphens = false +local exportproperties = false local finetuning = { } @@ -152,6 +179,8 @@ local treestack = { } local nesting = { } local currentdepth = 0 +local wrapups = { } + local tree = { data = { }, fulltag == "root" } -- root local treeroot = tree local treehash = { } @@ -167,7 +196,12 @@ local somespace = { [0x20] = true, [" "] = true } -- for testing local entities = { ["&"] = "&", [">"] = ">", ["<"] = "<" } local attribentities = { ["&"] = "&", [">"] = ">", ["<"] = "<", ['"'] = "quot;" } -local entityremapper = utf.remapper(entities) +local p_entity = lpeg.replacer(entities) -- was: entityremapper = utf.remapper(entities) +local p_attribute = lpeg.replacer(attribentities) +local p_stripper = lpeg.patterns.stripper +local p_escaped = lpeg.patterns.xml.escaped + +local f_id = formatters["%s-%s"] local alignmapping = { flushright = "right", @@ -175,13 +209,6 @@ local alignmapping = { flushleft = "left", } -local numbertoallign = { - [0] = "justify", ["0"] = "justify", [variables.normal ] = "justify", - [1] = "right", ["1"] = "right", [variables.flushright] = "right", - [2] = "center", ["2"] = "center", [variables.middle ] = "center", - [3] = "left", ["3"] = "left", [variables.flushleft ] = "left", -} - local defaultnature = "mixed" -- "inline" setmetatableindex(used, function(t,k) @@ -192,10 +219,14 @@ setmetatableindex(used, function(t,k) end end) +local f_entity = formatters["&#x%X;"] +local f_attribute = formatters[" %s=%q"] +local f_property = formatters[" %s%s=%q"] + setmetatableindex(specialspaces, function(t,k) local v = utfchar(k) t[k] = v - entities[v] = formatters["&#x%X;"](k) + entities[v] = f_entity(k) somespace[k] = true somespace[v] = true return v @@ -207,30 +238,35 @@ local namespaced = { } local namespaces = { - msubsup = "m", - msub = "m", - msup = "m", - mn = "m", - mi = "m", - ms = "m", - mo = "m", - mtext = "m", - mrow = "m", - mfrac = "m", - mroot = "m", - msqrt = "m", - munderover = "m", - munder = "m", - mover = "m", - merror = "m", - math = "m", - mrow = "m", - mtable = "m", - mtr = "m", - mtd = "m", - mfenced = "m", - maction = "m", - mspace = "m", + msubsup = "m", + msub = "m", + msup = "m", + mn = "m", + mi = "m", + ms = "m", + mo = "m", + mtext = "m", + mrow = "m", + mfrac = "m", + mroot = "m", + msqrt = "m", + munderover = "m", + munder = "m", + mover = "m", + merror = "m", + math = "m", + mrow = "m", + mtable = "m", + mtr = "m", + mtd = "m", + mfenced = "m", + maction = "m", + mspace = "m", + -- only when testing + mstacker = "m", + mstackertop = "m", + mstackermid = "m", + mstackerbot = "m", } setmetatableindex(namespaced, function(t,k) @@ -244,171 +280,224 @@ end) local function attribute(key,value) if value and value ~= "" then - return formatters[' %s="%s"'](key,gsub(value,".",attribentities)) + return f_attribute(key,lpegmatch(p_attribute,value)) else return "" end end --- local P, C, Cc = lpeg.P, lpeg.C, lpeg.Cc --- --- local dash, colon = P("-"), P(":") --- --- local precolon, predash, rest = P((1-colon)^1), P((1-dash )^1), P(1)^1 --- --- local tagsplitter = C(precolon) * colon * C(predash) * dash * C(rest) + --- C(predash) * dash * Cc(nil) * C(rest) +local function setattribute(di,key,value,escaped) + if value and value ~= "" then + local a = di.attributes + if escaped then + value = lpegmatch(p_escaped,value) + end + if not a then + di.attributes = { [key] = value } + else + a[key] = value + end + end +end -local listdata = { } +local listdata = { } -- this has to be done otherwise: each element can just point back to ... -local function hashlistdata() +function wrapups.hashlistdata() local c = structures.lists.collected for i=1,#c do local ci = c[i] local tag = ci.references.tag if tag then local m = ci.metadata - listdata[m.kind .. ":" .. m.name .. "-" .. tag] = ci +-- listdata[m.kind .. ":" .. m.name .. "-" .. tag] = ci + listdata[m.kind .. ">" .. tag] = ci end end end -local spaces = utilities.strings.newrepeater(" ",-1) - -function structurestags.setattributehash(fulltag,key,value) -- public hash - if type(fulltag) == "number" then - fulltag = taglist[fulltag] - if fulltag then - fulltag = fulltag[#fulltag] - end - end - if fulltag then - local ah = attributehash[fulltag] -- could be metatable magic - if not ah then - ah = { } - attributehash[fulltag] = ah - end - ah[key] = value +function structurestags.setattributehash(attr,key,value) -- public hash + local specification = taglist[attr] + if specification then + specification[key] = value + else + -- some kind of error end end +local usedstyles = { } + +local namespacetemplate = [[ +/* %what% for file %filename% */ --- experiment: styles and images --- --- officially we should convert to bp but we round anyway +@namespace context url('%namespace%') ; +]] -local usedstyles = { } +do --- /* padding : ; */ --- /* text-justify : inter-word ; */ + -- experiment: styles and images + -- + -- officially we should convert to bp but we round anyway + + -- /* padding : ; */ + -- /* text-justify : inter-word ; */ local documenttemplate = [[ document { - font-size : %s !important ; - max-width : %s !important ; - text-align : %s !important ; - hyphens : %s !important ; + font-size : %size% !important ; + max-width : %width% !important ; + text-width : %align% !important ; + hyphens : %hyphens% !important ; } ]] local styletemplate = [[ -%s[detail='%s'] { - font-style : %s ; - font-variant : %s ; - font-weight : %s ; - font-family : %s ; - color : %s ; +%element%[detail="%detail%"], context|div.%element%.%detail% { + display : inline ; + font-style : %style% ; + font-variant : %variant% ; + font-weight : %weight% ; + font-family : %family% ; + color : %color% ; }]] -local function allusedstyles(xmlfile) - local result = { format("/* styles for file %s */",xmlfile) } - -- - local bodyfont = finetuning.bodyfont - local width = finetuning.width - local hyphen = finetuning.hyphen - local align = finetuning.align - -- - if not bodyfont or bodyfont == "" then - bodyfont = "12pt" - elseif type(bodyfont) == "number" then - bodyfont = number.todimen(bodyfont,"pt","%ipt") or "12pt" - end - if not width or width == "" then - width = "50em" - elseif type(width) == "number" then - width = number.todimen(width,"pt","%ipt") or "50em" - end - if hyphen == variables.yes then - hyphen = "manual" - else - hyphen = "inherited" - end - if align then - align = numbertoallign[align] - end - if not align then - align = hyphens and "justify" or "inherited" + local numbertoallign = { + [0] = "justify", ["0"] = "justify", [v_normal ] = "justify", + [1] = "right", ["1"] = "right", [v_flushright] = "right", + [2] = "center", ["2"] = "center", [v_middle ] = "center", + [3] = "left", ["3"] = "left", [v_flushleft ] = "left", + } + + function wrapups.allusedstyles(basename) + local result = { replacetemplate(namespacetemplate, { + what = "styles", + filename = basename, + namespace = contextns, + }) } + -- + local bodyfont = finetuning.bodyfont + local width = finetuning.width + local hyphen = finetuning.hyphen + local align = finetuning.align + -- + if type(bodyfont) == "number" then + bodyfont = todimen(bodyfont) + else + bodyfont = "12pt" + end + if type(width) == "number" then + width = todimen(width) or "50em" + else + width = "50em" + end + if hyphen == v_yes then + hyphen = "manual" + else + hyphen = "inherited" + end + if align then + align = numbertoallign[align] + end + if not align then + align = hyphens and "justify" or "inherited" + end + -- + result[#result+1] = replacetemplate(documenttemplate,{ + size = bodyfont, + width = width, + align = align, + hyphens = hyphen + }) + -- + local colorspecification = xml.css.colorspecification + local fontspecification = xml.css.fontspecification + for element, details in sortedhash(usedstyles) do + for detail, data in sortedhash(details) do + local s = fontspecification(data.style) + local c = colorspecification(data.color) + detail = gsub(detail,"[^A-Za-z0-9]+","-") + result[#result+1] = replacetemplate(styletemplate,{ + element = element, + detail = detail, + style = s.style or "inherit", + variant = s.variant or "inherit", + weight = s.weight or "inherit", + family = s.family or "inherit", + color = c or "inherit", + }) + end + end + return concat(result,"\n\n") end - -- - result[#result+1] = format(documenttemplate,bodyfont,width,align,hyphen) - -- - local colorspecification = xml.css.colorspecification - local fontspecification = xml.css.fontspecification - for element, details in sortedhash(usedstyles) do - for detail, data in sortedhash(details) do - local s = fontspecification(data.style) - local c = colorspecification(data.color) - result[#result+1] = formatters[styletemplate](element,detail, - s.style or "inherit", - s.variant or "inherit", - s.weight or "inherit", - s.family or "inherit", - c or "inherit") - end - end - return concat(result,"\n\n") + end local usedimages = { } +do + local imagetemplate = [[ -%s[id="%s"] { +%element%[id="%id%"], context|div.%element%[id="%id%"] { display : block ; - background-image : url(%s) ; + background-image : url('%url%') ; background-size : 100%% auto ; background-repeat : no-repeat ; - width : %s ; - height : %s ; + width : %width% ; + height : %height% ; }]] -local function allusedimages(xmlfile) - local result = { format("/* images for file %s */",xmlfile) } - for element, details in sortedhash(usedimages) do - for detail, data in sortedhash(details) do - local name = data.name - if file.suffix(name) == "pdf" then - -- temp hack .. we will have a remapper - name = file.replacesuffix(name,"svg") - end - result[#result+1] = formatters[imagetemplate](element,detail,name,data.width,data.height) - end - end - return concat(result,"\n\n") -end + local f_svgname = formatters["%s.svg"] + local f_svgpage = formatters["%s-page-%s.svg"] + local collected = { } -local function uniqueusedimages() - local unique = { } - for element, details in next, usedimages do - for detail, data in next, details do - local name = data.name - if file.suffix(name) == "pdf" then - unique[file.replacesuffix(name,"svg")] = name + local function usedname(name,page) + if file.suffix(name) == "pdf" then + -- temp hack .. we will have a remapper + if page and page > 1 then + name = f_svgpage(file.nameonly(name),page) else - unique[name] = name + name = f_svgname(file.nameonly(name)) end end + local scheme = url.hasscheme(name) + if not scheme or scheme == "file" then + -- or can we just use the name ? + return file.join("../images",file.basename(url.filename(name))) + else + return name + end + end + + function wrapups.allusedimages(basename) + local result = { replacetemplate(namespacetemplate, { + what = "images", + filename = basename, + namespace = contextns, + }) } + for element, details in sortedhash(usedimages) do + for detail, data in sortedhash(details) do + local name = data.name + local page = tonumber(data.page) or 1 + local spec = { + element = element, + id = data.id, + name = name, + page = page, + url = usedname(name,page), + width = data.width, + height = data.height, + used = data.used, + } + result[#result+1] = replacetemplate(imagetemplate,spec) + collected[detail] = spec + end + end + return concat(result,"\n\n") + end + + function wrapups.uniqueusedimages() -- todo: combine these two + return collected end - return unique + end -- @@ -419,13 +508,14 @@ properties.vspace = { export = "break", nature = "display" } local function makebreaklist(list) nofbreaks = nofbreaks + 1 local t = { } - if list then + local l = list and list.taglist + if l then for i=1,#list do - t[i] = list[i] + t[i] = l[i] end end - t[#t+1] = "break-" .. nofbreaks -- maybe no number - return t + t[#t+1] = "break>" .. nofbreaks -- maybe no number or 0 + return { taglist = t } end local breakattributes = { @@ -436,7 +526,7 @@ local function makebreaknode(attributes) -- maybe no fulltag nofbreaks = nofbreaks + 1 return { tg = "break", - fulltag = "break-" .. nofbreaks, + fulltag = "break>" .. nofbreaks, n = nofbreaks, element = "break", nature = "display", @@ -447,1235 +537,1747 @@ local function makebreaknode(attributes) -- maybe no fulltag } end -local fields = { "title", "subtitle", "author", "keywords" } +local function ignorebreaks(di,element,n,fulltag) + local data = di.data + for i=1,#data do + local d = data[i] + if d.content == " " then + d.content = "" + end + end +end -local function checkdocument(root) - local data = root.data - if data then - for i=1,#data do - local di = data[i] - local tg = di.tg - if tg == "noexport" then - local ud = userdata[di.fulltag] - local comment = ud and ud.comment - if comment then - di.element = "comment" - di.data = { { content = comment } } - ud.comment = nil +local function ignorespaces(di,element,n,fulltag) + local data = di.data + for i=1,#data do + local d = data[i] + local c = d.content + if type(c) == "string" then + d.content = lpegmatch(p_stripper,c) + end + end +end + +do + + local fields = { "title", "subtitle", "author", "keywords" } + + local function checkdocument(root) + local data = root.data + if data then + for i=1,#data do + local di = data[i] + local tg = di.tg + if tg == "noexport" then + local s = specifications[di.fulltag] + local u = s and s.userdata + if u then + local comment = u.comment + if comment then + di.element = "comment" + di.data = { { content = comment } } + u.comment = nil + else + data[i] = false + end + else + data[i] = false + end + elseif di.content then + -- okay + elseif tg == "ignore" then + di.element = "" + checkdocument(di) else - data[i] = false - -- di.element = "" - -- di.data = nil + checkdocument(di) -- new, else no noexport handling end - elseif di.content then - -- okay - elseif tg == "ignore" then - di.element = "" - checkdocument(di) - else - checkdocument(di) -- new, else no noexport handling end end end -end -function extras.document(result,element,detail,n,fulltag,di) - result[#result+1] = format(" language=%q",languagenames[texgetcount("mainlanguagenumber")]) - if not less_state then - result[#result+1] = format(" file=%q",tex.jobname) - result[#result+1] = format(" date=%q",os.date()) - result[#result+1] = format(" context=%q",environment.version) - result[#result+1] = format(" version=%q",exportversion) - result[#result+1] = format(" xmlns:m=%q","http://www.w3.org/1998/Math/MathML") - local identity = interactions.general.getidentity() - for i=1,#fields do - local key = fields[i] - local value = identity[key] - if value and value ~= "" then - result[#result+1] = formatters[" %s=%q"](key,value) + function extras.document(di,element,n,fulltag) + setattribute(di,"language",languagenames[texgetcount("mainlanguagenumber")]) + if not less_state then + setattribute(di,"file",tex.jobname) + setattribute(di,"date",os.date()) + setattribute(di,"context",environment.version) + setattribute(di,"version",exportversion) + setattribute(di,"xmlns:m",mathmlns) + local identity = interactions.general.getidentity() + for i=1,#fields do + local key = fields[i] + local value = identity[key] + if value and value ~= "" then + setattribute(di,key,value) + end end end + checkdocument(di) end - checkdocument(di) + end -local itemgroups = { } +do -function structurestags.setitemgroup(current,packed,symbol) - itemgroups[detailedtag("itemgroup",current)] = { - packed = packed, - symbol = symbol, - } -end + local itemgroups = { } + + function structurestags.setitemgroup(packed,level,symbol) + itemgroups[locatedtag("itemgroup")] = { + packed = packed, + symbol = symbol, + level = level, + } + end + + function structurestags.setitem(kind) + itemgroups[locatedtag("item")] = { + kind = kind, + } + end -function extras.itemgroup(result,element,detail,n,fulltag,di) - local hash = itemgroups[fulltag] - if hash then - local v = hash.packed - if v then - result[#result+1] = " packed='yes'" + function extras.itemgroup(di,element,n,fulltag) + local hash = itemgroups[fulltag] + if hash then + setattribute(di,"packed",hash.packed and "yes" or nil) + setattribute(di,"symbol",hash.symbol) + setattribute(di,"level",hash.level) end - local v = hash.symbol - if v then - result[#result+1] = attribute("symbol",v) + end + + function extras.item(di,element,n,fulltag) + local hash = itemgroups[fulltag] + if hash then + local kind = hash.kind + if kind and kind ~= "" then + setattribute(di,"kind",kind) + end end end + end -local synonyms = { } +do -function structurestags.setsynonym(current,tag) - synonyms[detailedtag("synonym",current)] = tag -end + local synonyms = { } + local sortings = { } -function extras.synonym(result,element,detail,n,fulltag,di) - local tag = synonyms[fulltag] - if tag then - result[#result+1] = formatters[" tag='%s'"](tag) + function structurestags.setsynonym(tag) + synonyms[locatedtag("synonym")] = tag end -end -local sortings = { } + function extras.synonym(di,element,n,fulltag) + local tag = synonyms[fulltag] + if tag then + setattribute(di,"tag",tag) + end + end -function structurestags.setsorting(current,tag) - sortings[detailedtag("sorting",current)] = tag -end + function structurestags.setsorting(tag) + sortings[locatedtag("sorting")] = tag + end -function extras.sorting(result,element,detail,n,fulltag,di) - local tag = sortings[fulltag] - if tag then - result[#result+1] = formatters[" tag='%s'"](tag) + function extras.sorting(di,element,n,fulltag) + local tag = sortings[fulltag] + if tag then + setattribute(di,"tag",tag) + end end + end -usedstyles.highlight = { } +do -function structurestags.sethighlight(current,style,color) -- we assume global styles - usedstyles.highlight[current] = { - style = style, -- xml.css.fontspecification(style), - color = color, -- xml.css.colorspec(color), - } -end + local highlight = { } + usedstyles.highlight = highlight -local descriptions = { } -local symbols = { } -local linked = { } + local strippedtag = structurestags.strip -- we assume global styles -function structurestags.setdescription(tag,n) - local nd = structures.notes.get(tag,n) -- todo: use listdata instead - if nd then - local references = nd.references - descriptions[references and references.internal] = detailedtag("description",tag) + function structurestags.sethighlight(style,color) + highlight[strippedtag(locatedtag("highlight"))] = { + style = style, -- xml.css.fontspecification(style), + color = color, -- xml.css.colorspec(color), + } end + end -function structurestags.setdescriptionsymbol(tag,n) - local nd = structures.notes.get(tag,n) -- todo: use listdata instead - if nd then - local references = nd.references - symbols[references and references.internal] = detailedtag("descriptionsymbol",tag) +do + + -- is this referencing still needed? + + local descriptions = { } + local symbols = { } + local linked = { } + + function structurestags.setdescription(tag,n) -- needs checking (is tag needed) + -- we can also use the internals hash or list + local nd = structures.notes.get(tag,n) + if nd then + local references = nd.references + descriptions[references and references.internal] = locatedtag("description") + end end -end -function finalizers.descriptions(tree) - local n = 0 - for id, tag in next, descriptions do - local sym = symbols[id] - if sym then - n = n + 1 - linked[tag] = n - linked[sym] = n + function structurestags.setdescriptionsymbol(tag,n) -- needs checking (is tag needed) + local nd = structures.notes.get(tag,n) -- todo: use listdata instead + if nd then + local references = nd.references + symbols[references and references.internal] = locatedtag("descriptionsymbol") end end -end -function extras.description(result,element,detail,n,fulltag,di) - local id = linked[fulltag] - if id then - result[#result+1] = formatters[" insert='%s'"](id) -- maybe just fulltag + function finalizers.descriptions(tree) + local n = 0 + for id, tag in next, descriptions do + local sym = symbols[id] + if sym then + n = n + 1 + linked[tag] = n + linked[sym] = n + end + end end -end -function extras.descriptionsymbol(result,element,detail,n,fulltag,di) - local id = linked[fulltag] - if id then - result[#result+1] = formatters[" insert='%s'"](id) + function extras.description(di,element,n,fulltag) + local id = linked[fulltag] + if id then + setattribute(di,"insert",id) + end end -end -usedimages.image = { } + function extras.descriptionsymbol(di,element,n,fulltag) + local id = linked[fulltag] + if id then + setattribute(di,"insert",id) + end + end -function structurestags.setfigure(name,page,width,height) - usedimages.image[detailedtag("image")] = { - name = name, - page = page, - width = number.todimen(width, "cm","%0.3Fcm"), - height = number.todimen(height,"cm","%0.3Fcm"), - } end -function extras.image(result,element,detail,n,fulltag,di) - local data = usedimages.image[fulltag] - if data then - result[#result+1] = attribute("name",data.name) - if tonumber(data.page) > 1 then - result[#result+1] = formatters[" page='%s'"](data.page) +-- -- todo: ignore breaks +-- +-- function extras.verbatimline(di,element,n,fulltag) +-- inspect(di) +-- end + +do + + local image = { } + usedimages.image = image + + function structurestags.setfigure(name,used,page,width,height) + local fulltag = locatedtag("image") + local spec = specifications[fulltag] + local page = tonumber(page) + image[fulltag] = { + id = f_id(spec.tagname,spec.tagindex), + name = name, + used = used, + page = page and page > 1 and page or nil, + width = todimen(width, "cm","%0.3F%s"), + height = todimen(height,"cm","%0.3F%s"), + } + end + + function extras.image(di,element,n,fulltag) + local data = image[fulltag] + if data then + setattribute(di,"name",data.name) + setattribute(di,"page",data.page) + setattribute(di,"id",data.id) + setattribute(di,"width",data.width) + setattribute(di,"height",data.height) end - result[#result+1] = formatters[" id='%s' width='%s' height='%s'"](fulltag,data.width,data.height) end + end -local combinations = { } +do -function structurestags.setcombination(nx,ny) - combinations[detailedtag("combination")] = { - nx = nx, - ny = ny, - } -end + local combinations = { } + + function structurestags.setcombination(nx,ny) + combinations[locatedtag("combination")] = { + nx = nx, + ny = ny, + } + end -function extras.combination(result,element,detail,n,fulltag,di) - local data = combinations[fulltag] - if data then - result[#result+1] = formatters[" nx='%s' ny='%s'"](data.nx,data.ny) + function extras.combination(di,element,n,fulltag) + local data = combinations[fulltag] + if data then + setattribute(di,"nx",data.nx) + setattribute(di,"ny",data.ny) + end end + end -- quite some code deals with exporting references -- +-- links: +-- +-- url : +-- file : +-- internal : automatic location +-- location : named reference + +-- references: +-- +-- implicit : automatic reference +-- explicit : named reference + local evaluators = { } local specials = { } +local explicits = { } -evaluators.inner = function(result,var) +evaluators.inner = function(di,var) local inner = var.inner if inner then - result[#result+1] = attribute("location",inner) + setattribute(di,"location",inner,true) end end -evaluators.outer = function(result,var) +evaluators.outer = function(di,var) local file, url = references.checkedfileorurl(var.outer,var.outer) if url then - result[#result+1] = attribute("url",url) + setattribute(di,"url",url,true) elseif file then - result[#result+1] = attribute("file",file) + setattribute(di,"file",file,true) end end -evaluators["outer with inner"] = function(result,var) +evaluators["outer with inner"] = function(di,var) local file = references.checkedfile(var.f) if file then - result[#result+1] = attribute("file",file) + setattribute(di,"file",file,true) end local inner = var.inner if inner then - result[#result+1] = attribute("location",inner) + setattribute(di,"inner",inner,true) end end -evaluators.special = function(result,var) +evaluators.special = function(di,var) local handler = specials[var.special] if handler then - handler(result,var) + handler(di,var) end end -evaluators["special outer with operation"] = evaluators.special -evaluators["special operation"] = evaluators.special -evaluators["special operation with arguments"] = evaluators.special +local referencehash = { } -function specials.url(result,var) - local url = references.checkedurl(var.operation) - if url then - result[#result+1] = attribute("url",url) - end -end +do -function specials.file(result,var) - local file = references.checkedfile(var.operation) - if file then - result[#result+1] = attribute("file",file) + evaluators["special outer with operation"] = evaluators.special + evaluators["special operation"] = evaluators.special + evaluators["special operation with arguments"] = evaluators.special + + function specials.url(di,var) + local url = references.checkedurl(var.operation) + if url and url ~= "" then + setattribute(di,"url",url,true) + end end -end -function specials.fileorurl(result,var) - local file, url = references.checkedfileorurl(var.operation,var.operation) - if url then - result[#result+1] = attribute("url",url) - elseif file then - result[#result+1] = attribute("file",file) + function specials.file(di,var) + local file = references.checkedfile(var.operation) + if file and file ~= "" then + setattribute(di,"file",file,true) + end end -end -function specials.internal(result,var) - local internal = references.checkedurl(var.operation) - if internal then - result[#result+1] = formatters[" location='aut:%s'"](internal) + function specials.fileorurl(di,var) + local file, url = references.checkedfileorurl(var.operation,var.operation) + if url and url ~= "" then + setattribute(di,"url",url,true) + elseif file and file ~= "" then + setattribute(di,"file",file,true) + end end -end -local referencehash = { } + function specials.internal(di,var) + local internal = references.checkedurl(var.operation) + if internal then + setattribute(di,"location",internal) + end + end -local function adddestination(result,references) -- todo: specials -> exporters and then concat - if references then - local reference = references.reference - if reference and reference ~= "" then - local prefix = references.prefix - if prefix and prefix ~= "" then - result[#result+1] = formatters[" prefix='%s'"](prefix) - end - result[#result+1] = formatters[" destination='%s'"](reference) - for i=1,#references do - local r = references[i] - local e = evaluators[r.kind] - if e then - e(result,r) + local function adddestination(di,references) -- todo: specials -> exporters and then concat + if references then + local reference = references.reference + if reference and reference ~= "" then + local prefix = references.prefix + if prefix and prefix ~= "" then + setattribute(di,"prefix",prefix,true) + end + setattribute(di,"destination",reference,true) + for i=1,#references do + local r = references[i] + local e = evaluators[r.kind] + if e then + e(di,r) + end end end end end -end -local function addreference(result,references) - if references then - local reference = references.reference - if reference and reference ~= "" then - local prefix = references.prefix - if prefix and prefix ~= "" then - result[#result+1] = formatters[" prefix='%s'"](prefix) + function extras.addimplicit(di,references) + if references then + local internal = references.internal + if internal then + setattribute(di,"implicit",internal) end - result[#result+1] = formatters[" reference='%s'"](reference) end - local internal = references.internal - if internal and internal ~= "" then - result[#result+1] = formatters[" location='aut:%s'"](internal) + end + + function extras.addinternal(di,references) + if references then + local internal = references.internal + if internal then + setattribute(di,"internal",internal) + end end end -end -function extras.link(result,element,detail,n,fulltag,di) - -- for instance in lists a link has nested elements and no own text - local reference = referencehash[fulltag] - if reference then - adddestination(result,structures.references.get(reference)) - return true - else - local data = di.data - if data then - for i=1,#data do - local di = data[i] - if di then - local fulltag = di.fulltag - if fulltag and extras.link(result,element,detail,n,fulltag,di) then - return true + local p_firstpart = lpeg.Cs((1-lpeg.P(","))^0) + + local function addreference(di,references) + if references then + local reference = references.reference + if reference and reference ~= "" then + local prefix = references.prefix + if prefix and prefix ~= "" then + setattribute(di,"prefix",prefix) + end + setattribute(di,"reference",reference,true) + setattribute(di,"explicit",lpegmatch(p_firstpart,reference),true) + end + local internal = references.internal + if internal and internal ~= "" then + setattribute(di,"implicit",internal) + end + end + end + + local function link(di,element,n,fulltag) + -- for instance in lists a link has nested elements and no own text + local reference = referencehash[fulltag] + if reference then + adddestination(di,structures.references.get(reference)) + return true + else + local data = di.data + if data then + for i=1,#data do + local di = data[i] + if di then + local fulltag = di.fulltag + if fulltag and link(di,element,n,fulltag) then + return true + end end end end end end + + extras.adddestination = adddestination + extras.addreference = addreference + + extras.link = link + end -- no settings, as these are obscure ones -local automathrows = true directives.register("backend.export.math.autorows", function(v) automathrows = v end) -local automathapply = true directives.register("backend.export.math.autoapply", function(v) automathapply = v end) -local automathnumber = true directives.register("backend.export.math.autonumber", function(v) automathnumber = v end) -local automathstrip = true directives.register("backend.export.math.autostrip", function(v) automathstrip = v end) - -local functions = mathematics.categories.functions - -local function collapse(di,i,data,ndata,detail,element) - local collapsing = di.data - if data then - di.element = element - di.detail = nil - i = i + 1 - while i <= ndata do - local dn = data[i] - if dn.detail == detail then - collapsing[#collapsing+1] = dn.data[1] - dn.skip = "ignore" - i = i + 1 - else - break +do + + local automathrows = true directives.register("backend.export.math.autorows", function(v) automathrows = v end) + local automathapply = true directives.register("backend.export.math.autoapply", function(v) automathapply = v end) + local automathnumber = true directives.register("backend.export.math.autonumber", function(v) automathnumber = v end) + local automathstrip = true directives.register("backend.export.math.autostrip", function(v) automathstrip = v end) + + local functions = mathematics.categories.functions + + local function collapse(di,i,data,ndata,detail,element) + local collapsing = di.data + if data then + di.element = element + di.detail = nil + i = i + 1 + while i <= ndata do + local dn = data[i] + if dn.detail == detail then + collapsing[#collapsing+1] = dn.data[1] + dn.skip = "ignore" + i = i + 1 + else + break + end end end + return i end - return i -end -local function collapse_mn(di,i,data,ndata) - local collapsing = di.data - if data then - i = i + 1 - while i <= ndata do - local dn = data[i] - local tg = dn.tg - if tg == "mn" then - collapsing[#collapsing+1] = dn.data[1] - dn.skip = "ignore" - i = i + 1 - elseif tg == "mo" then - local d = dn.data[1] - if d == "." then - collapsing[#collapsing+1] = d + local function collapse_mn(di,i,data,ndata) + -- this is tricky ... we need to make sure that we wrap in mrows if we want + -- to bypass this one + local collapsing = di.data + if data then + i = i + 1 + while i <= ndata do + local dn = data[i] + local tg = dn.tg + if tg == "mn" then + collapsing[#collapsing+1] = dn.data[1] dn.skip = "ignore" i = i + 1 + elseif tg == "mo" then + local d = dn.data[1] + if d == "." then + collapsing[#collapsing+1] = d + dn.skip = "ignore" + i = i + 1 + else + break + end else break end - else - break end end + return i end - return i -end --- maybe delay __i__ till we need it + -- maybe delay __i__ till we need it -local apply_function = { - { - element = "mo", - -- comment = "apply function", - -- data = { utfchar(0x2061) }, - data = { "⁡" }, - nature = "mixed", + local apply_function = { + { + element = "mo", + -- comment = "apply function", + -- data = { utfchar(0x2061) }, + data = { "⁡" }, + nature = "mixed", + } } -} -local functioncontent = { } + local functioncontent = { } -setmetatableindex(functioncontent,function(t,k) - local v = { { content = k } } - t[k] = v - return v -end) + setmetatableindex(functioncontent,function(t,k) + local v = { { content = k } } + t[k] = v + return v + end) + + local dummy_nucleus = { + element = "mtext", + data = { content = "" }, + nature = "inline", + comment = "dummy nucleus", + fulltag = "mtext>0" + } -local function checkmath(root) -- we can provide utf.toentities as an option - local data = root.data - if data then - local ndata = #data - local roottg = root.tg - if roottg == "msubsup" then - local nucleus, superscript, subscript - for i=1,ndata do - local di = data[i] - if not di then - -- weird - elseif di.content then - -- text - elseif not nucleus then - nucleus = i - elseif not superscript then - superscript = i - elseif not subscript then - subscript = i - else - -- error - end + local function accentchar(d) + for i=1,3 do + d = d.data + if not d then + return end - if superscript and subscript then - local sup, sub = data[superscript], data[subscript] - data[superscript], data[subscript] = sub, sup - -- sub.__o__, sup.__o__ = subscript, superscript - sub.__i__, sup.__i__ = superscript, subscript - end - elseif roottg == "mfenced" then - local new, n = { }, 0 - local attributes = { } - root.attributes = attributes - for i=1,ndata do - local di = data[i] - if not di then - -- weird - elseif di.content then - n = n + 1 - new[n] = di - else - local tg = di.tg - if tg == "mleft" then - attributes.left = tostring(di.data[1].data[1].content) - elseif tg == "mmiddle" then - attributes.middle = tostring(di.data[1].data[1].content) - elseif tg == "mright" then - attributes.right = tostring(di.data[1].data[1].content) - else - n = n + 1 - di.__i__ = n - new[n] = di - end + d = d[1] + if not d then + return + end + local tg = d.tg + if tg == "mover" then + local s = specifications[d.fulltag] + local t = s.top + if t then + d = d.data[1] + local d1 = d.data[1] + d1.content = utfchar(t) + d.data = { d1 } + return d + end + elseif tg == "munder" then + local s = specifications[d.fulltag] + local b = s.bottom + if b then + d = d.data[1] + local d1 = d.data[1] + d1.content = utfchar(b) + d.data = { d1 } + return d end end - root.data = new - ndata = n end - if ndata == 0 then - return - elseif ndata == 1 then - local d = data[1] - if not d then - return - elseif d.content then - return - elseif #root.data == 1 then - local tg = d.tg - if automathrows and roottg == "mrow" then - -- maybe just always ! check spec first - if tg == "mrow" or tg == "mfenced" or tg == "mfrac" or tg == "mroot" or tg == "msqrt"then - root.skip = "comment" - elseif tg == "mo" then - root.skip = "comment" + end + + local no_mrow = { + mrow = true, + mfenced = true, + mfrac = true, + mroot = true, + msqrt = true, + mi = true, + mo = true, + mn = true, + } + + local function checkmath(root) -- we can provide utf.toentities as an option + local data = root.data + if data then + local ndata = #data + local roottg = root.tg + if roottg == "msubsup" then + local nucleus, superscript, subscript + for i=1,ndata do + local di = data[i] + if not di then + -- weird + elseif di.content then + -- text + elseif not nucleus then + nucleus = i + elseif not superscript then + superscript = i + elseif not subscript then + subscript = i + else + -- error end - elseif roottg == "mo" then - if tg == "mo" then - root.skip = "comment" + end + if superscript and subscript then + local sup, sub = data[superscript], data[subscript] + data[superscript], data[subscript] = sub, sup + -- sub.__o__, sup.__o__ = subscript, superscript + sub.__i__, sup.__i__ = superscript, subscript + end +-- elseif roottg == "msup" or roottg == "msub" then +-- -- m$^2$ +-- if ndata == 1 then +-- local d = data[1] +-- data[2] = d +-- d.__i__ = 2 +-- data[1] = dummy_nucleus +-- end + elseif roottg == "mfenced" then + local s = specifications[root.fulltag] + local l, m, r = s.left, s.middle, s.right + if l then + l = utfchar(l) + end + if m then + local t = { } + for i=1,#m do + t[i] = utfchar(m[i]) end + m = concat(t) end + if r then + r = utfchar(r) + end + root.attributes = { + open = l, + separators = m, + close = r, + } end - end - local i = 1 - while i <= ndata do -- -- -- TOO MUCH NESTED CHECKING -- -- -- - local di = data[i] - if di and not di.content then - local tg = di.tg - local detail = di.detail - if tg == "math" then - -- di.element = "mrow" -- when properties - di.skip = "comment" - checkmath(di) - i = i + 1 - elseif tg == "mover" or tg == "munder" or tg == "munderover" then - if detail == "accent" then - di.attributes = { accent = "true" } - di.detail = nil - end - checkmath(di) - i = i + 1 - elseif tg == "mroot" then - if #di.data == 1 then - -- else firefox complains - di.element = "msqrt" + if ndata == 0 then + return + elseif ndata == 1 then + local d = data[1] + if not d then + return + elseif d.content then + return + elseif #root.data == 1 then + local tg = d.tg + if automathrows and roottg == "mrow" then + -- maybe just always ! check spec first + if no_mrow[tg] then + root.skip = "comment" + end + elseif roottg == "mo" then + if tg == "mo" then + root.skip = "comment" + end end - checkmath(di) - i = i + 1 - elseif tg == "break" then - di.skip = "comment" - i = i + 1 - elseif tg == "mrow" and detail then - di.detail = nil - checkmath(di) - di = { - element = "maction", - nature = "display", - attributes = { actiontype = detail }, - data = { di }, - n = 0, - } - data[i] = di - i = i + 1 - elseif detail then - -- no checkmath(di) here - local category = tonumber(detail) or 0 - if category == 1 then -- mo - i = collapse(di,i,data,ndata,detail,"mo") - elseif category == 2 then -- mi - i = collapse(di,i,data,ndata,detail,"mi") - elseif category == 3 then -- mn - i = collapse(di,i,data,ndata,detail,"mn") - elseif category == 4 then -- ms - i = collapse(di,i,data,ndata,detail,"ms") - elseif category >= 1000 then - local apply = category >= 2000 - if apply then - category = category - 1000 + end + end + local i = 1 + while i <= ndata do -- -- -- TOO MUCH NESTED CHECKING -- -- -- + local di = data[i] + if di and not di.content then + local tg = di.tg + if tg == "math" then + -- di.element = "mrow" -- when properties + di.skip = "comment" + checkmath(di) + i = i + 1 + elseif tg == "mover" then + local s = specifications[di.fulltag] + if s.accent then + local t = s.top + local d = di.data + -- todo: accent = "false" (for scripts like limits) + di.attributes = { + accent = "true", + } + -- todo: p.topfixed + if t then + -- mover + d[1].data[1].content = utfchar(t) + di.data = { d[2], d[1] } + end + else + -- can't happen end - if tg == "mi" then -- function - if roottg == "mrow" then - root.skip = "comment" - root.element = "function" + checkmath(di) + i = i + 1 + elseif tg == "munder" then + local s = specifications[di.fulltag] + if s.accent then + local b = s.bottom + local d = di.data + -- todo: accent = "false" (for scripts like limits) + di.attributes = { + accent = "true", + } + -- todo: p.bottomfixed + if b then + -- munder + d[2].data[1].content = utfchar(b) end - i = collapse(di,i,data,ndata,detail,"mi") - local tag = functions[category] - if tag then - di.data = functioncontent[tag] + else + -- can't happen + end + checkmath(di) + i = i + 1 + elseif tg == "munderover" then + local s = specifications[di.fulltag] + if s.accent then + local t = s.top + local b = s.bottom + local d = di.data + -- todo: accent = "false" (for scripts like limits) + -- todo: accentunder = "false" (for scripts like limits) + di.attributes = { + accent = "true", + accentunder = "true", + } + -- todo: p.topfixed + -- todo: p.bottomfixed + if t and b then + -- munderover + d[1].data[1].content = utfchar(t) + d[3].data[1].content = utfchar(b) + di.data = { d[2], d[3], d[1] } + else + -- can't happen end - if apply then - di.after = apply_function - elseif automathapply then -- make function - local following - if i <= ndata then - -- normally not the case - following = data[i] + else + -- can't happen + end + checkmath(di) + i = i + 1 + elseif tg == "mstacker" then + local d = di.data + local d1 = d[1] + local d2 = d[2] + local d3 = d[3] + local t1 = d1 and d1.tg + local t2 = d2 and d2.tg + local t3 = d3 and d3.tg + local m = nil -- d1.data[1] + local t = nil + local b = nil + -- only accent when top / bot have stretch + -- normally we flush [base under over] which is better for tagged pdf + if t1 == "mstackermid" then + m = accentchar(d1) -- or m + if t2 == "mstackertop" then + if t3 == "mstackerbot" then + t = accentchar(d2) + b = accentchar(d3) + di.element = "munderover" + di.data = { m or d1.data[1], b or d3.data[1], t or d2.data[1] } else - local parent = di.__p__ -- == root - if parent.tg == "mrow" then - parent = parent.__p__ - end - local index = parent.__i__ - following = parent.data[index+1] + t = accentchar(d2) + di.element = "mover" + di.data = { m or d1.data[1], t or d2.data[1] } end - if following then - local tg = following.tg - if tg == "mrow" or tg == "mfenced" then -- we need to figure out the right condition + elseif t2 == "mstackerbot" then + if t3 == "mstackertop" then + b = accentchar(d2) + t = accentchar(d3) + di.element = "munderover" + di.data = { m or d1.data[1], t or d3.data[1], m, b or d2.data[1] } + else + b = accentchar(d2) + di.element = "munder" + di.data = { m or d1.data[1], b or d2.data[1] } + end + else + -- can't happen + end + else + -- can't happen + end + if t or b then + di.attributes = { + accent = t and "true" or nil, + accentunder = b and "true" or nil, + } + di.detail = nil + end + checkmath(di) + i = i + 1 + elseif tg == "mroot" then + local data = di.data + local size = #data + if size == 1 then + -- else firefox complains ... code in math-tag (for pdf tagging) + di.element = "msqrt" + elseif size == 2 then + data[1], data[2] = data[2], data[1] + end + checkmath(di) + i = i + 1 + elseif tg == "break" then + di.skip = "comment" + i = i + 1 + elseif tg == "mtext" then + -- this is only needed for unboxed mtexts ... all kind of special + -- tex border cases and optimizations ... trial and error + local data = di.data + if #data > 1 then + for i=1,#data do + local di = data[i] + local content = di.content + if content then + data[i] = { + element = "mtext", + nature = "inline", + data = { di }, + n = 0, + } + elseif di.tg == "math" then + local di = di.data[1] + data[i] = di + checkmath(di) + end + end + di.element = "mrow" + -- di.tg = "mrow" + -- di.nature = "inline" + end + checkmath(di) + i = i + 1 + elseif tg == "mrow" and detail then -- hm, falls through + di.detail = nil + checkmath(di) + di = { + element = "maction", + nature = "display", + attributes = { actiontype = detail }, + data = { di }, + n = 0, + } + data[i] = di + i = i + 1 + else + local category = di.mathcategory + if category then + -- no checkmath(di) here + if category == 1 then -- mo + i = collapse(di,i,data,ndata,detail,"mo") + elseif category == 2 then -- mi + i = collapse(di,i,data,ndata,detail,"mi") + elseif category == 3 then -- mn + i = collapse(di,i,data,ndata,detail,"mn") + elseif category == 4 then -- ms + i = collapse(di,i,data,ndata,detail,"ms") + elseif category >= 1000 then + local apply = category >= 2000 + if apply then + category = category - 1000 + end + if tg == "mi" then -- function + if roottg == "mrow" then + root.skip = "comment" + root.element = "function" + end + i = collapse(di,i,data,ndata,detail,"mi") + local tag = functions[category] + if tag then + di.data = functioncontent[tag] + end + if apply then di.after = apply_function + elseif automathapply then -- make function + local following + if i <= ndata then + -- normally not the case + following = data[i] + else + local parent = di.__p__ -- == root + if parent.tg == "mrow" then + parent = parent.__p__ + end + local index = parent.__i__ + following = parent.data[index+1] + end + if following then + local tg = following.tg + if tg == "mrow" or tg == "mfenced" then -- we need to figure out the right condition + di.after = apply_function + end + end end + else -- some problem + checkmath(di) + i = i + 1 end + else + checkmath(di) + i = i + 1 end - else -- some problem + elseif automathnumber and tg == "mn" then + checkmath(di) + i = collapse_mn(di,i,data,ndata) + else checkmath(di) i = i + 1 end - else - checkmath(di) - i = i + 1 end - elseif automathnumber and tg == "mn" then - checkmath(di) - i = collapse_mn(di,i,data,ndata) - else - checkmath(di) + else -- can be string or boolean + if parenttg ~= "mtext" and di == " " then + data[i] = false + end i = i + 1 end - else -- can be string or boolean - if parenttg ~= "mtext" and di == " " then - data[i] = false - end - i = i + 1 end end end -end -function stripmath(di) - if not di then - -- - elseif di.content then - return di - else - local tg = di.tg - if tg == "mtext" or tg == "ms" then + local function stripmath(di) + if not di then + -- + elseif di.content then return di else - local data = di.data - local ndata = #data - local n = 0 - for i=1,ndata do - local di = data[i] - if di and not di.content then - di = stripmath(di) - end - if di then - local content = di.content - if not content then - n = n + 1 - di.__i__ = n - data[n] = di - elseif content == " " or content == "" then - -- skip - else - n = n + 1 - data[n] = di + local tg = di.tg + if tg == "mtext" or tg == "ms" then + return di + else + local data = di.data + local ndata = #data + local n = 0 + for i=1,ndata do + local d = data[i] + if d and not d.content then + d = stripmath(d) + end + if d then + local content = d.content + if not content then + n = n + 1 + d.__i__ = n + data[n] = d + elseif content == " " or content == "" then + if di.tg == "mspace" then + -- we append or prepend a space to a preceding or following mtext + local parent = di.__p__ + local index = di.__i__ -- == i + local data = parent.data + if index > 1 then + local d = data[index-1] + if d.tg == "mtext" then + local dd = d.data + local dn = dd[#dd] + local dc = dn.content + if dc then + dn.content = dc .. content + end + end + elseif index < ndata then + local d = data[index+1] + if d.tg == "mtext" then + local dd = d.data + local dn = dd[1] + local dc = dn.content + if dc then + dn.content = content .. dc + end + end + end + end + else + n = n + 1 + data[n] = d + end end end + for i=ndata,n+1,-1 do + data[i] = nil + end + if #data > 0 then + return di + end +-- end end - for i=ndata,n+1,-1 do - data[i] = nil - end - if #data > 0 then - return di - end + -- could be integrated but is messy then +-- while roottg == "mrow" and #data == 1 do +-- data = data[1] +-- for k, v in next, data do +-- root[k] = v +-- end +-- roottg = data.tg +-- end + end + end + + function checks.math(di) + local specification = specifications[di.fulltag] + local mode = specification and specification.mode == "display" and "block" or "inline" + di.attributes = { + ["display"] = mode, + ["xmlns:m"] = mathmlns, + } + -- can be option if needed: + if mode == "inline" then + -- di.nature = "mixed" -- else spacing problem (maybe inline) + di.nature = "inline" -- we need to catch x$X$x and x $X$ x + else + di.nature = "display" end + if automathstrip then + stripmath(di) + end + checkmath(di) end -end - -function checks.math(di) - local hash = attributehash[di.fulltag] - local mode = (hash and hash.mode) == "display" and "block" or "inline" - di.attributes = { - display = mode - } - -- can be option if needed: - if mode == "inline" then - di.nature = "mixed" -- else spacing problem (maybe inline) - else - di.nature = "display" - end - if automathstrip then - stripmath(di) - end - checkmath(di) -end -local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A + local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A -function extras.mi(result,element,detail,n,fulltag,di) -- check with content - local str = di.data[1].content - if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste) - for v in utfvalues(str) do - if (v >= a and v <= z) or (v >= A and v <= Z) then - local a = di.attributes - if a then - a.mathvariant = "normal" - else - di.attributes = { mathvariant = "normal" } + function extras.mi(di,element,n,fulltag) -- check with content + local str = di.data[1].content + if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste) + for v in utfvalues(str) do + if (v >= a and v <= z) or (v >= A and v <= Z) then + local a = di.attributes + if a then + a.mathvariant = "normal" + else + di.attributes = { mathvariant = "normal" } + end end end end end -end -function extras.section(result,element,detail,n,fulltag,di) - local data = listdata[fulltag] - if data then - addreference(result,data.references) - return true - else + function extras.msub(di,element,n,fulltag) + -- m$^2$ local data = di.data - if data then - for i=1,#data do - local di = data[i] - if di then - local ft = di.fulltag - if ft and extras.section(result,element,detail,n,ft,di) then - return true - end - end - end + if #data == 1 then + local d = data[1] + data[2] = d + d.__i__ = 2 + data[1] = dummy_nucleus end end + + extras.msup = extras.msub + end -function extras.float(result,element,detail,n,fulltag,di) - local data = listdata[fulltag] - if data then - addreference(result,data.references) - return true - else - local data = di.data +do + + local registered = structures.sections.registered + + local function resolve(di,element,n,fulltag) + local data = listdata[fulltag] if data then - for i=1,#data do - local di = data[i] - if di and extras.section(result,element,detail,n,di.fulltag,di) then - return true + extras.addreference(di,data.references) + return true + else + local data = di.data + if data then + for i=1,#data do + local di = data[i] + if di then + local ft = di.fulltag + if ft and resolve(di,element,n,ft) then + return true + end + end end end end end -end - -local tabledata = { } -function structurestags.settablecell(rows,columns,align) - if align > 0 or rows > 1 or columns > 1 then - tabledata[detailedtag("tablecell")] = { - rows = rows, - columns = columns, - align = align, - } - end -end - -function extras.tablecell(result,element,detail,n,fulltag,di) - local hash = tabledata[fulltag] - if hash then - local v = hash.columns - if v and v > 1 then - result[#result+1] = formatters[" columns='%s'"](v) - end - local v = hash.rows - if v and v > 1 then - result[#result+1] = formatters[" rows='%s'"](v) - end - local v = hash.align - if not v or v == 0 then - -- normal - elseif v == 1 then -- use numbertoalign here - result[#result+1] = " align='flushright'" - elseif v == 2 then - result[#result+1] = " align='middle'" - elseif v == 3 then - result[#result+1] = " align='flushleft'" + function extras.section(di,element,n,fulltag) + local r = registered[specifications[fulltag].detail] + if r then + setattribute(di,"level",r.level) end + resolve(di,element,n,fulltag) end -end -local tabulatedata = { } + extras.float = resolve -function structurestags.settabulatecell(align) - if align > 0 then - tabulatedata[detailedtag("tabulatecell")] = { - align = align, - } + -- todo: internal is already hashed + + function structurestags.setlist(n) + local data = structures.lists.getresult(n) + if data then + referencehash[locatedtag("listitem")] = data + end end -end -local function hascontent(data) - for i=1,#data do - local di = data[i] - if not di then - -- - elseif di.content then + function extras.listitem(di,element,n,fulltag) + local data = referencehash[fulltag] + if data then + extras.addinternal(di,data.references) return true - else - local d = di.data - if d and #d > 0 and hascontent(d) then - return true - end end end + end -function extras.tabulate(result,element,detail,n,fulltag,di) - local data = di.data - for i=1,#data do - local di = data[i] - if di.tg == "tabulaterow" and not hascontent(di.data) then - di.element = "" -- or simply remove +do + + -- todo: internal is already hashed + + function structurestags.setregister(tag,n) -- check if tag is needed + local data = structures.registers.get(tag,n) + if data then + referencehash[locatedtag("registerlocation")] = data end end -end -function extras.tabulatecell(result,element,detail,n,fulltag,di) - local hash = tabulatedata[fulltag] - if hash then - local v = hash.align - if not v or v == 0 then - -- normal - elseif v == 1 then - result[#result+1] = " align='flushleft'" - elseif v == 2 then - result[#result+1] = " align='flushright'" - elseif v == 3 then - result[#result+1] = " align='middle'" + function extras.registerlocation(di,element,n,fulltag) + local data = referencehash[fulltag] + if data then + extras.addinternal(di,data.references) + return true end end -end --- flusher + extras.registerpages = ignorebreaks + extras.registerseparator = ignorespaces + +end -local linedone = false -- can go ... we strip newlines anyway -local inlinedepth = 0 +do --- todo: #result -> nofresult + local tabledata = { } -local function emptytag(result,element,nature,depth,di) -- currently only break but at some point - local a = di.attributes -- we might add detail etc - if a then -- happens seldom - if linedone then - result[#result+1] = formatters["%w<%s"](depth,namespaced[element]) - else - result[#result+1] = formatters["\n%w<%s"](depth,namespaced[element]) - end - for k, v in next, a do - result[#result+1] = formatters[" %s=%q"](k,v) - end - result[#result+1] = "/>\n" - else - if linedone then - result[#result+1] = formatters["%w<%s/>\n"](depth,namespaced[element]) - else - result[#result+1] = formatters["\n%w<%s/>\n"](depth,namespaced[element]) + local function hascontent(data) + for i=1,#data do + local di = data[i] + if not di then + -- + elseif di.content then + return true + else + local d = di.data + if d and #d > 0 and hascontent(d) then + return true + end + end end end - linedone = false -end -local function begintag(result,element,nature,depth,di,skip) - -- if needed we can use a local result with xresult - local detail = di.detail - local n = di.n - local fulltag = di.fulltag - local comment = di.comment - if nature == "inline" then - linedone = false - inlinedepth = inlinedepth + 1 - if show_comment and comment then - result[#result+1] = formatters[""](comment) - end - elseif nature == "mixed" then - if inlinedepth > 0 then - if show_comment and comment then - result[#result+1] = formatters[""](comment) - end - elseif linedone then - result[#result+1] = spaces[depth] - if show_comment and comment then - result[#result+1] = formatters[""](comment) - end - else - result[#result+1] = formatters["\n%w"](depth) - linedone = false - if show_comment and comment then - result[#result+1] = formatters["\n%w"](comment,depth) - end + function structurestags.settablecell(rows,columns,align) + if align > 0 or rows > 1 or columns > 1 then + tabledata[locatedtag("tablecell")] = { + rows = rows, + columns = columns, + align = align, + } end - inlinedepth = inlinedepth + 1 - else - if inlinedepth > 0 then - if show_comment and comment then - result[#result+1] = formatters[""](comment) + end + + function extras.tablecell(di,element,n,fulltag) + local hash = tabledata[fulltag] + if hash then + local columns = hash.columns + if columns and columns > 1 then + setattribute(di,"columns",columns) end - elseif linedone then - result[#result+1] = spaces[depth] - if show_comment and comment then - result[#result+1] = formatters[""](comment) + local rows = hash.rows + if rows and rows > 1 then + setattribute(di,"rows",rows) end - else - result[#result+1] = formatters["\n%w"](depth) -- can introduced extra line in mixed+mixed (filtered later on) - linedone = false - if show_comment and comment then - result[#result+1] = formatters["\n%w"](comment,depth) + local align = hash.align + if not align or align == 0 then + -- normal + elseif align == 1 then -- use numbertoalign here + setattribute(di,"align","flushright") + elseif align == 2 then + setattribute(di,"align","middle") + elseif align == 3 then + setattribute(di,"align","flushleft") end end end - if skip == "comment" then - if show_comment then - result[#result+1] = formatters[""](namespaced[element]) - end - elseif skip then - -- ignore - else - result[#result+1] = formatters["<%s"](namespaced[element]) - if detail then - result[#result+1] = formatters[" detail=%q"](detail) - end - if indexing and n then - result[#result+1] = formatters[" n=%q"](n) - end - local extra = extras[element] - if extra then - extra(result,element,detail,n,fulltag,di) + + local tabulatedata = { } + + function structurestags.settabulatecell(align) + if align > 0 then + tabulatedata[locatedtag("tabulatecell")] = { + align = align, + } end - local u = userdata[fulltag] - if u then - for k, v in next, u do - result[#result+1] = formatters[" %s=%q"](k,v) + end + + function extras.tabulate(di,element,n,fulltag) + local data = di.data + for i=1,#data do + local di = data[i] + if di.tg == "tabulaterow" and not hascontent(di.data) then + di.element = "" -- or simply remove end end - local a = di.attributes - if a then - for k, v in next, a do - result[#result+1] = formatters[" %s=%q"](k,v) + end + + function extras.tabulatecell(di,element,n,fulltag) + local hash = tabulatedata[fulltag] + if hash then + local align = hash.align + if not align or align == 0 then + -- normal + elseif align == 1 then + setattribute(di,"align","flushleft") + elseif align == 2 then + setattribute(di,"align","flushright") + elseif align == 3 then + setattribute(di,"align","middle") end end - result[#result+1] = ">" - end - if inlinedepth > 0 then - elseif nature == "display" then - result[#result+1] = "\n" - linedone = true end - used[element][detail or ""] = nature -- for template css - local metadata = tagmetadata[fulltag] - if metadata then - if not linedone then - result[#result+1] = "\n" - linedone = true - end - result[#result+1] = formatters["%w\n"](depth) - for k, v in table.sortedpairs(metadata) do - v = entityremapper(v) - result[#result+1] = formatters["%w%s\n"](depth+1,k,v) + +end + +-- flusher + +do + + local f_detail = formatters[' detail="%s"'] + local f_chain = formatters[' chain="%s"'] + local f_index = formatters[' n="%s"'] + local f_spacing = formatters['%s'] + + local f_empty_inline = formatters["<%s/>"] + local f_empty_mixed = formatters["%w<%s/>\n"] + local f_empty_display = formatters["\n%w<%s/>\n"] + local f_empty_inline_attr = formatters["<%s%s/>"] + local f_empty_mixed_attr = formatters["%w<%s%s/>"] + local f_empty_display_attr = formatters["\n%w<%s%s/>\n"] + + local f_begin_inline = formatters["<%s>"] + local f_begin_mixed = formatters["%w<%s>"] + local f_begin_display = formatters["\n%w<%s>\n"] + local f_begin_inline_attr = formatters["<%s%s>"] + local f_begin_mixed_attr = formatters["%w<%s%s>"] + local f_begin_display_attr = formatters["\n%w<%s%s>\n"] + + local f_end_inline = formatters[""] + local f_end_mixed = formatters["\n"] + local f_end_display = formatters["%w\n"] + + local f_begin_inline_comment = formatters["<%s>"] + local f_begin_mixed_comment = formatters["%w<%s>"] + local f_begin_display_comment = formatters["\n%w\n%w<%s>\n"] + local f_begin_inline_attr_comment = formatters["<%s%s>"] + local f_begin_mixed_attr_comment = formatters["%w<%s%s>"] + local f_begin_display_attr_comment = formatters["\n%w\n%w<%s%s>\n"] + + local f_comment_begin_inline = formatters[""] + local f_comment_begin_mixed = formatters["%w"] + local f_comment_begin_display = formatters["\n%w\n"] + + local f_comment_end_inline = formatters[""] + local f_comment_end_mixed = formatters["\n"] + local f_comment_end_display = formatters["%w\n"] + + local f_metadata_begin = formatters["\n%w\n"] + local f_metadata = formatters["%w%s\n"] + local f_metadata_end = formatters["%w\n"] + + --- we could share the r tables ... but it's fast enough anyway + + local function attributes(a) + local r = { } -- can be shared + local n = 0 + for k, v in next, a do + n = n + 1 + r[n] = f_attribute(k,v) -- lpegmatch(p_escaped,v) end - result[#result+1] = formatters["%w\n"](depth) + return concat(r,"",1,n) end -end -local function endtag(result,element,nature,depth,skip) - if nature == "display" then - if inlinedepth == 0 then - if not linedone then - result[#result+1] = "\n" - end - if skip == "comment" then - if show_comment then - result[#result+1] = formatters["%w\n"](depth,namespaced[element]) - end - elseif skip then - -- ignore + local depth = 0 + local inline = 0 + + local function bpar(result) + result[#result+1] = "\n

" + end + local function epar(result) + result[#result+1] = "

\n" + end + + local function emptytag(result,element,nature,di) -- currently only break but at some point + local a = di.attributes -- we might add detail etc + if a then -- happens seldom + if nature == "display" then + result[#result+1] = f_empty_display_attr(depth,namespaced[element],attributes(a)) + elseif nature == "mixed" then + result[#result+1] = f_empty_mixed_attr(depth,namespaced[element],attributes(a)) else - result[#result+1] = formatters["%w\n"](depth,namespaced[element]) + result[#result+1] = f_empty_inline_attr(namespaced[element],attributes(a)) end - linedone = true else - if skip == "comment" then - if show_comment then - result[#result+1] = formatters[""](namespaced[element]) - end - elseif skip then - -- ignore + if nature == "display" then + result[#result+1] = f_empty_display(depth,namespaced[element]) + elseif nature == "mixed" then + result[#result+1] = f_empty_mixed(depth,namespaced[element]) else - result[#result+1] = formatters[""](namespaced[element]) + result[#result+1] = f_empty_inline(namespaced[element]) end end - else - inlinedepth = inlinedepth - 1 + end + + local function begintag(result,element,nature,di,skip) + local index = di.n + local fulltag = di.fulltag + local specification = specifications[fulltag] or { } -- we can have a dummy + local comment = di.comment + local detail = specification.detail if skip == "comment" then if show_comment then - result[#result+1] = formatters[""](namespaced[element]) + if nature == "inline" or inline > 0 then + result[#result+1] = f_comment_begin_inline(namespaced[element]) + inline = inline + 1 + elseif nature == "mixed" then + result[#result+1] = f_comment_begin_mixed(depth,namespaced[element]) + depth = depth + 1 + inline = 1 + else + result[#result+1] = f_comment_begin_display(depth,namespaced[element]) + depth = depth + 1 + end end elseif skip then -- ignore else - result[#result+1] = formatters[""](namespaced[element]) - end - linedone = false - end -end - -local function flushtree(result,data,nature,depth) - depth = depth + 1 - local nofdata = #data - for i=1,nofdata do - local di = data[i] - if not di then -- hm, di can be string - -- whatever - elseif di.content then - -- already has breaks - local content = entityremapper(di.content) - if i == nofdata and sub(content,-1) == "\n" then -- move check - -- can be an end of line in par but can also be the last line - if trace_spacing then - result[#result+1] = formatters["%s"](di.parnumber or 0,sub(content,1,-2)) + local n = 0 + local r = { } -- delay this + if detail then + detail = gsub(detail,"[^A-Za-z0-9]+","-") + specification.detail = detail -- we use it later in for the div + n = n + 1 + r[n] = f_detail(detail) + end + local parents = specification.parents + if parents then + parents = gsub(parents,"[^A-Za-z0-9 ]+","-") + specification.parents = parents -- we use it later in for the div + n = n + 1 + r[n] = f_chain(parents) + end + if indexing and index then + n = n + 1 + r[n] = f_index(index) + end + local extra = extras[element] + if extra then + extra(di,element,index,fulltag) + end + if exportproperties then + local p = specification.userdata + if not p then + -- skip + elseif exportproperties == v_yes then + for k, v in next, p do + n = n + 1 + r[n] = f_attribute(k,v) + end else - result[#result+1] = sub(content,1,-2) + for k, v in next, p do + n = n + 1 + r[n] = f_property(exportproperties,k,v) + end end - result[#result+1] = " " - else - if trace_spacing then - result[#result+1] = formatters["%s"](di.parnumber or 0,content) - else - result[#result+1] = content + end + local a = di.attributes + if a then + for k, v in next, a do + n = n + 1 + r[n] = f_attribute(k,v) end end - linedone = false - elseif not di.collapsed then -- ignore collapsed data (is appended, reconstructed par) - local element = di.element - if not element then - -- skip - elseif element == "break" then -- or element == "pagebreak" - emptytag(result,element,nature,depth,di) - elseif element == "" or di.skip == "ignore" then - -- skip - else - if di.before then - flushtree(result,di.before,nature,depth) + if n == 0 then + if nature == "inline" or inline > 0 then + if show_comment and comment then + result[#result+1] = f_begin_inline_comment(comment,namespaced[element]) + else + result[#result+1] = f_begin_inline(namespaced[element]) + end + inline = inline + 1 + elseif nature == "mixed" then + if show_comment and comment then + result[#result+1] = f_begin_mixed_comment(depth,comment,namespaced[element]) + else + result[#result+1] = f_begin_mixed(depth,namespaced[element]) + end + depth = depth + 1 + inline = 1 + else + if show_comment and comment then + result[#result+1] = f_begin_display_comment(depth,comment,depth,namespaced[element]) + else + result[#result+1] = f_begin_display(depth,namespaced[element]) + end + depth = depth + 1 end - local natu = di.nature - local skip = di.skip - if di.breaknode then - emptytag(result,"break","display",depth,di) + else + r = concat(r,"",1,n) + if nature == "inline" or inline > 0 then + if show_comment and comment then + result[#result+1] = f_begin_inline_attr_comment(comment,namespaced[element],r) + else + result[#result+1] = f_begin_inline_attr(namespaced[element],r) + end + inline = inline + 1 + elseif nature == "mixed" then + if show_comment and comment then + result[#result+1] = f_begin_mixed_attr_comment(depth,comment,namespaced[element],r) + else + result[#result+1] = f_begin_mixed_attr(depth,namespaced[element],r) + end + depth = depth + 1 + inline = 1 + else + if show_comment and comment then + result[#result+1] = f_begin_display_attr_comment(depth,comment,depth,namespaced[element],r) + else + result[#result+1] = f_begin_display_attr(depth,namespaced[element],r) + end + depth = depth + 1 end - begintag(result,element,natu,depth,di,skip) - flushtree(result,di.data,natu,depth) - -- if sub(result[#result],-1) == " " and natu ~= "inline" then - -- result[#result] = sub(result[#result],1,-2) - -- end - endtag(result,element,natu,depth,skip) - if di.after then - flushtree(result,di.after,nature,depth) + end + end + used[element][detail or ""] = { nature, specification.parents } -- for template css + -- also in last else ? + local metadata = specification.metadata + if metadata then + result[#result+1] = f_metadata_begin(depth) + for k, v in table.sortedpairs(metadata) do + result[#result+1] = f_metadata(depth+1,k,lpegmatch(p_entity,v)) + end + result[#result+1] = f_metadata_end(depth) + end + end + + local function endtag(result,element,nature,di,skip) + if skip == "comment" then + if show_comment then + if nature == "display" and (inline == 0 or inline == 1) then + depth = depth - 1 + result[#result+1] = f_comment_end_display(depth,namespaced[element]) + inline = 0 + elseif nature == "mixed" and (inline == 0 or inline == 1) then + depth = depth - 1 + result[#result+1] = f_comment_end_mixed(namespaced[element]) + inline = 0 + else + inline = inline - 1 + result[#result+1] = f_comment_end_inline(namespaced[element]) end end + elseif skip then + -- ignore + else + if nature == "display" and (inline == 0 or inline == 1) then + depth = depth - 1 + result[#result+1] = f_end_display(depth,namespaced[element]) + inline = 0 + elseif nature == "mixed" and (inline == 0 or inline == 1) then + depth = depth - 1 + result[#result+1] = f_end_mixed(namespaced[element]) + inline = 0 + else + inline = inline - 1 + result[#result+1] = f_end_inline(namespaced[element]) + end end end -end -local function breaktree(tree,parent,parentelement) -- also removes double breaks - local data = tree.data - if data then + local function flushtree(result,data,nature) local nofdata = #data - local prevelement - local prevnature - local prevparnumber - local newdata = { } - local nofnewdata = 0 for i=1,nofdata do local di = data[i] - if not di then - -- skip - elseif di.content then - local parnumber = di.parnumber - if prevnature == "inline" and prevparnumber and prevparnumber ~= parnumber then - nofnewdata = nofnewdata + 1 - if trace_spacing then - newdata[nofnewdata] = makebreaknode { type = "a", p = prevparnumber, n = parnumber } + if not di then -- hm, di can be string + -- whatever + else + local content = di.content +-- also optimize for content == "" : trace that first + if content then + -- already has breaks + local content = lpegmatch(p_entity,content) + if i == nofdata and sub(content,-1) == "\n" then -- move check + -- can be an end of line in par but can also be the last line + if trace_spacing then + result[#result+1] = f_spacing(di.parnumber or 0,sub(content,1,-2)) + else + result[#result+1] = sub(content,1,-2) + end + result[#result+1] = " " else - newdata[nofnewdata] = makebreaknode() + if trace_spacing then + result[#result+1] = f_spacing(di.parnumber or 0,content) + else + result[#result+1] = content + end end - end - prevelement = nil - prevnature = "inline" - prevparnumber = parnumber - nofnewdata = nofnewdata + 1 - newdata[nofnewdata] = di - elseif not di.collapsed then - local element = di.element - if element == "break" then -- or element == "pagebreak" - if prevelement == "break" then - di.element = "" + elseif not di.collapsed then -- ignore collapsed data (is appended, reconstructed par) + local element = di.element + if not element then + -- skip + elseif element == "break" then -- or element == "pagebreak" + emptytag(result,element,nature,di) + elseif element == "" or di.skip == "ignore" then + -- skip + else + if di.before then + flushtree(result,di.before,nature) + end + local natu = di.nature + local skip = di.skip + if di.breaknode then + emptytag(result,"break","display",di) + end + begintag(result,element,natu,di,skip) + flushtree(result,di.data,natu) + endtag(result,element,natu,di,skip) + if di.after then + flushtree(result,di.after,nature) + end end - prevelement = element - prevnature = "display" - elseif element == "" or di.skip == "ignore" then + end + end + end + end + + local function breaktree(tree,parent,parentelement) -- also removes double breaks + local data = tree.data + if data then + local nofdata = #data + local prevelement + local prevnature + local prevparnumber + local newdata = { } + local nofnewdata = 0 + for i=1,nofdata do + local di = data[i] + if not di then -- skip + elseif di.content then + local parnumber = di.parnumber + if prevnature == "inline" and prevparnumber and prevparnumber ~= parnumber then + nofnewdata = nofnewdata + 1 + if trace_spacing then + newdata[nofnewdata] = makebreaknode { type = "a", p = prevparnumber, n = parnumber } + else + newdata[nofnewdata] = makebreaknode() + end + end + prevelement = nil + prevnature = "inline" + prevparnumber = parnumber + nofnewdata = nofnewdata + 1 + newdata[nofnewdata] = di + elseif not di.collapsed then + local element = di.element + if element == "break" then -- or element == "pagebreak" + if prevelement == "break" then + di.element = "" + end + prevelement = element + prevnature = "display" + elseif element == "" or di.skip == "ignore" then + -- skip + else + local nature = di.nature + local parnumber = di.parnumber + if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then + nofnewdata = nofnewdata + 1 + if trace_spacing then + newdata[nofnewdata] = makebreaknode { type = "b", p = prevparnumber, n = parnumber } + else + newdata[nofnewdata] = makebreaknode() + end + end + prevnature = nature + prevparnumber = parnumber + prevelement = element + breaktree(di,tree,element) + end + nofnewdata = nofnewdata + 1 + newdata[nofnewdata] = di else local nature = di.nature local parnumber = di.parnumber if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then nofnewdata = nofnewdata + 1 if trace_spacing then - newdata[nofnewdata] = makebreaknode { type = "b", p = prevparnumber, n = parnumber } + newdata[nofnewdata] = makebreaknode { type = "c", p = prevparnumber, n = parnumber } else newdata[nofnewdata] = makebreaknode() end end prevnature = nature prevparnumber = parnumber - prevelement = element - breaktree(di,tree,element) - end - nofnewdata = nofnewdata + 1 - newdata[nofnewdata] = di - else - local nature = di.nature - local parnumber = di.parnumber - if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then nofnewdata = nofnewdata + 1 - if trace_spacing then - newdata[nofnewdata] = makebreaknode { type = "c", p = prevparnumber, n = parnumber } - else - newdata[nofnewdata] = makebreaknode() - end + newdata[nofnewdata] = di end - prevnature = nature - prevparnumber = parnumber - nofnewdata = nofnewdata + 1 - newdata[nofnewdata] = di end - end - tree.data = newdata - end -end - --- also tabulaterow reconstruction .. maybe better as a checker --- i.e cell attribute - -local function collapsetree() - for tag, trees in next, treehash do - local d = trees[1].data - if d then - local nd = #d - if nd > 0 then - for i=2,#trees do - local currenttree = trees[i] - local currentdata = currenttree.data - local currentpar = currenttree.parnumber - local previouspar = trees[i-1].parnumber - currenttree.collapsed = true - -- is the next ok? - if previouspar == 0 or not (di and di.content) then - previouspar = nil -- no need anyway so no further testing needed - end - for j=1,#currentdata do - local cd = currentdata[j] - if not cd or cd == "" then - -- skip - elseif cd.content then - if not currentpar then - -- add space ? - elseif not previouspar then - -- add space ? - elseif currentpar ~= previouspar then - nd = nd + 1 - if trace_spacing then - d[nd] = makebreaknode { type = "d", p = previouspar, n = currentpar } - else - d[nd] = makebreaknode() + tree.data = newdata + end + end + + -- also tabulaterow reconstruction .. maybe better as a checker + -- i.e cell attribute + + local function collapsetree() + for tag, trees in next, treehash do + local d = trees[1].data + if d then + local nd = #d + if nd > 0 then + for i=2,#trees do + local currenttree = trees[i] + local currentdata = currenttree.data + local currentpar = currenttree.parnumber + local previouspar = trees[i-1].parnumber + currenttree.collapsed = true + -- is the next ok? + if previouspar == 0 or not (di and di.content) then + previouspar = nil -- no need anyway so no further testing needed + end + for j=1,#currentdata do + local cd = currentdata[j] + if not cd or cd == "" then + -- skip + elseif cd.content then + if not currentpar then + -- add space ? + elseif not previouspar then + -- add space ? + elseif currentpar ~= previouspar then + nd = nd + 1 + if trace_spacing then + d[nd] = makebreaknode { type = "d", p = previouspar, n = currentpar } + else + d[nd] = makebreaknode() + end end + previouspar = currentpar + nd = nd + 1 + d[nd] = cd + else + nd = nd + 1 + d[nd] = cd end - previouspar = currentpar - nd = nd + 1 - d[nd] = cd - else - nd = nd + 1 - d[nd] = cd + currentdata[j] = false end - currentdata[j] = false end end end end end -end -local function finalizetree(tree) - for _, finalizer in next, finalizers do - finalizer(tree) + local function finalizetree(tree) + for _, finalizer in next, finalizers do + finalizer(tree) + end end -end -local function indextree(tree) - local data = tree.data - if data then - local n, new = 0, { } - for i=1,#data do - local d = data[i] - if not d then - -- skip - elseif d.content then - n = n + 1 - new[n] = d - elseif not d.collapsed then - n = n + 1 - d.__i__ = n - d.__p__ = tree - indextree(d) - new[n] = d + local function indextree(tree) + local data = tree.data + if data then + local n, new = 0, { } + for i=1,#data do + local d = data[i] + if not d then + -- skip + elseif d.content then + n = n + 1 + new[n] = d + elseif not d.collapsed then + n = n + 1 + d.__i__ = n + d.__p__ = tree + indextree(d) + new[n] = d + end end + tree.data = new end - tree.data = new end -end -local function checktree(tree) - local data = tree.data - if data then - for i=1,#data do - local d = data[i] - if type(d) == "table" then - local check = checks[d.tg] - if check then - check(d) + local function checktree(tree) + local data = tree.data + if data then + for i=1,#data do + local d = data[i] + if type(d) == "table" then + local check = checks[d.tg] + if check then + check(d) + end + checktree(d) end - checktree(d) end end end + + wrapups.flushtree = flushtree + wrapups.breaktree = breaktree + wrapups.collapsetree = collapsetree + wrapups.finalizetree = finalizetree + wrapups.indextree = indextree + wrapups.checktree = checktree + end -- collector code local function push(fulltag,depth) - local tag, n = lpegmatch(dashsplitter,fulltag) - local tg, detail = lpegmatch(colonsplitter,tag) - local element, nature - if detail then - local pd = properties[tag] - local pt = properties[tg] - element = pd and pd.export or pt and pt.export or tg - nature = pd and pd.nature or pt and pt.nature or defaultnature + local tg, n, detail + local specification = specifications[fulltag] + if specification then + tg = specification.tagname + n = specification.tagindex + detail = specification.detail else - local p = properties[tg] - element = p and p.export or tg - nature = p and p.nature or "inline" + -- a break (more efficient if we don't store those in specifications) + tg, n = lpegmatch(tagsplitter,fulltag) + n = tonumber(n) -- to tonumber in tagsplitter end + local p = properties[tg] + local element = p and p.export or tg + local nature = p and p.nature or "inline" -- defaultnature local treedata = tree.data - local t = { + local t = { -- maybe we can use the tag table tg = tg, fulltag = fulltag, detail = detail, - n = tonumber(n), -- more efficient + n = n, -- already a number element = element, nature = nature, data = { }, @@ -1688,9 +2290,9 @@ local function push(fulltag,depth) treestack[currentdepth] = tree if trace_export then if detail and detail ~= "" then - report_export("%w<%s trigger=%a paragraph=%a index=%a detail=%a>",currentdepth-1,fulltag,currentattribute or 0,currentparagraph or 0,#treedata,detail) + report_export("%w<%s trigger=%q n=%q paragraph=%q index=%q detail=%q>",currentdepth-1,tg,n,currentattribute or 0,currentparagraph or 0,#treedata,detail) else - report_export("%w<%s trigger=%a paragraph=%a index=%a>",currentdepth-1,fulltag,currentattribute or 0,currentparagraph or 0,#treedata) + report_export("%w<%s trigger=%q n=%q paragraph=%q index=%q>",currentdepth-1,tg,n,currentattribute or 0,currentparagraph or 0,#treedata) end end tree = t @@ -1707,15 +2309,19 @@ local function push(fulltag,depth) end local function pop() - local top = nesting[currentdepth] - tree = treestack[currentdepth] - currentdepth = currentdepth - 1 - if trace_export then - if top then - report_export("%w",currentdepth,top) - else - report_export("",top) + if currentdepth > 0 then + local top = nesting[currentdepth] + tree = treestack[currentdepth] + currentdepth = currentdepth - 1 + if trace_export then + if top then + report_export("%w",currentdepth,top) + else + report_export("",top) + end end + else + report_export("%w",currentdepth) end end @@ -1730,58 +2336,65 @@ local function continueexport() end local function pushentry(current) - if current then - if restart then - continueexport() - restart = false - end - local newdepth = #current - local olddepth = currentdepth - if trace_export then - report_export("%w",currentdepth,olddepth,newdepth,current[newdepth]) + if not current then + -- bad news + return + end + current = current.taglist + if not current then + -- even worse news + return + end + if restart then + continueexport() + restart = false + end + local newdepth = #current + local olddepth = currentdepth + if trace_export then + report_export("%w",currentdepth,olddepth,newdepth,current[newdepth]) + end + if olddepth <= 0 then + for i=1,newdepth do + push(current[i],i) end - if olddepth <= 0 then - for i=1,newdepth do - push(current[i],i) + else + local difference + if olddepth < newdepth then + for i=1,olddepth do + if current[i] ~= nesting[i] then + difference = i + break + end end else - local difference - if olddepth < newdepth then - for i=1,olddepth do - if current[i] ~= nesting[i] then - difference = i - break - end - end - else - for i=1,newdepth do - if current[i] ~= nesting[i] then - difference = i - break - end + for i=1,newdepth do + if current[i] ~= nesting[i] then + difference = i + break end end - if difference then - for i=olddepth,difference,-1 do - pop() - end - for i=difference,newdepth do - push(current[i],i) - end - elseif newdepth > olddepth then - for i=olddepth+1,newdepth do - push(current[i],i) - end - elseif newdepth < olddepth then - for i=olddepth,newdepth,-1 do - pop() - end - elseif trace_export then - report_export("%w",currentdepth,newdepth,nesting[newdepth] or "?") + end + if difference then + for i=olddepth,difference,-1 do + pop() end + for i=difference,newdepth do + push(current[i],i) + end + elseif newdepth > olddepth then + for i=olddepth+1,newdepth do + push(current[i],i) + end + elseif newdepth < olddepth then + for i=olddepth,newdepth,-1 do + pop() + end + elseif trace_export then + report_export("%w",currentdepth,newdepth,nesting[newdepth] or "?") end - return olddepth, newdepth end + return olddepth, newdepth end local function pushcontent(oldparagraph,newparagraph) @@ -1805,17 +2418,19 @@ local function pushcontent(oldparagraph,newparagraph) if list then olddepth, newdepth = pushentry(list) end - local td = tree.data - local nd = #td - td[nd+1] = { parnumber = oldparagraph or currentparagraph, content = content } - if trace_export then - report_export("%w",currentdepth,#content) - report_export("%w%s",currentdepth,(gsub(content,"\n","\\n"))) - report_export("%w",currentdepth) - end - if olddepth then - for i=newdepth-1,olddepth,-1 do - pop() + if tree then + local td = tree.data + local nd = #td + td[nd+1] = { parnumber = oldparagraph or currentparagraph, content = content } + if trace_export then + report_export("%w",currentdepth,#content) + report_export("%w%s",currentdepth,(gsub(content,"\n","\\n"))) + report_export("%w",currentdepth) + end + if olddepth then + for i=newdepth-1,olddepth,-1 do + pop() + end end end end @@ -1824,7 +2439,7 @@ local function pushcontent(oldparagraph,newparagraph) if oldparagraph then pushentry(makebreaklist(currentnesting)) if trace_export then - report_export("%w",currentdepth,oldparagraph,newparagraph) + report_export("%w",currentdepth,oldparagraph,newparagraph) end end end @@ -1853,28 +2468,28 @@ end -- whatsit_code localpar_code -local function collectresults(head,list) -- is last used (we also have currentattribute) +local function collectresults(head,list,pat,pap) -- is last used (we also have currentattribute) local p for n in traverse_nodes(head) do local id = getid(n) -- 14: image, 8: literal (mp) if id == glyph_code then - local at = getattr(n,a_tagged) + local at = getattr(n,a_tagged) or pat if not at then -- we need to tag the pagebody stuff as being valid skippable -- -- report_export("skipping character: %C (no attribute)",n.char) else -- we could add tonunicodes for ligatures (todo) - local components = getfield(n,"components") - if components then -- we loose data - collectresults(components,nil) + local components = getfield(n,"components") + local c = getchar(n) + if components and (not characterdata[c] or overloads[c]) then -- we loose data + collectresults(components,nil,at) -- this assumes that components have the same attribute as the glyph ... we should be more tolerant (see math) else - local c = getchar(n) if last ~= at then local tl = taglist[at] pushcontent() currentnesting = tl - currentparagraph = getattr(n,a_taggedpar) + currentparagraph = getattr(n,a_taggedpar) or pap currentattribute = at last = at pushentry(currentnesting) @@ -1885,11 +2500,15 @@ local function collectresults(head,list) -- is last used (we also have currentat -- to a regular setter at the tex end. local r = getattr(n,a_reference) if r then - referencehash[tl[#tl]] = r -- fulltag + local t = tl.taglist + referencehash[t[#t]] = r -- fulltag end -- elseif last then - local ap = getattr(n,a_taggedpar) + -- we can consider tagging the pars (lines) in the parbuilder but then we loose some + -- information unless we inject a special node (but even then we can run into nesting + -- issues) + local ap = getattr(n,a_taggedpar) or pap if ap ~= currentparagraph then pushcontent(currentparagraph,ap) pushentry(currentnesting) @@ -1928,21 +2547,30 @@ local function collectresults(head,list) -- is last used (we also have currentat if fc then fc = fc and fc[c] if fc then - local u = fc.tounicode - if u and u ~= "" then + local u = fc.unicode + if not u then nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = utfchar(fromunicode16(u)) + currentcontent[nofcurrentcontent] = utfchar(c) + elseif type(u) == "table" then + for i=1,#u do + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = utfchar(u[i]) + end else nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = utfchar(c) + currentcontent[nofcurrentcontent] = utfchar(u) end - else -- weird, happens in hz (we really need to get rid of the pseudo fonts) + elseif c > 0 then nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = utfchar(c) + else + -- we can have -1 as side effect of an explicit hyphen (unless we expand) end - else + elseif c > 0 then nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = utfchar(c) + else + -- we can have -1 as side effect of an explicit hyphen (unless we expand) end end end @@ -1965,7 +2593,7 @@ local function collectresults(head,list) -- is last used (we also have currentat if ca == 0 then -- skip this one ... already converted special character (node-acc) elseif ca then - local a = getattr(n,a_tagged) + local a = getattr(n,a_tagged) or pat if a then local c = specialspaces[ca] if last ~= a then @@ -1975,13 +2603,13 @@ local function collectresults(head,list) -- is last used (we also have currentat end pushcontent() currentnesting = tl - currentparagraph = getattr(n,a_taggedpar) + currentparagraph = getattr(n,a_taggedpar) or pap currentattribute = a last = a pushentry(currentnesting) -- no reference check (see above) elseif last then - local ap = getattr(n,a_taggedpar) + local ap = getattr(n,a_taggedpar) or pap if ap ~= currentparagraph then pushcontent(currentparagraph,ap) pushentry(currentnesting) @@ -2004,9 +2632,10 @@ local function collectresults(head,list) -- is last used (we also have currentat else local subtype = getsubtype(n) if subtype == userskip_code then - if getfield(getfield(n,"spec"),"width") > threshold then + local spec = getfield(n,"spec") + if getfield(spec,"width") > threshold then if last and not somespace[currentcontent[nofcurrentcontent]] then - local a = getattr(n,a_tagged) + local a = getattr(n,a_tagged) or pat if a == last then if trace_export then report_export("%w",currentdepth) @@ -2033,7 +2662,7 @@ local function collectresults(head,list) -- is last used (we also have currentat end elseif subtype == spaceskip_code or subtype == xspaceskip_code then if not somespace[currentcontent[nofcurrentcontent]] then - local a = getattr(n,a_tagged) + local a = getattr(n,a_tagged) or pat if a == last then if trace_export then report_export("%w",currentdepth) @@ -2062,7 +2691,7 @@ local function collectresults(head,list) -- is last used (we also have currentat nofcurrentcontent = nofcurrentcontent - 1 end elseif not somespace[r] then - local a = getattr(n,a_tagged) + local a = getattr(n,a_tagged) or pat if a == last then if trace_export then report_export("%w",currentdepth) @@ -2092,7 +2721,7 @@ local function collectresults(head,list) -- is last used (we also have currentat elseif id == hlist_code or id == vlist_code then local ai = getattr(n,a_image) if ai then - local at = getattr(n,a_tagged) + local at = getattr(n,a_tagged) or pat if nofcurrentcontent > 0 then pushcontent() pushentry(currentnesting) -- ?? @@ -2107,7 +2736,8 @@ local function collectresults(head,list) -- is last used (we also have currentat -- we need to determine an end-of-line local list = getlist(n) if list then - collectresults(list,n) + local at = getattr(n,a_tagged) or pat + collectresults(list,n,at) end end elseif id == kern_code then @@ -2119,7 +2749,7 @@ local function collectresults(head,list) -- is last used (we also have currentat end if kern > limit then if last and not somespace[currentcontent[nofcurrentcontent]] then - local a = getattr(n,a_tagged) + local a = getattr(n,a_tagged) or pat if a == last then if not somespace[currentcontent[nofcurrentcontent]] then if trace_export then @@ -2159,6 +2789,19 @@ function nodes.handlers.export(head) -- hooks into the page builder end -- continueexport() restart = true + +-- local function f(head,depth,pat) +-- for n in node.traverse(head) do +-- local a = n[a_tagged] or pat +-- local t = taglist[a] +-- print(depth,n,a,t and table.concat(t," ")) +-- if n.id == hlist_code or n.id == vlist_code and n.list then +-- f(n.list,depth+1,a) +-- end +-- end +-- end +-- f(head,1) + collectresults(tonut(head)) if trace_export then report_export("%w",currentdepth) @@ -2180,270 +2823,739 @@ function builders.paragraphs.tag(head) return false end --- encoding='utf-8' +do local xmlpreamble = [[ - + - - - - + ]] -local function wholepreamble() - return format(xmlpreamble,tex.jobname,os.date(),environment.version,exportversion) -end + local flushtree = wrapups.flushtree + + local function wholepreamble(standalone) + return replacetemplate(xmlpreamble, { + standalone = standalone and "yes" or "no", + filename = tex.jobname, + date = os.date(), + contextversion = environment.version, + exportversion = exportversion, + }) + end local csspreamble = [[ - + ]] -local function allusedstylesheets(xmlfile,cssfiles,files) - local result = { } - for i=1,#cssfiles do - local cssfile = cssfiles[i] - if type(cssfile) ~= "string" or cssfile == variables.yes or cssfile == "" or cssfile == xmlfile then - cssfile = file.replacesuffix(xmlfile,"css") - else - cssfile = file.addsuffix(cssfile,"css") +local cssheadlink = [[ + +]] + + local function allusedstylesheets(cssfiles,files,path) + local done = { } + local result = { } + local extras = { } + for i=1,#cssfiles do + local cssfile = cssfiles[i] + if type(cssfile) ~= "string" then + -- error + elseif cssfile == "export-example.css" then + -- ignore + elseif not done[cssfile] then + cssfile = file.join(path,cssfile) + report_export("adding css reference '%s'",cssfile) + files[#files+1] = cssfile + result[#result+1] = replacetemplate(csspreamble, { filename = cssfile }) + extras[#extras+1] = replacetemplate(cssheadlink, { filename = cssfile }) + done[cssfile] = true + end end - files[#files+1] = cssfile - report_export("adding css reference '%s'",cssfile) - result[#result+1] = format(csspreamble,cssfile) + return concat(result), concat(extras) end - return concat(result) -end -local e_template = [[ -%s { - display: %s ; +local elementtemplate = [[ +/* element="%element%" detail="%detail%" chain="%chain%" */ + +%element%, context|div.%element% { + display: %display% ; }]] -local d_template = [[ -%s[detail=%s] { - display: %s ; +local detailtemplate = [[ +/* element="%element%" detail="%detail%" chain="%chain%" */ + +%element%[detail=%detail%], context|div.%element%.%detail% { + display: %display% ; }]] -local displaymapping = { - inline = "inline", - display = "block", - mixed = "inline", -} +-- + +local htmltemplate = [[ +%preamble% -local function allusedelements(xmlfile) - local result = { format("/* template for file %s */",xmlfile) } - for element, details in sortedhash(used) do - result[#result+1] = format("/* category: %s */",element) - for detail, nature in sortedhash(details) do - local d = displaymapping[nature or "display"] or "block" - if detail == "" then - result[#result+1] = formatters[e_template](element,d) + + + + + + + %title% + +%style% + + + +
+ +
Rendering can be suboptimal because there is no default/fallback css loaded.
+ +%body% + +
+ + +]] + + local displaymapping = { + inline = "inline", + display = "block", + mixed = "inline", + } + + local function allusedelements(basename) + local result = { replacetemplate(namespacetemplate, { + what = "template", + filename = basename, + namespace = contextns, + }) } + for element, details in sortedhash(used) do + if namespaces[element] then + -- skip math else - result[#result+1] = formatters[d_template](element,detail,d) + for detail, what in sortedhash(details) do + local nature = what[1] or "display" + local chain = what[2] + local display = displaymapping[nature] or "block" + if detail == "" then + result[#result+1] = replacetemplate(elementtemplate, { + element = element, + display = display, + chain = chain, + }) + else + result[#result+1] = replacetemplate(detailtemplate, { + element = element, + display = display, + detail = detail, + chain = chain, + }) + end + end + end + end + return concat(result,"\n\n") + end + + local function allcontent(tree) + local result = { } + flushtree(result,tree.data,"display") -- we need to collect images + result = concat(result) + -- no need to lpeg .. fast enough + result = gsub(result,"\n *\n","\n") + result = gsub(result,"\n +([^< ])","\n%1") + return result + end + + -- local xhtmlpreamble = [[ + -- + -- ]] + + local function cleanxhtmltree(xmltree) + if xmltree then + local implicits = { } + local explicits = { } + local overloads = { } + for e in xml.collected(xmltree,"*") do + local at = e.at + if at then + local explicit = at.explicit + local implicit = at.implicit + if explicit then + if not explicits[explicit] then + explicits[explicit] = true + at.id = explicit + if implicit then + overloads[implicit] = explicit + end + end + else + if implicit and not implicits[implicit] then + implicits[implicit] = true + at.id = "aut:" .. implicit + end + end + end + end + for e in xml.collected(xmltree,"*") do + local at = e.at + if at then + local internal = at.internal + local location = at.location + if internal then + if location then + local explicit = overloads[location] + if explicit then + at.href = "#" .. explicit + else + at.href = "#aut:" .. internal + end + else + at.href = "#aut:" .. internal + end + else + if location then + at.href = "#" .. location + else + local url = at.url + if url then + at.href = url + else + local file = at.file + if file then + at.href = file + end + end + end + end + end end + return xmltree + else + return xml.convert('\ninvalid xhtml tree') end end - return concat(result,"\n\n") -end -local function allcontent(tree) - local result = { } - flushtree(result,tree.data,"display",0) -- we need to collect images - result = concat(result) - result = gsub(result,"\n *\n","\n") - result = gsub(result,"\n +([^< ])","\n%1") - return result -end + -- maybe the reverse: be explicit about what is permitted --- local xhtmlpreamble = [[ --- --- ]] - -local function cleanxhtmltree(xmltree) - if xmltree then - local xmlwrap = xml.wrap - for e in xml.collected(xmltree,"/document") do - e.at["xmlns:xhtml"] = "http://www.w3.org/1999/xhtml" - break - end - -- todo: inject xhtmlpreamble (xmlns should have be enough) - local wrapper = { tg = "a", ns = "xhtml", at = { href = "unknown" } } - for e in xml.collected(xmltree,"link") do - local at = e.at - local href - if at.location then - href = "#" .. gsub(at.location,":","_") - elseif at.url then - href = at.url - elseif at.file then - href = at.file - end - if href then - wrapper.at.href = href - xmlwrap(e,wrapper) - end - end - local wrapper = { tg = "a", ns = "xhtml", at = { name = "unknown" } } - for e in xml.collected(xmltree,"!link[@location]") do - local location = e.at.location - if location then - wrapper.at.name = gsub(location,":","_") - xmlwrap(e,wrapper) - end - end - return xmltree - else - return xml.convert("\ninvalid xhtml tree") - end -end + local private = { + destination = true, + prefix = true, + reference = true, + -- + id = true, + href = true, + -- + implicit = true, + explicit = true, + -- + url = true, + file = true, + internal = true, + location = true, + -- + name = true, -- image name + used = true, -- image name + page = true, -- image name + width = true, + height = true, + -- + } -local cssfile, xhtmlfile = nil, nil + local addclicks = true + local f_onclick = formatters[ [[location.href='%s']] ] + local f_onclick = formatters[ [[location.href='%s']] ] -directives.register("backend.export.css", function(v) cssfile = v end) -directives.register("backend.export.xhtml",function(v) xhtmlfile = v end) + local p_cleanid = lpeg.replacer { [":"] = "-" } + local p_cleanhref = lpeg.Cs(lpeg.P("#") * p_cleanid) -local function stopexport(v) - starttiming(treehash) - -- - finishexport() - -- - collapsetree(tree) - indextree(tree) - checktree(tree) - breaktree(tree) - finalizetree(tree) - -- - hashlistdata() - -- - if type(v) ~= "string" or v == variables.yes or v == "" then - v = tex.jobname - end - local basename = file.basename(v) - local xmlfile = file.addsuffix(basename,"export") - -- - local imagefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-images","css") - local stylefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-styles","css") - local templatefilename = file.replacesuffix(xmlfile,"template") - local specificationfilename = file.replacesuffix(xmlfile,"specification") - -- - if xhtml and not cssfile then - cssfile = true - end - local cssfiles = { } - if cssfile then - if cssfile == true then - cssfiles = { "export-example.css" } + local p_splitter = lpeg.Ct ( ( + lpeg.Carg(1) * lpeg.C((1-lpeg.P(" "))^1) / function(d,s) if not d[s] then d[s] = true return s end end + * lpeg.P(" ")^0 )^1 ) + + + local classes = table.setmetatableindex(function(t,k) + local v = concat(lpegmatch(p_splitter,k,1,{})," ") + t[k] = v + return v + end) + + local function makeclass(tg,at) + local detail = at.detail + local chain = at.chain + local result + at.detail = nil + at.chain = nil + if detail and detail ~= "" then + if chain and chain ~= "" then + if chain ~= detail then + result = { classes[tg .. " " .. chain .. " " .. detail] } -- we need to remove duplicates + elseif tg ~= detail then + result = { tg, detail } + else + result = { tg } + end + elseif tg ~= detail then + result = { tg, detail } + else + result = { tg } + end + elseif chain and chain ~= "" then + if tg ~= chain then + result = { tg, chain } + else + result = { tg } + end else - cssfiles = settings_to_array(cssfile or "") + result = { tg } end - insert(cssfiles,1,imagefilename) - insert(cssfiles,1,stylefilename) + for k, v in next, at do + if not private[k] then + result[#result+1] = k .. "-" .. v + end + end + return concat(result, " ") end - cssfiles = table.unique(cssfiles) - -- - local result = allcontent(tree) -- also does some housekeeping and data collecting - -- - local files = { - } - local results = concat { - wholepreamble(), - allusedstylesheets(xmlfile,cssfiles,files), -- ads to files - result, - } - -- - files = table.unique(files) - -- - report_export("saving xml data in %a",xmlfile) - io.savedata(xmlfile,results) - -- - report_export("saving css image definitions in %a",imagefilename) - io.savedata(imagefilename,allusedimages(xmlfile)) - -- - report_export("saving css style definitions in %a",stylefilename) - io.savedata(stylefilename,allusedstyles(xmlfile)) - -- - report_export("saving css template in %a",templatefilename) - io.savedata(templatefilename,allusedelements(xmlfile)) - -- - if xhtmlfile then - if type(v) ~= "string" or xhtmlfile == true or xhtmlfile == variables.yes or xhtmlfile == "" or xhtmlfile == xmlfile then - xhtmlfile = file.replacesuffix(xmlfile,"xhtml") - else - xhtmlfile = file.addsuffix(xhtmlfile,"xhtml") + + local function remap(specification,source,target) + local comment = nil -- share comments + for c in xml.collected(source,"*") do + if not c.special then + local tg = c.tg + local ns = c.ns + if ns == "m" then + if false then -- yes or no + c.ns = "" + c.at["xmlns:m"] = nil + end + -- elseif tg == "a" then + -- c.ns = "" + else + -- if tg == "tabulatecell" or tg == "tablecell" then + local dt = c.dt + local nt = #dt + if nt == 0 or (nt == 1 and dt[1] == "") then + if comment then + c.dt = comment + else + xml.setcomment(c,"empty") + comment = c.dt + end + end + -- end + local at = c.at + local class = nil + if tg == "document" then + at.href = nil + at.detail = nil + at.chain = nil + else + class = makeclass(tg,at) + end + local id = at.id + local href = at.href + if id then + id = lpegmatch(p_cleanid, id) or id + if href then + href = lpegmatch(p_cleanhref,href) or href + c.at = { + class = class, + id = id, + href = href, + onclick = addclicks and f_onclick(href) or nil, + } + else + c.at = { + class = class, + id = id, + } + end + else + if href then + href = lpegmatch(p_cleanhref,href) or href + c.at = { + class = class, + href = href, + onclick = addclicks and f_onclick(href) or nil, + } + else + c.at = { + class = class, + } + end + end + c.tg = "div" + end + end + end + end + + -- local cssfile = nil directives.register("backend.export.css", function(v) cssfile = v end) + + local addsuffix = file.addsuffix + local joinfile = file.join + + local function stopexport(v) + + starttiming(treehash) + -- + finishexport() + -- + report_export("") + report_export("exporting xml, xhtml and html files") + report_export("") + -- + wrapups.collapsetree(tree) + wrapups.indextree(tree) + wrapups.checktree(tree) + wrapups.breaktree(tree) + wrapups.finalizetree(tree) + -- + wrapups.hashlistdata() + -- + if type(v) ~= "string" or v == v_yes or v == "" then + v = tex.jobname + end + + -- we use a dedicated subpath: + -- + -- ./jobname-export + -- ./jobname-export/images + -- ./jobname-export/styles + -- ./jobname-export/styles + -- ./jobname-export/jobname-export.xml + -- ./jobname-export/jobname-export.xhtml + -- ./jobname-export/jobname-export.html + -- ./jobname-export/jobname-specification.lua + -- ./jobname-export/styles/jobname-defaults.css + -- ./jobname-export/styles/jobname-styles.css + -- ./jobname-export/styles/jobname-images.css + -- ./jobname-export/styles/jobname-templates.css + + local basename = file.basename(v) + local corename = file.removesuffix(basename) + local basepath = basename .. "-export" + local imagepath = joinfile(basepath,"images") + local stylepath = joinfile(basepath,"styles") + + local function validpath(what,pathname) + if lfs.isdir(pathname) then + report_export("using exiting %s path %a",what,pathname) + return pathname + end + lfs.mkdir(pathname) + if lfs.isdir(pathname) then + report_export("using cretated %s path %a",what,basepath) + return pathname + else + report_export("unable to create %s path %a",what,basepath) + return false + end + end + + if not (validpath("export",basepath) and validpath("images",imagepath) and validpath("styles",stylepath)) then + return + end + + -- we're now on the dedicated export subpath so we can't clash names + + local xmlfilebase = addsuffix(basename .. "-raw","xml" ) + local xhtmlfilebase = addsuffix(basename .. "-tag","xhtml") + local htmlfilebase = addsuffix(basename .. "-div","xhtml") + local specificationfilebase = addsuffix(basename .. "-pub","lua" ) + + local xmlfilename = joinfile(basepath, xmlfilebase ) + local xhtmlfilename = joinfile(basepath, xhtmlfilebase ) + local htmlfilename = joinfile(basepath, htmlfilebase ) + local specificationfilename = joinfile(basepath, specificationfilebase) + -- + local defaultfilebase = addsuffix(basename .. "-defaults", "css") + local imagefilebase = addsuffix(basename .. "-images", "css") + local stylefilebase = addsuffix(basename .. "-styles", "css") + local templatefilebase = addsuffix(basename .. "-templates","css") + -- + local defaultfilename = joinfile(stylepath,defaultfilebase ) + local imagefilename = joinfile(stylepath,imagefilebase ) + local stylefilename = joinfile(stylepath,stylefilebase ) + local templatefilename = joinfile(stylepath,templatefilebase) + + local cssfile = finetuning.cssfile + + -- we keep track of all used files + + local files = { + } + + -- we always load the defaults and optionally extra css files; we also copy the example + -- css file so that we always have the latest version + + local cssfiles = { + defaultfilebase, + imagefilebase, + stylefilebase, + } + + local examplefilename = resolvers.find_file("export-example.css") + if examplefilename then + file.copy(examplefilename,defaultfilename) + end + + if cssfile then + local list = table.unique(settings_to_array(cssfile)) + for i=1,#list do + local source = addsuffix(list[i],"css") + local target = joinfile(stylepath,file.basename(source)) + cssfiles[#cssfiles+1] = source + if not lfs.isfile(source) then + source = joinfile("../",source) + end + if lfs.isfile(source) then + report_export("copying %s",source) + file.copy(source,target) + end + end end - files[#files+1] = xhtmlfile - report_export("saving xhtml variant in %a",xhtmlfile) + + local x_styles, h_styles = allusedstylesheets(cssfiles,files,"styles") + + -- at this point we're ready for the content; the collector also does some + -- housekeeping and data collecting; at this point we still have an xml + -- representation that uses verbose element names and carries information in + -- attributes + + local result = allcontent(tree) + + local results = concat { + wholepreamble(true), + x_styles, -- adds to files + result, + } + + cssfiles = table.unique(cssfiles) + + -- we're now ready for saving the result in the xml file + + report_export("saving xml data in %a",xmlfilename) + io.savedata(xmlfilename,results) + + report_export("saving css image definitions in %a",imagefilename) + io.savedata(imagefilename,wrapups.allusedimages(basename)) + + report_export("saving css style definitions in %a",stylefilename) + io.savedata(stylefilename,wrapups.allusedstyles(basename)) + + report_export("saving css template in %a",templatefilename) + io.savedata(templatefilename,allusedelements(basename)) + + -- additionally we save an xhtml file; for that we load the file as xml tree + + report_export("saving xhtml variant in %a",xhtmlfilename) + local xmltree = cleanxhtmltree(xml.convert(results)) - xml.save(xmltree,xhtmlfile) + + xml.save(xmltree,xhtmlfilename) + + -- now we save a specification file that can b eused for generating an epub file + -- looking at identity is somewhat redundant as we also inherit from interaction -- at the tex end + local identity = interactions.general.getidentity() + local specification = { - name = file.removesuffix(v), - identifier = os.uuid(), - images = uniqueusedimages(), - root = xhtmlfile, - files = files, - language = languagenames[texgetcount("mainlanguagenumber")], - title = validstring(finetuning.title) or validstring(identity.title), - subtitle = validstring(finetuning.subtitle) or validstring(identity.subtitle), - author = validstring(finetuning.author) or validstring(identity.author), - firstpage = validstring(finetuning.firstpage), - lastpage = validstring(finetuning.lastpage), + name = file.removesuffix(v), + identifier = os.uuid(), + images = wrapups.uniqueusedimages(), + imagefile = joinfile("styles",imagefilebase), + imagepath = "images", + stylepath = "styles", + xmlfiles = { xmlfilebase }, + xhtmlfiles = { xhtmlfilebase }, + htmlfiles = { htmlfilebase }, + styles = cssfiles, + htmlroot = htmlfilebase, + language = languagenames[texgetcount("mainlanguagenumber")], + title = validstring(finetuning.title) or validstring(identity.title), + subtitle = validstring(finetuning.subtitle) or validstring(identity.subtitle), + author = validstring(finetuning.author) or validstring(identity.author), + firstpage = validstring(finetuning.firstpage), + lastpage = validstring(finetuning.lastpage), } - report_export("saving specification in %a (mtxrun --script epub --make %s)",specificationfilename,specificationfilename) + + report_export("saving specification in %a",specificationfilename,specificationfilename) + io.savedata(specificationfilename,table.serialize(specification,true)) - end - stoptiming(treehash) -end -local appendaction = nodes.tasks.appendaction -local enableaction = nodes.tasks.enableaction + -- the html export for epub is different in the sense that it uses div's instead of + -- specific tags -function commands.setupexport(t) - table.merge(finetuning,t) - keephyphens = finetuning.hyphen == variables.yes -end + report_export("saving div based alternative in %a",htmlfilename) + + remap(specification,xmltree) + + local variables = { + style = h_styles, + body = xml.tostring(xml.first(xmltree,"/div")), + preamble = wholepreamble(false), + title = specification.title, + } -local function startexport(v) - if v and not exporting then - report_export("enabling export to xml") - -- not yet known in task-ini - appendaction("shipouts","normalizers", "nodes.handlers.export") - -- enableaction("shipouts","nodes.handlers.export") - enableaction("shipouts","nodes.handlers.accessibility") - enableaction("math", "noads.handlers.tags") - -- appendaction("finalizers","lists","builders.paragraphs.tag") - -- enableaction("finalizers","builders.paragraphs.tag") - luatex.registerstopactions(function() stopexport(v) end) - exporting = true + io.savedata(htmlfilename,replacetemplate(htmltemplate,variables,"xml")) + + -- finally we report how an epub file can be made (using the specification) + + report_export("") + report_export('create epub with: mtxrun --script epub --make "%s" [--purge --rename --svgmath]',file.nameonly(basename)) + report_export("") + + stoptiming(treehash) end -end -directives.register("backend.export",startexport) -- maybe .name + local appendaction = nodes.tasks.appendaction + local enableaction = nodes.tasks.enableaction -statistics.register("xml exporting time", function() - if exporting then - return format("%s seconds, version %s", statistics.elapsedtime(treehash),exportversion) + function structurestags.setupexport(t) + table.merge(finetuning,t) + keephyphens = finetuning.hyphen == v_yes + exportproperties = finetuning.properties + if exportproperties == v_no then + exportproperties = false + end end -end) + + + + local function startexport(v) + if v and not exporting then + report_export("enabling export to xml") + -- not yet known in task-ini + appendaction("shipouts","normalizers", "nodes.handlers.export") + -- enableaction("shipouts","nodes.handlers.export") + enableaction("shipouts","nodes.handlers.accessibility") + enableaction("math", "noads.handlers.tags") + -- appendaction("finalizers","lists","builders.paragraphs.tag") + -- enableaction("finalizers","builders.paragraphs.tag") + luatex.registerstopactions(function() stopexport(v) end) + exporting = true + end + end + + directives.register("backend.export",startexport) -- maybe .name + + statistics.register("xml exporting time", function() + if exporting then + return string.format("%s seconds, version %s", statistics.elapsedtime(treehash),exportversion) + end + end) + +end -- These are called at the tex end: -commands.settagitemgroup = structurestags.setitemgroup -commands.settagsynonym = structurestags.setsynonym -commands.settagsorting = structurestags.setsorting -commands.settagdescription = structurestags.setdescription -commands.settagdescriptionsymbol = structurestags.setdescriptionsymbol -commands.settaghighlight = structurestags.sethighlight -commands.settagfigure = structurestags.setfigure -commands.settagcombination = structurestags.setcombination -commands.settagtablecell = structurestags.settablecell -commands.settagtabulatecell = structurestags.settabulatecell +implement { + name = "setupexport", + actions = structurestags.setupexport, + arguments = { + { + { "align" }, + { "bodyfont", "dimen" }, + { "width", "dimen" }, + { "properties" }, + { "hyphen" }, + { "title" }, + { "subtitle" }, + { "author" }, + { "firstpage" }, + { "lastpage" }, + { "svgstyle" }, + { "cssfile" }, + } + } +} + +implement { + name = "settagitemgroup", + actions = structurestags.setitemgroup, + arguments = { "boolean", "integer", "string" } +} + +implement { + name = "settagitem", + actions = structurestags.setitem, + arguments = "string" +} + +implement { + name = "settagsynonym", + actions = structurestags.setsynonym, + arguments = "string" +} + +implement { + name = "settagsorting", + actions = structurestags.setsorting, + arguments = "string" +} + +implement { + name = "settagdescription", + actions = structurestags.setdescription, + arguments = { "string", "integer" } +} + +implement { + name = "settagdescriptionsymbol", + actions = structurestags.setdescriptionsymbol, + arguments = { "string", "integer" } +} + +implement { + name = "settaghighlight", + actions = structurestags.sethighlight, + arguments = { "string", "integer" } +} + +implement { + name = "settagfigure", + actions = structurestags.setfigure, + arguments = { "string", "string", "string", "dimen", "dimen" } +} + +implement { + name = "settagcombination", + actions = structurestags.setcombination, + arguments = { "integer", "integer" } +} + +implement { + name = "settagtablecell", + actions = structurestags.settablecell, + arguments = { "integer", "integer", "integer" } +} + +implement { + name = "settagtabulatecell", + actions = structurestags.settabulatecell, + arguments = "integer" +} + +implement { + name = "settagregister", + actions = structurestags.setregister, + arguments = { "string", "integer" } +} +implement { + name = "settaglist", + actions = structurestags.setlist, + arguments = "integer" +} diff --git a/Master/texmf-dist/tex/context/base/back-exp.mkiv b/Master/texmf-dist/tex/context/base/back-exp.mkiv index c7696d383a0..bddb6de4d92 100644 --- a/Master/texmf-dist/tex/context/base/back-exp.mkiv +++ b/Master/texmf-dist/tex/context/base/back-exp.mkiv @@ -38,8 +38,8 @@ \doubleexpandafter\back_export_set_element_tag_b \fi\fi} -\def\back_export_set_element_tag_a[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","#2","#3")}} -\def\back_export_set_element_tag_b[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","export","#2")}} +\def\back_export_set_element_tag_a[#1][#2][#3]{\clf_settagproperty{#1}{#2}{#3}} +\def\back_export_set_element_tag_b[#1][#2][#3]{\clf_settagproperty{#1}{export}{#2}} % todo: no need for calls when trialtypesetting @@ -53,12 +53,25 @@ \newcount\tagparcounter \let\dotagsetparcounter\relax +\let\doresetparcounter \relax \appendtoks + \doresetparcounter +\to \everyflushatnextpar + +% \appendtoks +% \dotagsetparcounter +% \to \everypar + +\prependtoks \dotagsetparcounter \to \everypar -\appendtoks +% \appendtoks +% \dotagsetparcounter +% \to \neverypar + +\prependtoks \dotagsetparcounter \to \neverypar @@ -67,54 +80,117 @@ \to \everytabulatepar % tricky, maybe this should be neverypar \appendtoks - \unexpanded\def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}% - \unexpanded\def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering) + \unexpanded\def\dotagTABLEcell + {\iftrialtypesetting\else + \clf_settagtablecell + \numexpr\tablecellrows\relax + \numexpr\tablecellcolumns\relax + \numexpr\raggedstatus\relax + \fi}% + % brrr, we need to tag empty cells (unless we start numbering) + \unexpanded\def\dotagTABLEsignal + {\char\zerocount}% +\to \everyenableelements + +\appendtoks + \unexpanded\def\dotagtabulatecell + {\iftrialtypesetting\else\clf_settagtabulatecell\c_tabl_tabulate_align\fi}% + \unexpanded\def\dotagtabulatesignal + {\dontleavehmode\char\zerocount\ignorespaces}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\c_tabl_tabulate_align)}}% - \unexpanded\def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}% + \unexpanded\def\dotagsynonym + {\iftrialtypesetting\else\clf_settagsynonym{\currentsynonymtag}\fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}% + \unexpanded\def\dotagsorting + {\iftrialtypesetting\else\clf_settagsorting{\currentsortingtag}\fi}% \to \everyenableelements \appendtoks % frozen and assumed global per highlight class - \unexpanded\def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight",\!!bs\highlightparameter\c!style\!!es,\number\attribute\colorattribute)}}% + \unexpanded\def\dotaghighlight + {\iftrialtypesetting\else + \clf_settaghighlight{\highlightparameter\c!style}\attribute\colorattribute\relax + \fi}% \to \everyenableelements \appendtoks % we can have differently scaled images - \unexpanded\def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}% + \unexpanded\def\dotagfigure + {\iftrialtypesetting\else + \clf_settagfigure + {\figurefileoriginal}% + {\figurefullname}% + {\figurefilepage}% + \dimexpr\figurewidth\relax + \dimexpr\figureheight\relax + \fi}% +\to \everyenableelements + +\appendtoks + \unexpanded\def\dotagcombination + {\iftrialtypesetting\else + \clf_settagcombination + \numexpr\combinationparameter\c!nx\relax + \numexpr\combinationparameter\c!ny\relax + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}% - %\unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}% + \unexpanded\def\dotagsetparcounter + {\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}% + \unexpanded\def\doresetparcounter + {\attribute\taggedparattribute\attributeunsetvalue}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}% + \unexpanded\def\dotagsetitemgroup + {\iftrialtypesetting\else + \clf_settagitemgroup + \ifconditional\c_strc_itemgroups_pack true\else false\fi\space + \numexpr\currentitemlevel\relax + {\currentitemgroupsymbol}% + \fi}% + \unexpanded\def\dotagsetitem#1% + {\iftrialtypesetting\else + \clf_settagitem{#1}% + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}% + \unexpanded\def\dotagsetdescription + {\iftrialtypesetting\else + \clf_settagdescription{\currentdescription}\currentdescriptionnumberentry\relax + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\c_strc_itemgroups_pack true\else false\fi,"\currentitemgroupsymbol")}}% + \unexpanded\def\dotagsetnotesymbol + {\iftrialtypesetting\else + \clf_settagdescriptionsymbol{\currentnote}\currentnotenumber\relax + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}% + \unexpanded\def\dotagregisterlocation + {\iftrialtypesetting\else + \clf_settagregister{\currentregister}\currentregisternumber\relax + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}% + \unexpanded\def\dotaglistlocation + {\iftrialtypesetting\else + \clf_settaglist\currentlistindex\relax + \fi}% \to \everyenableelements \appendtoks - \unexpanded\def\doverbatimspace{\char32\relax}% will be done permanently + \let\specialfixedspace \explicitfixedspace + \let\specialobeyedspace \explicitobeyedspace + \let\specialstretchedspace\explicitstretchedspace + \let\specialcontrolspace \explicitcontrolspace \to \everyenableelements % The action: \setupbackend[export=yes] % or filename @@ -137,21 +213,28 @@ \c!author={\directinteractionparameter\c!author}, % \c!firstpage=, % imagename % \c!lastpage=, % imagename - \c!hyphen=\v!no] + \c!alternative=, % html, div + \c!properties=\v!no, % no: ignore, yes: as attribute, otherwise: use as prefix + \c!hyphen=\v!no, + \c!svgstyle=, + \c!cssfile=] \def\dosynchronizeexport {\let\currentexport\empty - \ctxcommand{setupexport{ - align = "\exportparameter\c!align", - bodyfont = \number\dimexpr\exportparameter\c!bodyfont, - width = \number\dimexpr\exportparameter\c!width, - hyphen = "\exportparameter\c!hyphen", - title = \!!bs\exportparameter\c!title\!!es, - subtitle = \!!bs\exportparameter\c!subtitle\!!es, - author = \!!bs\exportparameter\c!author\!!es, - firstpage = "\exportparameter\c!firstpage", - lastpage = "\exportparameter\c!lastpage", - }}} + \clf_setupexport + align {\exportparameter\c!align}% + bodyfont \dimexpr\exportparameter\c!bodyfont\relax + width \dimexpr\exportparameter\c!width\relax + properties {\exportparameter\c!properties}% + hyphen {\exportparameter\c!hyphen}% + title {\exportparameter\c!title}% + subtitle {\exportparameter\c!subtitle}% + author {\exportparameter\c!author}% + firstpage {\exportparameter\c!firstpage}% + lastpage {\exportparameter\c!lastpage}% + svgstyle {\exportparameter\c!svgstyle}% + cssfile {\exportparameter\c!cssfile}% + \relax} \appendtoks \doifsomething{\backendparameter\c!export}\dosynchronizeexport @@ -161,12 +244,14 @@ \doifsomething{\backendparameter\c!export}\dosynchronizeexport % in case it is done inside \starttext \to \everysetupdocument -\appendtoks - \doifsomething{\backendparameter\c!xhtml} - {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}% - \doifsomething{\backendparameter\c!css} - {\enabledirectives[backend.export.css={\backendparameter\c!css}]}% -\to \everysetupbackend +% \appendtoks +% \doifsomething{\backendparameter\c!xhtml} +% {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}% +% \doifsomething{\backendparameter\c!css} +% {\enabledirectives[backend.export.css={\backendparameter\c!css}]}% +% \doifsomething{\backendparameter\c!alternative} +% {\enabledirectives[backend.export.alternative={\backendparameter\c!alternative}]}% +% \to \everysetupbackend \appendtoks \doifelsenothing{\backendparameter\c!export} diff --git a/Master/texmf-dist/tex/context/base/back-ini.lua b/Master/texmf-dist/tex/context/base/back-ini.lua index c1f973a0c6f..e8af4d9d9c2 100644 --- a/Master/texmf-dist/tex/context/base/back-ini.lua +++ b/Master/texmf-dist/tex/context/base/back-ini.lua @@ -6,6 +6,13 @@ if not modules then modules = { } end modules ['back-ini'] = { license = "see context related readme files" } +-- -- how to create a shortcut: +-- +-- local function something(...) +-- something = backends.codeinjections.something +-- return something(...) +-- end + local next, type = next, type local format = string.format @@ -106,6 +113,10 @@ function codeinjections.getmatrix() return 1, 0, 0, 1, 0, 0 end -- can best be here -function commands.setrealspaces(v) - nodes.tasks.setaction("shipouts","nodes.handlers.accessibility",v == interfaces.variables.yes) -end +interfaces.implement { + name = "setrealspaces", + arguments = "string", + actions = function(v) + nodes.tasks.setaction("shipouts","nodes.handlers.accessibility",v == interfaces.variables.yes) + end +} diff --git a/Master/texmf-dist/tex/context/base/back-ini.mkiv b/Master/texmf-dist/tex/context/base/back-ini.mkiv index c3bc78ae660..2b0f054eea4 100644 --- a/Master/texmf-dist/tex/context/base/back-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/back-ini.mkiv @@ -51,8 +51,6 @@ %D Not everything here makes sense and the content of this file will %D definitely change. -\newcount\backendtransformlevel - \let \dostartrotation \gobbleoneargument \let \dostoprotation \donothing \let \dostartscaling \gobbletwoarguments @@ -157,7 +155,11 @@ % \setupbackend[space=yes] % replace spacing in (pdf) file \appendtoks - \ctxcommand{setrealspaces("\backendparameter\c!space")}% + \clf_setrealspaces{\backendparameter\c!space}% \to \everysetupbackend +%D For older styles: + +\let\setupoutput\gobbleoneoptional + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/back-pdf.lua b/Master/texmf-dist/tex/context/base/back-pdf.lua index 34a28e3f79f..7f0b1acc740 100644 --- a/Master/texmf-dist/tex/context/base/back-pdf.lua +++ b/Master/texmf-dist/tex/context/base/back-pdf.lua @@ -6,8 +6,24 @@ if not modules then modules = { } end modules ['back-pdf'] = { license = "see context related readme files" } +-- we could do \pdfmatrix sx <> sy <> etc + +local tonumber = tonumber +local sind, cosd = math.sind, math.cosd +local insert, remove = table.insert, table.remove + local codeinjections = backends.pdf.codeinjections +local context = context + +local scanners = tokens.scanners +local scanstring = scanners.string +local scannumber = scanners.number +local scaninteger = scanners.integer +local scankeyword = scanners.keyword + +local scanners = interfaces.scanners + local outputfilename function codeinjections.getoutputfilename() @@ -19,15 +35,11 @@ end backends.install("pdf") -local context = context - -local sind, cosd = math.sind, math.cosd -local insert, remove = table.insert, table.remove +local f_matrix = string.formatters["%F %F %F %F"] -- 0.8 is default -local f_matrix = string.formatters["%0.8F %0.8F %0.8F %0.8F"] - -function commands.pdfrotation(a) +scanners.pdfrotation = function() -- a -- todo: check for 1 and 0 and flush sparse + local a = scannumber() local s, c = sind(a), cosd(a) context(f_matrix(c,s,-s,c)) end @@ -38,27 +50,36 @@ end -- -- we could also do the save restore wrapping here + colorhack +local pdfsave = nodes.pool.pdfsave +local pdfrestore = nodes.pool.pdfrestore local pdfsetmatrix = nodes.pool.pdfsetmatrix -local stack = { } -local function popmatrix() - local top = remove(stack) - if top then - context(pdfsetmatrix(unpack(top))) - end -end +local stack = { } +local restore = true -- false -function commands.pdfstartrotation(a) +scanners.pdfstartrotation = function() -- a + local a = scannumber() if a == 0 then insert(stack,false) else local s, c = sind(a), cosd(a) + context(pdfsave()) context(pdfsetmatrix(c,s,-s,c)) - insert(stack,{ c, -s, s, c }) + insert(stack,restore and { c, -s, s, c } or true) end end -function commands.pdfstartscaling(sx,sy) +scanners.pdfstartscaling = function() -- sx sy + local sx, sy = 0, 0 + while true do + if scankeyword("sx") then + sx = scannumber() + elseif scankeyword("sy") then + sy = scannumber() + else + break + end + end if sx == 1 and sy == 1 then insert(stack,false) else @@ -68,25 +89,62 @@ function commands.pdfstartscaling(sx,sy) if sy == 0 then sy = 0.0001 end + context(pdfsave()) context(pdfsetmatrix(sx,0,0,sy)) - insert(stack,{ 1/sx, 0, 0, 1/sy }) + insert(stack,restore and { 1/sx, 0, 0, 1/sy } or true) end end -function commands.pdfstartmirroring() - context(pdfsetmatrix(-1,0,0,1)) -end - -function commands.pdfstartmatrix(sx,rx,ry,sy) -- tx, ty +scanners.pdfstartmatrix = function() -- sx rx ry sy -- tx, ty + local sx, rx, ry, sy = 0, 0, 0, 0 + while true do + if scankeyword("sx") then + sx = scannumber() + elseif scankeyword("sy") then + sy = scannumber() + elseif scankeyword("rx") then + rx = scannumber() + elseif scankeyword("ry") then + ry = scannumber() + else + break + end + end if sx == 1 and rx == 0 and ry == 0 and sy == 1 then insert(stack,false) else + context(pdfsave()) context(pdfsetmatrix(sx,rx,ry,sy)) - insert(stack,{ -sx, -rx, -ry, -sy }) + insert(stack,store and { -sx, -rx, -ry, -sy } or true) + end +end + +local function pdfstopsomething() + local top = remove(stack) + if top == false then + -- not wrapped + elseif top == true then + context(pdfrestore()) + elseif top then + context(pdfsetmatrix(unpack(top))) + context(pdfrestore()) + else + -- nesting error end end -commands.pdfstoprotation = popmatrix -commands.pdfstopscaling = popmatrix -commands.pdfstopmirroring = commands.pdfstartmirroring -commands.pdfstopmatrix = popmatrix +scanners.pdfstoprotation = pdfstopsomething +scanners.pdfstopscaling = pdfstopsomething +scanners.pdfstopmatrix = pdfstopsomething + +scanners.pdfstartmirroring = function() + context(pdfsetmatrix(-1,0,0,1)) +end + +scanners.pdfstopmirroring = scanners.pdfstartmirroring + +scanners.registerbackendsymbol = function() + backends.codeinjections.registersymbol(scanstring(),scaninteger()) +end + +-- todo : clipping diff --git a/Master/texmf-dist/tex/context/base/back-pdf.mkiv b/Master/texmf-dist/tex/context/base/back-pdf.mkiv index df959450739..38de4bbfd48 100644 --- a/Master/texmf-dist/tex/context/base/back-pdf.mkiv +++ b/Master/texmf-dist/tex/context/base/back-pdf.mkiv @@ -41,17 +41,31 @@ %D %D Here we initialize some internal quantities. We also protect them. -\pdfoutput 1 \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput 1 -\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in -\pdfvorigin 1 true in \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin 1 true in +\pdfoutput \plusone \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput \plusone -% most of these will be protected as well +%D These are already set: +\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in +\pdfvorigin \pdfhorigin \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin \pdfhorigin + +%D These too and most of them will be protected as well: + +\pdfminorversion \plusseven +\pdfgentounicode \plusone \let\pdfgentounicode \undefined \newcount\pdfgentounicode +\pdfinclusioncopyfonts \plusone \let\pdfinclusioncopyfonts \undefined \newcount\pdfinclusioncopyfonts +\pdfinclusionerrorlevel \zerocount \let\pdfinclusionerrorlevel\undefined \newcount\pdfinclusionerrorlevel +\pdfdecimaldigits \plusten \let\pdfdecimaldigits \undefined \newcount\pdfdecimaldigits \pdfimageresolution 300 \pdfpkresolution 600 -\pdfdecimaldigits 10 -\pdfinclusionerrorlevel 0 -\pdfminorversion 6 % use setupbackend for changes + +%D Let's block these (we could share a dummy: + +\let\pdfcatalog \relax \newtoks\pdfcatalog +\let\pdfinfo \relax \newtoks\pdfinfo +\let\pdfnames \relax \newtoks\pdfnames +\let\pdfpageresources\relax \newtoks\pdfpageresources +\let\pdfpageattr \relax \newtoks\pdfpageattr +\let\pdfpagesattr \relax \newtoks\pdfpagesattr %D This one can be consulted by users although the suffix is also %D a system mode. @@ -65,20 +79,20 @@ \appendtoks \doifsomething{\backendparameter{xmpfile}} - {\ctxcommand{setxmpfile("\backendparameter{xmpfile}")}}% + {\clf_setxmpfile{\backendparameter{xmpfile}}}% \to \everysetupbackend % \doifsomething{\backendparameter\c!format} .. at the lua end \appendtoks - \ctxcommand{setformat { - format = "\backendparameter\c!format", - level = "\backendparameter\c!level", - option = "\backendparameter\c!option", - profile = "\backendparameter\c!profile", - intent = "\backendparameter\c!intent", - file = "\backendparameter\c!file", - }}% + \clf_setformat + format {\backendparameter\c!format}% + level {\backendparameter\c!level}% + option {\backendparameter\c!option}% + profile {\backendparameter\c!profile}% + intent {\backendparameter\c!intent}% + file {\backendparameter\c!file}% + \relax \to \everysetupbackend %D For the moment we keep these. @@ -88,30 +102,22 @@ %D These are the only official methods to add stuff to the resources. -\unexpanded\def\pdfbackendsetcatalog #1#2{\ctxlua{lpdf.addtocatalog ("#1",\!!bs#2\!!es)}} -\unexpanded\def\pdfbackendsetinfo #1#2{\ctxlua{lpdf.addtoinfo ("#1",\!!bs#2\!!es)}} -\unexpanded\def\pdfbackendsetname #1#2{\ctxlua{lpdf.addtonames ("#1",\!!bs#2\!!es)}} +\unexpanded\def\pdfbackendsetcatalog #1#2{\clf_lpdf_addtocatalog {#1}{#2}} +\unexpanded\def\pdfbackendsetinfo #1#2{\clf_lpdf_addtoinfo {#1}{#2}} +\unexpanded\def\pdfbackendsetname #1#2{\clf_lpdf_addtonames {#1}{#2}} -\unexpanded\def\pdfbackendsetpageattribute #1#2{\ctxlua{lpdf.addtopageattributes ("#1",\!!bs#2\!!es)}} -\unexpanded\def\pdfbackendsetpagesattribute#1#2{\ctxlua{lpdf.addtopagesattributes("#1",\!!bs#2\!!es)}} -\unexpanded\def\pdfbackendsetpageresource #1#2{\ctxlua{lpdf.addtopageresources ("#1",\!!bs#2\!!es)}} +\unexpanded\def\pdfbackendsetpageattribute #1#2{\clf_lpdf_addtopageattributes {#1}{#2}} +\unexpanded\def\pdfbackendsetpagesattribute#1#2{\clf_lpdf_addtopagesattributes {#1}{#2}} +\unexpanded\def\pdfbackendsetpageresource #1#2{\clf_lpdf_addtopageresources {#1}{#2}} -\unexpanded\def\pdfbackendsetextgstate #1#2{\ctxlua{lpdf.adddocumentextgstate ("#1",lpdf.verbose(\!!bs#2\!!es))}} -\unexpanded\def\pdfbackendsetcolorspace #1#2{\ctxlua{lpdf.adddocumentcolorspace("#1",lpdf.verbose(\!!bs#2\!!es))}} -\unexpanded\def\pdfbackendsetpattern #1#2{\ctxlua{lpdf.adddocumentpattern ("#1",lpdf.verbose(\!!bs#2\!!es))}} -\unexpanded\def\pdfbackendsetshade #1#2{\ctxlua{lpdf.adddocumentshade ("#1",lpdf.verbose(\!!bs#2\!!es))}} +\unexpanded\def\pdfbackendsetextgstate #1#2{\clf_lpdf_adddocumentextgstate {#1}{#2}} +\unexpanded\def\pdfbackendsetcolorspace #1#2{\clf_lpdf_adddocumentcolorspace{#1}{#2}} +\unexpanded\def\pdfbackendsetpattern #1#2{\clf_lpdf_adddocumentpattern {#1}{#2}} +\unexpanded\def\pdfbackendsetshade #1#2{\clf_lpdf_adddocumentshade {#1}{#2}} - \def\pdfbackendcurrentresources {\cldcontext{lpdf.collectedresources()}} - \def\pdfcolor #1{\ctxlua{lpdf.pdfcolor(\thecolorattribute{#1})}} \let\PDFcolor\pdfcolor - -%D Let's block these: - -\let\pdfcatalog \relax \newtoks\pdfcatalog -\let\pdfinfo \relax \newtoks\pdfinfo -\let\pdfnames \relax \newtoks\pdfnames -\let\pdfpageresources\relax \newtoks\pdfpageresources -\let\pdfpageattr \relax \newtoks\pdfpageattr -\let\pdfpagesattr \relax \newtoks\pdfpagesattr + \def\pdfbackendcurrentresources {\clf_lpdf_collectedresources} + \def\pdfcolor #1{\clf_lpdf_color\numexpr\thecolorattribute{#1}\relax} + \let\PDFcolor\pdfcolor %D An example of usage is: @@ -120,99 +126,85 @@ \pdfbackendsetinfo{ConTeXt.Time} {\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute}% \pdfbackendsetinfo{ConTeXt.Jobname}{\jobname}% \pdfbackendsetinfo{ConTeXt.Url} {www.pragma-ade.com}% + \pdfbackendsetinfo{ConTeXt.Support}{contextgarden.net}% \to \everylastbackendshipout %D Transformations. Some day we will use primitives (once they're fixed). + % todo: inject at the lua end cq. deal with #5 and #6 too % % % rotation % % % -\unexpanded\def\dostartrotation#1% grouped - {\advance\backendtransformlevel\plusone - \forcecolorhack - \pdfsave - \pdfsetmatrix{\ctxcommand{pdfrotation(#1)}}} - -\unexpanded\def\dostoprotation - {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} - % \unexpanded\def\dostartrotation#1% grouped % {\forcecolorhack -% \advance\backendtransformlevel\plusone -% \ctxcommand{pdfstartrotation(#1)}} +% \pdfsave +% \pdfsetmatrix{\clf_pdfrotation#1}} % \unexpanded\def\dostoprotation -% {\ctxcommand{pdfstoprotation()}% -% \advance\backendtransformlevel\minusone} +% {\pdfrestore +% \forcecolorhack} -% % % scaling % % % +\unexpanded\def\dostartrotation#1% + {\forcecolorhack + \clf_pdfstartrotation#1\relax} -\unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged! - {\advance\backendtransformlevel\plusone - \forcecolorhack % maybe use signal instead - \pdfsave - \pdfsetmatrix - {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 - \ifdim#2\points=\zeropoint.0001\else#2\fi\space}}% 0 0 +\unexpanded\def\dostoprotation + {\clf_pdfstoprotation} -\unexpanded\def\dostopscaling - {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} +% % % scaling % % % % \unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged! -% {\forcecolorhack -% \advance\backendtransformlevel\plusone -% \ctxcommand{pdfstartscaling(#1,#2)}} +% {\forcecolorhack % maybe use signal instead +% \pdfsave +% \pdfsetmatrix +% {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 +% \ifdim#2\points=\zeropoint.0001\else#2\fi\space}}% 0 0 % \unexpanded\def\dostopscaling -% {\ctxcommand{pdfstopscaling()}% -% \advance\backendtransformlevel\minusone} +% {\pdfrestore +% \forcecolorhack} -% % % mirroring % % % +\unexpanded\def\dostartscaling#1#2% + {\forcecolorhack + \clf_pdfstartscaling sx #1 sy #2\relax} -\unexpanded\def\dostartmirroring - {\advance\backendtransformlevel\plusone - \forcecolorhack - \pdfsave - \pdfsetmatrix{-1 0 0 1}} % 0 0 +\unexpanded\def\dostopscaling + {\clf_pdfstopscaling} -\unexpanded\def\dostopmirroring - {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} +% % % mirroring % % % % \unexpanded\def\dostartmirroring -% {\advance\backendtransformlevel\plusone -% \ctxcommand{pdfstartmirroring()}} +% {\forcecolorhack +% \pdfsave +% \pdfsetmatrix{-1 0 0 1}} % 0 0 % \unexpanded\def\dostopmirroring -% {\ctxcommand{pdfstopmirroring()}% -% \advance\backendtransformlevel\minusone} +% {\pdfrestore +% \forcecolorhack} + +\unexpanded\def\dostartmirroring + {\clf_pdfstartmirroring} + +\unexpanded\def\dostopmirroring + {\clf_pdfstopmirroring} % % % transform % % % -\unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! - {\advance\backendtransformlevel\plusone - % fixing ht/dp/wd should happen elsewhere - \dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}} - -\unexpanded\def\dodotransformnextbox#1#2#3% - {%\forcecolorhack - \hbox - {\kern#1\onebasepoint - \raise#2\onebasepoint\hbox - {\pdfsave - \pdfsetmatrix{#3}% 0 0 (no #5 #6 yet) - \box\nextbox - \pdfrestore - \advance\backendtransformlevel\minusone}}} +% \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! +% {\dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}} + +% \unexpanded\def\dodotransformnextbox#1#2#3% +% {\hbox +% {\kern#1\onebasepoint +% \raise#2\onebasepoint\hbox +% {\pdfsave +% \pdfsetmatrix{#3}% 0 0 (no #5 #6 yet) +% \box\nextbox +% \pdfrestore +% }}} % \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! -% {\advance\backendtransformlevel\plusone -% % fixing ht/dp/wd should happen elsewhere +% {% fixing ht/dp/wd should happen elsewhere % \dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}} % \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6% @@ -220,17 +212,67 @@ % {\kern #5\onebasepoint % \raise#6\onebasepoint % \hbox -% {\ctxcommand{pdfstartmatrix(#1,#2,#3,#4)}% +% {\clf_pdfstartmatrix sx #1 rx #2 ry #3 sy #4\relax % \box\nextbox -% \ctxcommand{pdfstopmatrix()}% -% \advance\backendtransformlevel\minusone}}} +% \clf_pdfstopmatrix}}} + +\unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! + {\dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}} + +\unexpanded\def\dodotransformnextbox#1#2#3#4#5#6% + {\hbox + {\kern #5\onebasepoint + \raise#6\onebasepoint + \hbox + {\clf_pdfstartmatrix sx #1 rx #2 ry #3 sy #4\relax + \box\nextbox + \clf_pdfstopmatrix}}} + +% somehow the shift is not happening .. bug in luatex? +% +% \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6% +% {\ctxcommand{pdftransformbox(\number\nextbox,#1,#2,#3,#4,\number\dimexpr#5\onebasepoint,\number\dimexpr#6\onebasepoint)}% +% \box\nextbox} +% +% \startluacode +% function commands.pdftransformbox(box,sx,rx,ry,sy,tx,ty) +% if sx == 1 and rx == 0 and ry == 0 and sy == 1 then +% if tx == 0 and ty == 0 then +% local b = nodes.hpack(nodes.concat { +% nodes.pool.kern(tx), +% nodes.takebox(box), +% }) +% b.shift = -ty +% tex.setbox(box,b) +% else +% -- no need to transform +% end +% else +% local b = nodes.hpack(nodes.concat { +% nodes.pool.kern(tx), +% nodes.pool.pdfsave(), +% nodes.pool.pdfsetmatrix(sx,rx,ry,sy), +% nodes.takebox(box), +% nodes.pool.pdfsetmatrix(-sx,-rx,-ry,-sy), +% nodes.pool.pdfrestore(), +% }) +% b.shift = -ty +% tex.setbox(box,b) +% end +% end +% \stopluacode % % % clipping % % % \unexpanded\def\dostartclipping#1#2#3% we can move this to lua and only set a box here {\PointsToBigPoints{#2}\width \PointsToBigPoints{#3}\height - \meta_grab_clip_path{#1}\width\height{0 0 m \width\space 0 l \width \height l 0 \height l}% + \meta_grab_clip_path{#1}\width\height{% + 0 0 m % + \width\space 0 l % + \width\space \height\space l % + 0 \height\space l% + }% \pdfliteral{q 0 w \MPclippath\space W n}} \unexpanded\def\dostopclipping @@ -270,13 +312,13 @@ {\the\pdfbackendeveryxform \finalizeobjectbox\objectbox \immediate\pdfxform resources {\pdfbackendcurrentresources}\objectbox - \dosetobjectreference{#1}{#2}{\the\pdflastxform}} + \dosetobjectreference{#1}{#2}\pdflastxform} \let\m_back_object_reference\empty -\def\doinsertobject#1#2% +\unexpanded\def\doinsertobject#1#2% {\begingroup - \doifobjectreferencefoundelse{#1}{#2} + \doifelseobjectreferencefound{#1}{#2} {\dogetobjectreference{#1}{#2}\m_back_object_reference \pdfrefxform\m_back_object_reference}% \donothing @@ -284,12 +326,12 @@ \let\lastpredefinedsymbol\empty % some day we can do more at the lua end -\def\predefinesymbol[#1]% +\unexpanded\def\predefinesymbol[#1]% {\begingroup \xdef\lastpredefinedsymbol{#1}% \settightobject{SYM}{#1}\hbox{\symbol[#1]}% to be checked ... maybe only fitting \dogetobjectreference{SYM}{#1}\m_back_object_reference - \ctxlua{backends.codeinjections.registersymbol("#1",\m_back_object_reference)}% + \clf_registerbackendsymbol{#1}\m_back_object_reference\relax \endgroup} % for the moment here @@ -527,7 +569,7 @@ \xmin \space \ymin \space \xmin \space \yymin\space y \or % 28 \fi - \ifnum\mode>8\space + \ifnum\mode>\pluseight\space S \else \ifnum\dostroke=\plusone S \fi @@ -541,13 +583,15 @@ \box\scratchbox \egroup} -\unexpanded\def\pdfactualtext#1#2% not interfaced - {\pdfliteral direct{/Span <> BDC}% +\unexpanded\def\pdfbackendactualtext#1#2% not interfaced + {\clf_startactualtext{#2}% #1% - \pdfliteral direct{EMC}} + \clf_stopactualtext} + +\let\pdfactualtext\pdfbackendactualtext % \starttext -% text \pdfactualtext{Meier}{Müller} text +% text \pdfbackendactualtext{Meier}{Müller} text % \stoptext \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv index d9010294d55..80d04099bd2 100644 --- a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv +++ b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv @@ -320,7 +320,7 @@ % [\c!sorttype=\v!cite, % \c!sort=no] -% \long\unexpanded\def\startpublication#1\stoppublication +% \unexpanded\def\startpublication#1\stoppublication % {\blank % todo % \blank} @@ -628,7 +628,7 @@ \strc_lists_place_current {\currentbibtexsession} {\currentbibtexcriterium} - {\namedlistparameter\currentbibtexsession\c!number}% + {}% {\namedlistparameter\currentbibtexsession\c!extras}% {\namedlistparameter\currentbibtexsession\c!order}% \ctxlua{bibtex.hacks.flush("\bibtexpublicationsparameter\c!sorttype")}% @@ -648,7 +648,7 @@ \fi\fi} \def\dotypesetbibtexpublication - {\doifbibreferencefoundelse\currentbibtexsessiontag + {\doifelsebibreferencefound\currentbibtexsessiontag {\global\advance\bibtexcounter\plusone \ctxlua{bibtex.hacks.registerplaced("\currentbibtexsessiontag")}% \let\currentlist\currentbibtexsession @@ -680,13 +680,13 @@ \unexpanded\def\bibtexcitation[#1]% {\edef\currentbibtexsession{#1}% - \strictdoifnextoptionalelse\dobibtexcitation\dobibtexref} + \strictdoifelsenextoptional\dobibtexcitation\dobibtexref} \def\dobibtexref#1% {\dodobibtexcitation[#1][]} \def\dobibtexcitation[#1]% - {\strictdoifnextoptionalelse{\dodobibtexcitation[#1]}{\dodobibtexcitation[#1][]}} + {\strictdoifelsenextoptional{\dodobibtexcitation[#1]}{\dodobibtexcitation[#1][]}} \def\dodobibtexcitation[#1][#2]% {\dontleavehmode @@ -702,7 +702,7 @@ \def\dowhatevercitation#1#2% {\processcommalist[#2]\dobibtexcitationindeed \setupinteraction[\c!style=]% use flag instead - \doifassignmentelse{#1} + \doifelseassignment{#1} {\getparameters[\??pb\??pb][\c!alternative=,\c!extras=,#1]% \edef\currentbibtexvariant{\@@pb@@pbalternative}% \ifx\currentbibtexvariant\empty @@ -808,7 +808,7 @@ % helpers -\def\doifbibtexinteractionelse +\unexpanded\def\doifelsebibtexinteraction {\iflocation \edef\temp{\bibtexcitationparameter\c!interaction}% \ifx\temp\v!stop @@ -820,6 +820,8 @@ \@EA\secondoftwoarguments \fi} +\let\doifbibtexinteractionelse\doifelsebibtexinteraction + % variants % todo: lastsep here @@ -837,23 +839,23 @@ \fi} \def\inbibtexlink#1#2% - {\doifreferencefoundelse{\bibtexrefprefix#1} + {\doifelsereferencefound{\bibtexrefprefix#1} {\goto{#2}[\bibtexrefprefix#1]} {!#1!}} \def\dobibtexgotolink#1#2% - {\doifreferencefoundelse{\bibtexrefprefix#1} + {\doifelsereferencefound{\bibtexrefprefix#1} {\goto{#2}[\bibtexrefprefix#1]} {!#1!}} \def\dobibattexlink#1#2% - {\doifreferencefoundelse{\bibtexrefprefix#1} + {\doifelsereferencefound{\bibtexrefprefix#1} {\at{#2}[\bibtexrefprefix#1]} {!#1!}} \def\dobibtexurllink#1#2% {\expanded{\useURL[bibtex:url:#1][#2]}% - \doifbibtexinteractionelse + \doifelsebibtexinteraction {\goto{\url[bibtex:url:#1]}[url(bibtex:url:#1)]} {\url[bibtex:url:#1]}} diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkii b/Master/texmf-dist/tex/context/base/bibl-tra.mkii index a9ce392a22a..868ca0fc681 100644 --- a/Master/texmf-dist/tex/context/base/bibl-tra.mkii +++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkii @@ -642,8 +642,7 @@ %D If you want to write an extension to the styles, you might %D as well define some of these commands yourself. %D -%D The argument liust has been reordered here, and the meanings -%D are: +%D The argument list has been reordered here, and the meanings are: %D %D {\obeylines\parskip0pt %D \type{#1} firstnames diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv index 06af7e11d21..4c9e83fdf9d 100644 --- a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv +++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv @@ -450,8 +450,8 @@ \unexpanded\def\bibinsertmonth#1#2#3% {\bibdoifelse\@@pb@month - {#1\doifnumberelse\@@pb@month - {\doifconversiondefinedelse\@@pbmonthconversion + {#1\doifelsenumber\@@pb@month + {\doifelseconversiondefined\@@pbmonthconversion {\convertnumber\@@pbmonthconversion\@@pb@month}{\@@pb@month}}% {\@@pb@month}#2}% {#3}} @@ -686,10 +686,10 @@ \unexpanded\def\dostartpublication[#1]% {\begingroup - \doifassignmentelse{#1}% + \doifelseassignment{#1}% {\getparameters[\??pb][k=\s!unknown,t=article,n=,s=,a=,y=,o=,u=,#1]}% {\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}% - \ctxlua{bibtex.hacks.register("\@@pbk","\@@pbs")}% + \ctxlua{bibtex.hacks.register(\!!bs\@@pbk\!!es,\!!bs\@@pbs\!!es)}% \catcode\commentasciicode\othercatcode \dodostartpublication} @@ -717,12 +717,14 @@ \def\bibgetvaru#1{\csname pbd:#1\endcsname\pluseight} \def\bibgetvard#1{\csname pbd:#1\endcsname\plusnine } -\unexpanded\def\doifbibreferencefoundelse#1% +\unexpanded\def\doifelsebibreferencefound#1% {\preloadbiblist - \doifdefinedelse{pbd:#1} + \doifelsedefined{pbd:#1} \firstoftwoarguments {\showmessage\m!publications{5}{#1,\the\inputlineno}\secondoftwoarguments}} +\let\doifbibreferencefoundelse\doifelsebibreferencefound + %D \macros{bib@crossref} %D %D \type{\crossref} is used in database files to point to another @@ -765,7 +767,7 @@ \strc_lists_place_current {pubs}% {\listparameter\c!criterium}% - {\listparameter\c!number}% + {}% {\listparameter\c!extras}% {\listparameter\c!order}}% \ctxlua{bibtex.hacks.flush("\@@pbsorttype")}% @@ -878,7 +880,7 @@ % we'll define proper handlers later \unexpanded\def\doplacepublicationindeed#1% - {\doifbibreferencefoundelse{#1} + {\doifelsebibreferencefound{#1} {\global\advance\bibtexcounter\plusone \def\currentpublicationkey{#1}% \ctxlua{bibtex.hacks.registerplaced("#1")}% @@ -932,13 +934,13 @@ %D in included data from the \type{.bib} file). \unexpanded\def\cite - {\strictdoifnextoptionalelse\dodocite\dobibref} + {\strictdoifelsenextoptional\dodocite\dobibref} \unexpanded\def\dobibref#1% {\docite[#1][]} \unexpanded\def\dodocite[#1]% - {\strictdoifnextoptionalelse{\docite[#1]}{\docite[#1][]}} + {\strictdoifelsenextoptional{\docite[#1]}{\docite[#1][]}} \unexpanded\def\docite[#1][#2]% {\begingroup @@ -953,7 +955,7 @@ \unexpanded\def\dowhatevercite#1#2% {\processcommalist[#2]\docitation \setupinteraction[\c!style=]% - \doifassignmentelse + \doifelseassignment {#1}% {\getparameters[LO][\c!alternative=,\c!extras=,#1]% \edef\@@currentalternative{\LOalternative}% @@ -1007,7 +1009,7 @@ \unexpanded\def\getcitedata#1[#2]#3[#4]#5to#6% {\bgroup \dofetchapublication{#4}% - \doifdefinedelse{\??pb @bib#2}% + \doifelsedefined{\??pb @bib#2}% {\xdef#6{\getvalue{\??pb @bib#2}}}% {\xdef#6{\getvalue{\??pb @#2}}}% \egroup} @@ -1139,7 +1141,7 @@ %D but it will do for now. \unexpanded\def\docurrentbibauthor#1,#2% - {\doifemptyelse{#2} + {\doifelseempty{#2} {\def\currentbibauthor{#1\bibalternative{otherstext}}} {\expandafter\ifx\csname\??pv\@@currentalternative authoretallimit\endcsname\relax \edef\currentbibauthor{#1\bibalternative{andtext}#2}% @@ -1154,7 +1156,7 @@ %D \type{\doglobal } \unexpanded\def\robustaddtocommalist#1#2% {item} \cs - {\robustdoifinsetelse{#1}#2\resetglobal + {\robustdoifelseinset{#1}#2\resetglobal {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}} %D \macros{donormalbibauthoryear} @@ -1165,7 +1167,7 @@ \unexpanded\def\donormalbibauthoryear#1% {\def\myauthor{Xxxxxxxxxx}% \def\myyear{0000}% - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\def\myauthor{{\bibgetvara{#1}}}% \def\myyear {\bibgetvary{#1}}}% {}% @@ -1181,7 +1183,7 @@ \unexpanded\def\docompressbibauthoryear#1% {\def\myauthor{Xxxxxxxxxx}% \def\myyear {0000}% - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\xdef\myauthor{\bibgetvara{#1}}% \xdef\myyear {\bibgetvary{#1}}} {}% @@ -1202,7 +1204,7 @@ %D information in the correct item of \type{\thebibyears} \unexpanded\def\checkifmyauthoralreadyexists - {\doifemptyelsevalue{thebibauthors} + {\doifelseemptyvalue{thebibauthors} {\global\bibitemwanted \plusone \global\bibitemcounter\plusone \xdef\thebibauthors{{\myauthor}}} @@ -1250,9 +1252,9 @@ %D Beware, we can have cites without reference match. -\unexpanded\def\gotobiblink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}} -\unexpanded\def\atbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}} -\unexpanded\def\inbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}} +\unexpanded\def\gotobiblink#1[#2]{\doifelsereferencefound{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}} +\unexpanded\def\atbiblink [#1]{\doifelsereferencefound{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}} +\unexpanded\def\inbiblink [#1]{\doifelsereferencefound{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}} %D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref} %D @@ -1260,7 +1262,7 @@ %D \type{\ixbibauthoryearref} stores the data in the macros %D \type{\currentbibauthor} and \type{\currentbibyear}. -\unexpanded\def\doifbibinteractionelse +\unexpanded\def\doifelsebibinteraction {\iflocation \edef\test{\bibalternative\c!interaction}% \ifx\test\v!stop @@ -1272,8 +1274,10 @@ \expandafter\secondoftwoarguments \fi} +\let\doifbibinteractionelse\doifelsebibinteraction + \unexpanded\def\bibmaybeinteractive#1#2% - {\doifbibinteractionelse{\gotobiblink{#2}[#1]}{#2}} + {\doifelsebibinteraction{\gotobiblink{#2}[#1]}{#2}} \unexpanded\def\bibauthoryearref[#1]% {\ixbibauthoryear{#1}% @@ -1338,7 +1342,7 @@ \unexpanded\def\dobibshortref#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\gotobiblink{\bibgetvars{#1}}[#1]} {}} @@ -1349,7 +1353,7 @@ \unexpanded\def\dobibserialref#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\gotobiblink{\bibgetvarn{#1}}[#1]} {}} @@ -1363,7 +1367,7 @@ \gotobiblink{#1}[#1]} \unexpanded\def\bibgotoDOI#1#2% - {\doifbibinteractionelse + {\doifelsebibinteraction {\useURL[bibfooDoi#1][#2]% \useURL[bibfoo#1][http://dx.doi.org/#2]% \goto{\url[bibfooDoi#1]}[url(bibfoo#1)]} @@ -1376,7 +1380,7 @@ \unexpanded\def\dobibdoiref#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\expanded{\bibgotoDOI{#1}{\bibgetvaro{#1}}}} {}} @@ -1386,13 +1390,13 @@ \bibalternative\v!right} \unexpanded\def\bibgotoURL#1#2% - {\doifbibinteractionelse + {\doifelsebibinteraction {\useURL[bibfoo#1][#2]\goto{\url[bibfoo#1]}[url(bibfoo#1)]} {\hyphenatedurl{#2}}} \unexpanded\def\dobiburlref#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\expanded{\bibgotoURL{#1}{\bibgetvaru{#1}}}} {}} @@ -1403,7 +1407,7 @@ \unexpanded\def\dobibtyperef#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\gotobiblink{\bibgetvart{#1}}[#1]} {}} @@ -1414,7 +1418,7 @@ \unexpanded\def\dobibpageref#1% {\bibinsertrefsep - \doifbibinteractionelse + \doifelsebibinteraction {\atbiblink[#1]} {{\referencingfalse\at[#1]}}} @@ -1425,7 +1429,7 @@ \unexpanded\def\dobibdata#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\dotypesetapublication{#1}} {}} @@ -1476,7 +1480,7 @@ \unexpanded\def\dobibauthornumref#1% {\bibinsertrefsep - \doifbibreferencefoundelse{#1} + \doifelsebibreferencefound{#1} {\begingroup \cite[\c!left=,\c!right=,\c!alternative=\v!author][#1]% \bibalternative\c!inbetween diff --git a/Master/texmf-dist/tex/context/base/blob-ini.lua b/Master/texmf-dist/tex/context/base/blob-ini.lua index 32fac766254..b837250ce70 100644 --- a/Master/texmf-dist/tex/context/base/blob-ini.lua +++ b/Master/texmf-dist/tex/context/base/blob-ini.lua @@ -45,6 +45,8 @@ local tohpackfast = typesetters.tohpackfast local tovpack = typesetters.tovpack local tovpackfast = typesetters.tovpackfast +local implement = interfaces.implement + blobs = blobs or { } -- provide copies here (nicer for manuals) @@ -195,18 +197,7 @@ blobs.strht = strht blobs.strdp = strdp blobs.strhd = strhd -function commands.strwd(str) context(strwd(str)) end -function commands.strht(str) context(strht(str)) end -function commands.strdp(str) context(strdp(str)) end -function commands.strhd(str) context(strhd(str)) end - --- less efficient: --- --- function commands.widthof(str) --- local b = blobs.new() --- blobs.append(b,str) --- blobs.pack(b) --- local w = blobs.dimensions(b) --- context(number.todimen(w)) --- blobs.dispose(b) --- end +implement { name = "strwd", arguments = "string", actions = { strwd, context } } +implement { name = "strht", arguments = "string", actions = { strht, context } } +implement { name = "strdp", arguments = "string", actions = { strdp, context } } +implement { name = "strhd", arguments = "string", actions = { strhd, context } } diff --git a/Master/texmf-dist/tex/context/base/blob-ini.mkiv b/Master/texmf-dist/tex/context/base/blob-ini.mkiv index 1dfb766f459..64582c0db59 100644 --- a/Master/texmf-dist/tex/context/base/blob-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/blob-ini.mkiv @@ -27,10 +27,10 @@ % this one takes simple (utf) strings -\def\wdofstring#1{\dimexpr\ctxcommand{strwd(\!!bs#1\!!es)}\scaledpoint\relax} -\def\htofstring#1{\dimexpr\ctxcommand{strht(\!!bs#1\!!es)}\scaledpoint\relax} -\def\dpofstring#1{\dimexpr\ctxcommand{strdp(\!!bs#1\!!es)}\scaledpoint\relax} -\def\hdofstring#1{\dimexpr\ctxcommand{strhd(\!!bs#1\!!es)}\scaledpoint\relax} +\def\wdofstring#1{\dimexpr\clf_strwd{#1}\scaledpoint\relax} +\def\htofstring#1{\dimexpr\clf_strht{#1}\scaledpoint\relax} +\def\dpofstring#1{\dimexpr\clf_strdp{#1}\scaledpoint\relax} +\def\hdofstring#1{\dimexpr\clf_strhd{#1}\scaledpoint\relax} \def\widthofstring {\the\wdofstring} \def\heightofstring {\the\htofstring} diff --git a/Master/texmf-dist/tex/context/base/buff-imp-default.lua b/Master/texmf-dist/tex/context/base/buff-imp-default.lua index 72a49d6253b..79f01c47d31 100644 --- a/Master/texmf-dist/tex/context/base/buff-imp-default.lua +++ b/Master/texmf-dist/tex/context/base/buff-imp-default.lua @@ -20,7 +20,7 @@ local grammar = { "visualizer", beginline = makepattern(handler,"beginline",patterns.beginline), newline = makepattern(handler,"newline", patterns.newline), space = makepattern(handler,"space", patterns.space), - default = makepattern(handler,"default", patterns.utf8char), + default = makepattern(handler,"default", patterns.utf8character), content = makepattern(handler,"default", patterns.somecontent), -- not too efficient -- handy diff --git a/Master/texmf-dist/tex/context/base/buff-imp-lua.lua b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua index 4396c1ab8a1..e873a34d182 100644 --- a/Master/texmf-dist/tex/context/base/buff-imp-lua.lua +++ b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua @@ -159,11 +159,11 @@ end local grammar = visualizers.newgrammar("default", { "visualizer", sstring = makepattern(handler,"quote",patterns.dquote) - * (V("whitespace") + makepattern(handler,"string",1-patterns.dquote))^0 -- patterns.nodquote + * (V("whitespace") + makepattern(handler,"string",(1-patterns.dquote-V("whitespace"))^1))^0 -- patterns.nodquote * makepattern(handler,"quote",patterns.dquote), dstring = makepattern(handler,"quote",patterns.squote) - * (V("whitespace") + makepattern(handler,"string",1-patterns.squote))^0 -- patterns.nosquote + * (V("whitespace") + makepattern(handler,"string",(1-patterns.squote-V("whitespace"))^1))^0 -- patterns.nosquote * makepattern(handler,"quote",patterns.squote), longstring = longstring / long, diff --git a/Master/texmf-dist/tex/context/base/buff-ini.lua b/Master/texmf-dist/tex/context/base/buff-ini.lua index c4046d649ed..1ad3c905ade 100644 --- a/Master/texmf-dist/tex/context/base/buff-ini.lua +++ b/Master/texmf-dist/tex/context/base/buff-ini.lua @@ -11,6 +11,8 @@ local type, next, load = type, next, load local sub, format = string.sub, string.format local splitlines, validstring = string.splitlines, string.valid local P, Cs, patterns, lpegmatch = lpeg.P, lpeg.Cs, lpeg.patterns, lpeg.match +local utfchar = utf.char +local totable = string.totable local trace_run = false trackers.register("buffers.run", function(v) trace_run = v end) local trace_grab = false trackers.register("buffers.grab", function(v) trace_grab = v end) @@ -23,6 +25,21 @@ local report_grabbing = logs.reporter("buffers","grabbing") local context = context local commands = commands +local implement = interfaces.implement + +local scanners = tokens.scanners +local scanstring = scanners.string +local scaninteger = scanners.integer +local scanboolean = scanners.boolean +local scancode = scanners.code +local scantoken = scanners.token + +local getters = tokens.getters +local gettoken = getters.token + +local compilescanner = tokens.compile +local scanners = interfaces.scanners + local variables = interfaces.variables local settings_to_array = utilities.parsers.settings_to_array local formatters = string.formatters @@ -33,6 +50,8 @@ local registertempfile = luatex.registertempfile local v_yes = variables.yes +local p_whitespace = patterns.whitespace + local catcodenumbers = catcodes.numbers local ctxcatcodes = catcodenumbers.ctxcatcodes @@ -165,17 +184,28 @@ buffers.loadcontent = loadcontent -- the context interface -commands.erasebuffer = erase -commands.assignbuffer = assign +implement { + name = "assignbuffer", + actions = assign, + arguments = { "string", "string", "integer" } +} + +implement { + name = "erasebuffer", + actions = erase, + arguments = "string" +} local anything = patterns.anything local alwaysmatched = patterns.alwaysmatched +local utf8character = patterns.utf8character local function countnesting(b,e) local n local g = P(b) / function() n = n + 1 end + P(e) / function() n = n - 1 end - + anything + -- + anything + + utf8character local p = alwaysmatched / function() n = 0 end * g^0 * alwaysmatched / function() return n end @@ -232,7 +262,7 @@ local continue = false -- how about tabs -local getmargin = (Cs(P(" ")^1)*P(-1)+1)^1 +local getmargin = (Cs(P(" ")^1)*P(-1)+1)^1 -- 1 or utf8character local eol = patterns.eol local whatever = (P(1)-eol)^0 * eol^1 @@ -255,51 +285,162 @@ local function undent(str) -- new version, needs testing: todo: not always neede return lpegmatch(stripper,str) or str end -function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes,doundent) -- maybe move \\ to call - local dn = getcontent(name) - if dn == "" then - nesting = 0 - continue = false - end - if trace_grab then - if #bufferdata > 30 then - report_grabbing("%s => |%s..%s|",name,sub(bufferdata,1,10),sub(bufferdata,-10,#bufferdata)) +buffers.undent = undent + +-- function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes,doundent) -- maybe move \\ to call +-- local dn = getcontent(name) +-- if dn == "" then +-- nesting = 0 +-- continue = false +-- end +-- if trace_grab then +-- if #bufferdata > 30 then +-- report_grabbing("%s => |%s..%s|",name,sub(bufferdata,1,10),sub(bufferdata,-10,#bufferdata)) +-- else +-- report_grabbing("%s => |%s|",name,bufferdata) +-- end +-- end +-- local counter = counters[begintag] +-- if not counter then +-- counter = countnesting(begintag,endtag) +-- counters[begintag] = counter +-- end +-- nesting = nesting + lpegmatch(counter,bufferdata) +-- local more = nesting > 0 +-- if more then +-- dn = dn .. sub(bufferdata,2,-1) .. endtag +-- nesting = nesting - 1 +-- continue = true +-- else +-- if continue then +-- dn = dn .. sub(bufferdata,2,-2) -- no \r, \n is more generic +-- elseif dn == "" then +-- dn = sub(bufferdata,2,-2) +-- else +-- dn = dn .. "\n" .. sub(bufferdata,2,-2) -- no \r, \n is more generic +-- end +-- local last = sub(dn,-1) +-- if last == "\n" or last == "\r" then -- \n is unlikely as \r is the endlinechar +-- dn = sub(dn,1,-2) +-- end +-- if doundent or (autoundent and doundent == nil) then +-- dn = undent(dn) +-- end +-- end +-- assign(name,dn,catcodes) +-- commands.doifelse(more) +-- end + +function tokens.pickup(start,stop) + local stoplist = totable(stop) + local stoplength = #stoplist + local stoplast = stoplist[stoplength] + local startlist = totable(start) + local startlength = #startlist + local startlast = startlist[startlength] + local list = { } + local size = 0 + local depth = 0 + while true do -- or use depth + local char = scancode() + if char then + char = utfchar(char) + size = size + 1 + list[size] = char + if char == stoplast and size >= stoplength then + local done = true + local last = size + for i=stoplength,1,-1 do + if stoplist[i] ~= list[last] then + done = false + break + end + last = last - 1 + end + if done then + if depth > 0 then + depth = depth - 1 + else + break + end + char = false -- trick: let's skip the next (start) test + end + end + if char == startlast and size >= startlength then + local done = true + local last = size + for i=startlength,1,-1 do + if startlist[i] ~= list[last] then + done = false + break + end + last = last - 1 + end + if done then + depth = depth + 1 + end + end else - report_grabbing("%s => |%s|",name,bufferdata) + -- local t = scantoken() + local t = gettoken() + if t then + -- we're skipping leading stuff, like obeyedlines and relaxes + else + break + end end end - local counter = counters[begintag] - if not counter then - counter = countnesting(begintag,endtag) - counters[begintag] = counter - end - nesting = nesting + lpegmatch(counter,bufferdata) - local more = nesting > 0 - if more then - dn = dn .. sub(bufferdata,2,-1) .. endtag - nesting = nesting - 1 - continue = true - else - if continue then - dn = dn .. sub(bufferdata,2,-2) -- no \r, \n is more generic - elseif dn == "" then - dn = sub(bufferdata,2,-2) + local start = 1 + local stop = size-stoplength-1 + for i=start,stop do + if lpegmatch(p_whitespace,list[i]) then + start = i + 1 else - dn = dn .. "\n" .. sub(bufferdata,2,-2) -- no \r, \n is more generic - end - local last = sub(dn,-1) - if last == "\n" or last == "\r" then -- \n is unlikely as \r is the endlinechar - dn = sub(dn,1,-2) + break end - if doundent or (autoundent and doundent == nil) then - dn = undent(dn) + end + for i=stop,start,-1 do + if lpegmatch(p_whitespace,list[i]) then + stop = i - 1 + else + break end end - assign(name,dn,catcodes) - commands.doifelse(more) + if start <= stop then + return concat(list,"",start,stop) + else + return "" + end end -function commands.savebuffer(list,name,prefix) -- name is optional +-- function buffers.pickup(name,start,stop,finish,catcodes,doundent) +-- local data = tokens.pickup(start,stop) +-- if doundent or (autoundent and doundent == nil) then +-- data = buffers.undent(data) +-- end +-- buffers.assign(name,data,catcodes) +-- context(finish) +-- end + +-- commands.pickupbuffer = buffers.pickup + +scanners.pickupbuffer = function() + local name = scanstring() + local start = scanstring() + local stop = scanstring() + local finish = scanstring() + local catcodes = scaninteger() + local doundent = scanboolean() + local data = tokens.pickup(start,stop) + if doundent or (autoundent and doundent == nil) then + data = buffers.undent(data) + end + buffers.assign(name,data,catcodes) + -- context[finish]() + context(finish) +end + +local function savebuffer(list,name,prefix) -- name is optional if not list or list == "" then list = name end @@ -316,47 +457,18 @@ function commands.savebuffer(list,name,prefix) -- name is optional io.savedata(name,content) end --- local files = { } --- local last = 0 --- --- function commands.runbuffer(name,encapsulate) -- we used to compare the saved file with content --- local names = getnames(name) --- local filename = files[name] --- local tobedone = not istypeset(names) --- if tobedone or not filename then --- last = last + 1 --- filename = formatters["%s-typeset-buffer-%03i"](tex.jobname,last) --- files[name] = filename --- end --- if tobedone then --- if trace_run then --- report_typeset("changes in %a, processing forced",name) --- end --- local filename = addsuffix(filename,"tmp") --- local content = collectcontent(names,nil) or "" --- if content == "" then --- content = "empty buffer" --- end --- if encapsulate then --- content = formatters["\\starttext\n%s\n\\stoptext\n"](content) --- end --- io.savedata(filename,content) --- local command = formatters["context %s %s"](jit and "--jit" or "",filename) --- report_typeset("running: %s\n",command) --- os.execute(command) --- markastypeset(names) --- elseif trace_run then --- report_typeset("no changes in %a, not processed",name) --- end --- context(replacesuffix(filename,"pdf")) --- end +implement { + name = "savebuffer", + actions = savebuffer, + arguments = { "string", "string", "string" } +} -- we can consider adding a size to avoid unlikely clashes local oldhashes = nil local newhashes = nil -function commands.runbuffer(name,encapsulate) +local function runbuffer(name,encapsulate) if not oldhashes then oldhashes = job.datasets.getdata("typeset buffers","hashes") or { } for hash, n in next, oldhashes do @@ -402,10 +514,10 @@ function commands.runbuffer(name,encapsulate) registertempfile(filename) registertempfile(resultname,nil,true) -- - context(resultname) + return resultname end -function commands.getbuffer(name) +local function getbuffer(name) local str = getcontent(name) if str ~= "" then -- characters.showstring(str) @@ -413,11 +525,11 @@ function commands.getbuffer(name) end end -function commands.getbuffermkvi(name) -- rather direct ! +local function getbuffermkvi(name) -- rather direct ! context.viafile(resolvers.macros.preprocessed(getcontent(name)),formatters["buffer.%s.mkiv"](validstring(name,"noname"))) end -function commands.gettexbuffer(name) +local function gettexbuffer(name) local buffer = name and cache[name] if buffer and buffer.data ~= "" then context.pushcatcodetable() @@ -432,20 +544,29 @@ function commands.gettexbuffer(name) end end -commands.getbufferctxlua = loadcontent +implement { name = "getbufferctxlua", actions = loadcontent, arguments = "string" } +implement { name = "getbuffer", actions = getbuffer, arguments = "string" } +implement { name = "getbuffermkvi", actions = getbuffermkvi, arguments = "string" } +implement { name = "gettexbuffer", actions = gettexbuffer, arguments = "string" } -function commands.doifelsebuffer(name) - commands.doifelse(exists(name)) -end +implement { + name = "runbuffer", + actions = { runbuffer, context }, + arguments = { "string", true } +} + +implement { + name = "doifelsebuffer", + actions = { exists, commands.doifelse }, + arguments = "string" +} -- This only used for mp buffers and is a kludge. Don't change the -- texprint into texsprint as it fails because "penddef" becomes -- "penddef" then. --- function commands.feedback(names) --- texprint(ctxcatcodes,splitlines(collectcontent(names))) --- end - -function commands.feedback(names) -- bad name, maybe rename to injectbuffercontent - context.printlines(collectcontent(names)) -end +implement { + name = "feedback", -- bad name, maybe rename to injectbuffercontent + actions = { collectcontent, context.printlines }, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/buff-ini.mkiv b/Master/texmf-dist/tex/context/base/buff-ini.mkiv index 6582e35877a..24bb729e1a4 100644 --- a/Master/texmf-dist/tex/context/base/buff-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/buff-ini.mkiv @@ -23,13 +23,15 @@ \let\currentbuffer\empty \def\doifelsebuffer#1% - {\ctxcommand{doifelsebuffer("#1")}} + {\clf_doifelsebuffer{#1}} + +\let\doifbufferelse\doifelsebuffer \unexpanded\def\resetbuffer {\dosingleempty\buff_reset} \def\buff_reset[#1]% - {\ctxcommand{erasebuffer("#1")}} + {\clf_erasebuffer{#1}} \setuvalue{\e!start\v!buffer}% {\begingroup % (3) @@ -39,7 +41,10 @@ \def\buff_start[#1][#2]% {\buff_start_indeed{}{#1}{\e!start\v!buffer}{\e!stop\v!buffer}} -\def\buff_start_indeed#1#2#3#4#5% \donothing needed ! #5=undent) +% \def\buff_start_indeed#1#2#3#4#5% \donothing needed ! #5=undent) +% {\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}\plusone}} + +\def\buff_start_indeed#1#2#3#4% {\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}\plusone}} \unexpanded\def\grabbufferdata % was: \dostartbuffer @@ -64,35 +69,70 @@ \let\buff_finish\relax \let\buff_gobble\relax +% \unexpanded\def\buff_pickup#1#2#3#4#5#6% name, startsequence, stopsequence, before, after, undent +% {\begingroup % (1) +% #4% +% \begingroup % (2) +% \edef\catcodetableofbuffer{\number\catcodetable}% +% \clf_erasebuffer{#1}% +% \setcatcodetable\vrbcatcodes +% \def\buff_finish +% {\endgroup % (1) +% \endgroup % (2) +% #5}% +% \def\buff_gobble##1#3% is detokenize needed? TEST +% %{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ? +% {\ctxcommand{grabbuffer("#1","#2","#3",\!!bs>##1\!!es,\catcodetableofbuffer,\ifnum#6=\plusone true\else false\fi)}% space ? +% \buff_gobble +% \buff_finish}% +% \buff_gobble} + +% % \def\startgrab +% % {\begingroup +% % \setcatcodetable\vrbcatcodes +% % \ctxlua{tokens.pickup("\\startgrab","\\stopgrab") context("\\endgroup")}} +% % +% % \def\stopgrab +% % {} + \unexpanded\def\buff_pickup#1#2#3#4#5#6% name, startsequence, stopsequence, before, after, undent {\begingroup % (1) #4% \begingroup % (2) - \edef\catcodetableofbuffer{\number\catcodetable}% - \ctxcommand{erasebuffer("#1")}% + \scratchcounter\catcodetable + \clf_erasebuffer{#1}% \setcatcodetable\vrbcatcodes - \def\buff_finish + \unexpanded\def\dofinishpickupbuffer {\endgroup % (1) \endgroup % (2) #5}% - \def\buff_gobble##1#3% is detokenize needed? TEST - %{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ? - {\ctxcommand{grabbuffer("#1","#2","#3",\!!bs>##1\!!es,\catcodetableofbuffer,\ifnum#6=\plusone true\else false\fi)}% space ? - \buff_gobble - \buff_finish}% - \buff_gobble} + % todo: we need to skip the first lineending which is na active character + % but sometimes we have something different ... this is a side effect of + % checking for optional arguments i.e. the next token is already tokenized + % and for that reason we have the \relax as well as the \string + \clf_pickupbuffer + {#1}% + {#2}% + {#3}% + {\string\dofinishpickupbuffer}% + \scratchcounter + \ifnum#6=\plusone\s!true\else\s!false\fi + % \relax} + \expandafter\relax\string} \unexpanded\def\buff_stop#1% {\endgroup % (3 & 4 & 5 & 6) \getvalue{#1}} +% \installctxfunction\dopickupbuffer{commands.dopickupbuffer} + \unexpanded\def\setbuffer {\dosingleempty\buff_set} \let\endbuffer\relax \def\buff_set[#1]#2\endbuffer % seldom used so we just pass #2 - {\ctxcommand{assignbuffer("#1",\!!bs\detokenize{#2}\!!es,\number\catcodetable)}} + {\clf_assignbuffer{#1}{\detokenize{#2}}\catcodetable\relax} % beware, never adapt the global buffer settings, actually we might introduce % a broken parent chain for this purpose but on the other hand it's not that @@ -141,7 +181,7 @@ \namedbufferparameter{#1}\c!after} \unexpanded\def\buff_get_stored_indeed#1% - {\ctxcommand{getbuffer("#1")}} + {\clf_getbuffer{#1}} \unexpanded\def\getdefinedbuffer[#1]% {\buff_get_stored{#1}{\thedefinedbuffer{#1}}}% @@ -155,7 +195,7 @@ {\processcommalist[#1]\buff_get_stored_inline_indeed}} \unexpanded\def\buff_get_stored_inline_indeed#1% - {\ignorespaces\ctxcommand{getbuffer("#1")}\removeunwantedspaces} + {\ignorespaces\clf_getbuffer{#1}\removeunwantedspaces} \definebuffer [\v!hiding] @@ -197,10 +237,10 @@ \def\buff_save[#1][#2]% {\begingroup - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setupcurrentsavebuffer[#1]}% {\setupcurrentsavebuffer[\c!list={#1},\c!file=#2]}% - \ctxcommand{savebuffer("\directsavebufferparameter\c!list","\directsavebufferparameter\c!file","\directsavebufferparameter\c!prefix")}% + \clf_savebuffer{\directsavebufferparameter\c!list}{\directsavebufferparameter\c!file}{\directsavebufferparameter\c!prefix}% \endgroup} %D Experimental: no expansion of commands in buffer! @@ -218,8 +258,8 @@ \unexpanded\def\mkvibuffer {\dosingleempty\buff_mkvi} % what was: \mkvibufferraw -\def\buff_ctxlua[#1]{\ctxcommand{getbufferctxlua("#1")}} -\def\buff_mkvi [#1]{\ctxcommand{getbuffermkvi("#1")}} +\def\buff_ctxlua[#1]{\clf_getbufferctxlua{#1}} +\def\buff_mkvi [#1]{\clf_getbuffermkvi {#1}} % used elsewhere diff --git a/Master/texmf-dist/tex/context/base/buff-par.lua b/Master/texmf-dist/tex/context/base/buff-par.lua index 2c1cd40e9d1..58ea9ab9d06 100644 --- a/Master/texmf-dist/tex/context/base/buff-par.lua +++ b/Master/texmf-dist/tex/context/base/buff-par.lua @@ -6,22 +6,24 @@ if not modules then modules = { } end modules ['buff-par'] = { license = "see context related readme files" } -local context, commands = context, commands - local insert, remove, find, gmatch = table.insert, table.remove, string.find, string.gmatch -local strip, format = string.strip, string.format +local fullstrip, formatters = string.fullstrip, string.formatters local trace_parallel = false trackers.register("buffers.parallel", function(v) trace_parallel = v end) local report_parallel = logs.reporter("buffers","parallel") local variables = interfaces.variables +local v_all = variables.all local parallel = buffers.parallel or { } buffers.parallel = parallel local settings_to_array = utilities.parsers.settings_to_array +local context = context +local implement = interfaces.implement + local data = { } function parallel.define(category,tags) @@ -40,7 +42,7 @@ function parallel.define(category,tags) end function parallel.reset(category,tags) - if not tags or tags == "" or tags == variables.all then + if not tags or tags == "" or tags == v_all then tags = table.keys(entries) else tags = settings_to_array(tags) @@ -62,13 +64,18 @@ function parallel.next(category) end end -function parallel.save(category,tag,content) +function parallel.save(category,tag,content,frombuffer) + if frombuffer then + content = buffers.raw(content) + end local dc = data[category] if not dc then + report_parallel("unknown category %a",category) return end local entries = dc.entries[tag] if not entries then + report_parallel("unknown entry %a",tag) return end local lines = entries.lines @@ -93,13 +100,14 @@ function parallel.save(category,tag,content) if trace_parallel and label ~= "" then report_parallel("reference found of category %a, tag %a, label %a",category,tag,label) end + line.content = fullstrip(content) line.label = label - line.content = strip(content) end else - line.content = strip(content) + line.content = fullstrip(content) line.label = "" end + -- print("[["..line.content.."]]") end function parallel.hassomecontent(category,tags) @@ -108,7 +116,7 @@ function parallel.hassomecontent(category,tags) return false end local entries = dc.entries - if not tags or tags == "" or tags == variables.all then + if not tags or tags == "" or tags == v_all then tags = table.keys(entries) else tags = utilities.parsers.settings_to_array(tags) @@ -126,22 +134,25 @@ function parallel.hassomecontent(category,tags) return false end -local save = resolvers.savers.byscheme +local ctx_doflushparallel = context.doflushparallel +local f_content = formatters["\\input{%s}"] +local save_byscheme = resolvers.savers.byscheme function parallel.place(category,tags,options) local dc = data[category] if not dc then return end - local entries = dc.entries - local tags = utilities.parsers.settings_to_array(tags) - local options = utilities.parsers.settings_to_hash(options) - local start, n, criterium = options.start, options.n, options.criterium - start, n = start and tonumber(start), n and tonumber(n) - local max = 1 + local entries = dc.entries + local tags = utilities.parsers.settings_to_array(tags) + local options = utilities.parsers.settings_to_hash(options) -- options can be hash too + local start = tonumber(options.start) + local n = tonumber(options.n) + local criterium = options.criterium + local max = 1 if n then max = n - elseif criterium == variables.all then + elseif criterium == v_all then max = 0 for t=1,#tags do local tag = tags[t] @@ -156,15 +167,17 @@ function parallel.place(category,tags,options) local tag = tags[t] local entry = entries[tag] if entry then - local lines = entry.lines - local number = entry.number + 1 - entry.number = number - local line = remove(lines,1) - if line and line.content then - local content = format("\\input{%s}",save("virtual","parallel",line.content)) - context.doflushparallel(tag,1,number,line.label,content) + local lines = entry.lines + local number = entry.number + 1 + entry.number = number + local line = remove(lines,1) + local content = line and line.content + local label = line and line.label or "" + if content then + local virtual = save_byscheme("virtual","parallel",content) + ctx_doflushparallel(tag,1,number,label,f_content(virtual)) else - context.doflushparallel(tag,0,number,"","") + ctx_doflushparallel(tag,0,number,"","") end end end @@ -173,12 +186,47 @@ end -- interface -commands.defineparallel = parallel.define -commands.nextparallel = parallel.next -commands.saveparallel = parallel.save -commands.placeparallel = parallel.place -commands.resetparallel = parallel.reset +implement { + name = "defineparallel", + actions = parallel.define, + arguments = { "string", "string" } +} -function commands.doifelseparallel(category,tags) - commands.doifelse(parallel.hassomecontent(category,tags)) -end +implement { + name = "nextparallel", + actions = parallel.next, + arguments = "string" +} + +implement { + name = "saveparallel", + actions = parallel.save, + arguments = { "string", "string", "string", true }, +} + +implement { + name = "placeparallel", + actions = parallel.place, + arguments = { + "string", + "string", + { + { "start" }, + { "n" }, + { "criterium" }, + { "setups" }, + } + } +} + +implement { + name = "resetparallel", + actions = parallel.reset, + arguments = { "string", "string" } +} + +implement { + name = "doifelseparallel", + actions = { parallel.hassomecontent, commands.doifelse } , + arguments = { "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/buff-par.mkvi b/Master/texmf-dist/tex/context/base/buff-par.mkvi index 404fa8ef30e..5af04ba7c6b 100644 --- a/Master/texmf-dist/tex/context/base/buff-par.mkvi +++ b/Master/texmf-dist/tex/context/base/buff-par.mkvi @@ -39,6 +39,7 @@ \unprotect \installcorenamespace{parallel} +\installcorenamespace{parallelhandler} \installcommandhandler \??parallel {parallel} \??parallel @@ -46,32 +47,55 @@ [\c!setups=parallel:place:default] \let\buff_parallel_define_saved\defineparallel +\let\buff_parallel_setup_saved \setupparallel -\unexpanded\def\defineparallel - {\dodoubleargument\buff_parallel_define} +\unexpanded\def\defineparallel{\dodoubleargument\buff_parallel_define} +\unexpanded\def\setupparallel {\dotripleargument\buff_parallel_setup} \def\buff_parallel_define[#name][#instances]% - {\buff_parallel_define_saved[#name] - \ctxcommand{defineparallel("#name","#instances")}% - \processcommalist[#instances]\buff_parallel_define_instance + {\buff_parallel_define_saved[#name][\c!list={#instances}]% list is internal + \clf_defineparallel{#name}{#instances}% + \expandafter\newtoks\csname\??parallelhandler#name\endcsname + \processcommacommand[#instances]{\buff_parallel_define_instance{#name}}% \setuevalue{\e!start#name}{\buff_parallel_start{#name}}% \setuevalue{\e!stop #name}{\buff_parallel_stop}} -\def\buff_parallel_define_instance#instance% - {\normalexpanded{\buff_parallel_define_saved[#instance][\currentparallel]}% +\let\buff_process_parallel_instance\relax + +\def\buff_process_parallel_instances + {\the\csname\??parallelhandler\currentparallel\endcsname} + +\def\buff_parallel_define_instance#name#instance% + {\normalexpanded{\buff_parallel_define_saved[#instance][#name]}% \definebuffer[#instance]% + %\edef\t_buff_parallel{\csname\??parallelhandler#name\endcsname}% + \expandafter\let\expandafter\t_buff_parallel\csname\??parallelhandler#name\endcsname + \appendtoks + \edef\currentparallelinstance{#instance}% + \buff_process_parallel_instance\relax + \to \t_buff_parallel \setuevalue{\e!stop#instance}{\buff_parallel_save{#instance}}} +\def\buff_parallel_setup[#name][#instances][#setups]% + {\processcommalist[#instances]{\buff_parallel_setup_instance{#name}{#setups}}} + +\def\buff_parallel_setup_instance#name#setups#instance% + {\buff_parallel_setup_saved[#name:#instance][#setups]} + \unexpanded\def\buff_parallel_start#name% {\pushmacro\currentparallel \edef\currentparallel{#name}% - \ctxcommand{nextparallel("\currentparallel")}} + \clf_nextparallel{\currentparallel}} \unexpanded\def\buff_parallel_stop {\popmacro\currentparallel} \unexpanded\def\buff_parallel_save#instance% defined moet ook aan de lua kant kunnen - {\ctxcommand{saveparallel("\currentparallel","#instance",buffers.raw("\thedefinedbuffer{#instance}"))}} + {\clf_saveparallel + {\currentparallel}% + {#instance}, + {\thedefinedbuffer{#instance}}% + \relax} \unexpanded\def\placeparallel {\dotripleempty\buff_parallel_place} @@ -79,7 +103,17 @@ \def\buff_parallel_place[#name][#instance][#settings]% {\begingroup \edef\currentparallel{#name}% - \ctxcommand{placeparallel("\currentparallel","#instance","#settings")}% -- todo: pass options as k/v + \setupcurrentparallel[#settings]% + \clf_placeparallel + {\currentparallel}% + {#instance}% + {% + % setups {\parallelparameter\c!setups}% + start {\parallelparameter\c!start}% + n {\parallelparameter\c!n}% + criterium {\parallelparameter\c!criterium}% + }% + \relax \endgroup} \def\doflushparallel#instance#status#line#label#content% called at lua end @@ -88,7 +122,7 @@ \def\currentparallelnumber {#status}% \def\currentparallelline {#line}% \def\currentparallellabel {#label}% - \def\currentparallelcontent {#content}% + \def\currentparallelcontent {#content}% can be kep at the lua end .. no need to use a virtual file \ifcase#status\relax \expandafter\buff_parallel_flush_nop \or @@ -100,22 +134,24 @@ {} \def\buff_parallel_flush_yes - {\directsetup{\namedparallelparameter\currentparallelinstance\c!setups}} + {\directsetup{\namedparallelparameter{\currentparallel:\currentparallelinstance}\c!setups}} \unexpanded\def\doifelseparallel#name#instance% - {\ctxcommand{doifelseparallel("#name","#instance")}} + {\clf_doifelseparallel{#name}{#instance}} + +\let\doifparallelelse\doifelseparallel \unexpanded\def\resetparallel {\dodoubleempty\buff_parallel_reset} \def\buff_parallel_reset[#name][#instance]% - {\ctxcommand{resetparallel("#name","#instance"))}} + {\clf_resetparallel{#name}{#instance}} \startsetups parallel:place:default \hangafter\plusone - \hangindent4em + \hangindent4\emwidth \dontleavehmode - \hbox to 3em \bgroup + \hbox to 3\emwidth \bgroup \hss \bf \doifsomething \currentparallellabel { diff --git a/Master/texmf-dist/tex/context/base/buff-ver.lua b/Master/texmf-dist/tex/context/base/buff-ver.lua index 14914d42dd2..0168c551d2c 100644 --- a/Master/texmf-dist/tex/context/base/buff-ver.lua +++ b/Master/texmf-dist/tex/context/base/buff-ver.lua @@ -31,6 +31,7 @@ visualizers.specifications = specifications local context = context local commands = commands +local implement = interfaces.implement local tabtospace = utilities.strings.tabtospace local variables = interfaces.variables @@ -43,6 +44,7 @@ local v_auto = variables.auto local v_yes = variables.yes local v_last = variables.last local v_all = variables.all +local v_absolute = variables.absolute -- beware, all macros have an argument: @@ -319,6 +321,10 @@ function visualizers.register(name,specification) return specification end +function visualizers.getspecification(name) + return specifications[lower(name)] +end + local escapepatterns = allocate() visualizers.escapepatterns = escapepatterns @@ -623,14 +629,16 @@ end local function getrange(lines,first,last,range) -- 1,3 1,+3 fromhere,tothere local noflines = #lines - local first, last = first or 1, last or noflines + local first = first or 1 + local last = last or noflines if last < 0 then last = noflines + last end - local range = settings.range local what = settings_to_array(range) - local r_first, r_last = what[1], what[2] - local f, l = tonumber(r_first), tonumber(r_last) + local r_first = what[1] + local r_last = what[2] + local f = tonumber(r_first) + local l = tonumber(r_last) if r_first then if f then if f > first then @@ -687,6 +695,7 @@ local function filter(lines,settings) -- todo: inline or display in settings end local line, n = 0, 0 local first, last, m = getstrip(lines) + local range = settings.range if range then first, last = getrange(lines,first,last,range) first, last = getstrip(lines,first,last) @@ -698,17 +707,9 @@ end local getlines = buffers.getlines --- interface - -function commands.doifelsevisualizer(name) - commands.doifelse(specifications[lower(name)]) -end - -commands.loadvisualizer = visualizers.load - -- local decodecomment = resolvers.macros.decodecomment -- experiment -function commands.typebuffer(settings) +local function typebuffer(settings) local lines = getlines(settings.name) if lines then ctx_displayverbatiminitialize(#lines) @@ -721,7 +722,7 @@ function commands.typebuffer(settings) end end -function commands.processbuffer(settings) +local function processbuffer(settings) local lines = getlines(settings.name) if lines then local content, m = filter(lines,settings) @@ -738,21 +739,30 @@ end -- match but slower when there is no match. But anyway, we need a more clever -- parser so we use lpeg. -- --- [[\text ]] [[\text{}]] [[\text \text ]] [[\text \\ \text ]] +-- [[\text ]] [[\text{}]] [[\foo\bar .tex]] [[\text \text ]] [[\text \\ \text ]] -- -- needed in e.g. tabulate (manuals) -local compact_all = Cs((P("\\") * ((1-S("\\ "))^1) * (P(" ")/"") * (P(-1) + S("[{")) + 1)^0) -local compact_last = Cs((P(" ")^1 * P(-1)/"" + 1)^0) +local fences = S([[[{]]) +local symbols = S([[!#"$%&'*()+,-./:;<=>?@[]^_`{|}~]]) +local space = S([[ ]]) +local backslash = S([[\]]) +local nospace = space^1/"" +local endstring = P(-1) + +local compactors = { + [v_all] = Cs((backslash * (1-backslash-space)^1 * nospace * (endstring + fences) + 1)^0), + [v_absolute] = Cs((backslash * (1-symbols -space)^1 * nospace * (symbols+backslash) + 1) ^0), + [v_last] = Cs((space^1 * endstring/"" + 1)^0), +} -function commands.typestring(settings) +local function typestring(settings) local content = settings.data if content and content ~= "" then - local compact = settings.compact - if compact == v_all then - content = lpegmatch(compact_all,content) - elseif compact == v_last then - content = lpegmatch(compact_last,content) + local compact = settings.compact + local compactor = compact and compactors[compact] + if compactor then + content = lpegmatch(compactor,content) end -- content = decodecomment(content) -- content = dotabs(content,settings) @@ -760,7 +770,7 @@ function commands.typestring(settings) end end -function commands.typefile(settings) +local function typefile(settings) local filename = settings.name local foundname = resolvers.findtexfile(filename) if foundname and foundname ~= "" then @@ -782,3 +792,78 @@ function commands.typefile(settings) end end end + +implement { + name = "type", + actions = typestring, + arguments = { + { + { "data" }, + { "tab" }, + { "method" }, + { "compact" }, + { "nature" }, + { "escape" }, + } + } +} + +implement { + name = "processbuffer", + actions = processbuffer, + arguments = { + { + { "name" }, + { "strip" }, + { "tab" }, + { "method" }, + { "nature" }, + } + } +} + +implement { + name = "typebuffer", + actions = typebuffer, + arguments = { + { + { "name" }, + { "strip" }, + { "range" }, + { "regime" }, + { "tab" }, + { "method" }, + { "escape" }, + { "nature" }, + } + } +} + +implement { + name = "typefile", + actions = typefile, + arguments = { + { + { "name" }, + { "strip" }, + { "range" }, + { "regime" }, + { "tab" }, + { "method" }, + { "escape" }, + { "nature" }, + } + } +} + +implement { + name = "doifelsevisualizer", + actions = { visualizers.getspecification, commands.doifelse }, + arguments = "string" +} + +implement { + name = "loadvisualizer", + actions = visualizers.load, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/buff-ver.mkiv b/Master/texmf-dist/tex/context/base/buff-ver.mkiv index 8b9bd176421..67f861ba048 100644 --- a/Master/texmf-dist/tex/context/base/buff-ver.mkiv +++ b/Master/texmf-dist/tex/context/base/buff-ver.mkiv @@ -45,8 +45,6 @@ {\spaceskip\fontcharwd\font`x\relax \xspaceskip\spaceskip} -\unexpanded\def\specialcontrolspace{\hskip\zeropoint\fastcontrolspace\hskip\zeropoint} - \setvalue{\??typinglines\v!no }{\buff_verbatim_ignore_hyphens} \setvalue{\??typinglines\v!normal }{\buff_verbatim_ignore_hyphens} \setvalue{\??typinglines\v!yes }{\buff_verbatim_obey_breakpoints} @@ -75,26 +73,30 @@ \unexpanded\def\buff_verbatim_ignore_hyphens {\language\minusone} % tricky as this affects the pagebuilder -\def\buff_verbatim_initialize_breaks % order matters +\def\buff_verbatim_initialize_type_one + {\let\obeylines\ignorelines + \edef\p_buff_option{\typeparameter\c!option}% + \ifx\p_buff_option\v!none + \usetypestyleandcolor\c!style\c!color + \else\ifx\p_buff_option\empty + \usetypestyleandcolor\c!style\c!color + \else + \usetypestyleparameter\c!style % no color + \fi\fi + \setcatcodetable\vrbcatcodes} + +\def\buff_verbatim_initialize_type_two {\spaceskip.5\emwidth\relax \let\obeyedspace\specialobeyedspace \let\controlspace\specialcontrolspace \edef\p_buff_lines{\typeparameter\c!lines}% - \ifcsname\??typinglines\p_buff_lines\endcsname % sets \obeyedspace, \controlspace, + \ifcsname\??typinglines\p_buff_lines\endcsname \csname\??typinglines\p_buff_lines\endcsname \fi \edef\p_buff_space{\typeparameter\c!space}% - \ifcsname\??typingspace\p_buff_space\endcsname % sets \obeyedspace + \ifcsname\??typingspace\p_buff_space\endcsname \csname\??typingspace\p_buff_space\endcsname - \fi} - -\def\buff_verbatim_initialize_type_one - {\let\obeylines\ignorelines - \usetypestyleandcolor\c!style\c!color - \setcatcodetable\vrbcatcodes} - -\def\buff_verbatim_initialize_type_two - {\buff_verbatim_initialize_breaks + \fi \relax\the\everyinitializeverbatim\relax} \unexpanded\def\doinitializeverbatim % for use elsewhere .. temp hack (see lxml-ini) @@ -104,10 +106,11 @@ \let\buff_verbatim_set_line_margin\relax \def\buff_verbatim_set_line_margin_indeed - {\hskip\doifoddpageelse{\typingparameter\c!oddmargin}{\typingparameter\c!evenmargin}\relax} + {\hskip\doifelseoddpage{\typingparameter\c!oddmargin}{\typingparameter\c!evenmargin}\relax} -\def\buff_verbatim_check_margins - {\scratchskip\typingparameter\c!oddmargin\relax +\def\buff_verbatim_initialize_typing_one + {\usebodyfontparameter\typingparameter + \scratchskip\typingparameter\c!oddmargin\relax \ifzeropt\scratchskip \else \let\buff_verbatim_set_line_margin\buff_verbatim_set_line_margin_indeed \fi @@ -117,16 +120,29 @@ \fi \ifx\buff_verbatim_set_line_margin\relax \doadaptleftskip{\typingparameter\c!margin}% - \fi} - -\def\buff_verbatim_initialize_typing_one - {\switchtobodyfont[\typingparameter\c!bodyfont]% can be low level call - \buff_verbatim_check_margins - \usetypingstyleandcolor\c!style\c!color - \doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}} + \fi + \edef\p_buff_option{\typingparameter\c!option}% + \ifx\p_buff_option\v!none + \usetypingstyleandcolor\c!style\c!color + \else\ifx\p_buff_option\empty + \usetypingstyleandcolor\c!style\c!color + \else + \usetypingstyleparameter\c!style % no color ! + \fi\fi + \usealignparameter\typingparameter} \def\buff_verbatim_initialize_typing_two - {\buff_verbatim_initialize_breaks + {\spaceskip.5\emwidth\relax + \let\obeyedspace\specialobeyedspace + \let\controlspace\specialcontrolspace + \edef\p_buff_lines{\typingparameter\c!lines}% + \ifcsname\??typinglines\p_buff_lines\endcsname + \csname\??typinglines\p_buff_lines\endcsname + \fi + \edef\p_buff_space{\typingparameter\c!space}% + \ifcsname\??typingspace\p_buff_space\endcsname + \csname\??typingspace\p_buff_space\endcsname + \fi \relax\the\everyinitializeverbatim\relax} %D \macros @@ -183,7 +199,12 @@ \to \everysetuptyping \def\buff_verbatim_initialize_visualizer#1% - {\ifproductionrun\ctxcommand{loadvisualizer("#1")}\fi} + {\ifproductionrun\clf_loadvisualizer{#1}\fi} + +\unexpanded\def\doifelsevisualizer#1% + {\clf_doifelsevisualizer{#1}} + +\let\doifvisualizerelse\doifelsevisualizer %D Verbatim command are very sensitive to argument processing, %D which is a direct result of the \CATCODES\ being fixed at @@ -267,7 +288,7 @@ {\dontleavehmode \bgroup \edef\currenttype{#1}% - \doifnextoptionalcselse\buff_verbatim_type_yes\buff_verbatim_type_nop} + \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop} \def\buff_verbatim_type_yes[#1]% {\setupcurrenttype[#1]% @@ -283,7 +304,7 @@ \edef\currenttype{#1}% \lettypeparameter\c!lines\v!hyphenated \let\specialobeyedspace\specialstretchedspace - \doifnextoptionalcselse\buff_verbatim_type_yes\buff_verbatim_type_nop} + \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop} \def\buff_verbatim_type_one {\ifx\next\bgroup @@ -322,33 +343,47 @@ \def\buff_verbatim_type_normal#1% {\buff_verbatim_initialize_type_two - \dostarttagged\t!verbatim\currenttype - \ctxcommand{typestring{ - data = \!!bs\detokenize{#1}\!!es, - tab = "\typeparameter\c!tab", - method = "\typeparameter\c!option", - nature = "inline", - compact = "\typeparameter\c!compact", % none | all | last (all needed in tabulate etc for manuals) - }}% + \dostarttaggedchained\t!verbatim\currenttype\??type + \clf_type + data {\detokenize{#1}}% + tab {\typeparameter\c!tab}% + method {\p_buff_option}% + compact {\typeparameter\c!compact}% % none | all | last (all needed in tabulate etc for manuals) + escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much) + % nature {inline}% is default + \relax \dostoptagged \buff_verbatim_right_of_type \egroup} \def\buff_verbatim_type_nested#1% {\buff_verbatim_initialize_type_two - \dostarttagged\t!verbatim\currenttype - \ctxcommand{typestring{ - data = \!!bs\detokenize{#1}\!!es, - tab = "\typeparameter\c!tab", - method = "nested", % we force a special visualizer - option = "\typeparameter\c!option", % extra visualizer (maybe: nested,\typeparameter\c!option) - nature = "inline", - }}% + \dostarttaggedchained\t!verbatim\currenttype\??type + \clf_type + data {\detokenize{#1}}% + tab {\typeparameter\c!tab}% + method {\p_buff_option}% % extra visualizer (maybe: nested,\typeparameter\c!option) + escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much) + % nature {inline}% is default + method {nested}% + \relax \dostoptagged \buff_verbatim_right_of_type \egroup \gobbleoneargument} % grab last > +%D The \type {compact} option can come in handy in the case of inline argument passing +%D +%D \starttyping +%D \definetype[TeXcodeA][option=TEX] +%D \definetype[TeXcodeB][option=TEX,compact=all] +%D \definetype[TeXcodeC][option=TEX,compact=absolute] +%D +%D \def\argA#1{\TeXcodeA{{#1}}} +%D \def\argB#1{\TeXcodeB{{#1}}} +%D \def\argC#1{\TeXcodeC{{#1}}} +%D \stoptyping + %D \macros %D {obeyhyphens,obeybreakpoints} %D @@ -359,15 +394,24 @@ %D works all right, but a decent hyphenation support of %D \type{\tt} text will be implemented soon. -\unexpanded\def\specialfixedspace {\kern\interwordspace\relax} -\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip -\unexpanded\def\specialstretchedspace{\hskip.5\interwordspace\s!plus.125\interwordspace\relax} % \interwordstretch can be zero -\unexpanded\def\specialcontrolspace {\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax} +\unexpanded\def\specialfixedspace {\kern\interwordspace\relax} +\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip +\unexpanded\def\specialstretchedspace {\hskip.5\interwordspace\s!plus.125\interwordspace\relax} % \interwordstretch can be zero +\unexpanded\def\specialcontrolspace {\normalcontrolspace\allowbreak} % uses fallback + +\unexpanded\def\explicitfixedspace {\asciispacechar} +\unexpanded\def\explicitobeyedspace {\asciispacechar\allowbreak} +\unexpanded\def\explicitstretchedspace{\asciispacechar\hskip\zeropoint\s!plus.125\interwordspace\relax}% +\unexpanded\def\explicitcontrolspace {\optionalcontrolspace\allowbreak} % uses asciispace + +\appendtoks + \unexpanded\def\obeyedspace{\hskip\zeropoint\asciispacechar\hskip\zeropoint}% +\to \everyenableelements \unexpanded\def\obeyhyphens {\let\obeyedspace \specialobeyedspace % maybe \specialstretchedspace \let\controlspace\specialcontrolspace - \spaceskip.25em\relax} % hm a bit of stretch ! + \spaceskip.25\emwidth\relax} % hm a bit of stretch ! \unexpanded\def\obeybreakpoints {\ignorehyphens @@ -420,9 +464,15 @@ \let\normaltextmat\mat \let\normaltextdis\dis -\unexpanded\def\astype{\bgroup\usetypestyleandcolor\c!style\c!color\let\nexttoken} +\unexpanded\def\astype + {\bgroup\usetypestyleandcolor\c!style\c!color\let\nexttoken} -\unexpanded\def\asciistr#1{\dontleavehmode{\verbatimfont\detokenize{#1}}} % use in some old styles +\unexpanded\def\asciistr#1% used in some old styles + {\dontleavehmode\begingroup + \dostarttagged\t!verbatim\empty + \usetypestyleandcolor\c!style\c!color\detokenize{#1}% + \dostoptagged + \endgroup} %D The basic display verbatim commands are defined in an indirect way. As we %D will see, they are a specific case of a more general mechanism. @@ -462,7 +512,7 @@ \def\buff_verbatim_typing_start_yes[#1]% {\typingparameter\c!before \startpacked[\v!blank] - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setupcurrenttyping[#1]} {\doifinset\v!continue{#1}{\lettypingparameter\c!continue\v!yes}}% \buff_verbatim_setup_line_numbering @@ -475,18 +525,18 @@ \def\buff_verbatim_type_block_verbatim_indeed#1#2% {\buff_verbatim_initialize_typing_two - \dostarttagged\t!verbatimblock\currenttyping + \dostarttaggedchained\t!verbatimblock\currenttyping\??typing \beginofverbatimlines \dostarttagged\t!verbatimlines\empty - \ctxcommand{typebuffer { - name = "_typing_", - strip = "\typingparameter\c!strip", - range = "\typingparameter\c!range", - tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", - escape = \!!bs\typingparameter\c!escape\!!es, - nature = "display", - }}% + \clf_typebuffer + name {_typing_}% + strip {\typingparameter\c!strip}% + range {\typingparameter\c!range}% + tab {\typingparameter\c!tab}% + method {\p_buff_option}% + escape {\typingparameter\c!escape}% + nature {display}% + \relax \dostoptagged \endofverbatimlines \dostoptagged @@ -562,7 +612,7 @@ \setuptyping[#1][#2]% \buff_verbatim_type_file_checked{#1}{#3}% \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setuptyping[\v!file][#1] \buff_verbatim_type_file_checked\v!file{#3}} {\buff_verbatim_type_file_checked{#1}{#3}}% @@ -587,6 +637,8 @@ \expandafter\firstoftwoarguments \fi} +\let\doiftypingfileelse\doifelsetypingfile + \def\buff_verbatim_type_file_indeed#1#2% category name {\edef\currenttyping{#1}% \typingparameter\c!before @@ -594,18 +646,18 @@ \buff_verbatim_setup_line_numbering \buff_verbatim_initialize_typing_one \buff_verbatim_initialize_typing_two - \dostarttagged\t!verbatimblock\currenttyping + \dostarttaggedchained\t!verbatimblock\currenttyping\??typing \beginofverbatimlines \dostarttagged\t!verbatimlines\empty - \ctxcommand{typefile { - name = "#2", - strip = "\typingparameter\c!strip", - range = "\typingparameter\c!range", - regime = "\currentregime", - tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", - nature = "display", - }}% + \clf_typefile + name {#2}% + strip {\typingparameter\c!strip}% + range {\typingparameter\c!range}% + regime {\currentregime}% + tab {\typingparameter\c!tab}% + method {\p_buff_option}% + nature {display}% + \relax \dostoptagged \endofverbatimlines \dostoptagged @@ -743,7 +795,7 @@ \setuptyping[\v!buffer][#2]% \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}% [name] [settings] \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setuptyping[\v!buffer][#1]% \buff_verbatim_type_buffer_indeed\v!buffer\empty}% [settings] {\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}}% [name] @@ -767,19 +819,19 @@ \buff_verbatim_setup_line_numbering \buff_verbatim_initialize_typing_one \buff_verbatim_initialize_typing_two - \dostarttagged\t!verbatimblock{#1}% + \dostarttaggedchained\t!verbatimblock{#1}\??typing \beginofverbatimlines \dostarttagged\t!verbatimlines\empty - \ctxcommand{typebuffer { - name = "#2", - strip = "\typingparameter\c!strip", - range = "\typingparameter\c!range", - regime = "\currentregime", - tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", - escape = \!!bs\typingparameter\c!escape\!!es, - nature = "display", - }}% + \clf_typebuffer + name {#2}% + strip {\typingparameter\c!strip}% + range {\typingparameter\c!range}% + regime {\currentregime}% + tab {\typingparameter\c!tab}% + method {\p_buff_option}% + escape {\typingparameter\c!escape}% + % nature {display}% + \relax \dostoptagged \endofverbatimlines \dostoptagged @@ -803,7 +855,7 @@ \setuptyping[\v!buffer][#2]% \processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name] [settings] \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setuptyping[\v!buffer][#1]% \buff_verbatim_process_indeed\v!buffer\empty}% [settings] {\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}}% [name] @@ -814,13 +866,13 @@ \def\buff_verbatim_process_indeed#1#2% {\edef\currenttyping{#1}% - \ctxcommand{processbuffer { - name = "#2", - strip = "\typingparameter\c!strip", - tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", - nature = "direct", - }}} + \clf_processbuffer + name {#2}% + strip {\typingparameter\c!strip}% + tab {\typingparameter\c!tab}% + % method {\p_buff_option}% + nature {direct}% + \relax} % so far for obsolete @@ -835,8 +887,10 @@ \fi \noindent \buff_verbatim_set_line_margin - \the\everyline\strut - \dostarttagged\t!verbatimline\empty} + \the\everyline % maybe also after starttagged + \strut % after starttagged, else break ! + \dostarttagged\t!verbatimline\empty + } \unexpanded\def\buff_verbatim_end_of_line {\dostoptagged @@ -861,7 +915,7 @@ \newcount \c_buff_verbatim_current \newconditional\c_buff_optimize_linebreaks -\def\doverbatimspace {\obeyedspace} + \def\doverbatimspace {\obeyedspace} \unexpanded\def\doinlineverbatimstart {} \unexpanded\def\doinlineverbatimstop {} diff --git a/Master/texmf-dist/tex/context/base/bxml-apa.mkiv b/Master/texmf-dist/tex/context/base/bxml-apa.mkiv index 7665d829c0f..6513a71c2df 100644 --- a/Master/texmf-dist/tex/context/base/bxml-apa.mkiv +++ b/Master/texmf-dist/tex/context/base/bxml-apa.mkiv @@ -342,7 +342,7 @@ \bibxmlsetup{bibtex:apa:common:author-editors-crossref-year} \bibxmldoif {title} { \bgroup\it\bibxmlflush{title}\/\egroup - \doifmodeelse {bibtex:apa:edited-book} { + \doifelsemode {bibtex:apa:edited-book} { \bibxmldoifelse {volume} { \bibtexspace Number\nonbreakablespace\bibxmlflush{volume} \bibxmldoifelse {series} { @@ -396,7 +396,7 @@ \bibxmldoifelse {title} { \bgroup\it\bibxmlflush{title}\/\egroup } { - \doifmodeelse {bibtex:apa:edited-book} { + \doifelsemode {bibtex:apa:edited-book} { \bibxmldoifelse {volume} { \bibtexspace number\nonbreakablespace\bibxmlflush{volume} \bibxmldoifelse {series} { diff --git a/Master/texmf-dist/tex/context/base/catc-act.mkiv b/Master/texmf-dist/tex/context/base/catc-act.mkiv index df228c20322..8c7935d4d57 100644 --- a/Master/texmf-dist/tex/context/base/catc-act.mkiv +++ b/Master/texmf-dist/tex/context/base/catc-act.mkiv @@ -39,10 +39,10 @@ \setnewconstant\c_syst_catcodes_hack\tildeasciicode % also defined in catc-ini.mkiv -\normalprotected\def\defineactivecharacter #1#2 #3% uses \doifnumberelse which is not yet defined +\normalprotected\def\defineactivecharacter #1#2 #3% uses \doifelsenumber which is not yet defined {\c_syst_catcodes_c\uccode\c_syst_catcodes_hack - \if#1"\uccode\c_syst_catcodes_hack\expandafter\doifnumberelse\expandafter{\string#1#2}\empty #1#2\else - \uccode\c_syst_catcodes_hack\expandafter\doifnumberelse\expandafter{\string#1#2}\empty`#1#2\fi + \if#1"\uccode\c_syst_catcodes_hack\expandafter\doifelsenumber\expandafter{\string#1#2}\empty #1#2\else + \uccode\c_syst_catcodes_hack\expandafter\doifelsenumber\expandafter{\string#1#2}\empty`#1#2\fi \catcode\uccode\c_syst_catcodes_hack\activecatcode \uppercase{\def\m_syst_catcodes_temp{~}}% brrr \uccode\c_syst_catcodes_hack\c_syst_catcodes_c diff --git a/Master/texmf-dist/tex/context/base/catc-ini.mkiv b/Master/texmf-dist/tex/context/base/catc-ini.mkiv index d8247217c77..bb1e47faabd 100644 --- a/Master/texmf-dist/tex/context/base/catc-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/catc-ini.mkiv @@ -54,6 +54,7 @@ \setnewconstant\ampersandasciicode 38 \setnewconstant\singlequoteasciicode 39 % ' \setnewconstant\primeasciicode 39 % ' +\setnewconstant\hyphenasciicode 45 \setnewconstant\forwardslashasciicode 47 % / \setnewconstant\colonasciicode 58 \setnewconstant\lessthanasciicode 60 % < used as alternative verbatim { @@ -87,16 +88,25 @@ \xdef\outputnewlinechar{^^J}% \endgroup} -%D We predefine some prefixes ahead of syst-aux and mult-sys. We reserve 8 slots -%D for catcodes. +%D We predefine some prefixes ahead of syst-aux and mult-sys. -\def\??catcodelet {1>>} % let : \let -\def\??catcodedef {2>>} % def : \def -\def\??catcodeued {3>>} % ued : \unexpanded\def -\def\??catcodeget {4>>} % \meaning +% We reserve 8 slots for catcodes. +% +% \def\??catcodelet {1>>} % let : \let +% \def\??catcodedef {2>>} % def : \def +% \def\??catcodeued {3>>} % ued : \unexpanded\def +% \def\??catcodeget {4>>} % \meaning +% +% \def\??catcodetablet{5>>} +% \def\??catcodetablen{6>>} + +\installsystemnamespace {catcodelet} % let : \let +\installsystemnamespace {catcodedef} % def : \def +\installsystemnamespace {catcodeued} % ued : \unexpanded\def +\installsystemnamespace {catcodeget} % \meaning -\def\??catcodetablet{5>>} -\def\??catcodetablen{6>>} +\installsystemnamespace {catcodetablet} +\installsystemnamespace {catcodetablen} \newcount\c_syst_catcodes_n \c_syst_catcodes_n\zerocount % 0 = signal, so advance before allocate \newcount\c_syst_catcodes_a @@ -119,7 +129,7 @@ \catcode\commentasciicode \othercatcode \catcode\delasciicode \othercatcode} -\long\normalprotected\def\startcatcodetable#1#2\stopcatcodetable +\normalprotected\def\startcatcodetable#1#2\stopcatcodetable {\begingroup \catcodetable\inicatcodes \the\everysetdefaultcatcodes @@ -129,7 +139,7 @@ \let\stopcatcodetable\relax -\long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable +\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable {\begingroup \catcodetable#1\relax \globaldefs\plusone @@ -146,7 +156,7 @@ % == % -% \long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable +% \normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable % {\bgroup % \scratchcounter\the\catcodetable % \catcodetable #1 #2 diff --git a/Master/texmf-dist/tex/context/base/catc-sym.mkiv b/Master/texmf-dist/tex/context/base/catc-sym.mkiv index 425a5393c24..71e02f31dc1 100644 --- a/Master/texmf-dist/tex/context/base/catc-sym.mkiv +++ b/Master/texmf-dist/tex/context/base/catc-sym.mkiv @@ -177,12 +177,12 @@ %D %D \getbuffer[c] -\long\def\rescan#1{\scantokens{#1\ignorespaces}} -\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup} +\def\rescan #1{\scantokens{#1\ignorespaces}} +\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup} \ifx\scantextokens\undefined \else - \long\def\rescan#1{\scantextokens{#1}} - \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup} + \def\rescan #1{\scantextokens{#1}} + \def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup} \fi \endinput diff --git a/Master/texmf-dist/tex/context/base/char-act.mkiv b/Master/texmf-dist/tex/context/base/char-act.mkiv index 011c29d07fa..7d7268c8ba6 100644 --- a/Master/texmf-dist/tex/context/base/char-act.mkiv +++ b/Master/texmf-dist/tex/context/base/char-act.mkiv @@ -24,6 +24,8 @@ %D \NEWLINE\ and \NEWPAGE\ active and assigning them %D \type{\obeysomething}, but first we set some default values. +% These are expandable! + \def\obeyedspace {\space} \def\obeyedtab {\obeyedspace} \def\obeyedline {\par} @@ -36,7 +38,10 @@ %D spaces (control spaces) we only have to adapt the definition %D of \type{\obeyedspace} to: -\unexpanded\def\controlspace{\hbox{\char32}} % rather tex, we need the unicode value +\chardef\asciispacechar\spaceasciicode % a real space character + +\unexpanded\def\naturalspace{\asciispacechar} +\unexpanded\def\controlspace{\hbox{\asciispacechar}} % rather tex, we need the unicode value \unexpanded\def\normalspaces{\catcode\spaceasciicode\spacecatcode} \bgroup diff --git a/Master/texmf-dist/tex/context/base/char-def.lua b/Master/texmf-dist/tex/context/base/char-def.lua index 3e1d5600981..f6986e76d66 100644 --- a/Master/texmf-dist/tex/context/base/char-def.lua +++ b/Master/texmf-dist/tex/context/base/char-def.lua @@ -21,12 +21,12 @@ the trouble. Some additional data is kept in other files. characters = characters or { } characters.data={ - [0x0000]={ + [0x0]={ category="cc", description="NULL", direction="bn", linebreak="cm", - unicodeslot=0x0000, + unicodeslot=0x0, }, { adobename="controlSTX", @@ -34,7 +34,7 @@ characters.data={ description="START OF HEADING", direction="bn", linebreak="cm", - unicodeslot=0x0001, + unicodeslot=0x1, }, { adobename="controlSOT", @@ -42,7 +42,7 @@ characters.data={ description="START OF TEXT", direction="bn", linebreak="cm", - unicodeslot=0x0002, + unicodeslot=0x2, }, { adobename="controlETX", @@ -50,7 +50,7 @@ characters.data={ description="END OF TEXT", direction="bn", linebreak="cm", - unicodeslot=0x0003, + unicodeslot=0x3, }, { adobename="controlEOT", @@ -58,7 +58,7 @@ characters.data={ description="END OF TRANSMISSION", direction="bn", linebreak="cm", - unicodeslot=0x0004, + unicodeslot=0x4, }, { adobename="controlENQ", @@ -66,7 +66,7 @@ characters.data={ description="ENQUIRY", direction="bn", linebreak="cm", - unicodeslot=0x0005, + unicodeslot=0x5, }, { adobename="controlACK", @@ -74,7 +74,7 @@ characters.data={ description="ACKNOWLEDGE", direction="bn", linebreak="cm", - unicodeslot=0x0006, + unicodeslot=0x6, }, { adobename="controlBEL", @@ -82,7 +82,7 @@ characters.data={ description="BELL", direction="bn", linebreak="cm", - unicodeslot=0x0007, + unicodeslot=0x7, }, { adobename="controlBS", @@ -90,7 +90,7 @@ characters.data={ description="BACKSPACE", direction="bn", linebreak="cm", - unicodeslot=0x0008, + unicodeslot=0x8, }, { adobename="controlHT", @@ -98,7 +98,7 @@ characters.data={ description="CHARACTER TABULATION", direction="s", linebreak="ba", - unicodeslot=0x0009, + unicodeslot=0x9, }, { adobename="controlLF", @@ -106,7 +106,7 @@ characters.data={ description="LINE FEED (LF)", direction="b", linebreak="lf", - unicodeslot=0x000A, + unicodeslot=0xA, }, { adobename="controlVT", @@ -114,7 +114,7 @@ characters.data={ description="LINE TABULATION", direction="s", linebreak="bk", - unicodeslot=0x000B, + unicodeslot=0xB, }, { adobename="controlFF", @@ -122,7 +122,7 @@ characters.data={ description="FORM FEED (FF)", direction="ws", linebreak="bk", - unicodeslot=0x000C, + unicodeslot=0xC, }, { adobename="controlCR", @@ -130,7 +130,7 @@ characters.data={ description="CARRIAGE RETURN (CR)", direction="b", linebreak="cr", - unicodeslot=0x000D, + unicodeslot=0xD, }, { adobename="controlSO", @@ -138,7 +138,7 @@ characters.data={ description="SHIFT OUT", direction="bn", linebreak="cm", - unicodeslot=0x000E, + unicodeslot=0xE, }, { adobename="controlSI", @@ -146,7 +146,7 @@ characters.data={ description="SHIFT IN", direction="bn", linebreak="cm", - unicodeslot=0x000F, + unicodeslot=0xF, }, { adobename="controlDLE", @@ -154,7 +154,7 @@ characters.data={ description="DATA LINK ESCAPE", direction="bn", linebreak="cm", - unicodeslot=0x0010, + unicodeslot=0x10, }, { adobename="controlDC1", @@ -162,7 +162,7 @@ characters.data={ description="DEVICE CONTROL ONE", direction="bn", linebreak="cm", - unicodeslot=0x0011, + unicodeslot=0x11, }, { adobename="controlDC2", @@ -170,7 +170,7 @@ characters.data={ description="DEVICE CONTROL TWO", direction="bn", linebreak="cm", - unicodeslot=0x0012, + unicodeslot=0x12, }, { adobename="controlDC3", @@ -178,7 +178,7 @@ characters.data={ description="DEVICE CONTROL THREE", direction="bn", linebreak="cm", - unicodeslot=0x0013, + unicodeslot=0x13, }, { adobename="controlDC4", @@ -186,7 +186,7 @@ characters.data={ description="DEVICE CONTROL FOUR", direction="bn", linebreak="cm", - unicodeslot=0x0014, + unicodeslot=0x14, }, { adobename="controlNAK", @@ -194,7 +194,7 @@ characters.data={ description="NEGATIVE ACKNOWLEDGE", direction="bn", linebreak="cm", - unicodeslot=0x0015, + unicodeslot=0x15, }, { adobename="controlSYN", @@ -202,7 +202,7 @@ characters.data={ description="SYNCHRONOUS IDLE", direction="bn", linebreak="cm", - unicodeslot=0x0016, + unicodeslot=0x16, }, { adobename="controlETB", @@ -210,7 +210,7 @@ characters.data={ description="END OF TRANSMISSION BLOCK", direction="bn", linebreak="cm", - unicodeslot=0x0017, + unicodeslot=0x17, }, { adobename="controlCAN", @@ -218,7 +218,7 @@ characters.data={ description="CANCEL", direction="bn", linebreak="cm", - unicodeslot=0x0018, + unicodeslot=0x18, }, { adobename="controlEM", @@ -226,7 +226,7 @@ characters.data={ description="END OF MEDIUM", direction="bn", linebreak="cm", - unicodeslot=0x0019, + unicodeslot=0x19, }, { adobename="controlSUB", @@ -234,7 +234,7 @@ characters.data={ description="SUBSTITUTE", direction="bn", linebreak="cm", - unicodeslot=0x001A, + unicodeslot=0x1A, }, { adobename="controlESC", @@ -242,7 +242,7 @@ characters.data={ description="ESCAPE", direction="bn", linebreak="cm", - unicodeslot=0x001B, + unicodeslot=0x1B, }, { adobename="controlFS", @@ -250,7 +250,7 @@ characters.data={ description="INFORMATION SEPARATOR FOUR", direction="b", linebreak="cm", - unicodeslot=0x001C, + unicodeslot=0x1C, }, { adobename="controlGS", @@ -258,7 +258,7 @@ characters.data={ description="INFORMATION SEPARATOR THREE", direction="b", linebreak="cm", - unicodeslot=0x001D, + unicodeslot=0x1D, }, { adobename="controlRS", @@ -266,7 +266,7 @@ characters.data={ description="INFORMATION SEPARATOR TWO", direction="b", linebreak="cm", - unicodeslot=0x001E, + unicodeslot=0x1E, }, { adobename="controlUS", @@ -274,7 +274,7 @@ characters.data={ description="INFORMATION SEPARATOR ONE", direction="s", linebreak="cm", - unicodeslot=0x001F, + unicodeslot=0x1F, }, { adobename="space", @@ -283,7 +283,7 @@ characters.data={ description="SPACE", direction="ws", linebreak="sp", - unicodeslot=0x0020, + unicodeslot=0x20, }, { adobename="exclam", @@ -293,7 +293,7 @@ characters.data={ direction="on", linebreak="ex", mathclass="close", - unicodeslot=0x0021, + unicodeslot=0x21, }, { adobename="quotedbl", @@ -304,16 +304,19 @@ characters.data={ direction="on", linebreak="qu", mathclass="default", - unicodeslot=0x0022, + unicodeslot=0x22, }, { adobename="numbersign", category="po", cjkwd="na", + contextname="texthash", description="NUMBER SIGN", direction="et", linebreak="al", - unicodeslot=0x0023, + mathclass="binary", + mathname="mathhash", + unicodeslot=0x23, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -327,26 +330,33 @@ characters.data={ description="DOLLAR SIGN", direction="et", linebreak="pr", - unicodeslot=0x0024, + mathclass="binary", + mathname="mathdollar", + unicodeslot=0x24, }, { adobename="percent", category="po", cjkwd="na", - contextname="percent", + contextname="textpercent", description="PERCENT SIGN", direction="et", linebreak="po", - unicodeslot=0x0025, + mathclass="binary", + mathname="mathpercent", + unicodeslot=0x25, }, { adobename="ampersand", category="po", cjkwd="na", + contextname="textampersand", description="AMPERSAND", direction="on", linebreak="al", - unicodeslot=0x0026, + mathclass="binary", + mathname="mathampersand", + unicodeslot=0x26, }, { adobename="quotesingle", @@ -357,7 +367,7 @@ characters.data={ direction="on", linebreak="qu", mathclass="default", - unicodeslot=0x0027, + unicodeslot=0x27, }, { adobename="parenleft", @@ -368,9 +378,9 @@ characters.data={ linebreak="op", mathclass="open", mathname="lparent", - mirror=0x0029, + mirror=0x29, textclass="open", - unicodeslot=0x0028, + unicodeslot=0x28, }, { adobename="parenright", @@ -381,9 +391,9 @@ characters.data={ linebreak="cp", mathclass="close", mathname="rparent", - mirror=0x0028, + mirror=0x28, textclass="close", - unicodeslot=0x0029, + unicodeslot=0x29, }, { adobename="asterisk", @@ -395,7 +405,7 @@ characters.data={ mathclass="binary", mathname="ast", mathsymbol=0x2217, - unicodeslot=0x002A, + unicodeslot=0x2A, }, { adobename="plus", @@ -405,7 +415,7 @@ characters.data={ direction="es", linebreak="pr", mathclass="binary", - unicodeslot=0x002B, + unicodeslot=0x2B, }, { adobename="comma", @@ -416,7 +426,7 @@ characters.data={ direction="cs", linebreak="is", mathclass="punctuation", - unicodeslot=0x002C, + unicodeslot=0x2C, }, { adobename="hyphen", @@ -428,7 +438,7 @@ characters.data={ mathextensible="h", mathfiller="relfill", mathsymbol=0x2212, - unicodeslot=0x002D, + unicodeslot=0x2D, }, { adobename="period", @@ -446,7 +456,7 @@ characters.data={ name="ldotp", }, }, - unicodeslot=0x002E, + unicodeslot=0x2E, }, { adobename="slash", @@ -459,16 +469,12 @@ characters.data={ mathspec={ { class="middle", - -- unicode=0x2044, - -- unicode=0x2215, }, { class="ordinary", - -- unicode=0x2044, - -- unicode=0x2215, }, }, - unicodeslot=0x002F, + unicodeslot=0x2F, }, { adobename="zero", @@ -478,7 +484,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0030, + unicodeslot=0x30, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -492,7 +498,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0031, + unicodeslot=0x31, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -506,7 +512,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0032, + unicodeslot=0x32, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -520,7 +526,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0033, + unicodeslot=0x33, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -534,7 +540,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0034, + unicodeslot=0x34, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -548,7 +554,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0035, + unicodeslot=0x35, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -562,7 +568,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0036, + unicodeslot=0x36, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -576,7 +582,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0037, + unicodeslot=0x37, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -590,7 +596,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0038, + unicodeslot=0x38, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -604,7 +610,7 @@ characters.data={ direction="en", linebreak="nu", mathclass="number", - unicodeslot=0x0039, + unicodeslot=0x39, variants={ [0xFE0E]="text style", [0xFE0F]="emoji style", @@ -619,7 +625,7 @@ characters.data={ direction="cs", linebreak="is", mathclass="relation", - unicodeslot=0x003A, + unicodeslot=0x3A, }, { adobename="semicolon", @@ -629,7 +635,7 @@ characters.data={ direction="on", linebreak="is", mathclass="punctuation", - unicodeslot=0x003B, + unicodeslot=0x3B, }, { adobename="less", @@ -640,9 +646,9 @@ characters.data={ linebreak="al", mathclass="relation", mathname="lt", - mirror=0x003E, + mirror=0x3E, textclass="open", - unicodeslot=0x003C, + unicodeslot=0x3C, }, { adobename="equal", @@ -664,7 +670,7 @@ characters.data={ name="Relbar", }, }, - unicodeslot=0x003D, + unicodeslot=0x3D, }, { adobename="greater", @@ -675,9 +681,9 @@ characters.data={ linebreak="al", mathclass="relation", mathname="gt", - mirror=0x003C, + mirror=0x3C, textclass="close", - unicodeslot=0x003E, + unicodeslot=0x3E, }, { adobename="question", @@ -687,7 +693,7 @@ characters.data={ direction="on", linebreak="ex", mathclass="close", - unicodeslot=0x003F, + unicodeslot=0x3F, }, { adobename="at", @@ -697,7 +703,7 @@ characters.data={ description="COMMERCIAL AT", direction="on", linebreak="al", - unicodeslot=0x0040, + unicodeslot=0x40, }, { adobename="A", @@ -705,10 +711,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER A", direction="l", - lccode=0x0061, + lccode=0x61, linebreak="al", mathclass="variable", - unicodeslot=0x0041, + unicodeslot=0x41, }, { adobename="B", @@ -716,10 +722,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER B", direction="l", - lccode=0x0062, + lccode=0x62, linebreak="al", mathclass="variable", - unicodeslot=0x0042, + unicodeslot=0x42, }, { adobename="C", @@ -727,10 +733,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER C", direction="l", - lccode=0x0063, + lccode=0x63, linebreak="al", mathclass="variable", - unicodeslot=0x0043, + unicodeslot=0x43, }, { adobename="D", @@ -738,10 +744,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER D", direction="l", - lccode=0x0064, + lccode=0x64, linebreak="al", mathclass="variable", - unicodeslot=0x0044, + unicodeslot=0x44, }, { adobename="E", @@ -749,10 +755,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER E", direction="l", - lccode=0x0065, + lccode=0x65, linebreak="al", mathclass="variable", - unicodeslot=0x0045, + unicodeslot=0x45, }, { adobename="F", @@ -760,10 +766,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER F", direction="l", - lccode=0x0066, + lccode=0x66, linebreak="al", mathclass="variable", - unicodeslot=0x0046, + unicodeslot=0x46, }, { adobename="G", @@ -771,10 +777,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER G", direction="l", - lccode=0x0067, + lccode=0x67, linebreak="al", mathclass="variable", - unicodeslot=0x0047, + unicodeslot=0x47, }, { adobename="H", @@ -782,10 +788,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER H", direction="l", - lccode=0x0068, + lccode=0x68, linebreak="al", mathclass="variable", - unicodeslot=0x0048, + unicodeslot=0x48, }, { adobename="I", @@ -794,10 +800,10 @@ characters.data={ contextname="dotlessI", description="LATIN CAPITAL LETTER I", direction="l", - lccode=0x0069, + lccode=0x69, linebreak="al", mathclass="variable", - unicodeslot=0x0049, + unicodeslot=0x49, }, { adobename="J", @@ -806,10 +812,10 @@ characters.data={ contextname="dotlessJ", description="LATIN CAPITAL LETTER J", direction="l", - lccode=0x006A, + lccode=0x6A, linebreak="al", mathclass="variable", - unicodeslot=0x004A, + unicodeslot=0x4A, }, { adobename="K", @@ -817,10 +823,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER K", direction="l", - lccode=0x006B, + lccode=0x6B, linebreak="al", mathclass="variable", - unicodeslot=0x004B, + unicodeslot=0x4B, }, { adobename="L", @@ -828,10 +834,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER L", direction="l", - lccode=0x006C, + lccode=0x6C, linebreak="al", mathclass="variable", - unicodeslot=0x004C, + unicodeslot=0x4C, }, { adobename="M", @@ -839,10 +845,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER M", direction="l", - lccode=0x006D, + lccode=0x6D, linebreak="al", mathclass="variable", - unicodeslot=0x004D, + unicodeslot=0x4D, }, { adobename="N", @@ -850,10 +856,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER N", direction="l", - lccode=0x006E, + lccode=0x6E, linebreak="al", mathclass="variable", - unicodeslot=0x004E, + unicodeslot=0x4E, }, { adobename="O", @@ -861,10 +867,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER O", direction="l", - lccode=0x006F, + lccode=0x6F, linebreak="al", mathclass="variable", - unicodeslot=0x004F, + unicodeslot=0x4F, }, { adobename="P", @@ -872,10 +878,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER P", direction="l", - lccode=0x0070, + lccode=0x70, linebreak="al", mathclass="variable", - unicodeslot=0x0050, + unicodeslot=0x50, }, { adobename="Q", @@ -883,10 +889,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER Q", direction="l", - lccode=0x0071, + lccode=0x71, linebreak="al", mathclass="variable", - unicodeslot=0x0051, + unicodeslot=0x51, }, { adobename="R", @@ -894,10 +900,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER R", direction="l", - lccode=0x0072, + lccode=0x72, linebreak="al", mathclass="variable", - unicodeslot=0x0052, + unicodeslot=0x52, }, { adobename="S", @@ -905,10 +911,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER S", direction="l", - lccode=0x0073, + lccode=0x73, linebreak="al", mathclass="variable", - unicodeslot=0x0053, + unicodeslot=0x53, }, { adobename="T", @@ -916,10 +922,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER T", direction="l", - lccode=0x0074, + lccode=0x74, linebreak="al", mathclass="variable", - unicodeslot=0x0054, + unicodeslot=0x54, }, { adobename="U", @@ -927,10 +933,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER U", direction="l", - lccode=0x0075, + lccode=0x75, linebreak="al", mathclass="variable", - unicodeslot=0x0055, + unicodeslot=0x55, }, { adobename="V", @@ -938,10 +944,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER V", direction="l", - lccode=0x0076, + lccode=0x76, linebreak="al", mathclass="variable", - unicodeslot=0x0056, + unicodeslot=0x56, }, { adobename="W", @@ -949,10 +955,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER W", direction="l", - lccode=0x0077, + lccode=0x77, linebreak="al", mathclass="variable", - unicodeslot=0x0057, + unicodeslot=0x57, }, { adobename="X", @@ -960,10 +966,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER X", direction="l", - lccode=0x0078, + lccode=0x78, linebreak="al", mathclass="variable", - unicodeslot=0x0058, + unicodeslot=0x58, }, { adobename="Y", @@ -971,10 +977,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER Y", direction="l", - lccode=0x0079, + lccode=0x79, linebreak="al", mathclass="variable", - unicodeslot=0x0059, + unicodeslot=0x59, }, { adobename="Z", @@ -982,10 +988,10 @@ characters.data={ cjkwd="na", description="LATIN CAPITAL LETTER Z", direction="l", - lccode=0x007A, + lccode=0x7A, linebreak="al", mathclass="variable", - unicodeslot=0x005A, + unicodeslot=0x5A, }, { adobename="bracketleft", @@ -996,9 +1002,9 @@ characters.data={ linebreak="op", mathclass="open", mathname="lbracket", - mirror=0x005D, + mirror=0x5D, textclass="open", - unicodeslot=0x005B, + unicodeslot=0x5B, }, { adobename="backslash", @@ -1010,7 +1016,7 @@ characters.data={ linebreak="pr", mathclass="nothing", mathname="backslash", - unicodeslot=0x005C, + unicodeslot=0x5C, }, { adobename="bracketright", @@ -1021,9 +1027,9 @@ characters.data={ linebreak="cp", mathclass="close", mathname="rbracket", - mirror=0x005B, + mirror=0x5B, textclass="close", - unicodeslot=0x005D, + unicodeslot=0x5D, }, { adobename="asciicircum", @@ -1034,7 +1040,8 @@ characters.data={ direction="on", linebreak="al", mathclass="topaccent", - unicodeslot=0x005E, + mathname="Hat", + unicodeslot=0x5E, }, { adobename="underscore", @@ -1044,7 +1051,7 @@ characters.data={ description="LOW LINE", direction="on", linebreak="al", - unicodeslot=0x005F, + unicodeslot=0x5F, }, { adobename="grave", @@ -1056,7 +1063,7 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="grave", - unicodeslot=0x0060, + unicodeslot=0x60, }, { adobename="a", @@ -1066,8 +1073,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0041, - unicodeslot=0x0061, + uccode=0x41, + unicodeslot=0x61, }, { adobename="b", @@ -1077,8 +1084,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0042, - unicodeslot=0x0062, + uccode=0x42, + unicodeslot=0x62, }, { adobename="c", @@ -1088,8 +1095,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0043, - unicodeslot=0x0063, + uccode=0x43, + unicodeslot=0x63, }, { adobename="d", @@ -1099,8 +1106,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0044, - unicodeslot=0x0064, + uccode=0x44, + unicodeslot=0x64, }, { adobename="e", @@ -1110,8 +1117,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0045, - unicodeslot=0x0065, + uccode=0x45, + unicodeslot=0x65, }, { adobename="f", @@ -1121,8 +1128,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0046, - unicodeslot=0x0066, + uccode=0x46, + unicodeslot=0x66, }, { adobename="g", @@ -1132,8 +1139,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0047, - unicodeslot=0x0067, + uccode=0x47, + unicodeslot=0x67, }, { adobename="h", @@ -1143,8 +1150,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0048, - unicodeslot=0x0068, + uccode=0x48, + unicodeslot=0x68, }, { adobename="i", @@ -1155,8 +1162,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0049, - unicodeslot=0x0069, + uccode=0x49, + unicodeslot=0x69, }, { adobename="j", @@ -1166,8 +1173,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004A, - unicodeslot=0x006A, + uccode=0x4A, + unicodeslot=0x6A, }, { adobename="k", @@ -1177,8 +1184,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004B, - unicodeslot=0x006B, + uccode=0x4B, + unicodeslot=0x6B, }, { adobename="l", @@ -1188,8 +1195,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004C, - unicodeslot=0x006C, + uccode=0x4C, + unicodeslot=0x6C, }, { adobename="m", @@ -1199,8 +1206,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004D, - unicodeslot=0x006D, + uccode=0x4D, + unicodeslot=0x6D, }, { adobename="n", @@ -1210,8 +1217,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004E, - unicodeslot=0x006E, + uccode=0x4E, + unicodeslot=0x6E, }, { adobename="o", @@ -1221,8 +1228,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x004F, - unicodeslot=0x006F, + uccode=0x4F, + unicodeslot=0x6F, }, { adobename="p", @@ -1232,8 +1239,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0050, - unicodeslot=0x0070, + uccode=0x50, + unicodeslot=0x70, }, { adobename="q", @@ -1243,8 +1250,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0051, - unicodeslot=0x0071, + uccode=0x51, + unicodeslot=0x71, }, { adobename="r", @@ -1254,8 +1261,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0052, - unicodeslot=0x0072, + uccode=0x52, + unicodeslot=0x72, }, { adobename="s", @@ -1265,8 +1272,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0053, - unicodeslot=0x0073, + uccode=0x53, + unicodeslot=0x73, }, { adobename="t", @@ -1276,8 +1283,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0054, - unicodeslot=0x0074, + uccode=0x54, + unicodeslot=0x74, }, { adobename="u", @@ -1287,8 +1294,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0055, - unicodeslot=0x0075, + uccode=0x55, + unicodeslot=0x75, }, { adobename="v", @@ -1298,8 +1305,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0056, - unicodeslot=0x0076, + uccode=0x56, + unicodeslot=0x76, }, { adobename="w", @@ -1309,8 +1316,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0057, - unicodeslot=0x0077, + uccode=0x57, + unicodeslot=0x77, }, { adobename="x", @@ -1320,8 +1327,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0058, - unicodeslot=0x0078, + uccode=0x58, + unicodeslot=0x78, }, { adobename="y", @@ -1331,8 +1338,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x0059, - unicodeslot=0x0079, + uccode=0x59, + unicodeslot=0x79, }, { adobename="z", @@ -1342,8 +1349,8 @@ characters.data={ direction="l", linebreak="al", mathclass="variable", - uccode=0x005A, - unicodeslot=0x007A, + uccode=0x5A, + unicodeslot=0x7A, }, { adobename="braceleft", @@ -1355,9 +1362,9 @@ characters.data={ linebreak="op", mathclass="open", mathname="lbrace", - mirror=0x007D, + mirror=0x7D, textclass="open", - unicodeslot=0x007B, + unicodeslot=0x7B, }, { adobename="verticalbar", @@ -1394,7 +1401,7 @@ characters.data={ name="singleverticalbar", }, }, - unicodeslot=0x007C, + unicodeslot=0x7C, }, { adobename="braceright", @@ -1406,9 +1413,9 @@ characters.data={ linebreak="cl", mathclass="close", mathname="rbrace", - mirror=0x007B, + mirror=0x7B, textclass="close", - unicodeslot=0x007D, + unicodeslot=0x7D, }, { adobename="asciitilde", @@ -1418,7 +1425,7 @@ characters.data={ description="TILDE", direction="on", linebreak="al", - unicodeslot=0x007E, + unicodeslot=0x7E, }, { adobename="controlDEL", @@ -1426,231 +1433,231 @@ characters.data={ description="DELETE", direction="bn", linebreak="cm", - unicodeslot=0x007F, + unicodeslot=0x7F, }, { category="cc", description="NONE", direction="bn", linebreak="cm", - unicodeslot=0x0080, + unicodeslot=0x80, }, { category="cc", description="NONE", direction="bn", linebreak="cm", - unicodeslot=0x0081, + unicodeslot=0x81, }, { category="cc", description="BREAK PERMITTED HERE", direction="bn", linebreak="cm", - unicodeslot=0x0082, + unicodeslot=0x82, }, { category="cc", description="NO BREAK HERE", direction="bn", linebreak="cm", - unicodeslot=0x0083, + unicodeslot=0x83, }, { category="cc", description="NONE", direction="bn", linebreak="cm", - unicodeslot=0x0084, + unicodeslot=0x84, }, { category="cc", description="NEXT LINE (NEL)", direction="b", linebreak="nl", - unicodeslot=0x0085, + unicodeslot=0x85, }, { category="cc", description="START OF SELECTED AREA", direction="bn", linebreak="cm", - unicodeslot=0x0086, + unicodeslot=0x86, }, { category="cc", description="END OF SELECTED AREA", direction="bn", linebreak="cm", - unicodeslot=0x0087, + unicodeslot=0x87, }, { category="cc", description="CHARACTER TABULATION SET", direction="bn", linebreak="cm", - unicodeslot=0x0088, + unicodeslot=0x88, }, { category="cc", description="CHARACTER TABULATION WITH JUSTIFICATION", direction="bn", linebreak="cm", - unicodeslot=0x0089, + unicodeslot=0x89, }, { category="cc", description="LINE TABULATION SET", direction="bn", linebreak="cm", - unicodeslot=0x008A, + unicodeslot=0x8A, }, { category="cc", description="PARTIAL LINE FORWARD", direction="bn", linebreak="cm", - unicodeslot=0x008B, + unicodeslot=0x8B, }, { category="cc", description="PARTIAL LINE BACKWARD", direction="bn", linebreak="cm", - unicodeslot=0x008C, + unicodeslot=0x8C, }, { category="cc", description="REVERSE LINE FEED", direction="bn", linebreak="cm", - unicodeslot=0x008D, + unicodeslot=0x8D, }, { category="cc", description="SINGLE SHIFT TWO", direction="bn", linebreak="cm", - unicodeslot=0x008E, + unicodeslot=0x8E, }, { category="cc", description="SINGLE SHIFT THREE", direction="bn", linebreak="cm", - unicodeslot=0x008F, + unicodeslot=0x8F, }, { category="cc", description="DEVICE CONTROL STRING", direction="bn", linebreak="cm", - unicodeslot=0x0090, + unicodeslot=0x90, }, { category="cc", description="PRIVATE USE ONE", direction="bn", linebreak="cm", - unicodeslot=0x0091, + unicodeslot=0x91, }, { category="cc", description="PRIVATE USE TWO", direction="bn", linebreak="cm", - unicodeslot=0x0092, + unicodeslot=0x92, }, { category="cc", description="SET TRANSMIT STATE", direction="bn", linebreak="cm", - unicodeslot=0x0093, + unicodeslot=0x93, }, { category="cc", description="CANCEL CHARACTER", direction="bn", linebreak="cm", - unicodeslot=0x0094, + unicodeslot=0x94, }, { category="cc", description="MESSAGE WAITING", direction="bn", linebreak="cm", - unicodeslot=0x0095, + unicodeslot=0x95, }, { category="cc", description="START OF GUARDED AREA", direction="bn", linebreak="cm", - unicodeslot=0x0096, + unicodeslot=0x96, }, { category="cc", description="END OF GUARDED AREA", direction="bn", linebreak="cm", - unicodeslot=0x0097, + unicodeslot=0x97, }, { category="cc", description="START OF STRING", direction="bn", linebreak="cm", - unicodeslot=0x0098, + unicodeslot=0x98, }, { category="cc", description="NONE", direction="bn", linebreak="cm", - unicodeslot=0x0099, + unicodeslot=0x99, }, { category="cc", description="SINGLE CHARACTER INTRODUCER", direction="bn", linebreak="cm", - unicodeslot=0x009A, + unicodeslot=0x9A, }, { category="cc", description="CONTROL SEQUENCE INTRODUCER", direction="bn", linebreak="cm", - unicodeslot=0x009B, + unicodeslot=0x9B, }, { category="cc", description="STRING TERMINATOR", direction="bn", linebreak="cm", - unicodeslot=0x009C, + unicodeslot=0x9C, }, { category="cc", description="OPERATING SYSTEM COMMAND", direction="bn", linebreak="cm", - unicodeslot=0x009D, + unicodeslot=0x9D, }, { category="cc", description="PRIVACY MESSAGE", direction="bn", linebreak="cm", - unicodeslot=0x009E, + unicodeslot=0x9E, }, { category="cc", description="APPLICATION PROGRAM COMMAND", direction="bn", linebreak="cm", - unicodeslot=0x009F, + unicodeslot=0x9F, }, { adobename="nonbreakingspace", @@ -1659,8 +1666,8 @@ characters.data={ description="NO-BREAK SPACE", direction="cs", linebreak="gl", - specials={ "nobreak", 0x0020 }, - unicodeslot=0x00A0, + specials={ "nobreak", 0x20 }, + unicodeslot=0xA0, }, { adobename="exclamdown", @@ -1670,7 +1677,7 @@ characters.data={ description="INVERTED EXCLAMATION MARK", direction="on", linebreak="op", - unicodeslot=0x00A1, + unicodeslot=0xA1, }, { adobename="cent", @@ -1680,7 +1687,7 @@ characters.data={ description="CENT SIGN", direction="et", linebreak="po", - unicodeslot=0x00A2, + unicodeslot=0xA2, }, { adobename="sterling", @@ -1690,7 +1697,7 @@ characters.data={ description="POUND SIGN", direction="et", linebreak="pr", - unicodeslot=0x00A3, + unicodeslot=0xA3, }, { adobename="currency", @@ -1700,7 +1707,7 @@ characters.data={ description="CURRENCY SIGN", direction="et", linebreak="pr", - unicodeslot=0x00A4, + unicodeslot=0xA4, }, { adobename="yen", @@ -1712,7 +1719,7 @@ characters.data={ linebreak="pr", mathclass="nothing", mathname="yen", - unicodeslot=0x00A5, + unicodeslot=0xA5, }, { adobename="brokenbar", @@ -1722,7 +1729,7 @@ characters.data={ description="BROKEN BAR", direction="on", linebreak="al", - unicodeslot=0x00A6, + unicodeslot=0xA6, }, { adobename="section", @@ -1734,7 +1741,7 @@ characters.data={ linebreak="ai", mathclass="box", mathname="S", - unicodeslot=0x00A7, + unicodeslot=0xA7, }, { adobename="dieresis", @@ -1746,8 +1753,8 @@ characters.data={ linebreak="ai", mathclass="topaccent", mathname="ddot", - specials={ "compat", 0x0020, 0x0308 }, - unicodeslot=0x00A8, + specials={ "compat", 0x20, 0x308 }, + unicodeslot=0xA8, }, { adobename="copyright", @@ -1756,7 +1763,7 @@ characters.data={ description="COPYRIGHT SIGN", direction="on", linebreak="al", - unicodeslot=0x00A9, + unicodeslot=0xA9, }, { adobename="ordfeminine", @@ -1766,8 +1773,8 @@ characters.data={ description="FEMININE ORDINAL INDICATOR", direction="l", linebreak="ai", - specials={ "super", 0x0061 }, - unicodeslot=0x00AA, + specials={ "super", 0x61 }, + unicodeslot=0xAA, }, { adobename="guillemotleft", @@ -1776,9 +1783,9 @@ characters.data={ description="LEFT-POINTING DOUBLE ANGLE QUOTATION MARK", direction="on", linebreak="qu", - mirror=0x00BB, + mirror=0xBB, textclass="open", - unicodeslot=0x00AB, + unicodeslot=0xAB, }, { adobename="logicalnot", @@ -1798,7 +1805,7 @@ characters.data={ name="neg", }, }, - unicodeslot=0x00AC, + unicodeslot=0xAC, }, { adobename="softhyphen", @@ -1808,7 +1815,7 @@ characters.data={ description="SOFT HYPHEN", direction="bn", linebreak="ba", - unicodeslot=0x00AD, + unicodeslot=0xAD, }, { adobename="registered", @@ -1818,7 +1825,7 @@ characters.data={ description="REGISTERED SIGN", direction="on", linebreak="al", - unicodeslot=0x00AE, + unicodeslot=0xAE, }, { adobename="macron", @@ -1830,10 +1837,10 @@ characters.data={ linebreak="al", mathclass="topaccent", mathfiller="barfill", - mathname="bar", mathmleq=0x203E, - specials={ "compat", 0x0020, 0x0304 }, - unicodeslot=0x00AF, + mathname="bar", + specials={ "compat", 0x20, 0x304 }, + unicodeslot=0xAF, }, { adobename="degree", @@ -1843,7 +1850,7 @@ characters.data={ description="DEGREE SIGN", direction="et", linebreak="po", - unicodeslot=0x00B0, + unicodeslot=0xB0, }, { adobename="plusminus", @@ -1855,7 +1862,7 @@ characters.data={ linebreak="pr", mathclass="binary", mathname="pm", - unicodeslot=0x00B1, + unicodeslot=0xB1, }, { adobename="twosuperior", @@ -1865,8 +1872,8 @@ characters.data={ description="SUPERSCRIPT TWO", direction="en", linebreak="ai", - specials={ "super", 0x0032 }, - unicodeslot=0x00B2, + specials={ "super", 0x32 }, + unicodeslot=0xB2, }, { adobename="threesuperior", @@ -1876,8 +1883,8 @@ characters.data={ description="SUPERSCRIPT THREE", direction="en", linebreak="ai", - specials={ "super", 0x0033 }, - unicodeslot=0x00B3, + specials={ "super", 0x33 }, + unicodeslot=0xB3, }, { adobename="acute", @@ -1889,8 +1896,8 @@ characters.data={ linebreak="bb", mathclass="topaccent", mathname="acute", - specials={ "compat", 0x0020, 0x0301 }, - unicodeslot=0x00B4, + specials={ "compat", 0x20, 0x301 }, + unicodeslot=0xB4, }, { adobename="mu1", @@ -1899,9 +1906,9 @@ characters.data={ description="MICRO SIGN", direction="l", linebreak="al", - specials={ "compat", 0x03BC }, - uccode=0x039C, - unicodeslot=0x00B5, + specials={ "compat", 0x3BC }, + uccode=0x39C, + unicodeslot=0xB5, }, { adobename="paragraph", @@ -1913,7 +1920,7 @@ characters.data={ linebreak="ai", mathclass="box", mathname="P", - unicodeslot=0x00B6, + unicodeslot=0xB6, }, { adobename="periodcentered", @@ -1925,7 +1932,7 @@ characters.data={ linebreak="ai", mathclass="binary", mathname="centerdot", - unicodeslot=0x00B7, + unicodeslot=0xB7, }, { adobename="cedilla", @@ -1935,8 +1942,8 @@ characters.data={ description="CEDILLA", direction="on", linebreak="ai", - specials={ "compat", 0x0020, 0x0327 }, - unicodeslot=0x00B8, + specials={ "compat", 0x20, 0x327 }, + unicodeslot=0xB8, }, { adobename="onesuperior", @@ -1946,8 +1953,8 @@ characters.data={ description="SUPERSCRIPT ONE", direction="en", linebreak="ai", - specials={ "super", 0x0031 }, - unicodeslot=0x00B9, + specials={ "super", 0x31 }, + unicodeslot=0xB9, }, { adobename="ordmasculine", @@ -1957,8 +1964,8 @@ characters.data={ description="MASCULINE ORDINAL INDICATOR", direction="l", linebreak="ai", - specials={ "super", 0x006F }, - unicodeslot=0x00BA, + specials={ "super", 0x6F }, + unicodeslot=0xBA, }, { adobename="guillemotright", @@ -1967,9 +1974,9 @@ characters.data={ description="RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK", direction="on", linebreak="qu", - mirror=0x00AB, + mirror=0xAB, textclass="close", - unicodeslot=0x00BB, + unicodeslot=0xBB, }, { adobename="onequarter", @@ -1979,8 +1986,8 @@ characters.data={ description="VULGAR FRACTION ONE QUARTER", direction="on", linebreak="ai", - specials={ "fraction", 0x0031, 0x2044, 0x0034 }, - unicodeslot=0x00BC, + specials={ "fraction", 0x31, 0x2044, 0x34 }, + unicodeslot=0xBC, }, { adobename="onehalf", @@ -1990,8 +1997,8 @@ characters.data={ description="VULGAR FRACTION ONE HALF", direction="on", linebreak="ai", - specials={ "fraction", 0x0031, 0x2044, 0x0032 }, - unicodeslot=0x00BD, + specials={ "fraction", 0x31, 0x2044, 0x32 }, + unicodeslot=0xBD, }, { adobename="threequarters", @@ -2001,8 +2008,8 @@ characters.data={ description="VULGAR FRACTION THREE QUARTERS", direction="on", linebreak="ai", - specials={ "fraction", 0x0033, 0x2044, 0x0034 }, - unicodeslot=0x00BE, + specials={ "fraction", 0x33, 0x2044, 0x34 }, + unicodeslot=0xBE, }, { adobename="questiondown", @@ -2012,7 +2019,7 @@ characters.data={ description="INVERTED QUESTION MARK", direction="on", linebreak="op", - unicodeslot=0x00BF, + unicodeslot=0xBF, }, { adobename="Agrave", @@ -2020,11 +2027,11 @@ characters.data={ contextname="Agrave", description="LATIN CAPITAL LETTER A WITH GRAVE", direction="l", - lccode=0x00E0, + lccode=0xE0, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0300 }, - unicodeslot=0x00C0, + shcode=0x41, + specials={ "char", 0x41, 0x300 }, + unicodeslot=0xC0, }, { adobename="Aacute", @@ -2032,11 +2039,11 @@ characters.data={ contextname="Aacute", description="LATIN CAPITAL LETTER A WITH ACUTE", direction="l", - lccode=0x00E1, + lccode=0xE1, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0301 }, - unicodeslot=0x00C1, + shcode=0x41, + specials={ "char", 0x41, 0x301 }, + unicodeslot=0xC1, }, { adobename="Acircumflex", @@ -2044,11 +2051,11 @@ characters.data={ contextname="Acircumflex", description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX", direction="l", - lccode=0x00E2, + lccode=0xE2, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0302 }, - unicodeslot=0x00C2, + shcode=0x41, + specials={ "char", 0x41, 0x302 }, + unicodeslot=0xC2, }, { adobename="Atilde", @@ -2056,11 +2063,11 @@ characters.data={ contextname="Atilde", description="LATIN CAPITAL LETTER A WITH TILDE", direction="l", - lccode=0x00E3, + lccode=0xE3, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0303 }, - unicodeslot=0x00C3, + shcode=0x41, + specials={ "char", 0x41, 0x303 }, + unicodeslot=0xC3, }, { adobename="Adieresis", @@ -2068,11 +2075,11 @@ characters.data={ contextname="Adiaeresis", description="LATIN CAPITAL LETTER A WITH DIAERESIS", direction="l", - lccode=0x00E4, + lccode=0xE4, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0308 }, - unicodeslot=0x00C4, + shcode=0x41, + specials={ "char", 0x41, 0x308 }, + unicodeslot=0xC4, }, { adobename="Aring", @@ -2080,11 +2087,11 @@ characters.data={ contextname="Aring", description="LATIN CAPITAL LETTER A WITH RING ABOVE", direction="l", - lccode=0x00E5, + lccode=0xE5, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x030A }, - unicodeslot=0x00C5, + shcode=0x41, + specials={ "char", 0x41, 0x30A }, + unicodeslot=0xC5, }, { adobename="AE", @@ -2093,10 +2100,10 @@ characters.data={ contextname="AEligature", description="LATIN CAPITAL LETTER AE", direction="l", - lccode=0x00E6, + lccode=0xE6, linebreak="al", - shcode={ 0x0041, 0x0045 }, - unicodeslot=0x00C6, + shcode={ 0x41, 0x45 }, + unicodeslot=0xC6, }, { adobename="Ccedilla", @@ -2104,11 +2111,11 @@ characters.data={ contextname="Ccedilla", description="LATIN CAPITAL LETTER C WITH CEDILLA", direction="l", - lccode=0x00E7, + lccode=0xE7, linebreak="al", - shcode=0x0043, - specials={ "char", 0x0043, 0x0327 }, - unicodeslot=0x00C7, + shcode=0x43, + specials={ "char", 0x43, 0x327 }, + unicodeslot=0xC7, }, { adobename="Egrave", @@ -2116,11 +2123,11 @@ characters.data={ contextname="Egrave", description="LATIN CAPITAL LETTER E WITH GRAVE", direction="l", - lccode=0x00E8, + lccode=0xE8, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0300 }, - unicodeslot=0x00C8, + shcode=0x45, + specials={ "char", 0x45, 0x300 }, + unicodeslot=0xC8, }, { adobename="Eacute", @@ -2128,11 +2135,11 @@ characters.data={ contextname="Eacute", description="LATIN CAPITAL LETTER E WITH ACUTE", direction="l", - lccode=0x00E9, + lccode=0xE9, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0301 }, - unicodeslot=0x00C9, + shcode=0x45, + specials={ "char", 0x45, 0x301 }, + unicodeslot=0xC9, }, { adobename="Ecircumflex", @@ -2140,11 +2147,11 @@ characters.data={ contextname="Ecircumflex", description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX", direction="l", - lccode=0x00EA, + lccode=0xEA, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0302 }, - unicodeslot=0x00CA, + shcode=0x45, + specials={ "char", 0x45, 0x302 }, + unicodeslot=0xCA, }, { adobename="Edieresis", @@ -2152,11 +2159,11 @@ characters.data={ contextname="Ediaeresis", description="LATIN CAPITAL LETTER E WITH DIAERESIS", direction="l", - lccode=0x00EB, + lccode=0xEB, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0308 }, - unicodeslot=0x00CB, + shcode=0x45, + specials={ "char", 0x45, 0x308 }, + unicodeslot=0xCB, }, { adobename="Igrave", @@ -2164,11 +2171,11 @@ characters.data={ contextname="Igrave", description="LATIN CAPITAL LETTER I WITH GRAVE", direction="l", - lccode=0x00EC, + lccode=0xEC, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0300 }, - unicodeslot=0x00CC, + shcode=0x49, + specials={ "char", 0x49, 0x300 }, + unicodeslot=0xCC, }, { adobename="Iacute", @@ -2176,11 +2183,11 @@ characters.data={ contextname="Iacute", description="LATIN CAPITAL LETTER I WITH ACUTE", direction="l", - lccode=0x00ED, + lccode=0xED, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0301 }, - unicodeslot=0x00CD, + shcode=0x49, + specials={ "char", 0x49, 0x301 }, + unicodeslot=0xCD, }, { adobename="Icircumflex", @@ -2188,11 +2195,11 @@ characters.data={ contextname="Icircumflex", description="LATIN CAPITAL LETTER I WITH CIRCUMFLEX", direction="l", - lccode=0x00EE, + lccode=0xEE, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0302 }, - unicodeslot=0x00CE, + shcode=0x49, + specials={ "char", 0x49, 0x302 }, + unicodeslot=0xCE, }, { adobename="Idieresis", @@ -2200,11 +2207,11 @@ characters.data={ contextname="Idiaeresis", description="LATIN CAPITAL LETTER I WITH DIAERESIS", direction="l", - lccode=0x00EF, + lccode=0xEF, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0308 }, - unicodeslot=0x00CF, + shcode=0x49, + specials={ "char", 0x49, 0x308 }, + unicodeslot=0xCF, }, { adobename="Eth", @@ -2213,9 +2220,9 @@ characters.data={ contextname="Eth", description="LATIN CAPITAL LETTER ETH", direction="l", - lccode=0x00F0, + lccode=0xF0, linebreak="al", - unicodeslot=0x00D0, + unicodeslot=0xD0, }, { adobename="Ntilde", @@ -2223,11 +2230,11 @@ characters.data={ contextname="Ntilde", description="LATIN CAPITAL LETTER N WITH TILDE", direction="l", - lccode=0x00F1, + lccode=0xF1, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0303 }, - unicodeslot=0x00D1, + shcode=0x4E, + specials={ "char", 0x4E, 0x303 }, + unicodeslot=0xD1, }, { adobename="Ograve", @@ -2235,11 +2242,11 @@ characters.data={ contextname="Ograve", description="LATIN CAPITAL LETTER O WITH GRAVE", direction="l", - lccode=0x00F2, + lccode=0xF2, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0300 }, - unicodeslot=0x00D2, + shcode=0x4F, + specials={ "char", 0x4F, 0x300 }, + unicodeslot=0xD2, }, { adobename="Oacute", @@ -2247,11 +2254,11 @@ characters.data={ contextname="Oacute", description="LATIN CAPITAL LETTER O WITH ACUTE", direction="l", - lccode=0x00F3, + lccode=0xF3, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0301 }, - unicodeslot=0x00D3, + shcode=0x4F, + specials={ "char", 0x4F, 0x301 }, + unicodeslot=0xD3, }, { adobename="Ocircumflex", @@ -2259,11 +2266,11 @@ characters.data={ contextname="Ocircumflex", description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX", direction="l", - lccode=0x00F4, + lccode=0xF4, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0302 }, - unicodeslot=0x00D4, + shcode=0x4F, + specials={ "char", 0x4F, 0x302 }, + unicodeslot=0xD4, }, { adobename="Otilde", @@ -2271,11 +2278,11 @@ characters.data={ contextname="Otilde", description="LATIN CAPITAL LETTER O WITH TILDE", direction="l", - lccode=0x00F5, + lccode=0xF5, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0303 }, - unicodeslot=0x00D5, + shcode=0x4F, + specials={ "char", 0x4F, 0x303 }, + unicodeslot=0xD5, }, { adobename="Odieresis", @@ -2283,11 +2290,11 @@ characters.data={ contextname="Odiaeresis", description="LATIN CAPITAL LETTER O WITH DIAERESIS", direction="l", - lccode=0x00F6, + lccode=0xF6, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0308 }, - unicodeslot=0x00D6, + shcode=0x4F, + specials={ "char", 0x4F, 0x308 }, + unicodeslot=0xD6, }, { adobename="multiply", @@ -2299,7 +2306,7 @@ characters.data={ linebreak="ai", mathclass="binary", mathname="times", - unicodeslot=0x00D7, + unicodeslot=0xD7, }, { adobename="Oslash", @@ -2308,10 +2315,10 @@ characters.data={ contextname="Ostroke", description="LATIN CAPITAL LETTER O WITH STROKE", direction="l", - lccode=0x00F8, + lccode=0xF8, linebreak="al", - shcode=0x004F, - unicodeslot=0x00D8, + shcode=0x4F, + unicodeslot=0xD8, }, { adobename="Ugrave", @@ -2319,11 +2326,11 @@ characters.data={ contextname="Ugrave", description="LATIN CAPITAL LETTER U WITH GRAVE", direction="l", - lccode=0x00F9, + lccode=0xF9, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0300 }, - unicodeslot=0x00D9, + shcode=0x55, + specials={ "char", 0x55, 0x300 }, + unicodeslot=0xD9, }, { adobename="Uacute", @@ -2331,11 +2338,11 @@ characters.data={ contextname="Uacute", description="LATIN CAPITAL LETTER U WITH ACUTE", direction="l", - lccode=0x00FA, + lccode=0xFA, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0301 }, - unicodeslot=0x00DA, + shcode=0x55, + specials={ "char", 0x55, 0x301 }, + unicodeslot=0xDA, }, { adobename="Ucircumflex", @@ -2343,11 +2350,11 @@ characters.data={ contextname="Ucircumflex", description="LATIN CAPITAL LETTER U WITH CIRCUMFLEX", direction="l", - lccode=0x00FB, + lccode=0xFB, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0302 }, - unicodeslot=0x00DB, + shcode=0x55, + specials={ "char", 0x55, 0x302 }, + unicodeslot=0xDB, }, { adobename="Udieresis", @@ -2355,11 +2362,11 @@ characters.data={ contextname="Udiaeresis", description="LATIN CAPITAL LETTER U WITH DIAERESIS", direction="l", - lccode=0x00FC, + lccode=0xFC, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0308 }, - unicodeslot=0x00DC, + shcode=0x55, + specials={ "char", 0x55, 0x308 }, + unicodeslot=0xDC, }, { adobename="Yacute", @@ -2367,11 +2374,11 @@ characters.data={ contextname="Yacute", description="LATIN CAPITAL LETTER Y WITH ACUTE", direction="l", - lccode=0x00FD, + lccode=0xFD, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0301 }, - unicodeslot=0x00DD, + shcode=0x59, + specials={ "char", 0x59, 0x301 }, + unicodeslot=0xDD, }, { adobename="Thorn", @@ -2380,9 +2387,9 @@ characters.data={ contextname="Thorn", description="LATIN CAPITAL LETTER THORN", direction="l", - lccode=0x00FE, + lccode=0xFE, linebreak="al", - unicodeslot=0x00DE, + unicodeslot=0xDE, }, { adobename="germandbls", @@ -2392,8 +2399,9 @@ characters.data={ description="LATIN SMALL LETTER SHARP S", direction="l", linebreak="al", - uccode={ 0x0053, 0x0053 }, - unicodeslot=0x00DF, + uccode={ 0x53, 0x53 }, + shcode={ 0x73, 0x73 }, + unicodeslot=0xDF, }, { adobename="agrave", @@ -2403,10 +2411,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH GRAVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0300 }, - uccode=0x00C0, - unicodeslot=0x00E0, + shcode=0x61, + specials={ "char", 0x61, 0x300 }, + uccode=0xC0, + unicodeslot=0xE0, }, { adobename="aacute", @@ -2416,10 +2424,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH ACUTE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0301 }, - uccode=0x00C1, - unicodeslot=0x00E1, + shcode=0x61, + specials={ "char", 0x61, 0x301 }, + uccode=0xC1, + unicodeslot=0xE1, }, { adobename="acircumflex", @@ -2428,10 +2436,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0302 }, - uccode=0x00C2, - unicodeslot=0x00E2, + shcode=0x61, + specials={ "char", 0x61, 0x302 }, + uccode=0xC2, + unicodeslot=0xE2, }, { adobename="atilde", @@ -2440,10 +2448,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH TILDE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0303 }, - uccode=0x00C3, - unicodeslot=0x00E3, + shcode=0x61, + specials={ "char", 0x61, 0x303 }, + uccode=0xC3, + unicodeslot=0xE3, }, { adobename="adieresis", @@ -2452,10 +2460,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0308 }, - uccode=0x00C4, - unicodeslot=0x00E4, + shcode=0x61, + specials={ "char", 0x61, 0x308 }, + uccode=0xC4, + unicodeslot=0xE4, }, { adobename="aring", @@ -2464,10 +2472,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH RING ABOVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x030A }, - uccode=0x00C5, - unicodeslot=0x00E5, + shcode=0x61, + specials={ "char", 0x61, 0x30A }, + uccode=0xC5, + unicodeslot=0xE5, }, { adobename="ae", @@ -2477,9 +2485,9 @@ characters.data={ description="LATIN SMALL LETTER AE", direction="l", linebreak="al", - shcode={ 0x0061, 0x0065 }, - uccode=0x00C6, - unicodeslot=0x00E6, + shcode={ 0x61, 0x65 }, + uccode=0xC6, + unicodeslot=0xE6, }, { adobename="ccedilla", @@ -2488,10 +2496,10 @@ characters.data={ description="LATIN SMALL LETTER C WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x0063, 0x0327 }, - uccode=0x00C7, - unicodeslot=0x00E7, + shcode=0x63, + specials={ "char", 0x63, 0x327 }, + uccode=0xC7, + unicodeslot=0xE7, }, { adobename="egrave", @@ -2501,10 +2509,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH GRAVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0300 }, - uccode=0x00C8, - unicodeslot=0x00E8, + shcode=0x65, + specials={ "char", 0x65, 0x300 }, + uccode=0xC8, + unicodeslot=0xE8, }, { adobename="eacute", @@ -2514,10 +2522,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH ACUTE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0301 }, - uccode=0x00C9, - unicodeslot=0x00E9, + shcode=0x65, + specials={ "char", 0x65, 0x301 }, + uccode=0xC9, + unicodeslot=0xE9, }, { adobename="ecircumflex", @@ -2527,10 +2535,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0302 }, - uccode=0x00CA, - unicodeslot=0x00EA, + shcode=0x65, + specials={ "char", 0x65, 0x302 }, + uccode=0xCA, + unicodeslot=0xEA, }, { adobename="edieresis", @@ -2539,10 +2547,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0308 }, - uccode=0x00CB, - unicodeslot=0x00EB, + shcode=0x65, + specials={ "char", 0x65, 0x308 }, + uccode=0xCB, + unicodeslot=0xEB, }, { adobename="igrave", @@ -2552,10 +2560,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH GRAVE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0300 }, - uccode=0x00CC, - unicodeslot=0x00EC, + shcode=0x69, + specials={ "char", 0x69, 0x300 }, + uccode=0xCC, + unicodeslot=0xEC, }, { adobename="iacute", @@ -2565,10 +2573,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH ACUTE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0301 }, - uccode=0x00CD, - unicodeslot=0x00ED, + shcode=0x69, + specials={ "char", 0x69, 0x301 }, + uccode=0xCD, + unicodeslot=0xED, }, { adobename="icircumflex", @@ -2577,10 +2585,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0302 }, - uccode=0x00CE, - unicodeslot=0x00EE, + shcode=0x69, + specials={ "char", 0x69, 0x302 }, + uccode=0xCE, + unicodeslot=0xEE, }, { adobename="idieresis", @@ -2589,10 +2597,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0308 }, - uccode=0x00CF, - unicodeslot=0x00EF, + shcode=0x69, + specials={ "char", 0x69, 0x308 }, + uccode=0xCF, + unicodeslot=0xEF, }, { adobename="eth", @@ -2604,8 +2612,8 @@ characters.data={ linebreak="al", mathclass="ordinary", mathname="eth", - uccode=0x00D0, - unicodeslot=0x00F0, + uccode=0xD0, + unicodeslot=0xF0, }, { adobename="ntilde", @@ -2614,10 +2622,10 @@ characters.data={ description="LATIN SMALL LETTER N WITH TILDE", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0303 }, - uccode=0x00D1, - unicodeslot=0x00F1, + shcode=0x6E, + specials={ "char", 0x6E, 0x303 }, + uccode=0xD1, + unicodeslot=0xF1, }, { adobename="ograve", @@ -2627,10 +2635,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH GRAVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0300 }, - uccode=0x00D2, - unicodeslot=0x00F2, + shcode=0x6F, + specials={ "char", 0x6F, 0x300 }, + uccode=0xD2, + unicodeslot=0xF2, }, { adobename="oacute", @@ -2640,10 +2648,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0301 }, - uccode=0x00D3, - unicodeslot=0x00F3, + shcode=0x6F, + specials={ "char", 0x6F, 0x301 }, + uccode=0xD3, + unicodeslot=0xF3, }, { adobename="ocircumflex", @@ -2652,10 +2660,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0302 }, - uccode=0x00D4, - unicodeslot=0x00F4, + shcode=0x6F, + specials={ "char", 0x6F, 0x302 }, + uccode=0xD4, + unicodeslot=0xF4, }, { adobename="otilde", @@ -2664,10 +2672,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH TILDE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0303 }, - uccode=0x00D5, - unicodeslot=0x00F5, + shcode=0x6F, + specials={ "char", 0x6F, 0x303 }, + uccode=0xD5, + unicodeslot=0xF5, }, { adobename="odieresis", @@ -2676,10 +2684,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0308 }, - uccode=0x00D6, - unicodeslot=0x00F6, + shcode=0x6F, + specials={ "char", 0x6F, 0x308 }, + uccode=0xD6, + unicodeslot=0xF6, }, { adobename="divide", @@ -2691,7 +2699,7 @@ characters.data={ linebreak="ai", mathclass="binary", mathname="div", - unicodeslot=0x00F7, + unicodeslot=0xF7, }, { adobename="oslash", @@ -2701,9 +2709,9 @@ characters.data={ description="LATIN SMALL LETTER O WITH STROKE", direction="l", linebreak="al", - shcode=0x006F, - uccode=0x00D8, - unicodeslot=0x00F8, + shcode=0x6F, + uccode=0xD8, + unicodeslot=0xF8, }, { adobename="ugrave", @@ -2713,10 +2721,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH GRAVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0300 }, - uccode=0x00D9, - unicodeslot=0x00F9, + shcode=0x75, + specials={ "char", 0x75, 0x300 }, + uccode=0xD9, + unicodeslot=0xF9, }, { adobename="uacute", @@ -2726,10 +2734,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH ACUTE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0301 }, - uccode=0x00DA, - unicodeslot=0x00FA, + shcode=0x75, + specials={ "char", 0x75, 0x301 }, + uccode=0xDA, + unicodeslot=0xFA, }, { adobename="ucircumflex", @@ -2738,10 +2746,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0302 }, - uccode=0x00DB, - unicodeslot=0x00FB, + shcode=0x75, + specials={ "char", 0x75, 0x302 }, + uccode=0xDB, + unicodeslot=0xFB, }, { adobename="udieresis", @@ -2751,10 +2759,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0308 }, - uccode=0x00DC, - unicodeslot=0x00FC, + shcode=0x75, + specials={ "char", 0x75, 0x308 }, + uccode=0xDC, + unicodeslot=0xFC, }, { adobename="yacute", @@ -2763,10 +2771,10 @@ characters.data={ description="LATIN SMALL LETTER Y WITH ACUTE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0301 }, - uccode=0x00DD, - unicodeslot=0x00FD, + shcode=0x79, + specials={ "char", 0x79, 0x301 }, + uccode=0xDD, + unicodeslot=0xFD, }, { adobename="thorn", @@ -2776,8 +2784,8 @@ characters.data={ description="LATIN SMALL LETTER THORN", direction="l", linebreak="al", - uccode=0x00DE, - unicodeslot=0x00FE, + uccode=0xDE, + unicodeslot=0xFE, }, { adobename="ydieresis", @@ -2786,10 +2794,10 @@ characters.data={ description="LATIN SMALL LETTER Y WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0308 }, - uccode=0x0178, - unicodeslot=0x00FF, + shcode=0x79, + specials={ "char", 0x79, 0x308 }, + uccode=0x178, + unicodeslot=0xFF, }, { adobename="Amacron", @@ -2797,11 +2805,11 @@ characters.data={ contextname="Amacron", description="LATIN CAPITAL LETTER A WITH MACRON", direction="l", - lccode=0x0101, + lccode=0x101, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0304 }, - unicodeslot=0x0100, + shcode=0x41, + specials={ "char", 0x41, 0x304 }, + unicodeslot=0x100, }, { adobename="amacron", @@ -2811,10 +2819,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH MACRON", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0304 }, - uccode=0x0100, - unicodeslot=0x0101, + shcode=0x61, + specials={ "char", 0x61, 0x304 }, + uccode=0x100, + unicodeslot=0x101, }, { adobename="Abreve", @@ -2822,11 +2830,11 @@ characters.data={ contextname="Abreve", description="LATIN CAPITAL LETTER A WITH BREVE", direction="l", - lccode=0x0103, + lccode=0x103, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0306 }, - unicodeslot=0x0102, + shcode=0x41, + specials={ "char", 0x41, 0x306 }, + unicodeslot=0x102, }, { adobename="abreve", @@ -2835,10 +2843,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0306 }, - uccode=0x0102, - unicodeslot=0x0103, + shcode=0x61, + specials={ "char", 0x61, 0x306 }, + uccode=0x102, + unicodeslot=0x103, }, { adobename="Aogonek", @@ -2846,11 +2854,11 @@ characters.data={ contextname="Aogonek", description="LATIN CAPITAL LETTER A WITH OGONEK", direction="l", - lccode=0x0105, + lccode=0x105, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0328 }, - unicodeslot=0x0104, + shcode=0x41, + specials={ "char", 0x41, 0x328 }, + unicodeslot=0x104, }, { adobename="aogonek", @@ -2859,10 +2867,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH OGONEK", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0328 }, - uccode=0x0104, - unicodeslot=0x0105, + shcode=0x61, + specials={ "char", 0x61, 0x328 }, + uccode=0x104, + unicodeslot=0x105, }, { adobename="Cacute", @@ -2870,11 +2878,11 @@ characters.data={ contextname="Cacute", description="LATIN CAPITAL LETTER C WITH ACUTE", direction="l", - lccode=0x0107, + lccode=0x107, linebreak="al", - shcode=0x0043, - specials={ "char", 0x0043, 0x0301 }, - unicodeslot=0x0106, + shcode=0x43, + specials={ "char", 0x43, 0x301 }, + unicodeslot=0x106, }, { adobename="cacute", @@ -2883,10 +2891,10 @@ characters.data={ description="LATIN SMALL LETTER C WITH ACUTE", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x0063, 0x0301 }, - uccode=0x0106, - unicodeslot=0x0107, + shcode=0x63, + specials={ "char", 0x63, 0x301 }, + uccode=0x106, + unicodeslot=0x107, }, { adobename="Ccircumflex", @@ -2894,11 +2902,11 @@ characters.data={ contextname="Ccircumflex", description="LATIN CAPITAL LETTER C WITH CIRCUMFLEX", direction="l", - lccode=0x0109, + lccode=0x109, linebreak="al", - shcode=0x0043, - specials={ "char", 0x0043, 0x0302 }, - unicodeslot=0x0108, + shcode=0x43, + specials={ "char", 0x43, 0x302 }, + unicodeslot=0x108, }, { adobename="ccircumflex", @@ -2907,10 +2915,10 @@ characters.data={ description="LATIN SMALL LETTER C WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x0063, 0x0302 }, - uccode=0x0108, - unicodeslot=0x0109, + shcode=0x63, + specials={ "char", 0x63, 0x302 }, + uccode=0x108, + unicodeslot=0x109, }, { adobename="Cdotaccent", @@ -2918,11 +2926,11 @@ characters.data={ contextname="Cdotaccent", description="LATIN CAPITAL LETTER C WITH DOT ABOVE", direction="l", - lccode=0x010B, + lccode=0x10B, linebreak="al", - shcode=0x0043, - specials={ "char", 0x0043, 0x0307 }, - unicodeslot=0x010A, + shcode=0x43, + specials={ "char", 0x43, 0x307 }, + unicodeslot=0x10A, }, { adobename="cdotaccent", @@ -2931,10 +2939,10 @@ characters.data={ description="LATIN SMALL LETTER C WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x0063, 0x0307 }, - uccode=0x010A, - unicodeslot=0x010B, + shcode=0x63, + specials={ "char", 0x63, 0x307 }, + uccode=0x10A, + unicodeslot=0x10B, }, { adobename="Ccaron", @@ -2942,11 +2950,11 @@ characters.data={ contextname="Ccaron", description="LATIN CAPITAL LETTER C WITH CARON", direction="l", - lccode=0x010D, + lccode=0x10D, linebreak="al", - shcode=0x0043, - specials={ "char", 0x0043, 0x030C }, - unicodeslot=0x010C, + shcode=0x43, + specials={ "char", 0x43, 0x30C }, + unicodeslot=0x10C, }, { adobename="ccaron", @@ -2955,10 +2963,10 @@ characters.data={ description="LATIN SMALL LETTER C WITH CARON", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x0063, 0x030C }, - uccode=0x010C, - unicodeslot=0x010D, + shcode=0x63, + specials={ "char", 0x63, 0x30C }, + uccode=0x10C, + unicodeslot=0x10D, }, { adobename="Dcaron", @@ -2966,11 +2974,11 @@ characters.data={ contextname="Dcaron", description="LATIN CAPITAL LETTER D WITH CARON", direction="l", - lccode=0x010F, + lccode=0x10F, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x030C }, - unicodeslot=0x010E, + shcode=0x44, + specials={ "char", 0x44, 0x30C }, + unicodeslot=0x10E, }, { adobename="dcaron", @@ -2979,10 +2987,10 @@ characters.data={ description="LATIN SMALL LETTER D WITH CARON", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x030C }, - uccode=0x010E, - unicodeslot=0x010F, + shcode=0x64, + specials={ "char", 0x64, 0x30C }, + uccode=0x10E, + unicodeslot=0x10F, }, { adobename="Dslash", @@ -2990,10 +2998,10 @@ characters.data={ contextname="Dstroke", description="LATIN CAPITAL LETTER D WITH STROKE", direction="l", - lccode=0x0111, + lccode=0x111, linebreak="al", - shcode=0x0044, - unicodeslot=0x0110, + shcode=0x44, + unicodeslot=0x110, }, { adobename="dmacron", @@ -3003,9 +3011,9 @@ characters.data={ description="LATIN SMALL LETTER D WITH STROKE", direction="l", linebreak="al", - shcode=0x0064, - uccode=0x0110, - unicodeslot=0x0111, + shcode=0x64, + uccode=0x110, + unicodeslot=0x111, }, { adobename="Emacron", @@ -3013,11 +3021,11 @@ characters.data={ contextname="Emacron", description="LATIN CAPITAL LETTER E WITH MACRON", direction="l", - lccode=0x0113, + lccode=0x113, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0304 }, - unicodeslot=0x0112, + shcode=0x45, + specials={ "char", 0x45, 0x304 }, + unicodeslot=0x112, }, { adobename="emacron", @@ -3027,10 +3035,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH MACRON", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0304 }, - uccode=0x0112, - unicodeslot=0x0113, + shcode=0x65, + specials={ "char", 0x65, 0x304 }, + uccode=0x112, + unicodeslot=0x113, }, { adobename="Ebreve", @@ -3038,11 +3046,11 @@ characters.data={ contextname="Ebreve", description="LATIN CAPITAL LETTER E WITH BREVE", direction="l", - lccode=0x0115, + lccode=0x115, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0306 }, - unicodeslot=0x0114, + shcode=0x45, + specials={ "char", 0x45, 0x306 }, + unicodeslot=0x114, }, { adobename="ebreve", @@ -3051,10 +3059,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH BREVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0306 }, - uccode=0x0114, - unicodeslot=0x0115, + shcode=0x65, + specials={ "char", 0x65, 0x306 }, + uccode=0x114, + unicodeslot=0x115, }, { adobename="Edotaccent", @@ -3062,11 +3070,11 @@ characters.data={ contextname="Edotaccent", description="LATIN CAPITAL LETTER E WITH DOT ABOVE", direction="l", - lccode=0x0117, + lccode=0x117, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0307 }, - unicodeslot=0x0116, + shcode=0x45, + specials={ "char", 0x45, 0x307 }, + unicodeslot=0x116, }, { adobename="edotaccent", @@ -3075,10 +3083,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0307 }, - uccode=0x0116, - unicodeslot=0x0117, + shcode=0x65, + specials={ "char", 0x65, 0x307 }, + uccode=0x116, + unicodeslot=0x117, }, { adobename="Eogonek", @@ -3086,11 +3094,11 @@ characters.data={ contextname="Eogonek", description="LATIN CAPITAL LETTER E WITH OGONEK", direction="l", - lccode=0x0119, + lccode=0x119, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0328 }, - unicodeslot=0x0118, + shcode=0x45, + specials={ "char", 0x45, 0x328 }, + unicodeslot=0x118, }, { adobename="eogonek", @@ -3099,10 +3107,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH OGONEK", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0328 }, - uccode=0x0118, - unicodeslot=0x0119, + shcode=0x65, + specials={ "char", 0x65, 0x328 }, + uccode=0x118, + unicodeslot=0x119, }, { adobename="Ecaron", @@ -3110,11 +3118,11 @@ characters.data={ contextname="Ecaron", description="LATIN CAPITAL LETTER E WITH CARON", direction="l", - lccode=0x011B, + lccode=0x11B, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x030C }, - unicodeslot=0x011A, + shcode=0x45, + specials={ "char", 0x45, 0x30C }, + unicodeslot=0x11A, }, { adobename="ecaron", @@ -3124,10 +3132,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH CARON", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x030C }, - uccode=0x011A, - unicodeslot=0x011B, + shcode=0x65, + specials={ "char", 0x65, 0x30C }, + uccode=0x11A, + unicodeslot=0x11B, }, { adobename="Gcircumflex", @@ -3135,11 +3143,11 @@ characters.data={ contextname="Gcircumflex", description="LATIN CAPITAL LETTER G WITH CIRCUMFLEX", direction="l", - lccode=0x011D, + lccode=0x11D, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0302 }, - unicodeslot=0x011C, + shcode=0x47, + specials={ "char", 0x47, 0x302 }, + unicodeslot=0x11C, }, { adobename="gcircumflex", @@ -3148,10 +3156,10 @@ characters.data={ description="LATIN SMALL LETTER G WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0302 }, - uccode=0x011C, - unicodeslot=0x011D, + shcode=0x67, + specials={ "char", 0x67, 0x302 }, + uccode=0x11C, + unicodeslot=0x11D, }, { adobename="Gbreve", @@ -3159,11 +3167,11 @@ characters.data={ contextname="Gbreve", description="LATIN CAPITAL LETTER G WITH BREVE", direction="l", - lccode=0x011F, + lccode=0x11F, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0306 }, - unicodeslot=0x011E, + shcode=0x47, + specials={ "char", 0x47, 0x306 }, + unicodeslot=0x11E, }, { adobename="gbreve", @@ -3172,10 +3180,10 @@ characters.data={ description="LATIN SMALL LETTER G WITH BREVE", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0306 }, - uccode=0x011E, - unicodeslot=0x011F, + shcode=0x67, + specials={ "char", 0x67, 0x306 }, + uccode=0x11E, + unicodeslot=0x11F, }, { adobename="Gdotaccent", @@ -3183,11 +3191,11 @@ characters.data={ contextname="Gdotaccent", description="LATIN CAPITAL LETTER G WITH DOT ABOVE", direction="l", - lccode=0x0121, + lccode=0x121, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0307 }, - unicodeslot=0x0120, + shcode=0x47, + specials={ "char", 0x47, 0x307 }, + unicodeslot=0x120, }, { adobename="gdotaccent", @@ -3196,10 +3204,10 @@ characters.data={ description="LATIN SMALL LETTER G WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0307 }, - uccode=0x0120, - unicodeslot=0x0121, + shcode=0x67, + specials={ "char", 0x67, 0x307 }, + uccode=0x120, + unicodeslot=0x121, }, { adobename="Gcommaaccent", @@ -3207,11 +3215,11 @@ characters.data={ contextname="Gcommaaccent", description="LATIN CAPITAL LETTER G WITH CEDILLA", direction="l", - lccode=0x0123, + lccode=0x123, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0327 }, - unicodeslot=0x0122, + shcode=0x47, + specials={ "char", 0x47, 0x327 }, + unicodeslot=0x122, }, { adobename="gcommaaccent", @@ -3220,10 +3228,10 @@ characters.data={ description="LATIN SMALL LETTER G WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0327 }, - uccode=0x0122, - unicodeslot=0x0123, + shcode=0x67, + specials={ "char", 0x67, 0x327 }, + uccode=0x122, + unicodeslot=0x123, }, { adobename="Hcircumflex", @@ -3231,11 +3239,11 @@ characters.data={ contextname="Hcircumflex", description="LATIN CAPITAL LETTER H WITH CIRCUMFLEX", direction="l", - lccode=0x0125, + lccode=0x125, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x0302 }, - unicodeslot=0x0124, + shcode=0x48, + specials={ "char", 0x48, 0x302 }, + unicodeslot=0x124, }, { adobename="hcircumflex", @@ -3244,10 +3252,10 @@ characters.data={ description="LATIN SMALL LETTER H WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0302 }, - uccode=0x0124, - unicodeslot=0x0125, + shcode=0x68, + specials={ "char", 0x68, 0x302 }, + uccode=0x124, + unicodeslot=0x125, }, { adobename="Hbar", @@ -3256,10 +3264,10 @@ characters.data={ contextname="Hstroke", description="LATIN CAPITAL LETTER H WITH STROKE", direction="l", - lccode=0x0127, + lccode=0x127, linebreak="al", - shcode=0x0048, - unicodeslot=0x0126, + shcode=0x48, + unicodeslot=0x126, }, { adobename="hbar", @@ -3269,9 +3277,9 @@ characters.data={ description="LATIN SMALL LETTER H WITH STROKE", direction="l", linebreak="al", - shcode=0x0068, - uccode=0x0126, - unicodeslot=0x0127, + shcode=0x68, + uccode=0x126, + unicodeslot=0x127, }, { adobename="Itilde", @@ -3279,11 +3287,11 @@ characters.data={ contextname="Itilde", description="LATIN CAPITAL LETTER I WITH TILDE", direction="l", - lccode=0x0129, + lccode=0x129, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0303 }, - unicodeslot=0x0128, + shcode=0x49, + specials={ "char", 0x49, 0x303 }, + unicodeslot=0x128, }, { adobename="itilde", @@ -3292,10 +3300,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH TILDE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0303 }, - uccode=0x0128, - unicodeslot=0x0129, + shcode=0x69, + specials={ "char", 0x69, 0x303 }, + uccode=0x128, + unicodeslot=0x129, }, { adobename="Imacron", @@ -3303,11 +3311,11 @@ characters.data={ contextname="Imacron", description="LATIN CAPITAL LETTER I WITH MACRON", direction="l", - lccode=0x012B, + lccode=0x12B, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0304 }, - unicodeslot=0x012A, + shcode=0x49, + specials={ "char", 0x49, 0x304 }, + unicodeslot=0x12A, }, { adobename="imacron", @@ -3317,10 +3325,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH MACRON", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0304 }, - uccode=0x012A, - unicodeslot=0x012B, + shcode=0x69, + specials={ "char", 0x69, 0x304 }, + uccode=0x12A, + unicodeslot=0x12B, }, { adobename="Ibreve", @@ -3328,11 +3336,11 @@ characters.data={ contextname="Ibreve", description="LATIN CAPITAL LETTER I WITH BREVE", direction="l", - lccode=0x012D, + lccode=0x12D, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0306 }, - unicodeslot=0x012C, + shcode=0x49, + specials={ "char", 0x49, 0x306 }, + unicodeslot=0x12C, }, { adobename="ibreve", @@ -3341,10 +3349,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH BREVE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0306 }, - uccode=0x012C, - unicodeslot=0x012D, + shcode=0x69, + specials={ "char", 0x69, 0x306 }, + uccode=0x12C, + unicodeslot=0x12D, }, { adobename="Iogonek", @@ -3352,11 +3360,11 @@ characters.data={ contextname="Iogonek", description="LATIN CAPITAL LETTER I WITH OGONEK", direction="l", - lccode=0x012F, + lccode=0x12F, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0328 }, - unicodeslot=0x012E, + shcode=0x49, + specials={ "char", 0x49, 0x328 }, + unicodeslot=0x12E, }, { adobename="iogonek", @@ -3365,10 +3373,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH OGONEK", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0328 }, - uccode=0x012E, - unicodeslot=0x012F, + shcode=0x69, + specials={ "char", 0x69, 0x328 }, + uccode=0x12E, + unicodeslot=0x12F, }, { adobename="Idotaccent", @@ -3376,11 +3384,11 @@ characters.data={ contextname="Idotaccent", description="LATIN CAPITAL LETTER I WITH DOT ABOVE", direction="l", - lccode=0x0069, + lccode=0x69, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0307 }, - unicodeslot=0x0130, + shcode=0x49, + specials={ "char", 0x49, 0x307 }, + unicodeslot=0x130, }, { adobename="dotlessi", @@ -3390,8 +3398,8 @@ characters.data={ description="LATIN SMALL LETTER DOTLESS I", direction="l", linebreak="al", - uccode=0x0049, - unicodeslot=0x0131, + uccode=0x49, + unicodeslot=0x131, }, { adobename="IJ", @@ -3400,11 +3408,11 @@ characters.data={ contextname="IJligature", description="LATIN CAPITAL LIGATURE IJ", direction="l", - lccode=0x0133, + lccode=0x133, linebreak="al", - shcode={ 0x0049, 0x004A }, - specials={ "compat", 0x0049, 0x004A }, - unicodeslot=0x0132, + shcode={ 0x49, 0x4A }, + specials={ "compat", 0x49, 0x4A }, + unicodeslot=0x132, }, { adobename="ij", @@ -3414,10 +3422,10 @@ characters.data={ description="LATIN SMALL LIGATURE IJ", direction="l", linebreak="al", - shcode={ 0x0069, 0x006A }, - specials={ "compat", 0x0069, 0x006A }, - uccode=0x0132, - unicodeslot=0x0133, + shcode={ 0x69, 0x6A }, + specials={ "compat", 0x69, 0x6A }, + uccode=0x132, + unicodeslot=0x133, }, { adobename="Jcircumflex", @@ -3425,11 +3433,11 @@ characters.data={ contextname="Jcircumflex", description="LATIN CAPITAL LETTER J WITH CIRCUMFLEX", direction="l", - lccode=0x0135, + lccode=0x135, linebreak="al", - shcode=0x004A, - specials={ "char", 0x004A, 0x0302 }, - unicodeslot=0x0134, + shcode=0x4A, + specials={ "char", 0x4A, 0x302 }, + unicodeslot=0x134, }, { adobename="jcircumflex", @@ -3438,10 +3446,10 @@ characters.data={ description="LATIN SMALL LETTER J WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x006A, - specials={ "char", 0x006A, 0x0302 }, - uccode=0x0134, - unicodeslot=0x0135, + shcode=0x6A, + specials={ "char", 0x6A, 0x302 }, + uccode=0x134, + unicodeslot=0x135, }, { adobename="Kcommaaccent", @@ -3449,11 +3457,11 @@ characters.data={ contextname="Kcommaaccent", description="LATIN CAPITAL LETTER K WITH CEDILLA", direction="l", - lccode=0x0137, + lccode=0x137, linebreak="al", - shcode=0x004B, - specials={ "char", 0x004B, 0x0327 }, - unicodeslot=0x0136, + shcode=0x4B, + specials={ "char", 0x4B, 0x327 }, + unicodeslot=0x136, }, { adobename="kcommaaccent", @@ -3462,10 +3470,10 @@ characters.data={ description="LATIN SMALL LETTER K WITH CEDILLA", direction="l", linebreak="al", - shcode=0x006B, - specials={ "char", 0x006B, 0x0327 }, - uccode=0x0136, - unicodeslot=0x0137, + shcode=0x6B, + specials={ "char", 0x6B, 0x327 }, + uccode=0x136, + unicodeslot=0x137, }, { adobename="kgreenlandic", @@ -3475,7 +3483,7 @@ characters.data={ description="LATIN SMALL LETTER KRA", direction="l", linebreak="al", - unicodeslot=0x0138, + unicodeslot=0x138, }, { adobename="Lacute", @@ -3483,11 +3491,11 @@ characters.data={ contextname="Lacute", description="LATIN CAPITAL LETTER L WITH ACUTE", direction="l", - lccode=0x013A, + lccode=0x13A, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x0301 }, - unicodeslot=0x0139, + shcode=0x4C, + specials={ "char", 0x4C, 0x301 }, + unicodeslot=0x139, }, { adobename="lacute", @@ -3496,10 +3504,10 @@ characters.data={ description="LATIN SMALL LETTER L WITH ACUTE", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x0301 }, - uccode=0x0139, - unicodeslot=0x013A, + shcode=0x6C, + specials={ "char", 0x6C, 0x301 }, + uccode=0x139, + unicodeslot=0x13A, }, { adobename="Lcommaaccent", @@ -3507,11 +3515,11 @@ characters.data={ contextname="Lcommaaccent", description="LATIN CAPITAL LETTER L WITH CEDILLA", direction="l", - lccode=0x013C, + lccode=0x13C, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x0327 }, - unicodeslot=0x013B, + shcode=0x4C, + specials={ "char", 0x4C, 0x327 }, + unicodeslot=0x13B, }, { adobename="lcommaaccent", @@ -3520,10 +3528,10 @@ characters.data={ description="LATIN SMALL LETTER L WITH CEDILLA", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x0327 }, - uccode=0x013B, - unicodeslot=0x013C, + shcode=0x6C, + specials={ "char", 0x6C, 0x327 }, + uccode=0x13B, + unicodeslot=0x13C, }, { adobename="Lcaron", @@ -3531,11 +3539,11 @@ characters.data={ contextname="Lcaron", description="LATIN CAPITAL LETTER L WITH CARON", direction="l", - lccode=0x013E, + lccode=0x13E, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x030C }, - unicodeslot=0x013D, + shcode=0x4C, + specials={ "char", 0x4C, 0x30C }, + unicodeslot=0x13D, }, { adobename="lcaron", @@ -3544,10 +3552,10 @@ characters.data={ description="LATIN SMALL LETTER L WITH CARON", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x030C }, - uccode=0x013D, - unicodeslot=0x013E, + shcode=0x6C, + specials={ "char", 0x6C, 0x30C }, + uccode=0x13D, + unicodeslot=0x13E, }, { adobename="Ldotaccent", @@ -3556,11 +3564,11 @@ characters.data={ contextname="Ldotmiddle", description="LATIN CAPITAL LETTER L WITH MIDDLE DOT", direction="l", - lccode=0x0140, + lccode=0x140, linebreak="al", - shcode=0x004C, - specials={ "compat", 0x004C, 0x00B7 }, - unicodeslot=0x013F, + shcode=0x4C, + specials={ "compat", 0x4C, 0xB7 }, + unicodeslot=0x13F, }, { adobename="ldotaccent", @@ -3570,10 +3578,10 @@ characters.data={ description="LATIN SMALL LETTER L WITH MIDDLE DOT", direction="l", linebreak="al", - shcode=0x006C, - specials={ "compat", 0x006C, 0x00B7 }, - uccode=0x013F, - unicodeslot=0x0140, + shcode=0x6C, + specials={ "compat", 0x6C, 0xB7 }, + uccode=0x13F, + unicodeslot=0x140, }, { adobename="Lslash", @@ -3582,10 +3590,10 @@ characters.data={ contextname="Lstroke", description="LATIN CAPITAL LETTER L WITH STROKE", direction="l", - lccode=0x0142, + lccode=0x142, linebreak="al", - shcode=0x004C, - unicodeslot=0x0141, + shcode=0x4C, + unicodeslot=0x141, }, { adobename="lslash", @@ -3595,9 +3603,9 @@ characters.data={ description="LATIN SMALL LETTER L WITH STROKE", direction="l", linebreak="al", - shcode=0x006C, - uccode=0x0141, - unicodeslot=0x0142, + shcode=0x6C, + uccode=0x141, + unicodeslot=0x142, }, { adobename="Nacute", @@ -3605,11 +3613,11 @@ characters.data={ contextname="Nacute", description="LATIN CAPITAL LETTER N WITH ACUTE", direction="l", - lccode=0x0144, + lccode=0x144, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0301 }, - unicodeslot=0x0143, + shcode=0x4E, + specials={ "char", 0x4E, 0x301 }, + unicodeslot=0x143, }, { adobename="nacute", @@ -3619,10 +3627,10 @@ characters.data={ description="LATIN SMALL LETTER N WITH ACUTE", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0301 }, - uccode=0x0143, - unicodeslot=0x0144, + shcode=0x6E, + specials={ "char", 0x6E, 0x301 }, + uccode=0x143, + unicodeslot=0x144, }, { adobename="Ncommaaccent", @@ -3630,11 +3638,11 @@ characters.data={ contextname="Ncommaaccent", description="LATIN CAPITAL LETTER N WITH CEDILLA", direction="l", - lccode=0x0146, + lccode=0x146, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0327 }, - unicodeslot=0x0145, + shcode=0x4E, + specials={ "char", 0x4E, 0x327 }, + unicodeslot=0x145, }, { adobename="ncommaaccent", @@ -3643,10 +3651,10 @@ characters.data={ description="LATIN SMALL LETTER N WITH CEDILLA", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0327 }, - uccode=0x0145, - unicodeslot=0x0146, + shcode=0x6E, + specials={ "char", 0x6E, 0x327 }, + uccode=0x145, + unicodeslot=0x146, }, { adobename="Ncaron", @@ -3654,11 +3662,11 @@ characters.data={ contextname="Ncaron", description="LATIN CAPITAL LETTER N WITH CARON", direction="l", - lccode=0x0148, + lccode=0x148, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x030C }, - unicodeslot=0x0147, + shcode=0x4E, + specials={ "char", 0x4E, 0x30C }, + unicodeslot=0x147, }, { adobename="ncaron", @@ -3668,10 +3676,10 @@ characters.data={ description="LATIN SMALL LETTER N WITH CARON", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x030C }, - uccode=0x0147, - unicodeslot=0x0148, + shcode=0x6E, + specials={ "char", 0x6E, 0x30C }, + uccode=0x147, + unicodeslot=0x148, }, { adobename="quoterightn", @@ -3681,8 +3689,8 @@ characters.data={ description="LATIN SMALL LETTER N PRECEDED BY APOSTROPHE", direction="l", linebreak="al", - specials={ "compat", 0x02BC, 0x006E }, - unicodeslot=0x0149, + specials={ "compat", 0x2BC, 0x6E }, + unicodeslot=0x149, }, { adobename="Eng", @@ -3691,9 +3699,9 @@ characters.data={ contextname="Neng", description="LATIN CAPITAL LETTER ENG", direction="l", - lccode=0x014B, + lccode=0x14B, linebreak="al", - unicodeslot=0x014A, + unicodeslot=0x14A, }, { adobename="eng", @@ -3703,8 +3711,8 @@ characters.data={ description="LATIN SMALL LETTER ENG", direction="l", linebreak="al", - uccode=0x014A, - unicodeslot=0x014B, + uccode=0x14A, + unicodeslot=0x14B, }, { adobename="Omacron", @@ -3712,11 +3720,11 @@ characters.data={ contextname="Omacron", description="LATIN CAPITAL LETTER O WITH MACRON", direction="l", - lccode=0x014D, + lccode=0x14D, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0304 }, - unicodeslot=0x014C, + shcode=0x4F, + specials={ "char", 0x4F, 0x304 }, + unicodeslot=0x14C, }, { adobename="omacron", @@ -3726,10 +3734,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH MACRON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0304 }, - uccode=0x014C, - unicodeslot=0x014D, + shcode=0x6F, + specials={ "char", 0x6F, 0x304 }, + uccode=0x14C, + unicodeslot=0x14D, }, { adobename="Obreve", @@ -3737,11 +3745,11 @@ characters.data={ contextname="Obreve", description="LATIN CAPITAL LETTER O WITH BREVE", direction="l", - lccode=0x014F, + lccode=0x14F, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0306 }, - unicodeslot=0x014E, + shcode=0x4F, + specials={ "char", 0x4F, 0x306 }, + unicodeslot=0x14E, }, { adobename="obreve", @@ -3750,10 +3758,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH BREVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0306 }, - uccode=0x014E, - unicodeslot=0x014F, + shcode=0x6F, + specials={ "char", 0x6F, 0x306 }, + uccode=0x14E, + unicodeslot=0x14F, }, { adobename="Ohungarumlaut", @@ -3761,11 +3769,11 @@ characters.data={ contextname="Ohungarumlaut", description="LATIN CAPITAL LETTER O WITH DOUBLE ACUTE", direction="l", - lccode=0x0151, + lccode=0x151, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x030B }, - unicodeslot=0x0150, + shcode=0x4F, + specials={ "char", 0x4F, 0x30B }, + unicodeslot=0x150, }, { adobename="ohungarumlaut", @@ -3774,10 +3782,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH DOUBLE ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x030B }, - uccode=0x0150, - unicodeslot=0x0151, + shcode=0x6F, + specials={ "char", 0x6F, 0x30B }, + uccode=0x150, + unicodeslot=0x151, }, { adobename="OE", @@ -3786,10 +3794,10 @@ characters.data={ contextname="OEligature", description="LATIN CAPITAL LIGATURE OE", direction="l", - lccode=0x0153, + lccode=0x153, linebreak="al", - shcode={ 0x004F, 0x0045 }, - unicodeslot=0x0152, + shcode={ 0x4F, 0x45 }, + unicodeslot=0x152, }, { adobename="oe", @@ -3799,9 +3807,9 @@ characters.data={ description="LATIN SMALL LIGATURE OE", direction="l", linebreak="al", - shcode={ 0x006F, 0x0065 }, - uccode=0x0152, - unicodeslot=0x0153, + shcode={ 0x6F, 0x65 }, + uccode=0x152, + unicodeslot=0x153, }, { adobename="Racute", @@ -3809,11 +3817,11 @@ characters.data={ contextname="Racute", description="LATIN CAPITAL LETTER R WITH ACUTE", direction="l", - lccode=0x0155, + lccode=0x155, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0301 }, - unicodeslot=0x0154, + shcode=0x52, + specials={ "char", 0x52, 0x301 }, + unicodeslot=0x154, }, { adobename="racute", @@ -3822,10 +3830,10 @@ characters.data={ description="LATIN SMALL LETTER R WITH ACUTE", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0301 }, - uccode=0x0154, - unicodeslot=0x0155, + shcode=0x72, + specials={ "char", 0x72, 0x301 }, + uccode=0x154, + unicodeslot=0x155, }, { adobename="Rcommaaccent", @@ -3833,11 +3841,11 @@ characters.data={ contextname="Rcommaaccent", description="LATIN CAPITAL LETTER R WITH CEDILLA", direction="l", - lccode=0x0157, + lccode=0x157, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0327 }, - unicodeslot=0x0156, + shcode=0x52, + specials={ "char", 0x52, 0x327 }, + unicodeslot=0x156, }, { adobename="rcommaaccent", @@ -3846,10 +3854,10 @@ characters.data={ description="LATIN SMALL LETTER R WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0327 }, - uccode=0x0156, - unicodeslot=0x0157, + shcode=0x72, + specials={ "char", 0x72, 0x327 }, + uccode=0x156, + unicodeslot=0x157, }, { adobename="Rcaron", @@ -3857,11 +3865,11 @@ characters.data={ contextname="Rcaron", description="LATIN CAPITAL LETTER R WITH CARON", direction="l", - lccode=0x0159, + lccode=0x159, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x030C }, - unicodeslot=0x0158, + shcode=0x52, + specials={ "char", 0x52, 0x30C }, + unicodeslot=0x158, }, { adobename="rcaron", @@ -3870,10 +3878,10 @@ characters.data={ description="LATIN SMALL LETTER R WITH CARON", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x030C }, - uccode=0x0158, - unicodeslot=0x0159, + shcode=0x72, + specials={ "char", 0x72, 0x30C }, + uccode=0x158, + unicodeslot=0x159, }, { adobename="Sacute", @@ -3881,11 +3889,11 @@ characters.data={ contextname="Sacute", description="LATIN CAPITAL LETTER S WITH ACUTE", direction="l", - lccode=0x015B, + lccode=0x15B, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0301 }, - unicodeslot=0x015A, + shcode=0x53, + specials={ "char", 0x53, 0x301 }, + unicodeslot=0x15A, }, { adobename="sacute", @@ -3894,10 +3902,10 @@ characters.data={ description="LATIN SMALL LETTER S WITH ACUTE", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0301 }, - uccode=0x015A, - unicodeslot=0x015B, + shcode=0x73, + specials={ "char", 0x73, 0x301 }, + uccode=0x15A, + unicodeslot=0x15B, }, { adobename="Scircumflex", @@ -3905,11 +3913,11 @@ characters.data={ contextname="Scircumflex", description="LATIN CAPITAL LETTER S WITH CIRCUMFLEX", direction="l", - lccode=0x015D, + lccode=0x15D, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0302 }, - unicodeslot=0x015C, + shcode=0x53, + specials={ "char", 0x53, 0x302 }, + unicodeslot=0x15C, }, { adobename="scircumflex", @@ -3918,10 +3926,10 @@ characters.data={ description="LATIN SMALL LETTER S WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0302 }, - uccode=0x015C, - unicodeslot=0x015D, + shcode=0x73, + specials={ "char", 0x73, 0x302 }, + uccode=0x15C, + unicodeslot=0x15D, }, { adobename="Scedilla", @@ -3929,11 +3937,11 @@ characters.data={ contextname="Scedilla", description="LATIN CAPITAL LETTER S WITH CEDILLA", direction="l", - lccode=0x015F, + lccode=0x15F, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0327 }, - unicodeslot=0x015E, + shcode=0x53, + specials={ "char", 0x53, 0x327 }, + unicodeslot=0x15E, }, { adobename="scedilla", @@ -3942,10 +3950,10 @@ characters.data={ description="LATIN SMALL LETTER S WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0327 }, - uccode=0x015E, - unicodeslot=0x015F, + shcode=0x73, + specials={ "char", 0x73, 0x327 }, + uccode=0x15E, + unicodeslot=0x15F, }, { adobename="Scaron", @@ -3953,11 +3961,11 @@ characters.data={ contextname="Scaron", description="LATIN CAPITAL LETTER S WITH CARON", direction="l", - lccode=0x0161, + lccode=0x161, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x030C }, - unicodeslot=0x0160, + shcode=0x53, + specials={ "char", 0x53, 0x30C }, + unicodeslot=0x160, }, { adobename="scaron", @@ -3966,10 +3974,10 @@ characters.data={ description="LATIN SMALL LETTER S WITH CARON", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x030C }, - uccode=0x0160, - unicodeslot=0x0161, + shcode=0x73, + specials={ "char", 0x73, 0x30C }, + uccode=0x160, + unicodeslot=0x161, }, { adobename="Tcommaaccent", @@ -3977,11 +3985,11 @@ characters.data={ contextname="Tcedilla", description="LATIN CAPITAL LETTER T WITH CEDILLA", direction="l", - lccode=0x0163, + lccode=0x163, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x0327 }, - unicodeslot=0x0162, + shcode=0x54, + specials={ "char", 0x54, 0x327 }, + unicodeslot=0x162, }, { adobename="tcommaaccent", @@ -3990,10 +3998,10 @@ characters.data={ description="LATIN SMALL LETTER T WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0327 }, - uccode=0x0162, - unicodeslot=0x0163, + shcode=0x74, + specials={ "char", 0x74, 0x327 }, + uccode=0x162, + unicodeslot=0x163, }, { adobename="Tcaron", @@ -4001,11 +4009,11 @@ characters.data={ contextname="Tcaron", description="LATIN CAPITAL LETTER T WITH CARON", direction="l", - lccode=0x0165, + lccode=0x165, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x030C }, - unicodeslot=0x0164, + shcode=0x54, + specials={ "char", 0x54, 0x30C }, + unicodeslot=0x164, }, { adobename="tcaron", @@ -4014,10 +4022,10 @@ characters.data={ description="LATIN SMALL LETTER T WITH CARON", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x030C }, - uccode=0x0164, - unicodeslot=0x0165, + shcode=0x74, + specials={ "char", 0x74, 0x30C }, + uccode=0x164, + unicodeslot=0x165, }, { adobename="Tbar", @@ -4026,10 +4034,10 @@ characters.data={ contextname="Tstroke", description="LATIN CAPITAL LETTER T WITH STROKE", direction="l", - lccode=0x0167, + lccode=0x167, linebreak="al", - shcode=0x0054, - unicodeslot=0x0166, + shcode=0x54, + unicodeslot=0x166, }, { adobename="tbar", @@ -4039,9 +4047,9 @@ characters.data={ description="LATIN SMALL LETTER T WITH STROKE", direction="l", linebreak="al", - shcode=0x0074, - uccode=0x0166, - unicodeslot=0x0167, + shcode=0x74, + uccode=0x166, + unicodeslot=0x167, }, { adobename="Utilde", @@ -4049,11 +4057,11 @@ characters.data={ contextname="Utilde", description="LATIN CAPITAL LETTER U WITH TILDE", direction="l", - lccode=0x0169, + lccode=0x169, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0303 }, - unicodeslot=0x0168, + shcode=0x55, + specials={ "char", 0x55, 0x303 }, + unicodeslot=0x168, }, { adobename="utilde", @@ -4062,10 +4070,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH TILDE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0303 }, - uccode=0x0168, - unicodeslot=0x0169, + shcode=0x75, + specials={ "char", 0x75, 0x303 }, + uccode=0x168, + unicodeslot=0x169, }, { adobename="Umacron", @@ -4073,11 +4081,11 @@ characters.data={ contextname="Umacron", description="LATIN CAPITAL LETTER U WITH MACRON", direction="l", - lccode=0x016B, + lccode=0x16B, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0304 }, - unicodeslot=0x016A, + shcode=0x55, + specials={ "char", 0x55, 0x304 }, + unicodeslot=0x16A, }, { adobename="umacron", @@ -4087,10 +4095,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH MACRON", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0304 }, - uccode=0x016A, - unicodeslot=0x016B, + shcode=0x75, + specials={ "char", 0x75, 0x304 }, + uccode=0x16A, + unicodeslot=0x16B, }, { adobename="Ubreve", @@ -4098,11 +4106,11 @@ characters.data={ contextname="Ubreve", description="LATIN CAPITAL LETTER U WITH BREVE", direction="l", - lccode=0x016D, + lccode=0x16D, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0306 }, - unicodeslot=0x016C, + shcode=0x55, + specials={ "char", 0x55, 0x306 }, + unicodeslot=0x16C, }, { adobename="ubreve", @@ -4111,10 +4119,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH BREVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0306 }, - uccode=0x016C, - unicodeslot=0x016D, + shcode=0x75, + specials={ "char", 0x75, 0x306 }, + uccode=0x16C, + unicodeslot=0x16D, }, { adobename="Uring", @@ -4122,11 +4130,11 @@ characters.data={ contextname="Uring", description="LATIN CAPITAL LETTER U WITH RING ABOVE", direction="l", - lccode=0x016F, + lccode=0x16F, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x030A }, - unicodeslot=0x016E, + shcode=0x55, + specials={ "char", 0x55, 0x30A }, + unicodeslot=0x16E, }, { adobename="uring", @@ -4135,10 +4143,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH RING ABOVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x030A }, - uccode=0x016E, - unicodeslot=0x016F, + shcode=0x75, + specials={ "char", 0x75, 0x30A }, + uccode=0x16E, + unicodeslot=0x16F, }, { adobename="Uhungarumlaut", @@ -4146,11 +4154,11 @@ characters.data={ contextname="Uhungarumlaut", description="LATIN CAPITAL LETTER U WITH DOUBLE ACUTE", direction="l", - lccode=0x0171, + lccode=0x171, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x030B }, - unicodeslot=0x0170, + shcode=0x55, + specials={ "char", 0x55, 0x30B }, + unicodeslot=0x170, }, { adobename="uhungarumlaut", @@ -4159,10 +4167,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DOUBLE ACUTE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x030B }, - uccode=0x0170, - unicodeslot=0x0171, + shcode=0x75, + specials={ "char", 0x75, 0x30B }, + uccode=0x170, + unicodeslot=0x171, }, { adobename="Uogonek", @@ -4170,11 +4178,11 @@ characters.data={ contextname="Uogonek", description="LATIN CAPITAL LETTER U WITH OGONEK", direction="l", - lccode=0x0173, + lccode=0x173, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0328 }, - unicodeslot=0x0172, + shcode=0x55, + specials={ "char", 0x55, 0x328 }, + unicodeslot=0x172, }, { adobename="uogonek", @@ -4183,10 +4191,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH OGONEK", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0328 }, - uccode=0x0172, - unicodeslot=0x0173, + shcode=0x75, + specials={ "char", 0x75, 0x328 }, + uccode=0x172, + unicodeslot=0x173, }, { adobename="Wcircumflex", @@ -4194,11 +4202,11 @@ characters.data={ contextname="Wcircumflex", description="LATIN CAPITAL LETTER W WITH CIRCUMFLEX", direction="l", - lccode=0x0175, + lccode=0x175, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0302 }, - unicodeslot=0x0174, + shcode=0x57, + specials={ "char", 0x57, 0x302 }, + unicodeslot=0x174, }, { adobename="wcircumflex", @@ -4207,10 +4215,10 @@ characters.data={ description="LATIN SMALL LETTER W WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0302 }, - uccode=0x0174, - unicodeslot=0x0175, + shcode=0x77, + specials={ "char", 0x77, 0x302 }, + uccode=0x174, + unicodeslot=0x175, }, { adobename="Ycircumflex", @@ -4218,11 +4226,11 @@ characters.data={ contextname="Ycircumflex", description="LATIN CAPITAL LETTER Y WITH CIRCUMFLEX", direction="l", - lccode=0x0177, + lccode=0x177, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0302 }, - unicodeslot=0x0176, + shcode=0x59, + specials={ "char", 0x59, 0x302 }, + unicodeslot=0x176, }, { adobename="ycircumflex", @@ -4231,10 +4239,10 @@ characters.data={ description="LATIN SMALL LETTER Y WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0302 }, - uccode=0x0176, - unicodeslot=0x0177, + shcode=0x79, + specials={ "char", 0x79, 0x302 }, + uccode=0x176, + unicodeslot=0x177, }, { adobename="Ydieresis", @@ -4242,11 +4250,11 @@ characters.data={ contextname="Ydiaeresis", description="LATIN CAPITAL LETTER Y WITH DIAERESIS", direction="l", - lccode=0x00FF, + lccode=0xFF, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0308 }, - unicodeslot=0x0178, + shcode=0x59, + specials={ "char", 0x59, 0x308 }, + unicodeslot=0x178, }, { adobename="Zacute", @@ -4254,11 +4262,11 @@ characters.data={ contextname="Zacute", description="LATIN CAPITAL LETTER Z WITH ACUTE", direction="l", - lccode=0x017A, + lccode=0x17A, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x0301 }, - unicodeslot=0x0179, + shcode=0x5A, + specials={ "char", 0x5A, 0x301 }, + unicodeslot=0x179, }, { adobename="zacute", @@ -4267,10 +4275,10 @@ characters.data={ description="LATIN SMALL LETTER Z WITH ACUTE", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x0301 }, - uccode=0x0179, - unicodeslot=0x017A, + shcode=0x7A, + specials={ "char", 0x7A, 0x301 }, + uccode=0x179, + unicodeslot=0x17A, }, { adobename="Zdotaccent", @@ -4278,11 +4286,11 @@ characters.data={ contextname="Zdotaccent", description="LATIN CAPITAL LETTER Z WITH DOT ABOVE", direction="l", - lccode=0x017C, + lccode=0x17C, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x0307 }, - unicodeslot=0x017B, + shcode=0x5A, + specials={ "char", 0x5A, 0x307 }, + unicodeslot=0x17B, }, { adobename="zdotaccent", @@ -4291,10 +4299,10 @@ characters.data={ description="LATIN SMALL LETTER Z WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x0307 }, - uccode=0x017B, - unicodeslot=0x017C, + shcode=0x7A, + specials={ "char", 0x7A, 0x307 }, + uccode=0x17B, + unicodeslot=0x17C, }, { adobename="Zcaron", @@ -4302,11 +4310,11 @@ characters.data={ contextname="Zcaron", description="LATIN CAPITAL LETTER Z WITH CARON", direction="l", - lccode=0x017E, + lccode=0x17E, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x030C }, - unicodeslot=0x017D, + shcode=0x5A, + specials={ "char", 0x5A, 0x30C }, + unicodeslot=0x17D, }, { adobename="zcaron", @@ -4315,10 +4323,10 @@ characters.data={ description="LATIN SMALL LETTER Z WITH CARON", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x030C }, - uccode=0x017D, - unicodeslot=0x017E, + shcode=0x7A, + specials={ "char", 0x7A, 0x30C }, + uccode=0x17D, + unicodeslot=0x17E, }, { adobename="slong", @@ -4327,9 +4335,9 @@ characters.data={ description="LATIN SMALL LETTER LONG S", direction="l", linebreak="al", - specials={ "compat", 0x0073 }, - uccode=0x0053, - unicodeslot=0x017F, + specials={ "compat", 0x73 }, + uccode=0x53, + unicodeslot=0x17F, }, { adobename="bstroke", @@ -4338,9 +4346,9 @@ characters.data={ description="LATIN SMALL LETTER B WITH STROKE", direction="l", linebreak="al", - shcode=0x0062, - uccode=0x0243, - unicodeslot=0x0180, + shcode=0x62, + uccode=0x243, + unicodeslot=0x180, }, { adobename="Bhook", @@ -4348,20 +4356,20 @@ characters.data={ contextname="Bhook", description="LATIN CAPITAL LETTER B WITH HOOK", direction="l", - lccode=0x0253, + lccode=0x253, linebreak="al", - shcode=0x0042, - unicodeslot=0x0181, + shcode=0x42, + unicodeslot=0x181, }, { adobename="Btopbar", category="lu", description="LATIN CAPITAL LETTER B WITH TOPBAR", direction="l", - lccode=0x0183, + lccode=0x183, linebreak="al", - shcode=0x0042, - unicodeslot=0x0182, + shcode=0x42, + unicodeslot=0x182, }, { adobename="btopbar", @@ -4369,18 +4377,18 @@ characters.data={ description="LATIN SMALL LETTER B WITH TOPBAR", direction="l", linebreak="al", - shcode=0x0062, - uccode=0x0182, - unicodeslot=0x0183, + shcode=0x62, + uccode=0x182, + unicodeslot=0x183, }, { adobename="Tonesix", category="lu", description="LATIN CAPITAL LETTER TONE SIX", direction="l", - lccode=0x0185, + lccode=0x185, linebreak="al", - unicodeslot=0x0184, + unicodeslot=0x184, }, { adobename="tonesix", @@ -4388,17 +4396,17 @@ characters.data={ description="LATIN SMALL LETTER TONE SIX", direction="l", linebreak="al", - uccode=0x0184, - unicodeslot=0x0185, + uccode=0x184, + unicodeslot=0x185, }, { adobename="Oopen", category="lu", description="LATIN CAPITAL LETTER OPEN O", direction="l", - lccode=0x0254, + lccode=0x254, linebreak="al", - unicodeslot=0x0186, + unicodeslot=0x186, }, { adobename="Chook", @@ -4406,10 +4414,10 @@ characters.data={ contextname="Chook", description="LATIN CAPITAL LETTER C WITH HOOK", direction="l", - lccode=0x0188, + lccode=0x188, linebreak="al", - shcode=0x0043, - unicodeslot=0x0187, + shcode=0x43, + unicodeslot=0x187, }, { adobename="chook", @@ -4418,9 +4426,9 @@ characters.data={ description="LATIN SMALL LETTER C WITH HOOK", direction="l", linebreak="al", - shcode=0x0063, - uccode=0x0187, - unicodeslot=0x0188, + shcode=0x63, + uccode=0x187, + unicodeslot=0x188, }, { adobename="Dafrican", @@ -4428,9 +4436,9 @@ characters.data={ contextname="Dafrican", description="LATIN CAPITAL LETTER AFRICAN D", direction="l", - lccode=0x0256, + lccode=0x256, linebreak="al", - unicodeslot=0x0189, + unicodeslot=0x189, }, { adobename="Dhook", @@ -4438,20 +4446,20 @@ characters.data={ contextname="Dhook", description="LATIN CAPITAL LETTER D WITH HOOK", direction="l", - lccode=0x0257, + lccode=0x257, linebreak="al", - shcode=0x0044, - unicodeslot=0x018A, + shcode=0x44, + unicodeslot=0x18A, }, { adobename="Dtopbar", category="lu", description="LATIN CAPITAL LETTER D WITH TOPBAR", direction="l", - lccode=0x018C, + lccode=0x18C, linebreak="al", - shcode=0x0044, - unicodeslot=0x018B, + shcode=0x44, + unicodeslot=0x18B, }, { adobename="dtopbar", @@ -4459,9 +4467,9 @@ characters.data={ description="LATIN SMALL LETTER D WITH TOPBAR", direction="l", linebreak="al", - shcode=0x0064, - uccode=0x018B, - unicodeslot=0x018C, + shcode=0x64, + uccode=0x18B, + unicodeslot=0x18C, }, { adobename="deltaturned", @@ -4469,16 +4477,16 @@ characters.data={ description="LATIN SMALL LETTER TURNED DELTA", direction="l", linebreak="al", - unicodeslot=0x018D, + unicodeslot=0x18D, }, { adobename="Ereversed", category="lu", description="LATIN CAPITAL LETTER REVERSED E", direction="l", - lccode=0x01DD, + lccode=0x1DD, linebreak="al", - unicodeslot=0x018E, + unicodeslot=0x18E, }, { adobename="Schwa", @@ -4486,18 +4494,18 @@ characters.data={ contextname="Schwa", description="LATIN CAPITAL LETTER SCHWA", direction="l", - lccode=0x0259, + lccode=0x259, linebreak="al", - unicodeslot=0x018F, + unicodeslot=0x18F, }, { adobename="Eopen", category="lu", description="LATIN CAPITAL LETTER OPEN E", direction="l", - lccode=0x025B, + lccode=0x25B, linebreak="al", - unicodeslot=0x0190, + unicodeslot=0x190, }, { adobename="Fhook", @@ -4505,10 +4513,10 @@ characters.data={ contextname="Fhook", description="LATIN CAPITAL LETTER F WITH HOOK", direction="l", - lccode=0x0192, + lccode=0x192, linebreak="al", - shcode=0x0046, - unicodeslot=0x0191, + shcode=0x46, + unicodeslot=0x191, }, { adobename="florin", @@ -4517,9 +4525,9 @@ characters.data={ description="LATIN SMALL LETTER F WITH HOOK", direction="l", linebreak="al", - shcode=0x0066, - uccode=0x0191, - unicodeslot=0x0192, + shcode=0x66, + uccode=0x191, + unicodeslot=0x192, }, { adobename="Ghook", @@ -4527,19 +4535,19 @@ characters.data={ contextname="Ghook", description="LATIN CAPITAL LETTER G WITH HOOK", direction="l", - lccode=0x0260, + lccode=0x260, linebreak="al", - shcode=0x0047, - unicodeslot=0x0193, + shcode=0x47, + unicodeslot=0x193, }, { adobename="Gammaafrican", category="lu", description="LATIN CAPITAL LETTER GAMMA", direction="l", - lccode=0x0263, + lccode=0x263, linebreak="al", - unicodeslot=0x0194, + unicodeslot=0x194, }, { adobename="hv", @@ -4547,17 +4555,17 @@ characters.data={ description="LATIN SMALL LETTER HV", direction="l", linebreak="al", - uccode=0x01F6, - unicodeslot=0x0195, + uccode=0x1F6, + unicodeslot=0x195, }, { adobename="Iotaafrican", category="lu", description="LATIN CAPITAL LETTER IOTA", direction="l", - lccode=0x0269, + lccode=0x269, linebreak="al", - unicodeslot=0x0196, + unicodeslot=0x196, }, { adobename="Istroke", @@ -4565,10 +4573,10 @@ characters.data={ contextname="Istroke", description="LATIN CAPITAL LETTER I WITH STROKE", direction="l", - lccode=0x0268, + lccode=0x268, linebreak="al", - shcode=0x0049, - unicodeslot=0x0197, + shcode=0x49, + unicodeslot=0x197, }, { adobename="Khook", @@ -4576,10 +4584,10 @@ characters.data={ contextname="Khook", description="LATIN CAPITAL LETTER K WITH HOOK", direction="l", - lccode=0x0199, + lccode=0x199, linebreak="al", - shcode=0x004B, - unicodeslot=0x0198, + shcode=0x4B, + unicodeslot=0x198, }, { adobename="khook", @@ -4588,9 +4596,9 @@ characters.data={ description="LATIN SMALL LETTER K WITH HOOK", direction="l", linebreak="al", - shcode=0x006B, - uccode=0x0198, - unicodeslot=0x0199, + shcode=0x6B, + uccode=0x198, + unicodeslot=0x199, }, { adobename="lbar", @@ -4599,9 +4607,9 @@ characters.data={ description="LATIN SMALL LETTER L WITH BAR", direction="l", linebreak="al", - shcode=0x006C, - uccode=0x023D, - unicodeslot=0x019A, + shcode=0x6C, + uccode=0x23D, + unicodeslot=0x19A, }, { adobename="lambdastroke", @@ -4609,26 +4617,28 @@ characters.data={ description="LATIN SMALL LETTER LAMBDA WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x019B, + mathclass="variable", + mathname="lambdabar", + unicodeslot=0x19B, }, { adobename="Mturned", category="lu", description="LATIN CAPITAL LETTER TURNED M", direction="l", - lccode=0x026F, + lccode=0x26F, linebreak="al", - unicodeslot=0x019C, + unicodeslot=0x19C, }, { adobename="Nhookleft", category="lu", description="LATIN CAPITAL LETTER N WITH LEFT HOOK", direction="l", - lccode=0x0272, + lccode=0x272, linebreak="al", - shcode=0x004E, - unicodeslot=0x019D, + shcode=0x4E, + unicodeslot=0x19D, }, { adobename="nlegrightlong", @@ -4636,19 +4646,19 @@ characters.data={ description="LATIN SMALL LETTER N WITH LONG RIGHT LEG", direction="l", linebreak="al", - shcode=0x006E, - uccode=0x0220, - unicodeslot=0x019E, + shcode=0x6E, + uccode=0x220, + unicodeslot=0x19E, }, { adobename="Ocenteredtilde", category="lu", description="LATIN CAPITAL LETTER O WITH MIDDLE TILDE", direction="l", - lccode=0x0275, + lccode=0x275, linebreak="al", - shcode=0x004F, - unicodeslot=0x019F, + shcode=0x4F, + unicodeslot=0x19F, }, { adobename="Ohorn", @@ -4656,11 +4666,11 @@ characters.data={ contextname="Ohorn", description="LATIN CAPITAL LETTER O WITH HORN", direction="l", - lccode=0x01A1, + lccode=0x1A1, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x031B }, - unicodeslot=0x01A0, + shcode=0x4F, + specials={ "char", 0x4F, 0x31B }, + unicodeslot=0x1A0, }, { adobename="ohorn", @@ -4669,19 +4679,19 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x031B }, - uccode=0x01A0, - unicodeslot=0x01A1, + shcode=0x6F, + specials={ "char", 0x6F, 0x31B }, + uccode=0x1A0, + unicodeslot=0x1A1, }, { adobename="Oi", category="lu", description="LATIN CAPITAL LETTER OI", direction="l", - lccode=0x01A3, + lccode=0x1A3, linebreak="al", - unicodeslot=0x01A2, + unicodeslot=0x1A2, }, { adobename="oi", @@ -4689,8 +4699,8 @@ characters.data={ description="LATIN SMALL LETTER OI", direction="l", linebreak="al", - uccode=0x01A2, - unicodeslot=0x01A3, + uccode=0x1A2, + unicodeslot=0x1A3, }, { adobename="Phook", @@ -4698,10 +4708,10 @@ characters.data={ contextname="Phook", description="LATIN CAPITAL LETTER P WITH HOOK", direction="l", - lccode=0x01A5, + lccode=0x1A5, linebreak="al", - shcode=0x0050, - unicodeslot=0x01A4, + shcode=0x50, + unicodeslot=0x1A4, }, { adobename="phook", @@ -4710,27 +4720,27 @@ characters.data={ description="LATIN SMALL LETTER P WITH HOOK", direction="l", linebreak="al", - shcode=0x0070, - uccode=0x01A4, - unicodeslot=0x01A5, + shcode=0x70, + uccode=0x1A4, + unicodeslot=0x1A5, }, { adobename="yr", category="lu", description="LATIN LETTER YR", direction="l", - lccode=0x0280, + lccode=0x280, linebreak="al", - unicodeslot=0x01A6, + unicodeslot=0x1A6, }, { adobename="Tonetwo", category="lu", description="LATIN CAPITAL LETTER TONE TWO", direction="l", - lccode=0x01A8, + lccode=0x1A8, linebreak="al", - unicodeslot=0x01A7, + unicodeslot=0x1A7, }, { adobename="tonetwo", @@ -4738,17 +4748,17 @@ characters.data={ description="LATIN SMALL LETTER TONE TWO", direction="l", linebreak="al", - uccode=0x01A7, - unicodeslot=0x01A8, + uccode=0x1A7, + unicodeslot=0x1A8, }, { adobename="Esh", category="lu", description="LATIN CAPITAL LETTER ESH", direction="l", - lccode=0x0283, + lccode=0x283, linebreak="al", - unicodeslot=0x01A9, + unicodeslot=0x1A9, }, { adobename="eshreversedloop", @@ -4756,7 +4766,7 @@ characters.data={ description="LATIN LETTER REVERSED ESH LOOP", direction="l", linebreak="al", - unicodeslot=0x01AA, + unicodeslot=0x1AA, }, { adobename="tpalatalhook", @@ -4764,8 +4774,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0074, - unicodeslot=0x01AB, + shcode=0x74, + unicodeslot=0x1AB, }, { adobename="Thook", @@ -4773,10 +4783,10 @@ characters.data={ contextname="Thook", description="LATIN CAPITAL LETTER T WITH HOOK", direction="l", - lccode=0x01AD, + lccode=0x1AD, linebreak="al", - shcode=0x0054, - unicodeslot=0x01AC, + shcode=0x54, + unicodeslot=0x1AC, }, { adobename="thook", @@ -4785,19 +4795,19 @@ characters.data={ description="LATIN SMALL LETTER T WITH HOOK", direction="l", linebreak="al", - shcode=0x0074, - uccode=0x01AC, - unicodeslot=0x01AD, + shcode=0x74, + uccode=0x1AC, + unicodeslot=0x1AD, }, { adobename="Tretroflexhook", category="lu", description="LATIN CAPITAL LETTER T WITH RETROFLEX HOOK", direction="l", - lccode=0x0288, + lccode=0x288, linebreak="al", - shcode=0x0054, - unicodeslot=0x01AE, + shcode=0x54, + unicodeslot=0x1AE, }, { adobename="Uhorn", @@ -4805,11 +4815,11 @@ characters.data={ contextname="Uhorn", description="LATIN CAPITAL LETTER U WITH HORN", direction="l", - lccode=0x01B0, + lccode=0x1B0, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x031B }, - unicodeslot=0x01AF, + shcode=0x55, + specials={ "char", 0x55, 0x31B }, + unicodeslot=0x1AF, }, { adobename="uhorn", @@ -4818,19 +4828,19 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x031B }, - uccode=0x01AF, - unicodeslot=0x01B0, + shcode=0x75, + specials={ "char", 0x75, 0x31B }, + uccode=0x1AF, + unicodeslot=0x1B0, }, { adobename="Upsilonafrican", category="lu", description="LATIN CAPITAL LETTER UPSILON", direction="l", - lccode=0x028A, + lccode=0x28A, linebreak="al", - unicodeslot=0x01B1, + unicodeslot=0x1B1, }, { adobename="Vhook", @@ -4838,10 +4848,10 @@ characters.data={ contextname="Uhook", description="LATIN CAPITAL LETTER V WITH HOOK", direction="l", - lccode=0x028B, + lccode=0x28B, linebreak="al", - shcode=0x0056, - unicodeslot=0x01B2, + shcode=0x56, + unicodeslot=0x1B2, }, { adobename="Yhook", @@ -4849,10 +4859,10 @@ characters.data={ contextname="Yhook", description="LATIN CAPITAL LETTER Y WITH HOOK", direction="l", - lccode=0x01B4, + lccode=0x1B4, linebreak="al", - shcode=0x0059, - unicodeslot=0x01B3, + shcode=0x59, + unicodeslot=0x1B3, }, { adobename="yhook", @@ -4861,9 +4871,9 @@ characters.data={ description="LATIN SMALL LETTER Y WITH HOOK", direction="l", linebreak="al", - shcode=0x0079, - uccode=0x01B3, - unicodeslot=0x01B4, + shcode=0x79, + uccode=0x1B3, + unicodeslot=0x1B4, }, { adobename="Zstroke", @@ -4871,10 +4881,10 @@ characters.data={ contextname="Zstroke", description="LATIN CAPITAL LETTER Z WITH STROKE", direction="l", - lccode=0x01B6, + lccode=0x1B6, linebreak="al", - shcode=0x005A, - unicodeslot=0x01B5, + shcode=0x5A, + unicodeslot=0x1B5, }, { adobename="zstroke", @@ -4883,27 +4893,27 @@ characters.data={ description="LATIN SMALL LETTER Z WITH STROKE", direction="l", linebreak="al", - shcode=0x007A, - uccode=0x01B5, - unicodeslot=0x01B6, + shcode=0x7A, + uccode=0x1B5, + unicodeslot=0x1B6, }, { adobename="Ezh", category="lu", description="LATIN CAPITAL LETTER EZH", direction="l", - lccode=0x0292, + lccode=0x292, linebreak="al", - unicodeslot=0x01B7, + unicodeslot=0x1B7, }, { adobename="Ezhreversed", category="lu", description="LATIN CAPITAL LETTER EZH REVERSED", direction="l", - lccode=0x01B9, + lccode=0x1B9, linebreak="al", - unicodeslot=0x01B8, + unicodeslot=0x1B8, }, { adobename="ezhreversed", @@ -4911,8 +4921,8 @@ characters.data={ description="LATIN SMALL LETTER EZH REVERSED", direction="l", linebreak="al", - uccode=0x01B8, - unicodeslot=0x01B9, + uccode=0x1B8, + unicodeslot=0x1B9, }, { adobename="ezhtail", @@ -4920,8 +4930,8 @@ characters.data={ description="LATIN SMALL LETTER EZH WITH TAIL", direction="l", linebreak="al", - shcode=0x0292, - unicodeslot=0x01BA, + shcode=0x292, + unicodeslot=0x1BA, }, { adobename="twostroke", @@ -4929,16 +4939,16 @@ characters.data={ description="LATIN LETTER TWO WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x01BB, + unicodeslot=0x1BB, }, { adobename="Tonefive", category="lu", description="LATIN CAPITAL LETTER TONE FIVE", direction="l", - lccode=0x01BD, + lccode=0x1BD, linebreak="al", - unicodeslot=0x01BC, + unicodeslot=0x1BC, }, { adobename="tonefive", @@ -4946,8 +4956,8 @@ characters.data={ description="LATIN SMALL LETTER TONE FIVE", direction="l", linebreak="al", - uccode=0x01BC, - unicodeslot=0x01BD, + uccode=0x1BC, + unicodeslot=0x1BD, }, { adobename="glottalinvertedstroke", @@ -4955,7 +4965,7 @@ characters.data={ description="LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x01BE, + unicodeslot=0x1BE, }, { adobename="wynn", @@ -4963,8 +4973,8 @@ characters.data={ description="LATIN LETTER WYNN", direction="l", linebreak="al", - uccode=0x01F7, - unicodeslot=0x01BF, + uccode=0x1F7, + unicodeslot=0x1BF, }, { adobename="clickdental", @@ -4972,7 +4982,7 @@ characters.data={ description="LATIN LETTER DENTAL CLICK", direction="l", linebreak="al", - unicodeslot=0x01C0, + unicodeslot=0x1C0, }, { adobename="clicklateral", @@ -4980,7 +4990,7 @@ characters.data={ description="LATIN LETTER LATERAL CLICK", direction="l", linebreak="al", - unicodeslot=0x01C1, + unicodeslot=0x1C1, }, { adobename="clickalveolar", @@ -4988,7 +4998,7 @@ characters.data={ description="LATIN LETTER ALVEOLAR CLICK", direction="l", linebreak="al", - unicodeslot=0x01C2, + unicodeslot=0x1C2, }, { adobename="clickretroflex", @@ -4996,7 +5006,7 @@ characters.data={ description="LATIN LETTER RETROFLEX CLICK", direction="l", linebreak="al", - unicodeslot=0x01C3, + unicodeslot=0x1C3, }, { adobename="DZcaron", @@ -5004,12 +5014,12 @@ characters.data={ contextname="DZcaronligature", description="LATIN CAPITAL LETTER DZ WITH CARON", direction="l", - lccode=0x01C6, + lccode=0x1C6, linebreak="al", - shcode=0x01F1, - specials={ "compat", 0x0044, 0x017D }, - uccode=0x01C5, - unicodeslot=0x01C4, + shcode=0x1F1, + specials={ "compat", 0x44, 0x17D }, + uccode=0x1C5, + unicodeslot=0x1C4, }, { adobename="Dzcaron", @@ -5017,12 +5027,12 @@ characters.data={ contextname="Dzcaronligature", description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON", direction="l", - lccode=0x01C6, + lccode=0x1C6, linebreak="al", - shcode=0x01F2, - specials={ "compat", 0x0044, 0x017E }, - uccode=0x01C4, - unicodeslot=0x01C5, + shcode=0x1F2, + specials={ "compat", 0x44, 0x17E }, + uccode=0x1C4, + unicodeslot=0x1C5, }, { adobename="dzcaron", @@ -5031,10 +5041,10 @@ characters.data={ description="LATIN SMALL LETTER DZ WITH CARON", direction="l", linebreak="al", - shcode=0x01F3, - specials={ "compat", 0x0064, 0x017E }, - uccode=0x01C4, - unicodeslot=0x01C6, + shcode=0x1F3, + specials={ "compat", 0x64, 0x17E }, + uccode=0x1C4, + unicodeslot=0x1C6, }, { adobename="LJ", @@ -5042,12 +5052,12 @@ characters.data={ contextname="LJligature", description="LATIN CAPITAL LETTER LJ", direction="l", - lccode=0x01C9, + lccode=0x1C9, linebreak="al", - shcode={ 0x004C, 0x004A }, - specials={ "compat", 0x004C, 0x004A }, - uccode=0x01C8, - unicodeslot=0x01C7, + shcode={ 0x4C, 0x4A }, + specials={ "compat", 0x4C, 0x4A }, + uccode=0x1C8, + unicodeslot=0x1C7, }, { adobename="Lj", @@ -5055,12 +5065,12 @@ characters.data={ contextname="Ljligature", description="LATIN CAPITAL LETTER L WITH SMALL LETTER J", direction="l", - lccode=0x01C9, + lccode=0x1C9, linebreak="al", - shcode={ 0x004C, 0x006A }, - specials={ "compat", 0x004C, 0x006A }, - uccode=0x01C7, - unicodeslot=0x01C8, + shcode={ 0x4C, 0x6A }, + specials={ "compat", 0x4C, 0x6A }, + uccode=0x1C7, + unicodeslot=0x1C8, }, { adobename="lj", @@ -5069,10 +5079,10 @@ characters.data={ description="LATIN SMALL LETTER LJ", direction="l", linebreak="al", - shcode={ 0x006C, 0x006A }, - specials={ "compat", 0x006C, 0x006A }, - uccode=0x01C7, - unicodeslot=0x01C9, + shcode={ 0x6C, 0x6A }, + specials={ "compat", 0x6C, 0x6A }, + uccode=0x1C7, + unicodeslot=0x1C9, }, { adobename="NJ", @@ -5080,12 +5090,12 @@ characters.data={ contextname="NJligature", description="LATIN CAPITAL LETTER NJ", direction="l", - lccode=0x01CC, + lccode=0x1CC, linebreak="al", - shcode={ 0x004E, 0x004A }, - specials={ "compat", 0x004E, 0x004A }, - uccode=0x01CB, - unicodeslot=0x01CA, + shcode={ 0x4E, 0x4A }, + specials={ "compat", 0x4E, 0x4A }, + uccode=0x1CB, + unicodeslot=0x1CA, }, { adobename="Nj", @@ -5093,12 +5103,12 @@ characters.data={ contextname="Njligature", description="LATIN CAPITAL LETTER N WITH SMALL LETTER J", direction="l", - lccode=0x01CC, + lccode=0x1CC, linebreak="al", - shcode=0x004E, - specials={ "compat", 0x004E, 0x006A }, - uccode=0x01CA, - unicodeslot=0x01CB, + shcode=0x4E, + specials={ "compat", 0x4E, 0x6A }, + uccode=0x1CA, + unicodeslot=0x1CB, }, { adobename="nj", @@ -5107,10 +5117,10 @@ characters.data={ description="LATIN SMALL LETTER NJ", direction="l", linebreak="al", - shcode={ 0x006E, 0x006A }, - specials={ "compat", 0x006E, 0x006A }, - uccode=0x01CA, - unicodeslot=0x01CC, + shcode={ 0x6E, 0x6A }, + specials={ "compat", 0x6E, 0x6A }, + uccode=0x1CA, + unicodeslot=0x1CC, }, { adobename="Acaron", @@ -5118,11 +5128,11 @@ characters.data={ contextname="Acaron", description="LATIN CAPITAL LETTER A WITH CARON", direction="l", - lccode=0x01CE, + lccode=0x1CE, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x030C }, - unicodeslot=0x01CD, + shcode=0x41, + specials={ "char", 0x41, 0x30C }, + unicodeslot=0x1CD, }, { adobename="acaron", @@ -5132,10 +5142,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH CARON", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x030C }, - uccode=0x01CD, - unicodeslot=0x01CE, + shcode=0x61, + specials={ "char", 0x61, 0x30C }, + uccode=0x1CD, + unicodeslot=0x1CE, }, { adobename="Icaron", @@ -5143,11 +5153,11 @@ characters.data={ contextname="Icaron", description="LATIN CAPITAL LETTER I WITH CARON", direction="l", - lccode=0x01D0, + lccode=0x1D0, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x030C }, - unicodeslot=0x01CF, + shcode=0x49, + specials={ "char", 0x49, 0x30C }, + unicodeslot=0x1CF, }, { adobename="icaron", @@ -5157,10 +5167,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH CARON", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x030C }, - uccode=0x01CF, - unicodeslot=0x01D0, + shcode=0x69, + specials={ "char", 0x69, 0x30C }, + uccode=0x1CF, + unicodeslot=0x1D0, }, { adobename="Ocaron", @@ -5168,11 +5178,11 @@ characters.data={ contextname="Ocaron", description="LATIN CAPITAL LETTER O WITH CARON", direction="l", - lccode=0x01D2, + lccode=0x1D2, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x030C }, - unicodeslot=0x01D1, + shcode=0x4F, + specials={ "char", 0x4F, 0x30C }, + unicodeslot=0x1D1, }, { adobename="ocaron", @@ -5182,10 +5192,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH CARON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x030C }, - uccode=0x01D1, - unicodeslot=0x01D2, + shcode=0x6F, + specials={ "char", 0x6F, 0x30C }, + uccode=0x1D1, + unicodeslot=0x1D2, }, { adobename="Ucaron", @@ -5193,11 +5203,11 @@ characters.data={ contextname="Ucaron", description="LATIN CAPITAL LETTER U WITH CARON", direction="l", - lccode=0x01D4, + lccode=0x1D4, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x030C }, - unicodeslot=0x01D3, + shcode=0x55, + specials={ "char", 0x55, 0x30C }, + unicodeslot=0x1D3, }, { adobename="ucaron", @@ -5207,10 +5217,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH CARON", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x030C }, - uccode=0x01D3, - unicodeslot=0x01D4, + shcode=0x75, + specials={ "char", 0x75, 0x30C }, + uccode=0x1D3, + unicodeslot=0x1D4, }, { adobename="Udieresismacron", @@ -5218,11 +5228,11 @@ characters.data={ contextname="Udiaeresismacron", description="LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON", direction="l", - lccode=0x01D6, + lccode=0x1D6, linebreak="al", - shcode=0x0055, - specials={ "char", 0x00DC, 0x0304 }, - unicodeslot=0x01D5, + shcode=0x55, + specials={ "char", 0xDC, 0x304 }, + unicodeslot=0x1D5, }, { adobename="udieresismacron", @@ -5232,10 +5242,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS AND MACRON", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x00FC, 0x0304 }, - uccode=0x01D5, - unicodeslot=0x01D6, + shcode=0x75, + specials={ "char", 0xFC, 0x304 }, + uccode=0x1D5, + unicodeslot=0x1D6, }, { adobename="Udieresisacute", @@ -5243,11 +5253,11 @@ characters.data={ contextname="Udiaeresisacute", description="LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE", direction="l", - lccode=0x01D8, + lccode=0x1D8, linebreak="al", - shcode=0x0055, - specials={ "char", 0x00DC, 0x0301 }, - unicodeslot=0x01D7, + shcode=0x55, + specials={ "char", 0xDC, 0x301 }, + unicodeslot=0x1D7, }, { adobename="udieresisacute", @@ -5257,10 +5267,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x00FC, 0x0301 }, - uccode=0x01D7, - unicodeslot=0x01D8, + shcode=0x75, + specials={ "char", 0xFC, 0x301 }, + uccode=0x1D7, + unicodeslot=0x1D8, }, { adobename="Udieresiscaron", @@ -5268,11 +5278,11 @@ characters.data={ contextname="Udiaeresiscaron", description="LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON", direction="l", - lccode=0x01DA, + lccode=0x1DA, linebreak="al", - shcode=0x0055, - specials={ "char", 0x00DC, 0x030C }, - unicodeslot=0x01D9, + shcode=0x55, + specials={ "char", 0xDC, 0x30C }, + unicodeslot=0x1D9, }, { adobename="udieresiscaron", @@ -5282,10 +5292,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS AND CARON", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x00FC, 0x030C }, - uccode=0x01D9, - unicodeslot=0x01DA, + shcode=0x75, + specials={ "char", 0xFC, 0x30C }, + uccode=0x1D9, + unicodeslot=0x1DA, }, { adobename="Udieresisgrave", @@ -5293,11 +5303,11 @@ characters.data={ contextname="Udiaeresisgrave", description="LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE", direction="l", - lccode=0x01DC, + lccode=0x1DC, linebreak="al", - shcode=0x0055, - specials={ "char", 0x00DC, 0x0300 }, - unicodeslot=0x01DB, + shcode=0x55, + specials={ "char", 0xDC, 0x300 }, + unicodeslot=0x1DB, }, { adobename="udieresisgrave", @@ -5307,10 +5317,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x00FC, 0x0300 }, - uccode=0x01DB, - unicodeslot=0x01DC, + shcode=0x75, + specials={ "char", 0xFC, 0x300 }, + uccode=0x1DB, + unicodeslot=0x1DC, }, { adobename="eturned", @@ -5318,8 +5328,8 @@ characters.data={ description="LATIN SMALL LETTER TURNED E", direction="l", linebreak="al", - uccode=0x018E, - unicodeslot=0x01DD, + uccode=0x18E, + unicodeslot=0x1DD, }, { adobename="Adieresismacron", @@ -5327,11 +5337,11 @@ characters.data={ contextname="Adiaeresismacron", description="LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON", direction="l", - lccode=0x01DF, + lccode=0x1DF, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C4, 0x0304 }, - unicodeslot=0x01DE, + shcode=0x41, + specials={ "char", 0xC4, 0x304 }, + unicodeslot=0x1DE, }, { adobename="adieresismacron", @@ -5340,10 +5350,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH DIAERESIS AND MACRON", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E4, 0x0304 }, - uccode=0x01DE, - unicodeslot=0x01DF, + shcode=0x61, + specials={ "char", 0xE4, 0x304 }, + uccode=0x1DE, + unicodeslot=0x1DF, }, { adobename="Adotmacron", @@ -5351,11 +5361,11 @@ characters.data={ contextname="Adotaccentmacron", description="LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON", direction="l", - lccode=0x01E1, + lccode=0x1E1, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0226, 0x0304 }, - unicodeslot=0x01E0, + shcode=0x41, + specials={ "char", 0x226, 0x304 }, + unicodeslot=0x1E0, }, { adobename="adotmacron", @@ -5364,10 +5374,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0227, 0x0304 }, - uccode=0x01E0, - unicodeslot=0x01E1, + shcode=0x61, + specials={ "char", 0x227, 0x304 }, + uccode=0x1E0, + unicodeslot=0x1E1, }, { adobename="AEmacron", @@ -5375,11 +5385,11 @@ characters.data={ contextname="AEmacron", description="LATIN CAPITAL LETTER AE WITH MACRON", direction="l", - lccode=0x01E3, + lccode=0x1E3, linebreak="al", - shcode=0x00C6, - specials={ "char", 0x00C6, 0x0304 }, - unicodeslot=0x01E2, + shcode=0xC6, + specials={ "char", 0xC6, 0x304 }, + unicodeslot=0x1E2, }, { adobename="aemacron", @@ -5388,10 +5398,10 @@ characters.data={ description="LATIN SMALL LETTER AE WITH MACRON", direction="l", linebreak="al", - shcode=0x00E6, - specials={ "char", 0x00E6, 0x0304 }, - uccode=0x01E2, - unicodeslot=0x01E3, + shcode=0xE6, + specials={ "char", 0xE6, 0x304 }, + uccode=0x1E2, + unicodeslot=0x1E3, }, { adobename="Gstroke", @@ -5399,10 +5409,10 @@ characters.data={ contextname="Gstroke", description="LATIN CAPITAL LETTER G WITH STROKE", direction="l", - lccode=0x01E5, + lccode=0x1E5, linebreak="al", - shcode=0x0047, - unicodeslot=0x01E4, + shcode=0x47, + unicodeslot=0x1E4, }, { adobename="gstroke", @@ -5411,9 +5421,9 @@ characters.data={ description="LATIN SMALL LETTER G WITH STROKE", direction="l", linebreak="al", - shcode=0x0067, - uccode=0x01E4, - unicodeslot=0x01E5, + shcode=0x67, + uccode=0x1E4, + unicodeslot=0x1E5, }, { adobename="Gcaron", @@ -5421,11 +5431,11 @@ characters.data={ contextname="Gcaron", description="LATIN CAPITAL LETTER G WITH CARON", direction="l", - lccode=0x01E7, + lccode=0x1E7, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x030C }, - unicodeslot=0x01E6, + shcode=0x47, + specials={ "char", 0x47, 0x30C }, + unicodeslot=0x1E6, }, { adobename="gcaron", @@ -5434,10 +5444,10 @@ characters.data={ description="LATIN SMALL LETTER G WITH CARON", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x030C }, - uccode=0x01E6, - unicodeslot=0x01E7, + shcode=0x67, + specials={ "char", 0x67, 0x30C }, + uccode=0x1E6, + unicodeslot=0x1E7, }, { adobename="Kcaron", @@ -5445,11 +5455,11 @@ characters.data={ contextname="Kcaron", description="LATIN CAPITAL LETTER K WITH CARON", direction="l", - lccode=0x01E9, + lccode=0x1E9, linebreak="al", - shcode=0x004B, - specials={ "char", 0x004B, 0x030C }, - unicodeslot=0x01E8, + shcode=0x4B, + specials={ "char", 0x4B, 0x30C }, + unicodeslot=0x1E8, }, { adobename="kcaron", @@ -5458,10 +5468,10 @@ characters.data={ description="LATIN SMALL LETTER K WITH CARON", direction="l", linebreak="al", - shcode=0x006B, - specials={ "char", 0x006B, 0x030C }, - uccode=0x01E8, - unicodeslot=0x01E9, + shcode=0x6B, + specials={ "char", 0x6B, 0x30C }, + uccode=0x1E8, + unicodeslot=0x1E9, }, { adobename="Oogonek", @@ -5469,11 +5479,11 @@ characters.data={ contextname="Oogonek", description="LATIN CAPITAL LETTER O WITH OGONEK", direction="l", - lccode=0x01EB, + lccode=0x1EB, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0328 }, - unicodeslot=0x01EA, + shcode=0x4F, + specials={ "char", 0x4F, 0x328 }, + unicodeslot=0x1EA, }, { adobename="oogonek", @@ -5482,10 +5492,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH OGONEK", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0328 }, - uccode=0x01EA, - unicodeslot=0x01EB, + shcode=0x6F, + specials={ "char", 0x6F, 0x328 }, + uccode=0x1EA, + unicodeslot=0x1EB, }, { adobename="Oogonekmacron", @@ -5493,11 +5503,11 @@ characters.data={ contextname="Oogonekmacron", description="LATIN CAPITAL LETTER O WITH OGONEK AND MACRON", direction="l", - lccode=0x01ED, + lccode=0x1ED, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01EA, 0x0304 }, - unicodeslot=0x01EC, + shcode=0x4F, + specials={ "char", 0x1EA, 0x304 }, + unicodeslot=0x1EC, }, { adobename="oogonekmacron", @@ -5506,21 +5516,21 @@ characters.data={ description="LATIN SMALL LETTER O WITH OGONEK AND MACRON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01EB, 0x0304 }, - uccode=0x01EC, - unicodeslot=0x01ED, + shcode=0x6F, + specials={ "char", 0x1EB, 0x304 }, + uccode=0x1EC, + unicodeslot=0x1ED, }, { adobename="Ezhcaron", category="lu", description="LATIN CAPITAL LETTER EZH WITH CARON", direction="l", - lccode=0x01EF, + lccode=0x1EF, linebreak="al", - shcode=0x01B7, - specials={ "char", 0x01B7, 0x030C }, - unicodeslot=0x01EE, + shcode=0x1B7, + specials={ "char", 0x1B7, 0x30C }, + unicodeslot=0x1EE, }, { adobename="ezhcaron", @@ -5528,10 +5538,10 @@ characters.data={ description="LATIN SMALL LETTER EZH WITH CARON", direction="l", linebreak="al", - shcode=0x0292, - specials={ "char", 0x0292, 0x030C }, - uccode=0x01EE, - unicodeslot=0x01EF, + shcode=0x292, + specials={ "char", 0x292, 0x30C }, + uccode=0x1EE, + unicodeslot=0x1EF, }, { adobename="jcaron", @@ -5540,9 +5550,9 @@ characters.data={ description="LATIN SMALL LETTER J WITH CARON", direction="l", linebreak="al", - shcode=0x006A, - specials={ "char", 0x006A, 0x030C }, - unicodeslot=0x01F0, + shcode=0x6A, + specials={ "char", 0x6A, 0x30C }, + unicodeslot=0x1F0, }, { adobename="DZ", @@ -5550,11 +5560,11 @@ characters.data={ contextname="DZligature", description="LATIN CAPITAL LETTER DZ", direction="l", - lccode=0x01F3, + lccode=0x1F3, linebreak="al", - specials={ "compat", 0x0044, 0x005A }, - uccode=0x01F2, - unicodeslot=0x01F1, + specials={ "compat", 0x44, 0x5A }, + uccode=0x1F2, + unicodeslot=0x1F1, }, { adobename="Dz", @@ -5562,12 +5572,12 @@ characters.data={ contextname="Dzligature", description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z", direction="l", - lccode=0x01F3, + lccode=0x1F3, linebreak="al", - shcode=0x0044, - specials={ "compat", 0x0044, 0x007A }, - uccode=0x01F1, - unicodeslot=0x01F2, + shcode=0x44, + specials={ "compat", 0x44, 0x7A }, + uccode=0x1F1, + unicodeslot=0x1F2, }, { adobename="dz", @@ -5576,9 +5586,9 @@ characters.data={ description="LATIN SMALL LETTER DZ", direction="l", linebreak="al", - specials={ "compat", 0x0064, 0x007A }, - uccode=0x01F1, - unicodeslot=0x01F3, + specials={ "compat", 0x64, 0x7A }, + uccode=0x1F1, + unicodeslot=0x1F3, }, { adobename="Gacute", @@ -5586,11 +5596,11 @@ characters.data={ contextname="Gacute", description="LATIN CAPITAL LETTER G WITH ACUTE", direction="l", - lccode=0x01F5, + lccode=0x1F5, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0301 }, - unicodeslot=0x01F4, + shcode=0x47, + specials={ "char", 0x47, 0x301 }, + unicodeslot=0x1F4, }, { adobename="gacute", @@ -5599,37 +5609,37 @@ characters.data={ description="LATIN SMALL LETTER G WITH ACUTE", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0301 }, - uccode=0x01F4, - unicodeslot=0x01F5, + shcode=0x67, + specials={ "char", 0x67, 0x301 }, + uccode=0x1F4, + unicodeslot=0x1F5, }, { category="lu", description="LATIN CAPITAL LETTER HWAIR", direction="l", - lccode=0x0195, + lccode=0x195, linebreak="al", - unicodeslot=0x01F6, + unicodeslot=0x1F6, }, { category="lu", description="LATIN CAPITAL LETTER WYNN", direction="l", - lccode=0x01BF, + lccode=0x1BF, linebreak="al", - unicodeslot=0x01F7, + unicodeslot=0x1F7, }, { category="lu", contextname="Ngrave", description="LATIN CAPITAL LETTER N WITH GRAVE", direction="l", - lccode=0x01F9, + lccode=0x1F9, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0300 }, - unicodeslot=0x01F8, + shcode=0x4E, + specials={ "char", 0x4E, 0x300 }, + unicodeslot=0x1F8, }, { category="ll", @@ -5637,10 +5647,10 @@ characters.data={ description="LATIN SMALL LETTER N WITH GRAVE", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0300 }, - uccode=0x01F8, - unicodeslot=0x01F9, + shcode=0x6E, + specials={ "char", 0x6E, 0x300 }, + uccode=0x1F8, + unicodeslot=0x1F9, }, { adobename="Aringacute", @@ -5648,11 +5658,11 @@ characters.data={ contextname="Aringacute", description="LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE", direction="l", - lccode=0x01FB, + lccode=0x1FB, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C5, 0x0301 }, - unicodeslot=0x01FA, + shcode=0x41, + specials={ "char", 0xC5, 0x301 }, + unicodeslot=0x1FA, }, { adobename="aringacute", @@ -5661,10 +5671,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E5, 0x0301 }, - uccode=0x01FA, - unicodeslot=0x01FB, + shcode=0x61, + specials={ "char", 0xE5, 0x301 }, + uccode=0x1FA, + unicodeslot=0x1FB, }, { adobename="AEacute", @@ -5672,11 +5682,11 @@ characters.data={ contextname="AEacute", description="LATIN CAPITAL LETTER AE WITH ACUTE", direction="l", - lccode=0x01FD, + lccode=0x1FD, linebreak="al", - shcode=0x00C6, - specials={ "char", 0x00C6, 0x0301 }, - unicodeslot=0x01FC, + shcode=0xC6, + specials={ "char", 0xC6, 0x301 }, + unicodeslot=0x1FC, }, { adobename="aeacute", @@ -5685,10 +5695,10 @@ characters.data={ description="LATIN SMALL LETTER AE WITH ACUTE", direction="l", linebreak="al", - shcode=0x00E6, - specials={ "char", 0x00E6, 0x0301 }, - uccode=0x01FC, - unicodeslot=0x01FD, + shcode=0xE6, + specials={ "char", 0xE6, 0x301 }, + uccode=0x1FC, + unicodeslot=0x1FD, }, { adobename="Ostrokeacute", @@ -5696,11 +5706,11 @@ characters.data={ contextname="Ostrokeacute", description="LATIN CAPITAL LETTER O WITH STROKE AND ACUTE", direction="l", - lccode=0x01FF, + lccode=0x1FF, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D8, 0x0301 }, - unicodeslot=0x01FE, + shcode=0x4F, + specials={ "char", 0xD8, 0x301 }, + unicodeslot=0x1FE, }, { adobename="ostrokeacute", @@ -5709,10 +5719,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH STROKE AND ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F8, 0x0301 }, - uccode=0x01FE, - unicodeslot=0x01FF, + shcode=0x6F, + specials={ "char", 0xF8, 0x301 }, + uccode=0x1FE, + unicodeslot=0x1FF, }, { adobename="Adblgrave", @@ -5720,11 +5730,11 @@ characters.data={ contextname="Adoublegrave", description="LATIN CAPITAL LETTER A WITH DOUBLE GRAVE", direction="l", - lccode=0x0201, + lccode=0x201, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x030F }, - unicodeslot=0x0200, + shcode=0x41, + specials={ "char", 0x41, 0x30F }, + unicodeslot=0x200, }, { adobename="adblgrave", @@ -5733,10 +5743,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x030F }, - uccode=0x0200, - unicodeslot=0x0201, + shcode=0x61, + specials={ "char", 0x61, 0x30F }, + uccode=0x200, + unicodeslot=0x201, }, { adobename="Ainvertedbreve", @@ -5744,11 +5754,11 @@ characters.data={ contextname="Ainvertedbreve", description="LATIN CAPITAL LETTER A WITH INVERTED BREVE", direction="l", - lccode=0x0203, + lccode=0x203, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0311 }, - unicodeslot=0x0202, + shcode=0x41, + specials={ "char", 0x41, 0x311 }, + unicodeslot=0x202, }, { adobename="ainvertedbreve", @@ -5757,10 +5767,10 @@ characters.data={ description="LATIN SMALL LETTER A WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0311 }, - uccode=0x0202, - unicodeslot=0x0203, + shcode=0x61, + specials={ "char", 0x61, 0x311 }, + uccode=0x202, + unicodeslot=0x203, }, { adobename="Edblgrave", @@ -5768,11 +5778,11 @@ characters.data={ contextname="Edoublegrave", description="LATIN CAPITAL LETTER E WITH DOUBLE GRAVE", direction="l", - lccode=0x0205, + lccode=0x205, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x030F }, - unicodeslot=0x0204, + shcode=0x45, + specials={ "char", 0x45, 0x30F }, + unicodeslot=0x204, }, { adobename="edblgrave", @@ -5781,10 +5791,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x030F }, - uccode=0x0204, - unicodeslot=0x0205, + shcode=0x65, + specials={ "char", 0x65, 0x30F }, + uccode=0x204, + unicodeslot=0x205, }, { adobename="Einvertedbreve", @@ -5792,11 +5802,11 @@ characters.data={ contextname="Einvertedbreve", description="LATIN CAPITAL LETTER E WITH INVERTED BREVE", direction="l", - lccode=0x0207, + lccode=0x207, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0311 }, - unicodeslot=0x0206, + shcode=0x45, + specials={ "char", 0x45, 0x311 }, + unicodeslot=0x206, }, { adobename="einvertedbreve", @@ -5805,10 +5815,10 @@ characters.data={ description="LATIN SMALL LETTER E WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0311 }, - uccode=0x0206, - unicodeslot=0x0207, + shcode=0x65, + specials={ "char", 0x65, 0x311 }, + uccode=0x206, + unicodeslot=0x207, }, { adobename="Idblgrave", @@ -5816,11 +5826,11 @@ characters.data={ contextname="Idoublegrave", description="LATIN CAPITAL LETTER I WITH DOUBLE GRAVE", direction="l", - lccode=0x0209, + lccode=0x209, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x030F }, - unicodeslot=0x0208, + shcode=0x49, + specials={ "char", 0x49, 0x30F }, + unicodeslot=0x208, }, { adobename="idblgrave", @@ -5829,10 +5839,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x030F }, - uccode=0x0208, - unicodeslot=0x0209, + shcode=0x69, + specials={ "char", 0x69, 0x30F }, + uccode=0x208, + unicodeslot=0x209, }, { adobename="Iinvertedbreve", @@ -5840,11 +5850,11 @@ characters.data={ contextname="Iinvertedbreve", description="LATIN CAPITAL LETTER I WITH INVERTED BREVE", direction="l", - lccode=0x020B, + lccode=0x20B, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0311 }, - unicodeslot=0x020A, + shcode=0x49, + specials={ "char", 0x49, 0x311 }, + unicodeslot=0x20A, }, { adobename="iinvertedbreve", @@ -5853,10 +5863,10 @@ characters.data={ description="LATIN SMALL LETTER I WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0311 }, - uccode=0x020A, - unicodeslot=0x020B, + shcode=0x69, + specials={ "char", 0x69, 0x311 }, + uccode=0x20A, + unicodeslot=0x20B, }, { adobename="Odblgrave", @@ -5864,11 +5874,11 @@ characters.data={ contextname="Odoublegrave", description="LATIN CAPITAL LETTER O WITH DOUBLE GRAVE", direction="l", - lccode=0x020D, + lccode=0x20D, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x030F }, - unicodeslot=0x020C, + shcode=0x4F, + specials={ "char", 0x4F, 0x30F }, + unicodeslot=0x20C, }, { adobename="odblgrave", @@ -5877,10 +5887,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x030F }, - uccode=0x020C, - unicodeslot=0x020D, + shcode=0x6F, + specials={ "char", 0x6F, 0x30F }, + uccode=0x20C, + unicodeslot=0x20D, }, { adobename="Oinvertedbreve", @@ -5888,11 +5898,11 @@ characters.data={ contextname="Oinvertedbreve", description="LATIN CAPITAL LETTER O WITH INVERTED BREVE", direction="l", - lccode=0x020F, + lccode=0x20F, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0311 }, - unicodeslot=0x020E, + shcode=0x4F, + specials={ "char", 0x4F, 0x311 }, + unicodeslot=0x20E, }, { adobename="oinvertedbreve", @@ -5901,10 +5911,10 @@ characters.data={ description="LATIN SMALL LETTER O WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0311 }, - uccode=0x020E, - unicodeslot=0x020F, + shcode=0x6F, + specials={ "char", 0x6F, 0x311 }, + uccode=0x20E, + unicodeslot=0x20F, }, { adobename="Rdblgrave", @@ -5912,11 +5922,11 @@ characters.data={ contextname="Rdoublegrave", description="LATIN CAPITAL LETTER R WITH DOUBLE GRAVE", direction="l", - lccode=0x0211, + lccode=0x211, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x030F }, - unicodeslot=0x0210, + shcode=0x52, + specials={ "char", 0x52, 0x30F }, + unicodeslot=0x210, }, { adobename="rdblgrave", @@ -5925,10 +5935,10 @@ characters.data={ description="LATIN SMALL LETTER R WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x030F }, - uccode=0x0210, - unicodeslot=0x0211, + shcode=0x72, + specials={ "char", 0x72, 0x30F }, + uccode=0x210, + unicodeslot=0x211, }, { adobename="Rinvertedbreve", @@ -5936,11 +5946,11 @@ characters.data={ contextname="Rinvertedbreve", description="LATIN CAPITAL LETTER R WITH INVERTED BREVE", direction="l", - lccode=0x0213, + lccode=0x213, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0311 }, - unicodeslot=0x0212, + shcode=0x52, + specials={ "char", 0x52, 0x311 }, + unicodeslot=0x212, }, { adobename="rinvertedbreve", @@ -5949,10 +5959,10 @@ characters.data={ description="LATIN SMALL LETTER R WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0311 }, - uccode=0x0212, - unicodeslot=0x0213, + shcode=0x72, + specials={ "char", 0x72, 0x311 }, + uccode=0x212, + unicodeslot=0x213, }, { adobename="Udblgrave", @@ -5960,11 +5970,11 @@ characters.data={ contextname="Udoublegrave", description="LATIN CAPITAL LETTER U WITH DOUBLE GRAVE", direction="l", - lccode=0x0215, + lccode=0x215, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x030F }, - unicodeslot=0x0214, + shcode=0x55, + specials={ "char", 0x55, 0x30F }, + unicodeslot=0x214, }, { adobename="udblgrave", @@ -5973,10 +5983,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH DOUBLE GRAVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x030F }, - uccode=0x0214, - unicodeslot=0x0215, + shcode=0x75, + specials={ "char", 0x75, 0x30F }, + uccode=0x214, + unicodeslot=0x215, }, { adobename="Uinvertedbreve", @@ -5984,11 +5994,11 @@ characters.data={ contextname="Uinvertedbreve", description="LATIN CAPITAL LETTER U WITH INVERTED BREVE", direction="l", - lccode=0x0217, + lccode=0x217, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0311 }, - unicodeslot=0x0216, + shcode=0x55, + specials={ "char", 0x55, 0x311 }, + unicodeslot=0x216, }, { adobename="uinvertedbreve", @@ -5997,10 +6007,10 @@ characters.data={ description="LATIN SMALL LETTER U WITH INVERTED BREVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0311 }, - uccode=0x0216, - unicodeslot=0x0217, + shcode=0x75, + specials={ "char", 0x75, 0x311 }, + uccode=0x216, + unicodeslot=0x217, }, { adobename="Scommaaccent", @@ -6008,11 +6018,11 @@ characters.data={ contextname="Scommaaccent", description="LATIN CAPITAL LETTER S WITH COMMA BELOW", direction="l", - lccode=0x0219, + lccode=0x219, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0326 }, - unicodeslot=0x0218, + shcode=0x53, + specials={ "char", 0x53, 0x326 }, + unicodeslot=0x218, }, { adobename="scommaaccent", @@ -6021,21 +6031,21 @@ characters.data={ description="LATIN SMALL LETTER S WITH COMMA BELOW", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0326 }, - uccode=0x0218, - unicodeslot=0x0219, + shcode=0x73, + specials={ "char", 0x73, 0x326 }, + uccode=0x218, + unicodeslot=0x219, }, { category="lu", contextname="Tcommaaccent", description="LATIN CAPITAL LETTER T WITH COMMA BELOW", direction="l", - lccode=0x021B, + lccode=0x21B, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x0326 }, - unicodeslot=0x021A, + shcode=0x54, + specials={ "char", 0x54, 0x326 }, + unicodeslot=0x21A, }, { category="ll", @@ -6043,37 +6053,37 @@ characters.data={ description="LATIN SMALL LETTER T WITH COMMA BELOW", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0326 }, - uccode=0x021A, - unicodeslot=0x021B, + shcode=0x74, + specials={ "char", 0x74, 0x326 }, + uccode=0x21A, + unicodeslot=0x21B, }, { category="lu", description="LATIN CAPITAL LETTER YOGH", direction="l", - lccode=0x021D, + lccode=0x21D, linebreak="al", - unicodeslot=0x021C, + unicodeslot=0x21C, }, { category="ll", description="LATIN SMALL LETTER YOGH", direction="l", linebreak="al", - uccode=0x021C, - unicodeslot=0x021D, + uccode=0x21C, + unicodeslot=0x21D, }, { category="lu", contextname="Hcaron", description="LATIN CAPITAL LETTER H WITH CARON", direction="l", - lccode=0x021F, + lccode=0x21F, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x030C }, - unicodeslot=0x021E, + shcode=0x48, + specials={ "char", 0x48, 0x30C }, + unicodeslot=0x21E, }, { category="ll", @@ -6081,19 +6091,19 @@ characters.data={ description="LATIN SMALL LETTER H WITH CARON", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x030C }, - uccode=0x021E, - unicodeslot=0x021F, + shcode=0x68, + specials={ "char", 0x68, 0x30C }, + uccode=0x21E, + unicodeslot=0x21F, }, { category="lu", description="LATIN CAPITAL LETTER N WITH LONG RIGHT LEG", direction="l", - lccode=0x019E, + lccode=0x19E, linebreak="al", - shcode=0x004E, - unicodeslot=0x0220, + shcode=0x4E, + unicodeslot=0x220, }, { category="ll", @@ -6101,34 +6111,34 @@ characters.data={ description="LATIN SMALL LETTER D WITH CURL", direction="l", linebreak="al", - shcode=0x0064, - unicodeslot=0x0221, + shcode=0x64, + unicodeslot=0x221, }, { category="lu", description="LATIN CAPITAL LETTER OU", direction="l", - lccode=0x0223, + lccode=0x223, linebreak="al", - unicodeslot=0x0222, + unicodeslot=0x222, }, { category="ll", description="LATIN SMALL LETTER OU", direction="l", linebreak="al", - uccode=0x0222, - unicodeslot=0x0223, + uccode=0x222, + unicodeslot=0x223, }, { category="lu", contextname="Zhook", description="LATIN CAPITAL LETTER Z WITH HOOK", direction="l", - lccode=0x0225, + lccode=0x225, linebreak="al", - shcode=0x005A, - unicodeslot=0x0224, + shcode=0x5A, + unicodeslot=0x224, }, { category="ll", @@ -6136,20 +6146,20 @@ characters.data={ description="LATIN SMALL LETTER Z WITH HOOK", direction="l", linebreak="al", - shcode=0x007A, - uccode=0x0224, - unicodeslot=0x0225, + shcode=0x7A, + uccode=0x224, + unicodeslot=0x225, }, { category="lu", contextname="Adotaccent", description="LATIN CAPITAL LETTER A WITH DOT ABOVE", direction="l", - lccode=0x0227, + lccode=0x227, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0307 }, - unicodeslot=0x0226, + shcode=0x41, + specials={ "char", 0x41, 0x307 }, + unicodeslot=0x226, }, { category="ll", @@ -6157,21 +6167,21 @@ characters.data={ description="LATIN SMALL LETTER A WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0307 }, - uccode=0x0226, - unicodeslot=0x0227, + shcode=0x61, + specials={ "char", 0x61, 0x307 }, + uccode=0x226, + unicodeslot=0x227, }, { category="lu", contextname="Ecedilla", description="LATIN CAPITAL LETTER E WITH CEDILLA", direction="l", - lccode=0x0229, + lccode=0x229, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0327 }, - unicodeslot=0x0228, + shcode=0x45, + specials={ "char", 0x45, 0x327 }, + unicodeslot=0x228, }, { category="ll", @@ -6179,21 +6189,21 @@ characters.data={ description="LATIN SMALL LETTER E WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0327 }, - uccode=0x0228, - unicodeslot=0x0229, + shcode=0x65, + specials={ "char", 0x65, 0x327 }, + uccode=0x228, + unicodeslot=0x229, }, { category="lu", contextname="Odiaeresismacron", description="LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON", direction="l", - lccode=0x022B, + lccode=0x22B, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D6, 0x0304 }, - unicodeslot=0x022A, + shcode=0x4F, + specials={ "char", 0xD6, 0x304 }, + unicodeslot=0x22A, }, { category="ll", @@ -6201,21 +6211,21 @@ characters.data={ description="LATIN SMALL LETTER O WITH DIAERESIS AND MACRON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F6, 0x0304 }, - uccode=0x022A, - unicodeslot=0x022B, + shcode=0x6F, + specials={ "char", 0xF6, 0x304 }, + uccode=0x22A, + unicodeslot=0x22B, }, { category="lu", contextname="Otildemacron", description="LATIN CAPITAL LETTER O WITH TILDE AND MACRON", direction="l", - lccode=0x022D, + lccode=0x22D, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D5, 0x0304 }, - unicodeslot=0x022C, + shcode=0x4F, + specials={ "char", 0xD5, 0x304 }, + unicodeslot=0x22C, }, { category="ll", @@ -6223,21 +6233,21 @@ characters.data={ description="LATIN SMALL LETTER O WITH TILDE AND MACRON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F5, 0x0304 }, - uccode=0x022C, - unicodeslot=0x022D, + shcode=0x6F, + specials={ "char", 0xF5, 0x304 }, + uccode=0x22C, + unicodeslot=0x22D, }, { category="lu", contextname="Odotaccent", description="LATIN CAPITAL LETTER O WITH DOT ABOVE", direction="l", - lccode=0x022F, + lccode=0x22F, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0307 }, - unicodeslot=0x022E, + shcode=0x4F, + specials={ "char", 0x4F, 0x307 }, + unicodeslot=0x22E, }, { category="ll", @@ -6245,21 +6255,21 @@ characters.data={ description="LATIN SMALL LETTER O WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0307 }, - uccode=0x022E, - unicodeslot=0x022F, + shcode=0x6F, + specials={ "char", 0x6F, 0x307 }, + uccode=0x22E, + unicodeslot=0x22F, }, { category="lu", contextname="Odotaccentmacron", description="LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON", direction="l", - lccode=0x0231, + lccode=0x231, linebreak="al", - shcode=0x004F, - specials={ "char", 0x022E, 0x0304 }, - unicodeslot=0x0230, + shcode=0x4F, + specials={ "char", 0x22E, 0x304 }, + unicodeslot=0x230, }, { category="ll", @@ -6267,21 +6277,21 @@ characters.data={ description="LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x022F, 0x0304 }, - uccode=0x0230, - unicodeslot=0x0231, + shcode=0x6F, + specials={ "char", 0x22F, 0x304 }, + uccode=0x230, + unicodeslot=0x231, }, { category="lu", contextname="Ymacron", description="LATIN CAPITAL LETTER Y WITH MACRON", direction="l", - lccode=0x0233, + lccode=0x233, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0304 }, - unicodeslot=0x0232, + shcode=0x59, + specials={ "char", 0x59, 0x304 }, + unicodeslot=0x232, }, { category="ll", @@ -6289,10 +6299,10 @@ characters.data={ description="LATIN SMALL LETTER Y WITH MACRON", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0304 }, - uccode=0x0232, - unicodeslot=0x0233, + shcode=0x79, + specials={ "char", 0x79, 0x304 }, + uccode=0x232, + unicodeslot=0x233, }, { category="ll", @@ -6300,8 +6310,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH CURL", direction="l", linebreak="al", - shcode=0x006C, - unicodeslot=0x0234, + shcode=0x6C, + unicodeslot=0x234, }, { category="ll", @@ -6309,8 +6319,8 @@ characters.data={ description="LATIN SMALL LETTER N WITH CURL", direction="l", linebreak="al", - shcode=0x006E, - unicodeslot=0x0235, + shcode=0x6E, + unicodeslot=0x235, }, { category="ll", @@ -6318,8 +6328,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH CURL", direction="l", linebreak="al", - shcode=0x0074, - unicodeslot=0x0236, + shcode=0x74, + unicodeslot=0x236, }, { category="ll", @@ -6327,21 +6337,21 @@ characters.data={ description="LATIN SMALL LETTER DOTLESS J", direction="l", linebreak="al", - unicodeslot=0x0237, + unicodeslot=0x237, }, { category="ll", description="LATIN SMALL LETTER DB DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x0238, + unicodeslot=0x238, }, { category="ll", description="LATIN SMALL LETTER QP DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x0239, + unicodeslot=0x239, }, { category="lu", @@ -6350,18 +6360,18 @@ characters.data={ direction="l", lccode=0x2C65, linebreak="al", - shcode=0x0041, - unicodeslot=0x023A, + shcode=0x41, + unicodeslot=0x23A, }, { category="lu", contextname="Cstroke", description="LATIN CAPITAL LETTER C WITH STROKE", direction="l", - lccode=0x023C, + lccode=0x23C, linebreak="al", - shcode=0x0043, - unicodeslot=0x023B, + shcode=0x43, + unicodeslot=0x23B, }, { category="ll", @@ -6369,19 +6379,19 @@ characters.data={ description="LATIN SMALL LETTER C WITH STROKE", direction="l", linebreak="al", - shcode=0x0063, - uccode=0x023B, - unicodeslot=0x023C, + shcode=0x63, + uccode=0x23B, + unicodeslot=0x23C, }, { category="lu", contextname="Lbar", description="LATIN CAPITAL LETTER L WITH BAR", direction="l", - lccode=0x019A, + lccode=0x19A, linebreak="al", - shcode=0x004C, - unicodeslot=0x023D, + shcode=0x4C, + unicodeslot=0x23D, }, { category="lu", @@ -6389,154 +6399,154 @@ characters.data={ direction="l", lccode=0x2C66, linebreak="al", - shcode=0x0054, - unicodeslot=0x023E, + shcode=0x54, + unicodeslot=0x23E, }, { category="ll", description="LATIN SMALL LETTER S WITH SWASH TAIL", direction="l", linebreak="al", - shcode=0x0073, - unicodeslot=0x023F, + shcode=0x73, + unicodeslot=0x23F, }, { category="ll", description="LATIN SMALL LETTER Z WITH SWASH TAIL", direction="l", linebreak="al", - shcode=0x007A, - unicodeslot=0x0240, + shcode=0x7A, + unicodeslot=0x240, }, { category="lu", description="LATIN CAPITAL LETTER GLOTTAL STOP", direction="l", - lccode=0x0242, + lccode=0x242, linebreak="al", - unicodeslot=0x0241, + unicodeslot=0x241, }, { category="ll", description="LATIN SMALL LETTER GLOTTAL STOP", direction="l", linebreak="al", - uccode=0x0241, - unicodeslot=0x0242, + uccode=0x241, + unicodeslot=0x242, }, { category="lu", description="LATIN CAPITAL LETTER B WITH STROKE", direction="l", - lccode=0x0180, + lccode=0x180, linebreak="al", - shcode=0x0042, - unicodeslot=0x0243, + shcode=0x42, + unicodeslot=0x243, }, { category="lu", description="LATIN CAPITAL LETTER U BAR", direction="l", - lccode=0x0289, + lccode=0x289, linebreak="al", - unicodeslot=0x0244, + unicodeslot=0x244, }, { category="lu", description="LATIN CAPITAL LETTER TURNED V", direction="l", - lccode=0x028C, + lccode=0x28C, linebreak="al", - unicodeslot=0x0245, + unicodeslot=0x245, }, { category="lu", description="LATIN CAPITAL LETTER E WITH STROKE", direction="l", - lccode=0x0247, + lccode=0x247, linebreak="al", - shcode=0x0045, - unicodeslot=0x0246, + shcode=0x45, + unicodeslot=0x246, }, { category="ll", description="LATIN SMALL LETTER E WITH STROKE", direction="l", linebreak="al", - shcode=0x0065, - uccode=0x0246, - unicodeslot=0x0247, + shcode=0x65, + uccode=0x246, + unicodeslot=0x247, }, { category="lu", description="LATIN CAPITAL LETTER J WITH STROKE", direction="l", - lccode=0x0249, + lccode=0x249, linebreak="al", - shcode=0x004A, - unicodeslot=0x0248, + shcode=0x4A, + unicodeslot=0x248, }, { category="ll", description="LATIN SMALL LETTER J WITH STROKE", direction="l", linebreak="al", - shcode=0x006A, - uccode=0x0248, - unicodeslot=0x0249, + shcode=0x6A, + uccode=0x248, + unicodeslot=0x249, }, { category="lu", description="LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL", direction="l", - lccode=0x024B, + lccode=0x24B, linebreak="al", - unicodeslot=0x024A, + unicodeslot=0x24A, }, { category="ll", description="LATIN SMALL LETTER Q WITH HOOK TAIL", direction="l", linebreak="al", - shcode=0x0071, - uccode=0x024A, - unicodeslot=0x024B, + shcode=0x71, + uccode=0x24A, + unicodeslot=0x24B, }, { category="lu", description="LATIN CAPITAL LETTER R WITH STROKE", direction="l", - lccode=0x024D, + lccode=0x24D, linebreak="al", - shcode=0x0052, - unicodeslot=0x024C, + shcode=0x52, + unicodeslot=0x24C, }, { category="ll", description="LATIN SMALL LETTER R WITH STROKE", direction="l", linebreak="al", - shcode=0x0072, - uccode=0x024C, - unicodeslot=0x024D, + shcode=0x72, + uccode=0x24C, + unicodeslot=0x24D, }, { category="lu", description="LATIN CAPITAL LETTER Y WITH STROKE", direction="l", - lccode=0x024F, + lccode=0x24F, linebreak="al", - shcode=0x0059, - unicodeslot=0x024E, + shcode=0x59, + unicodeslot=0x24E, }, { category="ll", description="LATIN SMALL LETTER Y WITH STROKE", direction="l", linebreak="al", - shcode=0x0079, - uccode=0x024E, - unicodeslot=0x024F, + shcode=0x79, + uccode=0x24E, + unicodeslot=0x24F, }, { adobename="aturned", @@ -6544,7 +6554,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED A", direction="l", linebreak="al", - unicodeslot=0x0250, + unicodeslot=0x250, }, { adobename="ascript", @@ -6553,7 +6563,7 @@ characters.data={ description="LATIN SMALL LETTER ALPHA", direction="l", linebreak="al", - unicodeslot=0x0251, + unicodeslot=0x251, }, { adobename="ascriptturned", @@ -6561,7 +6571,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED ALPHA", direction="l", linebreak="al", - unicodeslot=0x0252, + unicodeslot=0x252, }, { adobename="bhook", @@ -6570,9 +6580,9 @@ characters.data={ description="LATIN SMALL LETTER B WITH HOOK", direction="l", linebreak="al", - shcode=0x0062, - uccode=0x0181, - unicodeslot=0x0253, + shcode=0x62, + uccode=0x181, + unicodeslot=0x253, }, { adobename="oopen", @@ -6580,8 +6590,8 @@ characters.data={ description="LATIN SMALL LETTER OPEN O", direction="l", linebreak="al", - uccode=0x0186, - unicodeslot=0x0254, + uccode=0x186, + unicodeslot=0x254, }, { adobename="ccurl", @@ -6590,8 +6600,8 @@ characters.data={ description="LATIN SMALL LETTER C WITH CURL", direction="l", linebreak="al", - shcode=0x0063, - unicodeslot=0x0255, + shcode=0x63, + unicodeslot=0x255, }, { adobename="dtail", @@ -6600,9 +6610,9 @@ characters.data={ description="LATIN SMALL LETTER D WITH TAIL", direction="l", linebreak="al", - shcode=0x0064, - uccode=0x0189, - unicodeslot=0x0256, + shcode=0x64, + uccode=0x189, + unicodeslot=0x256, }, { adobename="dhook", @@ -6611,9 +6621,9 @@ characters.data={ description="LATIN SMALL LETTER D WITH HOOK", direction="l", linebreak="al", - shcode=0x0064, - uccode=0x018A, - unicodeslot=0x0257, + shcode=0x64, + uccode=0x18A, + unicodeslot=0x257, }, { adobename="ereversed", @@ -6621,7 +6631,7 @@ characters.data={ description="LATIN SMALL LETTER REVERSED E", direction="l", linebreak="al", - unicodeslot=0x0258, + unicodeslot=0x258, }, { adobename="schwa", @@ -6630,8 +6640,8 @@ characters.data={ description="LATIN SMALL LETTER SCHWA", direction="l", linebreak="al", - uccode=0x018F, - unicodeslot=0x0259, + uccode=0x18F, + unicodeslot=0x259, }, { adobename="schwahook", @@ -6640,8 +6650,8 @@ characters.data={ description="LATIN SMALL LETTER SCHWA WITH HOOK", direction="l", linebreak="al", - shcode=0x0259, - unicodeslot=0x025A, + shcode=0x259, + unicodeslot=0x25A, }, { adobename="eopen", @@ -6649,8 +6659,8 @@ characters.data={ description="LATIN SMALL LETTER OPEN E", direction="l", linebreak="al", - uccode=0x0190, - unicodeslot=0x025B, + uccode=0x190, + unicodeslot=0x25B, }, { adobename="eopenreversed", @@ -6658,7 +6668,7 @@ characters.data={ description="LATIN SMALL LETTER REVERSED OPEN E", direction="l", linebreak="al", - unicodeslot=0x025C, + unicodeslot=0x25C, }, { adobename="eopenreversedhook", @@ -6666,7 +6676,7 @@ characters.data={ description="LATIN SMALL LETTER REVERSED OPEN E WITH HOOK", direction="l", linebreak="al", - unicodeslot=0x025D, + unicodeslot=0x25D, }, { adobename="eopenreversedclosed", @@ -6674,7 +6684,7 @@ characters.data={ description="LATIN SMALL LETTER CLOSED REVERSED OPEN E", direction="l", linebreak="al", - unicodeslot=0x025E, + unicodeslot=0x25E, }, { adobename="jdotlessstroke", @@ -6683,7 +6693,7 @@ characters.data={ description="LATIN SMALL LETTER DOTLESS J WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x025F, + unicodeslot=0x25F, }, { adobename="ghook", @@ -6691,9 +6701,9 @@ characters.data={ description="LATIN SMALL LETTER G WITH HOOK", direction="l", linebreak="al", - shcode=0x0067, - uccode=0x0193, - unicodeslot=0x0260, + shcode=0x67, + uccode=0x193, + unicodeslot=0x260, }, { adobename="gscript", @@ -6702,14 +6712,14 @@ characters.data={ description="LATIN SMALL LETTER SCRIPT G", direction="l", linebreak="al", - unicodeslot=0x0261, + unicodeslot=0x261, }, { category="ll", description="LATIN LETTER SMALL CAPITAL G", direction="l", linebreak="al", - unicodeslot=0x0262, + unicodeslot=0x262, }, { adobename="gammalatinsmall", @@ -6717,8 +6727,8 @@ characters.data={ description="LATIN SMALL LETTER GAMMA", direction="l", linebreak="al", - uccode=0x0194, - unicodeslot=0x0263, + uccode=0x194, + unicodeslot=0x263, }, { adobename="ramshorn", @@ -6726,7 +6736,7 @@ characters.data={ description="LATIN SMALL LETTER RAMS HORN", direction="l", linebreak="al", - unicodeslot=0x0264, + unicodeslot=0x264, }, { adobename="hturned", @@ -6734,7 +6744,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED H", direction="l", linebreak="al", - unicodeslot=0x0265, + unicodeslot=0x265, }, { adobename="hhook", @@ -6742,8 +6752,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH HOOK", direction="l", linebreak="al", - shcode=0x0068, - unicodeslot=0x0266, + shcode=0x68, + unicodeslot=0x266, }, { adobename="henghook", @@ -6751,7 +6761,7 @@ characters.data={ description="LATIN SMALL LETTER HENG WITH HOOK", direction="l", linebreak="al", - unicodeslot=0x0267, + unicodeslot=0x267, }, { adobename="istroke", @@ -6759,9 +6769,9 @@ characters.data={ description="LATIN SMALL LETTER I WITH STROKE", direction="l", linebreak="al", - shcode=0x0069, - uccode=0x0197, - unicodeslot=0x0268, + shcode=0x69, + uccode=0x197, + unicodeslot=0x268, }, { adobename="iotalatin", @@ -6769,15 +6779,15 @@ characters.data={ description="LATIN SMALL LETTER IOTA", direction="l", linebreak="al", - uccode=0x0196, - unicodeslot=0x0269, + uccode=0x196, + unicodeslot=0x269, }, { category="ll", description="LATIN LETTER SMALL CAPITAL I", direction="l", linebreak="al", - unicodeslot=0x026A, + unicodeslot=0x26A, }, { adobename="lmiddletilde", @@ -6785,9 +6795,9 @@ characters.data={ description="LATIN SMALL LETTER L WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x006C, + shcode=0x6C, uccode=0x2C62, - unicodeslot=0x026B, + unicodeslot=0x26B, }, { adobename="lbelt", @@ -6795,8 +6805,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH BELT", direction="l", linebreak="al", - shcode=0x006C, - unicodeslot=0x026C, + shcode=0x6C, + unicodeslot=0x26C, }, { adobename="lhookretroflex", @@ -6804,8 +6814,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x006C, - unicodeslot=0x026D, + shcode=0x6C, + unicodeslot=0x26D, }, { adobename="lezh", @@ -6813,7 +6823,7 @@ characters.data={ description="LATIN SMALL LETTER LEZH", direction="l", linebreak="al", - unicodeslot=0x026E, + unicodeslot=0x26E, }, { adobename="mturned", @@ -6821,8 +6831,8 @@ characters.data={ description="LATIN SMALL LETTER TURNED M", direction="l", linebreak="al", - uccode=0x019C, - unicodeslot=0x026F, + uccode=0x19C, + unicodeslot=0x26F, }, { adobename="mlonglegturned", @@ -6830,7 +6840,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED M WITH LONG LEG", direction="l", linebreak="al", - unicodeslot=0x0270, + unicodeslot=0x270, }, { adobename="mhook", @@ -6838,8 +6848,8 @@ characters.data={ description="LATIN SMALL LETTER M WITH HOOK", direction="l", linebreak="al", - shcode=0x006D, - unicodeslot=0x0271, + shcode=0x6D, + unicodeslot=0x271, }, { adobename="nhookleft", @@ -6847,9 +6857,9 @@ characters.data={ description="LATIN SMALL LETTER N WITH LEFT HOOK", direction="l", linebreak="al", - shcode=0x006E, - uccode=0x019D, - unicodeslot=0x0272, + shcode=0x6E, + uccode=0x19D, + unicodeslot=0x272, }, { adobename="nhookretroflex", @@ -6857,15 +6867,15 @@ characters.data={ description="LATIN SMALL LETTER N WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x006E, - unicodeslot=0x0273, + shcode=0x6E, + unicodeslot=0x273, }, { category="ll", description="LATIN LETTER SMALL CAPITAL N", direction="l", linebreak="al", - unicodeslot=0x0274, + unicodeslot=0x274, }, { adobename="obarred", @@ -6873,15 +6883,15 @@ characters.data={ description="LATIN SMALL LETTER BARRED O", direction="l", linebreak="al", - uccode=0x019F, - unicodeslot=0x0275, + uccode=0x19F, + unicodeslot=0x275, }, { category="ll", description="LATIN LETTER SMALL CAPITAL OE", direction="l", linebreak="al", - unicodeslot=0x0276, + unicodeslot=0x276, }, { adobename="omegalatinclosed", @@ -6889,7 +6899,7 @@ characters.data={ description="LATIN SMALL LETTER CLOSED OMEGA", direction="l", linebreak="al", - unicodeslot=0x0277, + unicodeslot=0x277, }, { adobename="philatin", @@ -6897,7 +6907,7 @@ characters.data={ description="LATIN SMALL LETTER PHI", direction="l", linebreak="al", - unicodeslot=0x0278, + unicodeslot=0x278, }, { adobename="rturned", @@ -6905,7 +6915,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED R", direction="l", linebreak="al", - unicodeslot=0x0279, + unicodeslot=0x279, }, { adobename="rlonglegturned", @@ -6913,7 +6923,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED R WITH LONG LEG", direction="l", linebreak="al", - unicodeslot=0x027A, + unicodeslot=0x27A, }, { adobename="rhookturned", @@ -6921,7 +6931,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED R WITH HOOK", direction="l", linebreak="al", - unicodeslot=0x027B, + unicodeslot=0x27B, }, { adobename="rlongleg", @@ -6929,8 +6939,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH LONG LEG", direction="l", linebreak="al", - shcode=0x0072, - unicodeslot=0x027C, + shcode=0x72, + unicodeslot=0x27C, }, { adobename="rhook", @@ -6938,9 +6948,9 @@ characters.data={ description="LATIN SMALL LETTER R WITH TAIL", direction="l", linebreak="al", - shcode=0x0072, + shcode=0x72, uccode=0x2C64, - unicodeslot=0x027D, + unicodeslot=0x27D, }, { adobename="rfishhook", @@ -6948,8 +6958,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH FISHHOOK", direction="l", linebreak="al", - shcode=0x0072, - unicodeslot=0x027E, + shcode=0x72, + unicodeslot=0x27E, }, { adobename="rfishhookreversed", @@ -6957,15 +6967,15 @@ characters.data={ description="LATIN SMALL LETTER REVERSED R WITH FISHHOOK", direction="l", linebreak="al", - unicodeslot=0x027F, + unicodeslot=0x27F, }, { category="ll", description="LATIN LETTER SMALL CAPITAL R", direction="l", linebreak="al", - uccode=0x01A6, - unicodeslot=0x0280, + uccode=0x1A6, + unicodeslot=0x280, }, { adobename="Rsmallinverted", @@ -6973,7 +6983,7 @@ characters.data={ description="LATIN LETTER SMALL CAPITAL INVERTED R", direction="l", linebreak="al", - unicodeslot=0x0281, + unicodeslot=0x281, }, { adobename="shook", @@ -6981,8 +6991,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH HOOK", direction="l", linebreak="al", - shcode=0x0073, - unicodeslot=0x0282, + shcode=0x73, + unicodeslot=0x282, }, { adobename="esh", @@ -6990,8 +7000,8 @@ characters.data={ description="LATIN SMALL LETTER ESH", direction="l", linebreak="al", - uccode=0x01A9, - unicodeslot=0x0283, + uccode=0x1A9, + unicodeslot=0x283, }, { adobename="dotlessjstrokehook", @@ -6999,7 +7009,7 @@ characters.data={ description="LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", direction="l", linebreak="al", - unicodeslot=0x0284, + unicodeslot=0x284, }, { adobename="eshsquatreversed", @@ -7007,7 +7017,7 @@ characters.data={ description="LATIN SMALL LETTER SQUAT REVERSED ESH", direction="l", linebreak="al", - unicodeslot=0x0285, + unicodeslot=0x285, }, { adobename="eshcurl", @@ -7015,8 +7025,8 @@ characters.data={ description="LATIN SMALL LETTER ESH WITH CURL", direction="l", linebreak="al", - shcode=0x0283, - unicodeslot=0x0286, + shcode=0x283, + unicodeslot=0x286, }, { adobename="tturned", @@ -7024,7 +7034,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED T", direction="l", linebreak="al", - unicodeslot=0x0287, + unicodeslot=0x287, }, { adobename="tretroflexhook", @@ -7032,9 +7042,9 @@ characters.data={ description="LATIN SMALL LETTER T WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0074, - uccode=0x01AE, - unicodeslot=0x0288, + shcode=0x74, + uccode=0x1AE, + unicodeslot=0x288, }, { adobename="ubar", @@ -7042,8 +7052,8 @@ characters.data={ description="LATIN SMALL LETTER U BAR", direction="l", linebreak="al", - uccode=0x0244, - unicodeslot=0x0289, + uccode=0x244, + unicodeslot=0x289, }, { adobename="upsilonlatin", @@ -7051,8 +7061,8 @@ characters.data={ description="LATIN SMALL LETTER UPSILON", direction="l", linebreak="al", - uccode=0x01B1, - unicodeslot=0x028A, + uccode=0x1B1, + unicodeslot=0x28A, }, { adobename="vhook", @@ -7060,9 +7070,9 @@ characters.data={ description="LATIN SMALL LETTER V WITH HOOK", direction="l", linebreak="al", - shcode=0x0076, - uccode=0x01B2, - unicodeslot=0x028B, + shcode=0x76, + uccode=0x1B2, + unicodeslot=0x28B, }, { adobename="vturned", @@ -7070,8 +7080,8 @@ characters.data={ description="LATIN SMALL LETTER TURNED V", direction="l", linebreak="al", - uccode=0x0245, - unicodeslot=0x028C, + uccode=0x245, + unicodeslot=0x28C, }, { adobename="wturned", @@ -7079,7 +7089,7 @@ characters.data={ description="LATIN SMALL LETTER TURNED W", direction="l", linebreak="al", - unicodeslot=0x028D, + unicodeslot=0x28D, }, { adobename="yturned", @@ -7087,14 +7097,14 @@ characters.data={ description="LATIN SMALL LETTER TURNED Y", direction="l", linebreak="al", - unicodeslot=0x028E, + unicodeslot=0x28E, }, { category="ll", description="LATIN LETTER SMALL CAPITAL Y", direction="l", linebreak="al", - unicodeslot=0x028F, + unicodeslot=0x28F, }, { adobename="zretroflexhook", @@ -7102,8 +7112,8 @@ characters.data={ description="LATIN SMALL LETTER Z WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x007A, - unicodeslot=0x0290, + shcode=0x7A, + unicodeslot=0x290, }, { adobename="zcurl", @@ -7111,8 +7121,8 @@ characters.data={ description="LATIN SMALL LETTER Z WITH CURL", direction="l", linebreak="al", - shcode=0x007A, - unicodeslot=0x0291, + shcode=0x7A, + unicodeslot=0x291, }, { adobename="ezh", @@ -7120,8 +7130,8 @@ characters.data={ description="LATIN SMALL LETTER EZH", direction="l", linebreak="al", - uccode=0x01B7, - unicodeslot=0x0292, + uccode=0x1B7, + unicodeslot=0x292, }, { adobename="ezhcurl", @@ -7129,8 +7139,8 @@ characters.data={ description="LATIN SMALL LETTER EZH WITH CURL", direction="l", linebreak="al", - shcode=0x0292, - unicodeslot=0x0293, + shcode=0x292, + unicodeslot=0x293, }, { adobename="glottalstop", @@ -7138,7 +7148,7 @@ characters.data={ description="LATIN LETTER GLOTTAL STOP", direction="l", linebreak="al", - unicodeslot=0x0294, + unicodeslot=0x294, }, { adobename="glottalstopreversed", @@ -7146,7 +7156,7 @@ characters.data={ description="LATIN LETTER PHARYNGEAL VOICED FRICATIVE", direction="l", linebreak="al", - unicodeslot=0x0295, + unicodeslot=0x295, }, { adobename="glottalstopinverted", @@ -7154,7 +7164,7 @@ characters.data={ description="LATIN LETTER INVERTED GLOTTAL STOP", direction="l", linebreak="al", - unicodeslot=0x0296, + unicodeslot=0x296, }, { adobename="cstretched", @@ -7162,7 +7172,7 @@ characters.data={ description="LATIN LETTER STRETCHED C", direction="l", linebreak="al", - unicodeslot=0x0297, + unicodeslot=0x297, }, { adobename="bilabialclick", @@ -7170,14 +7180,14 @@ characters.data={ description="LATIN LETTER BILABIAL CLICK", direction="l", linebreak="al", - unicodeslot=0x0298, + unicodeslot=0x298, }, { category="ll", description="LATIN LETTER SMALL CAPITAL B", direction="l", linebreak="al", - unicodeslot=0x0299, + unicodeslot=0x299, }, { adobename="eopenclosed", @@ -7185,7 +7195,7 @@ characters.data={ description="LATIN SMALL LETTER CLOSED OPEN E", direction="l", linebreak="al", - unicodeslot=0x029A, + unicodeslot=0x29A, }, { adobename="Gsmallhook", @@ -7193,14 +7203,14 @@ characters.data={ description="LATIN LETTER SMALL CAPITAL G WITH HOOK", direction="l", linebreak="al", - unicodeslot=0x029B, + unicodeslot=0x29B, }, { category="ll", description="LATIN LETTER SMALL CAPITAL H", direction="l", linebreak="al", - unicodeslot=0x029C, + unicodeslot=0x29C, }, { adobename="jcrossedtail", @@ -7208,8 +7218,8 @@ characters.data={ description="LATIN SMALL LETTER J WITH CROSSED-TAIL", direction="l", linebreak="al", - shcode=0x006A, - unicodeslot=0x029D, + shcode=0x6A, + unicodeslot=0x29D, }, { adobename="kturned", @@ -7217,14 +7227,14 @@ characters.data={ description="LATIN SMALL LETTER TURNED K", direction="l", linebreak="al", - unicodeslot=0x029E, + unicodeslot=0x29E, }, { category="ll", description="LATIN LETTER SMALL CAPITAL L", direction="l", linebreak="al", - unicodeslot=0x029F, + unicodeslot=0x29F, }, { adobename="qhook", @@ -7232,8 +7242,8 @@ characters.data={ description="LATIN SMALL LETTER Q WITH HOOK", direction="l", linebreak="al", - shcode=0x0071, - unicodeslot=0x02A0, + shcode=0x71, + unicodeslot=0x2A0, }, { adobename="glottalstopstroke", @@ -7241,7 +7251,7 @@ characters.data={ description="LATIN LETTER GLOTTAL STOP WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x02A1, + unicodeslot=0x2A1, }, { adobename="glottalstopstrokereversed", @@ -7249,7 +7259,7 @@ characters.data={ description="LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE", direction="l", linebreak="al", - unicodeslot=0x02A2, + unicodeslot=0x2A2, }, { adobename="dzaltone", @@ -7257,7 +7267,7 @@ characters.data={ description="LATIN SMALL LETTER DZ DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02A3, + unicodeslot=0x2A3, }, { adobename="dezh", @@ -7265,7 +7275,7 @@ characters.data={ description="LATIN SMALL LETTER DEZH DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02A4, + unicodeslot=0x2A4, }, { adobename="dzcurl", @@ -7273,7 +7283,7 @@ characters.data={ description="LATIN SMALL LETTER DZ DIGRAPH WITH CURL", direction="l", linebreak="al", - unicodeslot=0x02A5, + unicodeslot=0x2A5, }, { adobename="ts", @@ -7281,7 +7291,7 @@ characters.data={ description="LATIN SMALL LETTER TS DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02A6, + unicodeslot=0x2A6, }, { adobename="tesh", @@ -7289,7 +7299,7 @@ characters.data={ description="LATIN SMALL LETTER TESH DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02A7, + unicodeslot=0x2A7, }, { adobename="tccurl", @@ -7297,56 +7307,56 @@ characters.data={ description="LATIN SMALL LETTER TC DIGRAPH WITH CURL", direction="l", linebreak="al", - unicodeslot=0x02A8, + unicodeslot=0x2A8, }, { category="ll", description="LATIN SMALL LETTER FENG DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02A9, + unicodeslot=0x2A9, }, { category="ll", description="LATIN SMALL LETTER LS DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02AA, + unicodeslot=0x2AA, }, { category="ll", description="LATIN SMALL LETTER LZ DIGRAPH", direction="l", linebreak="al", - unicodeslot=0x02AB, + unicodeslot=0x2AB, }, { category="ll", description="LATIN LETTER BILABIAL PERCUSSIVE", direction="l", linebreak="al", - unicodeslot=0x02AC, + unicodeslot=0x2AC, }, { category="ll", description="LATIN LETTER BIDENTAL PERCUSSIVE", direction="l", linebreak="al", - unicodeslot=0x02AD, + unicodeslot=0x2AD, }, { category="ll", description="LATIN SMALL LETTER TURNED H WITH FISHHOOK", direction="l", linebreak="al", - unicodeslot=0x02AE, + unicodeslot=0x2AE, }, { category="ll", description="LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL", direction="l", linebreak="al", - unicodeslot=0x02AF, + unicodeslot=0x2AF, }, { adobename="hsuperior", @@ -7354,8 +7364,8 @@ characters.data={ description="MODIFIER LETTER SMALL H", direction="l", linebreak="al", - specials={ "super", 0x0068 }, - unicodeslot=0x02B0, + specials={ "super", 0x68 }, + unicodeslot=0x2B0, }, { adobename="hhooksuperior", @@ -7363,8 +7373,8 @@ characters.data={ description="MODIFIER LETTER SMALL H WITH HOOK", direction="l", linebreak="al", - specials={ "super", 0x0266 }, - unicodeslot=0x02B1, + specials={ "super", 0x266 }, + unicodeslot=0x2B1, }, { adobename="jsuperior", @@ -7372,16 +7382,16 @@ characters.data={ description="MODIFIER LETTER SMALL J", direction="l", linebreak="al", - specials={ "super", 0x006A }, - unicodeslot=0x02B2, + specials={ "super", 0x6A }, + unicodeslot=0x2B2, }, { category="lm", description="MODIFIER LETTER SMALL R", direction="l", linebreak="al", - specials={ "super", 0x0072 }, - unicodeslot=0x02B3, + specials={ "super", 0x72 }, + unicodeslot=0x2B3, }, { adobename="rturnedsuperior", @@ -7389,8 +7399,8 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED R", direction="l", linebreak="al", - specials={ "super", 0x0279 }, - unicodeslot=0x02B4, + specials={ "super", 0x279 }, + unicodeslot=0x2B4, }, { adobename="rhookturnedsuperior", @@ -7398,8 +7408,8 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED R WITH HOOK", direction="l", linebreak="al", - specials={ "super", 0x027B }, - unicodeslot=0x02B5, + specials={ "super", 0x27B }, + unicodeslot=0x2B5, }, { adobename="Rsmallinvertedsuperior", @@ -7407,8 +7417,8 @@ characters.data={ description="MODIFIER LETTER SMALL CAPITAL INVERTED R", direction="l", linebreak="al", - specials={ "super", 0x0281 }, - unicodeslot=0x02B6, + specials={ "super", 0x281 }, + unicodeslot=0x2B6, }, { adobename="wsuperior", @@ -7416,8 +7426,8 @@ characters.data={ description="MODIFIER LETTER SMALL W", direction="l", linebreak="al", - specials={ "super", 0x0077 }, - unicodeslot=0x02B7, + specials={ "super", 0x77 }, + unicodeslot=0x2B7, }, { adobename="ysuperior", @@ -7425,8 +7435,8 @@ characters.data={ description="MODIFIER LETTER SMALL Y", direction="l", linebreak="al", - specials={ "super", 0x0079 }, - unicodeslot=0x02B8, + specials={ "super", 0x79 }, + unicodeslot=0x2B8, }, { adobename="primemod", @@ -7434,7 +7444,7 @@ characters.data={ description="MODIFIER LETTER PRIME", direction="on", linebreak="al", - unicodeslot=0x02B9, + unicodeslot=0x2B9, }, { adobename="dblprimemod", @@ -7442,7 +7452,7 @@ characters.data={ description="MODIFIER LETTER DOUBLE PRIME", direction="on", linebreak="al", - unicodeslot=0x02BA, + unicodeslot=0x2BA, }, { adobename="commaturnedmod", @@ -7450,7 +7460,7 @@ characters.data={ description="MODIFIER LETTER TURNED COMMA", direction="l", linebreak="al", - unicodeslot=0x02BB, + unicodeslot=0x2BB, }, { adobename="apostrophemod", @@ -7458,7 +7468,7 @@ characters.data={ description="MODIFIER LETTER APOSTROPHE", direction="l", linebreak="al", - unicodeslot=0x02BC, + unicodeslot=0x2BC, }, { adobename="commareversedmod", @@ -7466,7 +7476,7 @@ characters.data={ description="MODIFIER LETTER REVERSED COMMA", direction="l", linebreak="al", - unicodeslot=0x02BD, + unicodeslot=0x2BD, }, { adobename="ringhalfright", @@ -7474,7 +7484,7 @@ characters.data={ description="MODIFIER LETTER RIGHT HALF RING", direction="l", linebreak="al", - unicodeslot=0x02BE, + unicodeslot=0x2BE, }, { adobename="ringhalfleft", @@ -7482,7 +7492,7 @@ characters.data={ description="MODIFIER LETTER LEFT HALF RING", direction="l", linebreak="al", - unicodeslot=0x02BF, + unicodeslot=0x2BF, }, { adobename="glottalstopmod", @@ -7490,7 +7500,7 @@ characters.data={ description="MODIFIER LETTER GLOTTAL STOP", direction="l", linebreak="al", - unicodeslot=0x02C0, + unicodeslot=0x2C0, }, { adobename="glottalstopreversedmod", @@ -7498,7 +7508,7 @@ characters.data={ description="MODIFIER LETTER REVERSED GLOTTAL STOP", direction="l", linebreak="al", - unicodeslot=0x02C1, + unicodeslot=0x2C1, }, { adobename="arrowheadleftmod", @@ -7506,7 +7516,7 @@ characters.data={ description="MODIFIER LETTER LEFT ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02C2, + unicodeslot=0x2C2, }, { adobename="arrowheadrightmod", @@ -7514,7 +7524,7 @@ characters.data={ description="MODIFIER LETTER RIGHT ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02C3, + unicodeslot=0x2C3, }, { adobename="arrowheadupmod", @@ -7523,7 +7533,7 @@ characters.data={ description="MODIFIER LETTER UP ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02C4, + unicodeslot=0x2C4, }, { adobename="arrowheaddownmod", @@ -7531,7 +7541,7 @@ characters.data={ description="MODIFIER LETTER DOWN ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02C5, + unicodeslot=0x2C5, }, { adobename="circumflex", @@ -7543,8 +7553,8 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="hat", - specials={ "compat", 0x0020, 0x0302 }, - unicodeslot=0x02C6, + specials={ "compat", 0x20, 0x302 }, + unicodeslot=0x2C6, }, { adobename="caron", @@ -7557,8 +7567,8 @@ characters.data={ linebreak="ai", mathclass="topaccent", mathname="check", - specials={ "compat", 0x0020, 0x030C }, - unicodeslot=0x02C7, + specials={ "compat", 0x20, 0x30C }, + unicodeslot=0x2C7, }, { adobename="verticallinemod", @@ -7566,7 +7576,7 @@ characters.data={ description="MODIFIER LETTER VERTICAL LINE", direction="on", linebreak="bb", - unicodeslot=0x02C8, + unicodeslot=0x2C8, }, { adobename="firsttonechinese", @@ -7575,7 +7585,7 @@ characters.data={ description="MODIFIER LETTER MACRON", direction="on", linebreak="ai", - unicodeslot=0x02C9, + unicodeslot=0x2C9, }, { adobename="secondtonechinese", @@ -7584,7 +7594,7 @@ characters.data={ description="MODIFIER LETTER ACUTE ACCENT", direction="on", linebreak="ai", - unicodeslot=0x02CA, + unicodeslot=0x2CA, }, { adobename="fourthtonechinese", @@ -7593,7 +7603,7 @@ characters.data={ description="MODIFIER LETTER GRAVE ACCENT", direction="on", linebreak="ai", - unicodeslot=0x02CB, + unicodeslot=0x2CB, }, { adobename="verticallinelowmod", @@ -7601,7 +7611,7 @@ characters.data={ description="MODIFIER LETTER LOW VERTICAL LINE", direction="on", linebreak="bb", - unicodeslot=0x02CC, + unicodeslot=0x2CC, }, { adobename="macronlowmod", @@ -7610,7 +7620,7 @@ characters.data={ description="MODIFIER LETTER LOW MACRON", direction="on", linebreak="ai", - unicodeslot=0x02CD, + unicodeslot=0x2CD, }, { adobename="gravelowmod", @@ -7618,7 +7628,7 @@ characters.data={ description="MODIFIER LETTER LOW GRAVE ACCENT", direction="on", linebreak="al", - unicodeslot=0x02CE, + unicodeslot=0x2CE, }, { adobename="acutelowmod", @@ -7626,7 +7636,7 @@ characters.data={ description="MODIFIER LETTER LOW ACUTE ACCENT", direction="on", linebreak="al", - unicodeslot=0x02CF, + unicodeslot=0x2CF, }, { adobename="colontriangularmod", @@ -7635,7 +7645,7 @@ characters.data={ description="MODIFIER LETTER TRIANGULAR COLON", direction="l", linebreak="ai", - unicodeslot=0x02D0, + unicodeslot=0x2D0, }, { adobename="colontriangularhalfmod", @@ -7643,7 +7653,7 @@ characters.data={ description="MODIFIER LETTER HALF TRIANGULAR COLON", direction="l", linebreak="al", - unicodeslot=0x02D1, + unicodeslot=0x2D1, }, { adobename="ringhalfrightcentered", @@ -7651,7 +7661,7 @@ characters.data={ description="MODIFIER LETTER CENTRED RIGHT HALF RING", direction="on", linebreak="al", - unicodeslot=0x02D2, + unicodeslot=0x2D2, }, { adobename="ringhalfleftcentered", @@ -7659,7 +7669,7 @@ characters.data={ description="MODIFIER LETTER CENTRED LEFT HALF RING", direction="on", linebreak="al", - unicodeslot=0x02D3, + unicodeslot=0x2D3, }, { adobename="uptackmod", @@ -7667,7 +7677,7 @@ characters.data={ description="MODIFIER LETTER UP TACK", direction="on", linebreak="al", - unicodeslot=0x02D4, + unicodeslot=0x2D4, }, { adobename="downtackmod", @@ -7675,7 +7685,7 @@ characters.data={ description="MODIFIER LETTER DOWN TACK", direction="on", linebreak="al", - unicodeslot=0x02D5, + unicodeslot=0x2D5, }, { adobename="plusmod", @@ -7683,7 +7693,7 @@ characters.data={ description="MODIFIER LETTER PLUS SIGN", direction="on", linebreak="al", - unicodeslot=0x02D6, + unicodeslot=0x2D6, }, { adobename="minusmod", @@ -7691,7 +7701,7 @@ characters.data={ description="MODIFIER LETTER MINUS SIGN", direction="on", linebreak="al", - unicodeslot=0x02D7, + unicodeslot=0x2D7, }, { adobename="breve", @@ -7703,8 +7713,8 @@ characters.data={ linebreak="ai", mathclass="topaccent", mathname="breve", - specials={ "compat", 0x0020, 0x0306 }, - unicodeslot=0x02D8, + specials={ "compat", 0x20, 0x306 }, + unicodeslot=0x2D8, }, { adobename="dotaccent", @@ -7716,8 +7726,8 @@ characters.data={ linebreak="ai", mathclass="topaccent", mathname="dot", - specials={ "compat", 0x0020, 0x0307 }, - unicodeslot=0x02D9, + specials={ "compat", 0x20, 0x307 }, + unicodeslot=0x2D9, }, { adobename="ring", @@ -7729,8 +7739,8 @@ characters.data={ linebreak="ai", mathclass="topaccent", mathname="mathring", - specials={ "compat", 0x0020, 0x030A }, - unicodeslot=0x02DA, + specials={ "compat", 0x20, 0x30A }, + unicodeslot=0x2DA, }, { adobename="ogonek", @@ -7740,8 +7750,8 @@ characters.data={ description="OGONEK", direction="on", linebreak="ai", - specials={ "compat", 0x0020, 0x0328 }, - unicodeslot=0x02DB, + specials={ "compat", 0x20, 0x328 }, + unicodeslot=0x2DB, }, { adobename="tilde", @@ -7752,8 +7762,8 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="tilde", - specials={ "compat", 0x0020, 0x0303 }, - unicodeslot=0x02DC, + specials={ "compat", 0x20, 0x303 }, + unicodeslot=0x2DC, }, { adobename="hungarumlaut", @@ -7763,8 +7773,8 @@ characters.data={ description="DOUBLE ACUTE ACCENT", direction="on", linebreak="ai", - specials={ "compat", 0x0020, 0x030B }, - unicodeslot=0x02DD, + specials={ "compat", 0x20, 0x30B }, + unicodeslot=0x2DD, }, { adobename="rhotichookmod", @@ -7772,7 +7782,7 @@ characters.data={ description="MODIFIER LETTER RHOTIC HOOK", direction="on", linebreak="al", - unicodeslot=0x02DE, + unicodeslot=0x2DE, }, { category="sk", @@ -7780,7 +7790,7 @@ characters.data={ description="MODIFIER LETTER CROSS ACCENT", direction="on", linebreak="bb", - unicodeslot=0x02DF, + unicodeslot=0x2DF, }, { adobename="gammasuperior", @@ -7788,24 +7798,24 @@ characters.data={ description="MODIFIER LETTER SMALL GAMMA", direction="l", linebreak="al", - specials={ "super", 0x0263 }, - unicodeslot=0x02E0, + specials={ "super", 0x263 }, + unicodeslot=0x2E0, }, { category="lm", description="MODIFIER LETTER SMALL L", direction="l", linebreak="al", - specials={ "super", 0x006C }, - unicodeslot=0x02E1, + specials={ "super", 0x6C }, + unicodeslot=0x2E1, }, { category="lm", description="MODIFIER LETTER SMALL S", direction="l", linebreak="al", - specials={ "super", 0x0073 }, - unicodeslot=0x02E2, + specials={ "super", 0x73 }, + unicodeslot=0x2E2, }, { adobename="xsuperior", @@ -7813,8 +7823,8 @@ characters.data={ description="MODIFIER LETTER SMALL X", direction="l", linebreak="al", - specials={ "super", 0x0078 }, - unicodeslot=0x02E3, + specials={ "super", 0x78 }, + unicodeslot=0x2E3, }, { adobename="glottalstopreversedsuperior", @@ -7822,8 +7832,8 @@ characters.data={ description="MODIFIER LETTER SMALL REVERSED GLOTTAL STOP", direction="l", linebreak="al", - specials={ "super", 0x0295 }, - unicodeslot=0x02E4, + specials={ "super", 0x295 }, + unicodeslot=0x2E4, }, { adobename="tonebarextrahighmod", @@ -7831,7 +7841,7 @@ characters.data={ description="MODIFIER LETTER EXTRA-HIGH TONE BAR", direction="on", linebreak="al", - unicodeslot=0x02E5, + unicodeslot=0x2E5, }, { adobename="tonebarhighmod", @@ -7839,7 +7849,7 @@ characters.data={ description="MODIFIER LETTER HIGH TONE BAR", direction="on", linebreak="al", - unicodeslot=0x02E6, + unicodeslot=0x2E6, }, { adobename="tonebarmidmod", @@ -7847,7 +7857,7 @@ characters.data={ description="MODIFIER LETTER MID TONE BAR", direction="on", linebreak="al", - unicodeslot=0x02E7, + unicodeslot=0x2E7, }, { adobename="tonebarlowmod", @@ -7855,7 +7865,7 @@ characters.data={ description="MODIFIER LETTER LOW TONE BAR", direction="on", linebreak="al", - unicodeslot=0x02E8, + unicodeslot=0x2E8, }, { adobename="tonebarextralowmod", @@ -7863,877 +7873,956 @@ characters.data={ description="MODIFIER LETTER EXTRA-LOW TONE BAR", direction="on", linebreak="al", - unicodeslot=0x02E9, + unicodeslot=0x2E9, }, { category="sk", description="MODIFIER LETTER YIN DEPARTING TONE MARK", direction="on", linebreak="al", - unicodeslot=0x02EA, + unicodeslot=0x2EA, }, { category="sk", description="MODIFIER LETTER YANG DEPARTING TONE MARK", direction="on", linebreak="al", - unicodeslot=0x02EB, + unicodeslot=0x2EB, }, { category="sk", description="MODIFIER LETTER VOICING", direction="on", linebreak="al", - unicodeslot=0x02EC, + unicodeslot=0x2EC, }, { category="sk", description="MODIFIER LETTER UNASPIRATED", direction="on", linebreak="al", - unicodeslot=0x02ED, + unicodeslot=0x2ED, }, { category="lm", description="MODIFIER LETTER DOUBLE APOSTROPHE", direction="l", linebreak="al", - unicodeslot=0x02EE, + unicodeslot=0x2EE, }, { category="sk", description="MODIFIER LETTER LOW DOWN ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02EF, + unicodeslot=0x2EF, }, { category="sk", description="MODIFIER LETTER LOW UP ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02F0, + unicodeslot=0x2F0, }, { category="sk", description="MODIFIER LETTER LOW LEFT ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02F1, + unicodeslot=0x2F1, }, { category="sk", description="MODIFIER LETTER LOW RIGHT ARROWHEAD", direction="on", linebreak="al", - unicodeslot=0x02F2, + unicodeslot=0x2F2, }, { category="sk", description="MODIFIER LETTER LOW RING", direction="on", linebreak="al", - unicodeslot=0x02F3, + unicodeslot=0x2F3, }, { category="sk", description="MODIFIER LETTER MIDDLE GRAVE ACCENT", direction="on", linebreak="al", - unicodeslot=0x02F4, + unicodeslot=0x2F4, }, { category="sk", description="MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT", direction="on", linebreak="al", - unicodeslot=0x02F5, + unicodeslot=0x2F5, }, { category="sk", description="MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT", direction="on", linebreak="al", - unicodeslot=0x02F6, + unicodeslot=0x2F6, }, { category="sk", description="MODIFIER LETTER LOW TILDE", direction="on", linebreak="al", - unicodeslot=0x02F7, + unicodeslot=0x2F7, }, { category="sk", description="MODIFIER LETTER RAISED COLON", direction="on", linebreak="al", - unicodeslot=0x02F8, + unicodeslot=0x2F8, }, { category="sk", description="MODIFIER LETTER BEGIN HIGH TONE", direction="on", linebreak="al", - unicodeslot=0x02F9, + unicodeslot=0x2F9, }, { category="sk", description="MODIFIER LETTER END HIGH TONE", direction="on", linebreak="al", - unicodeslot=0x02FA, + unicodeslot=0x2FA, }, { category="sk", description="MODIFIER LETTER BEGIN LOW TONE", direction="on", linebreak="al", - unicodeslot=0x02FB, + unicodeslot=0x2FB, }, { category="sk", description="MODIFIER LETTER END LOW TONE", direction="on", linebreak="al", - unicodeslot=0x02FC, + unicodeslot=0x2FC, }, { category="sk", description="MODIFIER LETTER SHELF", direction="on", linebreak="al", - unicodeslot=0x02FD, + unicodeslot=0x2FD, }, { category="sk", description="MODIFIER LETTER OPEN SHELF", direction="on", linebreak="al", - unicodeslot=0x02FE, + unicodeslot=0x2FE, }, { category="sk", description="MODIFIER LETTER LOW LEFT ARROW", direction="on", linebreak="al", - unicodeslot=0x02FF, + unicodeslot=0x2FF, }, { adobename="gravecomb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING GRAVE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x0300, + unicodeslot=0x300, }, { adobename="acutecomb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING ACUTE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x0301, + unicodeslot=0x301, }, { adobename="circumflexcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING CIRCUMFLEX ACCENT", direction="nsm", linebreak="cm", mathclass="topaccent", mathname="widehat", mathstretch="h", - unicodeslot=0x0302, + unicodeslot=0x302, }, { adobename="tildecomb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING TILDE", direction="nsm", linebreak="cm", mathclass="topaccent", mathname="widetilde", mathstretch="h", - unicodeslot=0x0303, + unicodeslot=0x303, }, { adobename="macroncmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING MACRON", direction="nsm", linebreak="cm", - unicodeslot=0x0304, + unicodeslot=0x304, }, { adobename="overlinecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING OVERLINE", direction="nsm", linebreak="cm", - unicodeslot=0x0305, + unicodeslot=0x305, }, { adobename="brevecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING BREVE", direction="nsm", linebreak="cm", - unicodeslot=0x0306, + unicodeslot=0x306, }, { adobename="dotaccentcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DOT ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0307, + unicodeslot=0x307, }, { adobename="dieresiscmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DIAERESIS", direction="nsm", linebreak="cm", - unicodeslot=0x0308, + unicodeslot=0x308, }, { adobename="hookcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING HOOK ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0309, + unicodeslot=0x309, }, { adobename="ringcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING RING ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x030A, + unicodeslot=0x30A, }, { adobename="hungarumlautcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DOUBLE ACUTE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x030B, + unicodeslot=0x30B, }, { adobename="caroncmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING CARON", direction="nsm", linebreak="cm", - unicodeslot=0x030C, + unicodeslot=0x30C, }, { adobename="verticallineabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING VERTICAL LINE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x030D, + unicodeslot=0x30D, }, { adobename="dblverticallineabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DOUBLE VERTICAL LINE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x030E, + unicodeslot=0x30E, }, { adobename="dblgravecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DOUBLE GRAVE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x030F, + unicodeslot=0x30F, }, { adobename="candrabinducmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0310, + unicodeslot=0x310, }, { adobename="breveinvertedcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING INVERTED BREVE", direction="nsm", linebreak="cm", - unicodeslot=0x0311, + unicodeslot=0x311, }, { adobename="commaturnedabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING TURNED COMMA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0312, + unicodeslot=0x312, }, { adobename="commaabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING COMMA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0313, + unicodeslot=0x313, }, { adobename="commareversedabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING REVERSED COMMA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0314, + unicodeslot=0x314, }, { adobename="commaaboverightcmb", category="mn", cjkwd="a", + combining=0xE8, description="COMBINING COMMA ABOVE RIGHT", direction="nsm", linebreak="cm", - unicodeslot=0x0315, + unicodeslot=0x315, }, { adobename="gravebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING GRAVE ACCENT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0316, + unicodeslot=0x316, }, { adobename="acutebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING ACUTE ACCENT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0317, + unicodeslot=0x317, }, { adobename="lefttackbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LEFT TACK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0318, + unicodeslot=0x318, }, { adobename="righttackbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING RIGHT TACK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0319, + unicodeslot=0x319, }, { adobename="leftangleabovecmb", category="mn", cjkwd="a", + combining=0xE8, description="COMBINING LEFT ANGLE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x031A, + unicodeslot=0x31A, }, { adobename="horncmb", category="mn", cjkwd="a", + combining=0xD8, description="COMBINING HORN", direction="nsm", linebreak="cm", - unicodeslot=0x031B, + unicodeslot=0x31B, }, { adobename="ringhalfleftbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LEFT HALF RING BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x031C, + unicodeslot=0x31C, }, { adobename="uptackbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING UP TACK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x031D, + unicodeslot=0x31D, }, { adobename="downtackbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING DOWN TACK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x031E, + unicodeslot=0x31E, }, { adobename="plusbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING PLUS SIGN BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x031F, + unicodeslot=0x31F, }, { adobename="minusbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING MINUS SIGN BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0320, + unicodeslot=0x320, }, { adobename="hookpalatalizedbelowcmb", category="mn", cjkwd="a", + combining=0xCA, description="COMBINING PALATALIZED HOOK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0321, + unicodeslot=0x321, }, { adobename="hookretroflexbelowcmb", category="mn", cjkwd="a", + combining=0xCA, description="COMBINING RETROFLEX HOOK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0322, + unicodeslot=0x322, }, { adobename="dotbelowcomb", category="mn", cjkwd="a", + combining=0xDC, contextname="textbottomdot", description="COMBINING DOT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0323, + unicodeslot=0x323, }, { adobename="dieresisbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING DIAERESIS BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0324, + unicodeslot=0x324, }, { adobename="ringbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING RING BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0325, + unicodeslot=0x325, }, { category="mn", cjkwd="a", + combining=0xDC, contextname="textbottomcomma", description="COMBINING COMMA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0326, + unicodeslot=0x326, }, { adobename="cedillacmb", category="mn", cjkwd="a", + combining=0xCA, description="COMBINING CEDILLA", direction="nsm", linebreak="cm", - unicodeslot=0x0327, + unicodeslot=0x327, }, { adobename="ogonekcmb", category="mn", cjkwd="a", + combining=0xCA, description="COMBINING OGONEK", direction="nsm", linebreak="cm", - unicodeslot=0x0328, + unicodeslot=0x328, }, { adobename="verticallinebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING VERTICAL LINE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0329, + unicodeslot=0x329, }, { adobename="bridgebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING BRIDGE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032A, + unicodeslot=0x32A, }, { adobename="dblarchinvertedbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING INVERTED DOUBLE ARCH BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032B, + unicodeslot=0x32B, }, { adobename="caronbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING CARON BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032C, + unicodeslot=0x32C, }, { adobename="circumflexbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING CIRCUMFLEX ACCENT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032D, + unicodeslot=0x32D, }, { adobename="brevebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING BREVE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032E, + unicodeslot=0x32E, }, { adobename="breveinvertedbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING INVERTED BREVE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x032F, + unicodeslot=0x32F, }, { adobename="tildebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING TILDE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0330, + unicodeslot=0x330, }, { adobename="macronbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING MACRON BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0331, + unicodeslot=0x331, }, { adobename="lowlinecmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LOW LINE", direction="nsm", linebreak="cm", - unicodeslot=0x0332, + unicodeslot=0x332, }, { adobename="dbllowlinecmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING DOUBLE LOW LINE", direction="nsm", linebreak="cm", - unicodeslot=0x0333, + unicodeslot=0x333, }, { adobename="tildeoverlaycmb", category="mn", cjkwd="a", + combining=0x1, description="COMBINING TILDE OVERLAY", direction="nsm", linebreak="cm", - unicodeslot=0x0334, + unicodeslot=0x334, }, { adobename="strokeshortoverlaycmb", category="mn", cjkwd="a", + combining=0x1, description="COMBINING SHORT STROKE OVERLAY", direction="nsm", linebreak="cm", - unicodeslot=0x0335, + unicodeslot=0x335, }, { adobename="strokelongoverlaycmb", category="mn", cjkwd="a", + combining=0x1, description="COMBINING LONG STROKE OVERLAY", direction="nsm", linebreak="cm", - unicodeslot=0x0336, + unicodeslot=0x336, }, { adobename="solidusshortoverlaycmb", category="mn", cjkwd="a", + combining=0x1, description="COMBINING SHORT SOLIDUS OVERLAY", direction="nsm", linebreak="cm", - unicodeslot=0x0337, + unicodeslot=0x337, }, { adobename="soliduslongoverlaycmb", category="mn", cjkwd="a", + combining=0x1, description="COMBINING LONG SOLIDUS OVERLAY", direction="nsm", linebreak="cm", mathclass="relation", mathname="not", - unicodeslot=0x0338, + unicodeslot=0x338, }, { adobename="ringhalfrightbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING RIGHT HALF RING BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0339, + unicodeslot=0x339, }, { adobename="bridgeinvertedbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING INVERTED BRIDGE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x033A, + unicodeslot=0x33A, }, { adobename="squarebelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING SQUARE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x033B, + unicodeslot=0x33B, }, { adobename="seagullbelowcmb", category="mn", cjkwd="a", + combining=0xDC, description="COMBINING SEAGULL BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x033C, + unicodeslot=0x33C, }, { adobename="xabovecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING X ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x033D, + unicodeslot=0x33D, }, { adobename="tildeverticalcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING VERTICAL TILDE", direction="nsm", linebreak="cm", - unicodeslot=0x033E, + unicodeslot=0x33E, }, { adobename="dbloverlinecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING DOUBLE OVERLINE", direction="nsm", linebreak="cm", - unicodeslot=0x033F, + unicodeslot=0x33F, }, { adobename="gravetonecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING GRAVE TONE MARK", direction="nsm", linebreak="cm", - specials={ "char", 0x0300 }, - unicodeslot=0x0340, + specials={ "char", 0x300 }, + unicodeslot=0x340, }, { adobename="acutetonecmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING ACUTE TONE MARK", direction="nsm", linebreak="cm", - specials={ "char", 0x0301 }, - unicodeslot=0x0341, + specials={ "char", 0x301 }, + unicodeslot=0x341, }, { adobename="perispomenigreekcmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING GREEK PERISPOMENI", direction="nsm", linebreak="cm", - unicodeslot=0x0342, + unicodeslot=0x342, }, { adobename="koroniscmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING GREEK KORONIS", direction="nsm", linebreak="cm", - specials={ "char", 0x0313 }, - unicodeslot=0x0343, + specials={ "char", 0x313 }, + unicodeslot=0x343, }, { adobename="dialytikatonoscmb", category="mn", cjkwd="a", + combining=0xE6, description="COMBINING GREEK DIALYTIKA TONOS", direction="nsm", linebreak="cm", - specials={ "char", 0x0308, 0x0301 }, - unicodeslot=0x0344, + specials={ "char", 0x308, 0x301 }, + unicodeslot=0x344, }, { adobename="ypogegrammenigreekcmb", category="mn", cjkwd="a", + combining=0xF0, description="COMBINING GREEK YPOGEGRAMMENI", direction="nsm", linebreak="cm", - uccode=0x0399, - unicodeslot=0x0345, + uccode=0x399, + unicodeslot=0x345, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING BRIDGE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0346, + unicodeslot=0x346, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING EQUALS SIGN BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0347, + unicodeslot=0x347, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING DOUBLE VERTICAL LINE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0348, + unicodeslot=0x348, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LEFT ANGLE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0349, + unicodeslot=0x349, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING NOT TILDE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x034A, + unicodeslot=0x34A, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING HOMOTHETIC ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x034B, + unicodeslot=0x34B, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING ALMOST EQUAL TO ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x034C, + unicodeslot=0x34C, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LEFT RIGHT ARROW BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x034D, + unicodeslot=0x34D, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING UPWARDS ARROW BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x034E, + unicodeslot=0x34E, }, { category="mn", @@ -8741,293 +8830,325 @@ characters.data={ description="COMBINING GRAPHEME JOINER", direction="nsm", linebreak="gl", - unicodeslot=0x034F, + unicodeslot=0x34F, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING RIGHT ARROWHEAD ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0350, + unicodeslot=0x350, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LEFT HALF RING ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0351, + unicodeslot=0x351, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING FERMATA", direction="nsm", linebreak="cm", - unicodeslot=0x0352, + unicodeslot=0x352, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING X BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0353, + unicodeslot=0x353, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING LEFT ARROWHEAD BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0354, + unicodeslot=0x354, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING RIGHT ARROWHEAD BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0355, + unicodeslot=0x355, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0356, + unicodeslot=0x356, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING RIGHT HALF RING ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0357, + unicodeslot=0x357, }, { category="mn", cjkwd="a", + combining=0xE8, description="COMBINING DOT ABOVE RIGHT", direction="nsm", linebreak="cm", - unicodeslot=0x0358, + unicodeslot=0x358, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING ASTERISK BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0359, + unicodeslot=0x359, }, { category="mn", cjkwd="a", + combining=0xDC, description="COMBINING DOUBLE RING BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x035A, + unicodeslot=0x35A, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING ZIGZAG ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x035B, + unicodeslot=0x35B, }, { category="mn", cjkwd="a", + combining=0xE9, description="COMBINING DOUBLE BREVE BELOW", direction="nsm", linebreak="gl", - unicodeslot=0x035C, + unicodeslot=0x35C, }, { category="mn", cjkwd="a", + combining=0xEA, description="COMBINING DOUBLE BREVE", direction="nsm", linebreak="gl", - unicodeslot=0x035D, + unicodeslot=0x35D, }, { category="mn", cjkwd="a", + combining=0xEA, description="COMBINING DOUBLE MACRON", direction="nsm", linebreak="gl", - unicodeslot=0x035E, + unicodeslot=0x35E, }, { category="mn", cjkwd="a", + combining=0xE9, description="COMBINING DOUBLE MACRON BELOW", direction="nsm", linebreak="gl", - unicodeslot=0x035F, + unicodeslot=0x35F, }, { adobename="tildedoublecmb", category="mn", cjkwd="a", + combining=0xEA, description="COMBINING DOUBLE TILDE", direction="nsm", linebreak="gl", - unicodeslot=0x0360, + unicodeslot=0x360, }, { adobename="breveinverteddoublecmb", category="mn", cjkwd="a", + combining=0xEA, description="COMBINING DOUBLE INVERTED BREVE", direction="nsm", linebreak="gl", - unicodeslot=0x0361, + unicodeslot=0x361, }, { category="mn", cjkwd="a", + combining=0xE9, description="COMBINING DOUBLE RIGHTWARDS ARROW BELOW", direction="nsm", linebreak="gl", - unicodeslot=0x0362, + unicodeslot=0x362, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER A", direction="nsm", linebreak="cm", - unicodeslot=0x0363, + unicodeslot=0x363, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER E", direction="nsm", linebreak="cm", - unicodeslot=0x0364, + unicodeslot=0x364, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER I", direction="nsm", linebreak="cm", - unicodeslot=0x0365, + unicodeslot=0x365, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER O", direction="nsm", linebreak="cm", - unicodeslot=0x0366, + unicodeslot=0x366, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER U", direction="nsm", linebreak="cm", - unicodeslot=0x0367, + unicodeslot=0x367, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER C", direction="nsm", linebreak="cm", - unicodeslot=0x0368, + unicodeslot=0x368, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER D", direction="nsm", linebreak="cm", - unicodeslot=0x0369, + unicodeslot=0x369, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER H", direction="nsm", linebreak="cm", - unicodeslot=0x036A, + unicodeslot=0x36A, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER M", direction="nsm", linebreak="cm", - unicodeslot=0x036B, + unicodeslot=0x36B, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER R", direction="nsm", linebreak="cm", - unicodeslot=0x036C, + unicodeslot=0x36C, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER T", direction="nsm", linebreak="cm", - unicodeslot=0x036D, + unicodeslot=0x36D, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER V", direction="nsm", linebreak="cm", - unicodeslot=0x036E, + unicodeslot=0x36E, }, { category="mn", cjkwd="a", + combining=0xE6, description="COMBINING LATIN SMALL LETTER X", direction="nsm", linebreak="cm", - unicodeslot=0x036F, + unicodeslot=0x36F, }, { category="lu", description="GREEK CAPITAL LETTER HETA", direction="l", linebreak="al", - unicodeslot=0x0370, + unicodeslot=0x370, }, { category="ll", description="GREEK SMALL LETTER HETA", direction="l", linebreak="al", - unicodeslot=0x0371, + unicodeslot=0x371, }, { category="lu", description="GREEK CAPITAL LETTER ARCHAIC SAMPI", direction="l", linebreak="al", - unicodeslot=0x0372, + unicodeslot=0x372, }, { category="ll", description="GREEK SMALL LETTER ARCHAIC SAMPI", direction="l", linebreak="al", - unicodeslot=0x0373, + unicodeslot=0x373, }, { adobename="numeralsigngreek", @@ -9035,8 +9156,8 @@ characters.data={ description="GREEK NUMERAL SIGN", direction="on", linebreak="al", - specials={ "char", 0x02B9 }, - unicodeslot=0x0374, + specials={ "char", 0x2B9 }, + unicodeslot=0x374, }, { adobename="numeralsignlowergreek", @@ -9044,584 +9165,591 @@ characters.data={ description="GREEK LOWER NUMERAL SIGN", direction="on", linebreak="al", - unicodeslot=0x0375, + unicodeslot=0x375, }, { category="lu", description="GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA", direction="l", linebreak="al", - unicodeslot=0x0376, + unicodeslot=0x376, }, { category="ll", description="GREEK SMALL LETTER PAMPHYLIAN DIGAMMA", direction="l", linebreak="al", - unicodeslot=0x0377, + unicodeslot=0x377, }, - [0x037A]={ + [0x37A]={ adobename="ypogegrammeni", category="lm", description="GREEK YPOGEGRAMMENI", direction="l", linebreak="al", - specials={ "compat", 0x0020, 0x0345 }, - unicodeslot=0x037A, + specials={ "compat", 0x20, 0x345 }, + unicodeslot=0x37A, }, - [0x037B]={ + [0x37B]={ category="ll", description="GREEK SMALL REVERSED LUNATE SIGMA SYMBOL", direction="l", linebreak="al", - uccode=0x03FD, - unicodeslot=0x037B, + uccode=0x3FD, + unicodeslot=0x37B, }, - [0x037C]={ + [0x37C]={ category="ll", description="GREEK SMALL DOTTED LUNATE SIGMA SYMBOL", direction="l", linebreak="al", - uccode=0x03FE, - unicodeslot=0x037C, + uccode=0x3FE, + unicodeslot=0x37C, }, - [0x037D]={ + [0x37D]={ category="ll", description="GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL", direction="l", linebreak="al", - uccode=0x03FF, - unicodeslot=0x037D, + uccode=0x3FF, + unicodeslot=0x37D, }, - [0x037E]={ + [0x37E]={ adobename="questiongreek", category="po", description="GREEK QUESTION MARK", direction="on", linebreak="is", - specials={ "char", 0x003B }, - unicodeslot=0x037E, + specials={ "char", 0x3B }, + unicodeslot=0x37E, + }, + [0x37F]={ + category="lu", + description="GREEK CAPITAL LETTER YOT", + direction="l", + linebreak="al", + unicodeslot=0x37F, }, - [0x0384]={ + [0x384]={ adobename="tonos", category="sk", contextname="greektonos", description="GREEK TONOS", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0301 }, - unicodeslot=0x0384, + specials={ "compat", 0x20, 0x301 }, + unicodeslot=0x384, }, - [0x0385]={ + [0x385]={ adobename="dieresistonos", category="sk", contextname="greekdialytikatonos", description="GREEK DIALYTIKA TONOS", direction="on", linebreak="al", - specials={ "char", 0x00A8, 0x0301 }, - unicodeslot=0x0385, + specials={ "char", 0xA8, 0x301 }, + unicodeslot=0x385, }, - [0x0386]={ + [0x386]={ adobename="Alphatonos", category="lu", contextname="greekAlphatonos", description="GREEK CAPITAL LETTER ALPHA WITH TONOS", direction="l", - lccode=0x03AC, + lccode=0x3AC, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0301 }, - unicodeslot=0x0386, + shcode=0x391, + specials={ "char", 0x391, 0x301 }, + unicodeslot=0x386, }, - [0x0387]={ + [0x387]={ adobename="anoteleia", category="po", description="GREEK ANO TELEIA", direction="on", linebreak="al", - specials={ "char", 0x00B7 }, - unicodeslot=0x0387, + specials={ "char", 0xB7 }, + unicodeslot=0x387, }, - [0x0388]={ + [0x388]={ adobename="Epsilontonos", category="lu", contextname="greekEpsilontonos", description="GREEK CAPITAL LETTER EPSILON WITH TONOS", direction="l", - lccode=0x03AD, + lccode=0x3AD, linebreak="al", - shcode=0x0395, - specials={ "char", 0x0395, 0x0301 }, - unicodeslot=0x0388, + shcode=0x395, + specials={ "char", 0x395, 0x301 }, + unicodeslot=0x388, }, - [0x0389]={ + [0x389]={ adobename="Etatonos", category="lu", contextname="greekEtatonos", description="GREEK CAPITAL LETTER ETA WITH TONOS", direction="l", - lccode=0x03AE, + lccode=0x3AE, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0397, 0x0301 }, - unicodeslot=0x0389, + shcode=0x397, + specials={ "char", 0x397, 0x301 }, + unicodeslot=0x389, }, - [0x038A]={ + [0x38A]={ adobename="Iotatonos", category="lu", contextname="greekIotatonos", description="GREEK CAPITAL LETTER IOTA WITH TONOS", direction="l", - lccode=0x03AF, + lccode=0x3AF, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0301 }, - unicodeslot=0x038A, + shcode=0x399, + specials={ "char", 0x399, 0x301 }, + unicodeslot=0x38A, }, - [0x038C]={ + [0x38C]={ adobename="Omicrontonos", category="lu", contextname="greekOmicrontonos", description="GREEK CAPITAL LETTER OMICRON WITH TONOS", direction="l", - lccode=0x03CC, + lccode=0x3CC, linebreak="al", - shcode=0x039F, - specials={ "char", 0x039F, 0x0301 }, - unicodeslot=0x038C, + shcode=0x39F, + specials={ "char", 0x39F, 0x301 }, + unicodeslot=0x38C, }, - [0x038E]={ + [0x38E]={ adobename="Upsilontonos", category="lu", contextname="greekUpsilontonos", description="GREEK CAPITAL LETTER UPSILON WITH TONOS", direction="l", - lccode=0x03CD, + lccode=0x3CD, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0301 }, - unicodeslot=0x038E, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x301 }, + unicodeslot=0x38E, }, - [0x038F]={ + [0x38F]={ adobename="Omegatonos", category="lu", contextname="greekOmegatonos", description="GREEK CAPITAL LETTER OMEGA WITH TONOS", direction="l", - lccode=0x03CE, + lccode=0x3CE, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x03A9, 0x0301 }, - unicodeslot=0x038F, + shcode=0x3A9, + specials={ "char", 0x3A9, 0x301 }, + unicodeslot=0x38F, }, - [0x0390]={ + [0x390]={ adobename="iotadieresistonos", category="ll", contextname="greekiotadialytikatonos", description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03CA, 0x0301 }, - unicodeslot=0x0390, + shcode=0x3B9, + specials={ "char", 0x3CA, 0x301 }, + unicodeslot=0x390, }, - [0x0391]={ + [0x391]={ adobename="Alpha", category="lu", cjkwd="a", contextname="greekAlpha", description="GREEK CAPITAL LETTER ALPHA", direction="l", - lccode=0x03B1, + lccode=0x3B1, linebreak="al", mathclass="variable", mathname="Alpha", - unicodeslot=0x0391, + unicodeslot=0x391, }, - [0x0392]={ + [0x392]={ adobename="Beta", category="lu", cjkwd="a", contextname="greekBeta", description="GREEK CAPITAL LETTER BETA", direction="l", - lccode=0x03B2, + lccode=0x3B2, linebreak="al", mathclass="variable", mathname="Beta", - unicodeslot=0x0392, + unicodeslot=0x392, }, - [0x0393]={ + [0x393]={ adobename="Gamma", category="lu", cjkwd="a", contextname="greekGamma", description="GREEK CAPITAL LETTER GAMMA", direction="l", - lccode=0x03B3, + lccode=0x3B3, linebreak="al", mathclass="variable", mathname="Gamma", - unicodeslot=0x0393, + unicodeslot=0x393, }, - [0x0394]={ + [0x394]={ adobename="Deltagreek", category="lu", cjkwd="a", contextname="greekDelta", description="GREEK CAPITAL LETTER DELTA", direction="l", - lccode=0x03B4, + lccode=0x3B4, linebreak="al", mathclass="variable", mathname="Delta", - unicodeslot=0x0394, + unicodeslot=0x394, }, - [0x0395]={ + [0x395]={ adobename="Epsilon", category="lu", cjkwd="a", contextname="greekEpsilon", description="GREEK CAPITAL LETTER EPSILON", direction="l", - lccode=0x03B5, + lccode=0x3B5, linebreak="al", mathclass="variable", mathname="Epsilon", - unicodeslot=0x0395, + unicodeslot=0x395, }, - [0x0396]={ + [0x396]={ adobename="Zeta", category="lu", cjkwd="a", contextname="greekZeta", description="GREEK CAPITAL LETTER ZETA", direction="l", - lccode=0x03B6, + lccode=0x3B6, linebreak="al", mathclass="variable", mathname="Zeta", - unicodeslot=0x0396, + unicodeslot=0x396, }, - [0x0397]={ + [0x397]={ adobename="Eta", category="lu", cjkwd="a", contextname="greekEta", description="GREEK CAPITAL LETTER ETA", direction="l", - lccode=0x03B7, + lccode=0x3B7, linebreak="al", mathclass="variable", mathname="Eta", - unicodeslot=0x0397, + unicodeslot=0x397, }, - [0x0398]={ + [0x398]={ adobename="Theta", category="lu", cjkwd="a", contextname="greekTheta", description="GREEK CAPITAL LETTER THETA", direction="l", - lccode=0x03B8, + lccode=0x3B8, linebreak="al", mathclass="variable", mathname="Theta", - unicodeslot=0x0398, + unicodeslot=0x398, }, - [0x0399]={ + [0x399]={ adobename="Iota", category="lu", cjkwd="a", contextname="greekIota", description="GREEK CAPITAL LETTER IOTA", direction="l", - lccode=0x03B9, + lccode=0x3B9, linebreak="al", mathclass="variable", mathname="Iota", - unicodeslot=0x0399, + unicodeslot=0x399, }, - [0x039A]={ + [0x39A]={ adobename="Kappa", category="lu", cjkwd="a", contextname="greekKappa", description="GREEK CAPITAL LETTER KAPPA", direction="l", - lccode=0x03BA, + lccode=0x3BA, linebreak="al", mathclass="variable", mathname="Kappa", - unicodeslot=0x039A, + unicodeslot=0x39A, }, - [0x039B]={ + [0x39B]={ adobename="Lambda", category="lu", cjkwd="a", contextname="greekLambda", description="GREEK CAPITAL LETTER LAMDA", direction="l", - lccode=0x03BB, + lccode=0x3BB, linebreak="al", mathclass="variable", mathname="Lambda", - unicodeslot=0x039B, + unicodeslot=0x39B, }, - [0x039C]={ + [0x39C]={ adobename="Mu", category="lu", cjkwd="a", contextname="greekMu", description="GREEK CAPITAL LETTER MU", direction="l", - lccode=0x03BC, + lccode=0x3BC, linebreak="al", mathclass="variable", mathname="Mu", - unicodeslot=0x039C, + unicodeslot=0x39C, }, - [0x039D]={ + [0x39D]={ adobename="Nu", category="lu", cjkwd="a", contextname="greekNu", description="GREEK CAPITAL LETTER NU", direction="l", - lccode=0x03BD, + lccode=0x3BD, linebreak="al", mathclass="variable", mathname="Nu", - unicodeslot=0x039D, + unicodeslot=0x39D, }, - [0x039E]={ + [0x39E]={ adobename="Xi", category="lu", cjkwd="a", contextname="greekXi", description="GREEK CAPITAL LETTER XI", direction="l", - lccode=0x03BE, + lccode=0x3BE, linebreak="al", mathclass="variable", mathname="Xi", - unicodeslot=0x039E, + unicodeslot=0x39E, }, - [0x039F]={ + [0x39F]={ adobename="Omicron", category="lu", cjkwd="a", contextname="greekOmicron", description="GREEK CAPITAL LETTER OMICRON", direction="l", - lccode=0x03BF, + lccode=0x3BF, linebreak="al", mathclass="variable", mathname="Omicron", - unicodeslot=0x039F, + unicodeslot=0x39F, }, - [0x03A0]={ + [0x3A0]={ adobename="Pi", category="lu", cjkwd="a", contextname="greekPi", description="GREEK CAPITAL LETTER PI", direction="l", - lccode=0x03C0, + lccode=0x3C0, linebreak="al", mathclass="variable", mathname="Pi", - unicodeslot=0x03A0, + unicodeslot=0x3A0, }, - [0x03A1]={ + [0x3A1]={ adobename="Rho", category="lu", cjkwd="a", contextname="greekRho", description="GREEK CAPITAL LETTER RHO", direction="l", - lccode=0x03C1, + lccode=0x3C1, linebreak="al", mathclass="variable", mathname="Rho", - unicodeslot=0x03A1, + unicodeslot=0x3A1, }, - [0x03A3]={ + [0x3A3]={ adobename="Sigma", category="lu", cjkwd="a", contextname="greekSigma", description="GREEK CAPITAL LETTER SIGMA", direction="l", - lccode=0x03C3, + lccode=0x3C3, linebreak="al", mathclass="variable", mathname="Sigma", - unicodeslot=0x03A3, + unicodeslot=0x3A3, }, - [0x03A4]={ + [0x3A4]={ adobename="Tau", category="lu", cjkwd="a", contextname="greekTau", description="GREEK CAPITAL LETTER TAU", direction="l", - lccode=0x03C4, + lccode=0x3C4, linebreak="al", mathclass="variable", mathname="Tau", - unicodeslot=0x03A4, + unicodeslot=0x3A4, }, - [0x03A5]={ + [0x3A5]={ adobename="Upsilon", category="lu", cjkwd="a", contextname="greekUpsilon", description="GREEK CAPITAL LETTER UPSILON", direction="l", - lccode=0x03C5, + lccode=0x3C5, linebreak="al", mathclass="variable", mathname="Upsilon", - unicodeslot=0x03A5, + unicodeslot=0x3A5, }, - [0x03A6]={ + [0x3A6]={ adobename="Phi", category="lu", cjkwd="a", contextname="greekPhi", description="GREEK CAPITAL LETTER PHI", direction="l", - lccode=0x03C6, + lccode=0x3C6, linebreak="al", mathclass="variable", mathname="Phi", - unicodeslot=0x03A6, + unicodeslot=0x3A6, }, - [0x03A7]={ + [0x3A7]={ adobename="Chi", category="lu", cjkwd="a", contextname="greekChi", description="GREEK CAPITAL LETTER CHI", direction="l", - lccode=0x03C7, + lccode=0x3C7, linebreak="al", mathclass="variable", mathname="Chi", - unicodeslot=0x03A7, + unicodeslot=0x3A7, }, - [0x03A8]={ + [0x3A8]={ adobename="Psi", category="lu", cjkwd="a", contextname="greekPsi", description="GREEK CAPITAL LETTER PSI", direction="l", - lccode=0x03C8, + lccode=0x3C8, linebreak="al", mathclass="variable", mathname="Psi", - unicodeslot=0x03A8, + unicodeslot=0x3A8, }, - [0x03A9]={ + [0x3A9]={ adobename="Omegagreek", category="lu", cjkwd="a", contextname="greekOmega", description="GREEK CAPITAL LETTER OMEGA", direction="l", - lccode=0x03C9, + lccode=0x3C9, linebreak="al", mathclass="variable", mathname="Omega", - unicodeslot=0x03A9, + unicodeslot=0x3A9, }, - [0x03AA]={ + [0x3AA]={ adobename="Iotadieresis", category="lu", contextname="greekIotadialytika", description="GREEK CAPITAL LETTER IOTA WITH DIALYTIKA", direction="l", - lccode=0x03CA, + lccode=0x3CA, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0308 }, - unicodeslot=0x03AA, + shcode=0x399, + specials={ "char", 0x399, 0x308 }, + unicodeslot=0x3AA, }, - [0x03AB]={ + [0x3AB]={ adobename="Upsilondieresis", category="lu", contextname="greekUpsilondialytika", description="GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA", direction="l", - lccode=0x03CB, + lccode=0x3CB, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0308 }, - unicodeslot=0x03AB, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x308 }, + unicodeslot=0x3AB, }, - [0x03AC]={ + [0x3AC]={ adobename="alphatonos", category="ll", contextname="greekalphatonos", description="GREEK SMALL LETTER ALPHA WITH TONOS", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0301 }, - uccode=0x0386, - unicodeslot=0x03AC, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x301 }, + uccode=0x386, + unicodeslot=0x3AC, }, - [0x03AD]={ + [0x3AD]={ adobename="epsilontonos", category="ll", contextname="greekepsilontonos", description="GREEK SMALL LETTER EPSILON WITH TONOS", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x03B5, 0x0301 }, - uccode=0x0388, - unicodeslot=0x03AD, + shcode=0x3B5, + specials={ "char", 0x3B5, 0x301 }, + uccode=0x388, + unicodeslot=0x3AD, }, - [0x03AE]={ + [0x3AE]={ adobename="etatonos", category="ll", contextname="greeketatonos", description="GREEK SMALL LETTER ETA WITH TONOS", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0301 }, - uccode=0x0389, - unicodeslot=0x03AE, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x301 }, + uccode=0x389, + unicodeslot=0x3AE, }, - [0x03AF]={ + [0x3AF]={ adobename="iotatonos", category="ll", contextname="greekiotatonos", description="GREEK SMALL LETTER IOTA WITH TONOS", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0301 }, - uccode=0x038A, - unicodeslot=0x03AF, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x301 }, + uccode=0x38A, + unicodeslot=0x3AF, }, - [0x03B0]={ + [0x3B0]={ adobename="upsilondieresistonos", category="ll", contextname="greekupsilondialytikatonos", description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03CB, 0x0301 }, - unicodeslot=0x03B0, + shcode=0x3C5, + specials={ "char", 0x3CB, 0x301 }, + unicodeslot=0x3B0, }, - [0x03B1]={ + [0x3B1]={ adobename="alpha", category="ll", cjkwd="a", @@ -9631,10 +9759,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="alpha", - uccode=0x0391, - unicodeslot=0x03B1, + uccode=0x391, + unicodeslot=0x3B1, }, - [0x03B2]={ + [0x3B2]={ adobename="beta", category="ll", cjkwd="a", @@ -9644,10 +9772,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="beta", - uccode=0x0392, - unicodeslot=0x03B2, + uccode=0x392, + unicodeslot=0x3B2, }, - [0x03B3]={ + [0x3B3]={ adobename="gamma", category="ll", cjkwd="a", @@ -9657,10 +9785,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="gamma", - uccode=0x0393, - unicodeslot=0x03B3, + uccode=0x393, + unicodeslot=0x3B3, }, - [0x03B4]={ + [0x3B4]={ adobename="delta", category="ll", cjkwd="a", @@ -9670,10 +9798,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="delta", - uccode=0x0394, - unicodeslot=0x03B4, + uccode=0x394, + unicodeslot=0x3B4, }, - [0x03B5]={ + [0x3B5]={ adobename="epsilon", category="ll", cjkwd="a", @@ -9683,10 +9811,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varepsilon", - uccode=0x0395, - unicodeslot=0x03B5, + uccode=0x395, + unicodeslot=0x3B5, }, - [0x03B6]={ + [0x3B6]={ adobename="zeta", category="ll", cjkwd="a", @@ -9696,10 +9824,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="zeta", - uccode=0x0396, - unicodeslot=0x03B6, + uccode=0x396, + unicodeslot=0x3B6, }, - [0x03B7]={ + [0x3B7]={ adobename="eta", category="ll", cjkwd="a", @@ -9709,10 +9837,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="eta", - uccode=0x0397, - unicodeslot=0x03B7, + uccode=0x397, + unicodeslot=0x3B7, }, - [0x03B8]={ + [0x3B8]={ adobename="theta", category="ll", cjkwd="a", @@ -9722,10 +9850,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="theta", - uccode=0x0398, - unicodeslot=0x03B8, + uccode=0x398, + unicodeslot=0x3B8, }, - [0x03B9]={ + [0x3B9]={ adobename="iota", category="ll", cjkwd="a", @@ -9735,10 +9863,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="iota", - uccode=0x0399, - unicodeslot=0x03B9, + uccode=0x399, + unicodeslot=0x3B9, }, - [0x03BA]={ + [0x3BA]={ adobename="kappa", category="ll", cjkwd="a", @@ -9748,10 +9876,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="kappa", - uccode=0x039A, - unicodeslot=0x03BA, + uccode=0x39A, + unicodeslot=0x3BA, }, - [0x03BB]={ + [0x3BB]={ adobename="lambda", category="ll", cjkwd="a", @@ -9761,10 +9889,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="lambda", - uccode=0x039B, - unicodeslot=0x03BB, + uccode=0x39B, + unicodeslot=0x3BB, }, - [0x03BC]={ + [0x3BC]={ adobename="mugreek", category="ll", cjkwd="a", @@ -9774,10 +9902,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="mu", - uccode=0x039C, - unicodeslot=0x03BC, + uccode=0x39C, + unicodeslot=0x3BC, }, - [0x03BD]={ + [0x3BD]={ adobename="nu", category="ll", cjkwd="a", @@ -9787,10 +9915,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="nu", - uccode=0x039D, - unicodeslot=0x03BD, + uccode=0x39D, + unicodeslot=0x3BD, }, - [0x03BE]={ + [0x3BE]={ adobename="xi", category="ll", cjkwd="a", @@ -9800,10 +9928,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="xi", - uccode=0x039E, - unicodeslot=0x03BE, + uccode=0x39E, + unicodeslot=0x3BE, }, - [0x03BF]={ + [0x3BF]={ adobename="omicron", category="ll", cjkwd="a", @@ -9813,10 +9941,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="omicron", - uccode=0x039F, - unicodeslot=0x03BF, + uccode=0x39F, + unicodeslot=0x3BF, }, - [0x03C0]={ + [0x3C0]={ adobename="pi", category="ll", cjkwd="a", @@ -9826,10 +9954,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="pi", - uccode=0x03A0, - unicodeslot=0x03C0, + uccode=0x3A0, + unicodeslot=0x3C0, }, - [0x03C1]={ + [0x3C1]={ adobename="rho", category="ll", cjkwd="a", @@ -9839,10 +9967,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="rho", - uccode=0x03A1, - unicodeslot=0x03C1, + uccode=0x3A1, + unicodeslot=0x3C1, }, - [0x03C2]={ + [0x3C2]={ adobename="sigmafinal", category="ll", contextname="greekfinalsigma", @@ -9851,10 +9979,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varsigma", - uccode=0x03A3, - unicodeslot=0x03C2, + uccode=0x3A3, + unicodeslot=0x3C2, }, - [0x03C3]={ + [0x3C3]={ adobename="sigma", category="ll", cjkwd="a", @@ -9864,10 +9992,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="sigma", - uccode=0x03A3, - unicodeslot=0x03C3, + uccode=0x3A3, + unicodeslot=0x3C3, }, - [0x03C4]={ + [0x3C4]={ adobename="tau", category="ll", cjkwd="a", @@ -9877,10 +10005,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="tau", - uccode=0x03A4, - unicodeslot=0x03C4, + uccode=0x3A4, + unicodeslot=0x3C4, }, - [0x03C5]={ + [0x3C5]={ adobename="upsilon", category="ll", cjkwd="a", @@ -9890,10 +10018,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="upsilon", - uccode=0x03A5, - unicodeslot=0x03C5, + uccode=0x3A5, + unicodeslot=0x3C5, }, - [0x03C6]={ + [0x3C6]={ adobename="phi", category="ll", cjkwd="a", @@ -9903,10 +10031,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varphi", - uccode=0x03A6, - unicodeslot=0x03C6, + uccode=0x3A6, + unicodeslot=0x3C6, }, - [0x03C7]={ + [0x3C7]={ adobename="chi", category="ll", cjkwd="a", @@ -9916,10 +10044,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="chi", - uccode=0x03A7, - unicodeslot=0x03C7, + uccode=0x3A7, + unicodeslot=0x3C7, }, - [0x03C8]={ + [0x3C8]={ adobename="psi", category="ll", cjkwd="a", @@ -9929,10 +10057,10 @@ characters.data={ linebreak="al", mathclass="variable", mathname="psi", - uccode=0x03A8, - unicodeslot=0x03C8, + uccode=0x3A8, + unicodeslot=0x3C8, }, - [0x03C9]={ + [0x3C9]={ adobename="omega", category="ll", cjkwd="a", @@ -9942,87 +10070,87 @@ characters.data={ linebreak="al", mathclass="variable", mathname="omega", - uccode=0x03A9, - unicodeslot=0x03C9, + uccode=0x3A9, + unicodeslot=0x3C9, }, - [0x03CA]={ + [0x3CA]={ adobename="iotadieresis", category="ll", contextname="greekiotadialytika", description="GREEK SMALL LETTER IOTA WITH DIALYTIKA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0308 }, - uccode=0x03AA, - unicodeslot=0x03CA, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x308 }, + uccode=0x3AA, + unicodeslot=0x3CA, }, - [0x03CB]={ + [0x3CB]={ adobename="upsilondieresis", category="ll", contextname="greekupsilondiaeresis", description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0308 }, - uccode=0x03AB, - unicodeslot=0x03CB, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x308 }, + uccode=0x3AB, + unicodeslot=0x3CB, }, - [0x03CC]={ + [0x3CC]={ adobename="omicrontonos", category="ll", contextname="greekomicrontonos", description="GREEK SMALL LETTER OMICRON WITH TONOS", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x03BF, 0x0301 }, - uccode=0x038C, - unicodeslot=0x03CC, + shcode=0x3BF, + specials={ "char", 0x3BF, 0x301 }, + uccode=0x38C, + unicodeslot=0x3CC, }, - [0x03CD]={ + [0x3CD]={ adobename="upsilontonos", category="ll", contextname="greekupsilontonos", description="GREEK SMALL LETTER UPSILON WITH TONOS", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0301 }, - uccode=0x038E, - unicodeslot=0x03CD, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x301 }, + uccode=0x38E, + unicodeslot=0x3CD, }, - [0x03CE]={ + [0x3CE]={ adobename="omegatonos", category="ll", contextname="greekomegatonos", description="GREEK SMALL LETTER OMEGA WITH TONOS", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0301 }, - uccode=0x038F, - unicodeslot=0x03CE, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x301 }, + uccode=0x38F, + unicodeslot=0x3CE, }, - [0x03CF]={ + [0x3CF]={ category="lu", description="GREEK CAPITAL KAI SYMBOL", direction="l", linebreak="al", - unicodeslot=0x03CF, + unicodeslot=0x3CF, }, - [0x03D0]={ + [0x3D0]={ adobename="betasymbolgreek", category="ll", description="GREEK BETA SYMBOL", direction="l", linebreak="al", - specials={ "compat", 0x03B2 }, - uccode=0x0392, - unicodeslot=0x03D0, + specials={ "compat", 0x3B2 }, + uccode=0x392, + unicodeslot=0x3D0, }, - [0x03D1]={ + [0x3D1]={ adobename="thetasymbolgreek", category="ll", contextname="greekthetaalt", @@ -10031,38 +10159,38 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varTheta", - specials={ "compat", 0x03B8 }, - uccode=0x0398, - unicodeslot=0x03D1, + specials={ "compat", 0x3B8 }, + uccode=0x398, + unicodeslot=0x3D1, }, - [0x03D2]={ + [0x3D2]={ adobename="Upsilonhooksymbol", category="lu", description="GREEK UPSILON WITH HOOK SYMBOL", direction="l", linebreak="al", - specials={ "compat", 0x03A5 }, - unicodeslot=0x03D2, + specials={ "compat", 0x3A5 }, + unicodeslot=0x3D2, }, - [0x03D3]={ + [0x3D3]={ adobename="Upsilonacutehooksymbolgreek", category="lu", description="GREEK UPSILON WITH ACUTE AND HOOK SYMBOL", direction="l", linebreak="al", - specials={ "char", 0x03D2, 0x0301 }, - unicodeslot=0x03D3, + specials={ "char", 0x3D2, 0x301 }, + unicodeslot=0x3D3, }, - [0x03D4]={ + [0x3D4]={ adobename="Upsilondieresishooksymbolgreek", category="lu", description="GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL", direction="l", linebreak="al", - specials={ "char", 0x03D2, 0x0308 }, - unicodeslot=0x03D4, + specials={ "char", 0x3D2, 0x308 }, + unicodeslot=0x3D4, }, - [0x03D5]={ + [0x3D5]={ adobename="phisymbolgreek", category="ll", contextname="greekphialt", @@ -10071,11 +10199,11 @@ characters.data={ linebreak="al", mathclass="variable", mathname="phi", - specials={ "compat", 0x03C6 }, - uccode=0x03A6, - unicodeslot=0x03D5, + specials={ "compat", 0x3C6 }, + uccode=0x3A6, + unicodeslot=0x3D5, }, - [0x03D6]={ + [0x3D6]={ adobename="pisymbolgreek", category="ll", contextname="greekpialt", @@ -10084,235 +10212,235 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varpi", - specials={ "compat", 0x03C0 }, - uccode=0x03A0, - unicodeslot=0x03D6, + specials={ "compat", 0x3C0 }, + uccode=0x3A0, + unicodeslot=0x3D6, }, - [0x03D7]={ + [0x3D7]={ category="ll", description="GREEK KAI SYMBOL", direction="l", linebreak="al", - unicodeslot=0x03D7, + unicodeslot=0x3D7, }, - [0x03D8]={ + [0x3D8]={ category="lu", description="GREEK LETTER ARCHAIC KOPPA", direction="l", - lccode=0x03D9, + lccode=0x3D9, linebreak="al", - unicodeslot=0x03D8, + unicodeslot=0x3D8, }, - [0x03D9]={ + [0x3D9]={ category="ll", contextname="greekkoppa", description="GREEK SMALL LETTER ARCHAIC KOPPA", direction="l", linebreak="al", - uccode=0x03D8, - unicodeslot=0x03D9, + uccode=0x3D8, + unicodeslot=0x3D9, }, - [0x03DA]={ + [0x3DA]={ adobename="Stigmagreek", category="lu", description="GREEK LETTER STIGMA", direction="l", - lccode=0x03DB, + lccode=0x3DB, linebreak="al", - unicodeslot=0x03DA, + unicodeslot=0x3DA, }, - [0x03DB]={ + [0x3DB]={ category="ll", contextname="greekstigma", description="GREEK SMALL LETTER STIGMA", direction="l", linebreak="al", - uccode=0x03DA, - unicodeslot=0x03DB, + uccode=0x3DA, + unicodeslot=0x3DB, }, - [0x03DC]={ + [0x3DC]={ adobename="Digammagreek", category="lu", description="GREEK LETTER DIGAMMA", direction="l", - lccode=0x03DD, + lccode=0x3DD, linebreak="al", mathclass="variable", mathname="digamma", - unicodeslot=0x03DC, + unicodeslot=0x3DC, }, - [0x03DD]={ + [0x3DD]={ category="ll", contextname="greekdigamma", description="GREEK SMALL LETTER DIGAMMA", direction="l", linebreak="al", - uccode=0x03DC, - unicodeslot=0x03DD, + uccode=0x3DC, + unicodeslot=0x3DD, }, - [0x03DE]={ + [0x3DE]={ adobename="Koppagreek", category="lu", description="GREEK LETTER KOPPA", direction="l", - lccode=0x03DF, + lccode=0x3DF, linebreak="al", - unicodeslot=0x03DE, + unicodeslot=0x3DE, }, - [0x03DF]={ + [0x3DF]={ category="ll", contextname="greeknumkoppa", description="GREEK SMALL LETTER KOPPA", direction="l", linebreak="al", - uccode=0x03DE, - unicodeslot=0x03DF, + uccode=0x3DE, + unicodeslot=0x3DF, }, - [0x03E0]={ + [0x3E0]={ adobename="Sampigreek", category="lu", description="GREEK LETTER SAMPI", direction="l", - lccode=0x03E1, + lccode=0x3E1, linebreak="al", - unicodeslot=0x03E0, + unicodeslot=0x3E0, }, - [0x03E1]={ + [0x3E1]={ category="ll", contextname="greeksampi", description="GREEK SMALL LETTER SAMPI", direction="l", linebreak="al", - uccode=0x03E0, - unicodeslot=0x03E1, + uccode=0x3E0, + unicodeslot=0x3E1, }, - [0x03E2]={ + [0x3E2]={ adobename="Sheicoptic", category="lu", description="COPTIC CAPITAL LETTER SHEI", direction="l", - lccode=0x03E3, + lccode=0x3E3, linebreak="al", - unicodeslot=0x03E2, + unicodeslot=0x3E2, }, - [0x03E3]={ + [0x3E3]={ adobename="sheicoptic", category="ll", description="COPTIC SMALL LETTER SHEI", direction="l", linebreak="al", - uccode=0x03E2, - unicodeslot=0x03E3, + uccode=0x3E2, + unicodeslot=0x3E3, }, - [0x03E4]={ + [0x3E4]={ adobename="Feicoptic", category="lu", description="COPTIC CAPITAL LETTER FEI", direction="l", - lccode=0x03E5, + lccode=0x3E5, linebreak="al", - unicodeslot=0x03E4, + unicodeslot=0x3E4, }, - [0x03E5]={ + [0x3E5]={ adobename="feicoptic", category="ll", description="COPTIC SMALL LETTER FEI", direction="l", linebreak="al", - uccode=0x03E4, - unicodeslot=0x03E5, + uccode=0x3E4, + unicodeslot=0x3E5, }, - [0x03E6]={ + [0x3E6]={ adobename="Kheicoptic", category="lu", description="COPTIC CAPITAL LETTER KHEI", direction="l", - lccode=0x03E7, + lccode=0x3E7, linebreak="al", - unicodeslot=0x03E6, + unicodeslot=0x3E6, }, - [0x03E7]={ + [0x3E7]={ adobename="kheicoptic", category="ll", description="COPTIC SMALL LETTER KHEI", direction="l", linebreak="al", - uccode=0x03E6, - unicodeslot=0x03E7, + uccode=0x3E6, + unicodeslot=0x3E7, }, - [0x03E8]={ + [0x3E8]={ adobename="Horicoptic", category="lu", description="COPTIC CAPITAL LETTER HORI", direction="l", - lccode=0x03E9, + lccode=0x3E9, linebreak="al", - unicodeslot=0x03E8, + unicodeslot=0x3E8, }, - [0x03E9]={ + [0x3E9]={ adobename="horicoptic", category="ll", description="COPTIC SMALL LETTER HORI", direction="l", linebreak="al", - uccode=0x03E8, - unicodeslot=0x03E9, + uccode=0x3E8, + unicodeslot=0x3E9, }, - [0x03EA]={ + [0x3EA]={ adobename="Gangiacoptic", category="lu", description="COPTIC CAPITAL LETTER GANGIA", direction="l", - lccode=0x03EB, + lccode=0x3EB, linebreak="al", - unicodeslot=0x03EA, + unicodeslot=0x3EA, }, - [0x03EB]={ + [0x3EB]={ adobename="gangiacoptic", category="ll", description="COPTIC SMALL LETTER GANGIA", direction="l", linebreak="al", - uccode=0x03EA, - unicodeslot=0x03EB, + uccode=0x3EA, + unicodeslot=0x3EB, }, - [0x03EC]={ + [0x3EC]={ adobename="Shimacoptic", category="lu", description="COPTIC CAPITAL LETTER SHIMA", direction="l", - lccode=0x03ED, + lccode=0x3ED, linebreak="al", - unicodeslot=0x03EC, + unicodeslot=0x3EC, }, - [0x03ED]={ + [0x3ED]={ adobename="shimacoptic", category="ll", description="COPTIC SMALL LETTER SHIMA", direction="l", linebreak="al", - uccode=0x03EC, - unicodeslot=0x03ED, + uccode=0x3EC, + unicodeslot=0x3ED, }, - [0x03EE]={ + [0x3EE]={ adobename="Deicoptic", category="lu", description="COPTIC CAPITAL LETTER DEI", direction="l", - lccode=0x03EF, + lccode=0x3EF, linebreak="al", - unicodeslot=0x03EE, + unicodeslot=0x3EE, }, - [0x03EF]={ + [0x3EF]={ adobename="deicoptic", category="ll", description="COPTIC SMALL LETTER DEI", direction="l", linebreak="al", - uccode=0x03EE, - unicodeslot=0x03EF, + uccode=0x3EE, + unicodeslot=0x3EF, }, - [0x03F0]={ + [0x3F0]={ adobename="kappasymbolgreek", category="ll", description="GREEK KAPPA SYMBOL", @@ -10320,50 +10448,50 @@ characters.data={ linebreak="al", mathclass="ordinary", mathname="varkappa", - specials={ "compat", 0x03BA }, - uccode=0x039A, - unicodeslot=0x03F0, + specials={ "compat", 0x3BA }, + uccode=0x39A, + unicodeslot=0x3F0, }, - [0x03F1]={ + [0x3F1]={ adobename="rhosymbolgreek", category="ll", contextname="greekrhoalt", description="GREEK RHO SYMBOL", direction="l", linebreak="al", - specials={ "compat", 0x03C1 }, - uccode=0x03A1, - unicodeslot=0x03F1, + specials={ "compat", 0x3C1 }, + uccode=0x3A1, + unicodeslot=0x3F1, }, - [0x03F2]={ + [0x3F2]={ adobename="sigmalunatesymbolgreek", category="ll", contextname="greeksigmalunate", description="GREEK LUNATE SIGMA SYMBOL", direction="l", linebreak="al", - specials={ "compat", 0x03C2 }, - uccode=0x03F9, - unicodeslot=0x03F2, + specials={ "compat", 0x3C2 }, + uccode=0x3F9, + unicodeslot=0x3F2, }, - [0x03F3]={ + [0x3F3]={ adobename="yotgreek", category="ll", description="GREEK LETTER YOT", direction="l", linebreak="al", - unicodeslot=0x03F3, + unicodeslot=0x3F3, }, - [0x03F4]={ + [0x3F4]={ category="lu", description="GREEK CAPITAL THETA SYMBOL", direction="l", - lccode=0x03B8, + lccode=0x3B8, linebreak="al", - specials={ "compat", 0x0398 }, - unicodeslot=0x03F4, + specials={ "compat", 0x398 }, + unicodeslot=0x3F4, }, - [0x03F5]={ + [0x3F5]={ category="ll", contextname="greekepsilonalt", description="GREEK LUNATE EPSILON SYMBOL", @@ -10371,614 +10499,614 @@ characters.data={ linebreak="al", mathclass="variable", mathname="epsilon", - specials={ "compat", 0x03B5 }, - uccode=0x0395, - unicodeslot=0x03F5, + specials={ "compat", 0x3B5 }, + uccode=0x395, + unicodeslot=0x3F5, }, - [0x03F6]={ + [0x3F6]={ category="sm", description="GREEK REVERSED LUNATE EPSILON SYMBOL", direction="on", linebreak="al", mathclass="variable", mathname="backepsilon", - unicodeslot=0x03F6, + unicodeslot=0x3F6, }, - [0x03F7]={ + [0x3F7]={ category="lu", description="GREEK CAPITAL LETTER SHO", direction="l", - lccode=0x03F8, + lccode=0x3F8, linebreak="al", - unicodeslot=0x03F7, + unicodeslot=0x3F7, }, - [0x03F8]={ + [0x3F8]={ category="ll", description="GREEK SMALL LETTER SHO", direction="l", linebreak="al", - uccode=0x03F7, - unicodeslot=0x03F8, + uccode=0x3F7, + unicodeslot=0x3F8, }, - [0x03F9]={ + [0x3F9]={ category="lu", contextname="greekSigmalunate", description="GREEK CAPITAL LUNATE SIGMA SYMBOL", direction="l", - lccode=0x03F2, + lccode=0x3F2, linebreak="al", - specials={ "compat", 0x03A3 }, - unicodeslot=0x03F9, + specials={ "compat", 0x3A3 }, + unicodeslot=0x3F9, }, - [0x03FA]={ + [0x3FA]={ category="lu", description="GREEK CAPITAL LETTER SAN", direction="l", - lccode=0x03FB, + lccode=0x3FB, linebreak="al", - unicodeslot=0x03FA, + unicodeslot=0x3FA, }, - [0x03FB]={ + [0x3FB]={ category="ll", description="GREEK SMALL LETTER SAN", direction="l", linebreak="al", - uccode=0x03FA, - unicodeslot=0x03FB, + uccode=0x3FA, + unicodeslot=0x3FB, }, - [0x03FC]={ + [0x3FC]={ category="ll", description="GREEK RHO WITH STROKE SYMBOL", direction="l", linebreak="al", - unicodeslot=0x03FC, + unicodeslot=0x3FC, }, - [0x03FD]={ + [0x3FD]={ category="lu", description="GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL", direction="l", - lccode=0x037B, + lccode=0x37B, linebreak="al", - unicodeslot=0x03FD, + unicodeslot=0x3FD, }, - [0x03FE]={ + [0x3FE]={ category="lu", description="GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL", direction="l", - lccode=0x037C, + lccode=0x37C, linebreak="al", - unicodeslot=0x03FE, + unicodeslot=0x3FE, }, - [0x03FF]={ + [0x3FF]={ category="lu", description="GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL", direction="l", - lccode=0x037D, + lccode=0x37D, linebreak="al", - unicodeslot=0x03FF, + unicodeslot=0x3FF, }, - [0x0400]={ + [0x400]={ category="lu", contextname="cyrillicEgrave", description="CYRILLIC CAPITAL LETTER IE WITH GRAVE", direction="l", - lccode=0x0450, + lccode=0x450, linebreak="al", - shcode=0x0415, - specials={ "char", 0x0415, 0x0300 }, - unicodeslot=0x0400, + shcode=0x415, + specials={ "char", 0x415, 0x300 }, + unicodeslot=0x400, }, - [0x0401]={ + [0x401]={ adobename="afii10023", category="lu", cjkwd="a", contextname="cyrillicYO", description="CYRILLIC CAPITAL LETTER IO", direction="l", - lccode=0x0451, + lccode=0x451, linebreak="al", - specials={ "char", 0x0415, 0x0308 }, - unicodeslot=0x0401, + specials={ "char", 0x415, 0x308 }, + unicodeslot=0x401, }, - [0x0402]={ + [0x402]={ adobename="afii10051", category="lu", contextname="cyrillicDJE", description="CYRILLIC CAPITAL LETTER DJE", direction="l", - lccode=0x0452, + lccode=0x452, linebreak="al", - unicodeslot=0x0402, + unicodeslot=0x402, }, - [0x0403]={ + [0x403]={ adobename="afii10052", category="lu", contextname="cyrillicGJE", description="CYRILLIC CAPITAL LETTER GJE", direction="l", - lccode=0x0453, + lccode=0x453, linebreak="al", - specials={ "char", 0x0413, 0x0301 }, - unicodeslot=0x0403, + specials={ "char", 0x413, 0x301 }, + unicodeslot=0x403, }, - [0x0404]={ + [0x404]={ adobename="afii10053", category="lu", contextname="cyrillicIE", description="CYRILLIC CAPITAL LETTER UKRAINIAN IE", direction="l", - lccode=0x0454, + lccode=0x454, linebreak="al", - unicodeslot=0x0404, + unicodeslot=0x404, }, - [0x0405]={ + [0x405]={ adobename="afii10054", category="lu", contextname="cyrillicDZE", description="CYRILLIC CAPITAL LETTER DZE", direction="l", - lccode=0x0455, + lccode=0x455, linebreak="al", - unicodeslot=0x0405, + unicodeslot=0x405, }, - [0x0406]={ + [0x406]={ adobename="afii10055", category="lu", contextname="cyrillicII", description="CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I", direction="l", - lccode=0x0456, + lccode=0x456, linebreak="al", - unicodeslot=0x0406, + unicodeslot=0x406, }, - [0x0407]={ + [0x407]={ adobename="afii10056", category="lu", contextname="cyrillicYI", description="CYRILLIC CAPITAL LETTER YI", direction="l", - lccode=0x0457, + lccode=0x457, linebreak="al", - specials={ "char", 0x0406, 0x0308 }, - unicodeslot=0x0407, + specials={ "char", 0x406, 0x308 }, + unicodeslot=0x407, }, - [0x0408]={ + [0x408]={ adobename="afii10057", category="lu", contextname="cyrillicJE", description="CYRILLIC CAPITAL LETTER JE", direction="l", - lccode=0x0458, + lccode=0x458, linebreak="al", - unicodeslot=0x0408, + unicodeslot=0x408, }, - [0x0409]={ + [0x409]={ adobename="afii10058", category="lu", contextname="cyrillicLJE", description="CYRILLIC CAPITAL LETTER LJE", direction="l", - lccode=0x0459, + lccode=0x459, linebreak="al", - unicodeslot=0x0409, + unicodeslot=0x409, }, - [0x040A]={ + [0x40A]={ adobename="afii10059", category="lu", contextname="cyrillicNJE", description="CYRILLIC CAPITAL LETTER NJE", direction="l", - lccode=0x045A, + lccode=0x45A, linebreak="al", - unicodeslot=0x040A, + unicodeslot=0x40A, }, - [0x040B]={ + [0x40B]={ adobename="afii10060", category="lu", contextname="cyrillicTSHE", description="CYRILLIC CAPITAL LETTER TSHE", direction="l", - lccode=0x045B, + lccode=0x45B, linebreak="al", - unicodeslot=0x040B, + unicodeslot=0x40B, }, - [0x040C]={ + [0x40C]={ adobename="afii10061", category="lu", contextname="cyrillicKJE", description="CYRILLIC CAPITAL LETTER KJE", direction="l", - lccode=0x045C, + lccode=0x45C, linebreak="al", - specials={ "char", 0x041A, 0x0301 }, - unicodeslot=0x040C, + specials={ "char", 0x41A, 0x301 }, + unicodeslot=0x40C, }, - [0x040D]={ + [0x40D]={ category="lu", contextname="cyrillicIgrave", description="CYRILLIC CAPITAL LETTER I WITH GRAVE", direction="l", - lccode=0x045D, + lccode=0x45D, linebreak="al", - shcode=0x0418, - specials={ "char", 0x0418, 0x0300 }, - unicodeslot=0x040D, + shcode=0x418, + specials={ "char", 0x418, 0x300 }, + unicodeslot=0x40D, }, - [0x040E]={ + [0x40E]={ adobename="afii10062", category="lu", contextname="cyrillicUSHRT", description="CYRILLIC CAPITAL LETTER SHORT U", direction="l", - lccode=0x045E, + lccode=0x45E, linebreak="al", - specials={ "char", 0x0423, 0x0306 }, - unicodeslot=0x040E, + specials={ "char", 0x423, 0x306 }, + unicodeslot=0x40E, }, - [0x040F]={ + [0x40F]={ adobename="afii10145", category="lu", contextname="cyrillicDZHE", description="CYRILLIC CAPITAL LETTER DZHE", direction="l", - lccode=0x045F, + lccode=0x45F, linebreak="al", - unicodeslot=0x040F, + unicodeslot=0x40F, }, - [0x0410]={ + [0x410]={ adobename="afii10017", category="lu", cjkwd="a", contextname="cyrillicA", description="CYRILLIC CAPITAL LETTER A", direction="l", - lccode=0x0430, + lccode=0x430, linebreak="al", - unicodeslot=0x0410, + unicodeslot=0x410, }, - [0x0411]={ + [0x411]={ adobename="afii10018", category="lu", cjkwd="a", contextname="cyrillicB", description="CYRILLIC CAPITAL LETTER BE", direction="l", - lccode=0x0431, + lccode=0x431, linebreak="al", - unicodeslot=0x0411, + unicodeslot=0x411, }, - [0x0412]={ + [0x412]={ adobename="afii10019", category="lu", cjkwd="a", contextname="cyrillicV", description="CYRILLIC CAPITAL LETTER VE", direction="l", - lccode=0x0432, + lccode=0x432, linebreak="al", - unicodeslot=0x0412, + unicodeslot=0x412, }, - [0x0413]={ + [0x413]={ adobename="afii10020", category="lu", cjkwd="a", contextname="cyrillicG", description="CYRILLIC CAPITAL LETTER GHE", direction="l", - lccode=0x0433, + lccode=0x433, linebreak="al", - unicodeslot=0x0413, + unicodeslot=0x413, }, - [0x0414]={ + [0x414]={ adobename="afii10021", category="lu", cjkwd="a", contextname="cyrillicD", description="CYRILLIC CAPITAL LETTER DE", direction="l", - lccode=0x0434, + lccode=0x434, linebreak="al", - unicodeslot=0x0414, + unicodeslot=0x414, }, - [0x0415]={ + [0x415]={ adobename="afii10022", category="lu", cjkwd="a", contextname="cyrillicE", description="CYRILLIC CAPITAL LETTER IE", direction="l", - lccode=0x0435, + lccode=0x435, linebreak="al", - unicodeslot=0x0415, + unicodeslot=0x415, }, - [0x0416]={ + [0x416]={ adobename="afii10024", category="lu", cjkwd="a", contextname="cyrillicZH", description="CYRILLIC CAPITAL LETTER ZHE", direction="l", - lccode=0x0436, + lccode=0x436, linebreak="al", - unicodeslot=0x0416, + unicodeslot=0x416, }, - [0x0417]={ + [0x417]={ adobename="afii10025", category="lu", cjkwd="a", contextname="cyrillicZ", description="CYRILLIC CAPITAL LETTER ZE", direction="l", - lccode=0x0437, + lccode=0x437, linebreak="al", - unicodeslot=0x0417, + unicodeslot=0x417, }, - [0x0418]={ + [0x418]={ adobename="afii10026", category="lu", cjkwd="a", contextname="cyrillicI", description="CYRILLIC CAPITAL LETTER I", direction="l", - lccode=0x0438, + lccode=0x438, linebreak="al", - unicodeslot=0x0418, + unicodeslot=0x418, }, - [0x0419]={ + [0x419]={ adobename="afii10027", category="lu", cjkwd="a", contextname="cyrillicISHRT", description="CYRILLIC CAPITAL LETTER SHORT I", direction="l", - lccode=0x0439, + lccode=0x439, linebreak="al", - specials={ "char", 0x0418, 0x0306 }, - unicodeslot=0x0419, + specials={ "char", 0x418, 0x306 }, + unicodeslot=0x419, }, - [0x041A]={ + [0x41A]={ adobename="afii10028", category="lu", cjkwd="a", contextname="cyrillicK", description="CYRILLIC CAPITAL LETTER KA", direction="l", - lccode=0x043A, + lccode=0x43A, linebreak="al", - unicodeslot=0x041A, + unicodeslot=0x41A, }, - [0x041B]={ + [0x41B]={ adobename="afii10029", category="lu", cjkwd="a", contextname="cyrillicL", description="CYRILLIC CAPITAL LETTER EL", direction="l", - lccode=0x043B, + lccode=0x43B, linebreak="al", - unicodeslot=0x041B, + unicodeslot=0x41B, }, - [0x041C]={ + [0x41C]={ adobename="afii10030", category="lu", cjkwd="a", contextname="cyrillicM", description="CYRILLIC CAPITAL LETTER EM", direction="l", - lccode=0x043C, + lccode=0x43C, linebreak="al", - unicodeslot=0x041C, + unicodeslot=0x41C, }, - [0x041D]={ + [0x41D]={ adobename="afii10031", category="lu", cjkwd="a", contextname="cyrillicN", description="CYRILLIC CAPITAL LETTER EN", direction="l", - lccode=0x043D, + lccode=0x43D, linebreak="al", - unicodeslot=0x041D, + unicodeslot=0x41D, }, - [0x041E]={ + [0x41E]={ adobename="afii10032", category="lu", cjkwd="a", contextname="cyrillicO", description="CYRILLIC CAPITAL LETTER O", direction="l", - lccode=0x043E, + lccode=0x43E, linebreak="al", - unicodeslot=0x041E, + unicodeslot=0x41E, }, - [0x041F]={ + [0x41F]={ adobename="afii10033", category="lu", cjkwd="a", contextname="cyrillicP", description="CYRILLIC CAPITAL LETTER PE", direction="l", - lccode=0x043F, + lccode=0x43F, linebreak="al", - unicodeslot=0x041F, + unicodeslot=0x41F, }, - [0x0420]={ + [0x420]={ adobename="afii10034", category="lu", cjkwd="a", contextname="cyrillicR", description="CYRILLIC CAPITAL LETTER ER", direction="l", - lccode=0x0440, + lccode=0x440, linebreak="al", - unicodeslot=0x0420, + unicodeslot=0x420, }, - [0x0421]={ + [0x421]={ adobename="afii10035", category="lu", cjkwd="a", contextname="cyrillicS", description="CYRILLIC CAPITAL LETTER ES", direction="l", - lccode=0x0441, + lccode=0x441, linebreak="al", - unicodeslot=0x0421, + unicodeslot=0x421, }, - [0x0422]={ + [0x422]={ adobename="afii10036", category="lu", cjkwd="a", contextname="cyrillicT", description="CYRILLIC CAPITAL LETTER TE", direction="l", - lccode=0x0442, + lccode=0x442, linebreak="al", - unicodeslot=0x0422, + unicodeslot=0x422, }, - [0x0423]={ + [0x423]={ adobename="afii10037", category="lu", cjkwd="a", contextname="cyrillicU", description="CYRILLIC CAPITAL LETTER U", direction="l", - lccode=0x0443, + lccode=0x443, linebreak="al", - unicodeslot=0x0423, + unicodeslot=0x423, }, - [0x0424]={ + [0x424]={ adobename="afii10038", category="lu", cjkwd="a", contextname="cyrillicF", description="CYRILLIC CAPITAL LETTER EF", direction="l", - lccode=0x0444, + lccode=0x444, linebreak="al", - unicodeslot=0x0424, + unicodeslot=0x424, }, - [0x0425]={ + [0x425]={ adobename="afii10039", category="lu", cjkwd="a", contextname="cyrillicH", description="CYRILLIC CAPITAL LETTER HA", direction="l", - lccode=0x0445, + lccode=0x445, linebreak="al", - unicodeslot=0x0425, + unicodeslot=0x425, }, - [0x0426]={ + [0x426]={ adobename="afii10040", category="lu", cjkwd="a", contextname="cyrillicC", description="CYRILLIC CAPITAL LETTER TSE", direction="l", - lccode=0x0446, + lccode=0x446, linebreak="al", - unicodeslot=0x0426, + unicodeslot=0x426, }, - [0x0427]={ + [0x427]={ adobename="afii10041", category="lu", cjkwd="a", contextname="cyrillicCH", description="CYRILLIC CAPITAL LETTER CHE", direction="l", - lccode=0x0447, + lccode=0x447, linebreak="al", - unicodeslot=0x0427, + unicodeslot=0x427, }, - [0x0428]={ + [0x428]={ adobename="afii10042", category="lu", cjkwd="a", contextname="cyrillicSH", description="CYRILLIC CAPITAL LETTER SHA", direction="l", - lccode=0x0448, + lccode=0x448, linebreak="al", - unicodeslot=0x0428, + unicodeslot=0x428, }, - [0x0429]={ + [0x429]={ adobename="afii10043", category="lu", cjkwd="a", contextname="cyrillicSHCH", description="CYRILLIC CAPITAL LETTER SHCHA", direction="l", - lccode=0x0449, + lccode=0x449, linebreak="al", - unicodeslot=0x0429, + unicodeslot=0x429, }, - [0x042A]={ + [0x42A]={ adobename="afii10044", category="lu", cjkwd="a", contextname="cyrillicHRDSN", description="CYRILLIC CAPITAL LETTER HARD SIGN", direction="l", - lccode=0x044A, + lccode=0x44A, linebreak="al", - unicodeslot=0x042A, + unicodeslot=0x42A, }, - [0x042B]={ + [0x42B]={ adobename="afii10045", category="lu", cjkwd="a", contextname="cyrillicERY", description="CYRILLIC CAPITAL LETTER YERU", direction="l", - lccode=0x044B, + lccode=0x44B, linebreak="al", - unicodeslot=0x042B, + unicodeslot=0x42B, }, - [0x042C]={ + [0x42C]={ adobename="afii10046", category="lu", cjkwd="a", contextname="cyrillicSFTSN", description="CYRILLIC CAPITAL LETTER SOFT SIGN", direction="l", - lccode=0x044C, + lccode=0x44C, linebreak="al", - unicodeslot=0x042C, + unicodeslot=0x42C, }, - [0x042D]={ + [0x42D]={ adobename="afii10047", category="lu", cjkwd="a", contextname="cyrillicEREV", description="CYRILLIC CAPITAL LETTER E", direction="l", - lccode=0x044D, + lccode=0x44D, linebreak="al", - unicodeslot=0x042D, + unicodeslot=0x42D, }, - [0x042E]={ + [0x42E]={ adobename="afii10048", category="lu", cjkwd="a", contextname="cyrillicYU", description="CYRILLIC CAPITAL LETTER YU", direction="l", - lccode=0x044E, + lccode=0x44E, linebreak="al", - unicodeslot=0x042E, + unicodeslot=0x42E, }, - [0x042F]={ + [0x42F]={ adobename="afii10049", category="lu", cjkwd="a", contextname="cyrillicYA", description="CYRILLIC CAPITAL LETTER YA", direction="l", - lccode=0x044F, + lccode=0x44F, linebreak="al", - unicodeslot=0x042F, + unicodeslot=0x42F, }, - [0x0430]={ + [0x430]={ adobename="afii10065", category="ll", cjkwd="a", @@ -10986,10 +11114,10 @@ characters.data={ description="CYRILLIC SMALL LETTER A", direction="l", linebreak="al", - uccode=0x0410, - unicodeslot=0x0430, + uccode=0x410, + unicodeslot=0x430, }, - [0x0431]={ + [0x431]={ adobename="becyrillic", category="ll", cjkwd="a", @@ -10997,10 +11125,10 @@ characters.data={ description="CYRILLIC SMALL LETTER BE", direction="l", linebreak="al", - uccode=0x0411, - unicodeslot=0x0431, + uccode=0x411, + unicodeslot=0x431, }, - [0x0432]={ + [0x432]={ adobename="vecyrillic", category="ll", cjkwd="a", @@ -11008,10 +11136,10 @@ characters.data={ description="CYRILLIC SMALL LETTER VE", direction="l", linebreak="al", - uccode=0x0412, - unicodeslot=0x0432, + uccode=0x412, + unicodeslot=0x432, }, - [0x0433]={ + [0x433]={ adobename="gecyrillic", category="ll", cjkwd="a", @@ -11019,10 +11147,10 @@ characters.data={ description="CYRILLIC SMALL LETTER GHE", direction="l", linebreak="al", - uccode=0x0413, - unicodeslot=0x0433, + uccode=0x413, + unicodeslot=0x433, }, - [0x0434]={ + [0x434]={ adobename="decyrillic", category="ll", cjkwd="a", @@ -11030,10 +11158,10 @@ characters.data={ description="CYRILLIC SMALL LETTER DE", direction="l", linebreak="al", - uccode=0x0414, - unicodeslot=0x0434, + uccode=0x414, + unicodeslot=0x434, }, - [0x0435]={ + [0x435]={ adobename="iecyrillic", category="ll", cjkwd="a", @@ -11041,10 +11169,10 @@ characters.data={ description="CYRILLIC SMALL LETTER IE", direction="l", linebreak="al", - uccode=0x0415, - unicodeslot=0x0435, + uccode=0x415, + unicodeslot=0x435, }, - [0x0436]={ + [0x436]={ adobename="zhecyrillic", category="ll", cjkwd="a", @@ -11052,10 +11180,10 @@ characters.data={ description="CYRILLIC SMALL LETTER ZHE", direction="l", linebreak="al", - uccode=0x0416, - unicodeslot=0x0436, + uccode=0x416, + unicodeslot=0x436, }, - [0x0437]={ + [0x437]={ adobename="zecyrillic", category="ll", cjkwd="a", @@ -11063,10 +11191,10 @@ characters.data={ description="CYRILLIC SMALL LETTER ZE", direction="l", linebreak="al", - uccode=0x0417, - unicodeslot=0x0437, + uccode=0x417, + unicodeslot=0x437, }, - [0x0438]={ + [0x438]={ adobename="iicyrillic", category="ll", cjkwd="a", @@ -11074,10 +11202,10 @@ characters.data={ description="CYRILLIC SMALL LETTER I", direction="l", linebreak="al", - uccode=0x0418, - unicodeslot=0x0438, + uccode=0x418, + unicodeslot=0x438, }, - [0x0439]={ + [0x439]={ adobename="iishortcyrillic", category="ll", cjkwd="a", @@ -11085,11 +11213,11 @@ characters.data={ description="CYRILLIC SMALL LETTER SHORT I", direction="l", linebreak="al", - specials={ "char", 0x0438, 0x0306 }, - uccode=0x0419, - unicodeslot=0x0439, + specials={ "char", 0x438, 0x306 }, + uccode=0x419, + unicodeslot=0x439, }, - [0x043A]={ + [0x43A]={ adobename="kacyrillic", category="ll", cjkwd="a", @@ -11097,10 +11225,10 @@ characters.data={ description="CYRILLIC SMALL LETTER KA", direction="l", linebreak="al", - uccode=0x041A, - unicodeslot=0x043A, + uccode=0x41A, + unicodeslot=0x43A, }, - [0x043B]={ + [0x43B]={ adobename="elcyrillic", category="ll", cjkwd="a", @@ -11108,10 +11236,10 @@ characters.data={ description="CYRILLIC SMALL LETTER EL", direction="l", linebreak="al", - uccode=0x041B, - unicodeslot=0x043B, + uccode=0x41B, + unicodeslot=0x43B, }, - [0x043C]={ + [0x43C]={ adobename="emcyrillic", category="ll", cjkwd="a", @@ -11119,10 +11247,10 @@ characters.data={ description="CYRILLIC SMALL LETTER EM", direction="l", linebreak="al", - uccode=0x041C, - unicodeslot=0x043C, + uccode=0x41C, + unicodeslot=0x43C, }, - [0x043D]={ + [0x43D]={ adobename="encyrillic", category="ll", cjkwd="a", @@ -11130,10 +11258,10 @@ characters.data={ description="CYRILLIC SMALL LETTER EN", direction="l", linebreak="al", - uccode=0x041D, - unicodeslot=0x043D, + uccode=0x41D, + unicodeslot=0x43D, }, - [0x043E]={ + [0x43E]={ adobename="ocyrillic", category="ll", cjkwd="a", @@ -11141,10 +11269,10 @@ characters.data={ description="CYRILLIC SMALL LETTER O", direction="l", linebreak="al", - uccode=0x041E, - unicodeslot=0x043E, + uccode=0x41E, + unicodeslot=0x43E, }, - [0x043F]={ + [0x43F]={ adobename="pecyrillic", category="ll", cjkwd="a", @@ -11152,10 +11280,10 @@ characters.data={ description="CYRILLIC SMALL LETTER PE", direction="l", linebreak="al", - uccode=0x041F, - unicodeslot=0x043F, + uccode=0x41F, + unicodeslot=0x43F, }, - [0x0440]={ + [0x440]={ adobename="ercyrillic", category="ll", cjkwd="a", @@ -11163,10 +11291,10 @@ characters.data={ description="CYRILLIC SMALL LETTER ER", direction="l", linebreak="al", - uccode=0x0420, - unicodeslot=0x0440, + uccode=0x420, + unicodeslot=0x440, }, - [0x0441]={ + [0x441]={ adobename="escyrillic", category="ll", cjkwd="a", @@ -11174,10 +11302,10 @@ characters.data={ description="CYRILLIC SMALL LETTER ES", direction="l", linebreak="al", - uccode=0x0421, - unicodeslot=0x0441, + uccode=0x421, + unicodeslot=0x441, }, - [0x0442]={ + [0x442]={ adobename="tecyrillic", category="ll", cjkwd="a", @@ -11185,10 +11313,10 @@ characters.data={ description="CYRILLIC SMALL LETTER TE", direction="l", linebreak="al", - uccode=0x0422, - unicodeslot=0x0442, + uccode=0x422, + unicodeslot=0x442, }, - [0x0443]={ + [0x443]={ adobename="ucyrillic", category="ll", cjkwd="a", @@ -11196,10 +11324,10 @@ characters.data={ description="CYRILLIC SMALL LETTER U", direction="l", linebreak="al", - uccode=0x0423, - unicodeslot=0x0443, + uccode=0x423, + unicodeslot=0x443, }, - [0x0444]={ + [0x444]={ adobename="efcyrillic", category="ll", cjkwd="a", @@ -11207,10 +11335,10 @@ characters.data={ description="CYRILLIC SMALL LETTER EF", direction="l", linebreak="al", - uccode=0x0424, - unicodeslot=0x0444, + uccode=0x424, + unicodeslot=0x444, }, - [0x0445]={ + [0x445]={ adobename="khacyrillic", category="ll", cjkwd="a", @@ -11218,10 +11346,10 @@ characters.data={ description="CYRILLIC SMALL LETTER HA", direction="l", linebreak="al", - uccode=0x0425, - unicodeslot=0x0445, + uccode=0x425, + unicodeslot=0x445, }, - [0x0446]={ + [0x446]={ adobename="tsecyrillic", category="ll", cjkwd="a", @@ -11229,10 +11357,10 @@ characters.data={ description="CYRILLIC SMALL LETTER TSE", direction="l", linebreak="al", - uccode=0x0426, - unicodeslot=0x0446, + uccode=0x426, + unicodeslot=0x446, }, - [0x0447]={ + [0x447]={ adobename="checyrillic", category="ll", cjkwd="a", @@ -11240,10 +11368,10 @@ characters.data={ description="CYRILLIC SMALL LETTER CHE", direction="l", linebreak="al", - uccode=0x0427, - unicodeslot=0x0447, + uccode=0x427, + unicodeslot=0x447, }, - [0x0448]={ + [0x448]={ adobename="shacyrillic", category="ll", cjkwd="a", @@ -11251,10 +11379,10 @@ characters.data={ description="CYRILLIC SMALL LETTER SHA", direction="l", linebreak="al", - uccode=0x0428, - unicodeslot=0x0448, + uccode=0x428, + unicodeslot=0x448, }, - [0x0449]={ + [0x449]={ adobename="shchacyrillic", category="ll", cjkwd="a", @@ -11262,10 +11390,10 @@ characters.data={ description="CYRILLIC SMALL LETTER SHCHA", direction="l", linebreak="al", - uccode=0x0429, - unicodeslot=0x0449, + uccode=0x429, + unicodeslot=0x449, }, - [0x044A]={ + [0x44A]={ adobename="hardsigncyrillic", category="ll", cjkwd="a", @@ -11273,10 +11401,10 @@ characters.data={ description="CYRILLIC SMALL LETTER HARD SIGN", direction="l", linebreak="al", - uccode=0x042A, - unicodeslot=0x044A, + uccode=0x42A, + unicodeslot=0x44A, }, - [0x044B]={ + [0x44B]={ adobename="yericyrillic", category="ll", cjkwd="a", @@ -11284,10 +11412,10 @@ characters.data={ description="CYRILLIC SMALL LETTER YERU", direction="l", linebreak="al", - uccode=0x042B, - unicodeslot=0x044B, + uccode=0x42B, + unicodeslot=0x44B, }, - [0x044C]={ + [0x44C]={ adobename="softsigncyrillic", category="ll", cjkwd="a", @@ -11295,10 +11423,10 @@ characters.data={ description="CYRILLIC SMALL LETTER SOFT SIGN", direction="l", linebreak="al", - uccode=0x042C, - unicodeslot=0x044C, + uccode=0x42C, + unicodeslot=0x44C, }, - [0x044D]={ + [0x44D]={ adobename="ereversedcyrillic", category="ll", cjkwd="a", @@ -11306,10 +11434,10 @@ characters.data={ description="CYRILLIC SMALL LETTER E", direction="l", linebreak="al", - uccode=0x042D, - unicodeslot=0x044D, + uccode=0x42D, + unicodeslot=0x44D, }, - [0x044E]={ + [0x44E]={ adobename="iucyrillic", category="ll", cjkwd="a", @@ -11317,10 +11445,10 @@ characters.data={ description="CYRILLIC SMALL LETTER YU", direction="l", linebreak="al", - uccode=0x042E, - unicodeslot=0x044E, + uccode=0x42E, + unicodeslot=0x44E, }, - [0x044F]={ + [0x44F]={ adobename="iacyrillic", category="ll", cjkwd="a", @@ -11328,21 +11456,21 @@ characters.data={ description="CYRILLIC SMALL LETTER YA", direction="l", linebreak="al", - uccode=0x042F, - unicodeslot=0x044F, + uccode=0x42F, + unicodeslot=0x44F, }, - [0x0450]={ + [0x450]={ category="ll", contextname="cyrillicegrave", description="CYRILLIC SMALL LETTER IE WITH GRAVE", direction="l", linebreak="al", - shcode=0x0435, - specials={ "char", 0x0435, 0x0300 }, - uccode=0x0400, - unicodeslot=0x0450, + shcode=0x435, + specials={ "char", 0x435, 0x300 }, + uccode=0x400, + unicodeslot=0x450, }, - [0x0451]={ + [0x451]={ adobename="iocyrillic", category="ll", cjkwd="a", @@ -11350,17808 +11478,18319 @@ characters.data={ description="CYRILLIC SMALL LETTER IO", direction="l", linebreak="al", - specials={ "char", 0x0435, 0x0308 }, - uccode=0x0401, - unicodeslot=0x0451, + specials={ "char", 0x435, 0x308 }, + uccode=0x401, + unicodeslot=0x451, }, - [0x0452]={ + [0x452]={ adobename="djecyrillic", category="ll", contextname="cyrillicdje", description="CYRILLIC SMALL LETTER DJE", direction="l", linebreak="al", - uccode=0x0402, - unicodeslot=0x0452, + uccode=0x402, + unicodeslot=0x452, }, - [0x0453]={ + [0x453]={ adobename="gjecyrillic", category="ll", contextname="cyrillicgje", description="CYRILLIC SMALL LETTER GJE", direction="l", linebreak="al", - specials={ "char", 0x0433, 0x0301 }, - uccode=0x0403, - unicodeslot=0x0453, + specials={ "char", 0x433, 0x301 }, + uccode=0x403, + unicodeslot=0x453, }, - [0x0454]={ + [0x454]={ adobename="ecyrillic", category="ll", contextname="cyrillicie", description="CYRILLIC SMALL LETTER UKRAINIAN IE", direction="l", linebreak="al", - uccode=0x0404, - unicodeslot=0x0454, + uccode=0x404, + unicodeslot=0x454, }, - [0x0455]={ + [0x455]={ adobename="dzecyrillic", category="ll", contextname="cyrillicdze", description="CYRILLIC SMALL LETTER DZE", direction="l", linebreak="al", - uccode=0x0405, - unicodeslot=0x0455, + uccode=0x405, + unicodeslot=0x455, }, - [0x0456]={ + [0x456]={ adobename="icyrillic", category="ll", contextname="cyrillicii", description="CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I", direction="l", linebreak="al", - uccode=0x0406, - unicodeslot=0x0456, + uccode=0x406, + unicodeslot=0x456, }, - [0x0457]={ + [0x457]={ adobename="yicyrillic", category="ll", contextname="cyrillicyi", description="CYRILLIC SMALL LETTER YI", direction="l", linebreak="al", - specials={ "char", 0x0456, 0x0308 }, - uccode=0x0407, - unicodeslot=0x0457, + specials={ "char", 0x456, 0x308 }, + uccode=0x407, + unicodeslot=0x457, }, - [0x0458]={ + [0x458]={ adobename="jecyrillic", category="ll", contextname="cyrillicje", description="CYRILLIC SMALL LETTER JE", direction="l", linebreak="al", - uccode=0x0408, - unicodeslot=0x0458, + uccode=0x408, + unicodeslot=0x458, }, - [0x0459]={ + [0x459]={ adobename="ljecyrillic", category="ll", contextname="cyrilliclje", description="CYRILLIC SMALL LETTER LJE", direction="l", linebreak="al", - uccode=0x0409, - unicodeslot=0x0459, + uccode=0x409, + unicodeslot=0x459, }, - [0x045A]={ + [0x45A]={ adobename="njecyrillic", category="ll", contextname="cyrillicnje", description="CYRILLIC SMALL LETTER NJE", direction="l", linebreak="al", - uccode=0x040A, - unicodeslot=0x045A, + uccode=0x40A, + unicodeslot=0x45A, }, - [0x045B]={ + [0x45B]={ adobename="tshecyrillic", category="ll", contextname="cyrillictshe", description="CYRILLIC SMALL LETTER TSHE", direction="l", linebreak="al", - uccode=0x040B, - unicodeslot=0x045B, + uccode=0x40B, + unicodeslot=0x45B, }, - [0x045C]={ + [0x45C]={ adobename="kjecyrillic", category="ll", contextname="cyrillickje", description="CYRILLIC SMALL LETTER KJE", direction="l", linebreak="al", - specials={ "char", 0x043A, 0x0301 }, - uccode=0x040C, - unicodeslot=0x045C, + specials={ "char", 0x43A, 0x301 }, + uccode=0x40C, + unicodeslot=0x45C, }, - [0x045D]={ + [0x45D]={ category="ll", contextname="cyrillicigrave", description="CYRILLIC SMALL LETTER I WITH GRAVE", direction="l", linebreak="al", - shcode=0x0438, - specials={ "char", 0x0438, 0x0300 }, - uccode=0x040D, - unicodeslot=0x045D, + shcode=0x438, + specials={ "char", 0x438, 0x300 }, + uccode=0x40D, + unicodeslot=0x45D, }, - [0x045E]={ + [0x45E]={ adobename="ushortcyrillic", category="ll", contextname="cyrillicushrt", description="CYRILLIC SMALL LETTER SHORT U", direction="l", linebreak="al", - specials={ "char", 0x0443, 0x0306 }, - uccode=0x040E, - unicodeslot=0x045E, + specials={ "char", 0x443, 0x306 }, + uccode=0x40E, + unicodeslot=0x45E, }, - [0x045F]={ + [0x45F]={ adobename="dzhecyrillic", category="ll", contextname="cyrillicdzhe", description="CYRILLIC SMALL LETTER DZHE", direction="l", linebreak="al", - uccode=0x040F, - unicodeslot=0x045F, + uccode=0x40F, + unicodeslot=0x45F, }, - [0x0460]={ + [0x460]={ adobename="Omegacyrillic", category="lu", contextname="cyrillicOMEGA", description="CYRILLIC CAPITAL LETTER OMEGA", direction="l", - lccode=0x0461, + lccode=0x461, linebreak="al", - unicodeslot=0x0460, + unicodeslot=0x460, }, - [0x0461]={ + [0x461]={ adobename="omegacyrillic", category="ll", contextname="cyrillicomega", description="CYRILLIC SMALL LETTER OMEGA", direction="l", linebreak="al", - uccode=0x0460, - unicodeslot=0x0461, + uccode=0x460, + unicodeslot=0x461, }, - [0x0462]={ + [0x462]={ adobename="afii10146", category="lu", contextname="cyrillicYAT", description="CYRILLIC CAPITAL LETTER YAT", direction="l", - lccode=0x0463, + lccode=0x463, linebreak="al", - unicodeslot=0x0462, + unicodeslot=0x462, }, - [0x0463]={ + [0x463]={ adobename="yatcyrillic", category="ll", contextname="cyrillicyat", description="CYRILLIC SMALL LETTER YAT", direction="l", linebreak="al", - uccode=0x0462, - unicodeslot=0x0463, + uccode=0x462, + unicodeslot=0x463, }, - [0x0464]={ + [0x464]={ adobename="Eiotifiedcyrillic", category="lu", contextname="cyrillicEiotified", description="CYRILLIC CAPITAL LETTER IOTIFIED E", direction="l", - lccode=0x0465, + lccode=0x465, linebreak="al", - unicodeslot=0x0464, + unicodeslot=0x464, }, - [0x0465]={ + [0x465]={ adobename="eiotifiedcyrillic", category="ll", contextname="cyrilliceiotified", description="CYRILLIC SMALL LETTER IOTIFIED E", direction="l", linebreak="al", - uccode=0x0464, - unicodeslot=0x0465, + uccode=0x464, + unicodeslot=0x465, }, - [0x0466]={ + [0x466]={ adobename="Yuslittlecyrillic", category="lu", contextname="cyrillicLITTLEYUS", description="CYRILLIC CAPITAL LETTER LITTLE YUS", direction="l", - lccode=0x0467, + lccode=0x467, linebreak="al", - unicodeslot=0x0466, + unicodeslot=0x466, }, - [0x0467]={ + [0x467]={ adobename="yuslittlecyrillic", category="ll", contextname="cyrilliclittleyus", description="CYRILLIC SMALL LETTER LITTLE YUS", direction="l", linebreak="al", - uccode=0x0466, - unicodeslot=0x0467, + uccode=0x466, + unicodeslot=0x467, }, - [0x0468]={ + [0x468]={ adobename="Yuslittleiotifiedcyrillic", category="lu", contextname="cyrillicLITTLEYUSiotified", description="CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS", direction="l", - lccode=0x0469, + lccode=0x469, linebreak="al", - unicodeslot=0x0468, + unicodeslot=0x468, }, - [0x0469]={ + [0x469]={ adobename="yuslittleiotifiedcyrillic", category="ll", contextname="cyrilliclittleyusiotified", description="CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS", direction="l", linebreak="al", - uccode=0x0468, - unicodeslot=0x0469, + uccode=0x468, + unicodeslot=0x469, }, - [0x046A]={ + [0x46A]={ adobename="Yusbigcyrillic", category="lu", contextname="cyrillicBIGYUS", description="CYRILLIC CAPITAL LETTER BIG YUS", direction="l", - lccode=0x046B, + lccode=0x46B, linebreak="al", - unicodeslot=0x046A, + unicodeslot=0x46A, }, - [0x046B]={ + [0x46B]={ adobename="yusbigcyrillic", category="ll", contextname="cyrillicbigyus", description="CYRILLIC SMALL LETTER BIG YUS", direction="l", linebreak="al", - uccode=0x046A, - unicodeslot=0x046B, + uccode=0x46A, + unicodeslot=0x46B, }, - [0x046C]={ + [0x46C]={ adobename="Yusbigiotifiedcyrillic", category="lu", contextname="cyrillicBIGYUSiotified", description="CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS", direction="l", - lccode=0x046D, + lccode=0x46D, linebreak="al", - unicodeslot=0x046C, + unicodeslot=0x46C, }, - [0x046D]={ + [0x46D]={ adobename="yusbigiotifiedcyrillic", category="ll", contextname="cyrillicbigyusiotified", description="CYRILLIC SMALL LETTER IOTIFIED BIG YUS", direction="l", linebreak="al", - uccode=0x046C, - unicodeslot=0x046D, + uccode=0x46C, + unicodeslot=0x46D, }, - [0x046E]={ + [0x46E]={ adobename="Ksicyrillic", category="lu", contextname="cyrillicKSI", description="CYRILLIC CAPITAL LETTER KSI", direction="l", - lccode=0x046F, + lccode=0x46F, linebreak="al", - unicodeslot=0x046E, + unicodeslot=0x46E, }, - [0x046F]={ + [0x46F]={ adobename="ksicyrillic", category="ll", contextname="cyrillicksi", description="CYRILLIC SMALL LETTER KSI", direction="l", linebreak="al", - uccode=0x046E, - unicodeslot=0x046F, + uccode=0x46E, + unicodeslot=0x46F, }, - [0x0470]={ + [0x470]={ adobename="Psicyrillic", category="lu", contextname="cyrillicPSI", description="CYRILLIC CAPITAL LETTER PSI", direction="l", - lccode=0x0471, + lccode=0x471, linebreak="al", - unicodeslot=0x0470, + unicodeslot=0x470, }, - [0x0471]={ + [0x471]={ adobename="psicyrillic", category="ll", contextname="cyrillicpsi", description="CYRILLIC SMALL LETTER PSI", direction="l", linebreak="al", - uccode=0x0470, - unicodeslot=0x0471, + uccode=0x470, + unicodeslot=0x471, }, - [0x0472]={ + [0x472]={ adobename="afii10147", category="lu", contextname="cyrillicFITA", description="CYRILLIC CAPITAL LETTER FITA", direction="l", - lccode=0x0473, + lccode=0x473, linebreak="al", - unicodeslot=0x0472, + unicodeslot=0x472, }, - [0x0473]={ + [0x473]={ adobename="fitacyrillic", category="ll", contextname="cyrillicfita", description="CYRILLIC SMALL LETTER FITA", direction="l", linebreak="al", - uccode=0x0472, - unicodeslot=0x0473, + uccode=0x472, + unicodeslot=0x473, }, - [0x0474]={ + [0x474]={ adobename="afii10148", category="lu", contextname="cyrillicIZHITSA", description="CYRILLIC CAPITAL LETTER IZHITSA", direction="l", - lccode=0x0475, + lccode=0x475, linebreak="al", - unicodeslot=0x0474, + unicodeslot=0x474, }, - [0x0475]={ + [0x475]={ adobename="izhitsacyrillic", category="ll", contextname="cyrillicizhitsa", description="CYRILLIC SMALL LETTER IZHITSA", direction="l", linebreak="al", - uccode=0x0474, - unicodeslot=0x0475, + uccode=0x474, + unicodeslot=0x475, }, - [0x0476]={ + [0x476]={ adobename="Izhitsadblgravecyrillic", category="lu", contextname="cyrillicIZHITSAdoublegrave", description="CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", direction="l", - lccode=0x0477, + lccode=0x477, linebreak="al", - shcode=0x0474, - specials={ "char", 0x0474, 0x030F }, - unicodeslot=0x0476, + shcode=0x474, + specials={ "char", 0x474, 0x30F }, + unicodeslot=0x476, }, - [0x0477]={ + [0x477]={ adobename="izhitsadblgravecyrillic", category="ll", contextname="cyrillicizhitsadoublegrave", description="CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", direction="l", linebreak="al", - shcode=0x0475, - specials={ "char", 0x0475, 0x030F }, - uccode=0x0476, - unicodeslot=0x0477, + shcode=0x475, + specials={ "char", 0x475, 0x30F }, + uccode=0x476, + unicodeslot=0x477, }, - [0x0478]={ + [0x478]={ adobename="Ukcyrillic", category="lu", contextname="cyrillicUK", description="CYRILLIC CAPITAL LETTER UK", direction="l", - lccode=0x0479, + lccode=0x479, linebreak="al", - unicodeslot=0x0478, + unicodeslot=0x478, }, - [0x0479]={ + [0x479]={ adobename="ukcyrillic", category="ll", contextname="cyrillicuk", description="CYRILLIC SMALL LETTER UK", direction="l", linebreak="al", - uccode=0x0478, - unicodeslot=0x0479, + uccode=0x478, + unicodeslot=0x479, }, - [0x047A]={ + [0x47A]={ adobename="Omegaroundcyrillic", category="lu", contextname="cyrillicOMEGAround", description="CYRILLIC CAPITAL LETTER ROUND OMEGA", direction="l", - lccode=0x047B, + lccode=0x47B, linebreak="al", - unicodeslot=0x047A, + unicodeslot=0x47A, }, - [0x047B]={ + [0x47B]={ adobename="omegaroundcyrillic", category="ll", contextname="cyrillicomegaround", description="CYRILLIC SMALL LETTER ROUND OMEGA", direction="l", linebreak="al", - uccode=0x047A, - unicodeslot=0x047B, + uccode=0x47A, + unicodeslot=0x47B, }, - [0x047C]={ + [0x47C]={ adobename="Omegatitlocyrillic", category="lu", contextname="cyrillicOMEGAtitlo", description="CYRILLIC CAPITAL LETTER OMEGA WITH TITLO", direction="l", - lccode=0x047D, + lccode=0x47D, linebreak="al", - shcode=0x0460, - unicodeslot=0x047C, + shcode=0x460, + unicodeslot=0x47C, }, - [0x047D]={ + [0x47D]={ adobename="omegatitlocyrillic", category="ll", contextname="cyrillicomegatitlo", description="CYRILLIC SMALL LETTER OMEGA WITH TITLO", direction="l", linebreak="al", - shcode=0x0461, - uccode=0x047C, - unicodeslot=0x047D, + shcode=0x461, + uccode=0x47C, + unicodeslot=0x47D, }, - [0x047E]={ + [0x47E]={ adobename="Otcyrillic", category="lu", contextname="cyrillicOT", description="CYRILLIC CAPITAL LETTER OT", direction="l", - lccode=0x047F, + lccode=0x47F, linebreak="al", - unicodeslot=0x047E, + unicodeslot=0x47E, }, - [0x047F]={ + [0x47F]={ adobename="otcyrillic", category="ll", contextname="cyrillicot", description="CYRILLIC SMALL LETTER OT", direction="l", linebreak="al", - uccode=0x047E, - unicodeslot=0x047F, + uccode=0x47E, + unicodeslot=0x47F, }, - [0x0480]={ + [0x480]={ adobename="Koppacyrillic", category="lu", contextname="cyrillicKOPPA", description="CYRILLIC CAPITAL LETTER KOPPA", direction="l", - lccode=0x0481, + lccode=0x481, linebreak="al", - unicodeslot=0x0480, + unicodeslot=0x480, }, - [0x0481]={ + [0x481]={ adobename="koppacyrillic", category="ll", contextname="cyrillickoppa", description="CYRILLIC SMALL LETTER KOPPA", direction="l", linebreak="al", - uccode=0x0480, - unicodeslot=0x0481, + uccode=0x480, + unicodeslot=0x481, }, - [0x0482]={ + [0x482]={ adobename="thousandcyrillic", category="so", description="CYRILLIC THOUSANDS SIGN", direction="l", linebreak="al", - unicodeslot=0x0482, + unicodeslot=0x482, }, - [0x0483]={ + [0x483]={ adobename="titlocyrilliccmb", category="mn", + combining=0xE6, contextname="cyrillicTITLO", description="COMBINING CYRILLIC TITLO", direction="nsm", linebreak="cm", - unicodeslot=0x0483, + unicodeslot=0x483, }, - [0x0484]={ + [0x484]={ adobename="palatalizationcyrilliccmb", category="mn", + combining=0xE6, contextname="cyrillicPALATALIZATION", description="COMBINING CYRILLIC PALATALIZATION", direction="nsm", linebreak="cm", - unicodeslot=0x0484, + unicodeslot=0x484, }, - [0x0485]={ + [0x485]={ adobename="dasiapneumatacyrilliccmb", category="mn", + combining=0xE6, contextname="cyrillicDASIAPNEUMATA", description="COMBINING CYRILLIC DASIA PNEUMATA", direction="nsm", linebreak="cm", - unicodeslot=0x0485, + unicodeslot=0x485, }, - [0x0486]={ + [0x486]={ adobename="psilipneumatacyrilliccmb", category="mn", + combining=0xE6, contextname="cyrillicPSILIPNEUMATA", description="COMBINING CYRILLIC PSILI PNEUMATA", direction="nsm", linebreak="cm", - unicodeslot=0x0486, + unicodeslot=0x486, }, - [0x0487]={ + [0x487]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC POKRYTIE", direction="nsm", linebreak="cm", - unicodeslot=0x0487, + unicodeslot=0x487, }, - [0x0488]={ + [0x488]={ category="me", description="COMBINING CYRILLIC HUNDRED THOUSANDS SIGN", direction="nsm", linebreak="cm", - unicodeslot=0x0488, + unicodeslot=0x488, }, - [0x0489]={ + [0x489]={ category="me", description="COMBINING CYRILLIC MILLIONS SIGN", direction="nsm", linebreak="cm", - unicodeslot=0x0489, + unicodeslot=0x489, }, - [0x048A]={ + [0x48A]={ category="lu", contextname="cyrillicISHRTtail", description="CYRILLIC CAPITAL LETTER SHORT I WITH TAIL", direction="l", - lccode=0x048B, + lccode=0x48B, linebreak="al", - unicodeslot=0x048A, + unicodeslot=0x48A, }, - [0x048B]={ + [0x48B]={ category="ll", contextname="cyrillicishrttail", description="CYRILLIC SMALL LETTER SHORT I WITH TAIL", direction="l", linebreak="al", - uccode=0x048A, - unicodeslot=0x048B, + uccode=0x48A, + unicodeslot=0x48B, }, - [0x048C]={ + [0x48C]={ category="lu", contextname="cyrillicSEMISOFT", description="CYRILLIC CAPITAL LETTER SEMISOFT SIGN", direction="l", - lccode=0x048D, + lccode=0x48D, linebreak="al", - unicodeslot=0x048C, + unicodeslot=0x48C, }, - [0x048D]={ + [0x48D]={ category="ll", contextname="cyrillicsemisoft", description="CYRILLIC SMALL LETTER SEMISOFT SIGN", direction="l", linebreak="al", - uccode=0x048C, - unicodeslot=0x048D, + uccode=0x48C, + unicodeslot=0x48D, }, - [0x048E]={ + [0x48E]={ category="lu", contextname="cyrillicERtick", description="CYRILLIC CAPITAL LETTER ER WITH TICK", direction="l", - lccode=0x048F, + lccode=0x48F, linebreak="al", - shcode=0x0420, - unicodeslot=0x048E, + shcode=0x420, + unicodeslot=0x48E, }, - [0x048F]={ + [0x48F]={ category="ll", contextname="cyrillicertick", description="CYRILLIC SMALL LETTER ER WITH TICK", direction="l", linebreak="al", - shcode=0x0440, - uccode=0x048E, - unicodeslot=0x048F, + shcode=0x440, + uccode=0x48E, + unicodeslot=0x48F, }, - [0x0490]={ + [0x490]={ adobename="afii10050", category="lu", contextname="cyrillicGHEupturn", description="CYRILLIC CAPITAL LETTER GHE WITH UPTURN", direction="l", - lccode=0x0491, + lccode=0x491, linebreak="al", - shcode=0x0413, - unicodeslot=0x0490, + shcode=0x413, + unicodeslot=0x490, }, - [0x0491]={ + [0x491]={ adobename="gheupturncyrillic", category="ll", contextname="cyrillicgheupturn", description="CYRILLIC SMALL LETTER GHE WITH UPTURN", direction="l", linebreak="al", - shcode=0x0433, - uccode=0x0490, - unicodeslot=0x0491, + shcode=0x433, + uccode=0x490, + unicodeslot=0x491, }, - [0x0492]={ + [0x492]={ adobename="Ghestrokecyrillic", category="lu", contextname="cyrillicGHEstroke", description="CYRILLIC CAPITAL LETTER GHE WITH STROKE", direction="l", - lccode=0x0493, + lccode=0x493, linebreak="al", - shcode=0x0413, - unicodeslot=0x0492, + shcode=0x413, + unicodeslot=0x492, }, - [0x0493]={ + [0x493]={ adobename="ghestrokecyrillic", category="ll", contextname="cyrillicghestroke", description="CYRILLIC SMALL LETTER GHE WITH STROKE", direction="l", linebreak="al", - shcode=0x0433, - uccode=0x0492, - unicodeslot=0x0493, + shcode=0x433, + uccode=0x492, + unicodeslot=0x493, }, - [0x0494]={ + [0x494]={ adobename="Ghemiddlehookcyrillic", category="lu", contextname="cyrillicGHEmidhook", description="CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK", direction="l", - lccode=0x0495, + lccode=0x495, linebreak="al", - shcode=0x0413, - unicodeslot=0x0494, + shcode=0x413, + unicodeslot=0x494, }, - [0x0495]={ + [0x495]={ adobename="ghemiddlehookcyrillic", category="ll", contextname="cyrillicghemidhook", description="CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK", direction="l", linebreak="al", - shcode=0x0433, - uccode=0x0494, - unicodeslot=0x0495, + shcode=0x433, + uccode=0x494, + unicodeslot=0x495, }, - [0x0496]={ + [0x496]={ adobename="Zhedescendercyrillic", category="lu", contextname="cyrillicZHEdescender", description="CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER", direction="l", - lccode=0x0497, + lccode=0x497, linebreak="al", - shcode=0x0416, - unicodeslot=0x0496, + shcode=0x416, + unicodeslot=0x496, }, - [0x0497]={ + [0x497]={ adobename="zhedescendercyrillic", category="ll", contextname="cyrilliczhedescender", description="CYRILLIC SMALL LETTER ZHE WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0436, - uccode=0x0496, - unicodeslot=0x0497, + shcode=0x436, + uccode=0x496, + unicodeslot=0x497, }, - [0x0498]={ + [0x498]={ adobename="Zedescendercyrillic", category="lu", contextname="cyrillicZDSC", description="CYRILLIC CAPITAL LETTER ZE WITH DESCENDER", direction="l", - lccode=0x0499, + lccode=0x499, linebreak="al", - shcode=0x0417, - unicodeslot=0x0498, + shcode=0x417, + unicodeslot=0x498, }, - [0x0499]={ + [0x499]={ adobename="zedescendercyrillic", category="ll", contextname="cyrilliczdsc", description="CYRILLIC SMALL LETTER ZE WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0437, - uccode=0x0498, - unicodeslot=0x0499, + shcode=0x437, + uccode=0x498, + unicodeslot=0x499, }, - [0x049A]={ + [0x49A]={ adobename="Kadescendercyrillic", category="lu", contextname="cyrillicKADC", description="CYRILLIC CAPITAL LETTER KA WITH DESCENDER", direction="l", - lccode=0x049B, + lccode=0x49B, linebreak="al", - shcode=0x041A, - unicodeslot=0x049A, + shcode=0x41A, + unicodeslot=0x49A, }, - [0x049B]={ + [0x49B]={ adobename="kadescendercyrillic", category="ll", contextname="cyrillickadc", description="CYRILLIC SMALL LETTER KA WITH DESCENDER", direction="l", linebreak="al", - shcode=0x043A, - uccode=0x049A, - unicodeslot=0x049B, + shcode=0x43A, + uccode=0x49A, + unicodeslot=0x49B, }, - [0x049C]={ + [0x49C]={ adobename="Kaverticalstrokecyrillic", category="lu", contextname="cyrillicKAvertstroke", description="CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE", direction="l", - lccode=0x049D, + lccode=0x49D, linebreak="al", - shcode=0x041A, - unicodeslot=0x049C, + shcode=0x41A, + unicodeslot=0x49C, }, - [0x049D]={ + [0x49D]={ adobename="kaverticalstrokecyrillic", category="ll", contextname="cyrillickavertstroke", description="CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE", direction="l", linebreak="al", - shcode=0x043A, - uccode=0x049C, - unicodeslot=0x049D, + shcode=0x43A, + uccode=0x49C, + unicodeslot=0x49D, }, - [0x049E]={ + [0x49E]={ adobename="Kastrokecyrillic", category="lu", contextname="cyrillicKAstroke", description="CYRILLIC CAPITAL LETTER KA WITH STROKE", direction="l", - lccode=0x049F, + lccode=0x49F, linebreak="al", - shcode=0x041A, - unicodeslot=0x049E, + shcode=0x41A, + unicodeslot=0x49E, }, - [0x049F]={ + [0x49F]={ adobename="kastrokecyrillic", category="ll", contextname="cyrillickastroke", description="CYRILLIC SMALL LETTER KA WITH STROKE", direction="l", linebreak="al", - shcode=0x043A, - uccode=0x049E, - unicodeslot=0x049F, + shcode=0x43A, + uccode=0x49E, + unicodeslot=0x49F, }, - [0x04A0]={ + [0x4A0]={ adobename="Kabashkircyrillic", category="lu", contextname="cyrillicKAbashkir", description="CYRILLIC CAPITAL LETTER BASHKIR KA", direction="l", - lccode=0x04A1, + lccode=0x4A1, linebreak="al", - unicodeslot=0x04A0, + unicodeslot=0x4A0, }, - [0x04A1]={ + [0x4A1]={ adobename="kabashkircyrillic", category="ll", contextname="cyrillickabashkir", description="CYRILLIC SMALL LETTER BASHKIR KA", direction="l", linebreak="al", - uccode=0x04A0, - unicodeslot=0x04A1, + uccode=0x4A0, + unicodeslot=0x4A1, }, - [0x04A2]={ + [0x4A2]={ adobename="Endescendercyrillic", category="lu", contextname="cyrillicENDC", description="CYRILLIC CAPITAL LETTER EN WITH DESCENDER", direction="l", - lccode=0x04A3, + lccode=0x4A3, linebreak="al", - shcode=0x041D, - unicodeslot=0x04A2, + shcode=0x41D, + unicodeslot=0x4A2, }, - [0x04A3]={ + [0x4A3]={ adobename="endescendercyrillic", category="ll", contextname="cyrillicendc", description="CYRILLIC SMALL LETTER EN WITH DESCENDER", direction="l", linebreak="al", - shcode=0x043D, - uccode=0x04A2, - unicodeslot=0x04A3, + shcode=0x43D, + uccode=0x4A2, + unicodeslot=0x4A3, }, - [0x04A4]={ + [0x4A4]={ adobename="Enghecyrillic", category="lu", contextname="cyrillicENGHE", description="CYRILLIC CAPITAL LIGATURE EN GHE", direction="l", - lccode=0x04A5, + lccode=0x4A5, linebreak="al", - unicodeslot=0x04A4, + unicodeslot=0x4A4, }, - [0x04A5]={ + [0x4A5]={ adobename="enghecyrillic", category="ll", contextname="cyrillicenghe", description="CYRILLIC SMALL LIGATURE EN GHE", direction="l", linebreak="al", - uccode=0x04A4, - unicodeslot=0x04A5, + uccode=0x4A4, + unicodeslot=0x4A5, }, - [0x04A6]={ + [0x4A6]={ adobename="Pemiddlehookcyrillic", category="lu", contextname="cyrillicPEmidhook", description="CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK", direction="l", - lccode=0x04A7, + lccode=0x4A7, linebreak="al", - shcode=0x041F, - unicodeslot=0x04A6, + shcode=0x41F, + unicodeslot=0x4A6, }, - [0x04A7]={ + [0x4A7]={ adobename="pemiddlehookcyrillic", category="ll", contextname="cyrillicpemidhook", description="CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK", direction="l", linebreak="al", - shcode=0x043F, - uccode=0x04A6, - unicodeslot=0x04A7, + shcode=0x43F, + uccode=0x4A6, + unicodeslot=0x4A7, }, - [0x04A8]={ + [0x4A8]={ adobename="Haabkhasiancyrillic", category="lu", contextname="cyrillicHA", description="CYRILLIC CAPITAL LETTER ABKHASIAN HA", direction="l", - lccode=0x04A9, + lccode=0x4A9, linebreak="al", - unicodeslot=0x04A8, + unicodeslot=0x4A8, }, - [0x04A9]={ + [0x4A9]={ adobename="haabkhasiancyrillic", category="ll", contextname="cyrillicha", description="CYRILLIC SMALL LETTER ABKHASIAN HA", direction="l", linebreak="al", - uccode=0x04A8, - unicodeslot=0x04A9, + uccode=0x4A8, + unicodeslot=0x4A9, }, - [0x04AA]={ + [0x4AA]={ adobename="Esdescendercyrillic", category="lu", contextname="cyrillicSDSC", description="CYRILLIC CAPITAL LETTER ES WITH DESCENDER", direction="l", - lccode=0x04AB, + lccode=0x4AB, linebreak="al", - shcode=0x0421, - unicodeslot=0x04AA, + shcode=0x421, + unicodeslot=0x4AA, }, - [0x04AB]={ + [0x4AB]={ adobename="esdescendercyrillic", category="ll", contextname="cyrillicsdsc", description="CYRILLIC SMALL LETTER ES WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0441, - uccode=0x04AA, - unicodeslot=0x04AB, + shcode=0x441, + uccode=0x4AA, + unicodeslot=0x4AB, }, - [0x04AC]={ + [0x4AC]={ adobename="Tedescendercyrillic", category="lu", contextname="cyrillicTEDC", description="CYRILLIC CAPITAL LETTER TE WITH DESCENDER", direction="l", - lccode=0x04AD, + lccode=0x4AD, linebreak="al", - shcode=0x0422, - unicodeslot=0x04AC, + shcode=0x422, + unicodeslot=0x4AC, }, - [0x04AD]={ + [0x4AD]={ adobename="tedescendercyrillic", category="ll", contextname="cyrillictedc", description="CYRILLIC SMALL LETTER TE WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0442, - uccode=0x04AC, - unicodeslot=0x04AD, + shcode=0x442, + uccode=0x4AC, + unicodeslot=0x4AD, }, - [0x04AE]={ + [0x4AE]={ adobename="Ustraightcyrillic", category="lu", contextname="cyrillicYstr", description="CYRILLIC CAPITAL LETTER STRAIGHT U", direction="l", - lccode=0x04AF, + lccode=0x4AF, linebreak="al", - unicodeslot=0x04AE, + unicodeslot=0x4AE, }, - [0x04AF]={ + [0x4AF]={ adobename="ustraightcyrillic", category="ll", contextname="cyrillicystr", description="CYRILLIC SMALL LETTER STRAIGHT U", direction="l", linebreak="al", - uccode=0x04AE, - unicodeslot=0x04AF, + uccode=0x4AE, + unicodeslot=0x4AF, }, - [0x04B0]={ + [0x4B0]={ adobename="Ustraightstrokecyrillic", category="lu", contextname="cyrillicYstrstroke", description="CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE", direction="l", - lccode=0x04B1, + lccode=0x4B1, linebreak="al", - unicodeslot=0x04B0, + unicodeslot=0x4B0, }, - [0x04B1]={ + [0x4B1]={ adobename="ustraightstrokecyrillic", category="ll", contextname="cyrillicystrstroke", description="CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE", direction="l", linebreak="al", - uccode=0x04B0, - unicodeslot=0x04B1, + uccode=0x4B0, + unicodeslot=0x4B1, }, - [0x04B2]={ + [0x4B2]={ adobename="Hadescendercyrillic", category="lu", contextname="cyrillicHADC", description="CYRILLIC CAPITAL LETTER HA WITH DESCENDER", direction="l", - lccode=0x04B3, + lccode=0x4B3, linebreak="al", - shcode=0x0425, - unicodeslot=0x04B2, + shcode=0x425, + unicodeslot=0x4B2, }, - [0x04B3]={ + [0x4B3]={ adobename="hadescendercyrillic", category="ll", contextname="cyrillichadc", description="CYRILLIC SMALL LETTER HA WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0445, - uccode=0x04B2, - unicodeslot=0x04B3, + shcode=0x445, + uccode=0x4B2, + unicodeslot=0x4B3, }, - [0x04B4]={ + [0x4B4]={ adobename="Tetsecyrillic", category="lu", contextname="cyrillicTETSE", description="CYRILLIC CAPITAL LIGATURE TE TSE", direction="l", - lccode=0x04B5, + lccode=0x4B5, linebreak="al", - unicodeslot=0x04B4, + unicodeslot=0x4B4, }, - [0x04B5]={ + [0x4B5]={ adobename="tetsecyrillic", category="ll", contextname="cyrillictetse", description="CYRILLIC SMALL LIGATURE TE TSE", direction="l", linebreak="al", - uccode=0x04B4, - unicodeslot=0x04B5, + uccode=0x4B4, + unicodeslot=0x4B5, }, - [0x04B6]={ + [0x4B6]={ adobename="Chedescendercyrillic", category="lu", contextname="cyrillicCHEDC", description="CYRILLIC CAPITAL LETTER CHE WITH DESCENDER", direction="l", - lccode=0x04B7, + lccode=0x4B7, linebreak="al", - shcode=0x0427, - unicodeslot=0x04B6, + shcode=0x427, + unicodeslot=0x4B6, }, - [0x04B7]={ + [0x4B7]={ adobename="chedescendercyrillic", category="ll", contextname="cyrillicchedc", description="CYRILLIC SMALL LETTER CHE WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0447, - uccode=0x04B6, - unicodeslot=0x04B7, + shcode=0x447, + uccode=0x4B6, + unicodeslot=0x4B7, }, - [0x04B8]={ + [0x4B8]={ adobename="Cheverticalstrokecyrillic", category="lu", contextname="cyrillicCHEvertstroke", description="CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE", direction="l", - lccode=0x04B9, + lccode=0x4B9, linebreak="al", - shcode=0x0427, - unicodeslot=0x04B8, + shcode=0x427, + unicodeslot=0x4B8, }, - [0x04B9]={ + [0x4B9]={ adobename="cheverticalstrokecyrillic", category="ll", contextname="cyrillicchevertstroke", description="CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE", direction="l", linebreak="al", - shcode=0x0447, - uccode=0x04B8, - unicodeslot=0x04B9, + shcode=0x447, + uccode=0x4B8, + unicodeslot=0x4B9, }, - [0x04BA]={ + [0x4BA]={ adobename="Shhacyrillic", category="lu", contextname="cyrillicSHHA", description="CYRILLIC CAPITAL LETTER SHHA", direction="l", - lccode=0x04BB, + lccode=0x4BB, linebreak="al", - unicodeslot=0x04BA, + unicodeslot=0x4BA, }, - [0x04BB]={ + [0x4BB]={ adobename="shhacyrillic", category="ll", contextname="cyrillicshha", description="CYRILLIC SMALL LETTER SHHA", direction="l", linebreak="al", - uccode=0x04BA, - unicodeslot=0x04BB, + uccode=0x4BA, + unicodeslot=0x4BB, }, - [0x04BC]={ + [0x4BC]={ adobename="Cheabkhasiancyrillic", category="lu", contextname="cyrillicCHEabkhasian", description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE", direction="l", - lccode=0x04BD, + lccode=0x4BD, linebreak="al", - unicodeslot=0x04BC, + unicodeslot=0x4BC, }, - [0x04BD]={ + [0x4BD]={ adobename="cheabkhasiancyrillic", category="ll", contextname="cyrilliccheabkhasian", description="CYRILLIC SMALL LETTER ABKHASIAN CHE", direction="l", linebreak="al", - uccode=0x04BC, - unicodeslot=0x04BD, + uccode=0x4BC, + unicodeslot=0x4BD, }, - [0x04BE]={ + [0x4BE]={ adobename="Chedescenderabkhasiancyrillic", category="lu", contextname="cyrillicCHEDCabkhasian", description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER", direction="l", - lccode=0x04BF, + lccode=0x4BF, linebreak="al", - unicodeslot=0x04BE, + unicodeslot=0x4BE, }, - [0x04BF]={ + [0x4BF]={ adobename="chedescenderabkhasiancyrillic", category="ll", contextname="cyrillicchedcabkhasian", description="CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER", direction="l", linebreak="al", - uccode=0x04BE, - unicodeslot=0x04BF, + uccode=0x4BE, + unicodeslot=0x4BF, }, - [0x04C0]={ + [0x4C0]={ adobename="palochkacyrillic", category="lu", contextname="cyrillicPALOCHKA", description="CYRILLIC LETTER PALOCHKA", direction="l", - lccode=0x04CF, + lccode=0x4CF, linebreak="al", - unicodeslot=0x04C0, + unicodeslot=0x4C0, }, - [0x04C1]={ + [0x4C1]={ adobename="Zhebrevecyrillic", category="lu", contextname="cyrillicZHEbreve", description="CYRILLIC CAPITAL LETTER ZHE WITH BREVE", direction="l", - lccode=0x04C2, + lccode=0x4C2, linebreak="al", - shcode=0x0416, - specials={ "char", 0x0416, 0x0306 }, - unicodeslot=0x04C1, + shcode=0x416, + specials={ "char", 0x416, 0x306 }, + unicodeslot=0x4C1, }, - [0x04C2]={ + [0x4C2]={ adobename="zhebrevecyrillic", category="ll", contextname="cyrilliczhebreve", description="CYRILLIC SMALL LETTER ZHE WITH BREVE", direction="l", linebreak="al", - shcode=0x0436, - specials={ "char", 0x0436, 0x0306 }, - uccode=0x04C1, - unicodeslot=0x04C2, + shcode=0x436, + specials={ "char", 0x436, 0x306 }, + uccode=0x4C1, + unicodeslot=0x4C2, }, - [0x04C3]={ + [0x4C3]={ adobename="Kahookcyrillic", category="lu", contextname="cyrillicKAhook", description="CYRILLIC CAPITAL LETTER KA WITH HOOK", direction="l", - lccode=0x04C4, + lccode=0x4C4, linebreak="al", - shcode=0x041A, - unicodeslot=0x04C3, + shcode=0x41A, + unicodeslot=0x4C3, }, - [0x04C4]={ + [0x4C4]={ adobename="kahookcyrillic", category="ll", contextname="cyrillickahook", description="CYRILLIC SMALL LETTER KA WITH HOOK", direction="l", linebreak="al", - shcode=0x043A, - uccode=0x04C3, - unicodeslot=0x04C4, + shcode=0x43A, + uccode=0x4C3, + unicodeslot=0x4C4, }, - [0x04C5]={ + [0x4C5]={ category="lu", contextname="cyrillicELtail", description="CYRILLIC CAPITAL LETTER EL WITH TAIL", direction="l", - lccode=0x04C6, + lccode=0x4C6, linebreak="al", - shcode=0x041B, - unicodeslot=0x04C5, + shcode=0x41B, + unicodeslot=0x4C5, }, - [0x04C6]={ + [0x4C6]={ category="ll", contextname="cyrilliceltail", description="CYRILLIC SMALL LETTER EL WITH TAIL", direction="l", linebreak="al", - shcode=0x043B, - uccode=0x04C5, - unicodeslot=0x04C6, + shcode=0x43B, + uccode=0x4C5, + unicodeslot=0x4C6, }, - [0x04C7]={ + [0x4C7]={ adobename="Enhookcyrillic", category="lu", contextname="cyrillicENhook", description="CYRILLIC CAPITAL LETTER EN WITH HOOK", direction="l", - lccode=0x04C8, + lccode=0x4C8, linebreak="al", - shcode=0x041D, - unicodeslot=0x04C7, + shcode=0x41D, + unicodeslot=0x4C7, }, - [0x04C8]={ + [0x4C8]={ adobename="enhookcyrillic", category="ll", contextname="cyrillicenhook", description="CYRILLIC SMALL LETTER EN WITH HOOK", direction="l", linebreak="al", - shcode=0x043D, - uccode=0x04C7, - unicodeslot=0x04C8, + shcode=0x43D, + uccode=0x4C7, + unicodeslot=0x4C8, }, - [0x04C9]={ + [0x4C9]={ category="lu", contextname="cyrillicENtail", description="CYRILLIC CAPITAL LETTER EN WITH TAIL", direction="l", - lccode=0x04CA, + lccode=0x4CA, linebreak="al", - shcode=0x041D, - unicodeslot=0x04C9, + shcode=0x41D, + unicodeslot=0x4C9, }, - [0x04CA]={ + [0x4CA]={ category="ll", contextname="cyrillicentail", description="CYRILLIC SMALL LETTER EN WITH TAIL", direction="l", linebreak="al", - shcode=0x043D, - uccode=0x04C9, - unicodeslot=0x04CA, + shcode=0x43D, + uccode=0x4C9, + unicodeslot=0x4CA, }, - [0x04CB]={ + [0x4CB]={ adobename="Chekhakassiancyrillic", category="lu", contextname="cyrillicCHEkhakassian", description="CYRILLIC CAPITAL LETTER KHAKASSIAN CHE", direction="l", - lccode=0x04CC, + lccode=0x4CC, linebreak="al", - unicodeslot=0x04CB, + unicodeslot=0x4CB, }, - [0x04CC]={ + [0x4CC]={ adobename="chekhakassiancyrillic", category="ll", contextname="cyrillicchekhakassian", description="CYRILLIC SMALL LETTER KHAKASSIAN CHE", direction="l", linebreak="al", - uccode=0x04CB, - unicodeslot=0x04CC, + uccode=0x4CB, + unicodeslot=0x4CC, }, - [0x04CD]={ + [0x4CD]={ category="lu", contextname="cyrillicEMtail", description="CYRILLIC CAPITAL LETTER EM WITH TAIL", direction="l", - lccode=0x04CE, + lccode=0x4CE, linebreak="al", - shcode=0x041C, - unicodeslot=0x04CD, + shcode=0x41C, + unicodeslot=0x4CD, }, - [0x04CE]={ + [0x4CE]={ category="ll", contextname="cyrillicemtail", description="CYRILLIC SMALL LETTER EM WITH TAIL", direction="l", linebreak="al", - shcode=0x043C, - uccode=0x04CD, - unicodeslot=0x04CE, + shcode=0x43C, + uccode=0x4CD, + unicodeslot=0x4CE, }, - [0x04CF]={ + [0x4CF]={ category="ll", description="CYRILLIC SMALL LETTER PALOCHKA", direction="l", linebreak="al", - uccode=0x04C0, - unicodeslot=0x04CF, + uccode=0x4C0, + unicodeslot=0x4CF, }, - [0x04D0]={ + [0x4D0]={ adobename="Abrevecyrillic", category="lu", contextname="cyrillicAbreve", description="CYRILLIC CAPITAL LETTER A WITH BREVE", direction="l", - lccode=0x04D1, + lccode=0x4D1, linebreak="al", - shcode=0x0410, - specials={ "char", 0x0410, 0x0306 }, - unicodeslot=0x04D0, + shcode=0x410, + specials={ "char", 0x410, 0x306 }, + unicodeslot=0x4D0, }, - [0x04D1]={ + [0x4D1]={ adobename="abrevecyrillic", category="ll", contextname="cyrillicabreve", description="CYRILLIC SMALL LETTER A WITH BREVE", direction="l", linebreak="al", - shcode=0x0430, - specials={ "char", 0x0430, 0x0306 }, - uccode=0x04D0, - unicodeslot=0x04D1, + shcode=0x430, + specials={ "char", 0x430, 0x306 }, + uccode=0x4D0, + unicodeslot=0x4D1, }, - [0x04D2]={ + [0x4D2]={ adobename="Adieresiscyrillic", category="lu", contextname="cyrillicAdiaeresis", description="CYRILLIC CAPITAL LETTER A WITH DIAERESIS", direction="l", - lccode=0x04D3, + lccode=0x4D3, linebreak="al", - shcode=0x0410, - specials={ "char", 0x0410, 0x0308 }, - unicodeslot=0x04D2, + shcode=0x410, + specials={ "char", 0x410, 0x308 }, + unicodeslot=0x4D2, }, - [0x04D3]={ + [0x4D3]={ adobename="adieresiscyrillic", category="ll", contextname="cyrillicadiaeresis", description="CYRILLIC SMALL LETTER A WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0430, - specials={ "char", 0x0430, 0x0308 }, - uccode=0x04D2, - unicodeslot=0x04D3, + shcode=0x430, + specials={ "char", 0x430, 0x308 }, + uccode=0x4D2, + unicodeslot=0x4D3, }, - [0x04D4]={ + [0x4D4]={ adobename="Aiecyrillic", category="lu", contextname="cyrillicAE", description="CYRILLIC CAPITAL LIGATURE A IE", direction="l", - lccode=0x04D5, + lccode=0x4D5, linebreak="al", - unicodeslot=0x04D4, + unicodeslot=0x4D4, }, - [0x04D5]={ + [0x4D5]={ adobename="aiecyrillic", category="ll", contextname="cyrillicae", description="CYRILLIC SMALL LIGATURE A IE", direction="l", linebreak="al", - uccode=0x04D4, - unicodeslot=0x04D5, + uccode=0x4D4, + unicodeslot=0x4D5, }, - [0x04D6]={ + [0x4D6]={ adobename="Iebrevecyrillic", category="lu", contextname="cyrillicEbreve", description="CYRILLIC CAPITAL LETTER IE WITH BREVE", direction="l", - lccode=0x04D7, + lccode=0x4D7, linebreak="al", - shcode=0x0415, - specials={ "char", 0x0415, 0x0306 }, - unicodeslot=0x04D6, + shcode=0x415, + specials={ "char", 0x415, 0x306 }, + unicodeslot=0x4D6, }, - [0x04D7]={ + [0x4D7]={ adobename="iebrevecyrillic", category="ll", contextname="cyrillicebreve", description="CYRILLIC SMALL LETTER IE WITH BREVE", direction="l", linebreak="al", - shcode=0x0435, - specials={ "char", 0x0435, 0x0306 }, - uccode=0x04D6, - unicodeslot=0x04D7, + shcode=0x435, + specials={ "char", 0x435, 0x306 }, + uccode=0x4D6, + unicodeslot=0x4D7, }, - [0x04D8]={ + [0x4D8]={ adobename="Schwacyrillic", category="lu", contextname="cyrillicSCHWA", description="CYRILLIC CAPITAL LETTER SCHWA", direction="l", - lccode=0x04D9, + lccode=0x4D9, linebreak="al", - unicodeslot=0x04D8, + unicodeslot=0x4D8, }, - [0x04D9]={ + [0x4D9]={ adobename="schwacyrillic", category="ll", contextname="cyrillicschwa", description="CYRILLIC SMALL LETTER SCHWA", direction="l", linebreak="al", - uccode=0x04D8, - unicodeslot=0x04D9, + uccode=0x4D8, + unicodeslot=0x4D9, }, - [0x04DA]={ + [0x4DA]={ adobename="Schwadieresiscyrillic", category="lu", contextname="cyrillicSCHWAdiaeresis", description="CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS", direction="l", - lccode=0x04DB, + lccode=0x4DB, linebreak="al", - shcode=0x04D8, - specials={ "char", 0x04D8, 0x0308 }, - unicodeslot=0x04DA, + shcode=0x4D8, + specials={ "char", 0x4D8, 0x308 }, + unicodeslot=0x4DA, }, - [0x04DB]={ + [0x4DB]={ adobename="schwadieresiscyrillic", category="ll", contextname="cyrillicschwadiaeresis", description="CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x04D9, - specials={ "char", 0x04D9, 0x0308 }, - uccode=0x04DA, - unicodeslot=0x04DB, + shcode=0x4D9, + specials={ "char", 0x4D9, 0x308 }, + uccode=0x4DA, + unicodeslot=0x4DB, }, - [0x04DC]={ + [0x4DC]={ adobename="Zhedieresiscyrillic", category="lu", contextname="cyrillicZHEdiaeresis", description="CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS", direction="l", - lccode=0x04DD, + lccode=0x4DD, linebreak="al", - shcode=0x0416, - specials={ "char", 0x0416, 0x0308 }, - unicodeslot=0x04DC, + shcode=0x416, + specials={ "char", 0x416, 0x308 }, + unicodeslot=0x4DC, }, - [0x04DD]={ + [0x4DD]={ adobename="zhedieresiscyrillic", category="ll", contextname="cyrilliczhediaeresis", description="CYRILLIC SMALL LETTER ZHE WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0436, - specials={ "char", 0x0436, 0x0308 }, - uccode=0x04DC, - unicodeslot=0x04DD, + shcode=0x436, + specials={ "char", 0x436, 0x308 }, + uccode=0x4DC, + unicodeslot=0x4DD, }, - [0x04DE]={ + [0x4DE]={ adobename="Zedieresiscyrillic", category="lu", contextname="cyrillicZEdiaeresis", description="CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS", direction="l", - lccode=0x04DF, + lccode=0x4DF, linebreak="al", - shcode=0x0417, - specials={ "char", 0x0417, 0x0308 }, - unicodeslot=0x04DE, + shcode=0x417, + specials={ "char", 0x417, 0x308 }, + unicodeslot=0x4DE, }, - [0x04DF]={ + [0x4DF]={ adobename="zedieresiscyrillic", category="ll", contextname="cyrilliczediaeresis", description="CYRILLIC SMALL LETTER ZE WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0437, - specials={ "char", 0x0437, 0x0308 }, - uccode=0x04DE, - unicodeslot=0x04DF, + shcode=0x437, + specials={ "char", 0x437, 0x308 }, + uccode=0x4DE, + unicodeslot=0x4DF, }, - [0x04E0]={ + [0x4E0]={ adobename="Dzeabkhasiancyrillic", category="lu", contextname="cyrillicDZEabkhasian", description="CYRILLIC CAPITAL LETTER ABKHASIAN DZE", direction="l", - lccode=0x04E1, + lccode=0x4E1, linebreak="al", - unicodeslot=0x04E0, + unicodeslot=0x4E0, }, - [0x04E1]={ + [0x4E1]={ adobename="dzeabkhasiancyrillic", category="ll", contextname="cyrillicdzeabkhasian", description="CYRILLIC SMALL LETTER ABKHASIAN DZE", direction="l", linebreak="al", - uccode=0x04E0, - unicodeslot=0x04E1, + uccode=0x4E0, + unicodeslot=0x4E1, }, - [0x04E2]={ + [0x4E2]={ adobename="Imacroncyrillic", category="lu", contextname="cyrillicImacron", description="CYRILLIC CAPITAL LETTER I WITH MACRON", direction="l", - lccode=0x04E3, + lccode=0x4E3, linebreak="al", - shcode=0x0418, - specials={ "char", 0x0418, 0x0304 }, - unicodeslot=0x04E2, + shcode=0x418, + specials={ "char", 0x418, 0x304 }, + unicodeslot=0x4E2, }, - [0x04E3]={ + [0x4E3]={ adobename="imacroncyrillic", category="ll", contextname="cyrillicimacron", description="CYRILLIC SMALL LETTER I WITH MACRON", direction="l", linebreak="al", - shcode=0x0438, - specials={ "char", 0x0438, 0x0304 }, - uccode=0x04E2, - unicodeslot=0x04E3, + shcode=0x438, + specials={ "char", 0x438, 0x304 }, + uccode=0x4E2, + unicodeslot=0x4E3, }, - [0x04E4]={ + [0x4E4]={ adobename="Idieresiscyrillic", category="lu", contextname="cyrillicIdiaeresis", description="CYRILLIC CAPITAL LETTER I WITH DIAERESIS", direction="l", - lccode=0x04E5, + lccode=0x4E5, linebreak="al", - shcode=0x0418, - specials={ "char", 0x0418, 0x0308 }, - unicodeslot=0x04E4, + shcode=0x418, + specials={ "char", 0x418, 0x308 }, + unicodeslot=0x4E4, }, - [0x04E5]={ + [0x4E5]={ adobename="idieresiscyrillic", category="ll", contextname="cyrillicidiaeresis", description="CYRILLIC SMALL LETTER I WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0438, - specials={ "char", 0x0438, 0x0308 }, - uccode=0x04E4, - unicodeslot=0x04E5, + shcode=0x438, + specials={ "char", 0x438, 0x308 }, + uccode=0x4E4, + unicodeslot=0x4E5, }, - [0x04E6]={ + [0x4E6]={ adobename="Odieresiscyrillic", category="lu", contextname="cyrillicOdiaeresis", description="CYRILLIC CAPITAL LETTER O WITH DIAERESIS", direction="l", - lccode=0x04E7, + lccode=0x4E7, linebreak="al", - shcode=0x041E, - specials={ "char", 0x041E, 0x0308 }, - unicodeslot=0x04E6, + shcode=0x41E, + specials={ "char", 0x41E, 0x308 }, + unicodeslot=0x4E6, }, - [0x04E7]={ + [0x4E7]={ adobename="odieresiscyrillic", category="ll", contextname="cyrillicodiaeresis", description="CYRILLIC SMALL LETTER O WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x043E, - specials={ "char", 0x043E, 0x0308 }, - uccode=0x04E6, - unicodeslot=0x04E7, + shcode=0x43E, + specials={ "char", 0x43E, 0x308 }, + uccode=0x4E6, + unicodeslot=0x4E7, }, - [0x04E8]={ + [0x4E8]={ adobename="Obarredcyrillic", category="lu", contextname="cyrillicObarred", description="CYRILLIC CAPITAL LETTER BARRED O", direction="l", - lccode=0x04E9, + lccode=0x4E9, linebreak="al", - unicodeslot=0x04E8, + unicodeslot=0x4E8, }, - [0x04E9]={ + [0x4E9]={ adobename="obarredcyrillic", category="ll", contextname="cyrillicobarred", description="CYRILLIC SMALL LETTER BARRED O", direction="l", linebreak="al", - uccode=0x04E8, - unicodeslot=0x04E9, + uccode=0x4E8, + unicodeslot=0x4E9, }, - [0x04EA]={ + [0x4EA]={ adobename="Obarreddieresiscyrillic", category="lu", contextname="cyrillicObarreddiaeresis", description="CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS", direction="l", - lccode=0x04EB, + lccode=0x4EB, linebreak="al", - specials={ "char", 0x04E8, 0x0308 }, - unicodeslot=0x04EA, + specials={ "char", 0x4E8, 0x308 }, + unicodeslot=0x4EA, }, - [0x04EB]={ + [0x4EB]={ adobename="obarreddieresiscyrillic", category="ll", contextname="cyrillicobarreddiaeresis", description="CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS", direction="l", linebreak="al", - specials={ "char", 0x04E9, 0x0308 }, - uccode=0x04EA, - unicodeslot=0x04EB, + specials={ "char", 0x4E9, 0x308 }, + uccode=0x4EA, + unicodeslot=0x4EB, }, - [0x04EC]={ + [0x4EC]={ category="lu", contextname="cyrillicEdiaeresis", description="CYRILLIC CAPITAL LETTER E WITH DIAERESIS", direction="l", - lccode=0x04ED, + lccode=0x4ED, linebreak="al", - shcode=0x042D, - specials={ "char", 0x042D, 0x0308 }, - unicodeslot=0x04EC, + shcode=0x42D, + specials={ "char", 0x42D, 0x308 }, + unicodeslot=0x4EC, }, - [0x04ED]={ + [0x4ED]={ category="ll", contextname="cyrillicediaeresis", description="CYRILLIC SMALL LETTER E WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x044D, - specials={ "char", 0x044D, 0x0308 }, - uccode=0x04EC, - unicodeslot=0x04ED, + shcode=0x44D, + specials={ "char", 0x44D, 0x308 }, + uccode=0x4EC, + unicodeslot=0x4ED, }, - [0x04EE]={ + [0x4EE]={ adobename="Umacroncyrillic", category="lu", contextname="cyrillicUmacron", description="CYRILLIC CAPITAL LETTER U WITH MACRON", direction="l", - lccode=0x04EF, + lccode=0x4EF, linebreak="al", - shcode=0x0423, - specials={ "char", 0x0423, 0x0304 }, - unicodeslot=0x04EE, + shcode=0x423, + specials={ "char", 0x423, 0x304 }, + unicodeslot=0x4EE, }, - [0x04EF]={ + [0x4EF]={ adobename="umacroncyrillic", category="ll", contextname="cyrillicumacron", description="CYRILLIC SMALL LETTER U WITH MACRON", direction="l", linebreak="al", - shcode=0x0443, - specials={ "char", 0x0443, 0x0304 }, - uccode=0x04EE, - unicodeslot=0x04EF, + shcode=0x443, + specials={ "char", 0x443, 0x304 }, + uccode=0x4EE, + unicodeslot=0x4EF, }, - [0x04F0]={ + [0x4F0]={ adobename="Udieresiscyrillic", category="lu", contextname="cyrillicUdiaeresis", description="CYRILLIC CAPITAL LETTER U WITH DIAERESIS", direction="l", - lccode=0x04F1, + lccode=0x4F1, linebreak="al", - shcode=0x0423, - specials={ "char", 0x0423, 0x0308 }, - unicodeslot=0x04F0, + shcode=0x423, + specials={ "char", 0x423, 0x308 }, + unicodeslot=0x4F0, }, - [0x04F1]={ + [0x4F1]={ adobename="udieresiscyrillic", category="ll", contextname="cyrillicudiaeresis", description="CYRILLIC SMALL LETTER U WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0443, - specials={ "char", 0x0443, 0x0308 }, - uccode=0x04F0, - unicodeslot=0x04F1, + shcode=0x443, + specials={ "char", 0x443, 0x308 }, + uccode=0x4F0, + unicodeslot=0x4F1, }, - [0x04F2]={ + [0x4F2]={ adobename="Uhungarumlautcyrillic", category="lu", contextname="cyrillicUdoubleacute", description="CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE", direction="l", - lccode=0x04F3, + lccode=0x4F3, linebreak="al", - shcode=0x0423, - specials={ "char", 0x0423, 0x030B }, - unicodeslot=0x04F2, + shcode=0x423, + specials={ "char", 0x423, 0x30B }, + unicodeslot=0x4F2, }, - [0x04F3]={ + [0x4F3]={ adobename="uhungarumlautcyrillic", category="ll", contextname="cyrillicudoubleacute", description="CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE", direction="l", linebreak="al", - shcode=0x0443, - specials={ "char", 0x0443, 0x030B }, - uccode=0x04F2, - unicodeslot=0x04F3, + shcode=0x443, + specials={ "char", 0x443, 0x30B }, + uccode=0x4F2, + unicodeslot=0x4F3, }, - [0x04F4]={ + [0x4F4]={ adobename="Chedieresiscyrillic", category="lu", contextname="cyrillicCHEdiaeresis", description="CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS", direction="l", - lccode=0x04F5, + lccode=0x4F5, linebreak="al", - shcode=0x0427, - specials={ "char", 0x0427, 0x0308 }, - unicodeslot=0x04F4, + shcode=0x427, + specials={ "char", 0x427, 0x308 }, + unicodeslot=0x4F4, }, - [0x04F5]={ + [0x4F5]={ adobename="chedieresiscyrillic", category="ll", contextname="cyrillicchediaeresis", description="CYRILLIC SMALL LETTER CHE WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0447, - specials={ "char", 0x0447, 0x0308 }, - uccode=0x04F4, - unicodeslot=0x04F5, + shcode=0x447, + specials={ "char", 0x447, 0x308 }, + uccode=0x4F4, + unicodeslot=0x4F5, }, - [0x04F6]={ + [0x4F6]={ category="lu", description="CYRILLIC CAPITAL LETTER GHE WITH DESCENDER", direction="l", - lccode=0x04F7, + lccode=0x4F7, linebreak="al", - shcode=0x0413, - unicodeslot=0x04F6, + shcode=0x413, + unicodeslot=0x4F6, }, - [0x04F7]={ + [0x4F7]={ category="ll", description="CYRILLIC SMALL LETTER GHE WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0433, - uccode=0x04F6, - unicodeslot=0x04F7, + shcode=0x433, + uccode=0x4F6, + unicodeslot=0x4F7, }, - [0x04F8]={ + [0x4F8]={ adobename="Yerudieresiscyrillic", category="lu", contextname="cyrillicYERUdiaeresis", description="CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS", direction="l", - lccode=0x04F9, + lccode=0x4F9, linebreak="al", - shcode=0x042B, - specials={ "char", 0x042B, 0x0308 }, - unicodeslot=0x04F8, + shcode=0x42B, + specials={ "char", 0x42B, 0x308 }, + unicodeslot=0x4F8, }, - [0x04F9]={ + [0x4F9]={ adobename="yerudieresiscyrillic", category="ll", contextname="cyrillicyerudiaeresis", description="CYRILLIC SMALL LETTER YERU WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x044B, - specials={ "char", 0x044B, 0x0308 }, - uccode=0x04F8, - unicodeslot=0x04F9, + shcode=0x44B, + specials={ "char", 0x44B, 0x308 }, + uccode=0x4F8, + unicodeslot=0x4F9, }, - [0x04FA]={ + [0x4FA]={ category="lu", description="CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK", direction="l", - lccode=0x04FB, + lccode=0x4FB, linebreak="al", - shcode=0x0413, - unicodeslot=0x04FA, + shcode=0x413, + unicodeslot=0x4FA, }, - [0x04FB]={ + [0x4FB]={ category="ll", description="CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK", direction="l", linebreak="al", - shcode=0x0433, - uccode=0x04FA, - unicodeslot=0x04FB, + shcode=0x433, + uccode=0x4FA, + unicodeslot=0x4FB, }, - [0x04FC]={ + [0x4FC]={ category="lu", description="CYRILLIC CAPITAL LETTER HA WITH HOOK", direction="l", - lccode=0x04FD, + lccode=0x4FD, linebreak="al", - shcode=0x0425, - unicodeslot=0x04FC, + shcode=0x425, + unicodeslot=0x4FC, }, - [0x04FD]={ + [0x4FD]={ category="ll", description="CYRILLIC SMALL LETTER HA WITH HOOK", direction="l", linebreak="al", - shcode=0x0445, - uccode=0x04FC, - unicodeslot=0x04FD, + shcode=0x445, + uccode=0x4FC, + unicodeslot=0x4FD, }, - [0x04FE]={ + [0x4FE]={ category="lu", description="CYRILLIC CAPITAL LETTER HA WITH STROKE", direction="l", - lccode=0x04FF, + lccode=0x4FF, linebreak="al", - shcode=0x0425, - unicodeslot=0x04FE, + shcode=0x425, + unicodeslot=0x4FE, }, - [0x04FF]={ + [0x4FF]={ category="ll", description="CYRILLIC SMALL LETTER HA WITH STROKE", direction="l", linebreak="al", - shcode=0x0445, - uccode=0x04FE, - unicodeslot=0x04FF, + shcode=0x445, + uccode=0x4FE, + unicodeslot=0x4FF, }, - [0x0500]={ + [0x500]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI DE", direction="l", - lccode=0x0501, + lccode=0x501, linebreak="al", - unicodeslot=0x0500, + unicodeslot=0x500, }, - [0x0501]={ + [0x501]={ category="ll", description="CYRILLIC SMALL LETTER KOMI DE", direction="l", linebreak="al", - uccode=0x0500, - unicodeslot=0x0501, + uccode=0x500, + unicodeslot=0x501, }, - [0x0502]={ + [0x502]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI DJE", direction="l", - lccode=0x0503, + lccode=0x503, linebreak="al", - unicodeslot=0x0502, + unicodeslot=0x502, }, - [0x0503]={ + [0x503]={ category="ll", description="CYRILLIC SMALL LETTER KOMI DJE", direction="l", linebreak="al", - uccode=0x0502, - unicodeslot=0x0503, + uccode=0x502, + unicodeslot=0x503, }, - [0x0504]={ + [0x504]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI ZJE", direction="l", - lccode=0x0505, + lccode=0x505, linebreak="al", - unicodeslot=0x0504, + unicodeslot=0x504, }, - [0x0505]={ + [0x505]={ category="ll", description="CYRILLIC SMALL LETTER KOMI ZJE", direction="l", linebreak="al", - uccode=0x0504, - unicodeslot=0x0505, + uccode=0x504, + unicodeslot=0x505, }, - [0x0506]={ + [0x506]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI DZJE", direction="l", - lccode=0x0507, + lccode=0x507, linebreak="al", - unicodeslot=0x0506, + unicodeslot=0x506, }, - [0x0507]={ + [0x507]={ category="ll", description="CYRILLIC SMALL LETTER KOMI DZJE", direction="l", linebreak="al", - uccode=0x0506, - unicodeslot=0x0507, + uccode=0x506, + unicodeslot=0x507, }, - [0x0508]={ + [0x508]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI LJE", direction="l", - lccode=0x0509, + lccode=0x509, linebreak="al", - unicodeslot=0x0508, + unicodeslot=0x508, }, - [0x0509]={ + [0x509]={ category="ll", description="CYRILLIC SMALL LETTER KOMI LJE", direction="l", linebreak="al", - uccode=0x0508, - unicodeslot=0x0509, + uccode=0x508, + unicodeslot=0x509, }, - [0x050A]={ + [0x50A]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI NJE", direction="l", - lccode=0x050B, + lccode=0x50B, linebreak="al", - unicodeslot=0x050A, + unicodeslot=0x50A, }, - [0x050B]={ + [0x50B]={ category="ll", description="CYRILLIC SMALL LETTER KOMI NJE", direction="l", linebreak="al", - uccode=0x050A, - unicodeslot=0x050B, + uccode=0x50A, + unicodeslot=0x50B, }, - [0x050C]={ + [0x50C]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI SJE", direction="l", - lccode=0x050D, + lccode=0x50D, linebreak="al", - unicodeslot=0x050C, + unicodeslot=0x50C, }, - [0x050D]={ + [0x50D]={ category="ll", description="CYRILLIC SMALL LETTER KOMI SJE", direction="l", linebreak="al", - uccode=0x050C, - unicodeslot=0x050D, + uccode=0x50C, + unicodeslot=0x50D, }, - [0x050E]={ + [0x50E]={ category="lu", description="CYRILLIC CAPITAL LETTER KOMI TJE", direction="l", - lccode=0x050F, + lccode=0x50F, linebreak="al", - unicodeslot=0x050E, + unicodeslot=0x50E, }, - [0x050F]={ + [0x50F]={ category="ll", description="CYRILLIC SMALL LETTER KOMI TJE", direction="l", linebreak="al", - uccode=0x050E, - unicodeslot=0x050F, + uccode=0x50E, + unicodeslot=0x50F, }, - [0x0510]={ + [0x510]={ category="lu", description="CYRILLIC CAPITAL LETTER REVERSED ZE", direction="l", - lccode=0x0511, + lccode=0x511, linebreak="al", - unicodeslot=0x0510, + unicodeslot=0x510, }, - [0x0511]={ + [0x511]={ category="ll", description="CYRILLIC SMALL LETTER REVERSED ZE", direction="l", linebreak="al", - uccode=0x0510, - unicodeslot=0x0511, + uccode=0x510, + unicodeslot=0x511, }, - [0x0512]={ + [0x512]={ category="lu", description="CYRILLIC CAPITAL LETTER EL WITH HOOK", direction="l", - lccode=0x0513, + lccode=0x513, linebreak="al", - shcode=0x041B, - unicodeslot=0x0512, + shcode=0x41B, + unicodeslot=0x512, }, - [0x0513]={ + [0x513]={ category="ll", description="CYRILLIC SMALL LETTER EL WITH HOOK", direction="l", linebreak="al", - shcode=0x043B, - uccode=0x0512, - unicodeslot=0x0513, + shcode=0x43B, + uccode=0x512, + unicodeslot=0x513, }, - [0x0514]={ + [0x514]={ category="lu", description="CYRILLIC CAPITAL LETTER LHA", direction="l", linebreak="al", - unicodeslot=0x0514, + unicodeslot=0x514, }, - [0x0515]={ + [0x515]={ category="ll", description="CYRILLIC SMALL LETTER LHA", direction="l", linebreak="al", - unicodeslot=0x0515, + unicodeslot=0x515, }, - [0x0516]={ + [0x516]={ category="lu", description="CYRILLIC CAPITAL LETTER RHA", direction="l", linebreak="al", - unicodeslot=0x0516, + unicodeslot=0x516, }, - [0x0517]={ + [0x517]={ category="ll", description="CYRILLIC SMALL LETTER RHA", direction="l", linebreak="al", - unicodeslot=0x0517, + unicodeslot=0x517, }, - [0x0518]={ + [0x518]={ category="lu", description="CYRILLIC CAPITAL LETTER YAE", direction="l", linebreak="al", - unicodeslot=0x0518, + unicodeslot=0x518, }, - [0x0519]={ + [0x519]={ category="ll", description="CYRILLIC SMALL LETTER YAE", direction="l", linebreak="al", - unicodeslot=0x0519, + unicodeslot=0x519, }, - [0x051A]={ + [0x51A]={ category="lu", description="CYRILLIC CAPITAL LETTER QA", direction="l", linebreak="al", - unicodeslot=0x051A, + unicodeslot=0x51A, }, - [0x051B]={ + [0x51B]={ category="ll", description="CYRILLIC SMALL LETTER QA", direction="l", linebreak="al", - unicodeslot=0x051B, + unicodeslot=0x51B, }, - [0x051C]={ + [0x51C]={ category="lu", description="CYRILLIC CAPITAL LETTER WE", direction="l", linebreak="al", - unicodeslot=0x051C, + unicodeslot=0x51C, }, - [0x051D]={ + [0x51D]={ category="ll", description="CYRILLIC SMALL LETTER WE", direction="l", linebreak="al", - unicodeslot=0x051D, + unicodeslot=0x51D, }, - [0x051E]={ + [0x51E]={ category="lu", description="CYRILLIC CAPITAL LETTER ALEUT KA", direction="l", linebreak="al", - unicodeslot=0x051E, + unicodeslot=0x51E, }, - [0x051F]={ + [0x51F]={ category="ll", description="CYRILLIC SMALL LETTER ALEUT KA", direction="l", linebreak="al", - unicodeslot=0x051F, + unicodeslot=0x51F, }, - [0x0520]={ + [0x520]={ category="lu", description="CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK", direction="l", linebreak="al", - unicodeslot=0x0520, + unicodeslot=0x520, }, - [0x0521]={ + [0x521]={ category="ll", description="CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK", direction="l", linebreak="al", - unicodeslot=0x0521, + unicodeslot=0x521, }, - [0x0522]={ + [0x522]={ category="lu", description="CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK", direction="l", linebreak="al", - unicodeslot=0x0522, + unicodeslot=0x522, }, - [0x0523]={ + [0x523]={ category="ll", description="CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK", direction="l", linebreak="al", - unicodeslot=0x0523, + unicodeslot=0x523, }, - [0x0524]={ + [0x524]={ category="lu", description="CYRILLIC CAPITAL LETTER PE WITH DESCENDER", direction="l", linebreak="al", - unicodeslot=0x0524, + unicodeslot=0x524, }, - [0x0525]={ + [0x525]={ category="ll", description="CYRILLIC SMALL LETTER PE WITH DESCENDER", direction="l", linebreak="al", - unicodeslot=0x0525, + unicodeslot=0x525, }, - [0x0526]={ + [0x526]={ category="lu", description="CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER", direction="l", linebreak="al", - unicodeslot=0x0526, + unicodeslot=0x526, }, - [0x0527]={ + [0x527]={ category="ll", description="CYRILLIC SMALL LETTER SHHA WITH DESCENDER", direction="l", linebreak="al", - unicodeslot=0x0527, + unicodeslot=0x527, + }, + [0x528]={ + category="lu", + description="CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x528, + }, + [0x529]={ + category="ll", + description="CYRILLIC SMALL LETTER EN WITH LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x529, + }, + [0x52A]={ + category="lu", + description="CYRILLIC CAPITAL LETTER DZZHE", + direction="l", + linebreak="al", + unicodeslot=0x52A, + }, + [0x52B]={ + category="ll", + description="CYRILLIC SMALL LETTER DZZHE", + direction="l", + linebreak="al", + unicodeslot=0x52B, }, - [0x0531]={ + [0x52C]={ + category="lu", + description="CYRILLIC CAPITAL LETTER DCHE", + direction="l", + linebreak="al", + unicodeslot=0x52C, + }, + [0x52D]={ + category="ll", + description="CYRILLIC SMALL LETTER DCHE", + direction="l", + linebreak="al", + unicodeslot=0x52D, + }, + [0x52E]={ + category="lu", + description="CYRILLIC CAPITAL LETTER EL WITH DESCENDER", + direction="l", + linebreak="al", + unicodeslot=0x52E, + }, + [0x52F]={ + category="ll", + description="CYRILLIC SMALL LETTER EL WITH DESCENDER", + direction="l", + linebreak="al", + unicodeslot=0x52F, + }, + [0x531]={ adobename="Aybarmenian", category="lu", description="ARMENIAN CAPITAL LETTER AYB", direction="l", - lccode=0x0561, + lccode=0x561, linebreak="al", - unicodeslot=0x0531, + unicodeslot=0x531, }, - [0x0532]={ + [0x532]={ adobename="Benarmenian", category="lu", description="ARMENIAN CAPITAL LETTER BEN", direction="l", - lccode=0x0562, + lccode=0x562, linebreak="al", - unicodeslot=0x0532, + unicodeslot=0x532, }, - [0x0533]={ + [0x533]={ adobename="Gimarmenian", category="lu", description="ARMENIAN CAPITAL LETTER GIM", direction="l", - lccode=0x0563, + lccode=0x563, linebreak="al", - unicodeslot=0x0533, + unicodeslot=0x533, }, - [0x0534]={ + [0x534]={ adobename="Daarmenian", category="lu", description="ARMENIAN CAPITAL LETTER DA", direction="l", - lccode=0x0564, + lccode=0x564, linebreak="al", - unicodeslot=0x0534, + unicodeslot=0x534, }, - [0x0535]={ + [0x535]={ adobename="Echarmenian", category="lu", description="ARMENIAN CAPITAL LETTER ECH", direction="l", - lccode=0x0565, + lccode=0x565, linebreak="al", - unicodeslot=0x0535, + unicodeslot=0x535, }, - [0x0536]={ + [0x536]={ adobename="Zaarmenian", category="lu", description="ARMENIAN CAPITAL LETTER ZA", direction="l", - lccode=0x0566, + lccode=0x566, linebreak="al", - unicodeslot=0x0536, + unicodeslot=0x536, }, - [0x0537]={ + [0x537]={ adobename="Eharmenian", category="lu", description="ARMENIAN CAPITAL LETTER EH", direction="l", - lccode=0x0567, + lccode=0x567, linebreak="al", - unicodeslot=0x0537, + unicodeslot=0x537, }, - [0x0538]={ + [0x538]={ adobename="Etarmenian", category="lu", description="ARMENIAN CAPITAL LETTER ET", direction="l", - lccode=0x0568, + lccode=0x568, linebreak="al", - unicodeslot=0x0538, + unicodeslot=0x538, }, - [0x0539]={ + [0x539]={ adobename="Toarmenian", category="lu", description="ARMENIAN CAPITAL LETTER TO", direction="l", - lccode=0x0569, + lccode=0x569, linebreak="al", - unicodeslot=0x0539, + unicodeslot=0x539, }, - [0x053A]={ + [0x53A]={ adobename="Zhearmenian", category="lu", description="ARMENIAN CAPITAL LETTER ZHE", direction="l", - lccode=0x056A, + lccode=0x56A, linebreak="al", - unicodeslot=0x053A, + unicodeslot=0x53A, }, - [0x053B]={ + [0x53B]={ adobename="Iniarmenian", category="lu", description="ARMENIAN CAPITAL LETTER INI", direction="l", - lccode=0x056B, + lccode=0x56B, linebreak="al", - unicodeslot=0x053B, + unicodeslot=0x53B, }, - [0x053C]={ + [0x53C]={ adobename="Liwnarmenian", category="lu", description="ARMENIAN CAPITAL LETTER LIWN", direction="l", - lccode=0x056C, + lccode=0x56C, linebreak="al", - unicodeslot=0x053C, + unicodeslot=0x53C, }, - [0x053D]={ + [0x53D]={ adobename="Xeharmenian", category="lu", description="ARMENIAN CAPITAL LETTER XEH", direction="l", - lccode=0x056D, + lccode=0x56D, linebreak="al", - unicodeslot=0x053D, + unicodeslot=0x53D, }, - [0x053E]={ + [0x53E]={ adobename="Caarmenian", category="lu", description="ARMENIAN CAPITAL LETTER CA", direction="l", - lccode=0x056E, + lccode=0x56E, linebreak="al", - unicodeslot=0x053E, + unicodeslot=0x53E, }, - [0x053F]={ + [0x53F]={ adobename="Kenarmenian", category="lu", description="ARMENIAN CAPITAL LETTER KEN", direction="l", - lccode=0x056F, + lccode=0x56F, linebreak="al", - unicodeslot=0x053F, + unicodeslot=0x53F, }, - [0x0540]={ + [0x540]={ adobename="Hoarmenian", category="lu", description="ARMENIAN CAPITAL LETTER HO", direction="l", - lccode=0x0570, + lccode=0x570, linebreak="al", - unicodeslot=0x0540, + unicodeslot=0x540, }, - [0x0541]={ + [0x541]={ adobename="Jaarmenian", category="lu", description="ARMENIAN CAPITAL LETTER JA", direction="l", - lccode=0x0571, + lccode=0x571, linebreak="al", - unicodeslot=0x0541, + unicodeslot=0x541, }, - [0x0542]={ + [0x542]={ adobename="Ghadarmenian", category="lu", description="ARMENIAN CAPITAL LETTER GHAD", direction="l", - lccode=0x0572, + lccode=0x572, linebreak="al", - unicodeslot=0x0542, + unicodeslot=0x542, }, - [0x0543]={ + [0x543]={ adobename="Cheharmenian", category="lu", description="ARMENIAN CAPITAL LETTER CHEH", direction="l", - lccode=0x0573, + lccode=0x573, linebreak="al", - unicodeslot=0x0543, + unicodeslot=0x543, }, - [0x0544]={ + [0x544]={ adobename="Menarmenian", category="lu", description="ARMENIAN CAPITAL LETTER MEN", direction="l", - lccode=0x0574, + lccode=0x574, linebreak="al", - unicodeslot=0x0544, + unicodeslot=0x544, }, - [0x0545]={ + [0x545]={ adobename="Yiarmenian", category="lu", description="ARMENIAN CAPITAL LETTER YI", direction="l", - lccode=0x0575, + lccode=0x575, linebreak="al", - unicodeslot=0x0545, + unicodeslot=0x545, }, - [0x0546]={ + [0x546]={ adobename="Nowarmenian", category="lu", description="ARMENIAN CAPITAL LETTER NOW", direction="l", - lccode=0x0576, + lccode=0x576, linebreak="al", - unicodeslot=0x0546, + unicodeslot=0x546, }, - [0x0547]={ + [0x547]={ adobename="Shaarmenian", category="lu", description="ARMENIAN CAPITAL LETTER SHA", direction="l", - lccode=0x0577, + lccode=0x577, linebreak="al", - unicodeslot=0x0547, + unicodeslot=0x547, }, - [0x0548]={ + [0x548]={ adobename="Voarmenian", category="lu", description="ARMENIAN CAPITAL LETTER VO", direction="l", - lccode=0x0578, + lccode=0x578, linebreak="al", - unicodeslot=0x0548, + unicodeslot=0x548, }, - [0x0549]={ + [0x549]={ adobename="Chaarmenian", category="lu", description="ARMENIAN CAPITAL LETTER CHA", direction="l", - lccode=0x0579, + lccode=0x579, linebreak="al", - unicodeslot=0x0549, + unicodeslot=0x549, }, - [0x054A]={ + [0x54A]={ adobename="Peharmenian", category="lu", description="ARMENIAN CAPITAL LETTER PEH", direction="l", - lccode=0x057A, + lccode=0x57A, linebreak="al", - unicodeslot=0x054A, + unicodeslot=0x54A, }, - [0x054B]={ + [0x54B]={ adobename="Jheharmenian", category="lu", description="ARMENIAN CAPITAL LETTER JHEH", direction="l", - lccode=0x057B, + lccode=0x57B, linebreak="al", - unicodeslot=0x054B, + unicodeslot=0x54B, }, - [0x054C]={ + [0x54C]={ adobename="Raarmenian", category="lu", description="ARMENIAN CAPITAL LETTER RA", direction="l", - lccode=0x057C, + lccode=0x57C, linebreak="al", - unicodeslot=0x054C, + unicodeslot=0x54C, }, - [0x054D]={ + [0x54D]={ adobename="Seharmenian", category="lu", description="ARMENIAN CAPITAL LETTER SEH", direction="l", - lccode=0x057D, + lccode=0x57D, linebreak="al", - unicodeslot=0x054D, + unicodeslot=0x54D, }, - [0x054E]={ + [0x54E]={ adobename="Vewarmenian", category="lu", description="ARMENIAN CAPITAL LETTER VEW", direction="l", - lccode=0x057E, + lccode=0x57E, linebreak="al", - unicodeslot=0x054E, + unicodeslot=0x54E, }, - [0x054F]={ + [0x54F]={ adobename="Tiwnarmenian", category="lu", description="ARMENIAN CAPITAL LETTER TIWN", direction="l", - lccode=0x057F, + lccode=0x57F, linebreak="al", - unicodeslot=0x054F, + unicodeslot=0x54F, }, - [0x0550]={ + [0x550]={ adobename="Reharmenian", category="lu", description="ARMENIAN CAPITAL LETTER REH", direction="l", - lccode=0x0580, + lccode=0x580, linebreak="al", - unicodeslot=0x0550, + unicodeslot=0x550, }, - [0x0551]={ + [0x551]={ adobename="Coarmenian", category="lu", description="ARMENIAN CAPITAL LETTER CO", direction="l", - lccode=0x0581, + lccode=0x581, linebreak="al", - unicodeslot=0x0551, + unicodeslot=0x551, }, - [0x0552]={ + [0x552]={ adobename="Yiwnarmenian", category="lu", description="ARMENIAN CAPITAL LETTER YIWN", direction="l", - lccode=0x0582, + lccode=0x582, linebreak="al", - unicodeslot=0x0552, + unicodeslot=0x552, }, - [0x0553]={ + [0x553]={ adobename="Piwrarmenian", category="lu", description="ARMENIAN CAPITAL LETTER PIWR", direction="l", - lccode=0x0583, + lccode=0x583, linebreak="al", - unicodeslot=0x0553, + unicodeslot=0x553, }, - [0x0554]={ + [0x554]={ adobename="Keharmenian", category="lu", description="ARMENIAN CAPITAL LETTER KEH", direction="l", - lccode=0x0584, + lccode=0x584, linebreak="al", - unicodeslot=0x0554, + unicodeslot=0x554, }, - [0x0555]={ + [0x555]={ adobename="Oharmenian", category="lu", description="ARMENIAN CAPITAL LETTER OH", direction="l", - lccode=0x0585, + lccode=0x585, linebreak="al", - unicodeslot=0x0555, + unicodeslot=0x555, }, - [0x0556]={ + [0x556]={ adobename="Feharmenian", category="lu", description="ARMENIAN CAPITAL LETTER FEH", direction="l", - lccode=0x0586, + lccode=0x586, linebreak="al", - unicodeslot=0x0556, + unicodeslot=0x556, }, - [0x0559]={ + [0x559]={ adobename="ringhalfleftarmenian", category="lm", description="ARMENIAN MODIFIER LETTER LEFT HALF RING", direction="l", linebreak="al", - unicodeslot=0x0559, + unicodeslot=0x559, }, - [0x055A]={ + [0x55A]={ adobename="apostrophearmenian", category="po", description="ARMENIAN APOSTROPHE", direction="l", linebreak="al", - unicodeslot=0x055A, + unicodeslot=0x55A, }, - [0x055B]={ + [0x55B]={ adobename="emphasismarkarmenian", category="po", description="ARMENIAN EMPHASIS MARK", direction="l", linebreak="al", - unicodeslot=0x055B, + unicodeslot=0x55B, }, - [0x055C]={ + [0x55C]={ adobename="exclamarmenian", category="po", description="ARMENIAN EXCLAMATION MARK", direction="l", linebreak="al", - unicodeslot=0x055C, + unicodeslot=0x55C, }, - [0x055D]={ + [0x55D]={ adobename="commaarmenian", category="po", description="ARMENIAN COMMA", direction="l", linebreak="al", - unicodeslot=0x055D, + unicodeslot=0x55D, }, - [0x055E]={ + [0x55E]={ adobename="questionarmenian", category="po", description="ARMENIAN QUESTION MARK", direction="l", linebreak="al", - unicodeslot=0x055E, + unicodeslot=0x55E, }, - [0x055F]={ + [0x55F]={ adobename="abbreviationmarkarmenian", category="po", description="ARMENIAN ABBREVIATION MARK", direction="l", linebreak="al", - unicodeslot=0x055F, + unicodeslot=0x55F, }, - [0x0561]={ + [0x561]={ adobename="aybarmenian", category="ll", description="ARMENIAN SMALL LETTER AYB", direction="l", linebreak="al", - uccode=0x0531, - unicodeslot=0x0561, + uccode=0x531, + unicodeslot=0x561, }, - [0x0562]={ + [0x562]={ adobename="benarmenian", category="ll", description="ARMENIAN SMALL LETTER BEN", direction="l", linebreak="al", - uccode=0x0532, - unicodeslot=0x0562, + uccode=0x532, + unicodeslot=0x562, }, - [0x0563]={ + [0x563]={ adobename="gimarmenian", category="ll", description="ARMENIAN SMALL LETTER GIM", direction="l", linebreak="al", - uccode=0x0533, - unicodeslot=0x0563, + uccode=0x533, + unicodeslot=0x563, }, - [0x0564]={ + [0x564]={ adobename="daarmenian", category="ll", description="ARMENIAN SMALL LETTER DA", direction="l", linebreak="al", - uccode=0x0534, - unicodeslot=0x0564, + uccode=0x534, + unicodeslot=0x564, }, - [0x0565]={ + [0x565]={ adobename="echarmenian", category="ll", description="ARMENIAN SMALL LETTER ECH", direction="l", linebreak="al", - uccode=0x0535, - unicodeslot=0x0565, + uccode=0x535, + unicodeslot=0x565, }, - [0x0566]={ + [0x566]={ adobename="zaarmenian", category="ll", description="ARMENIAN SMALL LETTER ZA", direction="l", linebreak="al", - uccode=0x0536, - unicodeslot=0x0566, + uccode=0x536, + unicodeslot=0x566, }, - [0x0567]={ + [0x567]={ adobename="eharmenian", category="ll", description="ARMENIAN SMALL LETTER EH", direction="l", linebreak="al", - uccode=0x0537, - unicodeslot=0x0567, + uccode=0x537, + unicodeslot=0x567, }, - [0x0568]={ + [0x568]={ adobename="etarmenian", category="ll", description="ARMENIAN SMALL LETTER ET", direction="l", linebreak="al", - uccode=0x0538, - unicodeslot=0x0568, + uccode=0x538, + unicodeslot=0x568, }, - [0x0569]={ + [0x569]={ adobename="toarmenian", category="ll", description="ARMENIAN SMALL LETTER TO", direction="l", linebreak="al", - uccode=0x0539, - unicodeslot=0x0569, + uccode=0x539, + unicodeslot=0x569, }, - [0x056A]={ + [0x56A]={ adobename="zhearmenian", category="ll", description="ARMENIAN SMALL LETTER ZHE", direction="l", linebreak="al", - uccode=0x053A, - unicodeslot=0x056A, + uccode=0x53A, + unicodeslot=0x56A, }, - [0x056B]={ + [0x56B]={ adobename="iniarmenian", category="ll", description="ARMENIAN SMALL LETTER INI", direction="l", linebreak="al", - uccode=0x053B, - unicodeslot=0x056B, + uccode=0x53B, + unicodeslot=0x56B, }, - [0x056C]={ + [0x56C]={ adobename="liwnarmenian", category="ll", description="ARMENIAN SMALL LETTER LIWN", direction="l", linebreak="al", - uccode=0x053C, - unicodeslot=0x056C, + uccode=0x53C, + unicodeslot=0x56C, }, - [0x056D]={ + [0x56D]={ adobename="xeharmenian", category="ll", description="ARMENIAN SMALL LETTER XEH", direction="l", linebreak="al", - uccode=0x053D, - unicodeslot=0x056D, + uccode=0x53D, + unicodeslot=0x56D, }, - [0x056E]={ + [0x56E]={ adobename="caarmenian", category="ll", description="ARMENIAN SMALL LETTER CA", direction="l", linebreak="al", - uccode=0x053E, - unicodeslot=0x056E, + uccode=0x53E, + unicodeslot=0x56E, }, - [0x056F]={ + [0x56F]={ adobename="kenarmenian", category="ll", description="ARMENIAN SMALL LETTER KEN", direction="l", linebreak="al", - uccode=0x053F, - unicodeslot=0x056F, + uccode=0x53F, + unicodeslot=0x56F, }, - [0x0570]={ + [0x570]={ adobename="hoarmenian", category="ll", description="ARMENIAN SMALL LETTER HO", direction="l", linebreak="al", - uccode=0x0540, - unicodeslot=0x0570, + uccode=0x540, + unicodeslot=0x570, }, - [0x0571]={ + [0x571]={ adobename="jaarmenian", category="ll", description="ARMENIAN SMALL LETTER JA", direction="l", linebreak="al", - uccode=0x0541, - unicodeslot=0x0571, + uccode=0x541, + unicodeslot=0x571, }, - [0x0572]={ + [0x572]={ adobename="ghadarmenian", category="ll", description="ARMENIAN SMALL LETTER GHAD", direction="l", linebreak="al", - uccode=0x0542, - unicodeslot=0x0572, + uccode=0x542, + unicodeslot=0x572, }, - [0x0573]={ + [0x573]={ adobename="cheharmenian", category="ll", description="ARMENIAN SMALL LETTER CHEH", direction="l", linebreak="al", - uccode=0x0543, - unicodeslot=0x0573, + uccode=0x543, + unicodeslot=0x573, }, - [0x0574]={ + [0x574]={ adobename="menarmenian", category="ll", description="ARMENIAN SMALL LETTER MEN", direction="l", linebreak="al", - uccode=0x0544, - unicodeslot=0x0574, + uccode=0x544, + unicodeslot=0x574, }, - [0x0575]={ + [0x575]={ adobename="yiarmenian", category="ll", description="ARMENIAN SMALL LETTER YI", direction="l", linebreak="al", - uccode=0x0545, - unicodeslot=0x0575, + uccode=0x545, + unicodeslot=0x575, }, - [0x0576]={ + [0x576]={ adobename="nowarmenian", category="ll", description="ARMENIAN SMALL LETTER NOW", direction="l", linebreak="al", - uccode=0x0546, - unicodeslot=0x0576, + uccode=0x546, + unicodeslot=0x576, }, - [0x0577]={ + [0x577]={ adobename="shaarmenian", category="ll", description="ARMENIAN SMALL LETTER SHA", direction="l", linebreak="al", - uccode=0x0547, - unicodeslot=0x0577, + uccode=0x547, + unicodeslot=0x577, }, - [0x0578]={ + [0x578]={ adobename="voarmenian", category="ll", description="ARMENIAN SMALL LETTER VO", direction="l", linebreak="al", - uccode=0x0548, - unicodeslot=0x0578, + uccode=0x548, + unicodeslot=0x578, }, - [0x0579]={ + [0x579]={ adobename="chaarmenian", category="ll", description="ARMENIAN SMALL LETTER CHA", direction="l", linebreak="al", - uccode=0x0549, - unicodeslot=0x0579, + uccode=0x549, + unicodeslot=0x579, }, - [0x057A]={ + [0x57A]={ adobename="peharmenian", category="ll", description="ARMENIAN SMALL LETTER PEH", direction="l", linebreak="al", - uccode=0x054A, - unicodeslot=0x057A, + uccode=0x54A, + unicodeslot=0x57A, }, - [0x057B]={ + [0x57B]={ adobename="jheharmenian", category="ll", description="ARMENIAN SMALL LETTER JHEH", direction="l", linebreak="al", - uccode=0x054B, - unicodeslot=0x057B, + uccode=0x54B, + unicodeslot=0x57B, }, - [0x057C]={ + [0x57C]={ adobename="raarmenian", category="ll", description="ARMENIAN SMALL LETTER RA", direction="l", linebreak="al", - uccode=0x054C, - unicodeslot=0x057C, + uccode=0x54C, + unicodeslot=0x57C, }, - [0x057D]={ + [0x57D]={ adobename="seharmenian", category="ll", description="ARMENIAN SMALL LETTER SEH", direction="l", linebreak="al", - uccode=0x054D, - unicodeslot=0x057D, + uccode=0x54D, + unicodeslot=0x57D, }, - [0x057E]={ + [0x57E]={ adobename="vewarmenian", category="ll", description="ARMENIAN SMALL LETTER VEW", direction="l", linebreak="al", - uccode=0x054E, - unicodeslot=0x057E, + uccode=0x54E, + unicodeslot=0x57E, }, - [0x057F]={ + [0x57F]={ adobename="tiwnarmenian", category="ll", description="ARMENIAN SMALL LETTER TIWN", direction="l", linebreak="al", - uccode=0x054F, - unicodeslot=0x057F, + uccode=0x54F, + unicodeslot=0x57F, }, - [0x0580]={ + [0x580]={ adobename="reharmenian", category="ll", description="ARMENIAN SMALL LETTER REH", direction="l", linebreak="al", - uccode=0x0550, - unicodeslot=0x0580, + uccode=0x550, + unicodeslot=0x580, }, - [0x0581]={ + [0x581]={ adobename="coarmenian", category="ll", description="ARMENIAN SMALL LETTER CO", direction="l", linebreak="al", - uccode=0x0551, - unicodeslot=0x0581, + uccode=0x551, + unicodeslot=0x581, }, - [0x0582]={ + [0x582]={ adobename="yiwnarmenian", category="ll", description="ARMENIAN SMALL LETTER YIWN", direction="l", linebreak="al", - uccode=0x0552, - unicodeslot=0x0582, + uccode=0x552, + unicodeslot=0x582, }, - [0x0583]={ + [0x583]={ adobename="piwrarmenian", category="ll", description="ARMENIAN SMALL LETTER PIWR", direction="l", linebreak="al", - uccode=0x0553, - unicodeslot=0x0583, + uccode=0x553, + unicodeslot=0x583, }, - [0x0584]={ + [0x584]={ adobename="keharmenian", category="ll", description="ARMENIAN SMALL LETTER KEH", direction="l", linebreak="al", - uccode=0x0554, - unicodeslot=0x0584, + uccode=0x554, + unicodeslot=0x584, }, - [0x0585]={ + [0x585]={ adobename="oharmenian", category="ll", description="ARMENIAN SMALL LETTER OH", direction="l", linebreak="al", - uccode=0x0555, - unicodeslot=0x0585, + uccode=0x555, + unicodeslot=0x585, }, - [0x0586]={ + [0x586]={ adobename="feharmenian", category="ll", description="ARMENIAN SMALL LETTER FEH", direction="l", linebreak="al", - uccode=0x0556, - unicodeslot=0x0586, + uccode=0x556, + unicodeslot=0x586, }, - [0x0587]={ + [0x587]={ adobename="echyiwnarmenian", category="ll", description="ARMENIAN SMALL LIGATURE ECH YIWN", direction="l", linebreak="al", - specials={ "compat", 0x0565, 0x0582 }, - unicodeslot=0x0587, + specials={ "compat", 0x565, 0x582 }, + unicodeslot=0x587, }, - [0x0589]={ + [0x589]={ adobename="periodarmenian", category="po", description="ARMENIAN FULL STOP", direction="l", linebreak="is", - unicodeslot=0x0589, + unicodeslot=0x589, }, - [0x058A]={ + [0x58A]={ category="pd", description="ARMENIAN HYPHEN", direction="on", linebreak="ba", - unicodeslot=0x058A, + unicodeslot=0x58A, + }, + [0x58D]={ + category="so", + description="RIGHT-FACING ARMENIAN ETERNITY SIGN", + direction="on", + linebreak="al", + unicodeslot=0x58D, }, - [0x058F]={ + [0x58E]={ + category="so", + description="LEFT-FACING ARMENIAN ETERNITY SIGN", + direction="on", + linebreak="al", + unicodeslot=0x58E, + }, + [0x58F]={ category="sc", description="ARMENIAN DRAM SIGN", direction="et", linebreak="pr", - unicodeslot=0x058F, + unicodeslot=0x58F, }, - [0x0591]={ + [0x591]={ adobename="etnahtalefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT ETNAHTA", direction="nsm", linebreak="cm", - unicodeslot=0x0591, + unicodeslot=0x591, }, - [0x0592]={ + [0x592]={ adobename="segoltahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT SEGOL", direction="nsm", linebreak="cm", - unicodeslot=0x0592, + unicodeslot=0x592, }, - [0x0593]={ + [0x593]={ adobename="shalshelethebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT SHALSHELET", direction="nsm", linebreak="cm", - unicodeslot=0x0593, + unicodeslot=0x593, }, - [0x0594]={ + [0x594]={ adobename="zaqefqatanhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT ZAQEF QATAN", direction="nsm", linebreak="cm", - unicodeslot=0x0594, + unicodeslot=0x594, }, - [0x0595]={ + [0x595]={ adobename="zaqefgadolhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT ZAQEF GADOL", direction="nsm", linebreak="cm", - unicodeslot=0x0595, + unicodeslot=0x595, }, - [0x0596]={ + [0x596]={ adobename="tipehalefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT TIPEHA", direction="nsm", linebreak="cm", - unicodeslot=0x0596, + unicodeslot=0x596, }, - [0x0597]={ + [0x597]={ adobename="reviamugrashhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT REVIA", direction="nsm", linebreak="cm", - unicodeslot=0x0597, + unicodeslot=0x597, }, - [0x0598]={ + [0x598]={ adobename="zarqahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT ZARQA", direction="nsm", linebreak="cm", - unicodeslot=0x0598, + unicodeslot=0x598, }, - [0x0599]={ + [0x599]={ adobename="pashtahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT PASHTA", direction="nsm", linebreak="cm", - unicodeslot=0x0599, + unicodeslot=0x599, }, - [0x059A]={ + [0x59A]={ adobename="yetivhebrew", category="mn", + combining=0xDE, description="HEBREW ACCENT YETIV", direction="nsm", linebreak="cm", - unicodeslot=0x059A, + unicodeslot=0x59A, }, - [0x059B]={ + [0x59B]={ adobename="tevirlefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT TEVIR", direction="nsm", linebreak="cm", - unicodeslot=0x059B, + unicodeslot=0x59B, }, - [0x059C]={ + [0x59C]={ adobename="gereshaccenthebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT GERESH", direction="nsm", linebreak="cm", - unicodeslot=0x059C, + unicodeslot=0x59C, }, - [0x059D]={ + [0x59D]={ adobename="gereshmuqdamhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT GERESH MUQDAM", direction="nsm", linebreak="cm", - unicodeslot=0x059D, + unicodeslot=0x59D, }, - [0x059E]={ + [0x59E]={ adobename="gershayimaccenthebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT GERSHAYIM", direction="nsm", linebreak="cm", - unicodeslot=0x059E, + unicodeslot=0x59E, }, - [0x059F]={ + [0x59F]={ adobename="qarneyparahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT QARNEY PARA", direction="nsm", linebreak="cm", - unicodeslot=0x059F, + unicodeslot=0x59F, }, - [0x05A0]={ + [0x5A0]={ adobename="telishagedolahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT TELISHA GEDOLA", direction="nsm", linebreak="cm", - unicodeslot=0x05A0, + unicodeslot=0x5A0, }, - [0x05A1]={ + [0x5A1]={ adobename="pazerhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT PAZER", direction="nsm", linebreak="cm", - unicodeslot=0x05A1, + unicodeslot=0x5A1, }, - [0x05A2]={ + [0x5A2]={ category="mn", + combining=0xDC, description="HEBREW ACCENT ATNAH HAFUKH", direction="nsm", linebreak="cm", - unicodeslot=0x05A2, + unicodeslot=0x5A2, }, - [0x05A3]={ + [0x5A3]={ adobename="munahlefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT MUNAH", direction="nsm", linebreak="cm", - unicodeslot=0x05A3, + unicodeslot=0x5A3, }, - [0x05A4]={ + [0x5A4]={ adobename="mahapakhlefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT MAHAPAKH", direction="nsm", linebreak="cm", - unicodeslot=0x05A4, + unicodeslot=0x5A4, }, - [0x05A5]={ + [0x5A5]={ adobename="merkhalefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT MERKHA", direction="nsm", linebreak="cm", - unicodeslot=0x05A5, + unicodeslot=0x5A5, }, - [0x05A6]={ + [0x5A6]={ adobename="merkhakefulalefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT MERKHA KEFULA", direction="nsm", linebreak="cm", - unicodeslot=0x05A6, + unicodeslot=0x5A6, }, - [0x05A7]={ + [0x5A7]={ adobename="dargalefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT DARGA", direction="nsm", linebreak="cm", - unicodeslot=0x05A7, + unicodeslot=0x5A7, }, - [0x05A8]={ + [0x5A8]={ adobename="qadmahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT QADMA", direction="nsm", linebreak="cm", - unicodeslot=0x05A8, + unicodeslot=0x5A8, }, - [0x05A9]={ + [0x5A9]={ adobename="telishaqetanahebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT TELISHA QETANA", direction="nsm", linebreak="cm", - unicodeslot=0x05A9, + unicodeslot=0x5A9, }, - [0x05AA]={ + [0x5AA]={ adobename="yerahbenyomolefthebrew", category="mn", + combining=0xDC, description="HEBREW ACCENT YERAH BEN YOMO", direction="nsm", linebreak="cm", - unicodeslot=0x05AA, + unicodeslot=0x5AA, }, - [0x05AB]={ + [0x5AB]={ adobename="olehebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT OLE", direction="nsm", linebreak="cm", - unicodeslot=0x05AB, + unicodeslot=0x5AB, }, - [0x05AC]={ + [0x5AC]={ adobename="iluyhebrew", category="mn", + combining=0xE6, description="HEBREW ACCENT ILUY", direction="nsm", linebreak="cm", - unicodeslot=0x05AC, + unicodeslot=0x5AC, }, - [0x05AD]={ + [0x5AD]={ adobename="dehihebrew", category="mn", + combining=0xDE, description="HEBREW ACCENT DEHI", direction="nsm", linebreak="cm", - unicodeslot=0x05AD, + unicodeslot=0x5AD, }, - [0x05AE]={ + [0x5AE]={ adobename="zinorhebrew", category="mn", + combining=0xE4, description="HEBREW ACCENT ZINOR", direction="nsm", linebreak="cm", - unicodeslot=0x05AE, + unicodeslot=0x5AE, }, - [0x05AF]={ + [0x5AF]={ adobename="masoracirclehebrew", category="mn", + combining=0xE6, description="HEBREW MARK MASORA CIRCLE", direction="nsm", linebreak="cm", - unicodeslot=0x05AF, + unicodeslot=0x5AF, }, - [0x05B0]={ + [0x5B0]={ adobename="shevawidehebrew", category="mn", + combining=0xA, description="HEBREW POINT SHEVA", direction="nsm", linebreak="cm", - unicodeslot=0x05B0, + unicodeslot=0x5B0, }, - [0x05B1]={ + [0x5B1]={ adobename="hatafsegolwidehebrew", category="mn", + combining=0xB, description="HEBREW POINT HATAF SEGOL", direction="nsm", linebreak="cm", - unicodeslot=0x05B1, + unicodeslot=0x5B1, }, - [0x05B2]={ + [0x5B2]={ adobename="hatafpatahwidehebrew", category="mn", + combining=0xC, description="HEBREW POINT HATAF PATAH", direction="nsm", linebreak="cm", - unicodeslot=0x05B2, + unicodeslot=0x5B2, }, - [0x05B3]={ + [0x5B3]={ adobename="hatafqamatswidehebrew", category="mn", + combining=0xD, description="HEBREW POINT HATAF QAMATS", direction="nsm", linebreak="cm", - unicodeslot=0x05B3, + unicodeslot=0x5B3, }, - [0x05B4]={ + [0x5B4]={ adobename="hiriqwidehebrew", category="mn", + combining=0xE, description="HEBREW POINT HIRIQ", direction="nsm", linebreak="cm", - unicodeslot=0x05B4, + unicodeslot=0x5B4, }, - [0x05B5]={ + [0x5B5]={ adobename="tserewidehebrew", category="mn", + combining=0xF, description="HEBREW POINT TSERE", direction="nsm", linebreak="cm", - unicodeslot=0x05B5, + unicodeslot=0x5B5, }, - [0x05B6]={ + [0x5B6]={ adobename="segolwidehebrew", category="mn", + combining=0x10, description="HEBREW POINT SEGOL", direction="nsm", linebreak="cm", - unicodeslot=0x05B6, + unicodeslot=0x5B6, }, - [0x05B7]={ + [0x5B7]={ adobename="patahwidehebrew", category="mn", + combining=0x11, description="HEBREW POINT PATAH", direction="nsm", linebreak="cm", - unicodeslot=0x05B7, + unicodeslot=0x5B7, }, - [0x05B8]={ + [0x5B8]={ adobename="qamatswidehebrew", category="mn", + combining=0x12, description="HEBREW POINT QAMATS", direction="nsm", linebreak="cm", - unicodeslot=0x05B8, + unicodeslot=0x5B8, }, - [0x05B9]={ + [0x5B9]={ adobename="holamwidehebrew", category="mn", + combining=0x13, description="HEBREW POINT HOLAM", direction="nsm", linebreak="cm", - unicodeslot=0x05B9, + unicodeslot=0x5B9, }, - [0x05BA]={ + [0x5BA]={ category="mn", + combining=0x13, description="HEBREW POINT HOLAM HASER FOR VAV", direction="nsm", linebreak="cm", - unicodeslot=0x05BA, + unicodeslot=0x5BA, }, - [0x05BB]={ + [0x5BB]={ adobename="qubutswidehebrew", category="mn", + combining=0x14, description="HEBREW POINT QUBUTS", direction="nsm", linebreak="cm", - unicodeslot=0x05BB, + unicodeslot=0x5BB, }, - [0x05BC]={ + [0x5BC]={ adobename="dageshhebrew", category="mn", + combining=0x15, description="HEBREW POINT DAGESH OR MAPIQ", direction="nsm", linebreak="cm", - unicodeslot=0x05BC, + unicodeslot=0x5BC, }, - [0x05BD]={ + [0x5BD]={ adobename="siluqlefthebrew", category="mn", + combining=0x16, description="HEBREW POINT METEG", direction="nsm", linebreak="cm", - unicodeslot=0x05BD, + unicodeslot=0x5BD, }, - [0x05BE]={ + [0x5BE]={ adobename="maqafhebrew", category="po", description="HEBREW PUNCTUATION MAQAF", direction="r", linebreak="ba", - unicodeslot=0x05BE, + unicodeslot=0x5BE, }, - [0x05BF]={ + [0x5BF]={ adobename="rafehebrew", category="mn", + combining=0x17, description="HEBREW POINT RAFE", direction="nsm", linebreak="cm", - unicodeslot=0x05BF, + unicodeslot=0x5BF, }, - [0x05C0]={ + [0x5C0]={ adobename="paseqhebrew", category="po", description="HEBREW PUNCTUATION PASEQ", direction="r", linebreak="al", - unicodeslot=0x05C0, + unicodeslot=0x5C0, }, - [0x05C1]={ + [0x5C1]={ adobename="shindothebrew", category="mn", + combining=0x18, description="HEBREW POINT SHIN DOT", direction="nsm", linebreak="cm", - unicodeslot=0x05C1, + unicodeslot=0x5C1, }, - [0x05C2]={ + [0x5C2]={ adobename="sindothebrew", category="mn", + combining=0x19, description="HEBREW POINT SIN DOT", direction="nsm", linebreak="cm", - unicodeslot=0x05C2, + unicodeslot=0x5C2, }, - [0x05C3]={ + [0x5C3]={ adobename="sofpasuqhebrew", category="po", description="HEBREW PUNCTUATION SOF PASUQ", direction="r", linebreak="al", - unicodeslot=0x05C3, + unicodeslot=0x5C3, }, - [0x05C4]={ + [0x5C4]={ adobename="upperdothebrew", category="mn", + combining=0xE6, description="HEBREW MARK UPPER DOT", direction="nsm", linebreak="cm", - unicodeslot=0x05C4, + unicodeslot=0x5C4, }, - [0x05C5]={ + [0x5C5]={ category="mn", + combining=0xDC, description="HEBREW MARK LOWER DOT", direction="nsm", linebreak="cm", - unicodeslot=0x05C5, + unicodeslot=0x5C5, }, - [0x05C6]={ + [0x5C6]={ category="po", description="HEBREW PUNCTUATION NUN HAFUKHA", direction="r", linebreak="ex", - unicodeslot=0x05C6, + unicodeslot=0x5C6, }, - [0x05C7]={ + [0x5C7]={ category="mn", + combining=0x12, description="HEBREW POINT QAMATS QATAN", direction="nsm", linebreak="cm", - unicodeslot=0x05C7, + unicodeslot=0x5C7, }, - [0x05D0]={ + [0x5D0]={ adobename="alefhebrew", category="lo", contextname="hebrewAlef", description="HEBREW LETTER ALEF", direction="r", linebreak="hl", - unicodeslot=0x05D0, + unicodeslot=0x5D0, }, - [0x05D1]={ + [0x5D1]={ adobename="bethebrew", category="lo", contextname="hebrewBet", description="HEBREW LETTER BET", direction="r", linebreak="hl", - unicodeslot=0x05D1, + unicodeslot=0x5D1, }, - [0x05D2]={ + [0x5D2]={ adobename="gimelhebrew", category="lo", contextname="hebrewGimel", description="HEBREW LETTER GIMEL", direction="r", linebreak="hl", - unicodeslot=0x05D2, + unicodeslot=0x5D2, }, - [0x05D3]={ + [0x5D3]={ adobename="dalettserehebrew", category="lo", contextname="hebrewDalet", description="HEBREW LETTER DALET", direction="r", linebreak="hl", - unicodeslot=0x05D3, + unicodeslot=0x5D3, }, - [0x05D4]={ + [0x5D4]={ adobename="hehebrew", category="lo", contextname="hebrewHe", description="HEBREW LETTER HE", direction="r", linebreak="hl", - unicodeslot=0x05D4, + unicodeslot=0x5D4, }, - [0x05D5]={ + [0x5D5]={ adobename="vavhebrew", category="lo", contextname="hebrewVav", description="HEBREW LETTER VAV", direction="r", linebreak="hl", - unicodeslot=0x05D5, + unicodeslot=0x5D5, }, - [0x05D6]={ + [0x5D6]={ adobename="zayinhebrew", category="lo", contextname="hebrewZayin", description="HEBREW LETTER ZAYIN", direction="r", linebreak="hl", - unicodeslot=0x05D6, + unicodeslot=0x5D6, }, - [0x05D7]={ + [0x5D7]={ adobename="hethebrew", category="lo", contextname="hebrewHet", description="HEBREW LETTER HET", direction="r", linebreak="hl", - unicodeslot=0x05D7, + unicodeslot=0x5D7, }, - [0x05D8]={ + [0x5D8]={ adobename="tethebrew", category="lo", contextname="hebrewTet", description="HEBREW LETTER TET", direction="r", linebreak="hl", - unicodeslot=0x05D8, + unicodeslot=0x5D8, }, - [0x05D9]={ + [0x5D9]={ adobename="yodhebrew", category="lo", contextname="hebrewYod", description="HEBREW LETTER YOD", direction="r", linebreak="hl", - unicodeslot=0x05D9, + unicodeslot=0x5D9, }, - [0x05DA]={ + [0x5DA]={ adobename="finalkafshevahebrew", category="lo", contextname="hebrewKaffinal", description="HEBREW LETTER FINAL KAF", direction="r", linebreak="hl", - unicodeslot=0x05DA, + unicodeslot=0x5DA, }, - [0x05DB]={ + [0x5DB]={ adobename="kafhebrew", category="lo", contextname="hebrewKaf", description="HEBREW LETTER KAF", direction="r", linebreak="hl", - unicodeslot=0x05DB, + unicodeslot=0x5DB, }, - [0x05DC]={ + [0x5DC]={ adobename="lamedholamhebrew", category="lo", contextname="hebrewLamed", description="HEBREW LETTER LAMED", direction="r", linebreak="hl", - unicodeslot=0x05DC, + unicodeslot=0x5DC, }, - [0x05DD]={ + [0x5DD]={ adobename="finalmemhebrew", category="lo", contextname="hebrewMemfinal", description="HEBREW LETTER FINAL MEM", direction="r", linebreak="hl", - unicodeslot=0x05DD, + unicodeslot=0x5DD, }, - [0x05DE]={ + [0x5DE]={ adobename="memhebrew", category="lo", contextname="hebrewMem", description="HEBREW LETTER MEM", direction="r", linebreak="hl", - unicodeslot=0x05DE, + unicodeslot=0x5DE, }, - [0x05DF]={ + [0x5DF]={ adobename="finalnunhebrew", category="lo", contextname="hebrewNunfinal", description="HEBREW LETTER FINAL NUN", direction="r", linebreak="hl", - unicodeslot=0x05DF, + unicodeslot=0x5DF, }, - [0x05E0]={ + [0x5E0]={ adobename="nunhebrew", category="lo", contextname="hebrewNun", description="HEBREW LETTER NUN", direction="r", linebreak="hl", - unicodeslot=0x05E0, + unicodeslot=0x5E0, }, - [0x05E1]={ + [0x5E1]={ adobename="samekhhebrew", category="lo", contextname="hebrewSamekh", description="HEBREW LETTER SAMEKH", direction="r", linebreak="hl", - unicodeslot=0x05E1, + unicodeslot=0x5E1, }, - [0x05E2]={ + [0x5E2]={ adobename="ayinhebrew", category="lo", contextname="hebrewAyin", description="HEBREW LETTER AYIN", direction="r", linebreak="hl", - unicodeslot=0x05E2, + unicodeslot=0x5E2, }, - [0x05E3]={ + [0x5E3]={ adobename="finalpehebrew", category="lo", contextname="hebrewPefinal", description="HEBREW LETTER FINAL PE", direction="r", linebreak="hl", - unicodeslot=0x05E3, + unicodeslot=0x5E3, }, - [0x05E4]={ + [0x5E4]={ adobename="pehebrew", category="lo", contextname="hebrewPe", description="HEBREW LETTER PE", direction="r", linebreak="hl", - unicodeslot=0x05E4, + unicodeslot=0x5E4, }, - [0x05E5]={ + [0x5E5]={ adobename="finaltsadihebrew", category="lo", contextname="hebrewTsadifinal", description="HEBREW LETTER FINAL TSADI", direction="r", linebreak="hl", - unicodeslot=0x05E5, + unicodeslot=0x5E5, }, - [0x05E6]={ + [0x5E6]={ adobename="tsadihebrew", category="lo", contextname="hebrewTsadi", description="HEBREW LETTER TSADI", direction="r", linebreak="hl", - unicodeslot=0x05E6, + unicodeslot=0x5E6, }, - [0x05E7]={ + [0x5E7]={ adobename="qoftserehebrew", category="lo", contextname="hebrewQof", description="HEBREW LETTER QOF", direction="r", linebreak="hl", - unicodeslot=0x05E7, + unicodeslot=0x5E7, }, - [0x05E8]={ + [0x5E8]={ adobename="reshtserehebrew", category="lo", contextname="hebrewResh", description="HEBREW LETTER RESH", direction="r", linebreak="hl", - unicodeslot=0x05E8, + unicodeslot=0x5E8, }, - [0x05E9]={ + [0x5E9]={ adobename="shinhebrew", category="lo", contextname="hebrewShin", description="HEBREW LETTER SHIN", direction="r", linebreak="hl", - unicodeslot=0x05E9, + unicodeslot=0x5E9, }, - [0x05EA]={ + [0x5EA]={ adobename="tavhebrew", category="lo", contextname="hebrewTav", description="HEBREW LETTER TAV", direction="r", linebreak="hl", - unicodeslot=0x05EA, + unicodeslot=0x5EA, }, - [0x05F0]={ + [0x5F0]={ adobename="vavvavhebrew", category="lo", description="HEBREW LIGATURE YIDDISH DOUBLE VAV", direction="r", linebreak="hl", - unicodeslot=0x05F0, + unicodeslot=0x5F0, }, - [0x05F1]={ + [0x5F1]={ adobename="vavyodhebrew", category="lo", description="HEBREW LIGATURE YIDDISH VAV YOD", direction="r", linebreak="hl", - unicodeslot=0x05F1, + unicodeslot=0x5F1, }, - [0x05F2]={ + [0x5F2]={ adobename="yodyodhebrew", category="lo", description="HEBREW LIGATURE YIDDISH DOUBLE YOD", direction="r", linebreak="hl", - unicodeslot=0x05F2, + unicodeslot=0x5F2, }, - [0x05F3]={ + [0x5F3]={ adobename="gereshhebrew", category="po", description="HEBREW PUNCTUATION GERESH", direction="r", linebreak="al", - unicodeslot=0x05F3, + unicodeslot=0x5F3, }, - [0x05F4]={ + [0x5F4]={ adobename="gershayimhebrew", category="po", description="HEBREW PUNCTUATION GERSHAYIM", direction="r", linebreak="al", - unicodeslot=0x05F4, + unicodeslot=0x5F4, }, - [0x0600]={ + [0x600]={ arabic="u", category="cf", description="ARABIC NUMBER SIGN", direction="an", linebreak="al", - unicodeslot=0x0600, + unicodeslot=0x600, visible="yes", }, - [0x0601]={ + [0x601]={ arabic="u", category="cf", description="ARABIC SIGN SANAH", direction="an", linebreak="al", - unicodeslot=0x0601, + unicodeslot=0x601, visible="yes", }, - [0x0602]={ + [0x602]={ arabic="u", category="cf", description="ARABIC FOOTNOTE MARKER", direction="an", linebreak="al", - unicodeslot=0x0602, + unicodeslot=0x602, visible="yes", }, - [0x0603]={ + [0x603]={ arabic="u", category="cf", description="ARABIC SIGN SAFHA", direction="an", linebreak="al", - unicodeslot=0x0603, + unicodeslot=0x603, visible="yes", }, - [0x0604]={ + [0x604]={ arabic="u", category="cf", description="ARABIC SIGN SAMVAT", direction="an", linebreak="al", - unicodeslot=0x0604, + unicodeslot=0x604, }, - [0x0606]={ + [0x605]={ + arabic="u", + category="cf", + description="ARABIC NUMBER MARK ABOVE", + direction="an", + linebreak="al", + unicodeslot=0x605, + }, + [0x606]={ category="sm", description="ARABIC-INDIC CUBE ROOT", direction="on", linebreak="al", - unicodeslot=0x0606, + unicodeslot=0x606, }, - [0x0607]={ + [0x607]={ category="sm", description="ARABIC-INDIC FOURTH ROOT", direction="on", linebreak="al", - unicodeslot=0x0607, + unicodeslot=0x607, }, - [0x0608]={ + [0x608]={ arabic="u", category="sm", description="ARABIC RAY", direction="al", linebreak="al", - unicodeslot=0x0608, + unicodeslot=0x608, }, - [0x0609]={ + [0x609]={ category="po", description="ARABIC-INDIC PER MILLE SIGN", direction="et", linebreak="po", - unicodeslot=0x0609, + unicodeslot=0x609, }, - [0x060A]={ + [0x60A]={ category="po", description="ARABIC-INDIC PER TEN THOUSAND SIGN", direction="et", linebreak="po", - unicodeslot=0x060A, + unicodeslot=0x60A, }, - [0x060B]={ + [0x60B]={ arabic="u", category="sc", description="AFGHANI SIGN", direction="al", linebreak="po", - unicodeslot=0x060B, + unicodeslot=0x60B, }, - [0x060C]={ + [0x60C]={ adobename="commaarabic", category="po", description="ARABIC COMMA", direction="cs", linebreak="is", - unicodeslot=0x060C, + unicodeslot=0x60C, }, - [0x060D]={ + [0x60D]={ category="po", description="ARABIC DATE SEPARATOR", direction="al", linebreak="is", - unicodeslot=0x060D, + unicodeslot=0x60D, }, - [0x060E]={ + [0x60E]={ category="so", description="ARABIC POETIC VERSE SIGN", direction="on", linebreak="al", - unicodeslot=0x060E, + unicodeslot=0x60E, }, - [0x060F]={ + [0x60F]={ category="so", description="ARABIC SIGN MISRA", direction="on", linebreak="al", - unicodeslot=0x060F, + unicodeslot=0x60F, }, - [0x0610]={ + [0x610]={ category="mn", + combining=0xE6, description="ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM", direction="nsm", linebreak="cm", - unicodeslot=0x0610, + unicodeslot=0x610, }, - [0x0611]={ + [0x611]={ category="mn", + combining=0xE6, description="ARABIC SIGN ALAYHE ASSALLAM", direction="nsm", linebreak="cm", - unicodeslot=0x0611, + unicodeslot=0x611, }, - [0x0612]={ + [0x612]={ category="mn", + combining=0xE6, description="ARABIC SIGN RAHMATULLAH ALAYHE", direction="nsm", linebreak="cm", - unicodeslot=0x0612, + unicodeslot=0x612, }, - [0x0613]={ + [0x613]={ category="mn", + combining=0xE6, description="ARABIC SIGN RADI ALLAHOU ANHU", direction="nsm", linebreak="cm", - unicodeslot=0x0613, + unicodeslot=0x613, }, - [0x0614]={ + [0x614]={ category="mn", + combining=0xE6, description="ARABIC SIGN TAKHALLUS", direction="nsm", linebreak="cm", - unicodeslot=0x0614, + unicodeslot=0x614, }, - [0x0615]={ + [0x615]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH TAH", direction="nsm", linebreak="cm", - unicodeslot=0x0615, + unicodeslot=0x615, }, - [0x0616]={ + [0x616]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH", direction="nsm", linebreak="cm", - unicodeslot=0x0616, + unicodeslot=0x616, }, - [0x0617]={ + [0x617]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH ZAIN", direction="nsm", linebreak="cm", - unicodeslot=0x0617, + unicodeslot=0x617, }, - [0x0618]={ + [0x618]={ category="mn", + combining=0x1E, description="ARABIC SMALL FATHA", direction="nsm", linebreak="cm", - unicodeslot=0x0618, + unicodeslot=0x618, }, - [0x0619]={ + [0x619]={ category="mn", + combining=0x1F, description="ARABIC SMALL DAMMA", direction="nsm", linebreak="cm", - unicodeslot=0x0619, + unicodeslot=0x619, }, - [0x061A]={ + [0x61A]={ category="mn", + combining=0x20, description="ARABIC SMALL KASRA", direction="nsm", linebreak="cm", - unicodeslot=0x061A, + unicodeslot=0x61A, }, - [0x061B]={ + [0x61B]={ adobename="semicolonarabic", category="po", description="ARABIC SEMICOLON", direction="al", linebreak="ex", - unicodeslot=0x061B, + unicodeslot=0x61B, + }, + [0x61C]={ + category="cf", + description="ARABIC LETTER MARK", + direction="al", + linebreak="cm", + unicodeslot=0x61C, }, - [0x061E]={ + [0x61E]={ category="po", description="ARABIC TRIPLE DOT PUNCTUATION MARK", direction="al", linebreak="ex", - unicodeslot=0x061E, + unicodeslot=0x61E, }, - [0x061F]={ + [0x61F]={ adobename="questionarabic", category="po", description="ARABIC QUESTION MARK", direction="al", linebreak="ex", - unicodeslot=0x061F, + unicodeslot=0x61F, }, - [0x0620]={ + [0x620]={ arabic="d", category="lo", description="ARABIC LETTER KASHMIRI YEH", direction="al", linebreak="al", - unicodeslot=0x0620, + unicodeslot=0x620, }, - [0x0621]={ + [0x621]={ adobename="hamzasukunarabic", arabic="u", category="lo", description="ARABIC LETTER HAMZA", direction="al", linebreak="al", - unicodeslot=0x0621, + unicodeslot=0x621, }, - [0x0622]={ + [0x622]={ adobename="alefmaddaabovearabic", arabic="r", category="lo", description="ARABIC LETTER ALEF WITH MADDA ABOVE", direction="al", linebreak="al", - shcode=0x0627, - specials={ "char", 0x0627, 0x0653 }, - unicodeslot=0x0622, + shcode=0x627, + specials={ "char", 0x627, 0x653 }, + unicodeslot=0x622, }, - [0x0623]={ + [0x623]={ adobename="alefhamzaabovearabic", arabic="r", category="lo", description="ARABIC LETTER ALEF WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x0627, - specials={ "char", 0x0627, 0x0654 }, - unicodeslot=0x0623, + shcode=0x627, + specials={ "char", 0x627, 0x654 }, + unicodeslot=0x623, }, - [0x0624]={ + [0x624]={ adobename="wawhamzaabovearabic", arabic="r", category="lo", description="ARABIC LETTER WAW WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x0648, - specials={ "char", 0x0648, 0x0654 }, - unicodeslot=0x0624, + shcode=0x648, + specials={ "char", 0x648, 0x654 }, + unicodeslot=0x624, }, - [0x0625]={ + [0x625]={ adobename="alefhamzabelowarabic", arabic="r", category="lo", description="ARABIC LETTER ALEF WITH HAMZA BELOW", direction="al", linebreak="al", - shcode=0x0627, - specials={ "char", 0x0627, 0x0655 }, - unicodeslot=0x0625, + shcode=0x627, + specials={ "char", 0x627, 0x655 }, + unicodeslot=0x625, }, - [0x0626]={ + [0x626]={ adobename="yehhamzaabovearabic", arabic="d", category="lo", description="ARABIC LETTER YEH WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x064A, - specials={ "char", 0x064A, 0x0654 }, - unicodeslot=0x0626, + shcode=0x64A, + specials={ "char", 0x64A, 0x654 }, + unicodeslot=0x626, }, - [0x0627]={ + [0x627]={ adobename="alefarabic", arabic="r", category="lo", description="ARABIC LETTER ALEF", direction="al", linebreak="al", - unicodeslot=0x0627, + unicodeslot=0x627, }, - [0x0628]={ + [0x628]={ adobename="beharabic", arabic="d", category="lo", description="ARABIC LETTER BEH", direction="al", linebreak="al", - unicodeslot=0x0628, + unicodeslot=0x628, }, - [0x0629]={ + [0x629]={ adobename="tehmarbutaarabic", arabic="r", category="lo", description="ARABIC LETTER TEH MARBUTA", direction="al", linebreak="al", - unicodeslot=0x0629, + unicodeslot=0x629, }, - [0x062A]={ + [0x62A]={ adobename="teharabic", arabic="d", category="lo", description="ARABIC LETTER TEH", direction="al", linebreak="al", - unicodeslot=0x062A, + unicodeslot=0x62A, }, - [0x062B]={ + [0x62B]={ adobename="theharabic", arabic="d", category="lo", description="ARABIC LETTER THEH", direction="al", linebreak="al", - unicodeslot=0x062B, + unicodeslot=0x62B, }, - [0x062C]={ + [0x62C]={ adobename="jeemarabic", arabic="d", category="lo", description="ARABIC LETTER JEEM", direction="al", linebreak="al", - unicodeslot=0x062C, + unicodeslot=0x62C, }, - [0x062D]={ + [0x62D]={ adobename="haharabic", arabic="d", category="lo", description="ARABIC LETTER HAH", direction="al", linebreak="al", - unicodeslot=0x062D, + unicodeslot=0x62D, }, - [0x062E]={ + [0x62E]={ adobename="khaharabic", arabic="d", category="lo", description="ARABIC LETTER KHAH", direction="al", linebreak="al", - unicodeslot=0x062E, + unicodeslot=0x62E, }, - [0x062F]={ + [0x62F]={ adobename="dalarabic", arabic="r", category="lo", description="ARABIC LETTER DAL", direction="al", linebreak="al", - unicodeslot=0x062F, + unicodeslot=0x62F, }, - [0x0630]={ + [0x630]={ adobename="thalarabic", arabic="r", category="lo", description="ARABIC LETTER THAL", direction="al", linebreak="al", - unicodeslot=0x0630, + unicodeslot=0x630, }, - [0x0631]={ + [0x631]={ adobename="rehyehaleflamarabic", arabic="r", category="lo", description="ARABIC LETTER REH", direction="al", linebreak="al", - unicodeslot=0x0631, + unicodeslot=0x631, }, - [0x0632]={ + [0x632]={ adobename="zainarabic", arabic="r", category="lo", description="ARABIC LETTER ZAIN", direction="al", linebreak="al", - unicodeslot=0x0632, + unicodeslot=0x632, }, - [0x0633]={ + [0x633]={ adobename="seenarabic", arabic="d", category="lo", description="ARABIC LETTER SEEN", direction="al", linebreak="al", - unicodeslot=0x0633, + unicodeslot=0x633, }, - [0x0634]={ + [0x634]={ adobename="sheenarabic", arabic="d", category="lo", description="ARABIC LETTER SHEEN", direction="al", linebreak="al", - unicodeslot=0x0634, + unicodeslot=0x634, }, - [0x0635]={ + [0x635]={ adobename="sadarabic", arabic="d", category="lo", description="ARABIC LETTER SAD", direction="al", linebreak="al", - unicodeslot=0x0635, + unicodeslot=0x635, }, - [0x0636]={ + [0x636]={ adobename="dadarabic", arabic="d", category="lo", description="ARABIC LETTER DAD", direction="al", linebreak="al", - unicodeslot=0x0636, + unicodeslot=0x636, }, - [0x0637]={ + [0x637]={ adobename="taharabic", arabic="d", category="lo", description="ARABIC LETTER TAH", direction="al", linebreak="al", - unicodeslot=0x0637, + unicodeslot=0x637, }, - [0x0638]={ + [0x638]={ adobename="zaharabic", arabic="d", category="lo", description="ARABIC LETTER ZAH", direction="al", linebreak="al", - unicodeslot=0x0638, + unicodeslot=0x638, }, - [0x0639]={ + [0x639]={ adobename="ainarabic", arabic="d", category="lo", description="ARABIC LETTER AIN", direction="al", linebreak="al", - unicodeslot=0x0639, + unicodeslot=0x639, }, - [0x063A]={ + [0x63A]={ adobename="ghainarabic", arabic="d", category="lo", description="ARABIC LETTER GHAIN", direction="al", linebreak="al", - unicodeslot=0x063A, + unicodeslot=0x63A, }, - [0x063B]={ + [0x63B]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH WITH TWO DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x063B, + unicodeslot=0x63B, }, - [0x063C]={ + [0x63C]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH WITH THREE DOTS BELOW", direction="al", linebreak="al", - unicodeslot=0x063C, + unicodeslot=0x63C, }, - [0x063D]={ + [0x63D]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH INVERTED V", direction="al", linebreak="al", - unicodeslot=0x063D, + unicodeslot=0x63D, }, - [0x063E]={ + [0x63E]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x063E, + unicodeslot=0x63E, }, - [0x063F]={ + [0x63F]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x063F, + unicodeslot=0x63F, }, - [0x0640]={ + [0x640]={ adobename="tatweelarabic", arabic="c", category="lm", description="ARABIC TATWEEL", direction="al", linebreak="al", - unicodeslot=0x0640, + unicodeslot=0x640, }, - [0x0641]={ + [0x641]={ adobename="feharabic", arabic="d", category="lo", description="ARABIC LETTER FEH", direction="al", linebreak="al", - unicodeslot=0x0641, + unicodeslot=0x641, }, - [0x0642]={ + [0x642]={ adobename="qafarabic", arabic="d", category="lo", description="ARABIC LETTER QAF", direction="al", linebreak="al", - unicodeslot=0x0642, + unicodeslot=0x642, }, - [0x0643]={ + [0x643]={ adobename="kafarabic", arabic="d", category="lo", description="ARABIC LETTER KAF", direction="al", linebreak="al", - unicodeslot=0x0643, + unicodeslot=0x643, }, - [0x0644]={ + [0x644]={ adobename="lamarabic", arabic="d", category="lo", description="ARABIC LETTER LAM", direction="al", linebreak="al", - unicodeslot=0x0644, + unicodeslot=0x644, }, - [0x0645]={ + [0x645]={ adobename="meemarabic", arabic="d", category="lo", description="ARABIC LETTER MEEM", direction="al", linebreak="al", - unicodeslot=0x0645, + unicodeslot=0x645, }, - [0x0646]={ + [0x646]={ adobename="noonarabic", arabic="d", category="lo", description="ARABIC LETTER NOON", direction="al", linebreak="al", - unicodeslot=0x0646, + unicodeslot=0x646, }, - [0x0647]={ + [0x647]={ adobename="heharabic", arabic="d", category="lo", description="ARABIC LETTER HEH", direction="al", linebreak="al", - unicodeslot=0x0647, + unicodeslot=0x647, }, - [0x0648]={ + [0x648]={ adobename="wawarabic", arabic="r", category="lo", description="ARABIC LETTER WAW", direction="al", linebreak="al", - unicodeslot=0x0648, + unicodeslot=0x648, }, - [0x0649]={ + [0x649]={ adobename="alefmaksuraarabic", arabic="d", category="lo", description="ARABIC LETTER ALEF MAKSURA", direction="al", linebreak="al", - unicodeslot=0x0649, + unicodeslot=0x649, }, - [0x064A]={ + [0x64A]={ adobename="yeharabic", arabic="d", category="lo", description="ARABIC LETTER YEH", direction="al", linebreak="al", - unicodeslot=0x064A, + unicodeslot=0x64A, }, - [0x064B]={ + [0x64B]={ adobename="fathatanarabic", category="mn", + combining=0x1B, description="ARABIC FATHATAN", direction="nsm", linebreak="cm", - unicodeslot=0x064B, + unicodeslot=0x64B, }, - [0x064C]={ + [0x64C]={ adobename="dammatanarabic", category="mn", + combining=0x1C, description="ARABIC DAMMATAN", direction="nsm", linebreak="cm", - unicodeslot=0x064C, + unicodeslot=0x64C, }, - [0x064D]={ + [0x64D]={ adobename="kasratanarabic", category="mn", + combining=0x1D, description="ARABIC KASRATAN", direction="nsm", linebreak="cm", - unicodeslot=0x064D, + unicodeslot=0x64D, }, - [0x064E]={ + [0x64E]={ adobename="fathalowarabic", category="mn", + combining=0x1E, description="ARABIC FATHA", direction="nsm", linebreak="cm", - unicodeslot=0x064E, + unicodeslot=0x64E, }, - [0x064F]={ + [0x64F]={ adobename="dammalowarabic", category="mn", + combining=0x1F, description="ARABIC DAMMA", direction="nsm", linebreak="cm", - unicodeslot=0x064F, + unicodeslot=0x64F, }, - [0x0650]={ + [0x650]={ adobename="kasraarabic", category="mn", + combining=0x20, description="ARABIC KASRA", direction="nsm", linebreak="cm", - unicodeslot=0x0650, + unicodeslot=0x650, }, - [0x0651]={ + [0x651]={ adobename="shaddafathatanarabic", category="mn", + combining=0x21, description="ARABIC SHADDA", direction="nsm", linebreak="cm", - unicodeslot=0x0651, + unicodeslot=0x651, }, - [0x0652]={ + [0x652]={ adobename="sukunarabic", category="mn", + combining=0x22, description="ARABIC SUKUN", direction="nsm", linebreak="cm", - unicodeslot=0x0652, + unicodeslot=0x652, }, - [0x0653]={ + [0x653]={ category="mn", + combining=0xE6, description="ARABIC MADDAH ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0653, + unicodeslot=0x653, }, - [0x0654]={ + [0x654]={ category="mn", + combining=0xE6, description="ARABIC HAMZA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0654, + unicodeslot=0x654, }, - [0x0655]={ + [0x655]={ category="mn", + combining=0xDC, description="ARABIC HAMZA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0655, + unicodeslot=0x655, }, - [0x0656]={ + [0x656]={ category="mn", + combining=0xDC, description="ARABIC SUBSCRIPT ALEF", direction="nsm", linebreak="cm", - unicodeslot=0x0656, + unicodeslot=0x656, }, - [0x0657]={ + [0x657]={ category="mn", + combining=0xE6, description="ARABIC INVERTED DAMMA", direction="nsm", linebreak="cm", - unicodeslot=0x0657, + unicodeslot=0x657, }, - [0x0658]={ + [0x658]={ category="mn", + combining=0xE6, description="ARABIC MARK NOON GHUNNA", direction="nsm", linebreak="cm", - unicodeslot=0x0658, + unicodeslot=0x658, }, - [0x0659]={ + [0x659]={ category="mn", + combining=0xE6, description="ARABIC ZWARAKAY", direction="nsm", linebreak="cm", - unicodeslot=0x0659, + unicodeslot=0x659, }, - [0x065A]={ + [0x65A]={ category="mn", + combining=0xE6, description="ARABIC VOWEL SIGN SMALL V ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x065A, + unicodeslot=0x65A, }, - [0x065B]={ + [0x65B]={ category="mn", + combining=0xE6, description="ARABIC VOWEL SIGN INVERTED SMALL V ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x065B, + unicodeslot=0x65B, }, - [0x065C]={ + [0x65C]={ category="mn", + combining=0xDC, description="ARABIC VOWEL SIGN DOT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x065C, + unicodeslot=0x65C, }, - [0x065D]={ + [0x65D]={ category="mn", + combining=0xE6, description="ARABIC REVERSED DAMMA", direction="nsm", linebreak="cm", - unicodeslot=0x065D, + unicodeslot=0x65D, }, - [0x065E]={ + [0x65E]={ category="mn", + combining=0xE6, description="ARABIC FATHA WITH TWO DOTS", direction="nsm", linebreak="cm", - unicodeslot=0x065E, + unicodeslot=0x65E, }, - [0x065F]={ + [0x65F]={ category="mn", + combining=0xDC, description="ARABIC WAVY HAMZA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x065F, + unicodeslot=0x65F, }, - [0x0660]={ + [0x660]={ adobename="zerohackarabic", category="nd", description="ARABIC-INDIC DIGIT ZERO", direction="an", linebreak="nu", - unicodeslot=0x0660, + unicodeslot=0x660, }, - [0x0661]={ + [0x661]={ adobename="onehackarabic", category="nd", description="ARABIC-INDIC DIGIT ONE", direction="an", linebreak="nu", - unicodeslot=0x0661, + unicodeslot=0x661, }, - [0x0662]={ + [0x662]={ adobename="twohackarabic", category="nd", description="ARABIC-INDIC DIGIT TWO", direction="an", linebreak="nu", - unicodeslot=0x0662, + unicodeslot=0x662, }, - [0x0663]={ + [0x663]={ adobename="threehackarabic", category="nd", description="ARABIC-INDIC DIGIT THREE", direction="an", linebreak="nu", - unicodeslot=0x0663, + unicodeslot=0x663, }, - [0x0664]={ + [0x664]={ adobename="fourhackarabic", category="nd", description="ARABIC-INDIC DIGIT FOUR", direction="an", linebreak="nu", - unicodeslot=0x0664, + unicodeslot=0x664, }, - [0x0665]={ + [0x665]={ adobename="fivehackarabic", category="nd", description="ARABIC-INDIC DIGIT FIVE", direction="an", linebreak="nu", - unicodeslot=0x0665, + unicodeslot=0x665, }, - [0x0666]={ + [0x666]={ adobename="sixhackarabic", category="nd", description="ARABIC-INDIC DIGIT SIX", direction="an", linebreak="nu", - unicodeslot=0x0666, + unicodeslot=0x666, }, - [0x0667]={ + [0x667]={ adobename="sevenhackarabic", category="nd", description="ARABIC-INDIC DIGIT SEVEN", direction="an", linebreak="nu", - unicodeslot=0x0667, + unicodeslot=0x667, }, - [0x0668]={ + [0x668]={ adobename="eighthackarabic", category="nd", description="ARABIC-INDIC DIGIT EIGHT", direction="an", linebreak="nu", - unicodeslot=0x0668, + unicodeslot=0x668, }, - [0x0669]={ + [0x669]={ adobename="ninehackarabic", category="nd", description="ARABIC-INDIC DIGIT NINE", direction="an", linebreak="nu", - unicodeslot=0x0669, + unicodeslot=0x669, }, - [0x066A]={ + [0x66A]={ adobename="percentarabic", category="po", description="ARABIC PERCENT SIGN", direction="et", linebreak="po", - unicodeslot=0x066A, + unicodeslot=0x66A, }, - [0x066B]={ + [0x66B]={ adobename="decimalseparatorpersian", category="po", description="ARABIC DECIMAL SEPARATOR", direction="an", linebreak="nu", - unicodeslot=0x066B, + unicodeslot=0x66B, }, - [0x066C]={ + [0x66C]={ adobename="thousandsseparatorpersian", category="po", description="ARABIC THOUSANDS SEPARATOR", direction="an", linebreak="nu", - unicodeslot=0x066C, + unicodeslot=0x66C, }, - [0x066D]={ + [0x66D]={ adobename="asteriskarabic", category="po", description="ARABIC FIVE POINTED STAR", direction="al", linebreak="al", - unicodeslot=0x066D, + unicodeslot=0x66D, }, - [0x066E]={ + [0x66E]={ arabic="d", category="lo", description="ARABIC LETTER DOTLESS BEH", direction="al", linebreak="al", - unicodeslot=0x066E, + unicodeslot=0x66E, }, - [0x066F]={ + [0x66F]={ arabic="d", category="lo", description="ARABIC LETTER DOTLESS QAF", direction="al", linebreak="al", - unicodeslot=0x066F, + unicodeslot=0x66F, }, - [0x0670]={ + [0x670]={ category="mn", + combining=0x23, description="ARABIC LETTER SUPERSCRIPT ALEF", direction="nsm", linebreak="cm", - unicodeslot=0x0670, + unicodeslot=0x670, }, - [0x0671]={ + [0x671]={ arabic="r", category="lo", description="ARABIC LETTER ALEF WASLA", direction="al", linebreak="al", - unicodeslot=0x0671, + unicodeslot=0x671, }, - [0x0672]={ + [0x672]={ arabic="r", category="lo", description="ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x0627, - unicodeslot=0x0672, + shcode=0x627, + unicodeslot=0x672, }, - [0x0673]={ + [0x673]={ arabic="r", category="lo", description="ARABIC LETTER ALEF WITH WAVY HAMZA BELOW", direction="al", linebreak="al", - shcode=0x0627, - unicodeslot=0x0673, + shcode=0x627, + unicodeslot=0x673, }, - [0x0674]={ + [0x674]={ arabic="u", category="lo", description="ARABIC LETTER HIGH HAMZA", direction="al", linebreak="al", - unicodeslot=0x0674, + unicodeslot=0x674, }, - [0x0675]={ + [0x675]={ arabic="r", category="lo", description="ARABIC LETTER HIGH HAMZA ALEF", direction="al", linebreak="al", - specials={ "compat", 0x0627, 0x0674 }, - unicodeslot=0x0675, + specials={ "compat", 0x627, 0x674 }, + unicodeslot=0x675, }, - [0x0676]={ + [0x676]={ arabic="r", category="lo", description="ARABIC LETTER HIGH HAMZA WAW", direction="al", linebreak="al", - specials={ "compat", 0x0648, 0x0674 }, - unicodeslot=0x0676, + specials={ "compat", 0x648, 0x674 }, + unicodeslot=0x676, }, - [0x0677]={ + [0x677]={ arabic="r", category="lo", description="ARABIC LETTER U WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x06C7, - specials={ "compat", 0x06C7, 0x0674 }, - unicodeslot=0x0677, + shcode=0x6C7, + specials={ "compat", 0x6C7, 0x674 }, + unicodeslot=0x677, }, - [0x0678]={ + [0x678]={ arabic="d", category="lo", description="ARABIC LETTER HIGH HAMZA YEH", direction="al", linebreak="al", - specials={ "compat", 0x064A, 0x0674 }, - unicodeslot=0x0678, + specials={ "compat", 0x64A, 0x674 }, + unicodeslot=0x678, }, - [0x0679]={ + [0x679]={ adobename="tteharabic", arabic="d", category="lo", description="ARABIC LETTER TTEH", direction="al", linebreak="al", - unicodeslot=0x0679, + unicodeslot=0x679, }, - [0x067A]={ + [0x67A]={ arabic="d", category="lo", description="ARABIC LETTER TTEHEH", direction="al", linebreak="al", - unicodeslot=0x067A, + unicodeslot=0x67A, }, - [0x067B]={ + [0x67B]={ arabic="d", category="lo", description="ARABIC LETTER BEEH", direction="al", linebreak="al", - unicodeslot=0x067B, + unicodeslot=0x67B, }, - [0x067C]={ + [0x67C]={ arabic="d", category="lo", description="ARABIC LETTER TEH WITH RING", direction="al", linebreak="al", - shcode=0x062A, - unicodeslot=0x067C, + shcode=0x62A, + unicodeslot=0x67C, }, - [0x067D]={ + [0x67D]={ arabic="d", category="lo", description="ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS", direction="al", linebreak="al", - shcode=0x062A, - unicodeslot=0x067D, + shcode=0x62A, + unicodeslot=0x67D, }, - [0x067E]={ + [0x67E]={ adobename="peharabic", arabic="d", category="lo", description="ARABIC LETTER PEH", direction="al", linebreak="al", - unicodeslot=0x067E, + unicodeslot=0x67E, }, - [0x067F]={ + [0x67F]={ arabic="d", category="lo", description="ARABIC LETTER TEHEH", direction="al", linebreak="al", - unicodeslot=0x067F, + unicodeslot=0x67F, }, - [0x0680]={ + [0x680]={ arabic="d", category="lo", description="ARABIC LETTER BEHEH", direction="al", linebreak="al", - unicodeslot=0x0680, + unicodeslot=0x680, }, - [0x0681]={ + [0x681]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x062D, - unicodeslot=0x0681, + shcode=0x62D, + unicodeslot=0x681, }, - [0x0682]={ + [0x682]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE", direction="al", linebreak="al", - shcode=0x062D, - unicodeslot=0x0682, + shcode=0x62D, + unicodeslot=0x682, }, - [0x0683]={ + [0x683]={ arabic="d", category="lo", description="ARABIC LETTER NYEH", direction="al", linebreak="al", - unicodeslot=0x0683, + unicodeslot=0x683, }, - [0x0684]={ + [0x684]={ arabic="d", category="lo", description="ARABIC LETTER DYEH", direction="al", linebreak="al", - unicodeslot=0x0684, + unicodeslot=0x684, }, - [0x0685]={ + [0x685]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x062D, - unicodeslot=0x0685, + shcode=0x62D, + unicodeslot=0x685, }, - [0x0686]={ + [0x686]={ adobename="tcheharabic", arabic="d", category="lo", description="ARABIC LETTER TCHEH", direction="al", linebreak="al", - unicodeslot=0x0686, + unicodeslot=0x686, }, - [0x0687]={ + [0x687]={ arabic="d", category="lo", description="ARABIC LETTER TCHEHEH", direction="al", linebreak="al", - unicodeslot=0x0687, + unicodeslot=0x687, }, - [0x0688]={ + [0x688]={ adobename="ddalarabic", arabic="r", category="lo", description="ARABIC LETTER DDAL", direction="al", linebreak="al", - unicodeslot=0x0688, + unicodeslot=0x688, }, - [0x0689]={ + [0x689]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH RING", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x0689, + shcode=0x62F, + unicodeslot=0x689, }, - [0x068A]={ + [0x68A]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x068A, + shcode=0x62F, + unicodeslot=0x68A, }, - [0x068B]={ + [0x68B]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x068B, + shcode=0x62F, + unicodeslot=0x68B, }, - [0x068C]={ + [0x68C]={ arabic="r", category="lo", description="ARABIC LETTER DAHAL", direction="al", linebreak="al", - unicodeslot=0x068C, + unicodeslot=0x68C, }, - [0x068D]={ + [0x68D]={ arabic="r", category="lo", description="ARABIC LETTER DDAHAL", direction="al", linebreak="al", - unicodeslot=0x068D, + unicodeslot=0x68D, }, - [0x068E]={ + [0x68E]={ arabic="r", category="lo", description="ARABIC LETTER DUL", direction="al", linebreak="al", - unicodeslot=0x068E, + unicodeslot=0x68E, }, - [0x068F]={ + [0x68F]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x068F, + shcode=0x62F, + unicodeslot=0x68F, }, - [0x0690]={ + [0x690]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH FOUR DOTS ABOVE", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x0690, + shcode=0x62F, + unicodeslot=0x690, }, - [0x0691]={ + [0x691]={ adobename="rreharabic", arabic="r", category="lo", description="ARABIC LETTER RREH", direction="al", linebreak="al", - unicodeslot=0x0691, + unicodeslot=0x691, }, - [0x0692]={ + [0x692]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH SMALL V", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0692, + shcode=0x631, + unicodeslot=0x692, }, - [0x0693]={ + [0x693]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH RING", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0693, + shcode=0x631, + unicodeslot=0x693, }, - [0x0694]={ + [0x694]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0694, + shcode=0x631, + unicodeslot=0x694, }, - [0x0695]={ + [0x695]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH SMALL V BELOW", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0695, + shcode=0x631, + unicodeslot=0x695, }, - [0x0696]={ + [0x696]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0696, + shcode=0x631, + unicodeslot=0x696, }, - [0x0697]={ + [0x697]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH TWO DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0697, + shcode=0x631, + unicodeslot=0x697, }, - [0x0698]={ + [0x698]={ adobename="jeharabic", arabic="r", category="lo", description="ARABIC LETTER JEH", direction="al", linebreak="al", - unicodeslot=0x0698, + unicodeslot=0x698, }, - [0x0699]={ + [0x699]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH FOUR DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x0699, + shcode=0x631, + unicodeslot=0x699, }, - [0x069A]={ + [0x69A]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE", direction="al", linebreak="al", - shcode=0x0633, - unicodeslot=0x069A, + shcode=0x633, + unicodeslot=0x69A, }, - [0x069B]={ + [0x69B]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH THREE DOTS BELOW", direction="al", linebreak="al", - shcode=0x0633, - unicodeslot=0x069B, + shcode=0x633, + unicodeslot=0x69B, }, - [0x069C]={ + [0x69C]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0633, - unicodeslot=0x069C, + shcode=0x633, + unicodeslot=0x69C, }, - [0x069D]={ + [0x69D]={ arabic="d", category="lo", description="ARABIC LETTER SAD WITH TWO DOTS BELOW", direction="al", linebreak="al", - shcode=0x0635, - unicodeslot=0x069D, + shcode=0x635, + unicodeslot=0x69D, }, - [0x069E]={ + [0x69E]={ arabic="d", category="lo", description="ARABIC LETTER SAD WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0635, - unicodeslot=0x069E, + shcode=0x635, + unicodeslot=0x69E, }, - [0x069F]={ + [0x69F]={ arabic="d", category="lo", description="ARABIC LETTER TAH WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0637, - unicodeslot=0x069F, + shcode=0x637, + unicodeslot=0x69F, }, - [0x06A0]={ + [0x6A0]={ arabic="d", category="lo", description="ARABIC LETTER AIN WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0639, - unicodeslot=0x06A0, + shcode=0x639, + unicodeslot=0x6A0, }, - [0x06A1]={ + [0x6A1]={ arabic="d", category="lo", description="ARABIC LETTER DOTLESS FEH", direction="al", linebreak="al", - unicodeslot=0x06A1, + unicodeslot=0x6A1, }, - [0x06A2]={ + [0x6A2]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH DOT MOVED BELOW", direction="al", linebreak="al", - shcode=0x0641, - unicodeslot=0x06A2, + shcode=0x641, + unicodeslot=0x6A2, }, - [0x06A3]={ + [0x6A3]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0641, - unicodeslot=0x06A3, + shcode=0x641, + unicodeslot=0x6A3, }, - [0x06A4]={ + [0x6A4]={ adobename="veharabic", arabic="d", category="lo", description="ARABIC LETTER VEH", direction="al", linebreak="al", - unicodeslot=0x06A4, + unicodeslot=0x6A4, }, - [0x06A5]={ + [0x6A5]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH THREE DOTS BELOW", direction="al", linebreak="al", - shcode=0x0641, - unicodeslot=0x06A5, + shcode=0x641, + unicodeslot=0x6A5, }, - [0x06A6]={ + [0x6A6]={ arabic="d", category="lo", description="ARABIC LETTER PEHEH", direction="al", linebreak="al", - unicodeslot=0x06A6, + unicodeslot=0x6A6, }, - [0x06A7]={ + [0x6A7]={ arabic="d", category="lo", description="ARABIC LETTER QAF WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0642, - unicodeslot=0x06A7, + shcode=0x642, + unicodeslot=0x6A7, }, - [0x06A8]={ + [0x6A8]={ arabic="d", category="lo", description="ARABIC LETTER QAF WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0642, - unicodeslot=0x06A8, + shcode=0x642, + unicodeslot=0x6A8, }, - [0x06A9]={ + [0x6A9]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH", direction="al", linebreak="al", - unicodeslot=0x06A9, + unicodeslot=0x6A9, }, - [0x06AA]={ + [0x6AA]={ arabic="d", category="lo", description="ARABIC LETTER SWASH KAF", direction="al", linebreak="al", - unicodeslot=0x06AA, + unicodeslot=0x6AA, }, - [0x06AB]={ + [0x6AB]={ arabic="d", category="lo", description="ARABIC LETTER KAF WITH RING", direction="al", linebreak="al", - shcode=0x0643, - unicodeslot=0x06AB, + shcode=0x643, + unicodeslot=0x6AB, }, - [0x06AC]={ + [0x6AC]={ arabic="d", category="lo", description="ARABIC LETTER KAF WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0643, - unicodeslot=0x06AC, + shcode=0x643, + unicodeslot=0x6AC, }, - [0x06AD]={ + [0x6AD]={ arabic="d", category="lo", description="ARABIC LETTER NG", direction="al", linebreak="al", - unicodeslot=0x06AD, + unicodeslot=0x6AD, }, - [0x06AE]={ + [0x6AE]={ arabic="d", category="lo", description="ARABIC LETTER KAF WITH THREE DOTS BELOW", direction="al", linebreak="al", - shcode=0x0643, - unicodeslot=0x06AE, + shcode=0x643, + unicodeslot=0x6AE, }, - [0x06AF]={ + [0x6AF]={ adobename="gafarabic", arabic="d", category="lo", description="ARABIC LETTER GAF", direction="al", linebreak="al", - unicodeslot=0x06AF, + unicodeslot=0x6AF, }, - [0x06B0]={ + [0x6B0]={ arabic="d", category="lo", description="ARABIC LETTER GAF WITH RING", direction="al", linebreak="al", - shcode=0x06AF, - unicodeslot=0x06B0, + shcode=0x6AF, + unicodeslot=0x6B0, }, - [0x06B1]={ + [0x6B1]={ arabic="d", category="lo", description="ARABIC LETTER NGOEH", direction="al", linebreak="al", - unicodeslot=0x06B1, + unicodeslot=0x6B1, }, - [0x06B2]={ + [0x6B2]={ arabic="d", category="lo", description="ARABIC LETTER GAF WITH TWO DOTS BELOW", direction="al", linebreak="al", - shcode=0x06AF, - unicodeslot=0x06B2, + shcode=0x6AF, + unicodeslot=0x6B2, }, - [0x06B3]={ + [0x6B3]={ arabic="d", category="lo", description="ARABIC LETTER GUEH", direction="al", linebreak="al", - unicodeslot=0x06B3, + unicodeslot=0x6B3, }, - [0x06B4]={ + [0x6B4]={ arabic="d", category="lo", description="ARABIC LETTER GAF WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x06AF, - unicodeslot=0x06B4, + shcode=0x6AF, + unicodeslot=0x6B4, }, - [0x06B5]={ + [0x6B5]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH SMALL V", direction="al", linebreak="al", - shcode=0x0644, - unicodeslot=0x06B5, + shcode=0x644, + unicodeslot=0x6B5, }, - [0x06B6]={ + [0x6B6]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0644, - unicodeslot=0x06B6, + shcode=0x644, + unicodeslot=0x6B6, }, - [0x06B7]={ + [0x6B7]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0644, - unicodeslot=0x06B7, + shcode=0x644, + unicodeslot=0x6B7, }, - [0x06B8]={ + [0x6B8]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH THREE DOTS BELOW", direction="al", linebreak="al", - shcode=0x0644, - unicodeslot=0x06B8, + shcode=0x644, + unicodeslot=0x6B8, }, - [0x06B9]={ + [0x6B9]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x06B9, + shcode=0x646, + unicodeslot=0x6B9, }, - [0x06BA]={ + [0x6BA]={ adobename="noonghunnaarabic", arabic="d", category="lo", description="ARABIC LETTER NOON GHUNNA", direction="al", linebreak="al", - unicodeslot=0x06BA, + unicodeslot=0x6BA, }, - [0x06BB]={ + [0x6BB]={ arabic="d", category="lo", description="ARABIC LETTER RNOON", direction="al", linebreak="al", - unicodeslot=0x06BB, + unicodeslot=0x6BB, }, - [0x06BC]={ + [0x6BC]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH RING", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x06BC, + shcode=0x646, + unicodeslot=0x6BC, }, - [0x06BD]={ + [0x6BD]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x06BD, + shcode=0x646, + unicodeslot=0x6BD, }, - [0x06BE]={ + [0x6BE]={ arabic="d", category="lo", description="ARABIC LETTER HEH DOACHASHMEE", direction="al", linebreak="al", - unicodeslot=0x06BE, + unicodeslot=0x6BE, }, - [0x06BF]={ + [0x6BF]={ arabic="d", category="lo", description="ARABIC LETTER TCHEH WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0686, - unicodeslot=0x06BF, + shcode=0x686, + unicodeslot=0x6BF, }, - [0x06C0]={ + [0x6C0]={ arabic="r", category="lo", description="ARABIC LETTER HEH WITH YEH ABOVE", direction="al", linebreak="al", - shcode=0x0647, - specials={ "char", 0x06D5, 0x0654 }, - unicodeslot=0x06C0, + shcode=0x647, + specials={ "char", 0x6D5, 0x654 }, + unicodeslot=0x6C0, }, - [0x06C1]={ + [0x6C1]={ adobename="hehaltonearabic", arabic="d", category="lo", description="ARABIC LETTER HEH GOAL", direction="al", linebreak="al", - unicodeslot=0x06C1, + unicodeslot=0x6C1, }, - [0x06C2]={ + [0x6C2]={ arabic="d", category="lo", description="ARABIC LETTER HEH GOAL WITH HAMZA ABOVE", direction="al", linebreak="al", - specials={ "char", 0x06C1, 0x0654 }, - unicodeslot=0x06C2, + specials={ "char", 0x6C1, 0x654 }, + unicodeslot=0x6C2, }, - [0x06C3]={ + [0x6C3]={ arabic="r", category="lo", description="ARABIC LETTER TEH MARBUTA GOAL", direction="al", linebreak="al", - unicodeslot=0x06C3, + unicodeslot=0x6C3, }, - [0x06C4]={ + [0x6C4]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH RING", direction="al", linebreak="al", - shcode=0x0648, - unicodeslot=0x06C4, + shcode=0x648, + unicodeslot=0x6C4, }, - [0x06C5]={ + [0x6C5]={ arabic="r", category="lo", description="ARABIC LETTER KIRGHIZ OE", direction="al", linebreak="al", - unicodeslot=0x06C5, + unicodeslot=0x6C5, }, - [0x06C6]={ + [0x6C6]={ arabic="r", category="lo", description="ARABIC LETTER OE", direction="al", linebreak="al", - unicodeslot=0x06C6, + unicodeslot=0x6C6, }, - [0x06C7]={ + [0x6C7]={ arabic="r", category="lo", description="ARABIC LETTER U", direction="al", linebreak="al", - unicodeslot=0x06C7, + unicodeslot=0x6C7, }, - [0x06C8]={ + [0x6C8]={ arabic="r", category="lo", description="ARABIC LETTER YU", direction="al", linebreak="al", - unicodeslot=0x06C8, + unicodeslot=0x6C8, }, - [0x06C9]={ + [0x6C9]={ arabic="r", category="lo", description="ARABIC LETTER KIRGHIZ YU", direction="al", linebreak="al", - unicodeslot=0x06C9, + unicodeslot=0x6C9, }, - [0x06CA]={ + [0x6CA]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH TWO DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0648, - unicodeslot=0x06CA, + shcode=0x648, + unicodeslot=0x6CA, }, - [0x06CB]={ + [0x6CB]={ arabic="r", category="lo", description="ARABIC LETTER VE", direction="al", linebreak="al", - unicodeslot=0x06CB, + unicodeslot=0x6CB, }, - [0x06CC]={ + [0x6CC]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH", direction="al", linebreak="al", - unicodeslot=0x06CC, + unicodeslot=0x6CC, }, - [0x06CD]={ + [0x6CD]={ arabic="r", category="lo", description="ARABIC LETTER YEH WITH TAIL", direction="al", linebreak="al", - shcode=0x064A, - unicodeslot=0x06CD, + shcode=0x64A, + unicodeslot=0x6CD, }, - [0x06CE]={ + [0x6CE]={ arabic="d", category="lo", description="ARABIC LETTER YEH WITH SMALL V", direction="al", linebreak="al", - shcode=0x064A, - unicodeslot=0x06CE, + shcode=0x64A, + unicodeslot=0x6CE, }, - [0x06CF]={ + [0x6CF]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0648, - unicodeslot=0x06CF, + shcode=0x648, + unicodeslot=0x6CF, }, - [0x06D0]={ + [0x6D0]={ arabic="d", category="lo", description="ARABIC LETTER E", direction="al", linebreak="al", - unicodeslot=0x06D0, + unicodeslot=0x6D0, }, - [0x06D1]={ + [0x6D1]={ adobename="yehthreedotsbelowarabic", arabic="d", category="lo", description="ARABIC LETTER YEH WITH THREE DOTS BELOW", direction="al", linebreak="al", - shcode=0x064A, - unicodeslot=0x06D1, + shcode=0x64A, + unicodeslot=0x6D1, }, - [0x06D2]={ + [0x6D2]={ adobename="yehbarreearabic", arabic="r", category="lo", description="ARABIC LETTER YEH BARREE", direction="al", linebreak="al", - unicodeslot=0x06D2, + unicodeslot=0x6D2, }, - [0x06D3]={ + [0x6D3]={ arabic="r", category="lo", description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE", direction="al", linebreak="al", - specials={ "char", 0x06D2, 0x0654 }, - unicodeslot=0x06D3, + specials={ "char", 0x6D2, 0x654 }, + unicodeslot=0x6D3, }, - [0x06D4]={ + [0x6D4]={ category="po", description="ARABIC FULL STOP", direction="al", linebreak="ex", - unicodeslot=0x06D4, + unicodeslot=0x6D4, }, - [0x06D5]={ + [0x6D5]={ adobename="afii57534", arabic="r", category="lo", description="ARABIC LETTER AE", direction="al", linebreak="al", - unicodeslot=0x06D5, + unicodeslot=0x6D5, }, - [0x06D6]={ + [0x6D6]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA", direction="nsm", linebreak="cm", - unicodeslot=0x06D6, + unicodeslot=0x6D6, }, - [0x06D7]={ + [0x6D7]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA", direction="nsm", linebreak="cm", - unicodeslot=0x06D7, + unicodeslot=0x6D7, }, - [0x06D8]={ + [0x6D8]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH MEEM INITIAL FORM", direction="nsm", linebreak="cm", - unicodeslot=0x06D8, + unicodeslot=0x6D8, }, - [0x06D9]={ + [0x6D9]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH LAM ALEF", direction="nsm", linebreak="cm", - unicodeslot=0x06D9, + unicodeslot=0x6D9, }, - [0x06DA]={ + [0x6DA]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH JEEM", direction="nsm", linebreak="cm", - unicodeslot=0x06DA, + unicodeslot=0x6DA, }, - [0x06DB]={ + [0x6DB]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH THREE DOTS", direction="nsm", linebreak="cm", - unicodeslot=0x06DB, + unicodeslot=0x6DB, }, - [0x06DC]={ + [0x6DC]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH SEEN", direction="nsm", linebreak="cm", - unicodeslot=0x06DC, + unicodeslot=0x6DC, }, - [0x06DD]={ + [0x6DD]={ arabic="u", category="cf", description="ARABIC END OF AYAH", direction="an", linebreak="al", - unicodeslot=0x06DD, + unicodeslot=0x6DD, visible="yes", }, - [0x06DE]={ + [0x6DE]={ category="me", description="ARABIC START OF RUB EL HIZB", direction="on", linebreak="al", - unicodeslot=0x06DE, + unicodeslot=0x6DE, }, - [0x06DF]={ + [0x6DF]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH ROUNDED ZERO", direction="nsm", linebreak="cm", - unicodeslot=0x06DF, + unicodeslot=0x6DF, }, - [0x06E0]={ + [0x6E0]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO", direction="nsm", linebreak="cm", - unicodeslot=0x06E0, + unicodeslot=0x6E0, }, - [0x06E1]={ + [0x6E1]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH DOTLESS HEAD OF KHAH", direction="nsm", linebreak="cm", - unicodeslot=0x06E1, + unicodeslot=0x6E1, }, - [0x06E2]={ + [0x6E2]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH MEEM ISOLATED FORM", direction="nsm", linebreak="cm", - unicodeslot=0x06E2, + unicodeslot=0x6E2, }, - [0x06E3]={ + [0x6E3]={ category="mn", + combining=0xDC, description="ARABIC SMALL LOW SEEN", direction="nsm", linebreak="cm", - unicodeslot=0x06E3, + unicodeslot=0x6E3, }, - [0x06E4]={ + [0x6E4]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH MADDA", direction="nsm", linebreak="cm", - unicodeslot=0x06E4, + unicodeslot=0x6E4, }, - [0x06E5]={ + [0x6E5]={ category="lm", description="ARABIC SMALL WAW", direction="al", linebreak="al", - unicodeslot=0x06E5, + unicodeslot=0x6E5, }, - [0x06E6]={ + [0x6E6]={ category="lm", description="ARABIC SMALL YEH", direction="al", linebreak="al", - unicodeslot=0x06E6, + unicodeslot=0x6E6, }, - [0x06E7]={ + [0x6E7]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH YEH", direction="nsm", linebreak="cm", - unicodeslot=0x06E7, + unicodeslot=0x6E7, }, - [0x06E8]={ + [0x6E8]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH NOON", direction="nsm", linebreak="cm", - unicodeslot=0x06E8, + unicodeslot=0x6E8, }, - [0x06E9]={ + [0x6E9]={ category="so", description="ARABIC PLACE OF SAJDAH", direction="on", linebreak="al", - unicodeslot=0x06E9, + unicodeslot=0x6E9, }, - [0x06EA]={ + [0x6EA]={ category="mn", + combining=0xDC, description="ARABIC EMPTY CENTRE LOW STOP", direction="nsm", linebreak="cm", - unicodeslot=0x06EA, + unicodeslot=0x6EA, }, - [0x06EB]={ + [0x6EB]={ category="mn", + combining=0xE6, description="ARABIC EMPTY CENTRE HIGH STOP", direction="nsm", linebreak="cm", - unicodeslot=0x06EB, + unicodeslot=0x6EB, }, - [0x06EC]={ + [0x6EC]={ category="mn", + combining=0xE6, description="ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE", direction="nsm", linebreak="cm", - unicodeslot=0x06EC, + unicodeslot=0x6EC, }, - [0x06ED]={ + [0x6ED]={ category="mn", + combining=0xDC, description="ARABIC SMALL LOW MEEM", direction="nsm", linebreak="cm", - unicodeslot=0x06ED, + unicodeslot=0x6ED, }, - [0x06EE]={ + [0x6EE]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH INVERTED V", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x06EE, + shcode=0x62F, + unicodeslot=0x6EE, }, - [0x06EF]={ + [0x6EF]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH INVERTED V", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x06EF, + shcode=0x631, + unicodeslot=0x6EF, }, - [0x06F0]={ + [0x6F0]={ adobename="zeropersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT ZERO", direction="en", linebreak="nu", - unicodeslot=0x06F0, + unicodeslot=0x6F0, }, - [0x06F1]={ + [0x6F1]={ adobename="onepersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT ONE", direction="en", linebreak="nu", - unicodeslot=0x06F1, + unicodeslot=0x6F1, }, - [0x06F2]={ + [0x6F2]={ adobename="twopersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT TWO", direction="en", linebreak="nu", - unicodeslot=0x06F2, + unicodeslot=0x6F2, }, - [0x06F3]={ + [0x6F3]={ adobename="threepersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT THREE", direction="en", linebreak="nu", - unicodeslot=0x06F3, + unicodeslot=0x6F3, }, - [0x06F4]={ + [0x6F4]={ adobename="fourpersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT FOUR", direction="en", linebreak="nu", - unicodeslot=0x06F4, + unicodeslot=0x6F4, }, - [0x06F5]={ + [0x6F5]={ adobename="fivepersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT FIVE", direction="en", linebreak="nu", - unicodeslot=0x06F5, + unicodeslot=0x6F5, }, - [0x06F6]={ + [0x6F6]={ adobename="sixpersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT SIX", direction="en", linebreak="nu", - unicodeslot=0x06F6, + unicodeslot=0x6F6, }, - [0x06F7]={ + [0x6F7]={ adobename="sevenpersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT SEVEN", direction="en", linebreak="nu", - unicodeslot=0x06F7, + unicodeslot=0x6F7, }, - [0x06F8]={ + [0x6F8]={ adobename="eightpersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT EIGHT", direction="en", linebreak="nu", - unicodeslot=0x06F8, + unicodeslot=0x6F8, }, - [0x06F9]={ + [0x6F9]={ adobename="ninepersian", category="nd", description="EXTENDED ARABIC-INDIC DIGIT NINE", direction="en", linebreak="nu", - unicodeslot=0x06F9, + unicodeslot=0x6F9, }, - [0x06FA]={ + [0x6FA]={ arabic="d", category="lo", description="ARABIC LETTER SHEEN WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0634, - unicodeslot=0x06FA, + shcode=0x634, + unicodeslot=0x6FA, }, - [0x06FB]={ + [0x6FB]={ arabic="d", category="lo", description="ARABIC LETTER DAD WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0636, - unicodeslot=0x06FB, + shcode=0x636, + unicodeslot=0x6FB, }, - [0x06FC]={ + [0x6FC]={ arabic="d", category="lo", description="ARABIC LETTER GHAIN WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x063A, - unicodeslot=0x06FC, + shcode=0x63A, + unicodeslot=0x6FC, }, - [0x06FD]={ + [0x6FD]={ category="so", description="ARABIC SIGN SINDHI AMPERSAND", direction="al", linebreak="al", - unicodeslot=0x06FD, + unicodeslot=0x6FD, }, - [0x06FE]={ + [0x6FE]={ category="so", description="ARABIC SIGN SINDHI POSTPOSITION MEN", direction="al", linebreak="al", - unicodeslot=0x06FE, + unicodeslot=0x6FE, }, - [0x06FF]={ + [0x6FF]={ arabic="d", category="lo", description="ARABIC LETTER HEH WITH INVERTED V", direction="al", linebreak="al", - shcode=0x0647, - unicodeslot=0x06FF, + shcode=0x647, + unicodeslot=0x6FF, }, - [0x0700]={ + [0x700]={ category="po", description="SYRIAC END OF PARAGRAPH", direction="al", linebreak="al", - unicodeslot=0x0700, + unicodeslot=0x700, }, - [0x0701]={ + [0x701]={ category="po", description="SYRIAC SUPRALINEAR FULL STOP", direction="al", linebreak="al", - unicodeslot=0x0701, + unicodeslot=0x701, }, - [0x0702]={ + [0x702]={ category="po", description="SYRIAC SUBLINEAR FULL STOP", direction="al", linebreak="al", - unicodeslot=0x0702, + unicodeslot=0x702, }, - [0x0703]={ + [0x703]={ category="po", description="SYRIAC SUPRALINEAR COLON", direction="al", linebreak="al", - unicodeslot=0x0703, + unicodeslot=0x703, }, - [0x0704]={ + [0x704]={ category="po", description="SYRIAC SUBLINEAR COLON", direction="al", linebreak="al", - unicodeslot=0x0704, + unicodeslot=0x704, }, - [0x0705]={ + [0x705]={ category="po", description="SYRIAC HORIZONTAL COLON", direction="al", linebreak="al", - unicodeslot=0x0705, + unicodeslot=0x705, }, - [0x0706]={ + [0x706]={ category="po", description="SYRIAC COLON SKEWED LEFT", direction="al", linebreak="al", - unicodeslot=0x0706, + unicodeslot=0x706, }, - [0x0707]={ + [0x707]={ category="po", description="SYRIAC COLON SKEWED RIGHT", direction="al", linebreak="al", - unicodeslot=0x0707, + unicodeslot=0x707, }, - [0x0708]={ + [0x708]={ category="po", description="SYRIAC SUPRALINEAR COLON SKEWED LEFT", direction="al", linebreak="al", - unicodeslot=0x0708, + unicodeslot=0x708, }, - [0x0709]={ + [0x709]={ category="po", description="SYRIAC SUBLINEAR COLON SKEWED RIGHT", direction="al", linebreak="al", - unicodeslot=0x0709, + unicodeslot=0x709, }, - [0x070A]={ + [0x70A]={ category="po", description="SYRIAC CONTRACTION", direction="al", linebreak="al", - unicodeslot=0x070A, + unicodeslot=0x70A, }, - [0x070B]={ + [0x70B]={ category="po", description="SYRIAC HARKLEAN OBELUS", direction="al", linebreak="al", - unicodeslot=0x070B, + unicodeslot=0x70B, }, - [0x070C]={ + [0x70C]={ category="po", description="SYRIAC HARKLEAN METOBELUS", direction="al", linebreak="al", - unicodeslot=0x070C, + unicodeslot=0x70C, }, - [0x070D]={ + [0x70D]={ category="po", description="SYRIAC HARKLEAN ASTERISCUS", direction="al", linebreak="al", - unicodeslot=0x070D, + unicodeslot=0x70D, }, - [0x070F]={ + [0x70F]={ category="cf", description="SYRIAC ABBREVIATION MARK", direction="al", linebreak="al", - unicodeslot=0x070F, + unicodeslot=0x70F, visible="yes", }, - [0x0710]={ + [0x710]={ arabic="r", category="lo", description="SYRIAC LETTER ALAPH", direction="al", linebreak="al", - unicodeslot=0x0710, + unicodeslot=0x710, }, - [0x0711]={ + [0x711]={ category="mn", + combining=0x24, description="SYRIAC LETTER SUPERSCRIPT ALAPH", direction="nsm", linebreak="cm", - unicodeslot=0x0711, + unicodeslot=0x711, }, - [0x0712]={ + [0x712]={ arabic="d", category="lo", description="SYRIAC LETTER BETH", direction="al", linebreak="al", - unicodeslot=0x0712, + unicodeslot=0x712, }, - [0x0713]={ + [0x713]={ arabic="d", category="lo", description="SYRIAC LETTER GAMAL", direction="al", linebreak="al", - unicodeslot=0x0713, + unicodeslot=0x713, }, - [0x0714]={ + [0x714]={ arabic="d", category="lo", description="SYRIAC LETTER GAMAL GARSHUNI", direction="al", linebreak="al", - unicodeslot=0x0714, + unicodeslot=0x714, }, - [0x0715]={ + [0x715]={ arabic="r", category="lo", description="SYRIAC LETTER DALATH", direction="al", linebreak="al", - unicodeslot=0x0715, + unicodeslot=0x715, }, - [0x0716]={ + [0x716]={ arabic="r", category="lo", description="SYRIAC LETTER DOTLESS DALATH RISH", direction="al", linebreak="al", - unicodeslot=0x0716, + unicodeslot=0x716, }, - [0x0717]={ + [0x717]={ arabic="r", category="lo", description="SYRIAC LETTER HE", direction="al", linebreak="al", - unicodeslot=0x0717, + unicodeslot=0x717, }, - [0x0718]={ + [0x718]={ arabic="r", category="lo", description="SYRIAC LETTER WAW", direction="al", linebreak="al", - unicodeslot=0x0718, + unicodeslot=0x718, }, - [0x0719]={ + [0x719]={ arabic="r", category="lo", description="SYRIAC LETTER ZAIN", direction="al", linebreak="al", - unicodeslot=0x0719, + unicodeslot=0x719, }, - [0x071A]={ + [0x71A]={ arabic="d", category="lo", description="SYRIAC LETTER HETH", direction="al", linebreak="al", - unicodeslot=0x071A, + unicodeslot=0x71A, }, - [0x071B]={ + [0x71B]={ arabic="d", category="lo", description="SYRIAC LETTER TETH", direction="al", linebreak="al", - unicodeslot=0x071B, + unicodeslot=0x71B, }, - [0x071C]={ + [0x71C]={ arabic="d", category="lo", description="SYRIAC LETTER TETH GARSHUNI", direction="al", linebreak="al", - unicodeslot=0x071C, + unicodeslot=0x71C, }, - [0x071D]={ + [0x71D]={ arabic="d", category="lo", description="SYRIAC LETTER YUDH", direction="al", linebreak="al", - unicodeslot=0x071D, + unicodeslot=0x71D, }, - [0x071E]={ + [0x71E]={ arabic="r", category="lo", description="SYRIAC LETTER YUDH HE", direction="al", linebreak="al", - unicodeslot=0x071E, + unicodeslot=0x71E, }, - [0x071F]={ + [0x71F]={ arabic="d", category="lo", description="SYRIAC LETTER KAPH", direction="al", linebreak="al", - unicodeslot=0x071F, + unicodeslot=0x71F, }, - [0x0720]={ + [0x720]={ arabic="d", category="lo", description="SYRIAC LETTER LAMADH", direction="al", linebreak="al", - unicodeslot=0x0720, + unicodeslot=0x720, }, - [0x0721]={ + [0x721]={ arabic="d", category="lo", description="SYRIAC LETTER MIM", direction="al", linebreak="al", - unicodeslot=0x0721, + unicodeslot=0x721, }, - [0x0722]={ + [0x722]={ arabic="d", category="lo", description="SYRIAC LETTER NUN", direction="al", linebreak="al", - unicodeslot=0x0722, + unicodeslot=0x722, }, - [0x0723]={ + [0x723]={ arabic="d", category="lo", description="SYRIAC LETTER SEMKATH", direction="al", linebreak="al", - unicodeslot=0x0723, + unicodeslot=0x723, }, - [0x0724]={ + [0x724]={ arabic="d", category="lo", description="SYRIAC LETTER FINAL SEMKATH", direction="al", linebreak="al", - unicodeslot=0x0724, + unicodeslot=0x724, }, - [0x0725]={ + [0x725]={ arabic="d", category="lo", description="SYRIAC LETTER E", direction="al", linebreak="al", - unicodeslot=0x0725, + unicodeslot=0x725, }, - [0x0726]={ + [0x726]={ arabic="d", category="lo", description="SYRIAC LETTER PE", direction="al", linebreak="al", - unicodeslot=0x0726, + unicodeslot=0x726, }, - [0x0727]={ + [0x727]={ arabic="d", category="lo", description="SYRIAC LETTER REVERSED PE", direction="al", linebreak="al", - unicodeslot=0x0727, + unicodeslot=0x727, }, - [0x0728]={ + [0x728]={ arabic="r", category="lo", description="SYRIAC LETTER SADHE", direction="al", linebreak="al", - unicodeslot=0x0728, + unicodeslot=0x728, }, - [0x0729]={ + [0x729]={ arabic="d", category="lo", description="SYRIAC LETTER QAPH", direction="al", linebreak="al", - unicodeslot=0x0729, + unicodeslot=0x729, }, - [0x072A]={ + [0x72A]={ arabic="r", category="lo", description="SYRIAC LETTER RISH", direction="al", linebreak="al", - unicodeslot=0x072A, + unicodeslot=0x72A, }, - [0x072B]={ + [0x72B]={ arabic="d", category="lo", description="SYRIAC LETTER SHIN", direction="al", linebreak="al", - unicodeslot=0x072B, + unicodeslot=0x72B, }, - [0x072C]={ + [0x72C]={ arabic="r", category="lo", description="SYRIAC LETTER TAW", direction="al", linebreak="al", - unicodeslot=0x072C, + unicodeslot=0x72C, }, - [0x072D]={ + [0x72D]={ arabic="d", category="lo", description="SYRIAC LETTER PERSIAN BHETH", direction="al", linebreak="al", - unicodeslot=0x072D, + unicodeslot=0x72D, }, - [0x072E]={ + [0x72E]={ arabic="d", category="lo", description="SYRIAC LETTER PERSIAN GHAMAL", direction="al", linebreak="al", - unicodeslot=0x072E, + unicodeslot=0x72E, }, - [0x072F]={ + [0x72F]={ arabic="r", category="lo", description="SYRIAC LETTER PERSIAN DHALATH", direction="al", linebreak="al", - unicodeslot=0x072F, + unicodeslot=0x72F, }, - [0x0730]={ + [0x730]={ category="mn", + combining=0xE6, description="SYRIAC PTHAHA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0730, + unicodeslot=0x730, }, - [0x0731]={ + [0x731]={ category="mn", + combining=0xDC, description="SYRIAC PTHAHA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0731, + unicodeslot=0x731, }, - [0x0732]={ + [0x732]={ category="mn", + combining=0xE6, description="SYRIAC PTHAHA DOTTED", direction="nsm", linebreak="cm", - unicodeslot=0x0732, + unicodeslot=0x732, }, - [0x0733]={ + [0x733]={ category="mn", + combining=0xE6, description="SYRIAC ZQAPHA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0733, + unicodeslot=0x733, }, - [0x0734]={ + [0x734]={ category="mn", + combining=0xDC, description="SYRIAC ZQAPHA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0734, + unicodeslot=0x734, }, - [0x0735]={ + [0x735]={ category="mn", + combining=0xE6, description="SYRIAC ZQAPHA DOTTED", direction="nsm", linebreak="cm", - unicodeslot=0x0735, + unicodeslot=0x735, }, - [0x0736]={ + [0x736]={ category="mn", + combining=0xE6, description="SYRIAC RBASA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0736, + unicodeslot=0x736, }, - [0x0737]={ + [0x737]={ category="mn", + combining=0xDC, description="SYRIAC RBASA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0737, + unicodeslot=0x737, }, - [0x0738]={ + [0x738]={ category="mn", + combining=0xDC, description="SYRIAC DOTTED ZLAMA HORIZONTAL", direction="nsm", linebreak="cm", - unicodeslot=0x0738, + unicodeslot=0x738, }, - [0x0739]={ + [0x739]={ category="mn", + combining=0xDC, description="SYRIAC DOTTED ZLAMA ANGULAR", direction="nsm", linebreak="cm", - unicodeslot=0x0739, + unicodeslot=0x739, }, - [0x073A]={ + [0x73A]={ category="mn", + combining=0xE6, description="SYRIAC HBASA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x073A, + unicodeslot=0x73A, }, - [0x073B]={ + [0x73B]={ category="mn", + combining=0xDC, description="SYRIAC HBASA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x073B, + unicodeslot=0x73B, }, - [0x073C]={ + [0x73C]={ category="mn", + combining=0xDC, description="SYRIAC HBASA-ESASA DOTTED", direction="nsm", linebreak="cm", - unicodeslot=0x073C, + unicodeslot=0x73C, }, - [0x073D]={ + [0x73D]={ category="mn", + combining=0xE6, description="SYRIAC ESASA ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x073D, + unicodeslot=0x73D, }, - [0x073E]={ + [0x73E]={ category="mn", + combining=0xDC, description="SYRIAC ESASA BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x073E, + unicodeslot=0x73E, }, - [0x073F]={ + [0x73F]={ category="mn", + combining=0xE6, description="SYRIAC RWAHA", direction="nsm", linebreak="cm", - unicodeslot=0x073F, + unicodeslot=0x73F, }, - [0x0740]={ + [0x740]={ category="mn", + combining=0xE6, description="SYRIAC FEMININE DOT", direction="nsm", linebreak="cm", - unicodeslot=0x0740, + unicodeslot=0x740, }, - [0x0741]={ + [0x741]={ category="mn", + combining=0xE6, description="SYRIAC QUSHSHAYA", direction="nsm", linebreak="cm", - unicodeslot=0x0741, + unicodeslot=0x741, }, - [0x0742]={ + [0x742]={ category="mn", + combining=0xDC, description="SYRIAC RUKKAKHA", direction="nsm", linebreak="cm", - unicodeslot=0x0742, + unicodeslot=0x742, }, - [0x0743]={ + [0x743]={ category="mn", + combining=0xE6, description="SYRIAC TWO VERTICAL DOTS ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0743, + unicodeslot=0x743, }, - [0x0744]={ + [0x744]={ category="mn", + combining=0xDC, description="SYRIAC TWO VERTICAL DOTS BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0744, + unicodeslot=0x744, }, - [0x0745]={ + [0x745]={ category="mn", + combining=0xE6, description="SYRIAC THREE DOTS ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0745, + unicodeslot=0x745, }, - [0x0746]={ + [0x746]={ category="mn", + combining=0xDC, description="SYRIAC THREE DOTS BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0746, + unicodeslot=0x746, }, - [0x0747]={ + [0x747]={ category="mn", + combining=0xE6, description="SYRIAC OBLIQUE LINE ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x0747, + unicodeslot=0x747, }, - [0x0748]={ + [0x748]={ category="mn", + combining=0xDC, description="SYRIAC OBLIQUE LINE BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x0748, + unicodeslot=0x748, }, - [0x0749]={ + [0x749]={ category="mn", + combining=0xE6, description="SYRIAC MUSIC", direction="nsm", linebreak="cm", - unicodeslot=0x0749, + unicodeslot=0x749, }, - [0x074A]={ + [0x74A]={ category="mn", + combining=0xE6, description="SYRIAC BARREKH", direction="nsm", linebreak="cm", - unicodeslot=0x074A, + unicodeslot=0x74A, }, - [0x074D]={ + [0x74D]={ arabic="r", category="lo", description="SYRIAC LETTER SOGDIAN ZHAIN", direction="al", linebreak="al", - unicodeslot=0x074D, + unicodeslot=0x74D, }, - [0x074E]={ + [0x74E]={ arabic="d", category="lo", description="SYRIAC LETTER SOGDIAN KHAPH", direction="al", linebreak="al", - unicodeslot=0x074E, + unicodeslot=0x74E, }, - [0x074F]={ + [0x74F]={ arabic="d", category="lo", description="SYRIAC LETTER SOGDIAN FE", direction="al", linebreak="al", - unicodeslot=0x074F, + unicodeslot=0x74F, }, - [0x0750]={ + [0x750]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0750, + shcode=0x628, + unicodeslot=0x750, }, - [0x0751]={ + [0x751]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0751, + shcode=0x628, + unicodeslot=0x751, }, - [0x0752]={ + [0x752]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0752, + shcode=0x628, + unicodeslot=0x752, }, - [0x0753]={ + [0x753]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0753, + shcode=0x628, + unicodeslot=0x753, }, - [0x0754]={ + [0x754]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0754, + shcode=0x628, + unicodeslot=0x754, }, - [0x0755]={ + [0x755]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH INVERTED SMALL V BELOW", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0755, + shcode=0x628, + unicodeslot=0x755, }, - [0x0756]={ + [0x756]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH SMALL V", direction="al", linebreak="al", - shcode=0x0628, - unicodeslot=0x0756, + shcode=0x628, + unicodeslot=0x756, }, - [0x0757]={ + [0x757]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH TWO DOTS ABOVE", direction="al", linebreak="al", - shcode=0x062D, - unicodeslot=0x0757, + shcode=0x62D, + unicodeslot=0x757, }, - [0x0758]={ + [0x758]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW", direction="al", linebreak="al", - shcode=0x062D, - unicodeslot=0x0758, + shcode=0x62D, + unicodeslot=0x758, }, - [0x0759]={ + [0x759]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x0759, + shcode=0x62F, + unicodeslot=0x759, }, - [0x075A]={ + [0x75A]={ arabic="r", category="lo", description="ARABIC LETTER DAL WITH INVERTED SMALL V BELOW", direction="al", linebreak="al", - shcode=0x062F, - unicodeslot=0x075A, + shcode=0x62F, + unicodeslot=0x75A, }, - [0x075B]={ + [0x75B]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH STROKE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x075B, + shcode=0x631, + unicodeslot=0x75B, }, - [0x075C]={ + [0x75C]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH FOUR DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0633, - unicodeslot=0x075C, + shcode=0x633, + unicodeslot=0x75C, }, - [0x075D]={ + [0x75D]={ arabic="d", category="lo", description="ARABIC LETTER AIN WITH TWO DOTS ABOVE", direction="al", linebreak="al", - shcode=0x0639, - unicodeslot=0x075D, + shcode=0x639, + unicodeslot=0x75D, }, - [0x075E]={ + [0x75E]={ arabic="d", category="lo", description="ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE", direction="al", linebreak="al", - shcode=0x0639, - unicodeslot=0x075E, + shcode=0x639, + unicodeslot=0x75E, }, - [0x075F]={ + [0x75F]={ arabic="d", category="lo", description="ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE", direction="al", linebreak="al", - shcode=0x0639, - unicodeslot=0x075F, + shcode=0x639, + unicodeslot=0x75F, }, - [0x0760]={ + [0x760]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH TWO DOTS BELOW", direction="al", linebreak="al", - shcode=0x0641, - unicodeslot=0x0760, + shcode=0x641, + unicodeslot=0x760, }, - [0x0761]={ + [0x761]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW", direction="al", linebreak="al", - shcode=0x0641, - unicodeslot=0x0761, + shcode=0x641, + unicodeslot=0x761, }, - [0x0762]={ + [0x762]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x06A9, - unicodeslot=0x0762, + shcode=0x6A9, + unicodeslot=0x762, }, - [0x0763]={ + [0x763]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH WITH THREE DOTS ABOVE", direction="al", linebreak="al", - shcode=0x06A9, - unicodeslot=0x0763, + shcode=0x6A9, + unicodeslot=0x763, }, - [0x0764]={ + [0x764]={ arabic="d", category="lo", description="ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW", direction="al", linebreak="al", - shcode=0x06A9, - unicodeslot=0x0764, + shcode=0x6A9, + unicodeslot=0x764, }, - [0x0765]={ + [0x765]={ arabic="d", category="lo", description="ARABIC LETTER MEEM WITH DOT ABOVE", direction="al", linebreak="al", - shcode=0x0645, - unicodeslot=0x0765, + shcode=0x645, + unicodeslot=0x765, }, - [0x0766]={ + [0x766]={ arabic="d", category="lo", description="ARABIC LETTER MEEM WITH DOT BELOW", direction="al", linebreak="al", - shcode=0x0645, - unicodeslot=0x0766, + shcode=0x645, + unicodeslot=0x766, }, - [0x0767]={ + [0x767]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH TWO DOTS BELOW", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x0767, + shcode=0x646, + unicodeslot=0x767, }, - [0x0768]={ + [0x768]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH SMALL TAH", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x0768, + shcode=0x646, + unicodeslot=0x768, }, - [0x0769]={ + [0x769]={ arabic="d", category="lo", description="ARABIC LETTER NOON WITH SMALL V", direction="al", linebreak="al", - shcode=0x0646, - unicodeslot=0x0769, + shcode=0x646, + unicodeslot=0x769, }, - [0x076A]={ + [0x76A]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH BAR", direction="al", linebreak="al", - shcode=0x0644, - unicodeslot=0x076A, + shcode=0x644, + unicodeslot=0x76A, }, - [0x076B]={ + [0x76B]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x076B, + shcode=0x631, + unicodeslot=0x76B, }, - [0x076C]={ + [0x76C]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH HAMZA ABOVE", direction="al", linebreak="al", - shcode=0x0631, - unicodeslot=0x076C, + shcode=0x631, + unicodeslot=0x76C, }, - [0x076D]={ + [0x76D]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE", direction="al", linebreak="al", - shcode=0x0633, - unicodeslot=0x076D, + shcode=0x633, + unicodeslot=0x76D, }, - [0x076E]={ + [0x76E]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW", direction="al", linebreak="al", - unicodeslot=0x076E, + unicodeslot=0x76E, }, - [0x076F]={ + [0x76F]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", direction="al", linebreak="al", - unicodeslot=0x076F, + unicodeslot=0x76F, }, - [0x0770]={ + [0x770]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS", direction="al", linebreak="al", - unicodeslot=0x0770, + unicodeslot=0x770, }, - [0x0771]={ + [0x771]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", direction="al", linebreak="al", - unicodeslot=0x0771, + unicodeslot=0x771, }, - [0x0772]={ + [0x772]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE", direction="al", linebreak="al", - unicodeslot=0x0772, + unicodeslot=0x772, }, - [0x0773]={ + [0x773]={ arabic="r", category="lo", description="ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", direction="al", linebreak="al", - unicodeslot=0x0773, + unicodeslot=0x773, }, - [0x0774]={ + [0x774]={ arabic="r", category="lo", description="ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", direction="al", linebreak="al", - unicodeslot=0x0774, + unicodeslot=0x774, }, - [0x0775]={ + [0x775]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", direction="al", linebreak="al", - unicodeslot=0x0775, + unicodeslot=0x775, }, - [0x0776]={ + [0x776]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", direction="al", linebreak="al", - unicodeslot=0x0776, + unicodeslot=0x776, }, - [0x0777]={ + [0x777]={ arabic="d", category="lo", description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW", direction="al", linebreak="al", - unicodeslot=0x0777, + unicodeslot=0x777, }, - [0x0778]={ + [0x778]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", direction="al", linebreak="al", - unicodeslot=0x0778, + unicodeslot=0x778, }, - [0x0779]={ + [0x779]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", direction="al", linebreak="al", - unicodeslot=0x0779, + unicodeslot=0x779, }, - [0x077A]={ + [0x77A]={ arabic="d", category="lo", description="ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", direction="al", linebreak="al", - unicodeslot=0x077A, + unicodeslot=0x77A, }, - [0x077B]={ + [0x77B]={ arabic="d", category="lo", description="ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", direction="al", linebreak="al", - unicodeslot=0x077B, + unicodeslot=0x77B, }, - [0x077C]={ + [0x77C]={ arabic="d", category="lo", description="ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW", direction="al", linebreak="al", - unicodeslot=0x077C, + unicodeslot=0x77C, }, - [0x077D]={ + [0x77D]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE", direction="al", linebreak="al", - unicodeslot=0x077D, + unicodeslot=0x77D, }, - [0x077E]={ + [0x77E]={ arabic="d", category="lo", description="ARABIC LETTER SEEN WITH INVERTED V", direction="al", linebreak="al", - unicodeslot=0x077E, + unicodeslot=0x77E, }, - [0x077F]={ + [0x77F]={ arabic="d", category="lo", description="ARABIC LETTER KAF WITH TWO DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x077F, + unicodeslot=0x77F, }, - [0x0780]={ + [0x780]={ category="lo", description="THAANA LETTER HAA", direction="al", linebreak="al", - unicodeslot=0x0780, + unicodeslot=0x780, }, - [0x0781]={ + [0x781]={ category="lo", description="THAANA LETTER SHAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0781, + unicodeslot=0x781, }, - [0x0782]={ + [0x782]={ category="lo", description="THAANA LETTER NOONU", direction="al", linebreak="al", - unicodeslot=0x0782, + unicodeslot=0x782, }, - [0x0783]={ + [0x783]={ category="lo", description="THAANA LETTER RAA", direction="al", linebreak="al", - unicodeslot=0x0783, + unicodeslot=0x783, }, - [0x0784]={ + [0x784]={ category="lo", description="THAANA LETTER BAA", direction="al", linebreak="al", - unicodeslot=0x0784, + unicodeslot=0x784, }, - [0x0785]={ + [0x785]={ category="lo", description="THAANA LETTER LHAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0785, + unicodeslot=0x785, }, - [0x0786]={ + [0x786]={ category="lo", description="THAANA LETTER KAAFU", direction="al", linebreak="al", - unicodeslot=0x0786, + unicodeslot=0x786, }, - [0x0787]={ + [0x787]={ category="lo", description="THAANA LETTER ALIFU", direction="al", linebreak="al", - unicodeslot=0x0787, + unicodeslot=0x787, }, - [0x0788]={ + [0x788]={ category="lo", description="THAANA LETTER VAAVU", direction="al", linebreak="al", - unicodeslot=0x0788, + unicodeslot=0x788, }, - [0x0789]={ + [0x789]={ category="lo", description="THAANA LETTER MEEMU", direction="al", linebreak="al", - unicodeslot=0x0789, + unicodeslot=0x789, }, - [0x078A]={ + [0x78A]={ category="lo", description="THAANA LETTER FAAFU", direction="al", linebreak="al", - unicodeslot=0x078A, + unicodeslot=0x78A, }, - [0x078B]={ + [0x78B]={ category="lo", description="THAANA LETTER DHAALU", direction="al", linebreak="al", - unicodeslot=0x078B, + unicodeslot=0x78B, }, - [0x078C]={ + [0x78C]={ category="lo", description="THAANA LETTER THAA", direction="al", linebreak="al", - unicodeslot=0x078C, + unicodeslot=0x78C, }, - [0x078D]={ + [0x78D]={ category="lo", description="THAANA LETTER LAAMU", direction="al", linebreak="al", - unicodeslot=0x078D, + unicodeslot=0x78D, }, - [0x078E]={ + [0x78E]={ category="lo", description="THAANA LETTER GAAFU", direction="al", linebreak="al", - unicodeslot=0x078E, + unicodeslot=0x78E, }, - [0x078F]={ + [0x78F]={ category="lo", description="THAANA LETTER GNAVIYANI", direction="al", linebreak="al", - unicodeslot=0x078F, + unicodeslot=0x78F, }, - [0x0790]={ + [0x790]={ category="lo", description="THAANA LETTER SEENU", direction="al", linebreak="al", - unicodeslot=0x0790, + unicodeslot=0x790, }, - [0x0791]={ + [0x791]={ category="lo", description="THAANA LETTER DAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0791, + unicodeslot=0x791, }, - [0x0792]={ + [0x792]={ category="lo", description="THAANA LETTER ZAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0792, + unicodeslot=0x792, }, - [0x0793]={ + [0x793]={ category="lo", description="THAANA LETTER TAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0793, + unicodeslot=0x793, }, - [0x0794]={ + [0x794]={ category="lo", description="THAANA LETTER YAA", direction="al", linebreak="al", - unicodeslot=0x0794, + unicodeslot=0x794, }, - [0x0795]={ + [0x795]={ category="lo", description="THAANA LETTER PAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0795, + unicodeslot=0x795, }, - [0x0796]={ + [0x796]={ category="lo", description="THAANA LETTER JAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0796, + unicodeslot=0x796, }, - [0x0797]={ + [0x797]={ category="lo", description="THAANA LETTER CHAVIYANI", direction="al", linebreak="al", - unicodeslot=0x0797, + unicodeslot=0x797, }, - [0x0798]={ + [0x798]={ category="lo", description="THAANA LETTER TTAA", direction="al", linebreak="al", - unicodeslot=0x0798, + unicodeslot=0x798, }, - [0x0799]={ + [0x799]={ category="lo", description="THAANA LETTER HHAA", direction="al", linebreak="al", - unicodeslot=0x0799, + unicodeslot=0x799, }, - [0x079A]={ + [0x79A]={ category="lo", description="THAANA LETTER KHAA", direction="al", linebreak="al", - unicodeslot=0x079A, + unicodeslot=0x79A, }, - [0x079B]={ + [0x79B]={ category="lo", description="THAANA LETTER THAALU", direction="al", linebreak="al", - unicodeslot=0x079B, + unicodeslot=0x79B, }, - [0x079C]={ + [0x79C]={ category="lo", description="THAANA LETTER ZAA", direction="al", linebreak="al", - unicodeslot=0x079C, + unicodeslot=0x79C, }, - [0x079D]={ + [0x79D]={ category="lo", description="THAANA LETTER SHEENU", direction="al", linebreak="al", - unicodeslot=0x079D, + unicodeslot=0x79D, }, - [0x079E]={ + [0x79E]={ category="lo", description="THAANA LETTER SAADHU", direction="al", linebreak="al", - unicodeslot=0x079E, + unicodeslot=0x79E, }, - [0x079F]={ + [0x79F]={ category="lo", description="THAANA LETTER DAADHU", direction="al", linebreak="al", - unicodeslot=0x079F, + unicodeslot=0x79F, }, - [0x07A0]={ + [0x7A0]={ category="lo", description="THAANA LETTER TO", direction="al", linebreak="al", - unicodeslot=0x07A0, + unicodeslot=0x7A0, }, - [0x07A1]={ + [0x7A1]={ category="lo", description="THAANA LETTER ZO", direction="al", linebreak="al", - unicodeslot=0x07A1, + unicodeslot=0x7A1, }, - [0x07A2]={ + [0x7A2]={ category="lo", description="THAANA LETTER AINU", direction="al", linebreak="al", - unicodeslot=0x07A2, + unicodeslot=0x7A2, }, - [0x07A3]={ + [0x7A3]={ category="lo", description="THAANA LETTER GHAINU", direction="al", linebreak="al", - unicodeslot=0x07A3, + unicodeslot=0x7A3, }, - [0x07A4]={ + [0x7A4]={ category="lo", description="THAANA LETTER QAAFU", direction="al", linebreak="al", - unicodeslot=0x07A4, + unicodeslot=0x7A4, }, - [0x07A5]={ + [0x7A5]={ category="lo", description="THAANA LETTER WAAVU", direction="al", linebreak="al", - unicodeslot=0x07A5, + unicodeslot=0x7A5, }, - [0x07A6]={ + [0x7A6]={ category="mn", description="THAANA ABAFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07A6, + unicodeslot=0x7A6, }, - [0x07A7]={ + [0x7A7]={ category="mn", description="THAANA AABAAFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07A7, + unicodeslot=0x7A7, }, - [0x07A8]={ + [0x7A8]={ category="mn", description="THAANA IBIFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07A8, + unicodeslot=0x7A8, }, - [0x07A9]={ + [0x7A9]={ category="mn", description="THAANA EEBEEFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07A9, + unicodeslot=0x7A9, }, - [0x07AA]={ + [0x7AA]={ category="mn", description="THAANA UBUFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AA, + unicodeslot=0x7AA, }, - [0x07AB]={ + [0x7AB]={ category="mn", description="THAANA OOBOOFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AB, + unicodeslot=0x7AB, }, - [0x07AC]={ + [0x7AC]={ category="mn", description="THAANA EBEFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AC, + unicodeslot=0x7AC, }, - [0x07AD]={ + [0x7AD]={ category="mn", description="THAANA EYBEYFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AD, + unicodeslot=0x7AD, }, - [0x07AE]={ + [0x7AE]={ category="mn", description="THAANA OBOFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AE, + unicodeslot=0x7AE, }, - [0x07AF]={ + [0x7AF]={ category="mn", description="THAANA OABOAFILI", direction="nsm", linebreak="cm", - unicodeslot=0x07AF, + unicodeslot=0x7AF, }, - [0x07B0]={ + [0x7B0]={ category="mn", description="THAANA SUKUN", direction="nsm", linebreak="cm", - unicodeslot=0x07B0, + unicodeslot=0x7B0, }, - [0x07B1]={ + [0x7B1]={ category="lo", description="THAANA LETTER NAA", direction="al", linebreak="al", - unicodeslot=0x07B1, + unicodeslot=0x7B1, }, - [0x07C0]={ + [0x7C0]={ category="nd", description="NKO DIGIT ZERO", direction="r", linebreak="nu", - unicodeslot=0x07C0, + unicodeslot=0x7C0, }, - [0x07C1]={ + [0x7C1]={ category="nd", description="NKO DIGIT ONE", direction="r", linebreak="nu", - unicodeslot=0x07C1, + unicodeslot=0x7C1, }, - [0x07C2]={ + [0x7C2]={ category="nd", description="NKO DIGIT TWO", direction="r", linebreak="nu", - unicodeslot=0x07C2, + unicodeslot=0x7C2, }, - [0x07C3]={ + [0x7C3]={ category="nd", description="NKO DIGIT THREE", direction="r", linebreak="nu", - unicodeslot=0x07C3, + unicodeslot=0x7C3, }, - [0x07C4]={ + [0x7C4]={ category="nd", description="NKO DIGIT FOUR", direction="r", linebreak="nu", - unicodeslot=0x07C4, + unicodeslot=0x7C4, }, - [0x07C5]={ + [0x7C5]={ category="nd", description="NKO DIGIT FIVE", direction="r", linebreak="nu", - unicodeslot=0x07C5, + unicodeslot=0x7C5, }, - [0x07C6]={ + [0x7C6]={ category="nd", description="NKO DIGIT SIX", direction="r", linebreak="nu", - unicodeslot=0x07C6, + unicodeslot=0x7C6, }, - [0x07C7]={ + [0x7C7]={ category="nd", description="NKO DIGIT SEVEN", direction="r", linebreak="nu", - unicodeslot=0x07C7, + unicodeslot=0x7C7, }, - [0x07C8]={ + [0x7C8]={ category="nd", description="NKO DIGIT EIGHT", direction="r", linebreak="nu", - unicodeslot=0x07C8, + unicodeslot=0x7C8, }, - [0x07C9]={ + [0x7C9]={ category="nd", description="NKO DIGIT NINE", direction="r", linebreak="nu", - unicodeslot=0x07C9, + unicodeslot=0x7C9, }, - [0x07CA]={ + [0x7CA]={ arabic="d", category="lo", description="NKO LETTER A", direction="r", linebreak="al", - unicodeslot=0x07CA, + unicodeslot=0x7CA, }, - [0x07CB]={ + [0x7CB]={ arabic="d", category="lo", description="NKO LETTER EE", direction="r", linebreak="al", - unicodeslot=0x07CB, + unicodeslot=0x7CB, }, - [0x07CC]={ + [0x7CC]={ arabic="d", category="lo", description="NKO LETTER I", direction="r", linebreak="al", - unicodeslot=0x07CC, + unicodeslot=0x7CC, }, - [0x07CD]={ + [0x7CD]={ arabic="d", category="lo", description="NKO LETTER E", direction="r", linebreak="al", - unicodeslot=0x07CD, + unicodeslot=0x7CD, }, - [0x07CE]={ + [0x7CE]={ arabic="d", category="lo", description="NKO LETTER U", direction="r", linebreak="al", - unicodeslot=0x07CE, + unicodeslot=0x7CE, }, - [0x07CF]={ + [0x7CF]={ arabic="d", category="lo", description="NKO LETTER OO", direction="r", linebreak="al", - unicodeslot=0x07CF, + unicodeslot=0x7CF, }, - [0x07D0]={ + [0x7D0]={ arabic="d", category="lo", description="NKO LETTER O", direction="r", linebreak="al", - unicodeslot=0x07D0, + unicodeslot=0x7D0, }, - [0x07D1]={ + [0x7D1]={ arabic="d", category="lo", description="NKO LETTER DAGBASINNA", direction="r", linebreak="al", - unicodeslot=0x07D1, + unicodeslot=0x7D1, }, - [0x07D2]={ + [0x7D2]={ arabic="d", category="lo", description="NKO LETTER N", direction="r", linebreak="al", - unicodeslot=0x07D2, + unicodeslot=0x7D2, }, - [0x07D3]={ + [0x7D3]={ arabic="d", category="lo", description="NKO LETTER BA", direction="r", linebreak="al", - unicodeslot=0x07D3, + unicodeslot=0x7D3, }, - [0x07D4]={ + [0x7D4]={ arabic="d", category="lo", description="NKO LETTER PA", direction="r", linebreak="al", - unicodeslot=0x07D4, + unicodeslot=0x7D4, }, - [0x07D5]={ + [0x7D5]={ arabic="d", category="lo", description="NKO LETTER TA", direction="r", linebreak="al", - unicodeslot=0x07D5, + unicodeslot=0x7D5, }, - [0x07D6]={ + [0x7D6]={ arabic="d", category="lo", description="NKO LETTER JA", direction="r", linebreak="al", - unicodeslot=0x07D6, + unicodeslot=0x7D6, }, - [0x07D7]={ + [0x7D7]={ arabic="d", category="lo", description="NKO LETTER CHA", direction="r", linebreak="al", - unicodeslot=0x07D7, + unicodeslot=0x7D7, }, - [0x07D8]={ + [0x7D8]={ arabic="d", category="lo", description="NKO LETTER DA", direction="r", linebreak="al", - unicodeslot=0x07D8, + unicodeslot=0x7D8, }, - [0x07D9]={ + [0x7D9]={ arabic="d", category="lo", description="NKO LETTER RA", direction="r", linebreak="al", - unicodeslot=0x07D9, + unicodeslot=0x7D9, }, - [0x07DA]={ + [0x7DA]={ arabic="d", category="lo", description="NKO LETTER RRA", direction="r", linebreak="al", - unicodeslot=0x07DA, + unicodeslot=0x7DA, }, - [0x07DB]={ + [0x7DB]={ arabic="d", category="lo", description="NKO LETTER SA", direction="r", linebreak="al", - unicodeslot=0x07DB, + unicodeslot=0x7DB, }, - [0x07DC]={ + [0x7DC]={ arabic="d", category="lo", description="NKO LETTER GBA", direction="r", linebreak="al", - unicodeslot=0x07DC, + unicodeslot=0x7DC, }, - [0x07DD]={ + [0x7DD]={ arabic="d", category="lo", description="NKO LETTER FA", direction="r", linebreak="al", - unicodeslot=0x07DD, + unicodeslot=0x7DD, }, - [0x07DE]={ + [0x7DE]={ arabic="d", category="lo", description="NKO LETTER KA", direction="r", linebreak="al", - unicodeslot=0x07DE, + unicodeslot=0x7DE, }, - [0x07DF]={ + [0x7DF]={ arabic="d", category="lo", description="NKO LETTER LA", direction="r", linebreak="al", - unicodeslot=0x07DF, + unicodeslot=0x7DF, }, - [0x07E0]={ + [0x7E0]={ arabic="d", category="lo", description="NKO LETTER NA WOLOSO", direction="r", linebreak="al", - unicodeslot=0x07E0, + unicodeslot=0x7E0, }, - [0x07E1]={ + [0x7E1]={ arabic="d", category="lo", description="NKO LETTER MA", direction="r", linebreak="al", - unicodeslot=0x07E1, + unicodeslot=0x7E1, }, - [0x07E2]={ + [0x7E2]={ arabic="d", category="lo", description="NKO LETTER NYA", direction="r", linebreak="al", - unicodeslot=0x07E2, + unicodeslot=0x7E2, }, - [0x07E3]={ + [0x7E3]={ arabic="d", category="lo", description="NKO LETTER NA", direction="r", linebreak="al", - unicodeslot=0x07E3, + unicodeslot=0x7E3, }, - [0x07E4]={ + [0x7E4]={ arabic="d", category="lo", description="NKO LETTER HA", direction="r", linebreak="al", - unicodeslot=0x07E4, + unicodeslot=0x7E4, }, - [0x07E5]={ + [0x7E5]={ arabic="d", category="lo", description="NKO LETTER WA", direction="r", linebreak="al", - unicodeslot=0x07E5, + unicodeslot=0x7E5, }, - [0x07E6]={ + [0x7E6]={ arabic="d", category="lo", description="NKO LETTER YA", direction="r", linebreak="al", - unicodeslot=0x07E6, + unicodeslot=0x7E6, }, - [0x07E7]={ + [0x7E7]={ arabic="d", category="lo", description="NKO LETTER NYA WOLOSO", direction="r", linebreak="al", - unicodeslot=0x07E7, + unicodeslot=0x7E7, }, - [0x07E8]={ + [0x7E8]={ arabic="d", category="lo", description="NKO LETTER JONA JA", direction="r", linebreak="al", - unicodeslot=0x07E8, + unicodeslot=0x7E8, }, - [0x07E9]={ + [0x7E9]={ arabic="d", category="lo", description="NKO LETTER JONA CHA", direction="r", linebreak="al", - unicodeslot=0x07E9, + unicodeslot=0x7E9, }, - [0x07EA]={ + [0x7EA]={ arabic="d", category="lo", description="NKO LETTER JONA RA", direction="r", linebreak="al", - unicodeslot=0x07EA, + unicodeslot=0x7EA, }, - [0x07EB]={ + [0x7EB]={ category="mn", + combining=0xE6, description="NKO COMBINING SHORT HIGH TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07EB, + unicodeslot=0x7EB, }, - [0x07EC]={ + [0x7EC]={ category="mn", + combining=0xE6, description="NKO COMBINING SHORT LOW TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07EC, + unicodeslot=0x7EC, }, - [0x07ED]={ + [0x7ED]={ category="mn", + combining=0xE6, description="NKO COMBINING SHORT RISING TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07ED, + unicodeslot=0x7ED, }, - [0x07EE]={ + [0x7EE]={ category="mn", + combining=0xE6, description="NKO COMBINING LONG DESCENDING TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07EE, + unicodeslot=0x7EE, }, - [0x07EF]={ + [0x7EF]={ category="mn", + combining=0xE6, description="NKO COMBINING LONG HIGH TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07EF, + unicodeslot=0x7EF, }, - [0x07F0]={ + [0x7F0]={ category="mn", + combining=0xE6, description="NKO COMBINING LONG LOW TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07F0, + unicodeslot=0x7F0, }, - [0x07F1]={ + [0x7F1]={ category="mn", + combining=0xE6, description="NKO COMBINING LONG RISING TONE", direction="nsm", linebreak="cm", - unicodeslot=0x07F1, + unicodeslot=0x7F1, }, - [0x07F2]={ + [0x7F2]={ category="mn", + combining=0xDC, description="NKO COMBINING NASALIZATION MARK", direction="nsm", linebreak="cm", - unicodeslot=0x07F2, + unicodeslot=0x7F2, }, - [0x07F3]={ + [0x7F3]={ category="mn", + combining=0xE6, description="NKO COMBINING DOUBLE DOT ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x07F3, + unicodeslot=0x7F3, }, - [0x07F4]={ + [0x7F4]={ category="lm", description="NKO HIGH TONE APOSTROPHE", direction="r", linebreak="al", - unicodeslot=0x07F4, + unicodeslot=0x7F4, }, - [0x07F5]={ + [0x7F5]={ category="lm", description="NKO LOW TONE APOSTROPHE", direction="r", linebreak="al", - unicodeslot=0x07F5, + unicodeslot=0x7F5, }, - [0x07F6]={ + [0x7F6]={ category="so", description="NKO SYMBOL OO DENNEN", direction="on", linebreak="al", - unicodeslot=0x07F6, + unicodeslot=0x7F6, }, - [0x07F7]={ + [0x7F7]={ category="po", description="NKO SYMBOL GBAKURUNEN", direction="on", linebreak="al", - unicodeslot=0x07F7, + unicodeslot=0x7F7, }, - [0x07F8]={ + [0x7F8]={ category="po", description="NKO COMMA", direction="on", linebreak="is", - unicodeslot=0x07F8, + unicodeslot=0x7F8, }, - [0x07F9]={ + [0x7F9]={ category="po", description="NKO EXCLAMATION MARK", direction="on", linebreak="ex", - unicodeslot=0x07F9, + unicodeslot=0x7F9, }, - [0x07FA]={ + [0x7FA]={ arabic="c", category="lm", description="NKO LAJANYALAN", direction="r", linebreak="al", - unicodeslot=0x07FA, + unicodeslot=0x7FA, }, - [0x0800]={ + [0x800]={ category="lo", description="SAMARITAN LETTER ALAF", direction="r", linebreak="al", - unicodeslot=0x0800, + unicodeslot=0x800, }, - [0x0801]={ + [0x801]={ category="lo", description="SAMARITAN LETTER BIT", direction="r", linebreak="al", - unicodeslot=0x0801, + unicodeslot=0x801, }, - [0x0802]={ + [0x802]={ category="lo", description="SAMARITAN LETTER GAMAN", direction="r", linebreak="al", - unicodeslot=0x0802, + unicodeslot=0x802, }, - [0x0803]={ + [0x803]={ category="lo", description="SAMARITAN LETTER DALAT", direction="r", linebreak="al", - unicodeslot=0x0803, + unicodeslot=0x803, }, - [0x0804]={ + [0x804]={ category="lo", description="SAMARITAN LETTER IY", direction="r", linebreak="al", - unicodeslot=0x0804, + unicodeslot=0x804, }, - [0x0805]={ + [0x805]={ category="lo", description="SAMARITAN LETTER BAA", direction="r", linebreak="al", - unicodeslot=0x0805, + unicodeslot=0x805, }, - [0x0806]={ + [0x806]={ category="lo", description="SAMARITAN LETTER ZEN", direction="r", linebreak="al", - unicodeslot=0x0806, + unicodeslot=0x806, }, - [0x0807]={ + [0x807]={ category="lo", description="SAMARITAN LETTER IT", direction="r", linebreak="al", - unicodeslot=0x0807, + unicodeslot=0x807, }, - [0x0808]={ + [0x808]={ category="lo", description="SAMARITAN LETTER TIT", direction="r", linebreak="al", - unicodeslot=0x0808, + unicodeslot=0x808, }, - [0x0809]={ + [0x809]={ category="lo", description="SAMARITAN LETTER YUT", direction="r", linebreak="al", - unicodeslot=0x0809, + unicodeslot=0x809, }, - [0x080A]={ + [0x80A]={ category="lo", description="SAMARITAN LETTER KAAF", direction="r", linebreak="al", - unicodeslot=0x080A, + unicodeslot=0x80A, }, - [0x080B]={ + [0x80B]={ category="lo", description="SAMARITAN LETTER LABAT", direction="r", linebreak="al", - unicodeslot=0x080B, + unicodeslot=0x80B, }, - [0x080C]={ + [0x80C]={ category="lo", description="SAMARITAN LETTER MIM", direction="r", linebreak="al", - unicodeslot=0x080C, + unicodeslot=0x80C, }, - [0x080D]={ + [0x80D]={ category="lo", description="SAMARITAN LETTER NUN", direction="r", linebreak="al", - unicodeslot=0x080D, + unicodeslot=0x80D, }, - [0x080E]={ + [0x80E]={ category="lo", description="SAMARITAN LETTER SINGAAT", direction="r", linebreak="al", - unicodeslot=0x080E, + unicodeslot=0x80E, }, - [0x080F]={ + [0x80F]={ category="lo", description="SAMARITAN LETTER IN", direction="r", linebreak="al", - unicodeslot=0x080F, + unicodeslot=0x80F, }, - [0x0810]={ + [0x810]={ category="lo", description="SAMARITAN LETTER FI", direction="r", linebreak="al", - unicodeslot=0x0810, + unicodeslot=0x810, }, - [0x0811]={ + [0x811]={ category="lo", description="SAMARITAN LETTER TSAADIY", direction="r", linebreak="al", - unicodeslot=0x0811, + unicodeslot=0x811, }, - [0x0812]={ + [0x812]={ category="lo", description="SAMARITAN LETTER QUF", direction="r", linebreak="al", - unicodeslot=0x0812, + unicodeslot=0x812, }, - [0x0813]={ + [0x813]={ category="lo", description="SAMARITAN LETTER RISH", direction="r", linebreak="al", - unicodeslot=0x0813, + unicodeslot=0x813, }, - [0x0814]={ + [0x814]={ category="lo", description="SAMARITAN LETTER SHAN", direction="r", linebreak="al", - unicodeslot=0x0814, + unicodeslot=0x814, }, - [0x0815]={ + [0x815]={ category="lo", description="SAMARITAN LETTER TAAF", direction="r", linebreak="al", - unicodeslot=0x0815, + unicodeslot=0x815, }, - [0x0816]={ + [0x816]={ category="mn", + combining=0xE6, description="SAMARITAN MARK IN", direction="nsm", linebreak="cm", - unicodeslot=0x0816, + unicodeslot=0x816, }, - [0x0817]={ + [0x817]={ category="mn", + combining=0xE6, description="SAMARITAN MARK IN-ALAF", direction="nsm", linebreak="cm", - unicodeslot=0x0817, + unicodeslot=0x817, }, - [0x0818]={ + [0x818]={ category="mn", + combining=0xE6, description="SAMARITAN MARK OCCLUSION", direction="nsm", linebreak="cm", - unicodeslot=0x0818, + unicodeslot=0x818, }, - [0x0819]={ + [0x819]={ category="mn", + combining=0xE6, description="SAMARITAN MARK DAGESH", direction="nsm", linebreak="cm", - unicodeslot=0x0819, + unicodeslot=0x819, }, - [0x081A]={ + [0x81A]={ category="lm", description="SAMARITAN MODIFIER LETTER EPENTHETIC YUT", direction="r", linebreak="al", - unicodeslot=0x081A, + unicodeslot=0x81A, }, - [0x081B]={ + [0x81B]={ category="mn", + combining=0xE6, description="SAMARITAN MARK EPENTHETIC YUT", direction="nsm", linebreak="cm", - unicodeslot=0x081B, + unicodeslot=0x81B, }, - [0x081C]={ + [0x81C]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN LONG E", direction="nsm", linebreak="cm", - unicodeslot=0x081C, + unicodeslot=0x81C, }, - [0x081D]={ + [0x81D]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x081D, + unicodeslot=0x81D, }, - [0x081E]={ + [0x81E]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN OVERLONG AA", direction="nsm", linebreak="cm", - unicodeslot=0x081E, + unicodeslot=0x81E, }, - [0x081F]={ + [0x81F]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN LONG AA", direction="nsm", linebreak="cm", - unicodeslot=0x081F, + unicodeslot=0x81F, }, - [0x0820]={ + [0x820]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN AA", direction="nsm", linebreak="cm", - unicodeslot=0x0820, + unicodeslot=0x820, }, - [0x0821]={ + [0x821]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN OVERLONG A", direction="nsm", linebreak="cm", - unicodeslot=0x0821, + unicodeslot=0x821, }, - [0x0822]={ + [0x822]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN LONG A", direction="nsm", linebreak="cm", - unicodeslot=0x0822, + unicodeslot=0x822, }, - [0x0823]={ + [0x823]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN A", direction="nsm", linebreak="cm", - unicodeslot=0x0823, + unicodeslot=0x823, }, - [0x0824]={ + [0x824]={ category="lm", description="SAMARITAN MODIFIER LETTER SHORT A", direction="r", linebreak="al", - unicodeslot=0x0824, + unicodeslot=0x824, }, - [0x0825]={ + [0x825]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN SHORT A", direction="nsm", linebreak="cm", - unicodeslot=0x0825, + unicodeslot=0x825, }, - [0x0826]={ + [0x826]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN LONG U", direction="nsm", linebreak="cm", - unicodeslot=0x0826, + unicodeslot=0x826, }, - [0x0827]={ + [0x827]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0827, + unicodeslot=0x827, }, - [0x0828]={ + [0x828]={ category="lm", description="SAMARITAN MODIFIER LETTER I", direction="r", linebreak="al", - unicodeslot=0x0828, + unicodeslot=0x828, }, - [0x0829]={ + [0x829]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN LONG I", direction="nsm", linebreak="cm", - unicodeslot=0x0829, + unicodeslot=0x829, }, - [0x082A]={ + [0x82A]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN I", direction="nsm", linebreak="cm", - unicodeslot=0x082A, + unicodeslot=0x82A, }, - [0x082B]={ + [0x82B]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN O", direction="nsm", linebreak="cm", - unicodeslot=0x082B, + unicodeslot=0x82B, }, - [0x082C]={ + [0x82C]={ category="mn", + combining=0xE6, description="SAMARITAN VOWEL SIGN SUKUN", direction="nsm", linebreak="cm", - unicodeslot=0x082C, + unicodeslot=0x82C, }, - [0x082D]={ + [0x82D]={ category="mn", + combining=0xE6, description="SAMARITAN MARK NEQUDAA", direction="nsm", linebreak="cm", - unicodeslot=0x082D, + unicodeslot=0x82D, }, - [0x0830]={ + [0x830]={ category="po", description="SAMARITAN PUNCTUATION NEQUDAA", direction="r", linebreak="al", - unicodeslot=0x0830, + unicodeslot=0x830, }, - [0x0831]={ + [0x831]={ category="po", description="SAMARITAN PUNCTUATION AFSAAQ", direction="r", linebreak="al", - unicodeslot=0x0831, + unicodeslot=0x831, }, - [0x0832]={ + [0x832]={ category="po", description="SAMARITAN PUNCTUATION ANGED", direction="r", linebreak="al", - unicodeslot=0x0832, + unicodeslot=0x832, }, - [0x0833]={ + [0x833]={ category="po", description="SAMARITAN PUNCTUATION BAU", direction="r", linebreak="al", - unicodeslot=0x0833, + unicodeslot=0x833, }, - [0x0834]={ + [0x834]={ category="po", description="SAMARITAN PUNCTUATION ATMAAU", direction="r", linebreak="al", - unicodeslot=0x0834, + unicodeslot=0x834, }, - [0x0835]={ + [0x835]={ category="po", description="SAMARITAN PUNCTUATION SHIYYAALAA", direction="r", linebreak="al", - unicodeslot=0x0835, + unicodeslot=0x835, }, - [0x0836]={ + [0x836]={ category="po", description="SAMARITAN ABBREVIATION MARK", direction="r", linebreak="al", - unicodeslot=0x0836, + unicodeslot=0x836, }, - [0x0837]={ + [0x837]={ category="po", description="SAMARITAN PUNCTUATION MELODIC QITSA", direction="r", linebreak="al", - unicodeslot=0x0837, + unicodeslot=0x837, }, - [0x0838]={ + [0x838]={ category="po", description="SAMARITAN PUNCTUATION ZIQAA", direction="r", linebreak="al", - unicodeslot=0x0838, + unicodeslot=0x838, }, - [0x0839]={ + [0x839]={ category="po", description="SAMARITAN PUNCTUATION QITSA", direction="r", linebreak="al", - unicodeslot=0x0839, + unicodeslot=0x839, }, - [0x083A]={ + [0x83A]={ category="po", description="SAMARITAN PUNCTUATION ZAEF", direction="r", linebreak="al", - unicodeslot=0x083A, + unicodeslot=0x83A, }, - [0x083B]={ + [0x83B]={ category="po", description="SAMARITAN PUNCTUATION TURU", direction="r", linebreak="al", - unicodeslot=0x083B, + unicodeslot=0x83B, }, - [0x083C]={ + [0x83C]={ category="po", description="SAMARITAN PUNCTUATION ARKAANU", direction="r", linebreak="al", - unicodeslot=0x083C, + unicodeslot=0x83C, }, - [0x083D]={ + [0x83D]={ category="po", description="SAMARITAN PUNCTUATION SOF MASHFAAT", direction="r", linebreak="al", - unicodeslot=0x083D, + unicodeslot=0x83D, }, - [0x083E]={ + [0x83E]={ category="po", description="SAMARITAN PUNCTUATION ANNAAU", direction="r", linebreak="al", - unicodeslot=0x083E, + unicodeslot=0x83E, }, - [0x0840]={ + [0x840]={ arabic="r", category="lo", description="MANDAIC LETTER HALQA", direction="r", linebreak="al", - unicodeslot=0x0840, + unicodeslot=0x840, }, - [0x0841]={ + [0x841]={ arabic="d", category="lo", description="MANDAIC LETTER AB", direction="r", linebreak="al", - unicodeslot=0x0841, + unicodeslot=0x841, }, - [0x0842]={ + [0x842]={ arabic="d", category="lo", description="MANDAIC LETTER AG", direction="r", linebreak="al", - unicodeslot=0x0842, + unicodeslot=0x842, }, - [0x0843]={ + [0x843]={ arabic="d", category="lo", description="MANDAIC LETTER AD", direction="r", linebreak="al", - unicodeslot=0x0843, + unicodeslot=0x843, }, - [0x0844]={ + [0x844]={ arabic="d", category="lo", description="MANDAIC LETTER AH", direction="r", linebreak="al", - unicodeslot=0x0844, + unicodeslot=0x844, }, - [0x0845]={ + [0x845]={ arabic="d", category="lo", description="MANDAIC LETTER USHENNA", direction="r", linebreak="al", - unicodeslot=0x0845, + unicodeslot=0x845, }, - [0x0846]={ + [0x846]={ arabic="r", category="lo", description="MANDAIC LETTER AZ", direction="r", linebreak="al", - unicodeslot=0x0846, + unicodeslot=0x846, }, - [0x0847]={ + [0x847]={ arabic="d", category="lo", description="MANDAIC LETTER IT", direction="r", linebreak="al", - unicodeslot=0x0847, + unicodeslot=0x847, }, - [0x0848]={ + [0x848]={ arabic="d", category="lo", description="MANDAIC LETTER ATT", direction="r", linebreak="al", - unicodeslot=0x0848, + unicodeslot=0x848, }, - [0x0849]={ + [0x849]={ arabic="r", category="lo", description="MANDAIC LETTER AKSA", direction="r", linebreak="al", - unicodeslot=0x0849, + unicodeslot=0x849, }, - [0x084A]={ + [0x84A]={ arabic="d", category="lo", description="MANDAIC LETTER AK", direction="r", linebreak="al", - unicodeslot=0x084A, + unicodeslot=0x84A, }, - [0x084B]={ + [0x84B]={ arabic="d", category="lo", description="MANDAIC LETTER AL", direction="r", linebreak="al", - unicodeslot=0x084B, + unicodeslot=0x84B, }, - [0x084C]={ + [0x84C]={ arabic="d", category="lo", description="MANDAIC LETTER AM", direction="r", linebreak="al", - unicodeslot=0x084C, + unicodeslot=0x84C, }, - [0x084D]={ + [0x84D]={ arabic="d", category="lo", description="MANDAIC LETTER AN", direction="r", linebreak="al", - unicodeslot=0x084D, + unicodeslot=0x84D, }, - [0x084E]={ + [0x84E]={ arabic="d", category="lo", description="MANDAIC LETTER AS", direction="r", linebreak="al", - unicodeslot=0x084E, + unicodeslot=0x84E, }, - [0x084F]={ + [0x84F]={ arabic="r", category="lo", description="MANDAIC LETTER IN", direction="r", linebreak="al", - unicodeslot=0x084F, + unicodeslot=0x84F, }, - [0x0850]={ + [0x850]={ arabic="d", category="lo", description="MANDAIC LETTER AP", direction="r", linebreak="al", - unicodeslot=0x0850, + unicodeslot=0x850, }, - [0x0851]={ + [0x851]={ arabic="d", category="lo", description="MANDAIC LETTER ASZ", direction="r", linebreak="al", - unicodeslot=0x0851, + unicodeslot=0x851, }, - [0x0852]={ + [0x852]={ arabic="d", category="lo", description="MANDAIC LETTER AQ", direction="r", linebreak="al", - unicodeslot=0x0852, + unicodeslot=0x852, }, - [0x0853]={ + [0x853]={ arabic="d", category="lo", description="MANDAIC LETTER AR", direction="r", linebreak="al", - unicodeslot=0x0853, + unicodeslot=0x853, }, - [0x0854]={ + [0x854]={ arabic="r", category="lo", description="MANDAIC LETTER ASH", direction="r", linebreak="al", - unicodeslot=0x0854, + unicodeslot=0x854, }, - [0x0855]={ + [0x855]={ arabic="d", category="lo", description="MANDAIC LETTER AT", direction="r", linebreak="al", - unicodeslot=0x0855, + unicodeslot=0x855, }, - [0x0856]={ + [0x856]={ arabic="u", category="lo", description="MANDAIC LETTER DUSHENNA", direction="r", linebreak="al", - unicodeslot=0x0856, + unicodeslot=0x856, }, - [0x0857]={ + [0x857]={ arabic="u", category="lo", description="MANDAIC LETTER KAD", direction="r", linebreak="al", - unicodeslot=0x0857, + unicodeslot=0x857, }, - [0x0858]={ + [0x858]={ arabic="u", category="lo", description="MANDAIC LETTER AIN", direction="r", linebreak="al", - unicodeslot=0x0858, + unicodeslot=0x858, }, - [0x0859]={ + [0x859]={ category="mn", + combining=0xDC, description="MANDAIC AFFRICATION MARK", direction="nsm", linebreak="cm", - unicodeslot=0x0859, + unicodeslot=0x859, }, - [0x085A]={ + [0x85A]={ category="mn", + combining=0xDC, description="MANDAIC VOCALIZATION MARK", direction="nsm", linebreak="cm", - unicodeslot=0x085A, + unicodeslot=0x85A, }, - [0x085B]={ + [0x85B]={ category="mn", + combining=0xDC, description="MANDAIC GEMINATION MARK", direction="nsm", linebreak="cm", - unicodeslot=0x085B, + unicodeslot=0x85B, }, - [0x085E]={ + [0x85E]={ category="po", description="MANDAIC PUNCTUATION", direction="r", linebreak="al", - unicodeslot=0x085E, + unicodeslot=0x85E, }, - [0x08A0]={ + [0x8A0]={ arabic="d", category="lo", description="ARABIC LETTER BEH WITH SMALL V BELOW", direction="al", linebreak="al", - unicodeslot=0x08A0, + unicodeslot=0x8A0, }, - [0x08A2]={ + [0x8A1]={ + arabic="d", + category="lo", + description="ARABIC LETTER BEH WITH HAMZA ABOVE", + direction="al", + linebreak="al", + unicodeslot=0x8A1, + }, + [0x8A2]={ arabic="d", category="lo", description="ARABIC LETTER JEEM WITH TWO DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A2, + unicodeslot=0x8A2, }, - [0x08A3]={ + [0x8A3]={ arabic="d", category="lo", description="ARABIC LETTER TAH WITH TWO DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A3, + unicodeslot=0x8A3, }, - [0x08A4]={ + [0x8A4]={ arabic="d", category="lo", description="ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A4, + unicodeslot=0x8A4, }, - [0x08A5]={ + [0x8A5]={ arabic="d", category="lo", description="ARABIC LETTER QAF WITH DOT BELOW", direction="al", linebreak="al", - unicodeslot=0x08A5, + unicodeslot=0x8A5, }, - [0x08A6]={ + [0x8A6]={ arabic="d", category="lo", description="ARABIC LETTER LAM WITH DOUBLE BAR", direction="al", linebreak="al", - unicodeslot=0x08A6, + unicodeslot=0x8A6, }, - [0x08A7]={ + [0x8A7]={ arabic="d", category="lo", description="ARABIC LETTER MEEM WITH THREE DOTS ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A7, + unicodeslot=0x8A7, }, - [0x08A8]={ + [0x8A8]={ arabic="d", category="lo", description="ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A8, + unicodeslot=0x8A8, }, - [0x08A9]={ + [0x8A9]={ arabic="d", category="lo", description="ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE", direction="al", linebreak="al", - unicodeslot=0x08A9, + unicodeslot=0x8A9, }, - [0x08AA]={ + [0x8AA]={ arabic="r", category="lo", description="ARABIC LETTER REH WITH LOOP", direction="al", linebreak="al", - unicodeslot=0x08AA, + unicodeslot=0x8AA, }, - [0x08AB]={ + [0x8AB]={ arabic="r", category="lo", description="ARABIC LETTER WAW WITH DOT WITHIN", direction="al", linebreak="al", - unicodeslot=0x08AB, + unicodeslot=0x8AB, }, - [0x08AC]={ + [0x8AC]={ arabic="r", category="lo", description="ARABIC LETTER ROHINGYA YEH", direction="al", linebreak="al", - unicodeslot=0x08AC, + unicodeslot=0x8AC, + }, + [0x8AD]={ + arabic="u", + category="lo", + description="ARABIC LETTER LOW ALEF", + direction="al", + linebreak="al", + unicodeslot=0x8AD, + }, + [0x8AE]={ + arabic="r", + category="lo", + description="ARABIC LETTER DAL WITH THREE DOTS BELOW", + direction="al", + linebreak="al", + unicodeslot=0x8AE, + }, + [0x8AF]={ + arabic="d", + category="lo", + description="ARABIC LETTER SAD WITH THREE DOTS BELOW", + direction="al", + linebreak="al", + unicodeslot=0x8AF, + }, + [0x8B0]={ + arabic="d", + category="lo", + description="ARABIC LETTER GAF WITH INVERTED STROKE", + direction="al", + linebreak="al", + unicodeslot=0x8B0, }, - [0x08E4]={ + [0x8B1]={ + arabic="r", + category="lo", + description="ARABIC LETTER STRAIGHT WAW", + direction="al", + linebreak="al", + unicodeslot=0x8B1, + }, + [0x8B2]={ + arabic="r", + category="lo", + description="ARABIC LETTER ZAIN WITH INVERTED V ABOVE", + direction="al", + linebreak="al", + unicodeslot=0x8B2, + }, + [0x8E4]={ category="mn", + combining=0xE6, description="ARABIC CURLY FATHA", direction="nsm", linebreak="cm", - unicodeslot=0x08E4, + unicodeslot=0x8E4, }, - [0x08E5]={ + [0x8E5]={ category="mn", + combining=0xE6, description="ARABIC CURLY DAMMA", direction="nsm", linebreak="cm", - unicodeslot=0x08E5, + unicodeslot=0x8E5, }, - [0x08E6]={ + [0x8E6]={ category="mn", + combining=0xDC, description="ARABIC CURLY KASRA", direction="nsm", linebreak="cm", - unicodeslot=0x08E6, + unicodeslot=0x8E6, }, - [0x08E7]={ + [0x8E7]={ category="mn", + combining=0xE6, description="ARABIC CURLY FATHATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08E7, + unicodeslot=0x8E7, }, - [0x08E8]={ + [0x8E8]={ category="mn", + combining=0xE6, description="ARABIC CURLY DAMMATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08E8, + unicodeslot=0x8E8, }, - [0x08E9]={ + [0x8E9]={ category="mn", + combining=0xDC, description="ARABIC CURLY KASRATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08E9, + unicodeslot=0x8E9, }, - [0x08EA]={ + [0x8EA]={ category="mn", + combining=0xE6, description="ARABIC TONE ONE DOT ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08EA, + unicodeslot=0x8EA, }, - [0x08EB]={ + [0x8EB]={ category="mn", + combining=0xE6, description="ARABIC TONE TWO DOTS ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08EB, + unicodeslot=0x8EB, }, - [0x08EC]={ + [0x8EC]={ category="mn", + combining=0xE6, description="ARABIC TONE LOOP ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08EC, + unicodeslot=0x8EC, }, - [0x08ED]={ + [0x8ED]={ category="mn", + combining=0xDC, description="ARABIC TONE ONE DOT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08ED, + unicodeslot=0x8ED, }, - [0x08EE]={ + [0x8EE]={ category="mn", + combining=0xDC, description="ARABIC TONE TWO DOTS BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08EE, + unicodeslot=0x8EE, }, - [0x08EF]={ + [0x8EF]={ category="mn", + combining=0xDC, description="ARABIC TONE LOOP BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08EF, + unicodeslot=0x8EF, }, - [0x08F0]={ + [0x8F0]={ category="mn", + combining=0x1B, description="ARABIC OPEN FATHATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08F0, + unicodeslot=0x8F0, }, - [0x08F1]={ + [0x8F1]={ category="mn", + combining=0x1C, description="ARABIC OPEN DAMMATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08F1, + unicodeslot=0x8F1, }, - [0x08F2]={ + [0x8F2]={ category="mn", + combining=0x1D, description="ARABIC OPEN KASRATAN", direction="nsm", linebreak="cm", - unicodeslot=0x08F2, + unicodeslot=0x8F2, }, - [0x08F3]={ + [0x8F3]={ category="mn", + combining=0xE6, description="ARABIC SMALL HIGH WAW", direction="nsm", linebreak="cm", - unicodeslot=0x08F3, + unicodeslot=0x8F3, }, - [0x08F4]={ + [0x8F4]={ category="mn", + combining=0xE6, description="ARABIC FATHA WITH RING", direction="nsm", linebreak="cm", - unicodeslot=0x08F4, + unicodeslot=0x8F4, }, - [0x08F5]={ + [0x8F5]={ category="mn", + combining=0xE6, description="ARABIC FATHA WITH DOT ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08F5, + unicodeslot=0x8F5, }, - [0x08F6]={ + [0x8F6]={ category="mn", + combining=0xDC, description="ARABIC KASRA WITH DOT BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08F6, + unicodeslot=0x8F6, }, - [0x08F7]={ + [0x8F7]={ category="mn", + combining=0xE6, description="ARABIC LEFT ARROWHEAD ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08F7, + unicodeslot=0x8F7, }, - [0x08F8]={ + [0x8F8]={ category="mn", + combining=0xE6, description="ARABIC RIGHT ARROWHEAD ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08F8, + unicodeslot=0x8F8, }, - [0x08F9]={ + [0x8F9]={ category="mn", + combining=0xDC, description="ARABIC LEFT ARROWHEAD BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08F9, + unicodeslot=0x8F9, }, - [0x08FA]={ + [0x8FA]={ category="mn", + combining=0xDC, description="ARABIC RIGHT ARROWHEAD BELOW", direction="nsm", linebreak="cm", - unicodeslot=0x08FA, + unicodeslot=0x8FA, }, - [0x08FB]={ + [0x8FB]={ category="mn", + combining=0xE6, description="ARABIC DOUBLE RIGHT ARROWHEAD ABOVE", direction="nsm", linebreak="cm", - unicodeslot=0x08FB, + unicodeslot=0x8FB, }, - [0x08FC]={ + [0x8FC]={ category="mn", + combining=0xE6, description="ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT", direction="nsm", linebreak="cm", - unicodeslot=0x08FC, + unicodeslot=0x8FC, }, - [0x08FD]={ + [0x8FD]={ category="mn", + combining=0xE6, description="ARABIC RIGHT ARROWHEAD ABOVE WITH DOT", direction="nsm", linebreak="cm", - unicodeslot=0x08FD, + unicodeslot=0x8FD, }, - [0x08FE]={ + [0x8FE]={ category="mn", + combining=0xE6, description="ARABIC DAMMA WITH DOT", direction="nsm", linebreak="cm", - unicodeslot=0x08FE, + unicodeslot=0x8FE, + }, + [0x8FF]={ + category="mn", + combining=0xE6, + description="ARABIC MARK SIDEWAYS NOON GHUNNA", + direction="nsm", + linebreak="cm", + unicodeslot=0x8FF, }, - [0x0900]={ + [0x900]={ category="mn", description="DEVANAGARI SIGN INVERTED CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0900, + unicodeslot=0x900, }, - [0x0901]={ + [0x901]={ adobename="candrabindudeva", category="mn", description="DEVANAGARI SIGN CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0901, + unicodeslot=0x901, }, - [0x0902]={ + [0x902]={ adobename="anusvaradeva", category="mn", description="DEVANAGARI SIGN ANUSVARA", direction="nsm", linebreak="cm", - unicodeslot=0x0902, + unicodeslot=0x902, }, - [0x0903]={ + [0x903]={ adobename="visargadeva", category="mc", description="DEVANAGARI SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0903, + unicodeslot=0x903, }, - [0x0904]={ + [0x904]={ category="lo", description="DEVANAGARI LETTER SHORT A", direction="l", linebreak="al", - unicodeslot=0x0904, + unicodeslot=0x904, }, - [0x0905]={ + [0x905]={ adobename="adeva", category="lo", description="DEVANAGARI LETTER A", direction="l", linebreak="al", - unicodeslot=0x0905, + unicodeslot=0x905, }, - [0x0906]={ + [0x906]={ adobename="aadeva", category="lo", description="DEVANAGARI LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0906, + unicodeslot=0x906, }, - [0x0907]={ + [0x907]={ adobename="ideva", category="lo", description="DEVANAGARI LETTER I", direction="l", linebreak="al", - unicodeslot=0x0907, + unicodeslot=0x907, }, - [0x0908]={ + [0x908]={ adobename="iideva", category="lo", description="DEVANAGARI LETTER II", direction="l", linebreak="al", - unicodeslot=0x0908, + unicodeslot=0x908, }, - [0x0909]={ + [0x909]={ adobename="udeva", category="lo", description="DEVANAGARI LETTER U", direction="l", linebreak="al", - unicodeslot=0x0909, + unicodeslot=0x909, }, - [0x090A]={ + [0x90A]={ adobename="uudeva", category="lo", description="DEVANAGARI LETTER UU", direction="l", linebreak="al", - unicodeslot=0x090A, + unicodeslot=0x90A, }, - [0x090B]={ + [0x90B]={ adobename="rvocalicdeva", category="lo", description="DEVANAGARI LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x090B, + unicodeslot=0x90B, }, - [0x090C]={ + [0x90C]={ adobename="lvocalicdeva", category="lo", description="DEVANAGARI LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x090C, + unicodeslot=0x90C, }, - [0x090D]={ + [0x90D]={ adobename="ecandradeva", category="lo", description="DEVANAGARI LETTER CANDRA E", direction="l", linebreak="al", - unicodeslot=0x090D, + unicodeslot=0x90D, }, - [0x090E]={ + [0x90E]={ adobename="eshortdeva", category="lo", description="DEVANAGARI LETTER SHORT E", direction="l", linebreak="al", - unicodeslot=0x090E, + unicodeslot=0x90E, }, - [0x090F]={ + [0x90F]={ adobename="edeva", category="lo", description="DEVANAGARI LETTER E", direction="l", linebreak="al", - unicodeslot=0x090F, + unicodeslot=0x90F, }, - [0x0910]={ + [0x910]={ adobename="aideva", category="lo", description="DEVANAGARI LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0910, + unicodeslot=0x910, }, - [0x0911]={ + [0x911]={ adobename="ocandradeva", category="lo", description="DEVANAGARI LETTER CANDRA O", direction="l", linebreak="al", - unicodeslot=0x0911, + unicodeslot=0x911, }, - [0x0912]={ + [0x912]={ adobename="oshortdeva", category="lo", description="DEVANAGARI LETTER SHORT O", direction="l", linebreak="al", - unicodeslot=0x0912, + unicodeslot=0x912, }, - [0x0913]={ + [0x913]={ adobename="odeva", category="lo", description="DEVANAGARI LETTER O", direction="l", linebreak="al", - unicodeslot=0x0913, + unicodeslot=0x913, }, - [0x0914]={ + [0x914]={ adobename="audeva", category="lo", description="DEVANAGARI LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0914, + unicodeslot=0x914, }, - [0x0915]={ + [0x915]={ adobename="kadeva", category="lo", description="DEVANAGARI LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0915, + unicodeslot=0x915, }, - [0x0916]={ + [0x916]={ adobename="khadeva", category="lo", description="DEVANAGARI LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0916, + unicodeslot=0x916, }, - [0x0917]={ + [0x917]={ adobename="gadeva", category="lo", description="DEVANAGARI LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0917, + unicodeslot=0x917, }, - [0x0918]={ + [0x918]={ adobename="ghadeva", category="lo", description="DEVANAGARI LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0918, + unicodeslot=0x918, }, - [0x0919]={ + [0x919]={ adobename="ngadeva", category="lo", description="DEVANAGARI LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0919, + unicodeslot=0x919, }, - [0x091A]={ + [0x91A]={ adobename="cadeva", category="lo", description="DEVANAGARI LETTER CA", direction="l", linebreak="al", - unicodeslot=0x091A, + unicodeslot=0x91A, }, - [0x091B]={ + [0x91B]={ adobename="chadeva", category="lo", description="DEVANAGARI LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x091B, + unicodeslot=0x91B, }, - [0x091C]={ + [0x91C]={ adobename="jadeva", category="lo", description="DEVANAGARI LETTER JA", direction="l", linebreak="al", - unicodeslot=0x091C, + unicodeslot=0x91C, }, - [0x091D]={ + [0x91D]={ adobename="jhadeva", category="lo", description="DEVANAGARI LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x091D, + unicodeslot=0x91D, }, - [0x091E]={ + [0x91E]={ adobename="nyadeva", category="lo", description="DEVANAGARI LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x091E, + unicodeslot=0x91E, }, - [0x091F]={ + [0x91F]={ adobename="ttadeva", category="lo", description="DEVANAGARI LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x091F, + unicodeslot=0x91F, }, - [0x0920]={ + [0x920]={ adobename="tthadeva", category="lo", description="DEVANAGARI LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0920, + unicodeslot=0x920, }, - [0x0921]={ + [0x921]={ adobename="ddadeva", category="lo", description="DEVANAGARI LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0921, + unicodeslot=0x921, }, - [0x0922]={ + [0x922]={ adobename="ddhadeva", category="lo", description="DEVANAGARI LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0922, + unicodeslot=0x922, }, - [0x0923]={ + [0x923]={ adobename="nnadeva", category="lo", description="DEVANAGARI LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0923, + unicodeslot=0x923, }, - [0x0924]={ + [0x924]={ adobename="tadeva", category="lo", description="DEVANAGARI LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0924, + unicodeslot=0x924, }, - [0x0925]={ + [0x925]={ adobename="thadeva", category="lo", description="DEVANAGARI LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0925, + unicodeslot=0x925, }, - [0x0926]={ + [0x926]={ adobename="dadeva", category="lo", description="DEVANAGARI LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0926, + unicodeslot=0x926, }, - [0x0927]={ + [0x927]={ adobename="dhadeva", category="lo", description="DEVANAGARI LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0927, + unicodeslot=0x927, }, - [0x0928]={ + [0x928]={ adobename="nadeva", category="lo", description="DEVANAGARI LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0928, + unicodeslot=0x928, }, - [0x0929]={ + [0x929]={ adobename="nnnadeva", category="lo", description="DEVANAGARI LETTER NNNA", direction="l", linebreak="al", - specials={ "char", 0x0928, 0x093C }, - unicodeslot=0x0929, + specials={ "char", 0x928, 0x93C }, + unicodeslot=0x929, }, - [0x092A]={ + [0x92A]={ adobename="padeva", category="lo", description="DEVANAGARI LETTER PA", direction="l", linebreak="al", - unicodeslot=0x092A, + unicodeslot=0x92A, }, - [0x092B]={ + [0x92B]={ adobename="phadeva", category="lo", description="DEVANAGARI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x092B, + unicodeslot=0x92B, }, - [0x092C]={ + [0x92C]={ adobename="badeva", category="lo", description="DEVANAGARI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x092C, + unicodeslot=0x92C, }, - [0x092D]={ + [0x92D]={ adobename="bhadeva", category="lo", description="DEVANAGARI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x092D, + unicodeslot=0x92D, }, - [0x092E]={ + [0x92E]={ adobename="madeva", category="lo", description="DEVANAGARI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x092E, + unicodeslot=0x92E, }, - [0x092F]={ + [0x92F]={ adobename="yadeva", category="lo", description="DEVANAGARI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x092F, + unicodeslot=0x92F, }, - [0x0930]={ + [0x930]={ adobename="radeva", category="lo", description="DEVANAGARI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0930, + unicodeslot=0x930, }, - [0x0931]={ + [0x931]={ adobename="rradeva", category="lo", description="DEVANAGARI LETTER RRA", direction="l", linebreak="al", - specials={ "char", 0x0930, 0x093C }, - unicodeslot=0x0931, + specials={ "char", 0x930, 0x93C }, + unicodeslot=0x931, }, - [0x0932]={ + [0x932]={ adobename="ladeva", category="lo", description="DEVANAGARI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0932, + unicodeslot=0x932, }, - [0x0933]={ + [0x933]={ adobename="lladeva", category="lo", description="DEVANAGARI LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0933, + unicodeslot=0x933, }, - [0x0934]={ + [0x934]={ adobename="llladeva", category="lo", description="DEVANAGARI LETTER LLLA", direction="l", linebreak="al", - specials={ "char", 0x0933, 0x093C }, - unicodeslot=0x0934, + specials={ "char", 0x933, 0x93C }, + unicodeslot=0x934, }, - [0x0935]={ + [0x935]={ adobename="vadeva", category="lo", description="DEVANAGARI LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0935, + unicodeslot=0x935, }, - [0x0936]={ + [0x936]={ adobename="shadeva", category="lo", description="DEVANAGARI LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0936, + unicodeslot=0x936, }, - [0x0937]={ + [0x937]={ adobename="ssadeva", category="lo", description="DEVANAGARI LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0937, + unicodeslot=0x937, }, - [0x0938]={ + [0x938]={ adobename="sadeva", category="lo", description="DEVANAGARI LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0938, + unicodeslot=0x938, }, - [0x0939]={ + [0x939]={ adobename="hadeva", category="lo", description="DEVANAGARI LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0939, + unicodeslot=0x939, }, - [0x093A]={ + [0x93A]={ category="mn", description="DEVANAGARI VOWEL SIGN OE", direction="nsm", linebreak="cm", - unicodeslot=0x093A, + unicodeslot=0x93A, }, - [0x093B]={ + [0x93B]={ category="mc", description="DEVANAGARI VOWEL SIGN OOE", direction="l", linebreak="cm", - unicodeslot=0x093B, + unicodeslot=0x93B, }, - [0x093C]={ + [0x93C]={ adobename="nuktadeva", category="mn", + combining=0x7, description="DEVANAGARI SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x093C, + unicodeslot=0x93C, }, - [0x093D]={ + [0x93D]={ adobename="avagrahadeva", category="lo", description="DEVANAGARI SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x093D, + unicodeslot=0x93D, }, - [0x093E]={ + [0x93E]={ adobename="aavowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x093E, + unicodeslot=0x93E, }, - [0x093F]={ + [0x93F]={ adobename="ivowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x093F, + unicodeslot=0x93F, }, - [0x0940]={ + [0x940]={ adobename="iivowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x0940, + unicodeslot=0x940, }, - [0x0941]={ + [0x941]={ adobename="uvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0941, + unicodeslot=0x941, }, - [0x0942]={ + [0x942]={ adobename="uuvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x0942, + unicodeslot=0x942, }, - [0x0943]={ + [0x943]={ adobename="rvocalicvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - unicodeslot=0x0943, + unicodeslot=0x943, }, - [0x0944]={ + [0x944]={ adobename="rrvocalicvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - unicodeslot=0x0944, + unicodeslot=0x944, }, - [0x0945]={ + [0x945]={ adobename="ecandravowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN CANDRA E", direction="nsm", linebreak="cm", - unicodeslot=0x0945, + unicodeslot=0x945, }, - [0x0946]={ + [0x946]={ adobename="eshortvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN SHORT E", direction="nsm", linebreak="cm", - unicodeslot=0x0946, + unicodeslot=0x946, }, - [0x0947]={ + [0x947]={ adobename="evowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x0947, + unicodeslot=0x947, }, - [0x0948]={ + [0x948]={ adobename="aivowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN AI", direction="nsm", linebreak="cm", - unicodeslot=0x0948, + unicodeslot=0x948, }, - [0x0949]={ + [0x949]={ adobename="ocandravowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN CANDRA O", direction="l", linebreak="cm", - unicodeslot=0x0949, + unicodeslot=0x949, }, - [0x094A]={ + [0x94A]={ adobename="oshortvowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN SHORT O", direction="l", linebreak="cm", - unicodeslot=0x094A, + unicodeslot=0x94A, }, - [0x094B]={ + [0x94B]={ adobename="ovowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN O", direction="l", linebreak="cm", - unicodeslot=0x094B, + unicodeslot=0x94B, }, - [0x094C]={ + [0x94C]={ adobename="auvowelsigndeva", category="mc", description="DEVANAGARI VOWEL SIGN AU", direction="l", linebreak="cm", - unicodeslot=0x094C, + unicodeslot=0x94C, }, - [0x094D]={ + [0x94D]={ adobename="viramadeva", category="mn", + combining=0x9, description="DEVANAGARI SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x094D, + unicodeslot=0x94D, }, - [0x094E]={ + [0x94E]={ category="mc", description="DEVANAGARI VOWEL SIGN PRISHTHAMATRA E", direction="l", linebreak="cm", - unicodeslot=0x094E, + unicodeslot=0x94E, }, - [0x094F]={ + [0x94F]={ category="mc", description="DEVANAGARI VOWEL SIGN AW", direction="l", linebreak="cm", - unicodeslot=0x094F, + unicodeslot=0x94F, }, - [0x0950]={ + [0x950]={ adobename="omdeva", category="lo", description="DEVANAGARI OM", direction="l", linebreak="al", - unicodeslot=0x0950, + unicodeslot=0x950, }, - [0x0951]={ + [0x951]={ adobename="udattadeva", category="mn", + combining=0xE6, description="DEVANAGARI STRESS SIGN UDATTA", direction="nsm", linebreak="cm", - unicodeslot=0x0951, + unicodeslot=0x951, }, - [0x0952]={ + [0x952]={ adobename="anudattadeva", category="mn", + combining=0xDC, description="DEVANAGARI STRESS SIGN ANUDATTA", direction="nsm", linebreak="cm", - unicodeslot=0x0952, + unicodeslot=0x952, }, - [0x0953]={ + [0x953]={ adobename="gravedeva", category="mn", + combining=0xE6, description="DEVANAGARI GRAVE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x0953, + unicodeslot=0x953, }, - [0x0954]={ + [0x954]={ adobename="acutedeva", category="mn", + combining=0xE6, description="DEVANAGARI ACUTE ACCENT", direction="nsm", linebreak="cm", - unicodeslot=0x0954, + unicodeslot=0x954, }, - [0x0955]={ + [0x955]={ category="mn", description="DEVANAGARI VOWEL SIGN CANDRA LONG E", direction="nsm", linebreak="cm", - unicodeslot=0x0955, + unicodeslot=0x955, }, - [0x0956]={ + [0x956]={ category="mn", description="DEVANAGARI VOWEL SIGN UE", direction="nsm", linebreak="cm", - unicodeslot=0x0956, + unicodeslot=0x956, }, - [0x0957]={ + [0x957]={ category="mn", description="DEVANAGARI VOWEL SIGN UUE", direction="nsm", linebreak="cm", - unicodeslot=0x0957, + unicodeslot=0x957, }, - [0x0958]={ + [0x958]={ adobename="qadeva", category="lo", description="DEVANAGARI LETTER QA", direction="l", linebreak="al", - specials={ "char", 0x0915, 0x093C }, - unicodeslot=0x0958, + specials={ "char", 0x915, 0x93C }, + unicodeslot=0x958, }, - [0x0959]={ + [0x959]={ adobename="khhadeva", category="lo", description="DEVANAGARI LETTER KHHA", direction="l", linebreak="al", - specials={ "char", 0x0916, 0x093C }, - unicodeslot=0x0959, + specials={ "char", 0x916, 0x93C }, + unicodeslot=0x959, }, - [0x095A]={ + [0x95A]={ adobename="ghhadeva", category="lo", description="DEVANAGARI LETTER GHHA", direction="l", linebreak="al", - specials={ "char", 0x0917, 0x093C }, - unicodeslot=0x095A, + specials={ "char", 0x917, 0x93C }, + unicodeslot=0x95A, }, - [0x095B]={ + [0x95B]={ adobename="zadeva", category="lo", description="DEVANAGARI LETTER ZA", direction="l", linebreak="al", - specials={ "char", 0x091C, 0x093C }, - unicodeslot=0x095B, + specials={ "char", 0x91C, 0x93C }, + unicodeslot=0x95B, }, - [0x095C]={ + [0x95C]={ adobename="dddhadeva", category="lo", description="DEVANAGARI LETTER DDDHA", direction="l", linebreak="al", - specials={ "char", 0x0921, 0x093C }, - unicodeslot=0x095C, + specials={ "char", 0x921, 0x93C }, + unicodeslot=0x95C, }, - [0x095D]={ + [0x95D]={ adobename="rhadeva", category="lo", description="DEVANAGARI LETTER RHA", direction="l", linebreak="al", - specials={ "char", 0x0922, 0x093C }, - unicodeslot=0x095D, + specials={ "char", 0x922, 0x93C }, + unicodeslot=0x95D, }, - [0x095E]={ + [0x95E]={ adobename="fadeva", category="lo", description="DEVANAGARI LETTER FA", direction="l", linebreak="al", - specials={ "char", 0x092B, 0x093C }, - unicodeslot=0x095E, + specials={ "char", 0x92B, 0x93C }, + unicodeslot=0x95E, }, - [0x095F]={ + [0x95F]={ adobename="yyadeva", category="lo", description="DEVANAGARI LETTER YYA", direction="l", linebreak="al", - specials={ "char", 0x092F, 0x093C }, - unicodeslot=0x095F, + specials={ "char", 0x92F, 0x93C }, + unicodeslot=0x95F, }, - [0x0960]={ + [0x960]={ adobename="rrvocalicdeva", category="lo", description="DEVANAGARI LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0960, + unicodeslot=0x960, }, - [0x0961]={ + [0x961]={ adobename="llvocalicdeva", category="lo", description="DEVANAGARI LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0961, + unicodeslot=0x961, }, - [0x0962]={ + [0x962]={ adobename="lvocalicvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0962, + unicodeslot=0x962, }, - [0x0963]={ + [0x963]={ adobename="llvocalicvowelsigndeva", category="mn", description="DEVANAGARI VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0963, + unicodeslot=0x963, }, - [0x0964]={ + [0x964]={ adobename="danda", category="po", description="DEVANAGARI DANDA", direction="l", linebreak="ba", - unicodeslot=0x0964, + unicodeslot=0x964, }, - [0x0965]={ + [0x965]={ adobename="dbldanda", category="po", description="DEVANAGARI DOUBLE DANDA", direction="l", linebreak="ba", - unicodeslot=0x0965, + unicodeslot=0x965, }, - [0x0966]={ + [0x966]={ adobename="zerodeva", category="nd", description="DEVANAGARI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0966, + unicodeslot=0x966, }, - [0x0967]={ + [0x967]={ adobename="onedeva", category="nd", description="DEVANAGARI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0967, + unicodeslot=0x967, }, - [0x0968]={ + [0x968]={ adobename="twodeva", category="nd", description="DEVANAGARI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0968, + unicodeslot=0x968, }, - [0x0969]={ + [0x969]={ adobename="threedeva", category="nd", description="DEVANAGARI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0969, + unicodeslot=0x969, }, - [0x096A]={ + [0x96A]={ adobename="fourdeva", category="nd", description="DEVANAGARI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x096A, + unicodeslot=0x96A, }, - [0x096B]={ + [0x96B]={ adobename="fivedeva", category="nd", description="DEVANAGARI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x096B, + unicodeslot=0x96B, }, - [0x096C]={ + [0x96C]={ adobename="sixdeva", category="nd", description="DEVANAGARI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x096C, + unicodeslot=0x96C, }, - [0x096D]={ + [0x96D]={ adobename="sevendeva", category="nd", description="DEVANAGARI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x096D, + unicodeslot=0x96D, }, - [0x096E]={ + [0x96E]={ adobename="eightdeva", category="nd", description="DEVANAGARI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x096E, + unicodeslot=0x96E, }, - [0x096F]={ + [0x96F]={ adobename="ninedeva", category="nd", description="DEVANAGARI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x096F, + unicodeslot=0x96F, }, - [0x0970]={ + [0x970]={ adobename="abbreviationsigndeva", category="po", description="DEVANAGARI ABBREVIATION SIGN", direction="l", linebreak="al", - unicodeslot=0x0970, + unicodeslot=0x970, }, - [0x0971]={ + [0x971]={ category="lm", description="DEVANAGARI SIGN HIGH SPACING DOT", direction="l", linebreak="al", - unicodeslot=0x0971, + unicodeslot=0x971, }, - [0x0972]={ + [0x972]={ category="lo", description="DEVANAGARI LETTER CANDRA A", direction="l", linebreak="al", - unicodeslot=0x0972, + unicodeslot=0x972, }, - [0x0973]={ + [0x973]={ category="lo", description="DEVANAGARI LETTER OE", direction="l", linebreak="al", - unicodeslot=0x0973, + unicodeslot=0x973, }, - [0x0974]={ + [0x974]={ category="lo", description="DEVANAGARI LETTER OOE", direction="l", linebreak="al", - unicodeslot=0x0974, + unicodeslot=0x974, }, - [0x0975]={ + [0x975]={ category="lo", description="DEVANAGARI LETTER AW", direction="l", linebreak="al", - unicodeslot=0x0975, + unicodeslot=0x975, }, - [0x0976]={ + [0x976]={ category="lo", description="DEVANAGARI LETTER UE", direction="l", linebreak="al", - unicodeslot=0x0976, + unicodeslot=0x976, }, - [0x0977]={ + [0x977]={ category="lo", description="DEVANAGARI LETTER UUE", direction="l", linebreak="al", - unicodeslot=0x0977, + unicodeslot=0x977, }, - [0x0979]={ + [0x978]={ + category="lo", + description="DEVANAGARI LETTER MARWARI DDA", + direction="l", + linebreak="al", + unicodeslot=0x978, + }, + [0x979]={ category="lo", description="DEVANAGARI LETTER ZHA", direction="l", linebreak="al", - unicodeslot=0x0979, + unicodeslot=0x979, }, - [0x097A]={ + [0x97A]={ category="lo", description="DEVANAGARI LETTER HEAVY YA", direction="l", linebreak="al", - unicodeslot=0x097A, + unicodeslot=0x97A, }, - [0x097B]={ + [0x97B]={ category="lo", description="DEVANAGARI LETTER GGA", direction="l", linebreak="al", - unicodeslot=0x097B, + unicodeslot=0x97B, }, - [0x097C]={ + [0x97C]={ category="lo", description="DEVANAGARI LETTER JJA", direction="l", linebreak="al", - unicodeslot=0x097C, + unicodeslot=0x97C, }, - [0x097D]={ + [0x97D]={ category="lo", description="DEVANAGARI LETTER GLOTTAL STOP", direction="l", linebreak="al", - unicodeslot=0x097D, + unicodeslot=0x97D, }, - [0x097E]={ + [0x97E]={ category="lo", description="DEVANAGARI LETTER DDDA", direction="l", linebreak="al", - unicodeslot=0x097E, + unicodeslot=0x97E, }, - [0x097F]={ + [0x97F]={ category="lo", description="DEVANAGARI LETTER BBA", direction="l", linebreak="al", - unicodeslot=0x097F, + unicodeslot=0x97F, + }, + [0x980]={ + category="lo", + description="BENGALI ANJI", + direction="l", + linebreak="al", + unicodeslot=0x980, }, - [0x0981]={ + [0x981]={ adobename="candrabindubengali", category="mn", description="BENGALI SIGN CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0981, + unicodeslot=0x981, }, - [0x0982]={ + [0x982]={ adobename="anusvarabengali", category="mc", description="BENGALI SIGN ANUSVARA", direction="l", linebreak="cm", - unicodeslot=0x0982, + unicodeslot=0x982, }, - [0x0983]={ + [0x983]={ adobename="visargabengali", category="mc", description="BENGALI SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0983, + unicodeslot=0x983, }, - [0x0985]={ + [0x985]={ adobename="abengali", category="lo", description="BENGALI LETTER A", direction="l", linebreak="al", - unicodeslot=0x0985, + unicodeslot=0x985, }, - [0x0986]={ + [0x986]={ adobename="aabengali", category="lo", description="BENGALI LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0986, + unicodeslot=0x986, }, - [0x0987]={ + [0x987]={ adobename="ibengali", category="lo", description="BENGALI LETTER I", direction="l", linebreak="al", - unicodeslot=0x0987, + unicodeslot=0x987, }, - [0x0988]={ + [0x988]={ adobename="iibengali", category="lo", description="BENGALI LETTER II", direction="l", linebreak="al", - unicodeslot=0x0988, + unicodeslot=0x988, }, - [0x0989]={ + [0x989]={ adobename="ubengali", category="lo", description="BENGALI LETTER U", direction="l", linebreak="al", - unicodeslot=0x0989, + unicodeslot=0x989, }, - [0x098A]={ + [0x98A]={ adobename="uubengali", category="lo", description="BENGALI LETTER UU", direction="l", linebreak="al", - unicodeslot=0x098A, + unicodeslot=0x98A, }, - [0x098B]={ + [0x98B]={ adobename="rvocalicbengali", category="lo", description="BENGALI LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x098B, + unicodeslot=0x98B, }, - [0x098C]={ + [0x98C]={ adobename="lvocalicbengali", category="lo", description="BENGALI LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x098C, + unicodeslot=0x98C, }, - [0x098F]={ + [0x98F]={ adobename="ebengali", category="lo", description="BENGALI LETTER E", direction="l", linebreak="al", - unicodeslot=0x098F, + unicodeslot=0x98F, }, - [0x0990]={ + [0x990]={ adobename="aibengali", category="lo", description="BENGALI LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0990, + unicodeslot=0x990, }, - [0x0993]={ + [0x993]={ adobename="obengali", category="lo", description="BENGALI LETTER O", direction="l", linebreak="al", - unicodeslot=0x0993, + unicodeslot=0x993, }, - [0x0994]={ + [0x994]={ adobename="aubengali", category="lo", description="BENGALI LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0994, + unicodeslot=0x994, }, - [0x0995]={ + [0x995]={ adobename="kabengali", category="lo", description="BENGALI LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0995, + unicodeslot=0x995, }, - [0x0996]={ + [0x996]={ adobename="khabengali", category="lo", description="BENGALI LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0996, + unicodeslot=0x996, }, - [0x0997]={ + [0x997]={ adobename="gabengali", category="lo", description="BENGALI LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0997, + unicodeslot=0x997, }, - [0x0998]={ + [0x998]={ adobename="ghabengali", category="lo", description="BENGALI LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0998, + unicodeslot=0x998, }, - [0x0999]={ + [0x999]={ adobename="ngabengali", category="lo", description="BENGALI LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0999, + unicodeslot=0x999, }, - [0x099A]={ + [0x99A]={ adobename="cabengali", category="lo", description="BENGALI LETTER CA", direction="l", linebreak="al", - unicodeslot=0x099A, + unicodeslot=0x99A, }, - [0x099B]={ + [0x99B]={ adobename="chabengali", category="lo", description="BENGALI LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x099B, + unicodeslot=0x99B, }, - [0x099C]={ + [0x99C]={ adobename="jabengali", category="lo", description="BENGALI LETTER JA", direction="l", linebreak="al", - unicodeslot=0x099C, + unicodeslot=0x99C, }, - [0x099D]={ + [0x99D]={ adobename="jhabengali", category="lo", description="BENGALI LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x099D, + unicodeslot=0x99D, }, - [0x099E]={ + [0x99E]={ adobename="nyabengali", category="lo", description="BENGALI LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x099E, + unicodeslot=0x99E, }, - [0x099F]={ + [0x99F]={ adobename="ttabengali", category="lo", description="BENGALI LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x099F, + unicodeslot=0x99F, }, - [0x09A0]={ + [0x9A0]={ adobename="tthabengali", category="lo", description="BENGALI LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x09A0, + unicodeslot=0x9A0, }, - [0x09A1]={ + [0x9A1]={ adobename="ddabengali", category="lo", description="BENGALI LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x09A1, + unicodeslot=0x9A1, }, - [0x09A2]={ + [0x9A2]={ adobename="ddhabengali", category="lo", description="BENGALI LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x09A2, + unicodeslot=0x9A2, }, - [0x09A3]={ + [0x9A3]={ adobename="nnabengali", category="lo", description="BENGALI LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x09A3, + unicodeslot=0x9A3, }, - [0x09A4]={ + [0x9A4]={ adobename="tabengali", category="lo", description="BENGALI LETTER TA", direction="l", linebreak="al", - unicodeslot=0x09A4, + unicodeslot=0x9A4, }, - [0x09A5]={ + [0x9A5]={ adobename="thabengali", category="lo", description="BENGALI LETTER THA", direction="l", linebreak="al", - unicodeslot=0x09A5, + unicodeslot=0x9A5, }, - [0x09A6]={ + [0x9A6]={ adobename="dabengali", category="lo", description="BENGALI LETTER DA", direction="l", linebreak="al", - unicodeslot=0x09A6, + unicodeslot=0x9A6, }, - [0x09A7]={ + [0x9A7]={ adobename="dhabengali", category="lo", description="BENGALI LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x09A7, + unicodeslot=0x9A7, }, - [0x09A8]={ + [0x9A8]={ adobename="nabengali", category="lo", description="BENGALI LETTER NA", direction="l", linebreak="al", - unicodeslot=0x09A8, + unicodeslot=0x9A8, }, - [0x09AA]={ + [0x9AA]={ adobename="pabengali", category="lo", description="BENGALI LETTER PA", direction="l", linebreak="al", - unicodeslot=0x09AA, + unicodeslot=0x9AA, }, - [0x09AB]={ + [0x9AB]={ adobename="phabengali", category="lo", description="BENGALI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x09AB, + unicodeslot=0x9AB, }, - [0x09AC]={ + [0x9AC]={ adobename="babengali", category="lo", description="BENGALI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x09AC, + unicodeslot=0x9AC, }, - [0x09AD]={ + [0x9AD]={ adobename="bhabengali", category="lo", description="BENGALI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x09AD, + unicodeslot=0x9AD, }, - [0x09AE]={ + [0x9AE]={ adobename="mabengali", category="lo", description="BENGALI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x09AE, + unicodeslot=0x9AE, }, - [0x09AF]={ + [0x9AF]={ adobename="yabengali", category="lo", description="BENGALI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x09AF, + unicodeslot=0x9AF, }, - [0x09B0]={ + [0x9B0]={ adobename="rabengali", category="lo", description="BENGALI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x09B0, + unicodeslot=0x9B0, }, - [0x09B2]={ + [0x9B2]={ adobename="labengali", category="lo", description="BENGALI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x09B2, + unicodeslot=0x9B2, }, - [0x09B6]={ + [0x9B6]={ adobename="shabengali", category="lo", description="BENGALI LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x09B6, + unicodeslot=0x9B6, }, - [0x09B7]={ + [0x9B7]={ adobename="ssabengali", category="lo", description="BENGALI LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x09B7, + unicodeslot=0x9B7, }, - [0x09B8]={ + [0x9B8]={ adobename="sabengali", category="lo", description="BENGALI LETTER SA", direction="l", linebreak="al", - unicodeslot=0x09B8, + unicodeslot=0x9B8, }, - [0x09B9]={ + [0x9B9]={ adobename="habengali", category="lo", description="BENGALI LETTER HA", direction="l", linebreak="al", - unicodeslot=0x09B9, + unicodeslot=0x9B9, }, - [0x09BC]={ + [0x9BC]={ adobename="nuktabengali", category="mn", + combining=0x7, description="BENGALI SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x09BC, + unicodeslot=0x9BC, }, - [0x09BD]={ + [0x9BD]={ category="lo", description="BENGALI SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x09BD, + unicodeslot=0x9BD, }, - [0x09BE]={ + [0x9BE]={ adobename="aavowelsignbengali", category="mc", description="BENGALI VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x09BE, + unicodeslot=0x9BE, }, - [0x09BF]={ + [0x9BF]={ adobename="ivowelsignbengali", category="mc", description="BENGALI VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x09BF, + unicodeslot=0x9BF, }, - [0x09C0]={ + [0x9C0]={ adobename="iivowelsignbengali", category="mc", description="BENGALI VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x09C0, + unicodeslot=0x9C0, }, - [0x09C1]={ + [0x9C1]={ adobename="uvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x09C1, + unicodeslot=0x9C1, }, - [0x09C2]={ + [0x9C2]={ adobename="uuvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x09C2, + unicodeslot=0x9C2, }, - [0x09C3]={ + [0x9C3]={ adobename="rvocalicvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - unicodeslot=0x09C3, + unicodeslot=0x9C3, }, - [0x09C4]={ + [0x9C4]={ adobename="rrvocalicvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - unicodeslot=0x09C4, + unicodeslot=0x9C4, }, - [0x09C7]={ + [0x9C7]={ adobename="evowelsignbengali", category="mc", description="BENGALI VOWEL SIGN E", direction="l", linebreak="cm", - unicodeslot=0x09C7, + unicodeslot=0x9C7, }, - [0x09C8]={ + [0x9C8]={ adobename="aivowelsignbengali", category="mc", description="BENGALI VOWEL SIGN AI", direction="l", linebreak="cm", - unicodeslot=0x09C8, + unicodeslot=0x9C8, }, - [0x09CB]={ + [0x9CB]={ adobename="ovowelsignbengali", category="mc", description="BENGALI VOWEL SIGN O", direction="l", linebreak="cm", - specials={ "char", 0x09C7, 0x09BE }, - unicodeslot=0x09CB, + specials={ "char", 0x9C7, 0x9BE }, + unicodeslot=0x9CB, }, - [0x09CC]={ + [0x9CC]={ adobename="auvowelsignbengali", category="mc", description="BENGALI VOWEL SIGN AU", direction="l", linebreak="cm", - specials={ "char", 0x09C7, 0x09D7 }, - unicodeslot=0x09CC, + specials={ "char", 0x9C7, 0x9D7 }, + unicodeslot=0x9CC, }, - [0x09CD]={ + [0x9CD]={ adobename="viramabengali", category="mn", + combining=0x9, description="BENGALI SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x09CD, + unicodeslot=0x9CD, }, - [0x09CE]={ + [0x9CE]={ category="lo", description="BENGALI LETTER KHANDA TA", direction="l", linebreak="al", - unicodeslot=0x09CE, + unicodeslot=0x9CE, }, - [0x09D7]={ + [0x9D7]={ adobename="aulengthmarkbengali", category="mc", description="BENGALI AU LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x09D7, + unicodeslot=0x9D7, }, - [0x09DC]={ + [0x9DC]={ adobename="rrabengali", category="lo", description="BENGALI LETTER RRA", direction="l", linebreak="al", - specials={ "char", 0x09A1, 0x09BC }, - unicodeslot=0x09DC, + specials={ "char", 0x9A1, 0x9BC }, + unicodeslot=0x9DC, }, - [0x09DD]={ + [0x9DD]={ adobename="rhabengali", category="lo", description="BENGALI LETTER RHA", direction="l", linebreak="al", - specials={ "char", 0x09A2, 0x09BC }, - unicodeslot=0x09DD, + specials={ "char", 0x9A2, 0x9BC }, + unicodeslot=0x9DD, }, - [0x09DF]={ + [0x9DF]={ adobename="yyabengali", category="lo", description="BENGALI LETTER YYA", direction="l", linebreak="al", - specials={ "char", 0x09AF, 0x09BC }, - unicodeslot=0x09DF, + specials={ "char", 0x9AF, 0x9BC }, + unicodeslot=0x9DF, }, - [0x09E0]={ + [0x9E0]={ adobename="rrvocalicbengali", category="lo", description="BENGALI LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x09E0, + unicodeslot=0x9E0, }, - [0x09E1]={ + [0x9E1]={ adobename="llvocalicbengali", category="lo", description="BENGALI LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x09E1, + unicodeslot=0x9E1, }, - [0x09E2]={ + [0x9E2]={ adobename="lvocalicvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x09E2, + unicodeslot=0x9E2, }, - [0x09E3]={ + [0x9E3]={ adobename="llvocalicvowelsignbengali", category="mn", description="BENGALI VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x09E3, + unicodeslot=0x9E3, }, - [0x09E6]={ + [0x9E6]={ adobename="zerobengali", category="nd", description="BENGALI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x09E6, + unicodeslot=0x9E6, }, - [0x09E7]={ + [0x9E7]={ adobename="onebengali", category="nd", description="BENGALI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x09E7, + unicodeslot=0x9E7, }, - [0x09E8]={ + [0x9E8]={ adobename="twobengali", category="nd", description="BENGALI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x09E8, + unicodeslot=0x9E8, }, - [0x09E9]={ + [0x9E9]={ adobename="threebengali", category="nd", description="BENGALI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x09E9, + unicodeslot=0x9E9, }, - [0x09EA]={ + [0x9EA]={ adobename="fourbengali", category="nd", description="BENGALI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x09EA, + unicodeslot=0x9EA, }, - [0x09EB]={ + [0x9EB]={ adobename="fivebengali", category="nd", description="BENGALI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x09EB, + unicodeslot=0x9EB, }, - [0x09EC]={ + [0x9EC]={ adobename="sixbengali", category="nd", description="BENGALI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x09EC, + unicodeslot=0x9EC, }, - [0x09ED]={ + [0x9ED]={ adobename="sevenbengali", category="nd", description="BENGALI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x09ED, + unicodeslot=0x9ED, }, - [0x09EE]={ + [0x9EE]={ adobename="eightbengali", category="nd", description="BENGALI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x09EE, + unicodeslot=0x9EE, }, - [0x09EF]={ + [0x9EF]={ adobename="ninebengali", category="nd", description="BENGALI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x09EF, + unicodeslot=0x9EF, }, - [0x09F0]={ + [0x9F0]={ adobename="ramiddlediagonalbengali", category="lo", description="BENGALI LETTER RA WITH MIDDLE DIAGONAL", direction="l", linebreak="al", - shcode=0x09B0, - unicodeslot=0x09F0, + shcode=0x9B0, + unicodeslot=0x9F0, }, - [0x09F1]={ + [0x9F1]={ adobename="ralowerdiagonalbengali", category="lo", description="BENGALI LETTER RA WITH LOWER DIAGONAL", direction="l", linebreak="al", - shcode=0x09B0, - unicodeslot=0x09F1, + shcode=0x9B0, + unicodeslot=0x9F1, }, - [0x09F2]={ + [0x9F2]={ adobename="rupeemarkbengali", category="sc", description="BENGALI RUPEE MARK", direction="et", linebreak="po", - unicodeslot=0x09F2, + unicodeslot=0x9F2, }, - [0x09F3]={ + [0x9F3]={ adobename="rupeesignbengali", category="sc", description="BENGALI RUPEE SIGN", direction="et", linebreak="po", - unicodeslot=0x09F3, + unicodeslot=0x9F3, }, - [0x09F4]={ + [0x9F4]={ adobename="onenumeratorbengali", category="no", description="BENGALI CURRENCY NUMERATOR ONE", direction="l", linebreak="al", - unicodeslot=0x09F4, + unicodeslot=0x9F4, }, - [0x09F5]={ + [0x9F5]={ adobename="twonumeratorbengali", category="no", description="BENGALI CURRENCY NUMERATOR TWO", direction="l", linebreak="al", - unicodeslot=0x09F5, + unicodeslot=0x9F5, }, - [0x09F6]={ + [0x9F6]={ adobename="threenumeratorbengali", category="no", description="BENGALI CURRENCY NUMERATOR THREE", direction="l", linebreak="al", - unicodeslot=0x09F6, + unicodeslot=0x9F6, }, - [0x09F7]={ + [0x9F7]={ adobename="fournumeratorbengali", category="no", description="BENGALI CURRENCY NUMERATOR FOUR", direction="l", linebreak="al", - unicodeslot=0x09F7, + unicodeslot=0x9F7, }, - [0x09F8]={ + [0x9F8]={ adobename="denominatorminusonenumeratorbengali", category="no", description="BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR", direction="l", linebreak="al", - unicodeslot=0x09F8, + unicodeslot=0x9F8, }, - [0x09F9]={ + [0x9F9]={ adobename="sixteencurrencydenominatorbengali", category="no", description="BENGALI CURRENCY DENOMINATOR SIXTEEN", direction="l", linebreak="po", - unicodeslot=0x09F9, + unicodeslot=0x9F9, }, - [0x09FA]={ + [0x9FA]={ adobename="issharbengali", category="so", description="BENGALI ISSHAR", direction="l", linebreak="al", - unicodeslot=0x09FA, + unicodeslot=0x9FA, }, - [0x09FB]={ + [0x9FB]={ category="sc", description="BENGALI GANDA MARK", direction="et", linebreak="pr", - unicodeslot=0x09FB, + unicodeslot=0x9FB, }, - [0x0A01]={ + [0xA01]={ category="mn", description="GURMUKHI SIGN ADAK BINDI", direction="nsm", linebreak="cm", - unicodeslot=0x0A01, + unicodeslot=0xA01, }, - [0x0A02]={ + [0xA02]={ adobename="bindigurmukhi", category="mn", description="GURMUKHI SIGN BINDI", direction="nsm", linebreak="cm", - unicodeslot=0x0A02, + unicodeslot=0xA02, }, - [0x0A03]={ + [0xA03]={ category="mc", description="GURMUKHI SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0A03, + unicodeslot=0xA03, }, - [0x0A05]={ + [0xA05]={ adobename="agurmukhi", category="lo", description="GURMUKHI LETTER A", direction="l", linebreak="al", - unicodeslot=0x0A05, + unicodeslot=0xA05, }, - [0x0A06]={ + [0xA06]={ adobename="aagurmukhi", category="lo", description="GURMUKHI LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0A06, + unicodeslot=0xA06, }, - [0x0A07]={ + [0xA07]={ adobename="igurmukhi", category="lo", description="GURMUKHI LETTER I", direction="l", linebreak="al", - unicodeslot=0x0A07, + unicodeslot=0xA07, }, - [0x0A08]={ + [0xA08]={ adobename="iigurmukhi", category="lo", description="GURMUKHI LETTER II", direction="l", linebreak="al", - unicodeslot=0x0A08, + unicodeslot=0xA08, }, - [0x0A09]={ + [0xA09]={ adobename="ugurmukhi", category="lo", description="GURMUKHI LETTER U", direction="l", linebreak="al", - unicodeslot=0x0A09, + unicodeslot=0xA09, }, - [0x0A0A]={ + [0xA0A]={ adobename="uugurmukhi", category="lo", description="GURMUKHI LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0A0A, + unicodeslot=0xA0A, }, - [0x0A0F]={ + [0xA0F]={ adobename="eegurmukhi", category="lo", description="GURMUKHI LETTER EE", direction="l", linebreak="al", - unicodeslot=0x0A0F, + unicodeslot=0xA0F, }, - [0x0A10]={ + [0xA10]={ adobename="aigurmukhi", category="lo", description="GURMUKHI LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0A10, + unicodeslot=0xA10, }, - [0x0A13]={ + [0xA13]={ adobename="oogurmukhi", category="lo", description="GURMUKHI LETTER OO", direction="l", linebreak="al", - unicodeslot=0x0A13, + unicodeslot=0xA13, }, - [0x0A14]={ + [0xA14]={ adobename="augurmukhi", category="lo", description="GURMUKHI LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0A14, + unicodeslot=0xA14, }, - [0x0A15]={ + [0xA15]={ adobename="kagurmukhi", category="lo", description="GURMUKHI LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0A15, + unicodeslot=0xA15, }, - [0x0A16]={ + [0xA16]={ adobename="khagurmukhi", category="lo", description="GURMUKHI LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0A16, + unicodeslot=0xA16, }, - [0x0A17]={ + [0xA17]={ adobename="gagurmukhi", category="lo", description="GURMUKHI LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0A17, + unicodeslot=0xA17, }, - [0x0A18]={ + [0xA18]={ adobename="ghagurmukhi", category="lo", description="GURMUKHI LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0A18, + unicodeslot=0xA18, }, - [0x0A19]={ + [0xA19]={ adobename="ngagurmukhi", category="lo", description="GURMUKHI LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0A19, + unicodeslot=0xA19, }, - [0x0A1A]={ + [0xA1A]={ adobename="cagurmukhi", category="lo", description="GURMUKHI LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0A1A, + unicodeslot=0xA1A, }, - [0x0A1B]={ + [0xA1B]={ adobename="chagurmukhi", category="lo", description="GURMUKHI LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0A1B, + unicodeslot=0xA1B, }, - [0x0A1C]={ + [0xA1C]={ adobename="jagurmukhi", category="lo", description="GURMUKHI LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0A1C, + unicodeslot=0xA1C, }, - [0x0A1D]={ + [0xA1D]={ adobename="jhagurmukhi", category="lo", description="GURMUKHI LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0A1D, + unicodeslot=0xA1D, }, - [0x0A1E]={ + [0xA1E]={ adobename="nyagurmukhi", category="lo", description="GURMUKHI LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0A1E, + unicodeslot=0xA1E, }, - [0x0A1F]={ + [0xA1F]={ adobename="ttagurmukhi", category="lo", description="GURMUKHI LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0A1F, + unicodeslot=0xA1F, }, - [0x0A20]={ + [0xA20]={ adobename="tthagurmukhi", category="lo", description="GURMUKHI LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0A20, + unicodeslot=0xA20, }, - [0x0A21]={ + [0xA21]={ adobename="ddagurmukhi", category="lo", description="GURMUKHI LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0A21, + unicodeslot=0xA21, }, - [0x0A22]={ + [0xA22]={ adobename="ddhagurmukhi", category="lo", description="GURMUKHI LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0A22, + unicodeslot=0xA22, }, - [0x0A23]={ + [0xA23]={ adobename="nnagurmukhi", category="lo", description="GURMUKHI LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0A23, + unicodeslot=0xA23, }, - [0x0A24]={ + [0xA24]={ adobename="tagurmukhi", category="lo", description="GURMUKHI LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0A24, + unicodeslot=0xA24, }, - [0x0A25]={ + [0xA25]={ adobename="thagurmukhi", category="lo", description="GURMUKHI LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0A25, + unicodeslot=0xA25, }, - [0x0A26]={ + [0xA26]={ adobename="dagurmukhi", category="lo", description="GURMUKHI LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0A26, + unicodeslot=0xA26, }, - [0x0A27]={ + [0xA27]={ adobename="dhagurmukhi", category="lo", description="GURMUKHI LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0A27, + unicodeslot=0xA27, }, - [0x0A28]={ + [0xA28]={ adobename="nagurmukhi", category="lo", description="GURMUKHI LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0A28, + unicodeslot=0xA28, }, - [0x0A2A]={ + [0xA2A]={ adobename="pagurmukhi", category="lo", description="GURMUKHI LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0A2A, + unicodeslot=0xA2A, }, - [0x0A2B]={ + [0xA2B]={ adobename="phagurmukhi", category="lo", description="GURMUKHI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0A2B, + unicodeslot=0xA2B, }, - [0x0A2C]={ + [0xA2C]={ adobename="bagurmukhi", category="lo", description="GURMUKHI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0A2C, + unicodeslot=0xA2C, }, - [0x0A2D]={ + [0xA2D]={ adobename="bhagurmukhi", category="lo", description="GURMUKHI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0A2D, + unicodeslot=0xA2D, }, - [0x0A2E]={ + [0xA2E]={ adobename="magurmukhi", category="lo", description="GURMUKHI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0A2E, + unicodeslot=0xA2E, }, - [0x0A2F]={ + [0xA2F]={ adobename="yagurmukhi", category="lo", description="GURMUKHI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0A2F, + unicodeslot=0xA2F, }, - [0x0A30]={ + [0xA30]={ adobename="ragurmukhi", category="lo", description="GURMUKHI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0A30, + unicodeslot=0xA30, }, - [0x0A32]={ + [0xA32]={ adobename="lagurmukhi", category="lo", description="GURMUKHI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0A32, + unicodeslot=0xA32, }, - [0x0A33]={ + [0xA33]={ category="lo", description="GURMUKHI LETTER LLA", direction="l", linebreak="al", - specials={ "char", 0x0A32, 0x0A3C }, - unicodeslot=0x0A33, + specials={ "char", 0xA32, 0xA3C }, + unicodeslot=0xA33, }, - [0x0A35]={ + [0xA35]={ adobename="vagurmukhi", category="lo", description="GURMUKHI LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0A35, + unicodeslot=0xA35, }, - [0x0A36]={ + [0xA36]={ adobename="shagurmukhi", category="lo", description="GURMUKHI LETTER SHA", direction="l", linebreak="al", - specials={ "char", 0x0A38, 0x0A3C }, - unicodeslot=0x0A36, + specials={ "char", 0xA38, 0xA3C }, + unicodeslot=0xA36, }, - [0x0A38]={ + [0xA38]={ adobename="sagurmukhi", category="lo", description="GURMUKHI LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0A38, + unicodeslot=0xA38, }, - [0x0A39]={ + [0xA39]={ adobename="hagurmukhi", category="lo", description="GURMUKHI LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0A39, + unicodeslot=0xA39, }, - [0x0A3C]={ + [0xA3C]={ adobename="nuktagurmukhi", category="mn", + combining=0x7, description="GURMUKHI SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x0A3C, + unicodeslot=0xA3C, }, - [0x0A3E]={ + [0xA3E]={ adobename="aamatragurmukhi", category="mc", description="GURMUKHI VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0A3E, + unicodeslot=0xA3E, }, - [0x0A3F]={ + [0xA3F]={ adobename="imatragurmukhi", category="mc", description="GURMUKHI VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x0A3F, + unicodeslot=0xA3F, }, - [0x0A40]={ + [0xA40]={ adobename="iimatragurmukhi", category="mc", description="GURMUKHI VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x0A40, + unicodeslot=0xA40, }, - [0x0A41]={ + [0xA41]={ adobename="umatragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0A41, + unicodeslot=0xA41, }, - [0x0A42]={ + [0xA42]={ adobename="uumatragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x0A42, + unicodeslot=0xA42, }, - [0x0A47]={ + [0xA47]={ adobename="eematragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN EE", direction="nsm", linebreak="cm", - unicodeslot=0x0A47, + unicodeslot=0xA47, }, - [0x0A48]={ + [0xA48]={ adobename="aimatragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN AI", direction="nsm", linebreak="cm", - unicodeslot=0x0A48, + unicodeslot=0xA48, }, - [0x0A4B]={ + [0xA4B]={ adobename="oomatragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN OO", direction="nsm", linebreak="cm", - unicodeslot=0x0A4B, + unicodeslot=0xA4B, }, - [0x0A4C]={ + [0xA4C]={ adobename="aumatragurmukhi", category="mn", description="GURMUKHI VOWEL SIGN AU", direction="nsm", linebreak="cm", - unicodeslot=0x0A4C, + unicodeslot=0xA4C, }, - [0x0A4D]={ + [0xA4D]={ adobename="halantgurmukhi", category="mn", + combining=0x9, description="GURMUKHI SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0A4D, + unicodeslot=0xA4D, }, - [0x0A51]={ + [0xA51]={ category="mn", description="GURMUKHI SIGN UDAAT", direction="nsm", linebreak="cm", - unicodeslot=0x0A51, + unicodeslot=0xA51, }, - [0x0A59]={ + [0xA59]={ adobename="khhagurmukhi", category="lo", description="GURMUKHI LETTER KHHA", direction="l", linebreak="al", - specials={ "char", 0x0A16, 0x0A3C }, - unicodeslot=0x0A59, + specials={ "char", 0xA16, 0xA3C }, + unicodeslot=0xA59, }, - [0x0A5A]={ + [0xA5A]={ adobename="ghhagurmukhi", category="lo", description="GURMUKHI LETTER GHHA", direction="l", linebreak="al", - specials={ "char", 0x0A17, 0x0A3C }, - unicodeslot=0x0A5A, + specials={ "char", 0xA17, 0xA3C }, + unicodeslot=0xA5A, }, - [0x0A5B]={ + [0xA5B]={ adobename="zagurmukhi", category="lo", description="GURMUKHI LETTER ZA", direction="l", linebreak="al", - specials={ "char", 0x0A1C, 0x0A3C }, - unicodeslot=0x0A5B, + specials={ "char", 0xA1C, 0xA3C }, + unicodeslot=0xA5B, }, - [0x0A5C]={ + [0xA5C]={ adobename="rragurmukhi", category="lo", description="GURMUKHI LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0A5C, + unicodeslot=0xA5C, }, - [0x0A5E]={ + [0xA5E]={ adobename="fagurmukhi", category="lo", description="GURMUKHI LETTER FA", direction="l", linebreak="al", - specials={ "char", 0x0A2B, 0x0A3C }, - unicodeslot=0x0A5E, + specials={ "char", 0xA2B, 0xA3C }, + unicodeslot=0xA5E, }, - [0x0A66]={ + [0xA66]={ adobename="zerogurmukhi", category="nd", description="GURMUKHI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0A66, + unicodeslot=0xA66, }, - [0x0A67]={ + [0xA67]={ adobename="onegurmukhi", category="nd", description="GURMUKHI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0A67, + unicodeslot=0xA67, }, - [0x0A68]={ + [0xA68]={ adobename="twogurmukhi", category="nd", description="GURMUKHI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0A68, + unicodeslot=0xA68, }, - [0x0A69]={ + [0xA69]={ adobename="threegurmukhi", category="nd", description="GURMUKHI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0A69, + unicodeslot=0xA69, }, - [0x0A6A]={ + [0xA6A]={ adobename="fourgurmukhi", category="nd", description="GURMUKHI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0A6A, + unicodeslot=0xA6A, }, - [0x0A6B]={ + [0xA6B]={ adobename="fivegurmukhi", category="nd", description="GURMUKHI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0A6B, + unicodeslot=0xA6B, }, - [0x0A6C]={ + [0xA6C]={ adobename="sixgurmukhi", category="nd", description="GURMUKHI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0A6C, + unicodeslot=0xA6C, }, - [0x0A6D]={ + [0xA6D]={ adobename="sevengurmukhi", category="nd", description="GURMUKHI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0A6D, + unicodeslot=0xA6D, }, - [0x0A6E]={ + [0xA6E]={ adobename="eightgurmukhi", category="nd", description="GURMUKHI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0A6E, + unicodeslot=0xA6E, }, - [0x0A6F]={ + [0xA6F]={ adobename="ninegurmukhi", category="nd", description="GURMUKHI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0A6F, + unicodeslot=0xA6F, }, - [0x0A70]={ + [0xA70]={ adobename="tippigurmukhi", category="mn", description="GURMUKHI TIPPI", direction="nsm", linebreak="cm", - unicodeslot=0x0A70, + unicodeslot=0xA70, }, - [0x0A71]={ + [0xA71]={ adobename="addakgurmukhi", category="mn", description="GURMUKHI ADDAK", direction="nsm", linebreak="cm", - unicodeslot=0x0A71, + unicodeslot=0xA71, }, - [0x0A72]={ + [0xA72]={ adobename="irigurmukhi", category="lo", description="GURMUKHI IRI", direction="l", linebreak="al", - unicodeslot=0x0A72, + unicodeslot=0xA72, }, - [0x0A73]={ + [0xA73]={ adobename="uragurmukhi", category="lo", description="GURMUKHI URA", direction="l", linebreak="al", - unicodeslot=0x0A73, + unicodeslot=0xA73, }, - [0x0A74]={ + [0xA74]={ adobename="ekonkargurmukhi", category="lo", description="GURMUKHI EK ONKAR", direction="l", linebreak="al", - unicodeslot=0x0A74, + unicodeslot=0xA74, }, - [0x0A75]={ + [0xA75]={ category="mn", description="GURMUKHI SIGN YAKASH", direction="nsm", linebreak="cm", - unicodeslot=0x0A75, + unicodeslot=0xA75, }, - [0x0A81]={ + [0xA81]={ adobename="candrabindugujarati", category="mn", description="GUJARATI SIGN CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0A81, + unicodeslot=0xA81, }, - [0x0A82]={ + [0xA82]={ adobename="anusvaragujarati", category="mn", description="GUJARATI SIGN ANUSVARA", direction="nsm", linebreak="cm", - unicodeslot=0x0A82, + unicodeslot=0xA82, }, - [0x0A83]={ + [0xA83]={ adobename="visargagujarati", category="mc", description="GUJARATI SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0A83, + unicodeslot=0xA83, }, - [0x0A85]={ + [0xA85]={ adobename="agujarati", category="lo", description="GUJARATI LETTER A", direction="l", linebreak="al", - unicodeslot=0x0A85, + unicodeslot=0xA85, }, - [0x0A86]={ + [0xA86]={ adobename="aagujarati", category="lo", description="GUJARATI LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0A86, + unicodeslot=0xA86, }, - [0x0A87]={ + [0xA87]={ adobename="igujarati", category="lo", description="GUJARATI LETTER I", direction="l", linebreak="al", - unicodeslot=0x0A87, + unicodeslot=0xA87, }, - [0x0A88]={ + [0xA88]={ adobename="iigujarati", category="lo", description="GUJARATI LETTER II", direction="l", linebreak="al", - unicodeslot=0x0A88, + unicodeslot=0xA88, }, - [0x0A89]={ + [0xA89]={ adobename="ugujarati", category="lo", description="GUJARATI LETTER U", direction="l", linebreak="al", - unicodeslot=0x0A89, + unicodeslot=0xA89, }, - [0x0A8A]={ + [0xA8A]={ adobename="uugujarati", category="lo", description="GUJARATI LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0A8A, + unicodeslot=0xA8A, }, - [0x0A8B]={ + [0xA8B]={ adobename="rvocalicgujarati", category="lo", description="GUJARATI LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x0A8B, + unicodeslot=0xA8B, }, - [0x0A8C]={ + [0xA8C]={ category="lo", description="GUJARATI LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x0A8C, + unicodeslot=0xA8C, }, - [0x0A8D]={ + [0xA8D]={ adobename="ecandragujarati", category="lo", description="GUJARATI VOWEL CANDRA E", direction="l", linebreak="al", - unicodeslot=0x0A8D, + unicodeslot=0xA8D, }, - [0x0A8F]={ + [0xA8F]={ adobename="egujarati", category="lo", description="GUJARATI LETTER E", direction="l", linebreak="al", - unicodeslot=0x0A8F, + unicodeslot=0xA8F, }, - [0x0A90]={ + [0xA90]={ adobename="aigujarati", category="lo", description="GUJARATI LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0A90, + unicodeslot=0xA90, }, - [0x0A91]={ + [0xA91]={ adobename="ocandragujarati", category="lo", description="GUJARATI VOWEL CANDRA O", direction="l", linebreak="al", - unicodeslot=0x0A91, + unicodeslot=0xA91, }, - [0x0A93]={ + [0xA93]={ adobename="ogujarati", category="lo", description="GUJARATI LETTER O", direction="l", linebreak="al", - unicodeslot=0x0A93, + unicodeslot=0xA93, }, - [0x0A94]={ + [0xA94]={ adobename="augujarati", category="lo", description="GUJARATI LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0A94, + unicodeslot=0xA94, }, - [0x0A95]={ + [0xA95]={ adobename="kagujarati", category="lo", description="GUJARATI LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0A95, + unicodeslot=0xA95, }, - [0x0A96]={ + [0xA96]={ adobename="khagujarati", category="lo", description="GUJARATI LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0A96, + unicodeslot=0xA96, }, - [0x0A97]={ + [0xA97]={ adobename="gagujarati", category="lo", description="GUJARATI LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0A97, + unicodeslot=0xA97, }, - [0x0A98]={ + [0xA98]={ adobename="ghagujarati", category="lo", description="GUJARATI LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0A98, + unicodeslot=0xA98, }, - [0x0A99]={ + [0xA99]={ adobename="ngagujarati", category="lo", description="GUJARATI LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0A99, + unicodeslot=0xA99, }, - [0x0A9A]={ + [0xA9A]={ adobename="cagujarati", category="lo", description="GUJARATI LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0A9A, + unicodeslot=0xA9A, }, - [0x0A9B]={ + [0xA9B]={ adobename="chagujarati", category="lo", description="GUJARATI LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0A9B, + unicodeslot=0xA9B, }, - [0x0A9C]={ + [0xA9C]={ adobename="jagujarati", category="lo", description="GUJARATI LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0A9C, + unicodeslot=0xA9C, }, - [0x0A9D]={ + [0xA9D]={ adobename="jhagujarati", category="lo", description="GUJARATI LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0A9D, + unicodeslot=0xA9D, }, - [0x0A9E]={ + [0xA9E]={ adobename="nyagujarati", category="lo", description="GUJARATI LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0A9E, + unicodeslot=0xA9E, }, - [0x0A9F]={ + [0xA9F]={ adobename="ttagujarati", category="lo", description="GUJARATI LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0A9F, + unicodeslot=0xA9F, }, - [0x0AA0]={ + [0xAA0]={ adobename="tthagujarati", category="lo", description="GUJARATI LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0AA0, + unicodeslot=0xAA0, }, - [0x0AA1]={ + [0xAA1]={ adobename="ddagujarati", category="lo", description="GUJARATI LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0AA1, + unicodeslot=0xAA1, }, - [0x0AA2]={ + [0xAA2]={ adobename="ddhagujarati", category="lo", description="GUJARATI LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0AA2, + unicodeslot=0xAA2, }, - [0x0AA3]={ + [0xAA3]={ adobename="nnagujarati", category="lo", description="GUJARATI LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0AA3, + unicodeslot=0xAA3, }, - [0x0AA4]={ + [0xAA4]={ adobename="tagujarati", category="lo", description="GUJARATI LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0AA4, + unicodeslot=0xAA4, }, - [0x0AA5]={ + [0xAA5]={ adobename="thagujarati", category="lo", description="GUJARATI LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0AA5, + unicodeslot=0xAA5, }, - [0x0AA6]={ + [0xAA6]={ adobename="dagujarati", category="lo", description="GUJARATI LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0AA6, + unicodeslot=0xAA6, }, - [0x0AA7]={ + [0xAA7]={ adobename="dhagujarati", category="lo", description="GUJARATI LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0AA7, + unicodeslot=0xAA7, }, - [0x0AA8]={ + [0xAA8]={ adobename="nagujarati", category="lo", description="GUJARATI LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0AA8, + unicodeslot=0xAA8, }, - [0x0AAA]={ + [0xAAA]={ adobename="pagujarati", category="lo", description="GUJARATI LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0AAA, + unicodeslot=0xAAA, }, - [0x0AAB]={ + [0xAAB]={ adobename="phagujarati", category="lo", description="GUJARATI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0AAB, + unicodeslot=0xAAB, }, - [0x0AAC]={ + [0xAAC]={ adobename="bagujarati", category="lo", description="GUJARATI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0AAC, + unicodeslot=0xAAC, }, - [0x0AAD]={ + [0xAAD]={ adobename="bhagujarati", category="lo", description="GUJARATI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0AAD, + unicodeslot=0xAAD, }, - [0x0AAE]={ + [0xAAE]={ adobename="magujarati", category="lo", description="GUJARATI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0AAE, + unicodeslot=0xAAE, }, - [0x0AAF]={ + [0xAAF]={ adobename="yagujarati", category="lo", description="GUJARATI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0AAF, + unicodeslot=0xAAF, }, - [0x0AB0]={ + [0xAB0]={ adobename="ragujarati", category="lo", description="GUJARATI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0AB0, + unicodeslot=0xAB0, }, - [0x0AB2]={ + [0xAB2]={ adobename="lagujarati", category="lo", description="GUJARATI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0AB2, + unicodeslot=0xAB2, }, - [0x0AB3]={ + [0xAB3]={ adobename="llagujarati", category="lo", description="GUJARATI LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0AB3, + unicodeslot=0xAB3, }, - [0x0AB5]={ + [0xAB5]={ adobename="vagujarati", category="lo", description="GUJARATI LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0AB5, + unicodeslot=0xAB5, }, - [0x0AB6]={ + [0xAB6]={ adobename="shagujarati", category="lo", description="GUJARATI LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0AB6, + unicodeslot=0xAB6, }, - [0x0AB7]={ + [0xAB7]={ adobename="ssagujarati", category="lo", description="GUJARATI LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0AB7, + unicodeslot=0xAB7, }, - [0x0AB8]={ + [0xAB8]={ adobename="sagujarati", category="lo", description="GUJARATI LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0AB8, + unicodeslot=0xAB8, }, - [0x0AB9]={ + [0xAB9]={ adobename="hagujarati", category="lo", description="GUJARATI LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0AB9, + unicodeslot=0xAB9, }, - [0x0ABC]={ + [0xABC]={ adobename="nuktagujarati", category="mn", + combining=0x7, description="GUJARATI SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x0ABC, + unicodeslot=0xABC, }, - [0x0ABD]={ + [0xABD]={ category="lo", description="GUJARATI SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x0ABD, + unicodeslot=0xABD, }, - [0x0ABE]={ + [0xABE]={ adobename="aavowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0ABE, + unicodeslot=0xABE, }, - [0x0ABF]={ + [0xABF]={ adobename="ivowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x0ABF, + unicodeslot=0xABF, }, - [0x0AC0]={ + [0xAC0]={ adobename="iivowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x0AC0, + unicodeslot=0xAC0, }, - [0x0AC1]={ + [0xAC1]={ adobename="uvowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0AC1, + unicodeslot=0xAC1, }, - [0x0AC2]={ + [0xAC2]={ adobename="uuvowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x0AC2, + unicodeslot=0xAC2, }, - [0x0AC3]={ + [0xAC3]={ adobename="rvocalicvowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - unicodeslot=0x0AC3, + unicodeslot=0xAC3, }, - [0x0AC4]={ + [0xAC4]={ adobename="rrvocalicvowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - unicodeslot=0x0AC4, + unicodeslot=0xAC4, }, - [0x0AC5]={ + [0xAC5]={ adobename="ecandravowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN CANDRA E", direction="nsm", linebreak="cm", - unicodeslot=0x0AC5, + unicodeslot=0xAC5, }, - [0x0AC7]={ + [0xAC7]={ adobename="evowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x0AC7, + unicodeslot=0xAC7, }, - [0x0AC8]={ + [0xAC8]={ adobename="aivowelsigngujarati", category="mn", description="GUJARATI VOWEL SIGN AI", direction="nsm", linebreak="cm", - unicodeslot=0x0AC8, + unicodeslot=0xAC8, }, - [0x0AC9]={ + [0xAC9]={ adobename="ocandravowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN CANDRA O", direction="l", linebreak="cm", - unicodeslot=0x0AC9, + unicodeslot=0xAC9, }, - [0x0ACB]={ + [0xACB]={ adobename="ovowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN O", direction="l", linebreak="cm", - unicodeslot=0x0ACB, + unicodeslot=0xACB, }, - [0x0ACC]={ + [0xACC]={ adobename="auvowelsigngujarati", category="mc", description="GUJARATI VOWEL SIGN AU", direction="l", linebreak="cm", - unicodeslot=0x0ACC, + unicodeslot=0xACC, }, - [0x0ACD]={ + [0xACD]={ adobename="viramagujarati", category="mn", + combining=0x9, description="GUJARATI SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0ACD, + unicodeslot=0xACD, }, - [0x0AD0]={ + [0xAD0]={ adobename="omgujarati", category="lo", description="GUJARATI OM", direction="l", linebreak="al", - unicodeslot=0x0AD0, + unicodeslot=0xAD0, }, - [0x0AE0]={ + [0xAE0]={ adobename="rrvocalicgujarati", category="lo", description="GUJARATI LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0AE0, + unicodeslot=0xAE0, }, - [0x0AE1]={ + [0xAE1]={ category="lo", description="GUJARATI LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0AE1, + unicodeslot=0xAE1, }, - [0x0AE2]={ + [0xAE2]={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0AE2, + unicodeslot=0xAE2, }, - [0x0AE3]={ + [0xAE3]={ category="mn", description="GUJARATI VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0AE3, + unicodeslot=0xAE3, }, - [0x0AE6]={ + [0xAE6]={ adobename="zerogujarati", category="nd", description="GUJARATI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0AE6, + unicodeslot=0xAE6, }, - [0x0AE7]={ + [0xAE7]={ adobename="onegujarati", category="nd", description="GUJARATI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0AE7, + unicodeslot=0xAE7, }, - [0x0AE8]={ + [0xAE8]={ adobename="twogujarati", category="nd", description="GUJARATI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0AE8, + unicodeslot=0xAE8, }, - [0x0AE9]={ + [0xAE9]={ adobename="threegujarati", category="nd", description="GUJARATI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0AE9, + unicodeslot=0xAE9, }, - [0x0AEA]={ + [0xAEA]={ adobename="fourgujarati", category="nd", description="GUJARATI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0AEA, + unicodeslot=0xAEA, }, - [0x0AEB]={ + [0xAEB]={ adobename="fivegujarati", category="nd", description="GUJARATI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0AEB, + unicodeslot=0xAEB, }, - [0x0AEC]={ + [0xAEC]={ adobename="sixgujarati", category="nd", description="GUJARATI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0AEC, + unicodeslot=0xAEC, }, - [0x0AED]={ + [0xAED]={ adobename="sevengujarati", category="nd", description="GUJARATI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0AED, + unicodeslot=0xAED, }, - [0x0AEE]={ + [0xAEE]={ adobename="eightgujarati", category="nd", description="GUJARATI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0AEE, + unicodeslot=0xAEE, }, - [0x0AEF]={ + [0xAEF]={ adobename="ninegujarati", category="nd", description="GUJARATI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0AEF, + unicodeslot=0xAEF, }, - [0x0AF0]={ + [0xAF0]={ category="po", description="GUJARATI ABBREVIATION SIGN", direction="l", linebreak="al", - unicodeslot=0x0AF0, + unicodeslot=0xAF0, }, - [0x0AF1]={ + [0xAF1]={ category="sc", description="GUJARATI RUPEE SIGN", direction="et", linebreak="pr", - unicodeslot=0x0AF1, + unicodeslot=0xAF1, }, - [0x0B01]={ + [0xB01]={ category="mn", description="ORIYA SIGN CANDRABINDU", direction="nsm", linebreak="cm", - unicodeslot=0x0B01, + unicodeslot=0xB01, }, - [0x0B02]={ + [0xB02]={ category="mc", description="ORIYA SIGN ANUSVARA", direction="l", linebreak="cm", - unicodeslot=0x0B02, + unicodeslot=0xB02, }, - [0x0B03]={ + [0xB03]={ category="mc", description="ORIYA SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0B03, + unicodeslot=0xB03, }, - [0x0B05]={ + [0xB05]={ category="lo", description="ORIYA LETTER A", direction="l", linebreak="al", - unicodeslot=0x0B05, + unicodeslot=0xB05, }, - [0x0B06]={ + [0xB06]={ category="lo", description="ORIYA LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0B06, + unicodeslot=0xB06, }, - [0x0B07]={ + [0xB07]={ category="lo", description="ORIYA LETTER I", direction="l", linebreak="al", - unicodeslot=0x0B07, + unicodeslot=0xB07, }, - [0x0B08]={ + [0xB08]={ category="lo", description="ORIYA LETTER II", direction="l", linebreak="al", - unicodeslot=0x0B08, + unicodeslot=0xB08, }, - [0x0B09]={ + [0xB09]={ category="lo", description="ORIYA LETTER U", direction="l", linebreak="al", - unicodeslot=0x0B09, + unicodeslot=0xB09, }, - [0x0B0A]={ + [0xB0A]={ category="lo", description="ORIYA LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0B0A, + unicodeslot=0xB0A, }, - [0x0B0B]={ + [0xB0B]={ category="lo", description="ORIYA LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x0B0B, + unicodeslot=0xB0B, }, - [0x0B0C]={ + [0xB0C]={ category="lo", description="ORIYA LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x0B0C, + unicodeslot=0xB0C, }, - [0x0B0F]={ + [0xB0F]={ category="lo", description="ORIYA LETTER E", direction="l", linebreak="al", - unicodeslot=0x0B0F, + unicodeslot=0xB0F, }, - [0x0B10]={ + [0xB10]={ category="lo", description="ORIYA LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0B10, + unicodeslot=0xB10, }, - [0x0B13]={ + [0xB13]={ category="lo", description="ORIYA LETTER O", direction="l", linebreak="al", - unicodeslot=0x0B13, + unicodeslot=0xB13, }, - [0x0B14]={ + [0xB14]={ category="lo", description="ORIYA LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0B14, + unicodeslot=0xB14, }, - [0x0B15]={ + [0xB15]={ category="lo", description="ORIYA LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0B15, + unicodeslot=0xB15, }, - [0x0B16]={ + [0xB16]={ category="lo", description="ORIYA LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0B16, + unicodeslot=0xB16, }, - [0x0B17]={ + [0xB17]={ category="lo", description="ORIYA LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0B17, + unicodeslot=0xB17, }, - [0x0B18]={ + [0xB18]={ category="lo", description="ORIYA LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0B18, + unicodeslot=0xB18, }, - [0x0B19]={ + [0xB19]={ category="lo", description="ORIYA LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0B19, + unicodeslot=0xB19, }, - [0x0B1A]={ + [0xB1A]={ category="lo", description="ORIYA LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0B1A, + unicodeslot=0xB1A, }, - [0x0B1B]={ + [0xB1B]={ category="lo", description="ORIYA LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0B1B, + unicodeslot=0xB1B, }, - [0x0B1C]={ + [0xB1C]={ category="lo", description="ORIYA LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0B1C, + unicodeslot=0xB1C, }, - [0x0B1D]={ + [0xB1D]={ category="lo", description="ORIYA LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0B1D, + unicodeslot=0xB1D, }, - [0x0B1E]={ + [0xB1E]={ category="lo", description="ORIYA LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0B1E, + unicodeslot=0xB1E, }, - [0x0B1F]={ + [0xB1F]={ category="lo", description="ORIYA LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0B1F, + unicodeslot=0xB1F, }, - [0x0B20]={ + [0xB20]={ category="lo", description="ORIYA LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0B20, + unicodeslot=0xB20, }, - [0x0B21]={ + [0xB21]={ category="lo", description="ORIYA LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0B21, + unicodeslot=0xB21, }, - [0x0B22]={ + [0xB22]={ category="lo", description="ORIYA LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0B22, + unicodeslot=0xB22, }, - [0x0B23]={ + [0xB23]={ category="lo", description="ORIYA LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0B23, + unicodeslot=0xB23, }, - [0x0B24]={ + [0xB24]={ category="lo", description="ORIYA LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0B24, + unicodeslot=0xB24, }, - [0x0B25]={ + [0xB25]={ category="lo", description="ORIYA LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0B25, + unicodeslot=0xB25, }, - [0x0B26]={ + [0xB26]={ category="lo", description="ORIYA LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0B26, + unicodeslot=0xB26, }, - [0x0B27]={ + [0xB27]={ category="lo", description="ORIYA LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0B27, + unicodeslot=0xB27, }, - [0x0B28]={ + [0xB28]={ category="lo", description="ORIYA LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0B28, + unicodeslot=0xB28, }, - [0x0B2A]={ + [0xB2A]={ category="lo", description="ORIYA LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0B2A, + unicodeslot=0xB2A, }, - [0x0B2B]={ + [0xB2B]={ category="lo", description="ORIYA LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0B2B, + unicodeslot=0xB2B, }, - [0x0B2C]={ + [0xB2C]={ category="lo", description="ORIYA LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0B2C, + unicodeslot=0xB2C, }, - [0x0B2D]={ + [0xB2D]={ category="lo", description="ORIYA LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0B2D, + unicodeslot=0xB2D, }, - [0x0B2E]={ + [0xB2E]={ category="lo", description="ORIYA LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0B2E, + unicodeslot=0xB2E, }, - [0x0B2F]={ + [0xB2F]={ category="lo", description="ORIYA LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0B2F, + unicodeslot=0xB2F, }, - [0x0B30]={ + [0xB30]={ category="lo", description="ORIYA LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0B30, + unicodeslot=0xB30, }, - [0x0B32]={ + [0xB32]={ category="lo", description="ORIYA LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0B32, + unicodeslot=0xB32, }, - [0x0B33]={ + [0xB33]={ category="lo", description="ORIYA LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0B33, + unicodeslot=0xB33, }, - [0x0B35]={ + [0xB35]={ category="lo", description="ORIYA LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0B35, + unicodeslot=0xB35, }, - [0x0B36]={ + [0xB36]={ category="lo", description="ORIYA LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0B36, + unicodeslot=0xB36, }, - [0x0B37]={ + [0xB37]={ category="lo", description="ORIYA LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0B37, + unicodeslot=0xB37, }, - [0x0B38]={ + [0xB38]={ category="lo", description="ORIYA LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0B38, + unicodeslot=0xB38, }, - [0x0B39]={ + [0xB39]={ category="lo", description="ORIYA LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0B39, + unicodeslot=0xB39, }, - [0x0B3C]={ + [0xB3C]={ category="mn", + combining=0x7, description="ORIYA SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x0B3C, + unicodeslot=0xB3C, }, - [0x0B3D]={ + [0xB3D]={ category="lo", description="ORIYA SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x0B3D, + unicodeslot=0xB3D, }, - [0x0B3E]={ + [0xB3E]={ category="mc", description="ORIYA VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0B3E, + unicodeslot=0xB3E, }, - [0x0B3F]={ + [0xB3F]={ category="mn", description="ORIYA VOWEL SIGN I", direction="nsm", linebreak="cm", - unicodeslot=0x0B3F, + unicodeslot=0xB3F, }, - [0x0B40]={ + [0xB40]={ category="mc", description="ORIYA VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x0B40, + unicodeslot=0xB40, }, - [0x0B41]={ + [0xB41]={ category="mn", description="ORIYA VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0B41, + unicodeslot=0xB41, }, - [0x0B42]={ + [0xB42]={ category="mn", description="ORIYA VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x0B42, + unicodeslot=0xB42, }, - [0x0B43]={ + [0xB43]={ category="mn", description="ORIYA VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - unicodeslot=0x0B43, + unicodeslot=0xB43, }, - [0x0B44]={ + [0xB44]={ category="mn", description="ORIYA VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - unicodeslot=0x0B44, + unicodeslot=0xB44, }, - [0x0B47]={ + [0xB47]={ category="mc", description="ORIYA VOWEL SIGN E", direction="l", linebreak="cm", - unicodeslot=0x0B47, + unicodeslot=0xB47, }, - [0x0B48]={ + [0xB48]={ category="mc", description="ORIYA VOWEL SIGN AI", direction="l", linebreak="cm", - specials={ "char", 0x0B47, 0x0B56 }, - unicodeslot=0x0B48, + specials={ "char", 0xB47, 0xB56 }, + unicodeslot=0xB48, }, - [0x0B4B]={ + [0xB4B]={ category="mc", description="ORIYA VOWEL SIGN O", direction="l", linebreak="cm", - specials={ "char", 0x0B47, 0x0B3E }, - unicodeslot=0x0B4B, + specials={ "char", 0xB47, 0xB3E }, + unicodeslot=0xB4B, }, - [0x0B4C]={ + [0xB4C]={ category="mc", description="ORIYA VOWEL SIGN AU", direction="l", linebreak="cm", - specials={ "char", 0x0B47, 0x0B57 }, - unicodeslot=0x0B4C, + specials={ "char", 0xB47, 0xB57 }, + unicodeslot=0xB4C, }, - [0x0B4D]={ + [0xB4D]={ category="mn", + combining=0x9, description="ORIYA SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0B4D, + unicodeslot=0xB4D, }, - [0x0B56]={ + [0xB56]={ category="mn", description="ORIYA AI LENGTH MARK", direction="nsm", linebreak="cm", - unicodeslot=0x0B56, + unicodeslot=0xB56, }, - [0x0B57]={ + [0xB57]={ category="mc", description="ORIYA AU LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x0B57, + unicodeslot=0xB57, }, - [0x0B5C]={ + [0xB5C]={ category="lo", description="ORIYA LETTER RRA", direction="l", linebreak="al", - specials={ "char", 0x0B21, 0x0B3C }, - unicodeslot=0x0B5C, + specials={ "char", 0xB21, 0xB3C }, + unicodeslot=0xB5C, }, - [0x0B5D]={ + [0xB5D]={ category="lo", description="ORIYA LETTER RHA", direction="l", linebreak="al", - specials={ "char", 0x0B22, 0x0B3C }, - unicodeslot=0x0B5D, + specials={ "char", 0xB22, 0xB3C }, + unicodeslot=0xB5D, }, - [0x0B5F]={ + [0xB5F]={ category="lo", description="ORIYA LETTER YYA", direction="l", linebreak="al", - unicodeslot=0x0B5F, + unicodeslot=0xB5F, }, - [0x0B60]={ + [0xB60]={ category="lo", description="ORIYA LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0B60, + unicodeslot=0xB60, }, - [0x0B61]={ + [0xB61]={ category="lo", description="ORIYA LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0B61, + unicodeslot=0xB61, }, - [0x0B62]={ + [0xB62]={ category="mn", description="ORIYA VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0B62, + unicodeslot=0xB62, }, - [0x0B63]={ + [0xB63]={ category="mn", description="ORIYA VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0B63, + unicodeslot=0xB63, }, - [0x0B66]={ + [0xB66]={ category="nd", description="ORIYA DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0B66, + unicodeslot=0xB66, }, - [0x0B67]={ + [0xB67]={ category="nd", description="ORIYA DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0B67, + unicodeslot=0xB67, }, - [0x0B68]={ + [0xB68]={ category="nd", description="ORIYA DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0B68, + unicodeslot=0xB68, }, - [0x0B69]={ + [0xB69]={ category="nd", description="ORIYA DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0B69, + unicodeslot=0xB69, }, - [0x0B6A]={ + [0xB6A]={ category="nd", description="ORIYA DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0B6A, + unicodeslot=0xB6A, }, - [0x0B6B]={ + [0xB6B]={ category="nd", description="ORIYA DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0B6B, + unicodeslot=0xB6B, }, - [0x0B6C]={ + [0xB6C]={ category="nd", description="ORIYA DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0B6C, + unicodeslot=0xB6C, }, - [0x0B6D]={ + [0xB6D]={ category="nd", description="ORIYA DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0B6D, + unicodeslot=0xB6D, }, - [0x0B6E]={ + [0xB6E]={ category="nd", description="ORIYA DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0B6E, + unicodeslot=0xB6E, }, - [0x0B6F]={ + [0xB6F]={ category="nd", description="ORIYA DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0B6F, + unicodeslot=0xB6F, }, - [0x0B70]={ + [0xB70]={ category="so", description="ORIYA ISSHAR", direction="l", linebreak="al", - unicodeslot=0x0B70, + unicodeslot=0xB70, }, - [0x0B71]={ + [0xB71]={ category="lo", description="ORIYA LETTER WA", direction="l", linebreak="al", - unicodeslot=0x0B71, + unicodeslot=0xB71, }, - [0x0B72]={ + [0xB72]={ category="no", description="ORIYA FRACTION ONE QUARTER", direction="l", linebreak="al", - unicodeslot=0x0B72, + unicodeslot=0xB72, }, - [0x0B73]={ + [0xB73]={ category="no", description="ORIYA FRACTION ONE HALF", direction="l", linebreak="al", - unicodeslot=0x0B73, + unicodeslot=0xB73, }, - [0x0B74]={ + [0xB74]={ category="no", description="ORIYA FRACTION THREE QUARTERS", direction="l", linebreak="al", - unicodeslot=0x0B74, + unicodeslot=0xB74, }, - [0x0B75]={ + [0xB75]={ category="no", description="ORIYA FRACTION ONE SIXTEENTH", direction="l", linebreak="al", - unicodeslot=0x0B75, + unicodeslot=0xB75, }, - [0x0B76]={ + [0xB76]={ category="no", description="ORIYA FRACTION ONE EIGHTH", direction="l", linebreak="al", - unicodeslot=0x0B76, + unicodeslot=0xB76, }, - [0x0B77]={ + [0xB77]={ category="no", description="ORIYA FRACTION THREE SIXTEENTHS", direction="l", linebreak="al", - unicodeslot=0x0B77, + unicodeslot=0xB77, }, - [0x0B82]={ + [0xB82]={ category="mn", description="TAMIL SIGN ANUSVARA", direction="nsm", linebreak="cm", - unicodeslot=0x0B82, + unicodeslot=0xB82, }, - [0x0B83]={ + [0xB83]={ category="lo", description="TAMIL SIGN VISARGA", direction="l", linebreak="al", - unicodeslot=0x0B83, + unicodeslot=0xB83, }, - [0x0B85]={ + [0xB85]={ category="lo", description="TAMIL LETTER A", direction="l", linebreak="al", - unicodeslot=0x0B85, + unicodeslot=0xB85, }, - [0x0B86]={ + [0xB86]={ category="lo", description="TAMIL LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0B86, + unicodeslot=0xB86, }, - [0x0B87]={ + [0xB87]={ category="lo", description="TAMIL LETTER I", direction="l", linebreak="al", - unicodeslot=0x0B87, + unicodeslot=0xB87, }, - [0x0B88]={ + [0xB88]={ category="lo", description="TAMIL LETTER II", direction="l", linebreak="al", - unicodeslot=0x0B88, + unicodeslot=0xB88, }, - [0x0B89]={ + [0xB89]={ category="lo", description="TAMIL LETTER U", direction="l", linebreak="al", - unicodeslot=0x0B89, + unicodeslot=0xB89, }, - [0x0B8A]={ + [0xB8A]={ category="lo", description="TAMIL LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0B8A, + unicodeslot=0xB8A, }, - [0x0B8E]={ + [0xB8E]={ category="lo", description="TAMIL LETTER E", direction="l", linebreak="al", - unicodeslot=0x0B8E, + unicodeslot=0xB8E, }, - [0x0B8F]={ + [0xB8F]={ category="lo", description="TAMIL LETTER EE", direction="l", linebreak="al", - unicodeslot=0x0B8F, + unicodeslot=0xB8F, }, - [0x0B90]={ + [0xB90]={ category="lo", description="TAMIL LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0B90, + unicodeslot=0xB90, }, - [0x0B92]={ + [0xB92]={ category="lo", description="TAMIL LETTER O", direction="l", linebreak="al", - unicodeslot=0x0B92, + unicodeslot=0xB92, }, - [0x0B93]={ + [0xB93]={ category="lo", description="TAMIL LETTER OO", direction="l", linebreak="al", - unicodeslot=0x0B93, + unicodeslot=0xB93, }, - [0x0B94]={ + [0xB94]={ category="lo", description="TAMIL LETTER AU", direction="l", linebreak="al", - specials={ "char", 0x0B92, 0x0BD7 }, - unicodeslot=0x0B94, + specials={ "char", 0xB92, 0xBD7 }, + unicodeslot=0xB94, }, - [0x0B95]={ + [0xB95]={ category="lo", description="TAMIL LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0B95, + unicodeslot=0xB95, }, - [0x0B99]={ + [0xB99]={ category="lo", description="TAMIL LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0B99, + unicodeslot=0xB99, }, - [0x0B9A]={ + [0xB9A]={ category="lo", description="TAMIL LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0B9A, + unicodeslot=0xB9A, }, - [0x0B9C]={ + [0xB9C]={ category="lo", description="TAMIL LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0B9C, + unicodeslot=0xB9C, }, - [0x0B9E]={ + [0xB9E]={ category="lo", description="TAMIL LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0B9E, + unicodeslot=0xB9E, }, - [0x0B9F]={ + [0xB9F]={ category="lo", description="TAMIL LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0B9F, + unicodeslot=0xB9F, }, - [0x0BA3]={ + [0xBA3]={ category="lo", description="TAMIL LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0BA3, + unicodeslot=0xBA3, }, - [0x0BA4]={ + [0xBA4]={ category="lo", description="TAMIL LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0BA4, + unicodeslot=0xBA4, }, - [0x0BA8]={ + [0xBA8]={ category="lo", description="TAMIL LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0BA8, + unicodeslot=0xBA8, }, - [0x0BA9]={ + [0xBA9]={ category="lo", description="TAMIL LETTER NNNA", direction="l", linebreak="al", - unicodeslot=0x0BA9, + unicodeslot=0xBA9, }, - [0x0BAA]={ + [0xBAA]={ category="lo", description="TAMIL LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0BAA, + unicodeslot=0xBAA, }, - [0x0BAE]={ + [0xBAE]={ category="lo", description="TAMIL LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0BAE, + unicodeslot=0xBAE, }, - [0x0BAF]={ + [0xBAF]={ category="lo", description="TAMIL LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0BAF, + unicodeslot=0xBAF, }, - [0x0BB0]={ + [0xBB0]={ category="lo", description="TAMIL LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0BB0, + unicodeslot=0xBB0, }, - [0x0BB1]={ + [0xBB1]={ category="lo", description="TAMIL LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0BB1, + unicodeslot=0xBB1, }, - [0x0BB2]={ + [0xBB2]={ category="lo", description="TAMIL LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0BB2, + unicodeslot=0xBB2, }, - [0x0BB3]={ + [0xBB3]={ category="lo", description="TAMIL LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0BB3, + unicodeslot=0xBB3, }, - [0x0BB4]={ + [0xBB4]={ category="lo", description="TAMIL LETTER LLLA", direction="l", linebreak="al", - unicodeslot=0x0BB4, + unicodeslot=0xBB4, }, - [0x0BB5]={ + [0xBB5]={ category="lo", description="TAMIL LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0BB5, + unicodeslot=0xBB5, }, - [0x0BB6]={ + [0xBB6]={ category="lo", description="TAMIL LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0BB6, + unicodeslot=0xBB6, }, - [0x0BB7]={ + [0xBB7]={ category="lo", description="TAMIL LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0BB7, + unicodeslot=0xBB7, }, - [0x0BB8]={ + [0xBB8]={ category="lo", description="TAMIL LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0BB8, + unicodeslot=0xBB8, }, - [0x0BB9]={ + [0xBB9]={ category="lo", description="TAMIL LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0BB9, + unicodeslot=0xBB9, }, - [0x0BBE]={ + [0xBBE]={ category="mc", description="TAMIL VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0BBE, + unicodeslot=0xBBE, }, - [0x0BBF]={ + [0xBBF]={ category="mc", description="TAMIL VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x0BBF, + unicodeslot=0xBBF, }, - [0x0BC0]={ + [0xBC0]={ category="mn", description="TAMIL VOWEL SIGN II", direction="nsm", linebreak="cm", - unicodeslot=0x0BC0, + unicodeslot=0xBC0, }, - [0x0BC1]={ + [0xBC1]={ category="mc", description="TAMIL VOWEL SIGN U", direction="l", linebreak="cm", - unicodeslot=0x0BC1, + unicodeslot=0xBC1, }, - [0x0BC2]={ + [0xBC2]={ category="mc", description="TAMIL VOWEL SIGN UU", direction="l", linebreak="cm", - unicodeslot=0x0BC2, + unicodeslot=0xBC2, }, - [0x0BC6]={ + [0xBC6]={ category="mc", description="TAMIL VOWEL SIGN E", direction="l", linebreak="cm", - unicodeslot=0x0BC6, + unicodeslot=0xBC6, }, - [0x0BC7]={ + [0xBC7]={ category="mc", description="TAMIL VOWEL SIGN EE", direction="l", linebreak="cm", - unicodeslot=0x0BC7, + unicodeslot=0xBC7, }, - [0x0BC8]={ + [0xBC8]={ category="mc", description="TAMIL VOWEL SIGN AI", direction="l", linebreak="cm", - unicodeslot=0x0BC8, + unicodeslot=0xBC8, }, - [0x0BCA]={ + [0xBCA]={ category="mc", description="TAMIL VOWEL SIGN O", direction="l", linebreak="cm", - specials={ "char", 0x0BC6, 0x0BBE }, - unicodeslot=0x0BCA, + specials={ "char", 0xBC6, 0xBBE }, + unicodeslot=0xBCA, }, - [0x0BCB]={ + [0xBCB]={ category="mc", description="TAMIL VOWEL SIGN OO", direction="l", linebreak="cm", - specials={ "char", 0x0BC7, 0x0BBE }, - unicodeslot=0x0BCB, + specials={ "char", 0xBC7, 0xBBE }, + unicodeslot=0xBCB, }, - [0x0BCC]={ + [0xBCC]={ category="mc", description="TAMIL VOWEL SIGN AU", direction="l", linebreak="cm", - specials={ "char", 0x0BC6, 0x0BD7 }, - unicodeslot=0x0BCC, + specials={ "char", 0xBC6, 0xBD7 }, + unicodeslot=0xBCC, }, - [0x0BCD]={ + [0xBCD]={ category="mn", + combining=0x9, description="TAMIL SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0BCD, + unicodeslot=0xBCD, }, - [0x0BD0]={ + [0xBD0]={ category="lo", description="TAMIL OM", direction="l", linebreak="al", - unicodeslot=0x0BD0, + unicodeslot=0xBD0, }, - [0x0BD7]={ + [0xBD7]={ category="mc", description="TAMIL AU LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x0BD7, + unicodeslot=0xBD7, }, - [0x0BE6]={ + [0xBE6]={ category="nd", description="TAMIL DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0BE6, + unicodeslot=0xBE6, }, - [0x0BE7]={ + [0xBE7]={ category="nd", description="TAMIL DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0BE7, + unicodeslot=0xBE7, }, - [0x0BE8]={ + [0xBE8]={ category="nd", description="TAMIL DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0BE8, + unicodeslot=0xBE8, }, - [0x0BE9]={ + [0xBE9]={ category="nd", description="TAMIL DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0BE9, + unicodeslot=0xBE9, }, - [0x0BEA]={ + [0xBEA]={ category="nd", description="TAMIL DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0BEA, + unicodeslot=0xBEA, }, - [0x0BEB]={ + [0xBEB]={ category="nd", description="TAMIL DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0BEB, + unicodeslot=0xBEB, }, - [0x0BEC]={ + [0xBEC]={ category="nd", description="TAMIL DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0BEC, + unicodeslot=0xBEC, }, - [0x0BED]={ + [0xBED]={ category="nd", description="TAMIL DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0BED, + unicodeslot=0xBED, }, - [0x0BEE]={ + [0xBEE]={ category="nd", description="TAMIL DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0BEE, + unicodeslot=0xBEE, }, - [0x0BEF]={ + [0xBEF]={ category="nd", description="TAMIL DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0BEF, + unicodeslot=0xBEF, }, - [0x0BF0]={ + [0xBF0]={ category="no", description="TAMIL NUMBER TEN", direction="l", linebreak="al", - unicodeslot=0x0BF0, + unicodeslot=0xBF0, }, - [0x0BF1]={ + [0xBF1]={ category="no", description="TAMIL NUMBER ONE HUNDRED", direction="l", linebreak="al", - unicodeslot=0x0BF1, + unicodeslot=0xBF1, }, - [0x0BF2]={ + [0xBF2]={ category="no", description="TAMIL NUMBER ONE THOUSAND", direction="l", linebreak="al", - unicodeslot=0x0BF2, + unicodeslot=0xBF2, }, - [0x0BF3]={ + [0xBF3]={ category="so", description="TAMIL DAY SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF3, + unicodeslot=0xBF3, }, - [0x0BF4]={ + [0xBF4]={ category="so", description="TAMIL MONTH SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF4, + unicodeslot=0xBF4, }, - [0x0BF5]={ + [0xBF5]={ category="so", description="TAMIL YEAR SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF5, + unicodeslot=0xBF5, }, - [0x0BF6]={ + [0xBF6]={ category="so", description="TAMIL DEBIT SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF6, + unicodeslot=0xBF6, }, - [0x0BF7]={ + [0xBF7]={ category="so", description="TAMIL CREDIT SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF7, + unicodeslot=0xBF7, }, - [0x0BF8]={ + [0xBF8]={ category="so", description="TAMIL AS ABOVE SIGN", direction="on", linebreak="al", - unicodeslot=0x0BF8, + unicodeslot=0xBF8, }, - [0x0BF9]={ + [0xBF9]={ category="sc", description="TAMIL RUPEE SIGN", direction="et", linebreak="pr", - unicodeslot=0x0BF9, + unicodeslot=0xBF9, }, - [0x0BFA]={ + [0xBFA]={ category="so", description="TAMIL NUMBER SIGN", direction="on", linebreak="al", - unicodeslot=0x0BFA, + unicodeslot=0xBFA, }, - [0x0C01]={ + [0xC00]={ + category="mn", + description="TELUGU SIGN COMBINING CANDRABINDU ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xC00, + }, + [0xC01]={ category="mc", description="TELUGU SIGN CANDRABINDU", direction="l", linebreak="cm", - unicodeslot=0x0C01, + unicodeslot=0xC01, }, - [0x0C02]={ + [0xC02]={ category="mc", description="TELUGU SIGN ANUSVARA", direction="l", linebreak="cm", - unicodeslot=0x0C02, + unicodeslot=0xC02, }, - [0x0C03]={ + [0xC03]={ category="mc", description="TELUGU SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0C03, + unicodeslot=0xC03, }, - [0x0C05]={ + [0xC05]={ category="lo", description="TELUGU LETTER A", direction="l", linebreak="al", - unicodeslot=0x0C05, + unicodeslot=0xC05, }, - [0x0C06]={ + [0xC06]={ category="lo", description="TELUGU LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0C06, + unicodeslot=0xC06, }, - [0x0C07]={ + [0xC07]={ category="lo", description="TELUGU LETTER I", direction="l", linebreak="al", - unicodeslot=0x0C07, + unicodeslot=0xC07, }, - [0x0C08]={ + [0xC08]={ category="lo", description="TELUGU LETTER II", direction="l", linebreak="al", - unicodeslot=0x0C08, + unicodeslot=0xC08, }, - [0x0C09]={ + [0xC09]={ category="lo", description="TELUGU LETTER U", direction="l", linebreak="al", - unicodeslot=0x0C09, + unicodeslot=0xC09, }, - [0x0C0A]={ + [0xC0A]={ category="lo", description="TELUGU LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0C0A, + unicodeslot=0xC0A, }, - [0x0C0B]={ + [0xC0B]={ category="lo", description="TELUGU LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x0C0B, + unicodeslot=0xC0B, }, - [0x0C0C]={ + [0xC0C]={ category="lo", description="TELUGU LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x0C0C, + unicodeslot=0xC0C, }, - [0x0C0E]={ + [0xC0E]={ category="lo", description="TELUGU LETTER E", direction="l", linebreak="al", - unicodeslot=0x0C0E, + unicodeslot=0xC0E, }, - [0x0C0F]={ + [0xC0F]={ category="lo", description="TELUGU LETTER EE", direction="l", linebreak="al", - unicodeslot=0x0C0F, + unicodeslot=0xC0F, }, - [0x0C10]={ + [0xC10]={ category="lo", description="TELUGU LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0C10, + unicodeslot=0xC10, }, - [0x0C12]={ + [0xC12]={ category="lo", description="TELUGU LETTER O", direction="l", linebreak="al", - unicodeslot=0x0C12, + unicodeslot=0xC12, }, - [0x0C13]={ + [0xC13]={ category="lo", description="TELUGU LETTER OO", direction="l", linebreak="al", - unicodeslot=0x0C13, + unicodeslot=0xC13, }, - [0x0C14]={ + [0xC14]={ category="lo", description="TELUGU LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0C14, + unicodeslot=0xC14, }, - [0x0C15]={ + [0xC15]={ category="lo", description="TELUGU LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0C15, + unicodeslot=0xC15, }, - [0x0C16]={ + [0xC16]={ category="lo", description="TELUGU LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0C16, + unicodeslot=0xC16, }, - [0x0C17]={ + [0xC17]={ category="lo", description="TELUGU LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0C17, + unicodeslot=0xC17, }, - [0x0C18]={ + [0xC18]={ category="lo", description="TELUGU LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0C18, + unicodeslot=0xC18, }, - [0x0C19]={ + [0xC19]={ category="lo", description="TELUGU LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0C19, + unicodeslot=0xC19, }, - [0x0C1A]={ + [0xC1A]={ category="lo", description="TELUGU LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0C1A, + unicodeslot=0xC1A, }, - [0x0C1B]={ + [0xC1B]={ category="lo", description="TELUGU LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0C1B, + unicodeslot=0xC1B, }, - [0x0C1C]={ + [0xC1C]={ category="lo", description="TELUGU LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0C1C, + unicodeslot=0xC1C, }, - [0x0C1D]={ + [0xC1D]={ category="lo", description="TELUGU LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0C1D, + unicodeslot=0xC1D, }, - [0x0C1E]={ + [0xC1E]={ category="lo", description="TELUGU LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0C1E, + unicodeslot=0xC1E, }, - [0x0C1F]={ + [0xC1F]={ category="lo", description="TELUGU LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0C1F, + unicodeslot=0xC1F, }, - [0x0C20]={ + [0xC20]={ category="lo", description="TELUGU LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0C20, + unicodeslot=0xC20, }, - [0x0C21]={ + [0xC21]={ category="lo", description="TELUGU LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0C21, + unicodeslot=0xC21, }, - [0x0C22]={ + [0xC22]={ category="lo", description="TELUGU LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0C22, + unicodeslot=0xC22, }, - [0x0C23]={ + [0xC23]={ category="lo", description="TELUGU LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0C23, + unicodeslot=0xC23, }, - [0x0C24]={ + [0xC24]={ category="lo", description="TELUGU LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0C24, + unicodeslot=0xC24, }, - [0x0C25]={ + [0xC25]={ category="lo", description="TELUGU LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0C25, + unicodeslot=0xC25, }, - [0x0C26]={ + [0xC26]={ category="lo", description="TELUGU LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0C26, + unicodeslot=0xC26, }, - [0x0C27]={ + [0xC27]={ category="lo", description="TELUGU LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0C27, + unicodeslot=0xC27, }, - [0x0C28]={ + [0xC28]={ category="lo", description="TELUGU LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0C28, + unicodeslot=0xC28, }, - [0x0C2A]={ + [0xC2A]={ category="lo", description="TELUGU LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0C2A, + unicodeslot=0xC2A, }, - [0x0C2B]={ + [0xC2B]={ category="lo", description="TELUGU LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0C2B, + unicodeslot=0xC2B, }, - [0x0C2C]={ + [0xC2C]={ category="lo", description="TELUGU LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0C2C, + unicodeslot=0xC2C, }, - [0x0C2D]={ + [0xC2D]={ category="lo", description="TELUGU LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0C2D, + unicodeslot=0xC2D, }, - [0x0C2E]={ + [0xC2E]={ category="lo", description="TELUGU LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0C2E, + unicodeslot=0xC2E, }, - [0x0C2F]={ + [0xC2F]={ category="lo", description="TELUGU LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0C2F, + unicodeslot=0xC2F, }, - [0x0C30]={ + [0xC30]={ category="lo", description="TELUGU LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0C30, + unicodeslot=0xC30, }, - [0x0C31]={ + [0xC31]={ category="lo", description="TELUGU LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0C31, + unicodeslot=0xC31, }, - [0x0C32]={ + [0xC32]={ category="lo", description="TELUGU LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0C32, + unicodeslot=0xC32, }, - [0x0C33]={ + [0xC33]={ category="lo", description="TELUGU LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0C33, + unicodeslot=0xC33, + }, + [0xC34]={ + category="lo", + description="TELUGU LETTER LLLA", + direction="l", + linebreak="al", + unicodeslot=0xC34, }, - [0x0C35]={ + [0xC35]={ category="lo", description="TELUGU LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0C35, + unicodeslot=0xC35, }, - [0x0C36]={ + [0xC36]={ category="lo", description="TELUGU LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0C36, + unicodeslot=0xC36, }, - [0x0C37]={ + [0xC37]={ category="lo", description="TELUGU LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0C37, + unicodeslot=0xC37, }, - [0x0C38]={ + [0xC38]={ category="lo", description="TELUGU LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0C38, + unicodeslot=0xC38, }, - [0x0C39]={ + [0xC39]={ category="lo", description="TELUGU LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0C39, + unicodeslot=0xC39, }, - [0x0C3D]={ + [0xC3D]={ category="lo", description="TELUGU SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x0C3D, + unicodeslot=0xC3D, }, - [0x0C3E]={ + [0xC3E]={ category="mn", description="TELUGU VOWEL SIGN AA", direction="nsm", linebreak="cm", - unicodeslot=0x0C3E, + unicodeslot=0xC3E, }, - [0x0C3F]={ + [0xC3F]={ category="mn", description="TELUGU VOWEL SIGN I", direction="nsm", linebreak="cm", - unicodeslot=0x0C3F, + unicodeslot=0xC3F, }, - [0x0C40]={ + [0xC40]={ category="mn", description="TELUGU VOWEL SIGN II", direction="nsm", linebreak="cm", - unicodeslot=0x0C40, + unicodeslot=0xC40, }, - [0x0C41]={ + [0xC41]={ category="mc", description="TELUGU VOWEL SIGN U", direction="l", linebreak="cm", - unicodeslot=0x0C41, + unicodeslot=0xC41, }, - [0x0C42]={ + [0xC42]={ category="mc", description="TELUGU VOWEL SIGN UU", direction="l", linebreak="cm", - unicodeslot=0x0C42, + unicodeslot=0xC42, }, - [0x0C43]={ + [0xC43]={ category="mc", description="TELUGU VOWEL SIGN VOCALIC R", direction="l", linebreak="cm", - unicodeslot=0x0C43, + unicodeslot=0xC43, }, - [0x0C44]={ + [0xC44]={ category="mc", description="TELUGU VOWEL SIGN VOCALIC RR", direction="l", linebreak="cm", - unicodeslot=0x0C44, + unicodeslot=0xC44, }, - [0x0C46]={ + [0xC46]={ category="mn", description="TELUGU VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x0C46, + unicodeslot=0xC46, }, - [0x0C47]={ + [0xC47]={ category="mn", description="TELUGU VOWEL SIGN EE", direction="nsm", linebreak="cm", - unicodeslot=0x0C47, + unicodeslot=0xC47, }, - [0x0C48]={ + [0xC48]={ category="mn", description="TELUGU VOWEL SIGN AI", direction="nsm", linebreak="cm", - specials={ "char", 0x0C46, 0x0C56 }, - unicodeslot=0x0C48, + specials={ "char", 0xC46, 0xC56 }, + unicodeslot=0xC48, }, - [0x0C4A]={ + [0xC4A]={ category="mn", description="TELUGU VOWEL SIGN O", direction="nsm", linebreak="cm", - unicodeslot=0x0C4A, + unicodeslot=0xC4A, }, - [0x0C4B]={ + [0xC4B]={ category="mn", description="TELUGU VOWEL SIGN OO", direction="nsm", linebreak="cm", - unicodeslot=0x0C4B, + unicodeslot=0xC4B, }, - [0x0C4C]={ + [0xC4C]={ category="mn", description="TELUGU VOWEL SIGN AU", direction="nsm", linebreak="cm", - unicodeslot=0x0C4C, + unicodeslot=0xC4C, }, - [0x0C4D]={ + [0xC4D]={ category="mn", + combining=0x9, description="TELUGU SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0C4D, + unicodeslot=0xC4D, }, - [0x0C55]={ + [0xC55]={ category="mn", + combining=0x54, description="TELUGU LENGTH MARK", direction="nsm", linebreak="cm", - unicodeslot=0x0C55, + unicodeslot=0xC55, }, - [0x0C56]={ + [0xC56]={ category="mn", + combining=0x5B, description="TELUGU AI LENGTH MARK", direction="nsm", linebreak="cm", - unicodeslot=0x0C56, + unicodeslot=0xC56, }, - [0x0C58]={ + [0xC58]={ category="lo", description="TELUGU LETTER TSA", direction="l", linebreak="al", - unicodeslot=0x0C58, + unicodeslot=0xC58, }, - [0x0C59]={ + [0xC59]={ category="lo", description="TELUGU LETTER DZA", direction="l", linebreak="al", - unicodeslot=0x0C59, + unicodeslot=0xC59, }, - [0x0C60]={ + [0xC60]={ category="lo", description="TELUGU LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0C60, + unicodeslot=0xC60, }, - [0x0C61]={ + [0xC61]={ category="lo", description="TELUGU LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0C61, + unicodeslot=0xC61, }, - [0x0C62]={ + [0xC62]={ category="mn", description="TELUGU VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0C62, + unicodeslot=0xC62, }, - [0x0C63]={ + [0xC63]={ category="mn", description="TELUGU VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0C63, + unicodeslot=0xC63, }, - [0x0C66]={ + [0xC66]={ category="nd", description="TELUGU DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0C66, + unicodeslot=0xC66, }, - [0x0C67]={ + [0xC67]={ category="nd", description="TELUGU DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0C67, + unicodeslot=0xC67, }, - [0x0C68]={ + [0xC68]={ category="nd", description="TELUGU DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0C68, + unicodeslot=0xC68, }, - [0x0C69]={ + [0xC69]={ category="nd", description="TELUGU DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0C69, + unicodeslot=0xC69, }, - [0x0C6A]={ + [0xC6A]={ category="nd", description="TELUGU DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0C6A, + unicodeslot=0xC6A, }, - [0x0C6B]={ + [0xC6B]={ category="nd", description="TELUGU DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0C6B, + unicodeslot=0xC6B, }, - [0x0C6C]={ + [0xC6C]={ category="nd", description="TELUGU DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0C6C, + unicodeslot=0xC6C, }, - [0x0C6D]={ + [0xC6D]={ category="nd", description="TELUGU DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0C6D, + unicodeslot=0xC6D, }, - [0x0C6E]={ + [0xC6E]={ category="nd", description="TELUGU DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0C6E, + unicodeslot=0xC6E, }, - [0x0C6F]={ + [0xC6F]={ category="nd", description="TELUGU DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0C6F, + unicodeslot=0xC6F, }, - [0x0C78]={ + [0xC78]={ category="no", description="TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C78, + unicodeslot=0xC78, }, - [0x0C79]={ + [0xC79]={ category="no", description="TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C79, + unicodeslot=0xC79, }, - [0x0C7A]={ + [0xC7A]={ category="no", description="TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C7A, + unicodeslot=0xC7A, }, - [0x0C7B]={ + [0xC7B]={ category="no", description="TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C7B, + unicodeslot=0xC7B, }, - [0x0C7C]={ + [0xC7C]={ category="no", description="TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C7C, + unicodeslot=0xC7C, }, - [0x0C7D]={ + [0xC7D]={ category="no", description="TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C7D, + unicodeslot=0xC7D, }, - [0x0C7E]={ + [0xC7E]={ category="no", description="TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR", direction="on", linebreak="al", - unicodeslot=0x0C7E, + unicodeslot=0xC7E, }, - [0x0C7F]={ + [0xC7F]={ category="so", description="TELUGU SIGN TUUMU", direction="l", linebreak="al", - unicodeslot=0x0C7F, + unicodeslot=0xC7F, }, - [0x0C82]={ + [0xC81]={ + category="mn", + description="KANNADA SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0xC81, + }, + [0xC82]={ category="mc", description="KANNADA SIGN ANUSVARA", direction="l", linebreak="cm", - unicodeslot=0x0C82, + unicodeslot=0xC82, }, - [0x0C83]={ + [0xC83]={ category="mc", description="KANNADA SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0C83, + unicodeslot=0xC83, }, - [0x0C85]={ + [0xC85]={ category="lo", description="KANNADA LETTER A", direction="l", linebreak="al", - unicodeslot=0x0C85, + unicodeslot=0xC85, }, - [0x0C86]={ + [0xC86]={ category="lo", description="KANNADA LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0C86, + unicodeslot=0xC86, }, - [0x0C87]={ + [0xC87]={ category="lo", description="KANNADA LETTER I", direction="l", linebreak="al", - unicodeslot=0x0C87, + unicodeslot=0xC87, }, - [0x0C88]={ + [0xC88]={ category="lo", description="KANNADA LETTER II", direction="l", linebreak="al", - unicodeslot=0x0C88, + unicodeslot=0xC88, }, - [0x0C89]={ + [0xC89]={ category="lo", description="KANNADA LETTER U", direction="l", linebreak="al", - unicodeslot=0x0C89, + unicodeslot=0xC89, }, - [0x0C8A]={ + [0xC8A]={ category="lo", description="KANNADA LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0C8A, + unicodeslot=0xC8A, }, - [0x0C8B]={ + [0xC8B]={ category="lo", description="KANNADA LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x0C8B, + unicodeslot=0xC8B, }, - [0x0C8C]={ + [0xC8C]={ category="lo", description="KANNADA LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x0C8C, + unicodeslot=0xC8C, }, - [0x0C8E]={ + [0xC8E]={ category="lo", description="KANNADA LETTER E", direction="l", linebreak="al", - unicodeslot=0x0C8E, + unicodeslot=0xC8E, }, - [0x0C8F]={ + [0xC8F]={ category="lo", description="KANNADA LETTER EE", direction="l", linebreak="al", - unicodeslot=0x0C8F, + unicodeslot=0xC8F, }, - [0x0C90]={ + [0xC90]={ category="lo", description="KANNADA LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0C90, + unicodeslot=0xC90, }, - [0x0C92]={ + [0xC92]={ category="lo", description="KANNADA LETTER O", direction="l", linebreak="al", - unicodeslot=0x0C92, + unicodeslot=0xC92, }, - [0x0C93]={ + [0xC93]={ category="lo", description="KANNADA LETTER OO", direction="l", linebreak="al", - unicodeslot=0x0C93, + unicodeslot=0xC93, }, - [0x0C94]={ + [0xC94]={ category="lo", description="KANNADA LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0C94, + unicodeslot=0xC94, }, - [0x0C95]={ + [0xC95]={ category="lo", description="KANNADA LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0C95, + unicodeslot=0xC95, }, - [0x0C96]={ + [0xC96]={ category="lo", description="KANNADA LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0C96, + unicodeslot=0xC96, }, - [0x0C97]={ + [0xC97]={ category="lo", description="KANNADA LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0C97, + unicodeslot=0xC97, }, - [0x0C98]={ + [0xC98]={ category="lo", description="KANNADA LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0C98, + unicodeslot=0xC98, }, - [0x0C99]={ + [0xC99]={ category="lo", description="KANNADA LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0C99, + unicodeslot=0xC99, }, - [0x0C9A]={ + [0xC9A]={ category="lo", description="KANNADA LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0C9A, + unicodeslot=0xC9A, }, - [0x0C9B]={ + [0xC9B]={ category="lo", description="KANNADA LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0C9B, + unicodeslot=0xC9B, }, - [0x0C9C]={ + [0xC9C]={ category="lo", description="KANNADA LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0C9C, + unicodeslot=0xC9C, }, - [0x0C9D]={ + [0xC9D]={ category="lo", description="KANNADA LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0C9D, + unicodeslot=0xC9D, }, - [0x0C9E]={ + [0xC9E]={ category="lo", description="KANNADA LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0C9E, + unicodeslot=0xC9E, }, - [0x0C9F]={ + [0xC9F]={ category="lo", description="KANNADA LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0C9F, + unicodeslot=0xC9F, }, - [0x0CA0]={ + [0xCA0]={ category="lo", description="KANNADA LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0CA0, + unicodeslot=0xCA0, }, - [0x0CA1]={ + [0xCA1]={ category="lo", description="KANNADA LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0CA1, + unicodeslot=0xCA1, }, - [0x0CA2]={ + [0xCA2]={ category="lo", description="KANNADA LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0CA2, + unicodeslot=0xCA2, }, - [0x0CA3]={ + [0xCA3]={ category="lo", description="KANNADA LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0CA3, + unicodeslot=0xCA3, }, - [0x0CA4]={ + [0xCA4]={ category="lo", description="KANNADA LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0CA4, + unicodeslot=0xCA4, }, - [0x0CA5]={ + [0xCA5]={ category="lo", description="KANNADA LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0CA5, + unicodeslot=0xCA5, }, - [0x0CA6]={ + [0xCA6]={ category="lo", description="KANNADA LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0CA6, + unicodeslot=0xCA6, }, - [0x0CA7]={ + [0xCA7]={ category="lo", description="KANNADA LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0CA7, + unicodeslot=0xCA7, }, - [0x0CA8]={ + [0xCA8]={ category="lo", description="KANNADA LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0CA8, + unicodeslot=0xCA8, }, - [0x0CAA]={ + [0xCAA]={ category="lo", description="KANNADA LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0CAA, + unicodeslot=0xCAA, }, - [0x0CAB]={ + [0xCAB]={ category="lo", description="KANNADA LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0CAB, + unicodeslot=0xCAB, }, - [0x0CAC]={ + [0xCAC]={ category="lo", description="KANNADA LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0CAC, + unicodeslot=0xCAC, }, - [0x0CAD]={ + [0xCAD]={ category="lo", description="KANNADA LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0CAD, + unicodeslot=0xCAD, }, - [0x0CAE]={ + [0xCAE]={ category="lo", description="KANNADA LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0CAE, + unicodeslot=0xCAE, }, - [0x0CAF]={ + [0xCAF]={ category="lo", description="KANNADA LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0CAF, + unicodeslot=0xCAF, }, - [0x0CB0]={ + [0xCB0]={ category="lo", description="KANNADA LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0CB0, + unicodeslot=0xCB0, }, - [0x0CB1]={ + [0xCB1]={ category="lo", description="KANNADA LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0CB1, + unicodeslot=0xCB1, }, - [0x0CB2]={ + [0xCB2]={ category="lo", description="KANNADA LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0CB2, + unicodeslot=0xCB2, }, - [0x0CB3]={ + [0xCB3]={ category="lo", description="KANNADA LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0CB3, + unicodeslot=0xCB3, }, - [0x0CB5]={ + [0xCB5]={ category="lo", description="KANNADA LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0CB5, + unicodeslot=0xCB5, }, - [0x0CB6]={ + [0xCB6]={ category="lo", description="KANNADA LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0CB6, + unicodeslot=0xCB6, }, - [0x0CB7]={ + [0xCB7]={ category="lo", description="KANNADA LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0CB7, + unicodeslot=0xCB7, }, - [0x0CB8]={ + [0xCB8]={ category="lo", description="KANNADA LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0CB8, + unicodeslot=0xCB8, }, - [0x0CB9]={ + [0xCB9]={ category="lo", description="KANNADA LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0CB9, + unicodeslot=0xCB9, }, - [0x0CBC]={ + [0xCBC]={ category="mn", + combining=0x7, description="KANNADA SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x0CBC, + unicodeslot=0xCBC, }, - [0x0CBD]={ + [0xCBD]={ category="lo", description="KANNADA SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x0CBD, + unicodeslot=0xCBD, }, - [0x0CBE]={ + [0xCBE]={ category="mc", description="KANNADA VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0CBE, + unicodeslot=0xCBE, }, - [0x0CBF]={ + [0xCBF]={ category="mn", description="KANNADA VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x0CBF, + unicodeslot=0xCBF, }, - [0x0CC0]={ + [0xCC0]={ category="mc", description="KANNADA VOWEL SIGN II", direction="l", linebreak="cm", - specials={ "char", 0x0CBF, 0x0CD5 }, - unicodeslot=0x0CC0, + specials={ "char", 0xCBF, 0xCD5 }, + unicodeslot=0xCC0, }, - [0x0CC1]={ + [0xCC1]={ category="mc", description="KANNADA VOWEL SIGN U", direction="l", linebreak="cm", - unicodeslot=0x0CC1, + unicodeslot=0xCC1, }, - [0x0CC2]={ + [0xCC2]={ category="mc", description="KANNADA VOWEL SIGN UU", direction="l", linebreak="cm", - unicodeslot=0x0CC2, + unicodeslot=0xCC2, }, - [0x0CC3]={ + [0xCC3]={ category="mc", description="KANNADA VOWEL SIGN VOCALIC R", direction="l", linebreak="cm", - unicodeslot=0x0CC3, + unicodeslot=0xCC3, }, - [0x0CC4]={ + [0xCC4]={ category="mc", description="KANNADA VOWEL SIGN VOCALIC RR", direction="l", linebreak="cm", - unicodeslot=0x0CC4, + unicodeslot=0xCC4, }, - [0x0CC6]={ + [0xCC6]={ category="mn", description="KANNADA VOWEL SIGN E", direction="l", linebreak="cm", - unicodeslot=0x0CC6, + unicodeslot=0xCC6, }, - [0x0CC7]={ + [0xCC7]={ category="mc", description="KANNADA VOWEL SIGN EE", direction="l", linebreak="cm", - specials={ "char", 0x0CC6, 0x0CD5 }, - unicodeslot=0x0CC7, + specials={ "char", 0xCC6, 0xCD5 }, + unicodeslot=0xCC7, }, - [0x0CC8]={ + [0xCC8]={ category="mc", description="KANNADA VOWEL SIGN AI", direction="l", linebreak="cm", - specials={ "char", 0x0CC6, 0x0CD6 }, - unicodeslot=0x0CC8, + specials={ "char", 0xCC6, 0xCD6 }, + unicodeslot=0xCC8, }, - [0x0CCA]={ + [0xCCA]={ category="mc", description="KANNADA VOWEL SIGN O", direction="l", linebreak="cm", - specials={ "char", 0x0CC6, 0x0CC2 }, - unicodeslot=0x0CCA, + specials={ "char", 0xCC6, 0xCC2 }, + unicodeslot=0xCCA, }, - [0x0CCB]={ + [0xCCB]={ category="mc", description="KANNADA VOWEL SIGN OO", direction="l", linebreak="cm", - specials={ "char", 0x0CCA, 0x0CD5 }, - unicodeslot=0x0CCB, + specials={ "char", 0xCCA, 0xCD5 }, + unicodeslot=0xCCB, }, - [0x0CCC]={ + [0xCCC]={ category="mn", description="KANNADA VOWEL SIGN AU", direction="nsm", linebreak="cm", - unicodeslot=0x0CCC, + unicodeslot=0xCCC, }, - [0x0CCD]={ + [0xCCD]={ category="mn", + combining=0x9, description="KANNADA SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0CCD, + unicodeslot=0xCCD, }, - [0x0CD5]={ + [0xCD5]={ category="mc", description="KANNADA LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x0CD5, + unicodeslot=0xCD5, }, - [0x0CD6]={ + [0xCD6]={ category="mc", description="KANNADA AI LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x0CD6, + unicodeslot=0xCD6, }, - [0x0CDE]={ + [0xCDE]={ category="lo", description="KANNADA LETTER FA", direction="l", linebreak="al", - unicodeslot=0x0CDE, + unicodeslot=0xCDE, }, - [0x0CE0]={ + [0xCE0]={ category="lo", description="KANNADA LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0CE0, + unicodeslot=0xCE0, }, - [0x0CE1]={ + [0xCE1]={ category="lo", description="KANNADA LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0CE1, + unicodeslot=0xCE1, }, - [0x0CE2]={ + [0xCE2]={ category="mn", description="KANNADA VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0CE2, + unicodeslot=0xCE2, }, - [0x0CE3]={ + [0xCE3]={ category="mn", description="KANNADA VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0CE3, + unicodeslot=0xCE3, }, - [0x0CE6]={ + [0xCE6]={ category="nd", description="KANNADA DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0CE6, + unicodeslot=0xCE6, }, - [0x0CE7]={ + [0xCE7]={ category="nd", description="KANNADA DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0CE7, + unicodeslot=0xCE7, }, - [0x0CE8]={ + [0xCE8]={ category="nd", description="KANNADA DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0CE8, + unicodeslot=0xCE8, }, - [0x0CE9]={ + [0xCE9]={ category="nd", description="KANNADA DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0CE9, + unicodeslot=0xCE9, }, - [0x0CEA]={ + [0xCEA]={ category="nd", description="KANNADA DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0CEA, + unicodeslot=0xCEA, }, - [0x0CEB]={ + [0xCEB]={ category="nd", description="KANNADA DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0CEB, + unicodeslot=0xCEB, }, - [0x0CEC]={ + [0xCEC]={ category="nd", description="KANNADA DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0CEC, + unicodeslot=0xCEC, }, - [0x0CED]={ + [0xCED]={ category="nd", description="KANNADA DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0CED, + unicodeslot=0xCED, }, - [0x0CEE]={ + [0xCEE]={ category="nd", description="KANNADA DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0CEE, + unicodeslot=0xCEE, }, - [0x0CEF]={ + [0xCEF]={ category="nd", description="KANNADA DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0CEF, + unicodeslot=0xCEF, }, - [0x0CF1]={ + [0xCF1]={ category="so", description="KANNADA SIGN JIHVAMULIYA", direction="l", linebreak="al", - unicodeslot=0x0CF1, + unicodeslot=0xCF1, }, - [0x0CF2]={ + [0xCF2]={ category="so", description="KANNADA SIGN UPADHMANIYA", direction="l", linebreak="al", - unicodeslot=0x0CF2, + unicodeslot=0xCF2, + }, + [0xD01]={ + category="mn", + description="MALAYALAM SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0xD01, }, - [0x0D02]={ + [0xD02]={ category="mc", description="MALAYALAM SIGN ANUSVARA", direction="l", linebreak="cm", - unicodeslot=0x0D02, + unicodeslot=0xD02, }, - [0x0D03]={ + [0xD03]={ category="mc", description="MALAYALAM SIGN VISARGA", direction="l", linebreak="cm", - unicodeslot=0x0D03, + unicodeslot=0xD03, }, - [0x0D05]={ + [0xD05]={ category="lo", description="MALAYALAM LETTER A", direction="l", linebreak="al", - unicodeslot=0x0D05, + unicodeslot=0xD05, }, - [0x0D06]={ + [0xD06]={ category="lo", description="MALAYALAM LETTER AA", direction="l", linebreak="al", - unicodeslot=0x0D06, + unicodeslot=0xD06, }, - [0x0D07]={ + [0xD07]={ category="lo", description="MALAYALAM LETTER I", direction="l", linebreak="al", - unicodeslot=0x0D07, + unicodeslot=0xD07, }, - [0x0D08]={ + [0xD08]={ category="lo", description="MALAYALAM LETTER II", direction="l", linebreak="al", - unicodeslot=0x0D08, + unicodeslot=0xD08, }, - [0x0D09]={ + [0xD09]={ category="lo", description="MALAYALAM LETTER U", direction="l", linebreak="al", - unicodeslot=0x0D09, + unicodeslot=0xD09, }, - [0x0D0A]={ + [0xD0A]={ category="lo", description="MALAYALAM LETTER UU", direction="l", linebreak="al", - unicodeslot=0x0D0A, + unicodeslot=0xD0A, }, - [0x0D0B]={ + [0xD0B]={ category="lo", description="MALAYALAM LETTER VOCALIC R", direction="l", linebreak="al", - unicodeslot=0x0D0B, + unicodeslot=0xD0B, }, - [0x0D0C]={ + [0xD0C]={ category="lo", description="MALAYALAM LETTER VOCALIC L", direction="l", linebreak="al", - unicodeslot=0x0D0C, + unicodeslot=0xD0C, }, - [0x0D0E]={ + [0xD0E]={ category="lo", description="MALAYALAM LETTER E", direction="l", linebreak="al", - unicodeslot=0x0D0E, + unicodeslot=0xD0E, }, - [0x0D0F]={ + [0xD0F]={ category="lo", description="MALAYALAM LETTER EE", direction="l", linebreak="al", - unicodeslot=0x0D0F, + unicodeslot=0xD0F, }, - [0x0D10]={ + [0xD10]={ category="lo", description="MALAYALAM LETTER AI", direction="l", linebreak="al", - unicodeslot=0x0D10, + unicodeslot=0xD10, }, - [0x0D12]={ + [0xD12]={ category="lo", description="MALAYALAM LETTER O", direction="l", linebreak="al", - unicodeslot=0x0D12, + unicodeslot=0xD12, }, - [0x0D13]={ + [0xD13]={ category="lo", description="MALAYALAM LETTER OO", direction="l", linebreak="al", - unicodeslot=0x0D13, + unicodeslot=0xD13, }, - [0x0D14]={ + [0xD14]={ category="lo", description="MALAYALAM LETTER AU", direction="l", linebreak="al", - unicodeslot=0x0D14, + unicodeslot=0xD14, }, - [0x0D15]={ + [0xD15]={ category="lo", description="MALAYALAM LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0D15, + unicodeslot=0xD15, }, - [0x0D16]={ + [0xD16]={ category="lo", description="MALAYALAM LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0D16, + unicodeslot=0xD16, }, - [0x0D17]={ + [0xD17]={ category="lo", description="MALAYALAM LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0D17, + unicodeslot=0xD17, }, - [0x0D18]={ + [0xD18]={ category="lo", description="MALAYALAM LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x0D18, + unicodeslot=0xD18, }, - [0x0D19]={ + [0xD19]={ category="lo", description="MALAYALAM LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0D19, + unicodeslot=0xD19, }, - [0x0D1A]={ + [0xD1A]={ category="lo", description="MALAYALAM LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0D1A, + unicodeslot=0xD1A, }, - [0x0D1B]={ + [0xD1B]={ category="lo", description="MALAYALAM LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0D1B, + unicodeslot=0xD1B, }, - [0x0D1C]={ + [0xD1C]={ category="lo", description="MALAYALAM LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0D1C, + unicodeslot=0xD1C, }, - [0x0D1D]={ + [0xD1D]={ category="lo", description="MALAYALAM LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x0D1D, + unicodeslot=0xD1D, }, - [0x0D1E]={ + [0xD1E]={ category="lo", description="MALAYALAM LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0D1E, + unicodeslot=0xD1E, }, - [0x0D1F]={ + [0xD1F]={ category="lo", description="MALAYALAM LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0D1F, + unicodeslot=0xD1F, }, - [0x0D20]={ + [0xD20]={ category="lo", description="MALAYALAM LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0D20, + unicodeslot=0xD20, }, - [0x0D21]={ + [0xD21]={ category="lo", description="MALAYALAM LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0D21, + unicodeslot=0xD21, }, - [0x0D22]={ + [0xD22]={ category="lo", description="MALAYALAM LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x0D22, + unicodeslot=0xD22, }, - [0x0D23]={ + [0xD23]={ category="lo", description="MALAYALAM LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0D23, + unicodeslot=0xD23, }, - [0x0D24]={ + [0xD24]={ category="lo", description="MALAYALAM LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0D24, + unicodeslot=0xD24, }, - [0x0D25]={ + [0xD25]={ category="lo", description="MALAYALAM LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0D25, + unicodeslot=0xD25, }, - [0x0D26]={ + [0xD26]={ category="lo", description="MALAYALAM LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0D26, + unicodeslot=0xD26, }, - [0x0D27]={ + [0xD27]={ category="lo", description="MALAYALAM LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x0D27, + unicodeslot=0xD27, }, - [0x0D28]={ + [0xD28]={ category="lo", description="MALAYALAM LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0D28, + unicodeslot=0xD28, }, - [0x0D29]={ + [0xD29]={ category="lo", description="MALAYALAM LETTER NNNA", direction="l", linebreak="al", - unicodeslot=0x0D29, + unicodeslot=0xD29, }, - [0x0D2A]={ + [0xD2A]={ category="lo", description="MALAYALAM LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0D2A, + unicodeslot=0xD2A, }, - [0x0D2B]={ + [0xD2B]={ category="lo", description="MALAYALAM LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0D2B, + unicodeslot=0xD2B, }, - [0x0D2C]={ + [0xD2C]={ category="lo", description="MALAYALAM LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0D2C, + unicodeslot=0xD2C, }, - [0x0D2D]={ + [0xD2D]={ category="lo", description="MALAYALAM LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x0D2D, + unicodeslot=0xD2D, }, - [0x0D2E]={ + [0xD2E]={ category="lo", description="MALAYALAM LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0D2E, + unicodeslot=0xD2E, }, - [0x0D2F]={ + [0xD2F]={ category="lo", description="MALAYALAM LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0D2F, + unicodeslot=0xD2F, }, - [0x0D30]={ + [0xD30]={ category="lo", description="MALAYALAM LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0D30, + unicodeslot=0xD30, }, - [0x0D31]={ + [0xD31]={ category="lo", description="MALAYALAM LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0D31, + unicodeslot=0xD31, }, - [0x0D32]={ + [0xD32]={ category="lo", description="MALAYALAM LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0D32, + unicodeslot=0xD32, }, - [0x0D33]={ + [0xD33]={ category="lo", description="MALAYALAM LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x0D33, + unicodeslot=0xD33, }, - [0x0D34]={ + [0xD34]={ category="lo", description="MALAYALAM LETTER LLLA", direction="l", linebreak="al", - unicodeslot=0x0D34, + unicodeslot=0xD34, }, - [0x0D35]={ + [0xD35]={ category="lo", description="MALAYALAM LETTER VA", direction="l", linebreak="al", - unicodeslot=0x0D35, + unicodeslot=0xD35, }, - [0x0D36]={ + [0xD36]={ category="lo", description="MALAYALAM LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0D36, + unicodeslot=0xD36, }, - [0x0D37]={ + [0xD37]={ category="lo", description="MALAYALAM LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0D37, + unicodeslot=0xD37, }, - [0x0D38]={ + [0xD38]={ category="lo", description="MALAYALAM LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0D38, + unicodeslot=0xD38, }, - [0x0D39]={ + [0xD39]={ category="lo", description="MALAYALAM LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0D39, + unicodeslot=0xD39, }, - [0x0D3A]={ + [0xD3A]={ category="lo", description="MALAYALAM LETTER TTTA", direction="l", linebreak="al", - unicodeslot=0x0D3A, + unicodeslot=0xD3A, }, - [0x0D3D]={ + [0xD3D]={ category="lo", description="MALAYALAM SIGN AVAGRAHA", direction="l", linebreak="al", - unicodeslot=0x0D3D, + unicodeslot=0xD3D, }, - [0x0D3E]={ + [0xD3E]={ category="mc", description="MALAYALAM VOWEL SIGN AA", direction="l", linebreak="cm", - unicodeslot=0x0D3E, + unicodeslot=0xD3E, }, - [0x0D3F]={ + [0xD3F]={ category="mc", description="MALAYALAM VOWEL SIGN I", direction="l", linebreak="cm", - unicodeslot=0x0D3F, + unicodeslot=0xD3F, }, - [0x0D40]={ + [0xD40]={ category="mc", description="MALAYALAM VOWEL SIGN II", direction="l", linebreak="cm", - unicodeslot=0x0D40, + unicodeslot=0xD40, }, - [0x0D41]={ + [0xD41]={ category="mn", description="MALAYALAM VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0D41, + unicodeslot=0xD41, }, - [0x0D42]={ + [0xD42]={ category="mn", description="MALAYALAM VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x0D42, + unicodeslot=0xD42, }, - [0x0D43]={ + [0xD43]={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - unicodeslot=0x0D43, + unicodeslot=0xD43, }, - [0x0D44]={ + [0xD44]={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - unicodeslot=0x0D44, + unicodeslot=0xD44, }, - [0x0D46]={ + [0xD46]={ category="mc", description="MALAYALAM VOWEL SIGN E", direction="l", linebreak="cm", - unicodeslot=0x0D46, + unicodeslot=0xD46, }, - [0x0D47]={ + [0xD47]={ category="mc", description="MALAYALAM VOWEL SIGN EE", direction="l", linebreak="cm", - unicodeslot=0x0D47, + unicodeslot=0xD47, }, - [0x0D48]={ + [0xD48]={ category="mc", description="MALAYALAM VOWEL SIGN AI", direction="l", linebreak="cm", - unicodeslot=0x0D48, + unicodeslot=0xD48, }, - [0x0D4A]={ + [0xD4A]={ category="mc", description="MALAYALAM VOWEL SIGN O", direction="l", linebreak="cm", - specials={ "char", 0x0D46, 0x0D3E }, - unicodeslot=0x0D4A, + specials={ "char", 0xD46, 0xD3E }, + unicodeslot=0xD4A, }, - [0x0D4B]={ + [0xD4B]={ category="mc", description="MALAYALAM VOWEL SIGN OO", direction="l", linebreak="cm", - specials={ "char", 0x0D47, 0x0D3E }, - unicodeslot=0x0D4B, + specials={ "char", 0xD47, 0xD3E }, + unicodeslot=0xD4B, }, - [0x0D4C]={ + [0xD4C]={ category="mc", description="MALAYALAM VOWEL SIGN AU", direction="l", linebreak="cm", - specials={ "char", 0x0D46, 0x0D57 }, - unicodeslot=0x0D4C, + specials={ "char", 0xD46, 0xD57 }, + unicodeslot=0xD4C, }, - [0x0D4D]={ + [0xD4D]={ category="mn", + combining=0x9, description="MALAYALAM SIGN VIRAMA", direction="nsm", linebreak="cm", - unicodeslot=0x0D4D, + unicodeslot=0xD4D, }, - [0x0D4E]={ + [0xD4E]={ category="lo", description="MALAYALAM LETTER DOT REPH", direction="l", linebreak="al", - unicodeslot=0x0D4E, + unicodeslot=0xD4E, }, - [0x0D57]={ + [0xD57]={ category="mc", description="MALAYALAM AU LENGTH MARK", direction="l", linebreak="cm", - unicodeslot=0x0D57, + unicodeslot=0xD57, }, - [0x0D60]={ + [0xD60]={ category="lo", description="MALAYALAM LETTER VOCALIC RR", direction="l", linebreak="al", - unicodeslot=0x0D60, + unicodeslot=0xD60, }, - [0x0D61]={ + [0xD61]={ category="lo", description="MALAYALAM LETTER VOCALIC LL", direction="l", linebreak="al", - unicodeslot=0x0D61, + unicodeslot=0xD61, }, - [0x0D62]={ + [0xD62]={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - unicodeslot=0x0D62, + unicodeslot=0xD62, }, - [0x0D63]={ + [0xD63]={ category="mn", description="MALAYALAM VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - unicodeslot=0x0D63, + unicodeslot=0xD63, }, - [0x0D66]={ + [0xD66]={ category="nd", description="MALAYALAM DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0D66, + unicodeslot=0xD66, }, - [0x0D67]={ + [0xD67]={ category="nd", description="MALAYALAM DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0D67, + unicodeslot=0xD67, }, - [0x0D68]={ + [0xD68]={ category="nd", description="MALAYALAM DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0D68, + unicodeslot=0xD68, }, - [0x0D69]={ + [0xD69]={ category="nd", description="MALAYALAM DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0D69, + unicodeslot=0xD69, }, - [0x0D6A]={ + [0xD6A]={ category="nd", description="MALAYALAM DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0D6A, + unicodeslot=0xD6A, }, - [0x0D6B]={ + [0xD6B]={ category="nd", description="MALAYALAM DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0D6B, + unicodeslot=0xD6B, }, - [0x0D6C]={ + [0xD6C]={ category="nd", description="MALAYALAM DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0D6C, + unicodeslot=0xD6C, }, - [0x0D6D]={ + [0xD6D]={ category="nd", description="MALAYALAM DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0D6D, + unicodeslot=0xD6D, }, - [0x0D6E]={ + [0xD6E]={ category="nd", description="MALAYALAM DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0D6E, + unicodeslot=0xD6E, }, - [0x0D6F]={ + [0xD6F]={ category="nd", description="MALAYALAM DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0D6F, + unicodeslot=0xD6F, }, - [0x0D70]={ + [0xD70]={ category="no", description="MALAYALAM NUMBER TEN", direction="l", linebreak="al", - unicodeslot=0x0D70, + unicodeslot=0xD70, }, - [0x0D71]={ + [0xD71]={ category="no", description="MALAYALAM NUMBER ONE HUNDRED", direction="l", linebreak="al", - unicodeslot=0x0D71, + unicodeslot=0xD71, }, - [0x0D72]={ + [0xD72]={ category="no", description="MALAYALAM NUMBER ONE THOUSAND", direction="l", linebreak="al", - unicodeslot=0x0D72, + unicodeslot=0xD72, }, - [0x0D73]={ + [0xD73]={ category="no", description="MALAYALAM FRACTION ONE QUARTER", direction="l", linebreak="al", - unicodeslot=0x0D73, + unicodeslot=0xD73, }, - [0x0D74]={ + [0xD74]={ category="no", description="MALAYALAM FRACTION ONE HALF", direction="l", linebreak="al", - unicodeslot=0x0D74, + unicodeslot=0xD74, }, - [0x0D75]={ + [0xD75]={ category="no", description="MALAYALAM FRACTION THREE QUARTERS", direction="l", linebreak="al", - unicodeslot=0x0D75, + unicodeslot=0xD75, }, - [0x0D79]={ + [0xD79]={ category="so", description="MALAYALAM DATE MARK", direction="l", linebreak="po", - unicodeslot=0x0D79, + unicodeslot=0xD79, }, - [0x0D7A]={ + [0xD7A]={ category="lo", description="MALAYALAM LETTER CHILLU NN", direction="l", linebreak="al", - unicodeslot=0x0D7A, + unicodeslot=0xD7A, }, - [0x0D7B]={ + [0xD7B]={ category="lo", description="MALAYALAM LETTER CHILLU N", direction="l", linebreak="al", - unicodeslot=0x0D7B, + unicodeslot=0xD7B, }, - [0x0D7C]={ + [0xD7C]={ category="lo", description="MALAYALAM LETTER CHILLU RR", direction="l", linebreak="al", - unicodeslot=0x0D7C, + unicodeslot=0xD7C, }, - [0x0D7D]={ + [0xD7D]={ category="lo", description="MALAYALAM LETTER CHILLU L", direction="l", linebreak="al", - unicodeslot=0x0D7D, + unicodeslot=0xD7D, }, - [0x0D7E]={ + [0xD7E]={ category="lo", description="MALAYALAM LETTER CHILLU LL", direction="l", linebreak="al", - unicodeslot=0x0D7E, + unicodeslot=0xD7E, }, - [0x0D7F]={ + [0xD7F]={ category="lo", description="MALAYALAM LETTER CHILLU K", direction="l", linebreak="al", - unicodeslot=0x0D7F, + unicodeslot=0xD7F, }, - [0x0D82]={ + [0xD82]={ category="mc", description="SINHALA SIGN ANUSVARAYA", direction="l", linebreak="cm", - unicodeslot=0x0D82, + unicodeslot=0xD82, }, - [0x0D83]={ + [0xD83]={ category="mc", description="SINHALA SIGN VISARGAYA", direction="l", linebreak="cm", - unicodeslot=0x0D83, + unicodeslot=0xD83, }, - [0x0D85]={ + [0xD85]={ category="lo", description="SINHALA LETTER AYANNA", direction="l", linebreak="al", - unicodeslot=0x0D85, + unicodeslot=0xD85, }, - [0x0D86]={ + [0xD86]={ category="lo", description="SINHALA LETTER AAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D86, + unicodeslot=0xD86, }, - [0x0D87]={ + [0xD87]={ category="lo", description="SINHALA LETTER AEYANNA", direction="l", linebreak="al", - unicodeslot=0x0D87, + unicodeslot=0xD87, }, - [0x0D88]={ + [0xD88]={ category="lo", description="SINHALA LETTER AEEYANNA", direction="l", linebreak="al", - unicodeslot=0x0D88, + unicodeslot=0xD88, }, - [0x0D89]={ + [0xD89]={ category="lo", description="SINHALA LETTER IYANNA", direction="l", linebreak="al", - unicodeslot=0x0D89, + unicodeslot=0xD89, }, - [0x0D8A]={ + [0xD8A]={ category="lo", description="SINHALA LETTER IIYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8A, + unicodeslot=0xD8A, }, - [0x0D8B]={ + [0xD8B]={ category="lo", description="SINHALA LETTER UYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8B, + unicodeslot=0xD8B, }, - [0x0D8C]={ + [0xD8C]={ category="lo", description="SINHALA LETTER UUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8C, + unicodeslot=0xD8C, }, - [0x0D8D]={ + [0xD8D]={ category="lo", description="SINHALA LETTER IRUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8D, + unicodeslot=0xD8D, }, - [0x0D8E]={ + [0xD8E]={ category="lo", description="SINHALA LETTER IRUUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8E, + unicodeslot=0xD8E, }, - [0x0D8F]={ + [0xD8F]={ category="lo", description="SINHALA LETTER ILUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D8F, + unicodeslot=0xD8F, }, - [0x0D90]={ + [0xD90]={ category="lo", description="SINHALA LETTER ILUUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D90, + unicodeslot=0xD90, }, - [0x0D91]={ + [0xD91]={ category="lo", description="SINHALA LETTER EYANNA", direction="l", linebreak="al", - unicodeslot=0x0D91, + unicodeslot=0xD91, }, - [0x0D92]={ + [0xD92]={ category="lo", description="SINHALA LETTER EEYANNA", direction="l", linebreak="al", - unicodeslot=0x0D92, + unicodeslot=0xD92, }, - [0x0D93]={ + [0xD93]={ category="lo", description="SINHALA LETTER AIYANNA", direction="l", linebreak="al", - unicodeslot=0x0D93, + unicodeslot=0xD93, }, - [0x0D94]={ + [0xD94]={ category="lo", description="SINHALA LETTER OYANNA", direction="l", linebreak="al", - unicodeslot=0x0D94, + unicodeslot=0xD94, }, - [0x0D95]={ + [0xD95]={ category="lo", description="SINHALA LETTER OOYANNA", direction="l", linebreak="al", - unicodeslot=0x0D95, + unicodeslot=0xD95, }, - [0x0D96]={ + [0xD96]={ category="lo", description="SINHALA LETTER AUYANNA", direction="l", linebreak="al", - unicodeslot=0x0D96, + unicodeslot=0xD96, }, - [0x0D9A]={ + [0xD9A]={ category="lo", description="SINHALA LETTER ALPAPRAANA KAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D9A, + unicodeslot=0xD9A, }, - [0x0D9B]={ + [0xD9B]={ category="lo", description="SINHALA LETTER MAHAAPRAANA KAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D9B, + unicodeslot=0xD9B, }, - [0x0D9C]={ + [0xD9C]={ category="lo", description="SINHALA LETTER ALPAPRAANA GAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D9C, + unicodeslot=0xD9C, }, - [0x0D9D]={ + [0xD9D]={ category="lo", description="SINHALA LETTER MAHAAPRAANA GAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D9D, + unicodeslot=0xD9D, }, - [0x0D9E]={ + [0xD9E]={ category="lo", description="SINHALA LETTER KANTAJA NAASIKYAYA", direction="l", linebreak="al", - unicodeslot=0x0D9E, + unicodeslot=0xD9E, }, - [0x0D9F]={ + [0xD9F]={ category="lo", description="SINHALA LETTER SANYAKA GAYANNA", direction="l", linebreak="al", - unicodeslot=0x0D9F, + unicodeslot=0xD9F, }, - [0x0DA0]={ + [0xDA0]={ category="lo", description="SINHALA LETTER ALPAPRAANA CAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA0, + unicodeslot=0xDA0, }, - [0x0DA1]={ + [0xDA1]={ category="lo", description="SINHALA LETTER MAHAAPRAANA CAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA1, + unicodeslot=0xDA1, }, - [0x0DA2]={ + [0xDA2]={ category="lo", description="SINHALA LETTER ALPAPRAANA JAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA2, + unicodeslot=0xDA2, }, - [0x0DA3]={ + [0xDA3]={ category="lo", description="SINHALA LETTER MAHAAPRAANA JAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA3, + unicodeslot=0xDA3, }, - [0x0DA4]={ + [0xDA4]={ category="lo", description="SINHALA LETTER TAALUJA NAASIKYAYA", direction="l", linebreak="al", - unicodeslot=0x0DA4, + unicodeslot=0xDA4, }, - [0x0DA5]={ + [0xDA5]={ category="lo", description="SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA", direction="l", linebreak="al", - unicodeslot=0x0DA5, + unicodeslot=0xDA5, }, - [0x0DA6]={ + [0xDA6]={ category="lo", description="SINHALA LETTER SANYAKA JAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA6, + unicodeslot=0xDA6, }, - [0x0DA7]={ + [0xDA7]={ category="lo", description="SINHALA LETTER ALPAPRAANA TTAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA7, + unicodeslot=0xDA7, }, - [0x0DA8]={ + [0xDA8]={ category="lo", description="SINHALA LETTER MAHAAPRAANA TTAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA8, + unicodeslot=0xDA8, }, - [0x0DA9]={ + [0xDA9]={ category="lo", description="SINHALA LETTER ALPAPRAANA DDAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DA9, + unicodeslot=0xDA9, }, - [0x0DAA]={ + [0xDAA]={ category="lo", description="SINHALA LETTER MAHAAPRAANA DDAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAA, + unicodeslot=0xDAA, }, - [0x0DAB]={ + [0xDAB]={ category="lo", description="SINHALA LETTER MUURDHAJA NAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAB, + unicodeslot=0xDAB, }, - [0x0DAC]={ + [0xDAC]={ category="lo", description="SINHALA LETTER SANYAKA DDAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAC, + unicodeslot=0xDAC, }, - [0x0DAD]={ + [0xDAD]={ category="lo", description="SINHALA LETTER ALPAPRAANA TAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAD, + unicodeslot=0xDAD, }, - [0x0DAE]={ + [0xDAE]={ category="lo", description="SINHALA LETTER MAHAAPRAANA TAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAE, + unicodeslot=0xDAE, }, - [0x0DAF]={ + [0xDAF]={ category="lo", description="SINHALA LETTER ALPAPRAANA DAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DAF, + unicodeslot=0xDAF, }, - [0x0DB0]={ + [0xDB0]={ category="lo", description="SINHALA LETTER MAHAAPRAANA DAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB0, + unicodeslot=0xDB0, }, - [0x0DB1]={ + [0xDB1]={ category="lo", description="SINHALA LETTER DANTAJA NAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB1, + unicodeslot=0xDB1, }, - [0x0DB3]={ + [0xDB3]={ category="lo", description="SINHALA LETTER SANYAKA DAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB3, + unicodeslot=0xDB3, }, - [0x0DB4]={ + [0xDB4]={ category="lo", description="SINHALA LETTER ALPAPRAANA PAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB4, + unicodeslot=0xDB4, }, - [0x0DB5]={ + [0xDB5]={ category="lo", description="SINHALA LETTER MAHAAPRAANA PAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB5, + unicodeslot=0xDB5, }, - [0x0DB6]={ + [0xDB6]={ category="lo", description="SINHALA LETTER ALPAPRAANA BAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB6, + unicodeslot=0xDB6, }, - [0x0DB7]={ + [0xDB7]={ category="lo", description="SINHALA LETTER MAHAAPRAANA BAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB7, + unicodeslot=0xDB7, }, - [0x0DB8]={ + [0xDB8]={ category="lo", description="SINHALA LETTER MAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB8, + unicodeslot=0xDB8, }, - [0x0DB9]={ + [0xDB9]={ category="lo", description="SINHALA LETTER AMBA BAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DB9, + unicodeslot=0xDB9, }, - [0x0DBA]={ + [0xDBA]={ category="lo", description="SINHALA LETTER YAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DBA, + unicodeslot=0xDBA, }, - [0x0DBB]={ + [0xDBB]={ category="lo", description="SINHALA LETTER RAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DBB, + unicodeslot=0xDBB, }, - [0x0DBD]={ + [0xDBD]={ category="lo", description="SINHALA LETTER DANTAJA LAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DBD, + unicodeslot=0xDBD, }, - [0x0DC0]={ + [0xDC0]={ category="lo", description="SINHALA LETTER VAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC0, + unicodeslot=0xDC0, }, - [0x0DC1]={ + [0xDC1]={ category="lo", description="SINHALA LETTER TAALUJA SAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC1, + unicodeslot=0xDC1, }, - [0x0DC2]={ + [0xDC2]={ category="lo", description="SINHALA LETTER MUURDHAJA SAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC2, + unicodeslot=0xDC2, }, - [0x0DC3]={ + [0xDC3]={ category="lo", description="SINHALA LETTER DANTAJA SAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC3, + unicodeslot=0xDC3, }, - [0x0DC4]={ + [0xDC4]={ category="lo", description="SINHALA LETTER HAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC4, + unicodeslot=0xDC4, }, - [0x0DC5]={ + [0xDC5]={ category="lo", description="SINHALA LETTER MUURDHAJA LAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC5, + unicodeslot=0xDC5, }, - [0x0DC6]={ + [0xDC6]={ category="lo", description="SINHALA LETTER FAYANNA", direction="l", linebreak="al", - unicodeslot=0x0DC6, + unicodeslot=0xDC6, }, - [0x0DCA]={ + [0xDCA]={ category="mn", + combining=0x9, description="SINHALA SIGN AL-LAKUNA", direction="nsm", linebreak="cm", - unicodeslot=0x0DCA, + unicodeslot=0xDCA, }, - [0x0DCF]={ + [0xDCF]={ category="mc", description="SINHALA VOWEL SIGN AELA-PILLA", direction="l", linebreak="cm", - unicodeslot=0x0DCF, + unicodeslot=0xDCF, }, - [0x0DD0]={ + [0xDD0]={ category="mc", description="SINHALA VOWEL SIGN KETTI AEDA-PILLA", direction="l", linebreak="cm", - unicodeslot=0x0DD0, + unicodeslot=0xDD0, }, - [0x0DD1]={ + [0xDD1]={ category="mc", description="SINHALA VOWEL SIGN DIGA AEDA-PILLA", direction="l", linebreak="cm", - unicodeslot=0x0DD1, + unicodeslot=0xDD1, }, - [0x0DD2]={ + [0xDD2]={ category="mn", description="SINHALA VOWEL SIGN KETTI IS-PILLA", direction="nsm", linebreak="cm", - unicodeslot=0x0DD2, + unicodeslot=0xDD2, }, - [0x0DD3]={ + [0xDD3]={ category="mn", description="SINHALA VOWEL SIGN DIGA IS-PILLA", direction="nsm", linebreak="cm", - unicodeslot=0x0DD3, + unicodeslot=0xDD3, }, - [0x0DD4]={ + [0xDD4]={ category="mn", description="SINHALA VOWEL SIGN KETTI PAA-PILLA", direction="nsm", linebreak="cm", - unicodeslot=0x0DD4, + unicodeslot=0xDD4, }, - [0x0DD6]={ + [0xDD6]={ category="mn", description="SINHALA VOWEL SIGN DIGA PAA-PILLA", direction="nsm", linebreak="cm", - unicodeslot=0x0DD6, + unicodeslot=0xDD6, }, - [0x0DD8]={ + [0xDD8]={ category="mc", description="SINHALA VOWEL SIGN GAETTA-PILLA", direction="l", linebreak="cm", - unicodeslot=0x0DD8, + unicodeslot=0xDD8, }, - [0x0DD9]={ + [0xDD9]={ category="mc", description="SINHALA VOWEL SIGN KOMBUVA", direction="l", linebreak="cm", - unicodeslot=0x0DD9, + unicodeslot=0xDD9, }, - [0x0DDA]={ + [0xDDA]={ category="mc", description="SINHALA VOWEL SIGN DIGA KOMBUVA", direction="l", linebreak="cm", - specials={ "char", 0x0DD9, 0x0DCA }, - unicodeslot=0x0DDA, + specials={ "char", 0xDD9, 0xDCA }, + unicodeslot=0xDDA, }, - [0x0DDB]={ + [0xDDB]={ category="mc", description="SINHALA VOWEL SIGN KOMBU DEKA", direction="l", linebreak="cm", - unicodeslot=0x0DDB, + unicodeslot=0xDDB, }, - [0x0DDC]={ + [0xDDC]={ category="mc", description="SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA", direction="l", linebreak="cm", - specials={ "char", 0x0DD9, 0x0DCF }, - unicodeslot=0x0DDC, + specials={ "char", 0xDD9, 0xDCF }, + unicodeslot=0xDDC, }, - [0x0DDD]={ + [0xDDD]={ category="mc", description="SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA", direction="l", linebreak="cm", - specials={ "char", 0x0DDC, 0x0DCA }, - unicodeslot=0x0DDD, + specials={ "char", 0xDDC, 0xDCA }, + unicodeslot=0xDDD, }, - [0x0DDE]={ + [0xDDE]={ category="mc", description="SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA", direction="l", linebreak="cm", - specials={ "char", 0x0DD9, 0x0DDF }, - unicodeslot=0x0DDE, + specials={ "char", 0xDD9, 0xDDF }, + unicodeslot=0xDDE, }, - [0x0DDF]={ + [0xDDF]={ category="mc", description="SINHALA VOWEL SIGN GAYANUKITTA", direction="l", linebreak="cm", - unicodeslot=0x0DDF, + unicodeslot=0xDDF, }, - [0x0DF2]={ + [0xDE6]={ + category="nd", + description="SINHALA LITH DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0xDE6, + }, + [0xDE7]={ + category="nd", + description="SINHALA LITH DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0xDE7, + }, + [0xDE8]={ + category="nd", + description="SINHALA LITH DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0xDE8, + }, + [0xDE9]={ + category="nd", + description="SINHALA LITH DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0xDE9, + }, + [0xDEA]={ + category="nd", + description="SINHALA LITH DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0xDEA, + }, + [0xDEB]={ + category="nd", + description="SINHALA LITH DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0xDEB, + }, + [0xDEC]={ + category="nd", + description="SINHALA LITH DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0xDEC, + }, + [0xDED]={ + category="nd", + description="SINHALA LITH DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0xDED, + }, + [0xDEE]={ + category="nd", + description="SINHALA LITH DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0xDEE, + }, + [0xDEF]={ + category="nd", + description="SINHALA LITH DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0xDEF, + }, + [0xDF2]={ category="mc", description="SINHALA VOWEL SIGN DIGA GAETTA-PILLA", direction="l", linebreak="cm", - unicodeslot=0x0DF2, + unicodeslot=0xDF2, }, - [0x0DF3]={ + [0xDF3]={ category="mc", description="SINHALA VOWEL SIGN DIGA GAYANUKITTA", direction="l", linebreak="cm", - unicodeslot=0x0DF3, + unicodeslot=0xDF3, }, - [0x0DF4]={ + [0xDF4]={ category="po", description="SINHALA PUNCTUATION KUNDDALIYA", direction="l", linebreak="al", - unicodeslot=0x0DF4, + unicodeslot=0xDF4, }, - [0x0E01]={ + [0xE01]={ adobename="kokaithai", category="lo", description="THAI CHARACTER KO KAI", direction="l", linebreak="sa", - unicodeslot=0x0E01, + unicodeslot=0xE01, }, - [0x0E02]={ + [0xE02]={ adobename="khokhaithai", category="lo", description="THAI CHARACTER KHO KHAI", direction="l", linebreak="sa", - unicodeslot=0x0E02, + unicodeslot=0xE02, }, - [0x0E03]={ + [0xE03]={ adobename="khokhuatthai", category="lo", description="THAI CHARACTER KHO KHUAT", direction="l", linebreak="sa", - unicodeslot=0x0E03, + unicodeslot=0xE03, }, - [0x0E04]={ + [0xE04]={ adobename="khokhwaithai", category="lo", description="THAI CHARACTER KHO KHWAI", direction="l", linebreak="sa", - unicodeslot=0x0E04, + unicodeslot=0xE04, }, - [0x0E05]={ + [0xE05]={ adobename="khokhonthai", category="lo", description="THAI CHARACTER KHO KHON", direction="l", linebreak="sa", - unicodeslot=0x0E05, + unicodeslot=0xE05, }, - [0x0E06]={ + [0xE06]={ adobename="khorakhangthai", category="lo", description="THAI CHARACTER KHO RAKHANG", direction="l", linebreak="sa", - unicodeslot=0x0E06, + unicodeslot=0xE06, }, - [0x0E07]={ + [0xE07]={ adobename="ngonguthai", category="lo", description="THAI CHARACTER NGO NGU", direction="l", linebreak="sa", - unicodeslot=0x0E07, + unicodeslot=0xE07, }, - [0x0E08]={ + [0xE08]={ adobename="chochanthai", category="lo", description="THAI CHARACTER CHO CHAN", direction="l", linebreak="sa", - unicodeslot=0x0E08, + unicodeslot=0xE08, }, - [0x0E09]={ + [0xE09]={ adobename="chochingthai", category="lo", description="THAI CHARACTER CHO CHING", direction="l", linebreak="sa", - unicodeslot=0x0E09, + unicodeslot=0xE09, }, - [0x0E0A]={ + [0xE0A]={ adobename="chochangthai", category="lo", description="THAI CHARACTER CHO CHANG", direction="l", linebreak="sa", - unicodeslot=0x0E0A, + unicodeslot=0xE0A, }, - [0x0E0B]={ + [0xE0B]={ adobename="sosothai", category="lo", description="THAI CHARACTER SO SO", direction="l", linebreak="sa", - unicodeslot=0x0E0B, + unicodeslot=0xE0B, }, - [0x0E0C]={ + [0xE0C]={ adobename="chochoethai", category="lo", description="THAI CHARACTER CHO CHOE", direction="l", linebreak="sa", - unicodeslot=0x0E0C, + unicodeslot=0xE0C, }, - [0x0E0D]={ + [0xE0D]={ adobename="yoyingthai", category="lo", description="THAI CHARACTER YO YING", direction="l", linebreak="sa", - unicodeslot=0x0E0D, + unicodeslot=0xE0D, }, - [0x0E0E]={ + [0xE0E]={ adobename="dochadathai", category="lo", description="THAI CHARACTER DO CHADA", direction="l", linebreak="sa", - unicodeslot=0x0E0E, + unicodeslot=0xE0E, }, - [0x0E0F]={ + [0xE0F]={ adobename="topatakthai", category="lo", description="THAI CHARACTER TO PATAK", direction="l", linebreak="sa", - unicodeslot=0x0E0F, + unicodeslot=0xE0F, }, - [0x0E10]={ + [0xE10]={ adobename="thothanthai", category="lo", description="THAI CHARACTER THO THAN", direction="l", linebreak="sa", - unicodeslot=0x0E10, + unicodeslot=0xE10, }, - [0x0E11]={ + [0xE11]={ adobename="thonangmonthothai", category="lo", description="THAI CHARACTER THO NANGMONTHO", direction="l", linebreak="sa", - unicodeslot=0x0E11, + unicodeslot=0xE11, }, - [0x0E12]={ + [0xE12]={ adobename="thophuthaothai", category="lo", description="THAI CHARACTER THO PHUTHAO", direction="l", linebreak="sa", - unicodeslot=0x0E12, + unicodeslot=0xE12, }, - [0x0E13]={ + [0xE13]={ adobename="nonenthai", category="lo", description="THAI CHARACTER NO NEN", direction="l", linebreak="sa", - unicodeslot=0x0E13, + unicodeslot=0xE13, }, - [0x0E14]={ + [0xE14]={ adobename="dodekthai", category="lo", description="THAI CHARACTER DO DEK", direction="l", linebreak="sa", - unicodeslot=0x0E14, + unicodeslot=0xE14, }, - [0x0E15]={ + [0xE15]={ adobename="totaothai", category="lo", description="THAI CHARACTER TO TAO", direction="l", linebreak="sa", - unicodeslot=0x0E15, + unicodeslot=0xE15, }, - [0x0E16]={ + [0xE16]={ adobename="thothungthai", category="lo", description="THAI CHARACTER THO THUNG", direction="l", linebreak="sa", - unicodeslot=0x0E16, + unicodeslot=0xE16, }, - [0x0E17]={ + [0xE17]={ adobename="thothahanthai", category="lo", description="THAI CHARACTER THO THAHAN", direction="l", linebreak="sa", - unicodeslot=0x0E17, + unicodeslot=0xE17, }, - [0x0E18]={ + [0xE18]={ adobename="thothongthai", category="lo", description="THAI CHARACTER THO THONG", direction="l", linebreak="sa", - unicodeslot=0x0E18, + unicodeslot=0xE18, }, - [0x0E19]={ + [0xE19]={ adobename="nonuthai", category="lo", description="THAI CHARACTER NO NU", direction="l", linebreak="sa", - unicodeslot=0x0E19, + unicodeslot=0xE19, }, - [0x0E1A]={ + [0xE1A]={ adobename="bobaimaithai", category="lo", description="THAI CHARACTER BO BAIMAI", direction="l", linebreak="sa", - unicodeslot=0x0E1A, + unicodeslot=0xE1A, }, - [0x0E1B]={ + [0xE1B]={ adobename="poplathai", category="lo", description="THAI CHARACTER PO PLA", direction="l", linebreak="sa", - unicodeslot=0x0E1B, + unicodeslot=0xE1B, }, - [0x0E1C]={ + [0xE1C]={ adobename="phophungthai", category="lo", description="THAI CHARACTER PHO PHUNG", direction="l", linebreak="sa", - unicodeslot=0x0E1C, + unicodeslot=0xE1C, }, - [0x0E1D]={ + [0xE1D]={ adobename="fofathai", category="lo", description="THAI CHARACTER FO FA", direction="l", linebreak="sa", - unicodeslot=0x0E1D, + unicodeslot=0xE1D, }, - [0x0E1E]={ + [0xE1E]={ adobename="phophanthai", category="lo", description="THAI CHARACTER PHO PHAN", direction="l", linebreak="sa", - unicodeslot=0x0E1E, + unicodeslot=0xE1E, }, - [0x0E1F]={ + [0xE1F]={ adobename="fofanthai", category="lo", description="THAI CHARACTER FO FAN", direction="l", linebreak="sa", - unicodeslot=0x0E1F, + unicodeslot=0xE1F, }, - [0x0E20]={ + [0xE20]={ adobename="phosamphaothai", category="lo", description="THAI CHARACTER PHO SAMPHAO", direction="l", linebreak="sa", - unicodeslot=0x0E20, + unicodeslot=0xE20, }, - [0x0E21]={ + [0xE21]={ adobename="momathai", category="lo", description="THAI CHARACTER MO MA", direction="l", linebreak="sa", - unicodeslot=0x0E21, + unicodeslot=0xE21, }, - [0x0E22]={ + [0xE22]={ adobename="yoyakthai", category="lo", description="THAI CHARACTER YO YAK", direction="l", linebreak="sa", - unicodeslot=0x0E22, + unicodeslot=0xE22, }, - [0x0E23]={ + [0xE23]={ adobename="roruathai", category="lo", description="THAI CHARACTER RO RUA", direction="l", linebreak="sa", - unicodeslot=0x0E23, + unicodeslot=0xE23, }, - [0x0E24]={ + [0xE24]={ adobename="ruthai", category="lo", description="THAI CHARACTER RU", direction="l", linebreak="sa", - unicodeslot=0x0E24, + unicodeslot=0xE24, }, - [0x0E25]={ + [0xE25]={ adobename="lolingthai", category="lo", description="THAI CHARACTER LO LING", direction="l", linebreak="sa", - unicodeslot=0x0E25, + unicodeslot=0xE25, }, - [0x0E26]={ + [0xE26]={ adobename="luthai", category="lo", description="THAI CHARACTER LU", direction="l", linebreak="sa", - unicodeslot=0x0E26, + unicodeslot=0xE26, }, - [0x0E27]={ + [0xE27]={ adobename="wowaenthai", category="lo", description="THAI CHARACTER WO WAEN", direction="l", linebreak="sa", - unicodeslot=0x0E27, + unicodeslot=0xE27, }, - [0x0E28]={ + [0xE28]={ adobename="sosalathai", category="lo", description="THAI CHARACTER SO SALA", direction="l", linebreak="sa", - unicodeslot=0x0E28, + unicodeslot=0xE28, }, - [0x0E29]={ + [0xE29]={ adobename="sorusithai", category="lo", description="THAI CHARACTER SO RUSI", direction="l", linebreak="sa", - unicodeslot=0x0E29, + unicodeslot=0xE29, }, - [0x0E2A]={ + [0xE2A]={ adobename="sosuathai", category="lo", description="THAI CHARACTER SO SUA", direction="l", linebreak="sa", - unicodeslot=0x0E2A, + unicodeslot=0xE2A, }, - [0x0E2B]={ + [0xE2B]={ adobename="hohipthai", category="lo", description="THAI CHARACTER HO HIP", direction="l", linebreak="sa", - unicodeslot=0x0E2B, + unicodeslot=0xE2B, }, - [0x0E2C]={ + [0xE2C]={ adobename="lochulathai", category="lo", description="THAI CHARACTER LO CHULA", direction="l", linebreak="sa", - unicodeslot=0x0E2C, + unicodeslot=0xE2C, }, - [0x0E2D]={ + [0xE2D]={ adobename="oangthai", category="lo", description="THAI CHARACTER O ANG", direction="l", linebreak="sa", - unicodeslot=0x0E2D, + unicodeslot=0xE2D, }, - [0x0E2E]={ + [0xE2E]={ adobename="honokhukthai", category="lo", description="THAI CHARACTER HO NOKHUK", direction="l", linebreak="sa", - unicodeslot=0x0E2E, + unicodeslot=0xE2E, }, - [0x0E2F]={ + [0xE2F]={ adobename="paiyannoithai", category="lo", description="THAI CHARACTER PAIYANNOI", direction="l", linebreak="sa", - unicodeslot=0x0E2F, + unicodeslot=0xE2F, }, - [0x0E30]={ + [0xE30]={ adobename="saraathai", category="lo", description="THAI CHARACTER SARA A", direction="l", linebreak="sa", - unicodeslot=0x0E30, + unicodeslot=0xE30, }, - [0x0E31]={ + [0xE31]={ adobename="maihanakatthai", category="mn", description="THAI CHARACTER MAI HAN-AKAT", direction="nsm", linebreak="sa", - unicodeslot=0x0E31, + unicodeslot=0xE31, }, - [0x0E32]={ + [0xE32]={ adobename="saraaathai", category="lo", description="THAI CHARACTER SARA AA", direction="l", linebreak="sa", - unicodeslot=0x0E32, + unicodeslot=0xE32, }, - [0x0E33]={ + [0xE33]={ adobename="saraamthai", category="lo", description="THAI CHARACTER SARA AM", direction="l", linebreak="sa", - specials={ "compat", 0x0E4D, 0x0E32 }, - unicodeslot=0x0E33, + specials={ "compat", 0xE4D, 0xE32 }, + unicodeslot=0xE33, }, - [0x0E34]={ + [0xE34]={ adobename="saraithai", category="mn", description="THAI CHARACTER SARA I", direction="nsm", linebreak="sa", - unicodeslot=0x0E34, + unicodeslot=0xE34, }, - [0x0E35]={ + [0xE35]={ adobename="saraiithai", category="mn", description="THAI CHARACTER SARA II", direction="nsm", linebreak="sa", - unicodeslot=0x0E35, + unicodeslot=0xE35, }, - [0x0E36]={ + [0xE36]={ adobename="sarauethai", category="mn", description="THAI CHARACTER SARA UE", direction="nsm", linebreak="sa", - unicodeslot=0x0E36, + unicodeslot=0xE36, }, - [0x0E37]={ + [0xE37]={ adobename="saraueethai", category="mn", description="THAI CHARACTER SARA UEE", direction="nsm", linebreak="sa", - unicodeslot=0x0E37, + unicodeslot=0xE37, }, - [0x0E38]={ + [0xE38]={ adobename="sarauthai", category="mn", + combining=0x67, description="THAI CHARACTER SARA U", direction="nsm", linebreak="sa", - unicodeslot=0x0E38, + unicodeslot=0xE38, }, - [0x0E39]={ + [0xE39]={ adobename="sarauuthai", category="mn", + combining=0x67, description="THAI CHARACTER SARA UU", direction="nsm", linebreak="sa", - unicodeslot=0x0E39, + unicodeslot=0xE39, }, - [0x0E3A]={ + [0xE3A]={ adobename="phinthuthai", category="mn", + combining=0x9, description="THAI CHARACTER PHINTHU", direction="nsm", linebreak="sa", - unicodeslot=0x0E3A, + unicodeslot=0xE3A, }, - [0x0E3F]={ + [0xE3F]={ adobename="bahtthai", category="sc", description="THAI CURRENCY SYMBOL BAHT", direction="et", linebreak="pr", - unicodeslot=0x0E3F, + unicodeslot=0xE3F, }, - [0x0E40]={ + [0xE40]={ adobename="saraethai", category="lo", description="THAI CHARACTER SARA E", direction="l", linebreak="sa", - unicodeslot=0x0E40, + unicodeslot=0xE40, }, - [0x0E41]={ + [0xE41]={ adobename="saraaethai", category="lo", description="THAI CHARACTER SARA AE", direction="l", linebreak="sa", - unicodeslot=0x0E41, + unicodeslot=0xE41, }, - [0x0E42]={ + [0xE42]={ adobename="saraothai", category="lo", description="THAI CHARACTER SARA O", direction="l", linebreak="sa", - unicodeslot=0x0E42, + unicodeslot=0xE42, }, - [0x0E43]={ + [0xE43]={ adobename="saraaimaimuanthai", category="lo", description="THAI CHARACTER SARA AI MAIMUAN", direction="l", linebreak="sa", - unicodeslot=0x0E43, + unicodeslot=0xE43, }, - [0x0E44]={ + [0xE44]={ adobename="saraaimaimalaithai", category="lo", description="THAI CHARACTER SARA AI MAIMALAI", direction="l", linebreak="sa", - unicodeslot=0x0E44, + unicodeslot=0xE44, }, - [0x0E45]={ + [0xE45]={ adobename="lakkhangyaothai", category="lo", description="THAI CHARACTER LAKKHANGYAO", direction="l", linebreak="sa", - unicodeslot=0x0E45, + unicodeslot=0xE45, }, - [0x0E46]={ + [0xE46]={ adobename="maiyamokthai", category="lm", description="THAI CHARACTER MAIYAMOK", direction="l", linebreak="sa", - unicodeslot=0x0E46, + unicodeslot=0xE46, }, - [0x0E47]={ + [0xE47]={ adobename="maitaikhuthai", category="mn", description="THAI CHARACTER MAITAIKHU", direction="nsm", linebreak="sa", - unicodeslot=0x0E47, + unicodeslot=0xE47, }, - [0x0E48]={ + [0xE48]={ adobename="maiekthai", category="mn", + combining=0x6B, description="THAI CHARACTER MAI EK", direction="nsm", linebreak="sa", - unicodeslot=0x0E48, + unicodeslot=0xE48, }, - [0x0E49]={ + [0xE49]={ adobename="maithothai", category="mn", + combining=0x6B, description="THAI CHARACTER MAI THO", direction="nsm", linebreak="sa", - unicodeslot=0x0E49, + unicodeslot=0xE49, }, - [0x0E4A]={ + [0xE4A]={ adobename="maitrithai", category="mn", + combining=0x6B, description="THAI CHARACTER MAI TRI", direction="nsm", linebreak="sa", - unicodeslot=0x0E4A, + unicodeslot=0xE4A, }, - [0x0E4B]={ + [0xE4B]={ adobename="maichattawathai", category="mn", + combining=0x6B, description="THAI CHARACTER MAI CHATTAWA", direction="nsm", linebreak="sa", - unicodeslot=0x0E4B, + unicodeslot=0xE4B, }, - [0x0E4C]={ + [0xE4C]={ adobename="thanthakhatthai", category="mn", description="THAI CHARACTER THANTHAKHAT", direction="nsm", linebreak="sa", - unicodeslot=0x0E4C, + unicodeslot=0xE4C, }, - [0x0E4D]={ + [0xE4D]={ adobename="nikhahitthai", category="mn", description="THAI CHARACTER NIKHAHIT", direction="nsm", linebreak="sa", - unicodeslot=0x0E4D, + unicodeslot=0xE4D, }, - [0x0E4E]={ + [0xE4E]={ adobename="yamakkanthai", category="mn", description="THAI CHARACTER YAMAKKAN", direction="nsm", linebreak="sa", - unicodeslot=0x0E4E, + unicodeslot=0xE4E, }, - [0x0E4F]={ + [0xE4F]={ adobename="fongmanthai", category="po", description="THAI CHARACTER FONGMAN", direction="l", linebreak="al", - unicodeslot=0x0E4F, + unicodeslot=0xE4F, }, - [0x0E50]={ + [0xE50]={ adobename="zerothai", category="nd", description="THAI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0E50, + unicodeslot=0xE50, }, - [0x0E51]={ + [0xE51]={ adobename="onethai", category="nd", description="THAI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0E51, + unicodeslot=0xE51, }, - [0x0E52]={ + [0xE52]={ adobename="twothai", category="nd", description="THAI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0E52, + unicodeslot=0xE52, }, - [0x0E53]={ + [0xE53]={ adobename="threethai", category="nd", description="THAI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0E53, + unicodeslot=0xE53, }, - [0x0E54]={ + [0xE54]={ adobename="fourthai", category="nd", description="THAI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0E54, + unicodeslot=0xE54, }, - [0x0E55]={ + [0xE55]={ adobename="fivethai", category="nd", description="THAI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0E55, + unicodeslot=0xE55, }, - [0x0E56]={ + [0xE56]={ adobename="sixthai", category="nd", description="THAI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0E56, + unicodeslot=0xE56, }, - [0x0E57]={ + [0xE57]={ adobename="seventhai", category="nd", description="THAI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0E57, + unicodeslot=0xE57, }, - [0x0E58]={ + [0xE58]={ adobename="eightthai", category="nd", description="THAI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0E58, + unicodeslot=0xE58, }, - [0x0E59]={ + [0xE59]={ adobename="ninethai", category="nd", description="THAI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0E59, + unicodeslot=0xE59, }, - [0x0E5A]={ + [0xE5A]={ adobename="angkhankhuthai", category="po", description="THAI CHARACTER ANGKHANKHU", direction="l", linebreak="ba", - unicodeslot=0x0E5A, + unicodeslot=0xE5A, }, - [0x0E5B]={ + [0xE5B]={ adobename="khomutthai", category="po", description="THAI CHARACTER KHOMUT", direction="l", linebreak="ba", - unicodeslot=0x0E5B, + unicodeslot=0xE5B, }, - [0x0E81]={ + [0xE81]={ category="lo", description="LAO LETTER KO", direction="l", linebreak="sa", - unicodeslot=0x0E81, + unicodeslot=0xE81, }, - [0x0E82]={ + [0xE82]={ category="lo", description="LAO LETTER KHO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0E82, + unicodeslot=0xE82, }, - [0x0E84]={ + [0xE84]={ category="lo", description="LAO LETTER KHO TAM", direction="l", linebreak="sa", - unicodeslot=0x0E84, + unicodeslot=0xE84, }, - [0x0E87]={ + [0xE87]={ category="lo", description="LAO LETTER NGO", direction="l", linebreak="sa", - unicodeslot=0x0E87, + unicodeslot=0xE87, }, - [0x0E88]={ + [0xE88]={ category="lo", description="LAO LETTER CO", direction="l", linebreak="sa", - unicodeslot=0x0E88, + unicodeslot=0xE88, }, - [0x0E8A]={ + [0xE8A]={ category="lo", description="LAO LETTER SO TAM", direction="l", linebreak="sa", - unicodeslot=0x0E8A, + unicodeslot=0xE8A, }, - [0x0E8D]={ + [0xE8D]={ category="lo", description="LAO LETTER NYO", direction="l", linebreak="sa", - unicodeslot=0x0E8D, + unicodeslot=0xE8D, }, - [0x0E94]={ + [0xE94]={ category="lo", description="LAO LETTER DO", direction="l", linebreak="sa", - unicodeslot=0x0E94, + unicodeslot=0xE94, }, - [0x0E95]={ + [0xE95]={ category="lo", description="LAO LETTER TO", direction="l", linebreak="sa", - unicodeslot=0x0E95, + unicodeslot=0xE95, }, - [0x0E96]={ + [0xE96]={ category="lo", description="LAO LETTER THO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0E96, + unicodeslot=0xE96, }, - [0x0E97]={ + [0xE97]={ category="lo", description="LAO LETTER THO TAM", direction="l", linebreak="sa", - unicodeslot=0x0E97, + unicodeslot=0xE97, }, - [0x0E99]={ + [0xE99]={ category="lo", description="LAO LETTER NO", direction="l", linebreak="sa", - unicodeslot=0x0E99, + unicodeslot=0xE99, }, - [0x0E9A]={ + [0xE9A]={ category="lo", description="LAO LETTER BO", direction="l", linebreak="sa", - unicodeslot=0x0E9A, + unicodeslot=0xE9A, }, - [0x0E9B]={ + [0xE9B]={ category="lo", description="LAO LETTER PO", direction="l", linebreak="sa", - unicodeslot=0x0E9B, + unicodeslot=0xE9B, }, - [0x0E9C]={ + [0xE9C]={ category="lo", description="LAO LETTER PHO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0E9C, + unicodeslot=0xE9C, }, - [0x0E9D]={ + [0xE9D]={ category="lo", description="LAO LETTER FO TAM", direction="l", linebreak="sa", - unicodeslot=0x0E9D, + unicodeslot=0xE9D, }, - [0x0E9E]={ + [0xE9E]={ category="lo", description="LAO LETTER PHO TAM", direction="l", linebreak="sa", - unicodeslot=0x0E9E, + unicodeslot=0xE9E, }, - [0x0E9F]={ + [0xE9F]={ category="lo", description="LAO LETTER FO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0E9F, + unicodeslot=0xE9F, }, - [0x0EA1]={ + [0xEA1]={ category="lo", description="LAO LETTER MO", direction="l", linebreak="sa", - unicodeslot=0x0EA1, + unicodeslot=0xEA1, }, - [0x0EA2]={ + [0xEA2]={ category="lo", description="LAO LETTER YO", direction="l", linebreak="sa", - unicodeslot=0x0EA2, + unicodeslot=0xEA2, }, - [0x0EA3]={ + [0xEA3]={ category="lo", description="LAO LETTER LO LING", direction="l", linebreak="sa", - unicodeslot=0x0EA3, + unicodeslot=0xEA3, }, - [0x0EA5]={ + [0xEA5]={ category="lo", description="LAO LETTER LO LOOT", direction="l", linebreak="sa", - unicodeslot=0x0EA5, + unicodeslot=0xEA5, }, - [0x0EA7]={ + [0xEA7]={ category="lo", description="LAO LETTER WO", direction="l", linebreak="sa", - unicodeslot=0x0EA7, + unicodeslot=0xEA7, }, - [0x0EAA]={ + [0xEAA]={ category="lo", description="LAO LETTER SO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0EAA, + unicodeslot=0xEAA, }, - [0x0EAB]={ + [0xEAB]={ category="lo", description="LAO LETTER HO SUNG", direction="l", linebreak="sa", - unicodeslot=0x0EAB, + unicodeslot=0xEAB, }, - [0x0EAD]={ + [0xEAD]={ category="lo", description="LAO LETTER O", direction="l", linebreak="sa", - unicodeslot=0x0EAD, + unicodeslot=0xEAD, }, - [0x0EAE]={ + [0xEAE]={ category="lo", description="LAO LETTER HO TAM", direction="l", linebreak="sa", - unicodeslot=0x0EAE, + unicodeslot=0xEAE, }, - [0x0EAF]={ + [0xEAF]={ category="lo", description="LAO ELLIPSIS", direction="l", linebreak="sa", - unicodeslot=0x0EAF, + unicodeslot=0xEAF, }, - [0x0EB0]={ + [0xEB0]={ category="lo", description="LAO VOWEL SIGN A", direction="l", linebreak="sa", - unicodeslot=0x0EB0, + unicodeslot=0xEB0, }, - [0x0EB1]={ + [0xEB1]={ category="mn", description="LAO VOWEL SIGN MAI KAN", direction="nsm", linebreak="sa", - unicodeslot=0x0EB1, + unicodeslot=0xEB1, }, - [0x0EB2]={ + [0xEB2]={ category="lo", description="LAO VOWEL SIGN AA", direction="l", linebreak="sa", - unicodeslot=0x0EB2, + unicodeslot=0xEB2, }, - [0x0EB3]={ + [0xEB3]={ category="lo", description="LAO VOWEL SIGN AM", direction="l", linebreak="sa", - specials={ "compat", 0x0ECD, 0x0EB2 }, - unicodeslot=0x0EB3, + specials={ "compat", 0xECD, 0xEB2 }, + unicodeslot=0xEB3, }, - [0x0EB4]={ + [0xEB4]={ category="mn", description="LAO VOWEL SIGN I", direction="nsm", linebreak="sa", - unicodeslot=0x0EB4, + unicodeslot=0xEB4, }, - [0x0EB5]={ + [0xEB5]={ category="mn", description="LAO VOWEL SIGN II", direction="nsm", linebreak="sa", - unicodeslot=0x0EB5, + unicodeslot=0xEB5, }, - [0x0EB6]={ + [0xEB6]={ category="mn", description="LAO VOWEL SIGN Y", direction="nsm", linebreak="sa", - unicodeslot=0x0EB6, + unicodeslot=0xEB6, }, - [0x0EB7]={ + [0xEB7]={ category="mn", description="LAO VOWEL SIGN YY", direction="nsm", linebreak="sa", - unicodeslot=0x0EB7, + unicodeslot=0xEB7, }, - [0x0EB8]={ + [0xEB8]={ category="mn", + combining=0x76, description="LAO VOWEL SIGN U", direction="nsm", linebreak="sa", - unicodeslot=0x0EB8, + unicodeslot=0xEB8, }, - [0x0EB9]={ + [0xEB9]={ category="mn", + combining=0x76, description="LAO VOWEL SIGN UU", direction="nsm", linebreak="sa", - unicodeslot=0x0EB9, + unicodeslot=0xEB9, }, - [0x0EBB]={ + [0xEBB]={ category="mn", description="LAO VOWEL SIGN MAI KON", direction="nsm", linebreak="sa", - unicodeslot=0x0EBB, + unicodeslot=0xEBB, }, - [0x0EBC]={ + [0xEBC]={ category="mn", description="LAO SEMIVOWEL SIGN LO", direction="nsm", linebreak="sa", - unicodeslot=0x0EBC, + unicodeslot=0xEBC, }, - [0x0EBD]={ + [0xEBD]={ category="lo", description="LAO SEMIVOWEL SIGN NYO", direction="l", linebreak="sa", - unicodeslot=0x0EBD, + unicodeslot=0xEBD, }, - [0x0EC0]={ + [0xEC0]={ category="lo", description="LAO VOWEL SIGN E", direction="l", linebreak="sa", - unicodeslot=0x0EC0, + unicodeslot=0xEC0, }, - [0x0EC1]={ + [0xEC1]={ category="lo", description="LAO VOWEL SIGN EI", direction="l", linebreak="sa", - unicodeslot=0x0EC1, + unicodeslot=0xEC1, }, - [0x0EC2]={ + [0xEC2]={ category="lo", description="LAO VOWEL SIGN O", direction="l", linebreak="sa", - unicodeslot=0x0EC2, + unicodeslot=0xEC2, }, - [0x0EC3]={ + [0xEC3]={ category="lo", description="LAO VOWEL SIGN AY", direction="l", linebreak="sa", - unicodeslot=0x0EC3, + unicodeslot=0xEC3, }, - [0x0EC4]={ + [0xEC4]={ category="lo", description="LAO VOWEL SIGN AI", direction="l", linebreak="sa", - unicodeslot=0x0EC4, + unicodeslot=0xEC4, }, - [0x0EC6]={ + [0xEC6]={ category="lm", description="LAO KO LA", direction="l", linebreak="sa", - unicodeslot=0x0EC6, + unicodeslot=0xEC6, }, - [0x0EC8]={ + [0xEC8]={ category="mn", + combining=0x7A, description="LAO TONE MAI EK", direction="nsm", linebreak="sa", - unicodeslot=0x0EC8, + unicodeslot=0xEC8, }, - [0x0EC9]={ + [0xEC9]={ category="mn", + combining=0x7A, description="LAO TONE MAI THO", direction="nsm", linebreak="sa", - unicodeslot=0x0EC9, + unicodeslot=0xEC9, }, - [0x0ECA]={ + [0xECA]={ category="mn", + combining=0x7A, description="LAO TONE MAI TI", direction="nsm", linebreak="sa", - unicodeslot=0x0ECA, + unicodeslot=0xECA, }, - [0x0ECB]={ + [0xECB]={ category="mn", + combining=0x7A, description="LAO TONE MAI CATAWA", direction="nsm", linebreak="sa", - unicodeslot=0x0ECB, + unicodeslot=0xECB, }, - [0x0ECC]={ + [0xECC]={ category="mn", description="LAO CANCELLATION MARK", direction="nsm", linebreak="sa", - unicodeslot=0x0ECC, + unicodeslot=0xECC, }, - [0x0ECD]={ + [0xECD]={ category="mn", description="LAO NIGGAHITA", direction="nsm", linebreak="sa", - unicodeslot=0x0ECD, + unicodeslot=0xECD, }, - [0x0ED0]={ + [0xED0]={ category="nd", description="LAO DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0ED0, + unicodeslot=0xED0, }, - [0x0ED1]={ + [0xED1]={ category="nd", description="LAO DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0ED1, + unicodeslot=0xED1, }, - [0x0ED2]={ + [0xED2]={ category="nd", description="LAO DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0ED2, + unicodeslot=0xED2, }, - [0x0ED3]={ + [0xED3]={ category="nd", description="LAO DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0ED3, + unicodeslot=0xED3, }, - [0x0ED4]={ + [0xED4]={ category="nd", description="LAO DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0ED4, + unicodeslot=0xED4, }, - [0x0ED5]={ + [0xED5]={ category="nd", description="LAO DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0ED5, + unicodeslot=0xED5, }, - [0x0ED6]={ + [0xED6]={ category="nd", description="LAO DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0ED6, + unicodeslot=0xED6, }, - [0x0ED7]={ + [0xED7]={ category="nd", description="LAO DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0ED7, + unicodeslot=0xED7, }, - [0x0ED8]={ + [0xED8]={ category="nd", description="LAO DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0ED8, + unicodeslot=0xED8, }, - [0x0ED9]={ + [0xED9]={ category="nd", description="LAO DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0ED9, + unicodeslot=0xED9, }, - [0x0EDC]={ + [0xEDC]={ category="lo", description="LAO HO NO", direction="l", linebreak="sa", - specials={ "compat", 0x0EAB, 0x0E99 }, - unicodeslot=0x0EDC, + specials={ "compat", 0xEAB, 0xE99 }, + unicodeslot=0xEDC, }, - [0x0EDD]={ + [0xEDD]={ category="lo", description="LAO HO MO", direction="l", linebreak="sa", - specials={ "compat", 0x0EAB, 0x0EA1 }, - unicodeslot=0x0EDD, + specials={ "compat", 0xEAB, 0xEA1 }, + unicodeslot=0xEDD, }, - [0x0EDE]={ + [0xEDE]={ category="lo", description="LAO LETTER KHMU GO", direction="l", linebreak="sa", - unicodeslot=0x0EDE, + unicodeslot=0xEDE, }, - [0x0EDF]={ + [0xEDF]={ category="lo", description="LAO LETTER KHMU NYO", direction="l", linebreak="sa", - unicodeslot=0x0EDF, + unicodeslot=0xEDF, }, - [0x0F00]={ + [0xF00]={ category="lo", description="TIBETAN SYLLABLE OM", direction="l", linebreak="al", - unicodeslot=0x0F00, + unicodeslot=0xF00, }, - [0x0F01]={ + [0xF01]={ category="so", description="TIBETAN MARK GTER YIG MGO TRUNCATED A", direction="l", linebreak="bb", - unicodeslot=0x0F01, + unicodeslot=0xF01, }, - [0x0F02]={ + [0xF02]={ category="so", description="TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA", direction="l", linebreak="bb", - unicodeslot=0x0F02, + unicodeslot=0xF02, }, - [0x0F03]={ + [0xF03]={ category="so", description="TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA", direction="l", linebreak="bb", - unicodeslot=0x0F03, + unicodeslot=0xF03, }, - [0x0F04]={ + [0xF04]={ category="po", description="TIBETAN MARK INITIAL YIG MGO MDUN MA", direction="l", linebreak="bb", - unicodeslot=0x0F04, + unicodeslot=0xF04, }, - [0x0F05]={ + [0xF05]={ category="po", description="TIBETAN MARK CLOSING YIG MGO SGAB MA", direction="l", linebreak="al", - unicodeslot=0x0F05, + unicodeslot=0xF05, }, - [0x0F06]={ + [0xF06]={ category="po", description="TIBETAN MARK CARET YIG MGO PHUR SHAD MA", direction="l", linebreak="bb", - unicodeslot=0x0F06, + unicodeslot=0xF06, }, - [0x0F07]={ + [0xF07]={ category="po", description="TIBETAN MARK YIG MGO TSHEG SHAD MA", direction="l", linebreak="bb", - unicodeslot=0x0F07, + unicodeslot=0xF07, }, - [0x0F08]={ + [0xF08]={ category="po", description="TIBETAN MARK SBRUL SHAD", direction="l", linebreak="gl", - unicodeslot=0x0F08, + unicodeslot=0xF08, }, - [0x0F09]={ + [0xF09]={ category="po", description="TIBETAN MARK BSKUR YIG MGO", direction="l", linebreak="bb", - unicodeslot=0x0F09, + unicodeslot=0xF09, }, - [0x0F0A]={ + [0xF0A]={ category="po", description="TIBETAN MARK BKA- SHOG YIG MGO", direction="l", linebreak="bb", - unicodeslot=0x0F0A, + unicodeslot=0xF0A, }, - [0x0F0B]={ + [0xF0B]={ category="po", description="TIBETAN MARK INTERSYLLABIC TSHEG", direction="l", linebreak="ba", - unicodeslot=0x0F0B, + unicodeslot=0xF0B, }, - [0x0F0C]={ + [0xF0C]={ category="po", description="TIBETAN MARK DELIMITER TSHEG BSTAR", direction="l", linebreak="gl", - specials={ "nobreak", 0x0F0B }, - unicodeslot=0x0F0C, + specials={ "nobreak", 0xF0B }, + unicodeslot=0xF0C, }, - [0x0F0D]={ + [0xF0D]={ category="po", description="TIBETAN MARK SHAD", direction="l", linebreak="ex", - unicodeslot=0x0F0D, + unicodeslot=0xF0D, }, - [0x0F0E]={ + [0xF0E]={ category="po", description="TIBETAN MARK NYIS SHAD", direction="l", linebreak="ex", - unicodeslot=0x0F0E, + unicodeslot=0xF0E, }, - [0x0F0F]={ + [0xF0F]={ category="po", description="TIBETAN MARK TSHEG SHAD", direction="l", linebreak="ex", - unicodeslot=0x0F0F, + unicodeslot=0xF0F, }, - [0x0F10]={ + [0xF10]={ category="po", description="TIBETAN MARK NYIS TSHEG SHAD", direction="l", linebreak="ex", - unicodeslot=0x0F10, + unicodeslot=0xF10, }, - [0x0F11]={ + [0xF11]={ category="po", description="TIBETAN MARK RIN CHEN SPUNGS SHAD", direction="l", linebreak="ex", - unicodeslot=0x0F11, + unicodeslot=0xF11, }, - [0x0F12]={ + [0xF12]={ category="po", description="TIBETAN MARK RGYA GRAM SHAD", direction="l", linebreak="gl", - unicodeslot=0x0F12, + unicodeslot=0xF12, }, - [0x0F13]={ + [0xF13]={ category="so", description="TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN", direction="l", linebreak="al", - unicodeslot=0x0F13, + unicodeslot=0xF13, }, - [0x0F14]={ + [0xF14]={ category="so", description="TIBETAN MARK GTER TSHEG", direction="l", linebreak="ex", - unicodeslot=0x0F14, + unicodeslot=0xF14, }, - [0x0F15]={ + [0xF15]={ category="so", description="TIBETAN LOGOTYPE SIGN CHAD RTAGS", direction="l", linebreak="al", - unicodeslot=0x0F15, + unicodeslot=0xF15, }, - [0x0F16]={ + [0xF16]={ category="so", description="TIBETAN LOGOTYPE SIGN LHAG RTAGS", direction="l", linebreak="al", - unicodeslot=0x0F16, + unicodeslot=0xF16, }, - [0x0F17]={ + [0xF17]={ category="so", description="TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS", direction="l", linebreak="al", - unicodeslot=0x0F17, + unicodeslot=0xF17, }, - [0x0F18]={ + [0xF18]={ category="mn", + combining=0xDC, description="TIBETAN ASTROLOGICAL SIGN -KHYUD PA", direction="nsm", linebreak="cm", - unicodeslot=0x0F18, + unicodeslot=0xF18, }, - [0x0F19]={ + [0xF19]={ category="mn", + combining=0xDC, description="TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS", direction="nsm", linebreak="cm", - unicodeslot=0x0F19, + unicodeslot=0xF19, }, - [0x0F1A]={ + [0xF1A]={ category="so", description="TIBETAN SIGN RDEL DKAR GCIG", direction="l", linebreak="al", - unicodeslot=0x0F1A, + unicodeslot=0xF1A, }, - [0x0F1B]={ + [0xF1B]={ category="so", description="TIBETAN SIGN RDEL DKAR GNYIS", direction="l", linebreak="al", - unicodeslot=0x0F1B, + unicodeslot=0xF1B, }, - [0x0F1C]={ + [0xF1C]={ category="so", description="TIBETAN SIGN RDEL DKAR GSUM", direction="l", linebreak="al", - unicodeslot=0x0F1C, + unicodeslot=0xF1C, }, - [0x0F1D]={ + [0xF1D]={ category="so", description="TIBETAN SIGN RDEL NAG GCIG", direction="l", linebreak="al", - unicodeslot=0x0F1D, + unicodeslot=0xF1D, }, - [0x0F1E]={ + [0xF1E]={ category="so", description="TIBETAN SIGN RDEL NAG GNYIS", direction="l", linebreak="al", - unicodeslot=0x0F1E, + unicodeslot=0xF1E, }, - [0x0F1F]={ + [0xF1F]={ category="so", description="TIBETAN SIGN RDEL DKAR RDEL NAG", direction="l", linebreak="al", - unicodeslot=0x0F1F, + unicodeslot=0xF1F, }, - [0x0F20]={ + [0xF20]={ category="nd", description="TIBETAN DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x0F20, + unicodeslot=0xF20, }, - [0x0F21]={ + [0xF21]={ category="nd", description="TIBETAN DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x0F21, + unicodeslot=0xF21, }, - [0x0F22]={ + [0xF22]={ category="nd", description="TIBETAN DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x0F22, + unicodeslot=0xF22, }, - [0x0F23]={ + [0xF23]={ category="nd", description="TIBETAN DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x0F23, + unicodeslot=0xF23, }, - [0x0F24]={ + [0xF24]={ category="nd", description="TIBETAN DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x0F24, + unicodeslot=0xF24, }, - [0x0F25]={ + [0xF25]={ category="nd", description="TIBETAN DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x0F25, + unicodeslot=0xF25, }, - [0x0F26]={ + [0xF26]={ category="nd", description="TIBETAN DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x0F26, + unicodeslot=0xF26, }, - [0x0F27]={ + [0xF27]={ category="nd", description="TIBETAN DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x0F27, + unicodeslot=0xF27, }, - [0x0F28]={ + [0xF28]={ category="nd", description="TIBETAN DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x0F28, + unicodeslot=0xF28, }, - [0x0F29]={ + [0xF29]={ category="nd", description="TIBETAN DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x0F29, + unicodeslot=0xF29, }, - [0x0F2A]={ + [0xF2A]={ category="no", description="TIBETAN DIGIT HALF ONE", direction="l", linebreak="al", - unicodeslot=0x0F2A, + unicodeslot=0xF2A, }, - [0x0F2B]={ + [0xF2B]={ category="no", description="TIBETAN DIGIT HALF TWO", direction="l", linebreak="al", - unicodeslot=0x0F2B, + unicodeslot=0xF2B, }, - [0x0F2C]={ + [0xF2C]={ category="no", description="TIBETAN DIGIT HALF THREE", direction="l", linebreak="al", - unicodeslot=0x0F2C, + unicodeslot=0xF2C, }, - [0x0F2D]={ + [0xF2D]={ category="no", description="TIBETAN DIGIT HALF FOUR", direction="l", linebreak="al", - unicodeslot=0x0F2D, + unicodeslot=0xF2D, }, - [0x0F2E]={ + [0xF2E]={ category="no", description="TIBETAN DIGIT HALF FIVE", direction="l", linebreak="al", - unicodeslot=0x0F2E, + unicodeslot=0xF2E, }, - [0x0F2F]={ + [0xF2F]={ category="no", description="TIBETAN DIGIT HALF SIX", direction="l", linebreak="al", - unicodeslot=0x0F2F, + unicodeslot=0xF2F, }, - [0x0F30]={ + [0xF30]={ category="no", description="TIBETAN DIGIT HALF SEVEN", direction="l", linebreak="al", - unicodeslot=0x0F30, + unicodeslot=0xF30, }, - [0x0F31]={ + [0xF31]={ category="no", description="TIBETAN DIGIT HALF EIGHT", direction="l", linebreak="al", - unicodeslot=0x0F31, + unicodeslot=0xF31, }, - [0x0F32]={ + [0xF32]={ category="no", description="TIBETAN DIGIT HALF NINE", direction="l", linebreak="al", - unicodeslot=0x0F32, + unicodeslot=0xF32, }, - [0x0F33]={ + [0xF33]={ category="no", description="TIBETAN DIGIT HALF ZERO", direction="l", linebreak="al", - unicodeslot=0x0F33, + unicodeslot=0xF33, }, - [0x0F34]={ + [0xF34]={ category="so", description="TIBETAN MARK BSDUS RTAGS", direction="l", linebreak="ba", - unicodeslot=0x0F34, + unicodeslot=0xF34, }, - [0x0F35]={ + [0xF35]={ category="mn", + combining=0xDC, description="TIBETAN MARK NGAS BZUNG NYI ZLA", direction="nsm", linebreak="cm", - unicodeslot=0x0F35, + unicodeslot=0xF35, }, - [0x0F36]={ + [0xF36]={ category="so", description="TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN", direction="l", linebreak="al", - unicodeslot=0x0F36, + unicodeslot=0xF36, }, - [0x0F37]={ + [0xF37]={ category="mn", + combining=0xDC, description="TIBETAN MARK NGAS BZUNG SGOR RTAGS", direction="nsm", linebreak="cm", - unicodeslot=0x0F37, + unicodeslot=0xF37, }, - [0x0F38]={ + [0xF38]={ category="so", description="TIBETAN MARK CHE MGO", direction="l", linebreak="al", - unicodeslot=0x0F38, + unicodeslot=0xF38, }, - [0x0F39]={ + [0xF39]={ category="mn", + combining=0xD8, description="TIBETAN MARK TSA -PHRU", direction="nsm", linebreak="cm", - unicodeslot=0x0F39, + unicodeslot=0xF39, }, - [0x0F3A]={ + [0xF3A]={ category="ps", description="TIBETAN MARK GUG RTAGS GYON", direction="on", linebreak="op", - mirror=0x0F3B, - unicodeslot=0x0F3A, + mirror=0xF3B, + unicodeslot=0xF3A, }, - [0x0F3B]={ + [0xF3B]={ category="pe", description="TIBETAN MARK GUG RTAGS GYAS", direction="on", linebreak="cl", - mirror=0x0F3A, - unicodeslot=0x0F3B, + mirror=0xF3A, + unicodeslot=0xF3B, }, - [0x0F3C]={ + [0xF3C]={ category="ps", description="TIBETAN MARK ANG KHANG GYON", direction="on", linebreak="op", - mirror=0x0F3D, - unicodeslot=0x0F3C, + mirror=0xF3D, + unicodeslot=0xF3C, }, - [0x0F3D]={ + [0xF3D]={ category="pe", description="TIBETAN MARK ANG KHANG GYAS", direction="on", linebreak="cl", - mirror=0x0F3C, - unicodeslot=0x0F3D, + mirror=0xF3C, + unicodeslot=0xF3D, }, - [0x0F3E]={ + [0xF3E]={ category="mc", description="TIBETAN SIGN YAR TSHES", direction="l", linebreak="cm", - unicodeslot=0x0F3E, + unicodeslot=0xF3E, }, - [0x0F3F]={ + [0xF3F]={ category="mc", description="TIBETAN SIGN MAR TSHES", direction="l", linebreak="cm", - unicodeslot=0x0F3F, + unicodeslot=0xF3F, }, - [0x0F40]={ + [0xF40]={ category="lo", description="TIBETAN LETTER KA", direction="l", linebreak="al", - unicodeslot=0x0F40, + unicodeslot=0xF40, }, - [0x0F41]={ + [0xF41]={ category="lo", description="TIBETAN LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x0F41, + unicodeslot=0xF41, }, - [0x0F42]={ + [0xF42]={ category="lo", description="TIBETAN LETTER GA", direction="l", linebreak="al", - unicodeslot=0x0F42, + unicodeslot=0xF42, }, - [0x0F43]={ + [0xF43]={ category="lo", description="TIBETAN LETTER GHA", direction="l", linebreak="al", - specials={ "char", 0x0F42, 0x0FB7 }, - unicodeslot=0x0F43, + specials={ "char", 0xF42, 0xFB7 }, + unicodeslot=0xF43, }, - [0x0F44]={ + [0xF44]={ category="lo", description="TIBETAN LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x0F44, + unicodeslot=0xF44, }, - [0x0F45]={ + [0xF45]={ category="lo", description="TIBETAN LETTER CA", direction="l", linebreak="al", - unicodeslot=0x0F45, + unicodeslot=0xF45, }, - [0x0F46]={ + [0xF46]={ category="lo", description="TIBETAN LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x0F46, + unicodeslot=0xF46, }, - [0x0F47]={ + [0xF47]={ category="lo", description="TIBETAN LETTER JA", direction="l", linebreak="al", - unicodeslot=0x0F47, + unicodeslot=0xF47, }, - [0x0F49]={ + [0xF49]={ category="lo", description="TIBETAN LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x0F49, + unicodeslot=0xF49, }, - [0x0F4A]={ + [0xF4A]={ category="lo", description="TIBETAN LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x0F4A, + unicodeslot=0xF4A, }, - [0x0F4B]={ + [0xF4B]={ category="lo", description="TIBETAN LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x0F4B, + unicodeslot=0xF4B, }, - [0x0F4C]={ + [0xF4C]={ category="lo", description="TIBETAN LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x0F4C, + unicodeslot=0xF4C, }, - [0x0F4D]={ + [0xF4D]={ category="lo", description="TIBETAN LETTER DDHA", direction="l", linebreak="al", - specials={ "char", 0x0F4C, 0x0FB7 }, - unicodeslot=0x0F4D, + specials={ "char", 0xF4C, 0xFB7 }, + unicodeslot=0xF4D, }, - [0x0F4E]={ + [0xF4E]={ category="lo", description="TIBETAN LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x0F4E, + unicodeslot=0xF4E, }, - [0x0F4F]={ + [0xF4F]={ category="lo", description="TIBETAN LETTER TA", direction="l", linebreak="al", - unicodeslot=0x0F4F, + unicodeslot=0xF4F, }, - [0x0F50]={ + [0xF50]={ category="lo", description="TIBETAN LETTER THA", direction="l", linebreak="al", - unicodeslot=0x0F50, + unicodeslot=0xF50, }, - [0x0F51]={ + [0xF51]={ category="lo", description="TIBETAN LETTER DA", direction="l", linebreak="al", - unicodeslot=0x0F51, + unicodeslot=0xF51, }, - [0x0F52]={ + [0xF52]={ category="lo", description="TIBETAN LETTER DHA", direction="l", linebreak="al", - specials={ "char", 0x0F51, 0x0FB7 }, - unicodeslot=0x0F52, + specials={ "char", 0xF51, 0xFB7 }, + unicodeslot=0xF52, }, - [0x0F53]={ + [0xF53]={ category="lo", description="TIBETAN LETTER NA", direction="l", linebreak="al", - unicodeslot=0x0F53, + unicodeslot=0xF53, }, - [0x0F54]={ + [0xF54]={ category="lo", description="TIBETAN LETTER PA", direction="l", linebreak="al", - unicodeslot=0x0F54, + unicodeslot=0xF54, }, - [0x0F55]={ + [0xF55]={ category="lo", description="TIBETAN LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x0F55, + unicodeslot=0xF55, }, - [0x0F56]={ + [0xF56]={ category="lo", description="TIBETAN LETTER BA", direction="l", linebreak="al", - unicodeslot=0x0F56, + unicodeslot=0xF56, }, - [0x0F57]={ + [0xF57]={ category="lo", description="TIBETAN LETTER BHA", direction="l", linebreak="al", - specials={ "char", 0x0F56, 0x0FB7 }, - unicodeslot=0x0F57, + specials={ "char", 0xF56, 0xFB7 }, + unicodeslot=0xF57, }, - [0x0F58]={ + [0xF58]={ category="lo", description="TIBETAN LETTER MA", direction="l", linebreak="al", - unicodeslot=0x0F58, + unicodeslot=0xF58, }, - [0x0F59]={ + [0xF59]={ category="lo", description="TIBETAN LETTER TSA", direction="l", linebreak="al", - unicodeslot=0x0F59, + unicodeslot=0xF59, }, - [0x0F5A]={ + [0xF5A]={ category="lo", description="TIBETAN LETTER TSHA", direction="l", linebreak="al", - unicodeslot=0x0F5A, + unicodeslot=0xF5A, }, - [0x0F5B]={ + [0xF5B]={ category="lo", description="TIBETAN LETTER DZA", direction="l", linebreak="al", - unicodeslot=0x0F5B, + unicodeslot=0xF5B, }, - [0x0F5C]={ + [0xF5C]={ category="lo", description="TIBETAN LETTER DZHA", direction="l", linebreak="al", - specials={ "char", 0x0F5B, 0x0FB7 }, - unicodeslot=0x0F5C, + specials={ "char", 0xF5B, 0xFB7 }, + unicodeslot=0xF5C, }, - [0x0F5D]={ + [0xF5D]={ category="lo", description="TIBETAN LETTER WA", direction="l", linebreak="al", - unicodeslot=0x0F5D, + unicodeslot=0xF5D, }, - [0x0F5E]={ + [0xF5E]={ category="lo", description="TIBETAN LETTER ZHA", direction="l", linebreak="al", - unicodeslot=0x0F5E, + unicodeslot=0xF5E, }, - [0x0F5F]={ + [0xF5F]={ category="lo", description="TIBETAN LETTER ZA", direction="l", linebreak="al", - unicodeslot=0x0F5F, + unicodeslot=0xF5F, }, - [0x0F60]={ + [0xF60]={ category="lo", description="TIBETAN LETTER -A", direction="l", linebreak="al", - unicodeslot=0x0F60, + unicodeslot=0xF60, }, - [0x0F61]={ + [0xF61]={ category="lo", description="TIBETAN LETTER YA", direction="l", linebreak="al", - unicodeslot=0x0F61, + unicodeslot=0xF61, }, - [0x0F62]={ + [0xF62]={ category="lo", description="TIBETAN LETTER RA", direction="l", linebreak="al", - unicodeslot=0x0F62, + unicodeslot=0xF62, }, - [0x0F63]={ + [0xF63]={ category="lo", description="TIBETAN LETTER LA", direction="l", linebreak="al", - unicodeslot=0x0F63, + unicodeslot=0xF63, }, - [0x0F64]={ + [0xF64]={ category="lo", description="TIBETAN LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x0F64, + unicodeslot=0xF64, }, - [0x0F65]={ + [0xF65]={ category="lo", description="TIBETAN LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x0F65, + unicodeslot=0xF65, }, - [0x0F66]={ + [0xF66]={ category="lo", description="TIBETAN LETTER SA", direction="l", linebreak="al", - unicodeslot=0x0F66, + unicodeslot=0xF66, }, - [0x0F67]={ + [0xF67]={ category="lo", description="TIBETAN LETTER HA", direction="l", linebreak="al", - unicodeslot=0x0F67, + unicodeslot=0xF67, }, - [0x0F68]={ + [0xF68]={ category="lo", description="TIBETAN LETTER A", direction="l", linebreak="al", - unicodeslot=0x0F68, + unicodeslot=0xF68, }, - [0x0F69]={ + [0xF69]={ category="lo", description="TIBETAN LETTER KSSA", direction="l", linebreak="al", - specials={ "char", 0x0F40, 0x0FB5 }, - unicodeslot=0x0F69, + specials={ "char", 0xF40, 0xFB5 }, + unicodeslot=0xF69, }, - [0x0F6A]={ + [0xF6A]={ category="lo", description="TIBETAN LETTER FIXED-FORM RA", direction="l", linebreak="al", - unicodeslot=0x0F6A, + unicodeslot=0xF6A, }, - [0x0F6B]={ + [0xF6B]={ category="lo", description="TIBETAN LETTER KKA", direction="l", linebreak="al", - unicodeslot=0x0F6B, + unicodeslot=0xF6B, }, - [0x0F6C]={ + [0xF6C]={ category="lo", description="TIBETAN LETTER RRA", direction="l", linebreak="al", - unicodeslot=0x0F6C, + unicodeslot=0xF6C, }, - [0x0F71]={ + [0xF71]={ category="mn", + combining=0x81, description="TIBETAN VOWEL SIGN AA", direction="nsm", linebreak="cm", - unicodeslot=0x0F71, + unicodeslot=0xF71, }, - [0x0F72]={ + [0xF72]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN I", direction="nsm", linebreak="cm", - unicodeslot=0x0F72, + unicodeslot=0xF72, }, - [0x0F73]={ + [0xF73]={ category="mn", description="TIBETAN VOWEL SIGN II", direction="nsm", linebreak="cm", - specials={ "char", 0x0F71, 0x0F72 }, - unicodeslot=0x0F73, + specials={ "char", 0xF71, 0xF72 }, + unicodeslot=0xF73, }, - [0x0F74]={ + [0xF74]={ category="mn", + combining=0x84, description="TIBETAN VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x0F74, + unicodeslot=0xF74, }, - [0x0F75]={ + [0xF75]={ category="mn", description="TIBETAN VOWEL SIGN UU", direction="nsm", linebreak="cm", - specials={ "char", 0x0F71, 0x0F74 }, - unicodeslot=0x0F75, + specials={ "char", 0xF71, 0xF74 }, + unicodeslot=0xF75, }, - [0x0F76]={ + [0xF76]={ category="mn", description="TIBETAN VOWEL SIGN VOCALIC R", direction="nsm", linebreak="cm", - specials={ "char", 0x0FB2, 0x0F80 }, - unicodeslot=0x0F76, + specials={ "char", 0xFB2, 0xF80 }, + unicodeslot=0xF76, }, - [0x0F77]={ + [0xF77]={ category="mn", description="TIBETAN VOWEL SIGN VOCALIC RR", direction="nsm", linebreak="cm", - specials={ "compat", 0x0FB2, 0x0F81 }, - unicodeslot=0x0F77, + specials={ "compat", 0xFB2, 0xF81 }, + unicodeslot=0xF77, }, - [0x0F78]={ + [0xF78]={ category="mn", description="TIBETAN VOWEL SIGN VOCALIC L", direction="nsm", linebreak="cm", - specials={ "char", 0x0FB3, 0x0F80 }, - unicodeslot=0x0F78, + specials={ "char", 0xFB3, 0xF80 }, + unicodeslot=0xF78, }, - [0x0F79]={ + [0xF79]={ category="mn", description="TIBETAN VOWEL SIGN VOCALIC LL", direction="nsm", linebreak="cm", - specials={ "compat", 0x0FB3, 0x0F81 }, - unicodeslot=0x0F79, + specials={ "compat", 0xFB3, 0xF81 }, + unicodeslot=0xF79, }, - [0x0F7A]={ + [0xF7A]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x0F7A, + unicodeslot=0xF7A, }, - [0x0F7B]={ + [0xF7B]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN EE", direction="nsm", linebreak="cm", - unicodeslot=0x0F7B, + unicodeslot=0xF7B, }, - [0x0F7C]={ + [0xF7C]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN O", direction="nsm", linebreak="cm", - unicodeslot=0x0F7C, + unicodeslot=0xF7C, }, - [0x0F7D]={ + [0xF7D]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN OO", direction="nsm", linebreak="cm", - unicodeslot=0x0F7D, + unicodeslot=0xF7D, }, - [0x0F7E]={ + [0xF7E]={ category="mn", description="TIBETAN SIGN RJES SU NGA RO", direction="nsm", linebreak="cm", - unicodeslot=0x0F7E, + unicodeslot=0xF7E, }, - [0x0F7F]={ + [0xF7F]={ category="mc", description="TIBETAN SIGN RNAM BCAD", direction="l", linebreak="ba", - unicodeslot=0x0F7F, + unicodeslot=0xF7F, }, - [0x0F80]={ + [0xF80]={ category="mn", + combining=0x82, description="TIBETAN VOWEL SIGN REVERSED I", direction="nsm", linebreak="cm", - unicodeslot=0x0F80, + unicodeslot=0xF80, }, - [0x0F81]={ + [0xF81]={ category="mn", description="TIBETAN VOWEL SIGN REVERSED II", direction="nsm", linebreak="cm", - specials={ "char", 0x0F71, 0x0F80 }, - unicodeslot=0x0F81, + specials={ "char", 0xF71, 0xF80 }, + unicodeslot=0xF81, }, - [0x0F82]={ + [0xF82]={ category="mn", + combining=0xE6, description="TIBETAN SIGN NYI ZLA NAA DA", direction="nsm", linebreak="cm", - unicodeslot=0x0F82, + unicodeslot=0xF82, }, - [0x0F83]={ + [0xF83]={ category="mn", + combining=0xE6, description="TIBETAN SIGN SNA LDAN", direction="nsm", linebreak="cm", - unicodeslot=0x0F83, + unicodeslot=0xF83, }, - [0x0F84]={ + [0xF84]={ category="mn", + combining=0x9, description="TIBETAN MARK HALANTA", direction="nsm", linebreak="cm", - unicodeslot=0x0F84, + unicodeslot=0xF84, }, - [0x0F85]={ + [0xF85]={ category="po", description="TIBETAN MARK PALUTA", direction="l", linebreak="ba", - unicodeslot=0x0F85, + unicodeslot=0xF85, }, - [0x0F86]={ + [0xF86]={ category="mn", + combining=0xE6, description="TIBETAN SIGN LCI RTAGS", direction="nsm", linebreak="cm", - unicodeslot=0x0F86, + unicodeslot=0xF86, }, - [0x0F87]={ + [0xF87]={ category="mn", + combining=0xE6, description="TIBETAN SIGN YANG RTAGS", direction="nsm", linebreak="cm", - unicodeslot=0x0F87, + unicodeslot=0xF87, }, - [0x0F88]={ + [0xF88]={ category="lo", description="TIBETAN SIGN LCE TSA CAN", direction="l", linebreak="al", - unicodeslot=0x0F88, + unicodeslot=0xF88, }, - [0x0F89]={ + [0xF89]={ category="lo", description="TIBETAN SIGN MCHU CAN", direction="l", linebreak="al", - unicodeslot=0x0F89, + unicodeslot=0xF89, }, - [0x0F8A]={ + [0xF8A]={ category="lo", description="TIBETAN SIGN GRU CAN RGYINGS", direction="l", linebreak="al", - unicodeslot=0x0F8A, + unicodeslot=0xF8A, }, - [0x0F8B]={ + [0xF8B]={ category="lo", description="TIBETAN SIGN GRU MED RGYINGS", direction="l", linebreak="al", - unicodeslot=0x0F8B, + unicodeslot=0xF8B, }, - [0x0F8C]={ + [0xF8C]={ category="lo", description="TIBETAN SIGN INVERTED MCHU CAN", direction="l", linebreak="al", - unicodeslot=0x0F8C, + unicodeslot=0xF8C, }, - [0x0F8D]={ + [0xF8D]={ category="mn", description="TIBETAN SUBJOINED SIGN LCE TSA CAN", direction="nsm", linebreak="cm", - unicodeslot=0x0F8D, + unicodeslot=0xF8D, }, - [0x0F8E]={ + [0xF8E]={ category="mn", description="TIBETAN SUBJOINED SIGN MCHU CAN", direction="nsm", linebreak="cm", - unicodeslot=0x0F8E, + unicodeslot=0xF8E, }, - [0x0F8F]={ + [0xF8F]={ category="mn", description="TIBETAN SUBJOINED SIGN INVERTED MCHU CAN", direction="nsm", linebreak="cm", - unicodeslot=0x0F8F, + unicodeslot=0xF8F, }, - [0x0F90]={ + [0xF90]={ category="mn", description="TIBETAN SUBJOINED LETTER KA", direction="nsm", linebreak="cm", - unicodeslot=0x0F90, + unicodeslot=0xF90, }, - [0x0F91]={ + [0xF91]={ category="mn", description="TIBETAN SUBJOINED LETTER KHA", direction="nsm", linebreak="cm", - unicodeslot=0x0F91, + unicodeslot=0xF91, }, - [0x0F92]={ + [0xF92]={ category="mn", description="TIBETAN SUBJOINED LETTER GA", direction="nsm", linebreak="cm", - unicodeslot=0x0F92, + unicodeslot=0xF92, }, - [0x0F93]={ + [0xF93]={ category="mn", description="TIBETAN SUBJOINED LETTER GHA", direction="nsm", linebreak="cm", - specials={ "char", 0x0F92, 0x0FB7 }, - unicodeslot=0x0F93, + specials={ "char", 0xF92, 0xFB7 }, + unicodeslot=0xF93, }, - [0x0F94]={ + [0xF94]={ category="mn", description="TIBETAN SUBJOINED LETTER NGA", direction="nsm", linebreak="cm", - unicodeslot=0x0F94, + unicodeslot=0xF94, }, - [0x0F95]={ + [0xF95]={ category="mn", description="TIBETAN SUBJOINED LETTER CA", direction="nsm", linebreak="cm", - unicodeslot=0x0F95, + unicodeslot=0xF95, }, - [0x0F96]={ + [0xF96]={ category="mn", description="TIBETAN SUBJOINED LETTER CHA", direction="nsm", linebreak="cm", - unicodeslot=0x0F96, + unicodeslot=0xF96, }, - [0x0F97]={ + [0xF97]={ category="mn", description="TIBETAN SUBJOINED LETTER JA", direction="nsm", linebreak="cm", - unicodeslot=0x0F97, + unicodeslot=0xF97, }, - [0x0F99]={ + [0xF99]={ category="mn", description="TIBETAN SUBJOINED LETTER NYA", direction="nsm", linebreak="cm", - unicodeslot=0x0F99, + unicodeslot=0xF99, }, - [0x0F9A]={ + [0xF9A]={ category="mn", description="TIBETAN SUBJOINED LETTER TTA", direction="nsm", linebreak="cm", - unicodeslot=0x0F9A, + unicodeslot=0xF9A, }, - [0x0F9B]={ + [0xF9B]={ category="mn", description="TIBETAN SUBJOINED LETTER TTHA", direction="nsm", linebreak="cm", - unicodeslot=0x0F9B, + unicodeslot=0xF9B, }, - [0x0F9C]={ + [0xF9C]={ category="mn", description="TIBETAN SUBJOINED LETTER DDA", direction="nsm", linebreak="cm", - unicodeslot=0x0F9C, + unicodeslot=0xF9C, }, - [0x0F9D]={ + [0xF9D]={ category="mn", description="TIBETAN SUBJOINED LETTER DDHA", direction="nsm", linebreak="cm", - specials={ "char", 0x0F9C, 0x0FB7 }, - unicodeslot=0x0F9D, + specials={ "char", 0xF9C, 0xFB7 }, + unicodeslot=0xF9D, }, - [0x0F9E]={ + [0xF9E]={ category="mn", description="TIBETAN SUBJOINED LETTER NNA", direction="nsm", linebreak="cm", - unicodeslot=0x0F9E, + unicodeslot=0xF9E, }, - [0x0F9F]={ + [0xF9F]={ category="mn", description="TIBETAN SUBJOINED LETTER TA", direction="nsm", linebreak="cm", - unicodeslot=0x0F9F, + unicodeslot=0xF9F, }, - [0x0FA0]={ + [0xFA0]={ category="mn", description="TIBETAN SUBJOINED LETTER THA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA0, + unicodeslot=0xFA0, }, - [0x0FA1]={ + [0xFA1]={ category="mn", description="TIBETAN SUBJOINED LETTER DA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA1, + unicodeslot=0xFA1, }, - [0x0FA2]={ + [0xFA2]={ category="mn", description="TIBETAN SUBJOINED LETTER DHA", direction="nsm", linebreak="cm", - specials={ "char", 0x0FA1, 0x0FB7 }, - unicodeslot=0x0FA2, + specials={ "char", 0xFA1, 0xFB7 }, + unicodeslot=0xFA2, }, - [0x0FA3]={ + [0xFA3]={ category="mn", description="TIBETAN SUBJOINED LETTER NA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA3, + unicodeslot=0xFA3, }, - [0x0FA4]={ + [0xFA4]={ category="mn", description="TIBETAN SUBJOINED LETTER PA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA4, + unicodeslot=0xFA4, }, - [0x0FA5]={ + [0xFA5]={ category="mn", description="TIBETAN SUBJOINED LETTER PHA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA5, + unicodeslot=0xFA5, }, - [0x0FA6]={ + [0xFA6]={ category="mn", description="TIBETAN SUBJOINED LETTER BA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA6, + unicodeslot=0xFA6, }, - [0x0FA7]={ + [0xFA7]={ category="mn", description="TIBETAN SUBJOINED LETTER BHA", direction="nsm", linebreak="cm", - specials={ "char", 0x0FA6, 0x0FB7 }, - unicodeslot=0x0FA7, + specials={ "char", 0xFA6, 0xFB7 }, + unicodeslot=0xFA7, }, - [0x0FA8]={ + [0xFA8]={ category="mn", description="TIBETAN SUBJOINED LETTER MA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA8, + unicodeslot=0xFA8, }, - [0x0FA9]={ + [0xFA9]={ category="mn", description="TIBETAN SUBJOINED LETTER TSA", direction="nsm", linebreak="cm", - unicodeslot=0x0FA9, + unicodeslot=0xFA9, }, - [0x0FAA]={ + [0xFAA]={ category="mn", description="TIBETAN SUBJOINED LETTER TSHA", direction="nsm", linebreak="cm", - unicodeslot=0x0FAA, + unicodeslot=0xFAA, }, - [0x0FAB]={ + [0xFAB]={ category="mn", description="TIBETAN SUBJOINED LETTER DZA", direction="nsm", linebreak="cm", - unicodeslot=0x0FAB, + unicodeslot=0xFAB, }, - [0x0FAC]={ + [0xFAC]={ category="mn", description="TIBETAN SUBJOINED LETTER DZHA", direction="nsm", linebreak="cm", - specials={ "char", 0x0FAB, 0x0FB7 }, - unicodeslot=0x0FAC, + specials={ "char", 0xFAB, 0xFB7 }, + unicodeslot=0xFAC, }, - [0x0FAD]={ + [0xFAD]={ category="mn", description="TIBETAN SUBJOINED LETTER WA", direction="nsm", linebreak="cm", - unicodeslot=0x0FAD, + unicodeslot=0xFAD, }, - [0x0FAE]={ + [0xFAE]={ category="mn", description="TIBETAN SUBJOINED LETTER ZHA", direction="nsm", linebreak="cm", - unicodeslot=0x0FAE, + unicodeslot=0xFAE, }, - [0x0FAF]={ + [0xFAF]={ category="mn", description="TIBETAN SUBJOINED LETTER ZA", direction="nsm", linebreak="cm", - unicodeslot=0x0FAF, + unicodeslot=0xFAF, }, - [0x0FB0]={ + [0xFB0]={ category="mn", description="TIBETAN SUBJOINED LETTER -A", direction="nsm", linebreak="cm", - unicodeslot=0x0FB0, + unicodeslot=0xFB0, }, - [0x0FB1]={ + [0xFB1]={ category="mn", description="TIBETAN SUBJOINED LETTER YA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB1, + unicodeslot=0xFB1, }, - [0x0FB2]={ + [0xFB2]={ category="mn", description="TIBETAN SUBJOINED LETTER RA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB2, + unicodeslot=0xFB2, }, - [0x0FB3]={ + [0xFB3]={ category="mn", description="TIBETAN SUBJOINED LETTER LA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB3, + unicodeslot=0xFB3, }, - [0x0FB4]={ + [0xFB4]={ category="mn", description="TIBETAN SUBJOINED LETTER SHA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB4, + unicodeslot=0xFB4, }, - [0x0FB5]={ + [0xFB5]={ category="mn", description="TIBETAN SUBJOINED LETTER SSA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB5, + unicodeslot=0xFB5, }, - [0x0FB6]={ + [0xFB6]={ category="mn", description="TIBETAN SUBJOINED LETTER SA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB6, + unicodeslot=0xFB6, }, - [0x0FB7]={ + [0xFB7]={ category="mn", description="TIBETAN SUBJOINED LETTER HA", direction="nsm", linebreak="cm", - unicodeslot=0x0FB7, + unicodeslot=0xFB7, }, - [0x0FB8]={ + [0xFB8]={ category="mn", description="TIBETAN SUBJOINED LETTER A", direction="nsm", linebreak="cm", - unicodeslot=0x0FB8, + unicodeslot=0xFB8, }, - [0x0FB9]={ + [0xFB9]={ category="mn", description="TIBETAN SUBJOINED LETTER KSSA", direction="nsm", linebreak="cm", - specials={ "char", 0x0F90, 0x0FB5 }, - unicodeslot=0x0FB9, + specials={ "char", 0xF90, 0xFB5 }, + unicodeslot=0xFB9, }, - [0x0FBA]={ + [0xFBA]={ category="mn", description="TIBETAN SUBJOINED LETTER FIXED-FORM WA", direction="nsm", linebreak="cm", - unicodeslot=0x0FBA, + unicodeslot=0xFBA, }, - [0x0FBB]={ + [0xFBB]={ category="mn", description="TIBETAN SUBJOINED LETTER FIXED-FORM YA", direction="nsm", linebreak="cm", - unicodeslot=0x0FBB, + unicodeslot=0xFBB, }, - [0x0FBC]={ + [0xFBC]={ category="mn", description="TIBETAN SUBJOINED LETTER FIXED-FORM RA", direction="nsm", linebreak="cm", - unicodeslot=0x0FBC, + unicodeslot=0xFBC, }, - [0x0FBE]={ + [0xFBE]={ category="so", description="TIBETAN KU RU KHA", direction="l", linebreak="ba", - unicodeslot=0x0FBE, + unicodeslot=0xFBE, }, - [0x0FBF]={ + [0xFBF]={ category="so", description="TIBETAN KU RU KHA BZHI MIG CAN", direction="l", linebreak="ba", - unicodeslot=0x0FBF, + unicodeslot=0xFBF, }, - [0x0FC0]={ + [0xFC0]={ category="so", description="TIBETAN CANTILLATION SIGN HEAVY BEAT", direction="l", linebreak="al", - unicodeslot=0x0FC0, + unicodeslot=0xFC0, }, - [0x0FC1]={ + [0xFC1]={ category="so", description="TIBETAN CANTILLATION SIGN LIGHT BEAT", direction="l", linebreak="al", - unicodeslot=0x0FC1, + unicodeslot=0xFC1, }, - [0x0FC2]={ + [0xFC2]={ category="so", description="TIBETAN CANTILLATION SIGN CANG TE-U", direction="l", linebreak="al", - unicodeslot=0x0FC2, + unicodeslot=0xFC2, }, - [0x0FC3]={ + [0xFC3]={ category="so", description="TIBETAN CANTILLATION SIGN SBUB -CHAL", direction="l", linebreak="al", - unicodeslot=0x0FC3, + unicodeslot=0xFC3, }, - [0x0FC4]={ + [0xFC4]={ category="so", description="TIBETAN SYMBOL DRIL BU", direction="l", linebreak="al", - unicodeslot=0x0FC4, + unicodeslot=0xFC4, }, - [0x0FC5]={ + [0xFC5]={ category="so", description="TIBETAN SYMBOL RDO RJE", direction="l", linebreak="al", - unicodeslot=0x0FC5, + unicodeslot=0xFC5, }, - [0x0FC6]={ + [0xFC6]={ category="mn", + combining=0xDC, description="TIBETAN SYMBOL PADMA GDAN", direction="nsm", linebreak="cm", - unicodeslot=0x0FC6, + unicodeslot=0xFC6, }, - [0x0FC7]={ + [0xFC7]={ category="so", description="TIBETAN SYMBOL RDO RJE RGYA GRAM", direction="l", linebreak="al", - unicodeslot=0x0FC7, + unicodeslot=0xFC7, }, - [0x0FC8]={ + [0xFC8]={ category="so", description="TIBETAN SYMBOL PHUR PA", direction="l", linebreak="al", - unicodeslot=0x0FC8, + unicodeslot=0xFC8, }, - [0x0FC9]={ + [0xFC9]={ category="so", description="TIBETAN SYMBOL NOR BU", direction="l", linebreak="al", - unicodeslot=0x0FC9, + unicodeslot=0xFC9, }, - [0x0FCA]={ + [0xFCA]={ category="so", description="TIBETAN SYMBOL NOR BU NYIS -KHYIL", direction="l", linebreak="al", - unicodeslot=0x0FCA, + unicodeslot=0xFCA, }, - [0x0FCB]={ + [0xFCB]={ category="so", description="TIBETAN SYMBOL NOR BU GSUM -KHYIL", direction="l", linebreak="al", - unicodeslot=0x0FCB, + unicodeslot=0xFCB, }, - [0x0FCC]={ + [0xFCC]={ category="so", description="TIBETAN SYMBOL NOR BU BZHI -KHYIL", direction="l", linebreak="al", - unicodeslot=0x0FCC, + unicodeslot=0xFCC, }, - [0x0FCE]={ + [0xFCE]={ category="so", description="TIBETAN SIGN RDEL NAG RDEL DKAR", direction="l", linebreak="al", - unicodeslot=0x0FCE, + unicodeslot=0xFCE, }, - [0x0FCF]={ + [0xFCF]={ category="so", description="TIBETAN SIGN RDEL NAG GSUM", direction="l", linebreak="al", - unicodeslot=0x0FCF, + unicodeslot=0xFCF, }, - [0x0FD0]={ + [0xFD0]={ category="po", description="TIBETAN MARK BSKA- SHOG GI MGO RGYAN", direction="l", linebreak="bb", - unicodeslot=0x0FD0, + unicodeslot=0xFD0, }, - [0x0FD1]={ + [0xFD1]={ category="po", description="TIBETAN MARK MNYAM YIG GI MGO RGYAN", direction="l", linebreak="bb", - unicodeslot=0x0FD1, + unicodeslot=0xFD1, }, - [0x0FD2]={ + [0xFD2]={ category="po", description="TIBETAN MARK NYIS TSHEG", direction="l", linebreak="ba", - unicodeslot=0x0FD2, + unicodeslot=0xFD2, }, - [0x0FD3]={ + [0xFD3]={ category="po", description="TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA", direction="l", linebreak="bb", - unicodeslot=0x0FD3, + unicodeslot=0xFD3, }, - [0x0FD4]={ + [0xFD4]={ category="po", description="TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA", direction="l", linebreak="al", - unicodeslot=0x0FD4, + unicodeslot=0xFD4, }, - [0x0FD5]={ + [0xFD5]={ category="so", description="RIGHT-FACING SVASTI SIGN", direction="l", linebreak="al", - unicodeslot=0x0FD5, + unicodeslot=0xFD5, }, - [0x0FD6]={ + [0xFD6]={ category="so", description="LEFT-FACING SVASTI SIGN", direction="l", linebreak="al", - unicodeslot=0x0FD6, + unicodeslot=0xFD6, }, - [0x0FD7]={ + [0xFD7]={ category="so", description="RIGHT-FACING SVASTI SIGN WITH DOTS", direction="l", linebreak="al", - unicodeslot=0x0FD7, + unicodeslot=0xFD7, }, - [0x0FD8]={ + [0xFD8]={ category="so", description="LEFT-FACING SVASTI SIGN WITH DOTS", direction="l", linebreak="al", - unicodeslot=0x0FD8, + unicodeslot=0xFD8, }, - [0x0FD9]={ + [0xFD9]={ category="po", description="TIBETAN MARK LEADING MCHAN RTAGS", direction="l", linebreak="gl", - unicodeslot=0x0FD9, + unicodeslot=0xFD9, }, - [0x0FDA]={ + [0xFDA]={ category="po", description="TIBETAN MARK TRAILING MCHAN RTAGS", direction="l", linebreak="gl", - unicodeslot=0x0FDA, + unicodeslot=0xFDA, }, [0x1000]={ category="lo", @@ -29541,6 +30180,7 @@ characters.data={ }, [0x1037]={ category="mn", + combining=0x7, description="MYANMAR SIGN DOT BELOW", direction="nsm", linebreak="sa", @@ -29555,6 +30195,7 @@ characters.data={ }, [0x1039]={ category="mn", + combining=0x9, description="MYANMAR SIGN VIRAMA", direction="nsm", linebreak="sa", @@ -29562,6 +30203,7 @@ characters.data={ }, [0x103A]={ category="mn", + combining=0x9, description="MYANMAR SIGN ASAT", direction="nsm", linebreak="sa", @@ -30143,6 +30785,7 @@ characters.data={ }, [0x108D]={ category="mn", + combining=0xDC, description="MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE", direction="nsm", linebreak="sa", @@ -35101,6 +35744,7 @@ characters.data={ }, [0x135D]={ category="mn", + combining=0xE6, description="ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK", direction="nsm", linebreak="cm", @@ -35108,6 +35752,7 @@ characters.data={ }, [0x135E]={ category="mn", + combining=0xE6, description="ETHIOPIC COMBINING VOWEL LENGTH MARK", direction="nsm", linebreak="cm", @@ -35115,6 +35760,7 @@ characters.data={ }, [0x135F]={ category="mn", + combining=0xE6, description="ETHIOPIC COMBINING GEMINATION MARK", direction="nsm", linebreak="cm", @@ -41352,6 +41998,62 @@ characters.data={ linebreak="al", unicodeslot=0x16F0, }, + [0x16F1]={ + category="lo", + description="RUNIC LETTER K", + direction="l", + linebreak="al", + unicodeslot=0x16F1, + }, + [0x16F2]={ + category="lo", + description="RUNIC LETTER SH", + direction="l", + linebreak="al", + unicodeslot=0x16F2, + }, + [0x16F3]={ + category="lo", + description="RUNIC LETTER OO", + direction="l", + linebreak="al", + unicodeslot=0x16F3, + }, + [0x16F4]={ + category="lo", + description="RUNIC LETTER FRANKS CASKET OS", + direction="l", + linebreak="al", + unicodeslot=0x16F4, + }, + [0x16F5]={ + category="lo", + description="RUNIC LETTER FRANKS CASKET IS", + direction="l", + linebreak="al", + unicodeslot=0x16F5, + }, + [0x16F6]={ + category="lo", + description="RUNIC LETTER FRANKS CASKET EH", + direction="l", + linebreak="al", + unicodeslot=0x16F6, + }, + [0x16F7]={ + category="lo", + description="RUNIC LETTER FRANKS CASKET AC", + direction="l", + linebreak="al", + unicodeslot=0x16F7, + }, + [0x16F8]={ + category="lo", + description="RUNIC LETTER FRANKS CASKET AESC", + direction="l", + linebreak="al", + unicodeslot=0x16F8, + }, [0x1700]={ category="lo", description="TAGALOG LETTER A", @@ -41487,6 +42189,7 @@ characters.data={ }, [0x1714]={ category="mn", + combining=0x9, description="TAGALOG SIGN VIRAMA", direction="nsm", linebreak="cm", @@ -41634,6 +42337,7 @@ characters.data={ }, [0x1734]={ category="mn", + combining=0x9, description="HANUNOO SIGN PAMUDPOD", direction="nsm", linebreak="cm", @@ -42495,6 +43199,7 @@ characters.data={ }, [0x17D2]={ category="mn", + combining=0x9, description="KHMER SIGN COENG", direction="nsm", linebreak="sa", @@ -42572,6 +43277,7 @@ characters.data={ }, [0x17DD]={ category="mn", + combining=0xE6, description="KHMER SIGN ATTHACAN", direction="nsm", linebreak="sa", @@ -42760,6 +43466,7 @@ characters.data={ unicodeslot=0x1805, }, [0x1806]={ + arabic="u", category="pd", description="MONGOLIAN TODO SOFT HYPHEN", direction="on", @@ -42767,6 +43474,7 @@ characters.data={ unicodeslot=0x1806, }, [0x1807]={ + arabic="d", category="po", description="MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER", direction="on", @@ -42788,6 +43496,7 @@ characters.data={ unicodeslot=0x1809, }, [0x180A]={ + arabic="c", category="po", description="MONGOLIAN NIRUGU", direction="on", @@ -42816,9 +43525,10 @@ characters.data={ unicodeslot=0x180D, }, [0x180E]={ + arabic="u", category="zs", description="MONGOLIAN VOWEL SEPARATOR", - direction="ws", + direction="bn", linebreak="gl", unicodeslot=0x180E, }, @@ -42893,6 +43603,7 @@ characters.data={ unicodeslot=0x1819, }, [0x1820]={ + arabic="d", category="lo", description="MONGOLIAN LETTER A", direction="l", @@ -42904,6 +43615,7 @@ characters.data={ }, }, [0x1821]={ + arabic="d", category="lo", description="MONGOLIAN LETTER E", direction="l", @@ -42914,6 +43626,7 @@ characters.data={ }, }, [0x1822]={ + arabic="d", category="lo", description="MONGOLIAN LETTER I", direction="l", @@ -42924,6 +43637,7 @@ characters.data={ }, }, [0x1823]={ + arabic="d", category="lo", description="MONGOLIAN LETTER O", direction="l", @@ -42934,6 +43648,7 @@ characters.data={ }, }, [0x1824]={ + arabic="d", category="lo", description="MONGOLIAN LETTER U", direction="l", @@ -42944,6 +43659,7 @@ characters.data={ }, }, [0x1825]={ + arabic="d", category="lo", description="MONGOLIAN LETTER OE", direction="l", @@ -42955,6 +43671,7 @@ characters.data={ }, }, [0x1826]={ + arabic="d", category="lo", description="MONGOLIAN LETTER UE", direction="l", @@ -42966,6 +43683,7 @@ characters.data={ }, }, [0x1827]={ + arabic="d", category="lo", description="MONGOLIAN LETTER EE", direction="l", @@ -42973,6 +43691,7 @@ characters.data={ unicodeslot=0x1827, }, [0x1828]={ + arabic="d", category="lo", description="MONGOLIAN LETTER NA", direction="l", @@ -42985,6 +43704,7 @@ characters.data={ }, }, [0x1829]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ANG", direction="l", @@ -42992,6 +43712,7 @@ characters.data={ unicodeslot=0x1829, }, [0x182A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER BA", direction="l", @@ -43002,6 +43723,7 @@ characters.data={ }, }, [0x182B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER PA", direction="l", @@ -43009,6 +43731,7 @@ characters.data={ unicodeslot=0x182B, }, [0x182C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER QA", direction="l", @@ -43021,6 +43744,7 @@ characters.data={ }, }, [0x182D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER GA", direction="l", @@ -43033,6 +43757,7 @@ characters.data={ }, }, [0x182E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MA", direction="l", @@ -43040,6 +43765,7 @@ characters.data={ unicodeslot=0x182E, }, [0x182F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER LA", direction="l", @@ -43047,6 +43773,7 @@ characters.data={ unicodeslot=0x182F, }, [0x1830]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SA", direction="l", @@ -43058,6 +43785,7 @@ characters.data={ }, }, [0x1831]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SHA", direction="l", @@ -43065,6 +43793,7 @@ characters.data={ unicodeslot=0x1831, }, [0x1832]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TA", direction="l", @@ -43075,6 +43804,7 @@ characters.data={ }, }, [0x1833]={ + arabic="d", category="lo", description="MONGOLIAN LETTER DA", direction="l", @@ -43085,6 +43815,7 @@ characters.data={ }, }, [0x1834]={ + arabic="d", category="lo", description="MONGOLIAN LETTER CHA", direction="l", @@ -43092,6 +43823,7 @@ characters.data={ unicodeslot=0x1834, }, [0x1835]={ + arabic="d", category="lo", description="MONGOLIAN LETTER JA", direction="l", @@ -43102,6 +43834,7 @@ characters.data={ }, }, [0x1836]={ + arabic="d", category="lo", description="MONGOLIAN LETTER YA", direction="l", @@ -43113,6 +43846,7 @@ characters.data={ }, }, [0x1837]={ + arabic="d", category="lo", description="MONGOLIAN LETTER RA", direction="l", @@ -43120,6 +43854,7 @@ characters.data={ unicodeslot=0x1837, }, [0x1838]={ + arabic="d", category="lo", description="MONGOLIAN LETTER WA", direction="l", @@ -43130,6 +43865,7 @@ characters.data={ }, }, [0x1839]={ + arabic="d", category="lo", description="MONGOLIAN LETTER FA", direction="l", @@ -43137,6 +43873,7 @@ characters.data={ unicodeslot=0x1839, }, [0x183A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER KA", direction="l", @@ -43144,6 +43881,7 @@ characters.data={ unicodeslot=0x183A, }, [0x183B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER KHA", direction="l", @@ -43151,6 +43889,7 @@ characters.data={ unicodeslot=0x183B, }, [0x183C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TSA", direction="l", @@ -43158,6 +43897,7 @@ characters.data={ unicodeslot=0x183C, }, [0x183D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ZA", direction="l", @@ -43165,6 +43905,7 @@ characters.data={ unicodeslot=0x183D, }, [0x183E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER HAA", direction="l", @@ -43172,6 +43913,7 @@ characters.data={ unicodeslot=0x183E, }, [0x183F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ZRA", direction="l", @@ -43179,6 +43921,7 @@ characters.data={ unicodeslot=0x183F, }, [0x1840]={ + arabic="d", category="lo", description="MONGOLIAN LETTER LHA", direction="l", @@ -43186,6 +43929,7 @@ characters.data={ unicodeslot=0x1840, }, [0x1841]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ZHI", direction="l", @@ -43193,6 +43937,7 @@ characters.data={ unicodeslot=0x1841, }, [0x1842]={ + arabic="d", category="lo", description="MONGOLIAN LETTER CHI", direction="l", @@ -43200,6 +43945,7 @@ characters.data={ unicodeslot=0x1842, }, [0x1843]={ + arabic="d", category="lm", description="MONGOLIAN LETTER TODO LONG VOWEL SIGN", direction="l", @@ -43207,6 +43953,7 @@ characters.data={ unicodeslot=0x1843, }, [0x1844]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO E", direction="l", @@ -43217,6 +43964,7 @@ characters.data={ }, }, [0x1845]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO I", direction="l", @@ -43227,6 +43975,7 @@ characters.data={ }, }, [0x1846]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO O", direction="l", @@ -43237,6 +43986,7 @@ characters.data={ }, }, [0x1847]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO U", direction="l", @@ -43248,6 +43998,7 @@ characters.data={ }, }, [0x1848]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO OE", direction="l", @@ -43258,6 +44009,7 @@ characters.data={ }, }, [0x1849]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO UE", direction="l", @@ -43268,6 +44020,7 @@ characters.data={ }, }, [0x184A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO ANG", direction="l", @@ -43275,6 +44028,7 @@ characters.data={ unicodeslot=0x184A, }, [0x184B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO BA", direction="l", @@ -43282,6 +44036,7 @@ characters.data={ unicodeslot=0x184B, }, [0x184C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO PA", direction="l", @@ -43289,6 +44044,7 @@ characters.data={ unicodeslot=0x184C, }, [0x184D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO QA", direction="l", @@ -43299,6 +44055,7 @@ characters.data={ }, }, [0x184E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO GA", direction="l", @@ -43309,6 +44066,7 @@ characters.data={ }, }, [0x184F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO MA", direction="l", @@ -43316,6 +44074,7 @@ characters.data={ unicodeslot=0x184F, }, [0x1850]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO TA", direction="l", @@ -43323,6 +44082,7 @@ characters.data={ unicodeslot=0x1850, }, [0x1851]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO DA", direction="l", @@ -43330,6 +44090,7 @@ characters.data={ unicodeslot=0x1851, }, [0x1852]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO CHA", direction="l", @@ -43337,6 +44098,7 @@ characters.data={ unicodeslot=0x1852, }, [0x1853]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO JA", direction="l", @@ -43344,6 +44106,7 @@ characters.data={ unicodeslot=0x1853, }, [0x1854]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO TSA", direction="l", @@ -43351,6 +44114,7 @@ characters.data={ unicodeslot=0x1854, }, [0x1855]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO YA", direction="l", @@ -43358,6 +44122,7 @@ characters.data={ unicodeslot=0x1855, }, [0x1856]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO WA", direction="l", @@ -43365,6 +44130,7 @@ characters.data={ unicodeslot=0x1856, }, [0x1857]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO KA", direction="l", @@ -43372,6 +44138,7 @@ characters.data={ unicodeslot=0x1857, }, [0x1858]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO GAA", direction="l", @@ -43379,6 +44146,7 @@ characters.data={ unicodeslot=0x1858, }, [0x1859]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO HAA", direction="l", @@ -43386,6 +44154,7 @@ characters.data={ unicodeslot=0x1859, }, [0x185A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO JIA", direction="l", @@ -43393,6 +44162,7 @@ characters.data={ unicodeslot=0x185A, }, [0x185B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO NIA", direction="l", @@ -43400,6 +44170,7 @@ characters.data={ unicodeslot=0x185B, }, [0x185C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO DZA", direction="l", @@ -43407,6 +44178,7 @@ characters.data={ unicodeslot=0x185C, }, [0x185D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE E", direction="l", @@ -43417,6 +44189,7 @@ characters.data={ }, }, [0x185E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE I", direction="l", @@ -43428,6 +44201,7 @@ characters.data={ }, }, [0x185F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE IY", direction="l", @@ -43435,6 +44209,7 @@ characters.data={ unicodeslot=0x185F, }, [0x1860]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE UE", direction="l", @@ -43445,6 +44220,7 @@ characters.data={ }, }, [0x1861]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE U", direction="l", @@ -43452,6 +44228,7 @@ characters.data={ unicodeslot=0x1861, }, [0x1862]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE ANG", direction="l", @@ -43459,6 +44236,7 @@ characters.data={ unicodeslot=0x1862, }, [0x1863]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE KA", direction="l", @@ -43469,6 +44247,7 @@ characters.data={ }, }, [0x1864]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE GA", direction="l", @@ -43476,6 +44255,7 @@ characters.data={ unicodeslot=0x1864, }, [0x1865]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE HA", direction="l", @@ -43483,6 +44263,7 @@ characters.data={ unicodeslot=0x1865, }, [0x1866]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE PA", direction="l", @@ -43490,6 +44271,7 @@ characters.data={ unicodeslot=0x1866, }, [0x1867]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE SHA", direction="l", @@ -43497,6 +44279,7 @@ characters.data={ unicodeslot=0x1867, }, [0x1868]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE TA", direction="l", @@ -43508,6 +44291,7 @@ characters.data={ }, }, [0x1869]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE DA", direction="l", @@ -43518,6 +44302,7 @@ characters.data={ }, }, [0x186A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE JA", direction="l", @@ -43525,6 +44310,7 @@ characters.data={ unicodeslot=0x186A, }, [0x186B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE FA", direction="l", @@ -43532,6 +44318,7 @@ characters.data={ unicodeslot=0x186B, }, [0x186C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE GAA", direction="l", @@ -43539,6 +44326,7 @@ characters.data={ unicodeslot=0x186C, }, [0x186D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE HAA", direction="l", @@ -43546,6 +44334,7 @@ characters.data={ unicodeslot=0x186D, }, [0x186E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE TSA", direction="l", @@ -43553,6 +44342,7 @@ characters.data={ unicodeslot=0x186E, }, [0x186F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE ZA", direction="l", @@ -43563,6 +44353,7 @@ characters.data={ }, }, [0x1870]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE RAA", direction="l", @@ -43570,6 +44361,7 @@ characters.data={ unicodeslot=0x1870, }, [0x1871]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE CHA", direction="l", @@ -43577,6 +44369,7 @@ characters.data={ unicodeslot=0x1871, }, [0x1872]={ + arabic="d", category="lo", description="MONGOLIAN LETTER SIBE ZHA", direction="l", @@ -43584,6 +44377,7 @@ characters.data={ unicodeslot=0x1872, }, [0x1873]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU I", direction="l", @@ -43596,6 +44390,7 @@ characters.data={ }, }, [0x1874]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU KA", direction="l", @@ -43608,6 +44403,7 @@ characters.data={ }, }, [0x1875]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU RA", direction="l", @@ -43615,6 +44411,7 @@ characters.data={ unicodeslot=0x1875, }, [0x1876]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU FA", direction="l", @@ -43625,6 +44422,7 @@ characters.data={ }, }, [0x1877]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ZHA", direction="l", @@ -43632,6 +44430,7 @@ characters.data={ unicodeslot=0x1877, }, [0x1880]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI ANUSVARA ONE", direction="l", @@ -43642,6 +44441,7 @@ characters.data={ }, }, [0x1881]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI VISARGA ONE", direction="l", @@ -43652,6 +44452,7 @@ characters.data={ }, }, [0x1882]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI DAMARU", direction="l", @@ -43659,6 +44460,7 @@ characters.data={ unicodeslot=0x1882, }, [0x1883]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI UBADAMA", direction="l", @@ -43666,6 +44468,7 @@ characters.data={ unicodeslot=0x1883, }, [0x1884]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI INVERTED UBADAMA", direction="l", @@ -43673,6 +44476,7 @@ characters.data={ unicodeslot=0x1884, }, [0x1885]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI BALUDA", direction="l", @@ -43680,6 +44484,7 @@ characters.data={ unicodeslot=0x1885, }, [0x1886]={ + arabic="u", category="lo", description="MONGOLIAN LETTER ALI GALI THREE BALUDA", direction="l", @@ -43687,6 +44492,7 @@ characters.data={ unicodeslot=0x1886, }, [0x1887]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI A", direction="l", @@ -43699,6 +44505,7 @@ characters.data={ }, }, [0x1888]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI I", direction="l", @@ -43709,6 +44516,7 @@ characters.data={ }, }, [0x1889]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI KA", direction="l", @@ -43716,6 +44524,7 @@ characters.data={ unicodeslot=0x1889, }, [0x188A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI NGA", direction="l", @@ -43726,6 +44535,7 @@ characters.data={ }, }, [0x188B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI CA", direction="l", @@ -43733,6 +44543,7 @@ characters.data={ unicodeslot=0x188B, }, [0x188C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI TTA", direction="l", @@ -43740,6 +44551,7 @@ characters.data={ unicodeslot=0x188C, }, [0x188D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI TTHA", direction="l", @@ -43747,6 +44559,7 @@ characters.data={ unicodeslot=0x188D, }, [0x188E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI DDA", direction="l", @@ -43754,6 +44567,7 @@ characters.data={ unicodeslot=0x188E, }, [0x188F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI NNA", direction="l", @@ -43761,6 +44575,7 @@ characters.data={ unicodeslot=0x188F, }, [0x1890]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI TA", direction="l", @@ -43768,6 +44583,7 @@ characters.data={ unicodeslot=0x1890, }, [0x1891]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI DA", direction="l", @@ -43775,6 +44591,7 @@ characters.data={ unicodeslot=0x1891, }, [0x1892]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI PA", direction="l", @@ -43782,6 +44599,7 @@ characters.data={ unicodeslot=0x1892, }, [0x1893]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI PHA", direction="l", @@ -43789,6 +44607,7 @@ characters.data={ unicodeslot=0x1893, }, [0x1894]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI SSA", direction="l", @@ -43796,6 +44615,7 @@ characters.data={ unicodeslot=0x1894, }, [0x1895]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI ZHA", direction="l", @@ -43803,6 +44623,7 @@ characters.data={ unicodeslot=0x1895, }, [0x1896]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI ZA", direction="l", @@ -43810,6 +44631,7 @@ characters.data={ unicodeslot=0x1896, }, [0x1897]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI AH", direction="l", @@ -43817,6 +44639,7 @@ characters.data={ unicodeslot=0x1897, }, [0x1898]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO ALI GALI TA", direction="l", @@ -43824,6 +44647,7 @@ characters.data={ unicodeslot=0x1898, }, [0x1899]={ + arabic="d", category="lo", description="MONGOLIAN LETTER TODO ALI GALI ZHA", direction="l", @@ -43831,6 +44655,7 @@ characters.data={ unicodeslot=0x1899, }, [0x189A]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI GHA", direction="l", @@ -43838,6 +44663,7 @@ characters.data={ unicodeslot=0x189A, }, [0x189B]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI NGA", direction="l", @@ -43845,6 +44671,7 @@ characters.data={ unicodeslot=0x189B, }, [0x189C]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI CA", direction="l", @@ -43852,6 +44679,7 @@ characters.data={ unicodeslot=0x189C, }, [0x189D]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI JHA", direction="l", @@ -43859,6 +44687,7 @@ characters.data={ unicodeslot=0x189D, }, [0x189E]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI TTA", direction="l", @@ -43866,6 +44695,7 @@ characters.data={ unicodeslot=0x189E, }, [0x189F]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI DDHA", direction="l", @@ -43873,6 +44703,7 @@ characters.data={ unicodeslot=0x189F, }, [0x18A0]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI TA", direction="l", @@ -43880,6 +44711,7 @@ characters.data={ unicodeslot=0x18A0, }, [0x18A1]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI DHA", direction="l", @@ -43887,6 +44719,7 @@ characters.data={ unicodeslot=0x18A1, }, [0x18A2]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI SSA", direction="l", @@ -43894,6 +44727,7 @@ characters.data={ unicodeslot=0x18A2, }, [0x18A3]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI CYA", direction="l", @@ -43901,6 +44735,7 @@ characters.data={ unicodeslot=0x18A3, }, [0x18A4]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI ZHA", direction="l", @@ -43908,6 +44743,7 @@ characters.data={ unicodeslot=0x18A4, }, [0x18A5]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI ZA", direction="l", @@ -43915,6 +44751,7 @@ characters.data={ unicodeslot=0x18A5, }, [0x18A6]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI HALF U", direction="l", @@ -43922,6 +44759,7 @@ characters.data={ unicodeslot=0x18A6, }, [0x18A7]={ + arabic="d", category="lo", description="MONGOLIAN LETTER ALI GALI HALF YA", direction="l", @@ -43929,6 +44767,7 @@ characters.data={ unicodeslot=0x18A7, }, [0x18A8]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI BHA", direction="l", @@ -43937,12 +44776,14 @@ characters.data={ }, [0x18A9]={ category="mn", + combining=0xE4, description="MONGOLIAN LETTER ALI GALI DAGALGA", direction="nsm", linebreak="cm", unicodeslot=0x18A9, }, [0x18AA]={ + arabic="d", category="lo", description="MONGOLIAN LETTER MANCHU ALI GALI LHA", direction="l", @@ -44642,6 +45483,20 @@ characters.data={ linebreak="al", unicodeslot=0x191C, }, + [0x191D]={ + category="lo", + description="LIMBU LETTER GYAN", + direction="l", + linebreak="al", + unicodeslot=0x191D, + }, + [0x191E]={ + category="lo", + description="LIMBU LETTER TRA", + direction="l", + linebreak="al", + unicodeslot=0x191E, + }, [0x1920]={ category="mn", description="LIMBU VOWEL SIGN A", @@ -44791,6 +45646,7 @@ characters.data={ }, [0x1939]={ category="mn", + combining=0xDE, description="LIMBU SIGN MUKPHRENG", direction="nsm", linebreak="cm", @@ -44798,6 +45654,7 @@ characters.data={ }, [0x193A]={ category="mn", + combining=0xE6, description="LIMBU SIGN KEMPHRENG", direction="nsm", linebreak="cm", @@ -44805,6 +45662,7 @@ characters.data={ }, [0x193B]={ category="mn", + combining=0xDC, description="LIMBU SIGN SA-I", direction="nsm", linebreak="cm", @@ -46114,6 +46972,7 @@ characters.data={ }, [0x1A17]={ category="mn", + combining=0xE6, description="BUGINESE VOWEL SIGN I", direction="nsm", linebreak="cm", @@ -46121,6 +46980,7 @@ characters.data={ }, [0x1A18]={ category="mn", + combining=0xDC, description="BUGINESE VOWEL SIGN U", direction="nsm", linebreak="cm", @@ -46143,7 +47003,7 @@ characters.data={ [0x1A1B]={ category="mc", description="BUGINESE VOWEL SIGN AE", - direction="l", + direction="nsm", linebreak="cm", unicodeslot=0x1A1B, }, @@ -46604,6 +47464,7 @@ characters.data={ }, [0x1A60]={ category="mn", + combining=0x9, description="TAI THAM SIGN SAKOT", direction="nsm", linebreak="sa", @@ -46751,6 +47612,7 @@ characters.data={ }, [0x1A75]={ category="mn", + combining=0xE6, description="TAI THAM SIGN TONE-1", direction="nsm", linebreak="sa", @@ -46758,6 +47620,7 @@ characters.data={ }, [0x1A76]={ category="mn", + combining=0xE6, description="TAI THAM SIGN TONE-2", direction="nsm", linebreak="sa", @@ -46765,6 +47628,7 @@ characters.data={ }, [0x1A77]={ category="mn", + combining=0xE6, description="TAI THAM SIGN KHUEN TONE-3", direction="nsm", linebreak="sa", @@ -46772,6 +47636,7 @@ characters.data={ }, [0x1A78]={ category="mn", + combining=0xE6, description="TAI THAM SIGN KHUEN TONE-4", direction="nsm", linebreak="sa", @@ -46779,6 +47644,7 @@ characters.data={ }, [0x1A79]={ category="mn", + combining=0xE6, description="TAI THAM SIGN KHUEN TONE-5", direction="nsm", linebreak="sa", @@ -46786,6 +47652,7 @@ characters.data={ }, [0x1A7A]={ category="mn", + combining=0xE6, description="TAI THAM SIGN RA HAAM", direction="nsm", linebreak="sa", @@ -46793,6 +47660,7 @@ characters.data={ }, [0x1A7B]={ category="mn", + combining=0xE6, description="TAI THAM SIGN MAI SAM", direction="nsm", linebreak="sa", @@ -46800,6 +47668,7 @@ characters.data={ }, [0x1A7C]={ category="mn", + combining=0xE6, description="TAI THAM SIGN KHUEN-LUE KARAN", direction="nsm", linebreak="sa", @@ -46807,6 +47676,7 @@ characters.data={ }, [0x1A7F]={ category="mn", + combining=0xDC, description="TAI THAM COMBINING CRYPTOGRAMMIC DOT", direction="nsm", linebreak="cm", @@ -47050,6 +47920,125 @@ characters.data={ linebreak="sa", unicodeslot=0x1AAD, }, + [0x1AB0]={ + category="mn", + combining=0xE6, + description="COMBINING DOUBLED CIRCUMFLEX ACCENT", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB0, + }, + [0x1AB1]={ + category="mn", + combining=0xE6, + description="COMBINING DIAERESIS-RING", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB1, + }, + [0x1AB2]={ + category="mn", + combining=0xE6, + description="COMBINING INFINITY", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB2, + }, + [0x1AB3]={ + category="mn", + combining=0xE6, + description="COMBINING DOWNWARDS ARROW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB3, + }, + [0x1AB4]={ + category="mn", + combining=0xE6, + description="COMBINING TRIPLE DOT", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB4, + }, + [0x1AB5]={ + category="mn", + combining=0xDC, + description="COMBINING X-X BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB5, + }, + [0x1AB6]={ + category="mn", + combining=0xDC, + description="COMBINING WIGGLY LINE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB6, + }, + [0x1AB7]={ + category="mn", + combining=0xDC, + description="COMBINING OPEN MARK BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB7, + }, + [0x1AB8]={ + category="mn", + combining=0xDC, + description="COMBINING DOUBLE OPEN MARK BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB8, + }, + [0x1AB9]={ + category="mn", + combining=0xDC, + description="COMBINING LIGHT CENTRALIZATION STROKE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1AB9, + }, + [0x1ABA]={ + category="mn", + combining=0xDC, + description="COMBINING STRONG CENTRALIZATION STROKE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1ABA, + }, + [0x1ABB]={ + category="mn", + combining=0xE6, + description="COMBINING PARENTHESES ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1ABB, + }, + [0x1ABC]={ + category="mn", + combining=0xE6, + description="COMBINING DOUBLE PARENTHESES ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1ABC, + }, + [0x1ABD]={ + category="mn", + combining=0xDC, + description="COMBINING PARENTHESES BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1ABD, + }, + [0x1ABE]={ + category="me", + description="COMBINING PARENTHESES OVERLAY", + direction="nsm", + linebreak="cm", + unicodeslot=0x1ABE, + }, [0x1B00]={ category="mn", description="BALINESE SIGN ULU RICEM", @@ -47422,6 +48411,7 @@ characters.data={ }, [0x1B34]={ category="mn", + combining=0x7, description="BALINESE SIGN REREKAN", direction="nsm", linebreak="cm", @@ -47539,6 +48529,7 @@ characters.data={ }, [0x1B44]={ category="mc", + combining=0x9, description="BALINESE ADEG ADEG", direction="l", linebreak="cm", @@ -47784,6 +48775,7 @@ characters.data={ }, [0x1B6B]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING TEGEH", direction="nsm", linebreak="cm", @@ -47791,6 +48783,7 @@ characters.data={ }, [0x1B6C]={ category="mn", + combining=0xDC, description="BALINESE MUSICAL SYMBOL COMBINING ENDEP", direction="nsm", linebreak="cm", @@ -47798,6 +48791,7 @@ characters.data={ }, [0x1B6D]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL", direction="nsm", linebreak="cm", @@ -47805,6 +48799,7 @@ characters.data={ }, [0x1B6E]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI", direction="nsm", linebreak="cm", @@ -47812,6 +48807,7 @@ characters.data={ }, [0x1B6F]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING JEGOGAN", direction="nsm", linebreak="cm", @@ -47819,6 +48815,7 @@ characters.data={ }, [0x1B70]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN", direction="nsm", linebreak="cm", @@ -47826,6 +48823,7 @@ characters.data={ }, [0x1B71]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN", direction="nsm", linebreak="cm", @@ -47833,6 +48831,7 @@ characters.data={ }, [0x1B72]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING BENDE", direction="nsm", linebreak="cm", @@ -47840,6 +48839,7 @@ characters.data={ }, [0x1B73]={ category="mn", + combining=0xE6, description="BALINESE MUSICAL SYMBOL COMBINING GONG", direction="nsm", linebreak="cm", @@ -48204,6 +49204,7 @@ characters.data={ }, [0x1BAA]={ category="mc", + combining=0x9, description="SUNDANESE SIGN PAMAAEH", direction="l", linebreak="cm", @@ -48211,6 +49212,7 @@ characters.data={ }, [0x1BAB]={ category="mn", + combining=0x9, description="SUNDANESE SIGN VIRAMA", direction="nsm", linebreak="cm", @@ -48219,14 +49221,14 @@ characters.data={ [0x1BAC]={ category="mc", description="SUNDANESE CONSONANT SIGN PASANGAN MA", - direction="l", + direction="nsm", linebreak="cm", unicodeslot=0x1BAC, }, [0x1BAD]={ category="mc", description="SUNDANESE CONSONANT SIGN PASANGAN WA", - direction="l", + direction="nsm", linebreak="cm", unicodeslot=0x1BAD, }, @@ -48624,6 +49626,7 @@ characters.data={ }, [0x1BE6]={ category="mn", + combining=0x7, description="BATAK SIGN TOMPI", direction="nsm", linebreak="cm", @@ -48708,6 +49711,7 @@ characters.data={ }, [0x1BF2]={ category="mc", + combining=0x9, description="BATAK PANGOLAT", direction="l", linebreak="cm", @@ -48715,6 +49719,7 @@ characters.data={ }, [0x1BF3]={ category="mc", + combining=0x9, description="BATAK PANONGONAN", direction="l", linebreak="cm", @@ -49135,6 +50140,7 @@ characters.data={ }, [0x1C37]={ category="mn", + combining=0x7, description="LEPCHA SIGN NUKTA", direction="nsm", linebreak="cm", @@ -49660,6 +50666,7 @@ characters.data={ }, [0x1CD0]={ category="mn", + combining=0xE6, description="VEDIC TONE KARSHANA", direction="nsm", linebreak="cm", @@ -49667,6 +50674,7 @@ characters.data={ }, [0x1CD1]={ category="mn", + combining=0xE6, description="VEDIC TONE SHARA", direction="nsm", linebreak="cm", @@ -49674,6 +50682,7 @@ characters.data={ }, [0x1CD2]={ category="mn", + combining=0xE6, description="VEDIC TONE PRENKHA", direction="nsm", linebreak="cm", @@ -49688,6 +50697,7 @@ characters.data={ }, [0x1CD4]={ category="mn", + combining=0x1, description="VEDIC SIGN YAJURVEDIC MIDLINE SVARITA", direction="nsm", linebreak="cm", @@ -49695,6 +50705,7 @@ characters.data={ }, [0x1CD5]={ category="mn", + combining=0xDC, description="VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA", direction="nsm", linebreak="cm", @@ -49702,6 +50713,7 @@ characters.data={ }, [0x1CD6]={ category="mn", + combining=0xDC, description="VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA", direction="nsm", linebreak="cm", @@ -49709,6 +50721,7 @@ characters.data={ }, [0x1CD7]={ category="mn", + combining=0xDC, description="VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA", direction="nsm", linebreak="cm", @@ -49716,6 +50729,7 @@ characters.data={ }, [0x1CD8]={ category="mn", + combining=0xDC, description="VEDIC TONE CANDRA BELOW", direction="nsm", linebreak="cm", @@ -49723,6 +50737,7 @@ characters.data={ }, [0x1CD9]={ category="mn", + combining=0xDC, description="VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER", direction="nsm", linebreak="cm", @@ -49730,6 +50745,7 @@ characters.data={ }, [0x1CDA]={ category="mn", + combining=0xE6, description="VEDIC TONE DOUBLE SVARITA", direction="nsm", linebreak="cm", @@ -49737,6 +50753,7 @@ characters.data={ }, [0x1CDB]={ category="mn", + combining=0xE6, description="VEDIC TONE TRIPLE SVARITA", direction="nsm", linebreak="cm", @@ -49744,6 +50761,7 @@ characters.data={ }, [0x1CDC]={ category="mn", + combining=0xDC, description="VEDIC TONE KATHAKA ANUDATTA", direction="nsm", linebreak="cm", @@ -49751,6 +50769,7 @@ characters.data={ }, [0x1CDD]={ category="mn", + combining=0xDC, description="VEDIC TONE DOT BELOW", direction="nsm", linebreak="cm", @@ -49758,6 +50777,7 @@ characters.data={ }, [0x1CDE]={ category="mn", + combining=0xDC, description="VEDIC TONE TWO DOTS BELOW", direction="nsm", linebreak="cm", @@ -49765,6 +50785,7 @@ characters.data={ }, [0x1CDF]={ category="mn", + combining=0xDC, description="VEDIC TONE THREE DOTS BELOW", direction="nsm", linebreak="cm", @@ -49772,6 +50793,7 @@ characters.data={ }, [0x1CE0]={ category="mn", + combining=0xE6, description="VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA", direction="nsm", linebreak="cm", @@ -49786,6 +50808,7 @@ characters.data={ }, [0x1CE2]={ category="mn", + combining=0x1, description="VEDIC SIGN VISARGA SVARITA", direction="nsm", linebreak="cm", @@ -49793,6 +50816,7 @@ characters.data={ }, [0x1CE3]={ category="mn", + combining=0x1, description="VEDIC SIGN VISARGA UDATTA", direction="nsm", linebreak="cm", @@ -49800,6 +50824,7 @@ characters.data={ }, [0x1CE4]={ category="mn", + combining=0x1, description="VEDIC SIGN REVERSED VISARGA UDATTA", direction="nsm", linebreak="cm", @@ -49807,6 +50832,7 @@ characters.data={ }, [0x1CE5]={ category="mn", + combining=0x1, description="VEDIC SIGN VISARGA ANUDATTA", direction="nsm", linebreak="cm", @@ -49814,6 +50840,7 @@ characters.data={ }, [0x1CE6]={ category="mn", + combining=0x1, description="VEDIC SIGN REVERSED VISARGA ANUDATTA", direction="nsm", linebreak="cm", @@ -49821,6 +50848,7 @@ characters.data={ }, [0x1CE7]={ category="mn", + combining=0x1, description="VEDIC SIGN VISARGA UDATTA WITH TAIL", direction="nsm", linebreak="cm", @@ -49828,6 +50856,7 @@ characters.data={ }, [0x1CE8]={ category="mn", + combining=0x1, description="VEDIC SIGN VISARGA ANUDATTA WITH TAIL", direction="nsm", linebreak="cm", @@ -49863,6 +50892,7 @@ characters.data={ }, [0x1CED]={ category="mn", + combining=0xDC, description="VEDIC SIGN TIRYAK", direction="nsm", linebreak="cm", @@ -49912,6 +50942,7 @@ characters.data={ }, [0x1CF4]={ category="mn", + combining=0xE6, description="VEDIC TONE CANDRA ABOVE", direction="nsm", linebreak="cm", @@ -49931,6 +50962,22 @@ characters.data={ linebreak="al", unicodeslot=0x1CF6, }, + [0x1CF8]={ + category="mn", + combining=0xE6, + description="VEDIC TONE RING ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1CF8, + }, + [0x1CF9]={ + category="mn", + combining=0xE6, + description="VEDIC TONE DOUBLE RING ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1CF9, + }, [0x1D00]={ category="ll", description="LATIN LETTER SMALL CAPITAL A", @@ -50244,7 +51291,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL A", direction="l", linebreak="al", - specials={ "super", 0x0041 }, + specials={ "super", 0x41 }, unicodeslot=0x1D2C, }, [0x1D2D]={ @@ -50252,7 +51299,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL AE", direction="l", linebreak="al", - specials={ "super", 0x00C6 }, + specials={ "super", 0xC6 }, unicodeslot=0x1D2D, }, [0x1D2E]={ @@ -50260,7 +51307,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL B", direction="l", linebreak="al", - specials={ "super", 0x0042 }, + specials={ "super", 0x42 }, unicodeslot=0x1D2E, }, [0x1D2F]={ @@ -50275,7 +51322,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL D", direction="l", linebreak="al", - specials={ "super", 0x0044 }, + specials={ "super", 0x44 }, unicodeslot=0x1D30, }, [0x1D31]={ @@ -50283,7 +51330,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL E", direction="l", linebreak="al", - specials={ "super", 0x0045 }, + specials={ "super", 0x45 }, unicodeslot=0x1D31, }, [0x1D32]={ @@ -50291,7 +51338,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL REVERSED E", direction="l", linebreak="al", - specials={ "super", 0x018E }, + specials={ "super", 0x18E }, unicodeslot=0x1D32, }, [0x1D33]={ @@ -50299,7 +51346,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL G", direction="l", linebreak="al", - specials={ "super", 0x0047 }, + specials={ "super", 0x47 }, unicodeslot=0x1D33, }, [0x1D34]={ @@ -50307,7 +51354,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL H", direction="l", linebreak="al", - specials={ "super", 0x0048 }, + specials={ "super", 0x48 }, unicodeslot=0x1D34, }, [0x1D35]={ @@ -50315,7 +51362,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL I", direction="l", linebreak="al", - specials={ "super", 0x0049 }, + specials={ "super", 0x49 }, unicodeslot=0x1D35, }, [0x1D36]={ @@ -50323,7 +51370,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL J", direction="l", linebreak="al", - specials={ "super", 0x004A }, + specials={ "super", 0x4A }, unicodeslot=0x1D36, }, [0x1D37]={ @@ -50331,7 +51378,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL K", direction="l", linebreak="al", - specials={ "super", 0x004B }, + specials={ "super", 0x4B }, unicodeslot=0x1D37, }, [0x1D38]={ @@ -50339,7 +51386,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL L", direction="l", linebreak="al", - specials={ "super", 0x004C }, + specials={ "super", 0x4C }, unicodeslot=0x1D38, }, [0x1D39]={ @@ -50347,7 +51394,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL M", direction="l", linebreak="al", - specials={ "super", 0x004D }, + specials={ "super", 0x4D }, unicodeslot=0x1D39, }, [0x1D3A]={ @@ -50355,7 +51402,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL N", direction="l", linebreak="al", - specials={ "super", 0x004E }, + specials={ "super", 0x4E }, unicodeslot=0x1D3A, }, [0x1D3B]={ @@ -50370,7 +51417,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL O", direction="l", linebreak="al", - specials={ "super", 0x004F }, + specials={ "super", 0x4F }, unicodeslot=0x1D3C, }, [0x1D3D]={ @@ -50378,7 +51425,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL OU", direction="l", linebreak="al", - specials={ "super", 0x0222 }, + specials={ "super", 0x222 }, unicodeslot=0x1D3D, }, [0x1D3E]={ @@ -50386,7 +51433,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL P", direction="l", linebreak="al", - specials={ "super", 0x0050 }, + specials={ "super", 0x50 }, unicodeslot=0x1D3E, }, [0x1D3F]={ @@ -50394,7 +51441,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL R", direction="l", linebreak="al", - specials={ "super", 0x0052 }, + specials={ "super", 0x52 }, unicodeslot=0x1D3F, }, [0x1D40]={ @@ -50402,7 +51449,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL T", direction="l", linebreak="al", - specials={ "super", 0x0054 }, + specials={ "super", 0x54 }, unicodeslot=0x1D40, }, [0x1D41]={ @@ -50410,7 +51457,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL U", direction="l", linebreak="al", - specials={ "super", 0x0055 }, + specials={ "super", 0x55 }, unicodeslot=0x1D41, }, [0x1D42]={ @@ -50418,7 +51465,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL W", direction="l", linebreak="al", - specials={ "super", 0x0057 }, + specials={ "super", 0x57 }, unicodeslot=0x1D42, }, [0x1D43]={ @@ -50426,7 +51473,7 @@ characters.data={ description="MODIFIER LETTER SMALL A", direction="l", linebreak="al", - specials={ "super", 0x0061 }, + specials={ "super", 0x61 }, unicodeslot=0x1D43, }, [0x1D44]={ @@ -50434,7 +51481,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED A", direction="l", linebreak="al", - specials={ "super", 0x0250 }, + specials={ "super", 0x250 }, unicodeslot=0x1D44, }, [0x1D45]={ @@ -50442,7 +51489,7 @@ characters.data={ description="MODIFIER LETTER SMALL ALPHA", direction="l", linebreak="al", - specials={ "super", 0x0251 }, + specials={ "super", 0x251 }, unicodeslot=0x1D45, }, [0x1D46]={ @@ -50458,7 +51505,7 @@ characters.data={ description="MODIFIER LETTER SMALL B", direction="l", linebreak="al", - specials={ "super", 0x0062 }, + specials={ "super", 0x62 }, unicodeslot=0x1D47, }, [0x1D48]={ @@ -50466,7 +51513,7 @@ characters.data={ description="MODIFIER LETTER SMALL D", direction="l", linebreak="al", - specials={ "super", 0x0064 }, + specials={ "super", 0x64 }, unicodeslot=0x1D48, }, [0x1D49]={ @@ -50474,7 +51521,7 @@ characters.data={ description="MODIFIER LETTER SMALL E", direction="l", linebreak="al", - specials={ "super", 0x0065 }, + specials={ "super", 0x65 }, unicodeslot=0x1D49, }, [0x1D4A]={ @@ -50482,7 +51529,7 @@ characters.data={ description="MODIFIER LETTER SMALL SCHWA", direction="l", linebreak="al", - specials={ "super", 0x0259 }, + specials={ "super", 0x259 }, unicodeslot=0x1D4A, }, [0x1D4B]={ @@ -50490,7 +51537,7 @@ characters.data={ description="MODIFIER LETTER SMALL OPEN E", direction="l", linebreak="al", - specials={ "super", 0x025B }, + specials={ "super", 0x25B }, unicodeslot=0x1D4B, }, [0x1D4C]={ @@ -50498,7 +51545,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED OPEN E", direction="l", linebreak="al", - specials={ "super", 0x025C }, + specials={ "super", 0x25C }, unicodeslot=0x1D4C, }, [0x1D4D]={ @@ -50506,7 +51553,7 @@ characters.data={ description="MODIFIER LETTER SMALL G", direction="l", linebreak="al", - specials={ "super", 0x0067 }, + specials={ "super", 0x67 }, unicodeslot=0x1D4D, }, [0x1D4E]={ @@ -50521,7 +51568,7 @@ characters.data={ description="MODIFIER LETTER SMALL K", direction="l", linebreak="al", - specials={ "super", 0x006B }, + specials={ "super", 0x6B }, unicodeslot=0x1D4F, }, [0x1D50]={ @@ -50529,7 +51576,7 @@ characters.data={ description="MODIFIER LETTER SMALL M", direction="l", linebreak="al", - specials={ "super", 0x006D }, + specials={ "super", 0x6D }, unicodeslot=0x1D50, }, [0x1D51]={ @@ -50537,7 +51584,7 @@ characters.data={ description="MODIFIER LETTER SMALL ENG", direction="l", linebreak="al", - specials={ "super", 0x014B }, + specials={ "super", 0x14B }, unicodeslot=0x1D51, }, [0x1D52]={ @@ -50545,7 +51592,7 @@ characters.data={ description="MODIFIER LETTER SMALL O", direction="l", linebreak="al", - specials={ "super", 0x006F }, + specials={ "super", 0x6F }, unicodeslot=0x1D52, }, [0x1D53]={ @@ -50553,7 +51600,7 @@ characters.data={ description="MODIFIER LETTER SMALL OPEN O", direction="l", linebreak="al", - specials={ "super", 0x0254 }, + specials={ "super", 0x254 }, unicodeslot=0x1D53, }, [0x1D54]={ @@ -50577,7 +51624,7 @@ characters.data={ description="MODIFIER LETTER SMALL P", direction="l", linebreak="al", - specials={ "super", 0x0070 }, + specials={ "super", 0x70 }, unicodeslot=0x1D56, }, [0x1D57]={ @@ -50585,7 +51632,7 @@ characters.data={ description="MODIFIER LETTER SMALL T", direction="l", linebreak="al", - specials={ "super", 0x0074 }, + specials={ "super", 0x74 }, unicodeslot=0x1D57, }, [0x1D58]={ @@ -50593,7 +51640,7 @@ characters.data={ description="MODIFIER LETTER SMALL U", direction="l", linebreak="al", - specials={ "super", 0x0075 }, + specials={ "super", 0x75 }, unicodeslot=0x1D58, }, [0x1D59]={ @@ -50609,7 +51656,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED M", direction="l", linebreak="al", - specials={ "super", 0x026F }, + specials={ "super", 0x26F }, unicodeslot=0x1D5A, }, [0x1D5B]={ @@ -50617,7 +51664,7 @@ characters.data={ description="MODIFIER LETTER SMALL V", direction="l", linebreak="al", - specials={ "super", 0x0076 }, + specials={ "super", 0x76 }, unicodeslot=0x1D5B, }, [0x1D5C]={ @@ -50633,7 +51680,7 @@ characters.data={ description="MODIFIER LETTER SMALL BETA", direction="l", linebreak="al", - specials={ "super", 0x03B2 }, + specials={ "super", 0x3B2 }, unicodeslot=0x1D5D, }, [0x1D5E]={ @@ -50641,7 +51688,7 @@ characters.data={ description="MODIFIER LETTER SMALL GREEK GAMMA", direction="l", linebreak="al", - specials={ "super", 0x03B3 }, + specials={ "super", 0x3B3 }, unicodeslot=0x1D5E, }, [0x1D5F]={ @@ -50649,7 +51696,7 @@ characters.data={ description="MODIFIER LETTER SMALL DELTA", direction="l", linebreak="al", - specials={ "super", 0x03B4 }, + specials={ "super", 0x3B4 }, unicodeslot=0x1D5F, }, [0x1D60]={ @@ -50657,7 +51704,7 @@ characters.data={ description="MODIFIER LETTER SMALL GREEK PHI", direction="l", linebreak="al", - specials={ "super", 0x03C6 }, + specials={ "super", 0x3C6 }, unicodeslot=0x1D60, }, [0x1D61]={ @@ -50665,7 +51712,7 @@ characters.data={ description="MODIFIER LETTER SMALL CHI", direction="l", linebreak="al", - specials={ "super", 0x03C7 }, + specials={ "super", 0x3C7 }, unicodeslot=0x1D61, }, [0x1D62]={ @@ -50673,7 +51720,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER I", direction="l", linebreak="al", - specials={ "sub", 0x0069 }, + specials={ "sub", 0x69 }, unicodeslot=0x1D62, }, [0x1D63]={ @@ -50681,7 +51728,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER R", direction="l", linebreak="al", - specials={ "sub", 0x0072 }, + specials={ "sub", 0x72 }, unicodeslot=0x1D63, }, [0x1D64]={ @@ -50689,7 +51736,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER U", direction="l", linebreak="al", - specials={ "sub", 0x0075 }, + specials={ "sub", 0x75 }, unicodeslot=0x1D64, }, [0x1D65]={ @@ -50697,7 +51744,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER V", direction="l", linebreak="al", - specials={ "sub", 0x0076 }, + specials={ "sub", 0x76 }, unicodeslot=0x1D65, }, [0x1D66]={ @@ -50705,7 +51752,7 @@ characters.data={ description="GREEK SUBSCRIPT SMALL LETTER BETA", direction="l", linebreak="al", - specials={ "sub", 0x03B2 }, + specials={ "sub", 0x3B2 }, unicodeslot=0x1D66, }, [0x1D67]={ @@ -50713,7 +51760,7 @@ characters.data={ description="GREEK SUBSCRIPT SMALL LETTER GAMMA", direction="l", linebreak="al", - specials={ "sub", 0x03B3 }, + specials={ "sub", 0x3B3 }, unicodeslot=0x1D67, }, [0x1D68]={ @@ -50721,7 +51768,7 @@ characters.data={ description="GREEK SUBSCRIPT SMALL LETTER RHO", direction="l", linebreak="al", - specials={ "sub", 0x03C1 }, + specials={ "sub", 0x3C1 }, unicodeslot=0x1D68, }, [0x1D69]={ @@ -50729,7 +51776,7 @@ characters.data={ description="GREEK SUBSCRIPT SMALL LETTER PHI", direction="l", linebreak="al", - specials={ "sub", 0x03C6 }, + specials={ "sub", 0x3C6 }, unicodeslot=0x1D69, }, [0x1D6A]={ @@ -50737,7 +51784,7 @@ characters.data={ description="GREEK SUBSCRIPT SMALL LETTER CHI", direction="l", linebreak="al", - specials={ "sub", 0x03C7 }, + specials={ "sub", 0x3C7 }, unicodeslot=0x1D6A, }, [0x1D6B]={ @@ -50752,7 +51799,7 @@ characters.data={ description="LATIN SMALL LETTER B WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0062, + shcode=0x62, unicodeslot=0x1D6C, }, [0x1D6D]={ @@ -50760,7 +51807,7 @@ characters.data={ description="LATIN SMALL LETTER D WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0064, + shcode=0x64, unicodeslot=0x1D6D, }, [0x1D6E]={ @@ -50768,7 +51815,7 @@ characters.data={ description="LATIN SMALL LETTER F WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0066, + shcode=0x66, unicodeslot=0x1D6E, }, [0x1D6F]={ @@ -50776,7 +51823,7 @@ characters.data={ description="LATIN SMALL LETTER M WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x006D, + shcode=0x6D, unicodeslot=0x1D6F, }, [0x1D70]={ @@ -50784,7 +51831,7 @@ characters.data={ description="LATIN SMALL LETTER N WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x006E, + shcode=0x6E, unicodeslot=0x1D70, }, [0x1D71]={ @@ -50792,7 +51839,7 @@ characters.data={ description="LATIN SMALL LETTER P WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0070, + shcode=0x70, unicodeslot=0x1D71, }, [0x1D72]={ @@ -50800,7 +51847,7 @@ characters.data={ description="LATIN SMALL LETTER R WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0072, + shcode=0x72, unicodeslot=0x1D72, }, [0x1D73]={ @@ -50808,7 +51855,7 @@ characters.data={ description="LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0072, + shcode=0x72, unicodeslot=0x1D73, }, [0x1D74]={ @@ -50816,7 +51863,7 @@ characters.data={ description="LATIN SMALL LETTER S WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0073, + shcode=0x73, unicodeslot=0x1D74, }, [0x1D75]={ @@ -50824,7 +51871,7 @@ characters.data={ description="LATIN SMALL LETTER T WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x0074, + shcode=0x74, unicodeslot=0x1D75, }, [0x1D76]={ @@ -50832,7 +51879,7 @@ characters.data={ description="LATIN SMALL LETTER Z WITH MIDDLE TILDE", direction="l", linebreak="al", - shcode=0x007A, + shcode=0x7A, unicodeslot=0x1D76, }, [0x1D77]={ @@ -50847,7 +51894,7 @@ characters.data={ description="MODIFIER LETTER CYRILLIC EN", direction="l", linebreak="al", - specials={ "super", 0x043D }, + specials={ "super", 0x43D }, unicodeslot=0x1D78, }, [0x1D79]={ @@ -50876,7 +51923,7 @@ characters.data={ description="LATIN SMALL LETTER IOTA WITH STROKE", direction="l", linebreak="al", - shcode=0x0269, + shcode=0x269, unicodeslot=0x1D7C, }, [0x1D7D]={ @@ -50884,7 +51931,7 @@ characters.data={ description="LATIN SMALL LETTER P WITH STROKE", direction="l", linebreak="al", - shcode=0x0070, + shcode=0x70, uccode=0x2C63, unicodeslot=0x1D7D, }, @@ -50900,7 +51947,7 @@ characters.data={ description="LATIN SMALL LETTER UPSILON WITH STROKE", direction="l", linebreak="al", - shcode=0x028A, + shcode=0x28A, unicodeslot=0x1D7F, }, [0x1D80]={ @@ -50908,7 +51955,7 @@ characters.data={ description="LATIN SMALL LETTER B WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0062, + shcode=0x62, unicodeslot=0x1D80, }, [0x1D81]={ @@ -50916,7 +51963,7 @@ characters.data={ description="LATIN SMALL LETTER D WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0064, + shcode=0x64, unicodeslot=0x1D81, }, [0x1D82]={ @@ -50924,7 +51971,7 @@ characters.data={ description="LATIN SMALL LETTER F WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0066, + shcode=0x66, unicodeslot=0x1D82, }, [0x1D83]={ @@ -50932,7 +51979,7 @@ characters.data={ description="LATIN SMALL LETTER G WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0067, + shcode=0x67, unicodeslot=0x1D83, }, [0x1D84]={ @@ -50940,7 +51987,7 @@ characters.data={ description="LATIN SMALL LETTER K WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x006B, + shcode=0x6B, unicodeslot=0x1D84, }, [0x1D85]={ @@ -50948,7 +51995,7 @@ characters.data={ description="LATIN SMALL LETTER L WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x006C, + shcode=0x6C, unicodeslot=0x1D85, }, [0x1D86]={ @@ -50956,7 +52003,7 @@ characters.data={ description="LATIN SMALL LETTER M WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x006D, + shcode=0x6D, unicodeslot=0x1D86, }, [0x1D87]={ @@ -50964,7 +52011,7 @@ characters.data={ description="LATIN SMALL LETTER N WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x006E, + shcode=0x6E, unicodeslot=0x1D87, }, [0x1D88]={ @@ -50972,7 +52019,7 @@ characters.data={ description="LATIN SMALL LETTER P WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0070, + shcode=0x70, unicodeslot=0x1D88, }, [0x1D89]={ @@ -50980,7 +52027,7 @@ characters.data={ description="LATIN SMALL LETTER R WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0072, + shcode=0x72, unicodeslot=0x1D89, }, [0x1D8A]={ @@ -50988,7 +52035,7 @@ characters.data={ description="LATIN SMALL LETTER S WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0073, + shcode=0x73, unicodeslot=0x1D8A, }, [0x1D8B]={ @@ -50996,7 +52043,7 @@ characters.data={ description="LATIN SMALL LETTER ESH WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0283, + shcode=0x283, unicodeslot=0x1D8B, }, [0x1D8C]={ @@ -51004,7 +52051,7 @@ characters.data={ description="LATIN SMALL LETTER V WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0076, + shcode=0x76, unicodeslot=0x1D8C, }, [0x1D8D]={ @@ -51012,7 +52059,7 @@ characters.data={ description="LATIN SMALL LETTER X WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x0078, + shcode=0x78, unicodeslot=0x1D8D, }, [0x1D8E]={ @@ -51020,7 +52067,7 @@ characters.data={ description="LATIN SMALL LETTER Z WITH PALATAL HOOK", direction="l", linebreak="al", - shcode=0x007A, + shcode=0x7A, unicodeslot=0x1D8E, }, [0x1D8F]={ @@ -51028,7 +52075,7 @@ characters.data={ description="LATIN SMALL LETTER A WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0061, + shcode=0x61, unicodeslot=0x1D8F, }, [0x1D90]={ @@ -51036,7 +52083,7 @@ characters.data={ description="LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0251, + shcode=0x251, unicodeslot=0x1D90, }, [0x1D91]={ @@ -51044,7 +52091,7 @@ characters.data={ description="LATIN SMALL LETTER D WITH HOOK AND TAIL", direction="l", linebreak="al", - shcode=0x0064, + shcode=0x64, unicodeslot=0x1D91, }, [0x1D92]={ @@ -51052,7 +52099,7 @@ characters.data={ description="LATIN SMALL LETTER E WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0065, + shcode=0x65, unicodeslot=0x1D92, }, [0x1D93]={ @@ -51074,7 +52121,7 @@ characters.data={ description="LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0259, + shcode=0x259, unicodeslot=0x1D95, }, [0x1D96]={ @@ -51082,7 +52129,7 @@ characters.data={ description="LATIN SMALL LETTER I WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0069, + shcode=0x69, unicodeslot=0x1D96, }, [0x1D97]={ @@ -51097,7 +52144,7 @@ characters.data={ description="LATIN SMALL LETTER ESH WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0283, + shcode=0x283, unicodeslot=0x1D98, }, [0x1D99]={ @@ -51105,7 +52152,7 @@ characters.data={ description="LATIN SMALL LETTER U WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0075, + shcode=0x75, unicodeslot=0x1D99, }, [0x1D9A]={ @@ -51113,7 +52160,7 @@ characters.data={ description="LATIN SMALL LETTER EZH WITH RETROFLEX HOOK", direction="l", linebreak="al", - shcode=0x0292, + shcode=0x292, unicodeslot=0x1D9A, }, [0x1D9B]={ @@ -51121,7 +52168,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED ALPHA", direction="l", linebreak="al", - specials={ "super", 0x0252 }, + specials={ "super", 0x252 }, unicodeslot=0x1D9B, }, [0x1D9C]={ @@ -51129,7 +52176,7 @@ characters.data={ description="MODIFIER LETTER SMALL C", direction="l", linebreak="al", - specials={ "super", 0x0063 }, + specials={ "super", 0x63 }, unicodeslot=0x1D9C, }, [0x1D9D]={ @@ -51137,7 +52184,7 @@ characters.data={ description="MODIFIER LETTER SMALL C WITH CURL", direction="l", linebreak="al", - specials={ "super", 0x0255 }, + specials={ "super", 0x255 }, unicodeslot=0x1D9D, }, [0x1D9E]={ @@ -51145,7 +52192,7 @@ characters.data={ description="MODIFIER LETTER SMALL ETH", direction="l", linebreak="al", - specials={ "super", 0x00F0 }, + specials={ "super", 0xF0 }, unicodeslot=0x1D9E, }, [0x1D9F]={ @@ -51153,7 +52200,7 @@ characters.data={ description="MODIFIER LETTER SMALL REVERSED OPEN E", direction="l", linebreak="al", - specials={ "super", 0x025C }, + specials={ "super", 0x25C }, unicodeslot=0x1D9F, }, [0x1DA0]={ @@ -51161,7 +52208,7 @@ characters.data={ description="MODIFIER LETTER SMALL F", direction="l", linebreak="al", - specials={ "super", 0x0066 }, + specials={ "super", 0x66 }, unicodeslot=0x1DA0, }, [0x1DA1]={ @@ -51169,7 +52216,7 @@ characters.data={ description="MODIFIER LETTER SMALL DOTLESS J WITH STROKE", direction="l", linebreak="al", - specials={ "super", 0x025F }, + specials={ "super", 0x25F }, unicodeslot=0x1DA1, }, [0x1DA2]={ @@ -51177,7 +52224,7 @@ characters.data={ description="MODIFIER LETTER SMALL SCRIPT G", direction="l", linebreak="al", - specials={ "super", 0x0261 }, + specials={ "super", 0x261 }, unicodeslot=0x1DA2, }, [0x1DA3]={ @@ -51185,7 +52232,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED H", direction="l", linebreak="al", - specials={ "super", 0x0265 }, + specials={ "super", 0x265 }, unicodeslot=0x1DA3, }, [0x1DA4]={ @@ -51193,7 +52240,7 @@ characters.data={ description="MODIFIER LETTER SMALL I WITH STROKE", direction="l", linebreak="al", - specials={ "super", 0x0268 }, + specials={ "super", 0x268 }, unicodeslot=0x1DA4, }, [0x1DA5]={ @@ -51201,7 +52248,7 @@ characters.data={ description="MODIFIER LETTER SMALL IOTA", direction="l", linebreak="al", - specials={ "super", 0x0269 }, + specials={ "super", 0x269 }, unicodeslot=0x1DA5, }, [0x1DA6]={ @@ -51209,7 +52256,7 @@ characters.data={ description="MODIFIER LETTER SMALL CAPITAL I", direction="l", linebreak="al", - specials={ "super", 0x026A }, + specials={ "super", 0x26A }, unicodeslot=0x1DA6, }, [0x1DA7]={ @@ -51225,7 +52272,7 @@ characters.data={ description="MODIFIER LETTER SMALL J WITH CROSSED-TAIL", direction="l", linebreak="al", - specials={ "super", 0x029D }, + specials={ "super", 0x29D }, unicodeslot=0x1DA8, }, [0x1DA9]={ @@ -51233,7 +52280,7 @@ characters.data={ description="MODIFIER LETTER SMALL L WITH RETROFLEX HOOK", direction="l", linebreak="al", - specials={ "super", 0x026D }, + specials={ "super", 0x26D }, unicodeslot=0x1DA9, }, [0x1DAA]={ @@ -51249,7 +52296,7 @@ characters.data={ description="MODIFIER LETTER SMALL CAPITAL L", direction="l", linebreak="al", - specials={ "super", 0x029F }, + specials={ "super", 0x29F }, unicodeslot=0x1DAB, }, [0x1DAC]={ @@ -51257,7 +52304,7 @@ characters.data={ description="MODIFIER LETTER SMALL M WITH HOOK", direction="l", linebreak="al", - specials={ "super", 0x0271 }, + specials={ "super", 0x271 }, unicodeslot=0x1DAC, }, [0x1DAD]={ @@ -51265,7 +52312,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED M WITH LONG LEG", direction="l", linebreak="al", - specials={ "super", 0x0270 }, + specials={ "super", 0x270 }, unicodeslot=0x1DAD, }, [0x1DAE]={ @@ -51273,7 +52320,7 @@ characters.data={ description="MODIFIER LETTER SMALL N WITH LEFT HOOK", direction="l", linebreak="al", - specials={ "super", 0x0272 }, + specials={ "super", 0x272 }, unicodeslot=0x1DAE, }, [0x1DAF]={ @@ -51281,7 +52328,7 @@ characters.data={ description="MODIFIER LETTER SMALL N WITH RETROFLEX HOOK", direction="l", linebreak="al", - specials={ "super", 0x0273 }, + specials={ "super", 0x273 }, unicodeslot=0x1DAF, }, [0x1DB0]={ @@ -51289,7 +52336,7 @@ characters.data={ description="MODIFIER LETTER SMALL CAPITAL N", direction="l", linebreak="al", - specials={ "super", 0x0274 }, + specials={ "super", 0x274 }, unicodeslot=0x1DB0, }, [0x1DB1]={ @@ -51297,7 +52344,7 @@ characters.data={ description="MODIFIER LETTER SMALL BARRED O", direction="l", linebreak="al", - specials={ "super", 0x0275 }, + specials={ "super", 0x275 }, unicodeslot=0x1DB1, }, [0x1DB2]={ @@ -51305,7 +52352,7 @@ characters.data={ description="MODIFIER LETTER SMALL PHI", direction="l", linebreak="al", - specials={ "super", 0x0278 }, + specials={ "super", 0x278 }, unicodeslot=0x1DB2, }, [0x1DB3]={ @@ -51313,7 +52360,7 @@ characters.data={ description="MODIFIER LETTER SMALL S WITH HOOK", direction="l", linebreak="al", - specials={ "super", 0x0282 }, + specials={ "super", 0x282 }, unicodeslot=0x1DB3, }, [0x1DB4]={ @@ -51321,7 +52368,7 @@ characters.data={ description="MODIFIER LETTER SMALL ESH", direction="l", linebreak="al", - specials={ "super", 0x0283 }, + specials={ "super", 0x283 }, unicodeslot=0x1DB4, }, [0x1DB5]={ @@ -51329,7 +52376,7 @@ characters.data={ description="MODIFIER LETTER SMALL T WITH PALATAL HOOK", direction="l", linebreak="al", - specials={ "super", 0x01AB }, + specials={ "super", 0x1AB }, unicodeslot=0x1DB5, }, [0x1DB6]={ @@ -51337,7 +52384,7 @@ characters.data={ description="MODIFIER LETTER SMALL U BAR", direction="l", linebreak="al", - specials={ "super", 0x0289 }, + specials={ "super", 0x289 }, unicodeslot=0x1DB6, }, [0x1DB7]={ @@ -51345,7 +52392,7 @@ characters.data={ description="MODIFIER LETTER SMALL UPSILON", direction="l", linebreak="al", - specials={ "super", 0x028A }, + specials={ "super", 0x28A }, unicodeslot=0x1DB7, }, [0x1DB8]={ @@ -51361,7 +52408,7 @@ characters.data={ description="MODIFIER LETTER SMALL V WITH HOOK", direction="l", linebreak="al", - specials={ "super", 0x028B }, + specials={ "super", 0x28B }, unicodeslot=0x1DB9, }, [0x1DBA]={ @@ -51369,7 +52416,7 @@ characters.data={ description="MODIFIER LETTER SMALL TURNED V", direction="l", linebreak="al", - specials={ "super", 0x028C }, + specials={ "super", 0x28C }, unicodeslot=0x1DBA, }, [0x1DBB]={ @@ -51377,7 +52424,7 @@ characters.data={ description="MODIFIER LETTER SMALL Z", direction="l", linebreak="al", - specials={ "super", 0x007A }, + specials={ "super", 0x7A }, unicodeslot=0x1DBB, }, [0x1DBC]={ @@ -51385,7 +52432,7 @@ characters.data={ description="MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK", direction="l", linebreak="al", - specials={ "super", 0x0290 }, + specials={ "super", 0x290 }, unicodeslot=0x1DBC, }, [0x1DBD]={ @@ -51393,7 +52440,7 @@ characters.data={ description="MODIFIER LETTER SMALL Z WITH CURL", direction="l", linebreak="al", - specials={ "super", 0x0291 }, + specials={ "super", 0x291 }, unicodeslot=0x1DBD, }, [0x1DBE]={ @@ -51401,7 +52448,7 @@ characters.data={ description="MODIFIER LETTER SMALL EZH", direction="l", linebreak="al", - specials={ "super", 0x0292 }, + specials={ "super", 0x292 }, unicodeslot=0x1DBE, }, [0x1DBF]={ @@ -51409,11 +52456,12 @@ characters.data={ description="MODIFIER LETTER SMALL THETA", direction="l", linebreak="al", - specials={ "super", 0x03B8 }, + specials={ "super", 0x3B8 }, unicodeslot=0x1DBF, }, [0x1DC0]={ category="mn", + combining=0xE6, description="COMBINING DOTTED GRAVE ACCENT", direction="nsm", linebreak="cm", @@ -51421,6 +52469,7 @@ characters.data={ }, [0x1DC1]={ category="mn", + combining=0xE6, description="COMBINING DOTTED ACUTE ACCENT", direction="nsm", linebreak="cm", @@ -51428,6 +52477,7 @@ characters.data={ }, [0x1DC2]={ category="mn", + combining=0xDC, description="COMBINING SNAKE BELOW", direction="nsm", linebreak="cm", @@ -51435,6 +52485,7 @@ characters.data={ }, [0x1DC3]={ category="mn", + combining=0xE6, description="COMBINING SUSPENSION MARK", direction="nsm", linebreak="cm", @@ -51442,6 +52493,7 @@ characters.data={ }, [0x1DC4]={ category="mn", + combining=0xE6, description="COMBINING MACRON-ACUTE", direction="nsm", linebreak="cm", @@ -51449,6 +52501,7 @@ characters.data={ }, [0x1DC5]={ category="mn", + combining=0xE6, description="COMBINING GRAVE-MACRON", direction="nsm", linebreak="cm", @@ -51456,6 +52509,7 @@ characters.data={ }, [0x1DC6]={ category="mn", + combining=0xE6, description="COMBINING MACRON-GRAVE", direction="nsm", linebreak="cm", @@ -51463,6 +52517,7 @@ characters.data={ }, [0x1DC7]={ category="mn", + combining=0xE6, description="COMBINING ACUTE-MACRON", direction="nsm", linebreak="cm", @@ -51470,6 +52525,7 @@ characters.data={ }, [0x1DC8]={ category="mn", + combining=0xE6, description="COMBINING GRAVE-ACUTE-GRAVE", direction="nsm", linebreak="cm", @@ -51477,6 +52533,7 @@ characters.data={ }, [0x1DC9]={ category="mn", + combining=0xE6, description="COMBINING ACUTE-GRAVE-ACUTE", direction="nsm", linebreak="cm", @@ -51484,6 +52541,7 @@ characters.data={ }, [0x1DCA]={ category="mn", + combining=0xDC, description="COMBINING LATIN SMALL LETTER R BELOW", direction="nsm", linebreak="cm", @@ -51491,6 +52549,7 @@ characters.data={ }, [0x1DCB]={ category="mn", + combining=0xE6, description="COMBINING BREVE-MACRON", direction="nsm", linebreak="cm", @@ -51498,6 +52557,7 @@ characters.data={ }, [0x1DCC]={ category="mn", + combining=0xE6, description="COMBINING MACRON-BREVE", direction="nsm", linebreak="cm", @@ -51505,6 +52565,7 @@ characters.data={ }, [0x1DCD]={ category="mn", + combining=0xEA, description="COMBINING DOUBLE CIRCUMFLEX ABOVE", direction="nsm", linebreak="cm", @@ -51512,6 +52573,7 @@ characters.data={ }, [0x1DCE]={ category="mn", + combining=0xD6, description="COMBINING OGONEK ABOVE", direction="nsm", linebreak="cm", @@ -51519,6 +52581,7 @@ characters.data={ }, [0x1DCF]={ category="mn", + combining=0xDC, description="COMBINING ZIGZAG BELOW", direction="nsm", linebreak="cm", @@ -51526,6 +52589,7 @@ characters.data={ }, [0x1DD0]={ category="mn", + combining=0xCA, description="COMBINING IS BELOW", direction="nsm", linebreak="cm", @@ -51533,6 +52597,7 @@ characters.data={ }, [0x1DD1]={ category="mn", + combining=0xE6, description="COMBINING UR ABOVE", direction="nsm", linebreak="cm", @@ -51540,6 +52605,7 @@ characters.data={ }, [0x1DD2]={ category="mn", + combining=0xE6, description="COMBINING US ABOVE", direction="nsm", linebreak="cm", @@ -51547,6 +52613,7 @@ characters.data={ }, [0x1DD3]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE", direction="nsm", linebreak="cm", @@ -51554,6 +52621,7 @@ characters.data={ }, [0x1DD4]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER AE", direction="nsm", linebreak="cm", @@ -51561,6 +52629,7 @@ characters.data={ }, [0x1DD5]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER AO", direction="nsm", linebreak="cm", @@ -51568,6 +52637,7 @@ characters.data={ }, [0x1DD6]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER AV", direction="nsm", linebreak="cm", @@ -51575,6 +52645,7 @@ characters.data={ }, [0x1DD7]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER C CEDILLA", direction="nsm", linebreak="cm", @@ -51582,6 +52653,7 @@ characters.data={ }, [0x1DD8]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER INSULAR D", direction="nsm", linebreak="cm", @@ -51589,6 +52661,7 @@ characters.data={ }, [0x1DD9]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER ETH", direction="nsm", linebreak="cm", @@ -51596,6 +52669,7 @@ characters.data={ }, [0x1DDA]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER G", direction="nsm", linebreak="cm", @@ -51603,6 +52677,7 @@ characters.data={ }, [0x1DDB]={ category="mn", + combining=0xE6, description="COMBINING LATIN LETTER SMALL CAPITAL G", direction="nsm", linebreak="cm", @@ -51610,6 +52685,7 @@ characters.data={ }, [0x1DDC]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER K", direction="nsm", linebreak="cm", @@ -51617,6 +52693,7 @@ characters.data={ }, [0x1DDD]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER L", direction="nsm", linebreak="cm", @@ -51624,6 +52701,7 @@ characters.data={ }, [0x1DDE]={ category="mn", + combining=0xE6, description="COMBINING LATIN LETTER SMALL CAPITAL L", direction="nsm", linebreak="cm", @@ -51631,6 +52709,7 @@ characters.data={ }, [0x1DDF]={ category="mn", + combining=0xE6, description="COMBINING LATIN LETTER SMALL CAPITAL M", direction="nsm", linebreak="cm", @@ -51638,6 +52717,7 @@ characters.data={ }, [0x1DE0]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER N", direction="nsm", linebreak="cm", @@ -51645,6 +52725,7 @@ characters.data={ }, [0x1DE1]={ category="mn", + combining=0xE6, description="COMBINING LATIN LETTER SMALL CAPITAL N", direction="nsm", linebreak="cm", @@ -51652,6 +52733,7 @@ characters.data={ }, [0x1DE2]={ category="mn", + combining=0xE6, description="COMBINING LATIN LETTER SMALL CAPITAL R", direction="nsm", linebreak="cm", @@ -51659,6 +52741,7 @@ characters.data={ }, [0x1DE3]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER R ROTUNDA", direction="nsm", linebreak="cm", @@ -51666,6 +52749,7 @@ characters.data={ }, [0x1DE4]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER S", direction="nsm", linebreak="cm", @@ -51673,6 +52757,7 @@ characters.data={ }, [0x1DE5]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER LONG S", direction="nsm", linebreak="cm", @@ -51680,13 +52765,135 @@ characters.data={ }, [0x1DE6]={ category="mn", + combining=0xE6, description="COMBINING LATIN SMALL LETTER Z", direction="nsm", linebreak="cm", unicodeslot=0x1DE6, }, + [0x1DE7]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER ALPHA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DE7, + }, + [0x1DE8]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER B", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DE8, + }, + [0x1DE9]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER BETA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DE9, + }, + [0x1DEA]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER SCHWA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DEA, + }, + [0x1DEB]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER F", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DEB, + }, + [0x1DEC]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DEC, + }, + [0x1DED]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DED, + }, + [0x1DEE]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER P", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DEE, + }, + [0x1DEF]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER ESH", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DEF, + }, + [0x1DF0]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF0, + }, + [0x1DF1]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER W", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF1, + }, + [0x1DF2]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER A WITH DIAERESIS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF2, + }, + [0x1DF3]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER O WITH DIAERESIS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF3, + }, + [0x1DF4]={ + category="mn", + combining=0xE6, + description="COMBINING LATIN SMALL LETTER U WITH DIAERESIS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF4, + }, + [0x1DF5]={ + category="mn", + combining=0xE6, + description="COMBINING UP TACK ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF5, + }, [0x1DFC]={ category="mn", + combining=0xE9, description="COMBINING DOUBLE INVERTED BREVE BELOW", direction="nsm", linebreak="cm", @@ -51694,6 +52901,7 @@ characters.data={ }, [0x1DFD]={ category="mn", + combining=0xDC, description="COMBINING ALMOST EQUAL TO BELOW", direction="nsm", linebreak="cm", @@ -51701,6 +52909,7 @@ characters.data={ }, [0x1DFE]={ category="mn", + combining=0xE6, description="COMBINING LEFT ARROWHEAD ABOVE", direction="nsm", linebreak="cm", @@ -51708,6 +52917,7 @@ characters.data={ }, [0x1DFF]={ category="mn", + combining=0xDC, description="COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW", direction="nsm", linebreak="cm", @@ -51720,8 +52930,8 @@ characters.data={ direction="l", lccode=0x1E01, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0325 }, + shcode=0x41, + specials={ "char", 0x41, 0x325 }, unicodeslot=0x1E00, }, [0x1E01]={ @@ -51730,8 +52940,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH RING BELOW", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0325 }, + shcode=0x61, + specials={ "char", 0x61, 0x325 }, uccode=0x1E00, unicodeslot=0x1E01, }, @@ -51742,8 +52952,8 @@ characters.data={ direction="l", lccode=0x1E03, linebreak="al", - shcode=0x0042, - specials={ "char", 0x0042, 0x0307 }, + shcode=0x42, + specials={ "char", 0x42, 0x307 }, unicodeslot=0x1E02, }, [0x1E03]={ @@ -51752,8 +52962,8 @@ characters.data={ description="LATIN SMALL LETTER B WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0062, - specials={ "char", 0x0062, 0x0307 }, + shcode=0x62, + specials={ "char", 0x62, 0x307 }, uccode=0x1E02, unicodeslot=0x1E03, }, @@ -51764,8 +52974,8 @@ characters.data={ direction="l", lccode=0x1E05, linebreak="al", - shcode=0x0042, - specials={ "char", 0x0042, 0x0323 }, + shcode=0x42, + specials={ "char", 0x42, 0x323 }, unicodeslot=0x1E04, }, [0x1E05]={ @@ -51774,8 +52984,8 @@ characters.data={ description="LATIN SMALL LETTER B WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0062, - specials={ "char", 0x0062, 0x0323 }, + shcode=0x62, + specials={ "char", 0x62, 0x323 }, uccode=0x1E04, unicodeslot=0x1E05, }, @@ -51786,8 +52996,8 @@ characters.data={ direction="l", lccode=0x1E07, linebreak="al", - shcode=0x0042, - specials={ "char", 0x0042, 0x0331 }, + shcode=0x42, + specials={ "char", 0x42, 0x331 }, unicodeslot=0x1E06, }, [0x1E07]={ @@ -51796,8 +53006,8 @@ characters.data={ description="LATIN SMALL LETTER B WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x0062, - specials={ "char", 0x0062, 0x0331 }, + shcode=0x62, + specials={ "char", 0x62, 0x331 }, uccode=0x1E06, unicodeslot=0x1E07, }, @@ -51808,8 +53018,8 @@ characters.data={ direction="l", lccode=0x1E09, linebreak="al", - shcode=0x0043, - specials={ "char", 0x00C7, 0x0301 }, + shcode=0x43, + specials={ "char", 0xC7, 0x301 }, unicodeslot=0x1E08, }, [0x1E09]={ @@ -51818,8 +53028,8 @@ characters.data={ description="LATIN SMALL LETTER C WITH CEDILLA AND ACUTE", direction="l", linebreak="al", - shcode=0x0063, - specials={ "char", 0x00E7, 0x0301 }, + shcode=0x63, + specials={ "char", 0xE7, 0x301 }, uccode=0x1E08, unicodeslot=0x1E09, }, @@ -51830,8 +53040,8 @@ characters.data={ direction="l", lccode=0x1E0B, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x0307 }, + shcode=0x44, + specials={ "char", 0x44, 0x307 }, unicodeslot=0x1E0A, }, [0x1E0B]={ @@ -51840,8 +53050,8 @@ characters.data={ description="LATIN SMALL LETTER D WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x0307 }, + shcode=0x64, + specials={ "char", 0x64, 0x307 }, uccode=0x1E0A, unicodeslot=0x1E0B, }, @@ -51852,8 +53062,8 @@ characters.data={ direction="l", lccode=0x1E0D, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x0323 }, + shcode=0x44, + specials={ "char", 0x44, 0x323 }, unicodeslot=0x1E0C, }, [0x1E0D]={ @@ -51862,8 +53072,8 @@ characters.data={ description="LATIN SMALL LETTER D WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x0323 }, + shcode=0x64, + specials={ "char", 0x64, 0x323 }, uccode=0x1E0C, unicodeslot=0x1E0D, }, @@ -51874,8 +53084,8 @@ characters.data={ direction="l", lccode=0x1E0F, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x0331 }, + shcode=0x44, + specials={ "char", 0x44, 0x331 }, unicodeslot=0x1E0E, }, [0x1E0F]={ @@ -51884,8 +53094,8 @@ characters.data={ description="LATIN SMALL LETTER D WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x0331 }, + shcode=0x64, + specials={ "char", 0x64, 0x331 }, uccode=0x1E0E, unicodeslot=0x1E0F, }, @@ -51896,8 +53106,8 @@ characters.data={ direction="l", lccode=0x1E11, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x0327 }, + shcode=0x44, + specials={ "char", 0x44, 0x327 }, unicodeslot=0x1E10, }, [0x1E11]={ @@ -51906,8 +53116,8 @@ characters.data={ description="LATIN SMALL LETTER D WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x0327 }, + shcode=0x64, + specials={ "char", 0x64, 0x327 }, uccode=0x1E10, unicodeslot=0x1E11, }, @@ -51918,8 +53128,8 @@ characters.data={ direction="l", lccode=0x1E13, linebreak="al", - shcode=0x0044, - specials={ "char", 0x0044, 0x032D }, + shcode=0x44, + specials={ "char", 0x44, 0x32D }, unicodeslot=0x1E12, }, [0x1E13]={ @@ -51928,8 +53138,8 @@ characters.data={ description="LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x0064, - specials={ "char", 0x0064, 0x032D }, + shcode=0x64, + specials={ "char", 0x64, 0x32D }, uccode=0x1E12, unicodeslot=0x1E13, }, @@ -51940,8 +53150,8 @@ characters.data={ direction="l", lccode=0x1E15, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0112, 0x0300 }, + shcode=0x45, + specials={ "char", 0x112, 0x300 }, unicodeslot=0x1E14, }, [0x1E15]={ @@ -51950,8 +53160,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH MACRON AND GRAVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0113, 0x0300 }, + shcode=0x65, + specials={ "char", 0x113, 0x300 }, uccode=0x1E14, unicodeslot=0x1E15, }, @@ -51962,8 +53172,8 @@ characters.data={ direction="l", lccode=0x1E17, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0112, 0x0301 }, + shcode=0x45, + specials={ "char", 0x112, 0x301 }, unicodeslot=0x1E16, }, [0x1E17]={ @@ -51972,8 +53182,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH MACRON AND ACUTE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0113, 0x0301 }, + shcode=0x65, + specials={ "char", 0x113, 0x301 }, uccode=0x1E16, unicodeslot=0x1E17, }, @@ -51984,8 +53194,8 @@ characters.data={ direction="l", lccode=0x1E19, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x032D }, + shcode=0x45, + specials={ "char", 0x45, 0x32D }, unicodeslot=0x1E18, }, [0x1E19]={ @@ -51994,8 +53204,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x032D }, + shcode=0x65, + specials={ "char", 0x65, 0x32D }, uccode=0x1E18, unicodeslot=0x1E19, }, @@ -52006,8 +53216,8 @@ characters.data={ direction="l", lccode=0x1E1B, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0330 }, + shcode=0x45, + specials={ "char", 0x45, 0x330 }, unicodeslot=0x1E1A, }, [0x1E1B]={ @@ -52016,8 +53226,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH TILDE BELOW", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0330 }, + shcode=0x65, + specials={ "char", 0x65, 0x330 }, uccode=0x1E1A, unicodeslot=0x1E1B, }, @@ -52028,8 +53238,8 @@ characters.data={ direction="l", lccode=0x1E1D, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0228, 0x0306 }, + shcode=0x45, + specials={ "char", 0x228, 0x306 }, unicodeslot=0x1E1C, }, [0x1E1D]={ @@ -52038,8 +53248,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CEDILLA AND BREVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0229, 0x0306 }, + shcode=0x65, + specials={ "char", 0x229, 0x306 }, uccode=0x1E1C, unicodeslot=0x1E1D, }, @@ -52050,8 +53260,8 @@ characters.data={ direction="l", lccode=0x1E1F, linebreak="al", - shcode=0x0046, - specials={ "char", 0x0046, 0x0307 }, + shcode=0x46, + specials={ "char", 0x46, 0x307 }, unicodeslot=0x1E1E, }, [0x1E1F]={ @@ -52060,8 +53270,8 @@ characters.data={ description="LATIN SMALL LETTER F WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0066, - specials={ "char", 0x0066, 0x0307 }, + shcode=0x66, + specials={ "char", 0x66, 0x307 }, uccode=0x1E1E, unicodeslot=0x1E1F, }, @@ -52072,8 +53282,8 @@ characters.data={ direction="l", lccode=0x1E21, linebreak="al", - shcode=0x0047, - specials={ "char", 0x0047, 0x0304 }, + shcode=0x47, + specials={ "char", 0x47, 0x304 }, unicodeslot=0x1E20, }, [0x1E21]={ @@ -52082,8 +53292,8 @@ characters.data={ description="LATIN SMALL LETTER G WITH MACRON", direction="l", linebreak="al", - shcode=0x0067, - specials={ "char", 0x0067, 0x0304 }, + shcode=0x67, + specials={ "char", 0x67, 0x304 }, uccode=0x1E20, unicodeslot=0x1E21, }, @@ -52094,8 +53304,8 @@ characters.data={ direction="l", lccode=0x1E23, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x0307 }, + shcode=0x48, + specials={ "char", 0x48, 0x307 }, unicodeslot=0x1E22, }, [0x1E23]={ @@ -52104,8 +53314,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0307 }, + shcode=0x68, + specials={ "char", 0x68, 0x307 }, uccode=0x1E22, unicodeslot=0x1E23, }, @@ -52116,8 +53326,8 @@ characters.data={ direction="l", lccode=0x1E25, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x0323 }, + shcode=0x48, + specials={ "char", 0x48, 0x323 }, unicodeslot=0x1E24, }, [0x1E25]={ @@ -52126,8 +53336,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0323 }, + shcode=0x68, + specials={ "char", 0x68, 0x323 }, uccode=0x1E24, unicodeslot=0x1E25, }, @@ -52138,8 +53348,8 @@ characters.data={ direction="l", lccode=0x1E27, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x0308 }, + shcode=0x48, + specials={ "char", 0x48, 0x308 }, unicodeslot=0x1E26, }, [0x1E27]={ @@ -52148,8 +53358,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0308 }, + shcode=0x68, + specials={ "char", 0x68, 0x308 }, uccode=0x1E26, unicodeslot=0x1E27, }, @@ -52160,8 +53370,8 @@ characters.data={ direction="l", lccode=0x1E29, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x0327 }, + shcode=0x48, + specials={ "char", 0x48, 0x327 }, unicodeslot=0x1E28, }, [0x1E29]={ @@ -52170,8 +53380,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH CEDILLA", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0327 }, + shcode=0x68, + specials={ "char", 0x68, 0x327 }, uccode=0x1E28, unicodeslot=0x1E29, }, @@ -52182,8 +53392,8 @@ characters.data={ direction="l", lccode=0x1E2B, linebreak="al", - shcode=0x0048, - specials={ "char", 0x0048, 0x032E }, + shcode=0x48, + specials={ "char", 0x48, 0x32E }, unicodeslot=0x1E2A, }, [0x1E2B]={ @@ -52192,8 +53402,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH BREVE BELOW", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x032E }, + shcode=0x68, + specials={ "char", 0x68, 0x32E }, uccode=0x1E2A, unicodeslot=0x1E2B, }, @@ -52204,8 +53414,8 @@ characters.data={ direction="l", lccode=0x1E2D, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0330 }, + shcode=0x49, + specials={ "char", 0x49, 0x330 }, unicodeslot=0x1E2C, }, [0x1E2D]={ @@ -52214,8 +53424,8 @@ characters.data={ description="LATIN SMALL LETTER I WITH TILDE BELOW", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0330 }, + shcode=0x69, + specials={ "char", 0x69, 0x330 }, uccode=0x1E2C, unicodeslot=0x1E2D, }, @@ -52226,8 +53436,8 @@ characters.data={ direction="l", lccode=0x1E2F, linebreak="al", - shcode=0x0049, - specials={ "char", 0x00CF, 0x0301 }, + shcode=0x49, + specials={ "char", 0xCF, 0x301 }, unicodeslot=0x1E2E, }, [0x1E2F]={ @@ -52236,8 +53446,8 @@ characters.data={ description="LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x00EF, 0x0301 }, + shcode=0x69, + specials={ "char", 0xEF, 0x301 }, uccode=0x1E2E, unicodeslot=0x1E2F, }, @@ -52248,8 +53458,8 @@ characters.data={ direction="l", lccode=0x1E31, linebreak="al", - shcode=0x004B, - specials={ "char", 0x004B, 0x0301 }, + shcode=0x4B, + specials={ "char", 0x4B, 0x301 }, unicodeslot=0x1E30, }, [0x1E31]={ @@ -52258,8 +53468,8 @@ characters.data={ description="LATIN SMALL LETTER K WITH ACUTE", direction="l", linebreak="al", - shcode=0x006B, - specials={ "char", 0x006B, 0x0301 }, + shcode=0x6B, + specials={ "char", 0x6B, 0x301 }, uccode=0x1E30, unicodeslot=0x1E31, }, @@ -52270,8 +53480,8 @@ characters.data={ direction="l", lccode=0x1E33, linebreak="al", - shcode=0x004B, - specials={ "char", 0x004B, 0x0323 }, + shcode=0x4B, + specials={ "char", 0x4B, 0x323 }, unicodeslot=0x1E32, }, [0x1E33]={ @@ -52280,8 +53490,8 @@ characters.data={ description="LATIN SMALL LETTER K WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x006B, - specials={ "char", 0x006B, 0x0323 }, + shcode=0x6B, + specials={ "char", 0x6B, 0x323 }, uccode=0x1E32, unicodeslot=0x1E33, }, @@ -52292,8 +53502,8 @@ characters.data={ direction="l", lccode=0x1E35, linebreak="al", - shcode=0x004B, - specials={ "char", 0x004B, 0x0331 }, + shcode=0x4B, + specials={ "char", 0x4B, 0x331 }, unicodeslot=0x1E34, }, [0x1E35]={ @@ -52302,8 +53512,8 @@ characters.data={ description="LATIN SMALL LETTER K WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x006B, - specials={ "char", 0x006B, 0x0331 }, + shcode=0x6B, + specials={ "char", 0x6B, 0x331 }, uccode=0x1E34, unicodeslot=0x1E35, }, @@ -52314,8 +53524,8 @@ characters.data={ direction="l", lccode=0x1E37, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x0323 }, + shcode=0x4C, + specials={ "char", 0x4C, 0x323 }, unicodeslot=0x1E36, }, [0x1E37]={ @@ -52324,8 +53534,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x0323 }, + shcode=0x6C, + specials={ "char", 0x6C, 0x323 }, uccode=0x1E36, unicodeslot=0x1E37, }, @@ -52336,8 +53546,8 @@ characters.data={ direction="l", lccode=0x1E39, linebreak="al", - shcode=0x004C, - specials={ "char", 0x1E36, 0x0304 }, + shcode=0x4C, + specials={ "char", 0x1E36, 0x304 }, unicodeslot=0x1E38, }, [0x1E39]={ @@ -52346,8 +53556,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH DOT BELOW AND MACRON", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x1E37, 0x0304 }, + shcode=0x6C, + specials={ "char", 0x1E37, 0x304 }, uccode=0x1E38, unicodeslot=0x1E39, }, @@ -52358,8 +53568,8 @@ characters.data={ direction="l", lccode=0x1E3B, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x0331 }, + shcode=0x4C, + specials={ "char", 0x4C, 0x331 }, unicodeslot=0x1E3A, }, [0x1E3B]={ @@ -52368,8 +53578,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x0331 }, + shcode=0x6C, + specials={ "char", 0x6C, 0x331 }, uccode=0x1E3A, unicodeslot=0x1E3B, }, @@ -52380,8 +53590,8 @@ characters.data={ direction="l", lccode=0x1E3D, linebreak="al", - shcode=0x004C, - specials={ "char", 0x004C, 0x032D }, + shcode=0x4C, + specials={ "char", 0x4C, 0x32D }, unicodeslot=0x1E3C, }, [0x1E3D]={ @@ -52390,8 +53600,8 @@ characters.data={ description="LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x006C, - specials={ "char", 0x006C, 0x032D }, + shcode=0x6C, + specials={ "char", 0x6C, 0x32D }, uccode=0x1E3C, unicodeslot=0x1E3D, }, @@ -52402,8 +53612,8 @@ characters.data={ direction="l", lccode=0x1E3F, linebreak="al", - shcode=0x004D, - specials={ "char", 0x004D, 0x0301 }, + shcode=0x4D, + specials={ "char", 0x4D, 0x301 }, unicodeslot=0x1E3E, }, [0x1E3F]={ @@ -52412,8 +53622,8 @@ characters.data={ description="LATIN SMALL LETTER M WITH ACUTE", direction="l", linebreak="al", - shcode=0x006D, - specials={ "char", 0x006D, 0x0301 }, + shcode=0x6D, + specials={ "char", 0x6D, 0x301 }, uccode=0x1E3E, unicodeslot=0x1E3F, }, @@ -52424,8 +53634,8 @@ characters.data={ direction="l", lccode=0x1E41, linebreak="al", - shcode=0x004D, - specials={ "char", 0x004D, 0x0307 }, + shcode=0x4D, + specials={ "char", 0x4D, 0x307 }, unicodeslot=0x1E40, }, [0x1E41]={ @@ -52434,8 +53644,8 @@ characters.data={ description="LATIN SMALL LETTER M WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x006D, - specials={ "char", 0x006D, 0x0307 }, + shcode=0x6D, + specials={ "char", 0x6D, 0x307 }, uccode=0x1E40, unicodeslot=0x1E41, }, @@ -52446,8 +53656,8 @@ characters.data={ direction="l", lccode=0x1E43, linebreak="al", - shcode=0x004D, - specials={ "char", 0x004D, 0x0323 }, + shcode=0x4D, + specials={ "char", 0x4D, 0x323 }, unicodeslot=0x1E42, }, [0x1E43]={ @@ -52456,8 +53666,8 @@ characters.data={ description="LATIN SMALL LETTER M WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x006D, - specials={ "char", 0x006D, 0x0323 }, + shcode=0x6D, + specials={ "char", 0x6D, 0x323 }, uccode=0x1E42, unicodeslot=0x1E43, }, @@ -52468,8 +53678,8 @@ characters.data={ direction="l", lccode=0x1E45, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0307 }, + shcode=0x4E, + specials={ "char", 0x4E, 0x307 }, unicodeslot=0x1E44, }, [0x1E45]={ @@ -52478,8 +53688,8 @@ characters.data={ description="LATIN SMALL LETTER N WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0307 }, + shcode=0x6E, + specials={ "char", 0x6E, 0x307 }, uccode=0x1E44, unicodeslot=0x1E45, }, @@ -52490,8 +53700,8 @@ characters.data={ direction="l", lccode=0x1E47, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0323 }, + shcode=0x4E, + specials={ "char", 0x4E, 0x323 }, unicodeslot=0x1E46, }, [0x1E47]={ @@ -52500,8 +53710,8 @@ characters.data={ description="LATIN SMALL LETTER N WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0323 }, + shcode=0x6E, + specials={ "char", 0x6E, 0x323 }, uccode=0x1E46, unicodeslot=0x1E47, }, @@ -52512,8 +53722,8 @@ characters.data={ direction="l", lccode=0x1E49, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x0331 }, + shcode=0x4E, + specials={ "char", 0x4E, 0x331 }, unicodeslot=0x1E48, }, [0x1E49]={ @@ -52522,8 +53732,8 @@ characters.data={ description="LATIN SMALL LETTER N WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x0331 }, + shcode=0x6E, + specials={ "char", 0x6E, 0x331 }, uccode=0x1E48, unicodeslot=0x1E49, }, @@ -52534,8 +53744,8 @@ characters.data={ direction="l", lccode=0x1E4B, linebreak="al", - shcode=0x004E, - specials={ "char", 0x004E, 0x032D }, + shcode=0x4E, + specials={ "char", 0x4E, 0x32D }, unicodeslot=0x1E4A, }, [0x1E4B]={ @@ -52544,8 +53754,8 @@ characters.data={ description="LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x006E, - specials={ "char", 0x006E, 0x032D }, + shcode=0x6E, + specials={ "char", 0x6E, 0x32D }, uccode=0x1E4A, unicodeslot=0x1E4B, }, @@ -52556,8 +53766,8 @@ characters.data={ direction="l", lccode=0x1E4D, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D5, 0x0301 }, + shcode=0x4F, + specials={ "char", 0xD5, 0x301 }, unicodeslot=0x1E4C, }, [0x1E4D]={ @@ -52566,8 +53776,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH TILDE AND ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F5, 0x0301 }, + shcode=0x6F, + specials={ "char", 0xF5, 0x301 }, uccode=0x1E4C, unicodeslot=0x1E4D, }, @@ -52578,8 +53788,8 @@ characters.data={ direction="l", lccode=0x1E4F, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D5, 0x0308 }, + shcode=0x4F, + specials={ "char", 0xD5, 0x308 }, unicodeslot=0x1E4E, }, [0x1E4F]={ @@ -52588,8 +53798,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH TILDE AND DIAERESIS", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F5, 0x0308 }, + shcode=0x6F, + specials={ "char", 0xF5, 0x308 }, uccode=0x1E4E, unicodeslot=0x1E4F, }, @@ -52600,8 +53810,8 @@ characters.data={ direction="l", lccode=0x1E51, linebreak="al", - shcode=0x004F, - specials={ "char", 0x014C, 0x0300 }, + shcode=0x4F, + specials={ "char", 0x14C, 0x300 }, unicodeslot=0x1E50, }, [0x1E51]={ @@ -52610,8 +53820,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH MACRON AND GRAVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x014D, 0x0300 }, + shcode=0x6F, + specials={ "char", 0x14D, 0x300 }, uccode=0x1E50, unicodeslot=0x1E51, }, @@ -52622,8 +53832,8 @@ characters.data={ direction="l", lccode=0x1E53, linebreak="al", - shcode=0x004F, - specials={ "char", 0x014C, 0x0301 }, + shcode=0x4F, + specials={ "char", 0x14C, 0x301 }, unicodeslot=0x1E52, }, [0x1E53]={ @@ -52632,8 +53842,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH MACRON AND ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x014D, 0x0301 }, + shcode=0x6F, + specials={ "char", 0x14D, 0x301 }, uccode=0x1E52, unicodeslot=0x1E53, }, @@ -52644,8 +53854,8 @@ characters.data={ direction="l", lccode=0x1E55, linebreak="al", - shcode=0x0050, - specials={ "char", 0x0050, 0x0301 }, + shcode=0x50, + specials={ "char", 0x50, 0x301 }, unicodeslot=0x1E54, }, [0x1E55]={ @@ -52654,8 +53864,8 @@ characters.data={ description="LATIN SMALL LETTER P WITH ACUTE", direction="l", linebreak="al", - shcode=0x0070, - specials={ "char", 0x0070, 0x0301 }, + shcode=0x70, + specials={ "char", 0x70, 0x301 }, uccode=0x1E54, unicodeslot=0x1E55, }, @@ -52666,8 +53876,8 @@ characters.data={ direction="l", lccode=0x1E57, linebreak="al", - shcode=0x0050, - specials={ "char", 0x0050, 0x0307 }, + shcode=0x50, + specials={ "char", 0x50, 0x307 }, unicodeslot=0x1E56, }, [0x1E57]={ @@ -52676,8 +53886,8 @@ characters.data={ description="LATIN SMALL LETTER P WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0070, - specials={ "char", 0x0070, 0x0307 }, + shcode=0x70, + specials={ "char", 0x70, 0x307 }, uccode=0x1E56, unicodeslot=0x1E57, }, @@ -52688,8 +53898,8 @@ characters.data={ direction="l", lccode=0x1E59, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0307 }, + shcode=0x52, + specials={ "char", 0x52, 0x307 }, unicodeslot=0x1E58, }, [0x1E59]={ @@ -52698,8 +53908,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0307 }, + shcode=0x72, + specials={ "char", 0x72, 0x307 }, uccode=0x1E58, unicodeslot=0x1E59, }, @@ -52710,8 +53920,8 @@ characters.data={ direction="l", lccode=0x1E5B, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0323 }, + shcode=0x52, + specials={ "char", 0x52, 0x323 }, unicodeslot=0x1E5A, }, [0x1E5B]={ @@ -52720,8 +53930,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0323 }, + shcode=0x72, + specials={ "char", 0x72, 0x323 }, uccode=0x1E5A, unicodeslot=0x1E5B, }, @@ -52732,8 +53942,8 @@ characters.data={ direction="l", lccode=0x1E5D, linebreak="al", - shcode=0x0052, - specials={ "char", 0x1E5A, 0x0304 }, + shcode=0x52, + specials={ "char", 0x1E5A, 0x304 }, unicodeslot=0x1E5C, }, [0x1E5D]={ @@ -52742,8 +53952,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH DOT BELOW AND MACRON", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x1E5B, 0x0304 }, + shcode=0x72, + specials={ "char", 0x1E5B, 0x304 }, uccode=0x1E5C, unicodeslot=0x1E5D, }, @@ -52754,8 +53964,8 @@ characters.data={ direction="l", lccode=0x1E5F, linebreak="al", - shcode=0x0052, - specials={ "char", 0x0052, 0x0331 }, + shcode=0x52, + specials={ "char", 0x52, 0x331 }, unicodeslot=0x1E5E, }, [0x1E5F]={ @@ -52764,8 +53974,8 @@ characters.data={ description="LATIN SMALL LETTER R WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x0072, - specials={ "char", 0x0072, 0x0331 }, + shcode=0x72, + specials={ "char", 0x72, 0x331 }, uccode=0x1E5E, unicodeslot=0x1E5F, }, @@ -52776,8 +53986,8 @@ characters.data={ direction="l", lccode=0x1E61, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0307 }, + shcode=0x53, + specials={ "char", 0x53, 0x307 }, unicodeslot=0x1E60, }, [0x1E61]={ @@ -52786,8 +53996,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0307 }, + shcode=0x73, + specials={ "char", 0x73, 0x307 }, uccode=0x1E60, unicodeslot=0x1E61, }, @@ -52798,8 +54008,8 @@ characters.data={ direction="l", lccode=0x1E63, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0053, 0x0323 }, + shcode=0x53, + specials={ "char", 0x53, 0x323 }, unicodeslot=0x1E62, }, [0x1E63]={ @@ -52808,8 +54018,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0073, 0x0323 }, + shcode=0x73, + specials={ "char", 0x73, 0x323 }, uccode=0x1E62, unicodeslot=0x1E63, }, @@ -52820,8 +54030,8 @@ characters.data={ direction="l", lccode=0x1E65, linebreak="al", - shcode=0x0053, - specials={ "char", 0x015A, 0x0307 }, + shcode=0x53, + specials={ "char", 0x15A, 0x307 }, unicodeslot=0x1E64, }, [0x1E65]={ @@ -52830,8 +54040,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x015B, 0x0307 }, + shcode=0x73, + specials={ "char", 0x15B, 0x307 }, uccode=0x1E64, unicodeslot=0x1E65, }, @@ -52842,8 +54052,8 @@ characters.data={ direction="l", lccode=0x1E67, linebreak="al", - shcode=0x0053, - specials={ "char", 0x0160, 0x0307 }, + shcode=0x53, + specials={ "char", 0x160, 0x307 }, unicodeslot=0x1E66, }, [0x1E67]={ @@ -52852,8 +54062,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH CARON AND DOT ABOVE", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x0161, 0x0307 }, + shcode=0x73, + specials={ "char", 0x161, 0x307 }, uccode=0x1E66, unicodeslot=0x1E67, }, @@ -52864,8 +54074,8 @@ characters.data={ direction="l", lccode=0x1E69, linebreak="al", - shcode=0x0053, - specials={ "char", 0x1E62, 0x0307 }, + shcode=0x53, + specials={ "char", 0x1E62, 0x307 }, unicodeslot=0x1E68, }, [0x1E69]={ @@ -52874,8 +54084,8 @@ characters.data={ description="LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE", direction="l", linebreak="al", - shcode=0x0073, - specials={ "char", 0x1E63, 0x0307 }, + shcode=0x73, + specials={ "char", 0x1E63, 0x307 }, uccode=0x1E68, unicodeslot=0x1E69, }, @@ -52886,8 +54096,8 @@ characters.data={ direction="l", lccode=0x1E6B, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x0307 }, + shcode=0x54, + specials={ "char", 0x54, 0x307 }, unicodeslot=0x1E6A, }, [0x1E6B]={ @@ -52896,8 +54106,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0307 }, + shcode=0x74, + specials={ "char", 0x74, 0x307 }, uccode=0x1E6A, unicodeslot=0x1E6B, }, @@ -52908,8 +54118,8 @@ characters.data={ direction="l", lccode=0x1E6D, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x0323 }, + shcode=0x54, + specials={ "char", 0x54, 0x323 }, unicodeslot=0x1E6C, }, [0x1E6D]={ @@ -52918,8 +54128,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0323 }, + shcode=0x74, + specials={ "char", 0x74, 0x323 }, uccode=0x1E6C, unicodeslot=0x1E6D, }, @@ -52930,8 +54140,8 @@ characters.data={ direction="l", lccode=0x1E6F, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x0331 }, + shcode=0x54, + specials={ "char", 0x54, 0x331 }, unicodeslot=0x1E6E, }, [0x1E6F]={ @@ -52940,8 +54150,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0331 }, + shcode=0x74, + specials={ "char", 0x74, 0x331 }, uccode=0x1E6E, unicodeslot=0x1E6F, }, @@ -52952,8 +54162,8 @@ characters.data={ direction="l", lccode=0x1E71, linebreak="al", - shcode=0x0054, - specials={ "char", 0x0054, 0x032D }, + shcode=0x54, + specials={ "char", 0x54, 0x32D }, unicodeslot=0x1E70, }, [0x1E71]={ @@ -52962,8 +54172,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x032D }, + shcode=0x74, + specials={ "char", 0x74, 0x32D }, uccode=0x1E70, unicodeslot=0x1E71, }, @@ -52974,8 +54184,8 @@ characters.data={ direction="l", lccode=0x1E73, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0324 }, + shcode=0x55, + specials={ "char", 0x55, 0x324 }, unicodeslot=0x1E72, }, [0x1E73]={ @@ -52984,8 +54194,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH DIAERESIS BELOW", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0324 }, + shcode=0x75, + specials={ "char", 0x75, 0x324 }, uccode=0x1E72, unicodeslot=0x1E73, }, @@ -52996,8 +54206,8 @@ characters.data={ direction="l", lccode=0x1E75, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0330 }, + shcode=0x55, + specials={ "char", 0x55, 0x330 }, unicodeslot=0x1E74, }, [0x1E75]={ @@ -53006,8 +54216,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH TILDE BELOW", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0330 }, + shcode=0x75, + specials={ "char", 0x75, 0x330 }, uccode=0x1E74, unicodeslot=0x1E75, }, @@ -53018,8 +54228,8 @@ characters.data={ direction="l", lccode=0x1E77, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x032D }, + shcode=0x55, + specials={ "char", 0x55, 0x32D }, unicodeslot=0x1E76, }, [0x1E77]={ @@ -53028,8 +54238,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x032D }, + shcode=0x75, + specials={ "char", 0x75, 0x32D }, uccode=0x1E76, unicodeslot=0x1E77, }, @@ -53040,8 +54250,8 @@ characters.data={ direction="l", lccode=0x1E79, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0168, 0x0301 }, + shcode=0x55, + specials={ "char", 0x168, 0x301 }, unicodeslot=0x1E78, }, [0x1E79]={ @@ -53050,8 +54260,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH TILDE AND ACUTE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0169, 0x0301 }, + shcode=0x75, + specials={ "char", 0x169, 0x301 }, uccode=0x1E78, unicodeslot=0x1E79, }, @@ -53062,8 +54272,8 @@ characters.data={ direction="l", lccode=0x1E7B, linebreak="al", - shcode=0x0055, - specials={ "char", 0x016A, 0x0308 }, + shcode=0x55, + specials={ "char", 0x16A, 0x308 }, unicodeslot=0x1E7A, }, [0x1E7B]={ @@ -53072,8 +54282,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH MACRON AND DIAERESIS", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x016B, 0x0308 }, + shcode=0x75, + specials={ "char", 0x16B, 0x308 }, uccode=0x1E7A, unicodeslot=0x1E7B, }, @@ -53084,8 +54294,8 @@ characters.data={ direction="l", lccode=0x1E7D, linebreak="al", - shcode=0x0056, - specials={ "char", 0x0056, 0x0303 }, + shcode=0x56, + specials={ "char", 0x56, 0x303 }, unicodeslot=0x1E7C, }, [0x1E7D]={ @@ -53094,8 +54304,8 @@ characters.data={ description="LATIN SMALL LETTER V WITH TILDE", direction="l", linebreak="al", - shcode=0x0076, - specials={ "char", 0x0076, 0x0303 }, + shcode=0x76, + specials={ "char", 0x76, 0x303 }, uccode=0x1E7C, unicodeslot=0x1E7D, }, @@ -53106,8 +54316,8 @@ characters.data={ direction="l", lccode=0x1E7F, linebreak="al", - shcode=0x0056, - specials={ "char", 0x0056, 0x0323 }, + shcode=0x56, + specials={ "char", 0x56, 0x323 }, unicodeslot=0x1E7E, }, [0x1E7F]={ @@ -53116,8 +54326,8 @@ characters.data={ description="LATIN SMALL LETTER V WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0076, - specials={ "char", 0x0076, 0x0323 }, + shcode=0x76, + specials={ "char", 0x76, 0x323 }, uccode=0x1E7E, unicodeslot=0x1E7F, }, @@ -53128,8 +54338,8 @@ characters.data={ direction="l", lccode=0x1E81, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0300 }, + shcode=0x57, + specials={ "char", 0x57, 0x300 }, unicodeslot=0x1E80, }, [0x1E81]={ @@ -53138,8 +54348,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH GRAVE", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0300 }, + shcode=0x77, + specials={ "char", 0x77, 0x300 }, uccode=0x1E80, unicodeslot=0x1E81, }, @@ -53150,8 +54360,8 @@ characters.data={ direction="l", lccode=0x1E83, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0301 }, + shcode=0x57, + specials={ "char", 0x57, 0x301 }, unicodeslot=0x1E82, }, [0x1E83]={ @@ -53160,8 +54370,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH ACUTE", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0301 }, + shcode=0x77, + specials={ "char", 0x77, 0x301 }, uccode=0x1E82, unicodeslot=0x1E83, }, @@ -53172,8 +54382,8 @@ characters.data={ direction="l", lccode=0x1E85, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0308 }, + shcode=0x57, + specials={ "char", 0x57, 0x308 }, unicodeslot=0x1E84, }, [0x1E85]={ @@ -53182,8 +54392,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0308 }, + shcode=0x77, + specials={ "char", 0x77, 0x308 }, uccode=0x1E84, unicodeslot=0x1E85, }, @@ -53194,8 +54404,8 @@ characters.data={ direction="l", lccode=0x1E87, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0307 }, + shcode=0x57, + specials={ "char", 0x57, 0x307 }, unicodeslot=0x1E86, }, [0x1E87]={ @@ -53204,8 +54414,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0307 }, + shcode=0x77, + specials={ "char", 0x77, 0x307 }, uccode=0x1E86, unicodeslot=0x1E87, }, @@ -53216,8 +54426,8 @@ characters.data={ direction="l", lccode=0x1E89, linebreak="al", - shcode=0x0057, - specials={ "char", 0x0057, 0x0323 }, + shcode=0x57, + specials={ "char", 0x57, 0x323 }, unicodeslot=0x1E88, }, [0x1E89]={ @@ -53226,8 +54436,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x0323 }, + shcode=0x77, + specials={ "char", 0x77, 0x323 }, uccode=0x1E88, unicodeslot=0x1E89, }, @@ -53238,8 +54448,8 @@ characters.data={ direction="l", lccode=0x1E8B, linebreak="al", - shcode=0x0058, - specials={ "char", 0x0058, 0x0307 }, + shcode=0x58, + specials={ "char", 0x58, 0x307 }, unicodeslot=0x1E8A, }, [0x1E8B]={ @@ -53248,8 +54458,8 @@ characters.data={ description="LATIN SMALL LETTER X WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0078, - specials={ "char", 0x0078, 0x0307 }, + shcode=0x78, + specials={ "char", 0x78, 0x307 }, uccode=0x1E8A, unicodeslot=0x1E8B, }, @@ -53260,8 +54470,8 @@ characters.data={ direction="l", lccode=0x1E8D, linebreak="al", - shcode=0x0058, - specials={ "char", 0x0058, 0x0308 }, + shcode=0x58, + specials={ "char", 0x58, 0x308 }, unicodeslot=0x1E8C, }, [0x1E8D]={ @@ -53270,8 +54480,8 @@ characters.data={ description="LATIN SMALL LETTER X WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0078, - specials={ "char", 0x0078, 0x0308 }, + shcode=0x78, + specials={ "char", 0x78, 0x308 }, uccode=0x1E8C, unicodeslot=0x1E8D, }, @@ -53282,8 +54492,8 @@ characters.data={ direction="l", lccode=0x1E8F, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0307 }, + shcode=0x59, + specials={ "char", 0x59, 0x307 }, unicodeslot=0x1E8E, }, [0x1E8F]={ @@ -53292,8 +54502,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH DOT ABOVE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0307 }, + shcode=0x79, + specials={ "char", 0x79, 0x307 }, uccode=0x1E8E, unicodeslot=0x1E8F, }, @@ -53304,8 +54514,8 @@ characters.data={ direction="l", lccode=0x1E91, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x0302 }, + shcode=0x5A, + specials={ "char", 0x5A, 0x302 }, unicodeslot=0x1E90, }, [0x1E91]={ @@ -53314,8 +54524,8 @@ characters.data={ description="LATIN SMALL LETTER Z WITH CIRCUMFLEX", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x0302 }, + shcode=0x7A, + specials={ "char", 0x7A, 0x302 }, uccode=0x1E90, unicodeslot=0x1E91, }, @@ -53326,8 +54536,8 @@ characters.data={ direction="l", lccode=0x1E93, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x0323 }, + shcode=0x5A, + specials={ "char", 0x5A, 0x323 }, unicodeslot=0x1E92, }, [0x1E93]={ @@ -53336,8 +54546,8 @@ characters.data={ description="LATIN SMALL LETTER Z WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x0323 }, + shcode=0x7A, + specials={ "char", 0x7A, 0x323 }, uccode=0x1E92, unicodeslot=0x1E93, }, @@ -53348,8 +54558,8 @@ characters.data={ direction="l", lccode=0x1E95, linebreak="al", - shcode=0x005A, - specials={ "char", 0x005A, 0x0331 }, + shcode=0x5A, + specials={ "char", 0x5A, 0x331 }, unicodeslot=0x1E94, }, [0x1E95]={ @@ -53358,8 +54568,8 @@ characters.data={ description="LATIN SMALL LETTER Z WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x007A, - specials={ "char", 0x007A, 0x0331 }, + shcode=0x7A, + specials={ "char", 0x7A, 0x331 }, uccode=0x1E94, unicodeslot=0x1E95, }, @@ -53369,8 +54579,8 @@ characters.data={ description="LATIN SMALL LETTER H WITH LINE BELOW", direction="l", linebreak="al", - shcode=0x0068, - specials={ "char", 0x0068, 0x0331 }, + shcode=0x68, + specials={ "char", 0x68, 0x331 }, unicodeslot=0x1E96, }, [0x1E97]={ @@ -53379,8 +54589,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH DIAERESIS", direction="l", linebreak="al", - shcode=0x0074, - specials={ "char", 0x0074, 0x0308 }, + shcode=0x74, + specials={ "char", 0x74, 0x308 }, unicodeslot=0x1E97, }, [0x1E98]={ @@ -53389,8 +54599,8 @@ characters.data={ description="LATIN SMALL LETTER W WITH RING ABOVE", direction="l", linebreak="al", - shcode=0x0077, - specials={ "char", 0x0077, 0x030A }, + shcode=0x77, + specials={ "char", 0x77, 0x30A }, unicodeslot=0x1E98, }, [0x1E99]={ @@ -53399,8 +54609,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH RING ABOVE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x030A }, + shcode=0x79, + specials={ "char", 0x79, 0x30A }, unicodeslot=0x1E99, }, [0x1E9A]={ @@ -53409,8 +54619,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH RIGHT HALF RING", direction="l", linebreak="al", - shcode=0x0061, - specials={ "compat", 0x0061, 0x02BE }, + shcode=0x61, + specials={ "compat", 0x61, 0x2BE }, unicodeslot=0x1E9A, }, [0x1E9B]={ @@ -53419,7 +54629,7 @@ characters.data={ description="LATIN SMALL LETTER LONG S WITH DOT ABOVE", direction="l", linebreak="al", - specials={ "char", 0x017F, 0x0307 }, + specials={ "char", 0x17F, 0x307 }, uccode=0x1E60, unicodeslot=0x1E9B, }, @@ -53459,8 +54669,8 @@ characters.data={ direction="l", lccode=0x1EA1, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0323 }, + shcode=0x41, + specials={ "char", 0x41, 0x323 }, unicodeslot=0x1EA0, }, [0x1EA1]={ @@ -53470,8 +54680,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0323 }, + shcode=0x61, + specials={ "char", 0x61, 0x323 }, uccode=0x1EA0, unicodeslot=0x1EA1, }, @@ -53483,8 +54693,8 @@ characters.data={ direction="l", lccode=0x1EA3, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0041, 0x0309 }, + shcode=0x41, + specials={ "char", 0x41, 0x309 }, unicodeslot=0x1EA2, }, [0x1EA3]={ @@ -53494,8 +54704,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0061, 0x0309 }, + shcode=0x61, + specials={ "char", 0x61, 0x309 }, uccode=0x1EA2, unicodeslot=0x1EA3, }, @@ -53507,8 +54717,8 @@ characters.data={ direction="l", lccode=0x1EA5, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C2, 0x0301 }, + shcode=0x41, + specials={ "char", 0xC2, 0x301 }, unicodeslot=0x1EA4, }, [0x1EA5]={ @@ -53518,8 +54728,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E2, 0x0301 }, + shcode=0x61, + specials={ "char", 0xE2, 0x301 }, uccode=0x1EA4, unicodeslot=0x1EA5, }, @@ -53531,8 +54741,8 @@ characters.data={ direction="l", lccode=0x1EA7, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C2, 0x0300 }, + shcode=0x41, + specials={ "char", 0xC2, 0x300 }, unicodeslot=0x1EA6, }, [0x1EA7]={ @@ -53542,8 +54752,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E2, 0x0300 }, + shcode=0x61, + specials={ "char", 0xE2, 0x300 }, uccode=0x1EA6, unicodeslot=0x1EA7, }, @@ -53555,8 +54765,8 @@ characters.data={ direction="l", lccode=0x1EA9, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C2, 0x0309 }, + shcode=0x41, + specials={ "char", 0xC2, 0x309 }, unicodeslot=0x1EA8, }, [0x1EA9]={ @@ -53566,8 +54776,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E2, 0x0309 }, + shcode=0x61, + specials={ "char", 0xE2, 0x309 }, uccode=0x1EA8, unicodeslot=0x1EA9, }, @@ -53579,8 +54789,8 @@ characters.data={ direction="l", lccode=0x1EAB, linebreak="al", - shcode=0x0041, - specials={ "char", 0x00C2, 0x0303 }, + shcode=0x41, + specials={ "char", 0xC2, 0x303 }, unicodeslot=0x1EAA, }, [0x1EAB]={ @@ -53590,8 +54800,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x00E2, 0x0303 }, + shcode=0x61, + specials={ "char", 0xE2, 0x303 }, uccode=0x1EAA, unicodeslot=0x1EAB, }, @@ -53603,8 +54813,8 @@ characters.data={ direction="l", lccode=0x1EAD, linebreak="al", - shcode=0x0041, - specials={ "char", 0x1EA0, 0x0302 }, + shcode=0x41, + specials={ "char", 0x1EA0, 0x302 }, unicodeslot=0x1EAC, }, [0x1EAD]={ @@ -53614,8 +54824,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x1EA1, 0x0302 }, + shcode=0x61, + specials={ "char", 0x1EA1, 0x302 }, uccode=0x1EAC, unicodeslot=0x1EAD, }, @@ -53627,8 +54837,8 @@ characters.data={ direction="l", lccode=0x1EAF, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0102, 0x0301 }, + shcode=0x41, + specials={ "char", 0x102, 0x301 }, unicodeslot=0x1EAE, }, [0x1EAF]={ @@ -53638,8 +54848,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE AND ACUTE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0103, 0x0301 }, + shcode=0x61, + specials={ "char", 0x103, 0x301 }, uccode=0x1EAE, unicodeslot=0x1EAF, }, @@ -53651,8 +54861,8 @@ characters.data={ direction="l", lccode=0x1EB1, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0102, 0x0300 }, + shcode=0x41, + specials={ "char", 0x102, 0x300 }, unicodeslot=0x1EB0, }, [0x1EB1]={ @@ -53662,8 +54872,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE AND GRAVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0103, 0x0300 }, + shcode=0x61, + specials={ "char", 0x103, 0x300 }, uccode=0x1EB0, unicodeslot=0x1EB1, }, @@ -53675,8 +54885,8 @@ characters.data={ direction="l", lccode=0x1EB3, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0102, 0x0309 }, + shcode=0x41, + specials={ "char", 0x102, 0x309 }, unicodeslot=0x1EB2, }, [0x1EB3]={ @@ -53686,8 +54896,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0103, 0x0309 }, + shcode=0x61, + specials={ "char", 0x103, 0x309 }, uccode=0x1EB2, unicodeslot=0x1EB3, }, @@ -53699,8 +54909,8 @@ characters.data={ direction="l", lccode=0x1EB5, linebreak="al", - shcode=0x0041, - specials={ "char", 0x0102, 0x0303 }, + shcode=0x41, + specials={ "char", 0x102, 0x303 }, unicodeslot=0x1EB4, }, [0x1EB5]={ @@ -53710,8 +54920,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE AND TILDE", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x0103, 0x0303 }, + shcode=0x61, + specials={ "char", 0x103, 0x303 }, uccode=0x1EB4, unicodeslot=0x1EB5, }, @@ -53723,8 +54933,8 @@ characters.data={ direction="l", lccode=0x1EB7, linebreak="al", - shcode=0x0041, - specials={ "char", 0x1EA0, 0x0306 }, + shcode=0x41, + specials={ "char", 0x1EA0, 0x306 }, unicodeslot=0x1EB6, }, [0x1EB7]={ @@ -53734,8 +54944,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH BREVE AND DOT BELOW", direction="l", linebreak="al", - shcode=0x0061, - specials={ "char", 0x1EA1, 0x0306 }, + shcode=0x61, + specials={ "char", 0x1EA1, 0x306 }, uccode=0x1EB6, unicodeslot=0x1EB7, }, @@ -53747,8 +54957,8 @@ characters.data={ direction="l", lccode=0x1EB9, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0323 }, + shcode=0x45, + specials={ "char", 0x45, 0x323 }, unicodeslot=0x1EB8, }, [0x1EB9]={ @@ -53758,8 +54968,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0323 }, + shcode=0x65, + specials={ "char", 0x65, 0x323 }, uccode=0x1EB8, unicodeslot=0x1EB9, }, @@ -53771,8 +54981,8 @@ characters.data={ direction="l", lccode=0x1EBB, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0309 }, + shcode=0x45, + specials={ "char", 0x45, 0x309 }, unicodeslot=0x1EBA, }, [0x1EBB]={ @@ -53782,8 +54992,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0309 }, + shcode=0x65, + specials={ "char", 0x65, 0x309 }, uccode=0x1EBA, unicodeslot=0x1EBB, }, @@ -53795,8 +55005,8 @@ characters.data={ direction="l", lccode=0x1EBD, linebreak="al", - shcode=0x0045, - specials={ "char", 0x0045, 0x0303 }, + shcode=0x45, + specials={ "char", 0x45, 0x303 }, unicodeslot=0x1EBC, }, [0x1EBD]={ @@ -53806,8 +55016,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH TILDE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x0065, 0x0303 }, + shcode=0x65, + specials={ "char", 0x65, 0x303 }, uccode=0x1EBC, unicodeslot=0x1EBD, }, @@ -53819,8 +55029,8 @@ characters.data={ direction="l", lccode=0x1EBF, linebreak="al", - shcode=0x0045, - specials={ "char", 0x00CA, 0x0301 }, + shcode=0x45, + specials={ "char", 0xCA, 0x301 }, unicodeslot=0x1EBE, }, [0x1EBF]={ @@ -53830,8 +55040,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x00EA, 0x0301 }, + shcode=0x65, + specials={ "char", 0xEA, 0x301 }, uccode=0x1EBE, unicodeslot=0x1EBF, }, @@ -53843,8 +55053,8 @@ characters.data={ direction="l", lccode=0x1EC1, linebreak="al", - shcode=0x0045, - specials={ "char", 0x00CA, 0x0300 }, + shcode=0x45, + specials={ "char", 0xCA, 0x300 }, unicodeslot=0x1EC0, }, [0x1EC1]={ @@ -53854,8 +55064,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x00EA, 0x0300 }, + shcode=0x65, + specials={ "char", 0xEA, 0x300 }, uccode=0x1EC0, unicodeslot=0x1EC1, }, @@ -53867,8 +55077,8 @@ characters.data={ direction="l", lccode=0x1EC3, linebreak="al", - shcode=0x0045, - specials={ "char", 0x00CA, 0x0309 }, + shcode=0x45, + specials={ "char", 0xCA, 0x309 }, unicodeslot=0x1EC2, }, [0x1EC3]={ @@ -53878,8 +55088,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x00EA, 0x0309 }, + shcode=0x65, + specials={ "char", 0xEA, 0x309 }, uccode=0x1EC2, unicodeslot=0x1EC3, }, @@ -53891,8 +55101,8 @@ characters.data={ direction="l", lccode=0x1EC5, linebreak="al", - shcode=0x0045, - specials={ "char", 0x00CA, 0x0303 }, + shcode=0x45, + specials={ "char", 0xCA, 0x303 }, unicodeslot=0x1EC4, }, [0x1EC5]={ @@ -53902,8 +55112,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x00EA, 0x0303 }, + shcode=0x65, + specials={ "char", 0xEA, 0x303 }, uccode=0x1EC4, unicodeslot=0x1EC5, }, @@ -53915,8 +55125,8 @@ characters.data={ direction="l", lccode=0x1EC7, linebreak="al", - shcode=0x0045, - specials={ "char", 0x1EB8, 0x0302 }, + shcode=0x45, + specials={ "char", 0x1EB8, 0x302 }, unicodeslot=0x1EC6, }, [0x1EC7]={ @@ -53926,8 +55136,8 @@ characters.data={ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW", direction="l", linebreak="al", - shcode=0x0065, - specials={ "char", 0x1EB9, 0x0302 }, + shcode=0x65, + specials={ "char", 0x1EB9, 0x302 }, uccode=0x1EC6, unicodeslot=0x1EC7, }, @@ -53939,8 +55149,8 @@ characters.data={ direction="l", lccode=0x1EC9, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0309 }, + shcode=0x49, + specials={ "char", 0x49, 0x309 }, unicodeslot=0x1EC8, }, [0x1EC9]={ @@ -53950,8 +55160,8 @@ characters.data={ description="LATIN SMALL LETTER I WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0309 }, + shcode=0x69, + specials={ "char", 0x69, 0x309 }, uccode=0x1EC8, unicodeslot=0x1EC9, }, @@ -53963,8 +55173,8 @@ characters.data={ direction="l", lccode=0x1ECB, linebreak="al", - shcode=0x0049, - specials={ "char", 0x0049, 0x0323 }, + shcode=0x49, + specials={ "char", 0x49, 0x323 }, unicodeslot=0x1ECA, }, [0x1ECB]={ @@ -53974,8 +55184,8 @@ characters.data={ description="LATIN SMALL LETTER I WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0069, - specials={ "char", 0x0069, 0x0323 }, + shcode=0x69, + specials={ "char", 0x69, 0x323 }, uccode=0x1ECA, unicodeslot=0x1ECB, }, @@ -53987,8 +55197,8 @@ characters.data={ direction="l", lccode=0x1ECD, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0323 }, + shcode=0x4F, + specials={ "char", 0x4F, 0x323 }, unicodeslot=0x1ECC, }, [0x1ECD]={ @@ -53998,8 +55208,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0323 }, + shcode=0x6F, + specials={ "char", 0x6F, 0x323 }, uccode=0x1ECC, unicodeslot=0x1ECD, }, @@ -54011,8 +55221,8 @@ characters.data={ direction="l", lccode=0x1ECF, linebreak="al", - shcode=0x004F, - specials={ "char", 0x004F, 0x0309 }, + shcode=0x4F, + specials={ "char", 0x4F, 0x309 }, unicodeslot=0x1ECE, }, [0x1ECF]={ @@ -54022,8 +55232,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x006F, 0x0309 }, + shcode=0x6F, + specials={ "char", 0x6F, 0x309 }, uccode=0x1ECE, unicodeslot=0x1ECF, }, @@ -54035,8 +55245,8 @@ characters.data={ direction="l", lccode=0x1ED1, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D4, 0x0301 }, + shcode=0x4F, + specials={ "char", 0xD4, 0x301 }, unicodeslot=0x1ED0, }, [0x1ED1]={ @@ -54046,8 +55256,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F4, 0x0301 }, + shcode=0x6F, + specials={ "char", 0xF4, 0x301 }, uccode=0x1ED0, unicodeslot=0x1ED1, }, @@ -54059,8 +55269,8 @@ characters.data={ direction="l", lccode=0x1ED3, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D4, 0x0300 }, + shcode=0x4F, + specials={ "char", 0xD4, 0x300 }, unicodeslot=0x1ED2, }, [0x1ED3]={ @@ -54070,8 +55280,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F4, 0x0300 }, + shcode=0x6F, + specials={ "char", 0xF4, 0x300 }, uccode=0x1ED2, unicodeslot=0x1ED3, }, @@ -54083,8 +55293,8 @@ characters.data={ direction="l", lccode=0x1ED5, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D4, 0x0309 }, + shcode=0x4F, + specials={ "char", 0xD4, 0x309 }, unicodeslot=0x1ED4, }, [0x1ED5]={ @@ -54094,8 +55304,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F4, 0x0309 }, + shcode=0x6F, + specials={ "char", 0xF4, 0x309 }, uccode=0x1ED4, unicodeslot=0x1ED5, }, @@ -54107,8 +55317,8 @@ characters.data={ direction="l", lccode=0x1ED7, linebreak="al", - shcode=0x004F, - specials={ "char", 0x00D4, 0x0303 }, + shcode=0x4F, + specials={ "char", 0xD4, 0x303 }, unicodeslot=0x1ED6, }, [0x1ED7]={ @@ -54118,8 +55328,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x00F4, 0x0303 }, + shcode=0x6F, + specials={ "char", 0xF4, 0x303 }, uccode=0x1ED6, unicodeslot=0x1ED7, }, @@ -54131,8 +55341,8 @@ characters.data={ direction="l", lccode=0x1ED9, linebreak="al", - shcode=0x004F, - specials={ "char", 0x1ECC, 0x0302 }, + shcode=0x4F, + specials={ "char", 0x1ECC, 0x302 }, unicodeslot=0x1ED8, }, [0x1ED9]={ @@ -54142,8 +55352,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x1ECD, 0x0302 }, + shcode=0x6F, + specials={ "char", 0x1ECD, 0x302 }, uccode=0x1ED8, unicodeslot=0x1ED9, }, @@ -54155,8 +55365,8 @@ characters.data={ direction="l", lccode=0x1EDB, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01A0, 0x0301 }, + shcode=0x4F, + specials={ "char", 0x1A0, 0x301 }, unicodeslot=0x1EDA, }, [0x1EDB]={ @@ -54166,8 +55376,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN AND ACUTE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01A1, 0x0301 }, + shcode=0x6F, + specials={ "char", 0x1A1, 0x301 }, uccode=0x1EDA, unicodeslot=0x1EDB, }, @@ -54179,8 +55389,8 @@ characters.data={ direction="l", lccode=0x1EDD, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01A0, 0x0300 }, + shcode=0x4F, + specials={ "char", 0x1A0, 0x300 }, unicodeslot=0x1EDC, }, [0x1EDD]={ @@ -54190,8 +55400,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN AND GRAVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01A1, 0x0300 }, + shcode=0x6F, + specials={ "char", 0x1A1, 0x300 }, uccode=0x1EDC, unicodeslot=0x1EDD, }, @@ -54203,8 +55413,8 @@ characters.data={ direction="l", lccode=0x1EDF, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01A0, 0x0309 }, + shcode=0x4F, + specials={ "char", 0x1A0, 0x309 }, unicodeslot=0x1EDE, }, [0x1EDF]={ @@ -54214,8 +55424,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01A1, 0x0309 }, + shcode=0x6F, + specials={ "char", 0x1A1, 0x309 }, uccode=0x1EDE, unicodeslot=0x1EDF, }, @@ -54227,8 +55437,8 @@ characters.data={ direction="l", lccode=0x1EE1, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01A0, 0x0303 }, + shcode=0x4F, + specials={ "char", 0x1A0, 0x303 }, unicodeslot=0x1EE0, }, [0x1EE1]={ @@ -54238,8 +55448,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN AND TILDE", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01A1, 0x0303 }, + shcode=0x6F, + specials={ "char", 0x1A1, 0x303 }, uccode=0x1EE0, unicodeslot=0x1EE1, }, @@ -54251,8 +55461,8 @@ characters.data={ direction="l", lccode=0x1EE3, linebreak="al", - shcode=0x004F, - specials={ "char", 0x01A0, 0x0323 }, + shcode=0x4F, + specials={ "char", 0x1A0, 0x323 }, unicodeslot=0x1EE2, }, [0x1EE3]={ @@ -54262,8 +55472,8 @@ characters.data={ description="LATIN SMALL LETTER O WITH HORN AND DOT BELOW", direction="l", linebreak="al", - shcode=0x006F, - specials={ "char", 0x01A1, 0x0323 }, + shcode=0x6F, + specials={ "char", 0x1A1, 0x323 }, uccode=0x1EE2, unicodeslot=0x1EE3, }, @@ -54275,8 +55485,8 @@ characters.data={ direction="l", lccode=0x1EE5, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0323 }, + shcode=0x55, + specials={ "char", 0x55, 0x323 }, unicodeslot=0x1EE4, }, [0x1EE5]={ @@ -54286,8 +55496,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0323 }, + shcode=0x75, + specials={ "char", 0x75, 0x323 }, uccode=0x1EE4, unicodeslot=0x1EE5, }, @@ -54299,8 +55509,8 @@ characters.data={ direction="l", lccode=0x1EE7, linebreak="al", - shcode=0x0055, - specials={ "char", 0x0055, 0x0309 }, + shcode=0x55, + specials={ "char", 0x55, 0x309 }, unicodeslot=0x1EE6, }, [0x1EE7]={ @@ -54310,8 +55520,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x0075, 0x0309 }, + shcode=0x75, + specials={ "char", 0x75, 0x309 }, uccode=0x1EE6, unicodeslot=0x1EE7, }, @@ -54323,8 +55533,8 @@ characters.data={ direction="l", lccode=0x1EE9, linebreak="al", - shcode=0x0055, - specials={ "char", 0x01AF, 0x0301 }, + shcode=0x55, + specials={ "char", 0x1AF, 0x301 }, unicodeslot=0x1EE8, }, [0x1EE9]={ @@ -54334,8 +55544,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN AND ACUTE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x01B0, 0x0301 }, + shcode=0x75, + specials={ "char", 0x1B0, 0x301 }, uccode=0x1EE8, unicodeslot=0x1EE9, }, @@ -54347,8 +55557,8 @@ characters.data={ direction="l", lccode=0x1EEB, linebreak="al", - shcode=0x0055, - specials={ "char", 0x01AF, 0x0300 }, + shcode=0x55, + specials={ "char", 0x1AF, 0x300 }, unicodeslot=0x1EEA, }, [0x1EEB]={ @@ -54358,8 +55568,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN AND GRAVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x01B0, 0x0300 }, + shcode=0x75, + specials={ "char", 0x1B0, 0x300 }, uccode=0x1EEA, unicodeslot=0x1EEB, }, @@ -54371,8 +55581,8 @@ characters.data={ direction="l", lccode=0x1EED, linebreak="al", - shcode=0x0055, - specials={ "char", 0x01AF, 0x0309 }, + shcode=0x55, + specials={ "char", 0x1AF, 0x309 }, unicodeslot=0x1EEC, }, [0x1EED]={ @@ -54382,8 +55592,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x01B0, 0x0309 }, + shcode=0x75, + specials={ "char", 0x1B0, 0x309 }, uccode=0x1EEC, unicodeslot=0x1EED, }, @@ -54395,8 +55605,8 @@ characters.data={ direction="l", lccode=0x1EEF, linebreak="al", - shcode=0x0055, - specials={ "char", 0x01AF, 0x0303 }, + shcode=0x55, + specials={ "char", 0x1AF, 0x303 }, unicodeslot=0x1EEE, }, [0x1EEF]={ @@ -54406,8 +55616,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN AND TILDE", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x01B0, 0x0303 }, + shcode=0x75, + specials={ "char", 0x1B0, 0x303 }, uccode=0x1EEE, unicodeslot=0x1EEF, }, @@ -54419,8 +55629,8 @@ characters.data={ direction="l", lccode=0x1EF1, linebreak="al", - shcode=0x0055, - specials={ "char", 0x01AF, 0x0323 }, + shcode=0x55, + specials={ "char", 0x1AF, 0x323 }, unicodeslot=0x1EF0, }, [0x1EF1]={ @@ -54430,8 +55640,8 @@ characters.data={ description="LATIN SMALL LETTER U WITH HORN AND DOT BELOW", direction="l", linebreak="al", - shcode=0x0075, - specials={ "char", 0x01B0, 0x0323 }, + shcode=0x75, + specials={ "char", 0x1B0, 0x323 }, uccode=0x1EF0, unicodeslot=0x1EF1, }, @@ -54443,8 +55653,8 @@ characters.data={ direction="l", lccode=0x1EF3, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0300 }, + shcode=0x59, + specials={ "char", 0x59, 0x300 }, unicodeslot=0x1EF2, }, [0x1EF3]={ @@ -54454,8 +55664,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH GRAVE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0300 }, + shcode=0x79, + specials={ "char", 0x79, 0x300 }, uccode=0x1EF2, unicodeslot=0x1EF3, }, @@ -54467,8 +55677,8 @@ characters.data={ direction="l", lccode=0x1EF5, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0323 }, + shcode=0x59, + specials={ "char", 0x59, 0x323 }, unicodeslot=0x1EF4, }, [0x1EF5]={ @@ -54478,8 +55688,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH DOT BELOW", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0323 }, + shcode=0x79, + specials={ "char", 0x79, 0x323 }, uccode=0x1EF4, unicodeslot=0x1EF5, }, @@ -54491,8 +55701,8 @@ characters.data={ direction="l", lccode=0x1EF7, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0309 }, + shcode=0x59, + specials={ "char", 0x59, 0x309 }, unicodeslot=0x1EF6, }, [0x1EF7]={ @@ -54502,8 +55712,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH HOOK ABOVE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0309 }, + shcode=0x79, + specials={ "char", 0x79, 0x309 }, uccode=0x1EF6, unicodeslot=0x1EF7, }, @@ -54515,8 +55725,8 @@ characters.data={ direction="l", lccode=0x1EF9, linebreak="al", - shcode=0x0059, - specials={ "char", 0x0059, 0x0303 }, + shcode=0x59, + specials={ "char", 0x59, 0x303 }, unicodeslot=0x1EF8, }, [0x1EF9]={ @@ -54526,8 +55736,8 @@ characters.data={ description="LATIN SMALL LETTER Y WITH TILDE", direction="l", linebreak="al", - shcode=0x0079, - specials={ "char", 0x0079, 0x0303 }, + shcode=0x79, + specials={ "char", 0x79, 0x303 }, uccode=0x1EF8, unicodeslot=0x1EF9, }, @@ -54579,8 +55789,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0313 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x313 }, uccode=0x1F08, unicodeslot=0x1F00, }, @@ -54590,8 +55800,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0314 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x314 }, uccode=0x1F09, unicodeslot=0x1F01, }, @@ -54601,8 +55811,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F00, 0x0300 }, + shcode=0x3B1, + specials={ "char", 0x1F00, 0x300 }, uccode=0x1F0A, unicodeslot=0x1F02, }, @@ -54612,8 +55822,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F01, 0x0300 }, + shcode=0x3B1, + specials={ "char", 0x1F01, 0x300 }, uccode=0x1F0B, unicodeslot=0x1F03, }, @@ -54623,8 +55833,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F00, 0x0301 }, + shcode=0x3B1, + specials={ "char", 0x1F00, 0x301 }, uccode=0x1F0C, unicodeslot=0x1F04, }, @@ -54634,8 +55844,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F01, 0x0301 }, + shcode=0x3B1, + specials={ "char", 0x1F01, 0x301 }, uccode=0x1F0D, unicodeslot=0x1F05, }, @@ -54645,8 +55855,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F00, 0x0342 }, + shcode=0x3B1, + specials={ "char", 0x1F00, 0x342 }, uccode=0x1F0E, unicodeslot=0x1F06, }, @@ -54656,8 +55866,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F01, 0x0342 }, + shcode=0x3B1, + specials={ "char", 0x1F01, 0x342 }, uccode=0x1F0F, unicodeslot=0x1F07, }, @@ -54668,8 +55878,8 @@ characters.data={ direction="l", lccode=0x1F00, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0313 }, + shcode=0x391, + specials={ "char", 0x391, 0x313 }, unicodeslot=0x1F08, }, [0x1F09]={ @@ -54679,8 +55889,8 @@ characters.data={ direction="l", lccode=0x1F01, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0314 }, + shcode=0x391, + specials={ "char", 0x391, 0x314 }, unicodeslot=0x1F09, }, [0x1F0A]={ @@ -54690,8 +55900,8 @@ characters.data={ direction="l", lccode=0x1F02, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F08, 0x0300 }, + shcode=0x391, + specials={ "char", 0x1F08, 0x300 }, unicodeslot=0x1F0A, }, [0x1F0B]={ @@ -54701,8 +55911,8 @@ characters.data={ direction="l", lccode=0x1F03, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F09, 0x0300 }, + shcode=0x391, + specials={ "char", 0x1F09, 0x300 }, unicodeslot=0x1F0B, }, [0x1F0C]={ @@ -54712,8 +55922,8 @@ characters.data={ direction="l", lccode=0x1F04, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F08, 0x0301 }, + shcode=0x391, + specials={ "char", 0x1F08, 0x301 }, unicodeslot=0x1F0C, }, [0x1F0D]={ @@ -54723,8 +55933,8 @@ characters.data={ direction="l", lccode=0x1F05, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F09, 0x0301 }, + shcode=0x391, + specials={ "char", 0x1F09, 0x301 }, unicodeslot=0x1F0D, }, [0x1F0E]={ @@ -54734,8 +55944,8 @@ characters.data={ direction="l", lccode=0x1F06, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F08, 0x0342 }, + shcode=0x391, + specials={ "char", 0x1F08, 0x342 }, unicodeslot=0x1F0E, }, [0x1F0F]={ @@ -54745,8 +55955,8 @@ characters.data={ direction="l", lccode=0x1F07, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F09, 0x0342 }, + shcode=0x391, + specials={ "char", 0x1F09, 0x342 }, unicodeslot=0x1F0F, }, [0x1F10]={ @@ -54755,8 +55965,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH PSILI", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x03B5, 0x0313 }, + shcode=0x3B5, + specials={ "char", 0x3B5, 0x313 }, uccode=0x1F18, unicodeslot=0x1F10, }, @@ -54766,8 +55976,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH DASIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x03B5, 0x0314 }, + shcode=0x3B5, + specials={ "char", 0x3B5, 0x314 }, uccode=0x1F19, unicodeslot=0x1F11, }, @@ -54777,8 +55987,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x1F10, 0x0300 }, + shcode=0x3B5, + specials={ "char", 0x1F10, 0x300 }, uccode=0x1F1A, unicodeslot=0x1F12, }, @@ -54788,8 +55998,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x1F11, 0x0300 }, + shcode=0x3B5, + specials={ "char", 0x1F11, 0x300 }, uccode=0x1F1B, unicodeslot=0x1F13, }, @@ -54799,8 +56009,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x1F10, 0x0301 }, + shcode=0x3B5, + specials={ "char", 0x1F10, 0x301 }, uccode=0x1F1C, unicodeslot=0x1F14, }, @@ -54810,8 +56020,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x1F11, 0x0301 }, + shcode=0x3B5, + specials={ "char", 0x1F11, 0x301 }, uccode=0x1F1D, unicodeslot=0x1F15, }, @@ -54822,8 +56032,8 @@ characters.data={ direction="l", lccode=0x1F10, linebreak="al", - shcode=0x0395, - specials={ "char", 0x0395, 0x0313 }, + shcode=0x395, + specials={ "char", 0x395, 0x313 }, unicodeslot=0x1F18, }, [0x1F19]={ @@ -54833,8 +56043,8 @@ characters.data={ direction="l", lccode=0x1F11, linebreak="al", - shcode=0x0395, - specials={ "char", 0x0395, 0x0314 }, + shcode=0x395, + specials={ "char", 0x395, 0x314 }, unicodeslot=0x1F19, }, [0x1F1A]={ @@ -54844,8 +56054,8 @@ characters.data={ direction="l", lccode=0x1F12, linebreak="al", - shcode=0x0395, - specials={ "char", 0x1F18, 0x0300 }, + shcode=0x395, + specials={ "char", 0x1F18, 0x300 }, unicodeslot=0x1F1A, }, [0x1F1B]={ @@ -54855,8 +56065,8 @@ characters.data={ direction="l", lccode=0x1F13, linebreak="al", - shcode=0x0395, - specials={ "char", 0x1F19, 0x0300 }, + shcode=0x395, + specials={ "char", 0x1F19, 0x300 }, unicodeslot=0x1F1B, }, [0x1F1C]={ @@ -54866,8 +56076,8 @@ characters.data={ direction="l", lccode=0x1F14, linebreak="al", - shcode=0x0395, - specials={ "char", 0x1F18, 0x0301 }, + shcode=0x395, + specials={ "char", 0x1F18, 0x301 }, unicodeslot=0x1F1C, }, [0x1F1D]={ @@ -54877,8 +56087,8 @@ characters.data={ direction="l", lccode=0x1F15, linebreak="al", - shcode=0x0395, - specials={ "char", 0x1F19, 0x0301 }, + shcode=0x395, + specials={ "char", 0x1F19, 0x301 }, unicodeslot=0x1F1D, }, [0x1F20]={ @@ -54887,8 +56097,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0313 }, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x313 }, uccode=0x1F28, unicodeslot=0x1F20, }, @@ -54898,8 +56108,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0314 }, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x314 }, uccode=0x1F29, unicodeslot=0x1F21, }, @@ -54909,8 +56119,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F20, 0x0300 }, + shcode=0x3B7, + specials={ "char", 0x1F20, 0x300 }, uccode=0x1F2A, unicodeslot=0x1F22, }, @@ -54920,8 +56130,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F21, 0x0300 }, + shcode=0x3B7, + specials={ "char", 0x1F21, 0x300 }, uccode=0x1F2B, unicodeslot=0x1F23, }, @@ -54931,8 +56141,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F20, 0x0301 }, + shcode=0x3B7, + specials={ "char", 0x1F20, 0x301 }, uccode=0x1F2C, unicodeslot=0x1F24, }, @@ -54942,8 +56152,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F21, 0x0301 }, + shcode=0x3B7, + specials={ "char", 0x1F21, 0x301 }, uccode=0x1F2D, unicodeslot=0x1F25, }, @@ -54953,8 +56163,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F20, 0x0342 }, + shcode=0x3B7, + specials={ "char", 0x1F20, 0x342 }, uccode=0x1F2E, unicodeslot=0x1F26, }, @@ -54964,8 +56174,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F21, 0x0342 }, + shcode=0x3B7, + specials={ "char", 0x1F21, 0x342 }, uccode=0x1F2F, unicodeslot=0x1F27, }, @@ -54976,8 +56186,8 @@ characters.data={ direction="l", lccode=0x1F20, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0397, 0x0313 }, + shcode=0x397, + specials={ "char", 0x397, 0x313 }, unicodeslot=0x1F28, }, [0x1F29]={ @@ -54987,8 +56197,8 @@ characters.data={ direction="l", lccode=0x1F21, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0397, 0x0314 }, + shcode=0x397, + specials={ "char", 0x397, 0x314 }, unicodeslot=0x1F29, }, [0x1F2A]={ @@ -54998,8 +56208,8 @@ characters.data={ direction="l", lccode=0x1F22, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F28, 0x0300 }, + shcode=0x397, + specials={ "char", 0x1F28, 0x300 }, unicodeslot=0x1F2A, }, [0x1F2B]={ @@ -55009,8 +56219,8 @@ characters.data={ direction="l", lccode=0x1F23, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F29, 0x0300 }, + shcode=0x397, + specials={ "char", 0x1F29, 0x300 }, unicodeslot=0x1F2B, }, [0x1F2C]={ @@ -55020,8 +56230,8 @@ characters.data={ direction="l", lccode=0x1F24, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F28, 0x0301 }, + shcode=0x397, + specials={ "char", 0x1F28, 0x301 }, unicodeslot=0x1F2C, }, [0x1F2D]={ @@ -55031,8 +56241,8 @@ characters.data={ direction="l", lccode=0x1F25, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F29, 0x0301 }, + shcode=0x397, + specials={ "char", 0x1F29, 0x301 }, unicodeslot=0x1F2D, }, [0x1F2E]={ @@ -55042,8 +56252,8 @@ characters.data={ direction="l", lccode=0x1F26, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F28, 0x0342 }, + shcode=0x397, + specials={ "char", 0x1F28, 0x342 }, unicodeslot=0x1F2E, }, [0x1F2F]={ @@ -55053,8 +56263,8 @@ characters.data={ direction="l", lccode=0x1F27, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F29, 0x0342 }, + shcode=0x397, + specials={ "char", 0x1F29, 0x342 }, unicodeslot=0x1F2F, }, [0x1F30]={ @@ -55063,8 +56273,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH PSILI", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0313 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x313 }, uccode=0x1F38, unicodeslot=0x1F30, }, @@ -55074,8 +56284,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DASIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0314 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x314 }, uccode=0x1F39, unicodeslot=0x1F31, }, @@ -55085,8 +56295,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F30, 0x0300 }, + shcode=0x3B9, + specials={ "char", 0x1F30, 0x300 }, uccode=0x1F3A, unicodeslot=0x1F32, }, @@ -55096,8 +56306,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F31, 0x0300 }, + shcode=0x3B9, + specials={ "char", 0x1F31, 0x300 }, uccode=0x1F3B, unicodeslot=0x1F33, }, @@ -55107,8 +56317,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F30, 0x0301 }, + shcode=0x3B9, + specials={ "char", 0x1F30, 0x301 }, uccode=0x1F3C, unicodeslot=0x1F34, }, @@ -55118,8 +56328,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F31, 0x0301 }, + shcode=0x3B9, + specials={ "char", 0x1F31, 0x301 }, uccode=0x1F3D, unicodeslot=0x1F35, }, @@ -55129,8 +56339,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F30, 0x0342 }, + shcode=0x3B9, + specials={ "char", 0x1F30, 0x342 }, uccode=0x1F3E, unicodeslot=0x1F36, }, @@ -55140,8 +56350,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x1F31, 0x0342 }, + shcode=0x3B9, + specials={ "char", 0x1F31, 0x342 }, uccode=0x1F3F, unicodeslot=0x1F37, }, @@ -55152,8 +56362,8 @@ characters.data={ direction="l", lccode=0x1F30, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0313 }, + shcode=0x399, + specials={ "char", 0x399, 0x313 }, unicodeslot=0x1F38, }, [0x1F39]={ @@ -55163,8 +56373,8 @@ characters.data={ direction="l", lccode=0x1F31, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0314 }, + shcode=0x399, + specials={ "char", 0x399, 0x314 }, unicodeslot=0x1F39, }, [0x1F3A]={ @@ -55174,8 +56384,8 @@ characters.data={ direction="l", lccode=0x1F32, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F38, 0x0300 }, + shcode=0x399, + specials={ "char", 0x1F38, 0x300 }, unicodeslot=0x1F3A, }, [0x1F3B]={ @@ -55185,8 +56395,8 @@ characters.data={ direction="l", lccode=0x1F33, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F39, 0x0300 }, + shcode=0x399, + specials={ "char", 0x1F39, 0x300 }, unicodeslot=0x1F3B, }, [0x1F3C]={ @@ -55196,8 +56406,8 @@ characters.data={ direction="l", lccode=0x1F34, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F38, 0x0301 }, + shcode=0x399, + specials={ "char", 0x1F38, 0x301 }, unicodeslot=0x1F3C, }, [0x1F3D]={ @@ -55207,8 +56417,8 @@ characters.data={ direction="l", lccode=0x1F35, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F39, 0x0301 }, + shcode=0x399, + specials={ "char", 0x1F39, 0x301 }, unicodeslot=0x1F3D, }, [0x1F3E]={ @@ -55218,8 +56428,8 @@ characters.data={ direction="l", lccode=0x1F36, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F38, 0x0342 }, + shcode=0x399, + specials={ "char", 0x1F38, 0x342 }, unicodeslot=0x1F3E, }, [0x1F3F]={ @@ -55229,8 +56439,8 @@ characters.data={ direction="l", lccode=0x1F37, linebreak="al", - shcode=0x0399, - specials={ "char", 0x1F39, 0x0342 }, + shcode=0x399, + specials={ "char", 0x1F39, 0x342 }, unicodeslot=0x1F3F, }, [0x1F40]={ @@ -55239,8 +56449,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH PSILI", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x03BF, 0x0313 }, + shcode=0x3BF, + specials={ "char", 0x3BF, 0x313 }, uccode=0x1F48, unicodeslot=0x1F40, }, @@ -55250,8 +56460,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH DASIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x03BF, 0x0314 }, + shcode=0x3BF, + specials={ "char", 0x3BF, 0x314 }, uccode=0x1F49, unicodeslot=0x1F41, }, @@ -55261,8 +56471,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x1F40, 0x0300 }, + shcode=0x3BF, + specials={ "char", 0x1F40, 0x300 }, uccode=0x1F4A, unicodeslot=0x1F42, }, @@ -55272,8 +56482,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x1F41, 0x0300 }, + shcode=0x3BF, + specials={ "char", 0x1F41, 0x300 }, uccode=0x1F4B, unicodeslot=0x1F43, }, @@ -55283,8 +56493,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x1F40, 0x0301 }, + shcode=0x3BF, + specials={ "char", 0x1F40, 0x301 }, uccode=0x1F4C, unicodeslot=0x1F44, }, @@ -55294,8 +56504,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x1F41, 0x0301 }, + shcode=0x3BF, + specials={ "char", 0x1F41, 0x301 }, uccode=0x1F4D, unicodeslot=0x1F45, }, @@ -55306,8 +56516,8 @@ characters.data={ direction="l", lccode=0x1F40, linebreak="al", - shcode=0x039F, - specials={ "char", 0x039F, 0x0313 }, + shcode=0x39F, + specials={ "char", 0x39F, 0x313 }, unicodeslot=0x1F48, }, [0x1F49]={ @@ -55317,8 +56527,8 @@ characters.data={ direction="l", lccode=0x1F41, linebreak="al", - shcode=0x039F, - specials={ "char", 0x039F, 0x0314 }, + shcode=0x39F, + specials={ "char", 0x39F, 0x314 }, unicodeslot=0x1F49, }, [0x1F4A]={ @@ -55328,8 +56538,8 @@ characters.data={ direction="l", lccode=0x1F42, linebreak="al", - shcode=0x039F, - specials={ "char", 0x1F48, 0x0300 }, + shcode=0x39F, + specials={ "char", 0x1F48, 0x300 }, unicodeslot=0x1F4A, }, [0x1F4B]={ @@ -55339,8 +56549,8 @@ characters.data={ direction="l", lccode=0x1F43, linebreak="al", - shcode=0x039F, - specials={ "char", 0x1F49, 0x0300 }, + shcode=0x39F, + specials={ "char", 0x1F49, 0x300 }, unicodeslot=0x1F4B, }, [0x1F4C]={ @@ -55350,8 +56560,8 @@ characters.data={ direction="l", lccode=0x1F44, linebreak="al", - shcode=0x039F, - specials={ "char", 0x1F48, 0x0301 }, + shcode=0x39F, + specials={ "char", 0x1F48, 0x301 }, unicodeslot=0x1F4C, }, [0x1F4D]={ @@ -55361,8 +56571,8 @@ characters.data={ direction="l", lccode=0x1F45, linebreak="al", - shcode=0x039F, - specials={ "char", 0x1F49, 0x0301 }, + shcode=0x39F, + specials={ "char", 0x1F49, 0x301 }, unicodeslot=0x1F4D, }, [0x1F50]={ @@ -55371,8 +56581,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH PSILI", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0313 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x313 }, unicodeslot=0x1F50, }, [0x1F51]={ @@ -55381,8 +56591,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DASIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0314 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x314 }, uccode=0x1F59, unicodeslot=0x1F51, }, @@ -55392,8 +56602,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F50, 0x0300 }, + shcode=0x3C5, + specials={ "char", 0x1F50, 0x300 }, unicodeslot=0x1F52, }, [0x1F53]={ @@ -55402,8 +56612,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F51, 0x0300 }, + shcode=0x3C5, + specials={ "char", 0x1F51, 0x300 }, uccode=0x1F5B, unicodeslot=0x1F53, }, @@ -55413,8 +56623,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F50, 0x0301 }, + shcode=0x3C5, + specials={ "char", 0x1F50, 0x301 }, unicodeslot=0x1F54, }, [0x1F55]={ @@ -55423,8 +56633,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F51, 0x0301 }, + shcode=0x3C5, + specials={ "char", 0x1F51, 0x301 }, uccode=0x1F5D, unicodeslot=0x1F55, }, @@ -55434,8 +56644,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F50, 0x0342 }, + shcode=0x3C5, + specials={ "char", 0x1F50, 0x342 }, unicodeslot=0x1F56, }, [0x1F57]={ @@ -55444,8 +56654,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x1F51, 0x0342 }, + shcode=0x3C5, + specials={ "char", 0x1F51, 0x342 }, uccode=0x1F5F, unicodeslot=0x1F57, }, @@ -55456,8 +56666,8 @@ characters.data={ direction="l", lccode=0x1F51, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0314 }, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x314 }, unicodeslot=0x1F59, }, [0x1F5B]={ @@ -55467,8 +56677,8 @@ characters.data={ direction="l", lccode=0x1F53, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x1F59, 0x0300 }, + shcode=0x3A5, + specials={ "char", 0x1F59, 0x300 }, unicodeslot=0x1F5B, }, [0x1F5D]={ @@ -55478,8 +56688,8 @@ characters.data={ direction="l", lccode=0x1F55, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x1F59, 0x0301 }, + shcode=0x3A5, + specials={ "char", 0x1F59, 0x301 }, unicodeslot=0x1F5D, }, [0x1F5F]={ @@ -55489,8 +56699,8 @@ characters.data={ direction="l", lccode=0x1F57, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x1F59, 0x0342 }, + shcode=0x3A5, + specials={ "char", 0x1F59, 0x342 }, unicodeslot=0x1F5F, }, [0x1F60]={ @@ -55499,8 +56709,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0313 }, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x313 }, uccode=0x1F68, unicodeslot=0x1F60, }, @@ -55510,8 +56720,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0314 }, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x314 }, uccode=0x1F69, unicodeslot=0x1F61, }, @@ -55521,8 +56731,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F60, 0x0300 }, + shcode=0x3C9, + specials={ "char", 0x1F60, 0x300 }, uccode=0x1F6A, unicodeslot=0x1F62, }, @@ -55532,8 +56742,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F61, 0x0300 }, + shcode=0x3C9, + specials={ "char", 0x1F61, 0x300 }, uccode=0x1F6B, unicodeslot=0x1F63, }, @@ -55543,8 +56753,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F60, 0x0301 }, + shcode=0x3C9, + specials={ "char", 0x1F60, 0x301 }, uccode=0x1F6C, unicodeslot=0x1F64, }, @@ -55554,8 +56764,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F61, 0x0301 }, + shcode=0x3C9, + specials={ "char", 0x1F61, 0x301 }, uccode=0x1F6D, unicodeslot=0x1F65, }, @@ -55565,8 +56775,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F60, 0x0342 }, + shcode=0x3C9, + specials={ "char", 0x1F60, 0x342 }, uccode=0x1F6E, unicodeslot=0x1F66, }, @@ -55576,8 +56786,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F61, 0x0342 }, + shcode=0x3C9, + specials={ "char", 0x1F61, 0x342 }, uccode=0x1F6F, unicodeslot=0x1F67, }, @@ -55588,8 +56798,8 @@ characters.data={ direction="l", lccode=0x1F60, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x03A9, 0x0313 }, + shcode=0x3A9, + specials={ "char", 0x3A9, 0x313 }, unicodeslot=0x1F68, }, [0x1F69]={ @@ -55599,8 +56809,8 @@ characters.data={ direction="l", lccode=0x1F61, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x03A9, 0x0314 }, + shcode=0x3A9, + specials={ "char", 0x3A9, 0x314 }, unicodeslot=0x1F69, }, [0x1F6A]={ @@ -55610,8 +56820,8 @@ characters.data={ direction="l", lccode=0x1F62, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F68, 0x0300 }, + shcode=0x3A9, + specials={ "char", 0x1F68, 0x300 }, unicodeslot=0x1F6A, }, [0x1F6B]={ @@ -55621,8 +56831,8 @@ characters.data={ direction="l", lccode=0x1F63, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F69, 0x0300 }, + shcode=0x3A9, + specials={ "char", 0x1F69, 0x300 }, unicodeslot=0x1F6B, }, [0x1F6C]={ @@ -55632,8 +56842,8 @@ characters.data={ direction="l", lccode=0x1F64, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F68, 0x0301 }, + shcode=0x3A9, + specials={ "char", 0x1F68, 0x301 }, unicodeslot=0x1F6C, }, [0x1F6D]={ @@ -55643,8 +56853,8 @@ characters.data={ direction="l", lccode=0x1F65, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F69, 0x0301 }, + shcode=0x3A9, + specials={ "char", 0x1F69, 0x301 }, unicodeslot=0x1F6D, }, [0x1F6E]={ @@ -55654,8 +56864,8 @@ characters.data={ direction="l", lccode=0x1F66, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F68, 0x0342 }, + shcode=0x3A9, + specials={ "char", 0x1F68, 0x342 }, unicodeslot=0x1F6E, }, [0x1F6F]={ @@ -55665,8 +56875,8 @@ characters.data={ direction="l", lccode=0x1F67, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F69, 0x0342 }, + shcode=0x3A9, + specials={ "char", 0x1F69, 0x342 }, unicodeslot=0x1F6F, }, [0x1F70]={ @@ -55675,8 +56885,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH VARIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0300 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x300 }, uccode=0x1FBA, unicodeslot=0x1F70, }, @@ -55686,8 +56896,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH OXIA", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03AC }, + shcode=0x3B1, + specials={ "char", 0x3AC }, uccode=0x1FBB, unicodeslot=0x1F71, }, @@ -55697,8 +56907,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH VARIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x03B5, 0x0300 }, + shcode=0x3B5, + specials={ "char", 0x3B5, 0x300 }, uccode=0x1FC8, unicodeslot=0x1F72, }, @@ -55708,8 +56918,8 @@ characters.data={ description="GREEK SMALL LETTER EPSILON WITH OXIA", direction="l", linebreak="al", - shcode=0x03B5, - specials={ "char", 0x03AD }, + shcode=0x3B5, + specials={ "char", 0x3AD }, uccode=0x1FC9, unicodeslot=0x1F73, }, @@ -55719,8 +56929,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH VARIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0300 }, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x300 }, uccode=0x1FCA, unicodeslot=0x1F74, }, @@ -55730,8 +56940,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH OXIA", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03AE }, + shcode=0x3B7, + specials={ "char", 0x3AE }, uccode=0x1FCB, unicodeslot=0x1F75, }, @@ -55741,8 +56951,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH VARIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0300 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x300 }, uccode=0x1FDA, unicodeslot=0x1F76, }, @@ -55752,8 +56962,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH OXIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03AF }, + shcode=0x3B9, + specials={ "char", 0x3AF }, uccode=0x1FDB, unicodeslot=0x1F77, }, @@ -55763,8 +56973,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH VARIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x03BF, 0x0300 }, + shcode=0x3BF, + specials={ "char", 0x3BF, 0x300 }, uccode=0x1FF8, unicodeslot=0x1F78, }, @@ -55774,8 +56984,8 @@ characters.data={ description="GREEK SMALL LETTER OMICRON WITH OXIA", direction="l", linebreak="al", - shcode=0x03BF, - specials={ "char", 0x03CC }, + shcode=0x3BF, + specials={ "char", 0x3CC }, uccode=0x1FF9, unicodeslot=0x1F79, }, @@ -55785,8 +56995,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH VARIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0300 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x300 }, uccode=0x1FEA, unicodeslot=0x1F7A, }, @@ -55796,8 +57006,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH OXIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03CD }, + shcode=0x3C5, + specials={ "char", 0x3CD }, uccode=0x1FEB, unicodeslot=0x1F7B, }, @@ -55807,8 +57017,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH VARIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0300 }, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x300 }, uccode=0x1FFA, unicodeslot=0x1F7C, }, @@ -55818,8 +57028,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH OXIA", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03CE }, + shcode=0x3C9, + specials={ "char", 0x3CE }, uccode=0x1FFB, unicodeslot=0x1F7D, }, @@ -55829,8 +57039,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F00, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F00, 0x345 }, uccode=0x1F88, unicodeslot=0x1F80, }, @@ -55840,8 +57050,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F01, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F01, 0x345 }, uccode=0x1F89, unicodeslot=0x1F81, }, @@ -55851,8 +57061,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F02, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F02, 0x345 }, uccode=0x1F8A, unicodeslot=0x1F82, }, @@ -55862,8 +57072,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F03, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F03, 0x345 }, uccode=0x1F8B, unicodeslot=0x1F83, }, @@ -55873,8 +57083,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F04, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F04, 0x345 }, uccode=0x1F8C, unicodeslot=0x1F84, }, @@ -55884,8 +57094,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F05, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F05, 0x345 }, uccode=0x1F8D, unicodeslot=0x1F85, }, @@ -55895,8 +57105,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F06, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F06, 0x345 }, uccode=0x1F8E, unicodeslot=0x1F86, }, @@ -55906,8 +57116,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F07, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F07, 0x345 }, uccode=0x1F8F, unicodeslot=0x1F87, }, @@ -55918,8 +57128,8 @@ characters.data={ direction="l", lccode=0x1F80, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F08, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F08, 0x345 }, unicodeslot=0x1F88, }, [0x1F89]={ @@ -55929,8 +57139,8 @@ characters.data={ direction="l", lccode=0x1F81, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F09, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F09, 0x345 }, unicodeslot=0x1F89, }, [0x1F8A]={ @@ -55940,8 +57150,8 @@ characters.data={ direction="l", lccode=0x1F82, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0A, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0A, 0x345 }, unicodeslot=0x1F8A, }, [0x1F8B]={ @@ -55951,8 +57161,8 @@ characters.data={ direction="l", lccode=0x1F83, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0B, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0B, 0x345 }, unicodeslot=0x1F8B, }, [0x1F8C]={ @@ -55962,8 +57172,8 @@ characters.data={ direction="l", lccode=0x1F84, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0C, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0C, 0x345 }, unicodeslot=0x1F8C, }, [0x1F8D]={ @@ -55973,8 +57183,8 @@ characters.data={ direction="l", lccode=0x1F85, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0D, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0D, 0x345 }, unicodeslot=0x1F8D, }, [0x1F8E]={ @@ -55984,8 +57194,8 @@ characters.data={ direction="l", lccode=0x1F86, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0E, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0E, 0x345 }, unicodeslot=0x1F8E, }, [0x1F8F]={ @@ -55995,8 +57205,8 @@ characters.data={ direction="l", lccode=0x1F87, linebreak="al", - shcode=0x0391, - specials={ "char", 0x1F0F, 0x0345 }, + shcode=0x391, + specials={ "char", 0x1F0F, 0x345 }, unicodeslot=0x1F8F, }, [0x1F90]={ @@ -56005,8 +57215,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F20, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F20, 0x345 }, uccode=0x1F98, unicodeslot=0x1F90, }, @@ -56016,8 +57226,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F21, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F21, 0x345 }, uccode=0x1F99, unicodeslot=0x1F91, }, @@ -56027,8 +57237,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F22, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F22, 0x345 }, uccode=0x1F9A, unicodeslot=0x1F92, }, @@ -56038,8 +57248,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F23, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F23, 0x345 }, uccode=0x1F9B, unicodeslot=0x1F93, }, @@ -56049,8 +57259,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F24, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F24, 0x345 }, uccode=0x1F9C, unicodeslot=0x1F94, }, @@ -56060,8 +57270,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F25, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F25, 0x345 }, uccode=0x1F9D, unicodeslot=0x1F95, }, @@ -56071,8 +57281,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F26, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F26, 0x345 }, uccode=0x1F9E, unicodeslot=0x1F96, }, @@ -56082,8 +57292,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F27, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F27, 0x345 }, uccode=0x1F9F, unicodeslot=0x1F97, }, @@ -56094,8 +57304,8 @@ characters.data={ direction="l", lccode=0x1F90, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F28, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F28, 0x345 }, unicodeslot=0x1F98, }, [0x1F99]={ @@ -56105,8 +57315,8 @@ characters.data={ direction="l", lccode=0x1F91, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F29, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F29, 0x345 }, unicodeslot=0x1F99, }, [0x1F9A]={ @@ -56116,8 +57326,8 @@ characters.data={ direction="l", lccode=0x1F92, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2A, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2A, 0x345 }, unicodeslot=0x1F9A, }, [0x1F9B]={ @@ -56127,8 +57337,8 @@ characters.data={ direction="l", lccode=0x1F93, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2B, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2B, 0x345 }, unicodeslot=0x1F9B, }, [0x1F9C]={ @@ -56138,8 +57348,8 @@ characters.data={ direction="l", lccode=0x1F94, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2C, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2C, 0x345 }, unicodeslot=0x1F9C, }, [0x1F9D]={ @@ -56149,8 +57359,8 @@ characters.data={ direction="l", lccode=0x1F95, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2D, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2D, 0x345 }, unicodeslot=0x1F9D, }, [0x1F9E]={ @@ -56160,8 +57370,8 @@ characters.data={ direction="l", lccode=0x1F96, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2E, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2E, 0x345 }, unicodeslot=0x1F9E, }, [0x1F9F]={ @@ -56171,8 +57381,8 @@ characters.data={ direction="l", lccode=0x1F97, linebreak="al", - shcode=0x0397, - specials={ "char", 0x1F2F, 0x0345 }, + shcode=0x397, + specials={ "char", 0x1F2F, 0x345 }, unicodeslot=0x1F9F, }, [0x1FA0]={ @@ -56181,8 +57391,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F60, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F60, 0x345 }, uccode=0x1FA8, unicodeslot=0x1FA0, }, @@ -56192,8 +57402,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F61, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F61, 0x345 }, uccode=0x1FA9, unicodeslot=0x1FA1, }, @@ -56203,8 +57413,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F62, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F62, 0x345 }, uccode=0x1FAA, unicodeslot=0x1FA2, }, @@ -56214,8 +57424,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F63, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F63, 0x345 }, uccode=0x1FAB, unicodeslot=0x1FA3, }, @@ -56225,8 +57435,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F64, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F64, 0x345 }, uccode=0x1FAC, unicodeslot=0x1FA4, }, @@ -56236,8 +57446,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F65, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F65, 0x345 }, uccode=0x1FAD, unicodeslot=0x1FA5, }, @@ -56247,8 +57457,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F66, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F66, 0x345 }, uccode=0x1FAE, unicodeslot=0x1FA6, }, @@ -56258,8 +57468,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F67, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F67, 0x345 }, uccode=0x1FAF, unicodeslot=0x1FA7, }, @@ -56270,8 +57480,8 @@ characters.data={ direction="l", lccode=0x1FA0, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F68, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F68, 0x345 }, unicodeslot=0x1FA8, }, [0x1FA9]={ @@ -56281,8 +57491,8 @@ characters.data={ direction="l", lccode=0x1FA1, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F69, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F69, 0x345 }, unicodeslot=0x1FA9, }, [0x1FAA]={ @@ -56292,8 +57502,8 @@ characters.data={ direction="l", lccode=0x1FA2, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6A, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6A, 0x345 }, unicodeslot=0x1FAA, }, [0x1FAB]={ @@ -56303,8 +57513,8 @@ characters.data={ direction="l", lccode=0x1FA3, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6B, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6B, 0x345 }, unicodeslot=0x1FAB, }, [0x1FAC]={ @@ -56314,8 +57524,8 @@ characters.data={ direction="l", lccode=0x1FA4, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6C, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6C, 0x345 }, unicodeslot=0x1FAC, }, [0x1FAD]={ @@ -56325,8 +57535,8 @@ characters.data={ direction="l", lccode=0x1FA5, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6D, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6D, 0x345 }, unicodeslot=0x1FAD, }, [0x1FAE]={ @@ -56336,8 +57546,8 @@ characters.data={ direction="l", lccode=0x1FA6, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6E, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6E, 0x345 }, unicodeslot=0x1FAE, }, [0x1FAF]={ @@ -56347,8 +57557,8 @@ characters.data={ direction="l", lccode=0x1FA7, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x1F6F, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x1F6F, 0x345 }, unicodeslot=0x1FAF, }, [0x1FB0]={ @@ -56357,8 +57567,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH VRACHY", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0306 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x306 }, uccode=0x1FB8, unicodeslot=0x1FB0, }, @@ -56368,8 +57578,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH MACRON", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0304 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x304 }, uccode=0x1FB9, unicodeslot=0x1FB1, }, @@ -56379,8 +57589,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1F70, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1F70, 0x345 }, unicodeslot=0x1FB2, }, [0x1FB3]={ @@ -56389,8 +57599,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x345 }, uccode=0x1FBC, unicodeslot=0x1FB3, }, @@ -56400,8 +57610,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03AC, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x3AC, 0x345 }, unicodeslot=0x1FB4, }, [0x1FB6]={ @@ -56410,8 +57620,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x03B1, 0x0342 }, + shcode=0x3B1, + specials={ "char", 0x3B1, 0x342 }, unicodeslot=0x1FB6, }, [0x1FB7]={ @@ -56420,8 +57630,8 @@ characters.data={ description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B1, - specials={ "char", 0x1FB6, 0x0345 }, + shcode=0x3B1, + specials={ "char", 0x1FB6, 0x345 }, unicodeslot=0x1FB7, }, [0x1FB8]={ @@ -56431,8 +57641,8 @@ characters.data={ direction="l", lccode=0x1FB0, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0306 }, + shcode=0x391, + specials={ "char", 0x391, 0x306 }, unicodeslot=0x1FB8, }, [0x1FB9]={ @@ -56442,8 +57652,8 @@ characters.data={ direction="l", lccode=0x1FB1, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0304 }, + shcode=0x391, + specials={ "char", 0x391, 0x304 }, unicodeslot=0x1FB9, }, [0x1FBA]={ @@ -56453,8 +57663,8 @@ characters.data={ direction="l", lccode=0x1F70, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0300 }, + shcode=0x391, + specials={ "char", 0x391, 0x300 }, unicodeslot=0x1FBA, }, [0x1FBB]={ @@ -56464,8 +57674,8 @@ characters.data={ direction="l", lccode=0x1F71, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0386 }, + shcode=0x391, + specials={ "char", 0x386 }, unicodeslot=0x1FBB, }, [0x1FBC]={ @@ -56475,8 +57685,8 @@ characters.data={ direction="l", lccode=0x1FB3, linebreak="al", - shcode=0x0391, - specials={ "char", 0x0391, 0x0345 }, + shcode=0x391, + specials={ "char", 0x391, 0x345 }, unicodeslot=0x1FBC, }, [0x1FBD]={ @@ -56485,7 +57695,7 @@ characters.data={ description="GREEK KORONIS", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0313 }, + specials={ "compat", 0x20, 0x313 }, unicodeslot=0x1FBD, }, [0x1FBE]={ @@ -56494,8 +57704,8 @@ characters.data={ description="GREEK PROSGEGRAMMENI", direction="l", linebreak="al", - specials={ "char", 0x03B9 }, - uccode=0x0399, + specials={ "char", 0x3B9 }, + uccode=0x399, unicodeslot=0x1FBE, }, [0x1FBF]={ @@ -56504,7 +57714,7 @@ characters.data={ description="GREEK PSILI", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0313 }, + specials={ "compat", 0x20, 0x313 }, unicodeslot=0x1FBF, }, [0x1FC0]={ @@ -56513,7 +57723,7 @@ characters.data={ description="GREEK PERISPOMENI", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0342 }, + specials={ "compat", 0x20, 0x342 }, unicodeslot=0x1FC0, }, [0x1FC1]={ @@ -56522,7 +57732,7 @@ characters.data={ description="GREEK DIALYTIKA AND PERISPOMENI", direction="on", linebreak="al", - specials={ "char", 0x00A8, 0x0342 }, + specials={ "char", 0xA8, 0x342 }, unicodeslot=0x1FC1, }, [0x1FC2]={ @@ -56531,8 +57741,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1F74, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1F74, 0x345 }, unicodeslot=0x1FC2, }, [0x1FC3]={ @@ -56541,8 +57751,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x345 }, uccode=0x1FCC, unicodeslot=0x1FC3, }, @@ -56552,8 +57762,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03AE, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x3AE, 0x345 }, unicodeslot=0x1FC4, }, [0x1FC6]={ @@ -56562,8 +57772,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x03B7, 0x0342 }, + shcode=0x3B7, + specials={ "char", 0x3B7, 0x342 }, unicodeslot=0x1FC6, }, [0x1FC7]={ @@ -56572,8 +57782,8 @@ characters.data={ description="GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03B7, - specials={ "char", 0x1FC6, 0x0345 }, + shcode=0x3B7, + specials={ "char", 0x1FC6, 0x345 }, unicodeslot=0x1FC7, }, [0x1FC8]={ @@ -56583,8 +57793,8 @@ characters.data={ direction="l", lccode=0x1F72, linebreak="al", - shcode=0x0395, - specials={ "char", 0x0395, 0x0300 }, + shcode=0x395, + specials={ "char", 0x395, 0x300 }, unicodeslot=0x1FC8, }, [0x1FC9]={ @@ -56594,8 +57804,8 @@ characters.data={ direction="l", lccode=0x1F73, linebreak="al", - shcode=0x0395, - specials={ "char", 0x0388 }, + shcode=0x395, + specials={ "char", 0x388 }, unicodeslot=0x1FC9, }, [0x1FCA]={ @@ -56605,8 +57815,8 @@ characters.data={ direction="l", lccode=0x1F74, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0397, 0x0300 }, + shcode=0x397, + specials={ "char", 0x397, 0x300 }, unicodeslot=0x1FCA, }, [0x1FCB]={ @@ -56616,8 +57826,8 @@ characters.data={ direction="l", lccode=0x1F75, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0389 }, + shcode=0x397, + specials={ "char", 0x389 }, unicodeslot=0x1FCB, }, [0x1FCC]={ @@ -56627,8 +57837,8 @@ characters.data={ direction="l", lccode=0x1FC3, linebreak="al", - shcode=0x0397, - specials={ "char", 0x0397, 0x0345 }, + shcode=0x397, + specials={ "char", 0x397, 0x345 }, unicodeslot=0x1FCC, }, [0x1FCD]={ @@ -56637,7 +57847,7 @@ characters.data={ description="GREEK PSILI AND VARIA", direction="on", linebreak="al", - specials={ "char", 0x1FBF, 0x0300 }, + specials={ "char", 0x1FBF, 0x300 }, unicodeslot=0x1FCD, }, [0x1FCE]={ @@ -56646,7 +57856,7 @@ characters.data={ description="GREEK PSILI AND OXIA", direction="on", linebreak="al", - specials={ "char", 0x1FBF, 0x0301 }, + specials={ "char", 0x1FBF, 0x301 }, unicodeslot=0x1FCE, }, [0x1FCF]={ @@ -56655,7 +57865,7 @@ characters.data={ description="GREEK PSILI AND PERISPOMENI", direction="on", linebreak="al", - specials={ "char", 0x1FBF, 0x0342 }, + specials={ "char", 0x1FBF, 0x342 }, unicodeslot=0x1FCF, }, [0x1FD0]={ @@ -56664,8 +57874,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH VRACHY", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0306 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x306 }, uccode=0x1FD8, unicodeslot=0x1FD0, }, @@ -56675,8 +57885,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH MACRON", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0304 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x304 }, uccode=0x1FD9, unicodeslot=0x1FD1, }, @@ -56686,8 +57896,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03CA, 0x0300 }, + shcode=0x3B9, + specials={ "char", 0x3CA, 0x300 }, unicodeslot=0x1FD2, }, [0x1FD3]={ @@ -56696,8 +57906,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x0390 }, + shcode=0x3B9, + specials={ "char", 0x390 }, unicodeslot=0x1FD3, }, [0x1FD6]={ @@ -56706,8 +57916,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03B9, 0x0342 }, + shcode=0x3B9, + specials={ "char", 0x3B9, 0x342 }, unicodeslot=0x1FD6, }, [0x1FD7]={ @@ -56716,8 +57926,8 @@ characters.data={ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03B9, - specials={ "char", 0x03CA, 0x0342 }, + shcode=0x3B9, + specials={ "char", 0x3CA, 0x342 }, unicodeslot=0x1FD7, }, [0x1FD8]={ @@ -56727,8 +57937,8 @@ characters.data={ direction="l", lccode=0x1FD0, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0306 }, + shcode=0x399, + specials={ "char", 0x399, 0x306 }, unicodeslot=0x1FD8, }, [0x1FD9]={ @@ -56738,8 +57948,8 @@ characters.data={ direction="l", lccode=0x1FD1, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0304 }, + shcode=0x399, + specials={ "char", 0x399, 0x304 }, unicodeslot=0x1FD9, }, [0x1FDA]={ @@ -56749,8 +57959,8 @@ characters.data={ direction="l", lccode=0x1F76, linebreak="al", - shcode=0x0399, - specials={ "char", 0x0399, 0x0300 }, + shcode=0x399, + specials={ "char", 0x399, 0x300 }, unicodeslot=0x1FDA, }, [0x1FDB]={ @@ -56760,8 +57970,8 @@ characters.data={ direction="l", lccode=0x1F77, linebreak="al", - shcode=0x0399, - specials={ "char", 0x038A }, + shcode=0x399, + specials={ "char", 0x38A }, unicodeslot=0x1FDB, }, [0x1FDD]={ @@ -56770,7 +57980,7 @@ characters.data={ description="GREEK DASIA AND VARIA", direction="on", linebreak="al", - specials={ "char", 0x1FFE, 0x0300 }, + specials={ "char", 0x1FFE, 0x300 }, unicodeslot=0x1FDD, }, [0x1FDE]={ @@ -56779,7 +57989,7 @@ characters.data={ description="GREEK DASIA AND OXIA", direction="on", linebreak="al", - specials={ "char", 0x1FFE, 0x0301 }, + specials={ "char", 0x1FFE, 0x301 }, unicodeslot=0x1FDE, }, [0x1FDF]={ @@ -56788,7 +57998,7 @@ characters.data={ description="GREEK DASIA AND PERISPOMENI", direction="on", linebreak="al", - specials={ "char", 0x1FFE, 0x0342 }, + specials={ "char", 0x1FFE, 0x342 }, unicodeslot=0x1FDF, }, [0x1FE0]={ @@ -56797,8 +58007,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH VRACHY", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0306 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x306 }, uccode=0x1FE8, unicodeslot=0x1FE0, }, @@ -56808,8 +58018,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH MACRON", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0304 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x304 }, uccode=0x1FE9, unicodeslot=0x1FE1, }, @@ -56819,8 +58029,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03CB, 0x0300 }, + shcode=0x3C5, + specials={ "char", 0x3CB, 0x300 }, unicodeslot=0x1FE2, }, [0x1FE3]={ @@ -56829,8 +58039,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03B0 }, + shcode=0x3C5, + specials={ "char", 0x3B0 }, unicodeslot=0x1FE3, }, [0x1FE4]={ @@ -56839,8 +58049,8 @@ characters.data={ description="GREEK SMALL LETTER RHO WITH PSILI", direction="l", linebreak="al", - shcode=0x03C1, - specials={ "char", 0x03C1, 0x0313 }, + shcode=0x3C1, + specials={ "char", 0x3C1, 0x313 }, unicodeslot=0x1FE4, }, [0x1FE5]={ @@ -56849,8 +58059,8 @@ characters.data={ description="GREEK SMALL LETTER RHO WITH DASIA", direction="l", linebreak="al", - shcode=0x03C1, - specials={ "char", 0x03C1, 0x0314 }, + shcode=0x3C1, + specials={ "char", 0x3C1, 0x314 }, uccode=0x1FEC, unicodeslot=0x1FE5, }, @@ -56860,8 +58070,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03C5, 0x0342 }, + shcode=0x3C5, + specials={ "char", 0x3C5, 0x342 }, unicodeslot=0x1FE6, }, [0x1FE7]={ @@ -56870,8 +58080,8 @@ characters.data={ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C5, - specials={ "char", 0x03CB, 0x0342 }, + shcode=0x3C5, + specials={ "char", 0x3CB, 0x342 }, unicodeslot=0x1FE7, }, [0x1FE8]={ @@ -56881,8 +58091,8 @@ characters.data={ direction="l", lccode=0x1FE0, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0306 }, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x306 }, unicodeslot=0x1FE8, }, [0x1FE9]={ @@ -56892,8 +58102,8 @@ characters.data={ direction="l", lccode=0x1FE1, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0304 }, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x304 }, unicodeslot=0x1FE9, }, [0x1FEA]={ @@ -56903,8 +58113,8 @@ characters.data={ direction="l", lccode=0x1F7A, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x03A5, 0x0300 }, + shcode=0x3A5, + specials={ "char", 0x3A5, 0x300 }, unicodeslot=0x1FEA, }, [0x1FEB]={ @@ -56914,8 +58124,8 @@ characters.data={ direction="l", lccode=0x1F7B, linebreak="al", - shcode=0x03A5, - specials={ "char", 0x038E }, + shcode=0x3A5, + specials={ "char", 0x38E }, unicodeslot=0x1FEB, }, [0x1FEC]={ @@ -56925,8 +58135,8 @@ characters.data={ direction="l", lccode=0x1FE5, linebreak="al", - shcode=0x03A1, - specials={ "char", 0x03A1, 0x0314 }, + shcode=0x3A1, + specials={ "char", 0x3A1, 0x314 }, unicodeslot=0x1FEC, }, [0x1FED]={ @@ -56935,7 +58145,7 @@ characters.data={ description="GREEK DIALYTIKA AND VARIA", direction="on", linebreak="al", - specials={ "char", 0x00A8, 0x0300 }, + specials={ "char", 0xA8, 0x300 }, unicodeslot=0x1FED, }, [0x1FEE]={ @@ -56944,7 +58154,7 @@ characters.data={ description="GREEK DIALYTIKA AND OXIA", direction="on", linebreak="al", - specials={ "char", 0x0385 }, + specials={ "char", 0x385 }, unicodeslot=0x1FEE, }, [0x1FEF]={ @@ -56953,7 +58163,7 @@ characters.data={ description="GREEK VARIA", direction="on", linebreak="al", - specials={ "char", 0x0060 }, + specials={ "char", 0x60 }, unicodeslot=0x1FEF, }, [0x1FF2]={ @@ -56962,8 +58172,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1F7C, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1F7C, 0x345 }, unicodeslot=0x1FF2, }, [0x1FF3]={ @@ -56972,8 +58182,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x345 }, uccode=0x1FFC, unicodeslot=0x1FF3, }, @@ -56983,8 +58193,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03CE, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x3CE, 0x345 }, unicodeslot=0x1FF4, }, [0x1FF6]={ @@ -56993,8 +58203,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x03C9, 0x0342 }, + shcode=0x3C9, + specials={ "char", 0x3C9, 0x342 }, unicodeslot=0x1FF6, }, [0x1FF7]={ @@ -57003,8 +58213,8 @@ characters.data={ description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI", direction="l", linebreak="al", - shcode=0x03C9, - specials={ "char", 0x1FF6, 0x0345 }, + shcode=0x3C9, + specials={ "char", 0x1FF6, 0x345 }, unicodeslot=0x1FF7, }, [0x1FF8]={ @@ -57014,8 +58224,8 @@ characters.data={ direction="l", lccode=0x1F78, linebreak="al", - shcode=0x039F, - specials={ "char", 0x039F, 0x0300 }, + shcode=0x39F, + specials={ "char", 0x39F, 0x300 }, unicodeslot=0x1FF8, }, [0x1FF9]={ @@ -57025,8 +58235,8 @@ characters.data={ direction="l", lccode=0x1F79, linebreak="al", - shcode=0x039F, - specials={ "char", 0x038C }, + shcode=0x39F, + specials={ "char", 0x38C }, unicodeslot=0x1FF9, }, [0x1FFA]={ @@ -57036,8 +58246,8 @@ characters.data={ direction="l", lccode=0x1F7C, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x03A9, 0x0300 }, + shcode=0x3A9, + specials={ "char", 0x3A9, 0x300 }, unicodeslot=0x1FFA, }, [0x1FFB]={ @@ -57047,8 +58257,8 @@ characters.data={ direction="l", lccode=0x1F7D, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x038F }, + shcode=0x3A9, + specials={ "char", 0x38F }, unicodeslot=0x1FFB, }, [0x1FFC]={ @@ -57058,8 +58268,8 @@ characters.data={ direction="l", lccode=0x1FF3, linebreak="al", - shcode=0x03A9, - specials={ "char", 0x03A9, 0x0345 }, + shcode=0x3A9, + specials={ "char", 0x3A9, 0x345 }, unicodeslot=0x1FFC, }, [0x1FFD]={ @@ -57068,7 +58278,7 @@ characters.data={ description="GREEK OXIA", direction="on", linebreak="bb", - specials={ "char", 0x00B4 }, + specials={ "char", 0xB4 }, unicodeslot=0x1FFD, }, [0x1FFE]={ @@ -57077,7 +58287,7 @@ characters.data={ description="GREEK DASIA", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0314 }, + specials={ "compat", 0x20, 0x314 }, unicodeslot=0x1FFE, }, [0x2000]={ @@ -57103,7 +58313,7 @@ characters.data={ description="EN SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2002, }, [0x2003]={ @@ -57112,7 +58322,7 @@ characters.data={ description="EM SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2003, }, [0x2004]={ @@ -57121,7 +58331,7 @@ characters.data={ description="THREE-PER-EM SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2004, }, [0x2005]={ @@ -57130,7 +58340,7 @@ characters.data={ description="FOUR-PER-EM SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2005, }, [0x2006]={ @@ -57139,7 +58349,7 @@ characters.data={ description="SIX-PER-EM SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2006, }, [0x2007]={ @@ -57148,7 +58358,7 @@ characters.data={ description="FIGURE SPACE", direction="ws", linebreak="gl", - specials={ "nobreak", 0x0020 }, + specials={ "nobreak", 0x20 }, unicodeslot=0x2007, }, [0x2008]={ @@ -57157,7 +58367,7 @@ characters.data={ description="PUNCTUATION SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2008, }, [0x2009]={ @@ -57166,7 +58376,7 @@ characters.data={ description="THIN SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x2009, }, [0x200A]={ @@ -57175,7 +58385,7 @@ characters.data={ description="HAIR SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x200A, }, [0x200B]={ @@ -57316,7 +58526,7 @@ characters.data={ description="DOUBLE LOW LINE", direction="on", linebreak="al", - specials={ "compat", 0x0020, 0x0333 }, + specials={ "compat", 0x20, 0x333 }, unicodeslot=0x2017, }, [0x2018]={ @@ -57458,7 +58668,7 @@ characters.data={ description="ONE DOT LEADER", direction="on", linebreak="in", - specials={ "compat", 0x002E }, + specials={ "compat", 0x2E }, unicodeslot=0x2024, }, [0x2025]={ @@ -57468,7 +58678,7 @@ characters.data={ description="TWO DOT LEADER", direction="on", linebreak="in", - specials={ "compat", 0x002E, 0x002E }, + specials={ "compat", 0x2E, 0x2E }, unicodeslot=0x2025, }, [0x2026]={ @@ -57489,7 +58699,7 @@ characters.data={ name="dots", }, }, - specials={ "compat", 0x002E, 0x002E, 0x002E }, + specials={ "compat", 0x2E, 0x2E, 0x2E }, unicodeslot=0x2026, }, [0x2027]={ @@ -57558,7 +58768,7 @@ characters.data={ description="NARROW NO-BREAK SPACE", direction="cs", linebreak="gl", - specials={ "nobreak", 0x0020 }, + specials={ "nobreak", 0x20 }, unicodeslot=0x202F, }, [0x2030]={ @@ -57686,7 +58896,7 @@ characters.data={ description="DOUBLE EXCLAMATION MARK", direction="on", linebreak="ns", - specials={ "compat", 0x0021, 0x0021 }, + specials={ "compat", 0x21, 0x21 }, unicodeslot=0x203C, variants={ [0xFE0E]="text style", @@ -57704,7 +58914,7 @@ characters.data={ adobename="overline", category="po", cjkwd="a", - comment=[[mathspec={ { class="topaccent", name="overbar" }, { class="botaccent", name="underbar" } }"]], + comment="mathspec={ { class=\"topaccent\", name=\"overbar\" }, { class=\"botaccent\", name=\"underbar\" } }\"", description="OVERLINE", direction="on", linebreak="al", @@ -57721,7 +58931,7 @@ characters.data={ }, }, mathstretch="h", - specials={ "compat", 0x0020, 0x0305 }, + specials={ "compat", 0x20, 0x305 }, unicodeslot=0x203E, }, [0x203F]={ @@ -57800,7 +59010,7 @@ characters.data={ description="DOUBLE QUESTION MARK", direction="on", linebreak="ns", - specials={ "compat", 0x003F, 0x003F }, + specials={ "compat", 0x3F, 0x3F }, unicodeslot=0x2047, }, [0x2048]={ @@ -57808,7 +59018,7 @@ characters.data={ description="QUESTION EXCLAMATION MARK", direction="on", linebreak="ns", - specials={ "compat", 0x003F, 0x0021 }, + specials={ "compat", 0x3F, 0x21 }, unicodeslot=0x2048, }, [0x2049]={ @@ -57816,7 +59026,7 @@ characters.data={ description="EXCLAMATION QUESTION MARK", direction="on", linebreak="ns", - specials={ "compat", 0x0021, 0x003F }, + specials={ "compat", 0x21, 0x3F }, unicodeslot=0x2049, variants={ [0xFE0E]="text style", @@ -57979,7 +59189,7 @@ characters.data={ description="MEDIUM MATHEMATICAL SPACE", direction="ws", linebreak="ba", - specials={ "compat", 0x0020 }, + specials={ "compat", 0x20 }, unicodeslot=0x205F, }, [0x2060]={ @@ -58019,6 +59229,38 @@ characters.data={ linebreak="al", unicodeslot=0x2064, }, + [0x2066]={ + arabic="u", + category="cf", + description="LEFT-TO-RIGHT ISOLATE", + direction="lri", + linebreak="cm", + unicodeslot=0x2066, + }, + [0x2067]={ + arabic="u", + category="cf", + description="RIGHT-TO-LEFT ISOLATE", + direction="rli", + linebreak="cm", + unicodeslot=0x2067, + }, + [0x2068]={ + arabic="u", + category="cf", + description="FIRST STRONG ISOLATE", + direction="fsi", + linebreak="cm", + unicodeslot=0x2068, + }, + [0x2069]={ + arabic="u", + category="cf", + description="POP DIRECTIONAL ISOLATE", + direction="pdi", + linebreak="cm", + unicodeslot=0x2069, + }, [0x206A]={ category="cf", description="INHIBIT SYMMETRIC SWAPPING", @@ -58067,7 +59309,7 @@ characters.data={ description="SUPERSCRIPT ZERO", direction="en", linebreak="al", - specials={ "super", 0x0030 }, + specials={ "super", 0x30 }, unicodeslot=0x2070, }, [0x2071]={ @@ -58075,7 +59317,7 @@ characters.data={ description="SUPERSCRIPT LATIN SMALL LETTER I", direction="l", linebreak="al", - specials={ "super", 0x0069 }, + specials={ "super", 0x69 }, unicodeslot=0x2071, }, [0x2074]={ @@ -58085,7 +59327,7 @@ characters.data={ description="SUPERSCRIPT FOUR", direction="en", linebreak="ai", - specials={ "super", 0x0034 }, + specials={ "super", 0x34 }, unicodeslot=0x2074, }, [0x2075]={ @@ -58094,7 +59336,7 @@ characters.data={ description="SUPERSCRIPT FIVE", direction="en", linebreak="al", - specials={ "super", 0x0035 }, + specials={ "super", 0x35 }, unicodeslot=0x2075, }, [0x2076]={ @@ -58103,7 +59345,7 @@ characters.data={ description="SUPERSCRIPT SIX", direction="en", linebreak="al", - specials={ "super", 0x0036 }, + specials={ "super", 0x36 }, unicodeslot=0x2076, }, [0x2077]={ @@ -58112,7 +59354,7 @@ characters.data={ description="SUPERSCRIPT SEVEN", direction="en", linebreak="al", - specials={ "super", 0x0037 }, + specials={ "super", 0x37 }, unicodeslot=0x2077, }, [0x2078]={ @@ -58121,7 +59363,7 @@ characters.data={ description="SUPERSCRIPT EIGHT", direction="en", linebreak="al", - specials={ "super", 0x0038 }, + specials={ "super", 0x38 }, unicodeslot=0x2078, }, [0x2079]={ @@ -58130,7 +59372,7 @@ characters.data={ description="SUPERSCRIPT NINE", direction="en", linebreak="al", - specials={ "super", 0x0039 }, + specials={ "super", 0x39 }, unicodeslot=0x2079, }, [0x207A]={ @@ -58141,7 +59383,7 @@ characters.data={ linebreak="al", mathclass="binary", mathname="positivesign", - specials={ "super", 0x002B }, + specials={ "super", 0x2B }, unicodeslot=0x207A, }, [0x207B]={ @@ -58160,7 +59402,7 @@ characters.data={ description="SUPERSCRIPT EQUALS SIGN", direction="on", linebreak="al", - specials={ "super", 0x003D }, + specials={ "super", 0x3D }, unicodeslot=0x207C, }, [0x207D]={ @@ -58170,8 +59412,8 @@ characters.data={ direction="on", linebreak="op", mirror=0x207E, + specials={ "super", 0x28 }, textclass="open", - specials={ "super", 0x0028 }, unicodeslot=0x207D, }, [0x207E]={ @@ -58181,8 +59423,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0x207D, + specials={ "super", 0x29 }, textclass="close", - specials={ "super", 0x0029 }, unicodeslot=0x207E, }, [0x207F]={ @@ -58192,7 +59434,7 @@ characters.data={ description="SUPERSCRIPT LATIN SMALL LETTER N", direction="l", linebreak="ai", - specials={ "super", 0x006E }, + specials={ "super", 0x6E }, unicodeslot=0x207F, }, [0x2080]={ @@ -58201,7 +59443,7 @@ characters.data={ description="SUBSCRIPT ZERO", direction="en", linebreak="al", - specials={ "sub", 0x0030 }, + specials={ "sub", 0x30 }, unicodeslot=0x2080, }, [0x2081]={ @@ -58211,7 +59453,7 @@ characters.data={ description="SUBSCRIPT ONE", direction="en", linebreak="ai", - specials={ "sub", 0x0031 }, + specials={ "sub", 0x31 }, unicodeslot=0x2081, }, [0x2082]={ @@ -58221,7 +59463,7 @@ characters.data={ description="SUBSCRIPT TWO", direction="en", linebreak="ai", - specials={ "sub", 0x0032 }, + specials={ "sub", 0x32 }, unicodeslot=0x2082, }, [0x2083]={ @@ -58231,7 +59473,7 @@ characters.data={ description="SUBSCRIPT THREE", direction="en", linebreak="ai", - specials={ "sub", 0x0033 }, + specials={ "sub", 0x33 }, unicodeslot=0x2083, }, [0x2084]={ @@ -58241,7 +59483,7 @@ characters.data={ description="SUBSCRIPT FOUR", direction="en", linebreak="ai", - specials={ "sub", 0x0034 }, + specials={ "sub", 0x34 }, unicodeslot=0x2084, }, [0x2085]={ @@ -58250,7 +59492,7 @@ characters.data={ description="SUBSCRIPT FIVE", direction="en", linebreak="al", - specials={ "sub", 0x0035 }, + specials={ "sub", 0x35 }, unicodeslot=0x2085, }, [0x2086]={ @@ -58259,7 +59501,7 @@ characters.data={ description="SUBSCRIPT SIX", direction="en", linebreak="al", - specials={ "sub", 0x0036 }, + specials={ "sub", 0x36 }, unicodeslot=0x2086, }, [0x2087]={ @@ -58268,7 +59510,7 @@ characters.data={ description="SUBSCRIPT SEVEN", direction="en", linebreak="al", - specials={ "sub", 0x0037 }, + specials={ "sub", 0x37 }, unicodeslot=0x2087, }, [0x2088]={ @@ -58277,7 +59519,7 @@ characters.data={ description="SUBSCRIPT EIGHT", direction="en", linebreak="al", - specials={ "sub", 0x0038 }, + specials={ "sub", 0x38 }, unicodeslot=0x2088, }, [0x2089]={ @@ -58286,7 +59528,7 @@ characters.data={ description="SUBSCRIPT NINE", direction="en", linebreak="al", - specials={ "sub", 0x0039 }, + specials={ "sub", 0x39 }, unicodeslot=0x2089, }, [0x208A]={ @@ -58294,7 +59536,7 @@ characters.data={ description="SUBSCRIPT PLUS SIGN", direction="es", linebreak="al", - specials={ "sub", 0x002B }, + specials={ "sub", 0x2B }, unicodeslot=0x208A, }, [0x208B]={ @@ -58310,7 +59552,7 @@ characters.data={ description="SUBSCRIPT EQUALS SIGN", direction="on", linebreak="al", - specials={ "sub", 0x003D }, + specials={ "sub", 0x3D }, unicodeslot=0x208C, }, [0x208D]={ @@ -58320,8 +59562,8 @@ characters.data={ direction="on", linebreak="op", mirror=0x208E, + specials={ "sub", 0x28 }, textclass="open", - specials={ "sub", 0x0028 }, unicodeslot=0x208D, }, [0x208E]={ @@ -58331,8 +59573,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0x208D, + specials={ "sub", 0x29 }, textclass="close", - specials={ "sub", 0x0029 }, unicodeslot=0x208E, }, [0x2090]={ @@ -58340,7 +59582,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER A", direction="l", linebreak="al", - specials={ "sub", 0x0061 }, + specials={ "sub", 0x61 }, unicodeslot=0x2090, }, [0x2091]={ @@ -58348,7 +59590,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER E", direction="l", linebreak="al", - specials={ "sub", 0x0065 }, + specials={ "sub", 0x65 }, unicodeslot=0x2091, }, [0x2092]={ @@ -58356,7 +59598,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER O", direction="l", linebreak="al", - specials={ "sub", 0x006F }, + specials={ "sub", 0x6F }, unicodeslot=0x2092, }, [0x2093]={ @@ -58364,7 +59606,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER X", direction="l", linebreak="al", - specials={ "sub", 0x0078 }, + specials={ "sub", 0x78 }, unicodeslot=0x2093, }, [0x2094]={ @@ -58372,7 +59614,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER SCHWA", direction="l", linebreak="al", - specials={ "sub", 0x0259 }, + specials={ "sub", 0x259 }, unicodeslot=0x2094, }, [0x2095]={ @@ -58380,7 +59622,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER H", direction="l", linebreak="al", - specials={ "sub", 0x0068 }, + specials={ "sub", 0x68 }, unicodeslot=0x2095, }, [0x2096]={ @@ -58388,7 +59630,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER K", direction="l", linebreak="al", - specials={ "sub", 0x006B }, + specials={ "sub", 0x6B }, unicodeslot=0x2096, }, [0x2097]={ @@ -58396,7 +59638,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER L", direction="l", linebreak="al", - specials={ "sub", 0x006C }, + specials={ "sub", 0x6C }, unicodeslot=0x2097, }, [0x2098]={ @@ -58404,7 +59646,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER M", direction="l", linebreak="al", - specials={ "sub", 0x006D }, + specials={ "sub", 0x6D }, unicodeslot=0x2098, }, [0x2099]={ @@ -58412,7 +59654,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER N", direction="l", linebreak="al", - specials={ "sub", 0x006E }, + specials={ "sub", 0x6E }, unicodeslot=0x2099, }, [0x209A]={ @@ -58420,7 +59662,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER P", direction="l", linebreak="al", - specials={ "sub", 0x0070 }, + specials={ "sub", 0x70 }, unicodeslot=0x209A, }, [0x209B]={ @@ -58428,7 +59670,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER S", direction="l", linebreak="al", - specials={ "sub", 0x0073 }, + specials={ "sub", 0x73 }, unicodeslot=0x209B, }, [0x209C]={ @@ -58436,7 +59678,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER T", direction="l", linebreak="al", - specials={ "sub", 0x0074 }, + specials={ "sub", 0x74 }, unicodeslot=0x209C, }, [0x20A0]={ @@ -58505,7 +59747,7 @@ characters.data={ description="RUPEE SIGN", direction="et", linebreak="pr", - specials={ "compat", 0x0052, 0x0073 }, + specials={ "compat", 0x52, 0x73 }, unicodeslot=0x20A8, }, [0x20A9]={ @@ -58642,8 +59884,30 @@ characters.data={ linebreak="pr", unicodeslot=0x20BA, }, + [0x20BB]={ + category="sc", + description="NORDIC MARK SIGN", + direction="et", + linebreak="po", + unicodeslot=0x20BB, + }, + [0x20BC]={ + category="sc", + description="MANAT SIGN", + direction="et", + linebreak="pr", + unicodeslot=0x20BC, + }, + [0x20BD]={ + category="sc", + description="RUBLE SIGN", + direction="et", + linebreak="pr", + unicodeslot=0x20BD, + }, [0x20D0]={ category="mn", + combining=0xE6, description="COMBINING LEFT HARPOON ABOVE", direction="nsm", linebreak="cm", @@ -58651,6 +59915,7 @@ characters.data={ }, [0x20D1]={ category="mn", + combining=0xE6, description="COMBINING RIGHT HARPOON ABOVE", direction="nsm", linebreak="cm", @@ -58658,6 +59923,7 @@ characters.data={ }, [0x20D2]={ category="mn", + combining=0x1, description="COMBINING LONG VERTICAL LINE OVERLAY", direction="nsm", linebreak="cm", @@ -58665,6 +59931,7 @@ characters.data={ }, [0x20D3]={ category="mn", + combining=0x1, description="COMBINING SHORT VERTICAL LINE OVERLAY", direction="nsm", linebreak="cm", @@ -58672,6 +59939,7 @@ characters.data={ }, [0x20D4]={ category="mn", + combining=0xE6, description="COMBINING ANTICLOCKWISE ARROW ABOVE", direction="nsm", linebreak="cm", @@ -58679,6 +59947,7 @@ characters.data={ }, [0x20D5]={ category="mn", + combining=0xE6, description="COMBINING CLOCKWISE ARROW ABOVE", direction="nsm", linebreak="cm", @@ -58686,6 +59955,7 @@ characters.data={ }, [0x20D6]={ category="mn", + combining=0xE6, description="COMBINING LEFT ARROW ABOVE", direction="nsm", linebreak="cm", @@ -58693,6 +59963,7 @@ characters.data={ }, [0x20D7]={ category="mn", + combining=0xE6, description="COMBINING RIGHT ARROW ABOVE", direction="nsm", linebreak="cm", @@ -58702,6 +59973,7 @@ characters.data={ }, [0x20D8]={ category="mn", + combining=0x1, description="COMBINING RING OVERLAY", direction="nsm", linebreak="cm", @@ -58709,6 +59981,7 @@ characters.data={ }, [0x20D9]={ category="mn", + combining=0x1, description="COMBINING CLOCKWISE RING OVERLAY", direction="nsm", linebreak="cm", @@ -58716,6 +59989,7 @@ characters.data={ }, [0x20DA]={ category="mn", + combining=0x1, description="COMBINING ANTICLOCKWISE RING OVERLAY", direction="nsm", linebreak="cm", @@ -58723,6 +59997,7 @@ characters.data={ }, [0x20DB]={ category="mn", + combining=0xE6, description="COMBINING THREE DOTS ABOVE", direction="nsm", linebreak="cm", @@ -58732,6 +60007,7 @@ characters.data={ }, [0x20DC]={ category="mn", + combining=0xE6, description="COMBINING FOUR DOTS ABOVE", direction="nsm", linebreak="cm", @@ -58781,6 +60057,7 @@ characters.data={ }, [0x20E1]={ category="mn", + combining=0xE6, description="COMBINING LEFT RIGHT ARROW ABOVE", direction="nsm", linebreak="cm", @@ -58809,6 +60086,7 @@ characters.data={ }, [0x20E5]={ category="mn", + combining=0x1, description="COMBINING REVERSE SOLIDUS OVERLAY", direction="nsm", linebreak="cm", @@ -58816,6 +60094,7 @@ characters.data={ }, [0x20E6]={ category="mn", + combining=0x1, description="COMBINING DOUBLE VERTICAL STROKE OVERLAY", direction="nsm", linebreak="cm", @@ -58823,15 +60102,17 @@ characters.data={ }, [0x20E7]={ category="mn", + combining=0xE6, description="COMBINING ANNUITY SYMBOL", direction="nsm", + linebreak="cm", mathclass="topaccent", mathname="actuarial", - linebreak="cm", unicodeslot=0x20E7, }, [0x20E8]={ category="mn", + combining=0xDC, description="COMBINING TRIPLE UNDERDOT", direction="nsm", linebreak="cm", @@ -58839,6 +60120,7 @@ characters.data={ }, [0x20E9]={ category="mn", + combining=0xE6, description="COMBINING WIDE BRIDGE ABOVE", direction="nsm", linebreak="cm", @@ -58847,6 +60129,7 @@ characters.data={ }, [0x20EA]={ category="mn", + combining=0x1, description="COMBINING LEFTWARDS ARROW OVERLAY", direction="nsm", linebreak="cm", @@ -58854,6 +60137,7 @@ characters.data={ }, [0x20EB]={ category="mn", + combining=0x1, description="COMBINING LONG DOUBLE SOLIDUS OVERLAY", direction="nsm", linebreak="cm", @@ -58861,6 +60145,7 @@ characters.data={ }, [0x20EC]={ category="mn", + combining=0xDC, description="COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS", direction="nsm", linebreak="cm", @@ -58868,6 +60153,7 @@ characters.data={ }, [0x20ED]={ category="mn", + combining=0xDC, description="COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS", direction="nsm", linebreak="cm", @@ -58875,6 +60161,7 @@ characters.data={ }, [0x20EE]={ category="mn", + combining=0xDC, description="COMBINING LEFT ARROW BELOW", direction="nsm", linebreak="cm", @@ -58882,6 +60169,7 @@ characters.data={ }, [0x20EF]={ category="mn", + combining=0xDC, description="COMBINING RIGHT ARROW BELOW", direction="nsm", linebreak="cm", @@ -58889,6 +60177,7 @@ characters.data={ }, [0x20F0]={ category="mn", + combining=0xE6, description="COMBINING ASTERISK ABOVE", direction="nsm", linebreak="cm", @@ -58899,7 +60188,7 @@ characters.data={ description="ACCOUNT OF", direction="on", linebreak="al", - specials={ "compat", 0x0061, 0x002F, 0x0063 }, + specials={ "compat", 0x61, 0x2F, 0x63 }, unicodeslot=0x2100, }, [0x2101]={ @@ -58907,7 +60196,7 @@ characters.data={ description="ADDRESSED TO THE SUBJECT", direction="on", linebreak="al", - specials={ "compat", 0x0061, 0x002F, 0x0073 }, + specials={ "compat", 0x61, 0x2F, 0x73 }, unicodeslot=0x2101, }, [0x2102]={ @@ -58917,7 +60206,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="complexes", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x2102, }, [0x2103]={ @@ -58928,7 +60217,7 @@ characters.data={ description="DEGREE CELSIUS", direction="on", linebreak="po", - specials={ "compat", 0x00B0, 0x0043 }, + specials={ "compat", 0xB0, 0x43 }, unicodeslot=0x2103, }, [0x2104]={ @@ -58945,7 +60234,7 @@ characters.data={ description="CARE OF", direction="on", linebreak="ai", - specials={ "compat", 0x0063, 0x002F, 0x006F }, + specials={ "compat", 0x63, 0x2F, 0x6F }, unicodeslot=0x2105, }, [0x2106]={ @@ -58953,7 +60242,7 @@ characters.data={ description="CADA UNA", direction="on", linebreak="al", - specials={ "compat", 0x0063, 0x002F, 0x0075 }, + specials={ "compat", 0x63, 0x2F, 0x75 }, unicodeslot=0x2106, }, [0x2107]={ @@ -58963,7 +60252,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="Eulerconst", - specials={ "compat", 0x0190 }, + specials={ "compat", 0x190 }, unicodeslot=0x2107, }, [0x2108]={ @@ -58980,7 +60269,7 @@ characters.data={ description="DEGREE FAHRENHEIT", direction="on", linebreak="po", - specials={ "compat", 0x00B0, 0x0046 }, + specials={ "compat", 0xB0, 0x46 }, unicodeslot=0x2109, }, [0x210A]={ @@ -58988,7 +60277,7 @@ characters.data={ description="SCRIPT SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x210A, }, [0x210B]={ @@ -58996,7 +60285,7 @@ characters.data={ description="SCRIPT CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x210B, }, [0x210C]={ @@ -59004,7 +60293,7 @@ characters.data={ description="BLACK-LETTER CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x210C, }, [0x210D]={ @@ -59012,7 +60301,7 @@ characters.data={ description="DOUBLE-STRUCK CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x210D, }, [0x210E]={ @@ -59022,7 +60311,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="Plankconst", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x210E, }, [0x210F]={ @@ -59040,7 +60329,7 @@ characters.data={ name="hbar", }, }, - specials={ "font", 0x0127 }, + specials={ "font", 0x127 }, unicodeslot=0x210F, }, [0x2110]={ @@ -59048,7 +60337,7 @@ characters.data={ description="SCRIPT CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x2110, }, [0x2111]={ @@ -59059,7 +60348,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="Im", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x2111, }, [0x2112]={ @@ -59067,7 +60356,7 @@ characters.data={ description="SCRIPT CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x2112, }, [0x2113]={ @@ -59079,7 +60368,7 @@ characters.data={ linebreak="ai", mathclass="default", mathname="ell", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x2113, }, [0x2114]={ @@ -59096,7 +60385,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="naturalnumbers", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x2115, }, [0x2116]={ @@ -59107,7 +60396,7 @@ characters.data={ description="NUMERO SIGN", direction="on", linebreak="pr", - specials={ "compat", 0x004E, 0x006F }, + specials={ "compat", 0x4E, 0x6F }, unicodeslot=0x2116, }, [0x2117]={ @@ -59135,7 +60424,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="primes", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x2119, }, [0x211A]={ @@ -59145,7 +60434,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="rationals", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x211A, }, [0x211B]={ @@ -59153,7 +60442,7 @@ characters.data={ description="SCRIPT CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x211B, }, [0x211C]={ @@ -59164,7 +60453,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="Re", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x211C, }, [0x211D]={ @@ -59174,7 +60463,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="reals", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x211D, }, [0x211E]={ @@ -59197,7 +60486,7 @@ characters.data={ description="SERVICE MARK", direction="on", linebreak="al", - specials={ "super", 0x0053, 0x004D }, + specials={ "super", 0x53, 0x4D }, unicodeslot=0x2120, }, [0x2121]={ @@ -59207,7 +60496,7 @@ characters.data={ description="TELEPHONE SIGN", direction="on", linebreak="ai", - specials={ "compat", 0x0054, 0x0045, 0x004C }, + specials={ "compat", 0x54, 0x45, 0x4C }, unicodeslot=0x2121, }, [0x2122]={ @@ -59218,7 +60507,7 @@ characters.data={ description="TRADE MARK SIGN", direction="on", linebreak="ai", - specials={ "super", 0x0054, 0x004D }, + specials={ "super", 0x54, 0x4D }, unicodeslot=0x2122, }, [0x2123]={ @@ -59235,7 +60524,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="integers", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x2124, }, [0x2125]={ @@ -59253,11 +60542,11 @@ characters.data={ contextname="textohm", description="OHM SIGN", direction="l", - lccode=0x03C9, + lccode=0x3C9, linebreak="al", mathclass="variable", mathname="ohm", - specials={ "char", 0x03A9 }, + specials={ "char", 0x3A9 }, unicodeslot=0x2126, }, [0x2127]={ @@ -59275,7 +60564,7 @@ characters.data={ description="BLACK-LETTER CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x2128, }, [0x2129]={ @@ -59292,9 +60581,9 @@ characters.data={ contextname="textkelvin", description="KELVIN SIGN", direction="l", - lccode=0x006B, + lccode=0x6B, linebreak="al", - specials={ "char", 0x004B }, + specials={ "char", 0x4B }, unicodeslot=0x212A, }, [0x212B]={ @@ -59304,11 +60593,11 @@ characters.data={ contextname="textAngstrom", description="ANGSTROM SIGN", direction="l", - lccode=0x00E5, + lccode=0xE5, linebreak="ai", mathclass="variable", mathname="Angstrom", - specials={ "char", 0x00C5 }, + specials={ "char", 0xC5 }, unicodeslot=0x212B, }, [0x212C]={ @@ -59316,7 +60605,7 @@ characters.data={ description="SCRIPT CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x212C, }, [0x212D]={ @@ -59324,7 +60613,7 @@ characters.data={ description="BLACK-LETTER CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x212D, }, [0x212E]={ @@ -59340,7 +60629,7 @@ characters.data={ description="SCRIPT SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x212F, }, [0x2130]={ @@ -59348,7 +60637,7 @@ characters.data={ description="SCRIPT CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x2130, }, [0x2131]={ @@ -59356,7 +60645,7 @@ characters.data={ description="SCRIPT CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x2131, }, [0x2132]={ @@ -59374,7 +60663,7 @@ characters.data={ description="SCRIPT CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x2133, }, [0x2134]={ @@ -59382,7 +60671,7 @@ characters.data={ description="SCRIPT SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x2134, }, [0x2135]={ @@ -59393,7 +60682,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="aleph", - specials={ "compat", 0x05D0 }, + specials={ "compat", 0x5D0 }, unicodeslot=0x2135, }, [0x2136]={ @@ -59403,7 +60692,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="beth", - specials={ "compat", 0x05D1 }, + specials={ "compat", 0x5D1 }, unicodeslot=0x2136, }, [0x2137]={ @@ -59413,7 +60702,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="gimel", - specials={ "compat", 0x05D2 }, + specials={ "compat", 0x5D2 }, unicodeslot=0x2137, }, [0x2138]={ @@ -59423,7 +60712,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="daleth", - specials={ "compat", 0x05D3 }, + specials={ "compat", 0x5D3 }, unicodeslot=0x2138, }, [0x2139]={ @@ -59431,7 +60720,7 @@ characters.data={ description="INFORMATION SOURCE", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x2139, variants={ [0xFE0E]="text style", @@ -59450,7 +60739,7 @@ characters.data={ description="FACSIMILE SIGN", direction="on", linebreak="al", - specials={ "compat", 0x0046, 0x0041, 0x0058 }, + specials={ "compat", 0x46, 0x41, 0x58 }, unicodeslot=0x213B, }, [0x213C]={ @@ -59458,7 +60747,7 @@ characters.data={ description="DOUBLE-STRUCK SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x213C, }, [0x213D]={ @@ -59466,7 +60755,7 @@ characters.data={ description="DOUBLE-STRUCK SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x213D, }, [0x213E]={ @@ -59474,7 +60763,7 @@ characters.data={ description="DOUBLE-STRUCK CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x213E, }, [0x213F]={ @@ -59482,7 +60771,7 @@ characters.data={ description="DOUBLE-STRUCK CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x213F, }, [0x2140]={ @@ -59536,7 +60825,7 @@ characters.data={ linebreak="al", mathclass="nothing", mathname="differentialD", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x2145, }, [0x2146]={ @@ -59546,7 +60835,7 @@ characters.data={ linebreak="al", mathclass="nothing", mathname="differentiald", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x2146, }, [0x2147]={ @@ -59556,7 +60845,7 @@ characters.data={ linebreak="al", mathclass="nothing", mathname="exponentiale", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x2147, }, [0x2148]={ @@ -59566,7 +60855,7 @@ characters.data={ linebreak="al", mathclass="nothing", mathname="imaginaryi", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x2148, }, [0x2149]={ @@ -59576,7 +60865,7 @@ characters.data={ linebreak="al", mathclass="nothing", mathname="imaginaryj", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x2149, }, [0x214A]={ @@ -59631,7 +60920,7 @@ characters.data={ description="VULGAR FRACTION ONE SEVENTH", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044, 0x0037 }, + specials={ "fraction", 0x31, 0x2044, 0x37 }, unicodeslot=0x2150, }, [0x2151]={ @@ -59639,7 +60928,7 @@ characters.data={ description="VULGAR FRACTION ONE NINTH", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044, 0x0039 }, + specials={ "fraction", 0x31, 0x2044, 0x39 }, unicodeslot=0x2151, }, [0x2152]={ @@ -59647,7 +60936,7 @@ characters.data={ description="VULGAR FRACTION ONE TENTH", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044, 0x0031, 0x0030 }, + specials={ "fraction", 0x31, 0x2044, 0x31, 0x30 }, unicodeslot=0x2152, }, [0x2153]={ @@ -59658,7 +60947,7 @@ characters.data={ description="VULGAR FRACTION ONE THIRD", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044, 0x0033 }, + specials={ "fraction", 0x31, 0x2044, 0x33 }, unicodeslot=0x2153, }, [0x2154]={ @@ -59669,7 +60958,7 @@ characters.data={ description="VULGAR FRACTION TWO THIRDS", direction="on", linebreak="ai", - specials={ "fraction", 0x0032, 0x2044, 0x0033 }, + specials={ "fraction", 0x32, 0x2044, 0x33 }, unicodeslot=0x2154, }, [0x2155]={ @@ -59678,7 +60967,7 @@ characters.data={ description="VULGAR FRACTION ONE FIFTH", direction="on", linebreak="ai", - specials={ "fraction", 0x0031, 0x2044, 0x0035 }, + specials={ "fraction", 0x31, 0x2044, 0x35 }, unicodeslot=0x2155, }, [0x2156]={ @@ -59687,7 +60976,7 @@ characters.data={ description="VULGAR FRACTION TWO FIFTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0032, 0x2044, 0x0035 }, + specials={ "fraction", 0x32, 0x2044, 0x35 }, unicodeslot=0x2156, }, [0x2157]={ @@ -59696,7 +60985,7 @@ characters.data={ description="VULGAR FRACTION THREE FIFTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0033, 0x2044, 0x0035 }, + specials={ "fraction", 0x33, 0x2044, 0x35 }, unicodeslot=0x2157, }, [0x2158]={ @@ -59705,7 +60994,7 @@ characters.data={ description="VULGAR FRACTION FOUR FIFTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0034, 0x2044, 0x0035 }, + specials={ "fraction", 0x34, 0x2044, 0x35 }, unicodeslot=0x2158, }, [0x2159]={ @@ -59714,7 +61003,7 @@ characters.data={ description="VULGAR FRACTION ONE SIXTH", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044, 0x0036 }, + specials={ "fraction", 0x31, 0x2044, 0x36 }, unicodeslot=0x2159, }, [0x215A]={ @@ -59723,7 +61012,7 @@ characters.data={ description="VULGAR FRACTION FIVE SIXTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0035, 0x2044, 0x0036 }, + specials={ "fraction", 0x35, 0x2044, 0x36 }, unicodeslot=0x215A, }, [0x215B]={ @@ -59734,7 +61023,7 @@ characters.data={ description="VULGAR FRACTION ONE EIGHTH", direction="on", linebreak="ai", - specials={ "fraction", 0x0031, 0x2044, 0x0038 }, + specials={ "fraction", 0x31, 0x2044, 0x38 }, unicodeslot=0x215B, }, [0x215C]={ @@ -59745,7 +61034,7 @@ characters.data={ description="VULGAR FRACTION THREE EIGHTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0033, 0x2044, 0x0038 }, + specials={ "fraction", 0x33, 0x2044, 0x38 }, unicodeslot=0x215C, }, [0x215D]={ @@ -59756,7 +61045,7 @@ characters.data={ description="VULGAR FRACTION FIVE EIGHTHS", direction="on", linebreak="al", - specials={ "fraction", 0x0035, 0x2044, 0x0038 }, + specials={ "fraction", 0x35, 0x2044, 0x38 }, unicodeslot=0x215D, }, [0x215E]={ @@ -59767,7 +61056,7 @@ characters.data={ description="VULGAR FRACTION SEVEN EIGHTHS", direction="on", linebreak="ai", - specials={ "fraction", 0x0037, 0x2044, 0x0038 }, + specials={ "fraction", 0x37, 0x2044, 0x38 }, unicodeslot=0x215E, }, [0x215F]={ @@ -59775,7 +61064,7 @@ characters.data={ description="FRACTION NUMERATOR ONE", direction="on", linebreak="al", - specials={ "fraction", 0x0031, 0x2044 }, + specials={ "fraction", 0x31, 0x2044 }, unicodeslot=0x215F, }, [0x2160]={ @@ -59787,7 +61076,7 @@ characters.data={ direction="l", lccode=0x2170, linebreak="ai", - specials={ "compat", 0x0049 }, + specials={ "compat", 0x49 }, unicodeslot=0x2160, }, [0x2161]={ @@ -59799,7 +61088,7 @@ characters.data={ direction="l", lccode=0x2171, linebreak="ai", - specials={ "compat", 0x0049, 0x0049 }, + specials={ "compat", 0x49, 0x49 }, unicodeslot=0x2161, }, [0x2162]={ @@ -59811,7 +61100,7 @@ characters.data={ direction="l", lccode=0x2172, linebreak="ai", - specials={ "compat", 0x0049, 0x0049, 0x0049 }, + specials={ "compat", 0x49, 0x49, 0x49 }, unicodeslot=0x2162, }, [0x2163]={ @@ -59823,7 +61112,7 @@ characters.data={ direction="l", lccode=0x2173, linebreak="ai", - specials={ "compat", 0x0049, 0x0056 }, + specials={ "compat", 0x49, 0x56 }, unicodeslot=0x2163, }, [0x2164]={ @@ -59835,7 +61124,7 @@ characters.data={ direction="l", lccode=0x2174, linebreak="ai", - specials={ "compat", 0x0056 }, + specials={ "compat", 0x56 }, unicodeslot=0x2164, }, [0x2165]={ @@ -59847,7 +61136,7 @@ characters.data={ direction="l", lccode=0x2175, linebreak="ai", - specials={ "compat", 0x0056, 0x0049 }, + specials={ "compat", 0x56, 0x49 }, unicodeslot=0x2165, }, [0x2166]={ @@ -59859,7 +61148,7 @@ characters.data={ direction="l", lccode=0x2176, linebreak="ai", - specials={ "compat", 0x0056, 0x0049, 0x0049 }, + specials={ "compat", 0x56, 0x49, 0x49 }, unicodeslot=0x2166, }, [0x2167]={ @@ -59871,7 +61160,7 @@ characters.data={ direction="l", lccode=0x2177, linebreak="ai", - specials={ "compat", 0x0056, 0x0049, 0x0049, 0x0049 }, + specials={ "compat", 0x56, 0x49, 0x49, 0x49 }, unicodeslot=0x2167, }, [0x2168]={ @@ -59883,7 +61172,7 @@ characters.data={ direction="l", lccode=0x2178, linebreak="ai", - specials={ "compat", 0x0049, 0x0058 }, + specials={ "compat", 0x49, 0x58 }, unicodeslot=0x2168, }, [0x2169]={ @@ -59895,7 +61184,7 @@ characters.data={ direction="l", lccode=0x2179, linebreak="ai", - specials={ "compat", 0x0058 }, + specials={ "compat", 0x58 }, unicodeslot=0x2169, }, [0x216A]={ @@ -59907,7 +61196,7 @@ characters.data={ direction="l", lccode=0x217A, linebreak="ai", - specials={ "compat", 0x0058, 0x0049 }, + specials={ "compat", 0x58, 0x49 }, unicodeslot=0x216A, }, [0x216B]={ @@ -59919,7 +61208,7 @@ characters.data={ direction="l", lccode=0x217B, linebreak="ai", - specials={ "compat", 0x0058, 0x0049, 0x0049 }, + specials={ "compat", 0x58, 0x49, 0x49 }, unicodeslot=0x216B, }, [0x216C]={ @@ -59929,7 +61218,7 @@ characters.data={ direction="l", lccode=0x217C, linebreak="al", - specials={ "compat", 0x004C }, + specials={ "compat", 0x4C }, unicodeslot=0x216C, }, [0x216D]={ @@ -59939,7 +61228,7 @@ characters.data={ direction="l", lccode=0x217D, linebreak="al", - specials={ "compat", 0x0043 }, + specials={ "compat", 0x43 }, unicodeslot=0x216D, }, [0x216E]={ @@ -59949,7 +61238,7 @@ characters.data={ direction="l", lccode=0x217E, linebreak="al", - specials={ "compat", 0x0044 }, + specials={ "compat", 0x44 }, unicodeslot=0x216E, }, [0x216F]={ @@ -59959,7 +61248,7 @@ characters.data={ direction="l", lccode=0x217F, linebreak="al", - specials={ "compat", 0x004D }, + specials={ "compat", 0x4D }, unicodeslot=0x216F, }, [0x2170]={ @@ -59970,7 +61259,7 @@ characters.data={ description="SMALL ROMAN NUMERAL ONE", direction="l", linebreak="ai", - specials={ "compat", 0x0069 }, + specials={ "compat", 0x69 }, uccode=0x2160, unicodeslot=0x2170, }, @@ -59982,7 +61271,7 @@ characters.data={ description="SMALL ROMAN NUMERAL TWO", direction="l", linebreak="ai", - specials={ "compat", 0x0069, 0x0069 }, + specials={ "compat", 0x69, 0x69 }, uccode=0x2161, unicodeslot=0x2171, }, @@ -59994,7 +61283,7 @@ characters.data={ description="SMALL ROMAN NUMERAL THREE", direction="l", linebreak="ai", - specials={ "compat", 0x0069, 0x0069, 0x0069 }, + specials={ "compat", 0x69, 0x69, 0x69 }, uccode=0x2162, unicodeslot=0x2172, }, @@ -60006,7 +61295,7 @@ characters.data={ description="SMALL ROMAN NUMERAL FOUR", direction="l", linebreak="ai", - specials={ "compat", 0x0069, 0x0076 }, + specials={ "compat", 0x69, 0x76 }, uccode=0x2163, unicodeslot=0x2173, }, @@ -60018,7 +61307,7 @@ characters.data={ description="SMALL ROMAN NUMERAL FIVE", direction="l", linebreak="ai", - specials={ "compat", 0x0076 }, + specials={ "compat", 0x76 }, uccode=0x2164, unicodeslot=0x2174, }, @@ -60030,7 +61319,7 @@ characters.data={ description="SMALL ROMAN NUMERAL SIX", direction="l", linebreak="ai", - specials={ "compat", 0x0076, 0x0069 }, + specials={ "compat", 0x76, 0x69 }, uccode=0x2165, unicodeslot=0x2175, }, @@ -60042,7 +61331,7 @@ characters.data={ description="SMALL ROMAN NUMERAL SEVEN", direction="l", linebreak="ai", - specials={ "compat", 0x0076, 0x0069, 0x0069 }, + specials={ "compat", 0x76, 0x69, 0x69 }, uccode=0x2166, unicodeslot=0x2176, }, @@ -60054,7 +61343,7 @@ characters.data={ description="SMALL ROMAN NUMERAL EIGHT", direction="l", linebreak="ai", - specials={ "compat", 0x0076, 0x0069, 0x0069, 0x0069 }, + specials={ "compat", 0x76, 0x69, 0x69, 0x69 }, uccode=0x2167, unicodeslot=0x2177, }, @@ -60066,7 +61355,7 @@ characters.data={ description="SMALL ROMAN NUMERAL NINE", direction="l", linebreak="ai", - specials={ "compat", 0x0069, 0x0078 }, + specials={ "compat", 0x69, 0x78 }, uccode=0x2168, unicodeslot=0x2178, }, @@ -60078,7 +61367,7 @@ characters.data={ description="SMALL ROMAN NUMERAL TEN", direction="l", linebreak="ai", - specials={ "compat", 0x0078 }, + specials={ "compat", 0x78 }, uccode=0x2169, unicodeslot=0x2179, }, @@ -60089,7 +61378,7 @@ characters.data={ description="SMALL ROMAN NUMERAL ELEVEN", direction="l", linebreak="al", - specials={ "compat", 0x0078, 0x0069 }, + specials={ "compat", 0x78, 0x69 }, uccode=0x216A, unicodeslot=0x217A, }, @@ -60100,7 +61389,7 @@ characters.data={ description="SMALL ROMAN NUMERAL TWELVE", direction="l", linebreak="al", - specials={ "compat", 0x0078, 0x0069, 0x0069 }, + specials={ "compat", 0x78, 0x69, 0x69 }, uccode=0x216B, unicodeslot=0x217B, }, @@ -60110,7 +61399,7 @@ characters.data={ description="SMALL ROMAN NUMERAL FIFTY", direction="l", linebreak="al", - specials={ "compat", 0x006C }, + specials={ "compat", 0x6C }, uccode=0x216C, unicodeslot=0x217C, }, @@ -60120,7 +61409,7 @@ characters.data={ description="SMALL ROMAN NUMERAL ONE HUNDRED", direction="l", linebreak="al", - specials={ "compat", 0x0063 }, + specials={ "compat", 0x63 }, uccode=0x216D, unicodeslot=0x217D, }, @@ -60130,7 +61419,7 @@ characters.data={ description="SMALL ROMAN NUMERAL FIVE HUNDRED", direction="l", linebreak="al", - specials={ "compat", 0x0064 }, + specials={ "compat", 0x64 }, uccode=0x216E, unicodeslot=0x217E, }, @@ -60140,7 +61429,7 @@ characters.data={ description="SMALL ROMAN NUMERAL ONE THOUSAND", direction="l", linebreak="al", - specials={ "compat", 0x006D }, + specials={ "compat", 0x6D }, uccode=0x216F, unicodeslot=0x217F, }, @@ -60215,7 +61504,7 @@ characters.data={ description="VULGAR FRACTION ZERO THIRDS", direction="on", linebreak="ai", - specials={ "fraction", 0x0030, 0x2044, 0x0033 }, + specials={ "fraction", 0x30, 0x2044, 0x33 }, unicodeslot=0x2189, }, [0x2190]={ @@ -60402,7 +61691,7 @@ characters.data={ mathclass="relation", mathextensible="l", mathname="nleftarrow", - specials={ "char", 0x2190, 0x0338 }, + specials={ "char", 0x2190, 0x338 }, unicodeslot=0x219A, }, [0x219B]={ @@ -60413,7 +61702,7 @@ characters.data={ mathclass="relation", mathextensible="r", mathname="nrightarrow", - specials={ "char", 0x2192, 0x0338 }, + specials={ "char", 0x2192, 0x338 }, unicodeslot=0x219B, }, [0x219C]={ @@ -60618,7 +61907,7 @@ characters.data={ mathclass="relation", mathextensible="h", mathname="nleftrightarrow", - specials={ "char", 0x2194, 0x0338 }, + specials={ "char", 0x2194, 0x338 }, unicodeslot=0x21AE, }, [0x21AF]={ @@ -60962,7 +62251,7 @@ characters.data={ mathclass="relation", mathextensible="l", mathname="nLeftarrow", - specials={ "char", 0x21D0, 0x0338 }, + specials={ "char", 0x21D0, 0x338 }, unicodeslot=0x21CD, }, [0x21CE]={ @@ -60973,7 +62262,7 @@ characters.data={ mathclass="relation", mathextensible="h", mathname="nLeftrightarrow", - specials={ "char", 0x21D4, 0x0338 }, + specials={ "char", 0x21D4, 0x338 }, unicodeslot=0x21CE, }, [0x21CF]={ @@ -60985,7 +62274,7 @@ characters.data={ mathclass="relation", mathextensible="r", mathname="nRightarrow", - specials={ "char", 0x21D2, 0x0338 }, + specials={ "char", 0x21D2, 0x338 }, unicodeslot=0x21CF, }, [0x21D0]={ @@ -61529,7 +62818,7 @@ characters.data={ linebreak="al", mathclass="ordinary", mathname="nexists", - specials={ "char", 0x2203, 0x0338 }, + specials={ "char", 0x2203, 0x338 }, unicodeslot=0x2204, }, [0x2205]={ @@ -61590,7 +62879,7 @@ characters.data={ }, }, mirror=0x220C, - specials={ "char", 0x2208, 0x0338 }, + specials={ "char", 0x2208, 0x338 }, unicodeslot=0x2209, }, [0x220A]={ @@ -61638,7 +62927,7 @@ characters.data={ }, }, mirror=0x2209, - specials={ "char", 0x220B, 0x0338 }, + specials={ "char", 0x220B, 0x338 }, unicodeslot=0x220C, }, [0x220D]={ @@ -61903,7 +63192,7 @@ characters.data={ name="nmid", }, }, - specials={ "char", 0x2223, 0x0338 }, + specials={ "char", 0x2223, 0x338 }, unicodeslot=0x2224, }, [0x2225]={ @@ -61929,7 +63218,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nparallel", - specials={ "char", 0x2225, 0x0338 }, + specials={ "char", 0x2225, 0x338 }, unicodeslot=0x2226, }, [0x2227]={ @@ -62246,7 +63535,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nsim", - specials={ "char", 0x223C, 0x0338 }, + specials={ "char", 0x223C, 0x338 }, unicodeslot=0x2241, }, [0x2242]={ @@ -62276,7 +63565,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nsimeq", - specials={ "char", 0x2243, 0x0338 }, + specials={ "char", 0x2243, 0x338 }, unicodeslot=0x2244, }, [0x2245]={ @@ -62321,7 +63610,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="approxnEq", - specials={ "char", 0x2245, 0x0338 }, + specials={ "char", 0x2245, 0x338 }, unicodeslot=0x2247, }, [0x2248]={ @@ -62342,7 +63631,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="napprox", - specials={ "char", 0x2248, 0x0338 }, + specials={ "char", 0x2248, 0x338 }, unicodeslot=0x2249, }, [0x224A]={ @@ -62572,7 +63861,7 @@ characters.data={ name="ne", }, }, - specials={ "char", 0x003D, 0x0338 }, + specials={ "char", 0x3D, 0x338 }, unicodeslot=0x2260, }, [0x2261]={ @@ -62597,7 +63886,7 @@ characters.data={ mathextensible="h", mathfiller="triplerelfill", mathname="nequiv", - specials={ "char", 0x2261, 0x0338 }, + specials={ "char", 0x2261, 0x338 }, unicodeslot=0x2262, }, [0x2263]={ @@ -62739,7 +64028,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nasymp", - specials={ "char", 0x224D, 0x0338 }, + specials={ "char", 0x224D, 0x338 }, unicodeslot=0x226D, }, [0x226E]={ @@ -62752,7 +64041,7 @@ characters.data={ mathclass="relation", mathname="nless", mirror=0x226F, - specials={ "char", 0x003C, 0x0338 }, + specials={ "char", 0x3C, 0x338 }, unicodeslot=0x226E, }, [0x226F]={ @@ -62765,7 +64054,7 @@ characters.data={ mathclass="relation", mathname="ngtr", mirror=0x226E, - specials={ "char", 0x003E, 0x0338 }, + specials={ "char", 0x3E, 0x338 }, unicodeslot=0x226F, }, [0x2270]={ @@ -62777,7 +64066,7 @@ characters.data={ mathclass="relation", mathname="nleq", mirror=0x2271, - specials={ "char", 0x2264, 0x0338 }, + specials={ "char", 0x2264, 0x338 }, unicodeslot=0x2270, }, [0x2271]={ @@ -62789,7 +64078,7 @@ characters.data={ mathclass="relation", mathname="ngeq", mirror=0x2270, - specials={ "char", 0x2265, 0x0338 }, + specials={ "char", 0x2265, 0x338 }, unicodeslot=0x2271, }, [0x2272]={ @@ -62828,7 +64117,7 @@ characters.data={ mathclass="relation", mathname="nlesssim", mirror=0x2275, - specials={ "char", 0x2272, 0x0338 }, + specials={ "char", 0x2272, 0x338 }, unicodeslot=0x2274, }, [0x2275]={ @@ -62839,7 +64128,7 @@ characters.data={ mathclass="relation", mathname="ngtrsim", mirror=0x2274, - specials={ "char", 0x2273, 0x0338 }, + specials={ "char", 0x2273, 0x338 }, unicodeslot=0x2275, }, [0x2276]={ @@ -62872,7 +64161,7 @@ characters.data={ mathclass="relation", mathname="nlessgtr", mirror=0x2279, - specials={ "char", 0x2276, 0x0338 }, + specials={ "char", 0x2276, 0x338 }, unicodeslot=0x2278, }, [0x2279]={ @@ -62884,7 +64173,7 @@ characters.data={ mathclass="relation", mathname="ngtrless", mirror=0x2278, - specials={ "char", 0x2277, 0x0338 }, + specials={ "char", 0x2277, 0x338 }, unicodeslot=0x2279, }, [0x227A]={ @@ -62958,7 +64247,7 @@ characters.data={ mathclass="relation", mathname="nprec", mirror=0x2281, - specials={ "char", 0x227A, 0x0338 }, + specials={ "char", 0x227A, 0x338 }, unicodeslot=0x2280, }, [0x2281]={ @@ -62970,7 +64259,7 @@ characters.data={ mathclass="relation", mathname="nsucc", mirror=0x2280, - specials={ "char", 0x227B, 0x0338 }, + specials={ "char", 0x227B, 0x338 }, unicodeslot=0x2281, }, [0x2282]={ @@ -63006,7 +64295,7 @@ characters.data={ mathclass="relation", mathname="nsubset", mirror=0x2285, - specials={ "char", 0x2282, 0x0338 }, + specials={ "char", 0x2282, 0x338 }, unicodeslot=0x2284, }, [0x2285]={ @@ -63018,7 +64307,7 @@ characters.data={ mathclass="relation", mathname="nsupset", mirror=0x2284, - specials={ "char", 0x2283, 0x0338 }, + specials={ "char", 0x2283, 0x338 }, unicodeslot=0x2285, }, [0x2286]={ @@ -63053,7 +64342,7 @@ characters.data={ mathclass="relation", mathname="nsubseteq", mirror=0x2289, - specials={ "char", 0x2286, 0x0338 }, + specials={ "char", 0x2286, 0x338 }, unicodeslot=0x2288, }, [0x2289]={ @@ -63064,7 +64353,7 @@ characters.data={ mathclass="relation", mathname="nsupseteq", mirror=0x2288, - specials={ "char", 0x2287, 0x0338 }, + specials={ "char", 0x2287, 0x338 }, unicodeslot=0x2289, }, [0x228A]={ @@ -63428,7 +64717,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nvdash", - specials={ "char", 0x22A2, 0x0338 }, + specials={ "char", 0x22A2, 0x338 }, unicodeslot=0x22AC, }, [0x22AD]={ @@ -63438,7 +64727,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nvDash", - specials={ "char", 0x22A8, 0x0338 }, + specials={ "char", 0x22A8, 0x338 }, unicodeslot=0x22AD, }, [0x22AE]={ @@ -63448,7 +64737,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nVdash", - specials={ "char", 0x22A9, 0x0338 }, + specials={ "char", 0x22A9, 0x338 }, unicodeslot=0x22AE, }, [0x22AF]={ @@ -63458,7 +64747,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="nVDash", - specials={ "char", 0x22AB, 0x0338 }, + specials={ "char", 0x22AB, 0x338 }, unicodeslot=0x22AF, }, [0x22B0]={ @@ -63963,7 +65252,7 @@ characters.data={ mathclass="relation", mathname="npreccurlyeq", mirror=0x22E1, - specials={ "char", 0x227C, 0x0338 }, + specials={ "char", 0x227C, 0x338 }, unicodeslot=0x22E0, }, [0x22E1]={ @@ -63974,7 +65263,7 @@ characters.data={ mathclass="relation", mathname="nsucccurlyeq", mirror=0x22E0, - specials={ "char", 0x227D, 0x0338 }, + specials={ "char", 0x227D, 0x338 }, unicodeslot=0x22E1, }, [0x22E2]={ @@ -63985,7 +65274,7 @@ characters.data={ mathclass="relation", mathname="nsqsubseteq", mirror=0x22E3, - specials={ "char", 0x2291, 0x0338 }, + specials={ "char", 0x2291, 0x338 }, unicodeslot=0x22E2, }, [0x22E3]={ @@ -63996,7 +65285,7 @@ characters.data={ mathclass="relation", mathname="nsqsupseteq", mirror=0x22E2, - specials={ "char", 0x2292, 0x0338 }, + specials={ "char", 0x2292, 0x338 }, unicodeslot=0x22E3, }, [0x22E4]={ @@ -64067,7 +65356,7 @@ characters.data={ mathclass="relation", mathname="ntriangleright", mirror=0x22EB, - specials={ "char", 0x22B2, 0x0338 }, + specials={ "char", 0x22B2, 0x338 }, unicodeslot=0x22EA, }, [0x22EB]={ @@ -64078,7 +65367,7 @@ characters.data={ mathclass="relation", mathname="ntriangleleft", mirror=0x22EA, - specials={ "char", 0x22B3, 0x0338 }, + specials={ "char", 0x22B3, 0x338 }, unicodeslot=0x22EB, }, [0x22EC]={ @@ -64089,7 +65378,7 @@ characters.data={ mathclass="relation", mathname="ntrianglelefteq", mirror=0x22ED, - specials={ "char", 0x22B4, 0x0338 }, + specials={ "char", 0x22B4, 0x338 }, unicodeslot=0x22EC, }, [0x22ED]={ @@ -64100,7 +65389,7 @@ characters.data={ mathclass="relation", mathname="ntrianglerighteq", mirror=0x22EC, - specials={ "char", 0x22B5, 0x0338 }, + specials={ "char", 0x22B5, 0x338 }, unicodeslot=0x22ED, }, [0x22EE]={ @@ -64256,8 +65545,14 @@ characters.data={ direction="on", linebreak="al", mathspec={ - { class="ord", name="varnothing" }, - { class="ord", name="diameter" }, + { + class="ord", + name="varnothing", + }, + { + class="ord", + name="diameter", + }, }, unicodeslot=0x2300, }, @@ -64317,7 +65612,7 @@ characters.data={ category="sm", description="LEFT CEILING", direction="on", - linebreak="al", + linebreak="op", mathspec={ { class="open", @@ -64335,7 +65630,7 @@ characters.data={ category="sm", description="RIGHT CEILING", direction="on", - linebreak="al", + linebreak="cl", mathspec={ { class="close", @@ -64353,7 +65648,7 @@ characters.data={ category="sm", description="LEFT FLOOR", direction="on", - linebreak="al", + linebreak="op", mathclass="open", mathname="lfloor", mirror=0x230B, @@ -64363,7 +65658,7 @@ characters.data={ category="sm", description="RIGHT FLOOR", direction="on", - linebreak="al", + linebreak="cl", mathclass="close", mathname="rfloor", mirror=0x230A, @@ -65594,6 +66889,8 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="overbracket", + mathextensible="h", + mathfiller="overbracketfill", unicodeslot=0x23B4, }, [0x23B5]={ @@ -65603,6 +66900,8 @@ characters.data={ linebreak="al", mathclass="botaccent", mathname="underbracket", + mathextensible="h", + mathfiller="underbracketfill", unicodeslot=0x23B5, }, [0x23B6]={ @@ -65878,6 +67177,8 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="overparent", + mathextensible="h", + mathfiller="overparentfill", unicodeslot=0x23DC, }, [0x23DD]={ @@ -65887,6 +67188,8 @@ characters.data={ linebreak="al", mathclass="botaccent", mathname="underparent", + mathextensible="h", + mathfiller="underparentfill", unicodeslot=0x23DD, }, [0x23DE]={ @@ -65896,6 +67199,8 @@ characters.data={ linebreak="al", mathclass="topaccent", mathname="overbrace", + mathextensible="h", + mathfiller="overbracefill", unicodeslot=0x23DE, }, [0x23DF]={ @@ -65905,6 +67210,8 @@ characters.data={ linebreak="al", mathclass="botaccent", mathname="underbrace", + mathextensible="h", + mathfiller="underbracefill", unicodeslot=0x23DF, }, [0x23E0]={ @@ -66049,6 +67356,55 @@ characters.data={ linebreak="id", unicodeslot=0x23F3, }, + [0x23F4]={ + category="so", + description="BLACK MEDIUM LEFT-POINTING TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x23F4, + }, + [0x23F5]={ + category="so", + description="BLACK MEDIUM RIGHT-POINTING TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x23F5, + }, + [0x23F6]={ + category="so", + description="BLACK MEDIUM UP-POINTING TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x23F6, + }, + [0x23F7]={ + category="so", + description="BLACK MEDIUM DOWN-POINTING TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x23F7, + }, + [0x23F8]={ + category="so", + description="DOUBLE VERTICAL BAR", + direction="on", + linebreak="al", + unicodeslot=0x23F8, + }, + [0x23F9]={ + category="so", + description="BLACK SQUARE FOR STOP", + direction="on", + linebreak="al", + unicodeslot=0x23F9, + }, + [0x23FA]={ + category="so", + description="BLACK CIRCLE FOR RECORD", + direction="on", + linebreak="al", + unicodeslot=0x23FA, + }, [0x2400]={ category="so", description="SYMBOL FOR NULL", @@ -66407,7 +67763,7 @@ characters.data={ description="CIRCLED DIGIT ONE", direction="on", linebreak="ai", - specials={ "circle", 0x0031 }, + specials={ "circle", 0x31 }, unicodeslot=0x2460, }, [0x2461]={ @@ -66417,7 +67773,7 @@ characters.data={ description="CIRCLED DIGIT TWO", direction="on", linebreak="ai", - specials={ "circle", 0x0032 }, + specials={ "circle", 0x32 }, unicodeslot=0x2461, }, [0x2462]={ @@ -66427,7 +67783,7 @@ characters.data={ description="CIRCLED DIGIT THREE", direction="on", linebreak="ai", - specials={ "circle", 0x0033 }, + specials={ "circle", 0x33 }, unicodeslot=0x2462, }, [0x2463]={ @@ -66437,7 +67793,7 @@ characters.data={ description="CIRCLED DIGIT FOUR", direction="on", linebreak="ai", - specials={ "circle", 0x0034 }, + specials={ "circle", 0x34 }, unicodeslot=0x2463, }, [0x2464]={ @@ -66447,7 +67803,7 @@ characters.data={ description="CIRCLED DIGIT FIVE", direction="on", linebreak="ai", - specials={ "circle", 0x0035 }, + specials={ "circle", 0x35 }, unicodeslot=0x2464, }, [0x2465]={ @@ -66457,7 +67813,7 @@ characters.data={ description="CIRCLED DIGIT SIX", direction="on", linebreak="ai", - specials={ "circle", 0x0036 }, + specials={ "circle", 0x36 }, unicodeslot=0x2465, }, [0x2466]={ @@ -66467,7 +67823,7 @@ characters.data={ description="CIRCLED DIGIT SEVEN", direction="on", linebreak="ai", - specials={ "circle", 0x0037 }, + specials={ "circle", 0x37 }, unicodeslot=0x2466, }, [0x2467]={ @@ -66477,7 +67833,7 @@ characters.data={ description="CIRCLED DIGIT EIGHT", direction="on", linebreak="ai", - specials={ "circle", 0x0038 }, + specials={ "circle", 0x38 }, unicodeslot=0x2467, }, [0x2468]={ @@ -66487,7 +67843,7 @@ characters.data={ description="CIRCLED DIGIT NINE", direction="on", linebreak="ai", - specials={ "circle", 0x0039 }, + specials={ "circle", 0x39 }, unicodeslot=0x2468, }, [0x2469]={ @@ -66497,7 +67853,7 @@ characters.data={ description="CIRCLED NUMBER TEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0030 }, + specials={ "circle", 0x31, 0x30 }, unicodeslot=0x2469, }, [0x246A]={ @@ -66507,7 +67863,7 @@ characters.data={ description="CIRCLED NUMBER ELEVEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0031 }, + specials={ "circle", 0x31, 0x31 }, unicodeslot=0x246A, }, [0x246B]={ @@ -66517,7 +67873,7 @@ characters.data={ description="CIRCLED NUMBER TWELVE", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0032 }, + specials={ "circle", 0x31, 0x32 }, unicodeslot=0x246B, }, [0x246C]={ @@ -66527,7 +67883,7 @@ characters.data={ description="CIRCLED NUMBER THIRTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0033 }, + specials={ "circle", 0x31, 0x33 }, unicodeslot=0x246C, }, [0x246D]={ @@ -66537,7 +67893,7 @@ characters.data={ description="CIRCLED NUMBER FOURTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0034 }, + specials={ "circle", 0x31, 0x34 }, unicodeslot=0x246D, }, [0x246E]={ @@ -66547,7 +67903,7 @@ characters.data={ description="CIRCLED NUMBER FIFTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0035 }, + specials={ "circle", 0x31, 0x35 }, unicodeslot=0x246E, }, [0x246F]={ @@ -66557,7 +67913,7 @@ characters.data={ description="CIRCLED NUMBER SIXTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0036 }, + specials={ "circle", 0x31, 0x36 }, unicodeslot=0x246F, }, [0x2470]={ @@ -66567,7 +67923,7 @@ characters.data={ description="CIRCLED NUMBER SEVENTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0037 }, + specials={ "circle", 0x31, 0x37 }, unicodeslot=0x2470, }, [0x2471]={ @@ -66577,7 +67933,7 @@ characters.data={ description="CIRCLED NUMBER EIGHTEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0038 }, + specials={ "circle", 0x31, 0x38 }, unicodeslot=0x2471, }, [0x2472]={ @@ -66587,7 +67943,7 @@ characters.data={ description="CIRCLED NUMBER NINETEEN", direction="on", linebreak="ai", - specials={ "circle", 0x0031, 0x0039 }, + specials={ "circle", 0x31, 0x39 }, unicodeslot=0x2472, }, [0x2473]={ @@ -66597,7 +67953,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY", direction="on", linebreak="ai", - specials={ "circle", 0x0032, 0x0030 }, + specials={ "circle", 0x32, 0x30 }, unicodeslot=0x2473, }, [0x2474]={ @@ -66607,7 +67963,7 @@ characters.data={ description="PARENTHESIZED DIGIT ONE", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x29 }, unicodeslot=0x2474, }, [0x2475]={ @@ -66617,7 +67973,7 @@ characters.data={ description="PARENTHESIZED DIGIT TWO", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0032, 0x0029 }, + specials={ "compat", 0x28, 0x32, 0x29 }, unicodeslot=0x2475, }, [0x2476]={ @@ -66627,7 +67983,7 @@ characters.data={ description="PARENTHESIZED DIGIT THREE", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0033, 0x0029 }, + specials={ "compat", 0x28, 0x33, 0x29 }, unicodeslot=0x2476, }, [0x2477]={ @@ -66637,7 +67993,7 @@ characters.data={ description="PARENTHESIZED DIGIT FOUR", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0034, 0x0029 }, + specials={ "compat", 0x28, 0x34, 0x29 }, unicodeslot=0x2477, }, [0x2478]={ @@ -66647,7 +68003,7 @@ characters.data={ description="PARENTHESIZED DIGIT FIVE", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0035, 0x0029 }, + specials={ "compat", 0x28, 0x35, 0x29 }, unicodeslot=0x2478, }, [0x2479]={ @@ -66657,7 +68013,7 @@ characters.data={ description="PARENTHESIZED DIGIT SIX", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0036, 0x0029 }, + specials={ "compat", 0x28, 0x36, 0x29 }, unicodeslot=0x2479, }, [0x247A]={ @@ -66667,7 +68023,7 @@ characters.data={ description="PARENTHESIZED DIGIT SEVEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0037, 0x0029 }, + specials={ "compat", 0x28, 0x37, 0x29 }, unicodeslot=0x247A, }, [0x247B]={ @@ -66677,7 +68033,7 @@ characters.data={ description="PARENTHESIZED DIGIT EIGHT", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0038, 0x0029 }, + specials={ "compat", 0x28, 0x38, 0x29 }, unicodeslot=0x247B, }, [0x247C]={ @@ -66687,7 +68043,7 @@ characters.data={ description="PARENTHESIZED DIGIT NINE", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0039, 0x0029 }, + specials={ "compat", 0x28, 0x39, 0x29 }, unicodeslot=0x247C, }, [0x247D]={ @@ -66697,7 +68053,7 @@ characters.data={ description="PARENTHESIZED NUMBER TEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0030, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x30, 0x29 }, unicodeslot=0x247D, }, [0x247E]={ @@ -66707,7 +68063,7 @@ characters.data={ description="PARENTHESIZED NUMBER ELEVEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0031, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x31, 0x29 }, unicodeslot=0x247E, }, [0x247F]={ @@ -66717,7 +68073,7 @@ characters.data={ description="PARENTHESIZED NUMBER TWELVE", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0032, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x32, 0x29 }, unicodeslot=0x247F, }, [0x2480]={ @@ -66727,7 +68083,7 @@ characters.data={ description="PARENTHESIZED NUMBER THIRTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0033, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x33, 0x29 }, unicodeslot=0x2480, }, [0x2481]={ @@ -66737,7 +68093,7 @@ characters.data={ description="PARENTHESIZED NUMBER FOURTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0034, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x34, 0x29 }, unicodeslot=0x2481, }, [0x2482]={ @@ -66747,7 +68103,7 @@ characters.data={ description="PARENTHESIZED NUMBER FIFTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0035, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x35, 0x29 }, unicodeslot=0x2482, }, [0x2483]={ @@ -66757,7 +68113,7 @@ characters.data={ description="PARENTHESIZED NUMBER SIXTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0036, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x36, 0x29 }, unicodeslot=0x2483, }, [0x2484]={ @@ -66767,7 +68123,7 @@ characters.data={ description="PARENTHESIZED NUMBER SEVENTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0037, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x37, 0x29 }, unicodeslot=0x2484, }, [0x2485]={ @@ -66777,7 +68133,7 @@ characters.data={ description="PARENTHESIZED NUMBER EIGHTEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0038, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x38, 0x29 }, unicodeslot=0x2485, }, [0x2486]={ @@ -66787,7 +68143,7 @@ characters.data={ description="PARENTHESIZED NUMBER NINETEEN", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0031, 0x0039, 0x0029 }, + specials={ "compat", 0x28, 0x31, 0x39, 0x29 }, unicodeslot=0x2486, }, [0x2487]={ @@ -66797,7 +68153,7 @@ characters.data={ description="PARENTHESIZED NUMBER TWENTY", direction="on", linebreak="ai", - specials={ "compat", 0x0028, 0x0032, 0x0030, 0x0029 }, + specials={ "compat", 0x28, 0x32, 0x30, 0x29 }, unicodeslot=0x2487, }, [0x2488]={ @@ -66807,7 +68163,7 @@ characters.data={ description="DIGIT ONE FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x002E }, + specials={ "compat", 0x31, 0x2E }, unicodeslot=0x2488, }, [0x2489]={ @@ -66817,7 +68173,7 @@ characters.data={ description="DIGIT TWO FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0032, 0x002E }, + specials={ "compat", 0x32, 0x2E }, unicodeslot=0x2489, }, [0x248A]={ @@ -66827,7 +68183,7 @@ characters.data={ description="DIGIT THREE FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0033, 0x002E }, + specials={ "compat", 0x33, 0x2E }, unicodeslot=0x248A, }, [0x248B]={ @@ -66837,7 +68193,7 @@ characters.data={ description="DIGIT FOUR FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0034, 0x002E }, + specials={ "compat", 0x34, 0x2E }, unicodeslot=0x248B, }, [0x248C]={ @@ -66847,7 +68203,7 @@ characters.data={ description="DIGIT FIVE FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0035, 0x002E }, + specials={ "compat", 0x35, 0x2E }, unicodeslot=0x248C, }, [0x248D]={ @@ -66857,7 +68213,7 @@ characters.data={ description="DIGIT SIX FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0036, 0x002E }, + specials={ "compat", 0x36, 0x2E }, unicodeslot=0x248D, }, [0x248E]={ @@ -66867,7 +68223,7 @@ characters.data={ description="DIGIT SEVEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0037, 0x002E }, + specials={ "compat", 0x37, 0x2E }, unicodeslot=0x248E, }, [0x248F]={ @@ -66877,7 +68233,7 @@ characters.data={ description="DIGIT EIGHT FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0038, 0x002E }, + specials={ "compat", 0x38, 0x2E }, unicodeslot=0x248F, }, [0x2490]={ @@ -66887,7 +68243,7 @@ characters.data={ description="DIGIT NINE FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0039, 0x002E }, + specials={ "compat", 0x39, 0x2E }, unicodeslot=0x2490, }, [0x2491]={ @@ -66897,7 +68253,7 @@ characters.data={ description="NUMBER TEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0030, 0x002E }, + specials={ "compat", 0x31, 0x30, 0x2E }, unicodeslot=0x2491, }, [0x2492]={ @@ -66907,7 +68263,7 @@ characters.data={ description="NUMBER ELEVEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0031, 0x002E }, + specials={ "compat", 0x31, 0x31, 0x2E }, unicodeslot=0x2492, }, [0x2493]={ @@ -66917,7 +68273,7 @@ characters.data={ description="NUMBER TWELVE FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0032, 0x002E }, + specials={ "compat", 0x31, 0x32, 0x2E }, unicodeslot=0x2493, }, [0x2494]={ @@ -66927,7 +68283,7 @@ characters.data={ description="NUMBER THIRTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0033, 0x002E }, + specials={ "compat", 0x31, 0x33, 0x2E }, unicodeslot=0x2494, }, [0x2495]={ @@ -66937,7 +68293,7 @@ characters.data={ description="NUMBER FOURTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0034, 0x002E }, + specials={ "compat", 0x31, 0x34, 0x2E }, unicodeslot=0x2495, }, [0x2496]={ @@ -66947,7 +68303,7 @@ characters.data={ description="NUMBER FIFTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0035, 0x002E }, + specials={ "compat", 0x31, 0x35, 0x2E }, unicodeslot=0x2496, }, [0x2497]={ @@ -66957,7 +68313,7 @@ characters.data={ description="NUMBER SIXTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0036, 0x002E }, + specials={ "compat", 0x31, 0x36, 0x2E }, unicodeslot=0x2497, }, [0x2498]={ @@ -66967,7 +68323,7 @@ characters.data={ description="NUMBER SEVENTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0037, 0x002E }, + specials={ "compat", 0x31, 0x37, 0x2E }, unicodeslot=0x2498, }, [0x2499]={ @@ -66977,7 +68333,7 @@ characters.data={ description="NUMBER EIGHTEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0038, 0x002E }, + specials={ "compat", 0x31, 0x38, 0x2E }, unicodeslot=0x2499, }, [0x249A]={ @@ -66987,7 +68343,7 @@ characters.data={ description="NUMBER NINETEEN FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x0039, 0x002E }, + specials={ "compat", 0x31, 0x39, 0x2E }, unicodeslot=0x249A, }, [0x249B]={ @@ -66997,7 +68353,7 @@ characters.data={ description="NUMBER TWENTY FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0032, 0x0030, 0x002E }, + specials={ "compat", 0x32, 0x30, 0x2E }, unicodeslot=0x249B, }, [0x249C]={ @@ -67007,7 +68363,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER A", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0061, 0x0029 }, + specials={ "compat", 0x28, 0x61, 0x29 }, unicodeslot=0x249C, }, [0x249D]={ @@ -67017,7 +68373,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER B", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0062, 0x0029 }, + specials={ "compat", 0x28, 0x62, 0x29 }, unicodeslot=0x249D, }, [0x249E]={ @@ -67027,7 +68383,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER C", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0063, 0x0029 }, + specials={ "compat", 0x28, 0x63, 0x29 }, unicodeslot=0x249E, }, [0x249F]={ @@ -67037,7 +68393,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER D", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0064, 0x0029 }, + specials={ "compat", 0x28, 0x64, 0x29 }, unicodeslot=0x249F, }, [0x24A0]={ @@ -67047,7 +68403,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER E", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0065, 0x0029 }, + specials={ "compat", 0x28, 0x65, 0x29 }, unicodeslot=0x24A0, }, [0x24A1]={ @@ -67057,7 +68413,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER F", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0066, 0x0029 }, + specials={ "compat", 0x28, 0x66, 0x29 }, unicodeslot=0x24A1, }, [0x24A2]={ @@ -67067,7 +68423,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER G", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0067, 0x0029 }, + specials={ "compat", 0x28, 0x67, 0x29 }, unicodeslot=0x24A2, }, [0x24A3]={ @@ -67077,7 +68433,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER H", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0068, 0x0029 }, + specials={ "compat", 0x28, 0x68, 0x29 }, unicodeslot=0x24A3, }, [0x24A4]={ @@ -67087,7 +68443,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER I", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0069, 0x0029 }, + specials={ "compat", 0x28, 0x69, 0x29 }, unicodeslot=0x24A4, }, [0x24A5]={ @@ -67097,7 +68453,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER J", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006A, 0x0029 }, + specials={ "compat", 0x28, 0x6A, 0x29 }, unicodeslot=0x24A5, }, [0x24A6]={ @@ -67107,7 +68463,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER K", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006B, 0x0029 }, + specials={ "compat", 0x28, 0x6B, 0x29 }, unicodeslot=0x24A6, }, [0x24A7]={ @@ -67117,7 +68473,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER L", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006C, 0x0029 }, + specials={ "compat", 0x28, 0x6C, 0x29 }, unicodeslot=0x24A7, }, [0x24A8]={ @@ -67127,7 +68483,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER M", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006D, 0x0029 }, + specials={ "compat", 0x28, 0x6D, 0x29 }, unicodeslot=0x24A8, }, [0x24A9]={ @@ -67137,7 +68493,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER N", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006E, 0x0029 }, + specials={ "compat", 0x28, 0x6E, 0x29 }, unicodeslot=0x24A9, }, [0x24AA]={ @@ -67147,7 +68503,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER O", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x006F, 0x0029 }, + specials={ "compat", 0x28, 0x6F, 0x29 }, unicodeslot=0x24AA, }, [0x24AB]={ @@ -67157,7 +68513,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER P", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0070, 0x0029 }, + specials={ "compat", 0x28, 0x70, 0x29 }, unicodeslot=0x24AB, }, [0x24AC]={ @@ -67167,7 +68523,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER Q", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0071, 0x0029 }, + specials={ "compat", 0x28, 0x71, 0x29 }, unicodeslot=0x24AC, }, [0x24AD]={ @@ -67177,7 +68533,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER R", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0072, 0x0029 }, + specials={ "compat", 0x28, 0x72, 0x29 }, unicodeslot=0x24AD, }, [0x24AE]={ @@ -67187,7 +68543,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER S", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0073, 0x0029 }, + specials={ "compat", 0x28, 0x73, 0x29 }, unicodeslot=0x24AE, }, [0x24AF]={ @@ -67197,7 +68553,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER T", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0074, 0x0029 }, + specials={ "compat", 0x28, 0x74, 0x29 }, unicodeslot=0x24AF, }, [0x24B0]={ @@ -67207,7 +68563,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER U", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0075, 0x0029 }, + specials={ "compat", 0x28, 0x75, 0x29 }, unicodeslot=0x24B0, }, [0x24B1]={ @@ -67217,7 +68573,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER V", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0076, 0x0029 }, + specials={ "compat", 0x28, 0x76, 0x29 }, unicodeslot=0x24B1, }, [0x24B2]={ @@ -67227,7 +68583,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER W", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0077, 0x0029 }, + specials={ "compat", 0x28, 0x77, 0x29 }, unicodeslot=0x24B2, }, [0x24B3]={ @@ -67237,7 +68593,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER X", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0078, 0x0029 }, + specials={ "compat", 0x28, 0x78, 0x29 }, unicodeslot=0x24B3, }, [0x24B4]={ @@ -67247,7 +68603,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER Y", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0079, 0x0029 }, + specials={ "compat", 0x28, 0x79, 0x29 }, unicodeslot=0x24B4, }, [0x24B5]={ @@ -67257,7 +68613,7 @@ characters.data={ description="PARENTHESIZED LATIN SMALL LETTER Z", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x007A, 0x0029 }, + specials={ "compat", 0x28, 0x7A, 0x29 }, unicodeslot=0x24B5, }, [0x24B6]={ @@ -67268,7 +68624,7 @@ characters.data={ direction="l", lccode=0x24D0, linebreak="ai", - specials={ "circle", 0x0041 }, + specials={ "circle", 0x41 }, unicodeslot=0x24B6, }, [0x24B7]={ @@ -67279,7 +68635,7 @@ characters.data={ direction="l", lccode=0x24D1, linebreak="ai", - specials={ "circle", 0x0042 }, + specials={ "circle", 0x42 }, unicodeslot=0x24B7, }, [0x24B8]={ @@ -67290,7 +68646,7 @@ characters.data={ direction="l", lccode=0x24D2, linebreak="ai", - specials={ "circle", 0x0043 }, + specials={ "circle", 0x43 }, unicodeslot=0x24B8, }, [0x24B9]={ @@ -67301,7 +68657,7 @@ characters.data={ direction="l", lccode=0x24D3, linebreak="ai", - specials={ "circle", 0x0044 }, + specials={ "circle", 0x44 }, unicodeslot=0x24B9, }, [0x24BA]={ @@ -67312,7 +68668,7 @@ characters.data={ direction="l", lccode=0x24D4, linebreak="ai", - specials={ "circle", 0x0045 }, + specials={ "circle", 0x45 }, unicodeslot=0x24BA, }, [0x24BB]={ @@ -67323,7 +68679,7 @@ characters.data={ direction="l", lccode=0x24D5, linebreak="ai", - specials={ "circle", 0x0046 }, + specials={ "circle", 0x46 }, unicodeslot=0x24BB, }, [0x24BC]={ @@ -67334,7 +68690,7 @@ characters.data={ direction="l", lccode=0x24D6, linebreak="ai", - specials={ "circle", 0x0047 }, + specials={ "circle", 0x47 }, unicodeslot=0x24BC, }, [0x24BD]={ @@ -67345,7 +68701,7 @@ characters.data={ direction="l", lccode=0x24D7, linebreak="ai", - specials={ "circle", 0x0048 }, + specials={ "circle", 0x48 }, unicodeslot=0x24BD, }, [0x24BE]={ @@ -67356,7 +68712,7 @@ characters.data={ direction="l", lccode=0x24D8, linebreak="ai", - specials={ "circle", 0x0049 }, + specials={ "circle", 0x49 }, unicodeslot=0x24BE, }, [0x24BF]={ @@ -67367,7 +68723,7 @@ characters.data={ direction="l", lccode=0x24D9, linebreak="ai", - specials={ "circle", 0x004A }, + specials={ "circle", 0x4A }, unicodeslot=0x24BF, }, [0x24C0]={ @@ -67378,7 +68734,7 @@ characters.data={ direction="l", lccode=0x24DA, linebreak="ai", - specials={ "circle", 0x004B }, + specials={ "circle", 0x4B }, unicodeslot=0x24C0, }, [0x24C1]={ @@ -67389,7 +68745,7 @@ characters.data={ direction="l", lccode=0x24DB, linebreak="ai", - specials={ "circle", 0x004C }, + specials={ "circle", 0x4C }, unicodeslot=0x24C1, }, [0x24C2]={ @@ -67400,7 +68756,7 @@ characters.data={ direction="l", lccode=0x24DC, linebreak="ai", - specials={ "circle", 0x004D }, + specials={ "circle", 0x4D }, unicodeslot=0x24C2, variants={ [0xFE0E]="text style", @@ -67415,7 +68771,7 @@ characters.data={ direction="l", lccode=0x24DD, linebreak="ai", - specials={ "circle", 0x004E }, + specials={ "circle", 0x4E }, unicodeslot=0x24C3, }, [0x24C4]={ @@ -67426,7 +68782,7 @@ characters.data={ direction="l", lccode=0x24DE, linebreak="ai", - specials={ "circle", 0x004F }, + specials={ "circle", 0x4F }, unicodeslot=0x24C4, }, [0x24C5]={ @@ -67437,7 +68793,7 @@ characters.data={ direction="l", lccode=0x24DF, linebreak="ai", - specials={ "circle", 0x0050 }, + specials={ "circle", 0x50 }, unicodeslot=0x24C5, }, [0x24C6]={ @@ -67448,7 +68804,7 @@ characters.data={ direction="l", lccode=0x24E0, linebreak="ai", - specials={ "circle", 0x0051 }, + specials={ "circle", 0x51 }, unicodeslot=0x24C6, }, [0x24C7]={ @@ -67461,7 +68817,7 @@ characters.data={ linebreak="ai", mathclass="ordinary", mathname="circledR", - specials={ "circle", 0x0052 }, + specials={ "circle", 0x52 }, unicodeslot=0x24C7, }, [0x24C8]={ @@ -67474,7 +68830,7 @@ characters.data={ linebreak="ai", mathclass="ordinary", mathname="circledS", - specials={ "circle", 0x0053 }, + specials={ "circle", 0x53 }, unicodeslot=0x24C8, }, [0x24C9]={ @@ -67485,7 +68841,7 @@ characters.data={ direction="l", lccode=0x24E3, linebreak="ai", - specials={ "circle", 0x0054 }, + specials={ "circle", 0x54 }, unicodeslot=0x24C9, }, [0x24CA]={ @@ -67496,7 +68852,7 @@ characters.data={ direction="l", lccode=0x24E4, linebreak="ai", - specials={ "circle", 0x0055 }, + specials={ "circle", 0x55 }, unicodeslot=0x24CA, }, [0x24CB]={ @@ -67507,7 +68863,7 @@ characters.data={ direction="l", lccode=0x24E5, linebreak="ai", - specials={ "circle", 0x0056 }, + specials={ "circle", 0x56 }, unicodeslot=0x24CB, }, [0x24CC]={ @@ -67518,7 +68874,7 @@ characters.data={ direction="l", lccode=0x24E6, linebreak="ai", - specials={ "circle", 0x0057 }, + specials={ "circle", 0x57 }, unicodeslot=0x24CC, }, [0x24CD]={ @@ -67529,7 +68885,7 @@ characters.data={ direction="l", lccode=0x24E7, linebreak="ai", - specials={ "circle", 0x0058 }, + specials={ "circle", 0x58 }, unicodeslot=0x24CD, }, [0x24CE]={ @@ -67540,7 +68896,7 @@ characters.data={ direction="l", lccode=0x24E8, linebreak="ai", - specials={ "circle", 0x0059 }, + specials={ "circle", 0x59 }, unicodeslot=0x24CE, }, [0x24CF]={ @@ -67551,7 +68907,7 @@ characters.data={ direction="l", lccode=0x24E9, linebreak="ai", - specials={ "circle", 0x005A }, + specials={ "circle", 0x5A }, unicodeslot=0x24CF, }, [0x24D0]={ @@ -67561,7 +68917,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER A", direction="l", linebreak="ai", - specials={ "circle", 0x0061 }, + specials={ "circle", 0x61 }, uccode=0x24B6, unicodeslot=0x24D0, }, @@ -67572,7 +68928,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER B", direction="l", linebreak="ai", - specials={ "circle", 0x0062 }, + specials={ "circle", 0x62 }, uccode=0x24B7, unicodeslot=0x24D1, }, @@ -67583,7 +68939,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER C", direction="l", linebreak="ai", - specials={ "circle", 0x0063 }, + specials={ "circle", 0x63 }, uccode=0x24B8, unicodeslot=0x24D2, }, @@ -67594,7 +68950,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER D", direction="l", linebreak="ai", - specials={ "circle", 0x0064 }, + specials={ "circle", 0x64 }, uccode=0x24B9, unicodeslot=0x24D3, }, @@ -67605,7 +68961,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER E", direction="l", linebreak="ai", - specials={ "circle", 0x0065 }, + specials={ "circle", 0x65 }, uccode=0x24BA, unicodeslot=0x24D4, }, @@ -67616,7 +68972,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER F", direction="l", linebreak="ai", - specials={ "circle", 0x0066 }, + specials={ "circle", 0x66 }, uccode=0x24BB, unicodeslot=0x24D5, }, @@ -67627,7 +68983,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER G", direction="l", linebreak="ai", - specials={ "circle", 0x0067 }, + specials={ "circle", 0x67 }, uccode=0x24BC, unicodeslot=0x24D6, }, @@ -67638,7 +68994,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER H", direction="l", linebreak="ai", - specials={ "circle", 0x0068 }, + specials={ "circle", 0x68 }, uccode=0x24BD, unicodeslot=0x24D7, }, @@ -67649,7 +69005,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER I", direction="l", linebreak="ai", - specials={ "circle", 0x0069 }, + specials={ "circle", 0x69 }, uccode=0x24BE, unicodeslot=0x24D8, }, @@ -67660,7 +69016,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER J", direction="l", linebreak="ai", - specials={ "circle", 0x006A }, + specials={ "circle", 0x6A }, uccode=0x24BF, unicodeslot=0x24D9, }, @@ -67671,7 +69027,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER K", direction="l", linebreak="ai", - specials={ "circle", 0x006B }, + specials={ "circle", 0x6B }, uccode=0x24C0, unicodeslot=0x24DA, }, @@ -67682,7 +69038,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER L", direction="l", linebreak="ai", - specials={ "circle", 0x006C }, + specials={ "circle", 0x6C }, uccode=0x24C1, unicodeslot=0x24DB, }, @@ -67693,7 +69049,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER M", direction="l", linebreak="ai", - specials={ "circle", 0x006D }, + specials={ "circle", 0x6D }, uccode=0x24C2, unicodeslot=0x24DC, }, @@ -67704,7 +69060,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER N", direction="l", linebreak="ai", - specials={ "circle", 0x006E }, + specials={ "circle", 0x6E }, uccode=0x24C3, unicodeslot=0x24DD, }, @@ -67715,7 +69071,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER O", direction="l", linebreak="ai", - specials={ "circle", 0x006F }, + specials={ "circle", 0x6F }, uccode=0x24C4, unicodeslot=0x24DE, }, @@ -67726,7 +69082,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER P", direction="l", linebreak="ai", - specials={ "circle", 0x0070 }, + specials={ "circle", 0x70 }, uccode=0x24C5, unicodeslot=0x24DF, }, @@ -67737,7 +69093,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER Q", direction="l", linebreak="ai", - specials={ "circle", 0x0071 }, + specials={ "circle", 0x71 }, uccode=0x24C6, unicodeslot=0x24E0, }, @@ -67748,7 +69104,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER R", direction="l", linebreak="ai", - specials={ "circle", 0x0072 }, + specials={ "circle", 0x72 }, uccode=0x24C7, unicodeslot=0x24E1, }, @@ -67759,7 +69115,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER S", direction="l", linebreak="ai", - specials={ "circle", 0x0073 }, + specials={ "circle", 0x73 }, uccode=0x24C8, unicodeslot=0x24E2, }, @@ -67770,7 +69126,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER T", direction="l", linebreak="ai", - specials={ "circle", 0x0074 }, + specials={ "circle", 0x74 }, uccode=0x24C9, unicodeslot=0x24E3, }, @@ -67781,7 +69137,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER U", direction="l", linebreak="ai", - specials={ "circle", 0x0075 }, + specials={ "circle", 0x75 }, uccode=0x24CA, unicodeslot=0x24E4, }, @@ -67792,7 +69148,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER V", direction="l", linebreak="ai", - specials={ "circle", 0x0076 }, + specials={ "circle", 0x76 }, uccode=0x24CB, unicodeslot=0x24E5, }, @@ -67803,7 +69159,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER W", direction="l", linebreak="ai", - specials={ "circle", 0x0077 }, + specials={ "circle", 0x77 }, uccode=0x24CC, unicodeslot=0x24E6, }, @@ -67814,7 +69170,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER X", direction="l", linebreak="ai", - specials={ "circle", 0x0078 }, + specials={ "circle", 0x78 }, uccode=0x24CD, unicodeslot=0x24E7, }, @@ -67825,7 +69181,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER Y", direction="l", linebreak="ai", - specials={ "circle", 0x0079 }, + specials={ "circle", 0x79 }, uccode=0x24CE, unicodeslot=0x24E8, }, @@ -67836,7 +69192,7 @@ characters.data={ description="CIRCLED LATIN SMALL LETTER Z", direction="l", linebreak="ai", - specials={ "circle", 0x007A }, + specials={ "circle", 0x7A }, uccode=0x24CF, unicodeslot=0x24E9, }, @@ -67845,7 +69201,7 @@ characters.data={ description="CIRCLED DIGIT ZERO", direction="on", linebreak="ai", - specials={ "circle", 0x0030 }, + specials={ "circle", 0x30 }, unicodeslot=0x24EA, }, [0x24EB]={ @@ -72238,6 +73594,13 @@ characters.data={ linebreak="id", unicodeslot=0x26FF, }, + [0x2700]={ + category="so", + description="BLACK SAFETY SCISSORS", + direction="on", + linebreak="id", + unicodeslot=0x2700, + }, [0x2701]={ category="so", description="UPPER BLADE SCISSORS", @@ -72959,14 +74322,14 @@ characters.data={ category="so", description="HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT", direction="on", - linebreak="al", + linebreak="qu", unicodeslot=0x275F, }, [0x2760]={ category="so", description="HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT", direction="on", - linebreak="al", + linebreak="qu", unicodeslot=0x2760, }, [0x2761]={ @@ -78796,7 +80159,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="coloncolonequals", - specials={ "compat", 0x003A, 0x003A, 0x003D }, + specials={ "compat", 0x3A, 0x3A, 0x3D }, unicodeslot=0x2A74, }, [0x2A75]={ @@ -78804,7 +80167,7 @@ characters.data={ description="TWO CONSECUTIVE EQUALS SIGNS", direction="on", linebreak="al", - specials={ "compat", 0x003D, 0x003D }, + specials={ "compat", 0x3D, 0x3D }, unicodeslot=0x2A75, }, [0x2A76]={ @@ -78812,7 +80175,7 @@ characters.data={ description="THREE CONSECUTIVE EQUALS SIGNS", direction="on", linebreak="al", - specials={ "compat", 0x003D, 0x003D, 0x003D }, + specials={ "compat", 0x3D, 0x3D, 0x3D }, unicodeslot=0x2A76, }, [0x2A77]={ @@ -79661,7 +81024,7 @@ characters.data={ description="FORKING", direction="on", linebreak="al", - specials={ "char", 0x2ADD, 0x0338 }, + specials={ "char", 0x2ADD, 0x338 }, unicodeslot=0x2ADC, }, [0x2ADD]={ @@ -80493,6 +81856,27 @@ characters.data={ linebreak="al", unicodeslot=0x2B4C, }, + [0x2B4D]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B4D, + }, + [0x2B4E]={ + category="so", + description="SHORT SLANTED NORTH ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B4E, + }, + [0x2B4F]={ + category="so", + description="SHORT BACKSLANTED SOUTH ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B4F, + }, [0x2B50]={ category="so", description="WHITE MEDIUM STAR", @@ -80576,6 +81960,790 @@ characters.data={ linebreak="ai", unicodeslot=0x2B59, }, + [0x2B5A]={ + category="so", + description="SLANTED NORTH ARROW WITH HOOKED HEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B5A, + }, + [0x2B5B]={ + category="so", + description="BACKSLANTED SOUTH ARROW WITH HOOKED TAIL", + direction="on", + linebreak="al", + unicodeslot=0x2B5B, + }, + [0x2B5C]={ + category="so", + description="SLANTED NORTH ARROW WITH HORIZONTAL TAIL", + direction="on", + linebreak="al", + unicodeslot=0x2B5C, + }, + [0x2B5D]={ + category="so", + description="BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL", + direction="on", + linebreak="al", + unicodeslot=0x2B5D, + }, + [0x2B5E]={ + category="so", + description="BENT ARROW POINTING DOWNWARDS THEN NORTH EAST", + direction="on", + linebreak="al", + unicodeslot=0x2B5E, + }, + [0x2B5F]={ + category="so", + description="SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST", + direction="on", + linebreak="al", + unicodeslot=0x2B5F, + }, + [0x2B60]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B60, + }, + [0x2B61]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B61, + }, + [0x2B62]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B62, + }, + [0x2B63]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B63, + }, + [0x2B64]={ + category="so", + description="LEFT RIGHT TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B64, + }, + [0x2B65]={ + category="so", + description="UP DOWN TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B65, + }, + [0x2B66]={ + category="so", + description="NORTH WEST TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B66, + }, + [0x2B67]={ + category="so", + description="NORTH EAST TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B67, + }, + [0x2B68]={ + category="so", + description="SOUTH EAST TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B68, + }, + [0x2B69]={ + category="so", + description="SOUTH WEST TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B69, + }, + [0x2B6A]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED DASHED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6A, + }, + [0x2B6B]={ + category="so", + description="UPWARDS TRIANGLE-HEADED DASHED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6B, + }, + [0x2B6C]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED DASHED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6C, + }, + [0x2B6D]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED DASHED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6D, + }, + [0x2B6E]={ + category="so", + description="CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6E, + }, + [0x2B6F]={ + category="so", + description="ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B6F, + }, + [0x2B70]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B70, + }, + [0x2B71]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B71, + }, + [0x2B72]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B72, + }, + [0x2B73]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B73, + }, + [0x2B76]={ + category="so", + description="NORTH WEST TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B76, + }, + [0x2B77]={ + category="so", + description="NORTH EAST TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B77, + }, + [0x2B78]={ + category="so", + description="SOUTH EAST TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B78, + }, + [0x2B79]={ + category="so", + description="SOUTH WEST TRIANGLE-HEADED ARROW TO BAR", + direction="on", + linebreak="al", + unicodeslot=0x2B79, + }, + [0x2B7A]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", + direction="on", + linebreak="al", + unicodeslot=0x2B7A, + }, + [0x2B7B]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", + direction="on", + linebreak="al", + unicodeslot=0x2B7B, + }, + [0x2B7C]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", + direction="on", + linebreak="al", + unicodeslot=0x2B7C, + }, + [0x2B7D]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", + direction="on", + linebreak="al", + unicodeslot=0x2B7D, + }, + [0x2B7E]={ + category="so", + description="HORIZONTAL TAB KEY", + direction="on", + linebreak="al", + unicodeslot=0x2B7E, + }, + [0x2B7F]={ + category="so", + description="VERTICAL TAB KEY", + direction="on", + linebreak="al", + unicodeslot=0x2B7F, + }, + [0x2B80]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B80, + }, + [0x2B81]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B81, + }, + [0x2B82]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B82, + }, + [0x2B83]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B83, + }, + [0x2B84]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS", + direction="on", + linebreak="al", + unicodeslot=0x2B84, + }, + [0x2B85]={ + category="so", + description="UPWARDS TRIANGLE-HEADED PAIRED ARROWS", + direction="on", + linebreak="al", + unicodeslot=0x2B85, + }, + [0x2B86]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS", + direction="on", + linebreak="al", + unicodeslot=0x2B86, + }, + [0x2B87]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS", + direction="on", + linebreak="al", + unicodeslot=0x2B87, + }, + [0x2B88]={ + category="so", + description="LEFTWARDS BLACK CIRCLED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B88, + }, + [0x2B89]={ + category="so", + description="UPWARDS BLACK CIRCLED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B89, + }, + [0x2B8A]={ + category="so", + description="RIGHTWARDS BLACK CIRCLED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8A, + }, + [0x2B8B]={ + category="so", + description="DOWNWARDS BLACK CIRCLED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8B, + }, + [0x2B8C]={ + category="so", + description="ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8C, + }, + [0x2B8D]={ + category="so", + description="ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8D, + }, + [0x2B8E]={ + category="so", + description="ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8E, + }, + [0x2B8F]={ + category="so", + description="ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B8F, + }, + [0x2B90]={ + category="so", + description="RETURN LEFT", + direction="on", + linebreak="al", + unicodeslot=0x2B90, + }, + [0x2B91]={ + category="so", + description="RETURN RIGHT", + direction="on", + linebreak="al", + unicodeslot=0x2B91, + }, + [0x2B92]={ + category="so", + description="NEWLINE LEFT", + direction="on", + linebreak="al", + unicodeslot=0x2B92, + }, + [0x2B93]={ + category="so", + description="NEWLINE RIGHT", + direction="on", + linebreak="al", + unicodeslot=0x2B93, + }, + [0x2B94]={ + category="so", + description="FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE", + direction="on", + linebreak="al", + unicodeslot=0x2B94, + }, + [0x2B95]={ + category="so", + description="RIGHTWARDS BLACK ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2B95, + }, + [0x2B98]={ + category="so", + description="THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B98, + }, + [0x2B99]={ + category="so", + description="THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B99, + }, + [0x2B9A]={ + category="so", + description="THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9A, + }, + [0x2B9B]={ + category="so", + description="THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9B, + }, + [0x2B9C]={ + category="so", + description="BLACK LEFTWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9C, + }, + [0x2B9D]={ + category="so", + description="BLACK UPWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9D, + }, + [0x2B9E]={ + category="so", + description="BLACK RIGHTWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9E, + }, + [0x2B9F]={ + category="so", + description="BLACK DOWNWARDS EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x2B9F, + }, + [0x2BA0]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA0, + }, + [0x2BA1]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA1, + }, + [0x2BA2]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA2, + }, + [0x2BA3]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA3, + }, + [0x2BA4]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA4, + }, + [0x2BA5]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA5, + }, + [0x2BA6]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA6, + }, + [0x2BA7]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS", + direction="on", + linebreak="al", + unicodeslot=0x2BA7, + }, + [0x2BA8]={ + category="so", + description="BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BA8, + }, + [0x2BA9]={ + category="so", + description="BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BA9, + }, + [0x2BAA]={ + category="so", + description="BLACK CURVED UPWARDS AND LEFTWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAA, + }, + [0x2BAB]={ + category="so", + description="BLACK CURVED UPWARDS AND RIGHTWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAB, + }, + [0x2BAC]={ + category="so", + description="BLACK CURVED LEFTWARDS AND UPWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAC, + }, + [0x2BAD]={ + category="so", + description="BLACK CURVED RIGHTWARDS AND UPWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAD, + }, + [0x2BAE]={ + category="so", + description="BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAE, + }, + [0x2BAF]={ + category="so", + description="BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW", + direction="on", + linebreak="al", + unicodeslot=0x2BAF, + }, + [0x2BB0]={ + category="so", + description="RIBBON ARROW DOWN LEFT", + direction="on", + linebreak="al", + unicodeslot=0x2BB0, + }, + [0x2BB1]={ + category="so", + description="RIBBON ARROW DOWN RIGHT", + direction="on", + linebreak="al", + unicodeslot=0x2BB1, + }, + [0x2BB2]={ + category="so", + description="RIBBON ARROW UP LEFT", + direction="on", + linebreak="al", + unicodeslot=0x2BB2, + }, + [0x2BB3]={ + category="so", + description="RIBBON ARROW UP RIGHT", + direction="on", + linebreak="al", + unicodeslot=0x2BB3, + }, + [0x2BB4]={ + category="so", + description="RIBBON ARROW LEFT UP", + direction="on", + linebreak="al", + unicodeslot=0x2BB4, + }, + [0x2BB5]={ + category="so", + description="RIBBON ARROW RIGHT UP", + direction="on", + linebreak="al", + unicodeslot=0x2BB5, + }, + [0x2BB6]={ + category="so", + description="RIBBON ARROW LEFT DOWN", + direction="on", + linebreak="al", + unicodeslot=0x2BB6, + }, + [0x2BB7]={ + category="so", + description="RIBBON ARROW RIGHT DOWN", + direction="on", + linebreak="al", + unicodeslot=0x2BB7, + }, + [0x2BB8]={ + category="so", + description="UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR", + direction="on", + linebreak="al", + unicodeslot=0x2BB8, + }, + [0x2BB9]={ + category="so", + description="UP ARROWHEAD IN A RECTANGLE BOX", + direction="on", + linebreak="al", + unicodeslot=0x2BB9, + }, + [0x2BBD]={ + category="so", + description="BALLOT BOX WITH LIGHT X", + direction="on", + linebreak="al", + unicodeslot=0x2BBD, + }, + [0x2BBE]={ + category="so", + description="CIRCLED X", + direction="on", + linebreak="al", + unicodeslot=0x2BBE, + }, + [0x2BBF]={ + category="so", + description="CIRCLED BOLD X", + direction="on", + linebreak="al", + unicodeslot=0x2BBF, + }, + [0x2BC0]={ + category="so", + description="BLACK SQUARE CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC0, + }, + [0x2BC1]={ + category="so", + description="BLACK DIAMOND CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC1, + }, + [0x2BC2]={ + category="so", + description="TURNED BLACK PENTAGON", + direction="on", + linebreak="al", + unicodeslot=0x2BC2, + }, + [0x2BC3]={ + category="so", + description="HORIZONTAL BLACK OCTAGON", + direction="on", + linebreak="al", + unicodeslot=0x2BC3, + }, + [0x2BC4]={ + category="so", + description="BLACK OCTAGON", + direction="on", + linebreak="al", + unicodeslot=0x2BC4, + }, + [0x2BC5]={ + category="so", + description="BLACK MEDIUM UP-POINTING TRIANGLE CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC5, + }, + [0x2BC6]={ + category="so", + description="BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC6, + }, + [0x2BC7]={ + category="so", + description="BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC7, + }, + [0x2BC8]={ + category="so", + description="BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED", + direction="on", + linebreak="al", + unicodeslot=0x2BC8, + }, + [0x2BCA]={ + category="so", + description="TOP HALF BLACK CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x2BCA, + }, + [0x2BCB]={ + category="so", + description="BOTTOM HALF BLACK CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x2BCB, + }, + [0x2BCC]={ + category="so", + description="LIGHT FOUR POINTED BLACK CUSP", + direction="on", + linebreak="al", + unicodeslot=0x2BCC, + }, + [0x2BCD]={ + category="so", + description="ROTATED LIGHT FOUR POINTED BLACK CUSP", + direction="on", + linebreak="al", + unicodeslot=0x2BCD, + }, + [0x2BCE]={ + category="so", + description="WHITE FOUR POINTED CUSP", + direction="on", + linebreak="al", + unicodeslot=0x2BCE, + }, + [0x2BCF]={ + category="so", + description="ROTATED WHITE FOUR POINTED CUSP", + direction="on", + linebreak="al", + unicodeslot=0x2BCF, + }, + [0x2BD0]={ + category="so", + description="SQUARE POSITION INDICATOR", + direction="on", + linebreak="al", + unicodeslot=0x2BD0, + }, + [0x2BD1]={ + category="so", + description="UNCERTAINTY SIGN", + direction="on", + linebreak="al", + unicodeslot=0x2BD1, + }, [0x2C00]={ category="lu", description="GLAGOLITIC CAPITAL LETTER AZU", @@ -81334,7 +83502,7 @@ characters.data={ direction="l", lccode=0x2C61, linebreak="al", - shcode=0x004C, + shcode=0x4C, unicodeslot=0x2C60, }, [0x2C61]={ @@ -81342,7 +83510,7 @@ characters.data={ description="LATIN SMALL LETTER L WITH DOUBLE BAR", direction="l", linebreak="al", - shcode=0x006C, + shcode=0x6C, uccode=0x2C60, unicodeslot=0x2C61, }, @@ -81350,9 +83518,9 @@ characters.data={ category="lu", description="LATIN CAPITAL LETTER L WITH MIDDLE TILDE", direction="l", - lccode=0x026B, + lccode=0x26B, linebreak="al", - shcode=0x004C, + shcode=0x4C, unicodeslot=0x2C62, }, [0x2C63]={ @@ -81361,16 +83529,16 @@ characters.data={ direction="l", lccode=0x1D7D, linebreak="al", - shcode=0x0050, + shcode=0x50, unicodeslot=0x2C63, }, [0x2C64]={ category="lu", description="LATIN CAPITAL LETTER R WITH TAIL", direction="l", - lccode=0x027D, + lccode=0x27D, linebreak="al", - shcode=0x0052, + shcode=0x52, unicodeslot=0x2C64, }, [0x2C65]={ @@ -81378,8 +83546,8 @@ characters.data={ description="LATIN SMALL LETTER A WITH STROKE", direction="l", linebreak="al", - shcode=0x0061, - uccode=0x023A, + shcode=0x61, + uccode=0x23A, unicodeslot=0x2C65, }, [0x2C66]={ @@ -81387,8 +83555,8 @@ characters.data={ description="LATIN SMALL LETTER T WITH DIAGONAL STROKE", direction="l", linebreak="al", - shcode=0x0074, - uccode=0x023E, + shcode=0x74, + uccode=0x23E, unicodeslot=0x2C66, }, [0x2C67]={ @@ -81397,7 +83565,7 @@ characters.data={ direction="l", lccode=0x2C68, linebreak="al", - shcode=0x0048, + shcode=0x48, unicodeslot=0x2C67, }, [0x2C68]={ @@ -81405,7 +83573,7 @@ characters.data={ description="LATIN SMALL LETTER H WITH DESCENDER", direction="l", linebreak="al", - shcode=0x0068, + shcode=0x68, uccode=0x2C67, unicodeslot=0x2C68, }, @@ -81415,7 +83583,7 @@ characters.data={ direction="l", lccode=0x2C6A, linebreak="al", - shcode=0x004B, + shcode=0x4B, unicodeslot=0x2C69, }, [0x2C6A]={ @@ -81423,7 +83591,7 @@ characters.data={ description="LATIN SMALL LETTER K WITH DESCENDER", direction="l", linebreak="al", - shcode=0x006B, + shcode=0x6B, uccode=0x2C69, unicodeslot=0x2C6A, }, @@ -81433,7 +83601,7 @@ characters.data={ direction="l", lccode=0x2C6C, linebreak="al", - shcode=0x005A, + shcode=0x5A, unicodeslot=0x2C6B, }, [0x2C6C]={ @@ -81441,7 +83609,7 @@ characters.data={ description="LATIN SMALL LETTER Z WITH DESCENDER", direction="l", linebreak="al", - shcode=0x007A, + shcode=0x7A, uccode=0x2C6B, unicodeslot=0x2C6C, }, @@ -81499,7 +83667,7 @@ characters.data={ description="LATIN SMALL LETTER V WITH CURL", direction="l", linebreak="al", - shcode=0x0076, + shcode=0x76, unicodeslot=0x2C74, }, [0x2C75]={ @@ -81558,7 +83726,7 @@ characters.data={ description="LATIN SUBSCRIPT SMALL LETTER J", direction="l", linebreak="al", - specials={ "sub", 0x006A }, + specials={ "sub", 0x6A }, unicodeslot=0x2C7C, }, [0x2C7D]={ @@ -81566,7 +83734,7 @@ characters.data={ description="MODIFIER LETTER CAPITAL V", direction="l", linebreak="al", - specials={ "super", 0x0056 }, + specials={ "super", 0x56 }, unicodeslot=0x2C7D, }, [0x2C7E]={ @@ -82462,6 +84630,7 @@ characters.data={ }, [0x2CEF]={ category="mn", + combining=0xE6, description="COPTIC COMBINING NI ABOVE", direction="nsm", linebreak="cm", @@ -82469,6 +84638,7 @@ characters.data={ }, [0x2CF0]={ category="mn", + combining=0xE6, description="COPTIC COMBINING SPIRITUS ASPER", direction="nsm", linebreak="cm", @@ -82476,6 +84646,7 @@ characters.data={ }, [0x2CF1]={ category="mn", + combining=0xE6, description="COPTIC COMBINING SPIRITUS LENIS", direction="nsm", linebreak="cm", @@ -83271,6 +85442,7 @@ characters.data={ }, [0x2D7F]={ category="mn", + combining=0x9, description="TIFINAGH CONSONANT JOINER", direction="nsm", linebreak="cm", @@ -83565,7 +85737,6 @@ characters.data={ }, [0x2DB4]={ category="lo", - cjkwd="w", description="ETHIOPIC SYLLABLE ZZEE", direction="l", linebreak="al", @@ -83573,7 +85744,6 @@ characters.data={ }, [0x2DB5]={ category="lo", - cjkwd="w", description="ETHIOPIC SYLLABLE ZZE", direction="l", linebreak="al", @@ -83611,14 +85781,14 @@ characters.data={ category="lo", description="ETHIOPIC SYLLABLE CCHAA", direction="l", - linebreak="id", + linebreak="al", unicodeslot=0x2DBB, }, [0x2DBC]={ category="lo", description="ETHIOPIC SYLLABLE CCHEE", direction="l", - linebreak="id", + linebreak="al", unicodeslot=0x2DBC, }, [0x2DBD]={ @@ -83833,6 +86003,7 @@ characters.data={ }, [0x2DE0]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER BE", direction="nsm", linebreak="cm", @@ -83840,6 +86011,7 @@ characters.data={ }, [0x2DE1]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER VE", direction="nsm", linebreak="cm", @@ -83847,6 +86019,7 @@ characters.data={ }, [0x2DE2]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER GHE", direction="nsm", linebreak="cm", @@ -83854,6 +86027,7 @@ characters.data={ }, [0x2DE3]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER DE", direction="nsm", linebreak="cm", @@ -83861,6 +86035,7 @@ characters.data={ }, [0x2DE4]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER ZHE", direction="nsm", linebreak="cm", @@ -83868,6 +86043,7 @@ characters.data={ }, [0x2DE5]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER ZE", direction="nsm", linebreak="cm", @@ -83875,6 +86051,7 @@ characters.data={ }, [0x2DE6]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER KA", direction="nsm", linebreak="cm", @@ -83882,6 +86059,7 @@ characters.data={ }, [0x2DE7]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER EL", direction="nsm", linebreak="cm", @@ -83889,6 +86067,7 @@ characters.data={ }, [0x2DE8]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER EM", direction="nsm", linebreak="cm", @@ -83896,6 +86075,7 @@ characters.data={ }, [0x2DE9]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER EN", direction="nsm", linebreak="cm", @@ -83903,6 +86083,7 @@ characters.data={ }, [0x2DEA]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER O", direction="nsm", linebreak="cm", @@ -83910,6 +86091,7 @@ characters.data={ }, [0x2DEB]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER PE", direction="nsm", linebreak="cm", @@ -83917,6 +86099,7 @@ characters.data={ }, [0x2DEC]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER ER", direction="nsm", linebreak="cm", @@ -83924,6 +86107,7 @@ characters.data={ }, [0x2DED]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER ES", direction="nsm", linebreak="cm", @@ -83931,6 +86115,7 @@ characters.data={ }, [0x2DEE]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER TE", direction="nsm", linebreak="cm", @@ -83938,6 +86123,7 @@ characters.data={ }, [0x2DEF]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER HA", direction="nsm", linebreak="cm", @@ -83945,6 +86131,7 @@ characters.data={ }, [0x2DF0]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER TSE", direction="nsm", linebreak="cm", @@ -83952,6 +86139,7 @@ characters.data={ }, [0x2DF1]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER CHE", direction="nsm", linebreak="cm", @@ -83959,6 +86147,7 @@ characters.data={ }, [0x2DF2]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER SHA", direction="nsm", linebreak="cm", @@ -83966,6 +86155,7 @@ characters.data={ }, [0x2DF3]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER SHCHA", direction="nsm", linebreak="cm", @@ -83973,6 +86163,7 @@ characters.data={ }, [0x2DF4]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER FITA", direction="nsm", linebreak="cm", @@ -83980,6 +86171,7 @@ characters.data={ }, [0x2DF5]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER ES-TE", direction="nsm", linebreak="cm", @@ -83987,7 +86179,7 @@ characters.data={ }, [0x2DF6]={ category="mn", - cjkwd="w", + combining=0xE6, description="COMBINING CYRILLIC LETTER A", direction="nsm", linebreak="cm", @@ -83995,7 +86187,7 @@ characters.data={ }, [0x2DF7]={ category="mn", - cjkwd="w", + combining=0xE6, description="COMBINING CYRILLIC LETTER IE", direction="nsm", linebreak="cm", @@ -84003,6 +86195,7 @@ characters.data={ }, [0x2DF8]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER DJERV", direction="nsm", linebreak="cm", @@ -84010,6 +86203,7 @@ characters.data={ }, [0x2DF9]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER MONOGRAPH UK", direction="nsm", linebreak="cm", @@ -84017,6 +86211,7 @@ characters.data={ }, [0x2DFA]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER YAT", direction="nsm", linebreak="cm", @@ -84024,6 +86219,7 @@ characters.data={ }, [0x2DFB]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER YU", direction="nsm", linebreak="cm", @@ -84031,6 +86227,7 @@ characters.data={ }, [0x2DFC]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER IOTIFIED A", direction="nsm", linebreak="cm", @@ -84038,20 +86235,23 @@ characters.data={ }, [0x2DFD]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER LITTLE YUS", direction="nsm", - linebreak="id", + linebreak="cm", unicodeslot=0x2DFD, }, [0x2DFE]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER BIG YUS", direction="nsm", - linebreak="id", + linebreak="cm", unicodeslot=0x2DFE, }, [0x2DFF]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER IOTIFIED BIG YUS", direction="nsm", linebreak="cm", @@ -84497,6 +86697,55 @@ characters.data={ linebreak="b2", unicodeslot=0x2E3B, }, + [0x2E3C]={ + category="po", + description="STENOGRAPHIC FULL STOP", + direction="on", + linebreak="ba", + unicodeslot=0x2E3C, + }, + [0x2E3D]={ + category="po", + description="VERTICAL SIX DOTS", + direction="on", + linebreak="ba", + unicodeslot=0x2E3D, + }, + [0x2E3E]={ + category="po", + description="WIGGLY VERTICAL LINE", + direction="on", + linebreak="ba", + unicodeslot=0x2E3E, + }, + [0x2E3F]={ + category="po", + description="CAPITULUM", + direction="on", + linebreak="al", + unicodeslot=0x2E3F, + }, + [0x2E40]={ + category="pd", + description="DOUBLE HYPHEN", + direction="on", + linebreak="ba", + unicodeslot=0x2E40, + }, + [0x2E41]={ + category="po", + description="REVERSED COMMA", + direction="on", + linebreak="ba", + unicodeslot=0x2E41, + }, + [0x2E42]={ + category="ps", + description="DOUBLE LOW-REVERSED-9 QUOTATION MARK", + direction="on", + linebreak="op", + unicodeslot=0x2E42, + }, [0x2E80]={ category="so", cjkwd="w", @@ -87448,8 +89697,8 @@ characters.data={ contextname="ideographicspace", description="IDEOGRAPHIC SPACE", direction="ws", - linebreak="id", - specials={ "wide", 0x0020 }, + linebreak="ba", + specials={ "wide", 0x20 }, unicodeslot=0x3000, }, [0x3001]={ @@ -87839,6 +90088,7 @@ characters.data={ [0x302A]={ category="mn", cjkwd="w", + combining=0xDA, description="IDEOGRAPHIC LEVEL TONE MARK", direction="nsm", linebreak="cm", @@ -87847,6 +90097,7 @@ characters.data={ [0x302B]={ category="mn", cjkwd="w", + combining=0xE4, description="IDEOGRAPHIC RISING TONE MARK", direction="nsm", linebreak="cm", @@ -87855,6 +90106,7 @@ characters.data={ [0x302C]={ category="mn", cjkwd="w", + combining=0xE8, description="IDEOGRAPHIC DEPARTING TONE MARK", direction="nsm", linebreak="cm", @@ -87863,6 +90115,7 @@ characters.data={ [0x302D]={ category="mn", cjkwd="w", + combining=0xDE, description="IDEOGRAPHIC ENTERING TONE MARK", direction="nsm", linebreak="cm", @@ -87871,6 +90124,7 @@ characters.data={ [0x302E]={ category="mn", cjkwd="w", + combining=0xE0, description="HANGUL SINGLE DOT TONE MARK", direction="l", linebreak="cm", @@ -87879,6 +90133,7 @@ characters.data={ [0x302F]={ category="mn", cjkwd="w", + combining=0xE0, description="HANGUL DOUBLE DOT TONE MARK", direction="l", linebreak="cm", @@ -87929,7 +90184,7 @@ characters.data={ cjkwd="w", description="VERTICAL KANA REPEAT MARK LOWER HALF", direction="l", - linebreak="id", + linebreak="cm", unicodeslot=0x3035, }, [0x3036]={ @@ -88822,6 +91077,7 @@ characters.data={ [0x3099]={ category="mn", cjkwd="w", + combining=0x8, description="COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK", direction="nsm", linebreak="cm", @@ -88830,6 +91086,7 @@ characters.data={ [0x309A]={ category="mn", cjkwd="w", + combining=0x8, description="COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK", direction="nsm", linebreak="cm", @@ -88842,7 +91099,7 @@ characters.data={ description="KATAKANA-HIRAGANA VOICED SOUND MARK", direction="on", linebreak="ns", - specials={ "compat", 0x0020, 0x3099 }, + specials={ "compat", 0x20, 0x3099 }, unicodeslot=0x309B, }, [0x309C]={ @@ -88852,7 +91109,7 @@ characters.data={ description="KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK", direction="on", linebreak="ns", - specials={ "compat", 0x0020, 0x309A }, + specials={ "compat", 0x20, 0x309A }, unicodeslot=0x309C, }, [0x309D]={ @@ -91863,7 +94120,7 @@ characters.data={ description="PARENTHESIZED HANGUL KIYEOK", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1100, 0x0029 }, + specials={ "compat", 0x28, 0x1100, 0x29 }, unicodeslot=0x3200, }, [0x3201]={ @@ -91873,7 +94130,7 @@ characters.data={ description="PARENTHESIZED HANGUL NIEUN", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1102, 0x0029 }, + specials={ "compat", 0x28, 0x1102, 0x29 }, unicodeslot=0x3201, }, [0x3202]={ @@ -91883,7 +94140,7 @@ characters.data={ description="PARENTHESIZED HANGUL TIKEUT", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1103, 0x0029 }, + specials={ "compat", 0x28, 0x1103, 0x29 }, unicodeslot=0x3202, }, [0x3203]={ @@ -91893,7 +94150,7 @@ characters.data={ description="PARENTHESIZED HANGUL RIEUL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1105, 0x0029 }, + specials={ "compat", 0x28, 0x1105, 0x29 }, unicodeslot=0x3203, }, [0x3204]={ @@ -91903,7 +94160,7 @@ characters.data={ description="PARENTHESIZED HANGUL MIEUM", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1106, 0x0029 }, + specials={ "compat", 0x28, 0x1106, 0x29 }, unicodeslot=0x3204, }, [0x3205]={ @@ -91913,7 +94170,7 @@ characters.data={ description="PARENTHESIZED HANGUL PIEUP", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1107, 0x0029 }, + specials={ "compat", 0x28, 0x1107, 0x29 }, unicodeslot=0x3205, }, [0x3206]={ @@ -91923,7 +94180,7 @@ characters.data={ description="PARENTHESIZED HANGUL SIOS", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1109, 0x0029 }, + specials={ "compat", 0x28, 0x1109, 0x29 }, unicodeslot=0x3206, }, [0x3207]={ @@ -91933,7 +94190,7 @@ characters.data={ description="PARENTHESIZED HANGUL IEUNG", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110B, 0x0029 }, + specials={ "compat", 0x28, 0x110B, 0x29 }, unicodeslot=0x3207, }, [0x3208]={ @@ -91943,7 +94200,7 @@ characters.data={ description="PARENTHESIZED HANGUL CIEUC", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110C, 0x0029 }, + specials={ "compat", 0x28, 0x110C, 0x29 }, unicodeslot=0x3208, }, [0x3209]={ @@ -91953,7 +94210,7 @@ characters.data={ description="PARENTHESIZED HANGUL CHIEUCH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110E, 0x0029 }, + specials={ "compat", 0x28, 0x110E, 0x29 }, unicodeslot=0x3209, }, [0x320A]={ @@ -91963,7 +94220,7 @@ characters.data={ description="PARENTHESIZED HANGUL KHIEUKH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110F, 0x0029 }, + specials={ "compat", 0x28, 0x110F, 0x29 }, unicodeslot=0x320A, }, [0x320B]={ @@ -91973,7 +94230,7 @@ characters.data={ description="PARENTHESIZED HANGUL THIEUTH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1110, 0x0029 }, + specials={ "compat", 0x28, 0x1110, 0x29 }, unicodeslot=0x320B, }, [0x320C]={ @@ -91983,7 +94240,7 @@ characters.data={ description="PARENTHESIZED HANGUL PHIEUPH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1111, 0x0029 }, + specials={ "compat", 0x28, 0x1111, 0x29 }, unicodeslot=0x320C, }, [0x320D]={ @@ -91993,7 +94250,7 @@ characters.data={ description="PARENTHESIZED HANGUL HIEUH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1112, 0x0029 }, + specials={ "compat", 0x28, 0x1112, 0x29 }, unicodeslot=0x320D, }, [0x320E]={ @@ -92003,7 +94260,7 @@ characters.data={ description="PARENTHESIZED HANGUL KIYEOK A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1100, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1100, 0x1161, 0x29 }, unicodeslot=0x320E, }, [0x320F]={ @@ -92013,7 +94270,7 @@ characters.data={ description="PARENTHESIZED HANGUL NIEUN A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1102, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1102, 0x1161, 0x29 }, unicodeslot=0x320F, }, [0x3210]={ @@ -92023,7 +94280,7 @@ characters.data={ description="PARENTHESIZED HANGUL TIKEUT A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1103, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1103, 0x1161, 0x29 }, unicodeslot=0x3210, }, [0x3211]={ @@ -92033,7 +94290,7 @@ characters.data={ description="PARENTHESIZED HANGUL RIEUL A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1105, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1105, 0x1161, 0x29 }, unicodeslot=0x3211, }, [0x3212]={ @@ -92043,7 +94300,7 @@ characters.data={ description="PARENTHESIZED HANGUL MIEUM A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1106, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1106, 0x1161, 0x29 }, unicodeslot=0x3212, }, [0x3213]={ @@ -92053,7 +94310,7 @@ characters.data={ description="PARENTHESIZED HANGUL PIEUP A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1107, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1107, 0x1161, 0x29 }, unicodeslot=0x3213, }, [0x3214]={ @@ -92063,7 +94320,7 @@ characters.data={ description="PARENTHESIZED HANGUL SIOS A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1109, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1109, 0x1161, 0x29 }, unicodeslot=0x3214, }, [0x3215]={ @@ -92073,7 +94330,7 @@ characters.data={ description="PARENTHESIZED HANGUL IEUNG A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110B, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x110B, 0x1161, 0x29 }, unicodeslot=0x3215, }, [0x3216]={ @@ -92083,7 +94340,7 @@ characters.data={ description="PARENTHESIZED HANGUL CIEUC A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110C, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x110C, 0x1161, 0x29 }, unicodeslot=0x3216, }, [0x3217]={ @@ -92093,7 +94350,7 @@ characters.data={ description="PARENTHESIZED HANGUL CHIEUCH A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110E, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x110E, 0x1161, 0x29 }, unicodeslot=0x3217, }, [0x3218]={ @@ -92103,7 +94360,7 @@ characters.data={ description="PARENTHESIZED HANGUL KHIEUKH A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110F, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x110F, 0x1161, 0x29 }, unicodeslot=0x3218, }, [0x3219]={ @@ -92113,7 +94370,7 @@ characters.data={ description="PARENTHESIZED HANGUL THIEUTH A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1110, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1110, 0x1161, 0x29 }, unicodeslot=0x3219, }, [0x321A]={ @@ -92123,7 +94380,7 @@ characters.data={ description="PARENTHESIZED HANGUL PHIEUPH A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1111, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1111, 0x1161, 0x29 }, unicodeslot=0x321A, }, [0x321B]={ @@ -92133,7 +94390,7 @@ characters.data={ description="PARENTHESIZED HANGUL HIEUH A", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x1112, 0x1161, 0x0029 }, + specials={ "compat", 0x28, 0x1112, 0x1161, 0x29 }, unicodeslot=0x321B, }, [0x321C]={ @@ -92143,7 +94400,7 @@ characters.data={ description="PARENTHESIZED HANGUL CIEUC U", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x110C, 0x116E, 0x0029 }, + specials={ "compat", 0x28, 0x110C, 0x116E, 0x29 }, unicodeslot=0x321C, }, [0x321D]={ @@ -92152,7 +94409,7 @@ characters.data={ description="PARENTHESIZED KOREAN CHARACTER OJEON", direction="on", linebreak="id", - specials={ "compat", 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029 }, + specials={ "compat", 0x28, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x29 }, unicodeslot=0x321D, }, [0x321E]={ @@ -92161,7 +94418,7 @@ characters.data={ description="PARENTHESIZED KOREAN CHARACTER O HU", direction="on", linebreak="id", - specials={ "compat", 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029 }, + specials={ "compat", 0x28, 0x110B, 0x1169, 0x1112, 0x116E, 0x29 }, unicodeslot=0x321E, }, [0x3220]={ @@ -92171,7 +94428,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH ONE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E00, 0x0029 }, + specials={ "compat", 0x28, 0x4E00, 0x29 }, unicodeslot=0x3220, }, [0x3221]={ @@ -92181,7 +94438,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH TWO", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E8C, 0x0029 }, + specials={ "compat", 0x28, 0x4E8C, 0x29 }, unicodeslot=0x3221, }, [0x3222]={ @@ -92191,7 +94448,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH THREE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E09, 0x0029 }, + specials={ "compat", 0x28, 0x4E09, 0x29 }, unicodeslot=0x3222, }, [0x3223]={ @@ -92201,7 +94458,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH FOUR", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x56DB, 0x0029 }, + specials={ "compat", 0x28, 0x56DB, 0x29 }, unicodeslot=0x3223, }, [0x3224]={ @@ -92211,7 +94468,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH FIVE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E94, 0x0029 }, + specials={ "compat", 0x28, 0x4E94, 0x29 }, unicodeslot=0x3224, }, [0x3225]={ @@ -92221,7 +94478,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SIX", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x516D, 0x0029 }, + specials={ "compat", 0x28, 0x516D, 0x29 }, unicodeslot=0x3225, }, [0x3226]={ @@ -92231,7 +94488,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E03, 0x0029 }, + specials={ "compat", 0x28, 0x4E03, 0x29 }, unicodeslot=0x3226, }, [0x3227]={ @@ -92241,7 +94498,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH EIGHT", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x516B, 0x0029 }, + specials={ "compat", 0x28, 0x516B, 0x29 }, unicodeslot=0x3227, }, [0x3228]={ @@ -92251,7 +94508,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH NINE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4E5D, 0x0029 }, + specials={ "compat", 0x28, 0x4E5D, 0x29 }, unicodeslot=0x3228, }, [0x3229]={ @@ -92261,7 +94518,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH TEN", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x5341, 0x0029 }, + specials={ "compat", 0x28, 0x5341, 0x29 }, unicodeslot=0x3229, }, [0x322A]={ @@ -92271,7 +94528,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH MOON", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x6708, 0x0029 }, + specials={ "compat", 0x28, 0x6708, 0x29 }, unicodeslot=0x322A, }, [0x322B]={ @@ -92281,7 +94538,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH FIRE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x706B, 0x0029 }, + specials={ "compat", 0x28, 0x706B, 0x29 }, unicodeslot=0x322B, }, [0x322C]={ @@ -92291,7 +94548,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH WATER", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x6C34, 0x0029 }, + specials={ "compat", 0x28, 0x6C34, 0x29 }, unicodeslot=0x322C, }, [0x322D]={ @@ -92301,7 +94558,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH WOOD", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x6728, 0x0029 }, + specials={ "compat", 0x28, 0x6728, 0x29 }, unicodeslot=0x322D, }, [0x322E]={ @@ -92311,7 +94568,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH METAL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x91D1, 0x0029 }, + specials={ "compat", 0x28, 0x91D1, 0x29 }, unicodeslot=0x322E, }, [0x322F]={ @@ -92321,7 +94578,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH EARTH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x571F, 0x0029 }, + specials={ "compat", 0x28, 0x571F, 0x29 }, unicodeslot=0x322F, }, [0x3230]={ @@ -92331,7 +94588,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SUN", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x65E5, 0x0029 }, + specials={ "compat", 0x28, 0x65E5, 0x29 }, unicodeslot=0x3230, }, [0x3231]={ @@ -92341,7 +94598,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH STOCK", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x682A, 0x0029 }, + specials={ "compat", 0x28, 0x682A, 0x29 }, unicodeslot=0x3231, }, [0x3232]={ @@ -92351,7 +94608,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH HAVE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x6709, 0x0029 }, + specials={ "compat", 0x28, 0x6709, 0x29 }, unicodeslot=0x3232, }, [0x3233]={ @@ -92361,7 +94618,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SOCIETY", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x793E, 0x0029 }, + specials={ "compat", 0x28, 0x793E, 0x29 }, unicodeslot=0x3233, }, [0x3234]={ @@ -92371,7 +94628,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH NAME", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x540D, 0x0029 }, + specials={ "compat", 0x28, 0x540D, 0x29 }, unicodeslot=0x3234, }, [0x3235]={ @@ -92381,7 +94638,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SPECIAL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x7279, 0x0029 }, + specials={ "compat", 0x28, 0x7279, 0x29 }, unicodeslot=0x3235, }, [0x3236]={ @@ -92391,7 +94648,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH FINANCIAL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x8CA1, 0x0029 }, + specials={ "compat", 0x28, 0x8CA1, 0x29 }, unicodeslot=0x3236, }, [0x3237]={ @@ -92401,7 +94658,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH CONGRATULATION", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x795D, 0x0029 }, + specials={ "compat", 0x28, 0x795D, 0x29 }, unicodeslot=0x3237, }, [0x3238]={ @@ -92411,7 +94668,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH LABOR", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x52B4, 0x0029 }, + specials={ "compat", 0x28, 0x52B4, 0x29 }, unicodeslot=0x3238, }, [0x3239]={ @@ -92421,7 +94678,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH REPRESENT", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4EE3, 0x0029 }, + specials={ "compat", 0x28, 0x4EE3, 0x29 }, unicodeslot=0x3239, }, [0x323A]={ @@ -92431,7 +94688,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH CALL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x547C, 0x0029 }, + specials={ "compat", 0x28, 0x547C, 0x29 }, unicodeslot=0x323A, }, [0x323B]={ @@ -92441,7 +94698,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH STUDY", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x5B66, 0x0029 }, + specials={ "compat", 0x28, 0x5B66, 0x29 }, unicodeslot=0x323B, }, [0x323C]={ @@ -92451,7 +94708,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SUPERVISE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x76E3, 0x0029 }, + specials={ "compat", 0x28, 0x76E3, 0x29 }, unicodeslot=0x323C, }, [0x323D]={ @@ -92461,7 +94718,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH ENTERPRISE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4F01, 0x0029 }, + specials={ "compat", 0x28, 0x4F01, 0x29 }, unicodeslot=0x323D, }, [0x323E]={ @@ -92471,7 +94728,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH RESOURCE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x8CC7, 0x0029 }, + specials={ "compat", 0x28, 0x8CC7, 0x29 }, unicodeslot=0x323E, }, [0x323F]={ @@ -92481,7 +94738,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH ALLIANCE", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x5354, 0x0029 }, + specials={ "compat", 0x28, 0x5354, 0x29 }, unicodeslot=0x323F, }, [0x3240]={ @@ -92491,7 +94748,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH FESTIVAL", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x796D, 0x0029 }, + specials={ "compat", 0x28, 0x796D, 0x29 }, unicodeslot=0x3240, }, [0x3241]={ @@ -92500,7 +94757,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH REST", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x4F11, 0x0029 }, + specials={ "compat", 0x28, 0x4F11, 0x29 }, unicodeslot=0x3241, }, [0x3242]={ @@ -92510,7 +94767,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH SELF", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x81EA, 0x0029 }, + specials={ "compat", 0x28, 0x81EA, 0x29 }, unicodeslot=0x3242, }, [0x3243]={ @@ -92520,7 +94777,7 @@ characters.data={ description="PARENTHESIZED IDEOGRAPH REACH", direction="l", linebreak="id", - specials={ "compat", 0x0028, 0x81F3, 0x0029 }, + specials={ "compat", 0x28, 0x81F3, 0x29 }, unicodeslot=0x3243, }, [0x3244]={ @@ -92629,7 +94886,7 @@ characters.data={ description="PARTNERSHIP SIGN", direction="on", linebreak="id", - specials={ "square", 0x0050, 0x0054, 0x0045 }, + specials={ "square", 0x50, 0x54, 0x45 }, unicodeslot=0x3250, }, [0x3251]={ @@ -92638,7 +94895,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY ONE", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0031 }, + specials={ "circle", 0x32, 0x31 }, unicodeslot=0x3251, }, [0x3252]={ @@ -92647,7 +94904,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY TWO", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0032 }, + specials={ "circle", 0x32, 0x32 }, unicodeslot=0x3252, }, [0x3253]={ @@ -92656,7 +94913,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY THREE", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0033 }, + specials={ "circle", 0x32, 0x33 }, unicodeslot=0x3253, }, [0x3254]={ @@ -92665,7 +94922,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY FOUR", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0034 }, + specials={ "circle", 0x32, 0x34 }, unicodeslot=0x3254, }, [0x3255]={ @@ -92674,7 +94931,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY FIVE", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0035 }, + specials={ "circle", 0x32, 0x35 }, unicodeslot=0x3255, }, [0x3256]={ @@ -92683,7 +94940,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY SIX", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0036 }, + specials={ "circle", 0x32, 0x36 }, unicodeslot=0x3256, }, [0x3257]={ @@ -92692,7 +94949,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY SEVEN", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0037 }, + specials={ "circle", 0x32, 0x37 }, unicodeslot=0x3257, }, [0x3258]={ @@ -92701,7 +94958,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY EIGHT", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0038 }, + specials={ "circle", 0x32, 0x38 }, unicodeslot=0x3258, }, [0x3259]={ @@ -92710,7 +94967,7 @@ characters.data={ description="CIRCLED NUMBER TWENTY NINE", direction="on", linebreak="id", - specials={ "circle", 0x0032, 0x0039 }, + specials={ "circle", 0x32, 0x39 }, unicodeslot=0x3259, }, [0x325A]={ @@ -92719,7 +94976,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0030 }, + specials={ "circle", 0x33, 0x30 }, unicodeslot=0x325A, }, [0x325B]={ @@ -92728,7 +94985,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY ONE", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0031 }, + specials={ "circle", 0x33, 0x31 }, unicodeslot=0x325B, }, [0x325C]={ @@ -92737,7 +94994,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY TWO", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0032 }, + specials={ "circle", 0x33, 0x32 }, unicodeslot=0x325C, }, [0x325D]={ @@ -92746,7 +95003,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY THREE", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0033 }, + specials={ "circle", 0x33, 0x33 }, unicodeslot=0x325D, }, [0x325E]={ @@ -92755,7 +95012,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY FOUR", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0034 }, + specials={ "circle", 0x33, 0x34 }, unicodeslot=0x325E, }, [0x325F]={ @@ -92764,7 +95021,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY FIVE", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0035 }, + specials={ "circle", 0x33, 0x35 }, unicodeslot=0x325F, }, [0x3260]={ @@ -93558,7 +95815,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY SIX", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0036 }, + specials={ "circle", 0x33, 0x36 }, unicodeslot=0x32B1, }, [0x32B2]={ @@ -93567,7 +95824,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY SEVEN", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0037 }, + specials={ "circle", 0x33, 0x37 }, unicodeslot=0x32B2, }, [0x32B3]={ @@ -93576,7 +95833,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY EIGHT", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0038 }, + specials={ "circle", 0x33, 0x38 }, unicodeslot=0x32B3, }, [0x32B4]={ @@ -93585,7 +95842,7 @@ characters.data={ description="CIRCLED NUMBER THIRTY NINE", direction="on", linebreak="id", - specials={ "circle", 0x0033, 0x0039 }, + specials={ "circle", 0x33, 0x39 }, unicodeslot=0x32B4, }, [0x32B5]={ @@ -93594,7 +95851,7 @@ characters.data={ description="CIRCLED NUMBER FORTY", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0030 }, + specials={ "circle", 0x34, 0x30 }, unicodeslot=0x32B5, }, [0x32B6]={ @@ -93603,7 +95860,7 @@ characters.data={ description="CIRCLED NUMBER FORTY ONE", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0031 }, + specials={ "circle", 0x34, 0x31 }, unicodeslot=0x32B6, }, [0x32B7]={ @@ -93612,7 +95869,7 @@ characters.data={ description="CIRCLED NUMBER FORTY TWO", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0032 }, + specials={ "circle", 0x34, 0x32 }, unicodeslot=0x32B7, }, [0x32B8]={ @@ -93621,7 +95878,7 @@ characters.data={ description="CIRCLED NUMBER FORTY THREE", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0033 }, + specials={ "circle", 0x34, 0x33 }, unicodeslot=0x32B8, }, [0x32B9]={ @@ -93630,7 +95887,7 @@ characters.data={ description="CIRCLED NUMBER FORTY FOUR", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0034 }, + specials={ "circle", 0x34, 0x34 }, unicodeslot=0x32B9, }, [0x32BA]={ @@ -93639,7 +95896,7 @@ characters.data={ description="CIRCLED NUMBER FORTY FIVE", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0035 }, + specials={ "circle", 0x34, 0x35 }, unicodeslot=0x32BA, }, [0x32BB]={ @@ -93648,7 +95905,7 @@ characters.data={ description="CIRCLED NUMBER FORTY SIX", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0036 }, + specials={ "circle", 0x34, 0x36 }, unicodeslot=0x32BB, }, [0x32BC]={ @@ -93657,7 +95914,7 @@ characters.data={ description="CIRCLED NUMBER FORTY SEVEN", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0037 }, + specials={ "circle", 0x34, 0x37 }, unicodeslot=0x32BC, }, [0x32BD]={ @@ -93666,7 +95923,7 @@ characters.data={ description="CIRCLED NUMBER FORTY EIGHT", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0038 }, + specials={ "circle", 0x34, 0x38 }, unicodeslot=0x32BD, }, [0x32BE]={ @@ -93675,7 +95932,7 @@ characters.data={ description="CIRCLED NUMBER FORTY NINE", direction="on", linebreak="id", - specials={ "circle", 0x0034, 0x0039 }, + specials={ "circle", 0x34, 0x39 }, unicodeslot=0x32BE, }, [0x32BF]={ @@ -93684,7 +95941,7 @@ characters.data={ description="CIRCLED NUMBER FIFTY", direction="on", linebreak="id", - specials={ "circle", 0x0035, 0x0030 }, + specials={ "circle", 0x35, 0x30 }, unicodeslot=0x32BF, }, [0x32C0]={ @@ -93693,7 +95950,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x6708 }, + specials={ "compat", 0x31, 0x6708 }, unicodeslot=0x32C0, }, [0x32C1]={ @@ -93702,7 +95959,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x6708 }, + specials={ "compat", 0x32, 0x6708 }, unicodeslot=0x32C1, }, [0x32C2]={ @@ -93711,7 +95968,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH", direction="l", linebreak="id", - specials={ "compat", 0x0033, 0x6708 }, + specials={ "compat", 0x33, 0x6708 }, unicodeslot=0x32C2, }, [0x32C3]={ @@ -93720,7 +95977,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL", direction="l", linebreak="id", - specials={ "compat", 0x0034, 0x6708 }, + specials={ "compat", 0x34, 0x6708 }, unicodeslot=0x32C3, }, [0x32C4]={ @@ -93729,7 +95986,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY", direction="l", linebreak="id", - specials={ "compat", 0x0035, 0x6708 }, + specials={ "compat", 0x35, 0x6708 }, unicodeslot=0x32C4, }, [0x32C5]={ @@ -93738,7 +95995,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE", direction="l", linebreak="id", - specials={ "compat", 0x0036, 0x6708 }, + specials={ "compat", 0x36, 0x6708 }, unicodeslot=0x32C5, }, [0x32C6]={ @@ -93747,7 +96004,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY", direction="l", linebreak="id", - specials={ "compat", 0x0037, 0x6708 }, + specials={ "compat", 0x37, 0x6708 }, unicodeslot=0x32C6, }, [0x32C7]={ @@ -93756,7 +96013,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST", direction="l", linebreak="id", - specials={ "compat", 0x0038, 0x6708 }, + specials={ "compat", 0x38, 0x6708 }, unicodeslot=0x32C7, }, [0x32C8]={ @@ -93765,7 +96022,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER", direction="l", linebreak="id", - specials={ "compat", 0x0039, 0x6708 }, + specials={ "compat", 0x39, 0x6708 }, unicodeslot=0x32C8, }, [0x32C9]={ @@ -93774,7 +96031,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0030, 0x6708 }, + specials={ "compat", 0x31, 0x30, 0x6708 }, unicodeslot=0x32C9, }, [0x32CA]={ @@ -93783,7 +96040,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0031, 0x6708 }, + specials={ "compat", 0x31, 0x31, 0x6708 }, unicodeslot=0x32CA, }, [0x32CB]={ @@ -93792,7 +96049,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0032, 0x6708 }, + specials={ "compat", 0x31, 0x32, 0x6708 }, unicodeslot=0x32CB, }, [0x32CC]={ @@ -93801,7 +96058,7 @@ characters.data={ description="SQUARE HG", direction="on", linebreak="id", - specials={ "square", 0x0048, 0x0067 }, + specials={ "square", 0x48, 0x67 }, unicodeslot=0x32CC, }, [0x32CD]={ @@ -93810,7 +96067,7 @@ characters.data={ description="SQUARE ERG", direction="on", linebreak="id", - specials={ "square", 0x0065, 0x0072, 0x0067 }, + specials={ "square", 0x65, 0x72, 0x67 }, unicodeslot=0x32CD, }, [0x32CE]={ @@ -93819,7 +96076,7 @@ characters.data={ description="SQUARE EV", direction="on", linebreak="id", - specials={ "square", 0x0065, 0x0056 }, + specials={ "square", 0x65, 0x56 }, unicodeslot=0x32CE, }, [0x32CF]={ @@ -93828,7 +96085,7 @@ characters.data={ description="LIMITED LIABILITY SIGN", direction="on", linebreak="id", - specials={ "square", 0x004C, 0x0054, 0x0044 }, + specials={ "square", 0x4C, 0x54, 0x44 }, unicodeslot=0x32CF, }, [0x32D0]={ @@ -95080,7 +97337,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO", direction="l", linebreak="id", - specials={ "compat", 0x0030, 0x70B9 }, + specials={ "compat", 0x30, 0x70B9 }, unicodeslot=0x3358, }, [0x3359]={ @@ -95089,7 +97346,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x70B9 }, + specials={ "compat", 0x31, 0x70B9 }, unicodeslot=0x3359, }, [0x335A]={ @@ -95098,7 +97355,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x70B9 }, + specials={ "compat", 0x32, 0x70B9 }, unicodeslot=0x335A, }, [0x335B]={ @@ -95107,7 +97364,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE", direction="l", linebreak="id", - specials={ "compat", 0x0033, 0x70B9 }, + specials={ "compat", 0x33, 0x70B9 }, unicodeslot=0x335B, }, [0x335C]={ @@ -95116,7 +97373,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR", direction="l", linebreak="id", - specials={ "compat", 0x0034, 0x70B9 }, + specials={ "compat", 0x34, 0x70B9 }, unicodeslot=0x335C, }, [0x335D]={ @@ -95125,7 +97382,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE", direction="l", linebreak="id", - specials={ "compat", 0x0035, 0x70B9 }, + specials={ "compat", 0x35, 0x70B9 }, unicodeslot=0x335D, }, [0x335E]={ @@ -95134,7 +97391,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX", direction="l", linebreak="id", - specials={ "compat", 0x0036, 0x70B9 }, + specials={ "compat", 0x36, 0x70B9 }, unicodeslot=0x335E, }, [0x335F]={ @@ -95143,7 +97400,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0037, 0x70B9 }, + specials={ "compat", 0x37, 0x70B9 }, unicodeslot=0x335F, }, [0x3360]={ @@ -95152,7 +97409,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT", direction="l", linebreak="id", - specials={ "compat", 0x0038, 0x70B9 }, + specials={ "compat", 0x38, 0x70B9 }, unicodeslot=0x3360, }, [0x3361]={ @@ -95161,7 +97418,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE", direction="l", linebreak="id", - specials={ "compat", 0x0039, 0x70B9 }, + specials={ "compat", 0x39, 0x70B9 }, unicodeslot=0x3361, }, [0x3362]={ @@ -95170,7 +97427,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0030, 0x70B9 }, + specials={ "compat", 0x31, 0x30, 0x70B9 }, unicodeslot=0x3362, }, [0x3363]={ @@ -95179,7 +97436,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0031, 0x70B9 }, + specials={ "compat", 0x31, 0x31, 0x70B9 }, unicodeslot=0x3363, }, [0x3364]={ @@ -95188,7 +97445,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0032, 0x70B9 }, + specials={ "compat", 0x31, 0x32, 0x70B9 }, unicodeslot=0x3364, }, [0x3365]={ @@ -95197,7 +97454,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0033, 0x70B9 }, + specials={ "compat", 0x31, 0x33, 0x70B9 }, unicodeslot=0x3365, }, [0x3366]={ @@ -95206,7 +97463,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0034, 0x70B9 }, + specials={ "compat", 0x31, 0x34, 0x70B9 }, unicodeslot=0x3366, }, [0x3367]={ @@ -95215,7 +97472,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0035, 0x70B9 }, + specials={ "compat", 0x31, 0x35, 0x70B9 }, unicodeslot=0x3367, }, [0x3368]={ @@ -95224,7 +97481,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0036, 0x70B9 }, + specials={ "compat", 0x31, 0x36, 0x70B9 }, unicodeslot=0x3368, }, [0x3369]={ @@ -95233,7 +97490,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0037, 0x70B9 }, + specials={ "compat", 0x31, 0x37, 0x70B9 }, unicodeslot=0x3369, }, [0x336A]={ @@ -95242,7 +97499,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0038, 0x70B9 }, + specials={ "compat", 0x31, 0x38, 0x70B9 }, unicodeslot=0x336A, }, [0x336B]={ @@ -95251,7 +97508,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0039, 0x70B9 }, + specials={ "compat", 0x31, 0x39, 0x70B9 }, unicodeslot=0x336B, }, [0x336C]={ @@ -95260,7 +97517,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0030, 0x70B9 }, + specials={ "compat", 0x32, 0x30, 0x70B9 }, unicodeslot=0x336C, }, [0x336D]={ @@ -95269,7 +97526,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0031, 0x70B9 }, + specials={ "compat", 0x32, 0x31, 0x70B9 }, unicodeslot=0x336D, }, [0x336E]={ @@ -95278,7 +97535,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0032, 0x70B9 }, + specials={ "compat", 0x32, 0x32, 0x70B9 }, unicodeslot=0x336E, }, [0x336F]={ @@ -95287,7 +97544,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0033, 0x70B9 }, + specials={ "compat", 0x32, 0x33, 0x70B9 }, unicodeslot=0x336F, }, [0x3370]={ @@ -95296,7 +97553,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0034, 0x70B9 }, + specials={ "compat", 0x32, 0x34, 0x70B9 }, unicodeslot=0x3370, }, [0x3371]={ @@ -95305,7 +97562,7 @@ characters.data={ description="SQUARE HPA", direction="l", linebreak="id", - specials={ "square", 0x0068, 0x0050, 0x0061 }, + specials={ "square", 0x68, 0x50, 0x61 }, unicodeslot=0x3371, }, [0x3372]={ @@ -95314,7 +97571,7 @@ characters.data={ description="SQUARE DA", direction="l", linebreak="id", - specials={ "square", 0x0064, 0x0061 }, + specials={ "square", 0x64, 0x61 }, unicodeslot=0x3372, }, [0x3373]={ @@ -95323,7 +97580,7 @@ characters.data={ description="SQUARE AU", direction="l", linebreak="id", - specials={ "square", 0x0041, 0x0055 }, + specials={ "square", 0x41, 0x55 }, unicodeslot=0x3373, }, [0x3374]={ @@ -95332,7 +97589,7 @@ characters.data={ description="SQUARE BAR", direction="l", linebreak="id", - specials={ "square", 0x0062, 0x0061, 0x0072 }, + specials={ "square", 0x62, 0x61, 0x72 }, unicodeslot=0x3374, }, [0x3375]={ @@ -95341,7 +97598,7 @@ characters.data={ description="SQUARE OV", direction="l", linebreak="id", - specials={ "square", 0x006F, 0x0056 }, + specials={ "square", 0x6F, 0x56 }, unicodeslot=0x3375, }, [0x3376]={ @@ -95350,7 +97607,7 @@ characters.data={ description="SQUARE PC", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0063 }, + specials={ "square", 0x70, 0x63 }, unicodeslot=0x3376, }, [0x3377]={ @@ -95359,7 +97616,7 @@ characters.data={ description="SQUARE DM", direction="on", linebreak="id", - specials={ "square", 0x0064, 0x006D }, + specials={ "square", 0x64, 0x6D }, unicodeslot=0x3377, }, [0x3378]={ @@ -95368,7 +97625,7 @@ characters.data={ description="SQUARE DM SQUARED", direction="on", linebreak="id", - specials={ "square", 0x0064, 0x006D, 0x00B2 }, + specials={ "square", 0x64, 0x6D, 0xB2 }, unicodeslot=0x3378, }, [0x3379]={ @@ -95377,7 +97634,7 @@ characters.data={ description="SQUARE DM CUBED", direction="on", linebreak="id", - specials={ "square", 0x0064, 0x006D, 0x00B3 }, + specials={ "square", 0x64, 0x6D, 0xB3 }, unicodeslot=0x3379, }, [0x337A]={ @@ -95386,7 +97643,7 @@ characters.data={ description="SQUARE IU", direction="on", linebreak="id", - specials={ "square", 0x0049, 0x0055 }, + specials={ "square", 0x49, 0x55 }, unicodeslot=0x337A, }, [0x337B]={ @@ -95446,7 +97703,7 @@ characters.data={ description="SQUARE PA AMPS", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0041 }, + specials={ "square", 0x70, 0x41 }, unicodeslot=0x3380, }, [0x3381]={ @@ -95456,7 +97713,7 @@ characters.data={ description="SQUARE NA", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x0041 }, + specials={ "square", 0x6E, 0x41 }, unicodeslot=0x3381, }, [0x3382]={ @@ -95466,7 +97723,7 @@ characters.data={ description="SQUARE MU A", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0041 }, + specials={ "square", 0x3BC, 0x41 }, unicodeslot=0x3382, }, [0x3383]={ @@ -95476,7 +97733,7 @@ characters.data={ description="SQUARE MA", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0041 }, + specials={ "square", 0x6D, 0x41 }, unicodeslot=0x3383, }, [0x3384]={ @@ -95486,7 +97743,7 @@ characters.data={ description="SQUARE KA", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0041 }, + specials={ "square", 0x6B, 0x41 }, unicodeslot=0x3384, }, [0x3385]={ @@ -95496,7 +97753,7 @@ characters.data={ description="SQUARE KB", direction="l", linebreak="id", - specials={ "square", 0x004B, 0x0042 }, + specials={ "square", 0x4B, 0x42 }, unicodeslot=0x3385, }, [0x3386]={ @@ -95506,7 +97763,7 @@ characters.data={ description="SQUARE MB", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x0042 }, + specials={ "square", 0x4D, 0x42 }, unicodeslot=0x3386, }, [0x3387]={ @@ -95516,7 +97773,7 @@ characters.data={ description="SQUARE GB", direction="l", linebreak="id", - specials={ "square", 0x0047, 0x0042 }, + specials={ "square", 0x47, 0x42 }, unicodeslot=0x3387, }, [0x3388]={ @@ -95526,7 +97783,7 @@ characters.data={ description="SQUARE CAL", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x0061, 0x006C }, + specials={ "square", 0x63, 0x61, 0x6C }, unicodeslot=0x3388, }, [0x3389]={ @@ -95536,7 +97793,7 @@ characters.data={ description="SQUARE KCAL", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0063, 0x0061, 0x006C }, + specials={ "square", 0x6B, 0x63, 0x61, 0x6C }, unicodeslot=0x3389, }, [0x338A]={ @@ -95546,7 +97803,7 @@ characters.data={ description="SQUARE PF", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0046 }, + specials={ "square", 0x70, 0x46 }, unicodeslot=0x338A, }, [0x338B]={ @@ -95556,7 +97813,7 @@ characters.data={ description="SQUARE NF", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x0046 }, + specials={ "square", 0x6E, 0x46 }, unicodeslot=0x338B, }, [0x338C]={ @@ -95566,7 +97823,7 @@ characters.data={ description="SQUARE MU F", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0046 }, + specials={ "square", 0x3BC, 0x46 }, unicodeslot=0x338C, }, [0x338D]={ @@ -95576,7 +97833,7 @@ characters.data={ description="SQUARE MU G", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0067 }, + specials={ "square", 0x3BC, 0x67 }, unicodeslot=0x338D, }, [0x338E]={ @@ -95586,7 +97843,7 @@ characters.data={ description="SQUARE MG", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0067 }, + specials={ "square", 0x6D, 0x67 }, unicodeslot=0x338E, }, [0x338F]={ @@ -95596,7 +97853,7 @@ characters.data={ description="SQUARE KG", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0067 }, + specials={ "square", 0x6B, 0x67 }, unicodeslot=0x338F, }, [0x3390]={ @@ -95606,7 +97863,7 @@ characters.data={ description="SQUARE HZ", direction="l", linebreak="id", - specials={ "square", 0x0048, 0x007A }, + specials={ "square", 0x48, 0x7A }, unicodeslot=0x3390, }, [0x3391]={ @@ -95616,7 +97873,7 @@ characters.data={ description="SQUARE KHZ", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0048, 0x007A }, + specials={ "square", 0x6B, 0x48, 0x7A }, unicodeslot=0x3391, }, [0x3392]={ @@ -95626,7 +97883,7 @@ characters.data={ description="SQUARE MHZ", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x0048, 0x007A }, + specials={ "square", 0x4D, 0x48, 0x7A }, unicodeslot=0x3392, }, [0x3393]={ @@ -95636,7 +97893,7 @@ characters.data={ description="SQUARE GHZ", direction="l", linebreak="id", - specials={ "square", 0x0047, 0x0048, 0x007A }, + specials={ "square", 0x47, 0x48, 0x7A }, unicodeslot=0x3393, }, [0x3394]={ @@ -95646,7 +97903,7 @@ characters.data={ description="SQUARE THZ", direction="l", linebreak="id", - specials={ "square", 0x0054, 0x0048, 0x007A }, + specials={ "square", 0x54, 0x48, 0x7A }, unicodeslot=0x3394, }, [0x3395]={ @@ -95656,7 +97913,7 @@ characters.data={ description="SQUARE MU L", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x2113 }, + specials={ "square", 0x3BC, 0x2113 }, unicodeslot=0x3395, }, [0x3396]={ @@ -95666,7 +97923,7 @@ characters.data={ description="SQUARE ML", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x2113 }, + specials={ "square", 0x6D, 0x2113 }, unicodeslot=0x3396, }, [0x3397]={ @@ -95676,7 +97933,7 @@ characters.data={ description="SQUARE DL", direction="l", linebreak="id", - specials={ "square", 0x0064, 0x2113 }, + specials={ "square", 0x64, 0x2113 }, unicodeslot=0x3397, }, [0x3398]={ @@ -95686,7 +97943,7 @@ characters.data={ description="SQUARE KL", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x2113 }, + specials={ "square", 0x6B, 0x2113 }, unicodeslot=0x3398, }, [0x3399]={ @@ -95696,7 +97953,7 @@ characters.data={ description="SQUARE FM", direction="l", linebreak="id", - specials={ "square", 0x0066, 0x006D }, + specials={ "square", 0x66, 0x6D }, unicodeslot=0x3399, }, [0x339A]={ @@ -95706,7 +97963,7 @@ characters.data={ description="SQUARE NM", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x006D }, + specials={ "square", 0x6E, 0x6D }, unicodeslot=0x339A, }, [0x339B]={ @@ -95716,7 +97973,7 @@ characters.data={ description="SQUARE MU M", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x006D }, + specials={ "square", 0x3BC, 0x6D }, unicodeslot=0x339B, }, [0x339C]={ @@ -95726,7 +97983,7 @@ characters.data={ description="SQUARE MM", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x006D }, + specials={ "square", 0x6D, 0x6D }, unicodeslot=0x339C, }, [0x339D]={ @@ -95736,7 +97993,7 @@ characters.data={ description="SQUARE CM", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x006D }, + specials={ "square", 0x63, 0x6D }, unicodeslot=0x339D, }, [0x339E]={ @@ -95746,7 +98003,7 @@ characters.data={ description="SQUARE KM", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x006D }, + specials={ "square", 0x6B, 0x6D }, unicodeslot=0x339E, }, [0x339F]={ @@ -95756,7 +98013,7 @@ characters.data={ description="SQUARE MM SQUARED", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x006D, 0x00B2 }, + specials={ "square", 0x6D, 0x6D, 0xB2 }, unicodeslot=0x339F, }, [0x33A0]={ @@ -95766,7 +98023,7 @@ characters.data={ description="SQUARE CM SQUARED", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x006D, 0x00B2 }, + specials={ "square", 0x63, 0x6D, 0xB2 }, unicodeslot=0x33A0, }, [0x33A1]={ @@ -95776,7 +98033,7 @@ characters.data={ description="SQUARE M SQUARED", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x00B2 }, + specials={ "square", 0x6D, 0xB2 }, unicodeslot=0x33A1, }, [0x33A2]={ @@ -95786,7 +98043,7 @@ characters.data={ description="SQUARE KM SQUARED", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x006D, 0x00B2 }, + specials={ "square", 0x6B, 0x6D, 0xB2 }, unicodeslot=0x33A2, }, [0x33A3]={ @@ -95796,7 +98053,7 @@ characters.data={ description="SQUARE MM CUBED", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x006D, 0x00B3 }, + specials={ "square", 0x6D, 0x6D, 0xB3 }, unicodeslot=0x33A3, }, [0x33A4]={ @@ -95806,7 +98063,7 @@ characters.data={ description="SQUARE CM CUBED", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x006D, 0x00B3 }, + specials={ "square", 0x63, 0x6D, 0xB3 }, unicodeslot=0x33A4, }, [0x33A5]={ @@ -95816,7 +98073,7 @@ characters.data={ description="SQUARE M CUBED", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x00B3 }, + specials={ "square", 0x6D, 0xB3 }, unicodeslot=0x33A5, }, [0x33A6]={ @@ -95826,7 +98083,7 @@ characters.data={ description="SQUARE KM CUBED", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x006D, 0x00B3 }, + specials={ "square", 0x6B, 0x6D, 0xB3 }, unicodeslot=0x33A6, }, [0x33A7]={ @@ -95836,7 +98093,7 @@ characters.data={ description="SQUARE M OVER S", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x2215, 0x0073 }, + specials={ "square", 0x6D, 0x2215, 0x73 }, unicodeslot=0x33A7, }, [0x33A8]={ @@ -95846,7 +98103,7 @@ characters.data={ description="SQUARE M OVER S SQUARED", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x2215, 0x0073, 0x00B2 }, + specials={ "square", 0x6D, 0x2215, 0x73, 0xB2 }, unicodeslot=0x33A8, }, [0x33A9]={ @@ -95856,7 +98113,7 @@ characters.data={ description="SQUARE PA", direction="l", linebreak="id", - specials={ "square", 0x0050, 0x0061 }, + specials={ "square", 0x50, 0x61 }, unicodeslot=0x33A9, }, [0x33AA]={ @@ -95866,7 +98123,7 @@ characters.data={ description="SQUARE KPA", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0050, 0x0061 }, + specials={ "square", 0x6B, 0x50, 0x61 }, unicodeslot=0x33AA, }, [0x33AB]={ @@ -95876,7 +98133,7 @@ characters.data={ description="SQUARE MPA", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x0050, 0x0061 }, + specials={ "square", 0x4D, 0x50, 0x61 }, unicodeslot=0x33AB, }, [0x33AC]={ @@ -95886,7 +98143,7 @@ characters.data={ description="SQUARE GPA", direction="l", linebreak="id", - specials={ "square", 0x0047, 0x0050, 0x0061 }, + specials={ "square", 0x47, 0x50, 0x61 }, unicodeslot=0x33AC, }, [0x33AD]={ @@ -95896,7 +98153,7 @@ characters.data={ description="SQUARE RAD", direction="l", linebreak="id", - specials={ "square", 0x0072, 0x0061, 0x0064 }, + specials={ "square", 0x72, 0x61, 0x64 }, unicodeslot=0x33AD, }, [0x33AE]={ @@ -95906,7 +98163,7 @@ characters.data={ description="SQUARE RAD OVER S", direction="l", linebreak="id", - specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073 }, + specials={ "square", 0x72, 0x61, 0x64, 0x2215, 0x73 }, unicodeslot=0x33AE, }, [0x33AF]={ @@ -95916,7 +98173,7 @@ characters.data={ description="SQUARE RAD OVER S SQUARED", direction="l", linebreak="id", - specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2 }, + specials={ "square", 0x72, 0x61, 0x64, 0x2215, 0x73, 0xB2 }, unicodeslot=0x33AF, }, [0x33B0]={ @@ -95926,7 +98183,7 @@ characters.data={ description="SQUARE PS", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0073 }, + specials={ "square", 0x70, 0x73 }, unicodeslot=0x33B0, }, [0x33B1]={ @@ -95936,7 +98193,7 @@ characters.data={ description="SQUARE NS", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x0073 }, + specials={ "square", 0x6E, 0x73 }, unicodeslot=0x33B1, }, [0x33B2]={ @@ -95946,7 +98203,7 @@ characters.data={ description="SQUARE MU S", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0073 }, + specials={ "square", 0x3BC, 0x73 }, unicodeslot=0x33B2, }, [0x33B3]={ @@ -95956,7 +98213,7 @@ characters.data={ description="SQUARE MS", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0073 }, + specials={ "square", 0x6D, 0x73 }, unicodeslot=0x33B3, }, [0x33B4]={ @@ -95966,7 +98223,7 @@ characters.data={ description="SQUARE PV", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0056 }, + specials={ "square", 0x70, 0x56 }, unicodeslot=0x33B4, }, [0x33B5]={ @@ -95976,7 +98233,7 @@ characters.data={ description="SQUARE NV", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x0056 }, + specials={ "square", 0x6E, 0x56 }, unicodeslot=0x33B5, }, [0x33B6]={ @@ -95986,7 +98243,7 @@ characters.data={ description="SQUARE MU V", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0056 }, + specials={ "square", 0x3BC, 0x56 }, unicodeslot=0x33B6, }, [0x33B7]={ @@ -95996,7 +98253,7 @@ characters.data={ description="SQUARE MV", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0056 }, + specials={ "square", 0x6D, 0x56 }, unicodeslot=0x33B7, }, [0x33B8]={ @@ -96006,7 +98263,7 @@ characters.data={ description="SQUARE KV", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0056 }, + specials={ "square", 0x6B, 0x56 }, unicodeslot=0x33B8, }, [0x33B9]={ @@ -96016,7 +98273,7 @@ characters.data={ description="SQUARE MV MEGA", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x0056 }, + specials={ "square", 0x4D, 0x56 }, unicodeslot=0x33B9, }, [0x33BA]={ @@ -96026,7 +98283,7 @@ characters.data={ description="SQUARE PW", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x0057 }, + specials={ "square", 0x70, 0x57 }, unicodeslot=0x33BA, }, [0x33BB]={ @@ -96036,7 +98293,7 @@ characters.data={ description="SQUARE NW", direction="l", linebreak="id", - specials={ "square", 0x006E, 0x0057 }, + specials={ "square", 0x6E, 0x57 }, unicodeslot=0x33BB, }, [0x33BC]={ @@ -96046,7 +98303,7 @@ characters.data={ description="SQUARE MU W", direction="l", linebreak="id", - specials={ "square", 0x03BC, 0x0057 }, + specials={ "square", 0x3BC, 0x57 }, unicodeslot=0x33BC, }, [0x33BD]={ @@ -96056,7 +98313,7 @@ characters.data={ description="SQUARE MW", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0057 }, + specials={ "square", 0x6D, 0x57 }, unicodeslot=0x33BD, }, [0x33BE]={ @@ -96066,7 +98323,7 @@ characters.data={ description="SQUARE KW", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0057 }, + specials={ "square", 0x6B, 0x57 }, unicodeslot=0x33BE, }, [0x33BF]={ @@ -96076,7 +98333,7 @@ characters.data={ description="SQUARE MW MEGA", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x0057 }, + specials={ "square", 0x4D, 0x57 }, unicodeslot=0x33BF, }, [0x33C0]={ @@ -96086,7 +98343,7 @@ characters.data={ description="SQUARE K OHM", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x03A9 }, + specials={ "square", 0x6B, 0x3A9 }, unicodeslot=0x33C0, }, [0x33C1]={ @@ -96096,7 +98353,7 @@ characters.data={ description="SQUARE M OHM", direction="l", linebreak="id", - specials={ "square", 0x004D, 0x03A9 }, + specials={ "square", 0x4D, 0x3A9 }, unicodeslot=0x33C1, }, [0x33C2]={ @@ -96106,7 +98363,7 @@ characters.data={ description="SQUARE AM", direction="l", linebreak="id", - specials={ "square", 0x0061, 0x002E, 0x006D, 0x002E }, + specials={ "square", 0x61, 0x2E, 0x6D, 0x2E }, unicodeslot=0x33C2, }, [0x33C3]={ @@ -96116,7 +98373,7 @@ characters.data={ description="SQUARE BQ", direction="l", linebreak="id", - specials={ "square", 0x0042, 0x0071 }, + specials={ "square", 0x42, 0x71 }, unicodeslot=0x33C3, }, [0x33C4]={ @@ -96126,7 +98383,7 @@ characters.data={ description="SQUARE CC", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x0063 }, + specials={ "square", 0x63, 0x63 }, unicodeslot=0x33C4, }, [0x33C5]={ @@ -96136,7 +98393,7 @@ characters.data={ description="SQUARE CD", direction="l", linebreak="id", - specials={ "square", 0x0063, 0x0064 }, + specials={ "square", 0x63, 0x64 }, unicodeslot=0x33C5, }, [0x33C6]={ @@ -96146,7 +98403,7 @@ characters.data={ description="SQUARE C OVER KG", direction="l", linebreak="id", - specials={ "square", 0x0043, 0x2215, 0x006B, 0x0067 }, + specials={ "square", 0x43, 0x2215, 0x6B, 0x67 }, unicodeslot=0x33C6, }, [0x33C7]={ @@ -96156,7 +98413,7 @@ characters.data={ description="SQUARE CO", direction="l", linebreak="id", - specials={ "square", 0x0043, 0x006F, 0x002E }, + specials={ "square", 0x43, 0x6F, 0x2E }, unicodeslot=0x33C7, }, [0x33C8]={ @@ -96166,7 +98423,7 @@ characters.data={ description="SQUARE DB", direction="l", linebreak="id", - specials={ "square", 0x0064, 0x0042 }, + specials={ "square", 0x64, 0x42 }, unicodeslot=0x33C8, }, [0x33C9]={ @@ -96176,7 +98433,7 @@ characters.data={ description="SQUARE GY", direction="l", linebreak="id", - specials={ "square", 0x0047, 0x0079 }, + specials={ "square", 0x47, 0x79 }, unicodeslot=0x33C9, }, [0x33CA]={ @@ -96186,7 +98443,7 @@ characters.data={ description="SQUARE HA", direction="l", linebreak="id", - specials={ "square", 0x0068, 0x0061 }, + specials={ "square", 0x68, 0x61 }, unicodeslot=0x33CA, }, [0x33CB]={ @@ -96196,7 +98453,7 @@ characters.data={ description="SQUARE HP", direction="l", linebreak="id", - specials={ "square", 0x0048, 0x0050 }, + specials={ "square", 0x48, 0x50 }, unicodeslot=0x33CB, }, [0x33CC]={ @@ -96205,7 +98462,7 @@ characters.data={ description="SQUARE IN", direction="l", linebreak="id", - specials={ "square", 0x0069, 0x006E }, + specials={ "square", 0x69, 0x6E }, unicodeslot=0x33CC, }, [0x33CD]={ @@ -96215,7 +98472,7 @@ characters.data={ description="SQUARE KK", direction="l", linebreak="id", - specials={ "square", 0x004B, 0x004B }, + specials={ "square", 0x4B, 0x4B }, unicodeslot=0x33CD, }, [0x33CE]={ @@ -96225,7 +98482,7 @@ characters.data={ description="SQUARE KM CAPITAL", direction="l", linebreak="id", - specials={ "square", 0x004B, 0x004D }, + specials={ "square", 0x4B, 0x4D }, unicodeslot=0x33CE, }, [0x33CF]={ @@ -96235,7 +98492,7 @@ characters.data={ description="SQUARE KT", direction="l", linebreak="id", - specials={ "square", 0x006B, 0x0074 }, + specials={ "square", 0x6B, 0x74 }, unicodeslot=0x33CF, }, [0x33D0]={ @@ -96245,7 +98502,7 @@ characters.data={ description="SQUARE LM", direction="l", linebreak="id", - specials={ "square", 0x006C, 0x006D }, + specials={ "square", 0x6C, 0x6D }, unicodeslot=0x33D0, }, [0x33D1]={ @@ -96255,7 +98512,7 @@ characters.data={ description="SQUARE LN", direction="l", linebreak="id", - specials={ "square", 0x006C, 0x006E }, + specials={ "square", 0x6C, 0x6E }, unicodeslot=0x33D1, }, [0x33D2]={ @@ -96265,7 +98522,7 @@ characters.data={ description="SQUARE LOG", direction="l", linebreak="id", - specials={ "square", 0x006C, 0x006F, 0x0067 }, + specials={ "square", 0x6C, 0x6F, 0x67 }, unicodeslot=0x33D2, }, [0x33D3]={ @@ -96275,7 +98532,7 @@ characters.data={ description="SQUARE LX", direction="l", linebreak="id", - specials={ "square", 0x006C, 0x0078 }, + specials={ "square", 0x6C, 0x78 }, unicodeslot=0x33D3, }, [0x33D4]={ @@ -96285,7 +98542,7 @@ characters.data={ description="SQUARE MB SMALL", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0062 }, + specials={ "square", 0x6D, 0x62 }, unicodeslot=0x33D4, }, [0x33D5]={ @@ -96295,7 +98552,7 @@ characters.data={ description="SQUARE MIL", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x0069, 0x006C }, + specials={ "square", 0x6D, 0x69, 0x6C }, unicodeslot=0x33D5, }, [0x33D6]={ @@ -96305,7 +98562,7 @@ characters.data={ description="SQUARE MOL", direction="l", linebreak="id", - specials={ "square", 0x006D, 0x006F, 0x006C }, + specials={ "square", 0x6D, 0x6F, 0x6C }, unicodeslot=0x33D6, }, [0x33D7]={ @@ -96314,7 +98571,7 @@ characters.data={ description="SQUARE PH", direction="l", linebreak="id", - specials={ "square", 0x0050, 0x0048 }, + specials={ "square", 0x50, 0x48 }, unicodeslot=0x33D7, }, [0x33D8]={ @@ -96324,7 +98581,7 @@ characters.data={ description="SQUARE PM", direction="l", linebreak="id", - specials={ "square", 0x0070, 0x002E, 0x006D, 0x002E }, + specials={ "square", 0x70, 0x2E, 0x6D, 0x2E }, unicodeslot=0x33D8, }, [0x33D9]={ @@ -96333,7 +98590,7 @@ characters.data={ description="SQUARE PPM", direction="l", linebreak="id", - specials={ "square", 0x0050, 0x0050, 0x004D }, + specials={ "square", 0x50, 0x50, 0x4D }, unicodeslot=0x33D9, }, [0x33DA]={ @@ -96342,7 +98599,7 @@ characters.data={ description="SQUARE PR", direction="l", linebreak="id", - specials={ "square", 0x0050, 0x0052 }, + specials={ "square", 0x50, 0x52 }, unicodeslot=0x33DA, }, [0x33DB]={ @@ -96352,7 +98609,7 @@ characters.data={ description="SQUARE SR", direction="l", linebreak="id", - specials={ "square", 0x0073, 0x0072 }, + specials={ "square", 0x73, 0x72 }, unicodeslot=0x33DB, }, [0x33DC]={ @@ -96362,7 +98619,7 @@ characters.data={ description="SQUARE SV", direction="l", linebreak="id", - specials={ "square", 0x0053, 0x0076 }, + specials={ "square", 0x53, 0x76 }, unicodeslot=0x33DC, }, [0x33DD]={ @@ -96372,7 +98629,7 @@ characters.data={ description="SQUARE WB", direction="l", linebreak="id", - specials={ "square", 0x0057, 0x0062 }, + specials={ "square", 0x57, 0x62 }, unicodeslot=0x33DD, }, [0x33DE]={ @@ -96381,7 +98638,7 @@ characters.data={ description="SQUARE V OVER M", direction="on", linebreak="id", - specials={ "square", 0x0056, 0x2215, 0x006D }, + specials={ "square", 0x56, 0x2215, 0x6D }, unicodeslot=0x33DE, }, [0x33DF]={ @@ -96390,7 +98647,7 @@ characters.data={ description="SQUARE A OVER M", direction="on", linebreak="id", - specials={ "square", 0x0041, 0x2215, 0x006D }, + specials={ "square", 0x41, 0x2215, 0x6D }, unicodeslot=0x33DF, }, [0x33E0]={ @@ -96399,7 +98656,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x65E5 }, + specials={ "compat", 0x31, 0x65E5 }, unicodeslot=0x33E0, }, [0x33E1]={ @@ -96408,7 +98665,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x65E5 }, + specials={ "compat", 0x32, 0x65E5 }, unicodeslot=0x33E1, }, [0x33E2]={ @@ -96417,7 +98674,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE", direction="l", linebreak="id", - specials={ "compat", 0x0033, 0x65E5 }, + specials={ "compat", 0x33, 0x65E5 }, unicodeslot=0x33E2, }, [0x33E3]={ @@ -96426,7 +98683,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR", direction="l", linebreak="id", - specials={ "compat", 0x0034, 0x65E5 }, + specials={ "compat", 0x34, 0x65E5 }, unicodeslot=0x33E3, }, [0x33E4]={ @@ -96435,7 +98692,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE", direction="l", linebreak="id", - specials={ "compat", 0x0035, 0x65E5 }, + specials={ "compat", 0x35, 0x65E5 }, unicodeslot=0x33E4, }, [0x33E5]={ @@ -96444,7 +98701,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX", direction="l", linebreak="id", - specials={ "compat", 0x0036, 0x65E5 }, + specials={ "compat", 0x36, 0x65E5 }, unicodeslot=0x33E5, }, [0x33E6]={ @@ -96453,7 +98710,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0037, 0x65E5 }, + specials={ "compat", 0x37, 0x65E5 }, unicodeslot=0x33E6, }, [0x33E7]={ @@ -96462,7 +98719,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT", direction="l", linebreak="id", - specials={ "compat", 0x0038, 0x65E5 }, + specials={ "compat", 0x38, 0x65E5 }, unicodeslot=0x33E7, }, [0x33E8]={ @@ -96471,7 +98728,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE", direction="l", linebreak="id", - specials={ "compat", 0x0039, 0x65E5 }, + specials={ "compat", 0x39, 0x65E5 }, unicodeslot=0x33E8, }, [0x33E9]={ @@ -96480,7 +98737,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0030, 0x65E5 }, + specials={ "compat", 0x31, 0x30, 0x65E5 }, unicodeslot=0x33E9, }, [0x33EA]={ @@ -96489,7 +98746,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0031, 0x65E5 }, + specials={ "compat", 0x31, 0x31, 0x65E5 }, unicodeslot=0x33EA, }, [0x33EB]={ @@ -96498,7 +98755,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0032, 0x65E5 }, + specials={ "compat", 0x31, 0x32, 0x65E5 }, unicodeslot=0x33EB, }, [0x33EC]={ @@ -96507,7 +98764,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0033, 0x65E5 }, + specials={ "compat", 0x31, 0x33, 0x65E5 }, unicodeslot=0x33EC, }, [0x33ED]={ @@ -96516,7 +98773,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0034, 0x65E5 }, + specials={ "compat", 0x31, 0x34, 0x65E5 }, unicodeslot=0x33ED, }, [0x33EE]={ @@ -96525,7 +98782,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0035, 0x65E5 }, + specials={ "compat", 0x31, 0x35, 0x65E5 }, unicodeslot=0x33EE, }, [0x33EF]={ @@ -96534,7 +98791,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0036, 0x65E5 }, + specials={ "compat", 0x31, 0x36, 0x65E5 }, unicodeslot=0x33EF, }, [0x33F0]={ @@ -96543,7 +98800,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0037, 0x65E5 }, + specials={ "compat", 0x31, 0x37, 0x65E5 }, unicodeslot=0x33F0, }, [0x33F1]={ @@ -96552,7 +98809,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0038, 0x65E5 }, + specials={ "compat", 0x31, 0x38, 0x65E5 }, unicodeslot=0x33F1, }, [0x33F2]={ @@ -96561,7 +98818,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN", direction="l", linebreak="id", - specials={ "compat", 0x0031, 0x0039, 0x65E5 }, + specials={ "compat", 0x31, 0x39, 0x65E5 }, unicodeslot=0x33F2, }, [0x33F3]={ @@ -96570,7 +98827,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0030, 0x65E5 }, + specials={ "compat", 0x32, 0x30, 0x65E5 }, unicodeslot=0x33F3, }, [0x33F4]={ @@ -96579,7 +98836,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0031, 0x65E5 }, + specials={ "compat", 0x32, 0x31, 0x65E5 }, unicodeslot=0x33F4, }, [0x33F5]={ @@ -96588,7 +98845,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0032, 0x65E5 }, + specials={ "compat", 0x32, 0x32, 0x65E5 }, unicodeslot=0x33F5, }, [0x33F6]={ @@ -96597,7 +98854,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0033, 0x65E5 }, + specials={ "compat", 0x32, 0x33, 0x65E5 }, unicodeslot=0x33F6, }, [0x33F7]={ @@ -96606,7 +98863,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0034, 0x65E5 }, + specials={ "compat", 0x32, 0x34, 0x65E5 }, unicodeslot=0x33F7, }, [0x33F8]={ @@ -96615,7 +98872,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0035, 0x65E5 }, + specials={ "compat", 0x32, 0x35, 0x65E5 }, unicodeslot=0x33F8, }, [0x33F9]={ @@ -96624,7 +98881,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0036, 0x65E5 }, + specials={ "compat", 0x32, 0x36, 0x65E5 }, unicodeslot=0x33F9, }, [0x33FA]={ @@ -96633,7 +98890,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0037, 0x65E5 }, + specials={ "compat", 0x32, 0x37, 0x65E5 }, unicodeslot=0x33FA, }, [0x33FB]={ @@ -96642,7 +98899,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0038, 0x65E5 }, + specials={ "compat", 0x32, 0x38, 0x65E5 }, unicodeslot=0x33FB, }, [0x33FC]={ @@ -96651,7 +98908,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE", direction="l", linebreak="id", - specials={ "compat", 0x0032, 0x0039, 0x65E5 }, + specials={ "compat", 0x32, 0x39, 0x65E5 }, unicodeslot=0x33FC, }, [0x33FD]={ @@ -96660,7 +98917,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY", direction="l", linebreak="id", - specials={ "compat", 0x0033, 0x0030, 0x65E5 }, + specials={ "compat", 0x33, 0x30, 0x65E5 }, unicodeslot=0x33FD, }, [0x33FE]={ @@ -96669,7 +98926,7 @@ characters.data={ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE", direction="l", linebreak="id", - specials={ "compat", 0x0033, 0x0031, 0x65E5 }, + specials={ "compat", 0x33, 0x31, 0x65E5 }, unicodeslot=0x33FE, }, [0x33FF]={ @@ -96678,7 +98935,7 @@ characters.data={ description="SQUARE GAL", direction="on", linebreak="id", - specials={ "square", 0x0067, 0x0061, 0x006C }, + specials={ "square", 0x67, 0x61, 0x6C }, unicodeslot=0x33FF, }, [0x4DC0]={ @@ -109656,6 +111913,7 @@ characters.data={ }, [0xA66F]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC VZMET", direction="nsm", linebreak="cm", @@ -109691,6 +111949,7 @@ characters.data={ }, [0xA674]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER UKRAINIAN IE", direction="nsm", linebreak="cm", @@ -109698,6 +111957,7 @@ characters.data={ }, [0xA675]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER I", direction="nsm", linebreak="cm", @@ -109705,6 +111965,7 @@ characters.data={ }, [0xA676]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER YI", direction="nsm", linebreak="cm", @@ -109712,6 +111973,7 @@ characters.data={ }, [0xA677]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER U", direction="nsm", linebreak="cm", @@ -109719,6 +111981,7 @@ characters.data={ }, [0xA678]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER HARD SIGN", direction="nsm", linebreak="cm", @@ -109726,6 +111989,7 @@ characters.data={ }, [0xA679]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER YERU", direction="nsm", linebreak="cm", @@ -109733,6 +111997,7 @@ characters.data={ }, [0xA67A]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER SOFT SIGN", direction="nsm", linebreak="cm", @@ -109740,6 +112005,7 @@ characters.data={ }, [0xA67B]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER OMEGA", direction="nsm", linebreak="cm", @@ -109747,6 +112013,7 @@ characters.data={ }, [0xA67C]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC KAVYKA", direction="nsm", linebreak="cm", @@ -109754,6 +112021,7 @@ characters.data={ }, [0xA67D]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC PAYEROK", direction="nsm", linebreak="cm", @@ -109941,8 +112209,53 @@ characters.data={ linebreak="al", unicodeslot=0xA697, }, + [0xA698]={ + category="lu", + description="CYRILLIC CAPITAL LETTER DOUBLE O", + direction="l", + linebreak="al", + unicodeslot=0xA698, + }, + [0xA699]={ + category="ll", + description="CYRILLIC SMALL LETTER DOUBLE O", + direction="l", + linebreak="al", + unicodeslot=0xA699, + }, + [0xA69A]={ + category="lu", + description="CYRILLIC CAPITAL LETTER CROSSED O", + direction="l", + linebreak="al", + unicodeslot=0xA69A, + }, + [0xA69B]={ + category="ll", + description="CYRILLIC SMALL LETTER CROSSED O", + direction="l", + linebreak="al", + unicodeslot=0xA69B, + }, + [0xA69C]={ + category="lm", + description="MODIFIER LETTER CYRILLIC HARD SIGN", + direction="l", + linebreak="al", + specials={ "super", 0x44A }, + unicodeslot=0xA69C, + }, + [0xA69D]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SOFT SIGN", + direction="l", + linebreak="al", + specials={ "super", 0x44C }, + unicodeslot=0xA69D, + }, [0xA69F]={ category="mn", + combining=0xE6, description="COMBINING CYRILLIC LETTER IOTIFIED E", direction="nsm", linebreak="cm", @@ -110510,6 +112823,7 @@ characters.data={ }, [0xA6F0]={ category="mn", + combining=0xE6, description="BAMUM COMBINING MARK KOQNDON", direction="nsm", linebreak="cm", @@ -110517,6 +112831,7 @@ characters.data={ }, [0xA6F1]={ category="mn", + combining=0xE6, description="BAMUM COMBINING MARK TUKWENTIS", direction="nsm", linebreak="cm", @@ -111594,6 +113909,90 @@ characters.data={ linebreak="al", unicodeslot=0xA793, }, + [0xA794]={ + category="ll", + description="LATIN SMALL LETTER C WITH PALATAL HOOK", + direction="l", + linebreak="al", + unicodeslot=0xA794, + }, + [0xA795]={ + category="ll", + description="LATIN SMALL LETTER H WITH PALATAL HOOK", + direction="l", + linebreak="al", + unicodeslot=0xA795, + }, + [0xA796]={ + category="lu", + description="LATIN CAPITAL LETTER B WITH FLOURISH", + direction="l", + linebreak="al", + unicodeslot=0xA796, + }, + [0xA797]={ + category="ll", + description="LATIN SMALL LETTER B WITH FLOURISH", + direction="l", + linebreak="al", + unicodeslot=0xA797, + }, + [0xA798]={ + category="lu", + description="LATIN CAPITAL LETTER F WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xA798, + }, + [0xA799]={ + category="ll", + description="LATIN SMALL LETTER F WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xA799, + }, + [0xA79A]={ + category="lu", + description="LATIN CAPITAL LETTER VOLAPUK AE", + direction="l", + linebreak="al", + unicodeslot=0xA79A, + }, + [0xA79B]={ + category="ll", + description="LATIN SMALL LETTER VOLAPUK AE", + direction="l", + linebreak="al", + unicodeslot=0xA79B, + }, + [0xA79C]={ + category="lu", + description="LATIN CAPITAL LETTER VOLAPUK OE", + direction="l", + linebreak="al", + unicodeslot=0xA79C, + }, + [0xA79D]={ + category="ll", + description="LATIN SMALL LETTER VOLAPUK OE", + direction="l", + linebreak="al", + unicodeslot=0xA79D, + }, + [0xA79E]={ + category="lu", + description="LATIN CAPITAL LETTER VOLAPUK UE", + direction="l", + linebreak="al", + unicodeslot=0xA79E, + }, + [0xA79F]={ + category="ll", + description="LATIN SMALL LETTER VOLAPUK UE", + direction="l", + linebreak="al", + unicodeslot=0xA79F, + }, [0xA7A0]={ category="lu", description="LATIN CAPITAL LETTER G WITH OBLIQUE STROKE", @@ -111671,12 +114070,54 @@ characters.data={ linebreak="al", unicodeslot=0xA7AA, }, + [0xA7AB]={ + category="lu", + description="LATIN CAPITAL LETTER REVERSED OPEN E", + direction="l", + linebreak="al", + unicodeslot=0xA7AB, + }, + [0xA7AC]={ + category="lu", + description="LATIN CAPITAL LETTER SCRIPT G", + direction="l", + linebreak="al", + unicodeslot=0xA7AC, + }, + [0xA7AD]={ + category="lu", + description="LATIN CAPITAL LETTER L WITH BELT", + direction="l", + linebreak="al", + unicodeslot=0xA7AD, + }, + [0xA7B0]={ + category="lu", + description="LATIN CAPITAL LETTER TURNED K", + direction="l", + linebreak="al", + unicodeslot=0xA7B0, + }, + [0xA7B1]={ + category="lu", + description="LATIN CAPITAL LETTER TURNED T", + direction="l", + linebreak="al", + unicodeslot=0xA7B1, + }, + [0xA7F7]={ + category="lo", + description="LATIN EPIGRAPHIC LETTER SIDEWAYS I", + direction="l", + linebreak="al", + unicodeslot=0xA7F7, + }, [0xA7F8]={ category="lm", description="MODIFIER LETTER CAPITAL H WITH STROKE", direction="l", linebreak="al", - specials={ "super", 0x0126 }, + specials={ "super", 0x126 }, unicodeslot=0xA7F8, }, [0xA7F9]={ @@ -111684,7 +114125,7 @@ characters.data={ description="MODIFIER LETTER SMALL LIGATURE OE", direction="l", linebreak="al", - specials={ "super", 0x0153 }, + specials={ "super", 0x153 }, unicodeslot=0xA7F9, }, [0xA7FA]={ @@ -111773,6 +114214,7 @@ characters.data={ }, [0xA806]={ category="mn", + combining=0x9, description="SYLOTI NAGRI SIGN HASANTA", direction="nsm", linebreak="cm", @@ -112108,6 +114550,7 @@ characters.data={ unicodeslot=0xA839, }, [0xA840]={ + arabic="d", category="lo", description="PHAGS-PA LETTER KA", direction="l", @@ -112115,6 +114558,7 @@ characters.data={ unicodeslot=0xA840, }, [0xA841]={ + arabic="d", category="lo", description="PHAGS-PA LETTER KHA", direction="l", @@ -112122,6 +114566,7 @@ characters.data={ unicodeslot=0xA841, }, [0xA842]={ + arabic="d", category="lo", description="PHAGS-PA LETTER GA", direction="l", @@ -112129,6 +114574,7 @@ characters.data={ unicodeslot=0xA842, }, [0xA843]={ + arabic="d", category="lo", description="PHAGS-PA LETTER NGA", direction="l", @@ -112136,6 +114582,7 @@ characters.data={ unicodeslot=0xA843, }, [0xA844]={ + arabic="d", category="lo", description="PHAGS-PA LETTER CA", direction="l", @@ -112143,6 +114590,7 @@ characters.data={ unicodeslot=0xA844, }, [0xA845]={ + arabic="d", category="lo", description="PHAGS-PA LETTER CHA", direction="l", @@ -112150,6 +114598,7 @@ characters.data={ unicodeslot=0xA845, }, [0xA846]={ + arabic="d", category="lo", description="PHAGS-PA LETTER JA", direction="l", @@ -112157,6 +114606,7 @@ characters.data={ unicodeslot=0xA846, }, [0xA847]={ + arabic="d", category="lo", description="PHAGS-PA LETTER NYA", direction="l", @@ -112164,6 +114614,7 @@ characters.data={ unicodeslot=0xA847, }, [0xA848]={ + arabic="d", category="lo", description="PHAGS-PA LETTER TA", direction="l", @@ -112171,6 +114622,7 @@ characters.data={ unicodeslot=0xA848, }, [0xA849]={ + arabic="d", category="lo", description="PHAGS-PA LETTER THA", direction="l", @@ -112178,6 +114630,7 @@ characters.data={ unicodeslot=0xA849, }, [0xA84A]={ + arabic="d", category="lo", description="PHAGS-PA LETTER DA", direction="l", @@ -112185,6 +114638,7 @@ characters.data={ unicodeslot=0xA84A, }, [0xA84B]={ + arabic="d", category="lo", description="PHAGS-PA LETTER NA", direction="l", @@ -112192,6 +114646,7 @@ characters.data={ unicodeslot=0xA84B, }, [0xA84C]={ + arabic="d", category="lo", description="PHAGS-PA LETTER PA", direction="l", @@ -112199,6 +114654,7 @@ characters.data={ unicodeslot=0xA84C, }, [0xA84D]={ + arabic="d", category="lo", description="PHAGS-PA LETTER PHA", direction="l", @@ -112206,6 +114662,7 @@ characters.data={ unicodeslot=0xA84D, }, [0xA84E]={ + arabic="d", category="lo", description="PHAGS-PA LETTER BA", direction="l", @@ -112213,6 +114670,7 @@ characters.data={ unicodeslot=0xA84E, }, [0xA84F]={ + arabic="d", category="lo", description="PHAGS-PA LETTER MA", direction="l", @@ -112220,6 +114678,7 @@ characters.data={ unicodeslot=0xA84F, }, [0xA850]={ + arabic="d", category="lo", description="PHAGS-PA LETTER TSA", direction="l", @@ -112227,6 +114686,7 @@ characters.data={ unicodeslot=0xA850, }, [0xA851]={ + arabic="d", category="lo", description="PHAGS-PA LETTER TSHA", direction="l", @@ -112234,6 +114694,7 @@ characters.data={ unicodeslot=0xA851, }, [0xA852]={ + arabic="d", category="lo", description="PHAGS-PA LETTER DZA", direction="l", @@ -112241,6 +114702,7 @@ characters.data={ unicodeslot=0xA852, }, [0xA853]={ + arabic="d", category="lo", description="PHAGS-PA LETTER WA", direction="l", @@ -112248,6 +114710,7 @@ characters.data={ unicodeslot=0xA853, }, [0xA854]={ + arabic="d", category="lo", description="PHAGS-PA LETTER ZHA", direction="l", @@ -112255,6 +114718,7 @@ characters.data={ unicodeslot=0xA854, }, [0xA855]={ + arabic="d", category="lo", description="PHAGS-PA LETTER ZA", direction="l", @@ -112262,6 +114726,7 @@ characters.data={ unicodeslot=0xA855, }, [0xA856]={ + arabic="d", category="lo", description="PHAGS-PA LETTER SMALL A", direction="l", @@ -112272,6 +114737,7 @@ characters.data={ }, }, [0xA857]={ + arabic="d", category="lo", description="PHAGS-PA LETTER YA", direction="l", @@ -112279,6 +114745,7 @@ characters.data={ unicodeslot=0xA857, }, [0xA858]={ + arabic="d", category="lo", description="PHAGS-PA LETTER RA", direction="l", @@ -112286,6 +114753,7 @@ characters.data={ unicodeslot=0xA858, }, [0xA859]={ + arabic="d", category="lo", description="PHAGS-PA LETTER LA", direction="l", @@ -112293,6 +114761,7 @@ characters.data={ unicodeslot=0xA859, }, [0xA85A]={ + arabic="d", category="lo", description="PHAGS-PA LETTER SHA", direction="l", @@ -112300,6 +114769,7 @@ characters.data={ unicodeslot=0xA85A, }, [0xA85B]={ + arabic="d", category="lo", description="PHAGS-PA LETTER SA", direction="l", @@ -112307,6 +114777,7 @@ characters.data={ unicodeslot=0xA85B, }, [0xA85C]={ + arabic="d", category="lo", description="PHAGS-PA LETTER HA", direction="l", @@ -112317,6 +114788,7 @@ characters.data={ }, }, [0xA85D]={ + arabic="d", category="lo", description="PHAGS-PA LETTER A", direction="l", @@ -112324,6 +114796,7 @@ characters.data={ unicodeslot=0xA85D, }, [0xA85E]={ + arabic="d", category="lo", description="PHAGS-PA LETTER I", direction="l", @@ -112334,6 +114807,7 @@ characters.data={ }, }, [0xA85F]={ + arabic="d", category="lo", description="PHAGS-PA LETTER U", direction="l", @@ -112344,6 +114818,7 @@ characters.data={ }, }, [0xA860]={ + arabic="d", category="lo", description="PHAGS-PA LETTER E", direction="l", @@ -112354,6 +114829,7 @@ characters.data={ }, }, [0xA861]={ + arabic="d", category="lo", description="PHAGS-PA LETTER O", direction="l", @@ -112361,6 +114837,7 @@ characters.data={ unicodeslot=0xA861, }, [0xA862]={ + arabic="d", category="lo", description="PHAGS-PA LETTER QA", direction="l", @@ -112368,6 +114845,7 @@ characters.data={ unicodeslot=0xA862, }, [0xA863]={ + arabic="d", category="lo", description="PHAGS-PA LETTER XA", direction="l", @@ -112375,6 +114853,7 @@ characters.data={ unicodeslot=0xA863, }, [0xA864]={ + arabic="d", category="lo", description="PHAGS-PA LETTER FA", direction="l", @@ -112382,6 +114861,7 @@ characters.data={ unicodeslot=0xA864, }, [0xA865]={ + arabic="d", category="lo", description="PHAGS-PA LETTER GGA", direction="l", @@ -112389,6 +114869,7 @@ characters.data={ unicodeslot=0xA865, }, [0xA866]={ + arabic="d", category="lo", description="PHAGS-PA LETTER EE", direction="l", @@ -112396,6 +114877,7 @@ characters.data={ unicodeslot=0xA866, }, [0xA867]={ + arabic="d", category="lo", description="PHAGS-PA SUBJOINED LETTER WA", direction="l", @@ -112403,6 +114885,7 @@ characters.data={ unicodeslot=0xA867, }, [0xA868]={ + arabic="d", category="lo", description="PHAGS-PA SUBJOINED LETTER YA", direction="l", @@ -112413,6 +114896,7 @@ characters.data={ }, }, [0xA869]={ + arabic="d", category="lo", description="PHAGS-PA LETTER TTA", direction="l", @@ -112420,6 +114904,7 @@ characters.data={ unicodeslot=0xA869, }, [0xA86A]={ + arabic="d", category="lo", description="PHAGS-PA LETTER TTHA", direction="l", @@ -112427,6 +114912,7 @@ characters.data={ unicodeslot=0xA86A, }, [0xA86B]={ + arabic="d", category="lo", description="PHAGS-PA LETTER DDA", direction="l", @@ -112434,6 +114920,7 @@ characters.data={ unicodeslot=0xA86B, }, [0xA86C]={ + arabic="d", category="lo", description="PHAGS-PA LETTER NNA", direction="l", @@ -112441,6 +114928,7 @@ characters.data={ unicodeslot=0xA86C, }, [0xA86D]={ + arabic="d", category="lo", description="PHAGS-PA LETTER ALTERNATE YA", direction="l", @@ -112448,6 +114936,7 @@ characters.data={ unicodeslot=0xA86D, }, [0xA86E]={ + arabic="d", category="lo", description="PHAGS-PA LETTER VOICELESS SHA", direction="l", @@ -112455,6 +114944,7 @@ characters.data={ unicodeslot=0xA86E, }, [0xA86F]={ + arabic="d", category="lo", description="PHAGS-PA LETTER VOICED HA", direction="l", @@ -112462,6 +114952,7 @@ characters.data={ unicodeslot=0xA86F, }, [0xA870]={ + arabic="d", category="lo", description="PHAGS-PA LETTER ASPIRATED FA", direction="l", @@ -112469,6 +114960,7 @@ characters.data={ unicodeslot=0xA870, }, [0xA871]={ + arabic="d", category="lo", description="PHAGS-PA SUBJOINED LETTER RA", direction="l", @@ -112476,6 +114968,7 @@ characters.data={ unicodeslot=0xA871, }, [0xA872]={ + arabic="l", category="lo", description="PHAGS-PA SUPERFIXED LETTER RA", direction="l", @@ -112483,6 +114976,7 @@ characters.data={ unicodeslot=0xA872, }, [0xA873]={ + arabic="u", category="lo", description="PHAGS-PA LETTER CANDRABINDU", direction="l", @@ -112995,6 +115489,7 @@ characters.data={ }, [0xA8C4]={ category="mn", + combining=0x9, description="SAURASHTRA SIGN VIRAMA", direction="nsm", linebreak="cm", @@ -113086,6 +115581,7 @@ characters.data={ }, [0xA8E0]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT ZERO", direction="nsm", linebreak="cm", @@ -113093,6 +115589,7 @@ characters.data={ }, [0xA8E1]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT ONE", direction="nsm", linebreak="cm", @@ -113100,6 +115597,7 @@ characters.data={ }, [0xA8E2]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT TWO", direction="nsm", linebreak="cm", @@ -113107,6 +115605,7 @@ characters.data={ }, [0xA8E3]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT THREE", direction="nsm", linebreak="cm", @@ -113114,6 +115613,7 @@ characters.data={ }, [0xA8E4]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT FOUR", direction="nsm", linebreak="cm", @@ -113121,6 +115621,7 @@ characters.data={ }, [0xA8E5]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT FIVE", direction="nsm", linebreak="cm", @@ -113128,6 +115629,7 @@ characters.data={ }, [0xA8E6]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT SIX", direction="nsm", linebreak="cm", @@ -113135,6 +115637,7 @@ characters.data={ }, [0xA8E7]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT SEVEN", direction="nsm", linebreak="cm", @@ -113142,6 +115645,7 @@ characters.data={ }, [0xA8E8]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT EIGHT", direction="nsm", linebreak="cm", @@ -113149,6 +115653,7 @@ characters.data={ }, [0xA8E9]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI DIGIT NINE", direction="nsm", linebreak="cm", @@ -113156,6 +115661,7 @@ characters.data={ }, [0xA8EA]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER A", direction="nsm", linebreak="cm", @@ -113163,6 +115669,7 @@ characters.data={ }, [0xA8EB]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER U", direction="nsm", linebreak="cm", @@ -113170,6 +115677,7 @@ characters.data={ }, [0xA8EC]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER KA", direction="nsm", linebreak="cm", @@ -113177,6 +115685,7 @@ characters.data={ }, [0xA8ED]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER NA", direction="nsm", linebreak="cm", @@ -113184,6 +115693,7 @@ characters.data={ }, [0xA8EE]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER PA", direction="nsm", linebreak="cm", @@ -113191,6 +115701,7 @@ characters.data={ }, [0xA8EF]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER RA", direction="nsm", linebreak="cm", @@ -113198,6 +115709,7 @@ characters.data={ }, [0xA8F0]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI LETTER VI", direction="nsm", linebreak="cm", @@ -113205,6 +115717,7 @@ characters.data={ }, [0xA8F1]={ category="mn", + combining=0xE6, description="COMBINING DEVANAGARI SIGN AVAGRAHA", direction="nsm", linebreak="cm", @@ -113583,6 +116096,7 @@ characters.data={ }, [0xA92B]={ category="mn", + combining=0xDC, description="KAYAH LI TONE PLOPHU", direction="nsm", linebreak="cm", @@ -113590,6 +116104,7 @@ characters.data={ }, [0xA92C]={ category="mn", + combining=0xDC, description="KAYAH LI TONE CALYA", direction="nsm", linebreak="cm", @@ -113597,6 +116112,7 @@ characters.data={ }, [0xA92D]={ category="mn", + combining=0xDC, description="KAYAH LI TONE CALYA PLOPHU", direction="nsm", linebreak="cm", @@ -113863,6 +116379,7 @@ characters.data={ }, [0xA953]={ category="mc", + combining=0x9, description="REJANG VIRAMA", direction="l", linebreak="cm", @@ -114466,6 +116983,7 @@ characters.data={ }, [0xA9B3]={ category="mn", + combining=0x7, description="JAVANESE SIGN CECAK TELU", direction="nsm", linebreak="cm", @@ -114557,6 +117075,7 @@ characters.data={ }, [0xA9C0]={ category="mc", + combining=0x9, description="JAVANESE PANGKON", direction="l", linebreak="cm", @@ -114744,6 +117263,223 @@ characters.data={ linebreak="al", unicodeslot=0xA9DF, }, + [0xA9E0]={ + category="lo", + description="MYANMAR LETTER SHAN GHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E0, + }, + [0xA9E1]={ + category="lo", + description="MYANMAR LETTER SHAN CHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E1, + }, + [0xA9E2]={ + category="lo", + description="MYANMAR LETTER SHAN JHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E2, + }, + [0xA9E3]={ + category="lo", + description="MYANMAR LETTER SHAN NNA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E3, + }, + [0xA9E4]={ + category="lo", + description="MYANMAR LETTER SHAN BHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E4, + }, + [0xA9E5]={ + category="mn", + description="MYANMAR SIGN SHAN SAW", + direction="nsm", + linebreak="sa", + unicodeslot=0xA9E5, + }, + [0xA9E6]={ + category="lm", + description="MYANMAR MODIFIER LETTER SHAN REDUPLICATION", + direction="l", + linebreak="sa", + unicodeslot=0xA9E6, + }, + [0xA9E7]={ + category="lo", + description="MYANMAR LETTER TAI LAING NYA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E7, + }, + [0xA9E8]={ + category="lo", + description="MYANMAR LETTER TAI LAING FA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E8, + }, + [0xA9E9]={ + category="lo", + description="MYANMAR LETTER TAI LAING GA", + direction="l", + linebreak="sa", + unicodeslot=0xA9E9, + }, + [0xA9EA]={ + category="lo", + description="MYANMAR LETTER TAI LAING GHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9EA, + }, + [0xA9EB]={ + category="lo", + description="MYANMAR LETTER TAI LAING JA", + direction="l", + linebreak="sa", + unicodeslot=0xA9EB, + }, + [0xA9EC]={ + category="lo", + description="MYANMAR LETTER TAI LAING JHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9EC, + }, + [0xA9ED]={ + category="lo", + description="MYANMAR LETTER TAI LAING DDA", + direction="l", + linebreak="sa", + unicodeslot=0xA9ED, + }, + [0xA9EE]={ + category="lo", + description="MYANMAR LETTER TAI LAING DDHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9EE, + }, + [0xA9EF]={ + category="lo", + description="MYANMAR LETTER TAI LAING NNA", + direction="l", + linebreak="sa", + unicodeslot=0xA9EF, + }, + [0xA9F0]={ + category="nd", + description="MYANMAR TAI LAING DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0xA9F0, + }, + [0xA9F1]={ + category="nd", + description="MYANMAR TAI LAING DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0xA9F1, + }, + [0xA9F2]={ + category="nd", + description="MYANMAR TAI LAING DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0xA9F2, + }, + [0xA9F3]={ + category="nd", + description="MYANMAR TAI LAING DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0xA9F3, + }, + [0xA9F4]={ + category="nd", + description="MYANMAR TAI LAING DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0xA9F4, + }, + [0xA9F5]={ + category="nd", + description="MYANMAR TAI LAING DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0xA9F5, + }, + [0xA9F6]={ + category="nd", + description="MYANMAR TAI LAING DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0xA9F6, + }, + [0xA9F7]={ + category="nd", + description="MYANMAR TAI LAING DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0xA9F7, + }, + [0xA9F8]={ + category="nd", + description="MYANMAR TAI LAING DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0xA9F8, + }, + [0xA9F9]={ + category="nd", + description="MYANMAR TAI LAING DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0xA9F9, + }, + [0xA9FA]={ + category="lo", + description="MYANMAR LETTER TAI LAING LLA", + direction="l", + linebreak="sa", + unicodeslot=0xA9FA, + }, + [0xA9FB]={ + category="lo", + description="MYANMAR LETTER TAI LAING DA", + direction="l", + linebreak="sa", + unicodeslot=0xA9FB, + }, + [0xA9FC]={ + category="lo", + description="MYANMAR LETTER TAI LAING DHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9FC, + }, + [0xA9FD]={ + category="lo", + description="MYANMAR LETTER TAI LAING BA", + direction="l", + linebreak="sa", + unicodeslot=0xA9FD, + }, + [0xA9FE]={ + category="lo", + description="MYANMAR LETTER TAI LAING BHA", + direction="l", + linebreak="sa", + unicodeslot=0xA9FE, + }, [0xAA00]={ category="lo", description="CHAM LETTER A", @@ -115521,6 +118257,34 @@ characters.data={ linebreak="sa", unicodeslot=0xAA7B, }, + [0xAA7C]={ + category="mn", + description="MYANMAR SIGN TAI LAING TONE-2", + direction="nsm", + linebreak="sa", + unicodeslot=0xAA7C, + }, + [0xAA7D]={ + category="mc", + description="MYANMAR SIGN TAI LAING TONE-5", + direction="l", + linebreak="sa", + unicodeslot=0xAA7D, + }, + [0xAA7E]={ + category="lo", + description="MYANMAR LETTER SHWE PALAUNG CHA", + direction="l", + linebreak="sa", + unicodeslot=0xAA7E, + }, + [0xAA7F]={ + category="lo", + description="MYANMAR LETTER SHWE PALAUNG SHA", + direction="l", + linebreak="sa", + unicodeslot=0xAA7F, + }, [0xAA80]={ category="lo", description="TAI VIET LETTER LOW KO", @@ -115859,6 +118623,7 @@ characters.data={ }, [0xAAB0]={ category="mn", + combining=0xE6, description="TAI VIET MAI KANG", direction="nsm", linebreak="sa", @@ -115873,6 +118638,7 @@ characters.data={ }, [0xAAB2]={ category="mn", + combining=0xE6, description="TAI VIET VOWEL I", direction="nsm", linebreak="sa", @@ -115880,6 +118646,7 @@ characters.data={ }, [0xAAB3]={ category="mn", + combining=0xE6, description="TAI VIET VOWEL UE", direction="nsm", linebreak="sa", @@ -115887,6 +118654,7 @@ characters.data={ }, [0xAAB4]={ category="mn", + combining=0xDC, description="TAI VIET VOWEL U", direction="nsm", linebreak="sa", @@ -115908,6 +118676,7 @@ characters.data={ }, [0xAAB7]={ category="mn", + combining=0xE6, description="TAI VIET MAI KHIT", direction="nsm", linebreak="sa", @@ -115915,6 +118684,7 @@ characters.data={ }, [0xAAB8]={ category="mn", + combining=0xE6, description="TAI VIET VOWEL IA", direction="nsm", linebreak="sa", @@ -115957,6 +118727,7 @@ characters.data={ }, [0xAABE]={ category="mn", + combining=0xE6, description="TAI VIET VOWEL AM", direction="nsm", linebreak="sa", @@ -115964,6 +118735,7 @@ characters.data={ }, [0xAABF]={ category="mn", + combining=0xE6, description="TAI VIET TONE MAI EK", direction="nsm", linebreak="sa", @@ -115978,6 +118750,7 @@ characters.data={ }, [0xAAC1]={ category="mn", + combining=0xE6, description="TAI VIET TONE MAI THO", direction="nsm", linebreak="sa", @@ -116181,6 +118954,7 @@ characters.data={ }, [0xAAF6]={ category="mn", + combining=0x9, description="MEETEI MAYEK VIRAMA", direction="nsm", linebreak="cm", @@ -116410,6 +119184,360 @@ characters.data={ linebreak="al", unicodeslot=0xAB2E, }, + [0xAB30]={ + category="ll", + description="LATIN SMALL LETTER BARRED ALPHA", + direction="l", + linebreak="al", + unicodeslot=0xAB30, + }, + [0xAB31]={ + category="ll", + description="LATIN SMALL LETTER A REVERSED-SCHWA", + direction="l", + linebreak="al", + unicodeslot=0xAB31, + }, + [0xAB32]={ + category="ll", + description="LATIN SMALL LETTER BLACKLETTER E", + direction="l", + linebreak="al", + unicodeslot=0xAB32, + }, + [0xAB33]={ + category="ll", + description="LATIN SMALL LETTER BARRED E", + direction="l", + linebreak="al", + unicodeslot=0xAB33, + }, + [0xAB34]={ + category="ll", + description="LATIN SMALL LETTER E WITH FLOURISH", + direction="l", + linebreak="al", + unicodeslot=0xAB34, + }, + [0xAB35]={ + category="ll", + description="LATIN SMALL LETTER LENIS F", + direction="l", + linebreak="al", + unicodeslot=0xAB35, + }, + [0xAB36]={ + category="ll", + description="LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB36, + }, + [0xAB37]={ + category="ll", + description="LATIN SMALL LETTER L WITH INVERTED LAZY S", + direction="l", + linebreak="al", + unicodeslot=0xAB37, + }, + [0xAB38]={ + category="ll", + description="LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE", + direction="l", + linebreak="al", + unicodeslot=0xAB38, + }, + [0xAB39]={ + category="ll", + description="LATIN SMALL LETTER L WITH MIDDLE RING", + direction="l", + linebreak="al", + unicodeslot=0xAB39, + }, + [0xAB3A]={ + category="ll", + description="LATIN SMALL LETTER M WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB3A, + }, + [0xAB3B]={ + category="ll", + description="LATIN SMALL LETTER N WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB3B, + }, + [0xAB3C]={ + category="ll", + description="LATIN SMALL LETTER ENG WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB3C, + }, + [0xAB3D]={ + category="ll", + description="LATIN SMALL LETTER BLACKLETTER O", + direction="l", + linebreak="al", + unicodeslot=0xAB3D, + }, + [0xAB3E]={ + category="ll", + description="LATIN SMALL LETTER BLACKLETTER O WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xAB3E, + }, + [0xAB3F]={ + category="ll", + description="LATIN SMALL LETTER OPEN O WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xAB3F, + }, + [0xAB40]={ + category="ll", + description="LATIN SMALL LETTER INVERTED OE", + direction="l", + linebreak="al", + unicodeslot=0xAB40, + }, + [0xAB41]={ + category="ll", + description="LATIN SMALL LETTER TURNED OE WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xAB41, + }, + [0xAB42]={ + category="ll", + description="LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE", + direction="l", + linebreak="al", + unicodeslot=0xAB42, + }, + [0xAB43]={ + category="ll", + description="LATIN SMALL LETTER TURNED O OPEN-O", + direction="l", + linebreak="al", + unicodeslot=0xAB43, + }, + [0xAB44]={ + category="ll", + description="LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xAB44, + }, + [0xAB45]={ + category="ll", + description="LATIN SMALL LETTER STIRRUP R", + direction="l", + linebreak="al", + unicodeslot=0xAB45, + }, + [0xAB46]={ + category="ll", + description="LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG", + direction="l", + linebreak="al", + unicodeslot=0xAB46, + }, + [0xAB47]={ + category="ll", + description="LATIN SMALL LETTER R WITHOUT HANDLE", + direction="l", + linebreak="al", + unicodeslot=0xAB47, + }, + [0xAB48]={ + category="ll", + description="LATIN SMALL LETTER DOUBLE R", + direction="l", + linebreak="al", + unicodeslot=0xAB48, + }, + [0xAB49]={ + category="ll", + description="LATIN SMALL LETTER R WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB49, + }, + [0xAB4A]={ + category="ll", + description="LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL", + direction="l", + linebreak="al", + unicodeslot=0xAB4A, + }, + [0xAB4B]={ + category="ll", + description="LATIN SMALL LETTER SCRIPT R", + direction="l", + linebreak="al", + unicodeslot=0xAB4B, + }, + [0xAB4C]={ + category="ll", + description="LATIN SMALL LETTER SCRIPT R WITH RING", + direction="l", + linebreak="al", + unicodeslot=0xAB4C, + }, + [0xAB4D]={ + category="ll", + description="LATIN SMALL LETTER BASELINE ESH", + direction="l", + linebreak="al", + unicodeslot=0xAB4D, + }, + [0xAB4E]={ + category="ll", + description="LATIN SMALL LETTER U WITH SHORT RIGHT LEG", + direction="l", + linebreak="al", + unicodeslot=0xAB4E, + }, + [0xAB4F]={ + category="ll", + description="LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG", + direction="l", + linebreak="al", + unicodeslot=0xAB4F, + }, + [0xAB50]={ + category="ll", + description="LATIN SMALL LETTER UI", + direction="l", + linebreak="al", + unicodeslot=0xAB50, + }, + [0xAB51]={ + category="ll", + description="LATIN SMALL LETTER TURNED UI", + direction="l", + linebreak="al", + unicodeslot=0xAB51, + }, + [0xAB52]={ + category="ll", + description="LATIN SMALL LETTER U WITH LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0xAB52, + }, + [0xAB53]={ + category="ll", + description="LATIN SMALL LETTER CHI", + direction="l", + linebreak="al", + unicodeslot=0xAB53, + }, + [0xAB54]={ + category="ll", + description="LATIN SMALL LETTER CHI WITH LOW RIGHT RING", + direction="l", + linebreak="al", + unicodeslot=0xAB54, + }, + [0xAB55]={ + category="ll", + description="LATIN SMALL LETTER CHI WITH LOW LEFT SERIF", + direction="l", + linebreak="al", + unicodeslot=0xAB55, + }, + [0xAB56]={ + category="ll", + description="LATIN SMALL LETTER X WITH LOW RIGHT RING", + direction="l", + linebreak="al", + unicodeslot=0xAB56, + }, + [0xAB57]={ + category="ll", + description="LATIN SMALL LETTER X WITH LONG LEFT LEG", + direction="l", + linebreak="al", + unicodeslot=0xAB57, + }, + [0xAB58]={ + category="ll", + description="LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING", + direction="l", + linebreak="al", + unicodeslot=0xAB58, + }, + [0xAB59]={ + category="ll", + description="LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF", + direction="l", + linebreak="al", + unicodeslot=0xAB59, + }, + [0xAB5A]={ + category="ll", + description="LATIN SMALL LETTER Y WITH SHORT RIGHT LEG", + direction="l", + linebreak="al", + unicodeslot=0xAB5A, + }, + [0xAB5B]={ + category="sk", + description="MODIFIER BREVE WITH INVERTED BREVE", + direction="l", + linebreak="al", + unicodeslot=0xAB5B, + }, + [0xAB5C]={ + category="lm", + description="MODIFIER LETTER SMALL HENG", + direction="l", + linebreak="al", + specials={ "super", 0xA727 }, + unicodeslot=0xAB5C, + }, + [0xAB5D]={ + category="lm", + description="MODIFIER LETTER SMALL L WITH INVERTED LAZY S", + direction="l", + linebreak="al", + specials={ "super", 0xAB37 }, + unicodeslot=0xAB5D, + }, + [0xAB5E]={ + category="lm", + description="MODIFIER LETTER SMALL L WITH MIDDLE TILDE", + direction="l", + linebreak="al", + specials={ "super", 0x26B }, + unicodeslot=0xAB5E, + }, + [0xAB5F]={ + category="lm", + description="MODIFIER LETTER SMALL U WITH LEFT HOOK", + direction="l", + linebreak="al", + specials={ "super", 0xAB52 }, + unicodeslot=0xAB5F, + }, + [0xAB64]={ + category="ll", + description="LATIN SMALL LETTER INVERTED ALPHA", + direction="l", + linebreak="al", + unicodeslot=0xAB64, + }, + [0xAB65]={ + category="ll", + description="GREEK LETTER SMALL CAPITAL OMEGA", + direction="l", + linebreak="al", + unicodeslot=0xAB65, + }, [0xABC0]={ category="lo", description="MEETEI MAYEK LETTER KOK", @@ -116727,6 +119855,7 @@ characters.data={ }, [0xABED]={ category="mn", + combining=0x9, description="MEETEI MAYEK APUN IYEK", direction="nsm", linebreak="cm", @@ -121606,7 +124735,7 @@ characters.data={ description="LATIN SMALL LIGATURE FF", direction="l", linebreak="al", - specials={ "compat", 0x0066, 0x0066 }, + specials={ "compat", 0x66, 0x66 }, unicodeslot=0xFB00, }, [0xFB01]={ @@ -121616,8 +124745,8 @@ characters.data={ description="LATIN SMALL LIGATURE FI", direction="l", linebreak="al", - shcode={ 0x0066, 0x0069 }, - specials={ "compat", 0x0066, 0x0069 }, + shcode={ 0x66, 0x69 }, + specials={ "compat", 0x66, 0x69 }, unicodeslot=0xFB01, }, [0xFB02]={ @@ -121627,8 +124756,8 @@ characters.data={ description="LATIN SMALL LIGATURE FL", direction="l", linebreak="al", - shcode={ 0x0066, 0x006C }, - specials={ "compat", 0x0066, 0x006C }, + shcode={ 0x66, 0x6C }, + specials={ "compat", 0x66, 0x6C }, unicodeslot=0xFB02, }, [0xFB03]={ @@ -121638,8 +124767,8 @@ characters.data={ description="LATIN SMALL LIGATURE FFI", direction="l", linebreak="al", - shcode={ 0x0066, 0x0069 }, - specials={ "compat", 0x0066, 0x0066, 0x0069 }, + shcode={ 0x66, 0x69 }, + specials={ "compat", 0x66, 0x66, 0x69 }, unicodeslot=0xFB03, }, [0xFB04]={ @@ -121649,8 +124778,8 @@ characters.data={ description="LATIN SMALL LIGATURE FFL", direction="l", linebreak="al", - shcode={ 0x0066, 0x006C }, - specials={ "compat", 0x0066, 0x0066, 0x006C }, + shcode={ 0x66, 0x6C }, + specials={ "compat", 0x66, 0x66, 0x6C }, unicodeslot=0xFB04, }, [0xFB05]={ @@ -121658,7 +124787,7 @@ characters.data={ description="LATIN SMALL LIGATURE LONG S T", direction="l", linebreak="al", - specials={ "compat", 0x017F, 0x0074 }, + specials={ "compat", 0x17F, 0x74 }, unicodeslot=0xFB05, }, [0xFB06]={ @@ -121667,8 +124796,8 @@ characters.data={ description="LATIN SMALL LIGATURE ST", direction="l", linebreak="al", - shcode={ 0x0073, 0x0074 }, - specials={ "compat", 0x0073, 0x0074 }, + shcode={ 0x73, 0x74 }, + specials={ "compat", 0x73, 0x74 }, unicodeslot=0xFB06, }, [0xFB13]={ @@ -121676,7 +124805,7 @@ characters.data={ description="ARMENIAN SMALL LIGATURE MEN NOW", direction="l", linebreak="al", - specials={ "compat", 0x0574, 0x0576 }, + specials={ "compat", 0x574, 0x576 }, unicodeslot=0xFB13, }, [0xFB14]={ @@ -121684,7 +124813,7 @@ characters.data={ description="ARMENIAN SMALL LIGATURE MEN ECH", direction="l", linebreak="al", - specials={ "compat", 0x0574, 0x0565 }, + specials={ "compat", 0x574, 0x565 }, unicodeslot=0xFB14, }, [0xFB15]={ @@ -121692,7 +124821,7 @@ characters.data={ description="ARMENIAN SMALL LIGATURE MEN INI", direction="l", linebreak="al", - specials={ "compat", 0x0574, 0x056B }, + specials={ "compat", 0x574, 0x56B }, unicodeslot=0xFB15, }, [0xFB16]={ @@ -121700,7 +124829,7 @@ characters.data={ description="ARMENIAN SMALL LIGATURE VEW NOW", direction="l", linebreak="al", - specials={ "compat", 0x057E, 0x0576 }, + specials={ "compat", 0x57E, 0x576 }, unicodeslot=0xFB16, }, [0xFB17]={ @@ -121708,7 +124837,7 @@ characters.data={ description="ARMENIAN SMALL LIGATURE MEN XEH", direction="l", linebreak="al", - specials={ "compat", 0x0574, 0x056D }, + specials={ "compat", 0x574, 0x56D }, unicodeslot=0xFB17, }, [0xFB1D]={ @@ -121716,12 +124845,13 @@ characters.data={ description="HEBREW LETTER YOD WITH HIRIQ", direction="r", linebreak="hl", - shcode=0x05D9, - specials={ "char", 0x05D9, 0x05B4 }, + shcode=0x5D9, + specials={ "char", 0x5D9, 0x5B4 }, unicodeslot=0xFB1D, }, [0xFB1E]={ category="mn", + combining=0x1A, description="HEBREW POINT JUDEO-SPANISH VARIKA", direction="nsm", linebreak="cm", @@ -121733,7 +124863,7 @@ characters.data={ description="HEBREW LIGATURE YIDDISH YOD YOD PATAH", direction="r", linebreak="hl", - specials={ "char", 0x05F2, 0x05B7 }, + specials={ "char", 0x5F2, 0x5B7 }, unicodeslot=0xFB1F, }, [0xFB20]={ @@ -121742,7 +124872,7 @@ characters.data={ description="HEBREW LETTER ALTERNATIVE AYIN", direction="r", linebreak="hl", - specials={ "font", 0x05E2 }, + specials={ "font", 0x5E2 }, unicodeslot=0xFB20, }, [0xFB21]={ @@ -121750,7 +124880,7 @@ characters.data={ description="HEBREW LETTER WIDE ALEF", direction="r", linebreak="hl", - specials={ "font", 0x05D0 }, + specials={ "font", 0x5D0 }, unicodeslot=0xFB21, }, [0xFB22]={ @@ -121758,7 +124888,7 @@ characters.data={ description="HEBREW LETTER WIDE DALET", direction="r", linebreak="hl", - specials={ "font", 0x05D3 }, + specials={ "font", 0x5D3 }, unicodeslot=0xFB22, }, [0xFB23]={ @@ -121766,7 +124896,7 @@ characters.data={ description="HEBREW LETTER WIDE HE", direction="r", linebreak="hl", - specials={ "font", 0x05D4 }, + specials={ "font", 0x5D4 }, unicodeslot=0xFB23, }, [0xFB24]={ @@ -121774,7 +124904,7 @@ characters.data={ description="HEBREW LETTER WIDE KAF", direction="r", linebreak="hl", - specials={ "font", 0x05DB }, + specials={ "font", 0x5DB }, unicodeslot=0xFB24, }, [0xFB25]={ @@ -121782,7 +124912,7 @@ characters.data={ description="HEBREW LETTER WIDE LAMED", direction="r", linebreak="hl", - specials={ "font", 0x05DC }, + specials={ "font", 0x5DC }, unicodeslot=0xFB25, }, [0xFB26]={ @@ -121790,7 +124920,7 @@ characters.data={ description="HEBREW LETTER WIDE FINAL MEM", direction="r", linebreak="hl", - specials={ "font", 0x05DD }, + specials={ "font", 0x5DD }, unicodeslot=0xFB26, }, [0xFB27]={ @@ -121798,7 +124928,7 @@ characters.data={ description="HEBREW LETTER WIDE RESH", direction="r", linebreak="hl", - specials={ "font", 0x05E8 }, + specials={ "font", 0x5E8 }, unicodeslot=0xFB27, }, [0xFB28]={ @@ -121806,7 +124936,7 @@ characters.data={ description="HEBREW LETTER WIDE TAV", direction="r", linebreak="hl", - specials={ "font", 0x05EA }, + specials={ "font", 0x5EA }, unicodeslot=0xFB28, }, [0xFB29]={ @@ -121814,7 +124944,7 @@ characters.data={ description="HEBREW LETTER ALTERNATIVE PLUS SIGN", direction="es", linebreak="al", - specials={ "font", 0x002B }, + specials={ "font", 0x2B }, unicodeslot=0xFB29, }, [0xFB2A]={ @@ -121823,8 +124953,8 @@ characters.data={ description="HEBREW LETTER SHIN WITH SHIN DOT", direction="r", linebreak="hl", - shcode=0x05E9, - specials={ "char", 0x05E9, 0x05C1 }, + shcode=0x5E9, + specials={ "char", 0x5E9, 0x5C1 }, unicodeslot=0xFB2A, }, [0xFB2B]={ @@ -121833,8 +124963,8 @@ characters.data={ description="HEBREW LETTER SHIN WITH SIN DOT", direction="r", linebreak="hl", - shcode=0x05E9, - specials={ "char", 0x05E9, 0x05C2 }, + shcode=0x5E9, + specials={ "char", 0x5E9, 0x5C2 }, unicodeslot=0xFB2B, }, [0xFB2C]={ @@ -121843,8 +124973,8 @@ characters.data={ description="HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT", direction="r", linebreak="hl", - shcode=0x05E9, - specials={ "char", 0xFB49, 0x05C1 }, + shcode=0x5E9, + specials={ "char", 0xFB49, 0x5C1 }, unicodeslot=0xFB2C, }, [0xFB2D]={ @@ -121853,8 +124983,8 @@ characters.data={ description="HEBREW LETTER SHIN WITH DAGESH AND SIN DOT", direction="r", linebreak="hl", - shcode=0x05E9, - specials={ "char", 0xFB49, 0x05C2 }, + shcode=0x5E9, + specials={ "char", 0xFB49, 0x5C2 }, unicodeslot=0xFB2D, }, [0xFB2E]={ @@ -121863,8 +124993,8 @@ characters.data={ description="HEBREW LETTER ALEF WITH PATAH", direction="r", linebreak="hl", - shcode=0x05D0, - specials={ "char", 0x05D0, 0x05B7 }, + shcode=0x5D0, + specials={ "char", 0x5D0, 0x5B7 }, unicodeslot=0xFB2E, }, [0xFB2F]={ @@ -121873,8 +125003,8 @@ characters.data={ description="HEBREW LETTER ALEF WITH QAMATS", direction="r", linebreak="hl", - shcode=0x05D0, - specials={ "char", 0x05D0, 0x05B8 }, + shcode=0x5D0, + specials={ "char", 0x5D0, 0x5B8 }, unicodeslot=0xFB2F, }, [0xFB30]={ @@ -121883,8 +125013,8 @@ characters.data={ description="HEBREW LETTER ALEF WITH MAPIQ", direction="r", linebreak="hl", - shcode=0x05D0, - specials={ "char", 0x05D0, 0x05BC }, + shcode=0x5D0, + specials={ "char", 0x5D0, 0x5BC }, unicodeslot=0xFB30, }, [0xFB31]={ @@ -121893,8 +125023,8 @@ characters.data={ description="HEBREW LETTER BET WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D1, - specials={ "char", 0x05D1, 0x05BC }, + shcode=0x5D1, + specials={ "char", 0x5D1, 0x5BC }, unicodeslot=0xFB31, }, [0xFB32]={ @@ -121903,8 +125033,8 @@ characters.data={ description="HEBREW LETTER GIMEL WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D2, - specials={ "char", 0x05D2, 0x05BC }, + shcode=0x5D2, + specials={ "char", 0x5D2, 0x5BC }, unicodeslot=0xFB32, }, [0xFB33]={ @@ -121913,8 +125043,8 @@ characters.data={ description="HEBREW LETTER DALET WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D3, - specials={ "char", 0x05D3, 0x05BC }, + shcode=0x5D3, + specials={ "char", 0x5D3, 0x5BC }, unicodeslot=0xFB33, }, [0xFB34]={ @@ -121923,8 +125053,8 @@ characters.data={ description="HEBREW LETTER HE WITH MAPIQ", direction="r", linebreak="hl", - shcode=0x05D4, - specials={ "char", 0x05D4, 0x05BC }, + shcode=0x5D4, + specials={ "char", 0x5D4, 0x5BC }, unicodeslot=0xFB34, }, [0xFB35]={ @@ -121933,8 +125063,8 @@ characters.data={ description="HEBREW LETTER VAV WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D5, - specials={ "char", 0x05D5, 0x05BC }, + shcode=0x5D5, + specials={ "char", 0x5D5, 0x5BC }, unicodeslot=0xFB35, }, [0xFB36]={ @@ -121943,8 +125073,8 @@ characters.data={ description="HEBREW LETTER ZAYIN WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D6, - specials={ "char", 0x05D6, 0x05BC }, + shcode=0x5D6, + specials={ "char", 0x5D6, 0x5BC }, unicodeslot=0xFB36, }, [0xFB38]={ @@ -121953,8 +125083,8 @@ characters.data={ description="HEBREW LETTER TET WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D8, - specials={ "char", 0x05D8, 0x05BC }, + shcode=0x5D8, + specials={ "char", 0x5D8, 0x5BC }, unicodeslot=0xFB38, }, [0xFB39]={ @@ -121963,8 +125093,8 @@ characters.data={ description="HEBREW LETTER YOD WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05D9, - specials={ "char", 0x05D9, 0x05BC }, + shcode=0x5D9, + specials={ "char", 0x5D9, 0x5BC }, unicodeslot=0xFB39, }, [0xFB3A]={ @@ -121973,7 +125103,7 @@ characters.data={ description="HEBREW LETTER FINAL KAF WITH DAGESH", direction="r", linebreak="hl", - specials={ "char", 0x05DA, 0x05BC }, + specials={ "char", 0x5DA, 0x5BC }, unicodeslot=0xFB3A, }, [0xFB3B]={ @@ -121982,8 +125112,8 @@ characters.data={ description="HEBREW LETTER KAF WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05DB, - specials={ "char", 0x05DB, 0x05BC }, + shcode=0x5DB, + specials={ "char", 0x5DB, 0x5BC }, unicodeslot=0xFB3B, }, [0xFB3C]={ @@ -121992,8 +125122,8 @@ characters.data={ description="HEBREW LETTER LAMED WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05DC, - specials={ "char", 0x05DC, 0x05BC }, + shcode=0x5DC, + specials={ "char", 0x5DC, 0x5BC }, unicodeslot=0xFB3C, }, [0xFB3E]={ @@ -122002,8 +125132,8 @@ characters.data={ description="HEBREW LETTER MEM WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05DE, - specials={ "char", 0x05DE, 0x05BC }, + shcode=0x5DE, + specials={ "char", 0x5DE, 0x5BC }, unicodeslot=0xFB3E, }, [0xFB40]={ @@ -122012,8 +125142,8 @@ characters.data={ description="HEBREW LETTER NUN WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E0, - specials={ "char", 0x05E0, 0x05BC }, + shcode=0x5E0, + specials={ "char", 0x5E0, 0x5BC }, unicodeslot=0xFB40, }, [0xFB41]={ @@ -122022,8 +125152,8 @@ characters.data={ description="HEBREW LETTER SAMEKH WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E1, - specials={ "char", 0x05E1, 0x05BC }, + shcode=0x5E1, + specials={ "char", 0x5E1, 0x5BC }, unicodeslot=0xFB41, }, [0xFB43]={ @@ -122032,7 +125162,7 @@ characters.data={ description="HEBREW LETTER FINAL PE WITH DAGESH", direction="r", linebreak="hl", - specials={ "char", 0x05E3, 0x05BC }, + specials={ "char", 0x5E3, 0x5BC }, unicodeslot=0xFB43, }, [0xFB44]={ @@ -122041,8 +125171,8 @@ characters.data={ description="HEBREW LETTER PE WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E4, - specials={ "char", 0x05E4, 0x05BC }, + shcode=0x5E4, + specials={ "char", 0x5E4, 0x5BC }, unicodeslot=0xFB44, }, [0xFB46]={ @@ -122051,8 +125181,8 @@ characters.data={ description="HEBREW LETTER TSADI WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E6, - specials={ "char", 0x05E6, 0x05BC }, + shcode=0x5E6, + specials={ "char", 0x5E6, 0x5BC }, unicodeslot=0xFB46, }, [0xFB47]={ @@ -122061,8 +125191,8 @@ characters.data={ description="HEBREW LETTER QOF WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E7, - specials={ "char", 0x05E7, 0x05BC }, + shcode=0x5E7, + specials={ "char", 0x5E7, 0x5BC }, unicodeslot=0xFB47, }, [0xFB48]={ @@ -122071,8 +125201,8 @@ characters.data={ description="HEBREW LETTER RESH WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E8, - specials={ "char", 0x05E8, 0x05BC }, + shcode=0x5E8, + specials={ "char", 0x5E8, 0x5BC }, unicodeslot=0xFB48, }, [0xFB49]={ @@ -122081,8 +125211,8 @@ characters.data={ description="HEBREW LETTER SHIN WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05E9, - specials={ "char", 0x05E9, 0x05BC }, + shcode=0x5E9, + specials={ "char", 0x5E9, 0x5BC }, unicodeslot=0xFB49, }, [0xFB4A]={ @@ -122091,8 +125221,8 @@ characters.data={ description="HEBREW LETTER TAV WITH DAGESH", direction="r", linebreak="hl", - shcode=0x05EA, - specials={ "char", 0x05EA, 0x05BC }, + shcode=0x5EA, + specials={ "char", 0x5EA, 0x5BC }, unicodeslot=0xFB4A, }, [0xFB4B]={ @@ -122101,8 +125231,8 @@ characters.data={ description="HEBREW LETTER VAV WITH HOLAM", direction="r", linebreak="hl", - shcode=0x05D5, - specials={ "char", 0x05D5, 0x05B9 }, + shcode=0x5D5, + specials={ "char", 0x5D5, 0x5B9 }, unicodeslot=0xFB4B, }, [0xFB4C]={ @@ -122111,8 +125241,8 @@ characters.data={ description="HEBREW LETTER BET WITH RAFE", direction="r", linebreak="hl", - shcode=0x05D1, - specials={ "char", 0x05D1, 0x05BF }, + shcode=0x5D1, + specials={ "char", 0x5D1, 0x5BF }, unicodeslot=0xFB4C, }, [0xFB4D]={ @@ -122121,8 +125251,8 @@ characters.data={ description="HEBREW LETTER KAF WITH RAFE", direction="r", linebreak="hl", - shcode=0x05DB, - specials={ "char", 0x05DB, 0x05BF }, + shcode=0x5DB, + specials={ "char", 0x5DB, 0x5BF }, unicodeslot=0xFB4D, }, [0xFB4E]={ @@ -122131,8 +125261,8 @@ characters.data={ description="HEBREW LETTER PE WITH RAFE", direction="r", linebreak="hl", - shcode=0x05E4, - specials={ "char", 0x05E4, 0x05BF }, + shcode=0x5E4, + specials={ "char", 0x5E4, 0x5BF }, unicodeslot=0xFB4E, }, [0xFB4F]={ @@ -122141,7 +125271,7 @@ characters.data={ description="HEBREW LIGATURE ALEF LAMED", direction="r", linebreak="hl", - specials={ "compat", 0x05D0, 0x05DC }, + specials={ "compat", 0x5D0, 0x5DC }, unicodeslot=0xFB4F, }, [0xFB50]={ @@ -122149,7 +125279,7 @@ characters.data={ description="ARABIC LETTER ALEF WASLA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0671 }, + specials={ "isolated", 0x671 }, unicodeslot=0xFB50, }, [0xFB51]={ @@ -122157,7 +125287,7 @@ characters.data={ description="ARABIC LETTER ALEF WASLA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0671 }, + specials={ "final", 0x671 }, unicodeslot=0xFB51, }, [0xFB52]={ @@ -122165,7 +125295,7 @@ characters.data={ description="ARABIC LETTER BEEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x067B }, + specials={ "isolated", 0x67B }, unicodeslot=0xFB52, }, [0xFB53]={ @@ -122173,7 +125303,7 @@ characters.data={ description="ARABIC LETTER BEEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x067B }, + specials={ "final", 0x67B }, unicodeslot=0xFB53, }, [0xFB54]={ @@ -122181,7 +125311,7 @@ characters.data={ description="ARABIC LETTER BEEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x067B }, + specials={ "initial", 0x67B }, unicodeslot=0xFB54, }, [0xFB55]={ @@ -122189,7 +125319,7 @@ characters.data={ description="ARABIC LETTER BEEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x067B }, + specials={ "medial", 0x67B }, unicodeslot=0xFB55, }, [0xFB56]={ @@ -122197,7 +125327,7 @@ characters.data={ description="ARABIC LETTER PEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x067E }, + specials={ "isolated", 0x67E }, unicodeslot=0xFB56, }, [0xFB57]={ @@ -122206,7 +125336,7 @@ characters.data={ description="ARABIC LETTER PEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x067E }, + specials={ "final", 0x67E }, unicodeslot=0xFB57, }, [0xFB58]={ @@ -122215,7 +125345,7 @@ characters.data={ description="ARABIC LETTER PEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x067E }, + specials={ "initial", 0x67E }, unicodeslot=0xFB58, }, [0xFB59]={ @@ -122224,7 +125354,7 @@ characters.data={ description="ARABIC LETTER PEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x067E }, + specials={ "medial", 0x67E }, unicodeslot=0xFB59, }, [0xFB5A]={ @@ -122232,7 +125362,7 @@ characters.data={ description="ARABIC LETTER BEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0680 }, + specials={ "isolated", 0x680 }, unicodeslot=0xFB5A, }, [0xFB5B]={ @@ -122240,7 +125370,7 @@ characters.data={ description="ARABIC LETTER BEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0680 }, + specials={ "final", 0x680 }, unicodeslot=0xFB5B, }, [0xFB5C]={ @@ -122248,7 +125378,7 @@ characters.data={ description="ARABIC LETTER BEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0680 }, + specials={ "initial", 0x680 }, unicodeslot=0xFB5C, }, [0xFB5D]={ @@ -122256,7 +125386,7 @@ characters.data={ description="ARABIC LETTER BEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0680 }, + specials={ "medial", 0x680 }, unicodeslot=0xFB5D, }, [0xFB5E]={ @@ -122264,7 +125394,7 @@ characters.data={ description="ARABIC LETTER TTEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x067A }, + specials={ "isolated", 0x67A }, unicodeslot=0xFB5E, }, [0xFB5F]={ @@ -122272,7 +125402,7 @@ characters.data={ description="ARABIC LETTER TTEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x067A }, + specials={ "final", 0x67A }, unicodeslot=0xFB5F, }, [0xFB60]={ @@ -122280,7 +125410,7 @@ characters.data={ description="ARABIC LETTER TTEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x067A }, + specials={ "initial", 0x67A }, unicodeslot=0xFB60, }, [0xFB61]={ @@ -122288,7 +125418,7 @@ characters.data={ description="ARABIC LETTER TTEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x067A }, + specials={ "medial", 0x67A }, unicodeslot=0xFB61, }, [0xFB62]={ @@ -122296,7 +125426,7 @@ characters.data={ description="ARABIC LETTER TEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x067F }, + specials={ "isolated", 0x67F }, unicodeslot=0xFB62, }, [0xFB63]={ @@ -122304,7 +125434,7 @@ characters.data={ description="ARABIC LETTER TEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x067F }, + specials={ "final", 0x67F }, unicodeslot=0xFB63, }, [0xFB64]={ @@ -122312,7 +125442,7 @@ characters.data={ description="ARABIC LETTER TEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x067F }, + specials={ "initial", 0x67F }, unicodeslot=0xFB64, }, [0xFB65]={ @@ -122320,7 +125450,7 @@ characters.data={ description="ARABIC LETTER TEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x067F }, + specials={ "medial", 0x67F }, unicodeslot=0xFB65, }, [0xFB66]={ @@ -122328,7 +125458,7 @@ characters.data={ description="ARABIC LETTER TTEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0679 }, + specials={ "isolated", 0x679 }, unicodeslot=0xFB66, }, [0xFB67]={ @@ -122337,7 +125467,7 @@ characters.data={ description="ARABIC LETTER TTEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0679 }, + specials={ "final", 0x679 }, unicodeslot=0xFB67, }, [0xFB68]={ @@ -122346,7 +125476,7 @@ characters.data={ description="ARABIC LETTER TTEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0679 }, + specials={ "initial", 0x679 }, unicodeslot=0xFB68, }, [0xFB69]={ @@ -122355,7 +125485,7 @@ characters.data={ description="ARABIC LETTER TTEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0679 }, + specials={ "medial", 0x679 }, unicodeslot=0xFB69, }, [0xFB6A]={ @@ -122363,7 +125493,7 @@ characters.data={ description="ARABIC LETTER VEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06A4 }, + specials={ "isolated", 0x6A4 }, unicodeslot=0xFB6A, }, [0xFB6B]={ @@ -122372,7 +125502,7 @@ characters.data={ description="ARABIC LETTER VEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06A4 }, + specials={ "final", 0x6A4 }, unicodeslot=0xFB6B, }, [0xFB6C]={ @@ -122381,7 +125511,7 @@ characters.data={ description="ARABIC LETTER VEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06A4 }, + specials={ "initial", 0x6A4 }, unicodeslot=0xFB6C, }, [0xFB6D]={ @@ -122390,7 +125520,7 @@ characters.data={ description="ARABIC LETTER VEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06A4 }, + specials={ "medial", 0x6A4 }, unicodeslot=0xFB6D, }, [0xFB6E]={ @@ -122398,7 +125528,7 @@ characters.data={ description="ARABIC LETTER PEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06A6 }, + specials={ "isolated", 0x6A6 }, unicodeslot=0xFB6E, }, [0xFB6F]={ @@ -122406,7 +125536,7 @@ characters.data={ description="ARABIC LETTER PEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06A6 }, + specials={ "final", 0x6A6 }, unicodeslot=0xFB6F, }, [0xFB70]={ @@ -122414,7 +125544,7 @@ characters.data={ description="ARABIC LETTER PEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06A6 }, + specials={ "initial", 0x6A6 }, unicodeslot=0xFB70, }, [0xFB71]={ @@ -122422,7 +125552,7 @@ characters.data={ description="ARABIC LETTER PEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06A6 }, + specials={ "medial", 0x6A6 }, unicodeslot=0xFB71, }, [0xFB72]={ @@ -122430,7 +125560,7 @@ characters.data={ description="ARABIC LETTER DYEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0684 }, + specials={ "isolated", 0x684 }, unicodeslot=0xFB72, }, [0xFB73]={ @@ -122438,7 +125568,7 @@ characters.data={ description="ARABIC LETTER DYEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0684 }, + specials={ "final", 0x684 }, unicodeslot=0xFB73, }, [0xFB74]={ @@ -122446,7 +125576,7 @@ characters.data={ description="ARABIC LETTER DYEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0684 }, + specials={ "initial", 0x684 }, unicodeslot=0xFB74, }, [0xFB75]={ @@ -122454,7 +125584,7 @@ characters.data={ description="ARABIC LETTER DYEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0684 }, + specials={ "medial", 0x684 }, unicodeslot=0xFB75, }, [0xFB76]={ @@ -122462,7 +125592,7 @@ characters.data={ description="ARABIC LETTER NYEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0683 }, + specials={ "isolated", 0x683 }, unicodeslot=0xFB76, }, [0xFB77]={ @@ -122470,7 +125600,7 @@ characters.data={ description="ARABIC LETTER NYEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0683 }, + specials={ "final", 0x683 }, unicodeslot=0xFB77, }, [0xFB78]={ @@ -122478,7 +125608,7 @@ characters.data={ description="ARABIC LETTER NYEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0683 }, + specials={ "initial", 0x683 }, unicodeslot=0xFB78, }, [0xFB79]={ @@ -122486,7 +125616,7 @@ characters.data={ description="ARABIC LETTER NYEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0683 }, + specials={ "medial", 0x683 }, unicodeslot=0xFB79, }, [0xFB7A]={ @@ -122494,7 +125624,7 @@ characters.data={ description="ARABIC LETTER TCHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0686 }, + specials={ "isolated", 0x686 }, unicodeslot=0xFB7A, }, [0xFB7B]={ @@ -122503,7 +125633,7 @@ characters.data={ description="ARABIC LETTER TCHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0686 }, + specials={ "final", 0x686 }, unicodeslot=0xFB7B, }, [0xFB7C]={ @@ -122512,7 +125642,7 @@ characters.data={ description="ARABIC LETTER TCHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0686 }, + specials={ "initial", 0x686 }, unicodeslot=0xFB7C, }, [0xFB7D]={ @@ -122521,7 +125651,7 @@ characters.data={ description="ARABIC LETTER TCHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0686 }, + specials={ "medial", 0x686 }, unicodeslot=0xFB7D, }, [0xFB7E]={ @@ -122529,7 +125659,7 @@ characters.data={ description="ARABIC LETTER TCHEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0687 }, + specials={ "isolated", 0x687 }, unicodeslot=0xFB7E, }, [0xFB7F]={ @@ -122537,7 +125667,7 @@ characters.data={ description="ARABIC LETTER TCHEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0687 }, + specials={ "final", 0x687 }, unicodeslot=0xFB7F, }, [0xFB80]={ @@ -122545,7 +125675,7 @@ characters.data={ description="ARABIC LETTER TCHEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0687 }, + specials={ "initial", 0x687 }, unicodeslot=0xFB80, }, [0xFB81]={ @@ -122553,7 +125683,7 @@ characters.data={ description="ARABIC LETTER TCHEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0687 }, + specials={ "medial", 0x687 }, unicodeslot=0xFB81, }, [0xFB82]={ @@ -122561,7 +125691,7 @@ characters.data={ description="ARABIC LETTER DDAHAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x068D }, + specials={ "isolated", 0x68D }, unicodeslot=0xFB82, }, [0xFB83]={ @@ -122569,7 +125699,7 @@ characters.data={ description="ARABIC LETTER DDAHAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x068D }, + specials={ "final", 0x68D }, unicodeslot=0xFB83, }, [0xFB84]={ @@ -122577,7 +125707,7 @@ characters.data={ description="ARABIC LETTER DAHAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x068C }, + specials={ "isolated", 0x68C }, unicodeslot=0xFB84, }, [0xFB85]={ @@ -122585,7 +125715,7 @@ characters.data={ description="ARABIC LETTER DAHAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x068C }, + specials={ "final", 0x68C }, unicodeslot=0xFB85, }, [0xFB86]={ @@ -122593,7 +125723,7 @@ characters.data={ description="ARABIC LETTER DUL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x068E }, + specials={ "isolated", 0x68E }, unicodeslot=0xFB86, }, [0xFB87]={ @@ -122601,7 +125731,7 @@ characters.data={ description="ARABIC LETTER DUL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x068E }, + specials={ "final", 0x68E }, unicodeslot=0xFB87, }, [0xFB88]={ @@ -122609,7 +125739,7 @@ characters.data={ description="ARABIC LETTER DDAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0688 }, + specials={ "isolated", 0x688 }, unicodeslot=0xFB88, }, [0xFB89]={ @@ -122618,7 +125748,7 @@ characters.data={ description="ARABIC LETTER DDAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0688 }, + specials={ "final", 0x688 }, unicodeslot=0xFB89, }, [0xFB8A]={ @@ -122626,7 +125756,7 @@ characters.data={ description="ARABIC LETTER JEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0698 }, + specials={ "isolated", 0x698 }, unicodeslot=0xFB8A, }, [0xFB8B]={ @@ -122635,7 +125765,7 @@ characters.data={ description="ARABIC LETTER JEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0698 }, + specials={ "final", 0x698 }, unicodeslot=0xFB8B, }, [0xFB8C]={ @@ -122643,7 +125773,7 @@ characters.data={ description="ARABIC LETTER RREH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0691 }, + specials={ "isolated", 0x691 }, unicodeslot=0xFB8C, }, [0xFB8D]={ @@ -122652,7 +125782,7 @@ characters.data={ description="ARABIC LETTER RREH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0691 }, + specials={ "final", 0x691 }, unicodeslot=0xFB8D, }, [0xFB8E]={ @@ -122660,7 +125790,7 @@ characters.data={ description="ARABIC LETTER KEHEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06A9 }, + specials={ "isolated", 0x6A9 }, unicodeslot=0xFB8E, }, [0xFB8F]={ @@ -122668,7 +125798,7 @@ characters.data={ description="ARABIC LETTER KEHEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06A9 }, + specials={ "final", 0x6A9 }, unicodeslot=0xFB8F, }, [0xFB90]={ @@ -122676,7 +125806,7 @@ characters.data={ description="ARABIC LETTER KEHEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06A9 }, + specials={ "initial", 0x6A9 }, unicodeslot=0xFB90, }, [0xFB91]={ @@ -122684,7 +125814,7 @@ characters.data={ description="ARABIC LETTER KEHEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06A9 }, + specials={ "medial", 0x6A9 }, unicodeslot=0xFB91, }, [0xFB92]={ @@ -122692,7 +125822,7 @@ characters.data={ description="ARABIC LETTER GAF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06AF }, + specials={ "isolated", 0x6AF }, unicodeslot=0xFB92, }, [0xFB93]={ @@ -122701,7 +125831,7 @@ characters.data={ description="ARABIC LETTER GAF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06AF }, + specials={ "final", 0x6AF }, unicodeslot=0xFB93, }, [0xFB94]={ @@ -122710,7 +125840,7 @@ characters.data={ description="ARABIC LETTER GAF INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06AF }, + specials={ "initial", 0x6AF }, unicodeslot=0xFB94, }, [0xFB95]={ @@ -122719,7 +125849,7 @@ characters.data={ description="ARABIC LETTER GAF MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06AF }, + specials={ "medial", 0x6AF }, unicodeslot=0xFB95, }, [0xFB96]={ @@ -122727,7 +125857,7 @@ characters.data={ description="ARABIC LETTER GUEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06B3 }, + specials={ "isolated", 0x6B3 }, unicodeslot=0xFB96, }, [0xFB97]={ @@ -122735,7 +125865,7 @@ characters.data={ description="ARABIC LETTER GUEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06B3 }, + specials={ "final", 0x6B3 }, unicodeslot=0xFB97, }, [0xFB98]={ @@ -122743,7 +125873,7 @@ characters.data={ description="ARABIC LETTER GUEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06B3 }, + specials={ "initial", 0x6B3 }, unicodeslot=0xFB98, }, [0xFB99]={ @@ -122751,7 +125881,7 @@ characters.data={ description="ARABIC LETTER GUEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06B3 }, + specials={ "medial", 0x6B3 }, unicodeslot=0xFB99, }, [0xFB9A]={ @@ -122759,7 +125889,7 @@ characters.data={ description="ARABIC LETTER NGOEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06B1 }, + specials={ "isolated", 0x6B1 }, unicodeslot=0xFB9A, }, [0xFB9B]={ @@ -122767,7 +125897,7 @@ characters.data={ description="ARABIC LETTER NGOEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06B1 }, + specials={ "final", 0x6B1 }, unicodeslot=0xFB9B, }, [0xFB9C]={ @@ -122775,7 +125905,7 @@ characters.data={ description="ARABIC LETTER NGOEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06B1 }, + specials={ "initial", 0x6B1 }, unicodeslot=0xFB9C, }, [0xFB9D]={ @@ -122783,7 +125913,7 @@ characters.data={ description="ARABIC LETTER NGOEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06B1 }, + specials={ "medial", 0x6B1 }, unicodeslot=0xFB9D, }, [0xFB9E]={ @@ -122791,7 +125921,7 @@ characters.data={ description="ARABIC LETTER NOON GHUNNA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06BA }, + specials={ "isolated", 0x6BA }, unicodeslot=0xFB9E, }, [0xFB9F]={ @@ -122800,7 +125930,7 @@ characters.data={ description="ARABIC LETTER NOON GHUNNA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06BA }, + specials={ "final", 0x6BA }, unicodeslot=0xFB9F, }, [0xFBA0]={ @@ -122808,7 +125938,7 @@ characters.data={ description="ARABIC LETTER RNOON ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06BB }, + specials={ "isolated", 0x6BB }, unicodeslot=0xFBA0, }, [0xFBA1]={ @@ -122816,7 +125946,7 @@ characters.data={ description="ARABIC LETTER RNOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06BB }, + specials={ "final", 0x6BB }, unicodeslot=0xFBA1, }, [0xFBA2]={ @@ -122824,7 +125954,7 @@ characters.data={ description="ARABIC LETTER RNOON INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06BB }, + specials={ "initial", 0x6BB }, unicodeslot=0xFBA2, }, [0xFBA3]={ @@ -122832,7 +125962,7 @@ characters.data={ description="ARABIC LETTER RNOON MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06BB }, + specials={ "medial", 0x6BB }, unicodeslot=0xFBA3, }, [0xFBA4]={ @@ -122841,8 +125971,8 @@ characters.data={ description="ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x0647, - specials={ "isolated", 0x06C0 }, + shcode=0x647, + specials={ "isolated", 0x6C0 }, unicodeslot=0xFBA4, }, [0xFBA5]={ @@ -122851,8 +125981,8 @@ characters.data={ description="ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM", direction="al", linebreak="al", - shcode=0x0647, - specials={ "final", 0x06C0 }, + shcode=0x647, + specials={ "final", 0x6C0 }, unicodeslot=0xFBA5, }, [0xFBA6]={ @@ -122860,7 +125990,7 @@ characters.data={ description="ARABIC LETTER HEH GOAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C1 }, + specials={ "isolated", 0x6C1 }, unicodeslot=0xFBA6, }, [0xFBA7]={ @@ -122869,7 +125999,7 @@ characters.data={ description="ARABIC LETTER HEH GOAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C1 }, + specials={ "final", 0x6C1 }, unicodeslot=0xFBA7, }, [0xFBA8]={ @@ -122878,7 +126008,7 @@ characters.data={ description="ARABIC LETTER HEH GOAL INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06C1 }, + specials={ "initial", 0x6C1 }, unicodeslot=0xFBA8, }, [0xFBA9]={ @@ -122887,7 +126017,7 @@ characters.data={ description="ARABIC LETTER HEH GOAL MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06C1 }, + specials={ "medial", 0x6C1 }, unicodeslot=0xFBA9, }, [0xFBAA]={ @@ -122895,7 +126025,7 @@ characters.data={ description="ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06BE }, + specials={ "isolated", 0x6BE }, unicodeslot=0xFBAA, }, [0xFBAB]={ @@ -122903,7 +126033,7 @@ characters.data={ description="ARABIC LETTER HEH DOACHASHMEE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06BE }, + specials={ "final", 0x6BE }, unicodeslot=0xFBAB, }, [0xFBAC]={ @@ -122911,7 +126041,7 @@ characters.data={ description="ARABIC LETTER HEH DOACHASHMEE INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06BE }, + specials={ "initial", 0x6BE }, unicodeslot=0xFBAC, }, [0xFBAD]={ @@ -122919,7 +126049,7 @@ characters.data={ description="ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06BE }, + specials={ "medial", 0x6BE }, unicodeslot=0xFBAD, }, [0xFBAE]={ @@ -122927,7 +126057,7 @@ characters.data={ description="ARABIC LETTER YEH BARREE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06D2 }, + specials={ "isolated", 0x6D2 }, unicodeslot=0xFBAE, }, [0xFBAF]={ @@ -122936,7 +126066,7 @@ characters.data={ description="ARABIC LETTER YEH BARREE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06D2 }, + specials={ "final", 0x6D2 }, unicodeslot=0xFBAF, }, [0xFBB0]={ @@ -122944,7 +126074,7 @@ characters.data={ description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06D3 }, + specials={ "isolated", 0x6D3 }, unicodeslot=0xFBB0, }, [0xFBB1]={ @@ -122952,7 +126082,7 @@ characters.data={ description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06D3 }, + specials={ "final", 0x6D3 }, unicodeslot=0xFBB1, }, [0xFBB2]={ @@ -123072,7 +126202,7 @@ characters.data={ description="ARABIC LETTER NG ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06AD }, + specials={ "isolated", 0x6AD }, unicodeslot=0xFBD3, }, [0xFBD4]={ @@ -123080,7 +126210,7 @@ characters.data={ description="ARABIC LETTER NG FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06AD }, + specials={ "final", 0x6AD }, unicodeslot=0xFBD4, }, [0xFBD5]={ @@ -123088,7 +126218,7 @@ characters.data={ description="ARABIC LETTER NG INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06AD }, + specials={ "initial", 0x6AD }, unicodeslot=0xFBD5, }, [0xFBD6]={ @@ -123096,7 +126226,7 @@ characters.data={ description="ARABIC LETTER NG MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06AD }, + specials={ "medial", 0x6AD }, unicodeslot=0xFBD6, }, [0xFBD7]={ @@ -123104,7 +126234,7 @@ characters.data={ description="ARABIC LETTER U ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C7 }, + specials={ "isolated", 0x6C7 }, unicodeslot=0xFBD7, }, [0xFBD8]={ @@ -123112,7 +126242,7 @@ characters.data={ description="ARABIC LETTER U FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C7 }, + specials={ "final", 0x6C7 }, unicodeslot=0xFBD8, }, [0xFBD9]={ @@ -123120,7 +126250,7 @@ characters.data={ description="ARABIC LETTER OE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C6 }, + specials={ "isolated", 0x6C6 }, unicodeslot=0xFBD9, }, [0xFBDA]={ @@ -123128,7 +126258,7 @@ characters.data={ description="ARABIC LETTER OE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C6 }, + specials={ "final", 0x6C6 }, unicodeslot=0xFBDA, }, [0xFBDB]={ @@ -123136,7 +126266,7 @@ characters.data={ description="ARABIC LETTER YU ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C8 }, + specials={ "isolated", 0x6C8 }, unicodeslot=0xFBDB, }, [0xFBDC]={ @@ -123144,7 +126274,7 @@ characters.data={ description="ARABIC LETTER YU FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C8 }, + specials={ "final", 0x6C8 }, unicodeslot=0xFBDC, }, [0xFBDD]={ @@ -123152,8 +126282,8 @@ characters.data={ description="ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x06C7, - specials={ "isolated", 0x0677 }, + shcode=0x6C7, + specials={ "isolated", 0x677 }, unicodeslot=0xFBDD, }, [0xFBDE]={ @@ -123161,7 +126291,7 @@ characters.data={ description="ARABIC LETTER VE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06CB }, + specials={ "isolated", 0x6CB }, unicodeslot=0xFBDE, }, [0xFBDF]={ @@ -123169,7 +126299,7 @@ characters.data={ description="ARABIC LETTER VE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06CB }, + specials={ "final", 0x6CB }, unicodeslot=0xFBDF, }, [0xFBE0]={ @@ -123177,7 +126307,7 @@ characters.data={ description="ARABIC LETTER KIRGHIZ OE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C5 }, + specials={ "isolated", 0x6C5 }, unicodeslot=0xFBE0, }, [0xFBE1]={ @@ -123185,7 +126315,7 @@ characters.data={ description="ARABIC LETTER KIRGHIZ OE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C5 }, + specials={ "final", 0x6C5 }, unicodeslot=0xFBE1, }, [0xFBE2]={ @@ -123193,7 +126323,7 @@ characters.data={ description="ARABIC LETTER KIRGHIZ YU ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06C9 }, + specials={ "isolated", 0x6C9 }, unicodeslot=0xFBE2, }, [0xFBE3]={ @@ -123201,7 +126331,7 @@ characters.data={ description="ARABIC LETTER KIRGHIZ YU FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06C9 }, + specials={ "final", 0x6C9 }, unicodeslot=0xFBE3, }, [0xFBE4]={ @@ -123209,7 +126339,7 @@ characters.data={ description="ARABIC LETTER E ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06D0 }, + specials={ "isolated", 0x6D0 }, unicodeslot=0xFBE4, }, [0xFBE5]={ @@ -123217,7 +126347,7 @@ characters.data={ description="ARABIC LETTER E FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06D0 }, + specials={ "final", 0x6D0 }, unicodeslot=0xFBE5, }, [0xFBE6]={ @@ -123225,7 +126355,7 @@ characters.data={ description="ARABIC LETTER E INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06D0 }, + specials={ "initial", 0x6D0 }, unicodeslot=0xFBE6, }, [0xFBE7]={ @@ -123233,7 +126363,7 @@ characters.data={ description="ARABIC LETTER E MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06D0 }, + specials={ "medial", 0x6D0 }, unicodeslot=0xFBE7, }, [0xFBE8]={ @@ -123241,7 +126371,7 @@ characters.data={ description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0649 }, + specials={ "initial", 0x649 }, unicodeslot=0xFBE8, }, [0xFBE9]={ @@ -123249,7 +126379,7 @@ characters.data={ description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0649 }, + specials={ "medial", 0x649 }, unicodeslot=0xFBE9, }, [0xFBEA]={ @@ -123257,7 +126387,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x0627 }, + specials={ "isolated", 0x626, 0x627 }, unicodeslot=0xFBEA, }, [0xFBEB]={ @@ -123265,7 +126395,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0627 }, + specials={ "final", 0x626, 0x627 }, unicodeslot=0xFBEB, }, [0xFBEC]={ @@ -123273,7 +126403,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x06D5 }, + specials={ "isolated", 0x626, 0x6D5 }, unicodeslot=0xFBEC, }, [0xFBED]={ @@ -123281,7 +126411,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x06D5 }, + specials={ "final", 0x626, 0x6D5 }, unicodeslot=0xFBED, }, [0xFBEE]={ @@ -123289,7 +126419,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x0648 }, + specials={ "isolated", 0x626, 0x648 }, unicodeslot=0xFBEE, }, [0xFBEF]={ @@ -123297,7 +126427,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0648 }, + specials={ "final", 0x626, 0x648 }, unicodeslot=0xFBEF, }, [0xFBF0]={ @@ -123305,7 +126435,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x06C7 }, + specials={ "isolated", 0x626, 0x6C7 }, unicodeslot=0xFBF0, }, [0xFBF1]={ @@ -123313,7 +126443,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x06C7 }, + specials={ "final", 0x626, 0x6C7 }, unicodeslot=0xFBF1, }, [0xFBF2]={ @@ -123321,7 +126451,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x06C6 }, + specials={ "isolated", 0x626, 0x6C6 }, unicodeslot=0xFBF2, }, [0xFBF3]={ @@ -123329,7 +126459,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x06C6 }, + specials={ "final", 0x626, 0x6C6 }, unicodeslot=0xFBF3, }, [0xFBF4]={ @@ -123337,7 +126467,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x06C8 }, + specials={ "isolated", 0x626, 0x6C8 }, unicodeslot=0xFBF4, }, [0xFBF5]={ @@ -123345,7 +126475,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x06C8 }, + specials={ "final", 0x626, 0x6C8 }, unicodeslot=0xFBF5, }, [0xFBF6]={ @@ -123353,7 +126483,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x06D0 }, + specials={ "isolated", 0x626, 0x6D0 }, unicodeslot=0xFBF6, }, [0xFBF7]={ @@ -123361,7 +126491,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x06D0 }, + specials={ "final", 0x626, 0x6D0 }, unicodeslot=0xFBF7, }, [0xFBF8]={ @@ -123369,7 +126499,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x06D0 }, + specials={ "initial", 0x626, 0x6D0 }, unicodeslot=0xFBF8, }, [0xFBF9]={ @@ -123377,7 +126507,7 @@ characters.data={ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x0649 }, + specials={ "isolated", 0x626, 0x649 }, unicodeslot=0xFBF9, }, [0xFBFA]={ @@ -123385,7 +126515,7 @@ characters.data={ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0649 }, + specials={ "final", 0x626, 0x649 }, unicodeslot=0xFBFA, }, [0xFBFB]={ @@ -123393,7 +126523,7 @@ characters.data={ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x0649 }, + specials={ "initial", 0x626, 0x649 }, unicodeslot=0xFBFB, }, [0xFBFC]={ @@ -123401,7 +126531,7 @@ characters.data={ description="ARABIC LETTER FARSI YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x06CC }, + specials={ "isolated", 0x6CC }, unicodeslot=0xFBFC, }, [0xFBFD]={ @@ -123409,7 +126539,7 @@ characters.data={ description="ARABIC LETTER FARSI YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x06CC }, + specials={ "final", 0x6CC }, unicodeslot=0xFBFD, }, [0xFBFE]={ @@ -123417,7 +126547,7 @@ characters.data={ description="ARABIC LETTER FARSI YEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x06CC }, + specials={ "initial", 0x6CC }, unicodeslot=0xFBFE, }, [0xFBFF]={ @@ -123425,7 +126555,7 @@ characters.data={ description="ARABIC LETTER FARSI YEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x06CC }, + specials={ "medial", 0x6CC }, unicodeslot=0xFBFF, }, [0xFC00]={ @@ -123433,7 +126563,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x062C }, + specials={ "isolated", 0x626, 0x62C }, unicodeslot=0xFC00, }, [0xFC01]={ @@ -123441,7 +126571,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x062D }, + specials={ "isolated", 0x626, 0x62D }, unicodeslot=0xFC01, }, [0xFC02]={ @@ -123449,7 +126579,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x0645 }, + specials={ "isolated", 0x626, 0x645 }, unicodeslot=0xFC02, }, [0xFC03]={ @@ -123457,7 +126587,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x0649 }, + specials={ "isolated", 0x626, 0x649 }, unicodeslot=0xFC03, }, [0xFC04]={ @@ -123465,7 +126595,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0626, 0x064A }, + specials={ "isolated", 0x626, 0x64A }, unicodeslot=0xFC04, }, [0xFC05]={ @@ -123473,7 +126603,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x062C }, + specials={ "isolated", 0x628, 0x62C }, unicodeslot=0xFC05, }, [0xFC06]={ @@ -123481,7 +126611,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x062D }, + specials={ "isolated", 0x628, 0x62D }, unicodeslot=0xFC06, }, [0xFC07]={ @@ -123489,7 +126619,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x062E }, + specials={ "isolated", 0x628, 0x62E }, unicodeslot=0xFC07, }, [0xFC08]={ @@ -123498,7 +126628,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x0645 }, + specials={ "isolated", 0x628, 0x645 }, unicodeslot=0xFC08, }, [0xFC09]={ @@ -123506,7 +126636,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x0649 }, + specials={ "isolated", 0x628, 0x649 }, unicodeslot=0xFC09, }, [0xFC0A]={ @@ -123514,7 +126644,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628, 0x064A }, + specials={ "isolated", 0x628, 0x64A }, unicodeslot=0xFC0A, }, [0xFC0B]={ @@ -123523,7 +126653,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x062C }, + specials={ "isolated", 0x62A, 0x62C }, unicodeslot=0xFC0B, }, [0xFC0C]={ @@ -123532,7 +126662,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x062D }, + specials={ "isolated", 0x62A, 0x62D }, unicodeslot=0xFC0C, }, [0xFC0D]={ @@ -123540,7 +126670,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x062E }, + specials={ "isolated", 0x62A, 0x62E }, unicodeslot=0xFC0D, }, [0xFC0E]={ @@ -123549,7 +126679,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x0645 }, + specials={ "isolated", 0x62A, 0x645 }, unicodeslot=0xFC0E, }, [0xFC0F]={ @@ -123557,7 +126687,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x0649 }, + specials={ "isolated", 0x62A, 0x649 }, unicodeslot=0xFC0F, }, [0xFC10]={ @@ -123565,7 +126695,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A, 0x064A }, + specials={ "isolated", 0x62A, 0x64A }, unicodeslot=0xFC10, }, [0xFC11]={ @@ -123573,7 +126703,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062B, 0x062C }, + specials={ "isolated", 0x62B, 0x62C }, unicodeslot=0xFC11, }, [0xFC12]={ @@ -123581,7 +126711,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062B, 0x0645 }, + specials={ "isolated", 0x62B, 0x645 }, unicodeslot=0xFC12, }, [0xFC13]={ @@ -123589,7 +126719,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062B, 0x0649 }, + specials={ "isolated", 0x62B, 0x649 }, unicodeslot=0xFC13, }, [0xFC14]={ @@ -123597,7 +126727,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062B, 0x064A }, + specials={ "isolated", 0x62B, 0x64A }, unicodeslot=0xFC14, }, [0xFC15]={ @@ -123605,7 +126735,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062C, 0x062D }, + specials={ "isolated", 0x62C, 0x62D }, unicodeslot=0xFC15, }, [0xFC16]={ @@ -123613,7 +126743,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062C, 0x0645 }, + specials={ "isolated", 0x62C, 0x645 }, unicodeslot=0xFC16, }, [0xFC17]={ @@ -123621,7 +126751,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062D, 0x062C }, + specials={ "isolated", 0x62D, 0x62C }, unicodeslot=0xFC17, }, [0xFC18]={ @@ -123629,7 +126759,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062D, 0x0645 }, + specials={ "isolated", 0x62D, 0x645 }, unicodeslot=0xFC18, }, [0xFC19]={ @@ -123637,7 +126767,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E, 0x062C }, + specials={ "isolated", 0x62E, 0x62C }, unicodeslot=0xFC19, }, [0xFC1A]={ @@ -123645,7 +126775,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E, 0x062D }, + specials={ "isolated", 0x62E, 0x62D }, unicodeslot=0xFC1A, }, [0xFC1B]={ @@ -123653,7 +126783,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E, 0x0645 }, + specials={ "isolated", 0x62E, 0x645 }, unicodeslot=0xFC1B, }, [0xFC1C]={ @@ -123661,7 +126791,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x062C }, + specials={ "isolated", 0x633, 0x62C }, unicodeslot=0xFC1C, }, [0xFC1D]={ @@ -123669,7 +126799,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x062D }, + specials={ "isolated", 0x633, 0x62D }, unicodeslot=0xFC1D, }, [0xFC1E]={ @@ -123677,7 +126807,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x062E }, + specials={ "isolated", 0x633, 0x62E }, unicodeslot=0xFC1E, }, [0xFC1F]={ @@ -123685,7 +126815,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x0645 }, + specials={ "isolated", 0x633, 0x645 }, unicodeslot=0xFC1F, }, [0xFC20]={ @@ -123693,7 +126823,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x062D }, + specials={ "isolated", 0x635, 0x62D }, unicodeslot=0xFC20, }, [0xFC21]={ @@ -123701,7 +126831,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0645 }, + specials={ "isolated", 0x635, 0x645 }, unicodeslot=0xFC21, }, [0xFC22]={ @@ -123709,7 +126839,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x062C }, + specials={ "isolated", 0x636, 0x62C }, unicodeslot=0xFC22, }, [0xFC23]={ @@ -123717,7 +126847,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x062D }, + specials={ "isolated", 0x636, 0x62D }, unicodeslot=0xFC23, }, [0xFC24]={ @@ -123725,7 +126855,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x062E }, + specials={ "isolated", 0x636, 0x62E }, unicodeslot=0xFC24, }, [0xFC25]={ @@ -123733,7 +126863,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x0645 }, + specials={ "isolated", 0x636, 0x645 }, unicodeslot=0xFC25, }, [0xFC26]={ @@ -123741,7 +126871,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0637, 0x062D }, + specials={ "isolated", 0x637, 0x62D }, unicodeslot=0xFC26, }, [0xFC27]={ @@ -123749,7 +126879,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0637, 0x0645 }, + specials={ "isolated", 0x637, 0x645 }, unicodeslot=0xFC27, }, [0xFC28]={ @@ -123757,7 +126887,7 @@ characters.data={ description="ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0638, 0x0645 }, + specials={ "isolated", 0x638, 0x645 }, unicodeslot=0xFC28, }, [0xFC29]={ @@ -123765,7 +126895,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639, 0x062C }, + specials={ "isolated", 0x639, 0x62C }, unicodeslot=0xFC29, }, [0xFC2A]={ @@ -123773,7 +126903,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639, 0x0645 }, + specials={ "isolated", 0x639, 0x645 }, unicodeslot=0xFC2A, }, [0xFC2B]={ @@ -123781,7 +126911,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x063A, 0x062C }, + specials={ "isolated", 0x63A, 0x62C }, unicodeslot=0xFC2B, }, [0xFC2C]={ @@ -123789,7 +126919,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x063A, 0x0645 }, + specials={ "isolated", 0x63A, 0x645 }, unicodeslot=0xFC2C, }, [0xFC2D]={ @@ -123797,7 +126927,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x062C }, + specials={ "isolated", 0x641, 0x62C }, unicodeslot=0xFC2D, }, [0xFC2E]={ @@ -123805,7 +126935,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x062D }, + specials={ "isolated", 0x641, 0x62D }, unicodeslot=0xFC2E, }, [0xFC2F]={ @@ -123813,7 +126943,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x062E }, + specials={ "isolated", 0x641, 0x62E }, unicodeslot=0xFC2F, }, [0xFC30]={ @@ -123821,7 +126951,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x0645 }, + specials={ "isolated", 0x641, 0x645 }, unicodeslot=0xFC30, }, [0xFC31]={ @@ -123829,7 +126959,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x0649 }, + specials={ "isolated", 0x641, 0x649 }, unicodeslot=0xFC31, }, [0xFC32]={ @@ -123837,7 +126967,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641, 0x064A }, + specials={ "isolated", 0x641, 0x64A }, unicodeslot=0xFC32, }, [0xFC33]={ @@ -123845,7 +126975,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642, 0x062D }, + specials={ "isolated", 0x642, 0x62D }, unicodeslot=0xFC33, }, [0xFC34]={ @@ -123853,7 +126983,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642, 0x0645 }, + specials={ "isolated", 0x642, 0x645 }, unicodeslot=0xFC34, }, [0xFC35]={ @@ -123861,7 +126991,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642, 0x0649 }, + specials={ "isolated", 0x642, 0x649 }, unicodeslot=0xFC35, }, [0xFC36]={ @@ -123869,7 +126999,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642, 0x064A }, + specials={ "isolated", 0x642, 0x64A }, unicodeslot=0xFC36, }, [0xFC37]={ @@ -123877,7 +127007,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x0627 }, + specials={ "isolated", 0x643, 0x627 }, unicodeslot=0xFC37, }, [0xFC38]={ @@ -123885,7 +127015,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x062C }, + specials={ "isolated", 0x643, 0x62C }, unicodeslot=0xFC38, }, [0xFC39]={ @@ -123893,7 +127023,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x062D }, + specials={ "isolated", 0x643, 0x62D }, unicodeslot=0xFC39, }, [0xFC3A]={ @@ -123901,7 +127031,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x062E }, + specials={ "isolated", 0x643, 0x62E }, unicodeslot=0xFC3A, }, [0xFC3B]={ @@ -123909,7 +127039,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH LAM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x0644 }, + specials={ "isolated", 0x643, 0x644 }, unicodeslot=0xFC3B, }, [0xFC3C]={ @@ -123917,7 +127047,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x0645 }, + specials={ "isolated", 0x643, 0x645 }, unicodeslot=0xFC3C, }, [0xFC3D]={ @@ -123925,7 +127055,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x0649 }, + specials={ "isolated", 0x643, 0x649 }, unicodeslot=0xFC3D, }, [0xFC3E]={ @@ -123933,7 +127063,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643, 0x064A }, + specials={ "isolated", 0x643, 0x64A }, unicodeslot=0xFC3E, }, [0xFC3F]={ @@ -123941,7 +127071,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x062C }, + specials={ "isolated", 0x644, 0x62C }, unicodeslot=0xFC3F, }, [0xFC40]={ @@ -123949,7 +127079,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x062D }, + specials={ "isolated", 0x644, 0x62D }, unicodeslot=0xFC40, }, [0xFC41]={ @@ -123957,7 +127087,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x062E }, + specials={ "isolated", 0x644, 0x62E }, unicodeslot=0xFC41, }, [0xFC42]={ @@ -123965,7 +127095,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0645 }, + specials={ "isolated", 0x644, 0x645 }, unicodeslot=0xFC42, }, [0xFC43]={ @@ -123973,7 +127103,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0649 }, + specials={ "isolated", 0x644, 0x649 }, unicodeslot=0xFC43, }, [0xFC44]={ @@ -123981,7 +127111,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x064A }, + specials={ "isolated", 0x644, 0x64A }, unicodeslot=0xFC44, }, [0xFC45]={ @@ -123989,7 +127119,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x062C }, + specials={ "isolated", 0x645, 0x62C }, unicodeslot=0xFC45, }, [0xFC46]={ @@ -123997,7 +127127,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x062D }, + specials={ "isolated", 0x645, 0x62D }, unicodeslot=0xFC46, }, [0xFC47]={ @@ -124005,7 +127135,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x062E }, + specials={ "isolated", 0x645, 0x62E }, unicodeslot=0xFC47, }, [0xFC48]={ @@ -124014,7 +127144,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x0645 }, + specials={ "isolated", 0x645, 0x645 }, unicodeslot=0xFC48, }, [0xFC49]={ @@ -124022,7 +127152,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x0649 }, + specials={ "isolated", 0x645, 0x649 }, unicodeslot=0xFC49, }, [0xFC4A]={ @@ -124030,7 +127160,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x064A }, + specials={ "isolated", 0x645, 0x64A }, unicodeslot=0xFC4A, }, [0xFC4B]={ @@ -124039,7 +127169,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x062C }, + specials={ "isolated", 0x646, 0x62C }, unicodeslot=0xFC4B, }, [0xFC4C]={ @@ -124047,7 +127177,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x062D }, + specials={ "isolated", 0x646, 0x62D }, unicodeslot=0xFC4C, }, [0xFC4D]={ @@ -124055,7 +127185,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x062E }, + specials={ "isolated", 0x646, 0x62E }, unicodeslot=0xFC4D, }, [0xFC4E]={ @@ -124064,7 +127194,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x0645 }, + specials={ "isolated", 0x646, 0x645 }, unicodeslot=0xFC4E, }, [0xFC4F]={ @@ -124072,7 +127202,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x0649 }, + specials={ "isolated", 0x646, 0x649 }, unicodeslot=0xFC4F, }, [0xFC50]={ @@ -124080,7 +127210,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646, 0x064A }, + specials={ "isolated", 0x646, 0x64A }, unicodeslot=0xFC50, }, [0xFC51]={ @@ -124088,7 +127218,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0647, 0x062C }, + specials={ "isolated", 0x647, 0x62C }, unicodeslot=0xFC51, }, [0xFC52]={ @@ -124096,7 +127226,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0647, 0x0645 }, + specials={ "isolated", 0x647, 0x645 }, unicodeslot=0xFC52, }, [0xFC53]={ @@ -124104,7 +127234,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0647, 0x0649 }, + specials={ "isolated", 0x647, 0x649 }, unicodeslot=0xFC53, }, [0xFC54]={ @@ -124112,7 +127242,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0647, 0x064A }, + specials={ "isolated", 0x647, 0x64A }, unicodeslot=0xFC54, }, [0xFC55]={ @@ -124120,7 +127250,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x062C }, + specials={ "isolated", 0x64A, 0x62C }, unicodeslot=0xFC55, }, [0xFC56]={ @@ -124128,7 +127258,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x062D }, + specials={ "isolated", 0x64A, 0x62D }, unicodeslot=0xFC56, }, [0xFC57]={ @@ -124136,7 +127266,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x062E }, + specials={ "isolated", 0x64A, 0x62E }, unicodeslot=0xFC57, }, [0xFC58]={ @@ -124145,7 +127275,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x0645 }, + specials={ "isolated", 0x64A, 0x645 }, unicodeslot=0xFC58, }, [0xFC59]={ @@ -124153,7 +127283,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x0649 }, + specials={ "isolated", 0x64A, 0x649 }, unicodeslot=0xFC59, }, [0xFC5A]={ @@ -124161,7 +127291,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A, 0x064A }, + specials={ "isolated", 0x64A, 0x64A }, unicodeslot=0xFC5A, }, [0xFC5B]={ @@ -124169,7 +127299,7 @@ characters.data={ description="ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0630, 0x0670 }, + specials={ "isolated", 0x630, 0x670 }, unicodeslot=0xFC5B, }, [0xFC5C]={ @@ -124177,7 +127307,7 @@ characters.data={ description="ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0631, 0x0670 }, + specials={ "isolated", 0x631, 0x670 }, unicodeslot=0xFC5C, }, [0xFC5D]={ @@ -124185,7 +127315,7 @@ characters.data={ description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0649, 0x0670 }, + specials={ "isolated", 0x649, 0x670 }, unicodeslot=0xFC5D, }, [0xFC5E]={ @@ -124194,7 +127324,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064C, 0x0651 }, + specials={ "isolated", 0x20, 0x64C, 0x651 }, unicodeslot=0xFC5E, }, [0xFC5F]={ @@ -124203,7 +127333,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064D, 0x0651 }, + specials={ "isolated", 0x20, 0x64D, 0x651 }, unicodeslot=0xFC5F, }, [0xFC60]={ @@ -124212,7 +127342,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064E, 0x0651 }, + specials={ "isolated", 0x20, 0x64E, 0x651 }, unicodeslot=0xFC60, }, [0xFC61]={ @@ -124221,7 +127351,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064F, 0x0651 }, + specials={ "isolated", 0x20, 0x64F, 0x651 }, unicodeslot=0xFC61, }, [0xFC62]={ @@ -124230,7 +127360,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x0650, 0x0651 }, + specials={ "isolated", 0x20, 0x650, 0x651 }, unicodeslot=0xFC62, }, [0xFC63]={ @@ -124238,7 +127368,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x0651, 0x0670 }, + specials={ "isolated", 0x20, 0x651, 0x670 }, unicodeslot=0xFC63, }, [0xFC64]={ @@ -124246,7 +127376,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0631 }, + specials={ "final", 0x626, 0x631 }, unicodeslot=0xFC64, }, [0xFC65]={ @@ -124254,7 +127384,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0632 }, + specials={ "final", 0x626, 0x632 }, unicodeslot=0xFC65, }, [0xFC66]={ @@ -124262,7 +127392,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0645 }, + specials={ "final", 0x626, 0x645 }, unicodeslot=0xFC66, }, [0xFC67]={ @@ -124270,7 +127400,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0646 }, + specials={ "final", 0x626, 0x646 }, unicodeslot=0xFC67, }, [0xFC68]={ @@ -124278,7 +127408,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x0649 }, + specials={ "final", 0x626, 0x649 }, unicodeslot=0xFC68, }, [0xFC69]={ @@ -124286,7 +127416,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0626, 0x064A }, + specials={ "final", 0x626, 0x64A }, unicodeslot=0xFC69, }, [0xFC6A]={ @@ -124294,7 +127424,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x0631 }, + specials={ "final", 0x628, 0x631 }, unicodeslot=0xFC6A, }, [0xFC6B]={ @@ -124302,7 +127432,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x0632 }, + specials={ "final", 0x628, 0x632 }, unicodeslot=0xFC6B, }, [0xFC6C]={ @@ -124310,7 +127440,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x0645 }, + specials={ "final", 0x628, 0x645 }, unicodeslot=0xFC6C, }, [0xFC6D]={ @@ -124319,7 +127449,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x0646 }, + specials={ "final", 0x628, 0x646 }, unicodeslot=0xFC6D, }, [0xFC6E]={ @@ -124327,7 +127457,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x0649 }, + specials={ "final", 0x628, 0x649 }, unicodeslot=0xFC6E, }, [0xFC6F]={ @@ -124335,7 +127465,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x064A }, + specials={ "final", 0x628, 0x64A }, unicodeslot=0xFC6F, }, [0xFC70]={ @@ -124343,7 +127473,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0631 }, + specials={ "final", 0x62A, 0x631 }, unicodeslot=0xFC70, }, [0xFC71]={ @@ -124351,7 +127481,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0632 }, + specials={ "final", 0x62A, 0x632 }, unicodeslot=0xFC71, }, [0xFC72]={ @@ -124359,7 +127489,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0645 }, + specials={ "final", 0x62A, 0x645 }, unicodeslot=0xFC72, }, [0xFC73]={ @@ -124368,7 +127498,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0646 }, + specials={ "final", 0x62A, 0x646 }, unicodeslot=0xFC73, }, [0xFC74]={ @@ -124376,7 +127506,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0649 }, + specials={ "final", 0x62A, 0x649 }, unicodeslot=0xFC74, }, [0xFC75]={ @@ -124384,7 +127514,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x064A }, + specials={ "final", 0x62A, 0x64A }, unicodeslot=0xFC75, }, [0xFC76]={ @@ -124392,7 +127522,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x0631 }, + specials={ "final", 0x62B, 0x631 }, unicodeslot=0xFC76, }, [0xFC77]={ @@ -124400,7 +127530,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x0632 }, + specials={ "final", 0x62B, 0x632 }, unicodeslot=0xFC77, }, [0xFC78]={ @@ -124408,7 +127538,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x0645 }, + specials={ "final", 0x62B, 0x645 }, unicodeslot=0xFC78, }, [0xFC79]={ @@ -124416,7 +127546,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x0646 }, + specials={ "final", 0x62B, 0x646 }, unicodeslot=0xFC79, }, [0xFC7A]={ @@ -124424,7 +127554,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x0649 }, + specials={ "final", 0x62B, 0x649 }, unicodeslot=0xFC7A, }, [0xFC7B]={ @@ -124432,7 +127562,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B, 0x064A }, + specials={ "final", 0x62B, 0x64A }, unicodeslot=0xFC7B, }, [0xFC7C]={ @@ -124440,7 +127570,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0641, 0x0649 }, + specials={ "final", 0x641, 0x649 }, unicodeslot=0xFC7C, }, [0xFC7D]={ @@ -124448,7 +127578,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0641, 0x064A }, + specials={ "final", 0x641, 0x64A }, unicodeslot=0xFC7D, }, [0xFC7E]={ @@ -124456,7 +127586,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642, 0x0649 }, + specials={ "final", 0x642, 0x649 }, unicodeslot=0xFC7E, }, [0xFC7F]={ @@ -124464,7 +127594,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642, 0x064A }, + specials={ "final", 0x642, 0x64A }, unicodeslot=0xFC7F, }, [0xFC80]={ @@ -124472,7 +127602,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0627 }, + specials={ "final", 0x643, 0x627 }, unicodeslot=0xFC80, }, [0xFC81]={ @@ -124480,7 +127610,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH LAM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0644 }, + specials={ "final", 0x643, 0x644 }, unicodeslot=0xFC81, }, [0xFC82]={ @@ -124488,7 +127618,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0645 }, + specials={ "final", 0x643, 0x645 }, unicodeslot=0xFC82, }, [0xFC83]={ @@ -124496,7 +127626,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0649 }, + specials={ "final", 0x643, 0x649 }, unicodeslot=0xFC83, }, [0xFC84]={ @@ -124504,7 +127634,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x064A }, + specials={ "final", 0x643, 0x64A }, unicodeslot=0xFC84, }, [0xFC85]={ @@ -124512,7 +127642,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0645 }, + specials={ "final", 0x644, 0x645 }, unicodeslot=0xFC85, }, [0xFC86]={ @@ -124520,7 +127650,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0649 }, + specials={ "final", 0x644, 0x649 }, unicodeslot=0xFC86, }, [0xFC87]={ @@ -124528,7 +127658,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x064A }, + specials={ "final", 0x644, 0x64A }, unicodeslot=0xFC87, }, [0xFC88]={ @@ -124536,7 +127666,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x0627 }, + specials={ "final", 0x645, 0x627 }, unicodeslot=0xFC88, }, [0xFC89]={ @@ -124544,7 +127674,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x0645 }, + specials={ "final", 0x645, 0x645 }, unicodeslot=0xFC89, }, [0xFC8A]={ @@ -124552,7 +127682,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0631 }, + specials={ "final", 0x646, 0x631 }, unicodeslot=0xFC8A, }, [0xFC8B]={ @@ -124560,7 +127690,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0632 }, + specials={ "final", 0x646, 0x632 }, unicodeslot=0xFC8B, }, [0xFC8C]={ @@ -124568,7 +127698,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0645 }, + specials={ "final", 0x646, 0x645 }, unicodeslot=0xFC8C, }, [0xFC8D]={ @@ -124577,7 +127707,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0646 }, + specials={ "final", 0x646, 0x646 }, unicodeslot=0xFC8D, }, [0xFC8E]={ @@ -124585,7 +127715,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0649 }, + specials={ "final", 0x646, 0x649 }, unicodeslot=0xFC8E, }, [0xFC8F]={ @@ -124593,7 +127723,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x064A }, + specials={ "final", 0x646, 0x64A }, unicodeslot=0xFC8F, }, [0xFC90]={ @@ -124601,7 +127731,7 @@ characters.data={ description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0649, 0x0670 }, + specials={ "final", 0x649, 0x670 }, unicodeslot=0xFC90, }, [0xFC91]={ @@ -124609,7 +127739,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0631 }, + specials={ "final", 0x64A, 0x631 }, unicodeslot=0xFC91, }, [0xFC92]={ @@ -124617,7 +127747,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0632 }, + specials={ "final", 0x64A, 0x632 }, unicodeslot=0xFC92, }, [0xFC93]={ @@ -124625,7 +127755,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0645 }, + specials={ "final", 0x64A, 0x645 }, unicodeslot=0xFC93, }, [0xFC94]={ @@ -124634,7 +127764,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0646 }, + specials={ "final", 0x64A, 0x646 }, unicodeslot=0xFC94, }, [0xFC95]={ @@ -124642,7 +127772,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0649 }, + specials={ "final", 0x64A, 0x649 }, unicodeslot=0xFC95, }, [0xFC96]={ @@ -124650,7 +127780,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x064A }, + specials={ "final", 0x64A, 0x64A }, unicodeslot=0xFC96, }, [0xFC97]={ @@ -124658,7 +127788,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x062C }, + specials={ "initial", 0x626, 0x62C }, unicodeslot=0xFC97, }, [0xFC98]={ @@ -124666,7 +127796,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x062D }, + specials={ "initial", 0x626, 0x62D }, unicodeslot=0xFC98, }, [0xFC99]={ @@ -124674,7 +127804,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x062E }, + specials={ "initial", 0x626, 0x62E }, unicodeslot=0xFC99, }, [0xFC9A]={ @@ -124682,7 +127812,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x0645 }, + specials={ "initial", 0x626, 0x645 }, unicodeslot=0xFC9A, }, [0xFC9B]={ @@ -124690,7 +127820,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0626, 0x0647 }, + specials={ "initial", 0x626, 0x647 }, unicodeslot=0xFC9B, }, [0xFC9C]={ @@ -124698,7 +127828,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628, 0x062C }, + specials={ "initial", 0x628, 0x62C }, unicodeslot=0xFC9C, }, [0xFC9D]={ @@ -124706,7 +127836,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628, 0x062D }, + specials={ "initial", 0x628, 0x62D }, unicodeslot=0xFC9D, }, [0xFC9E]={ @@ -124714,7 +127844,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628, 0x062E }, + specials={ "initial", 0x628, 0x62E }, unicodeslot=0xFC9E, }, [0xFC9F]={ @@ -124723,7 +127853,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628, 0x0645 }, + specials={ "initial", 0x628, 0x645 }, unicodeslot=0xFC9F, }, [0xFCA0]={ @@ -124731,7 +127861,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628, 0x0647 }, + specials={ "initial", 0x628, 0x647 }, unicodeslot=0xFCA0, }, [0xFCA1]={ @@ -124740,7 +127870,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062C }, + specials={ "initial", 0x62A, 0x62C }, unicodeslot=0xFCA1, }, [0xFCA2]={ @@ -124749,7 +127879,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062D }, + specials={ "initial", 0x62A, 0x62D }, unicodeslot=0xFCA2, }, [0xFCA3]={ @@ -124757,7 +127887,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062E }, + specials={ "initial", 0x62A, 0x62E }, unicodeslot=0xFCA3, }, [0xFCA4]={ @@ -124766,7 +127896,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x0645 }, + specials={ "initial", 0x62A, 0x645 }, unicodeslot=0xFCA4, }, [0xFCA5]={ @@ -124774,7 +127904,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x0647 }, + specials={ "initial", 0x62A, 0x647 }, unicodeslot=0xFCA5, }, [0xFCA6]={ @@ -124782,7 +127912,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062B, 0x0645 }, + specials={ "initial", 0x62B, 0x645 }, unicodeslot=0xFCA6, }, [0xFCA7]={ @@ -124790,7 +127920,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062C, 0x062D }, + specials={ "initial", 0x62C, 0x62D }, unicodeslot=0xFCA7, }, [0xFCA8]={ @@ -124798,7 +127928,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062C, 0x0645 }, + specials={ "initial", 0x62C, 0x645 }, unicodeslot=0xFCA8, }, [0xFCA9]={ @@ -124806,7 +127936,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062D, 0x062C }, + specials={ "initial", 0x62D, 0x62C }, unicodeslot=0xFCA9, }, [0xFCAA]={ @@ -124814,7 +127944,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062D, 0x0645 }, + specials={ "initial", 0x62D, 0x645 }, unicodeslot=0xFCAA, }, [0xFCAB]={ @@ -124822,7 +127952,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062E, 0x062C }, + specials={ "initial", 0x62E, 0x62C }, unicodeslot=0xFCAB, }, [0xFCAC]={ @@ -124830,7 +127960,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062E, 0x0645 }, + specials={ "initial", 0x62E, 0x645 }, unicodeslot=0xFCAC, }, [0xFCAD]={ @@ -124838,7 +127968,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x062C }, + specials={ "initial", 0x633, 0x62C }, unicodeslot=0xFCAD, }, [0xFCAE]={ @@ -124846,7 +127976,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x062D }, + specials={ "initial", 0x633, 0x62D }, unicodeslot=0xFCAE, }, [0xFCAF]={ @@ -124854,7 +127984,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x062E }, + specials={ "initial", 0x633, 0x62E }, unicodeslot=0xFCAF, }, [0xFCB0]={ @@ -124862,7 +127992,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x0645 }, + specials={ "initial", 0x633, 0x645 }, unicodeslot=0xFCB0, }, [0xFCB1]={ @@ -124870,7 +128000,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635, 0x062D }, + specials={ "initial", 0x635, 0x62D }, unicodeslot=0xFCB1, }, [0xFCB2]={ @@ -124878,7 +128008,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635, 0x062E }, + specials={ "initial", 0x635, 0x62E }, unicodeslot=0xFCB2, }, [0xFCB3]={ @@ -124886,7 +128016,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635, 0x0645 }, + specials={ "initial", 0x635, 0x645 }, unicodeslot=0xFCB3, }, [0xFCB4]={ @@ -124894,7 +128024,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636, 0x062C }, + specials={ "initial", 0x636, 0x62C }, unicodeslot=0xFCB4, }, [0xFCB5]={ @@ -124902,7 +128032,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636, 0x062D }, + specials={ "initial", 0x636, 0x62D }, unicodeslot=0xFCB5, }, [0xFCB6]={ @@ -124910,7 +128040,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636, 0x062E }, + specials={ "initial", 0x636, 0x62E }, unicodeslot=0xFCB6, }, [0xFCB7]={ @@ -124918,7 +128048,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636, 0x0645 }, + specials={ "initial", 0x636, 0x645 }, unicodeslot=0xFCB7, }, [0xFCB8]={ @@ -124926,7 +128056,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0637, 0x062D }, + specials={ "initial", 0x637, 0x62D }, unicodeslot=0xFCB8, }, [0xFCB9]={ @@ -124934,7 +128064,7 @@ characters.data={ description="ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0638, 0x0645 }, + specials={ "initial", 0x638, 0x645 }, unicodeslot=0xFCB9, }, [0xFCBA]={ @@ -124942,7 +128072,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0639, 0x062C }, + specials={ "initial", 0x639, 0x62C }, unicodeslot=0xFCBA, }, [0xFCBB]={ @@ -124950,7 +128080,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0639, 0x0645 }, + specials={ "initial", 0x639, 0x645 }, unicodeslot=0xFCBB, }, [0xFCBC]={ @@ -124958,7 +128088,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x063A, 0x062C }, + specials={ "initial", 0x63A, 0x62C }, unicodeslot=0xFCBC, }, [0xFCBD]={ @@ -124966,7 +128096,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x063A, 0x0645 }, + specials={ "initial", 0x63A, 0x645 }, unicodeslot=0xFCBD, }, [0xFCBE]={ @@ -124974,7 +128104,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641, 0x062C }, + specials={ "initial", 0x641, 0x62C }, unicodeslot=0xFCBE, }, [0xFCBF]={ @@ -124982,7 +128112,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641, 0x062D }, + specials={ "initial", 0x641, 0x62D }, unicodeslot=0xFCBF, }, [0xFCC0]={ @@ -124990,7 +128120,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641, 0x062E }, + specials={ "initial", 0x641, 0x62E }, unicodeslot=0xFCC0, }, [0xFCC1]={ @@ -124998,7 +128128,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641, 0x0645 }, + specials={ "initial", 0x641, 0x645 }, unicodeslot=0xFCC1, }, [0xFCC2]={ @@ -125006,7 +128136,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0642, 0x062D }, + specials={ "initial", 0x642, 0x62D }, unicodeslot=0xFCC2, }, [0xFCC3]={ @@ -125014,7 +128144,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0642, 0x0645 }, + specials={ "initial", 0x642, 0x645 }, unicodeslot=0xFCC3, }, [0xFCC4]={ @@ -125022,7 +128152,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x062C }, + specials={ "initial", 0x643, 0x62C }, unicodeslot=0xFCC4, }, [0xFCC5]={ @@ -125030,7 +128160,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x062D }, + specials={ "initial", 0x643, 0x62D }, unicodeslot=0xFCC5, }, [0xFCC6]={ @@ -125038,7 +128168,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x062E }, + specials={ "initial", 0x643, 0x62E }, unicodeslot=0xFCC6, }, [0xFCC7]={ @@ -125046,7 +128176,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH LAM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x0644 }, + specials={ "initial", 0x643, 0x644 }, unicodeslot=0xFCC7, }, [0xFCC8]={ @@ -125054,7 +128184,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x0645 }, + specials={ "initial", 0x643, 0x645 }, unicodeslot=0xFCC8, }, [0xFCC9]={ @@ -125063,7 +128193,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062C }, + specials={ "initial", 0x644, 0x62C }, unicodeslot=0xFCC9, }, [0xFCCA]={ @@ -125072,7 +128202,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062D }, + specials={ "initial", 0x644, 0x62D }, unicodeslot=0xFCCA, }, [0xFCCB]={ @@ -125081,7 +128211,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062E }, + specials={ "initial", 0x644, 0x62E }, unicodeslot=0xFCCB, }, [0xFCCC]={ @@ -125090,7 +128220,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x0645 }, + specials={ "initial", 0x644, 0x645 }, unicodeslot=0xFCCC, }, [0xFCCD]={ @@ -125098,7 +128228,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x0647 }, + specials={ "initial", 0x644, 0x647 }, unicodeslot=0xFCCD, }, [0xFCCE]={ @@ -125106,7 +128236,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062C }, + specials={ "initial", 0x645, 0x62C }, unicodeslot=0xFCCE, }, [0xFCCF]={ @@ -125114,7 +128244,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062D }, + specials={ "initial", 0x645, 0x62D }, unicodeslot=0xFCCF, }, [0xFCD0]={ @@ -125122,7 +128252,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062E }, + specials={ "initial", 0x645, 0x62E }, unicodeslot=0xFCD0, }, [0xFCD1]={ @@ -125131,7 +128261,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x0645 }, + specials={ "initial", 0x645, 0x645 }, unicodeslot=0xFCD1, }, [0xFCD2]={ @@ -125140,7 +128270,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062C }, + specials={ "initial", 0x646, 0x62C }, unicodeslot=0xFCD2, }, [0xFCD3]={ @@ -125148,7 +128278,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062D }, + specials={ "initial", 0x646, 0x62D }, unicodeslot=0xFCD3, }, [0xFCD4]={ @@ -125156,7 +128286,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062E }, + specials={ "initial", 0x646, 0x62E }, unicodeslot=0xFCD4, }, [0xFCD5]={ @@ -125165,7 +128295,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x0645 }, + specials={ "initial", 0x646, 0x645 }, unicodeslot=0xFCD5, }, [0xFCD6]={ @@ -125173,7 +128303,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x0647 }, + specials={ "initial", 0x646, 0x647 }, unicodeslot=0xFCD6, }, [0xFCD7]={ @@ -125181,7 +128311,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647, 0x062C }, + specials={ "initial", 0x647, 0x62C }, unicodeslot=0xFCD7, }, [0xFCD8]={ @@ -125189,7 +128319,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647, 0x0645 }, + specials={ "initial", 0x647, 0x645 }, unicodeslot=0xFCD8, }, [0xFCD9]={ @@ -125197,7 +128327,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647, 0x0670 }, + specials={ "initial", 0x647, 0x670 }, unicodeslot=0xFCD9, }, [0xFCDA]={ @@ -125205,7 +128335,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x062C }, + specials={ "initial", 0x64A, 0x62C }, unicodeslot=0xFCDA, }, [0xFCDB]={ @@ -125213,7 +128343,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x062D }, + specials={ "initial", 0x64A, 0x62D }, unicodeslot=0xFCDB, }, [0xFCDC]={ @@ -125221,7 +128351,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x062E }, + specials={ "initial", 0x64A, 0x62E }, unicodeslot=0xFCDC, }, [0xFCDD]={ @@ -125230,7 +128360,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x0645 }, + specials={ "initial", 0x64A, 0x645 }, unicodeslot=0xFCDD, }, [0xFCDE]={ @@ -125238,7 +128368,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x0647 }, + specials={ "initial", 0x64A, 0x647 }, unicodeslot=0xFCDE, }, [0xFCDF]={ @@ -125246,7 +128376,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0626, 0x0645 }, + specials={ "medial", 0x626, 0x645 }, unicodeslot=0xFCDF, }, [0xFCE0]={ @@ -125254,7 +128384,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0626, 0x0647 }, + specials={ "medial", 0x626, 0x647 }, unicodeslot=0xFCE0, }, [0xFCE1]={ @@ -125262,7 +128392,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0628, 0x0645 }, + specials={ "medial", 0x628, 0x645 }, unicodeslot=0xFCE1, }, [0xFCE2]={ @@ -125270,7 +128400,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0628, 0x0647 }, + specials={ "medial", 0x628, 0x647 }, unicodeslot=0xFCE2, }, [0xFCE3]={ @@ -125278,7 +128408,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062A, 0x0645 }, + specials={ "medial", 0x62A, 0x645 }, unicodeslot=0xFCE3, }, [0xFCE4]={ @@ -125286,7 +128416,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062A, 0x0647 }, + specials={ "medial", 0x62A, 0x647 }, unicodeslot=0xFCE4, }, [0xFCE5]={ @@ -125294,7 +128424,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062B, 0x0645 }, + specials={ "medial", 0x62B, 0x645 }, unicodeslot=0xFCE5, }, [0xFCE6]={ @@ -125302,7 +128432,7 @@ characters.data={ description="ARABIC LIGATURE THEH WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062B, 0x0647 }, + specials={ "medial", 0x62B, 0x647 }, unicodeslot=0xFCE6, }, [0xFCE7]={ @@ -125310,7 +128440,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633, 0x0645 }, + specials={ "medial", 0x633, 0x645 }, unicodeslot=0xFCE7, }, [0xFCE8]={ @@ -125318,7 +128448,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633, 0x0647 }, + specials={ "medial", 0x633, 0x647 }, unicodeslot=0xFCE8, }, [0xFCE9]={ @@ -125326,7 +128456,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634, 0x0645 }, + specials={ "medial", 0x634, 0x645 }, unicodeslot=0xFCE9, }, [0xFCEA]={ @@ -125334,7 +128464,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634, 0x0647 }, + specials={ "medial", 0x634, 0x647 }, unicodeslot=0xFCEA, }, [0xFCEB]={ @@ -125342,7 +128472,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH LAM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0643, 0x0644 }, + specials={ "medial", 0x643, 0x644 }, unicodeslot=0xFCEB, }, [0xFCEC]={ @@ -125350,7 +128480,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0643, 0x0645 }, + specials={ "medial", 0x643, 0x645 }, unicodeslot=0xFCEC, }, [0xFCED]={ @@ -125358,7 +128488,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0644, 0x0645 }, + specials={ "medial", 0x644, 0x645 }, unicodeslot=0xFCED, }, [0xFCEE]={ @@ -125366,7 +128496,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0646, 0x0645 }, + specials={ "medial", 0x646, 0x645 }, unicodeslot=0xFCEE, }, [0xFCEF]={ @@ -125374,7 +128504,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0646, 0x0647 }, + specials={ "medial", 0x646, 0x647 }, unicodeslot=0xFCEF, }, [0xFCF0]={ @@ -125382,7 +128512,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x064A, 0x0645 }, + specials={ "medial", 0x64A, 0x645 }, unicodeslot=0xFCF0, }, [0xFCF1]={ @@ -125390,7 +128520,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x064A, 0x0647 }, + specials={ "medial", 0x64A, 0x647 }, unicodeslot=0xFCF1, }, [0xFCF2]={ @@ -125398,7 +128528,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x064E, 0x0651 }, + specials={ "medial", 0x640, 0x64E, 0x651 }, unicodeslot=0xFCF2, }, [0xFCF3]={ @@ -125406,7 +128536,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x064F, 0x0651 }, + specials={ "medial", 0x640, 0x64F, 0x651 }, unicodeslot=0xFCF3, }, [0xFCF4]={ @@ -125414,7 +128544,7 @@ characters.data={ description="ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x0650, 0x0651 }, + specials={ "medial", 0x640, 0x650, 0x651 }, unicodeslot=0xFCF4, }, [0xFCF5]={ @@ -125422,7 +128552,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0637, 0x0649 }, + specials={ "isolated", 0x637, 0x649 }, unicodeslot=0xFCF5, }, [0xFCF6]={ @@ -125430,7 +128560,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0637, 0x064A }, + specials={ "isolated", 0x637, 0x64A }, unicodeslot=0xFCF6, }, [0xFCF7]={ @@ -125438,7 +128568,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639, 0x0649 }, + specials={ "isolated", 0x639, 0x649 }, unicodeslot=0xFCF7, }, [0xFCF8]={ @@ -125446,7 +128576,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639, 0x064A }, + specials={ "isolated", 0x639, 0x64A }, unicodeslot=0xFCF8, }, [0xFCF9]={ @@ -125454,7 +128584,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x063A, 0x0649 }, + specials={ "isolated", 0x63A, 0x649 }, unicodeslot=0xFCF9, }, [0xFCFA]={ @@ -125462,7 +128592,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x063A, 0x064A }, + specials={ "isolated", 0x63A, 0x64A }, unicodeslot=0xFCFA, }, [0xFCFB]={ @@ -125470,7 +128600,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x0649 }, + specials={ "isolated", 0x633, 0x649 }, unicodeslot=0xFCFB, }, [0xFCFC]={ @@ -125478,7 +128608,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x064A }, + specials={ "isolated", 0x633, 0x64A }, unicodeslot=0xFCFC, }, [0xFCFD]={ @@ -125486,7 +128616,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x0649 }, + specials={ "isolated", 0x634, 0x649 }, unicodeslot=0xFCFD, }, [0xFCFE]={ @@ -125494,7 +128624,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x064A }, + specials={ "isolated", 0x634, 0x64A }, unicodeslot=0xFCFE, }, [0xFCFF]={ @@ -125502,7 +128632,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062D, 0x0649 }, + specials={ "isolated", 0x62D, 0x649 }, unicodeslot=0xFCFF, }, [0xFD00]={ @@ -125510,7 +128640,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062D, 0x064A }, + specials={ "isolated", 0x62D, 0x64A }, unicodeslot=0xFD00, }, [0xFD01]={ @@ -125518,7 +128648,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062C, 0x0649 }, + specials={ "isolated", 0x62C, 0x649 }, unicodeslot=0xFD01, }, [0xFD02]={ @@ -125526,7 +128656,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062C, 0x064A }, + specials={ "isolated", 0x62C, 0x64A }, unicodeslot=0xFD02, }, [0xFD03]={ @@ -125534,7 +128664,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E, 0x0649 }, + specials={ "isolated", 0x62E, 0x649 }, unicodeslot=0xFD03, }, [0xFD04]={ @@ -125542,7 +128672,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E, 0x064A }, + specials={ "isolated", 0x62E, 0x64A }, unicodeslot=0xFD04, }, [0xFD05]={ @@ -125550,7 +128680,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0649 }, + specials={ "isolated", 0x635, 0x649 }, unicodeslot=0xFD05, }, [0xFD06]={ @@ -125558,7 +128688,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x064A }, + specials={ "isolated", 0x635, 0x64A }, unicodeslot=0xFD06, }, [0xFD07]={ @@ -125566,7 +128696,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x0649 }, + specials={ "isolated", 0x636, 0x649 }, unicodeslot=0xFD07, }, [0xFD08]={ @@ -125574,7 +128704,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x064A }, + specials={ "isolated", 0x636, 0x64A }, unicodeslot=0xFD08, }, [0xFD09]={ @@ -125582,7 +128712,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x062C }, + specials={ "isolated", 0x634, 0x62C }, unicodeslot=0xFD09, }, [0xFD0A]={ @@ -125590,7 +128720,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x062D }, + specials={ "isolated", 0x634, 0x62D }, unicodeslot=0xFD0A, }, [0xFD0B]={ @@ -125598,7 +128728,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x062E }, + specials={ "isolated", 0x634, 0x62E }, unicodeslot=0xFD0B, }, [0xFD0C]={ @@ -125606,7 +128736,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x0645 }, + specials={ "isolated", 0x634, 0x645 }, unicodeslot=0xFD0C, }, [0xFD0D]={ @@ -125614,7 +128744,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634, 0x0631 }, + specials={ "isolated", 0x634, 0x631 }, unicodeslot=0xFD0D, }, [0xFD0E]={ @@ -125622,7 +128752,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH REH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633, 0x0631 }, + specials={ "isolated", 0x633, 0x631 }, unicodeslot=0xFD0E, }, [0xFD0F]={ @@ -125630,7 +128760,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH REH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0631 }, + specials={ "isolated", 0x635, 0x631 }, unicodeslot=0xFD0F, }, [0xFD10]={ @@ -125638,7 +128768,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH REH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636, 0x0631 }, + specials={ "isolated", 0x636, 0x631 }, unicodeslot=0xFD10, }, [0xFD11]={ @@ -125646,7 +128776,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0637, 0x0649 }, + specials={ "final", 0x637, 0x649 }, unicodeslot=0xFD11, }, [0xFD12]={ @@ -125654,7 +128784,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0637, 0x064A }, + specials={ "final", 0x637, 0x64A }, unicodeslot=0xFD12, }, [0xFD13]={ @@ -125662,7 +128792,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x0649 }, + specials={ "final", 0x639, 0x649 }, unicodeslot=0xFD13, }, [0xFD14]={ @@ -125670,7 +128800,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x064A }, + specials={ "final", 0x639, 0x64A }, unicodeslot=0xFD14, }, [0xFD15]={ @@ -125678,7 +128808,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A, 0x0649 }, + specials={ "final", 0x63A, 0x649 }, unicodeslot=0xFD15, }, [0xFD16]={ @@ -125686,7 +128816,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A, 0x064A }, + specials={ "final", 0x63A, 0x64A }, unicodeslot=0xFD16, }, [0xFD17]={ @@ -125694,7 +128824,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x0649 }, + specials={ "final", 0x633, 0x649 }, unicodeslot=0xFD17, }, [0xFD18]={ @@ -125702,7 +128832,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x064A }, + specials={ "final", 0x633, 0x64A }, unicodeslot=0xFD18, }, [0xFD19]={ @@ -125710,7 +128840,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x0649 }, + specials={ "final", 0x634, 0x649 }, unicodeslot=0xFD19, }, [0xFD1A]={ @@ -125718,7 +128848,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x064A }, + specials={ "final", 0x634, 0x64A }, unicodeslot=0xFD1A, }, [0xFD1B]={ @@ -125726,7 +128856,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D, 0x0649 }, + specials={ "final", 0x62D, 0x649 }, unicodeslot=0xFD1B, }, [0xFD1C]={ @@ -125734,7 +128864,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D, 0x064A }, + specials={ "final", 0x62D, 0x64A }, unicodeslot=0xFD1C, }, [0xFD1D]={ @@ -125742,7 +128872,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x0649 }, + specials={ "final", 0x62C, 0x649 }, unicodeslot=0xFD1D, }, [0xFD1E]={ @@ -125750,7 +128880,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x064A }, + specials={ "final", 0x62C, 0x64A }, unicodeslot=0xFD1E, }, [0xFD1F]={ @@ -125758,7 +128888,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062E, 0x0649 }, + specials={ "final", 0x62E, 0x649 }, unicodeslot=0xFD1F, }, [0xFD20]={ @@ -125766,7 +128896,7 @@ characters.data={ description="ARABIC LIGATURE KHAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062E, 0x064A }, + specials={ "final", 0x62E, 0x64A }, unicodeslot=0xFD20, }, [0xFD21]={ @@ -125774,7 +128904,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x0649 }, + specials={ "final", 0x635, 0x649 }, unicodeslot=0xFD21, }, [0xFD22]={ @@ -125782,7 +128912,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x064A }, + specials={ "final", 0x635, 0x64A }, unicodeslot=0xFD22, }, [0xFD23]={ @@ -125790,7 +128920,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x0649 }, + specials={ "final", 0x636, 0x649 }, unicodeslot=0xFD23, }, [0xFD24]={ @@ -125798,7 +128928,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x064A }, + specials={ "final", 0x636, 0x64A }, unicodeslot=0xFD24, }, [0xFD25]={ @@ -125806,7 +128936,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062C }, + specials={ "final", 0x634, 0x62C }, unicodeslot=0xFD25, }, [0xFD26]={ @@ -125814,7 +128944,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062D }, + specials={ "final", 0x634, 0x62D }, unicodeslot=0xFD26, }, [0xFD27]={ @@ -125822,7 +128952,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062E }, + specials={ "final", 0x634, 0x62E }, unicodeslot=0xFD27, }, [0xFD28]={ @@ -125830,7 +128960,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x0645 }, + specials={ "final", 0x634, 0x645 }, unicodeslot=0xFD28, }, [0xFD29]={ @@ -125838,7 +128968,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x0631 }, + specials={ "final", 0x634, 0x631 }, unicodeslot=0xFD29, }, [0xFD2A]={ @@ -125846,7 +128976,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x0631 }, + specials={ "final", 0x633, 0x631 }, unicodeslot=0xFD2A, }, [0xFD2B]={ @@ -125854,7 +128984,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x0631 }, + specials={ "final", 0x635, 0x631 }, unicodeslot=0xFD2B, }, [0xFD2C]={ @@ -125862,7 +128992,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x0631 }, + specials={ "final", 0x636, 0x631 }, unicodeslot=0xFD2C, }, [0xFD2D]={ @@ -125870,7 +129000,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x062C }, + specials={ "initial", 0x634, 0x62C }, unicodeslot=0xFD2D, }, [0xFD2E]={ @@ -125878,7 +129008,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x062D }, + specials={ "initial", 0x634, 0x62D }, unicodeslot=0xFD2E, }, [0xFD2F]={ @@ -125886,7 +129016,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x062E }, + specials={ "initial", 0x634, 0x62E }, unicodeslot=0xFD2F, }, [0xFD30]={ @@ -125894,7 +129024,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x0645 }, + specials={ "initial", 0x634, 0x645 }, unicodeslot=0xFD30, }, [0xFD31]={ @@ -125902,7 +129032,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x0647 }, + specials={ "initial", 0x633, 0x647 }, unicodeslot=0xFD31, }, [0xFD32]={ @@ -125910,7 +129040,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x0647 }, + specials={ "initial", 0x634, 0x647 }, unicodeslot=0xFD32, }, [0xFD33]={ @@ -125918,7 +129048,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0637, 0x0645 }, + specials={ "initial", 0x637, 0x645 }, unicodeslot=0xFD33, }, [0xFD34]={ @@ -125926,7 +129056,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633, 0x062C }, + specials={ "medial", 0x633, 0x62C }, unicodeslot=0xFD34, }, [0xFD35]={ @@ -125934,7 +129064,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633, 0x062D }, + specials={ "medial", 0x633, 0x62D }, unicodeslot=0xFD35, }, [0xFD36]={ @@ -125942,7 +129072,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633, 0x062E }, + specials={ "medial", 0x633, 0x62E }, unicodeslot=0xFD36, }, [0xFD37]={ @@ -125950,7 +129080,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634, 0x062C }, + specials={ "medial", 0x634, 0x62C }, unicodeslot=0xFD37, }, [0xFD38]={ @@ -125958,7 +129088,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634, 0x062D }, + specials={ "medial", 0x634, 0x62D }, unicodeslot=0xFD38, }, [0xFD39]={ @@ -125966,7 +129096,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634, 0x062E }, + specials={ "medial", 0x634, 0x62E }, unicodeslot=0xFD39, }, [0xFD3A]={ @@ -125974,7 +129104,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0637, 0x0645 }, + specials={ "medial", 0x637, 0x645 }, unicodeslot=0xFD3A, }, [0xFD3B]={ @@ -125982,7 +129112,7 @@ characters.data={ description="ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0638, 0x0645 }, + specials={ "medial", 0x638, 0x645 }, unicodeslot=0xFD3B, }, [0xFD3C]={ @@ -125990,7 +129120,7 @@ characters.data={ description="ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0627, 0x064B }, + specials={ "final", 0x627, 0x64B }, unicodeslot=0xFD3C, }, [0xFD3D]={ @@ -125998,7 +129128,7 @@ characters.data={ description="ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0627, 0x064B }, + specials={ "isolated", 0x627, 0x64B }, unicodeslot=0xFD3D, }, [0xFD3E]={ @@ -126006,7 +129136,7 @@ characters.data={ category="ps", description="ORNATE LEFT PARENTHESIS", direction="on", - linebreak="op", + linebreak="cl", unicodeslot=0xFD3E, }, [0xFD3F]={ @@ -126014,7 +129144,7 @@ characters.data={ category="pe", description="ORNATE RIGHT PARENTHESIS", direction="on", - linebreak="cl", + linebreak="op", unicodeslot=0xFD3F, }, [0xFD50]={ @@ -126022,7 +129152,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062C, 0x0645 }, + specials={ "initial", 0x62A, 0x62C, 0x645 }, unicodeslot=0xFD50, }, [0xFD51]={ @@ -126030,7 +129160,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x062D, 0x062C }, + specials={ "final", 0x62A, 0x62D, 0x62C }, unicodeslot=0xFD51, }, [0xFD52]={ @@ -126038,7 +129168,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062D, 0x062C }, + specials={ "initial", 0x62A, 0x62D, 0x62C }, unicodeslot=0xFD52, }, [0xFD53]={ @@ -126046,7 +129176,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062D, 0x0645 }, + specials={ "initial", 0x62A, 0x62D, 0x645 }, unicodeslot=0xFD53, }, [0xFD54]={ @@ -126054,7 +129184,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x062E, 0x0645 }, + specials={ "initial", 0x62A, 0x62E, 0x645 }, unicodeslot=0xFD54, }, [0xFD55]={ @@ -126062,7 +129192,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x0645, 0x062C }, + specials={ "initial", 0x62A, 0x645, 0x62C }, unicodeslot=0xFD55, }, [0xFD56]={ @@ -126070,7 +129200,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x0645, 0x062D }, + specials={ "initial", 0x62A, 0x645, 0x62D }, unicodeslot=0xFD56, }, [0xFD57]={ @@ -126078,7 +129208,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A, 0x0645, 0x062E }, + specials={ "initial", 0x62A, 0x645, 0x62E }, unicodeslot=0xFD57, }, [0xFD58]={ @@ -126086,7 +129216,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x0645, 0x062D }, + specials={ "final", 0x62C, 0x645, 0x62D }, unicodeslot=0xFD58, }, [0xFD59]={ @@ -126094,7 +129224,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062C, 0x0645, 0x062D }, + specials={ "initial", 0x62C, 0x645, 0x62D }, unicodeslot=0xFD59, }, [0xFD5A]={ @@ -126102,7 +129232,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D, 0x0645, 0x064A }, + specials={ "final", 0x62D, 0x645, 0x64A }, unicodeslot=0xFD5A, }, [0xFD5B]={ @@ -126110,7 +129240,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D, 0x0645, 0x0649 }, + specials={ "final", 0x62D, 0x645, 0x649 }, unicodeslot=0xFD5B, }, [0xFD5C]={ @@ -126118,7 +129248,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x062D, 0x062C }, + specials={ "initial", 0x633, 0x62D, 0x62C }, unicodeslot=0xFD5C, }, [0xFD5D]={ @@ -126126,7 +129256,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x062C, 0x062D }, + specials={ "initial", 0x633, 0x62C, 0x62D }, unicodeslot=0xFD5D, }, [0xFD5E]={ @@ -126134,7 +129264,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x062C, 0x0649 }, + specials={ "final", 0x633, 0x62C, 0x649 }, unicodeslot=0xFD5E, }, [0xFD5F]={ @@ -126142,7 +129272,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x0645, 0x062D }, + specials={ "final", 0x633, 0x645, 0x62D }, unicodeslot=0xFD5F, }, [0xFD60]={ @@ -126150,7 +129280,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x0645, 0x062D }, + specials={ "initial", 0x633, 0x645, 0x62D }, unicodeslot=0xFD60, }, [0xFD61]={ @@ -126158,7 +129288,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x0645, 0x062C }, + specials={ "initial", 0x633, 0x645, 0x62C }, unicodeslot=0xFD61, }, [0xFD62]={ @@ -126166,7 +129296,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x0645, 0x0645 }, + specials={ "final", 0x633, 0x645, 0x645 }, unicodeslot=0xFD62, }, [0xFD63]={ @@ -126174,7 +129304,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633, 0x0645, 0x0645 }, + specials={ "initial", 0x633, 0x645, 0x645 }, unicodeslot=0xFD63, }, [0xFD64]={ @@ -126182,7 +129312,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x062D, 0x062D }, + specials={ "final", 0x635, 0x62D, 0x62D }, unicodeslot=0xFD64, }, [0xFD65]={ @@ -126190,7 +129320,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635, 0x062D, 0x062D }, + specials={ "initial", 0x635, 0x62D, 0x62D }, unicodeslot=0xFD65, }, [0xFD66]={ @@ -126198,7 +129328,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x0645, 0x0645 }, + specials={ "final", 0x635, 0x645, 0x645 }, unicodeslot=0xFD66, }, [0xFD67]={ @@ -126206,7 +129336,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062D, 0x0645 }, + specials={ "final", 0x634, 0x62D, 0x645 }, unicodeslot=0xFD67, }, [0xFD68]={ @@ -126214,7 +129344,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x062D, 0x0645 }, + specials={ "initial", 0x634, 0x62D, 0x645 }, unicodeslot=0xFD68, }, [0xFD69]={ @@ -126222,7 +129352,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062C, 0x064A }, + specials={ "final", 0x634, 0x62C, 0x64A }, unicodeslot=0xFD69, }, [0xFD6A]={ @@ -126230,7 +129360,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x0645, 0x062E }, + specials={ "final", 0x634, 0x645, 0x62E }, unicodeslot=0xFD6A, }, [0xFD6B]={ @@ -126238,7 +129368,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x0645, 0x062E }, + specials={ "initial", 0x634, 0x645, 0x62E }, unicodeslot=0xFD6B, }, [0xFD6C]={ @@ -126246,7 +129376,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x0645, 0x0645 }, + specials={ "final", 0x634, 0x645, 0x645 }, unicodeslot=0xFD6C, }, [0xFD6D]={ @@ -126254,7 +129384,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634, 0x0645, 0x0645 }, + specials={ "initial", 0x634, 0x645, 0x645 }, unicodeslot=0xFD6D, }, [0xFD6E]={ @@ -126262,7 +129392,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x062D, 0x0649 }, + specials={ "final", 0x636, 0x62D, 0x649 }, unicodeslot=0xFD6E, }, [0xFD6F]={ @@ -126270,7 +129400,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x062E, 0x0645 }, + specials={ "final", 0x636, 0x62E, 0x645 }, unicodeslot=0xFD6F, }, [0xFD70]={ @@ -126278,7 +129408,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636, 0x062E, 0x0645 }, + specials={ "initial", 0x636, 0x62E, 0x645 }, unicodeslot=0xFD70, }, [0xFD71]={ @@ -126286,7 +129416,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0637, 0x0645, 0x062D }, + specials={ "final", 0x637, 0x645, 0x62D }, unicodeslot=0xFD71, }, [0xFD72]={ @@ -126294,7 +129424,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0637, 0x0645, 0x062D }, + specials={ "initial", 0x637, 0x645, 0x62D }, unicodeslot=0xFD72, }, [0xFD73]={ @@ -126302,7 +129432,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0637, 0x0645, 0x0645 }, + specials={ "initial", 0x637, 0x645, 0x645 }, unicodeslot=0xFD73, }, [0xFD74]={ @@ -126310,7 +129440,7 @@ characters.data={ description="ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0637, 0x0645, 0x064A }, + specials={ "final", 0x637, 0x645, 0x64A }, unicodeslot=0xFD74, }, [0xFD75]={ @@ -126318,7 +129448,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x062C, 0x0645 }, + specials={ "final", 0x639, 0x62C, 0x645 }, unicodeslot=0xFD75, }, [0xFD76]={ @@ -126326,7 +129456,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x0645, 0x0645 }, + specials={ "final", 0x639, 0x645, 0x645 }, unicodeslot=0xFD76, }, [0xFD77]={ @@ -126334,7 +129464,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0639, 0x0645, 0x0645 }, + specials={ "initial", 0x639, 0x645, 0x645 }, unicodeslot=0xFD77, }, [0xFD78]={ @@ -126342,7 +129472,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x0645, 0x0649 }, + specials={ "final", 0x639, 0x645, 0x649 }, unicodeslot=0xFD78, }, [0xFD79]={ @@ -126350,7 +129480,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A, 0x0645, 0x0645 }, + specials={ "final", 0x63A, 0x645, 0x645 }, unicodeslot=0xFD79, }, [0xFD7A]={ @@ -126358,7 +129488,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A, 0x0645, 0x064A }, + specials={ "final", 0x63A, 0x645, 0x64A }, unicodeslot=0xFD7A, }, [0xFD7B]={ @@ -126366,7 +129496,7 @@ characters.data={ description="ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A, 0x0645, 0x0649 }, + specials={ "final", 0x63A, 0x645, 0x649 }, unicodeslot=0xFD7B, }, [0xFD7C]={ @@ -126374,7 +129504,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0641, 0x062E, 0x0645 }, + specials={ "final", 0x641, 0x62E, 0x645 }, unicodeslot=0xFD7C, }, [0xFD7D]={ @@ -126382,7 +129512,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641, 0x062E, 0x0645 }, + specials={ "initial", 0x641, 0x62E, 0x645 }, unicodeslot=0xFD7D, }, [0xFD7E]={ @@ -126390,7 +129520,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642, 0x0645, 0x062D }, + specials={ "final", 0x642, 0x645, 0x62D }, unicodeslot=0xFD7E, }, [0xFD7F]={ @@ -126398,7 +129528,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642, 0x0645, 0x0645 }, + specials={ "final", 0x642, 0x645, 0x645 }, unicodeslot=0xFD7F, }, [0xFD80]={ @@ -126406,7 +129536,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062D, 0x0645 }, + specials={ "final", 0x644, 0x62D, 0x645 }, unicodeslot=0xFD80, }, [0xFD81]={ @@ -126414,7 +129544,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062D, 0x064A }, + specials={ "final", 0x644, 0x62D, 0x64A }, unicodeslot=0xFD81, }, [0xFD82]={ @@ -126422,7 +129552,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062D, 0x0649 }, + specials={ "final", 0x644, 0x62D, 0x649 }, unicodeslot=0xFD82, }, [0xFD83]={ @@ -126430,7 +129560,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062C, 0x062C }, + specials={ "initial", 0x644, 0x62C, 0x62C }, unicodeslot=0xFD83, }, [0xFD84]={ @@ -126438,7 +129568,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062C, 0x062C }, + specials={ "final", 0x644, 0x62C, 0x62C }, unicodeslot=0xFD84, }, [0xFD85]={ @@ -126446,7 +129576,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062E, 0x0645 }, + specials={ "final", 0x644, 0x62E, 0x645 }, unicodeslot=0xFD85, }, [0xFD86]={ @@ -126454,7 +129584,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062E, 0x0645 }, + specials={ "initial", 0x644, 0x62E, 0x645 }, unicodeslot=0xFD86, }, [0xFD87]={ @@ -126462,7 +129592,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0645, 0x062D }, + specials={ "final", 0x644, 0x645, 0x62D }, unicodeslot=0xFD87, }, [0xFD88]={ @@ -126471,7 +129601,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x0645, 0x062D }, + specials={ "initial", 0x644, 0x645, 0x62D }, unicodeslot=0xFD88, }, [0xFD89]={ @@ -126479,7 +129609,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062D, 0x062C }, + specials={ "initial", 0x645, 0x62D, 0x62C }, unicodeslot=0xFD89, }, [0xFD8A]={ @@ -126487,7 +129617,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062D, 0x0645 }, + specials={ "initial", 0x645, 0x62D, 0x645 }, unicodeslot=0xFD8A, }, [0xFD8B]={ @@ -126495,7 +129625,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x062D, 0x064A }, + specials={ "final", 0x645, 0x62D, 0x64A }, unicodeslot=0xFD8B, }, [0xFD8C]={ @@ -126503,7 +129633,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062C, 0x062D }, + specials={ "initial", 0x645, 0x62C, 0x62D }, unicodeslot=0xFD8C, }, [0xFD8D]={ @@ -126511,7 +129641,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062C, 0x0645 }, + specials={ "initial", 0x645, 0x62C, 0x645 }, unicodeslot=0xFD8D, }, [0xFD8E]={ @@ -126519,7 +129649,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062E, 0x062C }, + specials={ "initial", 0x645, 0x62E, 0x62C }, unicodeslot=0xFD8E, }, [0xFD8F]={ @@ -126527,7 +129657,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062E, 0x0645 }, + specials={ "initial", 0x645, 0x62E, 0x645 }, unicodeslot=0xFD8F, }, [0xFD92]={ @@ -126535,7 +129665,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645, 0x062C, 0x062E }, + specials={ "initial", 0x645, 0x62C, 0x62E }, unicodeslot=0xFD92, }, [0xFD93]={ @@ -126543,7 +129673,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647, 0x0645, 0x062C }, + specials={ "initial", 0x647, 0x645, 0x62C }, unicodeslot=0xFD93, }, [0xFD94]={ @@ -126551,7 +129681,7 @@ characters.data={ description="ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647, 0x0645, 0x0645 }, + specials={ "initial", 0x647, 0x645, 0x645 }, unicodeslot=0xFD94, }, [0xFD95]={ @@ -126559,7 +129689,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062D, 0x0645 }, + specials={ "initial", 0x646, 0x62D, 0x645 }, unicodeslot=0xFD95, }, [0xFD96]={ @@ -126567,7 +129697,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062D, 0x0649 }, + specials={ "final", 0x646, 0x62D, 0x649 }, unicodeslot=0xFD96, }, [0xFD97]={ @@ -126575,7 +129705,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062C, 0x0645 }, + specials={ "final", 0x646, 0x62C, 0x645 }, unicodeslot=0xFD97, }, [0xFD98]={ @@ -126583,7 +129713,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062C, 0x0645 }, + specials={ "initial", 0x646, 0x62C, 0x645 }, unicodeslot=0xFD98, }, [0xFD99]={ @@ -126591,7 +129721,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062C, 0x0649 }, + specials={ "final", 0x646, 0x62C, 0x649 }, unicodeslot=0xFD99, }, [0xFD9A]={ @@ -126599,7 +129729,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0645, 0x064A }, + specials={ "final", 0x646, 0x645, 0x64A }, unicodeslot=0xFD9A, }, [0xFD9B]={ @@ -126607,7 +129737,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x0645, 0x0649 }, + specials={ "final", 0x646, 0x645, 0x649 }, unicodeslot=0xFD9B, }, [0xFD9C]={ @@ -126615,7 +129745,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0645, 0x0645 }, + specials={ "final", 0x64A, 0x645, 0x645 }, unicodeslot=0xFD9C, }, [0xFD9D]={ @@ -126623,7 +129753,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A, 0x0645, 0x0645 }, + specials={ "initial", 0x64A, 0x645, 0x645 }, unicodeslot=0xFD9D, }, [0xFD9E]={ @@ -126631,7 +129761,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x062E, 0x064A }, + specials={ "final", 0x628, 0x62E, 0x64A }, unicodeslot=0xFD9E, }, [0xFD9F]={ @@ -126639,7 +129769,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x062C, 0x064A }, + specials={ "final", 0x62A, 0x62C, 0x64A }, unicodeslot=0xFD9F, }, [0xFDA0]={ @@ -126647,7 +129777,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x062C, 0x0649 }, + specials={ "final", 0x62A, 0x62C, 0x649 }, unicodeslot=0xFDA0, }, [0xFDA1]={ @@ -126655,7 +129785,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x062E, 0x064A }, + specials={ "final", 0x62A, 0x62E, 0x64A }, unicodeslot=0xFDA1, }, [0xFDA2]={ @@ -126663,7 +129793,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x062E, 0x0649 }, + specials={ "final", 0x62A, 0x62E, 0x649 }, unicodeslot=0xFDA2, }, [0xFDA3]={ @@ -126671,7 +129801,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0645, 0x064A }, + specials={ "final", 0x62A, 0x645, 0x64A }, unicodeslot=0xFDA3, }, [0xFDA4]={ @@ -126679,7 +129809,7 @@ characters.data={ description="ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A, 0x0645, 0x0649 }, + specials={ "final", 0x62A, 0x645, 0x649 }, unicodeslot=0xFDA4, }, [0xFDA5]={ @@ -126687,7 +129817,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x0645, 0x064A }, + specials={ "final", 0x62C, 0x645, 0x64A }, unicodeslot=0xFDA5, }, [0xFDA6]={ @@ -126695,7 +129825,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x062D, 0x0649 }, + specials={ "final", 0x62C, 0x62D, 0x649 }, unicodeslot=0xFDA6, }, [0xFDA7]={ @@ -126703,7 +129833,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x0645, 0x0649 }, + specials={ "final", 0x62C, 0x645, 0x649 }, unicodeslot=0xFDA7, }, [0xFDA8]={ @@ -126711,7 +129841,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x062E, 0x0649 }, + specials={ "final", 0x633, 0x62E, 0x649 }, unicodeslot=0xFDA8, }, [0xFDA9]={ @@ -126719,7 +129849,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635, 0x062D, 0x064A }, + specials={ "final", 0x635, 0x62D, 0x64A }, unicodeslot=0xFDA9, }, [0xFDAA]={ @@ -126727,7 +129857,7 @@ characters.data={ description="ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634, 0x062D, 0x064A }, + specials={ "final", 0x634, 0x62D, 0x64A }, unicodeslot=0xFDAA, }, [0xFDAB]={ @@ -126735,7 +129865,7 @@ characters.data={ description="ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636, 0x062D, 0x064A }, + specials={ "final", 0x636, 0x62D, 0x64A }, unicodeslot=0xFDAB, }, [0xFDAC]={ @@ -126743,7 +129873,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062C, 0x064A }, + specials={ "final", 0x644, 0x62C, 0x64A }, unicodeslot=0xFDAC, }, [0xFDAD]={ @@ -126751,7 +129881,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0645, 0x064A }, + specials={ "final", 0x644, 0x645, 0x64A }, unicodeslot=0xFDAD, }, [0xFDAE]={ @@ -126759,7 +129889,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x062D, 0x064A }, + specials={ "final", 0x64A, 0x62D, 0x64A }, unicodeslot=0xFDAE, }, [0xFDAF]={ @@ -126767,7 +129897,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x062C, 0x064A }, + specials={ "final", 0x64A, 0x62C, 0x64A }, unicodeslot=0xFDAF, }, [0xFDB0]={ @@ -126775,7 +129905,7 @@ characters.data={ description="ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A, 0x0645, 0x064A }, + specials={ "final", 0x64A, 0x645, 0x64A }, unicodeslot=0xFDB0, }, [0xFDB1]={ @@ -126783,7 +129913,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x0645, 0x064A }, + specials={ "final", 0x645, 0x645, 0x64A }, unicodeslot=0xFDB1, }, [0xFDB2]={ @@ -126791,7 +129921,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642, 0x0645, 0x064A }, + specials={ "final", 0x642, 0x645, 0x64A }, unicodeslot=0xFDB2, }, [0xFDB3]={ @@ -126799,7 +129929,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062D, 0x064A }, + specials={ "final", 0x646, 0x62D, 0x64A }, unicodeslot=0xFDB3, }, [0xFDB4]={ @@ -126807,7 +129937,7 @@ characters.data={ description="ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0642, 0x0645, 0x062D }, + specials={ "initial", 0x642, 0x645, 0x62D }, unicodeslot=0xFDB4, }, [0xFDB5]={ @@ -126815,7 +129945,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062D, 0x0645 }, + specials={ "initial", 0x644, 0x62D, 0x645 }, unicodeslot=0xFDB5, }, [0xFDB6]={ @@ -126823,7 +129953,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639, 0x0645, 0x064A }, + specials={ "final", 0x639, 0x645, 0x64A }, unicodeslot=0xFDB6, }, [0xFDB7]={ @@ -126831,7 +129961,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0645, 0x064A }, + specials={ "final", 0x643, 0x645, 0x64A }, unicodeslot=0xFDB7, }, [0xFDB8]={ @@ -126839,7 +129969,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646, 0x062C, 0x062D }, + specials={ "initial", 0x646, 0x62C, 0x62D }, unicodeslot=0xFDB8, }, [0xFDB9]={ @@ -126847,7 +129977,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x062E, 0x064A }, + specials={ "final", 0x645, 0x62E, 0x64A }, unicodeslot=0xFDB9, }, [0xFDBA]={ @@ -126855,7 +129985,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644, 0x062C, 0x0645 }, + specials={ "initial", 0x644, 0x62C, 0x645 }, unicodeslot=0xFDBA, }, [0xFDBB]={ @@ -126863,7 +129993,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643, 0x0645, 0x0645 }, + specials={ "final", 0x643, 0x645, 0x645 }, unicodeslot=0xFDBB, }, [0xFDBC]={ @@ -126871,7 +130001,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x062C, 0x0645 }, + specials={ "final", 0x644, 0x62C, 0x645 }, unicodeslot=0xFDBC, }, [0xFDBD]={ @@ -126879,7 +130009,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062C, 0x062D }, + specials={ "final", 0x646, 0x62C, 0x62D }, unicodeslot=0xFDBD, }, [0xFDBE]={ @@ -126887,7 +130017,7 @@ characters.data={ description="ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C, 0x062D, 0x064A }, + specials={ "final", 0x62C, 0x62D, 0x64A }, unicodeslot=0xFDBE, }, [0xFDBF]={ @@ -126895,7 +130025,7 @@ characters.data={ description="ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D, 0x062C, 0x064A }, + specials={ "final", 0x62D, 0x62C, 0x64A }, unicodeslot=0xFDBF, }, [0xFDC0]={ @@ -126903,7 +130033,7 @@ characters.data={ description="ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645, 0x062C, 0x064A }, + specials={ "final", 0x645, 0x62C, 0x64A }, unicodeslot=0xFDC0, }, [0xFDC1]={ @@ -126911,7 +130041,7 @@ characters.data={ description="ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0641, 0x0645, 0x064A }, + specials={ "final", 0x641, 0x645, 0x64A }, unicodeslot=0xFDC1, }, [0xFDC2]={ @@ -126919,7 +130049,7 @@ characters.data={ description="ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628, 0x062D, 0x064A }, + specials={ "final", 0x628, 0x62D, 0x64A }, unicodeslot=0xFDC2, }, [0xFDC3]={ @@ -126927,7 +130057,7 @@ characters.data={ description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643, 0x0645, 0x0645 }, + specials={ "initial", 0x643, 0x645, 0x645 }, unicodeslot=0xFDC3, }, [0xFDC4]={ @@ -126935,7 +130065,7 @@ characters.data={ description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0639, 0x062C, 0x0645 }, + specials={ "initial", 0x639, 0x62C, 0x645 }, unicodeslot=0xFDC4, }, [0xFDC5]={ @@ -126943,7 +130073,7 @@ characters.data={ description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635, 0x0645, 0x0645 }, + specials={ "initial", 0x635, 0x645, 0x645 }, unicodeslot=0xFDC5, }, [0xFDC6]={ @@ -126951,7 +130081,7 @@ characters.data={ description="ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633, 0x062E, 0x064A }, + specials={ "final", 0x633, 0x62E, 0x64A }, unicodeslot=0xFDC6, }, [0xFDC7]={ @@ -126959,7 +130089,7 @@ characters.data={ description="ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646, 0x062C, 0x064A }, + specials={ "final", 0x646, 0x62C, 0x64A }, unicodeslot=0xFDC7, }, [0xFDF0]={ @@ -126967,7 +130097,7 @@ characters.data={ description="ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0644, 0x06D2 }, + specials={ "isolated", 0x635, 0x644, 0x6D2 }, unicodeslot=0xFDF0, }, [0xFDF1]={ @@ -126975,7 +130105,7 @@ characters.data={ description="ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642, 0x0644, 0x06D2 }, + specials={ "isolated", 0x642, 0x644, 0x6D2 }, unicodeslot=0xFDF1, }, [0xFDF2]={ @@ -126984,7 +130114,7 @@ characters.data={ description="ARABIC LIGATURE ALLAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0627, 0x0644, 0x0644, 0x0647 }, + specials={ "isolated", 0x627, 0x644, 0x644, 0x647 }, unicodeslot=0xFDF2, }, [0xFDF3]={ @@ -126992,7 +130122,7 @@ characters.data={ description="ARABIC LIGATURE AKBAR ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0627, 0x0643, 0x0628, 0x0631 }, + specials={ "isolated", 0x627, 0x643, 0x628, 0x631 }, unicodeslot=0xFDF3, }, [0xFDF4]={ @@ -127000,7 +130130,7 @@ characters.data={ description="ARABIC LIGATURE MOHAMMAD ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645, 0x062D, 0x0645, 0x062F }, + specials={ "isolated", 0x645, 0x62D, 0x645, 0x62F }, unicodeslot=0xFDF4, }, [0xFDF5]={ @@ -127008,7 +130138,7 @@ characters.data={ description="ARABIC LIGATURE SALAM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0644, 0x0639, 0x0645 }, + specials={ "isolated", 0x635, 0x644, 0x639, 0x645 }, unicodeslot=0xFDF5, }, [0xFDF6]={ @@ -127016,7 +130146,7 @@ characters.data={ description="ARABIC LIGATURE RASOUL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0631, 0x0633, 0x0648, 0x0644 }, + specials={ "isolated", 0x631, 0x633, 0x648, 0x644 }, unicodeslot=0xFDF6, }, [0xFDF7]={ @@ -127024,7 +130154,7 @@ characters.data={ description="ARABIC LIGATURE ALAYHE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639, 0x0644, 0x064A, 0x0647 }, + specials={ "isolated", 0x639, 0x644, 0x64A, 0x647 }, unicodeslot=0xFDF7, }, [0xFDF8]={ @@ -127032,7 +130162,7 @@ characters.data={ description="ARABIC LIGATURE WASALLAM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0648, 0x0633, 0x0644, 0x0645 }, + specials={ "isolated", 0x648, 0x633, 0x644, 0x645 }, unicodeslot=0xFDF8, }, [0xFDF9]={ @@ -127040,7 +130170,7 @@ characters.data={ description="ARABIC LIGATURE SALLA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0644, 0x0649 }, + specials={ "isolated", 0x635, 0x644, 0x649 }, unicodeslot=0xFDF9, }, [0xFDFA]={ @@ -127049,7 +130179,7 @@ characters.data={ description="ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM", direction="al", linebreak="al", - specials={ "isolated", 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645 }, + specials={ "isolated", 0x635, 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64A, 0x647, 0x20, 0x648, 0x633, 0x644, 0x645 }, unicodeslot=0xFDFA, }, [0xFDFB]={ @@ -127057,7 +130187,7 @@ characters.data={ description="ARABIC LIGATURE JALLAJALALOUHOU", direction="al", linebreak="al", - specials={ "isolated", 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647 }, + specials={ "isolated", 0x62C, 0x644, 0x20, 0x62C, 0x644, 0x627, 0x644, 0x647 }, unicodeslot=0xFDFB, }, [0xFDFC]={ @@ -127065,7 +130195,7 @@ characters.data={ description="RIAL SIGN", direction="al", linebreak="po", - specials={ "isolated", 0x0631, 0x06CC, 0x0627, 0x0644 }, + specials={ "isolated", 0x631, 0x6CC, 0x627, 0x644 }, unicodeslot=0xFDFC, }, [0xFDFD]={ @@ -127209,7 +130339,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL COMMA", direction="on", linebreak="is", - specials={ "vertical", 0x002C }, + specials={ "vertical", 0x2C }, unicodeslot=0xFE10, }, [0xFE11]={ @@ -127236,7 +130366,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL COLON", direction="on", linebreak="is", - specials={ "vertical", 0x003A }, + specials={ "vertical", 0x3A }, unicodeslot=0xFE13, }, [0xFE14]={ @@ -127245,7 +130375,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL SEMICOLON", direction="on", linebreak="is", - specials={ "vertical", 0x003B }, + specials={ "vertical", 0x3B }, unicodeslot=0xFE14, }, [0xFE15]={ @@ -127254,7 +130384,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK", direction="on", linebreak="ex", - specials={ "vertical", 0x0021 }, + specials={ "vertical", 0x21 }, unicodeslot=0xFE15, }, [0xFE16]={ @@ -127263,7 +130393,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL QUESTION MARK", direction="on", linebreak="ex", - specials={ "vertical", 0x003F }, + specials={ "vertical", 0x3F }, unicodeslot=0xFE16, }, [0xFE17]={ @@ -127296,6 +130426,7 @@ characters.data={ }, [0xFE20]={ category="mn", + combining=0xE6, description="COMBINING LIGATURE LEFT HALF", direction="nsm", linebreak="cm", @@ -127303,6 +130434,7 @@ characters.data={ }, [0xFE21]={ category="mn", + combining=0xE6, description="COMBINING LIGATURE RIGHT HALF", direction="nsm", linebreak="cm", @@ -127310,6 +130442,7 @@ characters.data={ }, [0xFE22]={ category="mn", + combining=0xE6, description="COMBINING DOUBLE TILDE LEFT HALF", direction="nsm", linebreak="cm", @@ -127317,6 +130450,7 @@ characters.data={ }, [0xFE23]={ category="mn", + combining=0xE6, description="COMBINING DOUBLE TILDE RIGHT HALF", direction="nsm", linebreak="cm", @@ -127324,6 +130458,7 @@ characters.data={ }, [0xFE24]={ category="mn", + combining=0xE6, description="COMBINING MACRON LEFT HALF", direction="nsm", linebreak="cm", @@ -127331,6 +130466,7 @@ characters.data={ }, [0xFE25]={ category="mn", + combining=0xE6, description="COMBINING MACRON RIGHT HALF", direction="nsm", linebreak="cm", @@ -127338,11 +130474,68 @@ characters.data={ }, [0xFE26]={ category="mn", + combining=0xE6, description="COMBINING CONJOINING MACRON", direction="nsm", linebreak="cm", unicodeslot=0xFE26, }, + [0xFE27]={ + category="mn", + combining=0xDC, + description="COMBINING LIGATURE LEFT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE27, + }, + [0xFE28]={ + category="mn", + combining=0xDC, + description="COMBINING LIGATURE RIGHT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE28, + }, + [0xFE29]={ + category="mn", + combining=0xDC, + description="COMBINING TILDE LEFT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE29, + }, + [0xFE2A]={ + category="mn", + combining=0xDC, + description="COMBINING TILDE RIGHT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE2A, + }, + [0xFE2B]={ + category="mn", + combining=0xDC, + description="COMBINING MACRON LEFT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE2B, + }, + [0xFE2C]={ + category="mn", + combining=0xDC, + description="COMBINING MACRON RIGHT HALF BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE2C, + }, + [0xFE2D]={ + category="mn", + combining=0xDC, + description="COMBINING CONJOINING MACRON BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0xFE2D, + }, [0xFE30]={ adobename="twodotleadervertical", category="po", @@ -127380,7 +130573,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL LOW LINE", direction="on", linebreak="id", - specials={ "vertical", 0x005F }, + specials={ "vertical", 0x5F }, unicodeslot=0xFE33, }, [0xFE34]={ @@ -127390,7 +130583,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL WAVY LOW LINE", direction="on", linebreak="id", - specials={ "vertical", 0x005F }, + specials={ "vertical", 0x5F }, unicodeslot=0xFE34, }, [0xFE35]={ @@ -127400,7 +130593,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS", direction="on", linebreak="op", - specials={ "vertical", 0x0028 }, + specials={ "vertical", 0x28 }, unicodeslot=0xFE35, }, [0xFE36]={ @@ -127410,7 +130603,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS", direction="on", linebreak="cl", - specials={ "vertical", 0x0029 }, + specials={ "vertical", 0x29 }, unicodeslot=0xFE36, }, [0xFE37]={ @@ -127422,7 +130615,7 @@ characters.data={ direction="on", linebreak="op", mathfiller="downbracefill", - specials={ "vertical", 0x007B }, + specials={ "vertical", 0x7B }, unicodeslot=0xFE37, }, [0xFE38]={ @@ -127434,7 +130627,7 @@ characters.data={ direction="on", linebreak="cl", mathfiller="upbracefill", - specials={ "vertical", 0x007D }, + specials={ "vertical", 0x7D }, unicodeslot=0xFE38, }, [0xFE39]={ @@ -127579,7 +130772,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET", direction="on", linebreak="op", - specials={ "vertical", 0x005B }, + specials={ "vertical", 0x5B }, unicodeslot=0xFE47, }, [0xFE48]={ @@ -127588,7 +130781,7 @@ characters.data={ description="PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET", direction="on", linebreak="cl", - specials={ "vertical", 0x005D }, + specials={ "vertical", 0x5D }, unicodeslot=0xFE48, }, [0xFE49]={ @@ -127638,7 +130831,7 @@ characters.data={ description="DASHED LOW LINE", direction="on", linebreak="id", - specials={ "compat", 0x005F }, + specials={ "compat", 0x5F }, unicodeslot=0xFE4D, }, [0xFE4E]={ @@ -127648,7 +130841,7 @@ characters.data={ description="CENTRELINE LOW LINE", direction="on", linebreak="id", - specials={ "compat", 0x005F }, + specials={ "compat", 0x5F }, unicodeslot=0xFE4E, }, [0xFE4F]={ @@ -127658,7 +130851,7 @@ characters.data={ description="WAVY LOW LINE", direction="on", linebreak="id", - specials={ "compat", 0x005F }, + specials={ "compat", 0x5F }, unicodeslot=0xFE4F, }, [0xFE50]={ @@ -127668,7 +130861,7 @@ characters.data={ description="SMALL COMMA", direction="cs", linebreak="cl", - specials={ "small", 0x002C }, + specials={ "small", 0x2C }, unicodeslot=0xFE50, }, [0xFE51]={ @@ -127687,7 +130880,7 @@ characters.data={ description="SMALL FULL STOP", direction="cs", linebreak="cl", - specials={ "small", 0x002E }, + specials={ "small", 0x2E }, unicodeslot=0xFE52, }, [0xFE54]={ @@ -127697,7 +130890,7 @@ characters.data={ description="SMALL SEMICOLON", direction="on", linebreak="ns", - specials={ "small", 0x003B }, + specials={ "small", 0x3B }, unicodeslot=0xFE54, }, [0xFE55]={ @@ -127707,7 +130900,7 @@ characters.data={ description="SMALL COLON", direction="cs", linebreak="ns", - specials={ "small", 0x003A }, + specials={ "small", 0x3A }, unicodeslot=0xFE55, }, [0xFE56]={ @@ -127716,7 +130909,7 @@ characters.data={ description="SMALL QUESTION MARK", direction="on", linebreak="ex", - specials={ "small", 0x003F }, + specials={ "small", 0x3F }, unicodeslot=0xFE56, }, [0xFE57]={ @@ -127725,7 +130918,7 @@ characters.data={ description="SMALL EXCLAMATION MARK", direction="on", linebreak="ex", - specials={ "small", 0x0021 }, + specials={ "small", 0x21 }, unicodeslot=0xFE57, }, [0xFE58]={ @@ -127745,8 +130938,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFE5A, + specials={ "small", 0x28 }, textclass="open", - specials={ "small", 0x0028 }, unicodeslot=0xFE59, }, [0xFE5A]={ @@ -127757,8 +130950,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFE59, + specials={ "small", 0x29 }, textclass="close", - specials={ "small", 0x0029 }, unicodeslot=0xFE5A, }, [0xFE5B]={ @@ -127769,8 +130962,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFE5C, + specials={ "small", 0x7B }, textclass="open", - specials={ "small", 0x007B }, unicodeslot=0xFE5B, }, [0xFE5C]={ @@ -127781,8 +130974,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFE5B, + specials={ "small", 0x7D }, textclass="close", - specials={ "small", 0x007D }, unicodeslot=0xFE5C, }, [0xFE5D]={ @@ -127793,8 +130986,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFE5E, - textclass="open", specials={ "small", 0x3014 }, + textclass="open", unicodeslot=0xFE5D, }, [0xFE5E]={ @@ -127805,8 +130998,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFE5D, - textclass="close", specials={ "small", 0x3015 }, + textclass="close", unicodeslot=0xFE5E, }, [0xFE5F]={ @@ -127816,7 +131009,7 @@ characters.data={ description="SMALL NUMBER SIGN", direction="et", linebreak="id", - specials={ "small", 0x0023 }, + specials={ "small", 0x23 }, unicodeslot=0xFE5F, }, [0xFE60]={ @@ -127825,7 +131018,7 @@ characters.data={ description="SMALL AMPERSAND", direction="on", linebreak="id", - specials={ "small", 0x0026 }, + specials={ "small", 0x26 }, unicodeslot=0xFE60, }, [0xFE61]={ @@ -127835,7 +131028,7 @@ characters.data={ description="SMALL ASTERISK", direction="on", linebreak="id", - specials={ "small", 0x002A }, + specials={ "small", 0x2A }, unicodeslot=0xFE61, }, [0xFE62]={ @@ -127845,7 +131038,7 @@ characters.data={ description="SMALL PLUS SIGN", direction="es", linebreak="id", - specials={ "small", 0x002B }, + specials={ "small", 0x2B }, unicodeslot=0xFE62, }, [0xFE63]={ @@ -127855,7 +131048,7 @@ characters.data={ description="SMALL HYPHEN-MINUS", direction="es", linebreak="id", - specials={ "small", 0x002D }, + specials={ "small", 0x2D }, unicodeslot=0xFE63, }, [0xFE64]={ @@ -127866,8 +131059,8 @@ characters.data={ direction="on", linebreak="id", mirror=0xFE65, + specials={ "small", 0x3C }, textclass="open", - specials={ "small", 0x003C }, unicodeslot=0xFE64, }, [0xFE65]={ @@ -127878,8 +131071,8 @@ characters.data={ direction="on", linebreak="id", mirror=0xFE64, + specials={ "small", 0x3E }, textclass="close", - specials={ "small", 0x003E }, unicodeslot=0xFE65, }, [0xFE66]={ @@ -127889,7 +131082,7 @@ characters.data={ description="SMALL EQUALS SIGN", direction="on", linebreak="id", - specials={ "small", 0x003D }, + specials={ "small", 0x3D }, unicodeslot=0xFE66, }, [0xFE68]={ @@ -127898,7 +131091,7 @@ characters.data={ description="SMALL REVERSE SOLIDUS", direction="on", linebreak="id", - specials={ "small", 0x005C }, + specials={ "small", 0x5C }, unicodeslot=0xFE68, }, [0xFE69]={ @@ -127908,7 +131101,7 @@ characters.data={ description="SMALL DOLLAR SIGN", direction="et", linebreak="pr", - specials={ "small", 0x0024 }, + specials={ "small", 0x24 }, unicodeslot=0xFE69, }, [0xFE6A]={ @@ -127918,7 +131111,7 @@ characters.data={ description="SMALL PERCENT SIGN", direction="et", linebreak="po", - specials={ "small", 0x0025 }, + specials={ "small", 0x25 }, unicodeslot=0xFE6A, }, [0xFE6B]={ @@ -127928,7 +131121,7 @@ characters.data={ description="SMALL COMMERCIAL AT", direction="on", linebreak="id", - specials={ "small", 0x0040 }, + specials={ "small", 0x40 }, unicodeslot=0xFE6B, }, [0xFE70]={ @@ -127936,7 +131129,7 @@ characters.data={ description="ARABIC FATHATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064B }, + specials={ "isolated", 0x20, 0x64B }, unicodeslot=0xFE70, }, [0xFE71]={ @@ -127944,7 +131137,7 @@ characters.data={ description="ARABIC TATWEEL WITH FATHATAN ABOVE", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x064B }, + specials={ "medial", 0x640, 0x64B }, unicodeslot=0xFE71, }, [0xFE72]={ @@ -127952,7 +131145,7 @@ characters.data={ description="ARABIC DAMMATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064C }, + specials={ "isolated", 0x20, 0x64C }, unicodeslot=0xFE72, }, [0xFE73]={ @@ -127967,7 +131160,7 @@ characters.data={ description="ARABIC KASRATAN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064D }, + specials={ "isolated", 0x20, 0x64D }, unicodeslot=0xFE74, }, [0xFE76]={ @@ -127975,7 +131168,7 @@ characters.data={ description="ARABIC FATHA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064E }, + specials={ "isolated", 0x20, 0x64E }, unicodeslot=0xFE76, }, [0xFE77]={ @@ -127983,7 +131176,7 @@ characters.data={ description="ARABIC FATHA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x064E }, + specials={ "medial", 0x640, 0x64E }, unicodeslot=0xFE77, }, [0xFE78]={ @@ -127991,7 +131184,7 @@ characters.data={ description="ARABIC DAMMA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x064F }, + specials={ "isolated", 0x20, 0x64F }, unicodeslot=0xFE78, }, [0xFE79]={ @@ -127999,7 +131192,7 @@ characters.data={ description="ARABIC DAMMA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x064F }, + specials={ "medial", 0x640, 0x64F }, unicodeslot=0xFE79, }, [0xFE7A]={ @@ -128007,7 +131200,7 @@ characters.data={ description="ARABIC KASRA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x0650 }, + specials={ "isolated", 0x20, 0x650 }, unicodeslot=0xFE7A, }, [0xFE7B]={ @@ -128015,7 +131208,7 @@ characters.data={ description="ARABIC KASRA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x0650 }, + specials={ "medial", 0x640, 0x650 }, unicodeslot=0xFE7B, }, [0xFE7C]={ @@ -128023,7 +131216,7 @@ characters.data={ description="ARABIC SHADDA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x0651 }, + specials={ "isolated", 0x20, 0x651 }, unicodeslot=0xFE7C, }, [0xFE7D]={ @@ -128031,7 +131224,7 @@ characters.data={ description="ARABIC SHADDA MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x0651 }, + specials={ "medial", 0x640, 0x651 }, unicodeslot=0xFE7D, }, [0xFE7E]={ @@ -128039,7 +131232,7 @@ characters.data={ description="ARABIC SUKUN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0020, 0x0652 }, + specials={ "isolated", 0x20, 0x652 }, unicodeslot=0xFE7E, }, [0xFE7F]={ @@ -128047,7 +131240,7 @@ characters.data={ description="ARABIC SUKUN MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0640, 0x0652 }, + specials={ "medial", 0x640, 0x652 }, unicodeslot=0xFE7F, }, [0xFE80]={ @@ -128055,7 +131248,7 @@ characters.data={ description="ARABIC LETTER HAMZA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0621 }, + specials={ "isolated", 0x621 }, unicodeslot=0xFE80, }, [0xFE81]={ @@ -128063,8 +131256,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "isolated", 0x0622 }, + shcode=0x627, + specials={ "isolated", 0x622 }, unicodeslot=0xFE81, }, [0xFE82]={ @@ -128073,8 +131266,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "final", 0x0622 }, + shcode=0x627, + specials={ "final", 0x622 }, unicodeslot=0xFE82, }, [0xFE83]={ @@ -128082,8 +131275,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "isolated", 0x0623 }, + shcode=0x627, + specials={ "isolated", 0x623 }, unicodeslot=0xFE83, }, [0xFE84]={ @@ -128092,8 +131285,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "final", 0x0623 }, + shcode=0x627, + specials={ "final", 0x623 }, unicodeslot=0xFE84, }, [0xFE85]={ @@ -128101,8 +131294,8 @@ characters.data={ description="ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x0648, - specials={ "isolated", 0x0624 }, + shcode=0x648, + specials={ "isolated", 0x624 }, unicodeslot=0xFE85, }, [0xFE86]={ @@ -128111,8 +131304,8 @@ characters.data={ description="ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM", direction="al", linebreak="al", - shcode=0x0648, - specials={ "final", 0x0624 }, + shcode=0x648, + specials={ "final", 0x624 }, unicodeslot=0xFE86, }, [0xFE87]={ @@ -128120,8 +131313,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "isolated", 0x0625 }, + shcode=0x627, + specials={ "isolated", 0x625 }, unicodeslot=0xFE87, }, [0xFE88]={ @@ -128130,8 +131323,8 @@ characters.data={ description="ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM", direction="al", linebreak="al", - shcode=0x0627, - specials={ "final", 0x0625 }, + shcode=0x627, + specials={ "final", 0x625 }, unicodeslot=0xFE88, }, [0xFE89]={ @@ -128139,8 +131332,8 @@ characters.data={ description="ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - shcode=0x064A, - specials={ "isolated", 0x0626 }, + shcode=0x64A, + specials={ "isolated", 0x626 }, unicodeslot=0xFE89, }, [0xFE8A]={ @@ -128149,8 +131342,8 @@ characters.data={ description="ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM", direction="al", linebreak="al", - shcode=0x064A, - specials={ "final", 0x0626 }, + shcode=0x64A, + specials={ "final", 0x626 }, unicodeslot=0xFE8A, }, [0xFE8B]={ @@ -128159,8 +131352,8 @@ characters.data={ description="ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM", direction="al", linebreak="al", - shcode=0x064A, - specials={ "initial", 0x0626 }, + shcode=0x64A, + specials={ "initial", 0x626 }, unicodeslot=0xFE8B, }, [0xFE8C]={ @@ -128169,8 +131362,8 @@ characters.data={ description="ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM", direction="al", linebreak="al", - shcode=0x064A, - specials={ "medial", 0x0626 }, + shcode=0x64A, + specials={ "medial", 0x626 }, unicodeslot=0xFE8C, }, [0xFE8D]={ @@ -128178,7 +131371,7 @@ characters.data={ description="ARABIC LETTER ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0627 }, + specials={ "isolated", 0x627 }, unicodeslot=0xFE8D, }, [0xFE8E]={ @@ -128187,7 +131380,7 @@ characters.data={ description="ARABIC LETTER ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0627 }, + specials={ "final", 0x627 }, unicodeslot=0xFE8E, }, [0xFE8F]={ @@ -128195,7 +131388,7 @@ characters.data={ description="ARABIC LETTER BEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0628 }, + specials={ "isolated", 0x628 }, unicodeslot=0xFE8F, }, [0xFE90]={ @@ -128204,7 +131397,7 @@ characters.data={ description="ARABIC LETTER BEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0628 }, + specials={ "final", 0x628 }, unicodeslot=0xFE90, }, [0xFE91]={ @@ -128213,7 +131406,7 @@ characters.data={ description="ARABIC LETTER BEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0628 }, + specials={ "initial", 0x628 }, unicodeslot=0xFE91, }, [0xFE92]={ @@ -128222,7 +131415,7 @@ characters.data={ description="ARABIC LETTER BEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0628 }, + specials={ "medial", 0x628 }, unicodeslot=0xFE92, }, [0xFE93]={ @@ -128230,7 +131423,7 @@ characters.data={ description="ARABIC LETTER TEH MARBUTA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0629 }, + specials={ "isolated", 0x629 }, unicodeslot=0xFE93, }, [0xFE94]={ @@ -128239,7 +131432,7 @@ characters.data={ description="ARABIC LETTER TEH MARBUTA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0629 }, + specials={ "final", 0x629 }, unicodeslot=0xFE94, }, [0xFE95]={ @@ -128247,7 +131440,7 @@ characters.data={ description="ARABIC LETTER TEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062A }, + specials={ "isolated", 0x62A }, unicodeslot=0xFE95, }, [0xFE96]={ @@ -128256,7 +131449,7 @@ characters.data={ description="ARABIC LETTER TEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062A }, + specials={ "final", 0x62A }, unicodeslot=0xFE96, }, [0xFE97]={ @@ -128265,7 +131458,7 @@ characters.data={ description="ARABIC LETTER TEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062A }, + specials={ "initial", 0x62A }, unicodeslot=0xFE97, }, [0xFE98]={ @@ -128274,7 +131467,7 @@ characters.data={ description="ARABIC LETTER TEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062A }, + specials={ "medial", 0x62A }, unicodeslot=0xFE98, }, [0xFE99]={ @@ -128282,7 +131475,7 @@ characters.data={ description="ARABIC LETTER THEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062B }, + specials={ "isolated", 0x62B }, unicodeslot=0xFE99, }, [0xFE9A]={ @@ -128291,7 +131484,7 @@ characters.data={ description="ARABIC LETTER THEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062B }, + specials={ "final", 0x62B }, unicodeslot=0xFE9A, }, [0xFE9B]={ @@ -128300,7 +131493,7 @@ characters.data={ description="ARABIC LETTER THEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062B }, + specials={ "initial", 0x62B }, unicodeslot=0xFE9B, }, [0xFE9C]={ @@ -128309,7 +131502,7 @@ characters.data={ description="ARABIC LETTER THEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062B }, + specials={ "medial", 0x62B }, unicodeslot=0xFE9C, }, [0xFE9D]={ @@ -128317,7 +131510,7 @@ characters.data={ description="ARABIC LETTER JEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062C }, + specials={ "isolated", 0x62C }, unicodeslot=0xFE9D, }, [0xFE9E]={ @@ -128326,7 +131519,7 @@ characters.data={ description="ARABIC LETTER JEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062C }, + specials={ "final", 0x62C }, unicodeslot=0xFE9E, }, [0xFE9F]={ @@ -128335,7 +131528,7 @@ characters.data={ description="ARABIC LETTER JEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062C }, + specials={ "initial", 0x62C }, unicodeslot=0xFE9F, }, [0xFEA0]={ @@ -128344,7 +131537,7 @@ characters.data={ description="ARABIC LETTER JEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062C }, + specials={ "medial", 0x62C }, unicodeslot=0xFEA0, }, [0xFEA1]={ @@ -128352,7 +131545,7 @@ characters.data={ description="ARABIC LETTER HAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062D }, + specials={ "isolated", 0x62D }, unicodeslot=0xFEA1, }, [0xFEA2]={ @@ -128361,7 +131554,7 @@ characters.data={ description="ARABIC LETTER HAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062D }, + specials={ "final", 0x62D }, unicodeslot=0xFEA2, }, [0xFEA3]={ @@ -128370,7 +131563,7 @@ characters.data={ description="ARABIC LETTER HAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062D }, + specials={ "initial", 0x62D }, unicodeslot=0xFEA3, }, [0xFEA4]={ @@ -128379,7 +131572,7 @@ characters.data={ description="ARABIC LETTER HAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062D }, + specials={ "medial", 0x62D }, unicodeslot=0xFEA4, }, [0xFEA5]={ @@ -128387,7 +131580,7 @@ characters.data={ description="ARABIC LETTER KHAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062E }, + specials={ "isolated", 0x62E }, unicodeslot=0xFEA5, }, [0xFEA6]={ @@ -128396,7 +131589,7 @@ characters.data={ description="ARABIC LETTER KHAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062E }, + specials={ "final", 0x62E }, unicodeslot=0xFEA6, }, [0xFEA7]={ @@ -128405,7 +131598,7 @@ characters.data={ description="ARABIC LETTER KHAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x062E }, + specials={ "initial", 0x62E }, unicodeslot=0xFEA7, }, [0xFEA8]={ @@ -128414,7 +131607,7 @@ characters.data={ description="ARABIC LETTER KHAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x062E }, + specials={ "medial", 0x62E }, unicodeslot=0xFEA8, }, [0xFEA9]={ @@ -128422,7 +131615,7 @@ characters.data={ description="ARABIC LETTER DAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x062F }, + specials={ "isolated", 0x62F }, unicodeslot=0xFEA9, }, [0xFEAA]={ @@ -128431,7 +131624,7 @@ characters.data={ description="ARABIC LETTER DAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x062F }, + specials={ "final", 0x62F }, unicodeslot=0xFEAA, }, [0xFEAB]={ @@ -128439,7 +131632,7 @@ characters.data={ description="ARABIC LETTER THAL ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0630 }, + specials={ "isolated", 0x630 }, unicodeslot=0xFEAB, }, [0xFEAC]={ @@ -128448,7 +131641,7 @@ characters.data={ description="ARABIC LETTER THAL FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0630 }, + specials={ "final", 0x630 }, unicodeslot=0xFEAC, }, [0xFEAD]={ @@ -128456,7 +131649,7 @@ characters.data={ description="ARABIC LETTER REH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0631 }, + specials={ "isolated", 0x631 }, unicodeslot=0xFEAD, }, [0xFEAE]={ @@ -128465,7 +131658,7 @@ characters.data={ description="ARABIC LETTER REH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0631 }, + specials={ "final", 0x631 }, unicodeslot=0xFEAE, }, [0xFEAF]={ @@ -128473,7 +131666,7 @@ characters.data={ description="ARABIC LETTER ZAIN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0632 }, + specials={ "isolated", 0x632 }, unicodeslot=0xFEAF, }, [0xFEB0]={ @@ -128482,7 +131675,7 @@ characters.data={ description="ARABIC LETTER ZAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0632 }, + specials={ "final", 0x632 }, unicodeslot=0xFEB0, }, [0xFEB1]={ @@ -128490,7 +131683,7 @@ characters.data={ description="ARABIC LETTER SEEN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0633 }, + specials={ "isolated", 0x633 }, unicodeslot=0xFEB1, }, [0xFEB2]={ @@ -128499,7 +131692,7 @@ characters.data={ description="ARABIC LETTER SEEN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0633 }, + specials={ "final", 0x633 }, unicodeslot=0xFEB2, }, [0xFEB3]={ @@ -128508,7 +131701,7 @@ characters.data={ description="ARABIC LETTER SEEN INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0633 }, + specials={ "initial", 0x633 }, unicodeslot=0xFEB3, }, [0xFEB4]={ @@ -128517,7 +131710,7 @@ characters.data={ description="ARABIC LETTER SEEN MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0633 }, + specials={ "medial", 0x633 }, unicodeslot=0xFEB4, }, [0xFEB5]={ @@ -128525,7 +131718,7 @@ characters.data={ description="ARABIC LETTER SHEEN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0634 }, + specials={ "isolated", 0x634 }, unicodeslot=0xFEB5, }, [0xFEB6]={ @@ -128534,7 +131727,7 @@ characters.data={ description="ARABIC LETTER SHEEN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0634 }, + specials={ "final", 0x634 }, unicodeslot=0xFEB6, }, [0xFEB7]={ @@ -128543,7 +131736,7 @@ characters.data={ description="ARABIC LETTER SHEEN INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0634 }, + specials={ "initial", 0x634 }, unicodeslot=0xFEB7, }, [0xFEB8]={ @@ -128552,7 +131745,7 @@ characters.data={ description="ARABIC LETTER SHEEN MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0634 }, + specials={ "medial", 0x634 }, unicodeslot=0xFEB8, }, [0xFEB9]={ @@ -128560,7 +131753,7 @@ characters.data={ description="ARABIC LETTER SAD ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0635 }, + specials={ "isolated", 0x635 }, unicodeslot=0xFEB9, }, [0xFEBA]={ @@ -128569,7 +131762,7 @@ characters.data={ description="ARABIC LETTER SAD FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0635 }, + specials={ "final", 0x635 }, unicodeslot=0xFEBA, }, [0xFEBB]={ @@ -128578,7 +131771,7 @@ characters.data={ description="ARABIC LETTER SAD INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0635 }, + specials={ "initial", 0x635 }, unicodeslot=0xFEBB, }, [0xFEBC]={ @@ -128587,7 +131780,7 @@ characters.data={ description="ARABIC LETTER SAD MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0635 }, + specials={ "medial", 0x635 }, unicodeslot=0xFEBC, }, [0xFEBD]={ @@ -128595,7 +131788,7 @@ characters.data={ description="ARABIC LETTER DAD ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0636 }, + specials={ "isolated", 0x636 }, unicodeslot=0xFEBD, }, [0xFEBE]={ @@ -128604,7 +131797,7 @@ characters.data={ description="ARABIC LETTER DAD FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0636 }, + specials={ "final", 0x636 }, unicodeslot=0xFEBE, }, [0xFEBF]={ @@ -128613,7 +131806,7 @@ characters.data={ description="ARABIC LETTER DAD INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0636 }, + specials={ "initial", 0x636 }, unicodeslot=0xFEBF, }, [0xFEC0]={ @@ -128622,7 +131815,7 @@ characters.data={ description="ARABIC LETTER DAD MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0636 }, + specials={ "medial", 0x636 }, unicodeslot=0xFEC0, }, [0xFEC1]={ @@ -128630,7 +131823,7 @@ characters.data={ description="ARABIC LETTER TAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0637 }, + specials={ "isolated", 0x637 }, unicodeslot=0xFEC1, }, [0xFEC2]={ @@ -128639,7 +131832,7 @@ characters.data={ description="ARABIC LETTER TAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0637 }, + specials={ "final", 0x637 }, unicodeslot=0xFEC2, }, [0xFEC3]={ @@ -128648,7 +131841,7 @@ characters.data={ description="ARABIC LETTER TAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0637 }, + specials={ "initial", 0x637 }, unicodeslot=0xFEC3, }, [0xFEC4]={ @@ -128657,7 +131850,7 @@ characters.data={ description="ARABIC LETTER TAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0637 }, + specials={ "medial", 0x637 }, unicodeslot=0xFEC4, }, [0xFEC5]={ @@ -128665,7 +131858,7 @@ characters.data={ description="ARABIC LETTER ZAH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0638 }, + specials={ "isolated", 0x638 }, unicodeslot=0xFEC5, }, [0xFEC6]={ @@ -128674,7 +131867,7 @@ characters.data={ description="ARABIC LETTER ZAH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0638 }, + specials={ "final", 0x638 }, unicodeslot=0xFEC6, }, [0xFEC7]={ @@ -128683,7 +131876,7 @@ characters.data={ description="ARABIC LETTER ZAH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0638 }, + specials={ "initial", 0x638 }, unicodeslot=0xFEC7, }, [0xFEC8]={ @@ -128692,7 +131885,7 @@ characters.data={ description="ARABIC LETTER ZAH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0638 }, + specials={ "medial", 0x638 }, unicodeslot=0xFEC8, }, [0xFEC9]={ @@ -128700,7 +131893,7 @@ characters.data={ description="ARABIC LETTER AIN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0639 }, + specials={ "isolated", 0x639 }, unicodeslot=0xFEC9, }, [0xFECA]={ @@ -128709,7 +131902,7 @@ characters.data={ description="ARABIC LETTER AIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0639 }, + specials={ "final", 0x639 }, unicodeslot=0xFECA, }, [0xFECB]={ @@ -128718,7 +131911,7 @@ characters.data={ description="ARABIC LETTER AIN INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0639 }, + specials={ "initial", 0x639 }, unicodeslot=0xFECB, }, [0xFECC]={ @@ -128727,7 +131920,7 @@ characters.data={ description="ARABIC LETTER AIN MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0639 }, + specials={ "medial", 0x639 }, unicodeslot=0xFECC, }, [0xFECD]={ @@ -128735,7 +131928,7 @@ characters.data={ description="ARABIC LETTER GHAIN ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x063A }, + specials={ "isolated", 0x63A }, unicodeslot=0xFECD, }, [0xFECE]={ @@ -128744,7 +131937,7 @@ characters.data={ description="ARABIC LETTER GHAIN FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x063A }, + specials={ "final", 0x63A }, unicodeslot=0xFECE, }, [0xFECF]={ @@ -128753,7 +131946,7 @@ characters.data={ description="ARABIC LETTER GHAIN INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x063A }, + specials={ "initial", 0x63A }, unicodeslot=0xFECF, }, [0xFED0]={ @@ -128762,7 +131955,7 @@ characters.data={ description="ARABIC LETTER GHAIN MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x063A }, + specials={ "medial", 0x63A }, unicodeslot=0xFED0, }, [0xFED1]={ @@ -128770,7 +131963,7 @@ characters.data={ description="ARABIC LETTER FEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0641 }, + specials={ "isolated", 0x641 }, unicodeslot=0xFED1, }, [0xFED2]={ @@ -128779,7 +131972,7 @@ characters.data={ description="ARABIC LETTER FEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0641 }, + specials={ "final", 0x641 }, unicodeslot=0xFED2, }, [0xFED3]={ @@ -128788,7 +131981,7 @@ characters.data={ description="ARABIC LETTER FEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0641 }, + specials={ "initial", 0x641 }, unicodeslot=0xFED3, }, [0xFED4]={ @@ -128797,7 +131990,7 @@ characters.data={ description="ARABIC LETTER FEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0641 }, + specials={ "medial", 0x641 }, unicodeslot=0xFED4, }, [0xFED5]={ @@ -128805,7 +131998,7 @@ characters.data={ description="ARABIC LETTER QAF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0642 }, + specials={ "isolated", 0x642 }, unicodeslot=0xFED5, }, [0xFED6]={ @@ -128814,7 +132007,7 @@ characters.data={ description="ARABIC LETTER QAF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0642 }, + specials={ "final", 0x642 }, unicodeslot=0xFED6, }, [0xFED7]={ @@ -128823,7 +132016,7 @@ characters.data={ description="ARABIC LETTER QAF INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0642 }, + specials={ "initial", 0x642 }, unicodeslot=0xFED7, }, [0xFED8]={ @@ -128832,7 +132025,7 @@ characters.data={ description="ARABIC LETTER QAF MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0642 }, + specials={ "medial", 0x642 }, unicodeslot=0xFED8, }, [0xFED9]={ @@ -128840,7 +132033,7 @@ characters.data={ description="ARABIC LETTER KAF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0643 }, + specials={ "isolated", 0x643 }, unicodeslot=0xFED9, }, [0xFEDA]={ @@ -128849,7 +132042,7 @@ characters.data={ description="ARABIC LETTER KAF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0643 }, + specials={ "final", 0x643 }, unicodeslot=0xFEDA, }, [0xFEDB]={ @@ -128858,7 +132051,7 @@ characters.data={ description="ARABIC LETTER KAF INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0643 }, + specials={ "initial", 0x643 }, unicodeslot=0xFEDB, }, [0xFEDC]={ @@ -128867,7 +132060,7 @@ characters.data={ description="ARABIC LETTER KAF MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0643 }, + specials={ "medial", 0x643 }, unicodeslot=0xFEDC, }, [0xFEDD]={ @@ -128875,7 +132068,7 @@ characters.data={ description="ARABIC LETTER LAM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644 }, + specials={ "isolated", 0x644 }, unicodeslot=0xFEDD, }, [0xFEDE]={ @@ -128884,7 +132077,7 @@ characters.data={ description="ARABIC LETTER LAM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644 }, + specials={ "final", 0x644 }, unicodeslot=0xFEDE, }, [0xFEDF]={ @@ -128893,7 +132086,7 @@ characters.data={ description="ARABIC LETTER LAM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0644 }, + specials={ "initial", 0x644 }, unicodeslot=0xFEDF, }, [0xFEE0]={ @@ -128902,7 +132095,7 @@ characters.data={ description="ARABIC LETTER LAM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0644 }, + specials={ "medial", 0x644 }, unicodeslot=0xFEE0, }, [0xFEE1]={ @@ -128910,7 +132103,7 @@ characters.data={ description="ARABIC LETTER MEEM ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0645 }, + specials={ "isolated", 0x645 }, unicodeslot=0xFEE1, }, [0xFEE2]={ @@ -128919,7 +132112,7 @@ characters.data={ description="ARABIC LETTER MEEM FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0645 }, + specials={ "final", 0x645 }, unicodeslot=0xFEE2, }, [0xFEE3]={ @@ -128928,7 +132121,7 @@ characters.data={ description="ARABIC LETTER MEEM INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0645 }, + specials={ "initial", 0x645 }, unicodeslot=0xFEE3, }, [0xFEE4]={ @@ -128937,7 +132130,7 @@ characters.data={ description="ARABIC LETTER MEEM MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0645 }, + specials={ "medial", 0x645 }, unicodeslot=0xFEE4, }, [0xFEE5]={ @@ -128945,7 +132138,7 @@ characters.data={ description="ARABIC LETTER NOON ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0646 }, + specials={ "isolated", 0x646 }, unicodeslot=0xFEE5, }, [0xFEE6]={ @@ -128954,7 +132147,7 @@ characters.data={ description="ARABIC LETTER NOON FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0646 }, + specials={ "final", 0x646 }, unicodeslot=0xFEE6, }, [0xFEE7]={ @@ -128963,7 +132156,7 @@ characters.data={ description="ARABIC LETTER NOON INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0646 }, + specials={ "initial", 0x646 }, unicodeslot=0xFEE7, }, [0xFEE8]={ @@ -128972,7 +132165,7 @@ characters.data={ description="ARABIC LETTER NOON MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0646 }, + specials={ "medial", 0x646 }, unicodeslot=0xFEE8, }, [0xFEE9]={ @@ -128980,7 +132173,7 @@ characters.data={ description="ARABIC LETTER HEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0647 }, + specials={ "isolated", 0x647 }, unicodeslot=0xFEE9, }, [0xFEEA]={ @@ -128989,7 +132182,7 @@ characters.data={ description="ARABIC LETTER HEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0647 }, + specials={ "final", 0x647 }, unicodeslot=0xFEEA, }, [0xFEEB]={ @@ -128998,7 +132191,7 @@ characters.data={ description="ARABIC LETTER HEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x0647 }, + specials={ "initial", 0x647 }, unicodeslot=0xFEEB, }, [0xFEEC]={ @@ -129007,7 +132200,7 @@ characters.data={ description="ARABIC LETTER HEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x0647 }, + specials={ "medial", 0x647 }, unicodeslot=0xFEEC, }, [0xFEED]={ @@ -129015,7 +132208,7 @@ characters.data={ description="ARABIC LETTER WAW ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0648 }, + specials={ "isolated", 0x648 }, unicodeslot=0xFEED, }, [0xFEEE]={ @@ -129024,7 +132217,7 @@ characters.data={ description="ARABIC LETTER WAW FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0648 }, + specials={ "final", 0x648 }, unicodeslot=0xFEEE, }, [0xFEEF]={ @@ -129032,7 +132225,7 @@ characters.data={ description="ARABIC LETTER ALEF MAKSURA ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0649 }, + specials={ "isolated", 0x649 }, unicodeslot=0xFEEF, }, [0xFEF0]={ @@ -129041,7 +132234,7 @@ characters.data={ description="ARABIC LETTER ALEF MAKSURA FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0649 }, + specials={ "final", 0x649 }, unicodeslot=0xFEF0, }, [0xFEF1]={ @@ -129049,7 +132242,7 @@ characters.data={ description="ARABIC LETTER YEH ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x064A }, + specials={ "isolated", 0x64A }, unicodeslot=0xFEF1, }, [0xFEF2]={ @@ -129058,7 +132251,7 @@ characters.data={ description="ARABIC LETTER YEH FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x064A }, + specials={ "final", 0x64A }, unicodeslot=0xFEF2, }, [0xFEF3]={ @@ -129067,7 +132260,7 @@ characters.data={ description="ARABIC LETTER YEH INITIAL FORM", direction="al", linebreak="al", - specials={ "initial", 0x064A }, + specials={ "initial", 0x64A }, unicodeslot=0xFEF3, }, [0xFEF4]={ @@ -129076,7 +132269,7 @@ characters.data={ description="ARABIC LETTER YEH MEDIAL FORM", direction="al", linebreak="al", - specials={ "medial", 0x064A }, + specials={ "medial", 0x64A }, unicodeslot=0xFEF4, }, [0xFEF5]={ @@ -129085,7 +132278,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0622 }, + specials={ "isolated", 0x644, 0x622 }, unicodeslot=0xFEF5, }, [0xFEF6]={ @@ -129094,7 +132287,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0622 }, + specials={ "final", 0x644, 0x622 }, unicodeslot=0xFEF6, }, [0xFEF7]={ @@ -129103,7 +132296,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0623 }, + specials={ "isolated", 0x644, 0x623 }, unicodeslot=0xFEF7, }, [0xFEF8]={ @@ -129112,7 +132305,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0623 }, + specials={ "final", 0x644, 0x623 }, unicodeslot=0xFEF8, }, [0xFEF9]={ @@ -129121,7 +132314,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0625 }, + specials={ "isolated", 0x644, 0x625 }, unicodeslot=0xFEF9, }, [0xFEFA]={ @@ -129130,7 +132323,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0625 }, + specials={ "final", 0x644, 0x625 }, unicodeslot=0xFEFA, }, [0xFEFB]={ @@ -129139,7 +132332,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM", direction="al", linebreak="al", - specials={ "isolated", 0x0644, 0x0627 }, + specials={ "isolated", 0x644, 0x627 }, unicodeslot=0xFEFB, }, [0xFEFC]={ @@ -129148,7 +132341,7 @@ characters.data={ description="ARABIC LIGATURE LAM WITH ALEF FINAL FORM", direction="al", linebreak="al", - specials={ "final", 0x0644, 0x0627 }, + specials={ "final", 0x644, 0x627 }, unicodeslot=0xFEFC, }, [0xFEFF]={ @@ -129167,7 +132360,7 @@ characters.data={ description="FULLWIDTH EXCLAMATION MARK", direction="on", linebreak="ex", - specials={ "wide", 0x0021 }, + specials={ "wide", 0x21 }, unicodeslot=0xFF01, }, [0xFF02]={ @@ -129177,7 +132370,7 @@ characters.data={ description="FULLWIDTH QUOTATION MARK", direction="on", linebreak="id", - specials={ "wide", 0x0022 }, + specials={ "wide", 0x22 }, unicodeslot=0xFF02, }, [0xFF03]={ @@ -129187,7 +132380,7 @@ characters.data={ description="FULLWIDTH NUMBER SIGN", direction="et", linebreak="id", - specials={ "wide", 0x0023 }, + specials={ "wide", 0x23 }, unicodeslot=0xFF03, }, [0xFF04]={ @@ -129197,7 +132390,7 @@ characters.data={ description="FULLWIDTH DOLLAR SIGN", direction="et", linebreak="pr", - specials={ "wide", 0x0024 }, + specials={ "wide", 0x24 }, unicodeslot=0xFF04, }, [0xFF05]={ @@ -129207,7 +132400,7 @@ characters.data={ description="FULLWIDTH PERCENT SIGN", direction="et", linebreak="po", - specials={ "wide", 0x0025 }, + specials={ "wide", 0x25 }, unicodeslot=0xFF05, }, [0xFF06]={ @@ -129217,7 +132410,7 @@ characters.data={ description="FULLWIDTH AMPERSAND", direction="on", linebreak="id", - specials={ "wide", 0x0026 }, + specials={ "wide", 0x26 }, unicodeslot=0xFF06, }, [0xFF07]={ @@ -129227,7 +132420,7 @@ characters.data={ description="FULLWIDTH APOSTROPHE", direction="on", linebreak="id", - specials={ "wide", 0x0027 }, + specials={ "wide", 0x27 }, unicodeslot=0xFF07, }, [0xFF08]={ @@ -129238,8 +132431,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFF09, + specials={ "wide", 0x28 }, textclass="open", - specials={ "wide", 0x0028 }, unicodeslot=0xFF08, }, [0xFF09]={ @@ -129250,8 +132443,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFF08, + specials={ "wide", 0x29 }, textclass="close", - specials={ "wide", 0x0029 }, unicodeslot=0xFF09, }, [0xFF0A]={ @@ -129261,7 +132454,7 @@ characters.data={ description="FULLWIDTH ASTERISK", direction="on", linebreak="id", - specials={ "wide", 0x002A }, + specials={ "wide", 0x2A }, unicodeslot=0xFF0A, }, [0xFF0B]={ @@ -129271,7 +132464,7 @@ characters.data={ description="FULLWIDTH PLUS SIGN", direction="es", linebreak="id", - specials={ "wide", 0x002B }, + specials={ "wide", 0x2B }, unicodeslot=0xFF0B, }, [0xFF0C]={ @@ -129281,7 +132474,7 @@ characters.data={ description="FULLWIDTH COMMA", direction="cs", linebreak="cl", - specials={ "wide", 0x002C }, + specials={ "wide", 0x2C }, unicodeslot=0xFF0C, }, [0xFF0D]={ @@ -129291,7 +132484,7 @@ characters.data={ description="FULLWIDTH HYPHEN-MINUS", direction="es", linebreak="id", - specials={ "wide", 0x002D }, + specials={ "wide", 0x2D }, unicodeslot=0xFF0D, }, [0xFF0E]={ @@ -129301,7 +132494,7 @@ characters.data={ description="FULLWIDTH FULL STOP", direction="cs", linebreak="cl", - specials={ "wide", 0x002E }, + specials={ "wide", 0x2E }, unicodeslot=0xFF0E, }, [0xFF0F]={ @@ -129311,7 +132504,7 @@ characters.data={ description="FULLWIDTH SOLIDUS", direction="cs", linebreak="id", - specials={ "wide", 0x002F }, + specials={ "wide", 0x2F }, unicodeslot=0xFF0F, }, [0xFF10]={ @@ -129321,7 +132514,7 @@ characters.data={ description="FULLWIDTH DIGIT ZERO", direction="en", linebreak="id", - specials={ "wide", 0x0030 }, + specials={ "wide", 0x30 }, unicodeslot=0xFF10, }, [0xFF11]={ @@ -129331,7 +132524,7 @@ characters.data={ description="FULLWIDTH DIGIT ONE", direction="en", linebreak="id", - specials={ "wide", 0x0031 }, + specials={ "wide", 0x31 }, unicodeslot=0xFF11, }, [0xFF12]={ @@ -129341,7 +132534,7 @@ characters.data={ description="FULLWIDTH DIGIT TWO", direction="en", linebreak="id", - specials={ "wide", 0x0032 }, + specials={ "wide", 0x32 }, unicodeslot=0xFF12, }, [0xFF13]={ @@ -129351,7 +132544,7 @@ characters.data={ description="FULLWIDTH DIGIT THREE", direction="en", linebreak="id", - specials={ "wide", 0x0033 }, + specials={ "wide", 0x33 }, unicodeslot=0xFF13, }, [0xFF14]={ @@ -129361,7 +132554,7 @@ characters.data={ description="FULLWIDTH DIGIT FOUR", direction="en", linebreak="id", - specials={ "wide", 0x0034 }, + specials={ "wide", 0x34 }, unicodeslot=0xFF14, }, [0xFF15]={ @@ -129371,7 +132564,7 @@ characters.data={ description="FULLWIDTH DIGIT FIVE", direction="en", linebreak="id", - specials={ "wide", 0x0035 }, + specials={ "wide", 0x35 }, unicodeslot=0xFF15, }, [0xFF16]={ @@ -129381,7 +132574,7 @@ characters.data={ description="FULLWIDTH DIGIT SIX", direction="en", linebreak="id", - specials={ "wide", 0x0036 }, + specials={ "wide", 0x36 }, unicodeslot=0xFF16, }, [0xFF17]={ @@ -129391,7 +132584,7 @@ characters.data={ description="FULLWIDTH DIGIT SEVEN", direction="en", linebreak="id", - specials={ "wide", 0x0037 }, + specials={ "wide", 0x37 }, unicodeslot=0xFF17, }, [0xFF18]={ @@ -129401,7 +132594,7 @@ characters.data={ description="FULLWIDTH DIGIT EIGHT", direction="en", linebreak="id", - specials={ "wide", 0x0038 }, + specials={ "wide", 0x38 }, unicodeslot=0xFF18, }, [0xFF19]={ @@ -129411,7 +132604,7 @@ characters.data={ description="FULLWIDTH DIGIT NINE", direction="en", linebreak="id", - specials={ "wide", 0x0039 }, + specials={ "wide", 0x39 }, unicodeslot=0xFF19, }, [0xFF1A]={ @@ -129421,7 +132614,7 @@ characters.data={ description="FULLWIDTH COLON", direction="cs", linebreak="ns", - specials={ "wide", 0x003A }, + specials={ "wide", 0x3A }, unicodeslot=0xFF1A, }, [0xFF1B]={ @@ -129431,7 +132624,7 @@ characters.data={ description="FULLWIDTH SEMICOLON", direction="on", linebreak="ns", - specials={ "wide", 0x003B }, + specials={ "wide", 0x3B }, unicodeslot=0xFF1B, }, [0xFF1C]={ @@ -129442,8 +132635,8 @@ characters.data={ direction="on", linebreak="id", mirror=0xFF1E, + specials={ "wide", 0x3C }, textclass="open", - specials={ "wide", 0x003C }, unicodeslot=0xFF1C, }, [0xFF1D]={ @@ -129453,7 +132646,7 @@ characters.data={ description="FULLWIDTH EQUALS SIGN", direction="on", linebreak="id", - specials={ "wide", 0x003D }, + specials={ "wide", 0x3D }, unicodeslot=0xFF1D, }, [0xFF1E]={ @@ -129464,8 +132657,8 @@ characters.data={ direction="on", linebreak="id", mirror=0xFF1C, + specials={ "wide", 0x3E }, textclass="close", - specials={ "wide", 0x003E }, unicodeslot=0xFF1E, }, [0xFF1F]={ @@ -129475,7 +132668,7 @@ characters.data={ description="FULLWIDTH QUESTION MARK", direction="on", linebreak="ex", - specials={ "wide", 0x003F }, + specials={ "wide", 0x3F }, unicodeslot=0xFF1F, }, [0xFF20]={ @@ -129485,7 +132678,7 @@ characters.data={ description="FULLWIDTH COMMERCIAL AT", direction="on", linebreak="id", - specials={ "wide", 0x0040 }, + specials={ "wide", 0x40 }, unicodeslot=0xFF20, }, [0xFF21]={ @@ -129496,7 +132689,7 @@ characters.data={ direction="l", lccode=0xFF41, linebreak="id", - specials={ "wide", 0x0041 }, + specials={ "wide", 0x41 }, unicodeslot=0xFF21, }, [0xFF22]={ @@ -129507,7 +132700,7 @@ characters.data={ direction="l", lccode=0xFF42, linebreak="id", - specials={ "wide", 0x0042 }, + specials={ "wide", 0x42 }, unicodeslot=0xFF22, }, [0xFF23]={ @@ -129518,7 +132711,7 @@ characters.data={ direction="l", lccode=0xFF43, linebreak="id", - specials={ "wide", 0x0043 }, + specials={ "wide", 0x43 }, unicodeslot=0xFF23, }, [0xFF24]={ @@ -129529,7 +132722,7 @@ characters.data={ direction="l", lccode=0xFF44, linebreak="id", - specials={ "wide", 0x0044 }, + specials={ "wide", 0x44 }, unicodeslot=0xFF24, }, [0xFF25]={ @@ -129540,7 +132733,7 @@ characters.data={ direction="l", lccode=0xFF45, linebreak="id", - specials={ "wide", 0x0045 }, + specials={ "wide", 0x45 }, unicodeslot=0xFF25, }, [0xFF26]={ @@ -129551,7 +132744,7 @@ characters.data={ direction="l", lccode=0xFF46, linebreak="id", - specials={ "wide", 0x0046 }, + specials={ "wide", 0x46 }, unicodeslot=0xFF26, }, [0xFF27]={ @@ -129562,7 +132755,7 @@ characters.data={ direction="l", lccode=0xFF47, linebreak="id", - specials={ "wide", 0x0047 }, + specials={ "wide", 0x47 }, unicodeslot=0xFF27, }, [0xFF28]={ @@ -129573,7 +132766,7 @@ characters.data={ direction="l", lccode=0xFF48, linebreak="id", - specials={ "wide", 0x0048 }, + specials={ "wide", 0x48 }, unicodeslot=0xFF28, }, [0xFF29]={ @@ -129584,7 +132777,7 @@ characters.data={ direction="l", lccode=0xFF49, linebreak="id", - specials={ "wide", 0x0049 }, + specials={ "wide", 0x49 }, unicodeslot=0xFF29, }, [0xFF2A]={ @@ -129595,7 +132788,7 @@ characters.data={ direction="l", lccode=0xFF4A, linebreak="id", - specials={ "wide", 0x004A }, + specials={ "wide", 0x4A }, unicodeslot=0xFF2A, }, [0xFF2B]={ @@ -129606,7 +132799,7 @@ characters.data={ direction="l", lccode=0xFF4B, linebreak="id", - specials={ "wide", 0x004B }, + specials={ "wide", 0x4B }, unicodeslot=0xFF2B, }, [0xFF2C]={ @@ -129617,7 +132810,7 @@ characters.data={ direction="l", lccode=0xFF4C, linebreak="id", - specials={ "wide", 0x004C }, + specials={ "wide", 0x4C }, unicodeslot=0xFF2C, }, [0xFF2D]={ @@ -129628,7 +132821,7 @@ characters.data={ direction="l", lccode=0xFF4D, linebreak="id", - specials={ "wide", 0x004D }, + specials={ "wide", 0x4D }, unicodeslot=0xFF2D, }, [0xFF2E]={ @@ -129639,7 +132832,7 @@ characters.data={ direction="l", lccode=0xFF4E, linebreak="id", - specials={ "wide", 0x004E }, + specials={ "wide", 0x4E }, unicodeslot=0xFF2E, }, [0xFF2F]={ @@ -129650,7 +132843,7 @@ characters.data={ direction="l", lccode=0xFF4F, linebreak="id", - specials={ "wide", 0x004F }, + specials={ "wide", 0x4F }, unicodeslot=0xFF2F, }, [0xFF30]={ @@ -129661,7 +132854,7 @@ characters.data={ direction="l", lccode=0xFF50, linebreak="id", - specials={ "wide", 0x0050 }, + specials={ "wide", 0x50 }, unicodeslot=0xFF30, }, [0xFF31]={ @@ -129672,7 +132865,7 @@ characters.data={ direction="l", lccode=0xFF51, linebreak="id", - specials={ "wide", 0x0051 }, + specials={ "wide", 0x51 }, unicodeslot=0xFF31, }, [0xFF32]={ @@ -129683,7 +132876,7 @@ characters.data={ direction="l", lccode=0xFF52, linebreak="id", - specials={ "wide", 0x0052 }, + specials={ "wide", 0x52 }, unicodeslot=0xFF32, }, [0xFF33]={ @@ -129694,7 +132887,7 @@ characters.data={ direction="l", lccode=0xFF53, linebreak="id", - specials={ "wide", 0x0053 }, + specials={ "wide", 0x53 }, unicodeslot=0xFF33, }, [0xFF34]={ @@ -129705,7 +132898,7 @@ characters.data={ direction="l", lccode=0xFF54, linebreak="id", - specials={ "wide", 0x0054 }, + specials={ "wide", 0x54 }, unicodeslot=0xFF34, }, [0xFF35]={ @@ -129716,7 +132909,7 @@ characters.data={ direction="l", lccode=0xFF55, linebreak="id", - specials={ "wide", 0x0055 }, + specials={ "wide", 0x55 }, unicodeslot=0xFF35, }, [0xFF36]={ @@ -129727,7 +132920,7 @@ characters.data={ direction="l", lccode=0xFF56, linebreak="id", - specials={ "wide", 0x0056 }, + specials={ "wide", 0x56 }, unicodeslot=0xFF36, }, [0xFF37]={ @@ -129738,7 +132931,7 @@ characters.data={ direction="l", lccode=0xFF57, linebreak="id", - specials={ "wide", 0x0057 }, + specials={ "wide", 0x57 }, unicodeslot=0xFF37, }, [0xFF38]={ @@ -129749,7 +132942,7 @@ characters.data={ direction="l", lccode=0xFF58, linebreak="id", - specials={ "wide", 0x0058 }, + specials={ "wide", 0x58 }, unicodeslot=0xFF38, }, [0xFF39]={ @@ -129760,7 +132953,7 @@ characters.data={ direction="l", lccode=0xFF59, linebreak="id", - specials={ "wide", 0x0059 }, + specials={ "wide", 0x59 }, unicodeslot=0xFF39, }, [0xFF3A]={ @@ -129771,7 +132964,7 @@ characters.data={ direction="l", lccode=0xFF5A, linebreak="id", - specials={ "wide", 0x005A }, + specials={ "wide", 0x5A }, unicodeslot=0xFF3A, }, [0xFF3B]={ @@ -129782,8 +132975,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFF3D, + specials={ "wide", 0x5B }, textclass="open", - specials={ "wide", 0x005B }, unicodeslot=0xFF3B, }, [0xFF3C]={ @@ -129793,7 +132986,7 @@ characters.data={ description="FULLWIDTH REVERSE SOLIDUS", direction="on", linebreak="id", - specials={ "wide", 0x005C }, + specials={ "wide", 0x5C }, unicodeslot=0xFF3C, }, [0xFF3D]={ @@ -129804,8 +132997,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFF3B, + specials={ "wide", 0x5D }, textclass="close", - specials={ "wide", 0x005D }, unicodeslot=0xFF3D, }, [0xFF3E]={ @@ -129815,7 +133008,7 @@ characters.data={ description="FULLWIDTH CIRCUMFLEX ACCENT", direction="on", linebreak="id", - specials={ "wide", 0x005E }, + specials={ "wide", 0x5E }, unicodeslot=0xFF3E, }, [0xFF3F]={ @@ -129825,7 +133018,7 @@ characters.data={ description="FULLWIDTH LOW LINE", direction="on", linebreak="id", - specials={ "wide", 0x005F }, + specials={ "wide", 0x5F }, unicodeslot=0xFF3F, }, [0xFF40]={ @@ -129835,7 +133028,7 @@ characters.data={ description="FULLWIDTH GRAVE ACCENT", direction="on", linebreak="id", - specials={ "wide", 0x0060 }, + specials={ "wide", 0x60 }, unicodeslot=0xFF40, }, [0xFF41]={ @@ -129845,7 +133038,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER A", direction="l", linebreak="id", - specials={ "wide", 0x0061 }, + specials={ "wide", 0x61 }, uccode=0xFF21, unicodeslot=0xFF41, }, @@ -129856,7 +133049,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER B", direction="l", linebreak="id", - specials={ "wide", 0x0062 }, + specials={ "wide", 0x62 }, uccode=0xFF22, unicodeslot=0xFF42, }, @@ -129867,7 +133060,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER C", direction="l", linebreak="id", - specials={ "wide", 0x0063 }, + specials={ "wide", 0x63 }, uccode=0xFF23, unicodeslot=0xFF43, }, @@ -129878,7 +133071,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER D", direction="l", linebreak="id", - specials={ "wide", 0x0064 }, + specials={ "wide", 0x64 }, uccode=0xFF24, unicodeslot=0xFF44, }, @@ -129889,7 +133082,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER E", direction="l", linebreak="id", - specials={ "wide", 0x0065 }, + specials={ "wide", 0x65 }, uccode=0xFF25, unicodeslot=0xFF45, }, @@ -129900,7 +133093,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER F", direction="l", linebreak="id", - specials={ "wide", 0x0066 }, + specials={ "wide", 0x66 }, uccode=0xFF26, unicodeslot=0xFF46, }, @@ -129911,7 +133104,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER G", direction="l", linebreak="id", - specials={ "wide", 0x0067 }, + specials={ "wide", 0x67 }, uccode=0xFF27, unicodeslot=0xFF47, }, @@ -129922,7 +133115,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER H", direction="l", linebreak="id", - specials={ "wide", 0x0068 }, + specials={ "wide", 0x68 }, uccode=0xFF28, unicodeslot=0xFF48, }, @@ -129933,7 +133126,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER I", direction="l", linebreak="id", - specials={ "wide", 0x0069 }, + specials={ "wide", 0x69 }, uccode=0xFF29, unicodeslot=0xFF49, }, @@ -129944,7 +133137,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER J", direction="l", linebreak="id", - specials={ "wide", 0x006A }, + specials={ "wide", 0x6A }, uccode=0xFF2A, unicodeslot=0xFF4A, }, @@ -129955,7 +133148,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER K", direction="l", linebreak="id", - specials={ "wide", 0x006B }, + specials={ "wide", 0x6B }, uccode=0xFF2B, unicodeslot=0xFF4B, }, @@ -129966,7 +133159,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER L", direction="l", linebreak="id", - specials={ "wide", 0x006C }, + specials={ "wide", 0x6C }, uccode=0xFF2C, unicodeslot=0xFF4C, }, @@ -129977,7 +133170,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER M", direction="l", linebreak="id", - specials={ "wide", 0x006D }, + specials={ "wide", 0x6D }, uccode=0xFF2D, unicodeslot=0xFF4D, }, @@ -129988,7 +133181,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER N", direction="l", linebreak="id", - specials={ "wide", 0x006E }, + specials={ "wide", 0x6E }, uccode=0xFF2E, unicodeslot=0xFF4E, }, @@ -129999,7 +133192,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER O", direction="l", linebreak="id", - specials={ "wide", 0x006F }, + specials={ "wide", 0x6F }, uccode=0xFF2F, unicodeslot=0xFF4F, }, @@ -130010,7 +133203,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER P", direction="l", linebreak="id", - specials={ "wide", 0x0070 }, + specials={ "wide", 0x70 }, uccode=0xFF30, unicodeslot=0xFF50, }, @@ -130021,7 +133214,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER Q", direction="l", linebreak="id", - specials={ "wide", 0x0071 }, + specials={ "wide", 0x71 }, uccode=0xFF31, unicodeslot=0xFF51, }, @@ -130032,7 +133225,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER R", direction="l", linebreak="id", - specials={ "wide", 0x0072 }, + specials={ "wide", 0x72 }, uccode=0xFF32, unicodeslot=0xFF52, }, @@ -130043,7 +133236,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER S", direction="l", linebreak="id", - specials={ "wide", 0x0073 }, + specials={ "wide", 0x73 }, uccode=0xFF33, unicodeslot=0xFF53, }, @@ -130054,7 +133247,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER T", direction="l", linebreak="id", - specials={ "wide", 0x0074 }, + specials={ "wide", 0x74 }, uccode=0xFF34, unicodeslot=0xFF54, }, @@ -130065,7 +133258,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER U", direction="l", linebreak="id", - specials={ "wide", 0x0075 }, + specials={ "wide", 0x75 }, uccode=0xFF35, unicodeslot=0xFF55, }, @@ -130076,7 +133269,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER V", direction="l", linebreak="id", - specials={ "wide", 0x0076 }, + specials={ "wide", 0x76 }, uccode=0xFF36, unicodeslot=0xFF56, }, @@ -130087,7 +133280,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER W", direction="l", linebreak="id", - specials={ "wide", 0x0077 }, + specials={ "wide", 0x77 }, uccode=0xFF37, unicodeslot=0xFF57, }, @@ -130098,7 +133291,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER X", direction="l", linebreak="id", - specials={ "wide", 0x0078 }, + specials={ "wide", 0x78 }, uccode=0xFF38, unicodeslot=0xFF58, }, @@ -130109,7 +133302,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER Y", direction="l", linebreak="id", - specials={ "wide", 0x0079 }, + specials={ "wide", 0x79 }, uccode=0xFF39, unicodeslot=0xFF59, }, @@ -130120,7 +133313,7 @@ characters.data={ description="FULLWIDTH LATIN SMALL LETTER Z", direction="l", linebreak="id", - specials={ "wide", 0x007A }, + specials={ "wide", 0x7A }, uccode=0xFF3A, unicodeslot=0xFF5A, }, @@ -130132,8 +133325,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFF5D, + specials={ "wide", 0x7B }, textclass="open", - specials={ "wide", 0x007B }, unicodeslot=0xFF5B, }, [0xFF5C]={ @@ -130143,7 +133336,7 @@ characters.data={ description="FULLWIDTH VERTICAL LINE", direction="on", linebreak="id", - specials={ "wide", 0x007C }, + specials={ "wide", 0x7C }, unicodeslot=0xFF5C, }, [0xFF5D]={ @@ -130154,8 +133347,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFF5B, + specials={ "wide", 0x7D }, textclass="close", - specials={ "wide", 0x007D }, unicodeslot=0xFF5D, }, [0xFF5E]={ @@ -130165,7 +133358,7 @@ characters.data={ description="FULLWIDTH TILDE", direction="on", linebreak="id", - specials={ "wide", 0x007E }, + specials={ "wide", 0x7E }, unicodeslot=0xFF5E, }, [0xFF5F]={ @@ -130175,8 +133368,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFF60, - textclass="open", specials={ "wide", 0x2985 }, + textclass="open", unicodeslot=0xFF5F, }, [0xFF60]={ @@ -130186,8 +133379,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFF5F, - textclass="close", specials={ "wide", 0x2986 }, + textclass="close", unicodeslot=0xFF60, }, [0xFF61]={ @@ -130208,8 +133401,8 @@ characters.data={ direction="on", linebreak="op", mirror=0xFF63, - textclass="open", specials={ "narrow", 0x300C }, + textclass="open", unicodeslot=0xFF62, }, [0xFF63]={ @@ -130220,8 +133413,8 @@ characters.data={ direction="on", linebreak="cl", mirror=0xFF62, - textclass="close", specials={ "narrow", 0x300D }, + textclass="close", unicodeslot=0xFF63, }, [0xFF64]={ @@ -131299,7 +134492,7 @@ characters.data={ description="FULLWIDTH CENT SIGN", direction="et", linebreak="po", - specials={ "wide", 0x00A2 }, + specials={ "wide", 0xA2 }, unicodeslot=0xFFE0, }, [0xFFE1]={ @@ -131309,7 +134502,7 @@ characters.data={ description="FULLWIDTH POUND SIGN", direction="et", linebreak="pr", - specials={ "wide", 0x00A3 }, + specials={ "wide", 0xA3 }, unicodeslot=0xFFE1, }, [0xFFE2]={ @@ -131318,7 +134511,7 @@ characters.data={ description="FULLWIDTH NOT SIGN", direction="on", linebreak="id", - specials={ "wide", 0x00AC }, + specials={ "wide", 0xAC }, unicodeslot=0xFFE2, }, [0xFFE3]={ @@ -131328,7 +134521,7 @@ characters.data={ description="FULLWIDTH MACRON", direction="on", linebreak="id", - specials={ "wide", 0x00AF }, + specials={ "wide", 0xAF }, unicodeslot=0xFFE3, }, [0xFFE4]={ @@ -131337,7 +134530,7 @@ characters.data={ description="FULLWIDTH BROKEN BAR", direction="on", linebreak="id", - specials={ "wide", 0x00A6 }, + specials={ "wide", 0xA6 }, unicodeslot=0xFFE4, }, [0xFFE5]={ @@ -131347,7 +134540,7 @@ characters.data={ description="FULLWIDTH YEN SIGN", direction="et", linebreak="pr", - specials={ "wide", 0x00A5 }, + specials={ "wide", 0xA5 }, unicodeslot=0xFFE5, }, [0xFFE6]={ @@ -133863,6 +137056,20 @@ characters.data={ linebreak="al", unicodeslot=0x1018A, }, + [0x1018B]={ + category="no", + description="GREEK ONE QUARTER SIGN", + direction="on", + linebreak="al", + unicodeslot=0x1018B, + }, + [0x1018C]={ + category="so", + description="GREEK SINUSOID SIGN", + direction="on", + linebreak="al", + unicodeslot=0x1018C, + }, [0x10190]={ category="so", description="ROMAN SEXTANS SIGN", @@ -133947,6 +137154,13 @@ characters.data={ linebreak="al", unicodeslot=0x1019B, }, + [0x101A0]={ + category="so", + description="GREEK SYMBOL TAU RHO", + direction="on", + linebreak="al", + unicodeslot=0x101A0, + }, [0x101D0]={ category="so", description="PHAISTOS DISC SIGN PEDESTRIAN", @@ -134264,6 +137478,7 @@ characters.data={ }, [0x101FD]={ category="mn", + combining=0xDC, description="PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE", direction="nsm", linebreak="cm", @@ -134815,6 +138030,203 @@ characters.data={ linebreak="al", unicodeslot=0x102D0, }, + [0x102E0]={ + category="mn", + combining=0xDC, + description="COPTIC EPACT THOUSANDS MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x102E0, + }, + [0x102E1]={ + category="no", + description="COPTIC EPACT DIGIT ONE", + direction="en", + linebreak="al", + unicodeslot=0x102E1, + }, + [0x102E2]={ + category="no", + description="COPTIC EPACT DIGIT TWO", + direction="en", + linebreak="al", + unicodeslot=0x102E2, + }, + [0x102E3]={ + category="no", + description="COPTIC EPACT DIGIT THREE", + direction="en", + linebreak="al", + unicodeslot=0x102E3, + }, + [0x102E4]={ + category="no", + description="COPTIC EPACT DIGIT FOUR", + direction="en", + linebreak="al", + unicodeslot=0x102E4, + }, + [0x102E5]={ + category="no", + description="COPTIC EPACT DIGIT FIVE", + direction="en", + linebreak="al", + unicodeslot=0x102E5, + }, + [0x102E6]={ + category="no", + description="COPTIC EPACT DIGIT SIX", + direction="en", + linebreak="al", + unicodeslot=0x102E6, + }, + [0x102E7]={ + category="no", + description="COPTIC EPACT DIGIT SEVEN", + direction="en", + linebreak="al", + unicodeslot=0x102E7, + }, + [0x102E8]={ + category="no", + description="COPTIC EPACT DIGIT EIGHT", + direction="en", + linebreak="al", + unicodeslot=0x102E8, + }, + [0x102E9]={ + category="no", + description="COPTIC EPACT DIGIT NINE", + direction="en", + linebreak="al", + unicodeslot=0x102E9, + }, + [0x102EA]={ + category="no", + description="COPTIC EPACT NUMBER TEN", + direction="en", + linebreak="al", + unicodeslot=0x102EA, + }, + [0x102EB]={ + category="no", + description="COPTIC EPACT NUMBER TWENTY", + direction="en", + linebreak="al", + unicodeslot=0x102EB, + }, + [0x102EC]={ + category="no", + description="COPTIC EPACT NUMBER THIRTY", + direction="en", + linebreak="al", + unicodeslot=0x102EC, + }, + [0x102ED]={ + category="no", + description="COPTIC EPACT NUMBER FORTY", + direction="en", + linebreak="al", + unicodeslot=0x102ED, + }, + [0x102EE]={ + category="no", + description="COPTIC EPACT NUMBER FIFTY", + direction="en", + linebreak="al", + unicodeslot=0x102EE, + }, + [0x102EF]={ + category="no", + description="COPTIC EPACT NUMBER SIXTY", + direction="en", + linebreak="al", + unicodeslot=0x102EF, + }, + [0x102F0]={ + category="no", + description="COPTIC EPACT NUMBER SEVENTY", + direction="en", + linebreak="al", + unicodeslot=0x102F0, + }, + [0x102F1]={ + category="no", + description="COPTIC EPACT NUMBER EIGHTY", + direction="en", + linebreak="al", + unicodeslot=0x102F1, + }, + [0x102F2]={ + category="no", + description="COPTIC EPACT NUMBER NINETY", + direction="en", + linebreak="al", + unicodeslot=0x102F2, + }, + [0x102F3]={ + category="no", + description="COPTIC EPACT NUMBER ONE HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F3, + }, + [0x102F4]={ + category="no", + description="COPTIC EPACT NUMBER TWO HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F4, + }, + [0x102F5]={ + category="no", + description="COPTIC EPACT NUMBER THREE HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F5, + }, + [0x102F6]={ + category="no", + description="COPTIC EPACT NUMBER FOUR HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F6, + }, + [0x102F7]={ + category="no", + description="COPTIC EPACT NUMBER FIVE HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F7, + }, + [0x102F8]={ + category="no", + description="COPTIC EPACT NUMBER SIX HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F8, + }, + [0x102F9]={ + category="no", + description="COPTIC EPACT NUMBER SEVEN HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102F9, + }, + [0x102FA]={ + category="no", + description="COPTIC EPACT NUMBER EIGHT HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102FA, + }, + [0x102FB]={ + category="no", + description="COPTIC EPACT NUMBER NINE HUNDRED", + direction="en", + linebreak="al", + unicodeslot=0x102FB, + }, [0x10300]={ category="lo", description="OLD ITALIC LETTER A", @@ -135032,6 +138444,13 @@ characters.data={ linebreak="al", unicodeslot=0x1031E, }, + [0x1031F]={ + category="lo", + description="OLD ITALIC LETTER ESS", + direction="l", + linebreak="al", + unicodeslot=0x1031F, + }, [0x10320]={ category="no", description="OLD ITALIC NUMERAL ONE", @@ -135249,6 +138668,312 @@ characters.data={ linebreak="al", unicodeslot=0x1034A, }, + [0x10350]={ + category="lo", + description="OLD PERMIC LETTER AN", + direction="l", + linebreak="al", + unicodeslot=0x10350, + }, + [0x10351]={ + category="lo", + description="OLD PERMIC LETTER BUR", + direction="l", + linebreak="al", + unicodeslot=0x10351, + }, + [0x10352]={ + category="lo", + description="OLD PERMIC LETTER GAI", + direction="l", + linebreak="al", + unicodeslot=0x10352, + }, + [0x10353]={ + category="lo", + description="OLD PERMIC LETTER DOI", + direction="l", + linebreak="al", + unicodeslot=0x10353, + }, + [0x10354]={ + category="lo", + description="OLD PERMIC LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x10354, + }, + [0x10355]={ + category="lo", + description="OLD PERMIC LETTER ZHOI", + direction="l", + linebreak="al", + unicodeslot=0x10355, + }, + [0x10356]={ + category="lo", + description="OLD PERMIC LETTER DZHOI", + direction="l", + linebreak="al", + unicodeslot=0x10356, + }, + [0x10357]={ + category="lo", + description="OLD PERMIC LETTER ZATA", + direction="l", + linebreak="al", + unicodeslot=0x10357, + }, + [0x10358]={ + category="lo", + description="OLD PERMIC LETTER DZITA", + direction="l", + linebreak="al", + unicodeslot=0x10358, + }, + [0x10359]={ + category="lo", + description="OLD PERMIC LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x10359, + }, + [0x1035A]={ + category="lo", + description="OLD PERMIC LETTER KOKE", + direction="l", + linebreak="al", + unicodeslot=0x1035A, + }, + [0x1035B]={ + category="lo", + description="OLD PERMIC LETTER LEI", + direction="l", + linebreak="al", + unicodeslot=0x1035B, + }, + [0x1035C]={ + category="lo", + description="OLD PERMIC LETTER MENOE", + direction="l", + linebreak="al", + unicodeslot=0x1035C, + }, + [0x1035D]={ + category="lo", + description="OLD PERMIC LETTER NENOE", + direction="l", + linebreak="al", + unicodeslot=0x1035D, + }, + [0x1035E]={ + category="lo", + description="OLD PERMIC LETTER VOOI", + direction="l", + linebreak="al", + unicodeslot=0x1035E, + }, + [0x1035F]={ + category="lo", + description="OLD PERMIC LETTER PEEI", + direction="l", + linebreak="al", + unicodeslot=0x1035F, + }, + [0x10360]={ + category="lo", + description="OLD PERMIC LETTER REI", + direction="l", + linebreak="al", + unicodeslot=0x10360, + }, + [0x10361]={ + category="lo", + description="OLD PERMIC LETTER SII", + direction="l", + linebreak="al", + unicodeslot=0x10361, + }, + [0x10362]={ + category="lo", + description="OLD PERMIC LETTER TAI", + direction="l", + linebreak="al", + unicodeslot=0x10362, + }, + [0x10363]={ + category="lo", + description="OLD PERMIC LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x10363, + }, + [0x10364]={ + category="lo", + description="OLD PERMIC LETTER CHERY", + direction="l", + linebreak="al", + unicodeslot=0x10364, + }, + [0x10365]={ + category="lo", + description="OLD PERMIC LETTER SHOOI", + direction="l", + linebreak="al", + unicodeslot=0x10365, + }, + [0x10366]={ + category="lo", + description="OLD PERMIC LETTER SHCHOOI", + direction="l", + linebreak="al", + unicodeslot=0x10366, + }, + [0x10367]={ + category="lo", + description="OLD PERMIC LETTER YRY", + direction="l", + linebreak="al", + unicodeslot=0x10367, + }, + [0x10368]={ + category="lo", + description="OLD PERMIC LETTER YERU", + direction="l", + linebreak="al", + unicodeslot=0x10368, + }, + [0x10369]={ + category="lo", + description="OLD PERMIC LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x10369, + }, + [0x1036A]={ + category="lo", + description="OLD PERMIC LETTER OO", + direction="l", + linebreak="al", + unicodeslot=0x1036A, + }, + [0x1036B]={ + category="lo", + description="OLD PERMIC LETTER EF", + direction="l", + linebreak="al", + unicodeslot=0x1036B, + }, + [0x1036C]={ + category="lo", + description="OLD PERMIC LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x1036C, + }, + [0x1036D]={ + category="lo", + description="OLD PERMIC LETTER TSIU", + direction="l", + linebreak="al", + unicodeslot=0x1036D, + }, + [0x1036E]={ + category="lo", + description="OLD PERMIC LETTER VER", + direction="l", + linebreak="al", + unicodeslot=0x1036E, + }, + [0x1036F]={ + category="lo", + description="OLD PERMIC LETTER YER", + direction="l", + linebreak="al", + unicodeslot=0x1036F, + }, + [0x10370]={ + category="lo", + description="OLD PERMIC LETTER YERI", + direction="l", + linebreak="al", + unicodeslot=0x10370, + }, + [0x10371]={ + category="lo", + description="OLD PERMIC LETTER YAT", + direction="l", + linebreak="al", + unicodeslot=0x10371, + }, + [0x10372]={ + category="lo", + description="OLD PERMIC LETTER IE", + direction="l", + linebreak="al", + unicodeslot=0x10372, + }, + [0x10373]={ + category="lo", + description="OLD PERMIC LETTER YU", + direction="l", + linebreak="al", + unicodeslot=0x10373, + }, + [0x10374]={ + category="lo", + description="OLD PERMIC LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x10374, + }, + [0x10375]={ + category="lo", + description="OLD PERMIC LETTER IA", + direction="l", + linebreak="al", + unicodeslot=0x10375, + }, + [0x10376]={ + category="mn", + combining=0xE6, + description="COMBINING OLD PERMIC LETTER AN", + direction="nsm", + linebreak="cm", + unicodeslot=0x10376, + }, + [0x10377]={ + category="mn", + combining=0xE6, + description="COMBINING OLD PERMIC LETTER DOI", + direction="nsm", + linebreak="cm", + unicodeslot=0x10377, + }, + [0x10378]={ + category="mn", + combining=0xE6, + description="COMBINING OLD PERMIC LETTER ZATA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10378, + }, + [0x10379]={ + category="mn", + combining=0xE6, + description="COMBINING OLD PERMIC LETTER NENOE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10379, + }, + [0x1037A]={ + category="mn", + combining=0xE6, + description="COMBINING OLD PERMIC LETTER SII", + direction="nsm", + linebreak="cm", + unicodeslot=0x1037A, + }, [0x10380]={ category="lo", description="UGARITIC LETTER ALPA", @@ -137072,24974 +140797,35800 @@ characters.data={ linebreak="nu", unicodeslot=0x104A9, }, - [0x10800]={ + [0x10500]={ category="lo", - description="CYPRIOT SYLLABLE A", - direction="r", + description="ELBASAN LETTER A", + direction="l", linebreak="al", - unicodeslot=0x10800, + unicodeslot=0x10500, }, - [0x10801]={ + [0x10501]={ category="lo", - description="CYPRIOT SYLLABLE E", - direction="r", + description="ELBASAN LETTER BE", + direction="l", linebreak="al", - unicodeslot=0x10801, + unicodeslot=0x10501, }, - [0x10802]={ + [0x10502]={ category="lo", - description="CYPRIOT SYLLABLE I", - direction="r", + description="ELBASAN LETTER CE", + direction="l", linebreak="al", - unicodeslot=0x10802, + unicodeslot=0x10502, }, - [0x10803]={ + [0x10503]={ category="lo", - description="CYPRIOT SYLLABLE O", - direction="r", + description="ELBASAN LETTER CHE", + direction="l", linebreak="al", - unicodeslot=0x10803, + unicodeslot=0x10503, }, - [0x10804]={ + [0x10504]={ category="lo", - description="CYPRIOT SYLLABLE U", - direction="r", + description="ELBASAN LETTER DE", + direction="l", linebreak="al", - unicodeslot=0x10804, + unicodeslot=0x10504, }, - [0x10805]={ + [0x10505]={ category="lo", - description="CYPRIOT SYLLABLE JA", - direction="r", + description="ELBASAN LETTER NDE", + direction="l", linebreak="al", - unicodeslot=0x10805, + unicodeslot=0x10505, }, - [0x10808]={ + [0x10506]={ category="lo", - description="CYPRIOT SYLLABLE JO", - direction="r", + description="ELBASAN LETTER DHE", + direction="l", linebreak="al", - unicodeslot=0x10808, + unicodeslot=0x10506, }, - [0x1080A]={ + [0x10507]={ category="lo", - description="CYPRIOT SYLLABLE KA", - direction="r", + description="ELBASAN LETTER EI", + direction="l", linebreak="al", - unicodeslot=0x1080A, + unicodeslot=0x10507, }, - [0x1080B]={ + [0x10508]={ category="lo", - description="CYPRIOT SYLLABLE KE", - direction="r", + description="ELBASAN LETTER E", + direction="l", linebreak="al", - unicodeslot=0x1080B, + unicodeslot=0x10508, }, - [0x1080C]={ + [0x10509]={ category="lo", - description="CYPRIOT SYLLABLE KI", - direction="r", + description="ELBASAN LETTER FE", + direction="l", linebreak="al", - unicodeslot=0x1080C, + unicodeslot=0x10509, }, - [0x1080D]={ + [0x1050A]={ category="lo", - description="CYPRIOT SYLLABLE KO", - direction="r", + description="ELBASAN LETTER GE", + direction="l", linebreak="al", - unicodeslot=0x1080D, + unicodeslot=0x1050A, }, - [0x1080E]={ + [0x1050B]={ category="lo", - description="CYPRIOT SYLLABLE KU", - direction="r", + description="ELBASAN LETTER GJE", + direction="l", linebreak="al", - unicodeslot=0x1080E, + unicodeslot=0x1050B, }, - [0x1080F]={ + [0x1050C]={ category="lo", - description="CYPRIOT SYLLABLE LA", - direction="r", + description="ELBASAN LETTER HE", + direction="l", linebreak="al", - unicodeslot=0x1080F, + unicodeslot=0x1050C, }, - [0x10810]={ + [0x1050D]={ category="lo", - description="CYPRIOT SYLLABLE LE", - direction="r", + description="ELBASAN LETTER I", + direction="l", linebreak="al", - unicodeslot=0x10810, + unicodeslot=0x1050D, }, - [0x10811]={ + [0x1050E]={ category="lo", - description="CYPRIOT SYLLABLE LI", - direction="r", + description="ELBASAN LETTER JE", + direction="l", linebreak="al", - unicodeslot=0x10811, + unicodeslot=0x1050E, }, - [0x10812]={ + [0x1050F]={ category="lo", - description="CYPRIOT SYLLABLE LO", - direction="r", + description="ELBASAN LETTER KE", + direction="l", linebreak="al", - unicodeslot=0x10812, + unicodeslot=0x1050F, }, - [0x10813]={ + [0x10510]={ category="lo", - description="CYPRIOT SYLLABLE LU", - direction="r", + description="ELBASAN LETTER LE", + direction="l", linebreak="al", - unicodeslot=0x10813, + unicodeslot=0x10510, }, - [0x10814]={ + [0x10511]={ category="lo", - description="CYPRIOT SYLLABLE MA", - direction="r", + description="ELBASAN LETTER LLE", + direction="l", linebreak="al", - unicodeslot=0x10814, + unicodeslot=0x10511, }, - [0x10815]={ + [0x10512]={ category="lo", - description="CYPRIOT SYLLABLE ME", - direction="r", + description="ELBASAN LETTER ME", + direction="l", linebreak="al", - unicodeslot=0x10815, + unicodeslot=0x10512, }, - [0x10816]={ + [0x10513]={ category="lo", - description="CYPRIOT SYLLABLE MI", - direction="r", + description="ELBASAN LETTER NE", + direction="l", linebreak="al", - unicodeslot=0x10816, + unicodeslot=0x10513, }, - [0x10817]={ + [0x10514]={ category="lo", - description="CYPRIOT SYLLABLE MO", - direction="r", + description="ELBASAN LETTER NA", + direction="l", linebreak="al", - unicodeslot=0x10817, + unicodeslot=0x10514, }, - [0x10818]={ + [0x10515]={ category="lo", - description="CYPRIOT SYLLABLE MU", - direction="r", + description="ELBASAN LETTER NJE", + direction="l", linebreak="al", - unicodeslot=0x10818, + unicodeslot=0x10515, }, - [0x10819]={ + [0x10516]={ category="lo", - description="CYPRIOT SYLLABLE NA", - direction="r", + description="ELBASAN LETTER O", + direction="l", linebreak="al", - unicodeslot=0x10819, + unicodeslot=0x10516, }, - [0x1081A]={ + [0x10517]={ category="lo", - description="CYPRIOT SYLLABLE NE", - direction="r", + description="ELBASAN LETTER PE", + direction="l", linebreak="al", - unicodeslot=0x1081A, + unicodeslot=0x10517, }, - [0x1081B]={ + [0x10518]={ category="lo", - description="CYPRIOT SYLLABLE NI", - direction="r", + description="ELBASAN LETTER QE", + direction="l", linebreak="al", - unicodeslot=0x1081B, + unicodeslot=0x10518, }, - [0x1081C]={ + [0x10519]={ category="lo", - description="CYPRIOT SYLLABLE NO", - direction="r", + description="ELBASAN LETTER RE", + direction="l", linebreak="al", - unicodeslot=0x1081C, + unicodeslot=0x10519, }, - [0x1081D]={ + [0x1051A]={ category="lo", - description="CYPRIOT SYLLABLE NU", - direction="r", + description="ELBASAN LETTER RRE", + direction="l", linebreak="al", - unicodeslot=0x1081D, + unicodeslot=0x1051A, }, - [0x1081E]={ + [0x1051B]={ category="lo", - description="CYPRIOT SYLLABLE PA", - direction="r", + description="ELBASAN LETTER SE", + direction="l", linebreak="al", - unicodeslot=0x1081E, + unicodeslot=0x1051B, }, - [0x1081F]={ + [0x1051C]={ category="lo", - description="CYPRIOT SYLLABLE PE", - direction="r", + description="ELBASAN LETTER SHE", + direction="l", linebreak="al", - unicodeslot=0x1081F, + unicodeslot=0x1051C, }, - [0x10820]={ + [0x1051D]={ category="lo", - description="CYPRIOT SYLLABLE PI", - direction="r", + description="ELBASAN LETTER TE", + direction="l", linebreak="al", - unicodeslot=0x10820, + unicodeslot=0x1051D, }, - [0x10821]={ + [0x1051E]={ category="lo", - description="CYPRIOT SYLLABLE PO", - direction="r", + description="ELBASAN LETTER THE", + direction="l", linebreak="al", - unicodeslot=0x10821, + unicodeslot=0x1051E, }, - [0x10822]={ + [0x1051F]={ category="lo", - description="CYPRIOT SYLLABLE PU", - direction="r", + description="ELBASAN LETTER U", + direction="l", linebreak="al", - unicodeslot=0x10822, + unicodeslot=0x1051F, }, - [0x10823]={ + [0x10520]={ category="lo", - description="CYPRIOT SYLLABLE RA", - direction="r", + description="ELBASAN LETTER VE", + direction="l", linebreak="al", - unicodeslot=0x10823, + unicodeslot=0x10520, }, - [0x10824]={ + [0x10521]={ category="lo", - description="CYPRIOT SYLLABLE RE", - direction="r", + description="ELBASAN LETTER XE", + direction="l", linebreak="al", - unicodeslot=0x10824, + unicodeslot=0x10521, }, - [0x10825]={ + [0x10522]={ category="lo", - description="CYPRIOT SYLLABLE RI", - direction="r", + description="ELBASAN LETTER Y", + direction="l", linebreak="al", - unicodeslot=0x10825, + unicodeslot=0x10522, }, - [0x10826]={ + [0x10523]={ category="lo", - description="CYPRIOT SYLLABLE RO", - direction="r", + description="ELBASAN LETTER ZE", + direction="l", linebreak="al", - unicodeslot=0x10826, + unicodeslot=0x10523, }, - [0x10827]={ + [0x10524]={ category="lo", - description="CYPRIOT SYLLABLE RU", - direction="r", + description="ELBASAN LETTER ZHE", + direction="l", linebreak="al", - unicodeslot=0x10827, + unicodeslot=0x10524, }, - [0x10828]={ + [0x10525]={ category="lo", - description="CYPRIOT SYLLABLE SA", - direction="r", + description="ELBASAN LETTER GHE", + direction="l", linebreak="al", - unicodeslot=0x10828, + unicodeslot=0x10525, }, - [0x10829]={ + [0x10526]={ category="lo", - description="CYPRIOT SYLLABLE SE", - direction="r", + description="ELBASAN LETTER GHAMMA", + direction="l", linebreak="al", - unicodeslot=0x10829, + unicodeslot=0x10526, }, - [0x1082A]={ + [0x10527]={ category="lo", - description="CYPRIOT SYLLABLE SI", - direction="r", + description="ELBASAN LETTER KHE", + direction="l", linebreak="al", - unicodeslot=0x1082A, + unicodeslot=0x10527, }, - [0x1082B]={ + [0x10530]={ category="lo", - description="CYPRIOT SYLLABLE SO", - direction="r", + description="CAUCASIAN ALBANIAN LETTER ALT", + direction="l", linebreak="al", - unicodeslot=0x1082B, + unicodeslot=0x10530, }, - [0x1082C]={ + [0x10531]={ category="lo", - description="CYPRIOT SYLLABLE SU", - direction="r", + description="CAUCASIAN ALBANIAN LETTER BET", + direction="l", linebreak="al", - unicodeslot=0x1082C, + unicodeslot=0x10531, }, - [0x1082D]={ + [0x10532]={ category="lo", - description="CYPRIOT SYLLABLE TA", - direction="r", + description="CAUCASIAN ALBANIAN LETTER GIM", + direction="l", linebreak="al", - unicodeslot=0x1082D, + unicodeslot=0x10532, }, - [0x1082E]={ + [0x10533]={ category="lo", - description="CYPRIOT SYLLABLE TE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER DAT", + direction="l", linebreak="al", - unicodeslot=0x1082E, + unicodeslot=0x10533, }, - [0x1082F]={ + [0x10534]={ category="lo", - description="CYPRIOT SYLLABLE TI", - direction="r", + description="CAUCASIAN ALBANIAN LETTER EB", + direction="l", linebreak="al", - unicodeslot=0x1082F, + unicodeslot=0x10534, }, - [0x10830]={ + [0x10535]={ category="lo", - description="CYPRIOT SYLLABLE TO", - direction="r", + description="CAUCASIAN ALBANIAN LETTER ZARL", + direction="l", linebreak="al", - unicodeslot=0x10830, + unicodeslot=0x10535, }, - [0x10831]={ + [0x10536]={ category="lo", - description="CYPRIOT SYLLABLE TU", - direction="r", + description="CAUCASIAN ALBANIAN LETTER EYN", + direction="l", linebreak="al", - unicodeslot=0x10831, + unicodeslot=0x10536, }, - [0x10832]={ + [0x10537]={ category="lo", - description="CYPRIOT SYLLABLE WA", - direction="r", + description="CAUCASIAN ALBANIAN LETTER ZHIL", + direction="l", linebreak="al", - unicodeslot=0x10832, + unicodeslot=0x10537, }, - [0x10833]={ + [0x10538]={ category="lo", - description="CYPRIOT SYLLABLE WE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER TAS", + direction="l", linebreak="al", - unicodeslot=0x10833, + unicodeslot=0x10538, }, - [0x10834]={ + [0x10539]={ category="lo", - description="CYPRIOT SYLLABLE WI", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CHA", + direction="l", linebreak="al", - unicodeslot=0x10834, + unicodeslot=0x10539, }, - [0x10835]={ + [0x1053A]={ category="lo", - description="CYPRIOT SYLLABLE WO", - direction="r", + description="CAUCASIAN ALBANIAN LETTER YOWD", + direction="l", linebreak="al", - unicodeslot=0x10835, + unicodeslot=0x1053A, }, - [0x10837]={ + [0x1053B]={ category="lo", - description="CYPRIOT SYLLABLE XA", - direction="r", + description="CAUCASIAN ALBANIAN LETTER ZHA", + direction="l", linebreak="al", - unicodeslot=0x10837, + unicodeslot=0x1053B, }, - [0x10838]={ + [0x1053C]={ category="lo", - description="CYPRIOT SYLLABLE XE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER IRB", + direction="l", linebreak="al", - unicodeslot=0x10838, + unicodeslot=0x1053C, }, - [0x1083C]={ + [0x1053D]={ category="lo", - description="CYPRIOT SYLLABLE ZA", - direction="r", + description="CAUCASIAN ALBANIAN LETTER SHA", + direction="l", linebreak="al", - unicodeslot=0x1083C, + unicodeslot=0x1053D, }, - [0x1083F]={ + [0x1053E]={ category="lo", - description="CYPRIOT SYLLABLE ZO", - direction="r", + description="CAUCASIAN ALBANIAN LETTER LAN", + direction="l", linebreak="al", - unicodeslot=0x1083F, + unicodeslot=0x1053E, }, - [0x10840]={ + [0x1053F]={ category="lo", - description="IMPERIAL ARAMAIC LETTER ALEPH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER INYA", + direction="l", linebreak="al", - unicodeslot=0x10840, + unicodeslot=0x1053F, }, - [0x10841]={ + [0x10540]={ category="lo", - description="IMPERIAL ARAMAIC LETTER BETH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER XEYN", + direction="l", linebreak="al", - unicodeslot=0x10841, + unicodeslot=0x10540, }, - [0x10842]={ + [0x10541]={ category="lo", - description="IMPERIAL ARAMAIC LETTER GIMEL", - direction="r", + description="CAUCASIAN ALBANIAN LETTER DYAN", + direction="l", linebreak="al", - unicodeslot=0x10842, + unicodeslot=0x10541, }, - [0x10843]={ + [0x10542]={ category="lo", - description="IMPERIAL ARAMAIC LETTER DALETH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CAR", + direction="l", linebreak="al", - unicodeslot=0x10843, + unicodeslot=0x10542, }, - [0x10844]={ + [0x10543]={ category="lo", - description="IMPERIAL ARAMAIC LETTER HE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER JHOX", + direction="l", linebreak="al", - unicodeslot=0x10844, + unicodeslot=0x10543, }, - [0x10845]={ + [0x10544]={ category="lo", - description="IMPERIAL ARAMAIC LETTER WAW", - direction="r", + description="CAUCASIAN ALBANIAN LETTER KAR", + direction="l", linebreak="al", - unicodeslot=0x10845, + unicodeslot=0x10544, }, - [0x10846]={ + [0x10545]={ category="lo", - description="IMPERIAL ARAMAIC LETTER ZAYIN", - direction="r", + description="CAUCASIAN ALBANIAN LETTER LYIT", + direction="l", linebreak="al", - unicodeslot=0x10846, + unicodeslot=0x10545, }, - [0x10847]={ + [0x10546]={ category="lo", - description="IMPERIAL ARAMAIC LETTER HETH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER HEYT", + direction="l", linebreak="al", - unicodeslot=0x10847, + unicodeslot=0x10546, }, - [0x10848]={ + [0x10547]={ category="lo", - description="IMPERIAL ARAMAIC LETTER TETH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER QAY", + direction="l", linebreak="al", - unicodeslot=0x10848, + unicodeslot=0x10547, }, - [0x10849]={ + [0x10548]={ category="lo", - description="IMPERIAL ARAMAIC LETTER YODH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER AOR", + direction="l", linebreak="al", - unicodeslot=0x10849, + unicodeslot=0x10548, }, - [0x1084A]={ + [0x10549]={ category="lo", - description="IMPERIAL ARAMAIC LETTER KAPH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CHOY", + direction="l", linebreak="al", - unicodeslot=0x1084A, + unicodeslot=0x10549, }, - [0x1084B]={ + [0x1054A]={ category="lo", - description="IMPERIAL ARAMAIC LETTER LAMEDH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CHI", + direction="l", linebreak="al", - unicodeslot=0x1084B, + unicodeslot=0x1054A, }, - [0x1084C]={ + [0x1054B]={ category="lo", - description="IMPERIAL ARAMAIC LETTER MEM", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CYAY", + direction="l", linebreak="al", - unicodeslot=0x1084C, + unicodeslot=0x1054B, }, - [0x1084D]={ + [0x1054C]={ category="lo", - description="IMPERIAL ARAMAIC LETTER NUN", - direction="r", + description="CAUCASIAN ALBANIAN LETTER MAQ", + direction="l", linebreak="al", - unicodeslot=0x1084D, + unicodeslot=0x1054C, }, - [0x1084E]={ + [0x1054D]={ category="lo", - description="IMPERIAL ARAMAIC LETTER SAMEKH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER QAR", + direction="l", linebreak="al", - unicodeslot=0x1084E, + unicodeslot=0x1054D, }, - [0x1084F]={ + [0x1054E]={ category="lo", - description="IMPERIAL ARAMAIC LETTER AYIN", - direction="r", + description="CAUCASIAN ALBANIAN LETTER NOWC", + direction="l", linebreak="al", - unicodeslot=0x1084F, + unicodeslot=0x1054E, }, - [0x10850]={ + [0x1054F]={ category="lo", - description="IMPERIAL ARAMAIC LETTER PE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER DZYAY", + direction="l", linebreak="al", - unicodeslot=0x10850, + unicodeslot=0x1054F, }, - [0x10851]={ + [0x10550]={ category="lo", - description="IMPERIAL ARAMAIC LETTER SADHE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER SHAK", + direction="l", linebreak="al", - unicodeslot=0x10851, + unicodeslot=0x10550, }, - [0x10852]={ + [0x10551]={ category="lo", - description="IMPERIAL ARAMAIC LETTER QOPH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER JAYN", + direction="l", linebreak="al", - unicodeslot=0x10852, + unicodeslot=0x10551, }, - [0x10853]={ + [0x10552]={ category="lo", - description="IMPERIAL ARAMAIC LETTER RESH", - direction="r", + description="CAUCASIAN ALBANIAN LETTER ON", + direction="l", linebreak="al", - unicodeslot=0x10853, + unicodeslot=0x10552, }, - [0x10854]={ + [0x10553]={ category="lo", - description="IMPERIAL ARAMAIC LETTER SHIN", - direction="r", + description="CAUCASIAN ALBANIAN LETTER TYAY", + direction="l", linebreak="al", - unicodeslot=0x10854, + unicodeslot=0x10553, }, - [0x10855]={ + [0x10554]={ category="lo", - description="IMPERIAL ARAMAIC LETTER TAW", - direction="r", + description="CAUCASIAN ALBANIAN LETTER FAM", + direction="l", linebreak="al", - unicodeslot=0x10855, - }, - [0x10857]={ - category="po", - description="IMPERIAL ARAMAIC SECTION SIGN", - direction="r", - linebreak="ba", - unicodeslot=0x10857, + unicodeslot=0x10554, }, - [0x10858]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER ONE", - direction="r", + [0x10555]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER DZAY", + direction="l", linebreak="al", - unicodeslot=0x10858, + unicodeslot=0x10555, }, - [0x10859]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER TWO", - direction="r", + [0x10556]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER CHAT", + direction="l", linebreak="al", - unicodeslot=0x10859, + unicodeslot=0x10556, }, - [0x1085A]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER THREE", - direction="r", + [0x10557]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER PEN", + direction="l", linebreak="al", - unicodeslot=0x1085A, + unicodeslot=0x10557, }, - [0x1085B]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER TEN", - direction="r", + [0x10558]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER GHEYS", + direction="l", linebreak="al", - unicodeslot=0x1085B, + unicodeslot=0x10558, }, - [0x1085C]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER TWENTY", - direction="r", + [0x10559]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER RAT", + direction="l", linebreak="al", - unicodeslot=0x1085C, + unicodeslot=0x10559, }, - [0x1085D]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER ONE HUNDRED", - direction="r", + [0x1055A]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER SEYK", + direction="l", linebreak="al", - unicodeslot=0x1085D, + unicodeslot=0x1055A, }, - [0x1085E]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER ONE THOUSAND", - direction="r", + [0x1055B]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER VEYZ", + direction="l", linebreak="al", - unicodeslot=0x1085E, + unicodeslot=0x1055B, }, - [0x1085F]={ - category="no", - description="IMPERIAL ARAMAIC NUMBER TEN THOUSAND", - direction="r", + [0x1055C]={ + category="lo", + description="CAUCASIAN ALBANIAN LETTER TIWR", + direction="l", linebreak="al", - unicodeslot=0x1085F, + unicodeslot=0x1055C, }, - [0x10900]={ + [0x1055D]={ category="lo", - description="PHOENICIAN LETTER ALF", - direction="r", + description="CAUCASIAN ALBANIAN LETTER SHOY", + direction="l", linebreak="al", - unicodeslot=0x10900, + unicodeslot=0x1055D, }, - [0x10901]={ + [0x1055E]={ category="lo", - description="PHOENICIAN LETTER BET", - direction="r", + description="CAUCASIAN ALBANIAN LETTER IWN", + direction="l", linebreak="al", - unicodeslot=0x10901, + unicodeslot=0x1055E, }, - [0x10902]={ + [0x1055F]={ category="lo", - description="PHOENICIAN LETTER GAML", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CYAW", + direction="l", linebreak="al", - unicodeslot=0x10902, + unicodeslot=0x1055F, }, - [0x10903]={ + [0x10560]={ category="lo", - description="PHOENICIAN LETTER DELT", - direction="r", + description="CAUCASIAN ALBANIAN LETTER CAYN", + direction="l", linebreak="al", - unicodeslot=0x10903, + unicodeslot=0x10560, }, - [0x10904]={ + [0x10561]={ category="lo", - description="PHOENICIAN LETTER HE", - direction="r", + description="CAUCASIAN ALBANIAN LETTER YAYD", + direction="l", linebreak="al", - unicodeslot=0x10904, + unicodeslot=0x10561, }, - [0x10905]={ + [0x10562]={ category="lo", - description="PHOENICIAN LETTER WAU", - direction="r", + description="CAUCASIAN ALBANIAN LETTER PIWR", + direction="l", linebreak="al", - unicodeslot=0x10905, + unicodeslot=0x10562, }, - [0x10906]={ + [0x10563]={ category="lo", - description="PHOENICIAN LETTER ZAI", - direction="r", + description="CAUCASIAN ALBANIAN LETTER KIW", + direction="l", linebreak="al", - unicodeslot=0x10906, + unicodeslot=0x10563, }, - [0x10907]={ - category="lo", - description="PHOENICIAN LETTER HET", - direction="r", + [0x1056F]={ + category="po", + description="CAUCASIAN ALBANIAN CITATION MARK", + direction="l", linebreak="al", - unicodeslot=0x10907, + unicodeslot=0x1056F, }, - [0x10908]={ + [0x10600]={ category="lo", - description="PHOENICIAN LETTER TET", - direction="r", + description="LINEAR A SIGN AB001", + direction="l", linebreak="al", - unicodeslot=0x10908, + unicodeslot=0x10600, }, - [0x10909]={ + [0x10601]={ category="lo", - description="PHOENICIAN LETTER YOD", - direction="r", + description="LINEAR A SIGN AB002", + direction="l", linebreak="al", - unicodeslot=0x10909, + unicodeslot=0x10601, }, - [0x1090A]={ + [0x10602]={ category="lo", - description="PHOENICIAN LETTER KAF", - direction="r", + description="LINEAR A SIGN AB003", + direction="l", linebreak="al", - unicodeslot=0x1090A, + unicodeslot=0x10602, }, - [0x1090B]={ + [0x10603]={ category="lo", - description="PHOENICIAN LETTER LAMD", - direction="r", + description="LINEAR A SIGN AB004", + direction="l", linebreak="al", - unicodeslot=0x1090B, + unicodeslot=0x10603, }, - [0x1090C]={ + [0x10604]={ category="lo", - description="PHOENICIAN LETTER MEM", - direction="r", + description="LINEAR A SIGN AB005", + direction="l", linebreak="al", - unicodeslot=0x1090C, + unicodeslot=0x10604, }, - [0x1090D]={ + [0x10605]={ category="lo", - description="PHOENICIAN LETTER NUN", - direction="r", + description="LINEAR A SIGN AB006", + direction="l", linebreak="al", - unicodeslot=0x1090D, + unicodeslot=0x10605, }, - [0x1090E]={ + [0x10606]={ category="lo", - description="PHOENICIAN LETTER SEMK", - direction="r", + description="LINEAR A SIGN AB007", + direction="l", linebreak="al", - unicodeslot=0x1090E, + unicodeslot=0x10606, }, - [0x1090F]={ + [0x10607]={ category="lo", - description="PHOENICIAN LETTER AIN", - direction="r", + description="LINEAR A SIGN AB008", + direction="l", linebreak="al", - unicodeslot=0x1090F, + unicodeslot=0x10607, }, - [0x10910]={ + [0x10608]={ category="lo", - description="PHOENICIAN LETTER PE", - direction="r", + description="LINEAR A SIGN AB009", + direction="l", linebreak="al", - unicodeslot=0x10910, + unicodeslot=0x10608, }, - [0x10911]={ + [0x10609]={ category="lo", - description="PHOENICIAN LETTER SADE", - direction="r", + description="LINEAR A SIGN AB010", + direction="l", linebreak="al", - unicodeslot=0x10911, + unicodeslot=0x10609, }, - [0x10912]={ + [0x1060A]={ category="lo", - description="PHOENICIAN LETTER QOF", - direction="r", + description="LINEAR A SIGN AB011", + direction="l", linebreak="al", - unicodeslot=0x10912, + unicodeslot=0x1060A, }, - [0x10913]={ + [0x1060B]={ category="lo", - description="PHOENICIAN LETTER ROSH", - direction="r", + description="LINEAR A SIGN AB013", + direction="l", linebreak="al", - unicodeslot=0x10913, + unicodeslot=0x1060B, }, - [0x10914]={ + [0x1060C]={ category="lo", - description="PHOENICIAN LETTER SHIN", - direction="r", + description="LINEAR A SIGN AB016", + direction="l", linebreak="al", - unicodeslot=0x10914, + unicodeslot=0x1060C, }, - [0x10915]={ + [0x1060D]={ category="lo", - description="PHOENICIAN LETTER TAU", - direction="r", + description="LINEAR A SIGN AB017", + direction="l", linebreak="al", - unicodeslot=0x10915, + unicodeslot=0x1060D, }, - [0x10916]={ - category="no", - description="PHOENICIAN NUMBER ONE", - direction="r", + [0x1060E]={ + category="lo", + description="LINEAR A SIGN AB020", + direction="l", linebreak="al", - unicodeslot=0x10916, + unicodeslot=0x1060E, }, - [0x10917]={ - category="no", - description="PHOENICIAN NUMBER TEN", - direction="r", + [0x1060F]={ + category="lo", + description="LINEAR A SIGN AB021", + direction="l", linebreak="al", - unicodeslot=0x10917, + unicodeslot=0x1060F, }, - [0x10918]={ - category="no", - description="PHOENICIAN NUMBER TWENTY", - direction="r", + [0x10610]={ + category="lo", + description="LINEAR A SIGN AB021F", + direction="l", linebreak="al", - unicodeslot=0x10918, + unicodeslot=0x10610, }, - [0x10919]={ - category="no", - description="PHOENICIAN NUMBER ONE HUNDRED", - direction="r", + [0x10611]={ + category="lo", + description="LINEAR A SIGN AB021M", + direction="l", linebreak="al", - unicodeslot=0x10919, + unicodeslot=0x10611, }, - [0x1091A]={ - category="no", - description="PHOENICIAN NUMBER TWO", - direction="r", + [0x10612]={ + category="lo", + description="LINEAR A SIGN AB022", + direction="l", linebreak="al", - unicodeslot=0x1091A, + unicodeslot=0x10612, }, - [0x1091B]={ - category="no", - description="PHOENICIAN NUMBER THREE", - direction="r", + [0x10613]={ + category="lo", + description="LINEAR A SIGN AB022F", + direction="l", linebreak="al", - unicodeslot=0x1091B, + unicodeslot=0x10613, }, - [0x1091F]={ - category="po", - description="PHOENICIAN WORD SEPARATOR", - direction="on", - linebreak="ba", - unicodeslot=0x1091F, + [0x10614]={ + category="lo", + description="LINEAR A SIGN AB022M", + direction="l", + linebreak="al", + unicodeslot=0x10614, }, - [0x10920]={ + [0x10615]={ category="lo", - description="LYDIAN LETTER A", - direction="r", + description="LINEAR A SIGN AB023", + direction="l", linebreak="al", - unicodeslot=0x10920, + unicodeslot=0x10615, }, - [0x10921]={ + [0x10616]={ category="lo", - description="LYDIAN LETTER B", - direction="r", + description="LINEAR A SIGN AB023M", + direction="l", linebreak="al", - unicodeslot=0x10921, + unicodeslot=0x10616, }, - [0x10922]={ + [0x10617]={ category="lo", - description="LYDIAN LETTER G", - direction="r", + description="LINEAR A SIGN AB024", + direction="l", linebreak="al", - unicodeslot=0x10922, + unicodeslot=0x10617, }, - [0x10923]={ + [0x10618]={ category="lo", - description="LYDIAN LETTER D", - direction="r", + description="LINEAR A SIGN AB026", + direction="l", linebreak="al", - unicodeslot=0x10923, + unicodeslot=0x10618, }, - [0x10924]={ + [0x10619]={ category="lo", - description="LYDIAN LETTER E", - direction="r", + description="LINEAR A SIGN AB027", + direction="l", linebreak="al", - unicodeslot=0x10924, + unicodeslot=0x10619, }, - [0x10925]={ + [0x1061A]={ category="lo", - description="LYDIAN LETTER V", - direction="r", + description="LINEAR A SIGN AB028", + direction="l", linebreak="al", - unicodeslot=0x10925, + unicodeslot=0x1061A, }, - [0x10926]={ + [0x1061B]={ category="lo", - description="LYDIAN LETTER I", - direction="r", + description="LINEAR A SIGN A028B", + direction="l", linebreak="al", - unicodeslot=0x10926, + unicodeslot=0x1061B, }, - [0x10927]={ + [0x1061C]={ category="lo", - description="LYDIAN LETTER Y", - direction="r", + description="LINEAR A SIGN AB029", + direction="l", linebreak="al", - unicodeslot=0x10927, + unicodeslot=0x1061C, }, - [0x10928]={ + [0x1061D]={ category="lo", - description="LYDIAN LETTER K", - direction="r", + description="LINEAR A SIGN AB030", + direction="l", linebreak="al", - unicodeslot=0x10928, + unicodeslot=0x1061D, }, - [0x10929]={ + [0x1061E]={ category="lo", - description="LYDIAN LETTER L", - direction="r", + description="LINEAR A SIGN AB031", + direction="l", linebreak="al", - unicodeslot=0x10929, + unicodeslot=0x1061E, }, - [0x1092A]={ + [0x1061F]={ category="lo", - description="LYDIAN LETTER M", - direction="r", + description="LINEAR A SIGN AB034", + direction="l", linebreak="al", - unicodeslot=0x1092A, + unicodeslot=0x1061F, }, - [0x1092B]={ + [0x10620]={ category="lo", - description="LYDIAN LETTER N", - direction="r", + description="LINEAR A SIGN AB037", + direction="l", linebreak="al", - unicodeslot=0x1092B, + unicodeslot=0x10620, }, - [0x1092C]={ + [0x10621]={ category="lo", - description="LYDIAN LETTER O", - direction="r", + description="LINEAR A SIGN AB038", + direction="l", linebreak="al", - unicodeslot=0x1092C, + unicodeslot=0x10621, }, - [0x1092D]={ + [0x10622]={ category="lo", - description="LYDIAN LETTER R", - direction="r", + description="LINEAR A SIGN AB039", + direction="l", linebreak="al", - unicodeslot=0x1092D, + unicodeslot=0x10622, }, - [0x1092E]={ + [0x10623]={ category="lo", - description="LYDIAN LETTER SS", - direction="r", + description="LINEAR A SIGN AB040", + direction="l", linebreak="al", - unicodeslot=0x1092E, + unicodeslot=0x10623, }, - [0x1092F]={ + [0x10624]={ category="lo", - description="LYDIAN LETTER T", - direction="r", + description="LINEAR A SIGN AB041", + direction="l", linebreak="al", - unicodeslot=0x1092F, + unicodeslot=0x10624, }, - [0x10930]={ + [0x10625]={ category="lo", - description="LYDIAN LETTER U", - direction="r", + description="LINEAR A SIGN AB044", + direction="l", linebreak="al", - unicodeslot=0x10930, + unicodeslot=0x10625, }, - [0x10931]={ + [0x10626]={ category="lo", - description="LYDIAN LETTER F", - direction="r", + description="LINEAR A SIGN AB045", + direction="l", linebreak="al", - unicodeslot=0x10931, + unicodeslot=0x10626, }, - [0x10932]={ + [0x10627]={ category="lo", - description="LYDIAN LETTER Q", - direction="r", + description="LINEAR A SIGN AB046", + direction="l", linebreak="al", - unicodeslot=0x10932, + unicodeslot=0x10627, }, - [0x10933]={ + [0x10628]={ category="lo", - description="LYDIAN LETTER S", - direction="r", + description="LINEAR A SIGN AB047", + direction="l", linebreak="al", - unicodeslot=0x10933, + unicodeslot=0x10628, }, - [0x10934]={ + [0x10629]={ category="lo", - description="LYDIAN LETTER TT", - direction="r", + description="LINEAR A SIGN AB048", + direction="l", linebreak="al", - unicodeslot=0x10934, + unicodeslot=0x10629, }, - [0x10935]={ + [0x1062A]={ category="lo", - description="LYDIAN LETTER AN", - direction="r", + description="LINEAR A SIGN AB049", + direction="l", linebreak="al", - unicodeslot=0x10935, + unicodeslot=0x1062A, }, - [0x10936]={ + [0x1062B]={ category="lo", - description="LYDIAN LETTER EN", - direction="r", + description="LINEAR A SIGN AB050", + direction="l", linebreak="al", - unicodeslot=0x10936, + unicodeslot=0x1062B, }, - [0x10937]={ + [0x1062C]={ category="lo", - description="LYDIAN LETTER LY", - direction="r", + description="LINEAR A SIGN AB051", + direction="l", linebreak="al", - unicodeslot=0x10937, + unicodeslot=0x1062C, }, - [0x10938]={ + [0x1062D]={ category="lo", - description="LYDIAN LETTER NN", - direction="r", + description="LINEAR A SIGN AB053", + direction="l", linebreak="al", - unicodeslot=0x10938, + unicodeslot=0x1062D, }, - [0x10939]={ + [0x1062E]={ category="lo", - description="LYDIAN LETTER C", - direction="r", + description="LINEAR A SIGN AB054", + direction="l", linebreak="al", - unicodeslot=0x10939, + unicodeslot=0x1062E, }, - [0x1093F]={ - category="po", - description="LYDIAN TRIANGULAR MARK", - direction="r", + [0x1062F]={ + category="lo", + description="LINEAR A SIGN AB055", + direction="l", linebreak="al", - unicodeslot=0x1093F, + unicodeslot=0x1062F, }, - [0x10980]={ + [0x10630]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER A", - direction="r", + description="LINEAR A SIGN AB056", + direction="l", linebreak="al", - unicodeslot=0x10980, + unicodeslot=0x10630, }, - [0x10981]={ + [0x10631]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER E", - direction="r", + description="LINEAR A SIGN AB057", + direction="l", linebreak="al", - unicodeslot=0x10981, + unicodeslot=0x10631, }, - [0x10982]={ + [0x10632]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER I", - direction="r", + description="LINEAR A SIGN AB058", + direction="l", linebreak="al", - unicodeslot=0x10982, + unicodeslot=0x10632, }, - [0x10983]={ + [0x10633]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER O", - direction="r", + description="LINEAR A SIGN AB059", + direction="l", linebreak="al", - unicodeslot=0x10983, + unicodeslot=0x10633, }, - [0x10984]={ + [0x10634]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER YA", - direction="r", + description="LINEAR A SIGN AB060", + direction="l", linebreak="al", - unicodeslot=0x10984, + unicodeslot=0x10634, }, - [0x10985]={ + [0x10635]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER WA", - direction="r", + description="LINEAR A SIGN AB061", + direction="l", linebreak="al", - unicodeslot=0x10985, + unicodeslot=0x10635, }, - [0x10986]={ + [0x10636]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER BA", - direction="r", + description="LINEAR A SIGN AB065", + direction="l", linebreak="al", - unicodeslot=0x10986, + unicodeslot=0x10636, }, - [0x10987]={ + [0x10637]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER BA-2", - direction="r", + description="LINEAR A SIGN AB066", + direction="l", linebreak="al", - unicodeslot=0x10987, + unicodeslot=0x10637, }, - [0x10988]={ + [0x10638]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER PA", - direction="r", + description="LINEAR A SIGN AB067", + direction="l", linebreak="al", - unicodeslot=0x10988, + unicodeslot=0x10638, }, - [0x10989]={ + [0x10639]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER MA", - direction="r", + description="LINEAR A SIGN AB069", + direction="l", linebreak="al", - unicodeslot=0x10989, + unicodeslot=0x10639, }, - [0x1098A]={ + [0x1063A]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER NA", - direction="r", + description="LINEAR A SIGN AB070", + direction="l", linebreak="al", - unicodeslot=0x1098A, + unicodeslot=0x1063A, }, - [0x1098B]={ + [0x1063B]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER NA-2", - direction="r", + description="LINEAR A SIGN AB073", + direction="l", linebreak="al", - unicodeslot=0x1098B, + unicodeslot=0x1063B, }, - [0x1098C]={ + [0x1063C]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER NE", - direction="r", + description="LINEAR A SIGN AB074", + direction="l", linebreak="al", - unicodeslot=0x1098C, + unicodeslot=0x1063C, }, - [0x1098D]={ + [0x1063D]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER NE-2", - direction="r", + description="LINEAR A SIGN AB076", + direction="l", linebreak="al", - unicodeslot=0x1098D, + unicodeslot=0x1063D, }, - [0x1098E]={ + [0x1063E]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER RA", - direction="r", + description="LINEAR A SIGN AB077", + direction="l", linebreak="al", - unicodeslot=0x1098E, + unicodeslot=0x1063E, }, - [0x1098F]={ + [0x1063F]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER RA-2", - direction="r", + description="LINEAR A SIGN AB078", + direction="l", linebreak="al", - unicodeslot=0x1098F, + unicodeslot=0x1063F, }, - [0x10990]={ + [0x10640]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER LA", - direction="r", + description="LINEAR A SIGN AB079", + direction="l", linebreak="al", - unicodeslot=0x10990, + unicodeslot=0x10640, }, - [0x10991]={ + [0x10641]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER KHA", - direction="r", + description="LINEAR A SIGN AB080", + direction="l", linebreak="al", - unicodeslot=0x10991, + unicodeslot=0x10641, }, - [0x10992]={ + [0x10642]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER HHA", - direction="r", + description="LINEAR A SIGN AB081", + direction="l", linebreak="al", - unicodeslot=0x10992, + unicodeslot=0x10642, }, - [0x10993]={ + [0x10643]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER SA", - direction="r", + description="LINEAR A SIGN AB082", + direction="l", linebreak="al", - unicodeslot=0x10993, + unicodeslot=0x10643, }, - [0x10994]={ + [0x10644]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER SA-2", - direction="r", + description="LINEAR A SIGN AB085", + direction="l", linebreak="al", - unicodeslot=0x10994, + unicodeslot=0x10644, }, - [0x10995]={ + [0x10645]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER SE", - direction="r", + description="LINEAR A SIGN AB086", + direction="l", linebreak="al", - unicodeslot=0x10995, + unicodeslot=0x10645, }, - [0x10996]={ + [0x10646]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER KA", - direction="r", + description="LINEAR A SIGN AB087", + direction="l", linebreak="al", - unicodeslot=0x10996, + unicodeslot=0x10646, }, - [0x10997]={ + [0x10647]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER QA", - direction="r", + description="LINEAR A SIGN A100-102", + direction="l", linebreak="al", - unicodeslot=0x10997, + unicodeslot=0x10647, }, - [0x10998]={ + [0x10648]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER TA", - direction="r", + description="LINEAR A SIGN AB118", + direction="l", linebreak="al", - unicodeslot=0x10998, + unicodeslot=0x10648, }, - [0x10999]={ + [0x10649]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER TA-2", - direction="r", + description="LINEAR A SIGN AB120", + direction="l", linebreak="al", - unicodeslot=0x10999, + unicodeslot=0x10649, }, - [0x1099A]={ + [0x1064A]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER TE", - direction="r", + description="LINEAR A SIGN A120B", + direction="l", linebreak="al", - unicodeslot=0x1099A, + unicodeslot=0x1064A, }, - [0x1099B]={ + [0x1064B]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER TE-2", - direction="r", + description="LINEAR A SIGN AB122", + direction="l", linebreak="al", - unicodeslot=0x1099B, + unicodeslot=0x1064B, }, - [0x1099C]={ + [0x1064C]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER TO", - direction="r", + description="LINEAR A SIGN AB123", + direction="l", linebreak="al", - unicodeslot=0x1099C, + unicodeslot=0x1064C, }, - [0x1099D]={ + [0x1064D]={ category="lo", - description="MEROITIC HIEROGLYPHIC LETTER DA", - direction="r", + description="LINEAR A SIGN AB131A", + direction="l", linebreak="al", - unicodeslot=0x1099D, + unicodeslot=0x1064D, }, - [0x1099E]={ + [0x1064E]={ category="lo", - description="MEROITIC HIEROGLYPHIC SYMBOL VIDJ", - direction="r", + description="LINEAR A SIGN AB131B", + direction="l", linebreak="al", - unicodeslot=0x1099E, + unicodeslot=0x1064E, }, - [0x1099F]={ + [0x1064F]={ category="lo", - description="MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2", - direction="r", + description="LINEAR A SIGN A131C", + direction="l", linebreak="al", - unicodeslot=0x1099F, + unicodeslot=0x1064F, }, - [0x109A0]={ + [0x10650]={ category="lo", - description="MEROITIC CURSIVE LETTER A", - direction="r", + description="LINEAR A SIGN AB164", + direction="l", linebreak="al", - unicodeslot=0x109A0, + unicodeslot=0x10650, }, - [0x109A1]={ + [0x10651]={ category="lo", - description="MEROITIC CURSIVE LETTER E", - direction="r", + description="LINEAR A SIGN AB171", + direction="l", linebreak="al", - unicodeslot=0x109A1, + unicodeslot=0x10651, }, - [0x109A2]={ + [0x10652]={ category="lo", - description="MEROITIC CURSIVE LETTER I", - direction="r", + description="LINEAR A SIGN AB180", + direction="l", linebreak="al", - unicodeslot=0x109A2, + unicodeslot=0x10652, }, - [0x109A3]={ + [0x10653]={ category="lo", - description="MEROITIC CURSIVE LETTER O", - direction="r", + description="LINEAR A SIGN AB188", + direction="l", linebreak="al", - unicodeslot=0x109A3, + unicodeslot=0x10653, }, - [0x109A4]={ + [0x10654]={ category="lo", - description="MEROITIC CURSIVE LETTER YA", - direction="r", + description="LINEAR A SIGN AB191", + direction="l", linebreak="al", - unicodeslot=0x109A4, + unicodeslot=0x10654, }, - [0x109A5]={ + [0x10655]={ category="lo", - description="MEROITIC CURSIVE LETTER WA", - direction="r", + description="LINEAR A SIGN A301", + direction="l", linebreak="al", - unicodeslot=0x109A5, + unicodeslot=0x10655, }, - [0x109A6]={ + [0x10656]={ category="lo", - description="MEROITIC CURSIVE LETTER BA", - direction="r", + description="LINEAR A SIGN A302", + direction="l", linebreak="al", - unicodeslot=0x109A6, + unicodeslot=0x10656, }, - [0x109A7]={ + [0x10657]={ category="lo", - description="MEROITIC CURSIVE LETTER PA", - direction="r", + description="LINEAR A SIGN A303", + direction="l", linebreak="al", - unicodeslot=0x109A7, + unicodeslot=0x10657, }, - [0x109A8]={ + [0x10658]={ category="lo", - description="MEROITIC CURSIVE LETTER MA", - direction="r", + description="LINEAR A SIGN A304", + direction="l", linebreak="al", - unicodeslot=0x109A8, + unicodeslot=0x10658, }, - [0x109A9]={ + [0x10659]={ category="lo", - description="MEROITIC CURSIVE LETTER NA", - direction="r", + description="LINEAR A SIGN A305", + direction="l", linebreak="al", - unicodeslot=0x109A9, + unicodeslot=0x10659, }, - [0x109AA]={ + [0x1065A]={ category="lo", - description="MEROITIC CURSIVE LETTER NE", - direction="r", + description="LINEAR A SIGN A306", + direction="l", linebreak="al", - unicodeslot=0x109AA, + unicodeslot=0x1065A, }, - [0x109AB]={ + [0x1065B]={ category="lo", - description="MEROITIC CURSIVE LETTER RA", - direction="r", + description="LINEAR A SIGN A307", + direction="l", linebreak="al", - unicodeslot=0x109AB, + unicodeslot=0x1065B, }, - [0x109AC]={ + [0x1065C]={ category="lo", - description="MEROITIC CURSIVE LETTER LA", - direction="r", + description="LINEAR A SIGN A308", + direction="l", linebreak="al", - unicodeslot=0x109AC, + unicodeslot=0x1065C, }, - [0x109AD]={ + [0x1065D]={ category="lo", - description="MEROITIC CURSIVE LETTER KHA", - direction="r", + description="LINEAR A SIGN A309A", + direction="l", linebreak="al", - unicodeslot=0x109AD, + unicodeslot=0x1065D, }, - [0x109AE]={ + [0x1065E]={ category="lo", - description="MEROITIC CURSIVE LETTER HHA", - direction="r", + description="LINEAR A SIGN A309B", + direction="l", linebreak="al", - unicodeslot=0x109AE, + unicodeslot=0x1065E, }, - [0x109AF]={ + [0x1065F]={ category="lo", - description="MEROITIC CURSIVE LETTER SA", - direction="r", + description="LINEAR A SIGN A309C", + direction="l", linebreak="al", - unicodeslot=0x109AF, + unicodeslot=0x1065F, }, - [0x109B0]={ + [0x10660]={ category="lo", - description="MEROITIC CURSIVE LETTER ARCHAIC SA", - direction="r", + description="LINEAR A SIGN A310", + direction="l", linebreak="al", - unicodeslot=0x109B0, + unicodeslot=0x10660, }, - [0x109B1]={ + [0x10661]={ category="lo", - description="MEROITIC CURSIVE LETTER SE", - direction="r", + description="LINEAR A SIGN A311", + direction="l", linebreak="al", - unicodeslot=0x109B1, + unicodeslot=0x10661, }, - [0x109B2]={ + [0x10662]={ category="lo", - description="MEROITIC CURSIVE LETTER KA", - direction="r", + description="LINEAR A SIGN A312", + direction="l", linebreak="al", - unicodeslot=0x109B2, + unicodeslot=0x10662, }, - [0x109B3]={ + [0x10663]={ category="lo", - description="MEROITIC CURSIVE LETTER QA", - direction="r", + description="LINEAR A SIGN A313A", + direction="l", linebreak="al", - unicodeslot=0x109B3, + unicodeslot=0x10663, }, - [0x109B4]={ + [0x10664]={ category="lo", - description="MEROITIC CURSIVE LETTER TA", - direction="r", + description="LINEAR A SIGN A313B", + direction="l", linebreak="al", - unicodeslot=0x109B4, + unicodeslot=0x10664, }, - [0x109B5]={ + [0x10665]={ category="lo", - description="MEROITIC CURSIVE LETTER TE", - direction="r", + description="LINEAR A SIGN A313C", + direction="l", linebreak="al", - unicodeslot=0x109B5, + unicodeslot=0x10665, }, - [0x109B6]={ + [0x10666]={ category="lo", - description="MEROITIC CURSIVE LETTER TO", - direction="r", + description="LINEAR A SIGN A314", + direction="l", linebreak="al", - unicodeslot=0x109B6, + unicodeslot=0x10666, }, - [0x109B7]={ + [0x10667]={ category="lo", - description="MEROITIC CURSIVE LETTER DA", - direction="r", + description="LINEAR A SIGN A315", + direction="l", linebreak="al", - unicodeslot=0x109B7, + unicodeslot=0x10667, }, - [0x109BE]={ + [0x10668]={ category="lo", - description="MEROITIC CURSIVE LOGOGRAM RMT", - direction="r", + description="LINEAR A SIGN A316", + direction="l", linebreak="al", - unicodeslot=0x109BE, + unicodeslot=0x10668, }, - [0x109BF]={ + [0x10669]={ category="lo", - description="MEROITIC CURSIVE LOGOGRAM IMN", - direction="r", + description="LINEAR A SIGN A317", + direction="l", linebreak="al", - unicodeslot=0x109BF, + unicodeslot=0x10669, }, - [0x10A00]={ + [0x1066A]={ category="lo", - description="KHAROSHTHI LETTER A", - direction="r", + description="LINEAR A SIGN A318", + direction="l", linebreak="al", - unicodeslot=0x10A00, - }, - [0x10A01]={ - category="mn", - description="KHAROSHTHI VOWEL SIGN I", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A01, - }, - [0x10A02]={ - category="mn", - description="KHAROSHTHI VOWEL SIGN U", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A02, - }, - [0x10A03]={ - category="mn", - description="KHAROSHTHI VOWEL SIGN VOCALIC R", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A03, - }, - [0x10A05]={ - category="mn", - description="KHAROSHTHI VOWEL SIGN E", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A05, - }, - [0x10A06]={ - category="mn", - description="KHAROSHTHI VOWEL SIGN O", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A06, - }, - [0x10A0C]={ - category="mn", - description="KHAROSHTHI VOWEL LENGTH MARK", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A0C, - }, - [0x10A0D]={ - category="mn", - description="KHAROSHTHI SIGN DOUBLE RING BELOW", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A0D, - }, - [0x10A0E]={ - category="mn", - description="KHAROSHTHI SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A0E, - }, - [0x10A0F]={ - category="mn", - description="KHAROSHTHI SIGN VISARGA", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A0F, + unicodeslot=0x1066A, }, - [0x10A10]={ + [0x1066B]={ category="lo", - description="KHAROSHTHI LETTER KA", - direction="r", + description="LINEAR A SIGN A319", + direction="l", linebreak="al", - unicodeslot=0x10A10, + unicodeslot=0x1066B, }, - [0x10A11]={ + [0x1066C]={ category="lo", - description="KHAROSHTHI LETTER KHA", - direction="r", + description="LINEAR A SIGN A320", + direction="l", linebreak="al", - unicodeslot=0x10A11, + unicodeslot=0x1066C, }, - [0x10A12]={ + [0x1066D]={ category="lo", - description="KHAROSHTHI LETTER GA", - direction="r", + description="LINEAR A SIGN A321", + direction="l", linebreak="al", - unicodeslot=0x10A12, + unicodeslot=0x1066D, }, - [0x10A13]={ + [0x1066E]={ category="lo", - description="KHAROSHTHI LETTER GHA", - direction="r", + description="LINEAR A SIGN A322", + direction="l", linebreak="al", - unicodeslot=0x10A13, + unicodeslot=0x1066E, }, - [0x10A15]={ + [0x1066F]={ category="lo", - description="KHAROSHTHI LETTER CA", - direction="r", + description="LINEAR A SIGN A323", + direction="l", linebreak="al", - unicodeslot=0x10A15, + unicodeslot=0x1066F, }, - [0x10A16]={ + [0x10670]={ category="lo", - description="KHAROSHTHI LETTER CHA", - direction="r", + description="LINEAR A SIGN A324", + direction="l", linebreak="al", - unicodeslot=0x10A16, + unicodeslot=0x10670, }, - [0x10A17]={ + [0x10671]={ category="lo", - description="KHAROSHTHI LETTER JA", - direction="r", + description="LINEAR A SIGN A325", + direction="l", linebreak="al", - unicodeslot=0x10A17, + unicodeslot=0x10671, }, - [0x10A19]={ + [0x10672]={ category="lo", - description="KHAROSHTHI LETTER NYA", - direction="r", + description="LINEAR A SIGN A326", + direction="l", linebreak="al", - unicodeslot=0x10A19, + unicodeslot=0x10672, }, - [0x10A1A]={ + [0x10673]={ category="lo", - description="KHAROSHTHI LETTER TTA", - direction="r", + description="LINEAR A SIGN A327", + direction="l", linebreak="al", - unicodeslot=0x10A1A, + unicodeslot=0x10673, }, - [0x10A1B]={ + [0x10674]={ category="lo", - description="KHAROSHTHI LETTER TTHA", - direction="r", + description="LINEAR A SIGN A328", + direction="l", linebreak="al", - unicodeslot=0x10A1B, + unicodeslot=0x10674, }, - [0x10A1C]={ + [0x10675]={ category="lo", - description="KHAROSHTHI LETTER DDA", - direction="r", + description="LINEAR A SIGN A329", + direction="l", linebreak="al", - unicodeslot=0x10A1C, + unicodeslot=0x10675, }, - [0x10A1D]={ + [0x10676]={ category="lo", - description="KHAROSHTHI LETTER DDHA", - direction="r", + description="LINEAR A SIGN A330", + direction="l", linebreak="al", - unicodeslot=0x10A1D, + unicodeslot=0x10676, }, - [0x10A1E]={ + [0x10677]={ category="lo", - description="KHAROSHTHI LETTER NNA", - direction="r", + description="LINEAR A SIGN A331", + direction="l", linebreak="al", - unicodeslot=0x10A1E, + unicodeslot=0x10677, }, - [0x10A1F]={ + [0x10678]={ category="lo", - description="KHAROSHTHI LETTER TA", - direction="r", + description="LINEAR A SIGN A332", + direction="l", linebreak="al", - unicodeslot=0x10A1F, + unicodeslot=0x10678, }, - [0x10A20]={ + [0x10679]={ category="lo", - description="KHAROSHTHI LETTER THA", - direction="r", + description="LINEAR A SIGN A333", + direction="l", linebreak="al", - unicodeslot=0x10A20, + unicodeslot=0x10679, }, - [0x10A21]={ + [0x1067A]={ category="lo", - description="KHAROSHTHI LETTER DA", - direction="r", + description="LINEAR A SIGN A334", + direction="l", linebreak="al", - unicodeslot=0x10A21, + unicodeslot=0x1067A, }, - [0x10A22]={ + [0x1067B]={ category="lo", - description="KHAROSHTHI LETTER DHA", - direction="r", + description="LINEAR A SIGN A335", + direction="l", linebreak="al", - unicodeslot=0x10A22, + unicodeslot=0x1067B, }, - [0x10A23]={ + [0x1067C]={ category="lo", - description="KHAROSHTHI LETTER NA", - direction="r", + description="LINEAR A SIGN A336", + direction="l", linebreak="al", - unicodeslot=0x10A23, + unicodeslot=0x1067C, }, - [0x10A24]={ + [0x1067D]={ category="lo", - description="KHAROSHTHI LETTER PA", - direction="r", + description="LINEAR A SIGN A337", + direction="l", linebreak="al", - unicodeslot=0x10A24, + unicodeslot=0x1067D, }, - [0x10A25]={ + [0x1067E]={ category="lo", - description="KHAROSHTHI LETTER PHA", - direction="r", + description="LINEAR A SIGN A338", + direction="l", linebreak="al", - unicodeslot=0x10A25, + unicodeslot=0x1067E, }, - [0x10A26]={ + [0x1067F]={ category="lo", - description="KHAROSHTHI LETTER BA", - direction="r", + description="LINEAR A SIGN A339", + direction="l", linebreak="al", - unicodeslot=0x10A26, + unicodeslot=0x1067F, }, - [0x10A27]={ + [0x10680]={ category="lo", - description="KHAROSHTHI LETTER BHA", - direction="r", + description="LINEAR A SIGN A340", + direction="l", linebreak="al", - unicodeslot=0x10A27, + unicodeslot=0x10680, }, - [0x10A28]={ + [0x10681]={ category="lo", - description="KHAROSHTHI LETTER MA", - direction="r", + description="LINEAR A SIGN A341", + direction="l", linebreak="al", - unicodeslot=0x10A28, + unicodeslot=0x10681, }, - [0x10A29]={ + [0x10682]={ category="lo", - description="KHAROSHTHI LETTER YA", - direction="r", + description="LINEAR A SIGN A342", + direction="l", linebreak="al", - unicodeslot=0x10A29, + unicodeslot=0x10682, }, - [0x10A2A]={ + [0x10683]={ category="lo", - description="KHAROSHTHI LETTER RA", - direction="r", + description="LINEAR A SIGN A343", + direction="l", linebreak="al", - unicodeslot=0x10A2A, + unicodeslot=0x10683, }, - [0x10A2B]={ + [0x10684]={ category="lo", - description="KHAROSHTHI LETTER LA", - direction="r", + description="LINEAR A SIGN A344", + direction="l", linebreak="al", - unicodeslot=0x10A2B, + unicodeslot=0x10684, }, - [0x10A2C]={ + [0x10685]={ category="lo", - description="KHAROSHTHI LETTER VA", - direction="r", + description="LINEAR A SIGN A345", + direction="l", linebreak="al", - unicodeslot=0x10A2C, + unicodeslot=0x10685, }, - [0x10A2D]={ + [0x10686]={ category="lo", - description="KHAROSHTHI LETTER SHA", - direction="r", + description="LINEAR A SIGN A346", + direction="l", linebreak="al", - unicodeslot=0x10A2D, + unicodeslot=0x10686, }, - [0x10A2E]={ + [0x10687]={ category="lo", - description="KHAROSHTHI LETTER SSA", - direction="r", + description="LINEAR A SIGN A347", + direction="l", linebreak="al", - unicodeslot=0x10A2E, + unicodeslot=0x10687, }, - [0x10A2F]={ + [0x10688]={ category="lo", - description="KHAROSHTHI LETTER SA", - direction="r", + description="LINEAR A SIGN A348", + direction="l", linebreak="al", - unicodeslot=0x10A2F, + unicodeslot=0x10688, }, - [0x10A30]={ + [0x10689]={ category="lo", - description="KHAROSHTHI LETTER ZA", - direction="r", + description="LINEAR A SIGN A349", + direction="l", linebreak="al", - unicodeslot=0x10A30, + unicodeslot=0x10689, }, - [0x10A31]={ + [0x1068A]={ category="lo", - description="KHAROSHTHI LETTER HA", - direction="r", + description="LINEAR A SIGN A350", + direction="l", linebreak="al", - unicodeslot=0x10A31, + unicodeslot=0x1068A, }, - [0x10A32]={ + [0x1068B]={ category="lo", - description="KHAROSHTHI LETTER KKA", - direction="r", + description="LINEAR A SIGN A351", + direction="l", linebreak="al", - unicodeslot=0x10A32, + unicodeslot=0x1068B, }, - [0x10A33]={ + [0x1068C]={ category="lo", - description="KHAROSHTHI LETTER TTTHA", - direction="r", + description="LINEAR A SIGN A352", + direction="l", linebreak="al", - unicodeslot=0x10A33, - }, - [0x10A38]={ - category="mn", - description="KHAROSHTHI SIGN BAR ABOVE", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A38, - }, - [0x10A39]={ - category="mn", - description="KHAROSHTHI SIGN CAUDA", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A39, - }, - [0x10A3A]={ - category="mn", - description="KHAROSHTHI SIGN DOT BELOW", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A3A, - }, - [0x10A3F]={ - category="mn", - description="KHAROSHTHI VIRAMA", - direction="nsm", - linebreak="cm", - unicodeslot=0x10A3F, + unicodeslot=0x1068C, }, - [0x10A40]={ - category="no", - description="KHAROSHTHI DIGIT ONE", - direction="r", + [0x1068D]={ + category="lo", + description="LINEAR A SIGN A353", + direction="l", linebreak="al", - unicodeslot=0x10A40, + unicodeslot=0x1068D, }, - [0x10A41]={ - category="no", - description="KHAROSHTHI DIGIT TWO", - direction="r", + [0x1068E]={ + category="lo", + description="LINEAR A SIGN A354", + direction="l", linebreak="al", - unicodeslot=0x10A41, + unicodeslot=0x1068E, }, - [0x10A42]={ - category="no", - description="KHAROSHTHI DIGIT THREE", - direction="r", + [0x1068F]={ + category="lo", + description="LINEAR A SIGN A355", + direction="l", linebreak="al", - unicodeslot=0x10A42, + unicodeslot=0x1068F, }, - [0x10A43]={ - category="no", - description="KHAROSHTHI DIGIT FOUR", - direction="r", + [0x10690]={ + category="lo", + description="LINEAR A SIGN A356", + direction="l", linebreak="al", - unicodeslot=0x10A43, + unicodeslot=0x10690, }, - [0x10A44]={ - category="no", - description="KHAROSHTHI NUMBER TEN", - direction="r", + [0x10691]={ + category="lo", + description="LINEAR A SIGN A357", + direction="l", linebreak="al", - unicodeslot=0x10A44, + unicodeslot=0x10691, }, - [0x10A45]={ - category="no", - description="KHAROSHTHI NUMBER TWENTY", - direction="r", + [0x10692]={ + category="lo", + description="LINEAR A SIGN A358", + direction="l", linebreak="al", - unicodeslot=0x10A45, + unicodeslot=0x10692, }, - [0x10A46]={ - category="no", - description="KHAROSHTHI NUMBER ONE HUNDRED", - direction="r", + [0x10693]={ + category="lo", + description="LINEAR A SIGN A359", + direction="l", linebreak="al", - unicodeslot=0x10A46, + unicodeslot=0x10693, }, - [0x10A47]={ - category="no", - description="KHAROSHTHI NUMBER ONE THOUSAND", - direction="r", + [0x10694]={ + category="lo", + description="LINEAR A SIGN A360", + direction="l", linebreak="al", - unicodeslot=0x10A47, + unicodeslot=0x10694, }, - [0x10A50]={ - category="po", - description="KHAROSHTHI PUNCTUATION DOT", - direction="r", - linebreak="ba", - unicodeslot=0x10A50, + [0x10695]={ + category="lo", + description="LINEAR A SIGN A361", + direction="l", + linebreak="al", + unicodeslot=0x10695, }, - [0x10A51]={ - category="po", - description="KHAROSHTHI PUNCTUATION SMALL CIRCLE", - direction="r", - linebreak="ba", - unicodeslot=0x10A51, + [0x10696]={ + category="lo", + description="LINEAR A SIGN A362", + direction="l", + linebreak="al", + unicodeslot=0x10696, }, - [0x10A52]={ - category="po", - description="KHAROSHTHI PUNCTUATION CIRCLE", - direction="r", - linebreak="ba", - unicodeslot=0x10A52, + [0x10697]={ + category="lo", + description="LINEAR A SIGN A363", + direction="l", + linebreak="al", + unicodeslot=0x10697, }, - [0x10A53]={ - category="po", - description="KHAROSHTHI PUNCTUATION CRESCENT BAR", - direction="r", - linebreak="ba", - unicodeslot=0x10A53, + [0x10698]={ + category="lo", + description="LINEAR A SIGN A364", + direction="l", + linebreak="al", + unicodeslot=0x10698, }, - [0x10A54]={ - category="po", - description="KHAROSHTHI PUNCTUATION MANGALAM", - direction="r", - linebreak="ba", - unicodeslot=0x10A54, + [0x10699]={ + category="lo", + description="LINEAR A SIGN A365", + direction="l", + linebreak="al", + unicodeslot=0x10699, }, - [0x10A55]={ - category="po", - description="KHAROSHTHI PUNCTUATION LOTUS", - direction="r", - linebreak="ba", - unicodeslot=0x10A55, + [0x1069A]={ + category="lo", + description="LINEAR A SIGN A366", + direction="l", + linebreak="al", + unicodeslot=0x1069A, }, - [0x10A56]={ - category="po", - description="KHAROSHTHI PUNCTUATION DANDA", - direction="r", - linebreak="ba", - unicodeslot=0x10A56, + [0x1069B]={ + category="lo", + description="LINEAR A SIGN A367", + direction="l", + linebreak="al", + unicodeslot=0x1069B, }, - [0x10A57]={ - category="po", - description="KHAROSHTHI PUNCTUATION DOUBLE DANDA", - direction="r", - linebreak="ba", - unicodeslot=0x10A57, + [0x1069C]={ + category="lo", + description="LINEAR A SIGN A368", + direction="l", + linebreak="al", + unicodeslot=0x1069C, }, - [0x10A58]={ - category="po", - description="KHAROSHTHI PUNCTUATION LINES", - direction="r", + [0x1069D]={ + category="lo", + description="LINEAR A SIGN A369", + direction="l", linebreak="al", - unicodeslot=0x10A58, + unicodeslot=0x1069D, }, - [0x10A60]={ + [0x1069E]={ category="lo", - description="OLD SOUTH ARABIAN LETTER HE", - direction="r", + description="LINEAR A SIGN A370", + direction="l", linebreak="al", - unicodeslot=0x10A60, + unicodeslot=0x1069E, }, - [0x10A61]={ + [0x1069F]={ category="lo", - description="OLD SOUTH ARABIAN LETTER LAMEDH", - direction="r", + description="LINEAR A SIGN A371", + direction="l", linebreak="al", - unicodeslot=0x10A61, + unicodeslot=0x1069F, }, - [0x10A62]={ + [0x106A0]={ category="lo", - description="OLD SOUTH ARABIAN LETTER HETH", - direction="r", + description="LINEAR A SIGN A400-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A62, + unicodeslot=0x106A0, }, - [0x10A63]={ + [0x106A1]={ category="lo", - description="OLD SOUTH ARABIAN LETTER MEM", - direction="r", + description="LINEAR A SIGN A401-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A63, + unicodeslot=0x106A1, }, - [0x10A64]={ + [0x106A2]={ category="lo", - description="OLD SOUTH ARABIAN LETTER QOPH", - direction="r", + description="LINEAR A SIGN A402-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A64, + unicodeslot=0x106A2, }, - [0x10A65]={ + [0x106A3]={ category="lo", - description="OLD SOUTH ARABIAN LETTER WAW", - direction="r", + description="LINEAR A SIGN A403-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A65, + unicodeslot=0x106A3, }, - [0x10A66]={ + [0x106A4]={ category="lo", - description="OLD SOUTH ARABIAN LETTER SHIN", - direction="r", + description="LINEAR A SIGN A404-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A66, + unicodeslot=0x106A4, }, - [0x10A67]={ + [0x106A5]={ category="lo", - description="OLD SOUTH ARABIAN LETTER RESH", - direction="r", + description="LINEAR A SIGN A405-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A67, + unicodeslot=0x106A5, }, - [0x10A68]={ + [0x106A6]={ category="lo", - description="OLD SOUTH ARABIAN LETTER BETH", - direction="r", + description="LINEAR A SIGN A406-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A68, + unicodeslot=0x106A6, }, - [0x10A69]={ + [0x106A7]={ category="lo", - description="OLD SOUTH ARABIAN LETTER TAW", - direction="r", + description="LINEAR A SIGN A407-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A69, + unicodeslot=0x106A7, }, - [0x10A6A]={ + [0x106A8]={ category="lo", - description="OLD SOUTH ARABIAN LETTER SAT", - direction="r", + description="LINEAR A SIGN A408-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6A, + unicodeslot=0x106A8, }, - [0x10A6B]={ + [0x106A9]={ category="lo", - description="OLD SOUTH ARABIAN LETTER KAPH", - direction="r", + description="LINEAR A SIGN A409-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6B, + unicodeslot=0x106A9, }, - [0x10A6C]={ + [0x106AA]={ category="lo", - description="OLD SOUTH ARABIAN LETTER NUN", - direction="r", + description="LINEAR A SIGN A410-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6C, + unicodeslot=0x106AA, }, - [0x10A6D]={ + [0x106AB]={ category="lo", - description="OLD SOUTH ARABIAN LETTER KHETH", - direction="r", + description="LINEAR A SIGN A411-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6D, + unicodeslot=0x106AB, }, - [0x10A6E]={ + [0x106AC]={ category="lo", - description="OLD SOUTH ARABIAN LETTER SADHE", - direction="r", + description="LINEAR A SIGN A412-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6E, + unicodeslot=0x106AC, }, - [0x10A6F]={ + [0x106AD]={ category="lo", - description="OLD SOUTH ARABIAN LETTER SAMEKH", - direction="r", + description="LINEAR A SIGN A413-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A6F, + unicodeslot=0x106AD, }, - [0x10A70]={ + [0x106AE]={ category="lo", - description="OLD SOUTH ARABIAN LETTER FE", - direction="r", + description="LINEAR A SIGN A414-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A70, + unicodeslot=0x106AE, }, - [0x10A71]={ + [0x106AF]={ category="lo", - description="OLD SOUTH ARABIAN LETTER ALEF", - direction="r", + description="LINEAR A SIGN A415-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A71, + unicodeslot=0x106AF, }, - [0x10A72]={ + [0x106B0]={ category="lo", - description="OLD SOUTH ARABIAN LETTER AYN", - direction="r", + description="LINEAR A SIGN A416-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A72, + unicodeslot=0x106B0, }, - [0x10A73]={ + [0x106B1]={ category="lo", - description="OLD SOUTH ARABIAN LETTER DHADHE", - direction="r", + description="LINEAR A SIGN A417-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A73, + unicodeslot=0x106B1, }, - [0x10A74]={ + [0x106B2]={ category="lo", - description="OLD SOUTH ARABIAN LETTER GIMEL", - direction="r", + description="LINEAR A SIGN A418-VAS", + direction="l", linebreak="al", - unicodeslot=0x10A74, + unicodeslot=0x106B2, }, - [0x10A75]={ + [0x106B3]={ category="lo", - description="OLD SOUTH ARABIAN LETTER DALETH", - direction="r", + description="LINEAR A SIGN A501", + direction="l", linebreak="al", - unicodeslot=0x10A75, + unicodeslot=0x106B3, }, - [0x10A76]={ + [0x106B4]={ category="lo", - description="OLD SOUTH ARABIAN LETTER GHAYN", - direction="r", + description="LINEAR A SIGN A502", + direction="l", linebreak="al", - unicodeslot=0x10A76, + unicodeslot=0x106B4, }, - [0x10A77]={ + [0x106B5]={ category="lo", - description="OLD SOUTH ARABIAN LETTER TETH", - direction="r", + description="LINEAR A SIGN A503", + direction="l", linebreak="al", - unicodeslot=0x10A77, + unicodeslot=0x106B5, }, - [0x10A78]={ + [0x106B6]={ category="lo", - description="OLD SOUTH ARABIAN LETTER ZAYN", - direction="r", + description="LINEAR A SIGN A504", + direction="l", linebreak="al", - unicodeslot=0x10A78, + unicodeslot=0x106B6, }, - [0x10A79]={ + [0x106B7]={ category="lo", - description="OLD SOUTH ARABIAN LETTER DHALETH", - direction="r", + description="LINEAR A SIGN A505", + direction="l", linebreak="al", - unicodeslot=0x10A79, + unicodeslot=0x106B7, }, - [0x10A7A]={ + [0x106B8]={ category="lo", - description="OLD SOUTH ARABIAN LETTER YODH", - direction="r", + description="LINEAR A SIGN A506", + direction="l", linebreak="al", - unicodeslot=0x10A7A, + unicodeslot=0x106B8, }, - [0x10A7B]={ + [0x106B9]={ category="lo", - description="OLD SOUTH ARABIAN LETTER THAW", - direction="r", + description="LINEAR A SIGN A508", + direction="l", linebreak="al", - unicodeslot=0x10A7B, + unicodeslot=0x106B9, }, - [0x10A7C]={ + [0x106BA]={ category="lo", - description="OLD SOUTH ARABIAN LETTER THETH", - direction="r", + description="LINEAR A SIGN A509", + direction="l", linebreak="al", - unicodeslot=0x10A7C, + unicodeslot=0x106BA, }, - [0x10A7D]={ - category="no", - description="OLD SOUTH ARABIAN NUMBER ONE", - direction="r", + [0x106BB]={ + category="lo", + description="LINEAR A SIGN A510", + direction="l", linebreak="al", - unicodeslot=0x10A7D, + unicodeslot=0x106BB, }, - [0x10A7E]={ - category="no", - description="OLD SOUTH ARABIAN NUMBER FIFTY", - direction="r", + [0x106BC]={ + category="lo", + description="LINEAR A SIGN A511", + direction="l", linebreak="al", - unicodeslot=0x10A7E, + unicodeslot=0x106BC, }, - [0x10A7F]={ - category="po", - description="OLD SOUTH ARABIAN NUMERIC INDICATOR", - direction="r", + [0x106BD]={ + category="lo", + description="LINEAR A SIGN A512", + direction="l", linebreak="al", - unicodeslot=0x10A7F, + unicodeslot=0x106BD, }, - [0x10B00]={ + [0x106BE]={ category="lo", - description="AVESTAN LETTER A", - direction="r", + description="LINEAR A SIGN A513", + direction="l", linebreak="al", - unicodeslot=0x10B00, + unicodeslot=0x106BE, }, - [0x10B01]={ + [0x106BF]={ category="lo", - description="AVESTAN LETTER AA", - direction="r", + description="LINEAR A SIGN A515", + direction="l", linebreak="al", - unicodeslot=0x10B01, + unicodeslot=0x106BF, }, - [0x10B02]={ + [0x106C0]={ category="lo", - description="AVESTAN LETTER AO", - direction="r", + description="LINEAR A SIGN A516", + direction="l", linebreak="al", - unicodeslot=0x10B02, + unicodeslot=0x106C0, }, - [0x10B03]={ + [0x106C1]={ category="lo", - description="AVESTAN LETTER AAO", - direction="r", + description="LINEAR A SIGN A520", + direction="l", linebreak="al", - unicodeslot=0x10B03, + unicodeslot=0x106C1, }, - [0x10B04]={ + [0x106C2]={ category="lo", - description="AVESTAN LETTER AN", - direction="r", + description="LINEAR A SIGN A521", + direction="l", linebreak="al", - unicodeslot=0x10B04, + unicodeslot=0x106C2, }, - [0x10B05]={ + [0x106C3]={ category="lo", - description="AVESTAN LETTER AAN", - direction="r", + description="LINEAR A SIGN A523", + direction="l", linebreak="al", - unicodeslot=0x10B05, + unicodeslot=0x106C3, }, - [0x10B06]={ + [0x106C4]={ category="lo", - description="AVESTAN LETTER AE", - direction="r", + description="LINEAR A SIGN A524", + direction="l", linebreak="al", - unicodeslot=0x10B06, + unicodeslot=0x106C4, }, - [0x10B07]={ + [0x106C5]={ category="lo", - description="AVESTAN LETTER AEE", - direction="r", + description="LINEAR A SIGN A525", + direction="l", linebreak="al", - unicodeslot=0x10B07, + unicodeslot=0x106C5, }, - [0x10B08]={ + [0x106C6]={ category="lo", - description="AVESTAN LETTER E", - direction="r", + description="LINEAR A SIGN A526", + direction="l", linebreak="al", - unicodeslot=0x10B08, + unicodeslot=0x106C6, }, - [0x10B09]={ + [0x106C7]={ category="lo", - description="AVESTAN LETTER EE", - direction="r", + description="LINEAR A SIGN A527", + direction="l", linebreak="al", - unicodeslot=0x10B09, + unicodeslot=0x106C7, }, - [0x10B0A]={ + [0x106C8]={ category="lo", - description="AVESTAN LETTER O", - direction="r", + description="LINEAR A SIGN A528", + direction="l", linebreak="al", - unicodeslot=0x10B0A, + unicodeslot=0x106C8, }, - [0x10B0B]={ + [0x106C9]={ category="lo", - description="AVESTAN LETTER OO", - direction="r", + description="LINEAR A SIGN A529", + direction="l", linebreak="al", - unicodeslot=0x10B0B, + unicodeslot=0x106C9, }, - [0x10B0C]={ + [0x106CA]={ category="lo", - description="AVESTAN LETTER I", - direction="r", + description="LINEAR A SIGN A530", + direction="l", linebreak="al", - unicodeslot=0x10B0C, + unicodeslot=0x106CA, }, - [0x10B0D]={ + [0x106CB]={ category="lo", - description="AVESTAN LETTER II", - direction="r", + description="LINEAR A SIGN A531", + direction="l", linebreak="al", - unicodeslot=0x10B0D, + unicodeslot=0x106CB, }, - [0x10B0E]={ + [0x106CC]={ category="lo", - description="AVESTAN LETTER U", - direction="r", + description="LINEAR A SIGN A532", + direction="l", linebreak="al", - unicodeslot=0x10B0E, + unicodeslot=0x106CC, }, - [0x10B0F]={ + [0x106CD]={ category="lo", - description="AVESTAN LETTER UU", - direction="r", + description="LINEAR A SIGN A534", + direction="l", linebreak="al", - unicodeslot=0x10B0F, + unicodeslot=0x106CD, }, - [0x10B10]={ + [0x106CE]={ category="lo", - description="AVESTAN LETTER KE", - direction="r", + description="LINEAR A SIGN A535", + direction="l", linebreak="al", - unicodeslot=0x10B10, + unicodeslot=0x106CE, }, - [0x10B11]={ + [0x106CF]={ category="lo", - description="AVESTAN LETTER XE", - direction="r", + description="LINEAR A SIGN A536", + direction="l", linebreak="al", - unicodeslot=0x10B11, + unicodeslot=0x106CF, }, - [0x10B12]={ + [0x106D0]={ category="lo", - description="AVESTAN LETTER XYE", - direction="r", + description="LINEAR A SIGN A537", + direction="l", linebreak="al", - unicodeslot=0x10B12, + unicodeslot=0x106D0, }, - [0x10B13]={ + [0x106D1]={ category="lo", - description="AVESTAN LETTER XVE", - direction="r", + description="LINEAR A SIGN A538", + direction="l", linebreak="al", - unicodeslot=0x10B13, + unicodeslot=0x106D1, }, - [0x10B14]={ + [0x106D2]={ category="lo", - description="AVESTAN LETTER GE", - direction="r", + description="LINEAR A SIGN A539", + direction="l", linebreak="al", - unicodeslot=0x10B14, + unicodeslot=0x106D2, }, - [0x10B15]={ + [0x106D3]={ category="lo", - description="AVESTAN LETTER GGE", - direction="r", + description="LINEAR A SIGN A540", + direction="l", linebreak="al", - unicodeslot=0x10B15, + unicodeslot=0x106D3, }, - [0x10B16]={ + [0x106D4]={ category="lo", - description="AVESTAN LETTER GHE", - direction="r", + description="LINEAR A SIGN A541", + direction="l", linebreak="al", - unicodeslot=0x10B16, + unicodeslot=0x106D4, }, - [0x10B17]={ + [0x106D5]={ category="lo", - description="AVESTAN LETTER CE", - direction="r", + description="LINEAR A SIGN A542", + direction="l", linebreak="al", - unicodeslot=0x10B17, + unicodeslot=0x106D5, }, - [0x10B18]={ + [0x106D6]={ category="lo", - description="AVESTAN LETTER JE", - direction="r", + description="LINEAR A SIGN A545", + direction="l", linebreak="al", - unicodeslot=0x10B18, + unicodeslot=0x106D6, }, - [0x10B19]={ + [0x106D7]={ category="lo", - description="AVESTAN LETTER TE", - direction="r", + description="LINEAR A SIGN A547", + direction="l", linebreak="al", - unicodeslot=0x10B19, + unicodeslot=0x106D7, }, - [0x10B1A]={ + [0x106D8]={ category="lo", - description="AVESTAN LETTER THE", - direction="r", + description="LINEAR A SIGN A548", + direction="l", linebreak="al", - unicodeslot=0x10B1A, + unicodeslot=0x106D8, }, - [0x10B1B]={ + [0x106D9]={ category="lo", - description="AVESTAN LETTER DE", - direction="r", + description="LINEAR A SIGN A549", + direction="l", linebreak="al", - unicodeslot=0x10B1B, + unicodeslot=0x106D9, }, - [0x10B1C]={ + [0x106DA]={ category="lo", - description="AVESTAN LETTER DHE", - direction="r", + description="LINEAR A SIGN A550", + direction="l", linebreak="al", - unicodeslot=0x10B1C, + unicodeslot=0x106DA, }, - [0x10B1D]={ + [0x106DB]={ category="lo", - description="AVESTAN LETTER TTE", - direction="r", + description="LINEAR A SIGN A551", + direction="l", linebreak="al", - unicodeslot=0x10B1D, + unicodeslot=0x106DB, }, - [0x10B1E]={ + [0x106DC]={ category="lo", - description="AVESTAN LETTER PE", - direction="r", + description="LINEAR A SIGN A552", + direction="l", linebreak="al", - unicodeslot=0x10B1E, + unicodeslot=0x106DC, }, - [0x10B1F]={ + [0x106DD]={ category="lo", - description="AVESTAN LETTER FE", - direction="r", + description="LINEAR A SIGN A553", + direction="l", linebreak="al", - unicodeslot=0x10B1F, + unicodeslot=0x106DD, }, - [0x10B20]={ + [0x106DE]={ category="lo", - description="AVESTAN LETTER BE", - direction="r", + description="LINEAR A SIGN A554", + direction="l", linebreak="al", - unicodeslot=0x10B20, + unicodeslot=0x106DE, }, - [0x10B21]={ + [0x106DF]={ category="lo", - description="AVESTAN LETTER BHE", - direction="r", + description="LINEAR A SIGN A555", + direction="l", linebreak="al", - unicodeslot=0x10B21, + unicodeslot=0x106DF, }, - [0x10B22]={ + [0x106E0]={ category="lo", - description="AVESTAN LETTER NGE", - direction="r", + description="LINEAR A SIGN A556", + direction="l", linebreak="al", - unicodeslot=0x10B22, + unicodeslot=0x106E0, }, - [0x10B23]={ + [0x106E1]={ category="lo", - description="AVESTAN LETTER NGYE", - direction="r", + description="LINEAR A SIGN A557", + direction="l", linebreak="al", - unicodeslot=0x10B23, + unicodeslot=0x106E1, }, - [0x10B24]={ + [0x106E2]={ category="lo", - description="AVESTAN LETTER NGVE", - direction="r", + description="LINEAR A SIGN A559", + direction="l", linebreak="al", - unicodeslot=0x10B24, + unicodeslot=0x106E2, }, - [0x10B25]={ + [0x106E3]={ category="lo", - description="AVESTAN LETTER NE", - direction="r", + description="LINEAR A SIGN A563", + direction="l", linebreak="al", - unicodeslot=0x10B25, + unicodeslot=0x106E3, }, - [0x10B26]={ + [0x106E4]={ category="lo", - description="AVESTAN LETTER NYE", - direction="r", + description="LINEAR A SIGN A564", + direction="l", linebreak="al", - unicodeslot=0x10B26, + unicodeslot=0x106E4, }, - [0x10B27]={ + [0x106E5]={ category="lo", - description="AVESTAN LETTER NNE", - direction="r", + description="LINEAR A SIGN A565", + direction="l", linebreak="al", - unicodeslot=0x10B27, + unicodeslot=0x106E5, }, - [0x10B28]={ + [0x106E6]={ category="lo", - description="AVESTAN LETTER ME", - direction="r", + description="LINEAR A SIGN A566", + direction="l", linebreak="al", - unicodeslot=0x10B28, + unicodeslot=0x106E6, }, - [0x10B29]={ + [0x106E7]={ category="lo", - description="AVESTAN LETTER HME", - direction="r", + description="LINEAR A SIGN A568", + direction="l", linebreak="al", - unicodeslot=0x10B29, + unicodeslot=0x106E7, }, - [0x10B2A]={ + [0x106E8]={ category="lo", - description="AVESTAN LETTER YYE", - direction="r", + description="LINEAR A SIGN A569", + direction="l", linebreak="al", - unicodeslot=0x10B2A, + unicodeslot=0x106E8, }, - [0x10B2B]={ + [0x106E9]={ category="lo", - description="AVESTAN LETTER YE", - direction="r", + description="LINEAR A SIGN A570", + direction="l", linebreak="al", - unicodeslot=0x10B2B, + unicodeslot=0x106E9, }, - [0x10B2C]={ + [0x106EA]={ category="lo", - description="AVESTAN LETTER VE", - direction="r", + description="LINEAR A SIGN A571", + direction="l", linebreak="al", - unicodeslot=0x10B2C, + unicodeslot=0x106EA, }, - [0x10B2D]={ + [0x106EB]={ category="lo", - description="AVESTAN LETTER RE", - direction="r", + description="LINEAR A SIGN A572", + direction="l", linebreak="al", - unicodeslot=0x10B2D, + unicodeslot=0x106EB, }, - [0x10B2E]={ + [0x106EC]={ category="lo", - description="AVESTAN LETTER LE", - direction="r", + description="LINEAR A SIGN A573", + direction="l", linebreak="al", - unicodeslot=0x10B2E, + unicodeslot=0x106EC, }, - [0x10B2F]={ + [0x106ED]={ category="lo", - description="AVESTAN LETTER SE", - direction="r", + description="LINEAR A SIGN A574", + direction="l", linebreak="al", - unicodeslot=0x10B2F, + unicodeslot=0x106ED, }, - [0x10B30]={ + [0x106EE]={ category="lo", - description="AVESTAN LETTER ZE", - direction="r", + description="LINEAR A SIGN A575", + direction="l", linebreak="al", - unicodeslot=0x10B30, + unicodeslot=0x106EE, }, - [0x10B31]={ + [0x106EF]={ category="lo", - description="AVESTAN LETTER SHE", - direction="r", + description="LINEAR A SIGN A576", + direction="l", linebreak="al", - unicodeslot=0x10B31, + unicodeslot=0x106EF, }, - [0x10B32]={ + [0x106F0]={ category="lo", - description="AVESTAN LETTER ZHE", - direction="r", + description="LINEAR A SIGN A577", + direction="l", linebreak="al", - unicodeslot=0x10B32, + unicodeslot=0x106F0, }, - [0x10B33]={ + [0x106F1]={ category="lo", - description="AVESTAN LETTER SHYE", - direction="r", + description="LINEAR A SIGN A578", + direction="l", linebreak="al", - unicodeslot=0x10B33, + unicodeslot=0x106F1, }, - [0x10B34]={ + [0x106F2]={ category="lo", - description="AVESTAN LETTER SSHE", - direction="r", + description="LINEAR A SIGN A579", + direction="l", linebreak="al", - unicodeslot=0x10B34, + unicodeslot=0x106F2, }, - [0x10B35]={ + [0x106F3]={ category="lo", - description="AVESTAN LETTER HE", - direction="r", + description="LINEAR A SIGN A580", + direction="l", linebreak="al", - unicodeslot=0x10B35, + unicodeslot=0x106F3, }, - [0x10B39]={ - category="po", - description="AVESTAN ABBREVIATION MARK", - direction="on", - linebreak="ba", - unicodeslot=0x10B39, + [0x106F4]={ + category="lo", + description="LINEAR A SIGN A581", + direction="l", + linebreak="al", + unicodeslot=0x106F4, }, - [0x10B3A]={ - category="po", - description="TINY TWO DOTS OVER ONE DOT PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3A, + [0x106F5]={ + category="lo", + description="LINEAR A SIGN A582", + direction="l", + linebreak="al", + unicodeslot=0x106F5, }, - [0x10B3B]={ - category="po", - description="SMALL TWO DOTS OVER ONE DOT PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3B, + [0x106F6]={ + category="lo", + description="LINEAR A SIGN A583", + direction="l", + linebreak="al", + unicodeslot=0x106F6, }, - [0x10B3C]={ - category="po", - description="LARGE TWO DOTS OVER ONE DOT PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3C, + [0x106F7]={ + category="lo", + description="LINEAR A SIGN A584", + direction="l", + linebreak="al", + unicodeslot=0x106F7, }, - [0x10B3D]={ - category="po", - description="LARGE ONE DOT OVER TWO DOTS PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3D, + [0x106F8]={ + category="lo", + description="LINEAR A SIGN A585", + direction="l", + linebreak="al", + unicodeslot=0x106F8, }, - [0x10B3E]={ - category="po", - description="LARGE TWO RINGS OVER ONE RING PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3E, + [0x106F9]={ + category="lo", + description="LINEAR A SIGN A586", + direction="l", + linebreak="al", + unicodeslot=0x106F9, }, - [0x10B3F]={ - category="po", - description="LARGE ONE RING OVER TWO RINGS PUNCTUATION", - direction="on", - linebreak="ba", - unicodeslot=0x10B3F, + [0x106FA]={ + category="lo", + description="LINEAR A SIGN A587", + direction="l", + linebreak="al", + unicodeslot=0x106FA, }, - [0x10B40]={ + [0x106FB]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER ALEPH", - direction="r", + description="LINEAR A SIGN A588", + direction="l", linebreak="al", - unicodeslot=0x10B40, + unicodeslot=0x106FB, }, - [0x10B41]={ + [0x106FC]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER BETH", - direction="r", + description="LINEAR A SIGN A589", + direction="l", linebreak="al", - unicodeslot=0x10B41, + unicodeslot=0x106FC, }, - [0x10B42]={ + [0x106FD]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER GIMEL", - direction="r", + description="LINEAR A SIGN A591", + direction="l", linebreak="al", - unicodeslot=0x10B42, + unicodeslot=0x106FD, }, - [0x10B43]={ + [0x106FE]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER DALETH", - direction="r", + description="LINEAR A SIGN A592", + direction="l", linebreak="al", - unicodeslot=0x10B43, + unicodeslot=0x106FE, }, - [0x10B44]={ + [0x106FF]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER HE", - direction="r", + description="LINEAR A SIGN A594", + direction="l", linebreak="al", - unicodeslot=0x10B44, + unicodeslot=0x106FF, }, - [0x10B45]={ + [0x10700]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER WAW", - direction="r", + description="LINEAR A SIGN A595", + direction="l", linebreak="al", - unicodeslot=0x10B45, + unicodeslot=0x10700, }, - [0x10B46]={ + [0x10701]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER ZAYIN", - direction="r", + description="LINEAR A SIGN A596", + direction="l", linebreak="al", - unicodeslot=0x10B46, + unicodeslot=0x10701, }, - [0x10B47]={ + [0x10702]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER HETH", - direction="r", + description="LINEAR A SIGN A598", + direction="l", linebreak="al", - unicodeslot=0x10B47, + unicodeslot=0x10702, }, - [0x10B48]={ + [0x10703]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER TETH", - direction="r", + description="LINEAR A SIGN A600", + direction="l", linebreak="al", - unicodeslot=0x10B48, + unicodeslot=0x10703, }, - [0x10B49]={ + [0x10704]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER YODH", - direction="r", + description="LINEAR A SIGN A601", + direction="l", linebreak="al", - unicodeslot=0x10B49, + unicodeslot=0x10704, }, - [0x10B4A]={ + [0x10705]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER KAPH", - direction="r", + description="LINEAR A SIGN A602", + direction="l", linebreak="al", - unicodeslot=0x10B4A, + unicodeslot=0x10705, }, - [0x10B4B]={ + [0x10706]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER LAMEDH", - direction="r", + description="LINEAR A SIGN A603", + direction="l", linebreak="al", - unicodeslot=0x10B4B, + unicodeslot=0x10706, }, - [0x10B4C]={ + [0x10707]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER MEM", - direction="r", + description="LINEAR A SIGN A604", + direction="l", linebreak="al", - unicodeslot=0x10B4C, + unicodeslot=0x10707, }, - [0x10B4D]={ + [0x10708]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER NUN", - direction="r", + description="LINEAR A SIGN A606", + direction="l", linebreak="al", - unicodeslot=0x10B4D, + unicodeslot=0x10708, }, - [0x10B4E]={ + [0x10709]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER SAMEKH", - direction="r", + description="LINEAR A SIGN A608", + direction="l", linebreak="al", - unicodeslot=0x10B4E, + unicodeslot=0x10709, }, - [0x10B4F]={ + [0x1070A]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER AYIN", - direction="r", + description="LINEAR A SIGN A609", + direction="l", linebreak="al", - unicodeslot=0x10B4F, + unicodeslot=0x1070A, }, - [0x10B50]={ + [0x1070B]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER PE", - direction="r", + description="LINEAR A SIGN A610", + direction="l", linebreak="al", - unicodeslot=0x10B50, + unicodeslot=0x1070B, }, - [0x10B51]={ + [0x1070C]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER SADHE", - direction="r", + description="LINEAR A SIGN A611", + direction="l", linebreak="al", - unicodeslot=0x10B51, + unicodeslot=0x1070C, }, - [0x10B52]={ + [0x1070D]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER QOPH", - direction="r", + description="LINEAR A SIGN A612", + direction="l", linebreak="al", - unicodeslot=0x10B52, + unicodeslot=0x1070D, }, - [0x10B53]={ + [0x1070E]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER RESH", - direction="r", + description="LINEAR A SIGN A613", + direction="l", linebreak="al", - unicodeslot=0x10B53, + unicodeslot=0x1070E, }, - [0x10B54]={ + [0x1070F]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER SHIN", - direction="r", + description="LINEAR A SIGN A614", + direction="l", linebreak="al", - unicodeslot=0x10B54, + unicodeslot=0x1070F, }, - [0x10B55]={ + [0x10710]={ category="lo", - description="INSCRIPTIONAL PARTHIAN LETTER TAW", - direction="r", + description="LINEAR A SIGN A615", + direction="l", linebreak="al", - unicodeslot=0x10B55, + unicodeslot=0x10710, }, - [0x10B58]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER ONE", - direction="r", + [0x10711]={ + category="lo", + description="LINEAR A SIGN A616", + direction="l", linebreak="al", - unicodeslot=0x10B58, + unicodeslot=0x10711, }, - [0x10B59]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER TWO", - direction="r", + [0x10712]={ + category="lo", + description="LINEAR A SIGN A617", + direction="l", linebreak="al", - unicodeslot=0x10B59, + unicodeslot=0x10712, }, - [0x10B5A]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER THREE", - direction="r", + [0x10713]={ + category="lo", + description="LINEAR A SIGN A618", + direction="l", linebreak="al", - unicodeslot=0x10B5A, + unicodeslot=0x10713, }, - [0x10B5B]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER FOUR", - direction="r", + [0x10714]={ + category="lo", + description="LINEAR A SIGN A619", + direction="l", linebreak="al", - unicodeslot=0x10B5B, + unicodeslot=0x10714, }, - [0x10B5C]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER TEN", - direction="r", + [0x10715]={ + category="lo", + description="LINEAR A SIGN A620", + direction="l", linebreak="al", - unicodeslot=0x10B5C, + unicodeslot=0x10715, }, - [0x10B5D]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER TWENTY", - direction="r", + [0x10716]={ + category="lo", + description="LINEAR A SIGN A621", + direction="l", linebreak="al", - unicodeslot=0x10B5D, + unicodeslot=0x10716, }, - [0x10B5E]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED", - direction="r", + [0x10717]={ + category="lo", + description="LINEAR A SIGN A622", + direction="l", linebreak="al", - unicodeslot=0x10B5E, + unicodeslot=0x10717, }, - [0x10B5F]={ - category="no", - description="INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND", - direction="r", + [0x10718]={ + category="lo", + description="LINEAR A SIGN A623", + direction="l", linebreak="al", - unicodeslot=0x10B5F, + unicodeslot=0x10718, }, - [0x10B60]={ + [0x10719]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER ALEPH", - direction="r", + description="LINEAR A SIGN A624", + direction="l", linebreak="al", - unicodeslot=0x10B60, + unicodeslot=0x10719, }, - [0x10B61]={ + [0x1071A]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER BETH", - direction="r", + description="LINEAR A SIGN A626", + direction="l", linebreak="al", - unicodeslot=0x10B61, + unicodeslot=0x1071A, }, - [0x10B62]={ + [0x1071B]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER GIMEL", - direction="r", + description="LINEAR A SIGN A627", + direction="l", linebreak="al", - unicodeslot=0x10B62, + unicodeslot=0x1071B, }, - [0x10B63]={ + [0x1071C]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER DALETH", - direction="r", + description="LINEAR A SIGN A628", + direction="l", linebreak="al", - unicodeslot=0x10B63, + unicodeslot=0x1071C, }, - [0x10B64]={ + [0x1071D]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER HE", - direction="r", + description="LINEAR A SIGN A629", + direction="l", linebreak="al", - unicodeslot=0x10B64, + unicodeslot=0x1071D, }, - [0x10B65]={ + [0x1071E]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH", - direction="r", + description="LINEAR A SIGN A634", + direction="l", linebreak="al", - unicodeslot=0x10B65, + unicodeslot=0x1071E, }, - [0x10B66]={ + [0x1071F]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER ZAYIN", - direction="r", + description="LINEAR A SIGN A637", + direction="l", linebreak="al", - unicodeslot=0x10B66, + unicodeslot=0x1071F, }, - [0x10B67]={ + [0x10720]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER HETH", - direction="r", + description="LINEAR A SIGN A638", + direction="l", linebreak="al", - unicodeslot=0x10B67, + unicodeslot=0x10720, }, - [0x10B68]={ + [0x10721]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER TETH", - direction="r", + description="LINEAR A SIGN A640", + direction="l", linebreak="al", - unicodeslot=0x10B68, + unicodeslot=0x10721, }, - [0x10B69]={ + [0x10722]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER YODH", - direction="r", + description="LINEAR A SIGN A642", + direction="l", linebreak="al", - unicodeslot=0x10B69, + unicodeslot=0x10722, }, - [0x10B6A]={ + [0x10723]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER KAPH", - direction="r", + description="LINEAR A SIGN A643", + direction="l", linebreak="al", - unicodeslot=0x10B6A, + unicodeslot=0x10723, }, - [0x10B6B]={ + [0x10724]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER LAMEDH", - direction="r", + description="LINEAR A SIGN A644", + direction="l", linebreak="al", - unicodeslot=0x10B6B, + unicodeslot=0x10724, }, - [0x10B6C]={ + [0x10725]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH", - direction="r", + description="LINEAR A SIGN A645", + direction="l", linebreak="al", - unicodeslot=0x10B6C, + unicodeslot=0x10725, }, - [0x10B6D]={ + [0x10726]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER NUN", - direction="r", + description="LINEAR A SIGN A646", + direction="l", linebreak="al", - unicodeslot=0x10B6D, + unicodeslot=0x10726, }, - [0x10B6E]={ + [0x10727]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER SAMEKH", - direction="r", + description="LINEAR A SIGN A648", + direction="l", linebreak="al", - unicodeslot=0x10B6E, + unicodeslot=0x10727, }, - [0x10B6F]={ + [0x10728]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER PE", - direction="r", + description="LINEAR A SIGN A649", + direction="l", linebreak="al", - unicodeslot=0x10B6F, + unicodeslot=0x10728, }, - [0x10B70]={ + [0x10729]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER SADHE", - direction="r", + description="LINEAR A SIGN A651", + direction="l", linebreak="al", - unicodeslot=0x10B70, + unicodeslot=0x10729, }, - [0x10B71]={ + [0x1072A]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER SHIN", - direction="r", + description="LINEAR A SIGN A652", + direction="l", linebreak="al", - unicodeslot=0x10B71, + unicodeslot=0x1072A, }, - [0x10B72]={ + [0x1072B]={ category="lo", - description="INSCRIPTIONAL PAHLAVI LETTER TAW", - direction="r", + description="LINEAR A SIGN A653", + direction="l", linebreak="al", - unicodeslot=0x10B72, + unicodeslot=0x1072B, }, - [0x10B78]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER ONE", - direction="r", + [0x1072C]={ + category="lo", + description="LINEAR A SIGN A654", + direction="l", linebreak="al", - unicodeslot=0x10B78, + unicodeslot=0x1072C, }, - [0x10B79]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER TWO", - direction="r", + [0x1072D]={ + category="lo", + description="LINEAR A SIGN A655", + direction="l", linebreak="al", - unicodeslot=0x10B79, + unicodeslot=0x1072D, }, - [0x10B7A]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER THREE", - direction="r", + [0x1072E]={ + category="lo", + description="LINEAR A SIGN A656", + direction="l", linebreak="al", - unicodeslot=0x10B7A, + unicodeslot=0x1072E, }, - [0x10B7B]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER FOUR", - direction="r", + [0x1072F]={ + category="lo", + description="LINEAR A SIGN A657", + direction="l", linebreak="al", - unicodeslot=0x10B7B, + unicodeslot=0x1072F, }, - [0x10B7C]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER TEN", + [0x10730]={ + category="lo", + description="LINEAR A SIGN A658", + direction="l", + linebreak="al", + unicodeslot=0x10730, + }, + [0x10731]={ + category="lo", + description="LINEAR A SIGN A659", + direction="l", + linebreak="al", + unicodeslot=0x10731, + }, + [0x10732]={ + category="lo", + description="LINEAR A SIGN A660", + direction="l", + linebreak="al", + unicodeslot=0x10732, + }, + [0x10733]={ + category="lo", + description="LINEAR A SIGN A661", + direction="l", + linebreak="al", + unicodeslot=0x10733, + }, + [0x10734]={ + category="lo", + description="LINEAR A SIGN A662", + direction="l", + linebreak="al", + unicodeslot=0x10734, + }, + [0x10735]={ + category="lo", + description="LINEAR A SIGN A663", + direction="l", + linebreak="al", + unicodeslot=0x10735, + }, + [0x10736]={ + category="lo", + description="LINEAR A SIGN A664", + direction="l", + linebreak="al", + unicodeslot=0x10736, + }, + [0x10740]={ + category="lo", + description="LINEAR A SIGN A701 A", + direction="l", + linebreak="al", + unicodeslot=0x10740, + }, + [0x10741]={ + category="lo", + description="LINEAR A SIGN A702 B", + direction="l", + linebreak="al", + unicodeslot=0x10741, + }, + [0x10742]={ + category="lo", + description="LINEAR A SIGN A703 D", + direction="l", + linebreak="al", + unicodeslot=0x10742, + }, + [0x10743]={ + category="lo", + description="LINEAR A SIGN A704 E", + direction="l", + linebreak="al", + unicodeslot=0x10743, + }, + [0x10744]={ + category="lo", + description="LINEAR A SIGN A705 F", + direction="l", + linebreak="al", + unicodeslot=0x10744, + }, + [0x10745]={ + category="lo", + description="LINEAR A SIGN A706 H", + direction="l", + linebreak="al", + unicodeslot=0x10745, + }, + [0x10746]={ + category="lo", + description="LINEAR A SIGN A707 J", + direction="l", + linebreak="al", + unicodeslot=0x10746, + }, + [0x10747]={ + category="lo", + description="LINEAR A SIGN A708 K", + direction="l", + linebreak="al", + unicodeslot=0x10747, + }, + [0x10748]={ + category="lo", + description="LINEAR A SIGN A709 L", + direction="l", + linebreak="al", + unicodeslot=0x10748, + }, + [0x10749]={ + category="lo", + description="LINEAR A SIGN A709-2 L2", + direction="l", + linebreak="al", + unicodeslot=0x10749, + }, + [0x1074A]={ + category="lo", + description="LINEAR A SIGN A709-3 L3", + direction="l", + linebreak="al", + unicodeslot=0x1074A, + }, + [0x1074B]={ + category="lo", + description="LINEAR A SIGN A709-4 L4", + direction="l", + linebreak="al", + unicodeslot=0x1074B, + }, + [0x1074C]={ + category="lo", + description="LINEAR A SIGN A709-6 L6", + direction="l", + linebreak="al", + unicodeslot=0x1074C, + }, + [0x1074D]={ + category="lo", + description="LINEAR A SIGN A710 W", + direction="l", + linebreak="al", + unicodeslot=0x1074D, + }, + [0x1074E]={ + category="lo", + description="LINEAR A SIGN A711 X", + direction="l", + linebreak="al", + unicodeslot=0x1074E, + }, + [0x1074F]={ + category="lo", + description="LINEAR A SIGN A712 Y", + direction="l", + linebreak="al", + unicodeslot=0x1074F, + }, + [0x10750]={ + category="lo", + description="LINEAR A SIGN A713 OMEGA", + direction="l", + linebreak="al", + unicodeslot=0x10750, + }, + [0x10751]={ + category="lo", + description="LINEAR A SIGN A714 ABB", + direction="l", + linebreak="al", + unicodeslot=0x10751, + }, + [0x10752]={ + category="lo", + description="LINEAR A SIGN A715 BB", + direction="l", + linebreak="al", + unicodeslot=0x10752, + }, + [0x10753]={ + category="lo", + description="LINEAR A SIGN A717 DD", + direction="l", + linebreak="al", + unicodeslot=0x10753, + }, + [0x10754]={ + category="lo", + description="LINEAR A SIGN A726 EYYY", + direction="l", + linebreak="al", + unicodeslot=0x10754, + }, + [0x10755]={ + category="lo", + description="LINEAR A SIGN A732 JE", + direction="l", + linebreak="al", + unicodeslot=0x10755, + }, + [0x10760]={ + category="lo", + description="LINEAR A SIGN A800", + direction="l", + linebreak="al", + unicodeslot=0x10760, + }, + [0x10761]={ + category="lo", + description="LINEAR A SIGN A801", + direction="l", + linebreak="al", + unicodeslot=0x10761, + }, + [0x10762]={ + category="lo", + description="LINEAR A SIGN A802", + direction="l", + linebreak="al", + unicodeslot=0x10762, + }, + [0x10763]={ + category="lo", + description="LINEAR A SIGN A803", + direction="l", + linebreak="al", + unicodeslot=0x10763, + }, + [0x10764]={ + category="lo", + description="LINEAR A SIGN A804", + direction="l", + linebreak="al", + unicodeslot=0x10764, + }, + [0x10765]={ + category="lo", + description="LINEAR A SIGN A805", + direction="l", + linebreak="al", + unicodeslot=0x10765, + }, + [0x10766]={ + category="lo", + description="LINEAR A SIGN A806", + direction="l", + linebreak="al", + unicodeslot=0x10766, + }, + [0x10767]={ + category="lo", + description="LINEAR A SIGN A807", + direction="l", + linebreak="al", + unicodeslot=0x10767, + }, + [0x10800]={ + category="lo", + description="CYPRIOT SYLLABLE A", direction="r", linebreak="al", - unicodeslot=0x10B7C, + unicodeslot=0x10800, }, - [0x10B7D]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER TWENTY", + [0x10801]={ + category="lo", + description="CYPRIOT SYLLABLE E", direction="r", linebreak="al", - unicodeslot=0x10B7D, + unicodeslot=0x10801, }, - [0x10B7E]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED", + [0x10802]={ + category="lo", + description="CYPRIOT SYLLABLE I", direction="r", linebreak="al", - unicodeslot=0x10B7E, + unicodeslot=0x10802, }, - [0x10B7F]={ - category="no", - description="INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND", + [0x10803]={ + category="lo", + description="CYPRIOT SYLLABLE O", direction="r", linebreak="al", - unicodeslot=0x10B7F, + unicodeslot=0x10803, }, - [0x10C00]={ + [0x10804]={ category="lo", - description="OLD TURKIC LETTER ORKHON A", + description="CYPRIOT SYLLABLE U", direction="r", linebreak="al", - unicodeslot=0x10C00, + unicodeslot=0x10804, }, - [0x10C01]={ + [0x10805]={ category="lo", - description="OLD TURKIC LETTER YENISEI A", + description="CYPRIOT SYLLABLE JA", direction="r", linebreak="al", - unicodeslot=0x10C01, + unicodeslot=0x10805, }, - [0x10C02]={ + [0x10808]={ category="lo", - description="OLD TURKIC LETTER YENISEI AE", + description="CYPRIOT SYLLABLE JO", direction="r", linebreak="al", - unicodeslot=0x10C02, + unicodeslot=0x10808, }, - [0x10C03]={ + [0x1080A]={ category="lo", - description="OLD TURKIC LETTER ORKHON I", + description="CYPRIOT SYLLABLE KA", direction="r", linebreak="al", - unicodeslot=0x10C03, + unicodeslot=0x1080A, }, - [0x10C04]={ + [0x1080B]={ category="lo", - description="OLD TURKIC LETTER YENISEI I", + description="CYPRIOT SYLLABLE KE", direction="r", linebreak="al", - unicodeslot=0x10C04, + unicodeslot=0x1080B, }, - [0x10C05]={ + [0x1080C]={ category="lo", - description="OLD TURKIC LETTER YENISEI E", + description="CYPRIOT SYLLABLE KI", direction="r", linebreak="al", - unicodeslot=0x10C05, + unicodeslot=0x1080C, }, - [0x10C06]={ + [0x1080D]={ category="lo", - description="OLD TURKIC LETTER ORKHON O", + description="CYPRIOT SYLLABLE KO", direction="r", linebreak="al", - unicodeslot=0x10C06, + unicodeslot=0x1080D, }, - [0x10C07]={ + [0x1080E]={ category="lo", - description="OLD TURKIC LETTER ORKHON OE", + description="CYPRIOT SYLLABLE KU", direction="r", linebreak="al", - unicodeslot=0x10C07, + unicodeslot=0x1080E, }, - [0x10C08]={ + [0x1080F]={ category="lo", - description="OLD TURKIC LETTER YENISEI OE", + description="CYPRIOT SYLLABLE LA", direction="r", linebreak="al", - unicodeslot=0x10C08, + unicodeslot=0x1080F, }, - [0x10C09]={ + [0x10810]={ category="lo", - description="OLD TURKIC LETTER ORKHON AB", + description="CYPRIOT SYLLABLE LE", direction="r", linebreak="al", - unicodeslot=0x10C09, + unicodeslot=0x10810, }, - [0x10C0A]={ + [0x10811]={ category="lo", - description="OLD TURKIC LETTER YENISEI AB", + description="CYPRIOT SYLLABLE LI", direction="r", linebreak="al", - unicodeslot=0x10C0A, + unicodeslot=0x10811, }, - [0x10C0B]={ + [0x10812]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEB", + description="CYPRIOT SYLLABLE LO", direction="r", linebreak="al", - unicodeslot=0x10C0B, + unicodeslot=0x10812, }, - [0x10C0C]={ + [0x10813]={ category="lo", - description="OLD TURKIC LETTER YENISEI AEB", + description="CYPRIOT SYLLABLE LU", direction="r", linebreak="al", - unicodeslot=0x10C0C, + unicodeslot=0x10813, }, - [0x10C0D]={ + [0x10814]={ category="lo", - description="OLD TURKIC LETTER ORKHON AG", + description="CYPRIOT SYLLABLE MA", direction="r", linebreak="al", - unicodeslot=0x10C0D, + unicodeslot=0x10814, }, - [0x10C0E]={ + [0x10815]={ category="lo", - description="OLD TURKIC LETTER YENISEI AG", + description="CYPRIOT SYLLABLE ME", direction="r", linebreak="al", - unicodeslot=0x10C0E, + unicodeslot=0x10815, }, - [0x10C0F]={ + [0x10816]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEG", + description="CYPRIOT SYLLABLE MI", direction="r", linebreak="al", - unicodeslot=0x10C0F, + unicodeslot=0x10816, }, - [0x10C10]={ + [0x10817]={ category="lo", - description="OLD TURKIC LETTER YENISEI AEG", + description="CYPRIOT SYLLABLE MO", direction="r", linebreak="al", - unicodeslot=0x10C10, + unicodeslot=0x10817, }, - [0x10C11]={ + [0x10818]={ category="lo", - description="OLD TURKIC LETTER ORKHON AD", + description="CYPRIOT SYLLABLE MU", direction="r", linebreak="al", - unicodeslot=0x10C11, + unicodeslot=0x10818, }, - [0x10C12]={ + [0x10819]={ category="lo", - description="OLD TURKIC LETTER YENISEI AD", + description="CYPRIOT SYLLABLE NA", direction="r", linebreak="al", - unicodeslot=0x10C12, + unicodeslot=0x10819, }, - [0x10C13]={ + [0x1081A]={ category="lo", - description="OLD TURKIC LETTER ORKHON AED", + description="CYPRIOT SYLLABLE NE", direction="r", linebreak="al", - unicodeslot=0x10C13, + unicodeslot=0x1081A, }, - [0x10C14]={ + [0x1081B]={ category="lo", - description="OLD TURKIC LETTER ORKHON EZ", + description="CYPRIOT SYLLABLE NI", direction="r", linebreak="al", - unicodeslot=0x10C14, + unicodeslot=0x1081B, }, - [0x10C15]={ + [0x1081C]={ category="lo", - description="OLD TURKIC LETTER YENISEI EZ", + description="CYPRIOT SYLLABLE NO", direction="r", linebreak="al", - unicodeslot=0x10C15, + unicodeslot=0x1081C, }, - [0x10C16]={ + [0x1081D]={ category="lo", - description="OLD TURKIC LETTER ORKHON AY", + description="CYPRIOT SYLLABLE NU", direction="r", linebreak="al", - unicodeslot=0x10C16, + unicodeslot=0x1081D, }, - [0x10C17]={ + [0x1081E]={ category="lo", - description="OLD TURKIC LETTER YENISEI AY", + description="CYPRIOT SYLLABLE PA", direction="r", linebreak="al", - unicodeslot=0x10C17, + unicodeslot=0x1081E, }, - [0x10C18]={ + [0x1081F]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEY", + description="CYPRIOT SYLLABLE PE", direction="r", linebreak="al", - unicodeslot=0x10C18, + unicodeslot=0x1081F, }, - [0x10C19]={ + [0x10820]={ category="lo", - description="OLD TURKIC LETTER YENISEI AEY", + description="CYPRIOT SYLLABLE PI", direction="r", linebreak="al", - unicodeslot=0x10C19, + unicodeslot=0x10820, }, - [0x10C1A]={ + [0x10821]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEK", + description="CYPRIOT SYLLABLE PO", direction="r", linebreak="al", - unicodeslot=0x10C1A, + unicodeslot=0x10821, }, - [0x10C1B]={ + [0x10822]={ category="lo", - description="OLD TURKIC LETTER YENISEI AEK", + description="CYPRIOT SYLLABLE PU", direction="r", linebreak="al", - unicodeslot=0x10C1B, + unicodeslot=0x10822, }, - [0x10C1C]={ + [0x10823]={ category="lo", - description="OLD TURKIC LETTER ORKHON OEK", + description="CYPRIOT SYLLABLE RA", direction="r", linebreak="al", - unicodeslot=0x10C1C, + unicodeslot=0x10823, }, - [0x10C1D]={ + [0x10824]={ category="lo", - description="OLD TURKIC LETTER YENISEI OEK", + description="CYPRIOT SYLLABLE RE", direction="r", linebreak="al", - unicodeslot=0x10C1D, + unicodeslot=0x10824, }, - [0x10C1E]={ + [0x10825]={ category="lo", - description="OLD TURKIC LETTER ORKHON AL", + description="CYPRIOT SYLLABLE RI", direction="r", linebreak="al", - unicodeslot=0x10C1E, + unicodeslot=0x10825, }, - [0x10C1F]={ + [0x10826]={ category="lo", - description="OLD TURKIC LETTER YENISEI AL", + description="CYPRIOT SYLLABLE RO", direction="r", linebreak="al", - unicodeslot=0x10C1F, + unicodeslot=0x10826, }, - [0x10C20]={ + [0x10827]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEL", + description="CYPRIOT SYLLABLE RU", direction="r", linebreak="al", - unicodeslot=0x10C20, + unicodeslot=0x10827, }, - [0x10C21]={ + [0x10828]={ category="lo", - description="OLD TURKIC LETTER ORKHON ELT", + description="CYPRIOT SYLLABLE SA", direction="r", linebreak="al", - unicodeslot=0x10C21, + unicodeslot=0x10828, }, - [0x10C22]={ + [0x10829]={ category="lo", - description="OLD TURKIC LETTER ORKHON EM", + description="CYPRIOT SYLLABLE SE", direction="r", linebreak="al", - unicodeslot=0x10C22, + unicodeslot=0x10829, }, - [0x10C23]={ + [0x1082A]={ category="lo", - description="OLD TURKIC LETTER ORKHON AN", + description="CYPRIOT SYLLABLE SI", direction="r", linebreak="al", - unicodeslot=0x10C23, + unicodeslot=0x1082A, }, - [0x10C24]={ + [0x1082B]={ category="lo", - description="OLD TURKIC LETTER ORKHON AEN", + description="CYPRIOT SYLLABLE SO", direction="r", linebreak="al", - unicodeslot=0x10C24, + unicodeslot=0x1082B, }, - [0x10C25]={ + [0x1082C]={ category="lo", - description="OLD TURKIC LETTER YENISEI AEN", + description="CYPRIOT SYLLABLE SU", direction="r", linebreak="al", - unicodeslot=0x10C25, + unicodeslot=0x1082C, }, - [0x10C26]={ + [0x1082D]={ category="lo", - description="OLD TURKIC LETTER ORKHON ENT", + description="CYPRIOT SYLLABLE TA", direction="r", linebreak="al", - unicodeslot=0x10C26, + unicodeslot=0x1082D, }, - [0x10C27]={ + [0x1082E]={ category="lo", - description="OLD TURKIC LETTER YENISEI ENT", + description="CYPRIOT SYLLABLE TE", direction="r", linebreak="al", - unicodeslot=0x10C27, + unicodeslot=0x1082E, }, - [0x10C28]={ + [0x1082F]={ category="lo", - description="OLD TURKIC LETTER ORKHON ENC", + description="CYPRIOT SYLLABLE TI", direction="r", linebreak="al", - unicodeslot=0x10C28, + unicodeslot=0x1082F, }, - [0x10C29]={ + [0x10830]={ category="lo", - description="OLD TURKIC LETTER YENISEI ENC", + description="CYPRIOT SYLLABLE TO", direction="r", linebreak="al", - unicodeslot=0x10C29, + unicodeslot=0x10830, }, - [0x10C2A]={ + [0x10831]={ category="lo", - description="OLD TURKIC LETTER ORKHON ENY", + description="CYPRIOT SYLLABLE TU", direction="r", linebreak="al", - unicodeslot=0x10C2A, + unicodeslot=0x10831, }, - [0x10C2B]={ + [0x10832]={ category="lo", - description="OLD TURKIC LETTER YENISEI ENY", + description="CYPRIOT SYLLABLE WA", direction="r", linebreak="al", - unicodeslot=0x10C2B, + unicodeslot=0x10832, }, - [0x10C2C]={ + [0x10833]={ category="lo", - description="OLD TURKIC LETTER YENISEI ANG", + description="CYPRIOT SYLLABLE WE", direction="r", linebreak="al", - unicodeslot=0x10C2C, + unicodeslot=0x10833, }, - [0x10C2D]={ + [0x10834]={ category="lo", - description="OLD TURKIC LETTER ORKHON ENG", + description="CYPRIOT SYLLABLE WI", direction="r", linebreak="al", - unicodeslot=0x10C2D, + unicodeslot=0x10834, }, - [0x10C2E]={ + [0x10835]={ category="lo", - description="OLD TURKIC LETTER YENISEI AENG", + description="CYPRIOT SYLLABLE WO", direction="r", linebreak="al", - unicodeslot=0x10C2E, + unicodeslot=0x10835, }, - [0x10C2F]={ + [0x10837]={ category="lo", - description="OLD TURKIC LETTER ORKHON EP", + description="CYPRIOT SYLLABLE XA", direction="r", linebreak="al", - unicodeslot=0x10C2F, + unicodeslot=0x10837, }, - [0x10C30]={ + [0x10838]={ category="lo", - description="OLD TURKIC LETTER ORKHON OP", + description="CYPRIOT SYLLABLE XE", direction="r", linebreak="al", - unicodeslot=0x10C30, + unicodeslot=0x10838, }, - [0x10C31]={ + [0x1083C]={ category="lo", - description="OLD TURKIC LETTER ORKHON IC", + description="CYPRIOT SYLLABLE ZA", direction="r", linebreak="al", - unicodeslot=0x10C31, + unicodeslot=0x1083C, }, - [0x10C32]={ + [0x1083F]={ category="lo", - description="OLD TURKIC LETTER ORKHON EC", + description="CYPRIOT SYLLABLE ZO", direction="r", linebreak="al", - unicodeslot=0x10C32, + unicodeslot=0x1083F, }, - [0x10C33]={ + [0x10840]={ category="lo", - description="OLD TURKIC LETTER YENISEI EC", + description="IMPERIAL ARAMAIC LETTER ALEPH", direction="r", linebreak="al", - unicodeslot=0x10C33, + unicodeslot=0x10840, }, - [0x10C34]={ + [0x10841]={ category="lo", - description="OLD TURKIC LETTER ORKHON AQ", + description="IMPERIAL ARAMAIC LETTER BETH", direction="r", linebreak="al", - unicodeslot=0x10C34, + unicodeslot=0x10841, }, - [0x10C35]={ + [0x10842]={ category="lo", - description="OLD TURKIC LETTER YENISEI AQ", + description="IMPERIAL ARAMAIC LETTER GIMEL", direction="r", linebreak="al", - unicodeslot=0x10C35, + unicodeslot=0x10842, }, - [0x10C36]={ + [0x10843]={ category="lo", - description="OLD TURKIC LETTER ORKHON IQ", + description="IMPERIAL ARAMAIC LETTER DALETH", direction="r", linebreak="al", - unicodeslot=0x10C36, + unicodeslot=0x10843, }, - [0x10C37]={ + [0x10844]={ category="lo", - description="OLD TURKIC LETTER YENISEI IQ", + description="IMPERIAL ARAMAIC LETTER HE", direction="r", linebreak="al", - unicodeslot=0x10C37, + unicodeslot=0x10844, }, - [0x10C38]={ + [0x10845]={ category="lo", - description="OLD TURKIC LETTER ORKHON OQ", + description="IMPERIAL ARAMAIC LETTER WAW", direction="r", linebreak="al", - unicodeslot=0x10C38, + unicodeslot=0x10845, }, - [0x10C39]={ + [0x10846]={ category="lo", - description="OLD TURKIC LETTER YENISEI OQ", + description="IMPERIAL ARAMAIC LETTER ZAYIN", direction="r", linebreak="al", - unicodeslot=0x10C39, + unicodeslot=0x10846, }, - [0x10C3A]={ + [0x10847]={ category="lo", - description="OLD TURKIC LETTER ORKHON AR", + description="IMPERIAL ARAMAIC LETTER HETH", direction="r", linebreak="al", - unicodeslot=0x10C3A, + unicodeslot=0x10847, }, - [0x10C3B]={ + [0x10848]={ category="lo", - description="OLD TURKIC LETTER YENISEI AR", + description="IMPERIAL ARAMAIC LETTER TETH", direction="r", linebreak="al", - unicodeslot=0x10C3B, + unicodeslot=0x10848, }, - [0x10C3C]={ + [0x10849]={ category="lo", - description="OLD TURKIC LETTER ORKHON AER", + description="IMPERIAL ARAMAIC LETTER YODH", direction="r", linebreak="al", - unicodeslot=0x10C3C, + unicodeslot=0x10849, }, - [0x10C3D]={ + [0x1084A]={ category="lo", - description="OLD TURKIC LETTER ORKHON AS", + description="IMPERIAL ARAMAIC LETTER KAPH", direction="r", linebreak="al", - unicodeslot=0x10C3D, + unicodeslot=0x1084A, }, - [0x10C3E]={ + [0x1084B]={ category="lo", - description="OLD TURKIC LETTER ORKHON AES", + description="IMPERIAL ARAMAIC LETTER LAMEDH", direction="r", linebreak="al", - unicodeslot=0x10C3E, + unicodeslot=0x1084B, }, - [0x10C3F]={ + [0x1084C]={ category="lo", - description="OLD TURKIC LETTER ORKHON ASH", + description="IMPERIAL ARAMAIC LETTER MEM", direction="r", linebreak="al", - unicodeslot=0x10C3F, + unicodeslot=0x1084C, }, - [0x10C40]={ + [0x1084D]={ category="lo", - description="OLD TURKIC LETTER YENISEI ASH", + description="IMPERIAL ARAMAIC LETTER NUN", direction="r", linebreak="al", - unicodeslot=0x10C40, + unicodeslot=0x1084D, }, - [0x10C41]={ + [0x1084E]={ category="lo", - description="OLD TURKIC LETTER ORKHON ESH", + description="IMPERIAL ARAMAIC LETTER SAMEKH", direction="r", linebreak="al", - unicodeslot=0x10C41, + unicodeslot=0x1084E, }, - [0x10C42]={ + [0x1084F]={ category="lo", - description="OLD TURKIC LETTER YENISEI ESH", + description="IMPERIAL ARAMAIC LETTER AYIN", direction="r", linebreak="al", - unicodeslot=0x10C42, + unicodeslot=0x1084F, }, - [0x10C43]={ + [0x10850]={ category="lo", - description="OLD TURKIC LETTER ORKHON AT", + description="IMPERIAL ARAMAIC LETTER PE", direction="r", linebreak="al", - unicodeslot=0x10C43, + unicodeslot=0x10850, }, - [0x10C44]={ + [0x10851]={ category="lo", - description="OLD TURKIC LETTER YENISEI AT", + description="IMPERIAL ARAMAIC LETTER SADHE", direction="r", linebreak="al", - unicodeslot=0x10C44, + unicodeslot=0x10851, }, - [0x10C45]={ + [0x10852]={ category="lo", - description="OLD TURKIC LETTER ORKHON AET", + description="IMPERIAL ARAMAIC LETTER QOPH", direction="r", linebreak="al", - unicodeslot=0x10C45, + unicodeslot=0x10852, }, - [0x10C46]={ + [0x10853]={ category="lo", - description="OLD TURKIC LETTER YENISEI AET", + description="IMPERIAL ARAMAIC LETTER RESH", direction="r", linebreak="al", - unicodeslot=0x10C46, + unicodeslot=0x10853, }, - [0x10C47]={ + [0x10854]={ category="lo", - description="OLD TURKIC LETTER ORKHON OT", + description="IMPERIAL ARAMAIC LETTER SHIN", direction="r", linebreak="al", - unicodeslot=0x10C47, + unicodeslot=0x10854, }, - [0x10C48]={ + [0x10855]={ category="lo", - description="OLD TURKIC LETTER ORKHON BASH", + description="IMPERIAL ARAMAIC LETTER TAW", direction="r", linebreak="al", - unicodeslot=0x10C48, + unicodeslot=0x10855, }, - [0x10E60]={ + [0x10857]={ + category="po", + description="IMPERIAL ARAMAIC SECTION SIGN", + direction="r", + linebreak="ba", + unicodeslot=0x10857, + }, + [0x10858]={ category="no", - description="RUMI DIGIT ONE", - direction="an", + description="IMPERIAL ARAMAIC NUMBER ONE", + direction="r", linebreak="al", - unicodeslot=0x10E60, + unicodeslot=0x10858, }, - [0x10E61]={ + [0x10859]={ category="no", - description="RUMI DIGIT TWO", - direction="an", + description="IMPERIAL ARAMAIC NUMBER TWO", + direction="r", linebreak="al", - unicodeslot=0x10E61, + unicodeslot=0x10859, }, - [0x10E62]={ + [0x1085A]={ category="no", - description="RUMI DIGIT THREE", - direction="an", + description="IMPERIAL ARAMAIC NUMBER THREE", + direction="r", linebreak="al", - unicodeslot=0x10E62, + unicodeslot=0x1085A, }, - [0x10E63]={ + [0x1085B]={ category="no", - description="RUMI DIGIT FOUR", - direction="an", + description="IMPERIAL ARAMAIC NUMBER TEN", + direction="r", linebreak="al", - unicodeslot=0x10E63, + unicodeslot=0x1085B, }, - [0x10E64]={ + [0x1085C]={ category="no", - description="RUMI DIGIT FIVE", - direction="an", + description="IMPERIAL ARAMAIC NUMBER TWENTY", + direction="r", linebreak="al", - unicodeslot=0x10E64, + unicodeslot=0x1085C, }, - [0x10E65]={ + [0x1085D]={ category="no", - description="RUMI DIGIT SIX", - direction="an", + description="IMPERIAL ARAMAIC NUMBER ONE HUNDRED", + direction="r", linebreak="al", - unicodeslot=0x10E65, + unicodeslot=0x1085D, }, - [0x10E66]={ + [0x1085E]={ category="no", - description="RUMI DIGIT SEVEN", - direction="an", + description="IMPERIAL ARAMAIC NUMBER ONE THOUSAND", + direction="r", linebreak="al", - unicodeslot=0x10E66, + unicodeslot=0x1085E, }, - [0x10E67]={ + [0x1085F]={ category="no", - description="RUMI DIGIT EIGHT", - direction="an", + description="IMPERIAL ARAMAIC NUMBER TEN THOUSAND", + direction="r", linebreak="al", - unicodeslot=0x10E67, + unicodeslot=0x1085F, }, - [0x10E68]={ - category="no", - description="RUMI DIGIT NINE", - direction="an", + [0x10860]={ + category="lo", + description="PALMYRENE LETTER ALEPH", + direction="r", linebreak="al", - unicodeslot=0x10E68, + unicodeslot=0x10860, }, - [0x10E69]={ - category="no", - description="RUMI NUMBER TEN", - direction="an", + [0x10861]={ + category="lo", + description="PALMYRENE LETTER BETH", + direction="r", linebreak="al", - unicodeslot=0x10E69, + unicodeslot=0x10861, }, - [0x10E6A]={ - category="no", - description="RUMI NUMBER TWENTY", - direction="an", + [0x10862]={ + category="lo", + description="PALMYRENE LETTER GIMEL", + direction="r", linebreak="al", - unicodeslot=0x10E6A, + unicodeslot=0x10862, }, - [0x10E6B]={ - category="no", - description="RUMI NUMBER THIRTY", - direction="an", + [0x10863]={ + category="lo", + description="PALMYRENE LETTER DALETH", + direction="r", linebreak="al", - unicodeslot=0x10E6B, + unicodeslot=0x10863, }, - [0x10E6C]={ - category="no", - description="RUMI NUMBER FORTY", - direction="an", + [0x10864]={ + category="lo", + description="PALMYRENE LETTER HE", + direction="r", linebreak="al", - unicodeslot=0x10E6C, + unicodeslot=0x10864, }, - [0x10E6D]={ - category="no", - description="RUMI NUMBER FIFTY", - direction="an", + [0x10865]={ + category="lo", + description="PALMYRENE LETTER WAW", + direction="r", linebreak="al", - unicodeslot=0x10E6D, + unicodeslot=0x10865, }, - [0x10E6E]={ - category="no", - description="RUMI NUMBER SIXTY", - direction="an", + [0x10866]={ + category="lo", + description="PALMYRENE LETTER ZAYIN", + direction="r", linebreak="al", - unicodeslot=0x10E6E, + unicodeslot=0x10866, }, - [0x10E6F]={ - category="no", - description="RUMI NUMBER SEVENTY", - direction="an", + [0x10867]={ + category="lo", + description="PALMYRENE LETTER HETH", + direction="r", linebreak="al", - unicodeslot=0x10E6F, + unicodeslot=0x10867, }, - [0x10E70]={ - category="no", - description="RUMI NUMBER EIGHTY", - direction="an", + [0x10868]={ + category="lo", + description="PALMYRENE LETTER TETH", + direction="r", linebreak="al", - unicodeslot=0x10E70, + unicodeslot=0x10868, }, - [0x10E71]={ - category="no", - description="RUMI NUMBER NINETY", - direction="an", + [0x10869]={ + category="lo", + description="PALMYRENE LETTER YODH", + direction="r", linebreak="al", - unicodeslot=0x10E71, + unicodeslot=0x10869, }, - [0x10E72]={ - category="no", - description="RUMI NUMBER ONE HUNDRED", - direction="an", + [0x1086A]={ + category="lo", + description="PALMYRENE LETTER KAPH", + direction="r", linebreak="al", - unicodeslot=0x10E72, + unicodeslot=0x1086A, }, - [0x10E73]={ - category="no", - description="RUMI NUMBER TWO HUNDRED", - direction="an", + [0x1086B]={ + category="lo", + description="PALMYRENE LETTER LAMEDH", + direction="r", linebreak="al", - unicodeslot=0x10E73, + unicodeslot=0x1086B, }, - [0x10E74]={ - category="no", - description="RUMI NUMBER THREE HUNDRED", - direction="an", + [0x1086C]={ + category="lo", + description="PALMYRENE LETTER MEM", + direction="r", linebreak="al", - unicodeslot=0x10E74, + unicodeslot=0x1086C, }, - [0x10E75]={ - category="no", - description="RUMI NUMBER FOUR HUNDRED", - direction="an", + [0x1086D]={ + category="lo", + description="PALMYRENE LETTER FINAL NUN", + direction="r", linebreak="al", - unicodeslot=0x10E75, + unicodeslot=0x1086D, }, - [0x10E76]={ - category="no", - description="RUMI NUMBER FIVE HUNDRED", - direction="an", + [0x1086E]={ + category="lo", + description="PALMYRENE LETTER NUN", + direction="r", linebreak="al", - unicodeslot=0x10E76, + unicodeslot=0x1086E, }, - [0x10E77]={ - category="no", - description="RUMI NUMBER SIX HUNDRED", - direction="an", + [0x1086F]={ + category="lo", + description="PALMYRENE LETTER SAMEKH", + direction="r", linebreak="al", - unicodeslot=0x10E77, + unicodeslot=0x1086F, }, - [0x10E78]={ - category="no", - description="RUMI NUMBER SEVEN HUNDRED", - direction="an", + [0x10870]={ + category="lo", + description="PALMYRENE LETTER AYIN", + direction="r", linebreak="al", - unicodeslot=0x10E78, + unicodeslot=0x10870, }, - [0x10E79]={ - category="no", - description="RUMI NUMBER EIGHT HUNDRED", - direction="an", + [0x10871]={ + category="lo", + description="PALMYRENE LETTER PE", + direction="r", linebreak="al", - unicodeslot=0x10E79, + unicodeslot=0x10871, }, - [0x10E7A]={ - category="no", - description="RUMI NUMBER NINE HUNDRED", - direction="an", + [0x10872]={ + category="lo", + description="PALMYRENE LETTER SADHE", + direction="r", linebreak="al", - unicodeslot=0x10E7A, + unicodeslot=0x10872, }, - [0x10E7B]={ - category="no", - description="RUMI FRACTION ONE HALF", - direction="an", + [0x10873]={ + category="lo", + description="PALMYRENE LETTER QOPH", + direction="r", linebreak="al", - unicodeslot=0x10E7B, + unicodeslot=0x10873, }, - [0x10E7C]={ - category="no", - description="RUMI FRACTION ONE QUARTER", - direction="an", + [0x10874]={ + category="lo", + description="PALMYRENE LETTER RESH", + direction="r", linebreak="al", - unicodeslot=0x10E7C, + unicodeslot=0x10874, }, - [0x10E7D]={ - category="no", - description="RUMI FRACTION ONE THIRD", - direction="an", + [0x10875]={ + category="lo", + description="PALMYRENE LETTER SHIN", + direction="r", linebreak="al", - unicodeslot=0x10E7D, + unicodeslot=0x10875, }, - [0x10E7E]={ - category="no", + [0x10876]={ + category="lo", + description="PALMYRENE LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10876, + }, + [0x10877]={ + category="so", + description="PALMYRENE LEFT-POINTING FLEURON", + direction="r", + linebreak="al", + unicodeslot=0x10877, + }, + [0x10878]={ + category="so", + description="PALMYRENE RIGHT-POINTING FLEURON", + direction="r", + linebreak="al", + unicodeslot=0x10878, + }, + [0x10879]={ + category="no", + description="PALMYRENE NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10879, + }, + [0x1087A]={ + category="no", + description="PALMYRENE NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x1087A, + }, + [0x1087B]={ + category="no", + description="PALMYRENE NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x1087B, + }, + [0x1087C]={ + category="no", + description="PALMYRENE NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x1087C, + }, + [0x1087D]={ + category="no", + description="PALMYRENE NUMBER FIVE", + direction="r", + linebreak="al", + unicodeslot=0x1087D, + }, + [0x1087E]={ + category="no", + description="PALMYRENE NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x1087E, + }, + [0x1087F]={ + category="no", + description="PALMYRENE NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x1087F, + }, + [0x10880]={ + category="lo", + description="NABATAEAN LETTER FINAL ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10880, + }, + [0x10881]={ + category="lo", + description="NABATAEAN LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10881, + }, + [0x10882]={ + category="lo", + description="NABATAEAN LETTER FINAL BETH", + direction="r", + linebreak="al", + unicodeslot=0x10882, + }, + [0x10883]={ + category="lo", + description="NABATAEAN LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10883, + }, + [0x10884]={ + category="lo", + description="NABATAEAN LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10884, + }, + [0x10885]={ + category="lo", + description="NABATAEAN LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10885, + }, + [0x10886]={ + category="lo", + description="NABATAEAN LETTER FINAL HE", + direction="r", + linebreak="al", + unicodeslot=0x10886, + }, + [0x10887]={ + category="lo", + description="NABATAEAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10887, + }, + [0x10888]={ + category="lo", + description="NABATAEAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10888, + }, + [0x10889]={ + category="lo", + description="NABATAEAN LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10889, + }, + [0x1088A]={ + category="lo", + description="NABATAEAN LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x1088A, + }, + [0x1088B]={ + category="lo", + description="NABATAEAN LETTER TETH", + direction="r", + linebreak="al", + unicodeslot=0x1088B, + }, + [0x1088C]={ + category="lo", + description="NABATAEAN LETTER FINAL YODH", + direction="r", + linebreak="al", + unicodeslot=0x1088C, + }, + [0x1088D]={ + category="lo", + description="NABATAEAN LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x1088D, + }, + [0x1088E]={ + category="lo", + description="NABATAEAN LETTER FINAL KAPH", + direction="r", + linebreak="al", + unicodeslot=0x1088E, + }, + [0x1088F]={ + category="lo", + description="NABATAEAN LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x1088F, + }, + [0x10890]={ + category="lo", + description="NABATAEAN LETTER FINAL LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10890, + }, + [0x10891]={ + category="lo", + description="NABATAEAN LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10891, + }, + [0x10892]={ + category="lo", + description="NABATAEAN LETTER FINAL MEM", + direction="r", + linebreak="al", + unicodeslot=0x10892, + }, + [0x10893]={ + category="lo", + description="NABATAEAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x10893, + }, + [0x10894]={ + category="lo", + description="NABATAEAN LETTER FINAL NUN", + direction="r", + linebreak="al", + unicodeslot=0x10894, + }, + [0x10895]={ + category="lo", + description="NABATAEAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10895, + }, + [0x10896]={ + category="lo", + description="NABATAEAN LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10896, + }, + [0x10897]={ + category="lo", + description="NABATAEAN LETTER AYIN", + direction="r", + linebreak="al", + unicodeslot=0x10897, + }, + [0x10898]={ + category="lo", + description="NABATAEAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10898, + }, + [0x10899]={ + category="lo", + description="NABATAEAN LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10899, + }, + [0x1089A]={ + category="lo", + description="NABATAEAN LETTER QOPH", + direction="r", + linebreak="al", + unicodeslot=0x1089A, + }, + [0x1089B]={ + category="lo", + description="NABATAEAN LETTER RESH", + direction="r", + linebreak="al", + unicodeslot=0x1089B, + }, + [0x1089C]={ + category="lo", + description="NABATAEAN LETTER FINAL SHIN", + direction="r", + linebreak="al", + unicodeslot=0x1089C, + }, + [0x1089D]={ + category="lo", + description="NABATAEAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x1089D, + }, + [0x1089E]={ + category="lo", + description="NABATAEAN LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x1089E, + }, + [0x108A7]={ + category="no", + description="NABATAEAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x108A7, + }, + [0x108A8]={ + category="no", + description="NABATAEAN NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x108A8, + }, + [0x108A9]={ + category="no", + description="NABATAEAN NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x108A9, + }, + [0x108AA]={ + category="no", + description="NABATAEAN NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x108AA, + }, + [0x108AB]={ + category="no", + description="NABATAEAN CRUCIFORM NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x108AB, + }, + [0x108AC]={ + category="no", + description="NABATAEAN NUMBER FIVE", + direction="r", + linebreak="al", + unicodeslot=0x108AC, + }, + [0x108AD]={ + category="no", + description="NABATAEAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x108AD, + }, + [0x108AE]={ + category="no", + description="NABATAEAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x108AE, + }, + [0x108AF]={ + category="no", + description="NABATAEAN NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x108AF, + }, + [0x10900]={ + category="lo", + description="PHOENICIAN LETTER ALF", + direction="r", + linebreak="al", + unicodeslot=0x10900, + }, + [0x10901]={ + category="lo", + description="PHOENICIAN LETTER BET", + direction="r", + linebreak="al", + unicodeslot=0x10901, + }, + [0x10902]={ + category="lo", + description="PHOENICIAN LETTER GAML", + direction="r", + linebreak="al", + unicodeslot=0x10902, + }, + [0x10903]={ + category="lo", + description="PHOENICIAN LETTER DELT", + direction="r", + linebreak="al", + unicodeslot=0x10903, + }, + [0x10904]={ + category="lo", + description="PHOENICIAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10904, + }, + [0x10905]={ + category="lo", + description="PHOENICIAN LETTER WAU", + direction="r", + linebreak="al", + unicodeslot=0x10905, + }, + [0x10906]={ + category="lo", + description="PHOENICIAN LETTER ZAI", + direction="r", + linebreak="al", + unicodeslot=0x10906, + }, + [0x10907]={ + category="lo", + description="PHOENICIAN LETTER HET", + direction="r", + linebreak="al", + unicodeslot=0x10907, + }, + [0x10908]={ + category="lo", + description="PHOENICIAN LETTER TET", + direction="r", + linebreak="al", + unicodeslot=0x10908, + }, + [0x10909]={ + category="lo", + description="PHOENICIAN LETTER YOD", + direction="r", + linebreak="al", + unicodeslot=0x10909, + }, + [0x1090A]={ + category="lo", + description="PHOENICIAN LETTER KAF", + direction="r", + linebreak="al", + unicodeslot=0x1090A, + }, + [0x1090B]={ + category="lo", + description="PHOENICIAN LETTER LAMD", + direction="r", + linebreak="al", + unicodeslot=0x1090B, + }, + [0x1090C]={ + category="lo", + description="PHOENICIAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x1090C, + }, + [0x1090D]={ + category="lo", + description="PHOENICIAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x1090D, + }, + [0x1090E]={ + category="lo", + description="PHOENICIAN LETTER SEMK", + direction="r", + linebreak="al", + unicodeslot=0x1090E, + }, + [0x1090F]={ + category="lo", + description="PHOENICIAN LETTER AIN", + direction="r", + linebreak="al", + unicodeslot=0x1090F, + }, + [0x10910]={ + category="lo", + description="PHOENICIAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10910, + }, + [0x10911]={ + category="lo", + description="PHOENICIAN LETTER SADE", + direction="r", + linebreak="al", + unicodeslot=0x10911, + }, + [0x10912]={ + category="lo", + description="PHOENICIAN LETTER QOF", + direction="r", + linebreak="al", + unicodeslot=0x10912, + }, + [0x10913]={ + category="lo", + description="PHOENICIAN LETTER ROSH", + direction="r", + linebreak="al", + unicodeslot=0x10913, + }, + [0x10914]={ + category="lo", + description="PHOENICIAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10914, + }, + [0x10915]={ + category="lo", + description="PHOENICIAN LETTER TAU", + direction="r", + linebreak="al", + unicodeslot=0x10915, + }, + [0x10916]={ + category="no", + description="PHOENICIAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10916, + }, + [0x10917]={ + category="no", + description="PHOENICIAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10917, + }, + [0x10918]={ + category="no", + description="PHOENICIAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10918, + }, + [0x10919]={ + category="no", + description="PHOENICIAN NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10919, + }, + [0x1091A]={ + category="no", + description="PHOENICIAN NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x1091A, + }, + [0x1091B]={ + category="no", + description="PHOENICIAN NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x1091B, + }, + [0x1091F]={ + category="po", + description="PHOENICIAN WORD SEPARATOR", + direction="on", + linebreak="ba", + unicodeslot=0x1091F, + }, + [0x10920]={ + category="lo", + description="LYDIAN LETTER A", + direction="r", + linebreak="al", + unicodeslot=0x10920, + }, + [0x10921]={ + category="lo", + description="LYDIAN LETTER B", + direction="r", + linebreak="al", + unicodeslot=0x10921, + }, + [0x10922]={ + category="lo", + description="LYDIAN LETTER G", + direction="r", + linebreak="al", + unicodeslot=0x10922, + }, + [0x10923]={ + category="lo", + description="LYDIAN LETTER D", + direction="r", + linebreak="al", + unicodeslot=0x10923, + }, + [0x10924]={ + category="lo", + description="LYDIAN LETTER E", + direction="r", + linebreak="al", + unicodeslot=0x10924, + }, + [0x10925]={ + category="lo", + description="LYDIAN LETTER V", + direction="r", + linebreak="al", + unicodeslot=0x10925, + }, + [0x10926]={ + category="lo", + description="LYDIAN LETTER I", + direction="r", + linebreak="al", + unicodeslot=0x10926, + }, + [0x10927]={ + category="lo", + description="LYDIAN LETTER Y", + direction="r", + linebreak="al", + unicodeslot=0x10927, + }, + [0x10928]={ + category="lo", + description="LYDIAN LETTER K", + direction="r", + linebreak="al", + unicodeslot=0x10928, + }, + [0x10929]={ + category="lo", + description="LYDIAN LETTER L", + direction="r", + linebreak="al", + unicodeslot=0x10929, + }, + [0x1092A]={ + category="lo", + description="LYDIAN LETTER M", + direction="r", + linebreak="al", + unicodeslot=0x1092A, + }, + [0x1092B]={ + category="lo", + description="LYDIAN LETTER N", + direction="r", + linebreak="al", + unicodeslot=0x1092B, + }, + [0x1092C]={ + category="lo", + description="LYDIAN LETTER O", + direction="r", + linebreak="al", + unicodeslot=0x1092C, + }, + [0x1092D]={ + category="lo", + description="LYDIAN LETTER R", + direction="r", + linebreak="al", + unicodeslot=0x1092D, + }, + [0x1092E]={ + category="lo", + description="LYDIAN LETTER SS", + direction="r", + linebreak="al", + unicodeslot=0x1092E, + }, + [0x1092F]={ + category="lo", + description="LYDIAN LETTER T", + direction="r", + linebreak="al", + unicodeslot=0x1092F, + }, + [0x10930]={ + category="lo", + description="LYDIAN LETTER U", + direction="r", + linebreak="al", + unicodeslot=0x10930, + }, + [0x10931]={ + category="lo", + description="LYDIAN LETTER F", + direction="r", + linebreak="al", + unicodeslot=0x10931, + }, + [0x10932]={ + category="lo", + description="LYDIAN LETTER Q", + direction="r", + linebreak="al", + unicodeslot=0x10932, + }, + [0x10933]={ + category="lo", + description="LYDIAN LETTER S", + direction="r", + linebreak="al", + unicodeslot=0x10933, + }, + [0x10934]={ + category="lo", + description="LYDIAN LETTER TT", + direction="r", + linebreak="al", + unicodeslot=0x10934, + }, + [0x10935]={ + category="lo", + description="LYDIAN LETTER AN", + direction="r", + linebreak="al", + unicodeslot=0x10935, + }, + [0x10936]={ + category="lo", + description="LYDIAN LETTER EN", + direction="r", + linebreak="al", + unicodeslot=0x10936, + }, + [0x10937]={ + category="lo", + description="LYDIAN LETTER LY", + direction="r", + linebreak="al", + unicodeslot=0x10937, + }, + [0x10938]={ + category="lo", + description="LYDIAN LETTER NN", + direction="r", + linebreak="al", + unicodeslot=0x10938, + }, + [0x10939]={ + category="lo", + description="LYDIAN LETTER C", + direction="r", + linebreak="al", + unicodeslot=0x10939, + }, + [0x1093F]={ + category="po", + description="LYDIAN TRIANGULAR MARK", + direction="r", + linebreak="al", + unicodeslot=0x1093F, + }, + [0x10980]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER A", + direction="r", + linebreak="al", + unicodeslot=0x10980, + }, + [0x10981]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER E", + direction="r", + linebreak="al", + unicodeslot=0x10981, + }, + [0x10982]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER I", + direction="r", + linebreak="al", + unicodeslot=0x10982, + }, + [0x10983]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER O", + direction="r", + linebreak="al", + unicodeslot=0x10983, + }, + [0x10984]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER YA", + direction="r", + linebreak="al", + unicodeslot=0x10984, + }, + [0x10985]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER WA", + direction="r", + linebreak="al", + unicodeslot=0x10985, + }, + [0x10986]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER BA", + direction="r", + linebreak="al", + unicodeslot=0x10986, + }, + [0x10987]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER BA-2", + direction="r", + linebreak="al", + unicodeslot=0x10987, + }, + [0x10988]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER PA", + direction="r", + linebreak="al", + unicodeslot=0x10988, + }, + [0x10989]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER MA", + direction="r", + linebreak="al", + unicodeslot=0x10989, + }, + [0x1098A]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER NA", + direction="r", + linebreak="al", + unicodeslot=0x1098A, + }, + [0x1098B]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER NA-2", + direction="r", + linebreak="al", + unicodeslot=0x1098B, + }, + [0x1098C]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER NE", + direction="r", + linebreak="al", + unicodeslot=0x1098C, + }, + [0x1098D]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER NE-2", + direction="r", + linebreak="al", + unicodeslot=0x1098D, + }, + [0x1098E]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER RA", + direction="r", + linebreak="al", + unicodeslot=0x1098E, + }, + [0x1098F]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER RA-2", + direction="r", + linebreak="al", + unicodeslot=0x1098F, + }, + [0x10990]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER LA", + direction="r", + linebreak="al", + unicodeslot=0x10990, + }, + [0x10991]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER KHA", + direction="r", + linebreak="al", + unicodeslot=0x10991, + }, + [0x10992]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER HHA", + direction="r", + linebreak="al", + unicodeslot=0x10992, + }, + [0x10993]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER SA", + direction="r", + linebreak="al", + unicodeslot=0x10993, + }, + [0x10994]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER SA-2", + direction="r", + linebreak="al", + unicodeslot=0x10994, + }, + [0x10995]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER SE", + direction="r", + linebreak="al", + unicodeslot=0x10995, + }, + [0x10996]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER KA", + direction="r", + linebreak="al", + unicodeslot=0x10996, + }, + [0x10997]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER QA", + direction="r", + linebreak="al", + unicodeslot=0x10997, + }, + [0x10998]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER TA", + direction="r", + linebreak="al", + unicodeslot=0x10998, + }, + [0x10999]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER TA-2", + direction="r", + linebreak="al", + unicodeslot=0x10999, + }, + [0x1099A]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER TE", + direction="r", + linebreak="al", + unicodeslot=0x1099A, + }, + [0x1099B]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER TE-2", + direction="r", + linebreak="al", + unicodeslot=0x1099B, + }, + [0x1099C]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER TO", + direction="r", + linebreak="al", + unicodeslot=0x1099C, + }, + [0x1099D]={ + category="lo", + description="MEROITIC HIEROGLYPHIC LETTER DA", + direction="r", + linebreak="al", + unicodeslot=0x1099D, + }, + [0x1099E]={ + category="lo", + description="MEROITIC HIEROGLYPHIC SYMBOL VIDJ", + direction="r", + linebreak="al", + unicodeslot=0x1099E, + }, + [0x1099F]={ + category="lo", + description="MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2", + direction="r", + linebreak="al", + unicodeslot=0x1099F, + }, + [0x109A0]={ + category="lo", + description="MEROITIC CURSIVE LETTER A", + direction="r", + linebreak="al", + unicodeslot=0x109A0, + }, + [0x109A1]={ + category="lo", + description="MEROITIC CURSIVE LETTER E", + direction="r", + linebreak="al", + unicodeslot=0x109A1, + }, + [0x109A2]={ + category="lo", + description="MEROITIC CURSIVE LETTER I", + direction="r", + linebreak="al", + unicodeslot=0x109A2, + }, + [0x109A3]={ + category="lo", + description="MEROITIC CURSIVE LETTER O", + direction="r", + linebreak="al", + unicodeslot=0x109A3, + }, + [0x109A4]={ + category="lo", + description="MEROITIC CURSIVE LETTER YA", + direction="r", + linebreak="al", + unicodeslot=0x109A4, + }, + [0x109A5]={ + category="lo", + description="MEROITIC CURSIVE LETTER WA", + direction="r", + linebreak="al", + unicodeslot=0x109A5, + }, + [0x109A6]={ + category="lo", + description="MEROITIC CURSIVE LETTER BA", + direction="r", + linebreak="al", + unicodeslot=0x109A6, + }, + [0x109A7]={ + category="lo", + description="MEROITIC CURSIVE LETTER PA", + direction="r", + linebreak="al", + unicodeslot=0x109A7, + }, + [0x109A8]={ + category="lo", + description="MEROITIC CURSIVE LETTER MA", + direction="r", + linebreak="al", + unicodeslot=0x109A8, + }, + [0x109A9]={ + category="lo", + description="MEROITIC CURSIVE LETTER NA", + direction="r", + linebreak="al", + unicodeslot=0x109A9, + }, + [0x109AA]={ + category="lo", + description="MEROITIC CURSIVE LETTER NE", + direction="r", + linebreak="al", + unicodeslot=0x109AA, + }, + [0x109AB]={ + category="lo", + description="MEROITIC CURSIVE LETTER RA", + direction="r", + linebreak="al", + unicodeslot=0x109AB, + }, + [0x109AC]={ + category="lo", + description="MEROITIC CURSIVE LETTER LA", + direction="r", + linebreak="al", + unicodeslot=0x109AC, + }, + [0x109AD]={ + category="lo", + description="MEROITIC CURSIVE LETTER KHA", + direction="r", + linebreak="al", + unicodeslot=0x109AD, + }, + [0x109AE]={ + category="lo", + description="MEROITIC CURSIVE LETTER HHA", + direction="r", + linebreak="al", + unicodeslot=0x109AE, + }, + [0x109AF]={ + category="lo", + description="MEROITIC CURSIVE LETTER SA", + direction="r", + linebreak="al", + unicodeslot=0x109AF, + }, + [0x109B0]={ + category="lo", + description="MEROITIC CURSIVE LETTER ARCHAIC SA", + direction="r", + linebreak="al", + unicodeslot=0x109B0, + }, + [0x109B1]={ + category="lo", + description="MEROITIC CURSIVE LETTER SE", + direction="r", + linebreak="al", + unicodeslot=0x109B1, + }, + [0x109B2]={ + category="lo", + description="MEROITIC CURSIVE LETTER KA", + direction="r", + linebreak="al", + unicodeslot=0x109B2, + }, + [0x109B3]={ + category="lo", + description="MEROITIC CURSIVE LETTER QA", + direction="r", + linebreak="al", + unicodeslot=0x109B3, + }, + [0x109B4]={ + category="lo", + description="MEROITIC CURSIVE LETTER TA", + direction="r", + linebreak="al", + unicodeslot=0x109B4, + }, + [0x109B5]={ + category="lo", + description="MEROITIC CURSIVE LETTER TE", + direction="r", + linebreak="al", + unicodeslot=0x109B5, + }, + [0x109B6]={ + category="lo", + description="MEROITIC CURSIVE LETTER TO", + direction="r", + linebreak="al", + unicodeslot=0x109B6, + }, + [0x109B7]={ + category="lo", + description="MEROITIC CURSIVE LETTER DA", + direction="r", + linebreak="al", + unicodeslot=0x109B7, + }, + [0x109BE]={ + category="lo", + description="MEROITIC CURSIVE LOGOGRAM RMT", + direction="r", + linebreak="al", + unicodeslot=0x109BE, + }, + [0x109BF]={ + category="lo", + description="MEROITIC CURSIVE LOGOGRAM IMN", + direction="r", + linebreak="al", + unicodeslot=0x109BF, + }, + [0x10A00]={ + category="lo", + description="KHAROSHTHI LETTER A", + direction="r", + linebreak="al", + unicodeslot=0x10A00, + }, + [0x10A01]={ + category="mn", + description="KHAROSHTHI VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A01, + }, + [0x10A02]={ + category="mn", + description="KHAROSHTHI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A02, + }, + [0x10A03]={ + category="mn", + description="KHAROSHTHI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A03, + }, + [0x10A05]={ + category="mn", + description="KHAROSHTHI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A05, + }, + [0x10A06]={ + category="mn", + description="KHAROSHTHI VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A06, + }, + [0x10A0C]={ + category="mn", + description="KHAROSHTHI VOWEL LENGTH MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A0C, + }, + [0x10A0D]={ + category="mn", + combining=0xDC, + description="KHAROSHTHI SIGN DOUBLE RING BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A0D, + }, + [0x10A0E]={ + category="mn", + description="KHAROSHTHI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A0E, + }, + [0x10A0F]={ + category="mn", + combining=0xE6, + description="KHAROSHTHI SIGN VISARGA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A0F, + }, + [0x10A10]={ + category="lo", + description="KHAROSHTHI LETTER KA", + direction="r", + linebreak="al", + unicodeslot=0x10A10, + }, + [0x10A11]={ + category="lo", + description="KHAROSHTHI LETTER KHA", + direction="r", + linebreak="al", + unicodeslot=0x10A11, + }, + [0x10A12]={ + category="lo", + description="KHAROSHTHI LETTER GA", + direction="r", + linebreak="al", + unicodeslot=0x10A12, + }, + [0x10A13]={ + category="lo", + description="KHAROSHTHI LETTER GHA", + direction="r", + linebreak="al", + unicodeslot=0x10A13, + }, + [0x10A15]={ + category="lo", + description="KHAROSHTHI LETTER CA", + direction="r", + linebreak="al", + unicodeslot=0x10A15, + }, + [0x10A16]={ + category="lo", + description="KHAROSHTHI LETTER CHA", + direction="r", + linebreak="al", + unicodeslot=0x10A16, + }, + [0x10A17]={ + category="lo", + description="KHAROSHTHI LETTER JA", + direction="r", + linebreak="al", + unicodeslot=0x10A17, + }, + [0x10A19]={ + category="lo", + description="KHAROSHTHI LETTER NYA", + direction="r", + linebreak="al", + unicodeslot=0x10A19, + }, + [0x10A1A]={ + category="lo", + description="KHAROSHTHI LETTER TTA", + direction="r", + linebreak="al", + unicodeslot=0x10A1A, + }, + [0x10A1B]={ + category="lo", + description="KHAROSHTHI LETTER TTHA", + direction="r", + linebreak="al", + unicodeslot=0x10A1B, + }, + [0x10A1C]={ + category="lo", + description="KHAROSHTHI LETTER DDA", + direction="r", + linebreak="al", + unicodeslot=0x10A1C, + }, + [0x10A1D]={ + category="lo", + description="KHAROSHTHI LETTER DDHA", + direction="r", + linebreak="al", + unicodeslot=0x10A1D, + }, + [0x10A1E]={ + category="lo", + description="KHAROSHTHI LETTER NNA", + direction="r", + linebreak="al", + unicodeslot=0x10A1E, + }, + [0x10A1F]={ + category="lo", + description="KHAROSHTHI LETTER TA", + direction="r", + linebreak="al", + unicodeslot=0x10A1F, + }, + [0x10A20]={ + category="lo", + description="KHAROSHTHI LETTER THA", + direction="r", + linebreak="al", + unicodeslot=0x10A20, + }, + [0x10A21]={ + category="lo", + description="KHAROSHTHI LETTER DA", + direction="r", + linebreak="al", + unicodeslot=0x10A21, + }, + [0x10A22]={ + category="lo", + description="KHAROSHTHI LETTER DHA", + direction="r", + linebreak="al", + unicodeslot=0x10A22, + }, + [0x10A23]={ + category="lo", + description="KHAROSHTHI LETTER NA", + direction="r", + linebreak="al", + unicodeslot=0x10A23, + }, + [0x10A24]={ + category="lo", + description="KHAROSHTHI LETTER PA", + direction="r", + linebreak="al", + unicodeslot=0x10A24, + }, + [0x10A25]={ + category="lo", + description="KHAROSHTHI LETTER PHA", + direction="r", + linebreak="al", + unicodeslot=0x10A25, + }, + [0x10A26]={ + category="lo", + description="KHAROSHTHI LETTER BA", + direction="r", + linebreak="al", + unicodeslot=0x10A26, + }, + [0x10A27]={ + category="lo", + description="KHAROSHTHI LETTER BHA", + direction="r", + linebreak="al", + unicodeslot=0x10A27, + }, + [0x10A28]={ + category="lo", + description="KHAROSHTHI LETTER MA", + direction="r", + linebreak="al", + unicodeslot=0x10A28, + }, + [0x10A29]={ + category="lo", + description="KHAROSHTHI LETTER YA", + direction="r", + linebreak="al", + unicodeslot=0x10A29, + }, + [0x10A2A]={ + category="lo", + description="KHAROSHTHI LETTER RA", + direction="r", + linebreak="al", + unicodeslot=0x10A2A, + }, + [0x10A2B]={ + category="lo", + description="KHAROSHTHI LETTER LA", + direction="r", + linebreak="al", + unicodeslot=0x10A2B, + }, + [0x10A2C]={ + category="lo", + description="KHAROSHTHI LETTER VA", + direction="r", + linebreak="al", + unicodeslot=0x10A2C, + }, + [0x10A2D]={ + category="lo", + description="KHAROSHTHI LETTER SHA", + direction="r", + linebreak="al", + unicodeslot=0x10A2D, + }, + [0x10A2E]={ + category="lo", + description="KHAROSHTHI LETTER SSA", + direction="r", + linebreak="al", + unicodeslot=0x10A2E, + }, + [0x10A2F]={ + category="lo", + description="KHAROSHTHI LETTER SA", + direction="r", + linebreak="al", + unicodeslot=0x10A2F, + }, + [0x10A30]={ + category="lo", + description="KHAROSHTHI LETTER ZA", + direction="r", + linebreak="al", + unicodeslot=0x10A30, + }, + [0x10A31]={ + category="lo", + description="KHAROSHTHI LETTER HA", + direction="r", + linebreak="al", + unicodeslot=0x10A31, + }, + [0x10A32]={ + category="lo", + description="KHAROSHTHI LETTER KKA", + direction="r", + linebreak="al", + unicodeslot=0x10A32, + }, + [0x10A33]={ + category="lo", + description="KHAROSHTHI LETTER TTTHA", + direction="r", + linebreak="al", + unicodeslot=0x10A33, + }, + [0x10A38]={ + category="mn", + combining=0xE6, + description="KHAROSHTHI SIGN BAR ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A38, + }, + [0x10A39]={ + category="mn", + combining=0x1, + description="KHAROSHTHI SIGN CAUDA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A39, + }, + [0x10A3A]={ + category="mn", + combining=0xDC, + description="KHAROSHTHI SIGN DOT BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A3A, + }, + [0x10A3F]={ + category="mn", + combining=0x9, + description="KHAROSHTHI VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10A3F, + }, + [0x10A40]={ + category="no", + description="KHAROSHTHI DIGIT ONE", + direction="r", + linebreak="al", + unicodeslot=0x10A40, + }, + [0x10A41]={ + category="no", + description="KHAROSHTHI DIGIT TWO", + direction="r", + linebreak="al", + unicodeslot=0x10A41, + }, + [0x10A42]={ + category="no", + description="KHAROSHTHI DIGIT THREE", + direction="r", + linebreak="al", + unicodeslot=0x10A42, + }, + [0x10A43]={ + category="no", + description="KHAROSHTHI DIGIT FOUR", + direction="r", + linebreak="al", + unicodeslot=0x10A43, + }, + [0x10A44]={ + category="no", + description="KHAROSHTHI NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10A44, + }, + [0x10A45]={ + category="no", + description="KHAROSHTHI NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10A45, + }, + [0x10A46]={ + category="no", + description="KHAROSHTHI NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10A46, + }, + [0x10A47]={ + category="no", + description="KHAROSHTHI NUMBER ONE THOUSAND", + direction="r", + linebreak="al", + unicodeslot=0x10A47, + }, + [0x10A50]={ + category="po", + description="KHAROSHTHI PUNCTUATION DOT", + direction="r", + linebreak="ba", + unicodeslot=0x10A50, + }, + [0x10A51]={ + category="po", + description="KHAROSHTHI PUNCTUATION SMALL CIRCLE", + direction="r", + linebreak="ba", + unicodeslot=0x10A51, + }, + [0x10A52]={ + category="po", + description="KHAROSHTHI PUNCTUATION CIRCLE", + direction="r", + linebreak="ba", + unicodeslot=0x10A52, + }, + [0x10A53]={ + category="po", + description="KHAROSHTHI PUNCTUATION CRESCENT BAR", + direction="r", + linebreak="ba", + unicodeslot=0x10A53, + }, + [0x10A54]={ + category="po", + description="KHAROSHTHI PUNCTUATION MANGALAM", + direction="r", + linebreak="ba", + unicodeslot=0x10A54, + }, + [0x10A55]={ + category="po", + description="KHAROSHTHI PUNCTUATION LOTUS", + direction="r", + linebreak="ba", + unicodeslot=0x10A55, + }, + [0x10A56]={ + category="po", + description="KHAROSHTHI PUNCTUATION DANDA", + direction="r", + linebreak="ba", + unicodeslot=0x10A56, + }, + [0x10A57]={ + category="po", + description="KHAROSHTHI PUNCTUATION DOUBLE DANDA", + direction="r", + linebreak="ba", + unicodeslot=0x10A57, + }, + [0x10A58]={ + category="po", + description="KHAROSHTHI PUNCTUATION LINES", + direction="r", + linebreak="al", + unicodeslot=0x10A58, + }, + [0x10A60]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10A60, + }, + [0x10A61]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10A61, + }, + [0x10A62]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10A62, + }, + [0x10A63]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x10A63, + }, + [0x10A64]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER QOPH", + direction="r", + linebreak="al", + unicodeslot=0x10A64, + }, + [0x10A65]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10A65, + }, + [0x10A66]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10A66, + }, + [0x10A67]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER RESH", + direction="r", + linebreak="al", + unicodeslot=0x10A67, + }, + [0x10A68]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10A68, + }, + [0x10A69]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10A69, + }, + [0x10A6A]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER SAT", + direction="r", + linebreak="al", + unicodeslot=0x10A6A, + }, + [0x10A6B]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10A6B, + }, + [0x10A6C]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10A6C, + }, + [0x10A6D]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER KHETH", + direction="r", + linebreak="al", + unicodeslot=0x10A6D, + }, + [0x10A6E]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10A6E, + }, + [0x10A6F]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10A6F, + }, + [0x10A70]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER FE", + direction="r", + linebreak="al", + unicodeslot=0x10A70, + }, + [0x10A71]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER ALEF", + direction="r", + linebreak="al", + unicodeslot=0x10A71, + }, + [0x10A72]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER AYN", + direction="r", + linebreak="al", + unicodeslot=0x10A72, + }, + [0x10A73]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER DHADHE", + direction="r", + linebreak="al", + unicodeslot=0x10A73, + }, + [0x10A74]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10A74, + }, + [0x10A75]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10A75, + }, + [0x10A76]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER GHAYN", + direction="r", + linebreak="al", + unicodeslot=0x10A76, + }, + [0x10A77]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER TETH", + direction="r", + linebreak="al", + unicodeslot=0x10A77, + }, + [0x10A78]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER ZAYN", + direction="r", + linebreak="al", + unicodeslot=0x10A78, + }, + [0x10A79]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER DHALETH", + direction="r", + linebreak="al", + unicodeslot=0x10A79, + }, + [0x10A7A]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10A7A, + }, + [0x10A7B]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER THAW", + direction="r", + linebreak="al", + unicodeslot=0x10A7B, + }, + [0x10A7C]={ + category="lo", + description="OLD SOUTH ARABIAN LETTER THETH", + direction="r", + linebreak="al", + unicodeslot=0x10A7C, + }, + [0x10A7D]={ + category="no", + description="OLD SOUTH ARABIAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10A7D, + }, + [0x10A7E]={ + category="no", + description="OLD SOUTH ARABIAN NUMBER FIFTY", + direction="r", + linebreak="al", + unicodeslot=0x10A7E, + }, + [0x10A7F]={ + category="po", + description="OLD SOUTH ARABIAN NUMERIC INDICATOR", + direction="r", + linebreak="al", + unicodeslot=0x10A7F, + }, + [0x10A80]={ + category="lo", + description="OLD NORTH ARABIAN LETTER HEH", + direction="r", + linebreak="al", + unicodeslot=0x10A80, + }, + [0x10A81]={ + category="lo", + description="OLD NORTH ARABIAN LETTER LAM", + direction="r", + linebreak="al", + unicodeslot=0x10A81, + }, + [0x10A82]={ + category="lo", + description="OLD NORTH ARABIAN LETTER HAH", + direction="r", + linebreak="al", + unicodeslot=0x10A82, + }, + [0x10A83]={ + category="lo", + description="OLD NORTH ARABIAN LETTER MEEM", + direction="r", + linebreak="al", + unicodeslot=0x10A83, + }, + [0x10A84]={ + category="lo", + description="OLD NORTH ARABIAN LETTER QAF", + direction="r", + linebreak="al", + unicodeslot=0x10A84, + }, + [0x10A85]={ + category="lo", + description="OLD NORTH ARABIAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10A85, + }, + [0x10A86]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ES-2", + direction="r", + linebreak="al", + unicodeslot=0x10A86, + }, + [0x10A87]={ + category="lo", + description="OLD NORTH ARABIAN LETTER REH", + direction="r", + linebreak="al", + unicodeslot=0x10A87, + }, + [0x10A88]={ + category="lo", + description="OLD NORTH ARABIAN LETTER BEH", + direction="r", + linebreak="al", + unicodeslot=0x10A88, + }, + [0x10A89]={ + category="lo", + description="OLD NORTH ARABIAN LETTER TEH", + direction="r", + linebreak="al", + unicodeslot=0x10A89, + }, + [0x10A8A]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ES-1", + direction="r", + linebreak="al", + unicodeslot=0x10A8A, + }, + [0x10A8B]={ + category="lo", + description="OLD NORTH ARABIAN LETTER KAF", + direction="r", + linebreak="al", + unicodeslot=0x10A8B, + }, + [0x10A8C]={ + category="lo", + description="OLD NORTH ARABIAN LETTER NOON", + direction="r", + linebreak="al", + unicodeslot=0x10A8C, + }, + [0x10A8D]={ + category="lo", + description="OLD NORTH ARABIAN LETTER KHAH", + direction="r", + linebreak="al", + unicodeslot=0x10A8D, + }, + [0x10A8E]={ + category="lo", + description="OLD NORTH ARABIAN LETTER SAD", + direction="r", + linebreak="al", + unicodeslot=0x10A8E, + }, + [0x10A8F]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ES-3", + direction="r", + linebreak="al", + unicodeslot=0x10A8F, + }, + [0x10A90]={ + category="lo", + description="OLD NORTH ARABIAN LETTER FEH", + direction="r", + linebreak="al", + unicodeslot=0x10A90, + }, + [0x10A91]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ALEF", + direction="r", + linebreak="al", + unicodeslot=0x10A91, + }, + [0x10A92]={ + category="lo", + description="OLD NORTH ARABIAN LETTER AIN", + direction="r", + linebreak="al", + unicodeslot=0x10A92, + }, + [0x10A93]={ + category="lo", + description="OLD NORTH ARABIAN LETTER DAD", + direction="r", + linebreak="al", + unicodeslot=0x10A93, + }, + [0x10A94]={ + category="lo", + description="OLD NORTH ARABIAN LETTER GEEM", + direction="r", + linebreak="al", + unicodeslot=0x10A94, + }, + [0x10A95]={ + category="lo", + description="OLD NORTH ARABIAN LETTER DAL", + direction="r", + linebreak="al", + unicodeslot=0x10A95, + }, + [0x10A96]={ + category="lo", + description="OLD NORTH ARABIAN LETTER GHAIN", + direction="r", + linebreak="al", + unicodeslot=0x10A96, + }, + [0x10A97]={ + category="lo", + description="OLD NORTH ARABIAN LETTER TAH", + direction="r", + linebreak="al", + unicodeslot=0x10A97, + }, + [0x10A98]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ZAIN", + direction="r", + linebreak="al", + unicodeslot=0x10A98, + }, + [0x10A99]={ + category="lo", + description="OLD NORTH ARABIAN LETTER THAL", + direction="r", + linebreak="al", + unicodeslot=0x10A99, + }, + [0x10A9A]={ + category="lo", + description="OLD NORTH ARABIAN LETTER YEH", + direction="r", + linebreak="al", + unicodeslot=0x10A9A, + }, + [0x10A9B]={ + category="lo", + description="OLD NORTH ARABIAN LETTER THEH", + direction="r", + linebreak="al", + unicodeslot=0x10A9B, + }, + [0x10A9C]={ + category="lo", + description="OLD NORTH ARABIAN LETTER ZAH", + direction="r", + linebreak="al", + unicodeslot=0x10A9C, + }, + [0x10A9D]={ + category="no", + description="OLD NORTH ARABIAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10A9D, + }, + [0x10A9E]={ + category="no", + description="OLD NORTH ARABIAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10A9E, + }, + [0x10A9F]={ + category="no", + description="OLD NORTH ARABIAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10A9F, + }, + [0x10AC0]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10AC0, + }, + [0x10AC1]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10AC1, + }, + [0x10AC2]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER BHETH", + direction="r", + linebreak="al", + unicodeslot=0x10AC2, + }, + [0x10AC3]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10AC3, + }, + [0x10AC4]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER GHIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10AC4, + }, + [0x10AC5]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10AC5, + }, + [0x10AC6]={ + arabic="u", + category="lo", + description="MANICHAEAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10AC6, + }, + [0x10AC7]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10AC7, + }, + [0x10AC8]={ + arabic="u", + category="so", + description="MANICHAEAN SIGN UD", + direction="r", + linebreak="al", + unicodeslot=0x10AC8, + }, + [0x10AC9]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10AC9, + }, + [0x10ACA]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER ZHAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10ACA, + }, + [0x10ACB]={ + arabic="u", + category="lo", + description="MANICHAEAN LETTER JAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10ACB, + }, + [0x10ACC]={ + arabic="u", + category="lo", + description="MANICHAEAN LETTER JHAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10ACC, + }, + [0x10ACD]={ + arabic="l", + category="lo", + description="MANICHAEAN LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10ACD, + }, + [0x10ACE]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER TETH", + direction="r", + linebreak="al", + unicodeslot=0x10ACE, + }, + [0x10ACF]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10ACF, + }, + [0x10AD0]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10AD0, + }, + [0x10AD1]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER XAPH", + direction="r", + linebreak="al", + unicodeslot=0x10AD1, + }, + [0x10AD2]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER KHAPH", + direction="r", + linebreak="al", + unicodeslot=0x10AD2, + }, + [0x10AD3]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10AD3, + }, + [0x10AD4]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER DHAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10AD4, + }, + [0x10AD5]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER THAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10AD5, + }, + [0x10AD6]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x10AD6, + }, + [0x10AD7]={ + arabic="l", + category="lo", + description="MANICHAEAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10AD7, + }, + [0x10AD8]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10AD8, + }, + [0x10AD9]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER AYIN", + direction="r", + linebreak="al", + unicodeslot=0x10AD9, + }, + [0x10ADA]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER AAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10ADA, + }, + [0x10ADB]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10ADB, + }, + [0x10ADC]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER FE", + direction="r", + linebreak="al", + unicodeslot=0x10ADC, + }, + [0x10ADD]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10ADD, + }, + [0x10ADE]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER QOPH", + direction="r", + linebreak="al", + unicodeslot=0x10ADE, + }, + [0x10ADF]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER XOPH", + direction="r", + linebreak="al", + unicodeslot=0x10ADF, + }, + [0x10AE0]={ + arabic="d", + category="lo", + description="MANICHAEAN LETTER QHOPH", + direction="r", + linebreak="al", + unicodeslot=0x10AE0, + }, + [0x10AE1]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER RESH", + direction="r", + linebreak="al", + unicodeslot=0x10AE1, + }, + [0x10AE2]={ + arabic="u", + category="lo", + description="MANICHAEAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10AE2, + }, + [0x10AE3]={ + arabic="u", + category="lo", + description="MANICHAEAN LETTER SSHIN", + direction="r", + linebreak="al", + unicodeslot=0x10AE3, + }, + [0x10AE4]={ + arabic="r", + category="lo", + description="MANICHAEAN LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10AE4, + }, + [0x10AE5]={ + category="mn", + combining=0xE6, + description="MANICHAEAN ABBREVIATION MARK ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10AE5, + }, + [0x10AE6]={ + category="mn", + combining=0xDC, + description="MANICHAEAN ABBREVIATION MARK BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10AE6, + }, + [0x10AEB]={ + arabic="d", + category="no", + description="MANICHAEAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10AEB, + }, + [0x10AEC]={ + arabic="d", + category="no", + description="MANICHAEAN NUMBER FIVE", + direction="r", + linebreak="al", + unicodeslot=0x10AEC, + }, + [0x10AED]={ + arabic="d", + category="no", + description="MANICHAEAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10AED, + }, + [0x10AEE]={ + arabic="d", + category="no", + description="MANICHAEAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10AEE, + }, + [0x10AEF]={ + arabic="r", + category="no", + description="MANICHAEAN NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10AEF, + }, + [0x10AF0]={ + category="po", + description="MANICHAEAN PUNCTUATION STAR", + direction="r", + linebreak="ba", + unicodeslot=0x10AF0, + }, + [0x10AF1]={ + category="po", + description="MANICHAEAN PUNCTUATION FLEURON", + direction="r", + linebreak="ba", + unicodeslot=0x10AF1, + }, + [0x10AF2]={ + category="po", + description="MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT", + direction="r", + linebreak="ba", + unicodeslot=0x10AF2, + }, + [0x10AF3]={ + category="po", + description="MANICHAEAN PUNCTUATION DOT WITHIN DOT", + direction="r", + linebreak="ba", + unicodeslot=0x10AF3, + }, + [0x10AF4]={ + category="po", + description="MANICHAEAN PUNCTUATION DOT", + direction="r", + linebreak="ba", + unicodeslot=0x10AF4, + }, + [0x10AF5]={ + category="po", + description="MANICHAEAN PUNCTUATION TWO DOTS", + direction="r", + linebreak="ba", + unicodeslot=0x10AF5, + }, + [0x10AF6]={ + category="po", + description="MANICHAEAN PUNCTUATION LINE FILLER", + direction="r", + linebreak="in", + unicodeslot=0x10AF6, + }, + [0x10B00]={ + category="lo", + description="AVESTAN LETTER A", + direction="r", + linebreak="al", + unicodeslot=0x10B00, + }, + [0x10B01]={ + category="lo", + description="AVESTAN LETTER AA", + direction="r", + linebreak="al", + unicodeslot=0x10B01, + }, + [0x10B02]={ + category="lo", + description="AVESTAN LETTER AO", + direction="r", + linebreak="al", + unicodeslot=0x10B02, + }, + [0x10B03]={ + category="lo", + description="AVESTAN LETTER AAO", + direction="r", + linebreak="al", + unicodeslot=0x10B03, + }, + [0x10B04]={ + category="lo", + description="AVESTAN LETTER AN", + direction="r", + linebreak="al", + unicodeslot=0x10B04, + }, + [0x10B05]={ + category="lo", + description="AVESTAN LETTER AAN", + direction="r", + linebreak="al", + unicodeslot=0x10B05, + }, + [0x10B06]={ + category="lo", + description="AVESTAN LETTER AE", + direction="r", + linebreak="al", + unicodeslot=0x10B06, + }, + [0x10B07]={ + category="lo", + description="AVESTAN LETTER AEE", + direction="r", + linebreak="al", + unicodeslot=0x10B07, + }, + [0x10B08]={ + category="lo", + description="AVESTAN LETTER E", + direction="r", + linebreak="al", + unicodeslot=0x10B08, + }, + [0x10B09]={ + category="lo", + description="AVESTAN LETTER EE", + direction="r", + linebreak="al", + unicodeslot=0x10B09, + }, + [0x10B0A]={ + category="lo", + description="AVESTAN LETTER O", + direction="r", + linebreak="al", + unicodeslot=0x10B0A, + }, + [0x10B0B]={ + category="lo", + description="AVESTAN LETTER OO", + direction="r", + linebreak="al", + unicodeslot=0x10B0B, + }, + [0x10B0C]={ + category="lo", + description="AVESTAN LETTER I", + direction="r", + linebreak="al", + unicodeslot=0x10B0C, + }, + [0x10B0D]={ + category="lo", + description="AVESTAN LETTER II", + direction="r", + linebreak="al", + unicodeslot=0x10B0D, + }, + [0x10B0E]={ + category="lo", + description="AVESTAN LETTER U", + direction="r", + linebreak="al", + unicodeslot=0x10B0E, + }, + [0x10B0F]={ + category="lo", + description="AVESTAN LETTER UU", + direction="r", + linebreak="al", + unicodeslot=0x10B0F, + }, + [0x10B10]={ + category="lo", + description="AVESTAN LETTER KE", + direction="r", + linebreak="al", + unicodeslot=0x10B10, + }, + [0x10B11]={ + category="lo", + description="AVESTAN LETTER XE", + direction="r", + linebreak="al", + unicodeslot=0x10B11, + }, + [0x10B12]={ + category="lo", + description="AVESTAN LETTER XYE", + direction="r", + linebreak="al", + unicodeslot=0x10B12, + }, + [0x10B13]={ + category="lo", + description="AVESTAN LETTER XVE", + direction="r", + linebreak="al", + unicodeslot=0x10B13, + }, + [0x10B14]={ + category="lo", + description="AVESTAN LETTER GE", + direction="r", + linebreak="al", + unicodeslot=0x10B14, + }, + [0x10B15]={ + category="lo", + description="AVESTAN LETTER GGE", + direction="r", + linebreak="al", + unicodeslot=0x10B15, + }, + [0x10B16]={ + category="lo", + description="AVESTAN LETTER GHE", + direction="r", + linebreak="al", + unicodeslot=0x10B16, + }, + [0x10B17]={ + category="lo", + description="AVESTAN LETTER CE", + direction="r", + linebreak="al", + unicodeslot=0x10B17, + }, + [0x10B18]={ + category="lo", + description="AVESTAN LETTER JE", + direction="r", + linebreak="al", + unicodeslot=0x10B18, + }, + [0x10B19]={ + category="lo", + description="AVESTAN LETTER TE", + direction="r", + linebreak="al", + unicodeslot=0x10B19, + }, + [0x10B1A]={ + category="lo", + description="AVESTAN LETTER THE", + direction="r", + linebreak="al", + unicodeslot=0x10B1A, + }, + [0x10B1B]={ + category="lo", + description="AVESTAN LETTER DE", + direction="r", + linebreak="al", + unicodeslot=0x10B1B, + }, + [0x10B1C]={ + category="lo", + description="AVESTAN LETTER DHE", + direction="r", + linebreak="al", + unicodeslot=0x10B1C, + }, + [0x10B1D]={ + category="lo", + description="AVESTAN LETTER TTE", + direction="r", + linebreak="al", + unicodeslot=0x10B1D, + }, + [0x10B1E]={ + category="lo", + description="AVESTAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10B1E, + }, + [0x10B1F]={ + category="lo", + description="AVESTAN LETTER FE", + direction="r", + linebreak="al", + unicodeslot=0x10B1F, + }, + [0x10B20]={ + category="lo", + description="AVESTAN LETTER BE", + direction="r", + linebreak="al", + unicodeslot=0x10B20, + }, + [0x10B21]={ + category="lo", + description="AVESTAN LETTER BHE", + direction="r", + linebreak="al", + unicodeslot=0x10B21, + }, + [0x10B22]={ + category="lo", + description="AVESTAN LETTER NGE", + direction="r", + linebreak="al", + unicodeslot=0x10B22, + }, + [0x10B23]={ + category="lo", + description="AVESTAN LETTER NGYE", + direction="r", + linebreak="al", + unicodeslot=0x10B23, + }, + [0x10B24]={ + category="lo", + description="AVESTAN LETTER NGVE", + direction="r", + linebreak="al", + unicodeslot=0x10B24, + }, + [0x10B25]={ + category="lo", + description="AVESTAN LETTER NE", + direction="r", + linebreak="al", + unicodeslot=0x10B25, + }, + [0x10B26]={ + category="lo", + description="AVESTAN LETTER NYE", + direction="r", + linebreak="al", + unicodeslot=0x10B26, + }, + [0x10B27]={ + category="lo", + description="AVESTAN LETTER NNE", + direction="r", + linebreak="al", + unicodeslot=0x10B27, + }, + [0x10B28]={ + category="lo", + description="AVESTAN LETTER ME", + direction="r", + linebreak="al", + unicodeslot=0x10B28, + }, + [0x10B29]={ + category="lo", + description="AVESTAN LETTER HME", + direction="r", + linebreak="al", + unicodeslot=0x10B29, + }, + [0x10B2A]={ + category="lo", + description="AVESTAN LETTER YYE", + direction="r", + linebreak="al", + unicodeslot=0x10B2A, + }, + [0x10B2B]={ + category="lo", + description="AVESTAN LETTER YE", + direction="r", + linebreak="al", + unicodeslot=0x10B2B, + }, + [0x10B2C]={ + category="lo", + description="AVESTAN LETTER VE", + direction="r", + linebreak="al", + unicodeslot=0x10B2C, + }, + [0x10B2D]={ + category="lo", + description="AVESTAN LETTER RE", + direction="r", + linebreak="al", + unicodeslot=0x10B2D, + }, + [0x10B2E]={ + category="lo", + description="AVESTAN LETTER LE", + direction="r", + linebreak="al", + unicodeslot=0x10B2E, + }, + [0x10B2F]={ + category="lo", + description="AVESTAN LETTER SE", + direction="r", + linebreak="al", + unicodeslot=0x10B2F, + }, + [0x10B30]={ + category="lo", + description="AVESTAN LETTER ZE", + direction="r", + linebreak="al", + unicodeslot=0x10B30, + }, + [0x10B31]={ + category="lo", + description="AVESTAN LETTER SHE", + direction="r", + linebreak="al", + unicodeslot=0x10B31, + }, + [0x10B32]={ + category="lo", + description="AVESTAN LETTER ZHE", + direction="r", + linebreak="al", + unicodeslot=0x10B32, + }, + [0x10B33]={ + category="lo", + description="AVESTAN LETTER SHYE", + direction="r", + linebreak="al", + unicodeslot=0x10B33, + }, + [0x10B34]={ + category="lo", + description="AVESTAN LETTER SSHE", + direction="r", + linebreak="al", + unicodeslot=0x10B34, + }, + [0x10B35]={ + category="lo", + description="AVESTAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10B35, + }, + [0x10B39]={ + category="po", + description="AVESTAN ABBREVIATION MARK", + direction="on", + linebreak="ba", + unicodeslot=0x10B39, + }, + [0x10B3A]={ + category="po", + description="TINY TWO DOTS OVER ONE DOT PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3A, + }, + [0x10B3B]={ + category="po", + description="SMALL TWO DOTS OVER ONE DOT PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3B, + }, + [0x10B3C]={ + category="po", + description="LARGE TWO DOTS OVER ONE DOT PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3C, + }, + [0x10B3D]={ + category="po", + description="LARGE ONE DOT OVER TWO DOTS PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3D, + }, + [0x10B3E]={ + category="po", + description="LARGE TWO RINGS OVER ONE RING PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3E, + }, + [0x10B3F]={ + category="po", + description="LARGE ONE RING OVER TWO RINGS PUNCTUATION", + direction="on", + linebreak="ba", + unicodeslot=0x10B3F, + }, + [0x10B40]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10B40, + }, + [0x10B41]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10B41, + }, + [0x10B42]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10B42, + }, + [0x10B43]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10B43, + }, + [0x10B44]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10B44, + }, + [0x10B45]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10B45, + }, + [0x10B46]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10B46, + }, + [0x10B47]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10B47, + }, + [0x10B48]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER TETH", + direction="r", + linebreak="al", + unicodeslot=0x10B48, + }, + [0x10B49]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10B49, + }, + [0x10B4A]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10B4A, + }, + [0x10B4B]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10B4B, + }, + [0x10B4C]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x10B4C, + }, + [0x10B4D]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10B4D, + }, + [0x10B4E]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10B4E, + }, + [0x10B4F]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER AYIN", + direction="r", + linebreak="al", + unicodeslot=0x10B4F, + }, + [0x10B50]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10B50, + }, + [0x10B51]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10B51, + }, + [0x10B52]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER QOPH", + direction="r", + linebreak="al", + unicodeslot=0x10B52, + }, + [0x10B53]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER RESH", + direction="r", + linebreak="al", + unicodeslot=0x10B53, + }, + [0x10B54]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10B54, + }, + [0x10B55]={ + category="lo", + description="INSCRIPTIONAL PARTHIAN LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10B55, + }, + [0x10B58]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10B58, + }, + [0x10B59]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x10B59, + }, + [0x10B5A]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x10B5A, + }, + [0x10B5B]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x10B5B, + }, + [0x10B5C]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10B5C, + }, + [0x10B5D]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10B5D, + }, + [0x10B5E]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10B5E, + }, + [0x10B5F]={ + category="no", + description="INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND", + direction="r", + linebreak="al", + unicodeslot=0x10B5F, + }, + [0x10B60]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10B60, + }, + [0x10B61]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10B61, + }, + [0x10B62]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10B62, + }, + [0x10B63]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10B63, + }, + [0x10B64]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10B64, + }, + [0x10B65]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH", + direction="r", + linebreak="al", + unicodeslot=0x10B65, + }, + [0x10B66]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10B66, + }, + [0x10B67]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10B67, + }, + [0x10B68]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER TETH", + direction="r", + linebreak="al", + unicodeslot=0x10B68, + }, + [0x10B69]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10B69, + }, + [0x10B6A]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10B6A, + }, + [0x10B6B]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10B6B, + }, + [0x10B6C]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH", + direction="r", + linebreak="al", + unicodeslot=0x10B6C, + }, + [0x10B6D]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10B6D, + }, + [0x10B6E]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10B6E, + }, + [0x10B6F]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10B6F, + }, + [0x10B70]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10B70, + }, + [0x10B71]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10B71, + }, + [0x10B72]={ + category="lo", + description="INSCRIPTIONAL PAHLAVI LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10B72, + }, + [0x10B78]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10B78, + }, + [0x10B79]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x10B79, + }, + [0x10B7A]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x10B7A, + }, + [0x10B7B]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x10B7B, + }, + [0x10B7C]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10B7C, + }, + [0x10B7D]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10B7D, + }, + [0x10B7E]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10B7E, + }, + [0x10B7F]={ + category="no", + description="INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND", + direction="r", + linebreak="al", + unicodeslot=0x10B7F, + }, + [0x10B80]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10B80, + }, + [0x10B81]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10B81, + }, + [0x10B82]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10B82, + }, + [0x10B83]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10B83, + }, + [0x10B84]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10B84, + }, + [0x10B85]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER WAW-AYIN-RESH", + direction="r", + linebreak="al", + unicodeslot=0x10B85, + }, + [0x10B86]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10B86, + }, + [0x10B87]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10B87, + }, + [0x10B88]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10B88, + }, + [0x10B89]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10B89, + }, + [0x10B8A]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10B8A, + }, + [0x10B8B]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER MEM-QOPH", + direction="r", + linebreak="al", + unicodeslot=0x10B8B, + }, + [0x10B8C]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10B8C, + }, + [0x10B8D]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10B8D, + }, + [0x10B8E]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10B8E, + }, + [0x10B8F]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10B8F, + }, + [0x10B90]={ + arabic="d", + category="lo", + description="PSALTER PAHLAVI LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10B90, + }, + [0x10B91]={ + arabic="r", + category="lo", + description="PSALTER PAHLAVI LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10B91, + }, + [0x10B99]={ + category="po", + description="PSALTER PAHLAVI SECTION MARK", + direction="r", + linebreak="al", + unicodeslot=0x10B99, + }, + [0x10B9A]={ + category="po", + description="PSALTER PAHLAVI TURNED SECTION MARK", + direction="r", + linebreak="al", + unicodeslot=0x10B9A, + }, + [0x10B9B]={ + category="po", + description="PSALTER PAHLAVI FOUR DOTS WITH CROSS", + direction="r", + linebreak="al", + unicodeslot=0x10B9B, + }, + [0x10B9C]={ + category="po", + description="PSALTER PAHLAVI FOUR DOTS WITH DOT", + direction="r", + linebreak="al", + unicodeslot=0x10B9C, + }, + [0x10BA9]={ + arabic="r", + category="no", + description="PSALTER PAHLAVI NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10BA9, + }, + [0x10BAA]={ + arabic="r", + category="no", + description="PSALTER PAHLAVI NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x10BAA, + }, + [0x10BAB]={ + arabic="r", + category="no", + description="PSALTER PAHLAVI NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x10BAB, + }, + [0x10BAC]={ + arabic="r", + category="no", + description="PSALTER PAHLAVI NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x10BAC, + }, + [0x10BAD]={ + arabic="d", + category="no", + description="PSALTER PAHLAVI NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10BAD, + }, + [0x10BAE]={ + arabic="d", + category="no", + description="PSALTER PAHLAVI NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10BAE, + }, + [0x10BAF]={ + arabic="u", + category="no", + description="PSALTER PAHLAVI NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10BAF, + }, + [0x10C00]={ + category="lo", + description="OLD TURKIC LETTER ORKHON A", + direction="r", + linebreak="al", + unicodeslot=0x10C00, + }, + [0x10C01]={ + category="lo", + description="OLD TURKIC LETTER YENISEI A", + direction="r", + linebreak="al", + unicodeslot=0x10C01, + }, + [0x10C02]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AE", + direction="r", + linebreak="al", + unicodeslot=0x10C02, + }, + [0x10C03]={ + category="lo", + description="OLD TURKIC LETTER ORKHON I", + direction="r", + linebreak="al", + unicodeslot=0x10C03, + }, + [0x10C04]={ + category="lo", + description="OLD TURKIC LETTER YENISEI I", + direction="r", + linebreak="al", + unicodeslot=0x10C04, + }, + [0x10C05]={ + category="lo", + description="OLD TURKIC LETTER YENISEI E", + direction="r", + linebreak="al", + unicodeslot=0x10C05, + }, + [0x10C06]={ + category="lo", + description="OLD TURKIC LETTER ORKHON O", + direction="r", + linebreak="al", + unicodeslot=0x10C06, + }, + [0x10C07]={ + category="lo", + description="OLD TURKIC LETTER ORKHON OE", + direction="r", + linebreak="al", + unicodeslot=0x10C07, + }, + [0x10C08]={ + category="lo", + description="OLD TURKIC LETTER YENISEI OE", + direction="r", + linebreak="al", + unicodeslot=0x10C08, + }, + [0x10C09]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AB", + direction="r", + linebreak="al", + unicodeslot=0x10C09, + }, + [0x10C0A]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AB", + direction="r", + linebreak="al", + unicodeslot=0x10C0A, + }, + [0x10C0B]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEB", + direction="r", + linebreak="al", + unicodeslot=0x10C0B, + }, + [0x10C0C]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AEB", + direction="r", + linebreak="al", + unicodeslot=0x10C0C, + }, + [0x10C0D]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AG", + direction="r", + linebreak="al", + unicodeslot=0x10C0D, + }, + [0x10C0E]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AG", + direction="r", + linebreak="al", + unicodeslot=0x10C0E, + }, + [0x10C0F]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEG", + direction="r", + linebreak="al", + unicodeslot=0x10C0F, + }, + [0x10C10]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AEG", + direction="r", + linebreak="al", + unicodeslot=0x10C10, + }, + [0x10C11]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AD", + direction="r", + linebreak="al", + unicodeslot=0x10C11, + }, + [0x10C12]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AD", + direction="r", + linebreak="al", + unicodeslot=0x10C12, + }, + [0x10C13]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AED", + direction="r", + linebreak="al", + unicodeslot=0x10C13, + }, + [0x10C14]={ + category="lo", + description="OLD TURKIC LETTER ORKHON EZ", + direction="r", + linebreak="al", + unicodeslot=0x10C14, + }, + [0x10C15]={ + category="lo", + description="OLD TURKIC LETTER YENISEI EZ", + direction="r", + linebreak="al", + unicodeslot=0x10C15, + }, + [0x10C16]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AY", + direction="r", + linebreak="al", + unicodeslot=0x10C16, + }, + [0x10C17]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AY", + direction="r", + linebreak="al", + unicodeslot=0x10C17, + }, + [0x10C18]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEY", + direction="r", + linebreak="al", + unicodeslot=0x10C18, + }, + [0x10C19]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AEY", + direction="r", + linebreak="al", + unicodeslot=0x10C19, + }, + [0x10C1A]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEK", + direction="r", + linebreak="al", + unicodeslot=0x10C1A, + }, + [0x10C1B]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AEK", + direction="r", + linebreak="al", + unicodeslot=0x10C1B, + }, + [0x10C1C]={ + category="lo", + description="OLD TURKIC LETTER ORKHON OEK", + direction="r", + linebreak="al", + unicodeslot=0x10C1C, + }, + [0x10C1D]={ + category="lo", + description="OLD TURKIC LETTER YENISEI OEK", + direction="r", + linebreak="al", + unicodeslot=0x10C1D, + }, + [0x10C1E]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AL", + direction="r", + linebreak="al", + unicodeslot=0x10C1E, + }, + [0x10C1F]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AL", + direction="r", + linebreak="al", + unicodeslot=0x10C1F, + }, + [0x10C20]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEL", + direction="r", + linebreak="al", + unicodeslot=0x10C20, + }, + [0x10C21]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ELT", + direction="r", + linebreak="al", + unicodeslot=0x10C21, + }, + [0x10C22]={ + category="lo", + description="OLD TURKIC LETTER ORKHON EM", + direction="r", + linebreak="al", + unicodeslot=0x10C22, + }, + [0x10C23]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AN", + direction="r", + linebreak="al", + unicodeslot=0x10C23, + }, + [0x10C24]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AEN", + direction="r", + linebreak="al", + unicodeslot=0x10C24, + }, + [0x10C25]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AEN", + direction="r", + linebreak="al", + unicodeslot=0x10C25, + }, + [0x10C26]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ENT", + direction="r", + linebreak="al", + unicodeslot=0x10C26, + }, + [0x10C27]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ENT", + direction="r", + linebreak="al", + unicodeslot=0x10C27, + }, + [0x10C28]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ENC", + direction="r", + linebreak="al", + unicodeslot=0x10C28, + }, + [0x10C29]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ENC", + direction="r", + linebreak="al", + unicodeslot=0x10C29, + }, + [0x10C2A]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ENY", + direction="r", + linebreak="al", + unicodeslot=0x10C2A, + }, + [0x10C2B]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ENY", + direction="r", + linebreak="al", + unicodeslot=0x10C2B, + }, + [0x10C2C]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ANG", + direction="r", + linebreak="al", + unicodeslot=0x10C2C, + }, + [0x10C2D]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ENG", + direction="r", + linebreak="al", + unicodeslot=0x10C2D, + }, + [0x10C2E]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AENG", + direction="r", + linebreak="al", + unicodeslot=0x10C2E, + }, + [0x10C2F]={ + category="lo", + description="OLD TURKIC LETTER ORKHON EP", + direction="r", + linebreak="al", + unicodeslot=0x10C2F, + }, + [0x10C30]={ + category="lo", + description="OLD TURKIC LETTER ORKHON OP", + direction="r", + linebreak="al", + unicodeslot=0x10C30, + }, + [0x10C31]={ + category="lo", + description="OLD TURKIC LETTER ORKHON IC", + direction="r", + linebreak="al", + unicodeslot=0x10C31, + }, + [0x10C32]={ + category="lo", + description="OLD TURKIC LETTER ORKHON EC", + direction="r", + linebreak="al", + unicodeslot=0x10C32, + }, + [0x10C33]={ + category="lo", + description="OLD TURKIC LETTER YENISEI EC", + direction="r", + linebreak="al", + unicodeslot=0x10C33, + }, + [0x10C34]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AQ", + direction="r", + linebreak="al", + unicodeslot=0x10C34, + }, + [0x10C35]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AQ", + direction="r", + linebreak="al", + unicodeslot=0x10C35, + }, + [0x10C36]={ + category="lo", + description="OLD TURKIC LETTER ORKHON IQ", + direction="r", + linebreak="al", + unicodeslot=0x10C36, + }, + [0x10C37]={ + category="lo", + description="OLD TURKIC LETTER YENISEI IQ", + direction="r", + linebreak="al", + unicodeslot=0x10C37, + }, + [0x10C38]={ + category="lo", + description="OLD TURKIC LETTER ORKHON OQ", + direction="r", + linebreak="al", + unicodeslot=0x10C38, + }, + [0x10C39]={ + category="lo", + description="OLD TURKIC LETTER YENISEI OQ", + direction="r", + linebreak="al", + unicodeslot=0x10C39, + }, + [0x10C3A]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AR", + direction="r", + linebreak="al", + unicodeslot=0x10C3A, + }, + [0x10C3B]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AR", + direction="r", + linebreak="al", + unicodeslot=0x10C3B, + }, + [0x10C3C]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AER", + direction="r", + linebreak="al", + unicodeslot=0x10C3C, + }, + [0x10C3D]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AS", + direction="r", + linebreak="al", + unicodeslot=0x10C3D, + }, + [0x10C3E]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AES", + direction="r", + linebreak="al", + unicodeslot=0x10C3E, + }, + [0x10C3F]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ASH", + direction="r", + linebreak="al", + unicodeslot=0x10C3F, + }, + [0x10C40]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ASH", + direction="r", + linebreak="al", + unicodeslot=0x10C40, + }, + [0x10C41]={ + category="lo", + description="OLD TURKIC LETTER ORKHON ESH", + direction="r", + linebreak="al", + unicodeslot=0x10C41, + }, + [0x10C42]={ + category="lo", + description="OLD TURKIC LETTER YENISEI ESH", + direction="r", + linebreak="al", + unicodeslot=0x10C42, + }, + [0x10C43]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AT", + direction="r", + linebreak="al", + unicodeslot=0x10C43, + }, + [0x10C44]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AT", + direction="r", + linebreak="al", + unicodeslot=0x10C44, + }, + [0x10C45]={ + category="lo", + description="OLD TURKIC LETTER ORKHON AET", + direction="r", + linebreak="al", + unicodeslot=0x10C45, + }, + [0x10C46]={ + category="lo", + description="OLD TURKIC LETTER YENISEI AET", + direction="r", + linebreak="al", + unicodeslot=0x10C46, + }, + [0x10C47]={ + category="lo", + description="OLD TURKIC LETTER ORKHON OT", + direction="r", + linebreak="al", + unicodeslot=0x10C47, + }, + [0x10C48]={ + category="lo", + description="OLD TURKIC LETTER ORKHON BASH", + direction="r", + linebreak="al", + unicodeslot=0x10C48, + }, + [0x10E60]={ + category="no", + description="RUMI DIGIT ONE", + direction="an", + linebreak="al", + unicodeslot=0x10E60, + }, + [0x10E61]={ + category="no", + description="RUMI DIGIT TWO", + direction="an", + linebreak="al", + unicodeslot=0x10E61, + }, + [0x10E62]={ + category="no", + description="RUMI DIGIT THREE", + direction="an", + linebreak="al", + unicodeslot=0x10E62, + }, + [0x10E63]={ + category="no", + description="RUMI DIGIT FOUR", + direction="an", + linebreak="al", + unicodeslot=0x10E63, + }, + [0x10E64]={ + category="no", + description="RUMI DIGIT FIVE", + direction="an", + linebreak="al", + unicodeslot=0x10E64, + }, + [0x10E65]={ + category="no", + description="RUMI DIGIT SIX", + direction="an", + linebreak="al", + unicodeslot=0x10E65, + }, + [0x10E66]={ + category="no", + description="RUMI DIGIT SEVEN", + direction="an", + linebreak="al", + unicodeslot=0x10E66, + }, + [0x10E67]={ + category="no", + description="RUMI DIGIT EIGHT", + direction="an", + linebreak="al", + unicodeslot=0x10E67, + }, + [0x10E68]={ + category="no", + description="RUMI DIGIT NINE", + direction="an", + linebreak="al", + unicodeslot=0x10E68, + }, + [0x10E69]={ + category="no", + description="RUMI NUMBER TEN", + direction="an", + linebreak="al", + unicodeslot=0x10E69, + }, + [0x10E6A]={ + category="no", + description="RUMI NUMBER TWENTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6A, + }, + [0x10E6B]={ + category="no", + description="RUMI NUMBER THIRTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6B, + }, + [0x10E6C]={ + category="no", + description="RUMI NUMBER FORTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6C, + }, + [0x10E6D]={ + category="no", + description="RUMI NUMBER FIFTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6D, + }, + [0x10E6E]={ + category="no", + description="RUMI NUMBER SIXTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6E, + }, + [0x10E6F]={ + category="no", + description="RUMI NUMBER SEVENTY", + direction="an", + linebreak="al", + unicodeslot=0x10E6F, + }, + [0x10E70]={ + category="no", + description="RUMI NUMBER EIGHTY", + direction="an", + linebreak="al", + unicodeslot=0x10E70, + }, + [0x10E71]={ + category="no", + description="RUMI NUMBER NINETY", + direction="an", + linebreak="al", + unicodeslot=0x10E71, + }, + [0x10E72]={ + category="no", + description="RUMI NUMBER ONE HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E72, + }, + [0x10E73]={ + category="no", + description="RUMI NUMBER TWO HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E73, + }, + [0x10E74]={ + category="no", + description="RUMI NUMBER THREE HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E74, + }, + [0x10E75]={ + category="no", + description="RUMI NUMBER FOUR HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E75, + }, + [0x10E76]={ + category="no", + description="RUMI NUMBER FIVE HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E76, + }, + [0x10E77]={ + category="no", + description="RUMI NUMBER SIX HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E77, + }, + [0x10E78]={ + category="no", + description="RUMI NUMBER SEVEN HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E78, + }, + [0x10E79]={ + category="no", + description="RUMI NUMBER EIGHT HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E79, + }, + [0x10E7A]={ + category="no", + description="RUMI NUMBER NINE HUNDRED", + direction="an", + linebreak="al", + unicodeslot=0x10E7A, + }, + [0x10E7B]={ + category="no", + description="RUMI FRACTION ONE HALF", + direction="an", + linebreak="al", + unicodeslot=0x10E7B, + }, + [0x10E7C]={ + category="no", + description="RUMI FRACTION ONE QUARTER", + direction="an", + linebreak="al", + unicodeslot=0x10E7C, + }, + [0x10E7D]={ + category="no", + description="RUMI FRACTION ONE THIRD", + direction="an", + linebreak="al", + unicodeslot=0x10E7D, + }, + [0x10E7E]={ + category="no", description="RUMI FRACTION TWO THIRDS", direction="an", linebreak="al", - unicodeslot=0x10E7E, + unicodeslot=0x10E7E, + }, + [0x11000]={ + category="mc", + description="BRAHMI SIGN CANDRABINDU", + direction="l", + linebreak="cm", + unicodeslot=0x11000, + }, + [0x11001]={ + category="mn", + description="BRAHMI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11001, + }, + [0x11002]={ + category="mc", + description="BRAHMI SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11002, + }, + [0x11003]={ + category="lo", + description="BRAHMI SIGN JIHVAMULIYA", + direction="l", + linebreak="al", + unicodeslot=0x11003, + }, + [0x11004]={ + category="lo", + description="BRAHMI SIGN UPADHMANIYA", + direction="l", + linebreak="al", + unicodeslot=0x11004, + }, + [0x11005]={ + category="lo", + description="BRAHMI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11005, + }, + [0x11006]={ + category="lo", + description="BRAHMI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11006, + }, + [0x11007]={ + category="lo", + description="BRAHMI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11007, + }, + [0x11008]={ + category="lo", + description="BRAHMI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11008, + }, + [0x11009]={ + category="lo", + description="BRAHMI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11009, + }, + [0x1100A]={ + category="lo", + description="BRAHMI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x1100A, + }, + [0x1100B]={ + category="lo", + description="BRAHMI LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x1100B, + }, + [0x1100C]={ + category="lo", + description="BRAHMI LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x1100C, + }, + [0x1100D]={ + category="lo", + description="BRAHMI LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x1100D, + }, + [0x1100E]={ + category="lo", + description="BRAHMI LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x1100E, + }, + [0x1100F]={ + category="lo", + description="BRAHMI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1100F, + }, + [0x11010]={ + category="lo", + description="BRAHMI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11010, + }, + [0x11011]={ + category="lo", + description="BRAHMI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11011, + }, + [0x11012]={ + category="lo", + description="BRAHMI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11012, + }, + [0x11013]={ + category="lo", + description="BRAHMI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11013, + }, + [0x11014]={ + category="lo", + description="BRAHMI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11014, + }, + [0x11015]={ + category="lo", + description="BRAHMI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11015, + }, + [0x11016]={ + category="lo", + description="BRAHMI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11016, + }, + [0x11017]={ + category="lo", + description="BRAHMI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11017, + }, + [0x11018]={ + category="lo", + description="BRAHMI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11018, + }, + [0x11019]={ + category="lo", + description="BRAHMI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11019, + }, + [0x1101A]={ + category="lo", + description="BRAHMI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x1101A, + }, + [0x1101B]={ + category="lo", + description="BRAHMI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x1101B, + }, + [0x1101C]={ + category="lo", + description="BRAHMI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x1101C, + }, + [0x1101D]={ + category="lo", + description="BRAHMI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x1101D, + }, + [0x1101E]={ + category="lo", + description="BRAHMI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x1101E, + }, + [0x1101F]={ + category="lo", + description="BRAHMI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x1101F, + }, + [0x11020]={ + category="lo", + description="BRAHMI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11020, + }, + [0x11021]={ + category="lo", + description="BRAHMI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11021, + }, + [0x11022]={ + category="lo", + description="BRAHMI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11022, + }, + [0x11023]={ + category="lo", + description="BRAHMI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11023, + }, + [0x11024]={ + category="lo", + description="BRAHMI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11024, + }, + [0x11025]={ + category="lo", + description="BRAHMI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11025, + }, + [0x11026]={ + category="lo", + description="BRAHMI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11026, + }, + [0x11027]={ + category="lo", + description="BRAHMI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11027, + }, + [0x11028]={ + category="lo", + description="BRAHMI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11028, + }, + [0x11029]={ + category="lo", + description="BRAHMI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11029, + }, + [0x1102A]={ + category="lo", + description="BRAHMI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x1102A, + }, + [0x1102B]={ + category="lo", + description="BRAHMI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x1102B, + }, + [0x1102C]={ + category="lo", + description="BRAHMI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x1102C, + }, + [0x1102D]={ + category="lo", + description="BRAHMI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x1102D, + }, + [0x1102E]={ + category="lo", + description="BRAHMI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x1102E, + }, + [0x1102F]={ + category="lo", + description="BRAHMI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x1102F, + }, + [0x11030]={ + category="lo", + description="BRAHMI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11030, + }, + [0x11031]={ + category="lo", + description="BRAHMI LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11031, + }, + [0x11032]={ + category="lo", + description="BRAHMI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11032, + }, + [0x11033]={ + category="lo", + description="BRAHMI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11033, + }, + [0x11034]={ + category="lo", + description="BRAHMI LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x11034, + }, + [0x11035]={ + category="lo", + description="BRAHMI LETTER OLD TAMIL LLLA", + direction="l", + linebreak="al", + unicodeslot=0x11035, + }, + [0x11036]={ + category="lo", + description="BRAHMI LETTER OLD TAMIL RRA", + direction="l", + linebreak="al", + unicodeslot=0x11036, + }, + [0x11037]={ + category="lo", + description="BRAHMI LETTER OLD TAMIL NNNA", + direction="l", + linebreak="al", + unicodeslot=0x11037, + }, + [0x11038]={ + category="mn", + description="BRAHMI VOWEL SIGN AA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11038, + }, + [0x11039]={ + category="mn", + description="BRAHMI VOWEL SIGN BHATTIPROLU AA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11039, + }, + [0x1103A]={ + category="mn", + description="BRAHMI VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103A, + }, + [0x1103B]={ + category="mn", + description="BRAHMI VOWEL SIGN II", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103B, + }, + [0x1103C]={ + category="mn", + description="BRAHMI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103C, + }, + [0x1103D]={ + category="mn", + description="BRAHMI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103D, + }, + [0x1103E]={ + category="mn", + description="BRAHMI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103E, + }, + [0x1103F]={ + category="mn", + description="BRAHMI VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1103F, + }, + [0x11040]={ + category="mn", + description="BRAHMI VOWEL SIGN VOCALIC L", + direction="nsm", + linebreak="cm", + unicodeslot=0x11040, + }, + [0x11041]={ + category="mn", + description="BRAHMI VOWEL SIGN VOCALIC LL", + direction="nsm", + linebreak="cm", + unicodeslot=0x11041, + }, + [0x11042]={ + category="mn", + description="BRAHMI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11042, + }, + [0x11043]={ + category="mn", + description="BRAHMI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11043, + }, + [0x11044]={ + category="mn", + description="BRAHMI VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x11044, + }, + [0x11045]={ + category="mn", + description="BRAHMI VOWEL SIGN AU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11045, + }, + [0x11046]={ + category="mn", + combining=0x9, + description="BRAHMI VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11046, + }, + [0x11047]={ + category="po", + description="BRAHMI DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11047, + }, + [0x11048]={ + category="po", + description="BRAHMI DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11048, + }, + [0x11049]={ + category="po", + description="BRAHMI PUNCTUATION DOT", + direction="l", + linebreak="al", + unicodeslot=0x11049, + }, + [0x1104A]={ + category="po", + description="BRAHMI PUNCTUATION DOUBLE DOT", + direction="l", + linebreak="al", + unicodeslot=0x1104A, + }, + [0x1104B]={ + category="po", + description="BRAHMI PUNCTUATION LINE", + direction="l", + linebreak="al", + unicodeslot=0x1104B, + }, + [0x1104C]={ + category="po", + description="BRAHMI PUNCTUATION CRESCENT BAR", + direction="l", + linebreak="al", + unicodeslot=0x1104C, + }, + [0x1104D]={ + category="po", + description="BRAHMI PUNCTUATION LOTUS", + direction="l", + linebreak="al", + unicodeslot=0x1104D, + }, + [0x11052]={ + category="no", + description="BRAHMI NUMBER ONE", + direction="on", + linebreak="al", + unicodeslot=0x11052, + }, + [0x11053]={ + category="no", + description="BRAHMI NUMBER TWO", + direction="on", + linebreak="al", + unicodeslot=0x11053, + }, + [0x11054]={ + category="no", + description="BRAHMI NUMBER THREE", + direction="on", + linebreak="al", + unicodeslot=0x11054, + }, + [0x11055]={ + category="no", + description="BRAHMI NUMBER FOUR", + direction="on", + linebreak="al", + unicodeslot=0x11055, + }, + [0x11056]={ + category="no", + description="BRAHMI NUMBER FIVE", + direction="on", + linebreak="al", + unicodeslot=0x11056, + }, + [0x11057]={ + category="no", + description="BRAHMI NUMBER SIX", + direction="on", + linebreak="al", + unicodeslot=0x11057, + }, + [0x11058]={ + category="no", + description="BRAHMI NUMBER SEVEN", + direction="on", + linebreak="al", + unicodeslot=0x11058, + }, + [0x11059]={ + category="no", + description="BRAHMI NUMBER EIGHT", + direction="on", + linebreak="al", + unicodeslot=0x11059, + }, + [0x1105A]={ + category="no", + description="BRAHMI NUMBER NINE", + direction="on", + linebreak="al", + unicodeslot=0x1105A, + }, + [0x1105B]={ + category="no", + description="BRAHMI NUMBER TEN", + direction="on", + linebreak="al", + unicodeslot=0x1105B, + }, + [0x1105C]={ + category="no", + description="BRAHMI NUMBER TWENTY", + direction="on", + linebreak="al", + unicodeslot=0x1105C, + }, + [0x1105D]={ + category="no", + description="BRAHMI NUMBER THIRTY", + direction="on", + linebreak="al", + unicodeslot=0x1105D, + }, + [0x1105E]={ + category="no", + description="BRAHMI NUMBER FORTY", + direction="on", + linebreak="al", + unicodeslot=0x1105E, + }, + [0x1105F]={ + category="no", + description="BRAHMI NUMBER FIFTY", + direction="on", + linebreak="al", + unicodeslot=0x1105F, + }, + [0x11060]={ + category="no", + description="BRAHMI NUMBER SIXTY", + direction="on", + linebreak="al", + unicodeslot=0x11060, + }, + [0x11061]={ + category="no", + description="BRAHMI NUMBER SEVENTY", + direction="on", + linebreak="al", + unicodeslot=0x11061, + }, + [0x11062]={ + category="no", + description="BRAHMI NUMBER EIGHTY", + direction="on", + linebreak="al", + unicodeslot=0x11062, + }, + [0x11063]={ + category="no", + description="BRAHMI NUMBER NINETY", + direction="on", + linebreak="al", + unicodeslot=0x11063, + }, + [0x11064]={ + category="no", + description="BRAHMI NUMBER ONE HUNDRED", + direction="on", + linebreak="al", + unicodeslot=0x11064, + }, + [0x11065]={ + category="no", + description="BRAHMI NUMBER ONE THOUSAND", + direction="on", + linebreak="al", + unicodeslot=0x11065, + }, + [0x11066]={ + category="nd", + description="BRAHMI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11066, + }, + [0x11067]={ + category="nd", + description="BRAHMI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11067, + }, + [0x11068]={ + category="nd", + description="BRAHMI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11068, + }, + [0x11069]={ + category="nd", + description="BRAHMI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11069, + }, + [0x1106A]={ + category="nd", + description="BRAHMI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x1106A, + }, + [0x1106B]={ + category="nd", + description="BRAHMI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x1106B, + }, + [0x1106C]={ + category="nd", + description="BRAHMI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x1106C, + }, + [0x1106D]={ + category="nd", + description="BRAHMI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x1106D, + }, + [0x1106E]={ + category="nd", + description="BRAHMI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x1106E, + }, + [0x1106F]={ + category="nd", + description="BRAHMI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x1106F, + }, + [0x1107F]={ + category="mn", + combining=0x9, + description="BRAHMI NUMBER JOINER", + direction="nsm", + linebreak="cm", + unicodeslot=0x1107F, + }, + [0x11080]={ + category="mn", + description="KAITHI SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11080, + }, + [0x11081]={ + category="mn", + description="KAITHI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11081, + }, + [0x11082]={ + category="mc", + description="KAITHI SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11082, + }, + [0x11083]={ + category="lo", + description="KAITHI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11083, + }, + [0x11084]={ + category="lo", + description="KAITHI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11084, + }, + [0x11085]={ + category="lo", + description="KAITHI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11085, + }, + [0x11086]={ + category="lo", + description="KAITHI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11086, + }, + [0x11087]={ + category="lo", + description="KAITHI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11087, + }, + [0x11088]={ + category="lo", + description="KAITHI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11088, + }, + [0x11089]={ + category="lo", + description="KAITHI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11089, + }, + [0x1108A]={ + category="lo", + description="KAITHI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x1108A, + }, + [0x1108B]={ + category="lo", + description="KAITHI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1108B, + }, + [0x1108C]={ + category="lo", + description="KAITHI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x1108C, + }, + [0x1108D]={ + category="lo", + description="KAITHI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x1108D, + }, + [0x1108E]={ + category="lo", + description="KAITHI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x1108E, + }, + [0x1108F]={ + category="lo", + description="KAITHI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x1108F, + }, + [0x11090]={ + category="lo", + description="KAITHI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11090, + }, + [0x11091]={ + category="lo", + description="KAITHI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11091, + }, + [0x11092]={ + category="lo", + description="KAITHI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11092, + }, + [0x11093]={ + category="lo", + description="KAITHI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11093, + }, + [0x11094]={ + category="lo", + description="KAITHI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11094, + }, + [0x11095]={ + category="lo", + description="KAITHI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11095, + }, + [0x11096]={ + category="lo", + description="KAITHI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11096, + }, + [0x11097]={ + category="lo", + description="KAITHI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11097, + }, + [0x11098]={ + category="lo", + description="KAITHI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11098, + }, + [0x11099]={ + category="lo", + description="KAITHI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11099, + }, + [0x1109A]={ + category="lo", + description="KAITHI LETTER DDDHA", + direction="l", + linebreak="al", + specials={ "char", 0x11099, 0x110BA }, + unicodeslot=0x1109A, + }, + [0x1109B]={ + category="lo", + description="KAITHI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x1109B, + }, + [0x1109C]={ + category="lo", + description="KAITHI LETTER RHA", + direction="l", + linebreak="al", + specials={ "char", 0x1109B, 0x110BA }, + unicodeslot=0x1109C, + }, + [0x1109D]={ + category="lo", + description="KAITHI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x1109D, + }, + [0x1109E]={ + category="lo", + description="KAITHI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x1109E, + }, + [0x1109F]={ + category="lo", + description="KAITHI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1109F, + }, + [0x110A0]={ + category="lo", + description="KAITHI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x110A0, + }, + [0x110A1]={ + category="lo", + description="KAITHI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x110A1, + }, + [0x110A2]={ + category="lo", + description="KAITHI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x110A2, + }, + [0x110A3]={ + category="lo", + description="KAITHI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x110A3, + }, + [0x110A4]={ + category="lo", + description="KAITHI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x110A4, + }, + [0x110A5]={ + category="lo", + description="KAITHI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x110A5, + }, + [0x110A6]={ + category="lo", + description="KAITHI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x110A6, + }, + [0x110A7]={ + category="lo", + description="KAITHI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x110A7, + }, + [0x110A8]={ + category="lo", + description="KAITHI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x110A8, + }, + [0x110A9]={ + category="lo", + description="KAITHI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x110A9, + }, + [0x110AA]={ + category="lo", + description="KAITHI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x110AA, + }, + [0x110AB]={ + category="lo", + description="KAITHI LETTER VA", + direction="l", + linebreak="al", + specials={ "char", 0x110A5, 0x110BA }, + unicodeslot=0x110AB, + }, + [0x110AC]={ + category="lo", + description="KAITHI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x110AC, + }, + [0x110AD]={ + category="lo", + description="KAITHI LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x110AD, + }, + [0x110AE]={ + category="lo", + description="KAITHI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x110AE, + }, + [0x110AF]={ + category="lo", + description="KAITHI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x110AF, + }, + [0x110B0]={ + category="mc", + description="KAITHI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x110B0, + }, + [0x110B1]={ + category="mc", + description="KAITHI VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x110B1, + }, + [0x110B2]={ + category="mc", + description="KAITHI VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x110B2, + }, + [0x110B3]={ + category="mn", + description="KAITHI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x110B3, + }, + [0x110B4]={ + category="mn", + description="KAITHI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x110B4, + }, + [0x110B5]={ + category="mn", + description="KAITHI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x110B5, + }, + [0x110B6]={ + category="mn", + description="KAITHI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x110B6, + }, + [0x110B7]={ + category="mc", + description="KAITHI VOWEL SIGN O", + direction="l", + linebreak="cm", + unicodeslot=0x110B7, + }, + [0x110B8]={ + category="mc", + description="KAITHI VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x110B8, + }, + [0x110B9]={ + category="mn", + combining=0x9, + description="KAITHI SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x110B9, + }, + [0x110BA]={ + category="mn", + combining=0x7, + description="KAITHI SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x110BA, + }, + [0x110BB]={ + category="po", + description="KAITHI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x110BB, + }, + [0x110BC]={ + category="po", + description="KAITHI ENUMERATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x110BC, + }, + [0x110BD]={ + category="cf", + description="KAITHI NUMBER SIGN", + direction="l", + linebreak="al", + unicodeslot=0x110BD, + }, + [0x110BE]={ + category="po", + description="KAITHI SECTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x110BE, + }, + [0x110BF]={ + category="po", + description="KAITHI DOUBLE SECTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x110BF, + }, + [0x110C0]={ + category="po", + description="KAITHI DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x110C0, + }, + [0x110C1]={ + category="po", + description="KAITHI DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x110C1, + }, + [0x110D0]={ + category="lo", + description="SORA SOMPENG LETTER SAH", + direction="l", + linebreak="al", + unicodeslot=0x110D0, + }, + [0x110D1]={ + category="lo", + description="SORA SOMPENG LETTER TAH", + direction="l", + linebreak="al", + unicodeslot=0x110D1, + }, + [0x110D2]={ + category="lo", + description="SORA SOMPENG LETTER BAH", + direction="l", + linebreak="al", + unicodeslot=0x110D2, + }, + [0x110D3]={ + category="lo", + description="SORA SOMPENG LETTER CAH", + direction="l", + linebreak="al", + unicodeslot=0x110D3, + }, + [0x110D4]={ + category="lo", + description="SORA SOMPENG LETTER DAH", + direction="l", + linebreak="al", + unicodeslot=0x110D4, + }, + [0x110D5]={ + category="lo", + description="SORA SOMPENG LETTER GAH", + direction="l", + linebreak="al", + unicodeslot=0x110D5, + }, + [0x110D6]={ + category="lo", + description="SORA SOMPENG LETTER MAH", + direction="l", + linebreak="al", + unicodeslot=0x110D6, + }, + [0x110D7]={ + category="lo", + description="SORA SOMPENG LETTER NGAH", + direction="l", + linebreak="al", + unicodeslot=0x110D7, + }, + [0x110D8]={ + category="lo", + description="SORA SOMPENG LETTER LAH", + direction="l", + linebreak="al", + unicodeslot=0x110D8, + }, + [0x110D9]={ + category="lo", + description="SORA SOMPENG LETTER NAH", + direction="l", + linebreak="al", + unicodeslot=0x110D9, + }, + [0x110DA]={ + category="lo", + description="SORA SOMPENG LETTER VAH", + direction="l", + linebreak="al", + unicodeslot=0x110DA, + }, + [0x110DB]={ + category="lo", + description="SORA SOMPENG LETTER PAH", + direction="l", + linebreak="al", + unicodeslot=0x110DB, + }, + [0x110DC]={ + category="lo", + description="SORA SOMPENG LETTER YAH", + direction="l", + linebreak="al", + unicodeslot=0x110DC, + }, + [0x110DD]={ + category="lo", + description="SORA SOMPENG LETTER RAH", + direction="l", + linebreak="al", + unicodeslot=0x110DD, + }, + [0x110DE]={ + category="lo", + description="SORA SOMPENG LETTER HAH", + direction="l", + linebreak="al", + unicodeslot=0x110DE, + }, + [0x110DF]={ + category="lo", + description="SORA SOMPENG LETTER KAH", + direction="l", + linebreak="al", + unicodeslot=0x110DF, + }, + [0x110E0]={ + category="lo", + description="SORA SOMPENG LETTER JAH", + direction="l", + linebreak="al", + unicodeslot=0x110E0, + }, + [0x110E1]={ + category="lo", + description="SORA SOMPENG LETTER NYAH", + direction="l", + linebreak="al", + unicodeslot=0x110E1, + }, + [0x110E2]={ + category="lo", + description="SORA SOMPENG LETTER AH", + direction="l", + linebreak="al", + unicodeslot=0x110E2, + }, + [0x110E3]={ + category="lo", + description="SORA SOMPENG LETTER EEH", + direction="l", + linebreak="al", + unicodeslot=0x110E3, + }, + [0x110E4]={ + category="lo", + description="SORA SOMPENG LETTER IH", + direction="l", + linebreak="al", + unicodeslot=0x110E4, + }, + [0x110E5]={ + category="lo", + description="SORA SOMPENG LETTER UH", + direction="l", + linebreak="al", + unicodeslot=0x110E5, + }, + [0x110E6]={ + category="lo", + description="SORA SOMPENG LETTER OH", + direction="l", + linebreak="al", + unicodeslot=0x110E6, + }, + [0x110E7]={ + category="lo", + description="SORA SOMPENG LETTER EH", + direction="l", + linebreak="al", + unicodeslot=0x110E7, + }, + [0x110E8]={ + category="lo", + description="SORA SOMPENG LETTER MAE", + direction="l", + linebreak="al", + unicodeslot=0x110E8, + }, + [0x110F0]={ + category="nd", + description="SORA SOMPENG DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x110F0, + }, + [0x110F1]={ + category="nd", + description="SORA SOMPENG DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x110F1, + }, + [0x110F2]={ + category="nd", + description="SORA SOMPENG DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x110F2, + }, + [0x110F3]={ + category="nd", + description="SORA SOMPENG DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x110F3, + }, + [0x110F4]={ + category="nd", + description="SORA SOMPENG DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x110F4, + }, + [0x110F5]={ + category="nd", + description="SORA SOMPENG DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x110F5, + }, + [0x110F6]={ + category="nd", + description="SORA SOMPENG DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x110F6, + }, + [0x110F7]={ + category="nd", + description="SORA SOMPENG DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x110F7, + }, + [0x110F8]={ + category="nd", + description="SORA SOMPENG DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x110F8, + }, + [0x110F9]={ + category="nd", + description="SORA SOMPENG DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x110F9, + }, + [0x11100]={ + category="mn", + combining=0xE6, + description="CHAKMA SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11100, + }, + [0x11101]={ + category="mn", + combining=0xE6, + description="CHAKMA SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11101, + }, + [0x11102]={ + category="mn", + combining=0xE6, + description="CHAKMA SIGN VISARGA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11102, + }, + [0x11103]={ + category="lo", + description="CHAKMA LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11103, + }, + [0x11104]={ + category="lo", + description="CHAKMA LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11104, + }, + [0x11105]={ + category="lo", + description="CHAKMA LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11105, + }, + [0x11106]={ + category="lo", + description="CHAKMA LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11106, + }, + [0x11107]={ + category="lo", + description="CHAKMA LETTER KAA", + direction="l", + linebreak="al", + unicodeslot=0x11107, + }, + [0x11108]={ + category="lo", + description="CHAKMA LETTER KHAA", + direction="l", + linebreak="al", + unicodeslot=0x11108, + }, + [0x11109]={ + category="lo", + description="CHAKMA LETTER GAA", + direction="l", + linebreak="al", + unicodeslot=0x11109, + }, + [0x1110A]={ + category="lo", + description="CHAKMA LETTER GHAA", + direction="l", + linebreak="al", + unicodeslot=0x1110A, + }, + [0x1110B]={ + category="lo", + description="CHAKMA LETTER NGAA", + direction="l", + linebreak="al", + unicodeslot=0x1110B, + }, + [0x1110C]={ + category="lo", + description="CHAKMA LETTER CAA", + direction="l", + linebreak="al", + unicodeslot=0x1110C, + }, + [0x1110D]={ + category="lo", + description="CHAKMA LETTER CHAA", + direction="l", + linebreak="al", + unicodeslot=0x1110D, + }, + [0x1110E]={ + category="lo", + description="CHAKMA LETTER JAA", + direction="l", + linebreak="al", + unicodeslot=0x1110E, + }, + [0x1110F]={ + category="lo", + description="CHAKMA LETTER JHAA", + direction="l", + linebreak="al", + unicodeslot=0x1110F, + }, + [0x11110]={ + category="lo", + description="CHAKMA LETTER NYAA", + direction="l", + linebreak="al", + unicodeslot=0x11110, + }, + [0x11111]={ + category="lo", + description="CHAKMA LETTER TTAA", + direction="l", + linebreak="al", + unicodeslot=0x11111, + }, + [0x11112]={ + category="lo", + description="CHAKMA LETTER TTHAA", + direction="l", + linebreak="al", + unicodeslot=0x11112, + }, + [0x11113]={ + category="lo", + description="CHAKMA LETTER DDAA", + direction="l", + linebreak="al", + unicodeslot=0x11113, + }, + [0x11114]={ + category="lo", + description="CHAKMA LETTER DDHAA", + direction="l", + linebreak="al", + unicodeslot=0x11114, + }, + [0x11115]={ + category="lo", + description="CHAKMA LETTER NNAA", + direction="l", + linebreak="al", + unicodeslot=0x11115, + }, + [0x11116]={ + category="lo", + description="CHAKMA LETTER TAA", + direction="l", + linebreak="al", + unicodeslot=0x11116, + }, + [0x11117]={ + category="lo", + description="CHAKMA LETTER THAA", + direction="l", + linebreak="al", + unicodeslot=0x11117, + }, + [0x11118]={ + category="lo", + description="CHAKMA LETTER DAA", + direction="l", + linebreak="al", + unicodeslot=0x11118, + }, + [0x11119]={ + category="lo", + description="CHAKMA LETTER DHAA", + direction="l", + linebreak="al", + unicodeslot=0x11119, + }, + [0x1111A]={ + category="lo", + description="CHAKMA LETTER NAA", + direction="l", + linebreak="al", + unicodeslot=0x1111A, + }, + [0x1111B]={ + category="lo", + description="CHAKMA LETTER PAA", + direction="l", + linebreak="al", + unicodeslot=0x1111B, + }, + [0x1111C]={ + category="lo", + description="CHAKMA LETTER PHAA", + direction="l", + linebreak="al", + unicodeslot=0x1111C, + }, + [0x1111D]={ + category="lo", + description="CHAKMA LETTER BAA", + direction="l", + linebreak="al", + unicodeslot=0x1111D, + }, + [0x1111E]={ + category="lo", + description="CHAKMA LETTER BHAA", + direction="l", + linebreak="al", + unicodeslot=0x1111E, + }, + [0x1111F]={ + category="lo", + description="CHAKMA LETTER MAA", + direction="l", + linebreak="al", + unicodeslot=0x1111F, + }, + [0x11120]={ + category="lo", + description="CHAKMA LETTER YYAA", + direction="l", + linebreak="al", + unicodeslot=0x11120, + }, + [0x11121]={ + category="lo", + description="CHAKMA LETTER YAA", + direction="l", + linebreak="al", + unicodeslot=0x11121, + }, + [0x11122]={ + category="lo", + description="CHAKMA LETTER RAA", + direction="l", + linebreak="al", + unicodeslot=0x11122, + }, + [0x11123]={ + category="lo", + description="CHAKMA LETTER LAA", + direction="l", + linebreak="al", + unicodeslot=0x11123, + }, + [0x11124]={ + category="lo", + description="CHAKMA LETTER WAA", + direction="l", + linebreak="al", + unicodeslot=0x11124, + }, + [0x11125]={ + category="lo", + description="CHAKMA LETTER SAA", + direction="l", + linebreak="al", + unicodeslot=0x11125, + }, + [0x11126]={ + category="lo", + description="CHAKMA LETTER HAA", + direction="l", + linebreak="al", + unicodeslot=0x11126, + }, + [0x11127]={ + category="mn", + description="CHAKMA VOWEL SIGN A", + direction="nsm", + linebreak="cm", + unicodeslot=0x11127, + }, + [0x11128]={ + category="mn", + description="CHAKMA VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11128, + }, + [0x11129]={ + category="mn", + description="CHAKMA VOWEL SIGN II", + direction="nsm", + linebreak="cm", + unicodeslot=0x11129, + }, + [0x1112A]={ + category="mn", + description="CHAKMA VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x1112A, + }, + [0x1112B]={ + category="mn", + description="CHAKMA VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x1112B, + }, + [0x1112C]={ + category="mc", + description="CHAKMA VOWEL SIGN E", + direction="l", + linebreak="cm", + unicodeslot=0x1112C, + }, + [0x1112D]={ + category="mn", + description="CHAKMA VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x1112D, + }, + [0x1112E]={ + category="mn", + description="CHAKMA VOWEL SIGN O", + direction="nsm", + linebreak="cm", + specials={ "char", 0x11131, 0x11127 }, + unicodeslot=0x1112E, + }, + [0x1112F]={ + category="mn", + description="CHAKMA VOWEL SIGN AU", + direction="nsm", + linebreak="cm", + specials={ "char", 0x11132, 0x11127 }, + unicodeslot=0x1112F, + }, + [0x11130]={ + category="mn", + description="CHAKMA VOWEL SIGN OI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11130, + }, + [0x11131]={ + category="mn", + description="CHAKMA O MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11131, + }, + [0x11132]={ + category="mn", + description="CHAKMA AU MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11132, + }, + [0x11133]={ + category="mn", + combining=0x9, + description="CHAKMA VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11133, + }, + [0x11134]={ + category="mn", + combining=0x9, + description="CHAKMA MAAYYAA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11134, + }, + [0x11136]={ + category="nd", + description="CHAKMA DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11136, + }, + [0x11137]={ + category="nd", + description="CHAKMA DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11137, + }, + [0x11138]={ + category="nd", + description="CHAKMA DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11138, + }, + [0x11139]={ + category="nd", + description="CHAKMA DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11139, + }, + [0x1113A]={ + category="nd", + description="CHAKMA DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x1113A, + }, + [0x1113B]={ + category="nd", + description="CHAKMA DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x1113B, + }, + [0x1113C]={ + category="nd", + description="CHAKMA DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x1113C, + }, + [0x1113D]={ + category="nd", + description="CHAKMA DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x1113D, + }, + [0x1113E]={ + category="nd", + description="CHAKMA DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x1113E, + }, + [0x1113F]={ + category="nd", + description="CHAKMA DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x1113F, + }, + [0x11140]={ + category="po", + description="CHAKMA SECTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x11140, + }, + [0x11141]={ + category="po", + description="CHAKMA DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11141, + }, + [0x11142]={ + category="po", + description="CHAKMA DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11142, + }, + [0x11143]={ + category="po", + description="CHAKMA QUESTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x11143, + }, + [0x11150]={ + category="lo", + description="MAHAJANI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11150, + }, + [0x11151]={ + category="lo", + description="MAHAJANI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11151, + }, + [0x11152]={ + category="lo", + description="MAHAJANI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11152, + }, + [0x11153]={ + category="lo", + description="MAHAJANI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11153, + }, + [0x11154]={ + category="lo", + description="MAHAJANI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11154, + }, + [0x11155]={ + category="lo", + description="MAHAJANI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11155, + }, + [0x11156]={ + category="lo", + description="MAHAJANI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11156, + }, + [0x11157]={ + category="lo", + description="MAHAJANI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11157, + }, + [0x11158]={ + category="lo", + description="MAHAJANI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11158, + }, + [0x11159]={ + category="lo", + description="MAHAJANI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11159, + }, + [0x1115A]={ + category="lo", + description="MAHAJANI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x1115A, + }, + [0x1115B]={ + category="lo", + description="MAHAJANI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x1115B, + }, + [0x1115C]={ + category="lo", + description="MAHAJANI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x1115C, + }, + [0x1115D]={ + category="lo", + description="MAHAJANI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x1115D, + }, + [0x1115E]={ + category="lo", + description="MAHAJANI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x1115E, + }, + [0x1115F]={ + category="lo", + description="MAHAJANI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x1115F, + }, + [0x11160]={ + category="lo", + description="MAHAJANI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11160, + }, + [0x11161]={ + category="lo", + description="MAHAJANI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11161, + }, + [0x11162]={ + category="lo", + description="MAHAJANI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11162, + }, + [0x11163]={ + category="lo", + description="MAHAJANI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11163, + }, + [0x11164]={ + category="lo", + description="MAHAJANI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11164, + }, + [0x11165]={ + category="lo", + description="MAHAJANI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11165, + }, + [0x11166]={ + category="lo", + description="MAHAJANI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11166, + }, + [0x11167]={ + category="lo", + description="MAHAJANI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11167, + }, + [0x11168]={ + category="lo", + description="MAHAJANI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11168, + }, + [0x11169]={ + category="lo", + description="MAHAJANI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11169, + }, + [0x1116A]={ + category="lo", + description="MAHAJANI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x1116A, + }, + [0x1116B]={ + category="lo", + description="MAHAJANI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x1116B, + }, + [0x1116C]={ + category="lo", + description="MAHAJANI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x1116C, + }, + [0x1116D]={ + category="lo", + description="MAHAJANI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x1116D, + }, + [0x1116E]={ + category="lo", + description="MAHAJANI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x1116E, + }, + [0x1116F]={ + category="lo", + description="MAHAJANI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x1116F, + }, + [0x11170]={ + category="lo", + description="MAHAJANI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11170, + }, + [0x11171]={ + category="lo", + description="MAHAJANI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11171, + }, + [0x11172]={ + category="lo", + description="MAHAJANI LETTER RRA", + direction="l", + linebreak="al", + unicodeslot=0x11172, + }, + [0x11173]={ + category="mn", + combining=0x7, + description="MAHAJANI SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11173, + }, + [0x11174]={ + category="po", + description="MAHAJANI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x11174, + }, + [0x11175]={ + category="po", + description="MAHAJANI SECTION MARK", + direction="l", + linebreak="bb", + unicodeslot=0x11175, + }, + [0x11176]={ + category="lo", + description="MAHAJANI LIGATURE SHRI", + direction="l", + linebreak="al", + unicodeslot=0x11176, + }, + [0x11180]={ + category="mn", + description="SHARADA SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11180, + }, + [0x11181]={ + category="mn", + description="SHARADA SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11181, + }, + [0x11182]={ + category="mc", + description="SHARADA SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11182, + }, + [0x11183]={ + category="lo", + description="SHARADA LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11183, + }, + [0x11184]={ + category="lo", + description="SHARADA LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11184, + }, + [0x11185]={ + category="lo", + description="SHARADA LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11185, + }, + [0x11186]={ + category="lo", + description="SHARADA LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11186, + }, + [0x11187]={ + category="lo", + description="SHARADA LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11187, + }, + [0x11188]={ + category="lo", + description="SHARADA LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11188, + }, + [0x11189]={ + category="lo", + description="SHARADA LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x11189, + }, + [0x1118A]={ + category="lo", + description="SHARADA LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x1118A, + }, + [0x1118B]={ + category="lo", + description="SHARADA LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x1118B, + }, + [0x1118C]={ + category="lo", + description="SHARADA LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x1118C, + }, + [0x1118D]={ + category="lo", + description="SHARADA LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1118D, + }, + [0x1118E]={ + category="lo", + description="SHARADA LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x1118E, + }, + [0x1118F]={ + category="lo", + description="SHARADA LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1118F, + }, + [0x11190]={ + category="lo", + description="SHARADA LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11190, + }, + [0x11191]={ + category="lo", + description="SHARADA LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11191, + }, + [0x11192]={ + category="lo", + description="SHARADA LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11192, + }, + [0x11193]={ + category="lo", + description="SHARADA LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11193, + }, + [0x11194]={ + category="lo", + description="SHARADA LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11194, + }, + [0x11195]={ + category="lo", + description="SHARADA LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11195, + }, + [0x11196]={ + category="lo", + description="SHARADA LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11196, + }, + [0x11197]={ + category="lo", + description="SHARADA LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11197, + }, + [0x11198]={ + category="lo", + description="SHARADA LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11198, + }, + [0x11199]={ + category="lo", + description="SHARADA LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11199, + }, + [0x1119A]={ + category="lo", + description="SHARADA LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x1119A, + }, + [0x1119B]={ + category="lo", + description="SHARADA LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x1119B, + }, + [0x1119C]={ + category="lo", + description="SHARADA LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x1119C, + }, + [0x1119D]={ + category="lo", + description="SHARADA LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x1119D, + }, + [0x1119E]={ + category="lo", + description="SHARADA LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x1119E, + }, + [0x1119F]={ + category="lo", + description="SHARADA LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x1119F, + }, + [0x111A0]={ + category="lo", + description="SHARADA LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x111A0, + }, + [0x111A1]={ + category="lo", + description="SHARADA LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x111A1, + }, + [0x111A2]={ + category="lo", + description="SHARADA LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x111A2, + }, + [0x111A3]={ + category="lo", + description="SHARADA LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x111A3, + }, + [0x111A4]={ + category="lo", + description="SHARADA LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x111A4, + }, + [0x111A5]={ + category="lo", + description="SHARADA LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x111A5, + }, + [0x111A6]={ + category="lo", + description="SHARADA LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x111A6, + }, + [0x111A7]={ + category="lo", + description="SHARADA LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x111A7, + }, + [0x111A8]={ + category="lo", + description="SHARADA LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x111A8, + }, + [0x111A9]={ + category="lo", + description="SHARADA LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x111A9, + }, + [0x111AA]={ + category="lo", + description="SHARADA LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x111AA, + }, + [0x111AB]={ + category="lo", + description="SHARADA LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x111AB, + }, + [0x111AC]={ + category="lo", + description="SHARADA LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x111AC, + }, + [0x111AD]={ + category="lo", + description="SHARADA LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x111AD, + }, + [0x111AE]={ + category="lo", + description="SHARADA LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x111AE, + }, + [0x111AF]={ + category="lo", + description="SHARADA LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x111AF, + }, + [0x111B0]={ + category="lo", + description="SHARADA LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x111B0, + }, + [0x111B1]={ + category="lo", + description="SHARADA LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x111B1, + }, + [0x111B2]={ + category="lo", + description="SHARADA LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x111B2, + }, + [0x111B3]={ + category="mc", + description="SHARADA VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x111B3, + }, + [0x111B4]={ + category="mc", + description="SHARADA VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x111B4, + }, + [0x111B5]={ + category="mc", + description="SHARADA VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x111B5, + }, + [0x111B6]={ + category="mn", + description="SHARADA VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x111B6, + }, + [0x111B7]={ + category="mn", + description="SHARADA VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x111B7, + }, + [0x111B8]={ + category="mn", + description="SHARADA VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x111B8, + }, + [0x111B9]={ + category="mn", + description="SHARADA VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x111B9, + }, + [0x111BA]={ + category="mn", + description="SHARADA VOWEL SIGN VOCALIC L", + direction="nsm", + linebreak="cm", + unicodeslot=0x111BA, + }, + [0x111BB]={ + category="mn", + description="SHARADA VOWEL SIGN VOCALIC LL", + direction="nsm", + linebreak="cm", + unicodeslot=0x111BB, + }, + [0x111BC]={ + category="mn", + description="SHARADA VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x111BC, + }, + [0x111BD]={ + category="mn", + description="SHARADA VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x111BD, + }, + [0x111BE]={ + category="mn", + description="SHARADA VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x111BE, + }, + [0x111BF]={ + category="mc", + description="SHARADA VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x111BF, + }, + [0x111C0]={ + category="mc", + combining=0x9, + description="SHARADA SIGN VIRAMA", + direction="l", + linebreak="cm", + unicodeslot=0x111C0, + }, + [0x111C1]={ + category="lo", + description="SHARADA SIGN AVAGRAHA", + direction="l", + linebreak="al", + unicodeslot=0x111C1, + }, + [0x111C2]={ + category="lo", + description="SHARADA SIGN JIHVAMULIYA", + direction="l", + linebreak="al", + unicodeslot=0x111C2, + }, + [0x111C3]={ + category="lo", + description="SHARADA SIGN UPADHMANIYA", + direction="l", + linebreak="al", + unicodeslot=0x111C3, + }, + [0x111C4]={ + category="lo", + description="SHARADA OM", + direction="l", + linebreak="al", + unicodeslot=0x111C4, + }, + [0x111C5]={ + category="po", + description="SHARADA DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x111C5, + }, + [0x111C6]={ + category="po", + description="SHARADA DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x111C6, + }, + [0x111C7]={ + category="po", + description="SHARADA ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x111C7, + }, + [0x111C8]={ + category="po", + description="SHARADA SEPARATOR", + direction="l", + linebreak="ba", + unicodeslot=0x111C8, + }, + [0x111CD]={ + category="po", + description="SHARADA SUTRA MARK", + direction="l", + linebreak="al", + unicodeslot=0x111CD, + }, + [0x111D0]={ + category="nd", + description="SHARADA DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x111D0, + }, + [0x111D1]={ + category="nd", + description="SHARADA DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x111D1, + }, + [0x111D2]={ + category="nd", + description="SHARADA DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x111D2, + }, + [0x111D3]={ + category="nd", + description="SHARADA DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x111D3, + }, + [0x111D4]={ + category="nd", + description="SHARADA DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x111D4, + }, + [0x111D5]={ + category="nd", + description="SHARADA DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x111D5, + }, + [0x111D6]={ + category="nd", + description="SHARADA DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x111D6, + }, + [0x111D7]={ + category="nd", + description="SHARADA DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x111D7, + }, + [0x111D8]={ + category="nd", + description="SHARADA DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x111D8, + }, + [0x111D9]={ + category="nd", + description="SHARADA DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x111D9, + }, + [0x111DA]={ + category="lo", + description="SHARADA EKAM", + direction="l", + linebreak="al", + unicodeslot=0x111DA, + }, + [0x111E1]={ + category="no", + description="SINHALA ARCHAIC DIGIT ONE", + direction="l", + linebreak="al", + unicodeslot=0x111E1, + }, + [0x111E2]={ + category="no", + description="SINHALA ARCHAIC DIGIT TWO", + direction="l", + linebreak="al", + unicodeslot=0x111E2, + }, + [0x111E3]={ + category="no", + description="SINHALA ARCHAIC DIGIT THREE", + direction="l", + linebreak="al", + unicodeslot=0x111E3, + }, + [0x111E4]={ + category="no", + description="SINHALA ARCHAIC DIGIT FOUR", + direction="l", + linebreak="al", + unicodeslot=0x111E4, + }, + [0x111E5]={ + category="no", + description="SINHALA ARCHAIC DIGIT FIVE", + direction="l", + linebreak="al", + unicodeslot=0x111E5, + }, + [0x111E6]={ + category="no", + description="SINHALA ARCHAIC DIGIT SIX", + direction="l", + linebreak="al", + unicodeslot=0x111E6, + }, + [0x111E7]={ + category="no", + description="SINHALA ARCHAIC DIGIT SEVEN", + direction="l", + linebreak="al", + unicodeslot=0x111E7, + }, + [0x111E8]={ + category="no", + description="SINHALA ARCHAIC DIGIT EIGHT", + direction="l", + linebreak="al", + unicodeslot=0x111E8, + }, + [0x111E9]={ + category="no", + description="SINHALA ARCHAIC DIGIT NINE", + direction="l", + linebreak="al", + unicodeslot=0x111E9, + }, + [0x111EA]={ + category="no", + description="SINHALA ARCHAIC NUMBER TEN", + direction="l", + linebreak="al", + unicodeslot=0x111EA, + }, + [0x111EB]={ + category="no", + description="SINHALA ARCHAIC NUMBER TWENTY", + direction="l", + linebreak="al", + unicodeslot=0x111EB, + }, + [0x111EC]={ + category="no", + description="SINHALA ARCHAIC NUMBER THIRTY", + direction="l", + linebreak="al", + unicodeslot=0x111EC, + }, + [0x111ED]={ + category="no", + description="SINHALA ARCHAIC NUMBER FORTY", + direction="l", + linebreak="al", + unicodeslot=0x111ED, + }, + [0x111EE]={ + category="no", + description="SINHALA ARCHAIC NUMBER FIFTY", + direction="l", + linebreak="al", + unicodeslot=0x111EE, + }, + [0x111EF]={ + category="no", + description="SINHALA ARCHAIC NUMBER SIXTY", + direction="l", + linebreak="al", + unicodeslot=0x111EF, + }, + [0x111F0]={ + category="no", + description="SINHALA ARCHAIC NUMBER SEVENTY", + direction="l", + linebreak="al", + unicodeslot=0x111F0, + }, + [0x111F1]={ + category="no", + description="SINHALA ARCHAIC NUMBER EIGHTY", + direction="l", + linebreak="al", + unicodeslot=0x111F1, + }, + [0x111F2]={ + category="no", + description="SINHALA ARCHAIC NUMBER NINETY", + direction="l", + linebreak="al", + unicodeslot=0x111F2, + }, + [0x111F3]={ + category="no", + description="SINHALA ARCHAIC NUMBER ONE HUNDRED", + direction="l", + linebreak="al", + unicodeslot=0x111F3, + }, + [0x111F4]={ + category="no", + description="SINHALA ARCHAIC NUMBER ONE THOUSAND", + direction="l", + linebreak="al", + unicodeslot=0x111F4, + }, + [0x11200]={ + category="lo", + description="KHOJKI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11200, + }, + [0x11201]={ + category="lo", + description="KHOJKI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11201, + }, + [0x11202]={ + category="lo", + description="KHOJKI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11202, + }, + [0x11203]={ + category="lo", + description="KHOJKI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11203, + }, + [0x11204]={ + category="lo", + description="KHOJKI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11204, + }, + [0x11205]={ + category="lo", + description="KHOJKI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11205, + }, + [0x11206]={ + category="lo", + description="KHOJKI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11206, + }, + [0x11207]={ + category="lo", + description="KHOJKI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11207, + }, + [0x11208]={ + category="lo", + description="KHOJKI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11208, + }, + [0x11209]={ + category="lo", + description="KHOJKI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11209, + }, + [0x1120A]={ + category="lo", + description="KHOJKI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x1120A, + }, + [0x1120B]={ + category="lo", + description="KHOJKI LETTER GGA", + direction="l", + linebreak="al", + unicodeslot=0x1120B, + }, + [0x1120C]={ + category="lo", + description="KHOJKI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x1120C, + }, + [0x1120D]={ + category="lo", + description="KHOJKI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x1120D, + }, + [0x1120E]={ + category="lo", + description="KHOJKI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x1120E, + }, + [0x1120F]={ + category="lo", + description="KHOJKI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x1120F, + }, + [0x11210]={ + category="lo", + description="KHOJKI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11210, + }, + [0x11211]={ + category="lo", + description="KHOJKI LETTER JJA", + direction="l", + linebreak="al", + unicodeslot=0x11211, + }, + [0x11213]={ + category="lo", + description="KHOJKI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11213, + }, + [0x11214]={ + category="lo", + description="KHOJKI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11214, + }, + [0x11215]={ + category="lo", + description="KHOJKI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11215, + }, + [0x11216]={ + category="lo", + description="KHOJKI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11216, + }, + [0x11217]={ + category="lo", + description="KHOJKI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11217, + }, + [0x11218]={ + category="lo", + description="KHOJKI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11218, + }, + [0x11219]={ + category="lo", + description="KHOJKI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11219, + }, + [0x1121A]={ + category="lo", + description="KHOJKI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1121A, + }, + [0x1121B]={ + category="lo", + description="KHOJKI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x1121B, + }, + [0x1121C]={ + category="lo", + description="KHOJKI LETTER DDDA", + direction="l", + linebreak="al", + unicodeslot=0x1121C, + }, + [0x1121D]={ + category="lo", + description="KHOJKI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x1121D, + }, + [0x1121E]={ + category="lo", + description="KHOJKI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x1121E, + }, + [0x1121F]={ + category="lo", + description="KHOJKI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x1121F, + }, + [0x11220]={ + category="lo", + description="KHOJKI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11220, + }, + [0x11221]={ + category="lo", + description="KHOJKI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11221, + }, + [0x11222]={ + category="lo", + description="KHOJKI LETTER BBA", + direction="l", + linebreak="al", + unicodeslot=0x11222, + }, + [0x11223]={ + category="lo", + description="KHOJKI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11223, + }, + [0x11224]={ + category="lo", + description="KHOJKI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11224, + }, + [0x11225]={ + category="lo", + description="KHOJKI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11225, + }, + [0x11226]={ + category="lo", + description="KHOJKI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11226, + }, + [0x11227]={ + category="lo", + description="KHOJKI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11227, + }, + [0x11228]={ + category="lo", + description="KHOJKI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11228, + }, + [0x11229]={ + category="lo", + description="KHOJKI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11229, + }, + [0x1122A]={ + category="lo", + description="KHOJKI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x1122A, + }, + [0x1122B]={ + category="lo", + description="KHOJKI LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x1122B, + }, + [0x1122C]={ + category="mc", + description="KHOJKI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x1122C, + }, + [0x1122D]={ + category="mc", + description="KHOJKI VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x1122D, + }, + [0x1122E]={ + category="mc", + description="KHOJKI VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x1122E, + }, + [0x1122F]={ + category="mn", + description="KHOJKI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x1122F, + }, + [0x11230]={ + category="mn", + description="KHOJKI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11230, + }, + [0x11231]={ + category="mn", + description="KHOJKI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11231, + }, + [0x11232]={ + category="mc", + description="KHOJKI VOWEL SIGN O", + direction="l", + linebreak="cm", + unicodeslot=0x11232, + }, + [0x11233]={ + category="mc", + description="KHOJKI VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x11233, + }, + [0x11234]={ + category="mn", + description="KHOJKI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11234, + }, + [0x11235]={ + category="mc", + combining=0x9, + description="KHOJKI SIGN VIRAMA", + direction="l", + linebreak="cm", + unicodeslot=0x11235, + }, + [0x11236]={ + category="mn", + combining=0x7, + description="KHOJKI SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11236, + }, + [0x11237]={ + category="mn", + description="KHOJKI SIGN SHADDA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11237, + }, + [0x11238]={ + category="po", + description="KHOJKI DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11238, + }, + [0x11239]={ + category="po", + description="KHOJKI DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11239, + }, + [0x1123A]={ + category="po", + description="KHOJKI WORD SEPARATOR", + direction="l", + linebreak="al", + unicodeslot=0x1123A, + }, + [0x1123B]={ + category="po", + description="KHOJKI SECTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x1123B, + }, + [0x1123C]={ + category="po", + description="KHOJKI DOUBLE SECTION MARK", + direction="l", + linebreak="ba", + unicodeslot=0x1123C, + }, + [0x1123D]={ + category="po", + description="KHOJKI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x1123D, + }, + [0x112B0]={ + category="lo", + description="KHUDAWADI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x112B0, + }, + [0x112B1]={ + category="lo", + description="KHUDAWADI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x112B1, + }, + [0x112B2]={ + category="lo", + description="KHUDAWADI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x112B2, + }, + [0x112B3]={ + category="lo", + description="KHUDAWADI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x112B3, + }, + [0x112B4]={ + category="lo", + description="KHUDAWADI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x112B4, + }, + [0x112B5]={ + category="lo", + description="KHUDAWADI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x112B5, + }, + [0x112B6]={ + category="lo", + description="KHUDAWADI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x112B6, + }, + [0x112B7]={ + category="lo", + description="KHUDAWADI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x112B7, + }, + [0x112B8]={ + category="lo", + description="KHUDAWADI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x112B8, + }, + [0x112B9]={ + category="lo", + description="KHUDAWADI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x112B9, + }, + [0x112BA]={ + category="lo", + description="KHUDAWADI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x112BA, + }, + [0x112BB]={ + category="lo", + description="KHUDAWADI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x112BB, + }, + [0x112BC]={ + category="lo", + description="KHUDAWADI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x112BC, + }, + [0x112BD]={ + category="lo", + description="KHUDAWADI LETTER GGA", + direction="l", + linebreak="al", + unicodeslot=0x112BD, + }, + [0x112BE]={ + category="lo", + description="KHUDAWADI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x112BE, + }, + [0x112BF]={ + category="lo", + description="KHUDAWADI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x112BF, + }, + [0x112C0]={ + category="lo", + description="KHUDAWADI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x112C0, + }, + [0x112C1]={ + category="lo", + description="KHUDAWADI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x112C1, + }, + [0x112C2]={ + category="lo", + description="KHUDAWADI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x112C2, + }, + [0x112C3]={ + category="lo", + description="KHUDAWADI LETTER JJA", + direction="l", + linebreak="al", + unicodeslot=0x112C3, + }, + [0x112C4]={ + category="lo", + description="KHUDAWADI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x112C4, + }, + [0x112C5]={ + category="lo", + description="KHUDAWADI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x112C5, + }, + [0x112C6]={ + category="lo", + description="KHUDAWADI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x112C6, + }, + [0x112C7]={ + category="lo", + description="KHUDAWADI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x112C7, + }, + [0x112C8]={ + category="lo", + description="KHUDAWADI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x112C8, + }, + [0x112C9]={ + category="lo", + description="KHUDAWADI LETTER DDDA", + direction="l", + linebreak="al", + unicodeslot=0x112C9, + }, + [0x112CA]={ + category="lo", + description="KHUDAWADI LETTER RRA", + direction="l", + linebreak="al", + unicodeslot=0x112CA, + }, + [0x112CB]={ + category="lo", + description="KHUDAWADI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x112CB, + }, + [0x112CC]={ + category="lo", + description="KHUDAWADI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x112CC, + }, + [0x112CD]={ + category="lo", + description="KHUDAWADI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x112CD, + }, + [0x112CE]={ + category="lo", + description="KHUDAWADI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x112CE, + }, + [0x112CF]={ + category="lo", + description="KHUDAWADI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x112CF, + }, + [0x112D0]={ + category="lo", + description="KHUDAWADI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x112D0, + }, + [0x112D1]={ + category="lo", + description="KHUDAWADI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x112D1, + }, + [0x112D2]={ + category="lo", + description="KHUDAWADI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x112D2, + }, + [0x112D3]={ + category="lo", + description="KHUDAWADI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x112D3, + }, + [0x112D4]={ + category="lo", + description="KHUDAWADI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x112D4, + }, + [0x112D5]={ + category="lo", + description="KHUDAWADI LETTER BBA", + direction="l", + linebreak="al", + unicodeslot=0x112D5, + }, + [0x112D6]={ + category="lo", + description="KHUDAWADI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x112D6, + }, + [0x112D7]={ + category="lo", + description="KHUDAWADI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x112D7, + }, + [0x112D8]={ + category="lo", + description="KHUDAWADI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x112D8, + }, + [0x112D9]={ + category="lo", + description="KHUDAWADI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x112D9, + }, + [0x112DA]={ + category="lo", + description="KHUDAWADI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x112DA, + }, + [0x112DB]={ + category="lo", + description="KHUDAWADI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x112DB, + }, + [0x112DC]={ + category="lo", + description="KHUDAWADI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x112DC, + }, + [0x112DD]={ + category="lo", + description="KHUDAWADI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x112DD, + }, + [0x112DE]={ + category="lo", + description="KHUDAWADI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x112DE, + }, + [0x112DF]={ + category="mn", + description="KHUDAWADI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x112DF, + }, + [0x112E0]={ + category="mc", + description="KHUDAWADI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x112E0, + }, + [0x112E1]={ + category="mc", + description="KHUDAWADI VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x112E1, + }, + [0x112E2]={ + category="mc", + description="KHUDAWADI VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x112E2, + }, + [0x112E3]={ + category="mn", + description="KHUDAWADI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E3, + }, + [0x112E4]={ + category="mn", + description="KHUDAWADI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E4, + }, + [0x112E5]={ + category="mn", + description="KHUDAWADI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E5, + }, + [0x112E6]={ + category="mn", + description="KHUDAWADI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E6, + }, + [0x112E7]={ + category="mn", + description="KHUDAWADI VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E7, + }, + [0x112E8]={ + category="mn", + description="KHUDAWADI VOWEL SIGN AU", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E8, + }, + [0x112E9]={ + category="mn", + combining=0x7, + description="KHUDAWADI SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x112E9, + }, + [0x112EA]={ + category="mn", + combining=0x9, + description="KHUDAWADI SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x112EA, + }, + [0x112F0]={ + category="nd", + description="KHUDAWADI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x112F0, + }, + [0x112F1]={ + category="nd", + description="KHUDAWADI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x112F1, + }, + [0x112F2]={ + category="nd", + description="KHUDAWADI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x112F2, + }, + [0x112F3]={ + category="nd", + description="KHUDAWADI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x112F3, + }, + [0x112F4]={ + category="nd", + description="KHUDAWADI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x112F4, + }, + [0x112F5]={ + category="nd", + description="KHUDAWADI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x112F5, + }, + [0x112F6]={ + category="nd", + description="KHUDAWADI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x112F6, + }, + [0x112F7]={ + category="nd", + description="KHUDAWADI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x112F7, + }, + [0x112F8]={ + category="nd", + description="KHUDAWADI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x112F8, + }, + [0x112F9]={ + category="nd", + description="KHUDAWADI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x112F9, + }, + [0x11301]={ + category="mn", + description="GRANTHA SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11301, + }, + [0x11302]={ + category="mc", + description="GRANTHA SIGN ANUSVARA", + direction="l", + linebreak="cm", + unicodeslot=0x11302, + }, + [0x11303]={ + category="mc", + description="GRANTHA SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11303, + }, + [0x11305]={ + category="lo", + description="GRANTHA LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11305, + }, + [0x11306]={ + category="lo", + description="GRANTHA LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11306, + }, + [0x11307]={ + category="lo", + description="GRANTHA LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11307, + }, + [0x11308]={ + category="lo", + description="GRANTHA LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11308, + }, + [0x11309]={ + category="lo", + description="GRANTHA LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11309, + }, + [0x1130A]={ + category="lo", + description="GRANTHA LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x1130A, + }, + [0x1130B]={ + category="lo", + description="GRANTHA LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x1130B, + }, + [0x1130C]={ + category="lo", + description="GRANTHA LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x1130C, + }, + [0x1130F]={ + category="lo", + description="GRANTHA LETTER EE", + direction="l", + linebreak="al", + unicodeslot=0x1130F, + }, + [0x11310]={ + category="lo", + description="GRANTHA LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11310, + }, + [0x11313]={ + category="lo", + description="GRANTHA LETTER OO", + direction="l", + linebreak="al", + unicodeslot=0x11313, + }, + [0x11314]={ + category="lo", + description="GRANTHA LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11314, + }, + [0x11315]={ + category="lo", + description="GRANTHA LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11315, + }, + [0x11316]={ + category="lo", + description="GRANTHA LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11316, + }, + [0x11317]={ + category="lo", + description="GRANTHA LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11317, + }, + [0x11318]={ + category="lo", + description="GRANTHA LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11318, + }, + [0x11319]={ + category="lo", + description="GRANTHA LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11319, + }, + [0x1131A]={ + category="lo", + description="GRANTHA LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x1131A, + }, + [0x1131B]={ + category="lo", + description="GRANTHA LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x1131B, + }, + [0x1131C]={ + category="lo", + description="GRANTHA LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x1131C, + }, + [0x1131D]={ + category="lo", + description="GRANTHA LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x1131D, + }, + [0x1131E]={ + category="lo", + description="GRANTHA LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x1131E, + }, + [0x1131F]={ + category="lo", + description="GRANTHA LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x1131F, + }, + [0x11320]={ + category="lo", + description="GRANTHA LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11320, + }, + [0x11321]={ + category="lo", + description="GRANTHA LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11321, + }, + [0x11322]={ + category="lo", + description="GRANTHA LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11322, + }, + [0x11323]={ + category="lo", + description="GRANTHA LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11323, + }, + [0x11324]={ + category="lo", + description="GRANTHA LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11324, + }, + [0x11325]={ + category="lo", + description="GRANTHA LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11325, + }, + [0x11326]={ + category="lo", + description="GRANTHA LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11326, + }, + [0x11327]={ + category="lo", + description="GRANTHA LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11327, + }, + [0x11328]={ + category="lo", + description="GRANTHA LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11328, + }, + [0x1132A]={ + category="lo", + description="GRANTHA LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x1132A, + }, + [0x1132B]={ + category="lo", + description="GRANTHA LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x1132B, + }, + [0x1132C]={ + category="lo", + description="GRANTHA LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x1132C, + }, + [0x1132D]={ + category="lo", + description="GRANTHA LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x1132D, + }, + [0x1132E]={ + category="lo", + description="GRANTHA LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x1132E, + }, + [0x1132F]={ + category="lo", + description="GRANTHA LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x1132F, + }, + [0x11330]={ + category="lo", + description="GRANTHA LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11330, + }, + [0x11332]={ + category="lo", + description="GRANTHA LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11332, + }, + [0x11333]={ + category="lo", + description="GRANTHA LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x11333, + }, + [0x11335]={ + category="lo", + description="GRANTHA LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11335, + }, + [0x11336]={ + category="lo", + description="GRANTHA LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11336, + }, + [0x11337]={ + category="lo", + description="GRANTHA LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11337, + }, + [0x11338]={ + category="lo", + description="GRANTHA LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11338, + }, + [0x11339]={ + category="lo", + description="GRANTHA LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11339, + }, + [0x1133C]={ + category="mn", + combining=0x7, + description="GRANTHA SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1133C, + }, + [0x1133D]={ + category="lo", + description="GRANTHA SIGN AVAGRAHA", + direction="l", + linebreak="al", + unicodeslot=0x1133D, + }, + [0x1133E]={ + category="mc", + description="GRANTHA VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x1133E, + }, + [0x1133F]={ + category="mc", + description="GRANTHA VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x1133F, + }, + [0x11340]={ + category="mn", + description="GRANTHA VOWEL SIGN II", + direction="nsm", + linebreak="cm", + unicodeslot=0x11340, + }, + [0x11341]={ + category="mc", + description="GRANTHA VOWEL SIGN U", + direction="l", + linebreak="cm", + unicodeslot=0x11341, + }, + [0x11342]={ + category="mc", + description="GRANTHA VOWEL SIGN UU", + direction="l", + linebreak="cm", + unicodeslot=0x11342, + }, + [0x11343]={ + category="mc", + description="GRANTHA VOWEL SIGN VOCALIC R", + direction="l", + linebreak="cm", + unicodeslot=0x11343, + }, + [0x11344]={ + category="mc", + description="GRANTHA VOWEL SIGN VOCALIC RR", + direction="l", + linebreak="cm", + unicodeslot=0x11344, + }, + [0x11347]={ + category="mc", + description="GRANTHA VOWEL SIGN EE", + direction="l", + linebreak="cm", + unicodeslot=0x11347, + }, + [0x11348]={ + category="mc", + description="GRANTHA VOWEL SIGN AI", + direction="l", + linebreak="cm", + unicodeslot=0x11348, + }, + [0x1134B]={ + category="mc", + description="GRANTHA VOWEL SIGN OO", + direction="l", + linebreak="cm", + specials={ "char", 0x11347, 0x1133E }, + unicodeslot=0x1134B, + }, + [0x1134C]={ + category="mc", + description="GRANTHA VOWEL SIGN AU", + direction="l", + linebreak="cm", + specials={ "char", 0x11347, 0x11357 }, + unicodeslot=0x1134C, + }, + [0x1134D]={ + category="mc", + combining=0x9, + description="GRANTHA SIGN VIRAMA", + direction="l", + linebreak="cm", + unicodeslot=0x1134D, + }, + [0x11357]={ + category="mc", + description="GRANTHA AU LENGTH MARK", + direction="l", + linebreak="cm", + unicodeslot=0x11357, + }, + [0x1135D]={ + category="lo", + description="GRANTHA SIGN PLUTA", + direction="l", + linebreak="al", + unicodeslot=0x1135D, + }, + [0x1135E]={ + category="lo", + description="GRANTHA LETTER VEDIC ANUSVARA", + direction="l", + linebreak="al", + unicodeslot=0x1135E, + }, + [0x1135F]={ + category="lo", + description="GRANTHA LETTER VEDIC DOUBLE ANUSVARA", + direction="l", + linebreak="al", + unicodeslot=0x1135F, + }, + [0x11360]={ + category="lo", + description="GRANTHA LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x11360, + }, + [0x11361]={ + category="lo", + description="GRANTHA LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x11361, + }, + [0x11362]={ + category="mc", + description="GRANTHA VOWEL SIGN VOCALIC L", + direction="l", + linebreak="cm", + unicodeslot=0x11362, + }, + [0x11363]={ + category="mc", + description="GRANTHA VOWEL SIGN VOCALIC LL", + direction="l", + linebreak="cm", + unicodeslot=0x11363, + }, + [0x11366]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT ZERO", + direction="nsm", + linebreak="cm", + unicodeslot=0x11366, + }, + [0x11367]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT ONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11367, + }, + [0x11368]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT TWO", + direction="nsm", + linebreak="cm", + unicodeslot=0x11368, + }, + [0x11369]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT THREE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11369, + }, + [0x1136A]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT FOUR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1136A, + }, + [0x1136B]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT FIVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x1136B, + }, + [0x1136C]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA DIGIT SIX", + direction="nsm", + linebreak="cm", + unicodeslot=0x1136C, + }, + [0x11370]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA LETTER A", + direction="nsm", + linebreak="cm", + unicodeslot=0x11370, + }, + [0x11371]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA LETTER KA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11371, + }, + [0x11372]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA LETTER NA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11372, + }, + [0x11373]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA LETTER VI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11373, + }, + [0x11374]={ + category="mn", + combining=0xE6, + description="COMBINING GRANTHA LETTER PA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11374, + }, + [0x11480]={ + category="lo", + description="TIRHUTA ANJI", + direction="l", + linebreak="al", + unicodeslot=0x11480, + }, + [0x11481]={ + category="lo", + description="TIRHUTA LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11481, + }, + [0x11482]={ + category="lo", + description="TIRHUTA LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11482, + }, + [0x11483]={ + category="lo", + description="TIRHUTA LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11483, + }, + [0x11484]={ + category="lo", + description="TIRHUTA LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11484, + }, + [0x11485]={ + category="lo", + description="TIRHUTA LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11485, + }, + [0x11486]={ + category="lo", + description="TIRHUTA LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11486, + }, + [0x11487]={ + category="lo", + description="TIRHUTA LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x11487, + }, + [0x11488]={ + category="lo", + description="TIRHUTA LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x11488, + }, + [0x11489]={ + category="lo", + description="TIRHUTA LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x11489, + }, + [0x1148A]={ + category="lo", + description="TIRHUTA LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x1148A, + }, + [0x1148B]={ + category="lo", + description="TIRHUTA LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1148B, + }, + [0x1148C]={ + category="lo", + description="TIRHUTA LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x1148C, + }, + [0x1148D]={ + category="lo", + description="TIRHUTA LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1148D, + }, + [0x1148E]={ + category="lo", + description="TIRHUTA LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x1148E, + }, + [0x1148F]={ + category="lo", + description="TIRHUTA LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x1148F, + }, + [0x11490]={ + category="lo", + description="TIRHUTA LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11490, + }, + [0x11491]={ + category="lo", + description="TIRHUTA LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11491, + }, + [0x11492]={ + category="lo", + description="TIRHUTA LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11492, + }, + [0x11493]={ + category="lo", + description="TIRHUTA LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11493, + }, + [0x11494]={ + category="lo", + description="TIRHUTA LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11494, + }, + [0x11495]={ + category="lo", + description="TIRHUTA LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11495, + }, + [0x11496]={ + category="lo", + description="TIRHUTA LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11496, + }, + [0x11497]={ + category="lo", + description="TIRHUTA LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11497, + }, + [0x11498]={ + category="lo", + description="TIRHUTA LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11498, + }, + [0x11499]={ + category="lo", + description="TIRHUTA LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11499, + }, + [0x1149A]={ + category="lo", + description="TIRHUTA LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x1149A, + }, + [0x1149B]={ + category="lo", + description="TIRHUTA LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x1149B, + }, + [0x1149C]={ + category="lo", + description="TIRHUTA LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x1149C, + }, + [0x1149D]={ + category="lo", + description="TIRHUTA LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x1149D, + }, + [0x1149E]={ + category="lo", + description="TIRHUTA LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x1149E, + }, + [0x1149F]={ + category="lo", + description="TIRHUTA LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1149F, + }, + [0x114A0]={ + category="lo", + description="TIRHUTA LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x114A0, + }, + [0x114A1]={ + category="lo", + description="TIRHUTA LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x114A1, + }, + [0x114A2]={ + category="lo", + description="TIRHUTA LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x114A2, + }, + [0x114A3]={ + category="lo", + description="TIRHUTA LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x114A3, + }, + [0x114A4]={ + category="lo", + description="TIRHUTA LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x114A4, + }, + [0x114A5]={ + category="lo", + description="TIRHUTA LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x114A5, + }, + [0x114A6]={ + category="lo", + description="TIRHUTA LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x114A6, + }, + [0x114A7]={ + category="lo", + description="TIRHUTA LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x114A7, + }, + [0x114A8]={ + category="lo", + description="TIRHUTA LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x114A8, + }, + [0x114A9]={ + category="lo", + description="TIRHUTA LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x114A9, + }, + [0x114AA]={ + category="lo", + description="TIRHUTA LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x114AA, + }, + [0x114AB]={ + category="lo", + description="TIRHUTA LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x114AB, + }, + [0x114AC]={ + category="lo", + description="TIRHUTA LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x114AC, + }, + [0x114AD]={ + category="lo", + description="TIRHUTA LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x114AD, + }, + [0x114AE]={ + category="lo", + description="TIRHUTA LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x114AE, + }, + [0x114AF]={ + category="lo", + description="TIRHUTA LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x114AF, + }, + [0x114B0]={ + category="mc", + description="TIRHUTA VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x114B0, + }, + [0x114B1]={ + category="mc", + description="TIRHUTA VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x114B1, + }, + [0x114B2]={ + category="mc", + description="TIRHUTA VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x114B2, + }, + [0x114B3]={ + category="mn", + description="TIRHUTA VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B3, + }, + [0x114B4]={ + category="mn", + description="TIRHUTA VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B4, + }, + [0x114B5]={ + category="mn", + description="TIRHUTA VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B5, + }, + [0x114B6]={ + category="mn", + description="TIRHUTA VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B6, + }, + [0x114B7]={ + category="mn", + description="TIRHUTA VOWEL SIGN VOCALIC L", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B7, + }, + [0x114B8]={ + category="mn", + description="TIRHUTA VOWEL SIGN VOCALIC LL", + direction="nsm", + linebreak="cm", + unicodeslot=0x114B8, + }, + [0x114B9]={ + category="mc", + description="TIRHUTA VOWEL SIGN E", + direction="l", + linebreak="cm", + unicodeslot=0x114B9, + }, + [0x114BA]={ + category="mn", + description="TIRHUTA VOWEL SIGN SHORT E", + direction="nsm", + linebreak="cm", + unicodeslot=0x114BA, + }, + [0x114BB]={ + category="mc", + description="TIRHUTA VOWEL SIGN AI", + direction="l", + linebreak="cm", + specials={ "char", 0x114B9, 0x114BA }, + unicodeslot=0x114BB, + }, + [0x114BC]={ + category="mc", + description="TIRHUTA VOWEL SIGN O", + direction="l", + linebreak="cm", + specials={ "char", 0x114B9, 0x114B0 }, + unicodeslot=0x114BC, + }, + [0x114BD]={ + category="mc", + description="TIRHUTA VOWEL SIGN SHORT O", + direction="l", + linebreak="cm", + unicodeslot=0x114BD, + }, + [0x114BE]={ + category="mc", + description="TIRHUTA VOWEL SIGN AU", + direction="l", + linebreak="cm", + specials={ "char", 0x114B9, 0x114BD }, + unicodeslot=0x114BE, + }, + [0x114BF]={ + category="mn", + description="TIRHUTA SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x114BF, + }, + [0x114C0]={ + category="mn", + description="TIRHUTA SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x114C0, + }, + [0x114C1]={ + category="mc", + description="TIRHUTA SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x114C1, + }, + [0x114C2]={ + category="mn", + combining=0x9, + description="TIRHUTA SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x114C2, + }, + [0x114C3]={ + category="mn", + combining=0x7, + description="TIRHUTA SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x114C3, + }, + [0x114C4]={ + category="lo", + description="TIRHUTA SIGN AVAGRAHA", + direction="l", + linebreak="al", + unicodeslot=0x114C4, + }, + [0x114C5]={ + category="lo", + description="TIRHUTA GVANG", + direction="l", + linebreak="al", + unicodeslot=0x114C5, + }, + [0x114C6]={ + category="po", + description="TIRHUTA ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x114C6, + }, + [0x114C7]={ + category="lo", + description="TIRHUTA OM", + direction="l", + linebreak="al", + unicodeslot=0x114C7, + }, + [0x114D0]={ + category="nd", + description="TIRHUTA DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x114D0, + }, + [0x114D1]={ + category="nd", + description="TIRHUTA DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x114D1, + }, + [0x114D2]={ + category="nd", + description="TIRHUTA DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x114D2, + }, + [0x114D3]={ + category="nd", + description="TIRHUTA DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x114D3, + }, + [0x114D4]={ + category="nd", + description="TIRHUTA DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x114D4, + }, + [0x114D5]={ + category="nd", + description="TIRHUTA DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x114D5, + }, + [0x114D6]={ + category="nd", + description="TIRHUTA DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x114D6, + }, + [0x114D7]={ + category="nd", + description="TIRHUTA DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x114D7, + }, + [0x114D8]={ + category="nd", + description="TIRHUTA DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x114D8, + }, + [0x114D9]={ + category="nd", + description="TIRHUTA DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x114D9, + }, + [0x11580]={ + category="lo", + description="SIDDHAM LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11580, + }, + [0x11581]={ + category="lo", + description="SIDDHAM LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11581, + }, + [0x11582]={ + category="lo", + description="SIDDHAM LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11582, + }, + [0x11583]={ + category="lo", + description="SIDDHAM LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11583, + }, + [0x11584]={ + category="lo", + description="SIDDHAM LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11584, + }, + [0x11585]={ + category="lo", + description="SIDDHAM LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11585, + }, + [0x11586]={ + category="lo", + description="SIDDHAM LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x11586, + }, + [0x11587]={ + category="lo", + description="SIDDHAM LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x11587, + }, + [0x11588]={ + category="lo", + description="SIDDHAM LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x11588, + }, + [0x11589]={ + category="lo", + description="SIDDHAM LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x11589, + }, + [0x1158A]={ + category="lo", + description="SIDDHAM LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1158A, + }, + [0x1158B]={ + category="lo", + description="SIDDHAM LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x1158B, + }, + [0x1158C]={ + category="lo", + description="SIDDHAM LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1158C, + }, + [0x1158D]={ + category="lo", + description="SIDDHAM LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x1158D, + }, + [0x1158E]={ + category="lo", + description="SIDDHAM LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x1158E, + }, + [0x1158F]={ + category="lo", + description="SIDDHAM LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x1158F, + }, + [0x11590]={ + category="lo", + description="SIDDHAM LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11590, + }, + [0x11591]={ + category="lo", + description="SIDDHAM LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11591, + }, + [0x11592]={ + category="lo", + description="SIDDHAM LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11592, + }, + [0x11593]={ + category="lo", + description="SIDDHAM LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11593, + }, + [0x11594]={ + category="lo", + description="SIDDHAM LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11594, + }, + [0x11595]={ + category="lo", + description="SIDDHAM LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11595, + }, + [0x11596]={ + category="lo", + description="SIDDHAM LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11596, + }, + [0x11597]={ + category="lo", + description="SIDDHAM LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11597, + }, + [0x11598]={ + category="lo", + description="SIDDHAM LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11598, + }, + [0x11599]={ + category="lo", + description="SIDDHAM LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11599, + }, + [0x1159A]={ + category="lo", + description="SIDDHAM LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x1159A, + }, + [0x1159B]={ + category="lo", + description="SIDDHAM LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x1159B, + }, + [0x1159C]={ + category="lo", + description="SIDDHAM LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x1159C, + }, + [0x1159D]={ + category="lo", + description="SIDDHAM LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x1159D, + }, + [0x1159E]={ + category="lo", + description="SIDDHAM LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1159E, + }, + [0x1159F]={ + category="lo", + description="SIDDHAM LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x1159F, + }, + [0x115A0]={ + category="lo", + description="SIDDHAM LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x115A0, + }, + [0x115A1]={ + category="lo", + description="SIDDHAM LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x115A1, + }, + [0x115A2]={ + category="lo", + description="SIDDHAM LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x115A2, + }, + [0x115A3]={ + category="lo", + description="SIDDHAM LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x115A3, + }, + [0x115A4]={ + category="lo", + description="SIDDHAM LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x115A4, + }, + [0x115A5]={ + category="lo", + description="SIDDHAM LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x115A5, + }, + [0x115A6]={ + category="lo", + description="SIDDHAM LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x115A6, + }, + [0x115A7]={ + category="lo", + description="SIDDHAM LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x115A7, + }, + [0x115A8]={ + category="lo", + description="SIDDHAM LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x115A8, + }, + [0x115A9]={ + category="lo", + description="SIDDHAM LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x115A9, + }, + [0x115AA]={ + category="lo", + description="SIDDHAM LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x115AA, + }, + [0x115AB]={ + category="lo", + description="SIDDHAM LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x115AB, + }, + [0x115AC]={ + category="lo", + description="SIDDHAM LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x115AC, + }, + [0x115AD]={ + category="lo", + description="SIDDHAM LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x115AD, + }, + [0x115AE]={ + category="lo", + description="SIDDHAM LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x115AE, + }, + [0x115AF]={ + category="mc", + description="SIDDHAM VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x115AF, + }, + [0x115B0]={ + category="mc", + description="SIDDHAM VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x115B0, + }, + [0x115B1]={ + category="mc", + description="SIDDHAM VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x115B1, + }, + [0x115B2]={ + category="mn", + description="SIDDHAM VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x115B2, + }, + [0x115B3]={ + category="mn", + description="SIDDHAM VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x115B3, + }, + [0x115B4]={ + category="mn", + description="SIDDHAM VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x115B4, + }, + [0x115B5]={ + category="mn", + description="SIDDHAM VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x115B5, + }, + [0x115B8]={ + category="mc", + description="SIDDHAM VOWEL SIGN E", + direction="l", + linebreak="cm", + unicodeslot=0x115B8, + }, + [0x115B9]={ + category="mc", + description="SIDDHAM VOWEL SIGN AI", + direction="l", + linebreak="cm", + unicodeslot=0x115B9, + }, + [0x115BA]={ + category="mc", + description="SIDDHAM VOWEL SIGN O", + direction="l", + linebreak="cm", + specials={ "char", 0x115B8, 0x115AF }, + unicodeslot=0x115BA, + }, + [0x115BB]={ + category="mc", + description="SIDDHAM VOWEL SIGN AU", + direction="l", + linebreak="cm", + specials={ "char", 0x115B9, 0x115AF }, + unicodeslot=0x115BB, + }, + [0x115BC]={ + category="mn", + description="SIDDHAM SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x115BC, + }, + [0x115BD]={ + category="mn", + description="SIDDHAM SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x115BD, + }, + [0x115BE]={ + category="mc", + description="SIDDHAM SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x115BE, + }, + [0x115BF]={ + category="mn", + combining=0x9, + description="SIDDHAM SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x115BF, + }, + [0x115C0]={ + category="mn", + combining=0x7, + description="SIDDHAM SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x115C0, + }, + [0x115C1]={ + category="po", + description="SIDDHAM SIGN SIDDHAM", + direction="l", + linebreak="bb", + unicodeslot=0x115C1, + }, + [0x115C2]={ + category="po", + description="SIDDHAM DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x115C2, + }, + [0x115C3]={ + category="po", + description="SIDDHAM DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x115C3, + }, + [0x115C4]={ + category="po", + description="SIDDHAM SEPARATOR DOT", + direction="l", + linebreak="ex", + unicodeslot=0x115C4, + }, + [0x115C5]={ + category="po", + description="SIDDHAM SEPARATOR BAR", + direction="l", + linebreak="ex", + unicodeslot=0x115C5, + }, + [0x115C6]={ + category="po", + description="SIDDHAM REPETITION MARK-1", + direction="l", + linebreak="al", + unicodeslot=0x115C6, + }, + [0x115C7]={ + category="po", + description="SIDDHAM REPETITION MARK-2", + direction="l", + linebreak="al", + unicodeslot=0x115C7, + }, + [0x115C8]={ + category="po", + description="SIDDHAM REPETITION MARK-3", + direction="l", + linebreak="al", + unicodeslot=0x115C8, + }, + [0x115C9]={ + category="po", + description="SIDDHAM END OF TEXT MARK", + direction="l", + linebreak="ba", + unicodeslot=0x115C9, + }, + [0x11600]={ + category="lo", + description="MODI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11600, + }, + [0x11601]={ + category="lo", + description="MODI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11601, + }, + [0x11602]={ + category="lo", + description="MODI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11602, + }, + [0x11603]={ + category="lo", + description="MODI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11603, + }, + [0x11604]={ + category="lo", + description="MODI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11604, + }, + [0x11605]={ + category="lo", + description="MODI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11605, + }, + [0x11606]={ + category="lo", + description="MODI LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x11606, + }, + [0x11607]={ + category="lo", + description="MODI LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x11607, + }, + [0x11608]={ + category="lo", + description="MODI LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x11608, + }, + [0x11609]={ + category="lo", + description="MODI LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x11609, + }, + [0x1160A]={ + category="lo", + description="MODI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1160A, + }, + [0x1160B]={ + category="lo", + description="MODI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x1160B, + }, + [0x1160C]={ + category="lo", + description="MODI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1160C, + }, + [0x1160D]={ + category="lo", + description="MODI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x1160D, + }, + [0x1160E]={ + category="lo", + description="MODI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x1160E, + }, + [0x1160F]={ + category="lo", + description="MODI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x1160F, + }, + [0x11610]={ + category="lo", + description="MODI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11610, + }, + [0x11611]={ + category="lo", + description="MODI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11611, + }, + [0x11612]={ + category="lo", + description="MODI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11612, + }, + [0x11613]={ + category="lo", + description="MODI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11613, + }, + [0x11614]={ + category="lo", + description="MODI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11614, + }, + [0x11615]={ + category="lo", + description="MODI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11615, + }, + [0x11616]={ + category="lo", + description="MODI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11616, + }, + [0x11617]={ + category="lo", + description="MODI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11617, + }, + [0x11618]={ + category="lo", + description="MODI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11618, + }, + [0x11619]={ + category="lo", + description="MODI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11619, + }, + [0x1161A]={ + category="lo", + description="MODI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x1161A, + }, + [0x1161B]={ + category="lo", + description="MODI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x1161B, + }, + [0x1161C]={ + category="lo", + description="MODI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x1161C, + }, + [0x1161D]={ + category="lo", + description="MODI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x1161D, + }, + [0x1161E]={ + category="lo", + description="MODI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1161E, + }, + [0x1161F]={ + category="lo", + description="MODI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x1161F, }, - [0x11000]={ - category="mc", - description="BRAHMI SIGN CANDRABINDU", + [0x11620]={ + category="lo", + description="MODI LETTER DHA", direction="l", - linebreak="cm", - unicodeslot=0x11000, + linebreak="al", + unicodeslot=0x11620, }, - [0x11001]={ - category="mn", - description="BRAHMI SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11001, + [0x11621]={ + category="lo", + description="MODI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11621, }, - [0x11002]={ - category="mc", - description="BRAHMI SIGN VISARGA", + [0x11622]={ + category="lo", + description="MODI LETTER PA", direction="l", - linebreak="cm", - unicodeslot=0x11002, + linebreak="al", + unicodeslot=0x11622, }, - [0x11003]={ + [0x11623]={ category="lo", - description="BRAHMI SIGN JIHVAMULIYA", + description="MODI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x11003, + unicodeslot=0x11623, }, - [0x11004]={ + [0x11624]={ category="lo", - description="BRAHMI SIGN UPADHMANIYA", + description="MODI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x11004, + unicodeslot=0x11624, }, - [0x11005]={ + [0x11625]={ category="lo", - description="BRAHMI LETTER A", + description="MODI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x11005, + unicodeslot=0x11625, }, - [0x11006]={ + [0x11626]={ category="lo", - description="BRAHMI LETTER AA", + description="MODI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x11006, + unicodeslot=0x11626, }, - [0x11007]={ + [0x11627]={ category="lo", - description="BRAHMI LETTER I", + description="MODI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x11007, + unicodeslot=0x11627, }, - [0x11008]={ + [0x11628]={ category="lo", - description="BRAHMI LETTER II", + description="MODI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x11008, + unicodeslot=0x11628, }, - [0x11009]={ + [0x11629]={ category="lo", - description="BRAHMI LETTER U", + description="MODI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x11009, + unicodeslot=0x11629, }, - [0x1100A]={ + [0x1162A]={ category="lo", - description="BRAHMI LETTER UU", + description="MODI LETTER VA", direction="l", linebreak="al", - unicodeslot=0x1100A, + unicodeslot=0x1162A, }, - [0x1100B]={ + [0x1162B]={ category="lo", - description="BRAHMI LETTER VOCALIC R", + description="MODI LETTER SHA", direction="l", linebreak="al", - unicodeslot=0x1100B, + unicodeslot=0x1162B, }, - [0x1100C]={ + [0x1162C]={ category="lo", - description="BRAHMI LETTER VOCALIC RR", + description="MODI LETTER SSA", direction="l", linebreak="al", - unicodeslot=0x1100C, + unicodeslot=0x1162C, }, - [0x1100D]={ + [0x1162D]={ category="lo", - description="BRAHMI LETTER VOCALIC L", + description="MODI LETTER SA", direction="l", linebreak="al", - unicodeslot=0x1100D, + unicodeslot=0x1162D, }, - [0x1100E]={ + [0x1162E]={ category="lo", - description="BRAHMI LETTER VOCALIC LL", + description="MODI LETTER HA", direction="l", linebreak="al", - unicodeslot=0x1100E, + unicodeslot=0x1162E, }, - [0x1100F]={ + [0x1162F]={ category="lo", - description="BRAHMI LETTER E", + description="MODI LETTER LLA", direction="l", linebreak="al", - unicodeslot=0x1100F, + unicodeslot=0x1162F, }, - [0x11010]={ + [0x11630]={ + category="mc", + description="MODI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x11630, + }, + [0x11631]={ + category="mc", + description="MODI VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x11631, + }, + [0x11632]={ + category="mc", + description="MODI VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x11632, + }, + [0x11633]={ + category="mn", + description="MODI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11633, + }, + [0x11634]={ + category="mn", + description="MODI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11634, + }, + [0x11635]={ + category="mn", + description="MODI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11635, + }, + [0x11636]={ + category="mn", + description="MODI VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x11636, + }, + [0x11637]={ + category="mn", + description="MODI VOWEL SIGN VOCALIC L", + direction="nsm", + linebreak="cm", + unicodeslot=0x11637, + }, + [0x11638]={ + category="mn", + description="MODI VOWEL SIGN VOCALIC LL", + direction="nsm", + linebreak="cm", + unicodeslot=0x11638, + }, + [0x11639]={ + category="mn", + description="MODI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11639, + }, + [0x1163A]={ + category="mn", + description="MODI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x1163A, + }, + [0x1163B]={ + category="mc", + description="MODI VOWEL SIGN O", + direction="l", + linebreak="cm", + unicodeslot=0x1163B, + }, + [0x1163C]={ + category="mc", + description="MODI VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x1163C, + }, + [0x1163D]={ + category="mn", + description="MODI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1163D, + }, + [0x1163E]={ + category="mc", + description="MODI SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x1163E, + }, + [0x1163F]={ + category="mn", + combining=0x9, + description="MODI SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1163F, + }, + [0x11640]={ + category="mn", + description="MODI SIGN ARDHACANDRA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11640, + }, + [0x11641]={ + category="po", + description="MODI DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11641, + }, + [0x11642]={ + category="po", + description="MODI DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11642, + }, + [0x11643]={ + category="po", + description="MODI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x11643, + }, + [0x11644]={ category="lo", - description="BRAHMI LETTER AI", + description="MODI SIGN HUVA", direction="l", linebreak="al", - unicodeslot=0x11010, + unicodeslot=0x11644, }, - [0x11011]={ + [0x11650]={ + category="nd", + description="MODI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11650, + }, + [0x11651]={ + category="nd", + description="MODI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11651, + }, + [0x11652]={ + category="nd", + description="MODI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11652, + }, + [0x11653]={ + category="nd", + description="MODI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11653, + }, + [0x11654]={ + category="nd", + description="MODI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x11654, + }, + [0x11655]={ + category="nd", + description="MODI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x11655, + }, + [0x11656]={ + category="nd", + description="MODI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x11656, + }, + [0x11657]={ + category="nd", + description="MODI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x11657, + }, + [0x11658]={ + category="nd", + description="MODI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x11658, + }, + [0x11659]={ + category="nd", + description="MODI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x11659, + }, + [0x11680]={ category="lo", - description="BRAHMI LETTER O", + description="TAKRI LETTER A", direction="l", linebreak="al", - unicodeslot=0x11011, + unicodeslot=0x11680, }, - [0x11012]={ + [0x11681]={ category="lo", - description="BRAHMI LETTER AU", + description="TAKRI LETTER AA", direction="l", linebreak="al", - unicodeslot=0x11012, + unicodeslot=0x11681, }, - [0x11013]={ + [0x11682]={ category="lo", - description="BRAHMI LETTER KA", + description="TAKRI LETTER I", direction="l", linebreak="al", - unicodeslot=0x11013, + unicodeslot=0x11682, }, - [0x11014]={ + [0x11683]={ category="lo", - description="BRAHMI LETTER KHA", + description="TAKRI LETTER II", direction="l", linebreak="al", - unicodeslot=0x11014, + unicodeslot=0x11683, }, - [0x11015]={ + [0x11684]={ category="lo", - description="BRAHMI LETTER GA", + description="TAKRI LETTER U", direction="l", linebreak="al", - unicodeslot=0x11015, + unicodeslot=0x11684, }, - [0x11016]={ + [0x11685]={ category="lo", - description="BRAHMI LETTER GHA", + description="TAKRI LETTER UU", direction="l", linebreak="al", - unicodeslot=0x11016, + unicodeslot=0x11685, }, - [0x11017]={ + [0x11686]={ category="lo", - description="BRAHMI LETTER NGA", + description="TAKRI LETTER E", direction="l", linebreak="al", - unicodeslot=0x11017, + unicodeslot=0x11686, }, - [0x11018]={ + [0x11687]={ category="lo", - description="BRAHMI LETTER CA", + description="TAKRI LETTER AI", direction="l", linebreak="al", - unicodeslot=0x11018, + unicodeslot=0x11687, }, - [0x11019]={ + [0x11688]={ category="lo", - description="BRAHMI LETTER CHA", + description="TAKRI LETTER O", direction="l", linebreak="al", - unicodeslot=0x11019, + unicodeslot=0x11688, }, - [0x1101A]={ + [0x11689]={ category="lo", - description="BRAHMI LETTER JA", + description="TAKRI LETTER AU", direction="l", linebreak="al", - unicodeslot=0x1101A, + unicodeslot=0x11689, }, - [0x1101B]={ + [0x1168A]={ category="lo", - description="BRAHMI LETTER JHA", + description="TAKRI LETTER KA", direction="l", linebreak="al", - unicodeslot=0x1101B, + unicodeslot=0x1168A, }, - [0x1101C]={ + [0x1168B]={ category="lo", - description="BRAHMI LETTER NYA", + description="TAKRI LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x1101C, + unicodeslot=0x1168B, }, - [0x1101D]={ + [0x1168C]={ category="lo", - description="BRAHMI LETTER TTA", + description="TAKRI LETTER GA", direction="l", linebreak="al", - unicodeslot=0x1101D, + unicodeslot=0x1168C, }, - [0x1101E]={ + [0x1168D]={ category="lo", - description="BRAHMI LETTER TTHA", + description="TAKRI LETTER GHA", direction="l", linebreak="al", - unicodeslot=0x1101E, + unicodeslot=0x1168D, }, - [0x1101F]={ + [0x1168E]={ category="lo", - description="BRAHMI LETTER DDA", + description="TAKRI LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x1101F, + unicodeslot=0x1168E, }, - [0x11020]={ + [0x1168F]={ category="lo", - description="BRAHMI LETTER DDHA", + description="TAKRI LETTER CA", direction="l", linebreak="al", - unicodeslot=0x11020, + unicodeslot=0x1168F, }, - [0x11021]={ + [0x11690]={ category="lo", - description="BRAHMI LETTER NNA", + description="TAKRI LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x11021, + unicodeslot=0x11690, }, - [0x11022]={ + [0x11691]={ category="lo", - description="BRAHMI LETTER TA", + description="TAKRI LETTER JA", direction="l", linebreak="al", - unicodeslot=0x11022, + unicodeslot=0x11691, }, - [0x11023]={ + [0x11692]={ category="lo", - description="BRAHMI LETTER THA", + description="TAKRI LETTER JHA", direction="l", linebreak="al", - unicodeslot=0x11023, + unicodeslot=0x11692, }, - [0x11024]={ + [0x11693]={ category="lo", - description="BRAHMI LETTER DA", + description="TAKRI LETTER NYA", direction="l", linebreak="al", - unicodeslot=0x11024, + unicodeslot=0x11693, }, - [0x11025]={ + [0x11694]={ category="lo", - description="BRAHMI LETTER DHA", + description="TAKRI LETTER TTA", direction="l", linebreak="al", - unicodeslot=0x11025, + unicodeslot=0x11694, }, - [0x11026]={ + [0x11695]={ category="lo", - description="BRAHMI LETTER NA", + description="TAKRI LETTER TTHA", direction="l", linebreak="al", - unicodeslot=0x11026, + unicodeslot=0x11695, }, - [0x11027]={ + [0x11696]={ category="lo", - description="BRAHMI LETTER PA", + description="TAKRI LETTER DDA", direction="l", linebreak="al", - unicodeslot=0x11027, + unicodeslot=0x11696, }, - [0x11028]={ + [0x11697]={ category="lo", - description="BRAHMI LETTER PHA", + description="TAKRI LETTER DDHA", direction="l", linebreak="al", - unicodeslot=0x11028, + unicodeslot=0x11697, }, - [0x11029]={ + [0x11698]={ category="lo", - description="BRAHMI LETTER BA", + description="TAKRI LETTER NNA", direction="l", linebreak="al", - unicodeslot=0x11029, + unicodeslot=0x11698, }, - [0x1102A]={ + [0x11699]={ category="lo", - description="BRAHMI LETTER BHA", + description="TAKRI LETTER TA", direction="l", linebreak="al", - unicodeslot=0x1102A, + unicodeslot=0x11699, }, - [0x1102B]={ + [0x1169A]={ category="lo", - description="BRAHMI LETTER MA", + description="TAKRI LETTER THA", direction="l", linebreak="al", - unicodeslot=0x1102B, + unicodeslot=0x1169A, }, - [0x1102C]={ + [0x1169B]={ category="lo", - description="BRAHMI LETTER YA", + description="TAKRI LETTER DA", direction="l", linebreak="al", - unicodeslot=0x1102C, + unicodeslot=0x1169B, }, - [0x1102D]={ + [0x1169C]={ category="lo", - description="BRAHMI LETTER RA", + description="TAKRI LETTER DHA", direction="l", linebreak="al", - unicodeslot=0x1102D, + unicodeslot=0x1169C, }, - [0x1102E]={ + [0x1169D]={ category="lo", - description="BRAHMI LETTER LA", + description="TAKRI LETTER NA", direction="l", linebreak="al", - unicodeslot=0x1102E, + unicodeslot=0x1169D, }, - [0x1102F]={ + [0x1169E]={ category="lo", - description="BRAHMI LETTER VA", + description="TAKRI LETTER PA", direction="l", linebreak="al", - unicodeslot=0x1102F, + unicodeslot=0x1169E, }, - [0x11030]={ + [0x1169F]={ category="lo", - description="BRAHMI LETTER SHA", + description="TAKRI LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x11030, + unicodeslot=0x1169F, }, - [0x11031]={ + [0x116A0]={ category="lo", - description="BRAHMI LETTER SSA", + description="TAKRI LETTER BA", direction="l", linebreak="al", - unicodeslot=0x11031, + unicodeslot=0x116A0, }, - [0x11032]={ + [0x116A1]={ category="lo", - description="BRAHMI LETTER SA", + description="TAKRI LETTER BHA", direction="l", linebreak="al", - unicodeslot=0x11032, + unicodeslot=0x116A1, }, - [0x11033]={ + [0x116A2]={ category="lo", - description="BRAHMI LETTER HA", + description="TAKRI LETTER MA", direction="l", linebreak="al", - unicodeslot=0x11033, + unicodeslot=0x116A2, }, - [0x11034]={ + [0x116A3]={ category="lo", - description="BRAHMI LETTER LLA", + description="TAKRI LETTER YA", direction="l", linebreak="al", - unicodeslot=0x11034, + unicodeslot=0x116A3, }, - [0x11035]={ + [0x116A4]={ category="lo", - description="BRAHMI LETTER OLD TAMIL LLLA", + description="TAKRI LETTER RA", direction="l", linebreak="al", - unicodeslot=0x11035, + unicodeslot=0x116A4, }, - [0x11036]={ + [0x116A5]={ category="lo", - description="BRAHMI LETTER OLD TAMIL RRA", + description="TAKRI LETTER LA", direction="l", linebreak="al", - unicodeslot=0x11036, + unicodeslot=0x116A5, }, - [0x11037]={ + [0x116A6]={ category="lo", - description="BRAHMI LETTER OLD TAMIL NNNA", + description="TAKRI LETTER VA", direction="l", linebreak="al", - unicodeslot=0x11037, + unicodeslot=0x116A6, }, - [0x11038]={ - category="mn", - description="BRAHMI VOWEL SIGN AA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11038, + [0x116A7]={ + category="lo", + description="TAKRI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x116A7, }, - [0x11039]={ - category="mn", - description="BRAHMI VOWEL SIGN BHATTIPROLU AA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11039, + [0x116A8]={ + category="lo", + description="TAKRI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x116A8, }, - [0x1103A]={ + [0x116A9]={ + category="lo", + description="TAKRI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x116A9, + }, + [0x116AA]={ + category="lo", + description="TAKRI LETTER RRA", + direction="l", + linebreak="al", + unicodeslot=0x116AA, + }, + [0x116AB]={ category="mn", - description="BRAHMI VOWEL SIGN I", + description="TAKRI SIGN ANUSVARA", direction="nsm", linebreak="cm", - unicodeslot=0x1103A, + unicodeslot=0x116AB, }, - [0x1103B]={ - category="mn", - description="BRAHMI VOWEL SIGN II", - direction="nsm", + [0x116AC]={ + category="mc", + description="TAKRI SIGN VISARGA", + direction="l", linebreak="cm", - unicodeslot=0x1103B, + unicodeslot=0x116AC, }, - [0x1103C]={ + [0x116AD]={ category="mn", - description="BRAHMI VOWEL SIGN U", + description="TAKRI VOWEL SIGN AA", direction="nsm", linebreak="cm", - unicodeslot=0x1103C, + unicodeslot=0x116AD, }, - [0x1103D]={ - category="mn", - description="BRAHMI VOWEL SIGN UU", - direction="nsm", + [0x116AE]={ + category="mc", + description="TAKRI VOWEL SIGN I", + direction="l", linebreak="cm", - unicodeslot=0x1103D, + unicodeslot=0x116AE, }, - [0x1103E]={ - category="mn", - description="BRAHMI VOWEL SIGN VOCALIC R", - direction="nsm", + [0x116AF]={ + category="mc", + description="TAKRI VOWEL SIGN II", + direction="l", linebreak="cm", - unicodeslot=0x1103E, + unicodeslot=0x116AF, }, - [0x1103F]={ + [0x116B0]={ category="mn", - description="BRAHMI VOWEL SIGN VOCALIC RR", + description="TAKRI VOWEL SIGN U", direction="nsm", linebreak="cm", - unicodeslot=0x1103F, + unicodeslot=0x116B0, }, - [0x11040]={ + [0x116B1]={ category="mn", - description="BRAHMI VOWEL SIGN VOCALIC L", + description="TAKRI VOWEL SIGN UU", direction="nsm", linebreak="cm", - unicodeslot=0x11040, + unicodeslot=0x116B1, }, - [0x11041]={ + [0x116B2]={ category="mn", - description="BRAHMI VOWEL SIGN VOCALIC LL", + description="TAKRI VOWEL SIGN E", direction="nsm", linebreak="cm", - unicodeslot=0x11041, + unicodeslot=0x116B2, }, - [0x11042]={ + [0x116B3]={ category="mn", - description="BRAHMI VOWEL SIGN E", + description="TAKRI VOWEL SIGN AI", direction="nsm", linebreak="cm", - unicodeslot=0x11042, + unicodeslot=0x116B3, }, - [0x11043]={ + [0x116B4]={ category="mn", - description="BRAHMI VOWEL SIGN AI", + description="TAKRI VOWEL SIGN O", direction="nsm", linebreak="cm", - unicodeslot=0x11043, + unicodeslot=0x116B4, }, - [0x11044]={ + [0x116B5]={ category="mn", - description="BRAHMI VOWEL SIGN O", + description="TAKRI VOWEL SIGN AU", direction="nsm", linebreak="cm", - unicodeslot=0x11044, + unicodeslot=0x116B5, }, - [0x11045]={ - category="mn", - description="BRAHMI VOWEL SIGN AU", - direction="nsm", + [0x116B6]={ + category="mc", + combining=0x9, + description="TAKRI SIGN VIRAMA", + direction="l", linebreak="cm", - unicodeslot=0x11045, + unicodeslot=0x116B6, }, - [0x11046]={ + [0x116B7]={ category="mn", - description="BRAHMI VIRAMA", + combining=0x7, + description="TAKRI SIGN NUKTA", direction="nsm", linebreak="cm", - unicodeslot=0x11046, + unicodeslot=0x116B7, }, - [0x11047]={ - category="po", - description="BRAHMI DANDA", + [0x116C0]={ + category="nd", + description="TAKRI DIGIT ZERO", direction="l", - linebreak="ba", - unicodeslot=0x11047, + linebreak="nu", + unicodeslot=0x116C0, }, - [0x11048]={ - category="po", - description="BRAHMI DOUBLE DANDA", + [0x116C1]={ + category="nd", + description="TAKRI DIGIT ONE", direction="l", - linebreak="ba", - unicodeslot=0x11048, + linebreak="nu", + unicodeslot=0x116C1, }, - [0x11049]={ - category="po", - description="BRAHMI PUNCTUATION DOT", + [0x116C2]={ + category="nd", + description="TAKRI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x116C2, + }, + [0x116C3]={ + category="nd", + description="TAKRI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x116C3, + }, + [0x116C4]={ + category="nd", + description="TAKRI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x116C4, + }, + [0x116C5]={ + category="nd", + description="TAKRI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x116C5, + }, + [0x116C6]={ + category="nd", + description="TAKRI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x116C6, + }, + [0x116C7]={ + category="nd", + description="TAKRI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x116C7, + }, + [0x116C8]={ + category="nd", + description="TAKRI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x116C8, + }, + [0x116C9]={ + category="nd", + description="TAKRI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x116C9, + }, + [0x118A0]={ + category="lu", + description="WARANG CITI CAPITAL LETTER NGAA", direction="l", linebreak="al", - unicodeslot=0x11049, + unicodeslot=0x118A0, }, - [0x1104A]={ - category="po", - description="BRAHMI PUNCTUATION DOUBLE DOT", + [0x118A1]={ + category="lu", + description="WARANG CITI CAPITAL LETTER A", direction="l", linebreak="al", - unicodeslot=0x1104A, + unicodeslot=0x118A1, }, - [0x1104B]={ - category="po", - description="BRAHMI PUNCTUATION LINE", + [0x118A2]={ + category="lu", + description="WARANG CITI CAPITAL LETTER WI", direction="l", linebreak="al", - unicodeslot=0x1104B, + unicodeslot=0x118A2, }, - [0x1104C]={ - category="po", - description="BRAHMI PUNCTUATION CRESCENT BAR", + [0x118A3]={ + category="lu", + description="WARANG CITI CAPITAL LETTER YU", direction="l", linebreak="al", - unicodeslot=0x1104C, + unicodeslot=0x118A3, }, - [0x1104D]={ - category="po", - description="BRAHMI PUNCTUATION LOTUS", + [0x118A4]={ + category="lu", + description="WARANG CITI CAPITAL LETTER YA", direction="l", linebreak="al", - unicodeslot=0x1104D, + unicodeslot=0x118A4, }, - [0x11052]={ - category="no", - description="BRAHMI NUMBER ONE", - direction="on", + [0x118A5]={ + category="lu", + description="WARANG CITI CAPITAL LETTER YO", + direction="l", linebreak="al", - unicodeslot=0x11052, + unicodeslot=0x118A5, }, - [0x11053]={ - category="no", - description="BRAHMI NUMBER TWO", - direction="on", + [0x118A6]={ + category="lu", + description="WARANG CITI CAPITAL LETTER II", + direction="l", linebreak="al", - unicodeslot=0x11053, + unicodeslot=0x118A6, }, - [0x11054]={ - category="no", - description="BRAHMI NUMBER THREE", - direction="on", + [0x118A7]={ + category="lu", + description="WARANG CITI CAPITAL LETTER UU", + direction="l", linebreak="al", - unicodeslot=0x11054, + unicodeslot=0x118A7, }, - [0x11055]={ - category="no", - description="BRAHMI NUMBER FOUR", - direction="on", + [0x118A8]={ + category="lu", + description="WARANG CITI CAPITAL LETTER E", + direction="l", linebreak="al", - unicodeslot=0x11055, + unicodeslot=0x118A8, }, - [0x11056]={ - category="no", - description="BRAHMI NUMBER FIVE", - direction="on", + [0x118A9]={ + category="lu", + description="WARANG CITI CAPITAL LETTER O", + direction="l", linebreak="al", - unicodeslot=0x11056, + unicodeslot=0x118A9, }, - [0x11057]={ - category="no", - description="BRAHMI NUMBER SIX", - direction="on", + [0x118AA]={ + category="lu", + description="WARANG CITI CAPITAL LETTER ANG", + direction="l", linebreak="al", - unicodeslot=0x11057, + unicodeslot=0x118AA, }, - [0x11058]={ - category="no", - description="BRAHMI NUMBER SEVEN", - direction="on", + [0x118AB]={ + category="lu", + description="WARANG CITI CAPITAL LETTER GA", + direction="l", linebreak="al", - unicodeslot=0x11058, + unicodeslot=0x118AB, }, - [0x11059]={ - category="no", - description="BRAHMI NUMBER EIGHT", - direction="on", + [0x118AC]={ + category="lu", + description="WARANG CITI CAPITAL LETTER KO", + direction="l", linebreak="al", - unicodeslot=0x11059, + unicodeslot=0x118AC, }, - [0x1105A]={ - category="no", - description="BRAHMI NUMBER NINE", - direction="on", + [0x118AD]={ + category="lu", + description="WARANG CITI CAPITAL LETTER ENY", + direction="l", linebreak="al", - unicodeslot=0x1105A, + unicodeslot=0x118AD, }, - [0x1105B]={ - category="no", - description="BRAHMI NUMBER TEN", - direction="on", + [0x118AE]={ + category="lu", + description="WARANG CITI CAPITAL LETTER YUJ", + direction="l", linebreak="al", - unicodeslot=0x1105B, + unicodeslot=0x118AE, }, - [0x1105C]={ - category="no", - description="BRAHMI NUMBER TWENTY", - direction="on", + [0x118AF]={ + category="lu", + description="WARANG CITI CAPITAL LETTER UC", + direction="l", linebreak="al", - unicodeslot=0x1105C, + unicodeslot=0x118AF, }, - [0x1105D]={ - category="no", - description="BRAHMI NUMBER THIRTY", - direction="on", + [0x118B0]={ + category="lu", + description="WARANG CITI CAPITAL LETTER ENN", + direction="l", linebreak="al", - unicodeslot=0x1105D, + unicodeslot=0x118B0, }, - [0x1105E]={ - category="no", - description="BRAHMI NUMBER FORTY", - direction="on", + [0x118B1]={ + category="lu", + description="WARANG CITI CAPITAL LETTER ODD", + direction="l", linebreak="al", - unicodeslot=0x1105E, + unicodeslot=0x118B1, }, - [0x1105F]={ - category="no", - description="BRAHMI NUMBER FIFTY", - direction="on", + [0x118B2]={ + category="lu", + description="WARANG CITI CAPITAL LETTER TTE", + direction="l", linebreak="al", - unicodeslot=0x1105F, + unicodeslot=0x118B2, }, - [0x11060]={ - category="no", - description="BRAHMI NUMBER SIXTY", - direction="on", + [0x118B3]={ + category="lu", + description="WARANG CITI CAPITAL LETTER NUNG", + direction="l", linebreak="al", - unicodeslot=0x11060, + unicodeslot=0x118B3, }, - [0x11061]={ - category="no", - description="BRAHMI NUMBER SEVENTY", - direction="on", + [0x118B4]={ + category="lu", + description="WARANG CITI CAPITAL LETTER DA", + direction="l", linebreak="al", - unicodeslot=0x11061, + unicodeslot=0x118B4, }, - [0x11062]={ - category="no", - description="BRAHMI NUMBER EIGHTY", - direction="on", + [0x118B5]={ + category="lu", + description="WARANG CITI CAPITAL LETTER AT", + direction="l", linebreak="al", - unicodeslot=0x11062, + unicodeslot=0x118B5, }, - [0x11063]={ - category="no", - description="BRAHMI NUMBER NINETY", - direction="on", + [0x118B6]={ + category="lu", + description="WARANG CITI CAPITAL LETTER AM", + direction="l", linebreak="al", - unicodeslot=0x11063, + unicodeslot=0x118B6, }, - [0x11064]={ - category="no", - description="BRAHMI NUMBER ONE HUNDRED", - direction="on", + [0x118B7]={ + category="lu", + description="WARANG CITI CAPITAL LETTER BU", + direction="l", linebreak="al", - unicodeslot=0x11064, + unicodeslot=0x118B7, }, - [0x11065]={ - category="no", - description="BRAHMI NUMBER ONE THOUSAND", - direction="on", + [0x118B8]={ + category="lu", + description="WARANG CITI CAPITAL LETTER PU", + direction="l", linebreak="al", - unicodeslot=0x11065, + unicodeslot=0x118B8, }, - [0x11066]={ + [0x118B9]={ + category="lu", + description="WARANG CITI CAPITAL LETTER HIYO", + direction="l", + linebreak="al", + unicodeslot=0x118B9, + }, + [0x118BA]={ + category="lu", + description="WARANG CITI CAPITAL LETTER HOLO", + direction="l", + linebreak="al", + unicodeslot=0x118BA, + }, + [0x118BB]={ + category="lu", + description="WARANG CITI CAPITAL LETTER HORR", + direction="l", + linebreak="al", + unicodeslot=0x118BB, + }, + [0x118BC]={ + category="lu", + description="WARANG CITI CAPITAL LETTER HAR", + direction="l", + linebreak="al", + unicodeslot=0x118BC, + }, + [0x118BD]={ + category="lu", + description="WARANG CITI CAPITAL LETTER SSUU", + direction="l", + linebreak="al", + unicodeslot=0x118BD, + }, + [0x118BE]={ + category="lu", + description="WARANG CITI CAPITAL LETTER SII", + direction="l", + linebreak="al", + unicodeslot=0x118BE, + }, + [0x118BF]={ + category="lu", + description="WARANG CITI CAPITAL LETTER VIYO", + direction="l", + linebreak="al", + unicodeslot=0x118BF, + }, + [0x118C0]={ + category="ll", + description="WARANG CITI SMALL LETTER NGAA", + direction="l", + linebreak="al", + unicodeslot=0x118C0, + }, + [0x118C1]={ + category="ll", + description="WARANG CITI SMALL LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x118C1, + }, + [0x118C2]={ + category="ll", + description="WARANG CITI SMALL LETTER WI", + direction="l", + linebreak="al", + unicodeslot=0x118C2, + }, + [0x118C3]={ + category="ll", + description="WARANG CITI SMALL LETTER YU", + direction="l", + linebreak="al", + unicodeslot=0x118C3, + }, + [0x118C4]={ + category="ll", + description="WARANG CITI SMALL LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x118C4, + }, + [0x118C5]={ + category="ll", + description="WARANG CITI SMALL LETTER YO", + direction="l", + linebreak="al", + unicodeslot=0x118C5, + }, + [0x118C6]={ + category="ll", + description="WARANG CITI SMALL LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x118C6, + }, + [0x118C7]={ + category="ll", + description="WARANG CITI SMALL LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x118C7, + }, + [0x118C8]={ + category="ll", + description="WARANG CITI SMALL LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x118C8, + }, + [0x118C9]={ + category="ll", + description="WARANG CITI SMALL LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x118C9, + }, + [0x118CA]={ + category="ll", + description="WARANG CITI SMALL LETTER ANG", + direction="l", + linebreak="al", + unicodeslot=0x118CA, + }, + [0x118CB]={ + category="ll", + description="WARANG CITI SMALL LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x118CB, + }, + [0x118CC]={ + category="ll", + description="WARANG CITI SMALL LETTER KO", + direction="l", + linebreak="al", + unicodeslot=0x118CC, + }, + [0x118CD]={ + category="ll", + description="WARANG CITI SMALL LETTER ENY", + direction="l", + linebreak="al", + unicodeslot=0x118CD, + }, + [0x118CE]={ + category="ll", + description="WARANG CITI SMALL LETTER YUJ", + direction="l", + linebreak="al", + unicodeslot=0x118CE, + }, + [0x118CF]={ + category="ll", + description="WARANG CITI SMALL LETTER UC", + direction="l", + linebreak="al", + unicodeslot=0x118CF, + }, + [0x118D0]={ + category="ll", + description="WARANG CITI SMALL LETTER ENN", + direction="l", + linebreak="al", + unicodeslot=0x118D0, + }, + [0x118D1]={ + category="ll", + description="WARANG CITI SMALL LETTER ODD", + direction="l", + linebreak="al", + unicodeslot=0x118D1, + }, + [0x118D2]={ + category="ll", + description="WARANG CITI SMALL LETTER TTE", + direction="l", + linebreak="al", + unicodeslot=0x118D2, + }, + [0x118D3]={ + category="ll", + description="WARANG CITI SMALL LETTER NUNG", + direction="l", + linebreak="al", + unicodeslot=0x118D3, + }, + [0x118D4]={ + category="ll", + description="WARANG CITI SMALL LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x118D4, + }, + [0x118D5]={ + category="ll", + description="WARANG CITI SMALL LETTER AT", + direction="l", + linebreak="al", + unicodeslot=0x118D5, + }, + [0x118D6]={ + category="ll", + description="WARANG CITI SMALL LETTER AM", + direction="l", + linebreak="al", + unicodeslot=0x118D6, + }, + [0x118D7]={ + category="ll", + description="WARANG CITI SMALL LETTER BU", + direction="l", + linebreak="al", + unicodeslot=0x118D7, + }, + [0x118D8]={ + category="ll", + description="WARANG CITI SMALL LETTER PU", + direction="l", + linebreak="al", + unicodeslot=0x118D8, + }, + [0x118D9]={ + category="ll", + description="WARANG CITI SMALL LETTER HIYO", + direction="l", + linebreak="al", + unicodeslot=0x118D9, + }, + [0x118DA]={ + category="ll", + description="WARANG CITI SMALL LETTER HOLO", + direction="l", + linebreak="al", + unicodeslot=0x118DA, + }, + [0x118DB]={ + category="ll", + description="WARANG CITI SMALL LETTER HORR", + direction="l", + linebreak="al", + unicodeslot=0x118DB, + }, + [0x118DC]={ + category="ll", + description="WARANG CITI SMALL LETTER HAR", + direction="l", + linebreak="al", + unicodeslot=0x118DC, + }, + [0x118DD]={ + category="ll", + description="WARANG CITI SMALL LETTER SSUU", + direction="l", + linebreak="al", + unicodeslot=0x118DD, + }, + [0x118DE]={ + category="ll", + description="WARANG CITI SMALL LETTER SII", + direction="l", + linebreak="al", + unicodeslot=0x118DE, + }, + [0x118DF]={ + category="ll", + description="WARANG CITI SMALL LETTER VIYO", + direction="l", + linebreak="al", + unicodeslot=0x118DF, + }, + [0x118E0]={ category="nd", - description="BRAHMI DIGIT ZERO", + description="WARANG CITI DIGIT ZERO", direction="l", linebreak="nu", - unicodeslot=0x11066, + unicodeslot=0x118E0, }, - [0x11067]={ + [0x118E1]={ category="nd", - description="BRAHMI DIGIT ONE", + description="WARANG CITI DIGIT ONE", direction="l", linebreak="nu", - unicodeslot=0x11067, + unicodeslot=0x118E1, }, - [0x11068]={ + [0x118E2]={ category="nd", - description="BRAHMI DIGIT TWO", + description="WARANG CITI DIGIT TWO", direction="l", linebreak="nu", - unicodeslot=0x11068, + unicodeslot=0x118E2, }, - [0x11069]={ + [0x118E3]={ category="nd", - description="BRAHMI DIGIT THREE", + description="WARANG CITI DIGIT THREE", direction="l", linebreak="nu", - unicodeslot=0x11069, + unicodeslot=0x118E3, }, - [0x1106A]={ + [0x118E4]={ category="nd", - description="BRAHMI DIGIT FOUR", + description="WARANG CITI DIGIT FOUR", direction="l", linebreak="nu", - unicodeslot=0x1106A, + unicodeslot=0x118E4, }, - [0x1106B]={ + [0x118E5]={ category="nd", - description="BRAHMI DIGIT FIVE", + description="WARANG CITI DIGIT FIVE", direction="l", linebreak="nu", - unicodeslot=0x1106B, + unicodeslot=0x118E5, }, - [0x1106C]={ + [0x118E6]={ category="nd", - description="BRAHMI DIGIT SIX", + description="WARANG CITI DIGIT SIX", direction="l", linebreak="nu", - unicodeslot=0x1106C, + unicodeslot=0x118E6, }, - [0x1106D]={ + [0x118E7]={ category="nd", - description="BRAHMI DIGIT SEVEN", + description="WARANG CITI DIGIT SEVEN", direction="l", linebreak="nu", - unicodeslot=0x1106D, + unicodeslot=0x118E7, }, - [0x1106E]={ + [0x118E8]={ category="nd", - description="BRAHMI DIGIT EIGHT", + description="WARANG CITI DIGIT EIGHT", direction="l", linebreak="nu", - unicodeslot=0x1106E, + unicodeslot=0x118E8, }, - [0x1106F]={ + [0x118E9]={ category="nd", - description="BRAHMI DIGIT NINE", + description="WARANG CITI DIGIT NINE", direction="l", linebreak="nu", - unicodeslot=0x1106F, + unicodeslot=0x118E9, }, - [0x11080]={ - category="mn", - description="KAITHI SIGN CANDRABINDU", - direction="nsm", - linebreak="cm", - unicodeslot=0x11080, + [0x118EA]={ + category="no", + description="WARANG CITI NUMBER TEN", + direction="l", + linebreak="al", + unicodeslot=0x118EA, }, - [0x11081]={ - category="mn", - description="KAITHI SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11081, + [0x118EB]={ + category="no", + description="WARANG CITI NUMBER TWENTY", + direction="l", + linebreak="al", + unicodeslot=0x118EB, }, - [0x11082]={ - category="mc", - description="KAITHI SIGN VISARGA", + [0x118EC]={ + category="no", + description="WARANG CITI NUMBER THIRTY", + direction="l", + linebreak="al", + unicodeslot=0x118EC, + }, + [0x118ED]={ + category="no", + description="WARANG CITI NUMBER FORTY", + direction="l", + linebreak="al", + unicodeslot=0x118ED, + }, + [0x118EE]={ + category="no", + description="WARANG CITI NUMBER FIFTY", + direction="l", + linebreak="al", + unicodeslot=0x118EE, + }, + [0x118EF]={ + category="no", + description="WARANG CITI NUMBER SIXTY", + direction="l", + linebreak="al", + unicodeslot=0x118EF, + }, + [0x118F0]={ + category="no", + description="WARANG CITI NUMBER SEVENTY", + direction="l", + linebreak="al", + unicodeslot=0x118F0, + }, + [0x118F1]={ + category="no", + description="WARANG CITI NUMBER EIGHTY", + direction="l", + linebreak="al", + unicodeslot=0x118F1, + }, + [0x118F2]={ + category="no", + description="WARANG CITI NUMBER NINETY", direction="l", - linebreak="cm", - unicodeslot=0x11082, + linebreak="al", + unicodeslot=0x118F2, }, - [0x11083]={ + [0x118FF]={ category="lo", - description="KAITHI LETTER A", + description="WARANG CITI OM", direction="l", linebreak="al", - unicodeslot=0x11083, + unicodeslot=0x118FF, }, - [0x11084]={ + [0x11AC0]={ category="lo", - description="KAITHI LETTER AA", + description="PAU CIN HAU LETTER PA", direction="l", linebreak="al", - unicodeslot=0x11084, + unicodeslot=0x11AC0, }, - [0x11085]={ + [0x11AC1]={ category="lo", - description="KAITHI LETTER I", + description="PAU CIN HAU LETTER KA", direction="l", linebreak="al", - unicodeslot=0x11085, + unicodeslot=0x11AC1, }, - [0x11086]={ + [0x11AC2]={ category="lo", - description="KAITHI LETTER II", + description="PAU CIN HAU LETTER LA", direction="l", linebreak="al", - unicodeslot=0x11086, + unicodeslot=0x11AC2, }, - [0x11087]={ + [0x11AC3]={ category="lo", - description="KAITHI LETTER U", + description="PAU CIN HAU LETTER MA", direction="l", linebreak="al", - unicodeslot=0x11087, + unicodeslot=0x11AC3, }, - [0x11088]={ + [0x11AC4]={ category="lo", - description="KAITHI LETTER UU", + description="PAU CIN HAU LETTER DA", direction="l", linebreak="al", - unicodeslot=0x11088, + unicodeslot=0x11AC4, }, - [0x11089]={ + [0x11AC5]={ category="lo", - description="KAITHI LETTER E", + description="PAU CIN HAU LETTER ZA", direction="l", linebreak="al", - unicodeslot=0x11089, + unicodeslot=0x11AC5, }, - [0x1108A]={ + [0x11AC6]={ category="lo", - description="KAITHI LETTER AI", + description="PAU CIN HAU LETTER VA", direction="l", linebreak="al", - unicodeslot=0x1108A, + unicodeslot=0x11AC6, }, - [0x1108B]={ + [0x11AC7]={ category="lo", - description="KAITHI LETTER O", + description="PAU CIN HAU LETTER NGA", direction="l", linebreak="al", - unicodeslot=0x1108B, + unicodeslot=0x11AC7, }, - [0x1108C]={ + [0x11AC8]={ category="lo", - description="KAITHI LETTER AU", + description="PAU CIN HAU LETTER HA", direction="l", linebreak="al", - unicodeslot=0x1108C, + unicodeslot=0x11AC8, }, - [0x1108D]={ + [0x11AC9]={ category="lo", - description="KAITHI LETTER KA", + description="PAU CIN HAU LETTER GA", direction="l", linebreak="al", - unicodeslot=0x1108D, + unicodeslot=0x11AC9, }, - [0x1108E]={ + [0x11ACA]={ category="lo", - description="KAITHI LETTER KHA", + description="PAU CIN HAU LETTER KHA", direction="l", linebreak="al", - unicodeslot=0x1108E, + unicodeslot=0x11ACA, }, - [0x1108F]={ + [0x11ACB]={ category="lo", - description="KAITHI LETTER GA", + description="PAU CIN HAU LETTER SA", direction="l", linebreak="al", - unicodeslot=0x1108F, + unicodeslot=0x11ACB, }, - [0x11090]={ + [0x11ACC]={ category="lo", - description="KAITHI LETTER GHA", + description="PAU CIN HAU LETTER BA", direction="l", linebreak="al", - unicodeslot=0x11090, + unicodeslot=0x11ACC, }, - [0x11091]={ + [0x11ACD]={ category="lo", - description="KAITHI LETTER NGA", + description="PAU CIN HAU LETTER CA", direction="l", linebreak="al", - unicodeslot=0x11091, + unicodeslot=0x11ACD, }, - [0x11092]={ + [0x11ACE]={ category="lo", - description="KAITHI LETTER CA", + description="PAU CIN HAU LETTER TA", direction="l", linebreak="al", - unicodeslot=0x11092, + unicodeslot=0x11ACE, }, - [0x11093]={ + [0x11ACF]={ category="lo", - description="KAITHI LETTER CHA", + description="PAU CIN HAU LETTER THA", direction="l", linebreak="al", - unicodeslot=0x11093, + unicodeslot=0x11ACF, }, - [0x11094]={ + [0x11AD0]={ category="lo", - description="KAITHI LETTER JA", + description="PAU CIN HAU LETTER NA", direction="l", linebreak="al", - unicodeslot=0x11094, + unicodeslot=0x11AD0, }, - [0x11095]={ + [0x11AD1]={ category="lo", - description="KAITHI LETTER JHA", + description="PAU CIN HAU LETTER PHA", direction="l", linebreak="al", - unicodeslot=0x11095, + unicodeslot=0x11AD1, }, - [0x11096]={ + [0x11AD2]={ category="lo", - description="KAITHI LETTER NYA", + description="PAU CIN HAU LETTER RA", direction="l", linebreak="al", - unicodeslot=0x11096, + unicodeslot=0x11AD2, }, - [0x11097]={ + [0x11AD3]={ category="lo", - description="KAITHI LETTER TTA", + description="PAU CIN HAU LETTER FA", direction="l", linebreak="al", - unicodeslot=0x11097, + unicodeslot=0x11AD3, }, - [0x11098]={ + [0x11AD4]={ category="lo", - description="KAITHI LETTER TTHA", + description="PAU CIN HAU LETTER CHA", direction="l", linebreak="al", - unicodeslot=0x11098, + unicodeslot=0x11AD4, }, - [0x11099]={ + [0x11AD5]={ category="lo", - description="KAITHI LETTER DDA", + description="PAU CIN HAU LETTER A", direction="l", linebreak="al", - unicodeslot=0x11099, + unicodeslot=0x11AD5, }, - [0x1109A]={ + [0x11AD6]={ category="lo", - description="KAITHI LETTER DDDHA", + description="PAU CIN HAU LETTER E", direction="l", linebreak="al", - specials={ "char", 0x11099, 0x110BA }, - unicodeslot=0x1109A, + unicodeslot=0x11AD6, }, - [0x1109B]={ + [0x11AD7]={ category="lo", - description="KAITHI LETTER DDHA", + description="PAU CIN HAU LETTER I", direction="l", linebreak="al", - unicodeslot=0x1109B, + unicodeslot=0x11AD7, }, - [0x1109C]={ + [0x11AD8]={ category="lo", - description="KAITHI LETTER RHA", + description="PAU CIN HAU LETTER O", direction="l", linebreak="al", - specials={ "char", 0x1109B, 0x110BA }, - unicodeslot=0x1109C, + unicodeslot=0x11AD8, }, - [0x1109D]={ + [0x11AD9]={ category="lo", - description="KAITHI LETTER NNA", + description="PAU CIN HAU LETTER U", direction="l", linebreak="al", - unicodeslot=0x1109D, + unicodeslot=0x11AD9, }, - [0x1109E]={ + [0x11ADA]={ category="lo", - description="KAITHI LETTER TA", + description="PAU CIN HAU LETTER UA", direction="l", linebreak="al", - unicodeslot=0x1109E, + unicodeslot=0x11ADA, }, - [0x1109F]={ + [0x11ADB]={ category="lo", - description="KAITHI LETTER THA", + description="PAU CIN HAU LETTER IA", direction="l", linebreak="al", - unicodeslot=0x1109F, + unicodeslot=0x11ADB, }, - [0x110A0]={ + [0x11ADC]={ category="lo", - description="KAITHI LETTER DA", + description="PAU CIN HAU LETTER FINAL P", direction="l", linebreak="al", - unicodeslot=0x110A0, + unicodeslot=0x11ADC, }, - [0x110A1]={ + [0x11ADD]={ category="lo", - description="KAITHI LETTER DHA", + description="PAU CIN HAU LETTER FINAL K", direction="l", linebreak="al", - unicodeslot=0x110A1, + unicodeslot=0x11ADD, }, - [0x110A2]={ + [0x11ADE]={ category="lo", - description="KAITHI LETTER NA", + description="PAU CIN HAU LETTER FINAL T", direction="l", linebreak="al", - unicodeslot=0x110A2, + unicodeslot=0x11ADE, }, - [0x110A3]={ + [0x11ADF]={ category="lo", - description="KAITHI LETTER PA", + description="PAU CIN HAU LETTER FINAL M", direction="l", linebreak="al", - unicodeslot=0x110A3, + unicodeslot=0x11ADF, }, - [0x110A4]={ + [0x11AE0]={ category="lo", - description="KAITHI LETTER PHA", + description="PAU CIN HAU LETTER FINAL N", direction="l", linebreak="al", - unicodeslot=0x110A4, + unicodeslot=0x11AE0, }, - [0x110A5]={ + [0x11AE1]={ category="lo", - description="KAITHI LETTER BA", + description="PAU CIN HAU LETTER FINAL L", direction="l", linebreak="al", - unicodeslot=0x110A5, + unicodeslot=0x11AE1, }, - [0x110A6]={ + [0x11AE2]={ category="lo", - description="KAITHI LETTER BHA", + description="PAU CIN HAU LETTER FINAL W", direction="l", linebreak="al", - unicodeslot=0x110A6, + unicodeslot=0x11AE2, }, - [0x110A7]={ + [0x11AE3]={ category="lo", - description="KAITHI LETTER MA", + description="PAU CIN HAU LETTER FINAL NG", direction="l", linebreak="al", - unicodeslot=0x110A7, + unicodeslot=0x11AE3, }, - [0x110A8]={ + [0x11AE4]={ category="lo", - description="KAITHI LETTER YA", + description="PAU CIN HAU LETTER FINAL Y", direction="l", linebreak="al", - unicodeslot=0x110A8, + unicodeslot=0x11AE4, }, - [0x110A9]={ + [0x11AE5]={ category="lo", - description="KAITHI LETTER RA", + description="PAU CIN HAU RISING TONE LONG", direction="l", linebreak="al", - unicodeslot=0x110A9, + unicodeslot=0x11AE5, }, - [0x110AA]={ + [0x11AE6]={ category="lo", - description="KAITHI LETTER LA", + description="PAU CIN HAU RISING TONE", direction="l", linebreak="al", - unicodeslot=0x110AA, + unicodeslot=0x11AE6, }, - [0x110AB]={ + [0x11AE7]={ category="lo", - description="KAITHI LETTER VA", + description="PAU CIN HAU SANDHI GLOTTAL STOP", direction="l", linebreak="al", - specials={ "char", 0x110A5, 0x110BA }, - unicodeslot=0x110AB, + unicodeslot=0x11AE7, }, - [0x110AC]={ + [0x11AE8]={ category="lo", - description="KAITHI LETTER SHA", + description="PAU CIN HAU RISING TONE LONG FINAL", direction="l", linebreak="al", - unicodeslot=0x110AC, + unicodeslot=0x11AE8, }, - [0x110AD]={ + [0x11AE9]={ category="lo", - description="KAITHI LETTER SSA", + description="PAU CIN HAU RISING TONE FINAL", direction="l", linebreak="al", - unicodeslot=0x110AD, + unicodeslot=0x11AE9, }, - [0x110AE]={ + [0x11AEA]={ category="lo", - description="KAITHI LETTER SA", + description="PAU CIN HAU SANDHI GLOTTAL STOP FINAL", direction="l", linebreak="al", - unicodeslot=0x110AE, + unicodeslot=0x11AEA, }, - [0x110AF]={ + [0x11AEB]={ category="lo", - description="KAITHI LETTER HA", + description="PAU CIN HAU SANDHI TONE LONG", direction="l", linebreak="al", - unicodeslot=0x110AF, + unicodeslot=0x11AEB, }, - [0x110B0]={ - category="mc", - description="KAITHI VOWEL SIGN AA", + [0x11AEC]={ + category="lo", + description="PAU CIN HAU SANDHI TONE", direction="l", - linebreak="cm", - unicodeslot=0x110B0, + linebreak="al", + unicodeslot=0x11AEC, }, - [0x110B1]={ - category="mc", - description="KAITHI VOWEL SIGN I", + [0x11AED]={ + category="lo", + description="PAU CIN HAU SANDHI TONE LONG FINAL", direction="l", - linebreak="cm", - unicodeslot=0x110B1, + linebreak="al", + unicodeslot=0x11AED, }, - [0x110B2]={ - category="mc", - description="KAITHI VOWEL SIGN II", + [0x11AEE]={ + category="lo", + description="PAU CIN HAU SANDHI TONE FINAL", direction="l", - linebreak="cm", - unicodeslot=0x110B2, - }, - [0x110B3]={ - category="mn", - description="KAITHI VOWEL SIGN U", - direction="nsm", - linebreak="cm", - unicodeslot=0x110B3, - }, - [0x110B4]={ - category="mn", - description="KAITHI VOWEL SIGN UU", - direction="nsm", - linebreak="cm", - unicodeslot=0x110B4, - }, - [0x110B5]={ - category="mn", - description="KAITHI VOWEL SIGN E", - direction="nsm", - linebreak="cm", - unicodeslot=0x110B5, - }, - [0x110B6]={ - category="mn", - description="KAITHI VOWEL SIGN AI", - direction="nsm", - linebreak="cm", - unicodeslot=0x110B6, + linebreak="al", + unicodeslot=0x11AEE, }, - [0x110B7]={ - category="mc", - description="KAITHI VOWEL SIGN O", + [0x11AEF]={ + category="lo", + description="PAU CIN HAU MID-LEVEL TONE", direction="l", - linebreak="cm", - unicodeslot=0x110B7, + linebreak="al", + unicodeslot=0x11AEF, }, - [0x110B8]={ - category="mc", - description="KAITHI VOWEL SIGN AU", + [0x11AF0]={ + category="lo", + description="PAU CIN HAU GLOTTAL STOP VARIANT", direction="l", - linebreak="cm", - unicodeslot=0x110B8, - }, - [0x110B9]={ - category="mn", - description="KAITHI SIGN VIRAMA", - direction="nsm", - linebreak="cm", - unicodeslot=0x110B9, - }, - [0x110BA]={ - category="mn", - description="KAITHI SIGN NUKTA", - direction="nsm", - linebreak="cm", - unicodeslot=0x110BA, + linebreak="al", + unicodeslot=0x11AF0, }, - [0x110BB]={ - category="po", - description="KAITHI ABBREVIATION SIGN", + [0x11AF1]={ + category="lo", + description="PAU CIN HAU MID-LEVEL TONE LONG FINAL", direction="l", linebreak="al", - unicodeslot=0x110BB, + unicodeslot=0x11AF1, }, - [0x110BC]={ - category="po", - description="KAITHI ENUMERATION SIGN", + [0x11AF2]={ + category="lo", + description="PAU CIN HAU MID-LEVEL TONE FINAL", direction="l", linebreak="al", - unicodeslot=0x110BC, + unicodeslot=0x11AF2, }, - [0x110BD]={ - category="cf", - description="KAITHI NUMBER SIGN", + [0x11AF3]={ + category="lo", + description="PAU CIN HAU LOW-FALLING TONE LONG", direction="l", linebreak="al", - unicodeslot=0x110BD, + unicodeslot=0x11AF3, }, - [0x110BE]={ - category="po", - description="KAITHI SECTION MARK", + [0x11AF4]={ + category="lo", + description="PAU CIN HAU LOW-FALLING TONE", direction="l", - linebreak="ba", - unicodeslot=0x110BE, + linebreak="al", + unicodeslot=0x11AF4, }, - [0x110BF]={ - category="po", - description="KAITHI DOUBLE SECTION MARK", + [0x11AF5]={ + category="lo", + description="PAU CIN HAU GLOTTAL STOP", direction="l", - linebreak="ba", - unicodeslot=0x110BF, + linebreak="al", + unicodeslot=0x11AF5, }, - [0x110C0]={ - category="po", - description="KAITHI DANDA", + [0x11AF6]={ + category="lo", + description="PAU CIN HAU LOW-FALLING TONE LONG FINAL", direction="l", - linebreak="ba", - unicodeslot=0x110C0, + linebreak="al", + unicodeslot=0x11AF6, }, - [0x110C1]={ - category="po", - description="KAITHI DOUBLE DANDA", + [0x11AF7]={ + category="lo", + description="PAU CIN HAU LOW-FALLING TONE FINAL", direction="l", - linebreak="ba", - unicodeslot=0x110C1, + linebreak="al", + unicodeslot=0x11AF7, }, - [0x110D0]={ + [0x11AF8]={ category="lo", - description="SORA SOMPENG LETTER SAH", + description="PAU CIN HAU GLOTTAL STOP FINAL", direction="l", linebreak="al", - unicodeslot=0x110D0, + unicodeslot=0x11AF8, }, - [0x110D1]={ + [0x12000]={ category="lo", - description="SORA SOMPENG LETTER TAH", + description="CUNEIFORM SIGN A", direction="l", linebreak="al", - unicodeslot=0x110D1, + unicodeslot=0x12000, }, - [0x110D2]={ + [0x12001]={ category="lo", - description="SORA SOMPENG LETTER BAH", + description="CUNEIFORM SIGN A TIMES A", direction="l", linebreak="al", - unicodeslot=0x110D2, + unicodeslot=0x12001, }, - [0x110D3]={ + [0x12002]={ category="lo", - description="SORA SOMPENG LETTER CAH", + description="CUNEIFORM SIGN A TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x110D3, + unicodeslot=0x12002, }, - [0x110D4]={ + [0x12003]={ category="lo", - description="SORA SOMPENG LETTER DAH", + description="CUNEIFORM SIGN A TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x110D4, + unicodeslot=0x12003, }, - [0x110D5]={ + [0x12004]={ category="lo", - description="SORA SOMPENG LETTER GAH", + description="CUNEIFORM SIGN A TIMES HA", direction="l", linebreak="al", - unicodeslot=0x110D5, + unicodeslot=0x12004, }, - [0x110D6]={ + [0x12005]={ category="lo", - description="SORA SOMPENG LETTER MAH", + description="CUNEIFORM SIGN A TIMES IGI", direction="l", linebreak="al", - unicodeslot=0x110D6, + unicodeslot=0x12005, }, - [0x110D7]={ + [0x12006]={ category="lo", - description="SORA SOMPENG LETTER NGAH", + description="CUNEIFORM SIGN A TIMES LAGAR GUNU", direction="l", linebreak="al", - unicodeslot=0x110D7, + unicodeslot=0x12006, }, - [0x110D8]={ + [0x12007]={ category="lo", - description="SORA SOMPENG LETTER LAH", + description="CUNEIFORM SIGN A TIMES MUSH", direction="l", linebreak="al", - unicodeslot=0x110D8, + unicodeslot=0x12007, }, - [0x110D9]={ + [0x12008]={ category="lo", - description="SORA SOMPENG LETTER NAH", + description="CUNEIFORM SIGN A TIMES SAG", direction="l", linebreak="al", - unicodeslot=0x110D9, + unicodeslot=0x12008, }, - [0x110DA]={ + [0x12009]={ category="lo", - description="SORA SOMPENG LETTER VAH", + description="CUNEIFORM SIGN A0x0002", direction="l", linebreak="al", - unicodeslot=0x110DA, + unicodeslot=0x12009, }, - [0x110DB]={ + [0x1200A]={ category="lo", - description="SORA SOMPENG LETTER PAH", + description="CUNEIFORM SIGN AB", direction="l", linebreak="al", - unicodeslot=0x110DB, + unicodeslot=0x1200A, }, - [0x110DC]={ + [0x1200B]={ category="lo", - description="SORA SOMPENG LETTER YAH", + description="CUNEIFORM SIGN AB TIMES ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x110DC, + unicodeslot=0x1200B, }, - [0x110DD]={ + [0x1200C]={ category="lo", - description="SORA SOMPENG LETTER RAH", + description="CUNEIFORM SIGN AB TIMES DUN0x0003 GUNU", direction="l", linebreak="al", - unicodeslot=0x110DD, + unicodeslot=0x1200C, }, - [0x110DE]={ + [0x1200D]={ category="lo", - description="SORA SOMPENG LETTER HAH", + description="CUNEIFORM SIGN AB TIMES GAL", direction="l", linebreak="al", - unicodeslot=0x110DE, + unicodeslot=0x1200D, }, - [0x110DF]={ + [0x1200E]={ category="lo", - description="SORA SOMPENG LETTER KAH", + description="CUNEIFORM SIGN AB TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x110DF, + unicodeslot=0x1200E, }, - [0x110E0]={ + [0x1200F]={ category="lo", - description="SORA SOMPENG LETTER JAH", + description="CUNEIFORM SIGN AB TIMES HA", direction="l", linebreak="al", - unicodeslot=0x110E0, + unicodeslot=0x1200F, }, - [0x110E1]={ + [0x12010]={ category="lo", - description="SORA SOMPENG LETTER NYAH", + description="CUNEIFORM SIGN AB TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x110E1, + unicodeslot=0x12010, }, - [0x110E2]={ + [0x12011]={ category="lo", - description="SORA SOMPENG LETTER AH", + description="CUNEIFORM SIGN AB TIMES IMIN", direction="l", linebreak="al", - unicodeslot=0x110E2, + unicodeslot=0x12011, }, - [0x110E3]={ + [0x12012]={ category="lo", - description="SORA SOMPENG LETTER EEH", + description="CUNEIFORM SIGN AB TIMES LAGAB", direction="l", linebreak="al", - unicodeslot=0x110E3, + unicodeslot=0x12012, }, - [0x110E4]={ + [0x12013]={ category="lo", - description="SORA SOMPENG LETTER IH", + description="CUNEIFORM SIGN AB TIMES SHESH", direction="l", linebreak="al", - unicodeslot=0x110E4, + unicodeslot=0x12013, }, - [0x110E5]={ + [0x12014]={ category="lo", - description="SORA SOMPENG LETTER UH", + description="CUNEIFORM SIGN AB TIMES U PLUS U PLUS U", direction="l", linebreak="al", - unicodeslot=0x110E5, + unicodeslot=0x12014, }, - [0x110E6]={ + [0x12015]={ category="lo", - description="SORA SOMPENG LETTER OH", + description="CUNEIFORM SIGN AB GUNU", direction="l", linebreak="al", - unicodeslot=0x110E6, + unicodeslot=0x12015, }, - [0x110E7]={ + [0x12016]={ category="lo", - description="SORA SOMPENG LETTER EH", + description="CUNEIFORM SIGN AB0x0002", direction="l", linebreak="al", - unicodeslot=0x110E7, + unicodeslot=0x12016, }, - [0x110E8]={ + [0x12017]={ category="lo", - description="SORA SOMPENG LETTER MAE", + description="CUNEIFORM SIGN AB0x0002 TIMES BALAG", direction="l", linebreak="al", - unicodeslot=0x110E8, + unicodeslot=0x12017, }, - [0x110F0]={ - category="nd", - description="SORA SOMPENG DIGIT ZERO", + [0x12018]={ + category="lo", + description="CUNEIFORM SIGN AB0x0002 TIMES GAN0x0002 TENU", direction="l", - linebreak="nu", - unicodeslot=0x110F0, + linebreak="al", + unicodeslot=0x12018, }, - [0x110F1]={ - category="nd", - description="SORA SOMPENG DIGIT ONE", + [0x12019]={ + category="lo", + description="CUNEIFORM SIGN AB0x0002 TIMES ME PLUS EN", direction="l", - linebreak="nu", - unicodeslot=0x110F1, + linebreak="al", + unicodeslot=0x12019, }, - [0x110F2]={ - category="nd", - description="SORA SOMPENG DIGIT TWO", + [0x1201A]={ + category="lo", + description="CUNEIFORM SIGN AB0x0002 TIMES SHA0x0003", direction="l", - linebreak="nu", - unicodeslot=0x110F2, + linebreak="al", + unicodeslot=0x1201A, }, - [0x110F3]={ - category="nd", - description="SORA SOMPENG DIGIT THREE", + [0x1201B]={ + category="lo", + description="CUNEIFORM SIGN AB0x0002 TIMES TAK0x0004", direction="l", - linebreak="nu", - unicodeslot=0x110F3, + linebreak="al", + unicodeslot=0x1201B, }, - [0x110F4]={ - category="nd", - description="SORA SOMPENG DIGIT FOUR", + [0x1201C]={ + category="lo", + description="CUNEIFORM SIGN AD", direction="l", - linebreak="nu", - unicodeslot=0x110F4, + linebreak="al", + unicodeslot=0x1201C, }, - [0x110F5]={ - category="nd", - description="SORA SOMPENG DIGIT FIVE", + [0x1201D]={ + category="lo", + description="CUNEIFORM SIGN AK", direction="l", - linebreak="nu", - unicodeslot=0x110F5, + linebreak="al", + unicodeslot=0x1201D, }, - [0x110F6]={ - category="nd", - description="SORA SOMPENG DIGIT SIX", + [0x1201E]={ + category="lo", + description="CUNEIFORM SIGN AK TIMES ERIN0x0002", direction="l", - linebreak="nu", - unicodeslot=0x110F6, + linebreak="al", + unicodeslot=0x1201E, }, - [0x110F7]={ - category="nd", - description="SORA SOMPENG DIGIT SEVEN", + [0x1201F]={ + category="lo", + description="CUNEIFORM SIGN AK TIMES SHITA PLUS GISH", direction="l", - linebreak="nu", - unicodeslot=0x110F7, + linebreak="al", + unicodeslot=0x1201F, }, - [0x110F8]={ - category="nd", - description="SORA SOMPENG DIGIT EIGHT", + [0x12020]={ + category="lo", + description="CUNEIFORM SIGN AL", direction="l", - linebreak="nu", - unicodeslot=0x110F8, + linebreak="al", + unicodeslot=0x12020, }, - [0x110F9]={ - category="nd", - description="SORA SOMPENG DIGIT NINE", + [0x12021]={ + category="lo", + description="CUNEIFORM SIGN AL TIMES AL", direction="l", - linebreak="nu", - unicodeslot=0x110F9, - }, - [0x11100]={ - category="mn", - description="CHAKMA SIGN CANDRABINDU", - direction="nsm", - linebreak="cm", - unicodeslot=0x11100, - }, - [0x11101]={ - category="mn", - description="CHAKMA SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11101, - }, - [0x11102]={ - category="mn", - description="CHAKMA SIGN VISARGA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11102, + linebreak="al", + unicodeslot=0x12021, }, - [0x11103]={ + [0x12022]={ category="lo", - description="CHAKMA LETTER AA", + description="CUNEIFORM SIGN AL TIMES DIM0x0002", direction="l", linebreak="al", - unicodeslot=0x11103, + unicodeslot=0x12022, }, - [0x11104]={ + [0x12023]={ category="lo", - description="CHAKMA LETTER I", + description="CUNEIFORM SIGN AL TIMES GISH", direction="l", linebreak="al", - unicodeslot=0x11104, + unicodeslot=0x12023, }, - [0x11105]={ + [0x12024]={ category="lo", - description="CHAKMA LETTER U", + description="CUNEIFORM SIGN AL TIMES HA", direction="l", linebreak="al", - unicodeslot=0x11105, + unicodeslot=0x12024, }, - [0x11106]={ + [0x12025]={ category="lo", - description="CHAKMA LETTER E", + description="CUNEIFORM SIGN AL TIMES KAD0x0003", direction="l", linebreak="al", - unicodeslot=0x11106, + unicodeslot=0x12025, }, - [0x11107]={ + [0x12026]={ category="lo", - description="CHAKMA LETTER KAA", + description="CUNEIFORM SIGN AL TIMES KI", direction="l", linebreak="al", - unicodeslot=0x11107, + unicodeslot=0x12026, }, - [0x11108]={ + [0x12027]={ category="lo", - description="CHAKMA LETTER KHAA", + description="CUNEIFORM SIGN AL TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x11108, + unicodeslot=0x12027, }, - [0x11109]={ + [0x12028]={ category="lo", - description="CHAKMA LETTER GAA", + description="CUNEIFORM SIGN AL TIMES USH", direction="l", linebreak="al", - unicodeslot=0x11109, + unicodeslot=0x12028, }, - [0x1110A]={ + [0x12029]={ category="lo", - description="CHAKMA LETTER GHAA", + description="CUNEIFORM SIGN ALAN", direction="l", linebreak="al", - unicodeslot=0x1110A, + unicodeslot=0x12029, }, - [0x1110B]={ + [0x1202A]={ category="lo", - description="CHAKMA LETTER NGAA", + description="CUNEIFORM SIGN ALEPH", direction="l", linebreak="al", - unicodeslot=0x1110B, + unicodeslot=0x1202A, }, - [0x1110C]={ + [0x1202B]={ category="lo", - description="CHAKMA LETTER CAA", + description="CUNEIFORM SIGN AMAR", direction="l", linebreak="al", - unicodeslot=0x1110C, + unicodeslot=0x1202B, }, - [0x1110D]={ + [0x1202C]={ category="lo", - description="CHAKMA LETTER CHAA", + description="CUNEIFORM SIGN AMAR TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1110D, + unicodeslot=0x1202C, }, - [0x1110E]={ + [0x1202D]={ category="lo", - description="CHAKMA LETTER JAA", + description="CUNEIFORM SIGN AN", direction="l", linebreak="al", - unicodeslot=0x1110E, + unicodeslot=0x1202D, }, - [0x1110F]={ + [0x1202E]={ category="lo", - description="CHAKMA LETTER JHAA", + description="CUNEIFORM SIGN AN OVER AN", direction="l", linebreak="al", - unicodeslot=0x1110F, + unicodeslot=0x1202E, }, - [0x11110]={ + [0x1202F]={ category="lo", - description="CHAKMA LETTER NYAA", + description="CUNEIFORM SIGN AN THREE TIMES", direction="l", linebreak="al", - unicodeslot=0x11110, + unicodeslot=0x1202F, }, - [0x11111]={ + [0x12030]={ category="lo", - description="CHAKMA LETTER TTAA", + description="CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA", direction="l", linebreak="al", - unicodeslot=0x11111, + unicodeslot=0x12030, }, - [0x11112]={ + [0x12031]={ category="lo", - description="CHAKMA LETTER TTHAA", + description="CUNEIFORM SIGN AN PLUS NAGA SQUARED", direction="l", linebreak="al", - unicodeslot=0x11112, + unicodeslot=0x12031, }, - [0x11113]={ + [0x12032]={ category="lo", - description="CHAKMA LETTER DDAA", + description="CUNEIFORM SIGN ANSHE", direction="l", linebreak="al", - unicodeslot=0x11113, + unicodeslot=0x12032, }, - [0x11114]={ + [0x12033]={ category="lo", - description="CHAKMA LETTER DDHAA", + description="CUNEIFORM SIGN APIN", direction="l", linebreak="al", - unicodeslot=0x11114, + unicodeslot=0x12033, }, - [0x11115]={ + [0x12034]={ category="lo", - description="CHAKMA LETTER NNAA", + description="CUNEIFORM SIGN ARAD", direction="l", linebreak="al", - unicodeslot=0x11115, + unicodeslot=0x12034, }, - [0x11116]={ + [0x12035]={ category="lo", - description="CHAKMA LETTER TAA", + description="CUNEIFORM SIGN ARAD TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x11116, + mathclass="ordinary", + mathname="backprime", + unicodeslot=0x12035, }, - [0x11117]={ + [0x12036]={ category="lo", - description="CHAKMA LETTER THAA", + description="CUNEIFORM SIGN ARKAB", direction="l", linebreak="al", - unicodeslot=0x11117, + unicodeslot=0x12036, }, - [0x11118]={ + [0x12037]={ category="lo", - description="CHAKMA LETTER DAA", + description="CUNEIFORM SIGN ASAL0x0002", direction="l", linebreak="al", - unicodeslot=0x11118, + unicodeslot=0x12037, }, - [0x11119]={ + [0x12038]={ category="lo", - description="CHAKMA LETTER DHAA", + description="CUNEIFORM SIGN ASH", direction="l", linebreak="al", - unicodeslot=0x11119, + unicodeslot=0x12038, }, - [0x1111A]={ + [0x12039]={ category="lo", - description="CHAKMA LETTER NAA", + description="CUNEIFORM SIGN ASH ZIDA TENU", direction="l", linebreak="al", - unicodeslot=0x1111A, + unicodeslot=0x12039, }, - [0x1111B]={ + [0x1203A]={ category="lo", - description="CHAKMA LETTER PAA", + description="CUNEIFORM SIGN ASH KABA TENU", direction="l", linebreak="al", - unicodeslot=0x1111B, + unicodeslot=0x1203A, }, - [0x1111C]={ + [0x1203B]={ category="lo", - description="CHAKMA LETTER PHAA", + description="CUNEIFORM SIGN ASH OVER ASH TUG0x0002 OVER TUG0x0002 TUG0x0002 OVER TUG0x0002 PAP", direction="l", linebreak="al", - unicodeslot=0x1111C, + unicodeslot=0x1203B, }, - [0x1111D]={ + [0x1203C]={ category="lo", - description="CHAKMA LETTER BAA", + description="CUNEIFORM SIGN ASH OVER ASH OVER ASH", direction="l", linebreak="al", - unicodeslot=0x1111D, + unicodeslot=0x1203C, }, - [0x1111E]={ + [0x1203D]={ category="lo", - description="CHAKMA LETTER BHAA", + description="CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH", direction="l", linebreak="al", - unicodeslot=0x1111E, + unicodeslot=0x1203D, }, - [0x1111F]={ + [0x1203E]={ category="lo", - description="CHAKMA LETTER MAA", + description="CUNEIFORM SIGN ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x1111F, + unicodeslot=0x1203E, }, - [0x11120]={ + [0x1203F]={ category="lo", - description="CHAKMA LETTER YYAA", + description="CUNEIFORM SIGN ASHGAB", direction="l", linebreak="al", - unicodeslot=0x11120, + unicodeslot=0x1203F, }, - [0x11121]={ + [0x12040]={ category="lo", - description="CHAKMA LETTER YAA", + description="CUNEIFORM SIGN BA", direction="l", linebreak="al", - unicodeslot=0x11121, + unicodeslot=0x12040, }, - [0x11122]={ + [0x12041]={ category="lo", - description="CHAKMA LETTER RAA", + description="CUNEIFORM SIGN BAD", direction="l", linebreak="al", - unicodeslot=0x11122, + unicodeslot=0x12041, }, - [0x11123]={ + [0x12042]={ category="lo", - description="CHAKMA LETTER LAA", + description="CUNEIFORM SIGN BAG0x0003", direction="l", linebreak="al", - unicodeslot=0x11123, + unicodeslot=0x12042, }, - [0x11124]={ + [0x12043]={ category="lo", - description="CHAKMA LETTER WAA", + description="CUNEIFORM SIGN BAHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x11124, + unicodeslot=0x12043, }, - [0x11125]={ + [0x12044]={ category="lo", - description="CHAKMA LETTER SAA", + description="CUNEIFORM SIGN BAL", direction="l", linebreak="al", - unicodeslot=0x11125, + unicodeslot=0x12044, }, - [0x11126]={ + [0x12045]={ category="lo", - description="CHAKMA LETTER HAA", + description="CUNEIFORM SIGN BAL OVER BAL", direction="l", linebreak="al", - unicodeslot=0x11126, - }, - [0x11127]={ - category="mn", - description="CHAKMA VOWEL SIGN A", - direction="nsm", - linebreak="cm", - unicodeslot=0x11127, - }, - [0x11128]={ - category="mn", - description="CHAKMA VOWEL SIGN I", - direction="nsm", - linebreak="cm", - unicodeslot=0x11128, - }, - [0x11129]={ - category="mn", - description="CHAKMA VOWEL SIGN II", - direction="nsm", - linebreak="cm", - unicodeslot=0x11129, - }, - [0x1112A]={ - category="mn", - description="CHAKMA VOWEL SIGN U", - direction="nsm", - linebreak="cm", - unicodeslot=0x1112A, - }, - [0x1112B]={ - category="mn", - description="CHAKMA VOWEL SIGN UU", - direction="nsm", - linebreak="cm", - unicodeslot=0x1112B, + unicodeslot=0x12045, }, - [0x1112C]={ - category="mc", - description="CHAKMA VOWEL SIGN E", + [0x12046]={ + category="lo", + description="CUNEIFORM SIGN BALAG", direction="l", - linebreak="cm", - unicodeslot=0x1112C, - }, - [0x1112D]={ - category="mn", - description="CHAKMA VOWEL SIGN AI", - direction="nsm", - linebreak="cm", - unicodeslot=0x1112D, - }, - [0x1112E]={ - category="mn", - description="CHAKMA VOWEL SIGN O", - direction="nsm", - linebreak="cm", - specials={ "char", 0x11131, 0x11127 }, - unicodeslot=0x1112E, - }, - [0x1112F]={ - category="mn", - description="CHAKMA VOWEL SIGN AU", - direction="nsm", - linebreak="cm", - specials={ "char", 0x11132, 0x11127 }, - unicodeslot=0x1112F, - }, - [0x11130]={ - category="mn", - description="CHAKMA VOWEL SIGN OI", - direction="nsm", - linebreak="cm", - unicodeslot=0x11130, - }, - [0x11131]={ - category="mn", - description="CHAKMA O MARK", - direction="nsm", - linebreak="cm", - unicodeslot=0x11131, - }, - [0x11132]={ - category="mn", - description="CHAKMA AU MARK", - direction="nsm", - linebreak="cm", - unicodeslot=0x11132, - }, - [0x11133]={ - category="mn", - description="CHAKMA VIRAMA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11133, - }, - [0x11134]={ - category="mn", - description="CHAKMA MAAYYAA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11134, + linebreak="al", + unicodeslot=0x12046, }, - [0x11136]={ - category="nd", - description="CHAKMA DIGIT ZERO", + [0x12047]={ + category="lo", + description="CUNEIFORM SIGN BAR", direction="l", - linebreak="nu", - unicodeslot=0x11136, + linebreak="al", + unicodeslot=0x12047, }, - [0x11137]={ - category="nd", - description="CHAKMA DIGIT ONE", + [0x12048]={ + category="lo", + description="CUNEIFORM SIGN BARA0x0002", direction="l", - linebreak="nu", - unicodeslot=0x11137, + linebreak="al", + unicodeslot=0x12048, }, - [0x11138]={ - category="nd", - description="CHAKMA DIGIT TWO", + [0x12049]={ + category="lo", + description="CUNEIFORM SIGN BI", direction="l", - linebreak="nu", - unicodeslot=0x11138, + linebreak="al", + unicodeslot=0x12049, }, - [0x11139]={ - category="nd", - description="CHAKMA DIGIT THREE", + [0x1204A]={ + category="lo", + description="CUNEIFORM SIGN BI TIMES A", direction="l", - linebreak="nu", - unicodeslot=0x11139, + linebreak="al", + unicodeslot=0x1204A, }, - [0x1113A]={ - category="nd", - description="CHAKMA DIGIT FOUR", + [0x1204B]={ + category="lo", + description="CUNEIFORM SIGN BI TIMES GAR", direction="l", - linebreak="nu", - unicodeslot=0x1113A, + linebreak="al", + unicodeslot=0x1204B, }, - [0x1113B]={ - category="nd", - description="CHAKMA DIGIT FIVE", + [0x1204C]={ + category="lo", + description="CUNEIFORM SIGN BI TIMES IGI GUNU", direction="l", - linebreak="nu", - unicodeslot=0x1113B, + linebreak="al", + unicodeslot=0x1204C, }, - [0x1113C]={ - category="nd", - description="CHAKMA DIGIT SIX", + [0x1204D]={ + category="lo", + description="CUNEIFORM SIGN BU", direction="l", - linebreak="nu", - unicodeslot=0x1113C, + linebreak="al", + unicodeslot=0x1204D, }, - [0x1113D]={ - category="nd", - description="CHAKMA DIGIT SEVEN", + [0x1204E]={ + category="lo", + description="CUNEIFORM SIGN BU OVER BU AB", direction="l", - linebreak="nu", - unicodeslot=0x1113D, + linebreak="al", + unicodeslot=0x1204E, }, - [0x1113E]={ - category="nd", - description="CHAKMA DIGIT EIGHT", + [0x1204F]={ + category="lo", + description="CUNEIFORM SIGN BU OVER BU UN", direction="l", - linebreak="nu", - unicodeslot=0x1113E, + linebreak="al", + unicodeslot=0x1204F, }, - [0x1113F]={ - category="nd", - description="CHAKMA DIGIT NINE", + [0x12050]={ + category="lo", + description="CUNEIFORM SIGN BU CROSSING BU", direction="l", - linebreak="nu", - unicodeslot=0x1113F, + linebreak="al", + unicodeslot=0x12050, }, - [0x11140]={ - category="po", - description="CHAKMA SECTION MARK", + [0x12051]={ + category="lo", + description="CUNEIFORM SIGN BULUG", direction="l", - linebreak="ba", - unicodeslot=0x11140, + linebreak="al", + unicodeslot=0x12051, }, - [0x11141]={ - category="po", - description="CHAKMA DANDA", + [0x12052]={ + category="lo", + description="CUNEIFORM SIGN BULUG OVER BULUG", direction="l", - linebreak="ba", - unicodeslot=0x11141, + linebreak="al", + unicodeslot=0x12052, }, - [0x11142]={ - category="po", - description="CHAKMA DOUBLE DANDA", + [0x12053]={ + category="lo", + description="CUNEIFORM SIGN BUR", direction="l", - linebreak="ba", - unicodeslot=0x11142, + linebreak="al", + unicodeslot=0x12053, }, - [0x11143]={ - category="po", - description="CHAKMA QUESTION MARK", + [0x12054]={ + category="lo", + description="CUNEIFORM SIGN BUR0x0002", direction="l", - linebreak="ba", - unicodeslot=0x11143, + linebreak="al", + unicodeslot=0x12054, }, - [0x11180]={ - category="mn", - description="SHARADA SIGN CANDRABINDU", - direction="nsm", - linebreak="cm", - unicodeslot=0x11180, + [0x12055]={ + category="lo", + description="CUNEIFORM SIGN DA", + direction="l", + linebreak="al", + unicodeslot=0x12055, }, - [0x11181]={ - category="mn", - description="SHARADA SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x11181, + [0x12056]={ + category="lo", + description="CUNEIFORM SIGN DAG", + direction="l", + linebreak="al", + unicodeslot=0x12056, }, - [0x11182]={ - category="mc", - description="SHARADA SIGN VISARGA", + [0x12057]={ + category="lo", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES A PLUS MASH", direction="l", - linebreak="cm", - unicodeslot=0x11182, + linebreak="al", + unicodeslot=0x12057, }, - [0x11183]={ + [0x12058]={ category="lo", - description="SHARADA LETTER A", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES AMAR", direction="l", linebreak="al", - unicodeslot=0x11183, + unicodeslot=0x12058, }, - [0x11184]={ + [0x12059]={ category="lo", - description="SHARADA LETTER AA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BALAG", direction="l", linebreak="al", - unicodeslot=0x11184, + unicodeslot=0x12059, }, - [0x11185]={ + [0x1205A]={ category="lo", - description="SHARADA LETTER I", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BI", direction="l", linebreak="al", - unicodeslot=0x11185, + unicodeslot=0x1205A, }, - [0x11186]={ + [0x1205B]={ category="lo", - description="SHARADA LETTER II", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA", direction="l", linebreak="al", - unicodeslot=0x11186, + unicodeslot=0x1205B, }, - [0x11187]={ + [0x1205C]={ category="lo", - description="SHARADA LETTER U", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA PLUS MASH", direction="l", linebreak="al", - unicodeslot=0x11187, + unicodeslot=0x1205C, }, - [0x11188]={ + [0x1205D]={ category="lo", - description="SHARADA LETTER UU", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GI", direction="l", linebreak="al", - unicodeslot=0x11188, + unicodeslot=0x1205D, }, - [0x11189]={ + [0x1205E]={ category="lo", - description="SHARADA LETTER VOCALIC R", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GIR0x0002", direction="l", linebreak="al", - unicodeslot=0x11189, + unicodeslot=0x1205E, }, - [0x1118A]={ + [0x1205F]={ category="lo", - description="SHARADA LETTER VOCALIC RR", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x1118A, + unicodeslot=0x1205F, }, - [0x1118B]={ + [0x12060]={ category="lo", - description="SHARADA LETTER VOCALIC L", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES HA", direction="l", linebreak="al", - unicodeslot=0x1118B, + unicodeslot=0x12060, }, - [0x1118C]={ + [0x12061]={ category="lo", - description="SHARADA LETTER VOCALIC LL", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR", direction="l", linebreak="al", - unicodeslot=0x1118C, + unicodeslot=0x12061, }, - [0x1118D]={ + [0x12062]={ category="lo", - description="SHARADA LETTER E", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR PLUS LU", direction="l", linebreak="al", - unicodeslot=0x1118D, + unicodeslot=0x12062, }, - [0x1118E]={ + [0x12063]={ category="lo", - description="SHARADA LETTER AI", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES KAK", direction="l", linebreak="al", - unicodeslot=0x1118E, + unicodeslot=0x12063, }, - [0x1118F]={ + [0x12064]={ category="lo", - description="SHARADA LETTER O", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LA", direction="l", linebreak="al", - unicodeslot=0x1118F, + unicodeslot=0x12064, }, - [0x11190]={ + [0x12065]={ category="lo", - description="SHARADA LETTER AU", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU", direction="l", linebreak="al", - unicodeslot=0x11190, + unicodeslot=0x12065, }, - [0x11191]={ + [0x12066]={ category="lo", - description="SHARADA LETTER KA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU PLUS MASH0x0002", direction="l", linebreak="al", - unicodeslot=0x11191, + unicodeslot=0x12066, }, - [0x11192]={ + [0x12067]={ category="lo", - description="SHARADA LETTER KHA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LUM", direction="l", linebreak="al", - unicodeslot=0x11192, + unicodeslot=0x12067, }, - [0x11193]={ + [0x12068]={ category="lo", - description="SHARADA LETTER GA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES NE", direction="l", linebreak="al", - unicodeslot=0x11193, + unicodeslot=0x12068, }, - [0x11194]={ + [0x12069]={ category="lo", - description="SHARADA LETTER GHA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES PAP PLUS PAP", direction="l", linebreak="al", - unicodeslot=0x11194, + unicodeslot=0x12069, }, - [0x11195]={ + [0x1206A]={ category="lo", - description="SHARADA LETTER NGA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES SI", direction="l", linebreak="al", - unicodeslot=0x11195, + unicodeslot=0x1206A, }, - [0x11196]={ + [0x1206B]={ category="lo", - description="SHARADA LETTER CA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x11196, + unicodeslot=0x1206B, }, - [0x11197]={ + [0x1206C]={ category="lo", - description="SHARADA LETTER CHA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES U0x0002 PLUS GIR0x0002", direction="l", linebreak="al", - unicodeslot=0x11197, + unicodeslot=0x1206C, }, - [0x11198]={ + [0x1206D]={ category="lo", - description="SHARADA LETTER JA", + description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES USH", direction="l", linebreak="al", - unicodeslot=0x11198, + unicodeslot=0x1206D, }, - [0x11199]={ + [0x1206E]={ category="lo", - description="SHARADA LETTER JHA", + description="CUNEIFORM SIGN DAM", direction="l", linebreak="al", - unicodeslot=0x11199, + unicodeslot=0x1206E, }, - [0x1119A]={ + [0x1206F]={ category="lo", - description="SHARADA LETTER NYA", + description="CUNEIFORM SIGN DAR", direction="l", linebreak="al", - unicodeslot=0x1119A, + unicodeslot=0x1206F, }, - [0x1119B]={ + [0x12070]={ category="lo", - description="SHARADA LETTER TTA", + description="CUNEIFORM SIGN DARA0x0003", direction="l", linebreak="al", - unicodeslot=0x1119B, + unicodeslot=0x12070, }, - [0x1119C]={ + [0x12071]={ category="lo", - description="SHARADA LETTER TTHA", + description="CUNEIFORM SIGN DARA0x0004", direction="l", linebreak="al", - unicodeslot=0x1119C, + unicodeslot=0x12071, }, - [0x1119D]={ + [0x12072]={ category="lo", - description="SHARADA LETTER DDA", + description="CUNEIFORM SIGN DI", direction="l", linebreak="al", - unicodeslot=0x1119D, + unicodeslot=0x12072, }, - [0x1119E]={ + [0x12073]={ category="lo", - description="SHARADA LETTER DDHA", + description="CUNEIFORM SIGN DIB", direction="l", linebreak="al", - unicodeslot=0x1119E, + unicodeslot=0x12073, }, - [0x1119F]={ + [0x12074]={ category="lo", - description="SHARADA LETTER NNA", + description="CUNEIFORM SIGN DIM", direction="l", linebreak="al", - unicodeslot=0x1119F, + unicodeslot=0x12074, }, - [0x111A0]={ + [0x12075]={ category="lo", - description="SHARADA LETTER TA", + description="CUNEIFORM SIGN DIM TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x111A0, + unicodeslot=0x12075, }, - [0x111A1]={ + [0x12076]={ category="lo", - description="SHARADA LETTER THA", + description="CUNEIFORM SIGN DIM0x0002", direction="l", linebreak="al", - unicodeslot=0x111A1, + unicodeslot=0x12076, }, - [0x111A2]={ + [0x12077]={ category="lo", - description="SHARADA LETTER DA", + description="CUNEIFORM SIGN DIN", direction="l", linebreak="al", - unicodeslot=0x111A2, + unicodeslot=0x12077, }, - [0x111A3]={ + [0x12078]={ category="lo", - description="SHARADA LETTER DHA", + description="CUNEIFORM SIGN DIN KASKAL U GUNU DISH", direction="l", linebreak="al", - unicodeslot=0x111A3, + unicodeslot=0x12078, }, - [0x111A4]={ + [0x12079]={ category="lo", - description="SHARADA LETTER NA", + description="CUNEIFORM SIGN DISH", direction="l", linebreak="al", - unicodeslot=0x111A4, + unicodeslot=0x12079, }, - [0x111A5]={ + [0x1207A]={ category="lo", - description="SHARADA LETTER PA", + description="CUNEIFORM SIGN DU", direction="l", linebreak="al", - unicodeslot=0x111A5, + unicodeslot=0x1207A, }, - [0x111A6]={ + [0x1207B]={ category="lo", - description="SHARADA LETTER PHA", + description="CUNEIFORM SIGN DU OVER DU", direction="l", linebreak="al", - unicodeslot=0x111A6, + unicodeslot=0x1207B, }, - [0x111A7]={ + [0x1207C]={ category="lo", - description="SHARADA LETTER BA", + description="CUNEIFORM SIGN DU GUNU", direction="l", linebreak="al", - unicodeslot=0x111A7, + unicodeslot=0x1207C, }, - [0x111A8]={ + [0x1207D]={ category="lo", - description="SHARADA LETTER BHA", + description="CUNEIFORM SIGN DU SHESHIG", direction="l", linebreak="al", - unicodeslot=0x111A8, + unicodeslot=0x1207D, }, - [0x111A9]={ + [0x1207E]={ category="lo", - description="SHARADA LETTER MA", + description="CUNEIFORM SIGN DUB", direction="l", linebreak="al", - unicodeslot=0x111A9, + unicodeslot=0x1207E, }, - [0x111AA]={ + [0x1207F]={ category="lo", - description="SHARADA LETTER YA", + description="CUNEIFORM SIGN DUB TIMES ESH0x0002", direction="l", linebreak="al", - unicodeslot=0x111AA, + unicodeslot=0x1207F, }, - [0x111AB]={ + [0x12080]={ category="lo", - description="SHARADA LETTER RA", + description="CUNEIFORM SIGN DUB0x0002", direction="l", linebreak="al", - unicodeslot=0x111AB, + unicodeslot=0x12080, }, - [0x111AC]={ + [0x12081]={ category="lo", - description="SHARADA LETTER LA", + description="CUNEIFORM SIGN DUG", direction="l", linebreak="al", - unicodeslot=0x111AC, + unicodeslot=0x12081, }, - [0x111AD]={ + [0x12082]={ category="lo", - description="SHARADA LETTER LLA", + description="CUNEIFORM SIGN DUGUD", direction="l", linebreak="al", - unicodeslot=0x111AD, + unicodeslot=0x12082, }, - [0x111AE]={ + [0x12083]={ category="lo", - description="SHARADA LETTER VA", + description="CUNEIFORM SIGN DUH", direction="l", linebreak="al", - unicodeslot=0x111AE, + unicodeslot=0x12083, }, - [0x111AF]={ + [0x12084]={ category="lo", - description="SHARADA LETTER SHA", + description="CUNEIFORM SIGN DUN", direction="l", linebreak="al", - unicodeslot=0x111AF, + unicodeslot=0x12084, }, - [0x111B0]={ + [0x12085]={ category="lo", - description="SHARADA LETTER SSA", + description="CUNEIFORM SIGN DUN0x0003", direction="l", linebreak="al", - unicodeslot=0x111B0, + unicodeslot=0x12085, }, - [0x111B1]={ + [0x12086]={ category="lo", - description="SHARADA LETTER SA", + description="CUNEIFORM SIGN DUN0x0003 GUNU", direction="l", linebreak="al", - unicodeslot=0x111B1, + unicodeslot=0x12086, }, - [0x111B2]={ + [0x12087]={ category="lo", - description="SHARADA LETTER HA", + description="CUNEIFORM SIGN DUN0x0003 GUNU GUNU", direction="l", linebreak="al", - unicodeslot=0x111B2, + unicodeslot=0x12087, }, - [0x111B3]={ - category="mc", - description="SHARADA VOWEL SIGN AA", + [0x12088]={ + category="lo", + description="CUNEIFORM SIGN DUN0x0004", direction="l", - linebreak="cm", - unicodeslot=0x111B3, + linebreak="al", + unicodeslot=0x12088, }, - [0x111B4]={ - category="mc", - description="SHARADA VOWEL SIGN I", + [0x12089]={ + category="lo", + description="CUNEIFORM SIGN DUR0x0002", direction="l", - linebreak="cm", - unicodeslot=0x111B4, + linebreak="al", + unicodeslot=0x12089, }, - [0x111B5]={ - category="mc", - description="SHARADA VOWEL SIGN II", + [0x1208A]={ + category="lo", + description="CUNEIFORM SIGN E", direction="l", - linebreak="cm", - unicodeslot=0x111B5, - }, - [0x111B6]={ - category="mn", - description="SHARADA VOWEL SIGN U", - direction="nsm", - linebreak="cm", - unicodeslot=0x111B6, - }, - [0x111B7]={ - category="mn", - description="SHARADA VOWEL SIGN UU", - direction="nsm", - linebreak="cm", - unicodeslot=0x111B7, - }, - [0x111B8]={ - category="mn", - description="SHARADA VOWEL SIGN VOCALIC R", - direction="nsm", - linebreak="cm", - unicodeslot=0x111B8, - }, - [0x111B9]={ - category="mn", - description="SHARADA VOWEL SIGN VOCALIC RR", - direction="nsm", - linebreak="cm", - unicodeslot=0x111B9, - }, - [0x111BA]={ - category="mn", - description="SHARADA VOWEL SIGN VOCALIC L", - direction="nsm", - linebreak="cm", - unicodeslot=0x111BA, - }, - [0x111BB]={ - category="mn", - description="SHARADA VOWEL SIGN VOCALIC LL", - direction="nsm", - linebreak="cm", - unicodeslot=0x111BB, - }, - [0x111BC]={ - category="mn", - description="SHARADA VOWEL SIGN E", - direction="nsm", - linebreak="cm", - unicodeslot=0x111BC, - }, - [0x111BD]={ - category="mn", - description="SHARADA VOWEL SIGN AI", - direction="nsm", - linebreak="cm", - unicodeslot=0x111BD, - }, - [0x111BE]={ - category="mn", - description="SHARADA VOWEL SIGN O", - direction="nsm", - linebreak="cm", - unicodeslot=0x111BE, + linebreak="al", + unicodeslot=0x1208A, }, - [0x111BF]={ - category="mc", - description="SHARADA VOWEL SIGN AU", + [0x1208B]={ + category="lo", + description="CUNEIFORM SIGN E TIMES PAP", direction="l", - linebreak="cm", - unicodeslot=0x111BF, + linebreak="al", + unicodeslot=0x1208B, }, - [0x111C0]={ - category="mc", - description="SHARADA SIGN VIRAMA", + [0x1208C]={ + category="lo", + description="CUNEIFORM SIGN E OVER E NUN OVER NUN", direction="l", - linebreak="cm", - unicodeslot=0x111C0, + linebreak="al", + unicodeslot=0x1208C, }, - [0x111C1]={ + [0x1208D]={ category="lo", - description="SHARADA SIGN AVAGRAHA", + description="CUNEIFORM SIGN E0x0002", direction="l", linebreak="al", - unicodeslot=0x111C1, + unicodeslot=0x1208D, }, - [0x111C2]={ + [0x1208E]={ category="lo", - description="SHARADA SIGN JIHVAMULIYA", + description="CUNEIFORM SIGN E0x0002 TIMES A PLUS HA PLUS DA", direction="l", linebreak="al", - unicodeslot=0x111C2, + unicodeslot=0x1208E, }, - [0x111C3]={ + [0x1208F]={ category="lo", - description="SHARADA SIGN UPADHMANIYA", + description="CUNEIFORM SIGN E0x0002 TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x111C3, + unicodeslot=0x1208F, }, - [0x111C4]={ + [0x12090]={ category="lo", - description="SHARADA OM", + description="CUNEIFORM SIGN E0x0002 TIMES MI", direction="l", linebreak="al", - unicodeslot=0x111C4, + unicodeslot=0x12090, }, - [0x111C5]={ - category="po", - description="SHARADA DANDA", + [0x12091]={ + category="lo", + description="CUNEIFORM SIGN E0x0002 TIMES SAL", direction="l", - linebreak="ba", - unicodeslot=0x111C5, + linebreak="al", + unicodeslot=0x12091, }, - [0x111C6]={ - category="po", - description="SHARADA DOUBLE DANDA", + [0x12092]={ + category="lo", + description="CUNEIFORM SIGN E0x0002 TIMES SHE", direction="l", - linebreak="ba", - unicodeslot=0x111C6, + linebreak="al", + unicodeslot=0x12092, }, - [0x111C7]={ - category="po", - description="SHARADA ABBREVIATION SIGN", + [0x12093]={ + category="lo", + description="CUNEIFORM SIGN E0x0002 TIMES U", direction="l", linebreak="al", - unicodeslot=0x111C7, + unicodeslot=0x12093, }, - [0x111C8]={ - category="po", - description="SHARADA SEPARATOR", + [0x12094]={ + category="lo", + description="CUNEIFORM SIGN EDIN", direction="l", - linebreak="ba", - unicodeslot=0x111C8, + linebreak="al", + unicodeslot=0x12094, }, - [0x111D0]={ - category="nd", - description="SHARADA DIGIT ZERO", + [0x12095]={ + category="lo", + description="CUNEIFORM SIGN EGIR", direction="l", - linebreak="nu", - unicodeslot=0x111D0, + linebreak="al", + unicodeslot=0x12095, }, - [0x111D1]={ - category="nd", - description="SHARADA DIGIT ONE", + [0x12096]={ + category="lo", + description="CUNEIFORM SIGN EL", direction="l", - linebreak="nu", - unicodeslot=0x111D1, + linebreak="al", + unicodeslot=0x12096, }, - [0x111D2]={ - category="nd", - description="SHARADA DIGIT TWO", + [0x12097]={ + category="lo", + description="CUNEIFORM SIGN EN", direction="l", - linebreak="nu", - unicodeslot=0x111D2, + linebreak="al", + unicodeslot=0x12097, }, - [0x111D3]={ - category="nd", - description="SHARADA DIGIT THREE", + [0x12098]={ + category="lo", + description="CUNEIFORM SIGN EN TIMES GAN0x0002", direction="l", - linebreak="nu", - unicodeslot=0x111D3, + linebreak="al", + unicodeslot=0x12098, }, - [0x111D4]={ - category="nd", - description="SHARADA DIGIT FOUR", + [0x12099]={ + category="lo", + description="CUNEIFORM SIGN EN TIMES GAN0x0002 TENU", direction="l", - linebreak="nu", - unicodeslot=0x111D4, + linebreak="al", + unicodeslot=0x12099, }, - [0x111D5]={ - category="nd", - description="SHARADA DIGIT FIVE", + [0x1209A]={ + category="lo", + description="CUNEIFORM SIGN EN TIMES ME", direction="l", - linebreak="nu", - unicodeslot=0x111D5, + linebreak="al", + unicodeslot=0x1209A, }, - [0x111D6]={ - category="nd", - description="SHARADA DIGIT SIX", + [0x1209B]={ + category="lo", + description="CUNEIFORM SIGN EN CROSSING EN", direction="l", - linebreak="nu", - unicodeslot=0x111D6, + linebreak="al", + unicodeslot=0x1209B, }, - [0x111D7]={ - category="nd", - description="SHARADA DIGIT SEVEN", + [0x1209C]={ + category="lo", + description="CUNEIFORM SIGN EN OPPOSING EN", direction="l", - linebreak="nu", - unicodeslot=0x111D7, + linebreak="al", + unicodeslot=0x1209C, }, - [0x111D8]={ - category="nd", - description="SHARADA DIGIT EIGHT", + [0x1209D]={ + category="lo", + description="CUNEIFORM SIGN EN SQUARED", direction="l", - linebreak="nu", - unicodeslot=0x111D8, + linebreak="al", + unicodeslot=0x1209D, }, - [0x111D9]={ - category="nd", - description="SHARADA DIGIT NINE", + [0x1209E]={ + category="lo", + description="CUNEIFORM SIGN EREN", direction="l", - linebreak="nu", - unicodeslot=0x111D9, + linebreak="al", + unicodeslot=0x1209E, }, - [0x11680]={ + [0x1209F]={ category="lo", - description="TAKRI LETTER A", + description="CUNEIFORM SIGN ERIN0x0002", direction="l", linebreak="al", - unicodeslot=0x11680, + unicodeslot=0x1209F, }, - [0x11681]={ + [0x120A0]={ category="lo", - description="TAKRI LETTER AA", + description="CUNEIFORM SIGN ESH0x0002", direction="l", linebreak="al", - unicodeslot=0x11681, + unicodeslot=0x120A0, }, - [0x11682]={ + [0x120A1]={ category="lo", - description="TAKRI LETTER I", + description="CUNEIFORM SIGN EZEN", direction="l", linebreak="al", - unicodeslot=0x11682, + unicodeslot=0x120A1, }, - [0x11683]={ + [0x120A2]={ category="lo", - description="TAKRI LETTER II", + description="CUNEIFORM SIGN EZEN TIMES A", direction="l", linebreak="al", - unicodeslot=0x11683, + unicodeslot=0x120A2, }, - [0x11684]={ + [0x120A3]={ category="lo", - description="TAKRI LETTER U", + description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL", direction="l", linebreak="al", - unicodeslot=0x11684, + unicodeslot=0x120A3, }, - [0x11685]={ + [0x120A4]={ category="lo", - description="TAKRI LETTER UU", + description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL", direction="l", linebreak="al", - unicodeslot=0x11685, + unicodeslot=0x120A4, }, - [0x11686]={ + [0x120A5]={ category="lo", - description="TAKRI LETTER E", + description="CUNEIFORM SIGN EZEN TIMES AN", direction="l", linebreak="al", - unicodeslot=0x11686, + unicodeslot=0x120A5, }, - [0x11687]={ + [0x120A6]={ category="lo", - description="TAKRI LETTER AI", + description="CUNEIFORM SIGN EZEN TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x11687, + unicodeslot=0x120A6, }, - [0x11688]={ + [0x120A7]={ category="lo", - description="TAKRI LETTER O", + description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU", direction="l", linebreak="al", - unicodeslot=0x11688, + unicodeslot=0x120A7, }, - [0x11689]={ + [0x120A8]={ category="lo", - description="TAKRI LETTER AU", + description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU GUNU", direction="l", linebreak="al", - unicodeslot=0x11689, + unicodeslot=0x120A8, }, - [0x1168A]={ + [0x120A9]={ category="lo", - description="TAKRI LETTER KA", + description="CUNEIFORM SIGN EZEN TIMES HA", direction="l", linebreak="al", - unicodeslot=0x1168A, + unicodeslot=0x120A9, }, - [0x1168B]={ + [0x120AA]={ category="lo", - description="TAKRI LETTER KHA", + description="CUNEIFORM SIGN EZEN TIMES HA GUNU", direction="l", linebreak="al", - unicodeslot=0x1168B, + unicodeslot=0x120AA, }, - [0x1168C]={ + [0x120AB]={ category="lo", - description="TAKRI LETTER GA", + description="CUNEIFORM SIGN EZEN TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x1168C, + unicodeslot=0x120AB, }, - [0x1168D]={ + [0x120AC]={ category="lo", - description="TAKRI LETTER GHA", + description="CUNEIFORM SIGN EZEN TIMES KASKAL", direction="l", linebreak="al", - unicodeslot=0x1168D, + unicodeslot=0x120AC, }, - [0x1168E]={ + [0x120AD]={ category="lo", - description="TAKRI LETTER NGA", + description="CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED", direction="l", linebreak="al", - unicodeslot=0x1168E, + unicodeslot=0x120AD, }, - [0x1168F]={ + [0x120AE]={ category="lo", - description="TAKRI LETTER CA", + description="CUNEIFORM SIGN EZEN TIMES KU0x0003", direction="l", linebreak="al", - unicodeslot=0x1168F, + unicodeslot=0x120AE, }, - [0x11690]={ + [0x120AF]={ category="lo", - description="TAKRI LETTER CHA", + description="CUNEIFORM SIGN EZEN TIMES LA", direction="l", linebreak="al", - unicodeslot=0x11690, + unicodeslot=0x120AF, }, - [0x11691]={ + [0x120B0]={ category="lo", - description="TAKRI LETTER JA", + description="CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL", direction="l", linebreak="al", - unicodeslot=0x11691, + unicodeslot=0x120B0, }, - [0x11692]={ + [0x120B1]={ category="lo", - description="TAKRI LETTER JHA", + description="CUNEIFORM SIGN EZEN TIMES LI", direction="l", linebreak="al", - unicodeslot=0x11692, + unicodeslot=0x120B1, }, - [0x11693]={ + [0x120B2]={ category="lo", - description="TAKRI LETTER NYA", + description="CUNEIFORM SIGN EZEN TIMES LU", direction="l", linebreak="al", - unicodeslot=0x11693, + unicodeslot=0x120B2, }, - [0x11694]={ + [0x120B3]={ category="lo", - description="TAKRI LETTER TTA", + description="CUNEIFORM SIGN EZEN TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x11694, + unicodeslot=0x120B3, }, - [0x11695]={ + [0x120B4]={ category="lo", - description="TAKRI LETTER TTHA", + description="CUNEIFORM SIGN EZEN TIMES UD", direction="l", linebreak="al", - unicodeslot=0x11695, + unicodeslot=0x120B4, }, - [0x11696]={ + [0x120B5]={ category="lo", - description="TAKRI LETTER DDA", + description="CUNEIFORM SIGN GA", direction="l", linebreak="al", - unicodeslot=0x11696, + unicodeslot=0x120B5, }, - [0x11697]={ + [0x120B6]={ category="lo", - description="TAKRI LETTER DDHA", + description="CUNEIFORM SIGN GA GUNU", direction="l", linebreak="al", - unicodeslot=0x11697, + unicodeslot=0x120B6, }, - [0x11698]={ + [0x120B7]={ category="lo", - description="TAKRI LETTER NNA", + description="CUNEIFORM SIGN GA0x0002", direction="l", linebreak="al", - unicodeslot=0x11698, + unicodeslot=0x120B7, }, - [0x11699]={ + [0x120B8]={ category="lo", - description="TAKRI LETTER TA", + description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS DA PLUS HA", direction="l", linebreak="al", - unicodeslot=0x11699, + unicodeslot=0x120B8, }, - [0x1169A]={ + [0x120B9]={ category="lo", - description="TAKRI LETTER THA", + description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS HA", direction="l", linebreak="al", - unicodeslot=0x1169A, + unicodeslot=0x120B9, }, - [0x1169B]={ + [0x120BA]={ category="lo", - description="TAKRI LETTER DA", + description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS IGI", direction="l", linebreak="al", - unicodeslot=0x1169B, + unicodeslot=0x120BA, }, - [0x1169C]={ + [0x120BB]={ category="lo", - description="TAKRI LETTER DHA", + description="CUNEIFORM SIGN GA0x0002 TIMES AB0x0002 TENU PLUS TAB", direction="l", linebreak="al", - unicodeslot=0x1169C, + unicodeslot=0x120BB, }, - [0x1169D]={ + [0x120BC]={ category="lo", - description="TAKRI LETTER NA", + description="CUNEIFORM SIGN GA0x0002 TIMES AN", direction="l", linebreak="al", - unicodeslot=0x1169D, + unicodeslot=0x120BC, }, - [0x1169E]={ + [0x120BD]={ category="lo", - description="TAKRI LETTER PA", + description="CUNEIFORM SIGN GA0x0002 TIMES ASH", direction="l", linebreak="al", - unicodeslot=0x1169E, + unicodeslot=0x120BD, }, - [0x1169F]={ + [0x120BE]={ category="lo", - description="TAKRI LETTER PHA", + description="CUNEIFORM SIGN GA0x0002 TIMES ASH0x0002 PLUS GAL", direction="l", linebreak="al", - unicodeslot=0x1169F, + unicodeslot=0x120BE, }, - [0x116A0]={ + [0x120BF]={ category="lo", - description="TAKRI LETTER BA", + description="CUNEIFORM SIGN GA0x0002 TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x116A0, + unicodeslot=0x120BF, }, - [0x116A1]={ + [0x120C0]={ category="lo", - description="TAKRI LETTER BHA", + description="CUNEIFORM SIGN GA0x0002 TIMES BAR PLUS RA", direction="l", linebreak="al", - unicodeslot=0x116A1, + unicodeslot=0x120C0, }, - [0x116A2]={ + [0x120C1]={ category="lo", - description="TAKRI LETTER MA", + description="CUNEIFORM SIGN GA0x0002 TIMES BUR", direction="l", linebreak="al", - unicodeslot=0x116A2, + unicodeslot=0x120C1, }, - [0x116A3]={ + [0x120C2]={ category="lo", - description="TAKRI LETTER YA", + description="CUNEIFORM SIGN GA0x0002 TIMES BUR PLUS RA", direction="l", linebreak="al", - unicodeslot=0x116A3, + unicodeslot=0x120C2, }, - [0x116A4]={ + [0x120C3]={ category="lo", - description="TAKRI LETTER RA", + description="CUNEIFORM SIGN GA0x0002 TIMES DA", direction="l", linebreak="al", - unicodeslot=0x116A4, + unicodeslot=0x120C3, }, - [0x116A5]={ + [0x120C4]={ category="lo", - description="TAKRI LETTER LA", + description="CUNEIFORM SIGN GA0x0002 TIMES DI", direction="l", linebreak="al", - unicodeslot=0x116A5, + unicodeslot=0x120C4, }, - [0x116A6]={ + [0x120C5]={ category="lo", - description="TAKRI LETTER VA", + description="CUNEIFORM SIGN GA0x0002 TIMES DIM TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x116A6, + unicodeslot=0x120C5, }, - [0x116A7]={ + [0x120C6]={ category="lo", - description="TAKRI LETTER SHA", + description="CUNEIFORM SIGN GA0x0002 TIMES DUB", direction="l", linebreak="al", - unicodeslot=0x116A7, + unicodeslot=0x120C6, }, - [0x116A8]={ + [0x120C7]={ category="lo", - description="TAKRI LETTER SA", + description="CUNEIFORM SIGN GA0x0002 TIMES EL", direction="l", linebreak="al", - unicodeslot=0x116A8, + unicodeslot=0x120C7, }, - [0x116A9]={ + [0x120C8]={ category="lo", - description="TAKRI LETTER HA", + description="CUNEIFORM SIGN GA0x0002 TIMES EL PLUS LA", direction="l", linebreak="al", - unicodeslot=0x116A9, + unicodeslot=0x120C8, }, - [0x116AA]={ + [0x120C9]={ category="lo", - description="TAKRI LETTER RRA", + description="CUNEIFORM SIGN GA0x0002 TIMES EN", direction="l", linebreak="al", - unicodeslot=0x116AA, - }, - [0x116AB]={ - category="mn", - description="TAKRI SIGN ANUSVARA", - direction="nsm", - linebreak="cm", - unicodeslot=0x116AB, + unicodeslot=0x120C9, }, - [0x116AC]={ - category="mc", - description="TAKRI SIGN VISARGA", + [0x120CA]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES EN TIMES GAN0x0002 TENU", direction="l", - linebreak="cm", - unicodeslot=0x116AC, - }, - [0x116AD]={ - category="mn", - description="TAKRI VOWEL SIGN AA", - direction="nsm", - linebreak="cm", - unicodeslot=0x116AD, + linebreak="al", + unicodeslot=0x120CA, }, - [0x116AE]={ - category="mc", - description="TAKRI VOWEL SIGN I", + [0x120CB]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GAN0x0002 TENU", direction="l", - linebreak="cm", - unicodeslot=0x116AE, + linebreak="al", + unicodeslot=0x120CB, }, - [0x116AF]={ - category="mc", - description="TAKRI VOWEL SIGN II", + [0x120CC]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GAR", direction="l", - linebreak="cm", - unicodeslot=0x116AF, - }, - [0x116B0]={ - category="mn", - description="TAKRI VOWEL SIGN U", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B0, - }, - [0x116B1]={ - category="mn", - description="TAKRI VOWEL SIGN UU", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B1, - }, - [0x116B2]={ - category="mn", - description="TAKRI VOWEL SIGN E", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B2, - }, - [0x116B3]={ - category="mn", - description="TAKRI VOWEL SIGN AI", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B3, - }, - [0x116B4]={ - category="mn", - description="TAKRI VOWEL SIGN O", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B4, + linebreak="al", + unicodeslot=0x120CC, }, - [0x116B5]={ - category="mn", - description="TAKRI VOWEL SIGN AU", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B5, + [0x120CD]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GI", + direction="l", + linebreak="al", + unicodeslot=0x120CD, }, - [0x116B6]={ - category="mc", - description="TAKRI SIGN VIRAMA", + [0x120CE]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004", direction="l", - linebreak="cm", - unicodeslot=0x116B6, + linebreak="al", + unicodeslot=0x120CE, }, - [0x116B7]={ - category="mn", - description="TAKRI SIGN NUKTA", - direction="nsm", - linebreak="cm", - unicodeslot=0x116B7, + [0x120CF]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004 PLUS A", + direction="l", + linebreak="al", + unicodeslot=0x120CF, }, - [0x116C0]={ - category="nd", - description="TAKRI DIGIT ZERO", + [0x120D0]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES GIR0x0002 PLUS SU", direction="l", - linebreak="nu", - unicodeslot=0x116C0, + linebreak="al", + unicodeslot=0x120D0, }, - [0x116C1]={ - category="nd", - description="TAKRI DIGIT ONE", + [0x120D1]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES HA PLUS LU PLUS ESH0x0002", direction="l", - linebreak="nu", - unicodeslot=0x116C1, + linebreak="al", + unicodeslot=0x120D1, }, - [0x116C2]={ - category="nd", - description="TAKRI DIGIT TWO", + [0x120D2]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES HAL", direction="l", - linebreak="nu", - unicodeslot=0x116C2, + linebreak="al", + unicodeslot=0x120D2, }, - [0x116C3]={ - category="nd", - description="TAKRI DIGIT THREE", + [0x120D3]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES HAL PLUS LA", direction="l", - linebreak="nu", - unicodeslot=0x116C3, + linebreak="al", + unicodeslot=0x120D3, }, - [0x116C4]={ - category="nd", - description="TAKRI DIGIT FOUR", + [0x120D4]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES HI PLUS LI", direction="l", - linebreak="nu", - unicodeslot=0x116C4, + linebreak="al", + unicodeslot=0x120D4, }, - [0x116C5]={ - category="nd", - description="TAKRI DIGIT FIVE", + [0x120D5]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES HUB0x0002", direction="l", - linebreak="nu", - unicodeslot=0x116C5, + linebreak="al", + unicodeslot=0x120D5, }, - [0x116C6]={ - category="nd", - description="TAKRI DIGIT SIX", + [0x120D6]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES IGI GUNU", direction="l", - linebreak="nu", - unicodeslot=0x116C6, + linebreak="al", + unicodeslot=0x120D6, }, - [0x116C7]={ - category="nd", - description="TAKRI DIGIT SEVEN", + [0x120D7]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES ISH PLUS HU PLUS ASH", direction="l", - linebreak="nu", - unicodeslot=0x116C7, + linebreak="al", + unicodeslot=0x120D7, }, - [0x116C8]={ - category="nd", - description="TAKRI DIGIT EIGHT", + [0x120D8]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES KAK", direction="l", - linebreak="nu", - unicodeslot=0x116C8, + linebreak="al", + unicodeslot=0x120D8, }, - [0x116C9]={ - category="nd", - description="TAKRI DIGIT NINE", + [0x120D9]={ + category="lo", + description="CUNEIFORM SIGN GA0x0002 TIMES KASKAL", direction="l", - linebreak="nu", - unicodeslot=0x116C9, + linebreak="al", + unicodeslot=0x120D9, }, - [0x12000]={ + [0x120DA]={ category="lo", - description="CUNEIFORM SIGN A", + description="CUNEIFORM SIGN GA0x0002 TIMES KID", direction="l", linebreak="al", - unicodeslot=0x12000, + unicodeslot=0x120DA, }, - [0x12001]={ + [0x120DB]={ category="lo", - description="CUNEIFORM SIGN A TIMES A", + description="CUNEIFORM SIGN GA0x0002 TIMES KID PLUS LAL", direction="l", linebreak="al", - unicodeslot=0x12001, + unicodeslot=0x120DB, }, - [0x12002]={ + [0x120DC]={ category="lo", - description="CUNEIFORM SIGN A TIMES BAD", + description="CUNEIFORM SIGN GA0x0002 TIMES KU0x0003 PLUS AN", direction="l", linebreak="al", - unicodeslot=0x12002, + unicodeslot=0x120DC, }, - [0x12003]={ + [0x120DD]={ category="lo", - description="CUNEIFORM SIGN A TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN GA0x0002 TIMES LA", direction="l", linebreak="al", - unicodeslot=0x12003, + unicodeslot=0x120DD, }, - [0x12004]={ + [0x120DE]={ category="lo", - description="CUNEIFORM SIGN A TIMES HA", + description="CUNEIFORM SIGN GA0x0002 TIMES ME PLUS EN", direction="l", linebreak="al", - unicodeslot=0x12004, + unicodeslot=0x120DE, }, - [0x12005]={ + [0x120DF]={ category="lo", - description="CUNEIFORM SIGN A TIMES IGI", + description="CUNEIFORM SIGN GA0x0002 TIMES MI", direction="l", linebreak="al", - unicodeslot=0x12005, + unicodeslot=0x120DF, }, - [0x12006]={ + [0x120E0]={ category="lo", - description="CUNEIFORM SIGN A TIMES LAGAR GUNU", + description="CUNEIFORM SIGN GA0x0002 TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x12006, + unicodeslot=0x120E0, }, - [0x12007]={ + [0x120E1]={ category="lo", - description="CUNEIFORM SIGN A TIMES MUSH", + description="CUNEIFORM SIGN GA0x0002 TIMES NUN OVER NUN", direction="l", linebreak="al", - unicodeslot=0x12007, + unicodeslot=0x120E1, }, - [0x12008]={ + [0x120E2]={ category="lo", - description="CUNEIFORM SIGN A TIMES SAG", + description="CUNEIFORM SIGN GA0x0002 TIMES PA", direction="l", linebreak="al", - unicodeslot=0x12008, + unicodeslot=0x120E2, }, - [0x12009]={ + [0x120E3]={ category="lo", - description="CUNEIFORM SIGN A0x0002", + description="CUNEIFORM SIGN GA0x0002 TIMES SAL", direction="l", linebreak="al", - unicodeslot=0x12009, + unicodeslot=0x120E3, }, - [0x1200A]={ + [0x120E4]={ category="lo", - description="CUNEIFORM SIGN AB", + description="CUNEIFORM SIGN GA0x0002 TIMES SAR", direction="l", linebreak="al", - unicodeslot=0x1200A, + unicodeslot=0x120E4, }, - [0x1200B]={ + [0x120E5]={ category="lo", - description="CUNEIFORM SIGN AB TIMES ASH0x0002", + description="CUNEIFORM SIGN GA0x0002 TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1200B, + unicodeslot=0x120E5, }, - [0x1200C]={ + [0x120E6]={ category="lo", - description="CUNEIFORM SIGN AB TIMES DUN0x0003 GUNU", + description="CUNEIFORM SIGN GA0x0002 TIMES SHE PLUS TUR", direction="l", linebreak="al", - unicodeslot=0x1200C, + unicodeslot=0x120E6, }, - [0x1200D]={ + [0x120E7]={ category="lo", - description="CUNEIFORM SIGN AB TIMES GAL", + description="CUNEIFORM SIGN GA0x0002 TIMES SHID", direction="l", linebreak="al", - unicodeslot=0x1200D, + unicodeslot=0x120E7, }, - [0x1200E]={ + [0x120E8]={ category="lo", - description="CUNEIFORM SIGN AB TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN GA0x0002 TIMES SUM", direction="l", linebreak="al", - unicodeslot=0x1200E, + unicodeslot=0x120E8, }, - [0x1200F]={ + [0x120E9]={ category="lo", - description="CUNEIFORM SIGN AB TIMES HA", + description="CUNEIFORM SIGN GA0x0002 TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x1200F, + unicodeslot=0x120E9, }, - [0x12010]={ + [0x120EA]={ category="lo", - description="CUNEIFORM SIGN AB TIMES IGI GUNU", + description="CUNEIFORM SIGN GA0x0002 TIMES U", direction="l", linebreak="al", - unicodeslot=0x12010, + unicodeslot=0x120EA, }, - [0x12011]={ + [0x120EB]={ category="lo", - description="CUNEIFORM SIGN AB TIMES IMIN", + description="CUNEIFORM SIGN GA0x0002 TIMES UD", direction="l", linebreak="al", - unicodeslot=0x12011, + unicodeslot=0x120EB, }, - [0x12012]={ + [0x120EC]={ category="lo", - description="CUNEIFORM SIGN AB TIMES LAGAB", + description="CUNEIFORM SIGN GA0x0002 TIMES UD PLUS DU", direction="l", linebreak="al", - unicodeslot=0x12012, + unicodeslot=0x120EC, }, - [0x12013]={ + [0x120ED]={ category="lo", - description="CUNEIFORM SIGN AB TIMES SHESH", + description="CUNEIFORM SIGN GA0x0002 OVER GA0x0002", direction="l", linebreak="al", - unicodeslot=0x12013, + unicodeslot=0x120ED, }, - [0x12014]={ + [0x120EE]={ category="lo", - description="CUNEIFORM SIGN AB TIMES U PLUS U PLUS U", + description="CUNEIFORM SIGN GABA", direction="l", linebreak="al", - unicodeslot=0x12014, + unicodeslot=0x120EE, }, - [0x12015]={ + [0x120EF]={ category="lo", - description="CUNEIFORM SIGN AB GUNU", + description="CUNEIFORM SIGN GABA CROSSING GABA", direction="l", linebreak="al", - unicodeslot=0x12015, + unicodeslot=0x120EF, }, - [0x12016]={ + [0x120F0]={ category="lo", - description="CUNEIFORM SIGN AB0x0002", + description="CUNEIFORM SIGN GAD", direction="l", linebreak="al", - unicodeslot=0x12016, + unicodeslot=0x120F0, }, - [0x12017]={ + [0x120F1]={ category="lo", - description="CUNEIFORM SIGN AB0x0002 TIMES BALAG", + description="CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x12017, + unicodeslot=0x120F1, }, - [0x12018]={ + [0x120F2]={ category="lo", - description="CUNEIFORM SIGN AB0x0002 TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN GAL", direction="l", linebreak="al", - unicodeslot=0x12018, + unicodeslot=0x120F2, }, - [0x12019]={ + [0x120F3]={ category="lo", - description="CUNEIFORM SIGN AB0x0002 TIMES ME PLUS EN", + description="CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x12019, + unicodeslot=0x120F3, }, - [0x1201A]={ + [0x120F4]={ category="lo", - description="CUNEIFORM SIGN AB0x0002 TIMES SHA0x0003", + description="CUNEIFORM SIGN GALAM", direction="l", linebreak="al", - unicodeslot=0x1201A, + unicodeslot=0x120F4, }, - [0x1201B]={ + [0x120F5]={ category="lo", - description="CUNEIFORM SIGN AB0x0002 TIMES TAK0x0004", + description="CUNEIFORM SIGN GAM", direction="l", linebreak="al", - unicodeslot=0x1201B, + unicodeslot=0x120F5, }, - [0x1201C]={ + [0x120F6]={ category="lo", - description="CUNEIFORM SIGN AD", + description="CUNEIFORM SIGN GAN", direction="l", linebreak="al", - unicodeslot=0x1201C, + unicodeslot=0x120F6, }, - [0x1201D]={ + [0x120F7]={ category="lo", - description="CUNEIFORM SIGN AK", + description="CUNEIFORM SIGN GAN0x0002", direction="l", linebreak="al", - unicodeslot=0x1201D, + unicodeslot=0x120F7, }, - [0x1201E]={ + [0x120F8]={ category="lo", - description="CUNEIFORM SIGN AK TIMES ERIN0x0002", + description="CUNEIFORM SIGN GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x1201E, + unicodeslot=0x120F8, }, - [0x1201F]={ + [0x120F9]={ category="lo", - description="CUNEIFORM SIGN AK TIMES SHITA PLUS GISH", + description="CUNEIFORM SIGN GAN0x0002 OVER GAN0x0002", direction="l", linebreak="al", - unicodeslot=0x1201F, + unicodeslot=0x120F9, }, - [0x12020]={ + [0x120FA]={ category="lo", - description="CUNEIFORM SIGN AL", + description="CUNEIFORM SIGN GAN0x0002 CROSSING GAN0x0002", direction="l", linebreak="al", - unicodeslot=0x12020, + unicodeslot=0x120FA, }, - [0x12021]={ + [0x120FB]={ category="lo", - description="CUNEIFORM SIGN AL TIMES AL", + description="CUNEIFORM SIGN GAR", direction="l", linebreak="al", - unicodeslot=0x12021, + unicodeslot=0x120FB, }, - [0x12022]={ + [0x120FC]={ category="lo", - description="CUNEIFORM SIGN AL TIMES DIM0x0002", + description="CUNEIFORM SIGN GAR0x0003", direction="l", linebreak="al", - unicodeslot=0x12022, + unicodeslot=0x120FC, }, - [0x12023]={ + [0x120FD]={ category="lo", - description="CUNEIFORM SIGN AL TIMES GISH", + description="CUNEIFORM SIGN GASHAN", direction="l", linebreak="al", - unicodeslot=0x12023, + unicodeslot=0x120FD, }, - [0x12024]={ + [0x120FE]={ category="lo", - description="CUNEIFORM SIGN AL TIMES HA", + description="CUNEIFORM SIGN GESHTIN", direction="l", linebreak="al", - unicodeslot=0x12024, + unicodeslot=0x120FE, }, - [0x12025]={ + [0x120FF]={ category="lo", - description="CUNEIFORM SIGN AL TIMES KAD0x0003", + description="CUNEIFORM SIGN GESHTIN TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x12025, + unicodeslot=0x120FF, }, - [0x12026]={ + [0x12100]={ category="lo", - description="CUNEIFORM SIGN AL TIMES KI", + description="CUNEIFORM SIGN GI", direction="l", linebreak="al", - unicodeslot=0x12026, + unicodeslot=0x12100, }, - [0x12027]={ + [0x12101]={ category="lo", - description="CUNEIFORM SIGN AL TIMES SHE", + description="CUNEIFORM SIGN GI TIMES E", direction="l", linebreak="al", - unicodeslot=0x12027, + unicodeslot=0x12101, }, - [0x12028]={ + [0x12102]={ category="lo", - description="CUNEIFORM SIGN AL TIMES USH", + description="CUNEIFORM SIGN GI TIMES U", direction="l", linebreak="al", - unicodeslot=0x12028, + unicodeslot=0x12102, }, - [0x12029]={ + [0x12103]={ category="lo", - description="CUNEIFORM SIGN ALAN", + description="CUNEIFORM SIGN GI CROSSING GI", direction="l", linebreak="al", - unicodeslot=0x12029, + unicodeslot=0x12103, }, - [0x1202A]={ + [0x12104]={ category="lo", - description="CUNEIFORM SIGN ALEPH", + description="CUNEIFORM SIGN GI0x0004", direction="l", linebreak="al", - unicodeslot=0x1202A, + unicodeslot=0x12104, }, - [0x1202B]={ + [0x12105]={ category="lo", - description="CUNEIFORM SIGN AMAR", + description="CUNEIFORM SIGN GI0x0004 OVER GI0x0004", direction="l", linebreak="al", - unicodeslot=0x1202B, + unicodeslot=0x12105, }, - [0x1202C]={ + [0x12106]={ category="lo", - description="CUNEIFORM SIGN AMAR TIMES SHE", + description="CUNEIFORM SIGN GI0x0004 CROSSING GI0x0004", direction="l", linebreak="al", - unicodeslot=0x1202C, + unicodeslot=0x12106, }, - [0x1202D]={ + [0x12107]={ category="lo", - description="CUNEIFORM SIGN AN", + description="CUNEIFORM SIGN GIDIM", direction="l", linebreak="al", - unicodeslot=0x1202D, + unicodeslot=0x12107, }, - [0x1202E]={ + [0x12108]={ category="lo", - description="CUNEIFORM SIGN AN OVER AN", + description="CUNEIFORM SIGN GIR0x0002", direction="l", linebreak="al", - unicodeslot=0x1202E, + unicodeslot=0x12108, }, - [0x1202F]={ + [0x12109]={ category="lo", - description="CUNEIFORM SIGN AN THREE TIMES", + description="CUNEIFORM SIGN GIR0x0002 GUNU", direction="l", linebreak="al", - unicodeslot=0x1202F, + unicodeslot=0x12109, }, - [0x12030]={ + [0x1210A]={ category="lo", - description="CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA", + description="CUNEIFORM SIGN GIR0x0003", direction="l", linebreak="al", - unicodeslot=0x12030, + unicodeslot=0x1210A, }, - [0x12031]={ + [0x1210B]={ category="lo", - description="CUNEIFORM SIGN AN PLUS NAGA SQUARED", + description="CUNEIFORM SIGN GIR0x0003 TIMES A PLUS IGI", direction="l", linebreak="al", - unicodeslot=0x12031, + unicodeslot=0x1210B, }, - [0x12032]={ + [0x1210C]={ category="lo", - description="CUNEIFORM SIGN ANSHE", + description="CUNEIFORM SIGN GIR0x0003 TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12032, + unicodeslot=0x1210C, }, - [0x12033]={ + [0x1210D]={ category="lo", - description="CUNEIFORM SIGN APIN", + description="CUNEIFORM SIGN GIR0x0003 TIMES IGI", direction="l", linebreak="al", - unicodeslot=0x12033, + unicodeslot=0x1210D, }, - [0x12034]={ + [0x1210E]={ category="lo", - description="CUNEIFORM SIGN ARAD", + description="CUNEIFORM SIGN GIR0x0003 TIMES LU PLUS IGI", direction="l", linebreak="al", - unicodeslot=0x12034, + unicodeslot=0x1210E, }, - [0x12035]={ + [0x1210F]={ category="lo", - description="CUNEIFORM SIGN ARAD TIMES KUR", + description="CUNEIFORM SIGN GIR0x0003 TIMES PA", direction="l", linebreak="al", - mathclass="ordinary", - mathname="backprime", - unicodeslot=0x12035, + unicodeslot=0x1210F, }, - [0x12036]={ + [0x12110]={ category="lo", - description="CUNEIFORM SIGN ARKAB", + description="CUNEIFORM SIGN GISAL", direction="l", linebreak="al", - unicodeslot=0x12036, + unicodeslot=0x12110, }, - [0x12037]={ + [0x12111]={ category="lo", - description="CUNEIFORM SIGN ASAL0x0002", + description="CUNEIFORM SIGN GISH", direction="l", linebreak="al", - unicodeslot=0x12037, + unicodeslot=0x12111, }, - [0x12038]={ + [0x12112]={ category="lo", - description="CUNEIFORM SIGN ASH", + description="CUNEIFORM SIGN GISH CROSSING GISH", direction="l", linebreak="al", - unicodeslot=0x12038, + unicodeslot=0x12112, }, - [0x12039]={ + [0x12113]={ category="lo", - description="CUNEIFORM SIGN ASH ZIDA TENU", + description="CUNEIFORM SIGN GISH TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12039, + unicodeslot=0x12113, }, - [0x1203A]={ + [0x12114]={ category="lo", - description="CUNEIFORM SIGN ASH KABA TENU", + description="CUNEIFORM SIGN GISH TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x1203A, + unicodeslot=0x12114, }, - [0x1203B]={ + [0x12115]={ category="lo", - description="CUNEIFORM SIGN ASH OVER ASH TUG0x0002 OVER TUG0x0002 TUG0x0002 OVER TUG0x0002 PAP", + description="CUNEIFORM SIGN GISH TENU", direction="l", linebreak="al", - unicodeslot=0x1203B, + unicodeslot=0x12115, }, - [0x1203C]={ + [0x12116]={ category="lo", - description="CUNEIFORM SIGN ASH OVER ASH OVER ASH", + description="CUNEIFORM SIGN GU", direction="l", linebreak="al", - unicodeslot=0x1203C, + unicodeslot=0x12116, }, - [0x1203D]={ + [0x12117]={ category="lo", - description="CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH", + description="CUNEIFORM SIGN GU CROSSING GU", direction="l", linebreak="al", - unicodeslot=0x1203D, + unicodeslot=0x12117, }, - [0x1203E]={ + [0x12118]={ category="lo", - description="CUNEIFORM SIGN ASH0x0002", + description="CUNEIFORM SIGN GU0x0002", direction="l", linebreak="al", - unicodeslot=0x1203E, + unicodeslot=0x12118, }, - [0x1203F]={ + [0x12119]={ category="lo", - description="CUNEIFORM SIGN ASHGAB", + description="CUNEIFORM SIGN GU0x0002 TIMES KAK", direction="l", linebreak="al", - unicodeslot=0x1203F, + unicodeslot=0x12119, }, - [0x12040]={ + [0x1211A]={ category="lo", - description="CUNEIFORM SIGN BA", + description="CUNEIFORM SIGN GU0x0002 TIMES KAK TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x12040, + unicodeslot=0x1211A, }, - [0x12041]={ + [0x1211B]={ category="lo", - description="CUNEIFORM SIGN BAD", + description="CUNEIFORM SIGN GU0x0002 TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x12041, + unicodeslot=0x1211B, }, - [0x12042]={ + [0x1211C]={ category="lo", - description="CUNEIFORM SIGN BAG0x0003", + description="CUNEIFORM SIGN GU0x0002 TIMES SAL PLUS TUG0x0002", direction="l", linebreak="al", - unicodeslot=0x12042, + unicodeslot=0x1211C, }, - [0x12043]={ + [0x1211D]={ category="lo", - description="CUNEIFORM SIGN BAHAR0x0002", + description="CUNEIFORM SIGN GU0x0002 GUNU", direction="l", linebreak="al", - unicodeslot=0x12043, + unicodeslot=0x1211D, }, - [0x12044]={ + [0x1211E]={ category="lo", - description="CUNEIFORM SIGN BAL", + description="CUNEIFORM SIGN GUD", direction="l", linebreak="al", - unicodeslot=0x12044, + unicodeslot=0x1211E, }, - [0x12045]={ + [0x1211F]={ category="lo", - description="CUNEIFORM SIGN BAL OVER BAL", + description="CUNEIFORM SIGN GUD TIMES A PLUS KUR", direction="l", linebreak="al", - unicodeslot=0x12045, + unicodeslot=0x1211F, }, - [0x12046]={ + [0x12120]={ category="lo", - description="CUNEIFORM SIGN BALAG", + description="CUNEIFORM SIGN GUD TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x12046, + unicodeslot=0x12120, }, - [0x12047]={ + [0x12121]={ category="lo", - description="CUNEIFORM SIGN BAR", + description="CUNEIFORM SIGN GUD OVER GUD LUGAL", direction="l", linebreak="al", - unicodeslot=0x12047, + unicodeslot=0x12121, }, - [0x12048]={ + [0x12122]={ category="lo", - description="CUNEIFORM SIGN BARA0x0002", + description="CUNEIFORM SIGN GUL", direction="l", linebreak="al", - unicodeslot=0x12048, + unicodeslot=0x12122, }, - [0x12049]={ + [0x12123]={ category="lo", - description="CUNEIFORM SIGN BI", + description="CUNEIFORM SIGN GUM", direction="l", linebreak="al", - unicodeslot=0x12049, + unicodeslot=0x12123, }, - [0x1204A]={ + [0x12124]={ category="lo", - description="CUNEIFORM SIGN BI TIMES A", + description="CUNEIFORM SIGN GUM TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1204A, + unicodeslot=0x12124, }, - [0x1204B]={ + [0x12125]={ category="lo", - description="CUNEIFORM SIGN BI TIMES GAR", + description="CUNEIFORM SIGN GUR", direction="l", linebreak="al", - unicodeslot=0x1204B, + unicodeslot=0x12125, }, - [0x1204C]={ + [0x12126]={ category="lo", - description="CUNEIFORM SIGN BI TIMES IGI GUNU", + description="CUNEIFORM SIGN GUR0x0007", direction="l", linebreak="al", - unicodeslot=0x1204C, + unicodeslot=0x12126, }, - [0x1204D]={ + [0x12127]={ category="lo", - description="CUNEIFORM SIGN BU", + description="CUNEIFORM SIGN GURUN", direction="l", linebreak="al", - unicodeslot=0x1204D, + unicodeslot=0x12127, }, - [0x1204E]={ + [0x12128]={ category="lo", - description="CUNEIFORM SIGN BU OVER BU AB", + description="CUNEIFORM SIGN GURUSH", direction="l", linebreak="al", - unicodeslot=0x1204E, + unicodeslot=0x12128, }, - [0x1204F]={ + [0x12129]={ category="lo", - description="CUNEIFORM SIGN BU OVER BU UN", + description="CUNEIFORM SIGN HA", direction="l", linebreak="al", - unicodeslot=0x1204F, + unicodeslot=0x12129, }, - [0x12050]={ + [0x1212A]={ category="lo", - description="CUNEIFORM SIGN BU CROSSING BU", + description="CUNEIFORM SIGN HA TENU", direction="l", linebreak="al", - unicodeslot=0x12050, + unicodeslot=0x1212A, }, - [0x12051]={ + [0x1212B]={ category="lo", - description="CUNEIFORM SIGN BULUG", + description="CUNEIFORM SIGN HA GUNU", direction="l", linebreak="al", - unicodeslot=0x12051, + unicodeslot=0x1212B, }, - [0x12052]={ + [0x1212C]={ category="lo", - description="CUNEIFORM SIGN BULUG OVER BULUG", + description="CUNEIFORM SIGN HAL", direction="l", linebreak="al", - unicodeslot=0x12052, + unicodeslot=0x1212C, }, - [0x12053]={ + [0x1212D]={ category="lo", - description="CUNEIFORM SIGN BUR", + description="CUNEIFORM SIGN HI", direction="l", linebreak="al", - unicodeslot=0x12053, + unicodeslot=0x1212D, }, - [0x12054]={ + [0x1212E]={ category="lo", - description="CUNEIFORM SIGN BUR0x0002", + description="CUNEIFORM SIGN HI TIMES ASH", direction="l", linebreak="al", - unicodeslot=0x12054, + unicodeslot=0x1212E, }, - [0x12055]={ + [0x1212F]={ category="lo", - description="CUNEIFORM SIGN DA", + description="CUNEIFORM SIGN HI TIMES ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x12055, + unicodeslot=0x1212F, }, - [0x12056]={ + [0x12130]={ category="lo", - description="CUNEIFORM SIGN DAG", + description="CUNEIFORM SIGN HI TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12056, + unicodeslot=0x12130, }, - [0x12057]={ + [0x12131]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES A PLUS MASH", + description="CUNEIFORM SIGN HI TIMES DISH", direction="l", linebreak="al", - unicodeslot=0x12057, + unicodeslot=0x12131, }, - [0x12058]={ + [0x12132]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES AMAR", + description="CUNEIFORM SIGN HI TIMES GAD", direction="l", linebreak="al", - unicodeslot=0x12058, + unicodeslot=0x12132, }, - [0x12059]={ + [0x12133]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BALAG", + description="CUNEIFORM SIGN HI TIMES KIN", direction="l", linebreak="al", - unicodeslot=0x12059, + unicodeslot=0x12133, }, - [0x1205A]={ + [0x12134]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BI", + description="CUNEIFORM SIGN HI TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x1205A, + unicodeslot=0x12134, }, - [0x1205B]={ + [0x12135]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA", + description="CUNEIFORM SIGN HI TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1205B, + unicodeslot=0x12135, }, - [0x1205C]={ + [0x12136]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA PLUS MASH", + description="CUNEIFORM SIGN HI TIMES U", direction="l", linebreak="al", - unicodeslot=0x1205C, + unicodeslot=0x12136, }, - [0x1205D]={ + [0x12137]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GI", + description="CUNEIFORM SIGN HU", direction="l", linebreak="al", - unicodeslot=0x1205D, + unicodeslot=0x12137, }, - [0x1205E]={ + [0x12138]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GIR0x0002", + description="CUNEIFORM SIGN HUB0x0002", direction="l", linebreak="al", - unicodeslot=0x1205E, + unicodeslot=0x12138, }, - [0x1205F]={ + [0x12139]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GUD", + description="CUNEIFORM SIGN HUB0x0002 TIMES AN", direction="l", linebreak="al", - unicodeslot=0x1205F, + unicodeslot=0x12139, }, - [0x12060]={ + [0x1213A]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES HA", + description="CUNEIFORM SIGN HUB0x0002 TIMES HAL", direction="l", linebreak="al", - unicodeslot=0x12060, + unicodeslot=0x1213A, }, - [0x12061]={ + [0x1213B]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR", + description="CUNEIFORM SIGN HUB0x0002 TIMES KASKAL", direction="l", linebreak="al", - unicodeslot=0x12061, + unicodeslot=0x1213B, }, - [0x12062]={ + [0x1213C]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR PLUS LU", + description="CUNEIFORM SIGN HUB0x0002 TIMES LISH", direction="l", linebreak="al", - unicodeslot=0x12062, + unicodeslot=0x1213C, }, - [0x12063]={ + [0x1213D]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES KAK", + description="CUNEIFORM SIGN HUB0x0002 TIMES UD", direction="l", linebreak="al", - unicodeslot=0x12063, + unicodeslot=0x1213D, }, - [0x12064]={ + [0x1213E]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LA", + description="CUNEIFORM SIGN HUL0x0002", direction="l", linebreak="al", - unicodeslot=0x12064, + unicodeslot=0x1213E, }, - [0x12065]={ + [0x1213F]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU", + description="CUNEIFORM SIGN I", direction="l", linebreak="al", - unicodeslot=0x12065, + unicodeslot=0x1213F, }, - [0x12066]={ + [0x12140]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU PLUS MASH0x0002", + description="CUNEIFORM SIGN I A", direction="l", linebreak="al", - unicodeslot=0x12066, + unicodeslot=0x12140, }, - [0x12067]={ + [0x12141]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LUM", + description="CUNEIFORM SIGN IB", direction="l", linebreak="al", - unicodeslot=0x12067, + unicodeslot=0x12141, }, - [0x12068]={ + [0x12142]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES NE", + description="CUNEIFORM SIGN IDIM", direction="l", linebreak="al", - unicodeslot=0x12068, + unicodeslot=0x12142, }, - [0x12069]={ + [0x12143]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES PAP PLUS PAP", + description="CUNEIFORM SIGN IDIM OVER IDIM BUR", direction="l", linebreak="al", - unicodeslot=0x12069, + unicodeslot=0x12143, }, - [0x1206A]={ + [0x12144]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES SI", + description="CUNEIFORM SIGN IDIM OVER IDIM SQUARED", direction="l", linebreak="al", - unicodeslot=0x1206A, + unicodeslot=0x12144, }, - [0x1206B]={ + [0x12145]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES TAK0x0004", + description="CUNEIFORM SIGN IG", direction="l", linebreak="al", - unicodeslot=0x1206B, + unicodeslot=0x12145, }, - [0x1206C]={ + [0x12146]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES U0x0002 PLUS GIR0x0002", + description="CUNEIFORM SIGN IGI", direction="l", linebreak="al", - unicodeslot=0x1206C, + unicodeslot=0x12146, }, - [0x1206D]={ + [0x12147]={ category="lo", - description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES USH", + description="CUNEIFORM SIGN IGI DIB", direction="l", linebreak="al", - unicodeslot=0x1206D, + unicodeslot=0x12147, }, - [0x1206E]={ + [0x12148]={ category="lo", - description="CUNEIFORM SIGN DAM", + description="CUNEIFORM SIGN IGI RI", direction="l", linebreak="al", - unicodeslot=0x1206E, + unicodeslot=0x12148, }, - [0x1206F]={ + [0x12149]={ category="lo", - description="CUNEIFORM SIGN DAR", + description="CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD", direction="l", linebreak="al", - unicodeslot=0x1206F, + unicodeslot=0x12149, }, - [0x12070]={ + [0x1214A]={ category="lo", - description="CUNEIFORM SIGN DARA0x0003", + description="CUNEIFORM SIGN IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x12070, + unicodeslot=0x1214A, }, - [0x12071]={ + [0x1214B]={ category="lo", - description="CUNEIFORM SIGN DARA0x0004", + description="CUNEIFORM SIGN IL", direction="l", linebreak="al", - unicodeslot=0x12071, + unicodeslot=0x1214B, }, - [0x12072]={ + [0x1214C]={ category="lo", - description="CUNEIFORM SIGN DI", + description="CUNEIFORM SIGN IL TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12072, + unicodeslot=0x1214C, }, - [0x12073]={ + [0x1214D]={ category="lo", - description="CUNEIFORM SIGN DIB", + description="CUNEIFORM SIGN IL0x0002", direction="l", linebreak="al", - unicodeslot=0x12073, + unicodeslot=0x1214D, }, - [0x12074]={ + [0x1214E]={ category="lo", - description="CUNEIFORM SIGN DIM", + description="CUNEIFORM SIGN IM", direction="l", linebreak="al", - unicodeslot=0x12074, + unicodeslot=0x1214E, }, - [0x12075]={ + [0x1214F]={ category="lo", - description="CUNEIFORM SIGN DIM TIMES SHE", + description="CUNEIFORM SIGN IM TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x12075, + unicodeslot=0x1214F, }, - [0x12076]={ + [0x12150]={ category="lo", - description="CUNEIFORM SIGN DIM0x0002", + description="CUNEIFORM SIGN IM CROSSING IM", direction="l", linebreak="al", - unicodeslot=0x12076, + unicodeslot=0x12150, }, - [0x12077]={ + [0x12151]={ category="lo", - description="CUNEIFORM SIGN DIN", + description="CUNEIFORM SIGN IM OPPOSING IM", direction="l", linebreak="al", - unicodeslot=0x12077, + unicodeslot=0x12151, }, - [0x12078]={ + [0x12152]={ category="lo", - description="CUNEIFORM SIGN DIN KASKAL U GUNU DISH", + description="CUNEIFORM SIGN IM SQUARED", direction="l", linebreak="al", - unicodeslot=0x12078, + unicodeslot=0x12152, }, - [0x12079]={ + [0x12153]={ category="lo", - description="CUNEIFORM SIGN DISH", + description="CUNEIFORM SIGN IMIN", direction="l", linebreak="al", - unicodeslot=0x12079, + unicodeslot=0x12153, }, - [0x1207A]={ + [0x12154]={ category="lo", - description="CUNEIFORM SIGN DU", + description="CUNEIFORM SIGN IN", direction="l", linebreak="al", - unicodeslot=0x1207A, + unicodeslot=0x12154, }, - [0x1207B]={ + [0x12155]={ category="lo", - description="CUNEIFORM SIGN DU OVER DU", + description="CUNEIFORM SIGN IR", direction="l", linebreak="al", - unicodeslot=0x1207B, + unicodeslot=0x12155, }, - [0x1207C]={ + [0x12156]={ category="lo", - description="CUNEIFORM SIGN DU GUNU", + description="CUNEIFORM SIGN ISH", direction="l", linebreak="al", - unicodeslot=0x1207C, + unicodeslot=0x12156, }, - [0x1207D]={ + [0x12157]={ category="lo", - description="CUNEIFORM SIGN DU SHESHIG", + description="CUNEIFORM SIGN KA", direction="l", linebreak="al", - unicodeslot=0x1207D, + unicodeslot=0x12157, }, - [0x1207E]={ + [0x12158]={ category="lo", - description="CUNEIFORM SIGN DUB", + description="CUNEIFORM SIGN KA TIMES A", direction="l", linebreak="al", - unicodeslot=0x1207E, + unicodeslot=0x12158, }, - [0x1207F]={ + [0x12159]={ category="lo", - description="CUNEIFORM SIGN DUB TIMES ESH0x0002", + description="CUNEIFORM SIGN KA TIMES AD", direction="l", linebreak="al", - unicodeslot=0x1207F, + unicodeslot=0x12159, }, - [0x12080]={ + [0x1215A]={ category="lo", - description="CUNEIFORM SIGN DUB0x0002", + description="CUNEIFORM SIGN KA TIMES AD PLUS KU0x0003", direction="l", linebreak="al", - unicodeslot=0x12080, + unicodeslot=0x1215A, }, - [0x12081]={ + [0x1215B]={ category="lo", - description="CUNEIFORM SIGN DUG", + description="CUNEIFORM SIGN KA TIMES ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x12081, + unicodeslot=0x1215B, }, - [0x12082]={ + [0x1215C]={ category="lo", - description="CUNEIFORM SIGN DUGUD", + description="CUNEIFORM SIGN KA TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12082, + unicodeslot=0x1215C, }, - [0x12083]={ + [0x1215D]={ category="lo", - description="CUNEIFORM SIGN DUH", + description="CUNEIFORM SIGN KA TIMES BALAG", direction="l", linebreak="al", - unicodeslot=0x12083, + unicodeslot=0x1215D, }, - [0x12084]={ + [0x1215E]={ category="lo", - description="CUNEIFORM SIGN DUN", + description="CUNEIFORM SIGN KA TIMES BAR", direction="l", linebreak="al", - unicodeslot=0x12084, + unicodeslot=0x1215E, }, - [0x12085]={ + [0x1215F]={ category="lo", - description="CUNEIFORM SIGN DUN0x0003", + description="CUNEIFORM SIGN KA TIMES BI", direction="l", linebreak="al", - unicodeslot=0x12085, + unicodeslot=0x1215F, }, - [0x12086]={ + [0x12160]={ category="lo", - description="CUNEIFORM SIGN DUN0x0003 GUNU", + description="CUNEIFORM SIGN KA TIMES ERIN0x0002", direction="l", linebreak="al", - unicodeslot=0x12086, + unicodeslot=0x12160, }, - [0x12087]={ + [0x12161]={ category="lo", - description="CUNEIFORM SIGN DUN0x0003 GUNU GUNU", + description="CUNEIFORM SIGN KA TIMES ESH0x0002", direction="l", linebreak="al", - unicodeslot=0x12087, + unicodeslot=0x12161, }, - [0x12088]={ + [0x12162]={ category="lo", - description="CUNEIFORM SIGN DUN0x0004", + description="CUNEIFORM SIGN KA TIMES GA", direction="l", linebreak="al", - unicodeslot=0x12088, + unicodeslot=0x12162, }, - [0x12089]={ + [0x12163]={ category="lo", - description="CUNEIFORM SIGN DUR0x0002", + description="CUNEIFORM SIGN KA TIMES GAL", direction="l", linebreak="al", - unicodeslot=0x12089, + unicodeslot=0x12163, }, - [0x1208A]={ + [0x12164]={ category="lo", - description="CUNEIFORM SIGN E", + description="CUNEIFORM SIGN KA TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x1208A, + unicodeslot=0x12164, }, - [0x1208B]={ + [0x12165]={ category="lo", - description="CUNEIFORM SIGN E TIMES PAP", + description="CUNEIFORM SIGN KA TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x1208B, + unicodeslot=0x12165, }, - [0x1208C]={ + [0x12166]={ category="lo", - description="CUNEIFORM SIGN E OVER E NUN OVER NUN", + description="CUNEIFORM SIGN KA TIMES GAR PLUS SHA0x0003 PLUS A", direction="l", linebreak="al", - unicodeslot=0x1208C, + unicodeslot=0x12166, }, - [0x1208D]={ + [0x12167]={ category="lo", - description="CUNEIFORM SIGN E0x0002", + description="CUNEIFORM SIGN KA TIMES GI", direction="l", linebreak="al", - unicodeslot=0x1208D, + unicodeslot=0x12167, }, - [0x1208E]={ + [0x12168]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES A PLUS HA PLUS DA", + description="CUNEIFORM SIGN KA TIMES GIR0x0002", direction="l", linebreak="al", - unicodeslot=0x1208E, + unicodeslot=0x12168, }, - [0x1208F]={ + [0x12169]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES GAR", + description="CUNEIFORM SIGN KA TIMES GISH PLUS SAR", direction="l", linebreak="al", - unicodeslot=0x1208F, + unicodeslot=0x12169, }, - [0x12090]={ + [0x1216A]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES MI", + description="CUNEIFORM SIGN KA TIMES GISH CROSSING GISH", direction="l", linebreak="al", - unicodeslot=0x12090, + unicodeslot=0x1216A, }, - [0x12091]={ + [0x1216B]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES SAL", + description="CUNEIFORM SIGN KA TIMES GU", direction="l", linebreak="al", - unicodeslot=0x12091, + unicodeslot=0x1216B, }, - [0x12092]={ + [0x1216C]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES SHE", + description="CUNEIFORM SIGN KA TIMES GUR0x0007", direction="l", linebreak="al", - unicodeslot=0x12092, + unicodeslot=0x1216C, }, - [0x12093]={ + [0x1216D]={ category="lo", - description="CUNEIFORM SIGN E0x0002 TIMES U", + description="CUNEIFORM SIGN KA TIMES IGI", direction="l", linebreak="al", - unicodeslot=0x12093, + unicodeslot=0x1216D, }, - [0x12094]={ + [0x1216E]={ category="lo", - description="CUNEIFORM SIGN EDIN", + description="CUNEIFORM SIGN KA TIMES IM", direction="l", linebreak="al", - unicodeslot=0x12094, + unicodeslot=0x1216E, }, - [0x12095]={ + [0x1216F]={ category="lo", - description="CUNEIFORM SIGN EGIR", + description="CUNEIFORM SIGN KA TIMES KAK", direction="l", linebreak="al", - unicodeslot=0x12095, + unicodeslot=0x1216F, }, - [0x12096]={ + [0x12170]={ category="lo", - description="CUNEIFORM SIGN EL", + description="CUNEIFORM SIGN KA TIMES KI", direction="l", linebreak="al", - unicodeslot=0x12096, + unicodeslot=0x12170, }, - [0x12097]={ + [0x12171]={ category="lo", - description="CUNEIFORM SIGN EN", + description="CUNEIFORM SIGN KA TIMES KID", direction="l", linebreak="al", - unicodeslot=0x12097, + unicodeslot=0x12171, }, - [0x12098]={ + [0x12172]={ category="lo", - description="CUNEIFORM SIGN EN TIMES GAN0x0002", + description="CUNEIFORM SIGN KA TIMES LI", direction="l", linebreak="al", - unicodeslot=0x12098, + unicodeslot=0x12172, }, - [0x12099]={ + [0x12173]={ category="lo", - description="CUNEIFORM SIGN EN TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN KA TIMES LU", direction="l", linebreak="al", - unicodeslot=0x12099, + unicodeslot=0x12173, }, - [0x1209A]={ + [0x12174]={ category="lo", - description="CUNEIFORM SIGN EN TIMES ME", + description="CUNEIFORM SIGN KA TIMES ME", direction="l", linebreak="al", - unicodeslot=0x1209A, + unicodeslot=0x12174, }, - [0x1209B]={ + [0x12175]={ category="lo", - description="CUNEIFORM SIGN EN CROSSING EN", + description="CUNEIFORM SIGN KA TIMES ME PLUS DU", direction="l", linebreak="al", - unicodeslot=0x1209B, + unicodeslot=0x12175, }, - [0x1209C]={ + [0x12176]={ category="lo", - description="CUNEIFORM SIGN EN OPPOSING EN", + description="CUNEIFORM SIGN KA TIMES ME PLUS GI", direction="l", linebreak="al", - unicodeslot=0x1209C, + unicodeslot=0x12176, }, - [0x1209D]={ + [0x12177]={ category="lo", - description="CUNEIFORM SIGN EN SQUARED", + description="CUNEIFORM SIGN KA TIMES ME PLUS TE", direction="l", linebreak="al", - unicodeslot=0x1209D, + unicodeslot=0x12177, }, - [0x1209E]={ + [0x12178]={ category="lo", - description="CUNEIFORM SIGN EREN", + description="CUNEIFORM SIGN KA TIMES MI", direction="l", linebreak="al", - unicodeslot=0x1209E, + unicodeslot=0x12178, }, - [0x1209F]={ + [0x12179]={ category="lo", - description="CUNEIFORM SIGN ERIN0x0002", + description="CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ", direction="l", linebreak="al", - unicodeslot=0x1209F, + unicodeslot=0x12179, }, - [0x120A0]={ + [0x1217A]={ category="lo", - description="CUNEIFORM SIGN ESH0x0002", + description="CUNEIFORM SIGN KA TIMES NE", direction="l", linebreak="al", - unicodeslot=0x120A0, + unicodeslot=0x1217A, }, - [0x120A1]={ + [0x1217B]={ category="lo", - description="CUNEIFORM SIGN EZEN", + description="CUNEIFORM SIGN KA TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x120A1, + unicodeslot=0x1217B, }, - [0x120A2]={ + [0x1217C]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES A", + description="CUNEIFORM SIGN KA TIMES PI", direction="l", linebreak="al", - unicodeslot=0x120A2, + unicodeslot=0x1217C, }, - [0x120A3]={ + [0x1217D]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL", + description="CUNEIFORM SIGN KA TIMES RU", direction="l", linebreak="al", - unicodeslot=0x120A3, + unicodeslot=0x1217D, }, - [0x120A4]={ + [0x1217E]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL", + description="CUNEIFORM SIGN KA TIMES SA", direction="l", linebreak="al", - unicodeslot=0x120A4, + unicodeslot=0x1217E, }, - [0x120A5]={ + [0x1217F]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES AN", + description="CUNEIFORM SIGN KA TIMES SAR", direction="l", linebreak="al", - unicodeslot=0x120A5, + unicodeslot=0x1217F, }, - [0x120A6]={ + [0x12180]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES BAD", + description="CUNEIFORM SIGN KA TIMES SHA", direction="l", linebreak="al", - unicodeslot=0x120A6, + unicodeslot=0x12180, }, - [0x120A7]={ + [0x12181]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU", + description="CUNEIFORM SIGN KA TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x120A7, + unicodeslot=0x12181, }, - [0x120A8]={ + [0x12182]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU GUNU", + description="CUNEIFORM SIGN KA TIMES SHID", direction="l", linebreak="al", - unicodeslot=0x120A8, + unicodeslot=0x12182, }, - [0x120A9]={ + [0x12183]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES HA", + description="CUNEIFORM SIGN KA TIMES SHU", direction="l", linebreak="al", - unicodeslot=0x120A9, + unicodeslot=0x12183, }, - [0x120AA]={ + [0x12184]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES HA GUNU", + description="CUNEIFORM SIGN KA TIMES SIG", direction="l", linebreak="al", - unicodeslot=0x120AA, + unicodeslot=0x12184, }, - [0x120AB]={ + [0x12185]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES IGI GUNU", + description="CUNEIFORM SIGN KA TIMES SUHUR", direction="l", linebreak="al", - unicodeslot=0x120AB, + unicodeslot=0x12185, }, - [0x120AC]={ + [0x12186]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES KASKAL", + description="CUNEIFORM SIGN KA TIMES TAR", direction="l", linebreak="al", - unicodeslot=0x120AC, + unicodeslot=0x12186, }, - [0x120AD]={ + [0x12187]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED", + description="CUNEIFORM SIGN KA TIMES U", direction="l", linebreak="al", - unicodeslot=0x120AD, + unicodeslot=0x12187, }, - [0x120AE]={ + [0x12188]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES KU0x0003", + description="CUNEIFORM SIGN KA TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x120AE, + unicodeslot=0x12188, }, - [0x120AF]={ + [0x12189]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES LA", + description="CUNEIFORM SIGN KA TIMES UD", direction="l", linebreak="al", - unicodeslot=0x120AF, + unicodeslot=0x12189, }, - [0x120B0]={ + [0x1218A]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL", + description="CUNEIFORM SIGN KA TIMES UMUM TIMES PA", direction="l", linebreak="al", - unicodeslot=0x120B0, + unicodeslot=0x1218A, }, - [0x120B1]={ + [0x1218B]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES LI", + description="CUNEIFORM SIGN KA TIMES USH", direction="l", linebreak="al", - unicodeslot=0x120B1, + unicodeslot=0x1218B, }, - [0x120B2]={ + [0x1218C]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES LU", + description="CUNEIFORM SIGN KA TIMES ZI", direction="l", linebreak="al", - unicodeslot=0x120B2, + unicodeslot=0x1218C, }, - [0x120B3]={ + [0x1218D]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES U0x0002", + description="CUNEIFORM SIGN KA0x0002", direction="l", linebreak="al", - unicodeslot=0x120B3, + unicodeslot=0x1218D, }, - [0x120B4]={ + [0x1218E]={ category="lo", - description="CUNEIFORM SIGN EZEN TIMES UD", + description="CUNEIFORM SIGN KA0x0002 CROSSING KA0x0002", direction="l", linebreak="al", - unicodeslot=0x120B4, + unicodeslot=0x1218E, }, - [0x120B5]={ + [0x1218F]={ category="lo", - description="CUNEIFORM SIGN GA", + description="CUNEIFORM SIGN KAB", direction="l", linebreak="al", - unicodeslot=0x120B5, + unicodeslot=0x1218F, }, - [0x120B6]={ + [0x12190]={ category="lo", - description="CUNEIFORM SIGN GA GUNU", + description="CUNEIFORM SIGN KAD0x0002", direction="l", linebreak="al", - unicodeslot=0x120B6, + unicodeslot=0x12190, }, - [0x120B7]={ + [0x12191]={ category="lo", - description="CUNEIFORM SIGN GA0x0002", + description="CUNEIFORM SIGN KAD0x0003", direction="l", linebreak="al", - unicodeslot=0x120B7, + unicodeslot=0x12191, }, - [0x120B8]={ + [0x12192]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS DA PLUS HA", + description="CUNEIFORM SIGN KAD0x0004", direction="l", linebreak="al", - unicodeslot=0x120B8, + unicodeslot=0x12192, }, - [0x120B9]={ + [0x12193]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS HA", + description="CUNEIFORM SIGN KAD0x0005", direction="l", linebreak="al", - unicodeslot=0x120B9, + unicodeslot=0x12193, }, - [0x120BA]={ + [0x12194]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS IGI", + description="CUNEIFORM SIGN KAD0x0005 OVER KAD0x0005", direction="l", linebreak="al", - unicodeslot=0x120BA, + unicodeslot=0x12194, }, - [0x120BB]={ + [0x12195]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES AB0x0002 TENU PLUS TAB", + description="CUNEIFORM SIGN KAK", direction="l", linebreak="al", - unicodeslot=0x120BB, + unicodeslot=0x12195, }, - [0x120BC]={ + [0x12196]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES AN", + description="CUNEIFORM SIGN KAK TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x120BC, + unicodeslot=0x12196, }, - [0x120BD]={ + [0x12197]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES ASH", + description="CUNEIFORM SIGN KAL", direction="l", linebreak="al", - unicodeslot=0x120BD, + unicodeslot=0x12197, }, - [0x120BE]={ + [0x12198]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES ASH0x0002 PLUS GAL", + description="CUNEIFORM SIGN KAL TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x120BE, + unicodeslot=0x12198, }, - [0x120BF]={ + [0x12199]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES BAD", + description="CUNEIFORM SIGN KAL CROSSING KAL", direction="l", linebreak="al", - unicodeslot=0x120BF, + unicodeslot=0x12199, }, - [0x120C0]={ + [0x1219A]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES BAR PLUS RA", + description="CUNEIFORM SIGN KAM0x0002", direction="l", linebreak="al", - unicodeslot=0x120C0, + unicodeslot=0x1219A, }, - [0x120C1]={ + [0x1219B]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES BUR", + description="CUNEIFORM SIGN KAM0x0004", direction="l", linebreak="al", - unicodeslot=0x120C1, + unicodeslot=0x1219B, }, - [0x120C2]={ + [0x1219C]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES BUR PLUS RA", + description="CUNEIFORM SIGN KASKAL", direction="l", linebreak="al", - unicodeslot=0x120C2, + unicodeslot=0x1219C, }, - [0x120C3]={ + [0x1219D]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES DA", + description="CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U", direction="l", linebreak="al", - unicodeslot=0x120C3, + unicodeslot=0x1219D, }, - [0x120C4]={ + [0x1219E]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES DI", + description="CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U", direction="l", linebreak="al", - unicodeslot=0x120C4, + unicodeslot=0x1219E, }, - [0x120C5]={ + [0x1219F]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES DIM TIMES SHE", + description="CUNEIFORM SIGN KESH0x0002", direction="l", linebreak="al", - unicodeslot=0x120C5, + unicodeslot=0x1219F, }, - [0x120C6]={ + [0x121A0]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES DUB", + description="CUNEIFORM SIGN KI", direction="l", linebreak="al", - unicodeslot=0x120C6, + unicodeslot=0x121A0, }, - [0x120C7]={ + [0x121A1]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES EL", + description="CUNEIFORM SIGN KI TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x120C7, + unicodeslot=0x121A1, }, - [0x120C8]={ + [0x121A2]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES EL PLUS LA", + description="CUNEIFORM SIGN KI TIMES U", direction="l", linebreak="al", - unicodeslot=0x120C8, + unicodeslot=0x121A2, }, - [0x120C9]={ + [0x121A3]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES EN", + description="CUNEIFORM SIGN KI TIMES UD", direction="l", linebreak="al", - unicodeslot=0x120C9, + unicodeslot=0x121A3, }, - [0x120CA]={ + [0x121A4]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES EN TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN KID", direction="l", linebreak="al", - unicodeslot=0x120CA, + unicodeslot=0x121A4, }, - [0x120CB]={ + [0x121A5]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN KIN", direction="l", linebreak="al", - unicodeslot=0x120CB, + unicodeslot=0x121A5, }, - [0x120CC]={ + [0x121A6]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GAR", + description="CUNEIFORM SIGN KISAL", direction="l", linebreak="al", - unicodeslot=0x120CC, + unicodeslot=0x121A6, }, - [0x120CD]={ + [0x121A7]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GI", + description="CUNEIFORM SIGN KISH", direction="l", linebreak="al", - unicodeslot=0x120CD, + unicodeslot=0x121A7, }, - [0x120CE]={ + [0x121A8]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004", + description="CUNEIFORM SIGN KISIM0x0005", direction="l", linebreak="al", - unicodeslot=0x120CE, + unicodeslot=0x121A8, }, - [0x120CF]={ + [0x121A9]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004 PLUS A", + description="CUNEIFORM SIGN KISIM0x0005 OVER KISIM0x0005", direction="l", linebreak="al", - unicodeslot=0x120CF, + unicodeslot=0x121A9, }, - [0x120D0]={ + [0x121AA]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES GIR0x0002 PLUS SU", + description="CUNEIFORM SIGN KU", direction="l", linebreak="al", - unicodeslot=0x120D0, + unicodeslot=0x121AA, }, - [0x120D1]={ + [0x121AB]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES HA PLUS LU PLUS ESH0x0002", + description="CUNEIFORM SIGN KU OVER HI TIMES ASH0x0002 KU OVER HI TIMES ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x120D1, + unicodeslot=0x121AB, }, - [0x120D2]={ + [0x121AC]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES HAL", + description="CUNEIFORM SIGN KU0x0003", direction="l", linebreak="al", - unicodeslot=0x120D2, + unicodeslot=0x121AC, }, - [0x120D3]={ + [0x121AD]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES HAL PLUS LA", + description="CUNEIFORM SIGN KU0x0004", direction="l", linebreak="al", - unicodeslot=0x120D3, + unicodeslot=0x121AD, }, - [0x120D4]={ + [0x121AE]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES HI PLUS LI", + description="CUNEIFORM SIGN KU0x0004 VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x120D4, + unicodeslot=0x121AE, }, - [0x120D5]={ + [0x121AF]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES HUB0x0002", + description="CUNEIFORM SIGN KU0x0007", direction="l", linebreak="al", - unicodeslot=0x120D5, + unicodeslot=0x121AF, }, - [0x120D6]={ + [0x121B0]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES IGI GUNU", + description="CUNEIFORM SIGN KUL", direction="l", linebreak="al", - unicodeslot=0x120D6, + unicodeslot=0x121B0, }, - [0x120D7]={ + [0x121B1]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES ISH PLUS HU PLUS ASH", + description="CUNEIFORM SIGN KUL GUNU", direction="l", linebreak="al", - unicodeslot=0x120D7, + unicodeslot=0x121B1, }, - [0x120D8]={ + [0x121B2]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES KAK", + description="CUNEIFORM SIGN KUN", direction="l", linebreak="al", - unicodeslot=0x120D8, + unicodeslot=0x121B2, }, - [0x120D9]={ + [0x121B3]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES KASKAL", + description="CUNEIFORM SIGN KUR", direction="l", linebreak="al", - unicodeslot=0x120D9, + unicodeslot=0x121B3, }, - [0x120DA]={ + [0x121B4]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES KID", + description="CUNEIFORM SIGN KUR OPPOSING KUR", direction="l", linebreak="al", - unicodeslot=0x120DA, + unicodeslot=0x121B4, }, - [0x120DB]={ + [0x121B5]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES KID PLUS LAL", + description="CUNEIFORM SIGN KUSHU0x0002", direction="l", linebreak="al", - unicodeslot=0x120DB, + unicodeslot=0x121B5, }, - [0x120DC]={ + [0x121B6]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES KU0x0003 PLUS AN", + description="CUNEIFORM SIGN KWU0x013E", direction="l", linebreak="al", - unicodeslot=0x120DC, + unicodeslot=0x121B6, }, - [0x120DD]={ + [0x121B7]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES LA", + description="CUNEIFORM SIGN LA", direction="l", linebreak="al", - unicodeslot=0x120DD, + unicodeslot=0x121B7, }, - [0x120DE]={ + [0x121B8]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES ME PLUS EN", + description="CUNEIFORM SIGN LAGAB", direction="l", linebreak="al", - unicodeslot=0x120DE, + unicodeslot=0x121B8, }, - [0x120DF]={ + [0x121B9]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES MI", + description="CUNEIFORM SIGN LAGAB TIMES A", direction="l", linebreak="al", - unicodeslot=0x120DF, + unicodeslot=0x121B9, }, - [0x120E0]={ + [0x121BA]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES NUN", + description="CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA", direction="l", linebreak="al", - unicodeslot=0x120E0, + unicodeslot=0x121BA, }, - [0x120E1]={ + [0x121BB]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES NUN OVER NUN", + description="CUNEIFORM SIGN LAGAB TIMES A PLUS GAR", direction="l", linebreak="al", - unicodeslot=0x120E1, + unicodeslot=0x121BB, }, - [0x120E2]={ + [0x121BC]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES PA", + description="CUNEIFORM SIGN LAGAB TIMES A PLUS LAL", direction="l", linebreak="al", - unicodeslot=0x120E2, + unicodeslot=0x121BC, }, - [0x120E3]={ + [0x121BD]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SAL", + description="CUNEIFORM SIGN LAGAB TIMES AL", direction="l", linebreak="al", - unicodeslot=0x120E3, + unicodeslot=0x121BD, }, - [0x120E4]={ + [0x121BE]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SAR", + description="CUNEIFORM SIGN LAGAB TIMES AN", direction="l", linebreak="al", - unicodeslot=0x120E4, + unicodeslot=0x121BE, }, - [0x120E5]={ + [0x121BF]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SHE", + description="CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU", direction="l", linebreak="al", - unicodeslot=0x120E5, + unicodeslot=0x121BF, }, - [0x120E6]={ + [0x121C0]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SHE PLUS TUR", + description="CUNEIFORM SIGN LAGAB TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x120E6, + unicodeslot=0x121C0, }, - [0x120E7]={ + [0x121C1]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SHID", + description="CUNEIFORM SIGN LAGAB TIMES BI", direction="l", linebreak="al", - unicodeslot=0x120E7, + unicodeslot=0x121C1, }, - [0x120E8]={ + [0x121C2]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES SUM", + description="CUNEIFORM SIGN LAGAB TIMES DAR", direction="l", linebreak="al", - unicodeslot=0x120E8, + unicodeslot=0x121C2, }, - [0x120E9]={ + [0x121C3]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES TAK0x0004", + description="CUNEIFORM SIGN LAGAB TIMES EN", direction="l", linebreak="al", - unicodeslot=0x120E9, + unicodeslot=0x121C3, }, - [0x120EA]={ + [0x121C4]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES U", + description="CUNEIFORM SIGN LAGAB TIMES GA", direction="l", linebreak="al", - unicodeslot=0x120EA, + unicodeslot=0x121C4, }, - [0x120EB]={ + [0x121C5]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES UD", + description="CUNEIFORM SIGN LAGAB TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x120EB, + unicodeslot=0x121C5, }, - [0x120EC]={ + [0x121C6]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 TIMES UD PLUS DU", + description="CUNEIFORM SIGN LAGAB TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x120EC, + unicodeslot=0x121C6, }, - [0x120ED]={ + [0x121C7]={ category="lo", - description="CUNEIFORM SIGN GA0x0002 OVER GA0x0002", + description="CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD", direction="l", linebreak="al", - unicodeslot=0x120ED, + unicodeslot=0x121C7, }, - [0x120EE]={ + [0x121C8]={ category="lo", - description="CUNEIFORM SIGN GABA", + description="CUNEIFORM SIGN LAGAB TIMES HA", direction="l", linebreak="al", - unicodeslot=0x120EE, + unicodeslot=0x121C8, }, - [0x120EF]={ + [0x121C9]={ category="lo", - description="CUNEIFORM SIGN GABA CROSSING GABA", + description="CUNEIFORM SIGN LAGAB TIMES HAL", direction="l", linebreak="al", - unicodeslot=0x120EF, + unicodeslot=0x121C9, }, - [0x120F0]={ + [0x121CA]={ category="lo", - description="CUNEIFORM SIGN GAD", + description="CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x120F0, + unicodeslot=0x121CA, }, - [0x120F1]={ + [0x121CB]={ category="lo", - description="CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR", + description="CUNEIFORM SIGN LAGAB TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x120F1, + unicodeslot=0x121CB, }, - [0x120F2]={ + [0x121CC]={ category="lo", - description="CUNEIFORM SIGN GAL", + description="CUNEIFORM SIGN LAGAB TIMES IM", direction="l", linebreak="al", - unicodeslot=0x120F2, + unicodeslot=0x121CC, }, - [0x120F3]={ + [0x121CD]={ category="lo", - description="CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR", + description="CUNEIFORM SIGN LAGAB TIMES IM PLUS HA", direction="l", linebreak="al", - unicodeslot=0x120F3, + unicodeslot=0x121CD, }, - [0x120F4]={ + [0x121CE]={ category="lo", - description="CUNEIFORM SIGN GALAM", + description="CUNEIFORM SIGN LAGAB TIMES IM PLUS LU", direction="l", linebreak="al", - unicodeslot=0x120F4, + unicodeslot=0x121CE, }, - [0x120F5]={ + [0x121CF]={ category="lo", - description="CUNEIFORM SIGN GAM", + description="CUNEIFORM SIGN LAGAB TIMES KI", direction="l", linebreak="al", - unicodeslot=0x120F5, + unicodeslot=0x121CF, }, - [0x120F6]={ + [0x121D0]={ category="lo", - description="CUNEIFORM SIGN GAN", + description="CUNEIFORM SIGN LAGAB TIMES KIN", direction="l", linebreak="al", - unicodeslot=0x120F6, + unicodeslot=0x121D0, }, - [0x120F7]={ + [0x121D1]={ category="lo", - description="CUNEIFORM SIGN GAN0x0002", + description="CUNEIFORM SIGN LAGAB TIMES KU0x0003", direction="l", linebreak="al", - unicodeslot=0x120F7, + unicodeslot=0x121D1, }, - [0x120F8]={ + [0x121D2]={ category="lo", - description="CUNEIFORM SIGN GAN0x0002 TENU", + description="CUNEIFORM SIGN LAGAB TIMES KUL", direction="l", linebreak="al", - unicodeslot=0x120F8, + unicodeslot=0x121D2, }, - [0x120F9]={ + [0x121D3]={ category="lo", - description="CUNEIFORM SIGN GAN0x0002 OVER GAN0x0002", + description="CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A", direction="l", linebreak="al", - unicodeslot=0x120F9, + unicodeslot=0x121D3, }, - [0x120FA]={ + [0x121D4]={ category="lo", - description="CUNEIFORM SIGN GAN0x0002 CROSSING GAN0x0002", + description="CUNEIFORM SIGN LAGAB TIMES LAGAB", direction="l", linebreak="al", - unicodeslot=0x120FA, + unicodeslot=0x121D4, }, - [0x120FB]={ + [0x121D5]={ category="lo", - description="CUNEIFORM SIGN GAR", + description="CUNEIFORM SIGN LAGAB TIMES LISH", direction="l", linebreak="al", - unicodeslot=0x120FB, + unicodeslot=0x121D5, }, - [0x120FC]={ + [0x121D6]={ category="lo", - description="CUNEIFORM SIGN GAR0x0003", + description="CUNEIFORM SIGN LAGAB TIMES LU", direction="l", linebreak="al", - unicodeslot=0x120FC, + unicodeslot=0x121D6, }, - [0x120FD]={ + [0x121D7]={ category="lo", - description="CUNEIFORM SIGN GASHAN", + description="CUNEIFORM SIGN LAGAB TIMES LUL", direction="l", linebreak="al", - unicodeslot=0x120FD, + unicodeslot=0x121D7, }, - [0x120FE]={ + [0x121D8]={ category="lo", - description="CUNEIFORM SIGN GESHTIN", + description="CUNEIFORM SIGN LAGAB TIMES ME", direction="l", linebreak="al", - unicodeslot=0x120FE, + unicodeslot=0x121D8, }, - [0x120FF]={ + [0x121D9]={ category="lo", - description="CUNEIFORM SIGN GESHTIN TIMES KUR", + description="CUNEIFORM SIGN LAGAB TIMES ME PLUS EN", direction="l", linebreak="al", - unicodeslot=0x120FF, + unicodeslot=0x121D9, }, - [0x12100]={ + [0x121DA]={ category="lo", - description="CUNEIFORM SIGN GI", + description="CUNEIFORM SIGN LAGAB TIMES MUSH", direction="l", linebreak="al", - unicodeslot=0x12100, + unicodeslot=0x121DA, }, - [0x12101]={ + [0x121DB]={ category="lo", - description="CUNEIFORM SIGN GI TIMES E", + description="CUNEIFORM SIGN LAGAB TIMES NE", direction="l", linebreak="al", - unicodeslot=0x12101, + unicodeslot=0x121DB, }, - [0x12102]={ + [0x121DC]={ category="lo", - description="CUNEIFORM SIGN GI TIMES U", + description="CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM", direction="l", linebreak="al", - unicodeslot=0x12102, + unicodeslot=0x121DC, }, - [0x12103]={ + [0x121DD]={ category="lo", - description="CUNEIFORM SIGN GI CROSSING GI", + description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN0x0002", direction="l", linebreak="al", - unicodeslot=0x12103, + unicodeslot=0x121DD, }, - [0x12104]={ + [0x121DE]={ category="lo", - description="CUNEIFORM SIGN GI0x0004", + description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU", direction="l", linebreak="al", - unicodeslot=0x12104, + unicodeslot=0x121DE, }, - [0x12105]={ + [0x121DF]={ category="lo", - description="CUNEIFORM SIGN GI0x0004 OVER GI0x0004", + description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002", direction="l", linebreak="al", - unicodeslot=0x12105, + unicodeslot=0x121DF, }, - [0x12106]={ + [0x121E0]={ category="lo", - description="CUNEIFORM SIGN GI0x0004 CROSSING GI0x0004", + description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002 PLUS SHU0x0002", direction="l", linebreak="al", - unicodeslot=0x12106, + unicodeslot=0x121E0, }, - [0x12107]={ + [0x121E1]={ category="lo", - description="CUNEIFORM SIGN GIDIM", + description="CUNEIFORM SIGN LAGAB TIMES SUM", direction="l", linebreak="al", - unicodeslot=0x12107, + unicodeslot=0x121E1, }, - [0x12108]={ + [0x121E2]={ category="lo", - description="CUNEIFORM SIGN GIR0x0002", + description="CUNEIFORM SIGN LAGAB TIMES TAG", direction="l", linebreak="al", - unicodeslot=0x12108, + unicodeslot=0x121E2, }, - [0x12109]={ + [0x121E3]={ category="lo", - description="CUNEIFORM SIGN GIR0x0002 GUNU", + description="CUNEIFORM SIGN LAGAB TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x12109, + unicodeslot=0x121E3, }, - [0x1210A]={ + [0x121E4]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003", + description="CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA", direction="l", linebreak="al", - unicodeslot=0x1210A, + unicodeslot=0x121E4, }, - [0x1210B]={ + [0x121E5]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003 TIMES A PLUS IGI", + description="CUNEIFORM SIGN LAGAB TIMES U", direction="l", linebreak="al", - unicodeslot=0x1210B, + unicodeslot=0x121E5, }, - [0x1210C]={ + [0x121E6]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003 TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN LAGAB TIMES U PLUS A", direction="l", linebreak="al", - unicodeslot=0x1210C, + unicodeslot=0x121E6, }, - [0x1210D]={ + [0x121E7]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003 TIMES IGI", + description="CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U", direction="l", linebreak="al", - unicodeslot=0x1210D, + unicodeslot=0x121E7, }, - [0x1210E]={ + [0x121E8]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003 TIMES LU PLUS IGI", + description="CUNEIFORM SIGN LAGAB TIMES U0x0002 PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x1210E, + unicodeslot=0x121E8, }, - [0x1210F]={ + [0x121E9]={ category="lo", - description="CUNEIFORM SIGN GIR0x0003 TIMES PA", + description="CUNEIFORM SIGN LAGAB TIMES UD", direction="l", linebreak="al", - unicodeslot=0x1210F, + unicodeslot=0x121E9, }, - [0x12110]={ + [0x121EA]={ category="lo", - description="CUNEIFORM SIGN GISAL", + description="CUNEIFORM SIGN LAGAB TIMES USH", direction="l", linebreak="al", - unicodeslot=0x12110, + unicodeslot=0x121EA, }, - [0x12111]={ + [0x121EB]={ category="lo", - description="CUNEIFORM SIGN GISH", + description="CUNEIFORM SIGN LAGAB SQUARED", direction="l", linebreak="al", - unicodeslot=0x12111, + unicodeslot=0x121EB, }, - [0x12112]={ + [0x121EC]={ category="lo", - description="CUNEIFORM SIGN GISH CROSSING GISH", + description="CUNEIFORM SIGN LAGAR", direction="l", linebreak="al", - unicodeslot=0x12112, + unicodeslot=0x121EC, }, - [0x12113]={ + [0x121ED]={ category="lo", - description="CUNEIFORM SIGN GISH TIMES BAD", + description="CUNEIFORM SIGN LAGAR TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x12113, + unicodeslot=0x121ED, }, - [0x12114]={ + [0x121EE]={ category="lo", - description="CUNEIFORM SIGN GISH TIMES TAK0x0004", + description="CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM", direction="l", linebreak="al", - unicodeslot=0x12114, + unicodeslot=0x121EE, }, - [0x12115]={ + [0x121EF]={ category="lo", - description="CUNEIFORM SIGN GISH TENU", + description="CUNEIFORM SIGN LAGAR GUNU", direction="l", linebreak="al", - unicodeslot=0x12115, + unicodeslot=0x121EF, }, - [0x12116]={ + [0x121F0]={ category="lo", - description="CUNEIFORM SIGN GU", + description="CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE", direction="l", linebreak="al", - unicodeslot=0x12116, + unicodeslot=0x121F0, }, - [0x12117]={ + [0x121F1]={ category="lo", - description="CUNEIFORM SIGN GU CROSSING GU", + description="CUNEIFORM SIGN LAHSHU", direction="l", linebreak="al", - unicodeslot=0x12117, + unicodeslot=0x121F1, }, - [0x12118]={ + [0x121F2]={ category="lo", - description="CUNEIFORM SIGN GU0x0002", + description="CUNEIFORM SIGN LAL", direction="l", linebreak="al", - unicodeslot=0x12118, + unicodeslot=0x121F2, }, - [0x12119]={ + [0x121F3]={ category="lo", - description="CUNEIFORM SIGN GU0x0002 TIMES KAK", + description="CUNEIFORM SIGN LAL TIMES LAL", direction="l", linebreak="al", - unicodeslot=0x12119, + unicodeslot=0x121F3, }, - [0x1211A]={ + [0x121F4]={ category="lo", - description="CUNEIFORM SIGN GU0x0002 TIMES KAK TIMES IGI GUNU", + description="CUNEIFORM SIGN LAM", direction="l", linebreak="al", - unicodeslot=0x1211A, + unicodeslot=0x121F4, }, - [0x1211B]={ + [0x121F5]={ category="lo", - description="CUNEIFORM SIGN GU0x0002 TIMES NUN", + description="CUNEIFORM SIGN LAM TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x1211B, + unicodeslot=0x121F5, }, - [0x1211C]={ + [0x121F6]={ category="lo", - description="CUNEIFORM SIGN GU0x0002 TIMES SAL PLUS TUG0x0002", + description="CUNEIFORM SIGN LAM TIMES KUR PLUS RU", direction="l", linebreak="al", - unicodeslot=0x1211C, + unicodeslot=0x121F6, }, - [0x1211D]={ + [0x121F7]={ category="lo", - description="CUNEIFORM SIGN GU0x0002 GUNU", + description="CUNEIFORM SIGN LI", direction="l", linebreak="al", - unicodeslot=0x1211D, + unicodeslot=0x121F7, }, - [0x1211E]={ + [0x121F8]={ category="lo", - description="CUNEIFORM SIGN GUD", + description="CUNEIFORM SIGN LIL", direction="l", linebreak="al", - unicodeslot=0x1211E, + unicodeslot=0x121F8, }, - [0x1211F]={ + [0x121F9]={ category="lo", - description="CUNEIFORM SIGN GUD TIMES A PLUS KUR", + description="CUNEIFORM SIGN LIMMU0x0002", direction="l", linebreak="al", - unicodeslot=0x1211F, + unicodeslot=0x121F9, }, - [0x12120]={ + [0x121FA]={ category="lo", - description="CUNEIFORM SIGN GUD TIMES KUR", + description="CUNEIFORM SIGN LISH", direction="l", linebreak="al", - unicodeslot=0x12120, + unicodeslot=0x121FA, }, - [0x12121]={ + [0x121FB]={ category="lo", - description="CUNEIFORM SIGN GUD OVER GUD LUGAL", + description="CUNEIFORM SIGN LU", direction="l", linebreak="al", - unicodeslot=0x12121, + unicodeslot=0x121FB, }, - [0x12122]={ + [0x121FC]={ category="lo", - description="CUNEIFORM SIGN GUL", + description="CUNEIFORM SIGN LU TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12122, + unicodeslot=0x121FC, }, - [0x12123]={ + [0x121FD]={ category="lo", - description="CUNEIFORM SIGN GUM", + description="CUNEIFORM SIGN LU0x0002", direction="l", linebreak="al", - unicodeslot=0x12123, + unicodeslot=0x121FD, }, - [0x12124]={ + [0x121FE]={ category="lo", - description="CUNEIFORM SIGN GUM TIMES SHE", + description="CUNEIFORM SIGN LU0x0002 TIMES AL", direction="l", linebreak="al", - unicodeslot=0x12124, + unicodeslot=0x121FE, }, - [0x12125]={ + [0x121FF]={ category="lo", - description="CUNEIFORM SIGN GUR", + description="CUNEIFORM SIGN LU0x0002 TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12125, + unicodeslot=0x121FF, }, - [0x12126]={ + [0x12200]={ category="lo", - description="CUNEIFORM SIGN GUR0x0007", + description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002", direction="l", linebreak="al", - unicodeslot=0x12126, + unicodeslot=0x12200, }, - [0x12127]={ + [0x12201]={ category="lo", - description="CUNEIFORM SIGN GURUN", + description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12127, + unicodeslot=0x12201, }, - [0x12128]={ + [0x12202]={ category="lo", - description="CUNEIFORM SIGN GURUSH", + description="CUNEIFORM SIGN LU0x0002 TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12128, + unicodeslot=0x12202, }, - [0x12129]={ + [0x12203]={ category="lo", - description="CUNEIFORM SIGN HA", + description="CUNEIFORM SIGN LU0x0002 TIMES HI TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12129, + unicodeslot=0x12203, }, - [0x1212A]={ + [0x12204]={ category="lo", - description="CUNEIFORM SIGN HA TENU", + description="CUNEIFORM SIGN LU0x0002 TIMES IM", direction="l", linebreak="al", - unicodeslot=0x1212A, + unicodeslot=0x12204, }, - [0x1212B]={ + [0x12205]={ category="lo", - description="CUNEIFORM SIGN HA GUNU", + description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0002", direction="l", linebreak="al", - unicodeslot=0x1212B, + unicodeslot=0x12205, }, - [0x1212C]={ + [0x12206]={ category="lo", - description="CUNEIFORM SIGN HAL", + description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003", direction="l", linebreak="al", - unicodeslot=0x1212C, + unicodeslot=0x12206, }, - [0x1212D]={ + [0x12207]={ category="lo", - description="CUNEIFORM SIGN HI", + description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003 PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x1212D, + unicodeslot=0x12207, }, - [0x1212E]={ + [0x12208]={ category="lo", - description="CUNEIFORM SIGN HI TIMES ASH", + description="CUNEIFORM SIGN LU0x0002 TIMES KI", direction="l", linebreak="al", - unicodeslot=0x1212E, + unicodeslot=0x12208, }, - [0x1212F]={ + [0x12209]={ category="lo", - description="CUNEIFORM SIGN HI TIMES ASH0x0002", + description="CUNEIFORM SIGN LU0x0002 TIMES LA PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x1212F, + unicodeslot=0x12209, }, - [0x12130]={ + [0x1220A]={ category="lo", - description="CUNEIFORM SIGN HI TIMES BAD", + description="CUNEIFORM SIGN LU0x0002 TIMES LAGAB", direction="l", linebreak="al", - unicodeslot=0x12130, + unicodeslot=0x1220A, }, - [0x12131]={ + [0x1220B]={ category="lo", - description="CUNEIFORM SIGN HI TIMES DISH", + description="CUNEIFORM SIGN LU0x0002 TIMES ME PLUS EN", direction="l", linebreak="al", - unicodeslot=0x12131, + unicodeslot=0x1220B, }, - [0x12132]={ + [0x1220C]={ category="lo", - description="CUNEIFORM SIGN HI TIMES GAD", + description="CUNEIFORM SIGN LU0x0002 TIMES NE", direction="l", linebreak="al", - unicodeslot=0x12132, + unicodeslot=0x1220C, }, - [0x12133]={ + [0x1220D]={ category="lo", - description="CUNEIFORM SIGN HI TIMES KIN", + description="CUNEIFORM SIGN LU0x0002 TIMES NU", direction="l", linebreak="al", - unicodeslot=0x12133, + unicodeslot=0x1220D, }, - [0x12134]={ + [0x1220E]={ category="lo", - description="CUNEIFORM SIGN HI TIMES NUN", + description="CUNEIFORM SIGN LU0x0002 TIMES SI PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x12134, + unicodeslot=0x1220E, }, - [0x12135]={ + [0x1220F]={ category="lo", - description="CUNEIFORM SIGN HI TIMES SHE", + description="CUNEIFORM SIGN LU0x0002 TIMES SIK0x0002 PLUS BU", direction="l", linebreak="al", - unicodeslot=0x12135, + unicodeslot=0x1220F, }, - [0x12136]={ + [0x12210]={ category="lo", - description="CUNEIFORM SIGN HI TIMES U", + description="CUNEIFORM SIGN LU0x0002 TIMES TUG0x0002", direction="l", linebreak="al", - unicodeslot=0x12136, + unicodeslot=0x12210, }, - [0x12137]={ + [0x12211]={ category="lo", - description="CUNEIFORM SIGN HU", + description="CUNEIFORM SIGN LU0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12137, + unicodeslot=0x12211, }, - [0x12138]={ + [0x12212]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002", + description="CUNEIFORM SIGN LU0x0002 CROSSING LU0x0002", direction="l", linebreak="al", - unicodeslot=0x12138, + unicodeslot=0x12212, }, - [0x12139]={ + [0x12213]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002 TIMES AN", + description="CUNEIFORM SIGN LU0x0002 OPPOSING LU0x0002", direction="l", linebreak="al", - unicodeslot=0x12139, + unicodeslot=0x12213, }, - [0x1213A]={ + [0x12214]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002 TIMES HAL", + description="CUNEIFORM SIGN LU0x0002 SQUARED", direction="l", linebreak="al", - unicodeslot=0x1213A, + unicodeslot=0x12214, }, - [0x1213B]={ + [0x12215]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002 TIMES KASKAL", + description="CUNEIFORM SIGN LU0x0002 SHESHIG", direction="l", linebreak="al", - unicodeslot=0x1213B, + unicodeslot=0x12215, }, - [0x1213C]={ + [0x12216]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002 TIMES LISH", + description="CUNEIFORM SIGN LU0x0003", direction="l", linebreak="al", - unicodeslot=0x1213C, + unicodeslot=0x12216, }, - [0x1213D]={ + [0x12217]={ category="lo", - description="CUNEIFORM SIGN HUB0x0002 TIMES UD", + description="CUNEIFORM SIGN LUGAL", direction="l", linebreak="al", - unicodeslot=0x1213D, + unicodeslot=0x12217, }, - [0x1213E]={ + [0x12218]={ category="lo", - description="CUNEIFORM SIGN HUL0x0002", + description="CUNEIFORM SIGN LUGAL OVER LUGAL", direction="l", linebreak="al", - unicodeslot=0x1213E, + unicodeslot=0x12218, }, - [0x1213F]={ + [0x12219]={ category="lo", - description="CUNEIFORM SIGN I", + description="CUNEIFORM SIGN LUGAL OPPOSING LUGAL", direction="l", linebreak="al", - unicodeslot=0x1213F, + unicodeslot=0x12219, }, - [0x12140]={ + [0x1221A]={ category="lo", - description="CUNEIFORM SIGN I A", + description="CUNEIFORM SIGN LUGAL SHESHIG", direction="l", linebreak="al", - unicodeslot=0x12140, + unicodeslot=0x1221A, }, - [0x12141]={ + [0x1221B]={ category="lo", - description="CUNEIFORM SIGN IB", + description="CUNEIFORM SIGN LUH", direction="l", linebreak="al", - unicodeslot=0x12141, + unicodeslot=0x1221B, }, - [0x12142]={ + [0x1221C]={ category="lo", - description="CUNEIFORM SIGN IDIM", + description="CUNEIFORM SIGN LUL", direction="l", linebreak="al", - unicodeslot=0x12142, + unicodeslot=0x1221C, }, - [0x12143]={ + [0x1221D]={ category="lo", - description="CUNEIFORM SIGN IDIM OVER IDIM BUR", + description="CUNEIFORM SIGN LUM", direction="l", linebreak="al", - unicodeslot=0x12143, + unicodeslot=0x1221D, }, - [0x12144]={ + [0x1221E]={ category="lo", - description="CUNEIFORM SIGN IDIM OVER IDIM SQUARED", + description="CUNEIFORM SIGN LUM OVER LUM", direction="l", linebreak="al", - unicodeslot=0x12144, + unicodeslot=0x1221E, }, - [0x12145]={ + [0x1221F]={ category="lo", - description="CUNEIFORM SIGN IG", + description="CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x12145, + unicodeslot=0x1221F, }, - [0x12146]={ + [0x12220]={ category="lo", - description="CUNEIFORM SIGN IGI", + description="CUNEIFORM SIGN MA", direction="l", linebreak="al", - unicodeslot=0x12146, + unicodeslot=0x12220, }, - [0x12147]={ + [0x12221]={ category="lo", - description="CUNEIFORM SIGN IGI DIB", + description="CUNEIFORM SIGN MA TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x12147, + unicodeslot=0x12221, }, - [0x12148]={ + [0x12222]={ category="lo", - description="CUNEIFORM SIGN IGI RI", + description="CUNEIFORM SIGN MA GUNU", direction="l", linebreak="al", - unicodeslot=0x12148, + unicodeslot=0x12222, }, - [0x12149]={ + [0x12223]={ category="lo", - description="CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD", + description="CUNEIFORM SIGN MA0x0002", direction="l", linebreak="al", - unicodeslot=0x12149, + unicodeslot=0x12223, }, - [0x1214A]={ + [0x12224]={ category="lo", - description="CUNEIFORM SIGN IGI GUNU", + description="CUNEIFORM SIGN MAH", direction="l", linebreak="al", - unicodeslot=0x1214A, + unicodeslot=0x12224, }, - [0x1214B]={ + [0x12225]={ category="lo", - description="CUNEIFORM SIGN IL", + description="CUNEIFORM SIGN MAR", direction="l", linebreak="al", - unicodeslot=0x1214B, + unicodeslot=0x12225, }, - [0x1214C]={ + [0x12226]={ category="lo", - description="CUNEIFORM SIGN IL TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN MASH", direction="l", linebreak="al", - unicodeslot=0x1214C, + unicodeslot=0x12226, }, - [0x1214D]={ + [0x12227]={ category="lo", - description="CUNEIFORM SIGN IL0x0002", + description="CUNEIFORM SIGN MASH0x0002", direction="l", linebreak="al", - unicodeslot=0x1214D, + unicodeslot=0x12227, }, - [0x1214E]={ + [0x12228]={ category="lo", - description="CUNEIFORM SIGN IM", + description="CUNEIFORM SIGN ME", direction="l", linebreak="al", - unicodeslot=0x1214E, + unicodeslot=0x12228, }, - [0x1214F]={ + [0x12229]={ category="lo", - description="CUNEIFORM SIGN IM TIMES TAK0x0004", + description="CUNEIFORM SIGN MES", direction="l", linebreak="al", - unicodeslot=0x1214F, + unicodeslot=0x12229, }, - [0x12150]={ + [0x1222A]={ category="lo", - description="CUNEIFORM SIGN IM CROSSING IM", + description="CUNEIFORM SIGN MI", direction="l", linebreak="al", - unicodeslot=0x12150, + unicodeslot=0x1222A, }, - [0x12151]={ + [0x1222B]={ category="lo", - description="CUNEIFORM SIGN IM OPPOSING IM", + description="CUNEIFORM SIGN MIN", direction="l", linebreak="al", - unicodeslot=0x12151, + unicodeslot=0x1222B, }, - [0x12152]={ + [0x1222C]={ category="lo", - description="CUNEIFORM SIGN IM SQUARED", + description="CUNEIFORM SIGN MU", direction="l", linebreak="al", - unicodeslot=0x12152, + unicodeslot=0x1222C, }, - [0x12153]={ + [0x1222D]={ category="lo", - description="CUNEIFORM SIGN IMIN", + description="CUNEIFORM SIGN MU OVER MU", direction="l", linebreak="al", - unicodeslot=0x12153, + unicodeslot=0x1222D, }, - [0x12154]={ + [0x1222E]={ category="lo", - description="CUNEIFORM SIGN IN", + description="CUNEIFORM SIGN MUG", direction="l", linebreak="al", - unicodeslot=0x12154, + unicodeslot=0x1222E, }, - [0x12155]={ + [0x1222F]={ category="lo", - description="CUNEIFORM SIGN IR", + description="CUNEIFORM SIGN MUG GUNU", direction="l", linebreak="al", - unicodeslot=0x12155, + unicodeslot=0x1222F, }, - [0x12156]={ + [0x12230]={ category="lo", - description="CUNEIFORM SIGN ISH", + description="CUNEIFORM SIGN MUNSUB", direction="l", linebreak="al", - unicodeslot=0x12156, + unicodeslot=0x12230, }, - [0x12157]={ + [0x12231]={ category="lo", - description="CUNEIFORM SIGN KA", + description="CUNEIFORM SIGN MURGU0x0002", direction="l", linebreak="al", - unicodeslot=0x12157, + unicodeslot=0x12231, }, - [0x12158]={ + [0x12232]={ category="lo", - description="CUNEIFORM SIGN KA TIMES A", + description="CUNEIFORM SIGN MUSH", direction="l", linebreak="al", - unicodeslot=0x12158, + unicodeslot=0x12232, }, - [0x12159]={ + [0x12233]={ category="lo", - description="CUNEIFORM SIGN KA TIMES AD", + description="CUNEIFORM SIGN MUSH TIMES A", direction="l", linebreak="al", - unicodeslot=0x12159, + unicodeslot=0x12233, }, - [0x1215A]={ + [0x12234]={ category="lo", - description="CUNEIFORM SIGN KA TIMES AD PLUS KU0x0003", + description="CUNEIFORM SIGN MUSH TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x1215A, + unicodeslot=0x12234, }, - [0x1215B]={ + [0x12235]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ASH0x0002", + description="CUNEIFORM SIGN MUSH TIMES ZA", direction="l", linebreak="al", - unicodeslot=0x1215B, + unicodeslot=0x12235, }, - [0x1215C]={ + [0x12236]={ category="lo", - description="CUNEIFORM SIGN KA TIMES BAD", + description="CUNEIFORM SIGN MUSH OVER MUSH", direction="l", linebreak="al", - unicodeslot=0x1215C, + unicodeslot=0x12236, }, - [0x1215D]={ + [0x12237]={ category="lo", - description="CUNEIFORM SIGN KA TIMES BALAG", + description="CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA", direction="l", linebreak="al", - unicodeslot=0x1215D, + unicodeslot=0x12237, }, - [0x1215E]={ + [0x12238]={ category="lo", - description="CUNEIFORM SIGN KA TIMES BAR", + description="CUNEIFORM SIGN MUSH CROSSING MUSH", direction="l", linebreak="al", - unicodeslot=0x1215E, + unicodeslot=0x12238, }, - [0x1215F]={ + [0x12239]={ category="lo", - description="CUNEIFORM SIGN KA TIMES BI", + description="CUNEIFORM SIGN MUSH0x0003", direction="l", linebreak="al", - unicodeslot=0x1215F, + unicodeslot=0x12239, }, - [0x12160]={ + [0x1223A]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ERIN0x0002", + description="CUNEIFORM SIGN MUSH0x0003 TIMES A", direction="l", linebreak="al", - unicodeslot=0x12160, + unicodeslot=0x1223A, }, - [0x12161]={ + [0x1223B]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ESH0x0002", + description="CUNEIFORM SIGN MUSH0x0003 TIMES A PLUS DI", direction="l", linebreak="al", - unicodeslot=0x12161, + unicodeslot=0x1223B, }, - [0x12162]={ + [0x1223C]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GA", + description="CUNEIFORM SIGN MUSH0x0003 TIMES DI", direction="l", linebreak="al", - unicodeslot=0x12162, + unicodeslot=0x1223C, }, - [0x12163]={ + [0x1223D]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GAL", + description="CUNEIFORM SIGN MUSH0x0003 GUNU", direction="l", linebreak="al", - unicodeslot=0x12163, + unicodeslot=0x1223D, }, - [0x12164]={ + [0x1223E]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN NA", direction="l", linebreak="al", - unicodeslot=0x12164, + unicodeslot=0x1223E, }, - [0x12165]={ + [0x1223F]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GAR", + description="CUNEIFORM SIGN NA0x0002", direction="l", linebreak="al", - unicodeslot=0x12165, + unicodeslot=0x1223F, }, - [0x12166]={ + [0x12240]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GAR PLUS SHA0x0003 PLUS A", + description="CUNEIFORM SIGN NAGA", direction="l", linebreak="al", - unicodeslot=0x12166, + unicodeslot=0x12240, }, - [0x12167]={ + [0x12241]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GI", + description="CUNEIFORM SIGN NAGA INVERTED", direction="l", linebreak="al", - unicodeslot=0x12167, + unicodeslot=0x12241, }, - [0x12168]={ + [0x12242]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GIR0x0002", + description="CUNEIFORM SIGN NAGA TIMES SHU TENU", direction="l", linebreak="al", - unicodeslot=0x12168, + unicodeslot=0x12242, }, - [0x12169]={ + [0x12243]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GISH PLUS SAR", + description="CUNEIFORM SIGN NAGA OPPOSING NAGA", direction="l", linebreak="al", - unicodeslot=0x12169, + unicodeslot=0x12243, }, - [0x1216A]={ + [0x12244]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GISH CROSSING GISH", + description="CUNEIFORM SIGN NAGAR", direction="l", linebreak="al", - unicodeslot=0x1216A, + unicodeslot=0x12244, }, - [0x1216B]={ + [0x12245]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GU", + description="CUNEIFORM SIGN NAM NUTILLU", direction="l", linebreak="al", - unicodeslot=0x1216B, + unicodeslot=0x12245, }, - [0x1216C]={ + [0x12246]={ category="lo", - description="CUNEIFORM SIGN KA TIMES GUR0x0007", + description="CUNEIFORM SIGN NAM", direction="l", linebreak="al", - unicodeslot=0x1216C, + unicodeslot=0x12246, }, - [0x1216D]={ + [0x12247]={ category="lo", - description="CUNEIFORM SIGN KA TIMES IGI", + description="CUNEIFORM SIGN NAM0x0002", direction="l", linebreak="al", - unicodeslot=0x1216D, + unicodeslot=0x12247, }, - [0x1216E]={ + [0x12248]={ category="lo", - description="CUNEIFORM SIGN KA TIMES IM", + description="CUNEIFORM SIGN NE", direction="l", linebreak="al", - unicodeslot=0x1216E, + unicodeslot=0x12248, }, - [0x1216F]={ + [0x12249]={ category="lo", - description="CUNEIFORM SIGN KA TIMES KAK", + description="CUNEIFORM SIGN NE TIMES A", direction="l", linebreak="al", - unicodeslot=0x1216F, + unicodeslot=0x12249, }, - [0x12170]={ + [0x1224A]={ category="lo", - description="CUNEIFORM SIGN KA TIMES KI", + description="CUNEIFORM SIGN NE TIMES UD", direction="l", linebreak="al", - unicodeslot=0x12170, + unicodeslot=0x1224A, }, - [0x12171]={ + [0x1224B]={ category="lo", - description="CUNEIFORM SIGN KA TIMES KID", + description="CUNEIFORM SIGN NE SHESHIG", direction="l", linebreak="al", - unicodeslot=0x12171, + unicodeslot=0x1224B, }, - [0x12172]={ + [0x1224C]={ category="lo", - description="CUNEIFORM SIGN KA TIMES LI", + description="CUNEIFORM SIGN NI", direction="l", linebreak="al", - unicodeslot=0x12172, + unicodeslot=0x1224C, }, - [0x12173]={ + [0x1224D]={ category="lo", - description="CUNEIFORM SIGN KA TIMES LU", + description="CUNEIFORM SIGN NI TIMES E", direction="l", linebreak="al", - unicodeslot=0x12173, + unicodeslot=0x1224D, }, - [0x12174]={ + [0x1224E]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ME", + description="CUNEIFORM SIGN NI0x0002", direction="l", linebreak="al", - unicodeslot=0x12174, + unicodeslot=0x1224E, }, - [0x12175]={ + [0x1224F]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ME PLUS DU", + description="CUNEIFORM SIGN NIM", direction="l", linebreak="al", - unicodeslot=0x12175, + unicodeslot=0x1224F, }, - [0x12176]={ + [0x12250]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ME PLUS GI", + description="CUNEIFORM SIGN NIM TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12176, + unicodeslot=0x12250, }, - [0x12177]={ + [0x12251]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ME PLUS TE", + description="CUNEIFORM SIGN NIM TIMES GAR PLUS GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12177, + unicodeslot=0x12251, }, - [0x12178]={ + [0x12252]={ category="lo", - description="CUNEIFORM SIGN KA TIMES MI", + description="CUNEIFORM SIGN NINDA0x0002", direction="l", linebreak="al", - unicodeslot=0x12178, + unicodeslot=0x12252, }, - [0x12179]={ + [0x12253]={ category="lo", - description="CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ", + description="CUNEIFORM SIGN NINDA0x0002 TIMES AN", direction="l", linebreak="al", - unicodeslot=0x12179, + unicodeslot=0x12253, }, - [0x1217A]={ + [0x12254]={ category="lo", - description="CUNEIFORM SIGN KA TIMES NE", + description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH", direction="l", linebreak="al", - unicodeslot=0x1217A, + unicodeslot=0x12254, }, - [0x1217B]={ + [0x12255]={ category="lo", - description="CUNEIFORM SIGN KA TIMES NUN", + description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x1217B, + unicodeslot=0x12255, }, - [0x1217C]={ + [0x12256]={ category="lo", - description="CUNEIFORM SIGN KA TIMES PI", + description="CUNEIFORM SIGN NINDA0x0002 TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x1217C, + unicodeslot=0x12256, }, - [0x1217D]={ + [0x12257]={ category="lo", - description="CUNEIFORM SIGN KA TIMES RU", + description="CUNEIFORM SIGN NINDA0x0002 TIMES ME PLUS GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x1217D, + unicodeslot=0x12257, }, - [0x1217E]={ + [0x12258]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SA", + description="CUNEIFORM SIGN NINDA0x0002 TIMES NE", direction="l", linebreak="al", - unicodeslot=0x1217E, + unicodeslot=0x12258, }, - [0x1217F]={ + [0x12259]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SAR", + description="CUNEIFORM SIGN NINDA0x0002 TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x1217F, + unicodeslot=0x12259, }, - [0x12180]={ + [0x1225A]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SHA", + description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x12180, + unicodeslot=0x1225A, }, - [0x12181]={ + [0x1225B]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SHE", + description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS A AN", direction="l", linebreak="al", - unicodeslot=0x12181, + unicodeslot=0x1225B, }, - [0x12182]={ + [0x1225C]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SHID", + description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x12182, + unicodeslot=0x1225C, }, - [0x12183]={ + [0x1225D]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SHU", + description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x12183, + unicodeslot=0x1225D, }, - [0x12184]={ + [0x1225E]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SIG", + description="CUNEIFORM SIGN NINDA0x0002 TIMES U0x0002 PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x12184, + unicodeslot=0x1225E, }, - [0x12185]={ + [0x1225F]={ category="lo", - description="CUNEIFORM SIGN KA TIMES SUHUR", + description="CUNEIFORM SIGN NINDA0x0002 TIMES USH", direction="l", linebreak="al", - unicodeslot=0x12185, + unicodeslot=0x1225F, }, - [0x12186]={ + [0x12260]={ category="lo", - description="CUNEIFORM SIGN KA TIMES TAR", + description="CUNEIFORM SIGN NISAG", direction="l", linebreak="al", - unicodeslot=0x12186, + unicodeslot=0x12260, }, - [0x12187]={ + [0x12261]={ category="lo", - description="CUNEIFORM SIGN KA TIMES U", + description="CUNEIFORM SIGN NU", direction="l", linebreak="al", - unicodeslot=0x12187, + unicodeslot=0x12261, }, - [0x12188]={ + [0x12262]={ category="lo", - description="CUNEIFORM SIGN KA TIMES U0x0002", + description="CUNEIFORM SIGN NU0x000B", direction="l", linebreak="al", - unicodeslot=0x12188, + unicodeslot=0x12262, }, - [0x12189]={ + [0x12263]={ category="lo", - description="CUNEIFORM SIGN KA TIMES UD", + description="CUNEIFORM SIGN NUN", direction="l", linebreak="al", - unicodeslot=0x12189, + unicodeslot=0x12263, }, - [0x1218A]={ + [0x12264]={ category="lo", - description="CUNEIFORM SIGN KA TIMES UMUM TIMES PA", + description="CUNEIFORM SIGN NUN LAGAR TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x1218A, + unicodeslot=0x12264, }, - [0x1218B]={ + [0x12265]={ category="lo", - description="CUNEIFORM SIGN KA TIMES USH", + description="CUNEIFORM SIGN NUN LAGAR TIMES MASH", direction="l", linebreak="al", - unicodeslot=0x1218B, + unicodeslot=0x12265, }, - [0x1218C]={ + [0x12266]={ category="lo", - description="CUNEIFORM SIGN KA TIMES ZI", + description="CUNEIFORM SIGN NUN LAGAR TIMES SAL", direction="l", linebreak="al", - unicodeslot=0x1218C, + unicodeslot=0x12266, }, - [0x1218D]={ + [0x12267]={ category="lo", - description="CUNEIFORM SIGN KA0x0002", + description="CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL", direction="l", linebreak="al", - unicodeslot=0x1218D, + unicodeslot=0x12267, }, - [0x1218E]={ + [0x12268]={ category="lo", - description="CUNEIFORM SIGN KA0x0002 CROSSING KA0x0002", + description="CUNEIFORM SIGN NUN LAGAR TIMES USH", direction="l", linebreak="al", - unicodeslot=0x1218E, + unicodeslot=0x12268, }, - [0x1218F]={ + [0x12269]={ category="lo", - description="CUNEIFORM SIGN KAB", + description="CUNEIFORM SIGN NUN TENU", direction="l", linebreak="al", - unicodeslot=0x1218F, + unicodeslot=0x12269, }, - [0x12190]={ + [0x1226A]={ category="lo", - description="CUNEIFORM SIGN KAD0x0002", + description="CUNEIFORM SIGN NUN OVER NUN", direction="l", linebreak="al", - unicodeslot=0x12190, + unicodeslot=0x1226A, }, - [0x12191]={ + [0x1226B]={ category="lo", - description="CUNEIFORM SIGN KAD0x0003", + description="CUNEIFORM SIGN NUN CROSSING NUN", direction="l", linebreak="al", - unicodeslot=0x12191, + unicodeslot=0x1226B, }, - [0x12192]={ + [0x1226C]={ category="lo", - description="CUNEIFORM SIGN KAD0x0004", + description="CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR", direction="l", linebreak="al", - unicodeslot=0x12192, + unicodeslot=0x1226C, }, - [0x12193]={ + [0x1226D]={ category="lo", - description="CUNEIFORM SIGN KAD0x0005", + description="CUNEIFORM SIGN NUNUZ", direction="l", linebreak="al", - unicodeslot=0x12193, + unicodeslot=0x1226D, }, - [0x12194]={ + [0x1226E]={ category="lo", - description="CUNEIFORM SIGN KAD0x0005 OVER KAD0x0005", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES ASHGAB", direction="l", linebreak="al", - unicodeslot=0x12194, + unicodeslot=0x1226E, }, - [0x12195]={ + [0x1226F]={ category="lo", - description="CUNEIFORM SIGN KAK", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES BI", direction="l", linebreak="al", - unicodeslot=0x12195, + unicodeslot=0x1226F, }, - [0x12196]={ + [0x12270]={ category="lo", - description="CUNEIFORM SIGN KAK TIMES IGI GUNU", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES DUG", direction="l", linebreak="al", - unicodeslot=0x12196, + unicodeslot=0x12270, }, - [0x12197]={ + [0x12271]={ category="lo", - description="CUNEIFORM SIGN KAL", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x12197, + unicodeslot=0x12271, }, - [0x12198]={ + [0x12272]={ category="lo", - description="CUNEIFORM SIGN KAL TIMES BAD", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x12198, + unicodeslot=0x12272, }, - [0x12199]={ + [0x12273]={ category="lo", - description="CUNEIFORM SIGN KAL CROSSING KAL", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES KAD0x0003", direction="l", linebreak="al", - unicodeslot=0x12199, + unicodeslot=0x12273, }, - [0x1219A]={ + [0x12274]={ category="lo", - description="CUNEIFORM SIGN KAM0x0002", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES LA", direction="l", linebreak="al", - unicodeslot=0x1219A, + unicodeslot=0x12274, }, - [0x1219B]={ + [0x12275]={ category="lo", - description="CUNEIFORM SIGN KAM0x0004", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES NE", direction="l", linebreak="al", - unicodeslot=0x1219B, + unicodeslot=0x12275, }, - [0x1219C]={ + [0x12276]={ category="lo", - description="CUNEIFORM SIGN KASKAL", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES SILA0x0003", direction="l", linebreak="al", - unicodeslot=0x1219C, + unicodeslot=0x12276, }, - [0x1219D]={ + [0x12277]={ category="lo", - description="CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U", + description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x1219D, + unicodeslot=0x12277, }, - [0x1219E]={ + [0x12278]={ category="lo", - description="CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U", + description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI", direction="l", linebreak="al", - unicodeslot=0x1219E, + unicodeslot=0x12278, }, - [0x1219F]={ + [0x12279]={ category="lo", - description="CUNEIFORM SIGN KESH0x0002", + description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI U", direction="l", linebreak="al", - unicodeslot=0x1219F, + unicodeslot=0x12279, }, - [0x121A0]={ + [0x1227A]={ category="lo", - description="CUNEIFORM SIGN KI", + description="CUNEIFORM SIGN PA", direction="l", linebreak="al", - unicodeslot=0x121A0, + unicodeslot=0x1227A, }, - [0x121A1]={ + [0x1227B]={ category="lo", - description="CUNEIFORM SIGN KI TIMES BAD", + description="CUNEIFORM SIGN PAD", direction="l", linebreak="al", - unicodeslot=0x121A1, + unicodeslot=0x1227B, }, - [0x121A2]={ + [0x1227C]={ category="lo", - description="CUNEIFORM SIGN KI TIMES U", + description="CUNEIFORM SIGN PAN", direction="l", linebreak="al", - unicodeslot=0x121A2, + unicodeslot=0x1227C, }, - [0x121A3]={ + [0x1227D]={ category="lo", - description="CUNEIFORM SIGN KI TIMES UD", + description="CUNEIFORM SIGN PAP", direction="l", linebreak="al", - unicodeslot=0x121A3, + unicodeslot=0x1227D, }, - [0x121A4]={ + [0x1227E]={ category="lo", - description="CUNEIFORM SIGN KID", + description="CUNEIFORM SIGN PESH0x0002", direction="l", linebreak="al", - unicodeslot=0x121A4, + unicodeslot=0x1227E, }, - [0x121A5]={ + [0x1227F]={ category="lo", - description="CUNEIFORM SIGN KIN", + description="CUNEIFORM SIGN PI", direction="l", linebreak="al", - unicodeslot=0x121A5, + unicodeslot=0x1227F, }, - [0x121A6]={ + [0x12280]={ category="lo", - description="CUNEIFORM SIGN KISAL", + description="CUNEIFORM SIGN PI TIMES A", direction="l", linebreak="al", - unicodeslot=0x121A6, + unicodeslot=0x12280, }, - [0x121A7]={ + [0x12281]={ category="lo", - description="CUNEIFORM SIGN KISH", + description="CUNEIFORM SIGN PI TIMES AB", direction="l", linebreak="al", - unicodeslot=0x121A7, + unicodeslot=0x12281, }, - [0x121A8]={ + [0x12282]={ category="lo", - description="CUNEIFORM SIGN KISIM0x0005", + description="CUNEIFORM SIGN PI TIMES BI", direction="l", linebreak="al", - unicodeslot=0x121A8, + unicodeslot=0x12282, }, - [0x121A9]={ + [0x12283]={ category="lo", - description="CUNEIFORM SIGN KISIM0x0005 OVER KISIM0x0005", + description="CUNEIFORM SIGN PI TIMES BU", direction="l", linebreak="al", - unicodeslot=0x121A9, + unicodeslot=0x12283, }, - [0x121AA]={ + [0x12284]={ category="lo", - description="CUNEIFORM SIGN KU", + description="CUNEIFORM SIGN PI TIMES E", direction="l", linebreak="al", - unicodeslot=0x121AA, + unicodeslot=0x12284, }, - [0x121AB]={ + [0x12285]={ category="lo", - description="CUNEIFORM SIGN KU OVER HI TIMES ASH0x0002 KU OVER HI TIMES ASH0x0002", + description="CUNEIFORM SIGN PI TIMES I", direction="l", linebreak="al", - unicodeslot=0x121AB, + unicodeslot=0x12285, }, - [0x121AC]={ + [0x12286]={ category="lo", - description="CUNEIFORM SIGN KU0x0003", + description="CUNEIFORM SIGN PI TIMES IB", direction="l", linebreak="al", - unicodeslot=0x121AC, + unicodeslot=0x12286, }, - [0x121AD]={ + [0x12287]={ category="lo", - description="CUNEIFORM SIGN KU0x0004", + description="CUNEIFORM SIGN PI TIMES U", direction="l", linebreak="al", - unicodeslot=0x121AD, + unicodeslot=0x12287, }, - [0x121AE]={ + [0x12288]={ category="lo", - description="CUNEIFORM SIGN KU0x0004 VARIANT FORM", + description="CUNEIFORM SIGN PI TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x121AE, + unicodeslot=0x12288, }, - [0x121AF]={ + [0x12289]={ category="lo", - description="CUNEIFORM SIGN KU0x0007", + description="CUNEIFORM SIGN PI CROSSING PI", direction="l", linebreak="al", - unicodeslot=0x121AF, + unicodeslot=0x12289, }, - [0x121B0]={ + [0x1228A]={ category="lo", - description="CUNEIFORM SIGN KUL", + description="CUNEIFORM SIGN PIRIG", direction="l", linebreak="al", - unicodeslot=0x121B0, + unicodeslot=0x1228A, }, - [0x121B1]={ + [0x1228B]={ category="lo", - description="CUNEIFORM SIGN KUL GUNU", + description="CUNEIFORM SIGN PIRIG TIMES KAL", direction="l", linebreak="al", - unicodeslot=0x121B1, + unicodeslot=0x1228B, }, - [0x121B2]={ + [0x1228C]={ category="lo", - description="CUNEIFORM SIGN KUN", + description="CUNEIFORM SIGN PIRIG TIMES UD", direction="l", linebreak="al", - unicodeslot=0x121B2, + unicodeslot=0x1228C, }, - [0x121B3]={ + [0x1228D]={ category="lo", - description="CUNEIFORM SIGN KUR", + description="CUNEIFORM SIGN PIRIG TIMES ZA", direction="l", linebreak="al", - unicodeslot=0x121B3, + unicodeslot=0x1228D, }, - [0x121B4]={ + [0x1228E]={ category="lo", - description="CUNEIFORM SIGN KUR OPPOSING KUR", + description="CUNEIFORM SIGN PIRIG OPPOSING PIRIG", direction="l", linebreak="al", - unicodeslot=0x121B4, + unicodeslot=0x1228E, }, - [0x121B5]={ + [0x1228F]={ category="lo", - description="CUNEIFORM SIGN KUSHU0x0002", + description="CUNEIFORM SIGN RA", direction="l", linebreak="al", - unicodeslot=0x121B5, + unicodeslot=0x1228F, }, - [0x121B6]={ + [0x12290]={ category="lo", - description="CUNEIFORM SIGN KWU0x013E", + description="CUNEIFORM SIGN RAB", direction="l", linebreak="al", - unicodeslot=0x121B6, + unicodeslot=0x12290, }, - [0x121B7]={ + [0x12291]={ category="lo", - description="CUNEIFORM SIGN LA", + description="CUNEIFORM SIGN RI", direction="l", linebreak="al", - unicodeslot=0x121B7, + unicodeslot=0x12291, }, - [0x121B8]={ + [0x12292]={ category="lo", - description="CUNEIFORM SIGN LAGAB", + description="CUNEIFORM SIGN RU", direction="l", linebreak="al", - unicodeslot=0x121B8, + unicodeslot=0x12292, }, - [0x121B9]={ + [0x12293]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES A", + description="CUNEIFORM SIGN SA", direction="l", linebreak="al", - unicodeslot=0x121B9, + unicodeslot=0x12293, }, - [0x121BA]={ + [0x12294]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA", + description="CUNEIFORM SIGN SAG NUTILLU", direction="l", linebreak="al", - unicodeslot=0x121BA, + unicodeslot=0x12294, }, - [0x121BB]={ + [0x12295]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES A PLUS GAR", + description="CUNEIFORM SIGN SAG", direction="l", linebreak="al", - unicodeslot=0x121BB, + unicodeslot=0x12295, }, - [0x121BC]={ + [0x12296]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES A PLUS LAL", + description="CUNEIFORM SIGN SAG TIMES A", direction="l", linebreak="al", - unicodeslot=0x121BC, + unicodeslot=0x12296, }, - [0x121BD]={ + [0x12297]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES AL", + description="CUNEIFORM SIGN SAG TIMES DU", direction="l", linebreak="al", - unicodeslot=0x121BD, + unicodeslot=0x12297, }, - [0x121BE]={ + [0x12298]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES AN", + description="CUNEIFORM SIGN SAG TIMES DUB", direction="l", linebreak="al", - unicodeslot=0x121BE, + unicodeslot=0x12298, }, - [0x121BF]={ + [0x12299]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU", + description="CUNEIFORM SIGN SAG TIMES HA", direction="l", linebreak="al", - unicodeslot=0x121BF, + unicodeslot=0x12299, }, - [0x121C0]={ + [0x1229A]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES BAD", + description="CUNEIFORM SIGN SAG TIMES KAK", direction="l", linebreak="al", - unicodeslot=0x121C0, + unicodeslot=0x1229A, }, - [0x121C1]={ + [0x1229B]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES BI", + description="CUNEIFORM SIGN SAG TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x121C1, + unicodeslot=0x1229B, }, - [0x121C2]={ + [0x1229C]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES DAR", + description="CUNEIFORM SIGN SAG TIMES LUM", direction="l", linebreak="al", - unicodeslot=0x121C2, + unicodeslot=0x1229C, }, - [0x121C3]={ + [0x1229D]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES EN", + description="CUNEIFORM SIGN SAG TIMES MI", direction="l", linebreak="al", - unicodeslot=0x121C3, + unicodeslot=0x1229D, }, - [0x121C4]={ + [0x1229E]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES GA", + description="CUNEIFORM SIGN SAG TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x121C4, + unicodeslot=0x1229E, }, - [0x121C5]={ + [0x1229F]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES GAR", + description="CUNEIFORM SIGN SAG TIMES SAL", direction="l", linebreak="al", - unicodeslot=0x121C5, + unicodeslot=0x1229F, }, - [0x121C6]={ + [0x122A0]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES GUD", + description="CUNEIFORM SIGN SAG TIMES SHID", direction="l", linebreak="al", - unicodeslot=0x121C6, + unicodeslot=0x122A0, }, - [0x121C7]={ + [0x122A1]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD", + description="CUNEIFORM SIGN SAG TIMES TAB", direction="l", linebreak="al", - unicodeslot=0x121C7, + unicodeslot=0x122A1, }, - [0x121C8]={ + [0x122A2]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES HA", + description="CUNEIFORM SIGN SAG TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x121C8, + unicodeslot=0x122A2, }, - [0x121C9]={ + [0x122A3]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES HAL", + description="CUNEIFORM SIGN SAG TIMES UB", direction="l", linebreak="al", - unicodeslot=0x121C9, + unicodeslot=0x122A3, }, - [0x121CA]={ + [0x122A4]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN", + description="CUNEIFORM SIGN SAG TIMES UM", direction="l", linebreak="al", - unicodeslot=0x121CA, + unicodeslot=0x122A4, }, - [0x121CB]={ + [0x122A5]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES IGI GUNU", + description="CUNEIFORM SIGN SAG TIMES UR", direction="l", linebreak="al", - unicodeslot=0x121CB, + unicodeslot=0x122A5, }, - [0x121CC]={ + [0x122A6]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES IM", + description="CUNEIFORM SIGN SAG TIMES USH", direction="l", linebreak="al", - unicodeslot=0x121CC, + unicodeslot=0x122A6, }, - [0x121CD]={ + [0x122A7]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES IM PLUS HA", + description="CUNEIFORM SIGN SAG OVER SAG", direction="l", linebreak="al", - unicodeslot=0x121CD, + unicodeslot=0x122A7, }, - [0x121CE]={ + [0x122A8]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES IM PLUS LU", + description="CUNEIFORM SIGN SAG GUNU", direction="l", linebreak="al", - unicodeslot=0x121CE, + unicodeslot=0x122A8, }, - [0x121CF]={ + [0x122A9]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES KI", + description="CUNEIFORM SIGN SAL", direction="l", linebreak="al", - unicodeslot=0x121CF, + unicodeslot=0x122A9, }, - [0x121D0]={ + [0x122AA]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES KIN", + description="CUNEIFORM SIGN SAL LAGAB TIMES ASH0x0002", direction="l", linebreak="al", - unicodeslot=0x121D0, + unicodeslot=0x122AA, }, - [0x121D1]={ + [0x122AB]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES KU0x0003", + description="CUNEIFORM SIGN SANGA0x0002", direction="l", linebreak="al", - unicodeslot=0x121D1, + unicodeslot=0x122AB, }, - [0x121D2]={ + [0x122AC]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES KUL", + description="CUNEIFORM SIGN SAR", direction="l", linebreak="al", - unicodeslot=0x121D2, + unicodeslot=0x122AC, }, - [0x121D3]={ + [0x122AD]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A", + description="CUNEIFORM SIGN SHA", direction="l", linebreak="al", - unicodeslot=0x121D3, + unicodeslot=0x122AD, }, - [0x121D4]={ + [0x122AE]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES LAGAB", + description="CUNEIFORM SIGN SHA0x0003", direction="l", linebreak="al", - unicodeslot=0x121D4, + unicodeslot=0x122AE, }, - [0x121D5]={ + [0x122AF]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES LISH", + description="CUNEIFORM SIGN SHA0x0003 TIMES A", direction="l", linebreak="al", - unicodeslot=0x121D5, + unicodeslot=0x122AF, }, - [0x121D6]={ + [0x122B0]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES LU", + description="CUNEIFORM SIGN SHA0x0003 TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x121D6, + unicodeslot=0x122B0, }, - [0x121D7]={ + [0x122B1]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES LUL", + description="CUNEIFORM SIGN SHA0x0003 TIMES GISH", direction="l", linebreak="al", - unicodeslot=0x121D7, + unicodeslot=0x122B1, }, - [0x121D8]={ + [0x122B2]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES ME", + description="CUNEIFORM SIGN SHA0x0003 TIMES NE", direction="l", linebreak="al", - unicodeslot=0x121D8, + unicodeslot=0x122B2, }, - [0x121D9]={ + [0x122B3]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES ME PLUS EN", + description="CUNEIFORM SIGN SHA0x0003 TIMES SHU0x0002", direction="l", linebreak="al", - unicodeslot=0x121D9, + unicodeslot=0x122B3, }, - [0x121DA]={ + [0x122B4]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES MUSH", + description="CUNEIFORM SIGN SHA0x0003 TIMES TUR", direction="l", linebreak="al", - unicodeslot=0x121DA, + unicodeslot=0x122B4, }, - [0x121DB]={ + [0x122B5]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES NE", + description="CUNEIFORM SIGN SHA0x0003 TIMES U", direction="l", linebreak="al", - unicodeslot=0x121DB, + unicodeslot=0x122B5, }, - [0x121DC]={ + [0x122B6]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM", + description="CUNEIFORM SIGN SHA0x0003 TIMES U PLUS A", direction="l", linebreak="al", - unicodeslot=0x121DC, + unicodeslot=0x122B6, }, - [0x121DD]={ + [0x122B7]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN0x0002", + description="CUNEIFORM SIGN SHA0x0006", direction="l", linebreak="al", - unicodeslot=0x121DD, + unicodeslot=0x122B7, }, - [0x121DE]={ + [0x122B8]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU", + description="CUNEIFORM SIGN SHAB0x0006", direction="l", linebreak="al", - unicodeslot=0x121DE, + unicodeslot=0x122B8, }, - [0x121DF]={ + [0x122B9]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002", + description="CUNEIFORM SIGN SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x121DF, + unicodeslot=0x122B9, }, - [0x121E0]={ + [0x122BA]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002 PLUS SHU0x0002", + description="CUNEIFORM SIGN SHE", direction="l", linebreak="al", - unicodeslot=0x121E0, + unicodeslot=0x122BA, }, - [0x121E1]={ + [0x122BB]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES SUM", + description="CUNEIFORM SIGN SHE HU", direction="l", linebreak="al", - unicodeslot=0x121E1, + unicodeslot=0x122BB, }, - [0x121E2]={ + [0x122BC]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES TAG", + description="CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x121E2, + unicodeslot=0x122BC, }, - [0x121E3]={ + [0x122BD]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES TAK0x0004", + description="CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x121E3, + unicodeslot=0x122BD, }, - [0x121E4]={ + [0x122BE]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA", + description="CUNEIFORM SIGN SHEG0x0009", direction="l", linebreak="al", - unicodeslot=0x121E4, + unicodeslot=0x122BE, }, - [0x121E5]={ + [0x122BF]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES U", + description="CUNEIFORM SIGN SHEN", direction="l", linebreak="al", - unicodeslot=0x121E5, + unicodeslot=0x122BF, }, - [0x121E6]={ + [0x122C0]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES U PLUS A", + description="CUNEIFORM SIGN SHESH", direction="l", linebreak="al", - unicodeslot=0x121E6, + unicodeslot=0x122C0, }, - [0x121E7]={ + [0x122C1]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U", + description="CUNEIFORM SIGN SHESH0x0002", direction="l", linebreak="al", - unicodeslot=0x121E7, + unicodeslot=0x122C1, }, - [0x121E8]={ + [0x122C2]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES U0x0002 PLUS ASH", + description="CUNEIFORM SIGN SHESHLAM", direction="l", linebreak="al", - unicodeslot=0x121E8, + unicodeslot=0x122C2, }, - [0x121E9]={ + [0x122C3]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES UD", + description="CUNEIFORM SIGN SHID", direction="l", linebreak="al", - unicodeslot=0x121E9, + unicodeslot=0x122C3, }, - [0x121EA]={ + [0x122C4]={ category="lo", - description="CUNEIFORM SIGN LAGAB TIMES USH", + description="CUNEIFORM SIGN SHID TIMES A", direction="l", linebreak="al", - unicodeslot=0x121EA, + unicodeslot=0x122C4, }, - [0x121EB]={ + [0x122C5]={ category="lo", - description="CUNEIFORM SIGN LAGAB SQUARED", + description="CUNEIFORM SIGN SHID TIMES IM", direction="l", linebreak="al", - unicodeslot=0x121EB, + unicodeslot=0x122C5, }, - [0x121EC]={ + [0x122C6]={ category="lo", - description="CUNEIFORM SIGN LAGAR", + description="CUNEIFORM SIGN SHIM", direction="l", linebreak="al", - unicodeslot=0x121EC, + unicodeslot=0x122C6, }, - [0x121ED]={ + [0x122C7]={ category="lo", - description="CUNEIFORM SIGN LAGAR TIMES SHE", + description="CUNEIFORM SIGN SHIM TIMES A", direction="l", linebreak="al", - unicodeslot=0x121ED, + unicodeslot=0x122C7, }, - [0x121EE]={ + [0x122C8]={ category="lo", - description="CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM", + description="CUNEIFORM SIGN SHIM TIMES BAL", direction="l", linebreak="al", - unicodeslot=0x121EE, + unicodeslot=0x122C8, }, - [0x121EF]={ + [0x122C9]={ category="lo", - description="CUNEIFORM SIGN LAGAR GUNU", + description="CUNEIFORM SIGN SHIM TIMES BULUG", direction="l", linebreak="al", - unicodeslot=0x121EF, + unicodeslot=0x122C9, }, - [0x121F0]={ + [0x122CA]={ category="lo", - description="CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE", + description="CUNEIFORM SIGN SHIM TIMES DIN", direction="l", linebreak="al", - unicodeslot=0x121F0, + unicodeslot=0x122CA, }, - [0x121F1]={ + [0x122CB]={ category="lo", - description="CUNEIFORM SIGN LAHSHU", + description="CUNEIFORM SIGN SHIM TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x121F1, + unicodeslot=0x122CB, }, - [0x121F2]={ + [0x122CC]={ category="lo", - description="CUNEIFORM SIGN LAL", + description="CUNEIFORM SIGN SHIM TIMES IGI", direction="l", linebreak="al", - unicodeslot=0x121F2, + unicodeslot=0x122CC, }, - [0x121F3]={ + [0x122CD]={ category="lo", - description="CUNEIFORM SIGN LAL TIMES LAL", + description="CUNEIFORM SIGN SHIM TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x121F3, + unicodeslot=0x122CD, }, - [0x121F4]={ + [0x122CE]={ category="lo", - description="CUNEIFORM SIGN LAM", + description="CUNEIFORM SIGN SHIM TIMES KUSHU0x0002", direction="l", linebreak="al", - unicodeslot=0x121F4, + unicodeslot=0x122CE, }, - [0x121F5]={ + [0x122CF]={ category="lo", - description="CUNEIFORM SIGN LAM TIMES KUR", + description="CUNEIFORM SIGN SHIM TIMES LUL", direction="l", linebreak="al", - unicodeslot=0x121F5, + unicodeslot=0x122CF, }, - [0x121F6]={ + [0x122D0]={ category="lo", - description="CUNEIFORM SIGN LAM TIMES KUR PLUS RU", + description="CUNEIFORM SIGN SHIM TIMES MUG", direction="l", linebreak="al", - unicodeslot=0x121F6, + unicodeslot=0x122D0, }, - [0x121F7]={ + [0x122D1]={ category="lo", - description="CUNEIFORM SIGN LI", + description="CUNEIFORM SIGN SHIM TIMES SAL", direction="l", linebreak="al", - unicodeslot=0x121F7, + unicodeslot=0x122D1, }, - [0x121F8]={ + [0x122D2]={ category="lo", - description="CUNEIFORM SIGN LIL", + description="CUNEIFORM SIGN SHINIG", direction="l", linebreak="al", - unicodeslot=0x121F8, + unicodeslot=0x122D2, }, - [0x121F9]={ + [0x122D3]={ category="lo", - description="CUNEIFORM SIGN LIMMU0x0002", + description="CUNEIFORM SIGN SHIR", direction="l", linebreak="al", - unicodeslot=0x121F9, + unicodeslot=0x122D3, }, - [0x121FA]={ + [0x122D4]={ category="lo", - description="CUNEIFORM SIGN LISH", + description="CUNEIFORM SIGN SHIR TENU", direction="l", linebreak="al", - unicodeslot=0x121FA, + unicodeslot=0x122D4, }, - [0x121FB]={ + [0x122D5]={ category="lo", - description="CUNEIFORM SIGN LU", + description="CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR", direction="l", linebreak="al", - unicodeslot=0x121FB, + unicodeslot=0x122D5, }, - [0x121FC]={ + [0x122D6]={ category="lo", - description="CUNEIFORM SIGN LU TIMES BAD", + description="CUNEIFORM SIGN SHITA", direction="l", linebreak="al", - unicodeslot=0x121FC, + unicodeslot=0x122D6, }, - [0x121FD]={ + [0x122D7]={ category="lo", - description="CUNEIFORM SIGN LU0x0002", + description="CUNEIFORM SIGN SHU", direction="l", linebreak="al", - unicodeslot=0x121FD, + unicodeslot=0x122D7, }, - [0x121FE]={ + [0x122D8]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES AL", + description="CUNEIFORM SIGN SHU OVER INVERTED SHU", direction="l", linebreak="al", - unicodeslot=0x121FE, + unicodeslot=0x122D8, }, - [0x121FF]={ + [0x122D9]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES BAD", + description="CUNEIFORM SIGN SHU0x0002", direction="l", linebreak="al", - unicodeslot=0x121FF, + unicodeslot=0x122D9, }, - [0x12200]={ + [0x122DA]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002", + description="CUNEIFORM SIGN SHUBUR", direction="l", linebreak="al", - unicodeslot=0x12200, + unicodeslot=0x122DA, }, - [0x12201]={ + [0x122DB]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002 TENU", + description="CUNEIFORM SIGN SI", direction="l", linebreak="al", - unicodeslot=0x12201, + unicodeslot=0x122DB, }, - [0x12202]={ + [0x122DC]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN SI GUNU", direction="l", linebreak="al", - unicodeslot=0x12202, + unicodeslot=0x122DC, }, - [0x12203]={ + [0x122DD]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES HI TIMES BAD", + description="CUNEIFORM SIGN SIG", direction="l", linebreak="al", - unicodeslot=0x12203, + unicodeslot=0x122DD, }, - [0x12204]={ + [0x122DE]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES IM", + description="CUNEIFORM SIGN SIG0x0004", direction="l", linebreak="al", - unicodeslot=0x12204, + unicodeslot=0x122DE, }, - [0x12205]={ + [0x122DF]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0002", + description="CUNEIFORM SIGN SIG0x0004 OVER SIG0x0004 SHU0x0002", direction="l", linebreak="al", - unicodeslot=0x12205, + unicodeslot=0x122DF, }, - [0x12206]={ + [0x122E0]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003", + description="CUNEIFORM SIGN SIK0x0002", direction="l", linebreak="al", - unicodeslot=0x12206, + unicodeslot=0x122E0, }, - [0x12207]={ + [0x122E1]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003 PLUS ASH", + description="CUNEIFORM SIGN SILA0x0003", direction="l", linebreak="al", - unicodeslot=0x12207, + unicodeslot=0x122E1, }, - [0x12208]={ + [0x122E2]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES KI", + description="CUNEIFORM SIGN SU", direction="l", linebreak="al", - unicodeslot=0x12208, + unicodeslot=0x122E2, }, - [0x12209]={ + [0x122E3]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES LA PLUS ASH", + description="CUNEIFORM SIGN SU OVER SU", direction="l", linebreak="al", - unicodeslot=0x12209, + unicodeslot=0x122E3, }, - [0x1220A]={ + [0x122E4]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES LAGAB", + description="CUNEIFORM SIGN SUD", direction="l", linebreak="al", - unicodeslot=0x1220A, + unicodeslot=0x122E4, }, - [0x1220B]={ + [0x122E5]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES ME PLUS EN", + description="CUNEIFORM SIGN SUD0x0002", direction="l", linebreak="al", - unicodeslot=0x1220B, + unicodeslot=0x122E5, }, - [0x1220C]={ + [0x122E6]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES NE", + description="CUNEIFORM SIGN SUHUR", direction="l", linebreak="al", - unicodeslot=0x1220C, + unicodeslot=0x122E6, }, - [0x1220D]={ + [0x122E7]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES NU", + description="CUNEIFORM SIGN SUM", direction="l", linebreak="al", - unicodeslot=0x1220D, + unicodeslot=0x122E7, }, - [0x1220E]={ + [0x122E8]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES SI PLUS ASH", + description="CUNEIFORM SIGN SUMASH", direction="l", linebreak="al", - unicodeslot=0x1220E, + unicodeslot=0x122E8, }, - [0x1220F]={ + [0x122E9]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES SIK0x0002 PLUS BU", + description="CUNEIFORM SIGN SUR", direction="l", linebreak="al", - unicodeslot=0x1220F, + unicodeslot=0x122E9, }, - [0x12210]={ + [0x122EA]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TIMES TUG0x0002", + description="CUNEIFORM SIGN SUR0x0009", direction="l", linebreak="al", - unicodeslot=0x12210, + unicodeslot=0x122EA, }, - [0x12211]={ + [0x122EB]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 TENU", + description="CUNEIFORM SIGN TA", direction="l", linebreak="al", - unicodeslot=0x12211, + unicodeslot=0x122EB, }, - [0x12212]={ + [0x122EC]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 CROSSING LU0x0002", + description="CUNEIFORM SIGN TA ASTERISK", direction="l", linebreak="al", - unicodeslot=0x12212, + unicodeslot=0x122EC, }, - [0x12213]={ + [0x122ED]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 OPPOSING LU0x0002", + description="CUNEIFORM SIGN TA TIMES HI", direction="l", linebreak="al", - unicodeslot=0x12213, + unicodeslot=0x122ED, }, - [0x12214]={ + [0x122EE]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 SQUARED", + description="CUNEIFORM SIGN TA TIMES MI", direction="l", linebreak="al", - unicodeslot=0x12214, + unicodeslot=0x122EE, }, - [0x12215]={ + [0x122EF]={ category="lo", - description="CUNEIFORM SIGN LU0x0002 SHESHIG", + description="CUNEIFORM SIGN TA GUNU", direction="l", linebreak="al", - unicodeslot=0x12215, + unicodeslot=0x122EF, }, - [0x12216]={ + [0x122F0]={ category="lo", - description="CUNEIFORM SIGN LU0x0003", + description="CUNEIFORM SIGN TAB", direction="l", linebreak="al", - unicodeslot=0x12216, + unicodeslot=0x122F0, }, - [0x12217]={ + [0x122F1]={ category="lo", - description="CUNEIFORM SIGN LUGAL", + description="CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH", direction="l", linebreak="al", - unicodeslot=0x12217, + unicodeslot=0x122F1, }, - [0x12218]={ + [0x122F2]={ category="lo", - description="CUNEIFORM SIGN LUGAL OVER LUGAL", + description="CUNEIFORM SIGN TAB SQUARED", direction="l", linebreak="al", - unicodeslot=0x12218, + unicodeslot=0x122F2, }, - [0x12219]={ + [0x122F3]={ category="lo", - description="CUNEIFORM SIGN LUGAL OPPOSING LUGAL", + description="CUNEIFORM SIGN TAG", direction="l", linebreak="al", - unicodeslot=0x12219, + unicodeslot=0x122F3, }, - [0x1221A]={ + [0x122F4]={ category="lo", - description="CUNEIFORM SIGN LUGAL SHESHIG", + description="CUNEIFORM SIGN TAG TIMES BI", direction="l", linebreak="al", - unicodeslot=0x1221A, + unicodeslot=0x122F4, }, - [0x1221B]={ + [0x122F5]={ category="lo", - description="CUNEIFORM SIGN LUH", + description="CUNEIFORM SIGN TAG TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x1221B, + unicodeslot=0x122F5, }, - [0x1221C]={ + [0x122F6]={ category="lo", - description="CUNEIFORM SIGN LUL", + description="CUNEIFORM SIGN TAG TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1221C, + unicodeslot=0x122F6, }, - [0x1221D]={ + [0x122F7]={ category="lo", - description="CUNEIFORM SIGN LUM", + description="CUNEIFORM SIGN TAG TIMES SHU", direction="l", linebreak="al", - unicodeslot=0x1221D, + unicodeslot=0x122F7, }, - [0x1221E]={ + [0x122F8]={ category="lo", - description="CUNEIFORM SIGN LUM OVER LUM", + description="CUNEIFORM SIGN TAG TIMES TUG0x0002", direction="l", linebreak="al", - unicodeslot=0x1221E, + unicodeslot=0x122F8, }, - [0x1221F]={ + [0x122F9]={ category="lo", - description="CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR", + description="CUNEIFORM SIGN TAG TIMES UD", direction="l", linebreak="al", - unicodeslot=0x1221F, + unicodeslot=0x122F9, }, - [0x12220]={ + [0x122FA]={ category="lo", - description="CUNEIFORM SIGN MA", + description="CUNEIFORM SIGN TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x12220, + unicodeslot=0x122FA, }, - [0x12221]={ + [0x122FB]={ category="lo", - description="CUNEIFORM SIGN MA TIMES TAK0x0004", + description="CUNEIFORM SIGN TAR", direction="l", linebreak="al", - unicodeslot=0x12221, + unicodeslot=0x122FB, }, - [0x12222]={ + [0x122FC]={ category="lo", - description="CUNEIFORM SIGN MA GUNU", + description="CUNEIFORM SIGN TE", direction="l", linebreak="al", - unicodeslot=0x12222, + unicodeslot=0x122FC, }, - [0x12223]={ + [0x122FD]={ category="lo", - description="CUNEIFORM SIGN MA0x0002", + description="CUNEIFORM SIGN TE GUNU", direction="l", linebreak="al", - unicodeslot=0x12223, + unicodeslot=0x122FD, }, - [0x12224]={ + [0x122FE]={ category="lo", - description="CUNEIFORM SIGN MAH", + description="CUNEIFORM SIGN TI", direction="l", linebreak="al", - unicodeslot=0x12224, + unicodeslot=0x122FE, }, - [0x12225]={ + [0x122FF]={ category="lo", - description="CUNEIFORM SIGN MAR", + description="CUNEIFORM SIGN TI TENU", direction="l", linebreak="al", - unicodeslot=0x12225, + unicodeslot=0x122FF, }, - [0x12226]={ + [0x12300]={ category="lo", - description="CUNEIFORM SIGN MASH", + description="CUNEIFORM SIGN TIL", direction="l", linebreak="al", - unicodeslot=0x12226, + unicodeslot=0x12300, }, - [0x12227]={ + [0x12301]={ category="lo", - description="CUNEIFORM SIGN MASH0x0002", + description="CUNEIFORM SIGN TIR", direction="l", linebreak="al", - unicodeslot=0x12227, + unicodeslot=0x12301, }, - [0x12228]={ + [0x12302]={ category="lo", - description="CUNEIFORM SIGN ME", + description="CUNEIFORM SIGN TIR TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x12228, + unicodeslot=0x12302, }, - [0x12229]={ + [0x12303]={ category="lo", - description="CUNEIFORM SIGN MES", + description="CUNEIFORM SIGN TIR OVER TIR", direction="l", linebreak="al", - unicodeslot=0x12229, + unicodeslot=0x12303, }, - [0x1222A]={ + [0x12304]={ category="lo", - description="CUNEIFORM SIGN MI", + description="CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x1222A, + unicodeslot=0x12304, }, - [0x1222B]={ + [0x12305]={ category="lo", - description="CUNEIFORM SIGN MIN", + description="CUNEIFORM SIGN TU", direction="l", linebreak="al", - unicodeslot=0x1222B, + unicodeslot=0x12305, }, - [0x1222C]={ + [0x12306]={ category="lo", - description="CUNEIFORM SIGN MU", + description="CUNEIFORM SIGN TUG0x0002", direction="l", linebreak="al", - unicodeslot=0x1222C, + unicodeslot=0x12306, }, - [0x1222D]={ + [0x12307]={ category="lo", - description="CUNEIFORM SIGN MU OVER MU", + description="CUNEIFORM SIGN TUK", direction="l", linebreak="al", - unicodeslot=0x1222D, + unicodeslot=0x12307, }, - [0x1222E]={ + [0x12308]={ category="lo", - description="CUNEIFORM SIGN MUG", + description="CUNEIFORM SIGN TUM", direction="l", linebreak="al", - unicodeslot=0x1222E, + unicodeslot=0x12308, }, - [0x1222F]={ + [0x12309]={ category="lo", - description="CUNEIFORM SIGN MUG GUNU", + description="CUNEIFORM SIGN TUR", direction="l", linebreak="al", - unicodeslot=0x1222F, + unicodeslot=0x12309, }, - [0x12230]={ + [0x1230A]={ category="lo", - description="CUNEIFORM SIGN MUNSUB", + description="CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA", direction="l", linebreak="al", - unicodeslot=0x12230, + unicodeslot=0x1230A, }, - [0x12231]={ + [0x1230B]={ category="lo", - description="CUNEIFORM SIGN MURGU0x0002", + description="CUNEIFORM SIGN U", direction="l", linebreak="al", - unicodeslot=0x12231, + unicodeslot=0x1230B, }, - [0x12232]={ + [0x1230C]={ category="lo", - description="CUNEIFORM SIGN MUSH", + description="CUNEIFORM SIGN U GUD", direction="l", linebreak="al", - unicodeslot=0x12232, + unicodeslot=0x1230C, }, - [0x12233]={ + [0x1230D]={ category="lo", - description="CUNEIFORM SIGN MUSH TIMES A", + description="CUNEIFORM SIGN U U U", direction="l", linebreak="al", - unicodeslot=0x12233, + unicodeslot=0x1230D, }, - [0x12234]={ + [0x1230E]={ category="lo", - description="CUNEIFORM SIGN MUSH TIMES KUR", + description="CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR", direction="l", linebreak="al", - unicodeslot=0x12234, + unicodeslot=0x1230E, }, - [0x12235]={ + [0x1230F]={ category="lo", - description="CUNEIFORM SIGN MUSH TIMES ZA", + description="CUNEIFORM SIGN U OVER U SUR OVER SUR", direction="l", linebreak="al", - unicodeslot=0x12235, + unicodeslot=0x1230F, }, - [0x12236]={ + [0x12310]={ category="lo", - description="CUNEIFORM SIGN MUSH OVER MUSH", + description="CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED", direction="l", linebreak="al", - unicodeslot=0x12236, + unicodeslot=0x12310, }, - [0x12237]={ + [0x12311]={ category="lo", - description="CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA", + description="CUNEIFORM SIGN U0x0002", direction="l", linebreak="al", - unicodeslot=0x12237, + unicodeslot=0x12311, }, - [0x12238]={ + [0x12312]={ category="lo", - description="CUNEIFORM SIGN MUSH CROSSING MUSH", + description="CUNEIFORM SIGN UB", direction="l", linebreak="al", - unicodeslot=0x12238, + unicodeslot=0x12312, }, - [0x12239]={ + [0x12313]={ category="lo", - description="CUNEIFORM SIGN MUSH0x0003", + description="CUNEIFORM SIGN UD", direction="l", linebreak="al", - unicodeslot=0x12239, + unicodeslot=0x12313, }, - [0x1223A]={ + [0x12314]={ category="lo", - description="CUNEIFORM SIGN MUSH0x0003 TIMES A", + description="CUNEIFORM SIGN UD KUSHU0x0002", direction="l", linebreak="al", - unicodeslot=0x1223A, + unicodeslot=0x12314, }, - [0x1223B]={ + [0x12315]={ category="lo", - description="CUNEIFORM SIGN MUSH0x0003 TIMES A PLUS DI", + description="CUNEIFORM SIGN UD TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x1223B, + unicodeslot=0x12315, }, - [0x1223C]={ + [0x12316]={ category="lo", - description="CUNEIFORM SIGN MUSH0x0003 TIMES DI", + description="CUNEIFORM SIGN UD TIMES MI", direction="l", linebreak="al", - unicodeslot=0x1223C, + unicodeslot=0x12316, }, - [0x1223D]={ + [0x12317]={ category="lo", - description="CUNEIFORM SIGN MUSH0x0003 GUNU", + description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U", direction="l", linebreak="al", - unicodeslot=0x1223D, + unicodeslot=0x12317, }, - [0x1223E]={ + [0x12318]={ category="lo", - description="CUNEIFORM SIGN NA", + description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU", direction="l", linebreak="al", - unicodeslot=0x1223E, + unicodeslot=0x12318, }, - [0x1223F]={ + [0x12319]={ category="lo", - description="CUNEIFORM SIGN NA0x0002", + description="CUNEIFORM SIGN UD GUNU", direction="l", linebreak="al", - unicodeslot=0x1223F, + unicodeslot=0x12319, }, - [0x12240]={ + [0x1231A]={ category="lo", - description="CUNEIFORM SIGN NAGA", + description="CUNEIFORM SIGN UD SHESHIG", direction="l", linebreak="al", - unicodeslot=0x12240, + unicodeslot=0x1231A, }, - [0x12241]={ + [0x1231B]={ category="lo", - description="CUNEIFORM SIGN NAGA INVERTED", + description="CUNEIFORM SIGN UD SHESHIG TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x12241, + unicodeslot=0x1231B, }, - [0x12242]={ + [0x1231C]={ category="lo", - description="CUNEIFORM SIGN NAGA TIMES SHU TENU", + description="CUNEIFORM SIGN UDUG", direction="l", linebreak="al", - unicodeslot=0x12242, + unicodeslot=0x1231C, }, - [0x12243]={ + [0x1231D]={ category="lo", - description="CUNEIFORM SIGN NAGA OPPOSING NAGA", + description="CUNEIFORM SIGN UM", direction="l", linebreak="al", - unicodeslot=0x12243, + unicodeslot=0x1231D, }, - [0x12244]={ + [0x1231E]={ category="lo", - description="CUNEIFORM SIGN NAGAR", + description="CUNEIFORM SIGN UM TIMES LAGAB", direction="l", linebreak="al", - unicodeslot=0x12244, + unicodeslot=0x1231E, }, - [0x12245]={ + [0x1231F]={ category="lo", - description="CUNEIFORM SIGN NAM NUTILLU", + description="CUNEIFORM SIGN UM TIMES ME PLUS DA", direction="l", linebreak="al", - unicodeslot=0x12245, + unicodeslot=0x1231F, }, - [0x12246]={ + [0x12320]={ category="lo", - description="CUNEIFORM SIGN NAM", + description="CUNEIFORM SIGN UM TIMES SHA0x0003", direction="l", linebreak="al", - unicodeslot=0x12246, + unicodeslot=0x12320, }, - [0x12247]={ + [0x12321]={ category="lo", - description="CUNEIFORM SIGN NAM0x0002", + description="CUNEIFORM SIGN UM TIMES U", direction="l", linebreak="al", - unicodeslot=0x12247, + unicodeslot=0x12321, }, - [0x12248]={ + [0x12322]={ category="lo", - description="CUNEIFORM SIGN NE", + description="CUNEIFORM SIGN UMBIN", direction="l", linebreak="al", - unicodeslot=0x12248, + unicodeslot=0x12322, }, - [0x12249]={ + [0x12323]={ category="lo", - description="CUNEIFORM SIGN NE TIMES A", + description="CUNEIFORM SIGN UMUM", direction="l", linebreak="al", - unicodeslot=0x12249, + unicodeslot=0x12323, }, - [0x1224A]={ + [0x12324]={ category="lo", - description="CUNEIFORM SIGN NE TIMES UD", + description="CUNEIFORM SIGN UMUM TIMES KASKAL", direction="l", linebreak="al", - unicodeslot=0x1224A, + unicodeslot=0x12324, }, - [0x1224B]={ + [0x12325]={ category="lo", - description="CUNEIFORM SIGN NE SHESHIG", + description="CUNEIFORM SIGN UMUM TIMES PA", direction="l", linebreak="al", - unicodeslot=0x1224B, + unicodeslot=0x12325, }, - [0x1224C]={ + [0x12326]={ category="lo", - description="CUNEIFORM SIGN NI", + description="CUNEIFORM SIGN UN", direction="l", linebreak="al", - unicodeslot=0x1224C, + unicodeslot=0x12326, }, - [0x1224D]={ + [0x12327]={ category="lo", - description="CUNEIFORM SIGN NI TIMES E", + description="CUNEIFORM SIGN UN GUNU", direction="l", linebreak="al", - unicodeslot=0x1224D, + unicodeslot=0x12327, }, - [0x1224E]={ + [0x12328]={ category="lo", - description="CUNEIFORM SIGN NI0x0002", + description="CUNEIFORM SIGN UR", direction="l", linebreak="al", - unicodeslot=0x1224E, + unicodeslot=0x12328, }, - [0x1224F]={ + [0x12329]={ category="lo", - description="CUNEIFORM SIGN NIM", + description="CUNEIFORM SIGN UR CROSSING UR", direction="l", linebreak="al", - unicodeslot=0x1224F, + unicodeslot=0x12329, }, - [0x12250]={ + [0x1232A]={ category="lo", - description="CUNEIFORM SIGN NIM TIMES GAN0x0002 TENU", + description="CUNEIFORM SIGN UR SHESHIG", direction="l", linebreak="al", - unicodeslot=0x12250, + unicodeslot=0x1232A, }, - [0x12251]={ + [0x1232B]={ category="lo", - description="CUNEIFORM SIGN NIM TIMES GAR PLUS GAN0x0002 TENU", + description="CUNEIFORM SIGN UR0x0002", direction="l", linebreak="al", - unicodeslot=0x12251, + unicodeslot=0x1232B, }, - [0x12252]={ + [0x1232C]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002", + description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS HA", direction="l", linebreak="al", - unicodeslot=0x12252, + unicodeslot=0x1232C, }, - [0x12253]={ + [0x1232D]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES AN", + description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS NA", direction="l", linebreak="al", - unicodeslot=0x12253, + unicodeslot=0x1232D, }, - [0x12254]={ + [0x1232E]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH", + description="CUNEIFORM SIGN UR0x0002 TIMES AL", direction="l", linebreak="al", - unicodeslot=0x12254, + unicodeslot=0x1232E, }, - [0x12255]={ + [0x1232F]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH PLUS ASH", + description="CUNEIFORM SIGN UR0x0002 TIMES HA", direction="l", linebreak="al", - unicodeslot=0x12255, + unicodeslot=0x1232F, }, - [0x12256]={ + [0x12330]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES GUD", + description="CUNEIFORM SIGN UR0x0002 TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x12256, + unicodeslot=0x12330, }, - [0x12257]={ + [0x12331]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES ME PLUS GAN0x0002 TENU", + description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002", direction="l", linebreak="al", - unicodeslot=0x12257, + unicodeslot=0x12331, }, - [0x12258]={ + [0x12332]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES NE", + description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS ASH", direction="l", linebreak="al", - unicodeslot=0x12258, + unicodeslot=0x12332, }, - [0x12259]={ + [0x12333]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES NUN", + description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS BI", direction="l", linebreak="al", - unicodeslot=0x12259, + unicodeslot=0x12333, }, - [0x1225A]={ + [0x12334]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE", + description="CUNEIFORM SIGN UR0x0004", direction="l", linebreak="al", - unicodeslot=0x1225A, + unicodeslot=0x12334, }, - [0x1225B]={ + [0x12335]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS A AN", + description="CUNEIFORM SIGN URI", direction="l", linebreak="al", - unicodeslot=0x1225B, + unicodeslot=0x12335, }, - [0x1225C]={ + [0x12336]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH", + description="CUNEIFORM SIGN URI0x0003", direction="l", linebreak="al", - unicodeslot=0x1225C, + unicodeslot=0x12336, }, - [0x1225D]={ + [0x12337]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH PLUS ASH", + description="CUNEIFORM SIGN URU", direction="l", linebreak="al", - unicodeslot=0x1225D, + unicodeslot=0x12337, }, - [0x1225E]={ + [0x12338]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES U0x0002 PLUS ASH", + description="CUNEIFORM SIGN URU TIMES A", direction="l", linebreak="al", - unicodeslot=0x1225E, + unicodeslot=0x12338, }, - [0x1225F]={ + [0x12339]={ category="lo", - description="CUNEIFORM SIGN NINDA0x0002 TIMES USH", + description="CUNEIFORM SIGN URU TIMES ASHGAB", direction="l", linebreak="al", - unicodeslot=0x1225F, + unicodeslot=0x12339, }, - [0x12260]={ + [0x1233A]={ category="lo", - description="CUNEIFORM SIGN NISAG", + description="CUNEIFORM SIGN URU TIMES BAR", direction="l", linebreak="al", - unicodeslot=0x12260, + unicodeslot=0x1233A, }, - [0x12261]={ + [0x1233B]={ category="lo", - description="CUNEIFORM SIGN NU", + description="CUNEIFORM SIGN URU TIMES DUN", direction="l", linebreak="al", - unicodeslot=0x12261, + unicodeslot=0x1233B, }, - [0x12262]={ + [0x1233C]={ category="lo", - description="CUNEIFORM SIGN NU0x000B", + description="CUNEIFORM SIGN URU TIMES GA", direction="l", linebreak="al", - unicodeslot=0x12262, + unicodeslot=0x1233C, }, - [0x12263]={ + [0x1233D]={ category="lo", - description="CUNEIFORM SIGN NUN", + description="CUNEIFORM SIGN URU TIMES GAL", direction="l", linebreak="al", - unicodeslot=0x12263, + unicodeslot=0x1233D, }, - [0x12264]={ + [0x1233E]={ category="lo", - description="CUNEIFORM SIGN NUN LAGAR TIMES GAR", + description="CUNEIFORM SIGN URU TIMES GAN0x0002 TENU", direction="l", linebreak="al", - unicodeslot=0x12264, + unicodeslot=0x1233E, }, - [0x12265]={ + [0x1233F]={ category="lo", - description="CUNEIFORM SIGN NUN LAGAR TIMES MASH", + description="CUNEIFORM SIGN URU TIMES GAR", direction="l", linebreak="al", - unicodeslot=0x12265, + unicodeslot=0x1233F, }, - [0x12266]={ + [0x12340]={ category="lo", - description="CUNEIFORM SIGN NUN LAGAR TIMES SAL", + description="CUNEIFORM SIGN URU TIMES GU", direction="l", linebreak="al", - unicodeslot=0x12266, + unicodeslot=0x12340, }, - [0x12267]={ + [0x12341]={ category="lo", - description="CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL", + description="CUNEIFORM SIGN URU TIMES HA", direction="l", linebreak="al", - unicodeslot=0x12267, + unicodeslot=0x12341, }, - [0x12268]={ + [0x12342]={ category="lo", - description="CUNEIFORM SIGN NUN LAGAR TIMES USH", + description="CUNEIFORM SIGN URU TIMES IGI", direction="l", linebreak="al", - unicodeslot=0x12268, + unicodeslot=0x12342, }, - [0x12269]={ + [0x12343]={ category="lo", - description="CUNEIFORM SIGN NUN TENU", + description="CUNEIFORM SIGN URU TIMES IM", direction="l", linebreak="al", - unicodeslot=0x12269, + unicodeslot=0x12343, }, - [0x1226A]={ + [0x12344]={ category="lo", - description="CUNEIFORM SIGN NUN OVER NUN", + description="CUNEIFORM SIGN URU TIMES ISH", direction="l", linebreak="al", - unicodeslot=0x1226A, + unicodeslot=0x12344, }, - [0x1226B]={ + [0x12345]={ category="lo", - description="CUNEIFORM SIGN NUN CROSSING NUN", + description="CUNEIFORM SIGN URU TIMES KI", direction="l", linebreak="al", - unicodeslot=0x1226B, + unicodeslot=0x12345, }, - [0x1226C]={ + [0x12346]={ category="lo", - description="CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR", + description="CUNEIFORM SIGN URU TIMES LUM", direction="l", linebreak="al", - unicodeslot=0x1226C, + unicodeslot=0x12346, }, - [0x1226D]={ + [0x12347]={ category="lo", - description="CUNEIFORM SIGN NUNUZ", + description="CUNEIFORM SIGN URU TIMES MIN", direction="l", linebreak="al", - unicodeslot=0x1226D, + unicodeslot=0x12347, }, - [0x1226E]={ + [0x12348]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES ASHGAB", + description="CUNEIFORM SIGN URU TIMES PA", direction="l", linebreak="al", - unicodeslot=0x1226E, + unicodeslot=0x12348, }, - [0x1226F]={ + [0x12349]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES BI", + description="CUNEIFORM SIGN URU TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1226F, + unicodeslot=0x12349, }, - [0x12270]={ + [0x1234A]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES DUG", + description="CUNEIFORM SIGN URU TIMES SIG0x0004", direction="l", linebreak="al", - unicodeslot=0x12270, + unicodeslot=0x1234A, }, - [0x12271]={ + [0x1234B]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES GUD", + description="CUNEIFORM SIGN URU TIMES TU", direction="l", linebreak="al", - unicodeslot=0x12271, + unicodeslot=0x1234B, }, - [0x12272]={ + [0x1234C]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES IGI GUNU", + description="CUNEIFORM SIGN URU TIMES U PLUS GUD", direction="l", linebreak="al", - unicodeslot=0x12272, + unicodeslot=0x1234C, }, - [0x12273]={ + [0x1234D]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES KAD0x0003", + description="CUNEIFORM SIGN URU TIMES UD", direction="l", linebreak="al", - unicodeslot=0x12273, + unicodeslot=0x1234D, }, - [0x12274]={ + [0x1234E]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES LA", + description="CUNEIFORM SIGN URU TIMES URUDA", direction="l", linebreak="al", - unicodeslot=0x12274, + unicodeslot=0x1234E, }, - [0x12275]={ + [0x1234F]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES NE", + description="CUNEIFORM SIGN URUDA", direction="l", linebreak="al", - unicodeslot=0x12275, + unicodeslot=0x1234F, }, - [0x12276]={ + [0x12350]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES SILA0x0003", + description="CUNEIFORM SIGN URUDA TIMES U", direction="l", linebreak="al", - unicodeslot=0x12276, + unicodeslot=0x12350, }, - [0x12277]={ + [0x12351]={ category="lo", - description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES U0x0002", + description="CUNEIFORM SIGN USH", direction="l", linebreak="al", - unicodeslot=0x12277, + unicodeslot=0x12351, }, - [0x12278]={ + [0x12352]={ category="lo", - description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI", + description="CUNEIFORM SIGN USH TIMES A", direction="l", linebreak="al", - unicodeslot=0x12278, + unicodeslot=0x12352, }, - [0x12279]={ + [0x12353]={ category="lo", - description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI U", + description="CUNEIFORM SIGN USH TIMES KU", direction="l", linebreak="al", - unicodeslot=0x12279, + unicodeslot=0x12353, }, - [0x1227A]={ + [0x12354]={ category="lo", - description="CUNEIFORM SIGN PA", + description="CUNEIFORM SIGN USH TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x1227A, + unicodeslot=0x12354, }, - [0x1227B]={ + [0x12355]={ category="lo", - description="CUNEIFORM SIGN PAD", + description="CUNEIFORM SIGN USH TIMES TAK0x0004", direction="l", linebreak="al", - unicodeslot=0x1227B, + unicodeslot=0x12355, }, - [0x1227C]={ + [0x12356]={ category="lo", - description="CUNEIFORM SIGN PAN", + description="CUNEIFORM SIGN USHX", direction="l", linebreak="al", - unicodeslot=0x1227C, + unicodeslot=0x12356, }, - [0x1227D]={ + [0x12357]={ category="lo", - description="CUNEIFORM SIGN PAP", + description="CUNEIFORM SIGN USH0x0002", direction="l", linebreak="al", - unicodeslot=0x1227D, + unicodeslot=0x12357, }, - [0x1227E]={ + [0x12358]={ category="lo", - description="CUNEIFORM SIGN PESH0x0002", + description="CUNEIFORM SIGN USHUMX", direction="l", linebreak="al", - unicodeslot=0x1227E, + unicodeslot=0x12358, }, - [0x1227F]={ + [0x12359]={ category="lo", - description="CUNEIFORM SIGN PI", + description="CUNEIFORM SIGN UTUKI", direction="l", linebreak="al", - unicodeslot=0x1227F, + unicodeslot=0x12359, }, - [0x12280]={ + [0x1235A]={ category="lo", - description="CUNEIFORM SIGN PI TIMES A", + description="CUNEIFORM SIGN UZ0x0003", direction="l", linebreak="al", - unicodeslot=0x12280, + unicodeslot=0x1235A, }, - [0x12281]={ + [0x1235B]={ category="lo", - description="CUNEIFORM SIGN PI TIMES AB", + description="CUNEIFORM SIGN UZ0x0003 TIMES KASKAL", direction="l", linebreak="al", - unicodeslot=0x12281, + unicodeslot=0x1235B, }, - [0x12282]={ + [0x1235C]={ category="lo", - description="CUNEIFORM SIGN PI TIMES BI", + description="CUNEIFORM SIGN UZU", direction="l", linebreak="al", - unicodeslot=0x12282, + unicodeslot=0x1235C, }, - [0x12283]={ + [0x1235D]={ category="lo", - description="CUNEIFORM SIGN PI TIMES BU", + description="CUNEIFORM SIGN ZA", direction="l", linebreak="al", - unicodeslot=0x12283, + unicodeslot=0x1235D, }, - [0x12284]={ + [0x1235E]={ category="lo", - description="CUNEIFORM SIGN PI TIMES E", + description="CUNEIFORM SIGN ZA TENU", direction="l", linebreak="al", - unicodeslot=0x12284, + unicodeslot=0x1235E, }, - [0x12285]={ + [0x1235F]={ category="lo", - description="CUNEIFORM SIGN PI TIMES I", + description="CUNEIFORM SIGN ZA SQUARED TIMES KUR", direction="l", linebreak="al", - unicodeslot=0x12285, + unicodeslot=0x1235F, }, - [0x12286]={ + [0x12360]={ category="lo", - description="CUNEIFORM SIGN PI TIMES IB", + description="CUNEIFORM SIGN ZAG", direction="l", linebreak="al", - unicodeslot=0x12286, + unicodeslot=0x12360, }, - [0x12287]={ + [0x12361]={ category="lo", - description="CUNEIFORM SIGN PI TIMES U", + description="CUNEIFORM SIGN ZAMX", direction="l", linebreak="al", - unicodeslot=0x12287, + unicodeslot=0x12361, }, - [0x12288]={ + [0x12362]={ category="lo", - description="CUNEIFORM SIGN PI TIMES U0x0002", + description="CUNEIFORM SIGN ZE0x0002", direction="l", linebreak="al", - unicodeslot=0x12288, + unicodeslot=0x12362, }, - [0x12289]={ + [0x12363]={ category="lo", - description="CUNEIFORM SIGN PI CROSSING PI", + description="CUNEIFORM SIGN ZI", direction="l", linebreak="al", - unicodeslot=0x12289, + unicodeslot=0x12363, }, - [0x1228A]={ + [0x12364]={ category="lo", - description="CUNEIFORM SIGN PIRIG", + description="CUNEIFORM SIGN ZI OVER ZI", direction="l", linebreak="al", - unicodeslot=0x1228A, + unicodeslot=0x12364, }, - [0x1228B]={ + [0x12365]={ category="lo", - description="CUNEIFORM SIGN PIRIG TIMES KAL", + description="CUNEIFORM SIGN ZI0x0003", direction="l", linebreak="al", - unicodeslot=0x1228B, + unicodeslot=0x12365, }, - [0x1228C]={ + [0x12366]={ category="lo", - description="CUNEIFORM SIGN PIRIG TIMES UD", + description="CUNEIFORM SIGN ZIB", direction="l", linebreak="al", - unicodeslot=0x1228C, + unicodeslot=0x12366, }, - [0x1228D]={ + [0x12367]={ category="lo", - description="CUNEIFORM SIGN PIRIG TIMES ZA", + description="CUNEIFORM SIGN ZIB KABA TENU", direction="l", linebreak="al", - unicodeslot=0x1228D, + unicodeslot=0x12367, }, - [0x1228E]={ + [0x12368]={ category="lo", - description="CUNEIFORM SIGN PIRIG OPPOSING PIRIG", + description="CUNEIFORM SIGN ZIG", direction="l", linebreak="al", - unicodeslot=0x1228E, + unicodeslot=0x12368, }, - [0x1228F]={ + [0x12369]={ category="lo", - description="CUNEIFORM SIGN RA", + description="CUNEIFORM SIGN ZIZ0x0002", direction="l", linebreak="al", - unicodeslot=0x1228F, + unicodeslot=0x12369, }, - [0x12290]={ + [0x1236A]={ category="lo", - description="CUNEIFORM SIGN RAB", + description="CUNEIFORM SIGN ZU", direction="l", linebreak="al", - unicodeslot=0x12290, + unicodeslot=0x1236A, }, - [0x12291]={ + [0x1236B]={ category="lo", - description="CUNEIFORM SIGN RI", + description="CUNEIFORM SIGN ZU0x0005", direction="l", linebreak="al", - unicodeslot=0x12291, + unicodeslot=0x1236B, }, - [0x12292]={ + [0x1236C]={ category="lo", - description="CUNEIFORM SIGN RU", + description="CUNEIFORM SIGN ZU0x0005 TIMES A", direction="l", linebreak="al", - unicodeslot=0x12292, + unicodeslot=0x1236C, }, - [0x12293]={ + [0x1236D]={ category="lo", - description="CUNEIFORM SIGN SA", + description="CUNEIFORM SIGN ZUBUR", direction="l", linebreak="al", - unicodeslot=0x12293, + unicodeslot=0x1236D, }, - [0x12294]={ + [0x1236E]={ category="lo", - description="CUNEIFORM SIGN SAG NUTILLU", + description="CUNEIFORM SIGN ZUM", direction="l", linebreak="al", - unicodeslot=0x12294, + unicodeslot=0x1236E, }, - [0x12295]={ + [0x1236F]={ category="lo", - description="CUNEIFORM SIGN SAG", + description="CUNEIFORM SIGN KAP ELAMITE", direction="l", linebreak="al", - unicodeslot=0x12295, + unicodeslot=0x1236F, }, - [0x12296]={ + [0x12370]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES A", + description="CUNEIFORM SIGN AB TIMES NUN", direction="l", linebreak="al", - unicodeslot=0x12296, + unicodeslot=0x12370, }, - [0x12297]={ + [0x12371]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES DU", + description="CUNEIFORM SIGN AB2 TIMES A", direction="l", linebreak="al", - unicodeslot=0x12297, + unicodeslot=0x12371, }, - [0x12298]={ + [0x12372]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES DUB", + description="CUNEIFORM SIGN AMAR TIMES KUG", direction="l", linebreak="al", - unicodeslot=0x12298, + unicodeslot=0x12372, }, - [0x12299]={ + [0x12373]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES HA", + description="CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH", direction="l", linebreak="al", - unicodeslot=0x12299, + unicodeslot=0x12373, }, - [0x1229A]={ + [0x12374]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES KAK", + description="CUNEIFORM SIGN DAG3", direction="l", linebreak="al", - unicodeslot=0x1229A, + unicodeslot=0x12374, }, - [0x1229B]={ + [0x12375]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES KUR", + description="CUNEIFORM SIGN DISH PLUS SHU", direction="l", linebreak="al", - unicodeslot=0x1229B, + unicodeslot=0x12375, }, - [0x1229C]={ + [0x12376]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES LUM", + description="CUNEIFORM SIGN DUB TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1229C, + unicodeslot=0x12376, }, - [0x1229D]={ + [0x12377]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES MI", + description="CUNEIFORM SIGN EZEN TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x1229D, + unicodeslot=0x12377, }, - [0x1229E]={ + [0x12378]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES NUN", + description="CUNEIFORM SIGN EZEN TIMES SHE", direction="l", linebreak="al", - unicodeslot=0x1229E, + unicodeslot=0x12378, }, - [0x1229F]={ + [0x12379]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES SAL", + description="CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A", direction="l", linebreak="al", - unicodeslot=0x1229F, + unicodeslot=0x12379, }, - [0x122A0]={ + [0x1237A]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES SHID", + description="CUNEIFORM SIGN GA2 TIMES ASH2", direction="l", linebreak="al", - unicodeslot=0x122A0, + unicodeslot=0x1237A, }, - [0x122A1]={ + [0x1237B]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES TAB", + description="CUNEIFORM SIGN GE22", direction="l", linebreak="al", - unicodeslot=0x122A1, + unicodeslot=0x1237B, }, - [0x122A2]={ + [0x1237C]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES U0x0002", + description="CUNEIFORM SIGN GIG", direction="l", linebreak="al", - unicodeslot=0x122A2, + unicodeslot=0x1237C, }, - [0x122A3]={ + [0x1237D]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES UB", + description="CUNEIFORM SIGN HUSH", direction="l", linebreak="al", - unicodeslot=0x122A3, + unicodeslot=0x1237D, }, - [0x122A4]={ + [0x1237E]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES UM", + description="CUNEIFORM SIGN KA TIMES ANSHE", direction="l", linebreak="al", - unicodeslot=0x122A4, + unicodeslot=0x1237E, }, - [0x122A5]={ + [0x1237F]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES UR", + description="CUNEIFORM SIGN KA TIMES ASH3", direction="l", linebreak="al", - unicodeslot=0x122A5, + unicodeslot=0x1237F, }, - [0x122A6]={ + [0x12380]={ category="lo", - description="CUNEIFORM SIGN SAG TIMES USH", + description="CUNEIFORM SIGN KA TIMES GISH", direction="l", linebreak="al", - unicodeslot=0x122A6, + unicodeslot=0x12380, }, - [0x122A7]={ + [0x12381]={ category="lo", - description="CUNEIFORM SIGN SAG OVER SAG", + description="CUNEIFORM SIGN KA TIMES GUD", direction="l", linebreak="al", - unicodeslot=0x122A7, + unicodeslot=0x12381, }, - [0x122A8]={ + [0x12382]={ category="lo", - description="CUNEIFORM SIGN SAG GUNU", + description="CUNEIFORM SIGN KA TIMES HI TIMES ASH2", direction="l", linebreak="al", - unicodeslot=0x122A8, + unicodeslot=0x12382, }, - [0x122A9]={ + [0x12383]={ category="lo", - description="CUNEIFORM SIGN SAL", + description="CUNEIFORM SIGN KA TIMES LUM", direction="l", linebreak="al", - unicodeslot=0x122A9, + unicodeslot=0x12383, }, - [0x122AA]={ + [0x12384]={ category="lo", - description="CUNEIFORM SIGN SAL LAGAB TIMES ASH0x0002", + description="CUNEIFORM SIGN KA TIMES PA", direction="l", linebreak="al", - unicodeslot=0x122AA, + unicodeslot=0x12384, }, - [0x122AB]={ + [0x12385]={ category="lo", - description="CUNEIFORM SIGN SANGA0x0002", + description="CUNEIFORM SIGN KA TIMES SHUL", direction="l", linebreak="al", - unicodeslot=0x122AB, + unicodeslot=0x12385, }, - [0x122AC]={ + [0x12386]={ category="lo", - description="CUNEIFORM SIGN SAR", + description="CUNEIFORM SIGN KA TIMES TU", direction="l", linebreak="al", - unicodeslot=0x122AC, + unicodeslot=0x12386, }, - [0x122AD]={ + [0x12387]={ category="lo", - description="CUNEIFORM SIGN SHA", + description="CUNEIFORM SIGN KA TIMES UR2", direction="l", linebreak="al", - unicodeslot=0x122AD, + unicodeslot=0x12387, }, - [0x122AE]={ + [0x12388]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003", + description="CUNEIFORM SIGN LAGAB TIMES GI", direction="l", linebreak="al", - unicodeslot=0x122AE, + unicodeslot=0x12388, }, - [0x122AF]={ + [0x12389]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES A", + description="CUNEIFORM SIGN LU2 SHESHIG TIMES BAD", direction="l", linebreak="al", - unicodeslot=0x122AF, + unicodeslot=0x12389, }, - [0x122B0]={ + [0x1238A]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES BAD", + description="CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL", direction="l", linebreak="al", - unicodeslot=0x122B0, + unicodeslot=0x1238A, }, - [0x122B1]={ + [0x1238B]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES GISH", + description="CUNEIFORM SIGN LU2 TIMES SHU", direction="l", linebreak="al", - unicodeslot=0x122B1, + unicodeslot=0x1238B, }, - [0x122B2]={ + [0x1238C]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES NE", + description="CUNEIFORM SIGN MESH", direction="l", linebreak="al", - unicodeslot=0x122B2, + unicodeslot=0x1238C, }, - [0x122B3]={ + [0x1238D]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES SHU0x0002", + description="CUNEIFORM SIGN MUSH3 TIMES ZA", direction="l", linebreak="al", - unicodeslot=0x122B3, + unicodeslot=0x1238D, }, - [0x122B4]={ + [0x1238E]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES TUR", + description="CUNEIFORM SIGN NA4", direction="l", linebreak="al", - unicodeslot=0x122B4, + unicodeslot=0x1238E, }, - [0x122B5]={ + [0x1238F]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES U", + description="CUNEIFORM SIGN NIN", direction="l", linebreak="al", - unicodeslot=0x122B5, + unicodeslot=0x1238F, }, - [0x122B6]={ + [0x12390]={ category="lo", - description="CUNEIFORM SIGN SHA0x0003 TIMES U PLUS A", + description="CUNEIFORM SIGN NIN9", direction="l", linebreak="al", - unicodeslot=0x122B6, + unicodeslot=0x12390, }, - [0x122B7]={ + [0x12391]={ category="lo", - description="CUNEIFORM SIGN SHA0x0006", + description="CUNEIFORM SIGN NINDA2 TIMES BAL", direction="l", linebreak="al", - unicodeslot=0x122B7, + unicodeslot=0x12391, }, - [0x122B8]={ + [0x12392]={ category="lo", - description="CUNEIFORM SIGN SHAB0x0006", + description="CUNEIFORM SIGN NINDA2 TIMES GI", direction="l", linebreak="al", - unicodeslot=0x122B8, + unicodeslot=0x12392, }, - [0x122B9]={ + [0x12393]={ category="lo", - description="CUNEIFORM SIGN SHAR0x0002", + description="CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES", direction="l", linebreak="al", - unicodeslot=0x122B9, + unicodeslot=0x12393, }, - [0x122BA]={ + [0x12394]={ category="lo", - description="CUNEIFORM SIGN SHE", + description="CUNEIFORM SIGN PESH2 ASTERISK", direction="l", linebreak="al", - unicodeslot=0x122BA, + unicodeslot=0x12394, }, - [0x122BB]={ + [0x12395]={ category="lo", - description="CUNEIFORM SIGN SHE HU", + description="CUNEIFORM SIGN PIR2", direction="l", linebreak="al", - unicodeslot=0x122BB, + unicodeslot=0x12395, }, - [0x122BC]={ + [0x12396]={ category="lo", - description="CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR", + description="CUNEIFORM SIGN SAG TIMES IGI GUNU", direction="l", linebreak="al", - unicodeslot=0x122BC, + unicodeslot=0x12396, }, - [0x122BD]={ + [0x12397]={ category="lo", - description="CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR", + description="CUNEIFORM SIGN TI2", direction="l", linebreak="al", - unicodeslot=0x122BD, + unicodeslot=0x12397, }, - [0x122BE]={ + [0x12398]={ category="lo", - description="CUNEIFORM SIGN SHEG0x0009", + description="CUNEIFORM SIGN UM TIMES ME", direction="l", linebreak="al", - unicodeslot=0x122BE, + unicodeslot=0x12398, }, - [0x122BF]={ - category="lo", - description="CUNEIFORM SIGN SHEN", + [0x12400]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO ASH", direction="l", linebreak="al", - unicodeslot=0x122BF, + unicodeslot=0x12400, }, - [0x122C0]={ - category="lo", - description="CUNEIFORM SIGN SHESH", + [0x12401]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE ASH", direction="l", linebreak="al", - unicodeslot=0x122C0, + unicodeslot=0x12401, }, - [0x122C1]={ - category="lo", - description="CUNEIFORM SIGN SHESH0x0002", + [0x12402]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR ASH", direction="l", linebreak="al", - unicodeslot=0x122C1, + unicodeslot=0x12402, }, - [0x122C2]={ - category="lo", - description="CUNEIFORM SIGN SHESHLAM", + [0x12403]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE ASH", direction="l", linebreak="al", - unicodeslot=0x122C2, + unicodeslot=0x12403, }, - [0x122C3]={ - category="lo", - description="CUNEIFORM SIGN SHID", + [0x12404]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX ASH", direction="l", linebreak="al", - unicodeslot=0x122C3, + unicodeslot=0x12404, }, - [0x122C4]={ - category="lo", - description="CUNEIFORM SIGN SHID TIMES A", + [0x12405]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN ASH", direction="l", linebreak="al", - unicodeslot=0x122C4, + unicodeslot=0x12405, }, - [0x122C5]={ - category="lo", - description="CUNEIFORM SIGN SHID TIMES IM", + [0x12406]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT ASH", direction="l", linebreak="al", - unicodeslot=0x122C5, + unicodeslot=0x12406, }, - [0x122C6]={ - category="lo", - description="CUNEIFORM SIGN SHIM", + [0x12407]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE ASH", direction="l", linebreak="al", - unicodeslot=0x122C6, + unicodeslot=0x12407, }, - [0x122C7]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES A", + [0x12408]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE DISH", direction="l", linebreak="al", - unicodeslot=0x122C7, + unicodeslot=0x12408, }, - [0x122C8]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES BAL", + [0x12409]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR DISH", direction="l", linebreak="al", - unicodeslot=0x122C8, + unicodeslot=0x12409, }, - [0x122C9]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES BULUG", + [0x1240A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE DISH", direction="l", linebreak="al", - unicodeslot=0x122C9, + unicodeslot=0x1240A, }, - [0x122CA]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES DIN", + [0x1240B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX DISH", direction="l", linebreak="al", - unicodeslot=0x122CA, + unicodeslot=0x1240B, }, - [0x122CB]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES GAR", + [0x1240C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN DISH", direction="l", linebreak="al", - unicodeslot=0x122CB, + unicodeslot=0x1240C, }, - [0x122CC]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES IGI", + [0x1240D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT DISH", direction="l", linebreak="al", - unicodeslot=0x122CC, + unicodeslot=0x1240D, }, - [0x122CD]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES IGI GUNU", + [0x1240E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE DISH", direction="l", linebreak="al", - unicodeslot=0x122CD, + unicodeslot=0x1240E, }, - [0x122CE]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES KUSHU0x0002", + [0x1240F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR U", direction="l", linebreak="al", - unicodeslot=0x122CE, + unicodeslot=0x1240F, }, - [0x122CF]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES LUL", + [0x12410]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE U", direction="l", linebreak="al", - unicodeslot=0x122CF, + unicodeslot=0x12410, }, - [0x122D0]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES MUG", + [0x12411]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX U", direction="l", linebreak="al", - unicodeslot=0x122D0, + unicodeslot=0x12411, }, - [0x122D1]={ - category="lo", - description="CUNEIFORM SIGN SHIM TIMES SAL", + [0x12412]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN U", direction="l", linebreak="al", - unicodeslot=0x122D1, + unicodeslot=0x12412, }, - [0x122D2]={ - category="lo", - description="CUNEIFORM SIGN SHINIG", + [0x12413]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT U", direction="l", linebreak="al", - unicodeslot=0x122D2, + unicodeslot=0x12413, }, - [0x122D3]={ - category="lo", - description="CUNEIFORM SIGN SHIR", + [0x12414]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE U", direction="l", linebreak="al", - unicodeslot=0x122D3, + unicodeslot=0x12414, }, - [0x122D4]={ - category="lo", - description="CUNEIFORM SIGN SHIR TENU", + [0x12415]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D4, + unicodeslot=0x12415, }, - [0x122D5]={ - category="lo", - description="CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR", + [0x12416]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D5, + unicodeslot=0x12416, }, - [0x122D6]={ - category="lo", - description="CUNEIFORM SIGN SHITA", + [0x12417]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D6, + unicodeslot=0x12417, }, - [0x122D7]={ - category="lo", - description="CUNEIFORM SIGN SHU", + [0x12418]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D7, + unicodeslot=0x12418, }, - [0x122D8]={ - category="lo", - description="CUNEIFORM SIGN SHU OVER INVERTED SHU", + [0x12419]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D8, + unicodeslot=0x12419, }, - [0x122D9]={ - category="lo", - description="CUNEIFORM SIGN SHU0x0002", + [0x1241A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122D9, + unicodeslot=0x1241A, }, - [0x122DA]={ - category="lo", - description="CUNEIFORM SIGN SHUBUR", + [0x1241B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122DA, + unicodeslot=0x1241B, }, - [0x122DB]={ - category="lo", - description="CUNEIFORM SIGN SI", + [0x1241C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122DB, + unicodeslot=0x1241C, }, - [0x122DC]={ - category="lo", - description="CUNEIFORM SIGN SI GUNU", + [0x1241D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE GESH0x0002", direction="l", linebreak="al", - unicodeslot=0x122DC, + unicodeslot=0x1241D, }, - [0x122DD]={ - category="lo", - description="CUNEIFORM SIGN SIG", + [0x1241E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE GESHU", direction="l", linebreak="al", - unicodeslot=0x122DD, + unicodeslot=0x1241E, }, - [0x122DE]={ - category="lo", - description="CUNEIFORM SIGN SIG0x0004", + [0x1241F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO GESHU", direction="l", linebreak="al", - unicodeslot=0x122DE, + unicodeslot=0x1241F, }, - [0x122DF]={ - category="lo", - description="CUNEIFORM SIGN SIG0x0004 OVER SIG0x0004 SHU0x0002", + [0x12420]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE GESHU", direction="l", linebreak="al", - unicodeslot=0x122DF, + unicodeslot=0x12420, }, - [0x122E0]={ - category="lo", - description="CUNEIFORM SIGN SIK0x0002", + [0x12421]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR GESHU", direction="l", linebreak="al", - unicodeslot=0x122E0, + unicodeslot=0x12421, }, - [0x122E1]={ - category="lo", - description="CUNEIFORM SIGN SILA0x0003", + [0x12422]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE GESHU", direction="l", linebreak="al", - unicodeslot=0x122E1, + unicodeslot=0x12422, }, - [0x122E2]={ - category="lo", - description="CUNEIFORM SIGN SU", + [0x12423]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E2, + unicodeslot=0x12423, }, - [0x122E3]={ - category="lo", - description="CUNEIFORM SIGN SU OVER SU", + [0x12424]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E3, + unicodeslot=0x12424, }, - [0x122E4]={ - category="lo", - description="CUNEIFORM SIGN SUD", + [0x12425]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002 VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x122E4, + unicodeslot=0x12425, }, - [0x122E5]={ - category="lo", - description="CUNEIFORM SIGN SUD0x0002", + [0x12426]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E5, + unicodeslot=0x12426, }, - [0x122E6]={ - category="lo", - description="CUNEIFORM SIGN SUHUR", + [0x12427]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E6, + unicodeslot=0x12427, }, - [0x122E7]={ - category="lo", - description="CUNEIFORM SIGN SUM", + [0x12428]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E7, + unicodeslot=0x12428, }, - [0x122E8]={ - category="lo", - description="CUNEIFORM SIGN SUMASH", + [0x12429]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E8, + unicodeslot=0x12429, }, - [0x122E9]={ - category="lo", - description="CUNEIFORM SIGN SUR", + [0x1242A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122E9, + unicodeslot=0x1242A, }, - [0x122EA]={ - category="lo", - description="CUNEIFORM SIGN SUR0x0009", + [0x1242B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE SHAR0x0002", direction="l", linebreak="al", - unicodeslot=0x122EA, + unicodeslot=0x1242B, }, - [0x122EB]={ - category="lo", - description="CUNEIFORM SIGN TA", + [0x1242C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE SHARU", direction="l", linebreak="al", - unicodeslot=0x122EB, + unicodeslot=0x1242C, }, - [0x122EC]={ - category="lo", - description="CUNEIFORM SIGN TA ASTERISK", + [0x1242D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO SHARU", direction="l", linebreak="al", - unicodeslot=0x122EC, + unicodeslot=0x1242D, }, - [0x122ED]={ - category="lo", - description="CUNEIFORM SIGN TA TIMES HI", + [0x1242E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE SHARU", direction="l", linebreak="al", - unicodeslot=0x122ED, + unicodeslot=0x1242E, }, - [0x122EE]={ - category="lo", - description="CUNEIFORM SIGN TA TIMES MI", + [0x1242F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x122EE, + unicodeslot=0x1242F, }, - [0x122EF]={ - category="lo", - description="CUNEIFORM SIGN TA GUNU", + [0x12430]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR SHARU", direction="l", linebreak="al", - unicodeslot=0x122EF, + unicodeslot=0x12430, }, - [0x122F0]={ - category="lo", - description="CUNEIFORM SIGN TAB", + [0x12431]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE SHARU", direction="l", linebreak="al", - unicodeslot=0x122F0, + unicodeslot=0x12431, }, - [0x122F1]={ - category="lo", - description="CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH", + [0x12432]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS DISH", direction="l", linebreak="al", - unicodeslot=0x122F1, + unicodeslot=0x12432, }, - [0x122F2]={ - category="lo", - description="CUNEIFORM SIGN TAB SQUARED", + [0x12433]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS MIN", direction="l", linebreak="al", - unicodeslot=0x122F2, + unicodeslot=0x12433, }, - [0x122F3]={ - category="lo", - description="CUNEIFORM SIGN TAG", + [0x12434]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE BURU", direction="l", linebreak="al", - unicodeslot=0x122F3, + unicodeslot=0x12434, }, - [0x122F4]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES BI", + [0x12435]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO BURU", direction="l", linebreak="al", - unicodeslot=0x122F4, + unicodeslot=0x12435, }, - [0x122F5]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES GUD", + [0x12436]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE BURU", direction="l", linebreak="al", - unicodeslot=0x122F5, + unicodeslot=0x12436, }, - [0x122F6]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES SHE", + [0x12437]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x122F6, + unicodeslot=0x12437, }, - [0x122F7]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES SHU", + [0x12438]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR BURU", direction="l", linebreak="al", - unicodeslot=0x122F7, + unicodeslot=0x12438, }, - [0x122F8]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES TUG0x0002", + [0x12439]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE BURU", direction="l", linebreak="al", - unicodeslot=0x122F8, + unicodeslot=0x12439, }, - [0x122F9]={ - category="lo", - description="CUNEIFORM SIGN TAG TIMES UD", + [0x1243A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0010", direction="l", linebreak="al", - unicodeslot=0x122F9, + unicodeslot=0x1243A, }, - [0x122FA]={ - category="lo", - description="CUNEIFORM SIGN TAK0x0004", + [0x1243B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0015", direction="l", linebreak="al", - unicodeslot=0x122FA, + unicodeslot=0x1243B, }, - [0x122FB]={ - category="lo", - description="CUNEIFORM SIGN TAR", + [0x1243C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU", direction="l", linebreak="al", - unicodeslot=0x122FB, + unicodeslot=0x1243C, }, - [0x122FC]={ - category="lo", - description="CUNEIFORM SIGN TE", + [0x1243D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU0x0004", direction="l", linebreak="al", - unicodeslot=0x122FC, + unicodeslot=0x1243D, }, - [0x122FD]={ - category="lo", - description="CUNEIFORM SIGN TE GUNU", + [0x1243E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A", direction="l", linebreak="al", - unicodeslot=0x122FD, + unicodeslot=0x1243E, }, - [0x122FE]={ - category="lo", - description="CUNEIFORM SIGN TI", + [0x1243F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B", direction="l", linebreak="al", - unicodeslot=0x122FE, + unicodeslot=0x1243F, }, - [0x122FF]={ - category="lo", - description="CUNEIFORM SIGN TI TENU", + [0x12440]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH0x0009", direction="l", linebreak="al", - unicodeslot=0x122FF, + unicodeslot=0x12440, }, - [0x12300]={ - category="lo", - description="CUNEIFORM SIGN TIL", + [0x12441]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN0x0003", direction="l", linebreak="al", - unicodeslot=0x12300, + unicodeslot=0x12441, }, - [0x12301]={ - category="lo", - description="CUNEIFORM SIGN TIR", + [0x12442]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A", direction="l", linebreak="al", - unicodeslot=0x12301, + unicodeslot=0x12442, }, - [0x12302]={ - category="lo", - description="CUNEIFORM SIGN TIR TIMES TAK0x0004", + [0x12443]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B", direction="l", linebreak="al", - unicodeslot=0x12302, + unicodeslot=0x12443, }, - [0x12303]={ - category="lo", - description="CUNEIFORM SIGN TIR OVER TIR", + [0x12444]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU", direction="l", linebreak="al", - unicodeslot=0x12303, + unicodeslot=0x12444, }, - [0x12304]={ - category="lo", - description="CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR", + [0x12445]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU0x0003", direction="l", linebreak="al", - unicodeslot=0x12304, + unicodeslot=0x12445, }, - [0x12305]={ - category="lo", - description="CUNEIFORM SIGN TU", + [0x12446]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU", direction="l", linebreak="al", - unicodeslot=0x12305, + unicodeslot=0x12446, }, - [0x12306]={ - category="lo", - description="CUNEIFORM SIGN TUG0x0002", + [0x12447]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0003", direction="l", linebreak="al", - unicodeslot=0x12306, + unicodeslot=0x12447, }, - [0x12307]={ - category="lo", - description="CUNEIFORM SIGN TUK", + [0x12448]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0004", direction="l", linebreak="al", - unicodeslot=0x12307, + unicodeslot=0x12448, }, - [0x12308]={ - category="lo", - description="CUNEIFORM SIGN TUM", + [0x12449]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A", direction="l", linebreak="al", - unicodeslot=0x12308, + unicodeslot=0x12449, }, - [0x12309]={ - category="lo", - description="CUNEIFORM SIGN TUR", + [0x1244A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO ASH TENU", direction="l", linebreak="al", - unicodeslot=0x12309, + unicodeslot=0x1244A, }, - [0x1230A]={ - category="lo", - description="CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA", + [0x1244B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE ASH TENU", direction="l", linebreak="al", - unicodeslot=0x1230A, + unicodeslot=0x1244B, }, - [0x1230B]={ - category="lo", - description="CUNEIFORM SIGN U", + [0x1244C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR ASH TENU", direction="l", linebreak="al", - unicodeslot=0x1230B, + unicodeslot=0x1244C, }, - [0x1230C]={ - category="lo", - description="CUNEIFORM SIGN U GUD", + [0x1244D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE ASH TENU", direction="l", linebreak="al", - unicodeslot=0x1230C, + unicodeslot=0x1244D, }, - [0x1230D]={ - category="lo", - description="CUNEIFORM SIGN U U U", + [0x1244E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX ASH TENU", direction="l", linebreak="al", - unicodeslot=0x1230D, + unicodeslot=0x1244E, }, - [0x1230E]={ - category="lo", - description="CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR", + [0x1244F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE BAN0x0002", direction="l", linebreak="al", - unicodeslot=0x1230E, + unicodeslot=0x1244F, }, - [0x1230F]={ - category="lo", - description="CUNEIFORM SIGN U OVER U SUR OVER SUR", + [0x12450]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO BAN0x0002", direction="l", linebreak="al", - unicodeslot=0x1230F, + unicodeslot=0x12450, }, - [0x12310]={ - category="lo", - description="CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED", + [0x12451]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN THREE BAN0x0002", direction="l", linebreak="al", - unicodeslot=0x12310, + unicodeslot=0x12451, }, - [0x12311]={ - category="lo", - description="CUNEIFORM SIGN U0x0002", + [0x12452]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002", direction="l", linebreak="al", - unicodeslot=0x12311, + unicodeslot=0x12452, }, - [0x12312]={ - category="lo", - description="CUNEIFORM SIGN UB", + [0x12453]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002 VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x12312, + unicodeslot=0x12453, }, - [0x12313]={ - category="lo", - description="CUNEIFORM SIGN UD", + [0x12454]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002", direction="l", linebreak="al", - unicodeslot=0x12313, + unicodeslot=0x12454, }, - [0x12314]={ - category="lo", - description="CUNEIFORM SIGN UD KUSHU0x0002", + [0x12455]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002 VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x12314, + unicodeslot=0x12455, }, - [0x12315]={ - category="lo", - description="CUNEIFORM SIGN UD TIMES BAD", + [0x12456]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NIGIDAMIN", direction="l", linebreak="al", - unicodeslot=0x12315, + unicodeslot=0x12456, }, - [0x12316]={ - category="lo", - description="CUNEIFORM SIGN UD TIMES MI", + [0x12457]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NIGIDAESH", direction="l", linebreak="al", - unicodeslot=0x12316, + unicodeslot=0x12457, }, - [0x12317]={ - category="lo", - description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U", + [0x12458]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE ESHE0x0003", direction="l", linebreak="al", - unicodeslot=0x12317, + unicodeslot=0x12458, }, - [0x12318]={ - category="lo", - description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU", + [0x12459]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO ESHE0x0003", direction="l", linebreak="al", - unicodeslot=0x12318, + unicodeslot=0x12459, }, - [0x12319]={ - category="lo", - description="CUNEIFORM SIGN UD GUNU", + [0x1245A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE THIRD DISH", direction="l", linebreak="al", - unicodeslot=0x12319, + unicodeslot=0x1245A, }, - [0x1231A]={ - category="lo", - description="CUNEIFORM SIGN UD SHESHIG", + [0x1245B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO THIRDS DISH", direction="l", linebreak="al", - unicodeslot=0x1231A, + unicodeslot=0x1245B, }, - [0x1231B]={ - category="lo", - description="CUNEIFORM SIGN UD SHESHIG TIMES BAD", + [0x1245C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH", direction="l", linebreak="al", - unicodeslot=0x1231B, + unicodeslot=0x1245C, }, - [0x1231C]={ - category="lo", - description="CUNEIFORM SIGN UDUG", + [0x1245D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A", direction="l", linebreak="al", - unicodeslot=0x1231C, + unicodeslot=0x1245D, }, - [0x1231D]={ - category="lo", - description="CUNEIFORM SIGN UM", + [0x1245E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A", direction="l", linebreak="al", - unicodeslot=0x1231D, + unicodeslot=0x1245E, }, - [0x1231E]={ - category="lo", - description="CUNEIFORM SIGN UM TIMES LAGAB", + [0x1245F]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH", direction="l", linebreak="al", - unicodeslot=0x1231E, + unicodeslot=0x1245F, }, - [0x1231F]={ - category="lo", - description="CUNEIFORM SIGN UM TIMES ME PLUS DA", + [0x12460]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE QUARTER ASH", direction="l", linebreak="al", - unicodeslot=0x1231F, + unicodeslot=0x12460, }, - [0x12320]={ - category="lo", - description="CUNEIFORM SIGN UM TIMES SHA0x0003", + [0x12461]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH", direction="l", linebreak="al", - unicodeslot=0x12320, + unicodeslot=0x12461, }, - [0x12321]={ - category="lo", - description="CUNEIFORM SIGN UM TIMES U", + [0x12462]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER", direction="l", linebreak="al", - unicodeslot=0x12321, + unicodeslot=0x12462, }, - [0x12322]={ - category="lo", - description="CUNEIFORM SIGN UMBIN", + [0x12463]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE QUARTER GUR", direction="l", linebreak="al", - unicodeslot=0x12322, + unicodeslot=0x12463, }, - [0x12323]={ - category="lo", - description="CUNEIFORM SIGN UMUM", + [0x12464]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ONE HALF GUR", direction="l", linebreak="al", - unicodeslot=0x12323, + unicodeslot=0x12464, }, - [0x12324]={ - category="lo", - description="CUNEIFORM SIGN UMUM TIMES KASKAL", + [0x12465]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD", direction="l", linebreak="al", - unicodeslot=0x12324, + unicodeslot=0x12465, }, - [0x12325]={ - category="lo", - description="CUNEIFORM SIGN UMUM TIMES PA", + [0x12466]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS", direction="l", linebreak="al", - unicodeslot=0x12325, + unicodeslot=0x12466, }, - [0x12326]={ - category="lo", - description="CUNEIFORM SIGN UN", + [0x12467]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ELAMITE FORTY", direction="l", linebreak="al", - unicodeslot=0x12326, + unicodeslot=0x12467, }, - [0x12327]={ - category="lo", - description="CUNEIFORM SIGN UN GUNU", + [0x12468]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN ELAMITE FIFTY", direction="l", linebreak="al", - unicodeslot=0x12327, + unicodeslot=0x12468, }, - [0x12328]={ - category="lo", - description="CUNEIFORM SIGN UR", + [0x12469]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x12328, + unicodeslot=0x12469, }, - [0x12329]={ - category="lo", - description="CUNEIFORM SIGN UR CROSSING UR", + [0x1246A]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x12329, + unicodeslot=0x1246A, }, - [0x1232A]={ - category="lo", - description="CUNEIFORM SIGN UR SHESHIG", + [0x1246B]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x1232A, + unicodeslot=0x1246B, }, - [0x1232B]={ - category="lo", - description="CUNEIFORM SIGN UR0x0002", + [0x1246C]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x1232B, + unicodeslot=0x1246C, }, - [0x1232C]={ - category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS HA", + [0x1246D]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x1232C, + unicodeslot=0x1246D, }, - [0x1232D]={ - category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS NA", + [0x1246E]={ + category="nl", + description="CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM", direction="l", linebreak="al", - unicodeslot=0x1232D, + unicodeslot=0x1246E, }, - [0x1232E]={ + [0x12470]={ + category="po", + description="CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER", + direction="l", + linebreak="ba", + unicodeslot=0x12470, + }, + [0x12471]={ + category="po", + description="CUNEIFORM PUNCTUATION SIGN VERTICAL COLON", + direction="l", + linebreak="ba", + unicodeslot=0x12471, + }, + [0x12472]={ + category="po", + description="CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON", + direction="l", + linebreak="ba", + unicodeslot=0x12472, + }, + [0x12473]={ + category="po", + description="CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON", + direction="l", + linebreak="ba", + unicodeslot=0x12473, + }, + [0x12474]={ + category="po", + description="CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON", + direction="l", + linebreak="ba", + unicodeslot=0x12474, + }, + [0x13000]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES AL", + description="EGYPTIAN HIEROGLYPH A001", direction="l", linebreak="al", - unicodeslot=0x1232E, + unicodeslot=0x13000, }, - [0x1232F]={ + [0x13001]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES HA", + description="EGYPTIAN HIEROGLYPH A002", direction="l", linebreak="al", - unicodeslot=0x1232F, + unicodeslot=0x13001, }, - [0x12330]={ + [0x13002]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES NUN", + description="EGYPTIAN HIEROGLYPH A003", direction="l", linebreak="al", - unicodeslot=0x12330, + unicodeslot=0x13002, }, - [0x12331]={ + [0x13003]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002", + description="EGYPTIAN HIEROGLYPH A004", direction="l", linebreak="al", - unicodeslot=0x12331, + unicodeslot=0x13003, }, - [0x12332]={ + [0x13004]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS ASH", + description="EGYPTIAN HIEROGLYPH A005", direction="l", linebreak="al", - unicodeslot=0x12332, + unicodeslot=0x13004, }, - [0x12333]={ + [0x13005]={ category="lo", - description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS BI", + description="EGYPTIAN HIEROGLYPH A005A", direction="l", linebreak="al", - unicodeslot=0x12333, + unicodeslot=0x13005, }, - [0x12334]={ + [0x13006]={ category="lo", - description="CUNEIFORM SIGN UR0x0004", + description="EGYPTIAN HIEROGLYPH A006", direction="l", linebreak="al", - unicodeslot=0x12334, + unicodeslot=0x13006, }, - [0x12335]={ + [0x13007]={ category="lo", - description="CUNEIFORM SIGN URI", + description="EGYPTIAN HIEROGLYPH A006A", direction="l", linebreak="al", - unicodeslot=0x12335, + unicodeslot=0x13007, }, - [0x12336]={ + [0x13008]={ category="lo", - description="CUNEIFORM SIGN URI0x0003", + description="EGYPTIAN HIEROGLYPH A006B", direction="l", linebreak="al", - unicodeslot=0x12336, + unicodeslot=0x13008, }, - [0x12337]={ + [0x13009]={ category="lo", - description="CUNEIFORM SIGN URU", + description="EGYPTIAN HIEROGLYPH A007", direction="l", linebreak="al", - unicodeslot=0x12337, + unicodeslot=0x13009, }, - [0x12338]={ + [0x1300A]={ category="lo", - description="CUNEIFORM SIGN URU TIMES A", + description="EGYPTIAN HIEROGLYPH A008", direction="l", linebreak="al", - unicodeslot=0x12338, + unicodeslot=0x1300A, }, - [0x12339]={ + [0x1300B]={ category="lo", - description="CUNEIFORM SIGN URU TIMES ASHGAB", + description="EGYPTIAN HIEROGLYPH A009", direction="l", linebreak="al", - unicodeslot=0x12339, + unicodeslot=0x1300B, }, - [0x1233A]={ + [0x1300C]={ category="lo", - description="CUNEIFORM SIGN URU TIMES BAR", + description="EGYPTIAN HIEROGLYPH A010", direction="l", linebreak="al", - unicodeslot=0x1233A, + unicodeslot=0x1300C, }, - [0x1233B]={ + [0x1300D]={ category="lo", - description="CUNEIFORM SIGN URU TIMES DUN", + description="EGYPTIAN HIEROGLYPH A011", direction="l", linebreak="al", - unicodeslot=0x1233B, + unicodeslot=0x1300D, }, - [0x1233C]={ + [0x1300E]={ category="lo", - description="CUNEIFORM SIGN URU TIMES GA", + description="EGYPTIAN HIEROGLYPH A012", direction="l", linebreak="al", - unicodeslot=0x1233C, + unicodeslot=0x1300E, }, - [0x1233D]={ + [0x1300F]={ category="lo", - description="CUNEIFORM SIGN URU TIMES GAL", + description="EGYPTIAN HIEROGLYPH A013", direction="l", linebreak="al", - unicodeslot=0x1233D, + unicodeslot=0x1300F, }, - [0x1233E]={ + [0x13010]={ category="lo", - description="CUNEIFORM SIGN URU TIMES GAN0x0002 TENU", + description="EGYPTIAN HIEROGLYPH A014", direction="l", linebreak="al", - unicodeslot=0x1233E, + unicodeslot=0x13010, }, - [0x1233F]={ + [0x13011]={ category="lo", - description="CUNEIFORM SIGN URU TIMES GAR", + description="EGYPTIAN HIEROGLYPH A014A", direction="l", linebreak="al", - unicodeslot=0x1233F, + unicodeslot=0x13011, }, - [0x12340]={ + [0x13012]={ category="lo", - description="CUNEIFORM SIGN URU TIMES GU", + description="EGYPTIAN HIEROGLYPH A015", direction="l", linebreak="al", - unicodeslot=0x12340, + unicodeslot=0x13012, }, - [0x12341]={ + [0x13013]={ category="lo", - description="CUNEIFORM SIGN URU TIMES HA", + description="EGYPTIAN HIEROGLYPH A016", direction="l", linebreak="al", - unicodeslot=0x12341, + unicodeslot=0x13013, }, - [0x12342]={ + [0x13014]={ category="lo", - description="CUNEIFORM SIGN URU TIMES IGI", + description="EGYPTIAN HIEROGLYPH A017", direction="l", linebreak="al", - unicodeslot=0x12342, + unicodeslot=0x13014, }, - [0x12343]={ + [0x13015]={ category="lo", - description="CUNEIFORM SIGN URU TIMES IM", + description="EGYPTIAN HIEROGLYPH A017A", direction="l", linebreak="al", - unicodeslot=0x12343, + unicodeslot=0x13015, }, - [0x12344]={ + [0x13016]={ category="lo", - description="CUNEIFORM SIGN URU TIMES ISH", + description="EGYPTIAN HIEROGLYPH A018", direction="l", linebreak="al", - unicodeslot=0x12344, + unicodeslot=0x13016, }, - [0x12345]={ + [0x13017]={ category="lo", - description="CUNEIFORM SIGN URU TIMES KI", + description="EGYPTIAN HIEROGLYPH A019", direction="l", linebreak="al", - unicodeslot=0x12345, + unicodeslot=0x13017, }, - [0x12346]={ + [0x13018]={ category="lo", - description="CUNEIFORM SIGN URU TIMES LUM", + description="EGYPTIAN HIEROGLYPH A020", direction="l", linebreak="al", - unicodeslot=0x12346, + unicodeslot=0x13018, }, - [0x12347]={ + [0x13019]={ category="lo", - description="CUNEIFORM SIGN URU TIMES MIN", + description="EGYPTIAN HIEROGLYPH A021", direction="l", linebreak="al", - unicodeslot=0x12347, + unicodeslot=0x13019, }, - [0x12348]={ + [0x1301A]={ category="lo", - description="CUNEIFORM SIGN URU TIMES PA", + description="EGYPTIAN HIEROGLYPH A022", direction="l", linebreak="al", - unicodeslot=0x12348, + unicodeslot=0x1301A, }, - [0x12349]={ + [0x1301B]={ category="lo", - description="CUNEIFORM SIGN URU TIMES SHE", + description="EGYPTIAN HIEROGLYPH A023", direction="l", linebreak="al", - unicodeslot=0x12349, + unicodeslot=0x1301B, }, - [0x1234A]={ + [0x1301C]={ category="lo", - description="CUNEIFORM SIGN URU TIMES SIG0x0004", + description="EGYPTIAN HIEROGLYPH A024", direction="l", linebreak="al", - unicodeslot=0x1234A, + unicodeslot=0x1301C, }, - [0x1234B]={ + [0x1301D]={ category="lo", - description="CUNEIFORM SIGN URU TIMES TU", + description="EGYPTIAN HIEROGLYPH A025", direction="l", linebreak="al", - unicodeslot=0x1234B, + unicodeslot=0x1301D, }, - [0x1234C]={ + [0x1301E]={ category="lo", - description="CUNEIFORM SIGN URU TIMES U PLUS GUD", + description="EGYPTIAN HIEROGLYPH A026", direction="l", linebreak="al", - unicodeslot=0x1234C, + unicodeslot=0x1301E, }, - [0x1234D]={ + [0x1301F]={ category="lo", - description="CUNEIFORM SIGN URU TIMES UD", + description="EGYPTIAN HIEROGLYPH A027", direction="l", linebreak="al", - unicodeslot=0x1234D, + unicodeslot=0x1301F, }, - [0x1234E]={ + [0x13020]={ category="lo", - description="CUNEIFORM SIGN URU TIMES URUDA", + description="EGYPTIAN HIEROGLYPH A028", direction="l", linebreak="al", - unicodeslot=0x1234E, + unicodeslot=0x13020, }, - [0x1234F]={ + [0x13021]={ category="lo", - description="CUNEIFORM SIGN URUDA", + description="EGYPTIAN HIEROGLYPH A029", direction="l", linebreak="al", - unicodeslot=0x1234F, + unicodeslot=0x13021, }, - [0x12350]={ + [0x13022]={ category="lo", - description="CUNEIFORM SIGN URUDA TIMES U", + description="EGYPTIAN HIEROGLYPH A030", direction="l", linebreak="al", - unicodeslot=0x12350, + unicodeslot=0x13022, }, - [0x12351]={ + [0x13023]={ category="lo", - description="CUNEIFORM SIGN USH", + description="EGYPTIAN HIEROGLYPH A031", direction="l", linebreak="al", - unicodeslot=0x12351, + unicodeslot=0x13023, }, - [0x12352]={ + [0x13024]={ category="lo", - description="CUNEIFORM SIGN USH TIMES A", + description="EGYPTIAN HIEROGLYPH A032", direction="l", linebreak="al", - unicodeslot=0x12352, + unicodeslot=0x13024, }, - [0x12353]={ + [0x13025]={ category="lo", - description="CUNEIFORM SIGN USH TIMES KU", + description="EGYPTIAN HIEROGLYPH A032A", direction="l", linebreak="al", - unicodeslot=0x12353, + unicodeslot=0x13025, }, - [0x12354]={ + [0x13026]={ category="lo", - description="CUNEIFORM SIGN USH TIMES KUR", + description="EGYPTIAN HIEROGLYPH A033", direction="l", linebreak="al", - unicodeslot=0x12354, + unicodeslot=0x13026, }, - [0x12355]={ + [0x13027]={ category="lo", - description="CUNEIFORM SIGN USH TIMES TAK0x0004", + description="EGYPTIAN HIEROGLYPH A034", direction="l", linebreak="al", - unicodeslot=0x12355, + unicodeslot=0x13027, }, - [0x12356]={ + [0x13028]={ category="lo", - description="CUNEIFORM SIGN USHX", + description="EGYPTIAN HIEROGLYPH A035", direction="l", linebreak="al", - unicodeslot=0x12356, + unicodeslot=0x13028, }, - [0x12357]={ + [0x13029]={ category="lo", - description="CUNEIFORM SIGN USH0x0002", + description="EGYPTIAN HIEROGLYPH A036", direction="l", linebreak="al", - unicodeslot=0x12357, + unicodeslot=0x13029, }, - [0x12358]={ + [0x1302A]={ category="lo", - description="CUNEIFORM SIGN USHUMX", + description="EGYPTIAN HIEROGLYPH A037", direction="l", linebreak="al", - unicodeslot=0x12358, + unicodeslot=0x1302A, }, - [0x12359]={ + [0x1302B]={ category="lo", - description="CUNEIFORM SIGN UTUKI", + description="EGYPTIAN HIEROGLYPH A038", direction="l", linebreak="al", - unicodeslot=0x12359, + unicodeslot=0x1302B, }, - [0x1235A]={ + [0x1302C]={ category="lo", - description="CUNEIFORM SIGN UZ0x0003", + description="EGYPTIAN HIEROGLYPH A039", direction="l", linebreak="al", - unicodeslot=0x1235A, + unicodeslot=0x1302C, }, - [0x1235B]={ + [0x1302D]={ category="lo", - description="CUNEIFORM SIGN UZ0x0003 TIMES KASKAL", + description="EGYPTIAN HIEROGLYPH A040", direction="l", linebreak="al", - unicodeslot=0x1235B, + unicodeslot=0x1302D, }, - [0x1235C]={ + [0x1302E]={ category="lo", - description="CUNEIFORM SIGN UZU", + description="EGYPTIAN HIEROGLYPH A040A", direction="l", linebreak="al", - unicodeslot=0x1235C, + unicodeslot=0x1302E, }, - [0x1235D]={ + [0x1302F]={ category="lo", - description="CUNEIFORM SIGN ZA", + description="EGYPTIAN HIEROGLYPH A041", direction="l", linebreak="al", - unicodeslot=0x1235D, + unicodeslot=0x1302F, }, - [0x1235E]={ + [0x13030]={ category="lo", - description="CUNEIFORM SIGN ZA TENU", + description="EGYPTIAN HIEROGLYPH A042", direction="l", linebreak="al", - unicodeslot=0x1235E, + unicodeslot=0x13030, }, - [0x1235F]={ + [0x13031]={ category="lo", - description="CUNEIFORM SIGN ZA SQUARED TIMES KUR", + description="EGYPTIAN HIEROGLYPH A042A", direction="l", linebreak="al", - unicodeslot=0x1235F, + unicodeslot=0x13031, }, - [0x12360]={ + [0x13032]={ category="lo", - description="CUNEIFORM SIGN ZAG", + description="EGYPTIAN HIEROGLYPH A043", direction="l", linebreak="al", - unicodeslot=0x12360, + unicodeslot=0x13032, }, - [0x12361]={ + [0x13033]={ category="lo", - description="CUNEIFORM SIGN ZAMX", + description="EGYPTIAN HIEROGLYPH A043A", direction="l", linebreak="al", - unicodeslot=0x12361, + unicodeslot=0x13033, }, - [0x12362]={ + [0x13034]={ category="lo", - description="CUNEIFORM SIGN ZE0x0002", + description="EGYPTIAN HIEROGLYPH A044", direction="l", linebreak="al", - unicodeslot=0x12362, + unicodeslot=0x13034, }, - [0x12363]={ + [0x13035]={ category="lo", - description="CUNEIFORM SIGN ZI", + description="EGYPTIAN HIEROGLYPH A045", direction="l", linebreak="al", - unicodeslot=0x12363, + unicodeslot=0x13035, }, - [0x12364]={ + [0x13036]={ category="lo", - description="CUNEIFORM SIGN ZI OVER ZI", + description="EGYPTIAN HIEROGLYPH A045A", direction="l", linebreak="al", - unicodeslot=0x12364, + unicodeslot=0x13036, }, - [0x12365]={ + [0x13037]={ category="lo", - description="CUNEIFORM SIGN ZI0x0003", + description="EGYPTIAN HIEROGLYPH A046", direction="l", linebreak="al", - unicodeslot=0x12365, + unicodeslot=0x13037, }, - [0x12366]={ + [0x13038]={ category="lo", - description="CUNEIFORM SIGN ZIB", + description="EGYPTIAN HIEROGLYPH A047", direction="l", linebreak="al", - unicodeslot=0x12366, + unicodeslot=0x13038, }, - [0x12367]={ + [0x13039]={ category="lo", - description="CUNEIFORM SIGN ZIB KABA TENU", + description="EGYPTIAN HIEROGLYPH A048", direction="l", linebreak="al", - unicodeslot=0x12367, + unicodeslot=0x13039, }, - [0x12368]={ + [0x1303A]={ category="lo", - description="CUNEIFORM SIGN ZIG", + description="EGYPTIAN HIEROGLYPH A049", direction="l", linebreak="al", - unicodeslot=0x12368, + unicodeslot=0x1303A, }, - [0x12369]={ + [0x1303B]={ category="lo", - description="CUNEIFORM SIGN ZIZ0x0002", + description="EGYPTIAN HIEROGLYPH A050", direction="l", linebreak="al", - unicodeslot=0x12369, + unicodeslot=0x1303B, }, - [0x1236A]={ + [0x1303C]={ category="lo", - description="CUNEIFORM SIGN ZU", + description="EGYPTIAN HIEROGLYPH A051", direction="l", linebreak="al", - unicodeslot=0x1236A, + unicodeslot=0x1303C, }, - [0x1236B]={ + [0x1303D]={ category="lo", - description="CUNEIFORM SIGN ZU0x0005", + description="EGYPTIAN HIEROGLYPH A052", direction="l", linebreak="al", - unicodeslot=0x1236B, + unicodeslot=0x1303D, }, - [0x1236C]={ + [0x1303E]={ category="lo", - description="CUNEIFORM SIGN ZU0x0005 TIMES A", + description="EGYPTIAN HIEROGLYPH A053", direction="l", linebreak="al", - unicodeslot=0x1236C, + unicodeslot=0x1303E, }, - [0x1236D]={ + [0x1303F]={ category="lo", - description="CUNEIFORM SIGN ZUBUR", + description="EGYPTIAN HIEROGLYPH A054", direction="l", linebreak="al", - unicodeslot=0x1236D, + unicodeslot=0x1303F, }, - [0x1236E]={ + [0x13040]={ category="lo", - description="CUNEIFORM SIGN ZUM", + description="EGYPTIAN HIEROGLYPH A055", direction="l", linebreak="al", - unicodeslot=0x1236E, + unicodeslot=0x13040, }, - [0x12400]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO ASH", + [0x13041]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A056", direction="l", linebreak="al", - unicodeslot=0x12400, + unicodeslot=0x13041, }, - [0x12401]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE ASH", + [0x13042]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A057", direction="l", linebreak="al", - unicodeslot=0x12401, + unicodeslot=0x13042, }, - [0x12402]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR ASH", + [0x13043]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A058", direction="l", linebreak="al", - unicodeslot=0x12402, + unicodeslot=0x13043, }, - [0x12403]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE ASH", + [0x13044]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A059", direction="l", linebreak="al", - unicodeslot=0x12403, + unicodeslot=0x13044, }, - [0x12404]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX ASH", + [0x13045]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A060", direction="l", linebreak="al", - unicodeslot=0x12404, + unicodeslot=0x13045, }, - [0x12405]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN ASH", + [0x13046]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A061", direction="l", linebreak="al", - unicodeslot=0x12405, + unicodeslot=0x13046, }, - [0x12406]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT ASH", + [0x13047]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A062", direction="l", linebreak="al", - unicodeslot=0x12406, + unicodeslot=0x13047, }, - [0x12407]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE ASH", + [0x13048]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A063", direction="l", linebreak="al", - unicodeslot=0x12407, + unicodeslot=0x13048, }, - [0x12408]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE DISH", + [0x13049]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A064", direction="l", linebreak="al", - unicodeslot=0x12408, + unicodeslot=0x13049, }, - [0x12409]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR DISH", + [0x1304A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A065", direction="l", linebreak="al", - unicodeslot=0x12409, + unicodeslot=0x1304A, }, - [0x1240A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE DISH", + [0x1304B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A066", direction="l", linebreak="al", - unicodeslot=0x1240A, + unicodeslot=0x1304B, }, - [0x1240B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX DISH", + [0x1304C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A067", direction="l", linebreak="al", - unicodeslot=0x1240B, + unicodeslot=0x1304C, }, - [0x1240C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN DISH", + [0x1304D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A068", direction="l", linebreak="al", - unicodeslot=0x1240C, + unicodeslot=0x1304D, }, - [0x1240D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT DISH", + [0x1304E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A069", direction="l", linebreak="al", - unicodeslot=0x1240D, + unicodeslot=0x1304E, }, - [0x1240E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE DISH", + [0x1304F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH A070", direction="l", linebreak="al", - unicodeslot=0x1240E, + unicodeslot=0x1304F, }, - [0x1240F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR U", + [0x13050]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B001", direction="l", linebreak="al", - unicodeslot=0x1240F, + unicodeslot=0x13050, }, - [0x12410]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE U", + [0x13051]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B002", direction="l", linebreak="al", - unicodeslot=0x12410, + unicodeslot=0x13051, }, - [0x12411]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX U", + [0x13052]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B003", direction="l", linebreak="al", - unicodeslot=0x12411, + unicodeslot=0x13052, }, - [0x12412]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN U", + [0x13053]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B004", direction="l", linebreak="al", - unicodeslot=0x12412, + unicodeslot=0x13053, }, - [0x12413]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT U", + [0x13054]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B005", direction="l", linebreak="al", - unicodeslot=0x12413, + unicodeslot=0x13054, }, - [0x12414]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE U", + [0x13055]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B005A", direction="l", linebreak="al", - unicodeslot=0x12414, + unicodeslot=0x13055, }, - [0x12415]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE GESH0x0002", + [0x13056]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B006", direction="l", linebreak="al", - unicodeslot=0x12415, + unicodeslot=0x13056, }, - [0x12416]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO GESH0x0002", + [0x13057]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B007", direction="l", linebreak="al", - unicodeslot=0x12416, + unicodeslot=0x13057, }, - [0x12417]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE GESH0x0002", + [0x13058]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B008", direction="l", linebreak="al", - unicodeslot=0x12417, + unicodeslot=0x13058, }, - [0x12418]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR GESH0x0002", + [0x13059]={ + category="lo", + description="EGYPTIAN HIEROGLYPH B009", direction="l", linebreak="al", - unicodeslot=0x12418, + unicodeslot=0x13059, }, - [0x12419]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE GESH0x0002", + [0x1305A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C001", direction="l", linebreak="al", - unicodeslot=0x12419, + unicodeslot=0x1305A, }, - [0x1241A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX GESH0x0002", + [0x1305B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C002", direction="l", linebreak="al", - unicodeslot=0x1241A, + unicodeslot=0x1305B, }, - [0x1241B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN GESH0x0002", + [0x1305C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C002A", direction="l", linebreak="al", - unicodeslot=0x1241B, + unicodeslot=0x1305C, }, - [0x1241C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT GESH0x0002", + [0x1305D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C002B", direction="l", linebreak="al", - unicodeslot=0x1241C, + unicodeslot=0x1305D, }, - [0x1241D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE GESH0x0002", + [0x1305E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C002C", direction="l", linebreak="al", - unicodeslot=0x1241D, + unicodeslot=0x1305E, }, - [0x1241E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE GESHU", + [0x1305F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C003", direction="l", linebreak="al", - unicodeslot=0x1241E, + unicodeslot=0x1305F, }, - [0x1241F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO GESHU", + [0x13060]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C004", direction="l", linebreak="al", - unicodeslot=0x1241F, + unicodeslot=0x13060, }, - [0x12420]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE GESHU", + [0x13061]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C005", direction="l", linebreak="al", - unicodeslot=0x12420, + unicodeslot=0x13061, }, - [0x12421]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR GESHU", + [0x13062]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C006", direction="l", linebreak="al", - unicodeslot=0x12421, + unicodeslot=0x13062, }, - [0x12422]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE GESHU", + [0x13063]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C007", direction="l", linebreak="al", - unicodeslot=0x12422, + unicodeslot=0x13063, }, - [0x12423]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO SHAR0x0002", + [0x13064]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C008", direction="l", linebreak="al", - unicodeslot=0x12423, + unicodeslot=0x13064, }, - [0x12424]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002", + [0x13065]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C009", direction="l", linebreak="al", - unicodeslot=0x12424, + unicodeslot=0x13065, }, - [0x12425]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002 VARIANT FORM", + [0x13066]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C010", direction="l", linebreak="al", - unicodeslot=0x12425, + unicodeslot=0x13066, }, - [0x12426]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR SHAR0x0002", + [0x13067]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C010A", direction="l", linebreak="al", - unicodeslot=0x12426, + unicodeslot=0x13067, }, - [0x12427]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE SHAR0x0002", + [0x13068]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C011", direction="l", linebreak="al", - unicodeslot=0x12427, + unicodeslot=0x13068, }, - [0x12428]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX SHAR0x0002", + [0x13069]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C012", direction="l", linebreak="al", - unicodeslot=0x12428, + unicodeslot=0x13069, }, - [0x12429]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN SHAR0x0002", + [0x1306A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C013", direction="l", linebreak="al", - unicodeslot=0x12429, + unicodeslot=0x1306A, }, - [0x1242A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT SHAR0x0002", + [0x1306B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C014", direction="l", linebreak="al", - unicodeslot=0x1242A, + unicodeslot=0x1306B, }, - [0x1242B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE SHAR0x0002", + [0x1306C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C015", direction="l", linebreak="al", - unicodeslot=0x1242B, + unicodeslot=0x1306C, }, - [0x1242C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE SHARU", + [0x1306D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C016", direction="l", linebreak="al", - unicodeslot=0x1242C, + unicodeslot=0x1306D, }, - [0x1242D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO SHARU", + [0x1306E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C017", direction="l", linebreak="al", - unicodeslot=0x1242D, + unicodeslot=0x1306E, }, - [0x1242E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE SHARU", + [0x1306F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C018", direction="l", linebreak="al", - unicodeslot=0x1242E, + unicodeslot=0x1306F, }, - [0x1242F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM", + [0x13070]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C019", direction="l", linebreak="al", - unicodeslot=0x1242F, + unicodeslot=0x13070, }, - [0x12430]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR SHARU", + [0x13071]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C020", direction="l", linebreak="al", - unicodeslot=0x12430, + unicodeslot=0x13071, }, - [0x12431]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE SHARU", + [0x13072]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C021", direction="l", linebreak="al", - unicodeslot=0x12431, + unicodeslot=0x13072, }, - [0x12432]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS DISH", + [0x13073]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C022", direction="l", linebreak="al", - unicodeslot=0x12432, + unicodeslot=0x13073, }, - [0x12433]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS MIN", + [0x13074]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C023", direction="l", linebreak="al", - unicodeslot=0x12433, + unicodeslot=0x13074, }, - [0x12434]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE BURU", + [0x13075]={ + category="lo", + description="EGYPTIAN HIEROGLYPH C024", direction="l", linebreak="al", - unicodeslot=0x12434, + unicodeslot=0x13075, }, - [0x12435]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO BURU", + [0x13076]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D001", direction="l", linebreak="al", - unicodeslot=0x12435, + unicodeslot=0x13076, }, - [0x12436]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE BURU", + [0x13077]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D002", direction="l", linebreak="al", - unicodeslot=0x12436, + unicodeslot=0x13077, }, - [0x12437]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM", + [0x13078]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D003", direction="l", linebreak="al", - unicodeslot=0x12437, + unicodeslot=0x13078, }, - [0x12438]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR BURU", + [0x13079]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D004", direction="l", linebreak="al", - unicodeslot=0x12438, + unicodeslot=0x13079, }, - [0x12439]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE BURU", + [0x1307A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D005", direction="l", linebreak="al", - unicodeslot=0x12439, + unicodeslot=0x1307A, }, - [0x1243A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0010", + [0x1307B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D006", direction="l", linebreak="al", - unicodeslot=0x1243A, + unicodeslot=0x1307B, }, - [0x1243B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0015", + [0x1307C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D007", direction="l", linebreak="al", - unicodeslot=0x1243B, + unicodeslot=0x1307C, }, - [0x1243C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU", + [0x1307D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D008", direction="l", linebreak="al", - unicodeslot=0x1243C, + unicodeslot=0x1307D, }, - [0x1243D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU0x0004", + [0x1307E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D008A", direction="l", linebreak="al", - unicodeslot=0x1243D, + unicodeslot=0x1307E, }, - [0x1243E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A", + [0x1307F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D009", direction="l", linebreak="al", - unicodeslot=0x1243E, + unicodeslot=0x1307F, }, - [0x1243F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B", + [0x13080]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D010", direction="l", linebreak="al", - unicodeslot=0x1243F, + unicodeslot=0x13080, }, - [0x12440]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH0x0009", + [0x13081]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D011", direction="l", linebreak="al", - unicodeslot=0x12440, + unicodeslot=0x13081, }, - [0x12441]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN0x0003", + [0x13082]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D012", direction="l", linebreak="al", - unicodeslot=0x12441, + unicodeslot=0x13082, }, - [0x12442]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A", + [0x13083]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D013", direction="l", linebreak="al", - unicodeslot=0x12442, + unicodeslot=0x13083, }, - [0x12443]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B", + [0x13084]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D014", direction="l", linebreak="al", - unicodeslot=0x12443, + unicodeslot=0x13084, }, - [0x12444]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU", + [0x13085]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D015", direction="l", linebreak="al", - unicodeslot=0x12444, + unicodeslot=0x13085, }, - [0x12445]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU0x0003", + [0x13086]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D016", direction="l", linebreak="al", - unicodeslot=0x12445, + unicodeslot=0x13086, }, - [0x12446]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU", + [0x13087]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D017", direction="l", linebreak="al", - unicodeslot=0x12446, + unicodeslot=0x13087, }, - [0x12447]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0003", + [0x13088]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D018", direction="l", linebreak="al", - unicodeslot=0x12447, + unicodeslot=0x13088, }, - [0x12448]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0004", + [0x13089]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D019", direction="l", linebreak="al", - unicodeslot=0x12448, + unicodeslot=0x13089, }, - [0x12449]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A", + [0x1308A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D020", direction="l", linebreak="al", - unicodeslot=0x12449, + unicodeslot=0x1308A, }, - [0x1244A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO ASH TENU", + [0x1308B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D021", direction="l", linebreak="al", - unicodeslot=0x1244A, + unicodeslot=0x1308B, }, - [0x1244B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE ASH TENU", + [0x1308C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D022", direction="l", linebreak="al", - unicodeslot=0x1244B, + unicodeslot=0x1308C, }, - [0x1244C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR ASH TENU", + [0x1308D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D023", direction="l", linebreak="al", - unicodeslot=0x1244C, + unicodeslot=0x1308D, }, - [0x1244D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE ASH TENU", + [0x1308E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D024", direction="l", linebreak="al", - unicodeslot=0x1244D, + unicodeslot=0x1308E, }, - [0x1244E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN SIX ASH TENU", + [0x1308F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D025", direction="l", linebreak="al", - unicodeslot=0x1244E, + unicodeslot=0x1308F, }, - [0x1244F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE BAN0x0002", + [0x13090]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D026", direction="l", linebreak="al", - unicodeslot=0x1244F, + unicodeslot=0x13090, }, - [0x12450]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO BAN0x0002", + [0x13091]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D027", direction="l", linebreak="al", - unicodeslot=0x12450, + unicodeslot=0x13091, }, - [0x12451]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN THREE BAN0x0002", + [0x13092]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D027A", direction="l", linebreak="al", - unicodeslot=0x12451, + unicodeslot=0x13092, }, - [0x12452]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002", + [0x13093]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D028", direction="l", linebreak="al", - unicodeslot=0x12452, + unicodeslot=0x13093, }, - [0x12453]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002 VARIANT FORM", + [0x13094]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D029", direction="l", linebreak="al", - unicodeslot=0x12453, + unicodeslot=0x13094, }, - [0x12454]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002", + [0x13095]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D030", direction="l", linebreak="al", - unicodeslot=0x12454, + unicodeslot=0x13095, }, - [0x12455]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002 VARIANT FORM", + [0x13096]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D031", direction="l", linebreak="al", - unicodeslot=0x12455, + unicodeslot=0x13096, }, - [0x12456]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NIGIDAMIN", + [0x13097]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D031A", direction="l", linebreak="al", - unicodeslot=0x12456, + unicodeslot=0x13097, }, - [0x12457]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN NIGIDAESH", + [0x13098]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D032", direction="l", linebreak="al", - unicodeslot=0x12457, + unicodeslot=0x13098, }, - [0x12458]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE ESHE0x0003", + [0x13099]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D033", direction="l", linebreak="al", - unicodeslot=0x12458, + unicodeslot=0x13099, }, - [0x12459]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO ESHE0x0003", + [0x1309A]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D034", direction="l", linebreak="al", - unicodeslot=0x12459, + unicodeslot=0x1309A, }, - [0x1245A]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE THIRD DISH", + [0x1309B]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D034A", direction="l", linebreak="al", - unicodeslot=0x1245A, + unicodeslot=0x1309B, }, - [0x1245B]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO THIRDS DISH", + [0x1309C]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D035", direction="l", linebreak="al", - unicodeslot=0x1245B, + unicodeslot=0x1309C, }, - [0x1245C]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH", + [0x1309D]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D036", direction="l", linebreak="al", - unicodeslot=0x1245C, + unicodeslot=0x1309D, }, - [0x1245D]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A", + [0x1309E]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D037", direction="l", linebreak="al", - unicodeslot=0x1245D, + unicodeslot=0x1309E, }, - [0x1245E]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A", + [0x1309F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D038", direction="l", linebreak="al", - unicodeslot=0x1245E, + unicodeslot=0x1309F, }, - [0x1245F]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH", + [0x130A0]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D039", direction="l", linebreak="al", - unicodeslot=0x1245F, + unicodeslot=0x130A0, }, - [0x12460]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN ONE QUARTER ASH", + [0x130A1]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D040", direction="l", linebreak="al", - unicodeslot=0x12460, + unicodeslot=0x130A1, }, - [0x12461]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH", + [0x130A2]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D041", direction="l", linebreak="al", - unicodeslot=0x12461, + unicodeslot=0x130A2, }, - [0x12462]={ - category="nl", - description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER", + [0x130A3]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D042", direction="l", linebreak="al", - unicodeslot=0x12462, + unicodeslot=0x130A3, }, - [0x12470]={ - category="po", - description="CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER", + [0x130A4]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D043", direction="l", - linebreak="ba", - unicodeslot=0x12470, + linebreak="al", + unicodeslot=0x130A4, }, - [0x12471]={ - category="po", - description="CUNEIFORM PUNCTUATION SIGN VERTICAL COLON", + [0x130A5]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D044", direction="l", - linebreak="ba", - unicodeslot=0x12471, + linebreak="al", + unicodeslot=0x130A5, }, - [0x12472]={ - category="po", - description="CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON", + [0x130A6]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D045", direction="l", - linebreak="ba", - unicodeslot=0x12472, + linebreak="al", + unicodeslot=0x130A6, }, - [0x12473]={ - category="po", - description="CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON", + [0x130A7]={ + category="lo", + description="EGYPTIAN HIEROGLYPH D046", direction="l", - linebreak="ba", - unicodeslot=0x12473, + linebreak="al", + unicodeslot=0x130A7, }, - [0x13000]={ + [0x130A8]={ category="lo", - description="EGYPTIAN HIEROGLYPH A001", + description="EGYPTIAN HIEROGLYPH D046A", direction="l", linebreak="al", - unicodeslot=0x13000, + unicodeslot=0x130A8, }, - [0x13001]={ + [0x130A9]={ category="lo", - description="EGYPTIAN HIEROGLYPH A002", + description="EGYPTIAN HIEROGLYPH D047", direction="l", linebreak="al", - unicodeslot=0x13001, + unicodeslot=0x130A9, }, - [0x13002]={ + [0x130AA]={ category="lo", - description="EGYPTIAN HIEROGLYPH A003", + description="EGYPTIAN HIEROGLYPH D048", direction="l", linebreak="al", - unicodeslot=0x13002, + unicodeslot=0x130AA, }, - [0x13003]={ + [0x130AB]={ category="lo", - description="EGYPTIAN HIEROGLYPH A004", + description="EGYPTIAN HIEROGLYPH D048A", direction="l", linebreak="al", - unicodeslot=0x13003, + unicodeslot=0x130AB, }, - [0x13004]={ + [0x130AC]={ category="lo", - description="EGYPTIAN HIEROGLYPH A005", + description="EGYPTIAN HIEROGLYPH D049", direction="l", linebreak="al", - unicodeslot=0x13004, + unicodeslot=0x130AC, }, - [0x13005]={ + [0x130AD]={ category="lo", - description="EGYPTIAN HIEROGLYPH A005A", + description="EGYPTIAN HIEROGLYPH D050", direction="l", linebreak="al", - unicodeslot=0x13005, + unicodeslot=0x130AD, }, - [0x13006]={ + [0x130AE]={ category="lo", - description="EGYPTIAN HIEROGLYPH A006", + description="EGYPTIAN HIEROGLYPH D050A", direction="l", linebreak="al", - unicodeslot=0x13006, + unicodeslot=0x130AE, }, - [0x13007]={ + [0x130AF]={ category="lo", - description="EGYPTIAN HIEROGLYPH A006A", + description="EGYPTIAN HIEROGLYPH D050B", direction="l", linebreak="al", - unicodeslot=0x13007, + unicodeslot=0x130AF, }, - [0x13008]={ + [0x130B0]={ category="lo", - description="EGYPTIAN HIEROGLYPH A006B", + description="EGYPTIAN HIEROGLYPH D050C", direction="l", linebreak="al", - unicodeslot=0x13008, + unicodeslot=0x130B0, }, - [0x13009]={ + [0x130B1]={ category="lo", - description="EGYPTIAN HIEROGLYPH A007", + description="EGYPTIAN HIEROGLYPH D050D", direction="l", linebreak="al", - unicodeslot=0x13009, + unicodeslot=0x130B1, }, - [0x1300A]={ + [0x130B2]={ category="lo", - description="EGYPTIAN HIEROGLYPH A008", + description="EGYPTIAN HIEROGLYPH D050E", direction="l", linebreak="al", - unicodeslot=0x1300A, + unicodeslot=0x130B2, }, - [0x1300B]={ + [0x130B3]={ category="lo", - description="EGYPTIAN HIEROGLYPH A009", + description="EGYPTIAN HIEROGLYPH D050F", direction="l", linebreak="al", - unicodeslot=0x1300B, + unicodeslot=0x130B3, }, - [0x1300C]={ + [0x130B4]={ category="lo", - description="EGYPTIAN HIEROGLYPH A010", + description="EGYPTIAN HIEROGLYPH D050G", direction="l", linebreak="al", - unicodeslot=0x1300C, + unicodeslot=0x130B4, }, - [0x1300D]={ + [0x130B5]={ category="lo", - description="EGYPTIAN HIEROGLYPH A011", + description="EGYPTIAN HIEROGLYPH D050H", direction="l", linebreak="al", - unicodeslot=0x1300D, + unicodeslot=0x130B5, }, - [0x1300E]={ + [0x130B6]={ category="lo", - description="EGYPTIAN HIEROGLYPH A012", + description="EGYPTIAN HIEROGLYPH D050I", direction="l", linebreak="al", - unicodeslot=0x1300E, + unicodeslot=0x130B6, }, - [0x1300F]={ + [0x130B7]={ category="lo", - description="EGYPTIAN HIEROGLYPH A013", + description="EGYPTIAN HIEROGLYPH D051", direction="l", linebreak="al", - unicodeslot=0x1300F, + unicodeslot=0x130B7, }, - [0x13010]={ + [0x130B8]={ category="lo", - description="EGYPTIAN HIEROGLYPH A014", + description="EGYPTIAN HIEROGLYPH D052", direction="l", linebreak="al", - unicodeslot=0x13010, + unicodeslot=0x130B8, }, - [0x13011]={ + [0x130B9]={ category="lo", - description="EGYPTIAN HIEROGLYPH A014A", + description="EGYPTIAN HIEROGLYPH D052A", direction="l", linebreak="al", - unicodeslot=0x13011, + unicodeslot=0x130B9, }, - [0x13012]={ + [0x130BA]={ category="lo", - description="EGYPTIAN HIEROGLYPH A015", + description="EGYPTIAN HIEROGLYPH D053", direction="l", linebreak="al", - unicodeslot=0x13012, + unicodeslot=0x130BA, }, - [0x13013]={ + [0x130BB]={ category="lo", - description="EGYPTIAN HIEROGLYPH A016", + description="EGYPTIAN HIEROGLYPH D054", direction="l", linebreak="al", - unicodeslot=0x13013, + unicodeslot=0x130BB, }, - [0x13014]={ + [0x130BC]={ category="lo", - description="EGYPTIAN HIEROGLYPH A017", + description="EGYPTIAN HIEROGLYPH D054A", direction="l", linebreak="al", - unicodeslot=0x13014, + unicodeslot=0x130BC, }, - [0x13015]={ + [0x130BD]={ category="lo", - description="EGYPTIAN HIEROGLYPH A017A", + description="EGYPTIAN HIEROGLYPH D055", direction="l", linebreak="al", - unicodeslot=0x13015, + unicodeslot=0x130BD, }, - [0x13016]={ + [0x130BE]={ category="lo", - description="EGYPTIAN HIEROGLYPH A018", + description="EGYPTIAN HIEROGLYPH D056", direction="l", linebreak="al", - unicodeslot=0x13016, + unicodeslot=0x130BE, }, - [0x13017]={ + [0x130BF]={ category="lo", - description="EGYPTIAN HIEROGLYPH A019", + description="EGYPTIAN HIEROGLYPH D057", direction="l", linebreak="al", - unicodeslot=0x13017, + unicodeslot=0x130BF, }, - [0x13018]={ + [0x130C0]={ category="lo", - description="EGYPTIAN HIEROGLYPH A020", + description="EGYPTIAN HIEROGLYPH D058", direction="l", linebreak="al", - unicodeslot=0x13018, + unicodeslot=0x130C0, }, - [0x13019]={ + [0x130C1]={ category="lo", - description="EGYPTIAN HIEROGLYPH A021", + description="EGYPTIAN HIEROGLYPH D059", direction="l", linebreak="al", - unicodeslot=0x13019, + unicodeslot=0x130C1, }, - [0x1301A]={ + [0x130C2]={ category="lo", - description="EGYPTIAN HIEROGLYPH A022", + description="EGYPTIAN HIEROGLYPH D060", direction="l", linebreak="al", - unicodeslot=0x1301A, + unicodeslot=0x130C2, }, - [0x1301B]={ + [0x130C3]={ category="lo", - description="EGYPTIAN HIEROGLYPH A023", + description="EGYPTIAN HIEROGLYPH D061", direction="l", linebreak="al", - unicodeslot=0x1301B, + unicodeslot=0x130C3, }, - [0x1301C]={ + [0x130C4]={ category="lo", - description="EGYPTIAN HIEROGLYPH A024", + description="EGYPTIAN HIEROGLYPH D062", direction="l", linebreak="al", - unicodeslot=0x1301C, + unicodeslot=0x130C4, }, - [0x1301D]={ + [0x130C5]={ category="lo", - description="EGYPTIAN HIEROGLYPH A025", + description="EGYPTIAN HIEROGLYPH D063", direction="l", linebreak="al", - unicodeslot=0x1301D, + unicodeslot=0x130C5, }, - [0x1301E]={ + [0x130C6]={ category="lo", - description="EGYPTIAN HIEROGLYPH A026", + description="EGYPTIAN HIEROGLYPH D064", direction="l", linebreak="al", - unicodeslot=0x1301E, + unicodeslot=0x130C6, }, - [0x1301F]={ + [0x130C7]={ category="lo", - description="EGYPTIAN HIEROGLYPH A027", + description="EGYPTIAN HIEROGLYPH D065", direction="l", linebreak="al", - unicodeslot=0x1301F, + unicodeslot=0x130C7, }, - [0x13020]={ + [0x130C8]={ category="lo", - description="EGYPTIAN HIEROGLYPH A028", + description="EGYPTIAN HIEROGLYPH D066", direction="l", linebreak="al", - unicodeslot=0x13020, + unicodeslot=0x130C8, }, - [0x13021]={ + [0x130C9]={ category="lo", - description="EGYPTIAN HIEROGLYPH A029", + description="EGYPTIAN HIEROGLYPH D067", direction="l", linebreak="al", - unicodeslot=0x13021, + unicodeslot=0x130C9, }, - [0x13022]={ + [0x130CA]={ category="lo", - description="EGYPTIAN HIEROGLYPH A030", + description="EGYPTIAN HIEROGLYPH D067A", direction="l", linebreak="al", - unicodeslot=0x13022, + unicodeslot=0x130CA, }, - [0x13023]={ + [0x130CB]={ category="lo", - description="EGYPTIAN HIEROGLYPH A031", + description="EGYPTIAN HIEROGLYPH D067B", direction="l", linebreak="al", - unicodeslot=0x13023, + unicodeslot=0x130CB, }, - [0x13024]={ + [0x130CC]={ category="lo", - description="EGYPTIAN HIEROGLYPH A032", + description="EGYPTIAN HIEROGLYPH D067C", direction="l", linebreak="al", - unicodeslot=0x13024, + unicodeslot=0x130CC, }, - [0x13025]={ + [0x130CD]={ category="lo", - description="EGYPTIAN HIEROGLYPH A032A", + description="EGYPTIAN HIEROGLYPH D067D", direction="l", linebreak="al", - unicodeslot=0x13025, + unicodeslot=0x130CD, }, - [0x13026]={ + [0x130CE]={ category="lo", - description="EGYPTIAN HIEROGLYPH A033", + description="EGYPTIAN HIEROGLYPH D067E", direction="l", linebreak="al", - unicodeslot=0x13026, + unicodeslot=0x130CE, }, - [0x13027]={ + [0x130CF]={ category="lo", - description="EGYPTIAN HIEROGLYPH A034", + description="EGYPTIAN HIEROGLYPH D067F", direction="l", linebreak="al", - unicodeslot=0x13027, + unicodeslot=0x130CF, }, - [0x13028]={ + [0x130D0]={ category="lo", - description="EGYPTIAN HIEROGLYPH A035", + description="EGYPTIAN HIEROGLYPH D067G", direction="l", linebreak="al", - unicodeslot=0x13028, + unicodeslot=0x130D0, }, - [0x13029]={ + [0x130D1]={ category="lo", - description="EGYPTIAN HIEROGLYPH A036", + description="EGYPTIAN HIEROGLYPH D067H", direction="l", linebreak="al", - unicodeslot=0x13029, + unicodeslot=0x130D1, }, - [0x1302A]={ + [0x130D2]={ category="lo", - description="EGYPTIAN HIEROGLYPH A037", + description="EGYPTIAN HIEROGLYPH E001", direction="l", linebreak="al", - unicodeslot=0x1302A, + unicodeslot=0x130D2, }, - [0x1302B]={ + [0x130D3]={ category="lo", - description="EGYPTIAN HIEROGLYPH A038", + description="EGYPTIAN HIEROGLYPH E002", direction="l", linebreak="al", - unicodeslot=0x1302B, + unicodeslot=0x130D3, }, - [0x1302C]={ + [0x130D4]={ category="lo", - description="EGYPTIAN HIEROGLYPH A039", + description="EGYPTIAN HIEROGLYPH E003", direction="l", linebreak="al", - unicodeslot=0x1302C, + unicodeslot=0x130D4, }, - [0x1302D]={ + [0x130D5]={ category="lo", - description="EGYPTIAN HIEROGLYPH A040", + description="EGYPTIAN HIEROGLYPH E004", direction="l", linebreak="al", - unicodeslot=0x1302D, + unicodeslot=0x130D5, }, - [0x1302E]={ + [0x130D6]={ category="lo", - description="EGYPTIAN HIEROGLYPH A040A", + description="EGYPTIAN HIEROGLYPH E005", direction="l", linebreak="al", - unicodeslot=0x1302E, + unicodeslot=0x130D6, }, - [0x1302F]={ + [0x130D7]={ category="lo", - description="EGYPTIAN HIEROGLYPH A041", + description="EGYPTIAN HIEROGLYPH E006", direction="l", linebreak="al", - unicodeslot=0x1302F, + unicodeslot=0x130D7, }, - [0x13030]={ + [0x130D8]={ category="lo", - description="EGYPTIAN HIEROGLYPH A042", + description="EGYPTIAN HIEROGLYPH E007", direction="l", linebreak="al", - unicodeslot=0x13030, + unicodeslot=0x130D8, }, - [0x13031]={ + [0x130D9]={ category="lo", - description="EGYPTIAN HIEROGLYPH A042A", + description="EGYPTIAN HIEROGLYPH E008", direction="l", linebreak="al", - unicodeslot=0x13031, + unicodeslot=0x130D9, }, - [0x13032]={ + [0x130DA]={ category="lo", - description="EGYPTIAN HIEROGLYPH A043", + description="EGYPTIAN HIEROGLYPH E008A", direction="l", linebreak="al", - unicodeslot=0x13032, + unicodeslot=0x130DA, }, - [0x13033]={ + [0x130DB]={ category="lo", - description="EGYPTIAN HIEROGLYPH A043A", + description="EGYPTIAN HIEROGLYPH E009", direction="l", linebreak="al", - unicodeslot=0x13033, + unicodeslot=0x130DB, }, - [0x13034]={ + [0x130DC]={ category="lo", - description="EGYPTIAN HIEROGLYPH A044", + description="EGYPTIAN HIEROGLYPH E009A", direction="l", linebreak="al", - unicodeslot=0x13034, + unicodeslot=0x130DC, }, - [0x13035]={ + [0x130DD]={ category="lo", - description="EGYPTIAN HIEROGLYPH A045", + description="EGYPTIAN HIEROGLYPH E010", direction="l", linebreak="al", - unicodeslot=0x13035, + unicodeslot=0x130DD, }, - [0x13036]={ + [0x130DE]={ category="lo", - description="EGYPTIAN HIEROGLYPH A045A", + description="EGYPTIAN HIEROGLYPH E011", direction="l", linebreak="al", - unicodeslot=0x13036, + unicodeslot=0x130DE, }, - [0x13037]={ + [0x130DF]={ category="lo", - description="EGYPTIAN HIEROGLYPH A046", + description="EGYPTIAN HIEROGLYPH E012", direction="l", linebreak="al", - unicodeslot=0x13037, + unicodeslot=0x130DF, }, - [0x13038]={ + [0x130E0]={ category="lo", - description="EGYPTIAN HIEROGLYPH A047", + description="EGYPTIAN HIEROGLYPH E013", direction="l", linebreak="al", - unicodeslot=0x13038, + unicodeslot=0x130E0, }, - [0x13039]={ + [0x130E1]={ category="lo", - description="EGYPTIAN HIEROGLYPH A048", + description="EGYPTIAN HIEROGLYPH E014", direction="l", linebreak="al", - unicodeslot=0x13039, + unicodeslot=0x130E1, }, - [0x1303A]={ + [0x130E2]={ category="lo", - description="EGYPTIAN HIEROGLYPH A049", + description="EGYPTIAN HIEROGLYPH E015", direction="l", linebreak="al", - unicodeslot=0x1303A, + unicodeslot=0x130E2, }, - [0x1303B]={ + [0x130E3]={ category="lo", - description="EGYPTIAN HIEROGLYPH A050", + description="EGYPTIAN HIEROGLYPH E016", direction="l", linebreak="al", - unicodeslot=0x1303B, + unicodeslot=0x130E3, }, - [0x1303C]={ + [0x130E4]={ category="lo", - description="EGYPTIAN HIEROGLYPH A051", + description="EGYPTIAN HIEROGLYPH E016A", direction="l", linebreak="al", - unicodeslot=0x1303C, + unicodeslot=0x130E4, }, - [0x1303D]={ + [0x130E5]={ category="lo", - description="EGYPTIAN HIEROGLYPH A052", + description="EGYPTIAN HIEROGLYPH E017", direction="l", linebreak="al", - unicodeslot=0x1303D, + unicodeslot=0x130E5, }, - [0x1303E]={ + [0x130E6]={ category="lo", - description="EGYPTIAN HIEROGLYPH A053", + description="EGYPTIAN HIEROGLYPH E017A", direction="l", linebreak="al", - unicodeslot=0x1303E, + unicodeslot=0x130E6, }, - [0x1303F]={ + [0x130E7]={ category="lo", - description="EGYPTIAN HIEROGLYPH A054", + description="EGYPTIAN HIEROGLYPH E018", direction="l", linebreak="al", - unicodeslot=0x1303F, + unicodeslot=0x130E7, }, - [0x13040]={ + [0x130E8]={ category="lo", - description="EGYPTIAN HIEROGLYPH A055", + description="EGYPTIAN HIEROGLYPH E019", direction="l", linebreak="al", - unicodeslot=0x13040, + unicodeslot=0x130E8, }, - [0x13041]={ + [0x130E9]={ category="lo", - description="EGYPTIAN HIEROGLYPH A056", + description="EGYPTIAN HIEROGLYPH E020", direction="l", linebreak="al", - unicodeslot=0x13041, + unicodeslot=0x130E9, }, - [0x13042]={ + [0x130EA]={ category="lo", - description="EGYPTIAN HIEROGLYPH A057", + description="EGYPTIAN HIEROGLYPH E020A", direction="l", linebreak="al", - unicodeslot=0x13042, + unicodeslot=0x130EA, }, - [0x13043]={ + [0x130EB]={ category="lo", - description="EGYPTIAN HIEROGLYPH A058", + description="EGYPTIAN HIEROGLYPH E021", direction="l", linebreak="al", - unicodeslot=0x13043, + unicodeslot=0x130EB, }, - [0x13044]={ + [0x130EC]={ category="lo", - description="EGYPTIAN HIEROGLYPH A059", + description="EGYPTIAN HIEROGLYPH E022", direction="l", linebreak="al", - unicodeslot=0x13044, + unicodeslot=0x130EC, }, - [0x13045]={ + [0x130ED]={ category="lo", - description="EGYPTIAN HIEROGLYPH A060", + description="EGYPTIAN HIEROGLYPH E023", direction="l", linebreak="al", - unicodeslot=0x13045, + unicodeslot=0x130ED, }, - [0x13046]={ + [0x130EE]={ category="lo", - description="EGYPTIAN HIEROGLYPH A061", + description="EGYPTIAN HIEROGLYPH E024", direction="l", linebreak="al", - unicodeslot=0x13046, + unicodeslot=0x130EE, }, - [0x13047]={ + [0x130EF]={ category="lo", - description="EGYPTIAN HIEROGLYPH A062", + description="EGYPTIAN HIEROGLYPH E025", direction="l", linebreak="al", - unicodeslot=0x13047, + unicodeslot=0x130EF, }, - [0x13048]={ + [0x130F0]={ category="lo", - description="EGYPTIAN HIEROGLYPH A063", + description="EGYPTIAN HIEROGLYPH E026", direction="l", linebreak="al", - unicodeslot=0x13048, + unicodeslot=0x130F0, }, - [0x13049]={ + [0x130F1]={ category="lo", - description="EGYPTIAN HIEROGLYPH A064", + description="EGYPTIAN HIEROGLYPH E027", direction="l", linebreak="al", - unicodeslot=0x13049, + unicodeslot=0x130F1, }, - [0x1304A]={ + [0x130F2]={ category="lo", - description="EGYPTIAN HIEROGLYPH A065", + description="EGYPTIAN HIEROGLYPH E028", direction="l", linebreak="al", - unicodeslot=0x1304A, + unicodeslot=0x130F2, }, - [0x1304B]={ + [0x130F3]={ category="lo", - description="EGYPTIAN HIEROGLYPH A066", + description="EGYPTIAN HIEROGLYPH E028A", direction="l", linebreak="al", - unicodeslot=0x1304B, + unicodeslot=0x130F3, }, - [0x1304C]={ + [0x130F4]={ category="lo", - description="EGYPTIAN HIEROGLYPH A067", + description="EGYPTIAN HIEROGLYPH E029", direction="l", linebreak="al", - unicodeslot=0x1304C, + unicodeslot=0x130F4, }, - [0x1304D]={ + [0x130F5]={ category="lo", - description="EGYPTIAN HIEROGLYPH A068", + description="EGYPTIAN HIEROGLYPH E030", direction="l", linebreak="al", - unicodeslot=0x1304D, + unicodeslot=0x130F5, }, - [0x1304E]={ + [0x130F6]={ category="lo", - description="EGYPTIAN HIEROGLYPH A069", + description="EGYPTIAN HIEROGLYPH E031", direction="l", linebreak="al", - unicodeslot=0x1304E, + unicodeslot=0x130F6, }, - [0x1304F]={ + [0x130F7]={ category="lo", - description="EGYPTIAN HIEROGLYPH A070", + description="EGYPTIAN HIEROGLYPH E032", direction="l", linebreak="al", - unicodeslot=0x1304F, + unicodeslot=0x130F7, }, - [0x13050]={ + [0x130F8]={ category="lo", - description="EGYPTIAN HIEROGLYPH B001", + description="EGYPTIAN HIEROGLYPH E033", direction="l", linebreak="al", - unicodeslot=0x13050, + unicodeslot=0x130F8, }, - [0x13051]={ + [0x130F9]={ category="lo", - description="EGYPTIAN HIEROGLYPH B002", + description="EGYPTIAN HIEROGLYPH E034", direction="l", linebreak="al", - unicodeslot=0x13051, + unicodeslot=0x130F9, }, - [0x13052]={ + [0x130FA]={ category="lo", - description="EGYPTIAN HIEROGLYPH B003", + description="EGYPTIAN HIEROGLYPH E034A", direction="l", linebreak="al", - unicodeslot=0x13052, + unicodeslot=0x130FA, }, - [0x13053]={ + [0x130FB]={ category="lo", - description="EGYPTIAN HIEROGLYPH B004", + description="EGYPTIAN HIEROGLYPH E036", direction="l", linebreak="al", - unicodeslot=0x13053, + unicodeslot=0x130FB, }, - [0x13054]={ + [0x130FC]={ category="lo", - description="EGYPTIAN HIEROGLYPH B005", + description="EGYPTIAN HIEROGLYPH E037", direction="l", linebreak="al", - unicodeslot=0x13054, + unicodeslot=0x130FC, }, - [0x13055]={ + [0x130FD]={ category="lo", - description="EGYPTIAN HIEROGLYPH B005A", + description="EGYPTIAN HIEROGLYPH E038", direction="l", linebreak="al", - unicodeslot=0x13055, + unicodeslot=0x130FD, }, - [0x13056]={ + [0x130FE]={ category="lo", - description="EGYPTIAN HIEROGLYPH B006", + description="EGYPTIAN HIEROGLYPH F001", direction="l", linebreak="al", - unicodeslot=0x13056, + unicodeslot=0x130FE, }, - [0x13057]={ + [0x130FF]={ category="lo", - description="EGYPTIAN HIEROGLYPH B007", + description="EGYPTIAN HIEROGLYPH F001A", direction="l", linebreak="al", - unicodeslot=0x13057, + unicodeslot=0x130FF, }, - [0x13058]={ + [0x13100]={ category="lo", - description="EGYPTIAN HIEROGLYPH B008", + description="EGYPTIAN HIEROGLYPH F002", direction="l", linebreak="al", - unicodeslot=0x13058, + unicodeslot=0x13100, }, - [0x13059]={ + [0x13101]={ category="lo", - description="EGYPTIAN HIEROGLYPH B009", + description="EGYPTIAN HIEROGLYPH F003", direction="l", linebreak="al", - unicodeslot=0x13059, + unicodeslot=0x13101, }, - [0x1305A]={ + [0x13102]={ category="lo", - description="EGYPTIAN HIEROGLYPH C001", + description="EGYPTIAN HIEROGLYPH F004", direction="l", linebreak="al", - unicodeslot=0x1305A, + unicodeslot=0x13102, }, - [0x1305B]={ + [0x13103]={ category="lo", - description="EGYPTIAN HIEROGLYPH C002", + description="EGYPTIAN HIEROGLYPH F005", direction="l", linebreak="al", - unicodeslot=0x1305B, + unicodeslot=0x13103, }, - [0x1305C]={ + [0x13104]={ category="lo", - description="EGYPTIAN HIEROGLYPH C002A", + description="EGYPTIAN HIEROGLYPH F006", direction="l", linebreak="al", - unicodeslot=0x1305C, + unicodeslot=0x13104, }, - [0x1305D]={ + [0x13105]={ category="lo", - description="EGYPTIAN HIEROGLYPH C002B", + description="EGYPTIAN HIEROGLYPH F007", direction="l", linebreak="al", - unicodeslot=0x1305D, + unicodeslot=0x13105, }, - [0x1305E]={ + [0x13106]={ category="lo", - description="EGYPTIAN HIEROGLYPH C002C", + description="EGYPTIAN HIEROGLYPH F008", direction="l", linebreak="al", - unicodeslot=0x1305E, + unicodeslot=0x13106, }, - [0x1305F]={ + [0x13107]={ category="lo", - description="EGYPTIAN HIEROGLYPH C003", + description="EGYPTIAN HIEROGLYPH F009", direction="l", linebreak="al", - unicodeslot=0x1305F, + unicodeslot=0x13107, }, - [0x13060]={ + [0x13108]={ category="lo", - description="EGYPTIAN HIEROGLYPH C004", + description="EGYPTIAN HIEROGLYPH F010", direction="l", linebreak="al", - unicodeslot=0x13060, + unicodeslot=0x13108, }, - [0x13061]={ + [0x13109]={ category="lo", - description="EGYPTIAN HIEROGLYPH C005", + description="EGYPTIAN HIEROGLYPH F011", direction="l", linebreak="al", - unicodeslot=0x13061, + unicodeslot=0x13109, }, - [0x13062]={ + [0x1310A]={ category="lo", - description="EGYPTIAN HIEROGLYPH C006", + description="EGYPTIAN HIEROGLYPH F012", direction="l", linebreak="al", - unicodeslot=0x13062, + unicodeslot=0x1310A, }, - [0x13063]={ + [0x1310B]={ category="lo", - description="EGYPTIAN HIEROGLYPH C007", + description="EGYPTIAN HIEROGLYPH F013", direction="l", linebreak="al", - unicodeslot=0x13063, + unicodeslot=0x1310B, }, - [0x13064]={ + [0x1310C]={ category="lo", - description="EGYPTIAN HIEROGLYPH C008", + description="EGYPTIAN HIEROGLYPH F013A", direction="l", linebreak="al", - unicodeslot=0x13064, + unicodeslot=0x1310C, }, - [0x13065]={ + [0x1310D]={ category="lo", - description="EGYPTIAN HIEROGLYPH C009", + description="EGYPTIAN HIEROGLYPH F014", direction="l", linebreak="al", - unicodeslot=0x13065, + unicodeslot=0x1310D, }, - [0x13066]={ + [0x1310E]={ category="lo", - description="EGYPTIAN HIEROGLYPH C010", + description="EGYPTIAN HIEROGLYPH F015", direction="l", linebreak="al", - unicodeslot=0x13066, + unicodeslot=0x1310E, }, - [0x13067]={ + [0x1310F]={ category="lo", - description="EGYPTIAN HIEROGLYPH C010A", + description="EGYPTIAN HIEROGLYPH F016", direction="l", linebreak="al", - unicodeslot=0x13067, + unicodeslot=0x1310F, }, - [0x13068]={ + [0x13110]={ category="lo", - description="EGYPTIAN HIEROGLYPH C011", + description="EGYPTIAN HIEROGLYPH F017", direction="l", linebreak="al", - unicodeslot=0x13068, + unicodeslot=0x13110, }, - [0x13069]={ + [0x13111]={ category="lo", - description="EGYPTIAN HIEROGLYPH C012", + description="EGYPTIAN HIEROGLYPH F018", direction="l", linebreak="al", - unicodeslot=0x13069, + unicodeslot=0x13111, }, - [0x1306A]={ + [0x13112]={ category="lo", - description="EGYPTIAN HIEROGLYPH C013", + description="EGYPTIAN HIEROGLYPH F019", direction="l", linebreak="al", - unicodeslot=0x1306A, + unicodeslot=0x13112, }, - [0x1306B]={ + [0x13113]={ category="lo", - description="EGYPTIAN HIEROGLYPH C014", + description="EGYPTIAN HIEROGLYPH F020", direction="l", linebreak="al", - unicodeslot=0x1306B, + unicodeslot=0x13113, }, - [0x1306C]={ + [0x13114]={ category="lo", - description="EGYPTIAN HIEROGLYPH C015", + description="EGYPTIAN HIEROGLYPH F021", direction="l", linebreak="al", - unicodeslot=0x1306C, + unicodeslot=0x13114, }, - [0x1306D]={ + [0x13115]={ category="lo", - description="EGYPTIAN HIEROGLYPH C016", + description="EGYPTIAN HIEROGLYPH F021A", direction="l", linebreak="al", - unicodeslot=0x1306D, + unicodeslot=0x13115, }, - [0x1306E]={ + [0x13116]={ category="lo", - description="EGYPTIAN HIEROGLYPH C017", + description="EGYPTIAN HIEROGLYPH F022", direction="l", linebreak="al", - unicodeslot=0x1306E, + unicodeslot=0x13116, }, - [0x1306F]={ + [0x13117]={ category="lo", - description="EGYPTIAN HIEROGLYPH C018", + description="EGYPTIAN HIEROGLYPH F023", direction="l", linebreak="al", - unicodeslot=0x1306F, + unicodeslot=0x13117, }, - [0x13070]={ + [0x13118]={ category="lo", - description="EGYPTIAN HIEROGLYPH C019", + description="EGYPTIAN HIEROGLYPH F024", direction="l", linebreak="al", - unicodeslot=0x13070, + unicodeslot=0x13118, }, - [0x13071]={ + [0x13119]={ category="lo", - description="EGYPTIAN HIEROGLYPH C020", + description="EGYPTIAN HIEROGLYPH F025", direction="l", linebreak="al", - unicodeslot=0x13071, + unicodeslot=0x13119, }, - [0x13072]={ + [0x1311A]={ category="lo", - description="EGYPTIAN HIEROGLYPH C021", + description="EGYPTIAN HIEROGLYPH F026", direction="l", linebreak="al", - unicodeslot=0x13072, + unicodeslot=0x1311A, }, - [0x13073]={ + [0x1311B]={ category="lo", - description="EGYPTIAN HIEROGLYPH C022", + description="EGYPTIAN HIEROGLYPH F027", direction="l", linebreak="al", - unicodeslot=0x13073, + unicodeslot=0x1311B, }, - [0x13074]={ + [0x1311C]={ category="lo", - description="EGYPTIAN HIEROGLYPH C023", + description="EGYPTIAN HIEROGLYPH F028", direction="l", linebreak="al", - unicodeslot=0x13074, + unicodeslot=0x1311C, }, - [0x13075]={ + [0x1311D]={ category="lo", - description="EGYPTIAN HIEROGLYPH C024", + description="EGYPTIAN HIEROGLYPH F029", direction="l", linebreak="al", - unicodeslot=0x13075, + unicodeslot=0x1311D, }, - [0x13076]={ + [0x1311E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D001", + description="EGYPTIAN HIEROGLYPH F030", direction="l", linebreak="al", - unicodeslot=0x13076, + unicodeslot=0x1311E, }, - [0x13077]={ + [0x1311F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D002", + description="EGYPTIAN HIEROGLYPH F031", direction="l", linebreak="al", - unicodeslot=0x13077, + unicodeslot=0x1311F, }, - [0x13078]={ + [0x13120]={ category="lo", - description="EGYPTIAN HIEROGLYPH D003", + description="EGYPTIAN HIEROGLYPH F031A", direction="l", linebreak="al", - unicodeslot=0x13078, + unicodeslot=0x13120, }, - [0x13079]={ + [0x13121]={ category="lo", - description="EGYPTIAN HIEROGLYPH D004", + description="EGYPTIAN HIEROGLYPH F032", direction="l", linebreak="al", - unicodeslot=0x13079, + unicodeslot=0x13121, }, - [0x1307A]={ + [0x13122]={ category="lo", - description="EGYPTIAN HIEROGLYPH D005", + description="EGYPTIAN HIEROGLYPH F033", direction="l", linebreak="al", - unicodeslot=0x1307A, + unicodeslot=0x13122, }, - [0x1307B]={ + [0x13123]={ category="lo", - description="EGYPTIAN HIEROGLYPH D006", + description="EGYPTIAN HIEROGLYPH F034", direction="l", linebreak="al", - unicodeslot=0x1307B, + unicodeslot=0x13123, }, - [0x1307C]={ + [0x13124]={ category="lo", - description="EGYPTIAN HIEROGLYPH D007", + description="EGYPTIAN HIEROGLYPH F035", direction="l", linebreak="al", - unicodeslot=0x1307C, + unicodeslot=0x13124, }, - [0x1307D]={ + [0x13125]={ category="lo", - description="EGYPTIAN HIEROGLYPH D008", + description="EGYPTIAN HIEROGLYPH F036", direction="l", linebreak="al", - unicodeslot=0x1307D, + unicodeslot=0x13125, }, - [0x1307E]={ + [0x13126]={ category="lo", - description="EGYPTIAN HIEROGLYPH D008A", + description="EGYPTIAN HIEROGLYPH F037", direction="l", linebreak="al", - unicodeslot=0x1307E, + unicodeslot=0x13126, }, - [0x1307F]={ + [0x13127]={ category="lo", - description="EGYPTIAN HIEROGLYPH D009", + description="EGYPTIAN HIEROGLYPH F037A", direction="l", linebreak="al", - unicodeslot=0x1307F, + unicodeslot=0x13127, }, - [0x13080]={ + [0x13128]={ category="lo", - description="EGYPTIAN HIEROGLYPH D010", + description="EGYPTIAN HIEROGLYPH F038", direction="l", linebreak="al", - unicodeslot=0x13080, + unicodeslot=0x13128, }, - [0x13081]={ + [0x13129]={ category="lo", - description="EGYPTIAN HIEROGLYPH D011", + description="EGYPTIAN HIEROGLYPH F038A", direction="l", linebreak="al", - unicodeslot=0x13081, + unicodeslot=0x13129, }, - [0x13082]={ + [0x1312A]={ category="lo", - description="EGYPTIAN HIEROGLYPH D012", + description="EGYPTIAN HIEROGLYPH F039", direction="l", linebreak="al", - unicodeslot=0x13082, + unicodeslot=0x1312A, }, - [0x13083]={ + [0x1312B]={ category="lo", - description="EGYPTIAN HIEROGLYPH D013", + description="EGYPTIAN HIEROGLYPH F040", direction="l", linebreak="al", - unicodeslot=0x13083, + unicodeslot=0x1312B, }, - [0x13084]={ + [0x1312C]={ category="lo", - description="EGYPTIAN HIEROGLYPH D014", + description="EGYPTIAN HIEROGLYPH F041", direction="l", linebreak="al", - unicodeslot=0x13084, + unicodeslot=0x1312C, }, - [0x13085]={ + [0x1312D]={ category="lo", - description="EGYPTIAN HIEROGLYPH D015", + description="EGYPTIAN HIEROGLYPH F042", direction="l", linebreak="al", - unicodeslot=0x13085, + unicodeslot=0x1312D, }, - [0x13086]={ + [0x1312E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D016", + description="EGYPTIAN HIEROGLYPH F043", direction="l", linebreak="al", - unicodeslot=0x13086, + unicodeslot=0x1312E, }, - [0x13087]={ + [0x1312F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D017", + description="EGYPTIAN HIEROGLYPH F044", direction="l", linebreak="al", - unicodeslot=0x13087, + unicodeslot=0x1312F, }, - [0x13088]={ + [0x13130]={ category="lo", - description="EGYPTIAN HIEROGLYPH D018", + description="EGYPTIAN HIEROGLYPH F045", direction="l", linebreak="al", - unicodeslot=0x13088, + unicodeslot=0x13130, }, - [0x13089]={ + [0x13131]={ category="lo", - description="EGYPTIAN HIEROGLYPH D019", + description="EGYPTIAN HIEROGLYPH F045A", direction="l", linebreak="al", - unicodeslot=0x13089, + unicodeslot=0x13131, }, - [0x1308A]={ + [0x13132]={ category="lo", - description="EGYPTIAN HIEROGLYPH D020", + description="EGYPTIAN HIEROGLYPH F046", direction="l", linebreak="al", - unicodeslot=0x1308A, + unicodeslot=0x13132, }, - [0x1308B]={ + [0x13133]={ category="lo", - description="EGYPTIAN HIEROGLYPH D021", + description="EGYPTIAN HIEROGLYPH F046A", direction="l", linebreak="al", - unicodeslot=0x1308B, + unicodeslot=0x13133, }, - [0x1308C]={ + [0x13134]={ category="lo", - description="EGYPTIAN HIEROGLYPH D022", + description="EGYPTIAN HIEROGLYPH F047", direction="l", linebreak="al", - unicodeslot=0x1308C, + unicodeslot=0x13134, }, - [0x1308D]={ + [0x13135]={ category="lo", - description="EGYPTIAN HIEROGLYPH D023", + description="EGYPTIAN HIEROGLYPH F047A", direction="l", linebreak="al", - unicodeslot=0x1308D, + unicodeslot=0x13135, }, - [0x1308E]={ + [0x13136]={ category="lo", - description="EGYPTIAN HIEROGLYPH D024", + description="EGYPTIAN HIEROGLYPH F048", direction="l", linebreak="al", - unicodeslot=0x1308E, + unicodeslot=0x13136, }, - [0x1308F]={ + [0x13137]={ category="lo", - description="EGYPTIAN HIEROGLYPH D025", + description="EGYPTIAN HIEROGLYPH F049", direction="l", linebreak="al", - unicodeslot=0x1308F, + unicodeslot=0x13137, }, - [0x13090]={ + [0x13138]={ category="lo", - description="EGYPTIAN HIEROGLYPH D026", + description="EGYPTIAN HIEROGLYPH F050", direction="l", linebreak="al", - unicodeslot=0x13090, + unicodeslot=0x13138, }, - [0x13091]={ + [0x13139]={ category="lo", - description="EGYPTIAN HIEROGLYPH D027", + description="EGYPTIAN HIEROGLYPH F051", direction="l", linebreak="al", - unicodeslot=0x13091, + unicodeslot=0x13139, }, - [0x13092]={ + [0x1313A]={ category="lo", - description="EGYPTIAN HIEROGLYPH D027A", + description="EGYPTIAN HIEROGLYPH F051A", direction="l", linebreak="al", - unicodeslot=0x13092, + unicodeslot=0x1313A, }, - [0x13093]={ + [0x1313B]={ category="lo", - description="EGYPTIAN HIEROGLYPH D028", + description="EGYPTIAN HIEROGLYPH F051B", direction="l", linebreak="al", - unicodeslot=0x13093, + unicodeslot=0x1313B, }, - [0x13094]={ + [0x1313C]={ category="lo", - description="EGYPTIAN HIEROGLYPH D029", + description="EGYPTIAN HIEROGLYPH F051C", direction="l", linebreak="al", - unicodeslot=0x13094, + unicodeslot=0x1313C, }, - [0x13095]={ + [0x1313D]={ category="lo", - description="EGYPTIAN HIEROGLYPH D030", + description="EGYPTIAN HIEROGLYPH F052", direction="l", linebreak="al", - unicodeslot=0x13095, + unicodeslot=0x1313D, }, - [0x13096]={ + [0x1313E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D031", + description="EGYPTIAN HIEROGLYPH F053", direction="l", linebreak="al", - unicodeslot=0x13096, + unicodeslot=0x1313E, }, - [0x13097]={ + [0x1313F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D031A", + description="EGYPTIAN HIEROGLYPH G001", direction="l", linebreak="al", - unicodeslot=0x13097, + unicodeslot=0x1313F, }, - [0x13098]={ + [0x13140]={ category="lo", - description="EGYPTIAN HIEROGLYPH D032", + description="EGYPTIAN HIEROGLYPH G002", direction="l", linebreak="al", - unicodeslot=0x13098, + unicodeslot=0x13140, }, - [0x13099]={ + [0x13141]={ category="lo", - description="EGYPTIAN HIEROGLYPH D033", + description="EGYPTIAN HIEROGLYPH G003", direction="l", linebreak="al", - unicodeslot=0x13099, + unicodeslot=0x13141, }, - [0x1309A]={ + [0x13142]={ category="lo", - description="EGYPTIAN HIEROGLYPH D034", + description="EGYPTIAN HIEROGLYPH G004", direction="l", linebreak="al", - unicodeslot=0x1309A, + unicodeslot=0x13142, }, - [0x1309B]={ + [0x13143]={ category="lo", - description="EGYPTIAN HIEROGLYPH D034A", + description="EGYPTIAN HIEROGLYPH G005", direction="l", linebreak="al", - unicodeslot=0x1309B, + unicodeslot=0x13143, }, - [0x1309C]={ + [0x13144]={ category="lo", - description="EGYPTIAN HIEROGLYPH D035", + description="EGYPTIAN HIEROGLYPH G006", direction="l", linebreak="al", - unicodeslot=0x1309C, + unicodeslot=0x13144, }, - [0x1309D]={ + [0x13145]={ category="lo", - description="EGYPTIAN HIEROGLYPH D036", + description="EGYPTIAN HIEROGLYPH G006A", direction="l", linebreak="al", - unicodeslot=0x1309D, + unicodeslot=0x13145, }, - [0x1309E]={ + [0x13146]={ category="lo", - description="EGYPTIAN HIEROGLYPH D037", + description="EGYPTIAN HIEROGLYPH G007", direction="l", linebreak="al", - unicodeslot=0x1309E, + unicodeslot=0x13146, }, - [0x1309F]={ + [0x13147]={ category="lo", - description="EGYPTIAN HIEROGLYPH D038", + description="EGYPTIAN HIEROGLYPH G007A", direction="l", linebreak="al", - unicodeslot=0x1309F, + unicodeslot=0x13147, }, - [0x130A0]={ + [0x13148]={ category="lo", - description="EGYPTIAN HIEROGLYPH D039", + description="EGYPTIAN HIEROGLYPH G007B", direction="l", linebreak="al", - unicodeslot=0x130A0, + unicodeslot=0x13148, }, - [0x130A1]={ + [0x13149]={ category="lo", - description="EGYPTIAN HIEROGLYPH D040", + description="EGYPTIAN HIEROGLYPH G008", direction="l", linebreak="al", - unicodeslot=0x130A1, + unicodeslot=0x13149, }, - [0x130A2]={ + [0x1314A]={ category="lo", - description="EGYPTIAN HIEROGLYPH D041", + description="EGYPTIAN HIEROGLYPH G009", direction="l", linebreak="al", - unicodeslot=0x130A2, + unicodeslot=0x1314A, }, - [0x130A3]={ + [0x1314B]={ category="lo", - description="EGYPTIAN HIEROGLYPH D042", + description="EGYPTIAN HIEROGLYPH G010", direction="l", linebreak="al", - unicodeslot=0x130A3, + unicodeslot=0x1314B, }, - [0x130A4]={ + [0x1314C]={ category="lo", - description="EGYPTIAN HIEROGLYPH D043", + description="EGYPTIAN HIEROGLYPH G011", direction="l", linebreak="al", - unicodeslot=0x130A4, + unicodeslot=0x1314C, }, - [0x130A5]={ + [0x1314D]={ category="lo", - description="EGYPTIAN HIEROGLYPH D044", + description="EGYPTIAN HIEROGLYPH G011A", direction="l", linebreak="al", - unicodeslot=0x130A5, + unicodeslot=0x1314D, }, - [0x130A6]={ + [0x1314E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D045", + description="EGYPTIAN HIEROGLYPH G012", direction="l", linebreak="al", - unicodeslot=0x130A6, + unicodeslot=0x1314E, }, - [0x130A7]={ + [0x1314F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D046", + description="EGYPTIAN HIEROGLYPH G013", direction="l", linebreak="al", - unicodeslot=0x130A7, + unicodeslot=0x1314F, }, - [0x130A8]={ + [0x13150]={ category="lo", - description="EGYPTIAN HIEROGLYPH D046A", + description="EGYPTIAN HIEROGLYPH G014", direction="l", linebreak="al", - unicodeslot=0x130A8, + unicodeslot=0x13150, }, - [0x130A9]={ + [0x13151]={ category="lo", - description="EGYPTIAN HIEROGLYPH D047", + description="EGYPTIAN HIEROGLYPH G015", direction="l", linebreak="al", - unicodeslot=0x130A9, + unicodeslot=0x13151, }, - [0x130AA]={ + [0x13152]={ category="lo", - description="EGYPTIAN HIEROGLYPH D048", + description="EGYPTIAN HIEROGLYPH G016", direction="l", linebreak="al", - unicodeslot=0x130AA, + unicodeslot=0x13152, }, - [0x130AB]={ + [0x13153]={ category="lo", - description="EGYPTIAN HIEROGLYPH D048A", + description="EGYPTIAN HIEROGLYPH G017", direction="l", linebreak="al", - unicodeslot=0x130AB, + unicodeslot=0x13153, }, - [0x130AC]={ + [0x13154]={ category="lo", - description="EGYPTIAN HIEROGLYPH D049", + description="EGYPTIAN HIEROGLYPH G018", direction="l", linebreak="al", - unicodeslot=0x130AC, + unicodeslot=0x13154, }, - [0x130AD]={ + [0x13155]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050", + description="EGYPTIAN HIEROGLYPH G019", direction="l", linebreak="al", - unicodeslot=0x130AD, + unicodeslot=0x13155, }, - [0x130AE]={ + [0x13156]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050A", + description="EGYPTIAN HIEROGLYPH G020", direction="l", linebreak="al", - unicodeslot=0x130AE, + unicodeslot=0x13156, }, - [0x130AF]={ + [0x13157]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050B", + description="EGYPTIAN HIEROGLYPH G020A", direction="l", linebreak="al", - unicodeslot=0x130AF, + unicodeslot=0x13157, }, - [0x130B0]={ + [0x13158]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050C", + description="EGYPTIAN HIEROGLYPH G021", direction="l", linebreak="al", - unicodeslot=0x130B0, + unicodeslot=0x13158, }, - [0x130B1]={ + [0x13159]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050D", + description="EGYPTIAN HIEROGLYPH G022", direction="l", linebreak="al", - unicodeslot=0x130B1, + unicodeslot=0x13159, }, - [0x130B2]={ + [0x1315A]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050E", + description="EGYPTIAN HIEROGLYPH G023", direction="l", linebreak="al", - unicodeslot=0x130B2, + unicodeslot=0x1315A, }, - [0x130B3]={ + [0x1315B]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050F", + description="EGYPTIAN HIEROGLYPH G024", direction="l", linebreak="al", - unicodeslot=0x130B3, + unicodeslot=0x1315B, }, - [0x130B4]={ + [0x1315C]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050G", + description="EGYPTIAN HIEROGLYPH G025", direction="l", linebreak="al", - unicodeslot=0x130B4, + unicodeslot=0x1315C, }, - [0x130B5]={ + [0x1315D]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050H", + description="EGYPTIAN HIEROGLYPH G026", direction="l", linebreak="al", - unicodeslot=0x130B5, + unicodeslot=0x1315D, }, - [0x130B6]={ + [0x1315E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D050I", + description="EGYPTIAN HIEROGLYPH G026A", direction="l", linebreak="al", - unicodeslot=0x130B6, + unicodeslot=0x1315E, }, - [0x130B7]={ + [0x1315F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D051", + description="EGYPTIAN HIEROGLYPH G027", direction="l", linebreak="al", - unicodeslot=0x130B7, + unicodeslot=0x1315F, }, - [0x130B8]={ + [0x13160]={ category="lo", - description="EGYPTIAN HIEROGLYPH D052", + description="EGYPTIAN HIEROGLYPH G028", direction="l", linebreak="al", - unicodeslot=0x130B8, + unicodeslot=0x13160, }, - [0x130B9]={ + [0x13161]={ category="lo", - description="EGYPTIAN HIEROGLYPH D052A", + description="EGYPTIAN HIEROGLYPH G029", direction="l", linebreak="al", - unicodeslot=0x130B9, + unicodeslot=0x13161, }, - [0x130BA]={ + [0x13162]={ category="lo", - description="EGYPTIAN HIEROGLYPH D053", + description="EGYPTIAN HIEROGLYPH G030", direction="l", linebreak="al", - unicodeslot=0x130BA, + unicodeslot=0x13162, }, - [0x130BB]={ + [0x13163]={ category="lo", - description="EGYPTIAN HIEROGLYPH D054", + description="EGYPTIAN HIEROGLYPH G031", direction="l", linebreak="al", - unicodeslot=0x130BB, + unicodeslot=0x13163, }, - [0x130BC]={ + [0x13164]={ category="lo", - description="EGYPTIAN HIEROGLYPH D054A", + description="EGYPTIAN HIEROGLYPH G032", direction="l", linebreak="al", - unicodeslot=0x130BC, + unicodeslot=0x13164, }, - [0x130BD]={ + [0x13165]={ category="lo", - description="EGYPTIAN HIEROGLYPH D055", + description="EGYPTIAN HIEROGLYPH G033", direction="l", linebreak="al", - unicodeslot=0x130BD, + unicodeslot=0x13165, }, - [0x130BE]={ + [0x13166]={ category="lo", - description="EGYPTIAN HIEROGLYPH D056", + description="EGYPTIAN HIEROGLYPH G034", direction="l", linebreak="al", - unicodeslot=0x130BE, + unicodeslot=0x13166, }, - [0x130BF]={ + [0x13167]={ category="lo", - description="EGYPTIAN HIEROGLYPH D057", + description="EGYPTIAN HIEROGLYPH G035", direction="l", linebreak="al", - unicodeslot=0x130BF, + unicodeslot=0x13167, }, - [0x130C0]={ + [0x13168]={ category="lo", - description="EGYPTIAN HIEROGLYPH D058", + description="EGYPTIAN HIEROGLYPH G036", direction="l", linebreak="al", - unicodeslot=0x130C0, + unicodeslot=0x13168, }, - [0x130C1]={ + [0x13169]={ category="lo", - description="EGYPTIAN HIEROGLYPH D059", + description="EGYPTIAN HIEROGLYPH G036A", direction="l", linebreak="al", - unicodeslot=0x130C1, + unicodeslot=0x13169, }, - [0x130C2]={ + [0x1316A]={ category="lo", - description="EGYPTIAN HIEROGLYPH D060", + description="EGYPTIAN HIEROGLYPH G037", direction="l", linebreak="al", - unicodeslot=0x130C2, + unicodeslot=0x1316A, }, - [0x130C3]={ + [0x1316B]={ category="lo", - description="EGYPTIAN HIEROGLYPH D061", + description="EGYPTIAN HIEROGLYPH G037A", direction="l", linebreak="al", - unicodeslot=0x130C3, + unicodeslot=0x1316B, }, - [0x130C4]={ + [0x1316C]={ category="lo", - description="EGYPTIAN HIEROGLYPH D062", + description="EGYPTIAN HIEROGLYPH G038", direction="l", linebreak="al", - unicodeslot=0x130C4, + unicodeslot=0x1316C, }, - [0x130C5]={ + [0x1316D]={ category="lo", - description="EGYPTIAN HIEROGLYPH D063", + description="EGYPTIAN HIEROGLYPH G039", direction="l", linebreak="al", - unicodeslot=0x130C5, + unicodeslot=0x1316D, }, - [0x130C6]={ + [0x1316E]={ category="lo", - description="EGYPTIAN HIEROGLYPH D064", + description="EGYPTIAN HIEROGLYPH G040", direction="l", linebreak="al", - unicodeslot=0x130C6, + unicodeslot=0x1316E, }, - [0x130C7]={ + [0x1316F]={ category="lo", - description="EGYPTIAN HIEROGLYPH D065", + description="EGYPTIAN HIEROGLYPH G041", direction="l", linebreak="al", - unicodeslot=0x130C7, + unicodeslot=0x1316F, }, - [0x130C8]={ + [0x13170]={ category="lo", - description="EGYPTIAN HIEROGLYPH D066", + description="EGYPTIAN HIEROGLYPH G042", direction="l", linebreak="al", - unicodeslot=0x130C8, + unicodeslot=0x13170, }, - [0x130C9]={ + [0x13171]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067", + description="EGYPTIAN HIEROGLYPH G043", direction="l", linebreak="al", - unicodeslot=0x130C9, + unicodeslot=0x13171, }, - [0x130CA]={ + [0x13172]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067A", + description="EGYPTIAN HIEROGLYPH G043A", direction="l", linebreak="al", - unicodeslot=0x130CA, + unicodeslot=0x13172, }, - [0x130CB]={ + [0x13173]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067B", + description="EGYPTIAN HIEROGLYPH G044", direction="l", linebreak="al", - unicodeslot=0x130CB, + unicodeslot=0x13173, }, - [0x130CC]={ + [0x13174]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067C", + description="EGYPTIAN HIEROGLYPH G045", direction="l", linebreak="al", - unicodeslot=0x130CC, + unicodeslot=0x13174, }, - [0x130CD]={ + [0x13175]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067D", + description="EGYPTIAN HIEROGLYPH G045A", direction="l", linebreak="al", - unicodeslot=0x130CD, + unicodeslot=0x13175, }, - [0x130CE]={ + [0x13176]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067E", + description="EGYPTIAN HIEROGLYPH G046", direction="l", linebreak="al", - unicodeslot=0x130CE, + unicodeslot=0x13176, }, - [0x130CF]={ + [0x13177]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067F", + description="EGYPTIAN HIEROGLYPH G047", direction="l", linebreak="al", - unicodeslot=0x130CF, + unicodeslot=0x13177, }, - [0x130D0]={ + [0x13178]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067G", + description="EGYPTIAN HIEROGLYPH G048", direction="l", linebreak="al", - unicodeslot=0x130D0, + unicodeslot=0x13178, }, - [0x130D1]={ + [0x13179]={ category="lo", - description="EGYPTIAN HIEROGLYPH D067H", + description="EGYPTIAN HIEROGLYPH G049", direction="l", linebreak="al", - unicodeslot=0x130D1, + unicodeslot=0x13179, }, - [0x130D2]={ + [0x1317A]={ category="lo", - description="EGYPTIAN HIEROGLYPH E001", + description="EGYPTIAN HIEROGLYPH G050", direction="l", linebreak="al", - unicodeslot=0x130D2, + unicodeslot=0x1317A, }, - [0x130D3]={ + [0x1317B]={ category="lo", - description="EGYPTIAN HIEROGLYPH E002", + description="EGYPTIAN HIEROGLYPH G051", direction="l", linebreak="al", - unicodeslot=0x130D3, + unicodeslot=0x1317B, }, - [0x130D4]={ + [0x1317C]={ category="lo", - description="EGYPTIAN HIEROGLYPH E003", + description="EGYPTIAN HIEROGLYPH G052", direction="l", linebreak="al", - unicodeslot=0x130D4, + unicodeslot=0x1317C, }, - [0x130D5]={ + [0x1317D]={ category="lo", - description="EGYPTIAN HIEROGLYPH E004", + description="EGYPTIAN HIEROGLYPH G053", direction="l", linebreak="al", - unicodeslot=0x130D5, + unicodeslot=0x1317D, }, - [0x130D6]={ + [0x1317E]={ category="lo", - description="EGYPTIAN HIEROGLYPH E005", + description="EGYPTIAN HIEROGLYPH G054", direction="l", linebreak="al", - unicodeslot=0x130D6, + unicodeslot=0x1317E, }, - [0x130D7]={ + [0x1317F]={ category="lo", - description="EGYPTIAN HIEROGLYPH E006", + description="EGYPTIAN HIEROGLYPH H001", direction="l", linebreak="al", - unicodeslot=0x130D7, + unicodeslot=0x1317F, }, - [0x130D8]={ + [0x13180]={ category="lo", - description="EGYPTIAN HIEROGLYPH E007", + description="EGYPTIAN HIEROGLYPH H002", direction="l", linebreak="al", - unicodeslot=0x130D8, + unicodeslot=0x13180, }, - [0x130D9]={ + [0x13181]={ category="lo", - description="EGYPTIAN HIEROGLYPH E008", + description="EGYPTIAN HIEROGLYPH H003", direction="l", linebreak="al", - unicodeslot=0x130D9, + unicodeslot=0x13181, }, - [0x130DA]={ + [0x13182]={ category="lo", - description="EGYPTIAN HIEROGLYPH E008A", + description="EGYPTIAN HIEROGLYPH H004", direction="l", linebreak="al", - unicodeslot=0x130DA, + unicodeslot=0x13182, }, - [0x130DB]={ + [0x13183]={ category="lo", - description="EGYPTIAN HIEROGLYPH E009", + description="EGYPTIAN HIEROGLYPH H005", direction="l", linebreak="al", - unicodeslot=0x130DB, + unicodeslot=0x13183, }, - [0x130DC]={ + [0x13184]={ category="lo", - description="EGYPTIAN HIEROGLYPH E009A", + description="EGYPTIAN HIEROGLYPH H006", direction="l", linebreak="al", - unicodeslot=0x130DC, + unicodeslot=0x13184, }, - [0x130DD]={ + [0x13185]={ category="lo", - description="EGYPTIAN HIEROGLYPH E010", + description="EGYPTIAN HIEROGLYPH H006A", direction="l", linebreak="al", - unicodeslot=0x130DD, + unicodeslot=0x13185, }, - [0x130DE]={ + [0x13186]={ category="lo", - description="EGYPTIAN HIEROGLYPH E011", + description="EGYPTIAN HIEROGLYPH H007", direction="l", linebreak="al", - unicodeslot=0x130DE, + unicodeslot=0x13186, }, - [0x130DF]={ + [0x13187]={ category="lo", - description="EGYPTIAN HIEROGLYPH E012", + description="EGYPTIAN HIEROGLYPH H008", direction="l", linebreak="al", - unicodeslot=0x130DF, + unicodeslot=0x13187, }, - [0x130E0]={ + [0x13188]={ category="lo", - description="EGYPTIAN HIEROGLYPH E013", + description="EGYPTIAN HIEROGLYPH I001", direction="l", linebreak="al", - unicodeslot=0x130E0, + unicodeslot=0x13188, }, - [0x130E1]={ + [0x13189]={ category="lo", - description="EGYPTIAN HIEROGLYPH E014", + description="EGYPTIAN HIEROGLYPH I002", direction="l", linebreak="al", - unicodeslot=0x130E1, + unicodeslot=0x13189, }, - [0x130E2]={ + [0x1318A]={ category="lo", - description="EGYPTIAN HIEROGLYPH E015", + description="EGYPTIAN HIEROGLYPH I003", direction="l", linebreak="al", - unicodeslot=0x130E2, + unicodeslot=0x1318A, }, - [0x130E3]={ + [0x1318B]={ category="lo", - description="EGYPTIAN HIEROGLYPH E016", + description="EGYPTIAN HIEROGLYPH I004", direction="l", linebreak="al", - unicodeslot=0x130E3, + unicodeslot=0x1318B, }, - [0x130E4]={ + [0x1318C]={ category="lo", - description="EGYPTIAN HIEROGLYPH E016A", + description="EGYPTIAN HIEROGLYPH I005", direction="l", linebreak="al", - unicodeslot=0x130E4, + unicodeslot=0x1318C, }, - [0x130E5]={ + [0x1318D]={ category="lo", - description="EGYPTIAN HIEROGLYPH E017", + description="EGYPTIAN HIEROGLYPH I005A", direction="l", linebreak="al", - unicodeslot=0x130E5, + unicodeslot=0x1318D, }, - [0x130E6]={ + [0x1318E]={ category="lo", - description="EGYPTIAN HIEROGLYPH E017A", + description="EGYPTIAN HIEROGLYPH I006", direction="l", linebreak="al", - unicodeslot=0x130E6, + unicodeslot=0x1318E, }, - [0x130E7]={ + [0x1318F]={ category="lo", - description="EGYPTIAN HIEROGLYPH E018", + description="EGYPTIAN HIEROGLYPH I007", direction="l", linebreak="al", - unicodeslot=0x130E7, + unicodeslot=0x1318F, }, - [0x130E8]={ + [0x13190]={ category="lo", - description="EGYPTIAN HIEROGLYPH E019", + description="EGYPTIAN HIEROGLYPH I008", direction="l", linebreak="al", - unicodeslot=0x130E8, + unicodeslot=0x13190, }, - [0x130E9]={ + [0x13191]={ category="lo", - description="EGYPTIAN HIEROGLYPH E020", + description="EGYPTIAN HIEROGLYPH I009", direction="l", linebreak="al", - unicodeslot=0x130E9, + unicodeslot=0x13191, }, - [0x130EA]={ + [0x13192]={ category="lo", - description="EGYPTIAN HIEROGLYPH E020A", + description="EGYPTIAN HIEROGLYPH I009A", direction="l", linebreak="al", - unicodeslot=0x130EA, + unicodeslot=0x13192, }, - [0x130EB]={ + [0x13193]={ category="lo", - description="EGYPTIAN HIEROGLYPH E021", + description="EGYPTIAN HIEROGLYPH I010", direction="l", linebreak="al", - unicodeslot=0x130EB, + unicodeslot=0x13193, }, - [0x130EC]={ + [0x13194]={ category="lo", - description="EGYPTIAN HIEROGLYPH E022", + description="EGYPTIAN HIEROGLYPH I010A", direction="l", linebreak="al", - unicodeslot=0x130EC, + unicodeslot=0x13194, }, - [0x130ED]={ + [0x13195]={ category="lo", - description="EGYPTIAN HIEROGLYPH E023", + description="EGYPTIAN HIEROGLYPH I011", direction="l", linebreak="al", - unicodeslot=0x130ED, + unicodeslot=0x13195, }, - [0x130EE]={ + [0x13196]={ category="lo", - description="EGYPTIAN HIEROGLYPH E024", + description="EGYPTIAN HIEROGLYPH I011A", direction="l", linebreak="al", - unicodeslot=0x130EE, + unicodeslot=0x13196, }, - [0x130EF]={ + [0x13197]={ category="lo", - description="EGYPTIAN HIEROGLYPH E025", + description="EGYPTIAN HIEROGLYPH I012", direction="l", linebreak="al", - unicodeslot=0x130EF, + unicodeslot=0x13197, }, - [0x130F0]={ + [0x13198]={ category="lo", - description="EGYPTIAN HIEROGLYPH E026", + description="EGYPTIAN HIEROGLYPH I013", direction="l", linebreak="al", - unicodeslot=0x130F0, + unicodeslot=0x13198, }, - [0x130F1]={ + [0x13199]={ category="lo", - description="EGYPTIAN HIEROGLYPH E027", + description="EGYPTIAN HIEROGLYPH I014", direction="l", linebreak="al", - unicodeslot=0x130F1, + unicodeslot=0x13199, }, - [0x130F2]={ + [0x1319A]={ category="lo", - description="EGYPTIAN HIEROGLYPH E028", + description="EGYPTIAN HIEROGLYPH I015", direction="l", linebreak="al", - unicodeslot=0x130F2, + unicodeslot=0x1319A, }, - [0x130F3]={ + [0x1319B]={ category="lo", - description="EGYPTIAN HIEROGLYPH E028A", + description="EGYPTIAN HIEROGLYPH K001", direction="l", linebreak="al", - unicodeslot=0x130F3, + unicodeslot=0x1319B, }, - [0x130F4]={ + [0x1319C]={ category="lo", - description="EGYPTIAN HIEROGLYPH E029", + description="EGYPTIAN HIEROGLYPH K002", direction="l", linebreak="al", - unicodeslot=0x130F4, + unicodeslot=0x1319C, }, - [0x130F5]={ + [0x1319D]={ category="lo", - description="EGYPTIAN HIEROGLYPH E030", + description="EGYPTIAN HIEROGLYPH K003", direction="l", linebreak="al", - unicodeslot=0x130F5, + unicodeslot=0x1319D, }, - [0x130F6]={ + [0x1319E]={ category="lo", - description="EGYPTIAN HIEROGLYPH E031", + description="EGYPTIAN HIEROGLYPH K004", direction="l", linebreak="al", - unicodeslot=0x130F6, + unicodeslot=0x1319E, }, - [0x130F7]={ + [0x1319F]={ category="lo", - description="EGYPTIAN HIEROGLYPH E032", + description="EGYPTIAN HIEROGLYPH K005", direction="l", linebreak="al", - unicodeslot=0x130F7, + unicodeslot=0x1319F, }, - [0x130F8]={ + [0x131A0]={ category="lo", - description="EGYPTIAN HIEROGLYPH E033", + description="EGYPTIAN HIEROGLYPH K006", direction="l", linebreak="al", - unicodeslot=0x130F8, + unicodeslot=0x131A0, }, - [0x130F9]={ + [0x131A1]={ category="lo", - description="EGYPTIAN HIEROGLYPH E034", + description="EGYPTIAN HIEROGLYPH K007", direction="l", linebreak="al", - unicodeslot=0x130F9, + unicodeslot=0x131A1, }, - [0x130FA]={ + [0x131A2]={ category="lo", - description="EGYPTIAN HIEROGLYPH E034A", + description="EGYPTIAN HIEROGLYPH K008", direction="l", linebreak="al", - unicodeslot=0x130FA, + unicodeslot=0x131A2, }, - [0x130FB]={ + [0x131A3]={ category="lo", - description="EGYPTIAN HIEROGLYPH E036", + description="EGYPTIAN HIEROGLYPH L001", direction="l", linebreak="al", - unicodeslot=0x130FB, + unicodeslot=0x131A3, }, - [0x130FC]={ + [0x131A4]={ category="lo", - description="EGYPTIAN HIEROGLYPH E037", + description="EGYPTIAN HIEROGLYPH L002", direction="l", linebreak="al", - unicodeslot=0x130FC, + unicodeslot=0x131A4, }, - [0x130FD]={ + [0x131A5]={ category="lo", - description="EGYPTIAN HIEROGLYPH E038", + description="EGYPTIAN HIEROGLYPH L002A", direction="l", linebreak="al", - unicodeslot=0x130FD, + unicodeslot=0x131A5, }, - [0x130FE]={ + [0x131A6]={ category="lo", - description="EGYPTIAN HIEROGLYPH F001", + description="EGYPTIAN HIEROGLYPH L003", direction="l", linebreak="al", - unicodeslot=0x130FE, + unicodeslot=0x131A6, }, - [0x130FF]={ + [0x131A7]={ category="lo", - description="EGYPTIAN HIEROGLYPH F001A", + description="EGYPTIAN HIEROGLYPH L004", direction="l", linebreak="al", - unicodeslot=0x130FF, + unicodeslot=0x131A7, }, - [0x13100]={ + [0x131A8]={ category="lo", - description="EGYPTIAN HIEROGLYPH F002", + description="EGYPTIAN HIEROGLYPH L005", direction="l", linebreak="al", - unicodeslot=0x13100, + unicodeslot=0x131A8, }, - [0x13101]={ + [0x131A9]={ category="lo", - description="EGYPTIAN HIEROGLYPH F003", + description="EGYPTIAN HIEROGLYPH L006", direction="l", linebreak="al", - unicodeslot=0x13101, + unicodeslot=0x131A9, }, - [0x13102]={ + [0x131AA]={ category="lo", - description="EGYPTIAN HIEROGLYPH F004", + description="EGYPTIAN HIEROGLYPH L006A", direction="l", linebreak="al", - unicodeslot=0x13102, + unicodeslot=0x131AA, }, - [0x13103]={ + [0x131AB]={ category="lo", - description="EGYPTIAN HIEROGLYPH F005", + description="EGYPTIAN HIEROGLYPH L007", direction="l", linebreak="al", - unicodeslot=0x13103, + unicodeslot=0x131AB, }, - [0x13104]={ + [0x131AC]={ category="lo", - description="EGYPTIAN HIEROGLYPH F006", + description="EGYPTIAN HIEROGLYPH L008", direction="l", linebreak="al", - unicodeslot=0x13104, + unicodeslot=0x131AC, }, - [0x13105]={ + [0x131AD]={ category="lo", - description="EGYPTIAN HIEROGLYPH F007", + description="EGYPTIAN HIEROGLYPH M001", direction="l", linebreak="al", - unicodeslot=0x13105, + unicodeslot=0x131AD, }, - [0x13106]={ + [0x131AE]={ category="lo", - description="EGYPTIAN HIEROGLYPH F008", + description="EGYPTIAN HIEROGLYPH M001A", direction="l", linebreak="al", - unicodeslot=0x13106, + unicodeslot=0x131AE, }, - [0x13107]={ + [0x131AF]={ category="lo", - description="EGYPTIAN HIEROGLYPH F009", + description="EGYPTIAN HIEROGLYPH M001B", direction="l", linebreak="al", - unicodeslot=0x13107, + unicodeslot=0x131AF, }, - [0x13108]={ + [0x131B0]={ category="lo", - description="EGYPTIAN HIEROGLYPH F010", + description="EGYPTIAN HIEROGLYPH M002", direction="l", linebreak="al", - unicodeslot=0x13108, + unicodeslot=0x131B0, }, - [0x13109]={ + [0x131B1]={ category="lo", - description="EGYPTIAN HIEROGLYPH F011", + description="EGYPTIAN HIEROGLYPH M003", direction="l", linebreak="al", - unicodeslot=0x13109, + unicodeslot=0x131B1, }, - [0x1310A]={ + [0x131B2]={ category="lo", - description="EGYPTIAN HIEROGLYPH F012", + description="EGYPTIAN HIEROGLYPH M003A", direction="l", linebreak="al", - unicodeslot=0x1310A, + unicodeslot=0x131B2, }, - [0x1310B]={ + [0x131B3]={ category="lo", - description="EGYPTIAN HIEROGLYPH F013", + description="EGYPTIAN HIEROGLYPH M004", direction="l", linebreak="al", - unicodeslot=0x1310B, + unicodeslot=0x131B3, }, - [0x1310C]={ + [0x131B4]={ category="lo", - description="EGYPTIAN HIEROGLYPH F013A", + description="EGYPTIAN HIEROGLYPH M005", direction="l", linebreak="al", - unicodeslot=0x1310C, + unicodeslot=0x131B4, }, - [0x1310D]={ + [0x131B5]={ category="lo", - description="EGYPTIAN HIEROGLYPH F014", + description="EGYPTIAN HIEROGLYPH M006", direction="l", linebreak="al", - unicodeslot=0x1310D, + unicodeslot=0x131B5, }, - [0x1310E]={ + [0x131B6]={ category="lo", - description="EGYPTIAN HIEROGLYPH F015", + description="EGYPTIAN HIEROGLYPH M007", direction="l", linebreak="al", - unicodeslot=0x1310E, + unicodeslot=0x131B6, }, - [0x1310F]={ + [0x131B7]={ category="lo", - description="EGYPTIAN HIEROGLYPH F016", + description="EGYPTIAN HIEROGLYPH M008", direction="l", linebreak="al", - unicodeslot=0x1310F, + unicodeslot=0x131B7, }, - [0x13110]={ + [0x131B8]={ category="lo", - description="EGYPTIAN HIEROGLYPH F017", + description="EGYPTIAN HIEROGLYPH M009", direction="l", linebreak="al", - unicodeslot=0x13110, + unicodeslot=0x131B8, }, - [0x13111]={ + [0x131B9]={ category="lo", - description="EGYPTIAN HIEROGLYPH F018", + description="EGYPTIAN HIEROGLYPH M010", direction="l", linebreak="al", - unicodeslot=0x13111, + unicodeslot=0x131B9, }, - [0x13112]={ + [0x131BA]={ category="lo", - description="EGYPTIAN HIEROGLYPH F019", + description="EGYPTIAN HIEROGLYPH M010A", direction="l", linebreak="al", - unicodeslot=0x13112, + unicodeslot=0x131BA, }, - [0x13113]={ + [0x131BB]={ category="lo", - description="EGYPTIAN HIEROGLYPH F020", + description="EGYPTIAN HIEROGLYPH M011", direction="l", linebreak="al", - unicodeslot=0x13113, + unicodeslot=0x131BB, }, - [0x13114]={ + [0x131BC]={ category="lo", - description="EGYPTIAN HIEROGLYPH F021", + description="EGYPTIAN HIEROGLYPH M012", direction="l", linebreak="al", - unicodeslot=0x13114, + unicodeslot=0x131BC, }, - [0x13115]={ + [0x131BD]={ category="lo", - description="EGYPTIAN HIEROGLYPH F021A", + description="EGYPTIAN HIEROGLYPH M012A", direction="l", linebreak="al", - unicodeslot=0x13115, + unicodeslot=0x131BD, }, - [0x13116]={ + [0x131BE]={ category="lo", - description="EGYPTIAN HIEROGLYPH F022", + description="EGYPTIAN HIEROGLYPH M012B", direction="l", linebreak="al", - unicodeslot=0x13116, + unicodeslot=0x131BE, }, - [0x13117]={ + [0x131BF]={ category="lo", - description="EGYPTIAN HIEROGLYPH F023", + description="EGYPTIAN HIEROGLYPH M012C", direction="l", linebreak="al", - unicodeslot=0x13117, + unicodeslot=0x131BF, }, - [0x13118]={ + [0x131C0]={ category="lo", - description="EGYPTIAN HIEROGLYPH F024", + description="EGYPTIAN HIEROGLYPH M012D", direction="l", linebreak="al", - unicodeslot=0x13118, + unicodeslot=0x131C0, }, - [0x13119]={ + [0x131C1]={ category="lo", - description="EGYPTIAN HIEROGLYPH F025", + description="EGYPTIAN HIEROGLYPH M012E", direction="l", linebreak="al", - unicodeslot=0x13119, + unicodeslot=0x131C1, }, - [0x1311A]={ + [0x131C2]={ category="lo", - description="EGYPTIAN HIEROGLYPH F026", + description="EGYPTIAN HIEROGLYPH M012F", direction="l", linebreak="al", - unicodeslot=0x1311A, + unicodeslot=0x131C2, }, - [0x1311B]={ + [0x131C3]={ category="lo", - description="EGYPTIAN HIEROGLYPH F027", + description="EGYPTIAN HIEROGLYPH M012G", direction="l", linebreak="al", - unicodeslot=0x1311B, + unicodeslot=0x131C3, }, - [0x1311C]={ + [0x131C4]={ category="lo", - description="EGYPTIAN HIEROGLYPH F028", + description="EGYPTIAN HIEROGLYPH M012H", direction="l", linebreak="al", - unicodeslot=0x1311C, + unicodeslot=0x131C4, }, - [0x1311D]={ + [0x131C5]={ category="lo", - description="EGYPTIAN HIEROGLYPH F029", + description="EGYPTIAN HIEROGLYPH M013", direction="l", linebreak="al", - unicodeslot=0x1311D, + unicodeslot=0x131C5, }, - [0x1311E]={ + [0x131C6]={ category="lo", - description="EGYPTIAN HIEROGLYPH F030", + description="EGYPTIAN HIEROGLYPH M014", direction="l", linebreak="al", - unicodeslot=0x1311E, + unicodeslot=0x131C6, }, - [0x1311F]={ + [0x131C7]={ category="lo", - description="EGYPTIAN HIEROGLYPH F031", + description="EGYPTIAN HIEROGLYPH M015", direction="l", linebreak="al", - unicodeslot=0x1311F, + unicodeslot=0x131C7, }, - [0x13120]={ + [0x131C8]={ category="lo", - description="EGYPTIAN HIEROGLYPH F031A", + description="EGYPTIAN HIEROGLYPH M015A", direction="l", linebreak="al", - unicodeslot=0x13120, + unicodeslot=0x131C8, }, - [0x13121]={ + [0x131C9]={ category="lo", - description="EGYPTIAN HIEROGLYPH F032", + description="EGYPTIAN HIEROGLYPH M016", direction="l", linebreak="al", - unicodeslot=0x13121, + unicodeslot=0x131C9, }, - [0x13122]={ + [0x131CA]={ category="lo", - description="EGYPTIAN HIEROGLYPH F033", + description="EGYPTIAN HIEROGLYPH M016A", direction="l", linebreak="al", - unicodeslot=0x13122, + unicodeslot=0x131CA, }, - [0x13123]={ + [0x131CB]={ category="lo", - description="EGYPTIAN HIEROGLYPH F034", + description="EGYPTIAN HIEROGLYPH M017", direction="l", linebreak="al", - unicodeslot=0x13123, + unicodeslot=0x131CB, }, - [0x13124]={ + [0x131CC]={ category="lo", - description="EGYPTIAN HIEROGLYPH F035", + description="EGYPTIAN HIEROGLYPH M017A", direction="l", linebreak="al", - unicodeslot=0x13124, + unicodeslot=0x131CC, }, - [0x13125]={ + [0x131CD]={ category="lo", - description="EGYPTIAN HIEROGLYPH F036", + description="EGYPTIAN HIEROGLYPH M018", direction="l", linebreak="al", - unicodeslot=0x13125, + unicodeslot=0x131CD, }, - [0x13126]={ + [0x131CE]={ category="lo", - description="EGYPTIAN HIEROGLYPH F037", + description="EGYPTIAN HIEROGLYPH M019", direction="l", linebreak="al", - unicodeslot=0x13126, + unicodeslot=0x131CE, }, - [0x13127]={ + [0x131CF]={ category="lo", - description="EGYPTIAN HIEROGLYPH F037A", + description="EGYPTIAN HIEROGLYPH M020", direction="l", linebreak="al", - unicodeslot=0x13127, + unicodeslot=0x131CF, }, - [0x13128]={ + [0x131D0]={ category="lo", - description="EGYPTIAN HIEROGLYPH F038", + description="EGYPTIAN HIEROGLYPH M021", direction="l", linebreak="al", - unicodeslot=0x13128, + unicodeslot=0x131D0, }, - [0x13129]={ + [0x131D1]={ category="lo", - description="EGYPTIAN HIEROGLYPH F038A", + description="EGYPTIAN HIEROGLYPH M022", direction="l", linebreak="al", - unicodeslot=0x13129, + unicodeslot=0x131D1, }, - [0x1312A]={ + [0x131D2]={ category="lo", - description="EGYPTIAN HIEROGLYPH F039", + description="EGYPTIAN HIEROGLYPH M022A", direction="l", linebreak="al", - unicodeslot=0x1312A, + unicodeslot=0x131D2, }, - [0x1312B]={ + [0x131D3]={ category="lo", - description="EGYPTIAN HIEROGLYPH F040", + description="EGYPTIAN HIEROGLYPH M023", direction="l", linebreak="al", - unicodeslot=0x1312B, + unicodeslot=0x131D3, }, - [0x1312C]={ + [0x131D4]={ category="lo", - description="EGYPTIAN HIEROGLYPH F041", + description="EGYPTIAN HIEROGLYPH M024", direction="l", linebreak="al", - unicodeslot=0x1312C, + unicodeslot=0x131D4, }, - [0x1312D]={ + [0x131D5]={ category="lo", - description="EGYPTIAN HIEROGLYPH F042", + description="EGYPTIAN HIEROGLYPH M024A", direction="l", linebreak="al", - unicodeslot=0x1312D, + unicodeslot=0x131D5, }, - [0x1312E]={ + [0x131D6]={ category="lo", - description="EGYPTIAN HIEROGLYPH F043", + description="EGYPTIAN HIEROGLYPH M025", direction="l", linebreak="al", - unicodeslot=0x1312E, + unicodeslot=0x131D6, }, - [0x1312F]={ + [0x131D7]={ category="lo", - description="EGYPTIAN HIEROGLYPH F044", + description="EGYPTIAN HIEROGLYPH M026", direction="l", linebreak="al", - unicodeslot=0x1312F, + unicodeslot=0x131D7, }, - [0x13130]={ + [0x131D8]={ category="lo", - description="EGYPTIAN HIEROGLYPH F045", + description="EGYPTIAN HIEROGLYPH M027", direction="l", linebreak="al", - unicodeslot=0x13130, + unicodeslot=0x131D8, }, - [0x13131]={ + [0x131D9]={ category="lo", - description="EGYPTIAN HIEROGLYPH F045A", + description="EGYPTIAN HIEROGLYPH M028", direction="l", linebreak="al", - unicodeslot=0x13131, + unicodeslot=0x131D9, }, - [0x13132]={ + [0x131DA]={ category="lo", - description="EGYPTIAN HIEROGLYPH F046", + description="EGYPTIAN HIEROGLYPH M028A", direction="l", linebreak="al", - unicodeslot=0x13132, + unicodeslot=0x131DA, }, - [0x13133]={ + [0x131DB]={ category="lo", - description="EGYPTIAN HIEROGLYPH F046A", + description="EGYPTIAN HIEROGLYPH M029", direction="l", linebreak="al", - unicodeslot=0x13133, + unicodeslot=0x131DB, }, - [0x13134]={ + [0x131DC]={ category="lo", - description="EGYPTIAN HIEROGLYPH F047", + description="EGYPTIAN HIEROGLYPH M030", direction="l", linebreak="al", - unicodeslot=0x13134, + unicodeslot=0x131DC, }, - [0x13135]={ + [0x131DD]={ category="lo", - description="EGYPTIAN HIEROGLYPH F047A", + description="EGYPTIAN HIEROGLYPH M031", direction="l", linebreak="al", - unicodeslot=0x13135, + unicodeslot=0x131DD, }, - [0x13136]={ + [0x131DE]={ category="lo", - description="EGYPTIAN HIEROGLYPH F048", + description="EGYPTIAN HIEROGLYPH M031A", direction="l", linebreak="al", - unicodeslot=0x13136, + unicodeslot=0x131DE, }, - [0x13137]={ + [0x131DF]={ category="lo", - description="EGYPTIAN HIEROGLYPH F049", + description="EGYPTIAN HIEROGLYPH M032", direction="l", linebreak="al", - unicodeslot=0x13137, + unicodeslot=0x131DF, }, - [0x13138]={ + [0x131E0]={ category="lo", - description="EGYPTIAN HIEROGLYPH F050", + description="EGYPTIAN HIEROGLYPH M033", direction="l", linebreak="al", - unicodeslot=0x13138, + unicodeslot=0x131E0, }, - [0x13139]={ + [0x131E1]={ category="lo", - description="EGYPTIAN HIEROGLYPH F051", + description="EGYPTIAN HIEROGLYPH M033A", direction="l", linebreak="al", - unicodeslot=0x13139, + unicodeslot=0x131E1, }, - [0x1313A]={ + [0x131E2]={ category="lo", - description="EGYPTIAN HIEROGLYPH F051A", + description="EGYPTIAN HIEROGLYPH M033B", direction="l", linebreak="al", - unicodeslot=0x1313A, + unicodeslot=0x131E2, }, - [0x1313B]={ + [0x131E3]={ category="lo", - description="EGYPTIAN HIEROGLYPH F051B", + description="EGYPTIAN HIEROGLYPH M034", direction="l", linebreak="al", - unicodeslot=0x1313B, + unicodeslot=0x131E3, }, - [0x1313C]={ + [0x131E4]={ category="lo", - description="EGYPTIAN HIEROGLYPH F051C", + description="EGYPTIAN HIEROGLYPH M035", direction="l", linebreak="al", - unicodeslot=0x1313C, + unicodeslot=0x131E4, }, - [0x1313D]={ + [0x131E5]={ category="lo", - description="EGYPTIAN HIEROGLYPH F052", + description="EGYPTIAN HIEROGLYPH M036", direction="l", linebreak="al", - unicodeslot=0x1313D, + unicodeslot=0x131E5, }, - [0x1313E]={ + [0x131E6]={ category="lo", - description="EGYPTIAN HIEROGLYPH F053", + description="EGYPTIAN HIEROGLYPH M037", direction="l", linebreak="al", - unicodeslot=0x1313E, + unicodeslot=0x131E6, }, - [0x1313F]={ + [0x131E7]={ category="lo", - description="EGYPTIAN HIEROGLYPH G001", + description="EGYPTIAN HIEROGLYPH M038", direction="l", linebreak="al", - unicodeslot=0x1313F, + unicodeslot=0x131E7, }, - [0x13140]={ + [0x131E8]={ category="lo", - description="EGYPTIAN HIEROGLYPH G002", + description="EGYPTIAN HIEROGLYPH M039", direction="l", linebreak="al", - unicodeslot=0x13140, + unicodeslot=0x131E8, }, - [0x13141]={ + [0x131E9]={ category="lo", - description="EGYPTIAN HIEROGLYPH G003", + description="EGYPTIAN HIEROGLYPH M040", direction="l", linebreak="al", - unicodeslot=0x13141, + unicodeslot=0x131E9, }, - [0x13142]={ + [0x131EA]={ category="lo", - description="EGYPTIAN HIEROGLYPH G004", + description="EGYPTIAN HIEROGLYPH M040A", direction="l", linebreak="al", - unicodeslot=0x13142, + unicodeslot=0x131EA, }, - [0x13143]={ + [0x131EB]={ category="lo", - description="EGYPTIAN HIEROGLYPH G005", + description="EGYPTIAN HIEROGLYPH M041", direction="l", linebreak="al", - unicodeslot=0x13143, + unicodeslot=0x131EB, }, - [0x13144]={ + [0x131EC]={ category="lo", - description="EGYPTIAN HIEROGLYPH G006", + description="EGYPTIAN HIEROGLYPH M042", direction="l", linebreak="al", - unicodeslot=0x13144, + unicodeslot=0x131EC, }, - [0x13145]={ + [0x131ED]={ category="lo", - description="EGYPTIAN HIEROGLYPH G006A", + description="EGYPTIAN HIEROGLYPH M043", direction="l", linebreak="al", - unicodeslot=0x13145, + unicodeslot=0x131ED, }, - [0x13146]={ + [0x131EE]={ category="lo", - description="EGYPTIAN HIEROGLYPH G007", + description="EGYPTIAN HIEROGLYPH M044", direction="l", linebreak="al", - unicodeslot=0x13146, + unicodeslot=0x131EE, }, - [0x13147]={ + [0x131EF]={ category="lo", - description="EGYPTIAN HIEROGLYPH G007A", + description="EGYPTIAN HIEROGLYPH N001", direction="l", linebreak="al", - unicodeslot=0x13147, + unicodeslot=0x131EF, }, - [0x13148]={ + [0x131F0]={ category="lo", - description="EGYPTIAN HIEROGLYPH G007B", + description="EGYPTIAN HIEROGLYPH N002", direction="l", linebreak="al", - unicodeslot=0x13148, + unicodeslot=0x131F0, }, - [0x13149]={ + [0x131F1]={ category="lo", - description="EGYPTIAN HIEROGLYPH G008", + description="EGYPTIAN HIEROGLYPH N003", direction="l", linebreak="al", - unicodeslot=0x13149, + unicodeslot=0x131F1, }, - [0x1314A]={ + [0x131F2]={ category="lo", - description="EGYPTIAN HIEROGLYPH G009", + description="EGYPTIAN HIEROGLYPH N004", direction="l", linebreak="al", - unicodeslot=0x1314A, + unicodeslot=0x131F2, }, - [0x1314B]={ + [0x131F3]={ category="lo", - description="EGYPTIAN HIEROGLYPH G010", + description="EGYPTIAN HIEROGLYPH N005", direction="l", linebreak="al", - unicodeslot=0x1314B, + unicodeslot=0x131F3, }, - [0x1314C]={ + [0x131F4]={ category="lo", - description="EGYPTIAN HIEROGLYPH G011", + description="EGYPTIAN HIEROGLYPH N006", direction="l", linebreak="al", - unicodeslot=0x1314C, + unicodeslot=0x131F4, }, - [0x1314D]={ + [0x131F5]={ category="lo", - description="EGYPTIAN HIEROGLYPH G011A", + description="EGYPTIAN HIEROGLYPH N007", direction="l", linebreak="al", - unicodeslot=0x1314D, + unicodeslot=0x131F5, }, - [0x1314E]={ + [0x131F6]={ category="lo", - description="EGYPTIAN HIEROGLYPH G012", + description="EGYPTIAN HIEROGLYPH N008", direction="l", linebreak="al", - unicodeslot=0x1314E, + unicodeslot=0x131F6, }, - [0x1314F]={ + [0x131F7]={ category="lo", - description="EGYPTIAN HIEROGLYPH G013", + description="EGYPTIAN HIEROGLYPH N009", direction="l", linebreak="al", - unicodeslot=0x1314F, + unicodeslot=0x131F7, }, - [0x13150]={ + [0x131F8]={ category="lo", - description="EGYPTIAN HIEROGLYPH G014", + description="EGYPTIAN HIEROGLYPH N010", direction="l", linebreak="al", - unicodeslot=0x13150, + unicodeslot=0x131F8, }, - [0x13151]={ + [0x131F9]={ category="lo", - description="EGYPTIAN HIEROGLYPH G015", + description="EGYPTIAN HIEROGLYPH N011", direction="l", linebreak="al", - unicodeslot=0x13151, + unicodeslot=0x131F9, }, - [0x13152]={ + [0x131FA]={ category="lo", - description="EGYPTIAN HIEROGLYPH G016", + description="EGYPTIAN HIEROGLYPH N012", direction="l", linebreak="al", - unicodeslot=0x13152, + unicodeslot=0x131FA, }, - [0x13153]={ + [0x131FB]={ category="lo", - description="EGYPTIAN HIEROGLYPH G017", + description="EGYPTIAN HIEROGLYPH N013", direction="l", linebreak="al", - unicodeslot=0x13153, + unicodeslot=0x131FB, }, - [0x13154]={ + [0x131FC]={ category="lo", - description="EGYPTIAN HIEROGLYPH G018", + description="EGYPTIAN HIEROGLYPH N014", direction="l", linebreak="al", - unicodeslot=0x13154, + unicodeslot=0x131FC, }, - [0x13155]={ + [0x131FD]={ category="lo", - description="EGYPTIAN HIEROGLYPH G019", + description="EGYPTIAN HIEROGLYPH N015", direction="l", linebreak="al", - unicodeslot=0x13155, + unicodeslot=0x131FD, }, - [0x13156]={ + [0x131FE]={ category="lo", - description="EGYPTIAN HIEROGLYPH G020", + description="EGYPTIAN HIEROGLYPH N016", direction="l", linebreak="al", - unicodeslot=0x13156, + unicodeslot=0x131FE, }, - [0x13157]={ + [0x131FF]={ category="lo", - description="EGYPTIAN HIEROGLYPH G020A", + description="EGYPTIAN HIEROGLYPH N017", direction="l", linebreak="al", - unicodeslot=0x13157, + unicodeslot=0x131FF, }, - [0x13158]={ + [0x13200]={ category="lo", - description="EGYPTIAN HIEROGLYPH G021", + description="EGYPTIAN HIEROGLYPH N018", direction="l", linebreak="al", - unicodeslot=0x13158, + unicodeslot=0x13200, }, - [0x13159]={ + [0x13201]={ category="lo", - description="EGYPTIAN HIEROGLYPH G022", + description="EGYPTIAN HIEROGLYPH N018A", direction="l", linebreak="al", - unicodeslot=0x13159, + unicodeslot=0x13201, }, - [0x1315A]={ + [0x13202]={ category="lo", - description="EGYPTIAN HIEROGLYPH G023", + description="EGYPTIAN HIEROGLYPH N018B", direction="l", linebreak="al", - unicodeslot=0x1315A, + unicodeslot=0x13202, }, - [0x1315B]={ + [0x13203]={ category="lo", - description="EGYPTIAN HIEROGLYPH G024", + description="EGYPTIAN HIEROGLYPH N019", direction="l", linebreak="al", - unicodeslot=0x1315B, + unicodeslot=0x13203, }, - [0x1315C]={ + [0x13204]={ category="lo", - description="EGYPTIAN HIEROGLYPH G025", + description="EGYPTIAN HIEROGLYPH N020", direction="l", linebreak="al", - unicodeslot=0x1315C, + unicodeslot=0x13204, }, - [0x1315D]={ + [0x13205]={ category="lo", - description="EGYPTIAN HIEROGLYPH G026", + description="EGYPTIAN HIEROGLYPH N021", direction="l", linebreak="al", - unicodeslot=0x1315D, + unicodeslot=0x13205, }, - [0x1315E]={ + [0x13206]={ category="lo", - description="EGYPTIAN HIEROGLYPH G026A", + description="EGYPTIAN HIEROGLYPH N022", direction="l", linebreak="al", - unicodeslot=0x1315E, + unicodeslot=0x13206, }, - [0x1315F]={ + [0x13207]={ category="lo", - description="EGYPTIAN HIEROGLYPH G027", + description="EGYPTIAN HIEROGLYPH N023", direction="l", linebreak="al", - unicodeslot=0x1315F, + unicodeslot=0x13207, }, - [0x13160]={ + [0x13208]={ category="lo", - description="EGYPTIAN HIEROGLYPH G028", + description="EGYPTIAN HIEROGLYPH N024", direction="l", linebreak="al", - unicodeslot=0x13160, + unicodeslot=0x13208, }, - [0x13161]={ + [0x13209]={ category="lo", - description="EGYPTIAN HIEROGLYPH G029", + description="EGYPTIAN HIEROGLYPH N025", direction="l", linebreak="al", - unicodeslot=0x13161, + unicodeslot=0x13209, }, - [0x13162]={ + [0x1320A]={ category="lo", - description="EGYPTIAN HIEROGLYPH G030", + description="EGYPTIAN HIEROGLYPH N025A", direction="l", linebreak="al", - unicodeslot=0x13162, + unicodeslot=0x1320A, }, - [0x13163]={ + [0x1320B]={ category="lo", - description="EGYPTIAN HIEROGLYPH G031", + description="EGYPTIAN HIEROGLYPH N026", direction="l", linebreak="al", - unicodeslot=0x13163, + unicodeslot=0x1320B, }, - [0x13164]={ + [0x1320C]={ category="lo", - description="EGYPTIAN HIEROGLYPH G032", + description="EGYPTIAN HIEROGLYPH N027", direction="l", linebreak="al", - unicodeslot=0x13164, + unicodeslot=0x1320C, }, - [0x13165]={ + [0x1320D]={ category="lo", - description="EGYPTIAN HIEROGLYPH G033", + description="EGYPTIAN HIEROGLYPH N028", direction="l", linebreak="al", - unicodeslot=0x13165, + unicodeslot=0x1320D, }, - [0x13166]={ + [0x1320E]={ category="lo", - description="EGYPTIAN HIEROGLYPH G034", + description="EGYPTIAN HIEROGLYPH N029", direction="l", linebreak="al", - unicodeslot=0x13166, + unicodeslot=0x1320E, }, - [0x13167]={ + [0x1320F]={ category="lo", - description="EGYPTIAN HIEROGLYPH G035", + description="EGYPTIAN HIEROGLYPH N030", direction="l", linebreak="al", - unicodeslot=0x13167, + unicodeslot=0x1320F, }, - [0x13168]={ + [0x13210]={ category="lo", - description="EGYPTIAN HIEROGLYPH G036", + description="EGYPTIAN HIEROGLYPH N031", direction="l", linebreak="al", - unicodeslot=0x13168, + unicodeslot=0x13210, }, - [0x13169]={ + [0x13211]={ category="lo", - description="EGYPTIAN HIEROGLYPH G036A", + description="EGYPTIAN HIEROGLYPH N032", direction="l", linebreak="al", - unicodeslot=0x13169, + unicodeslot=0x13211, }, - [0x1316A]={ + [0x13212]={ category="lo", - description="EGYPTIAN HIEROGLYPH G037", + description="EGYPTIAN HIEROGLYPH N033", direction="l", linebreak="al", - unicodeslot=0x1316A, + unicodeslot=0x13212, }, - [0x1316B]={ + [0x13213]={ category="lo", - description="EGYPTIAN HIEROGLYPH G037A", + description="EGYPTIAN HIEROGLYPH N033A", direction="l", linebreak="al", - unicodeslot=0x1316B, + unicodeslot=0x13213, }, - [0x1316C]={ + [0x13214]={ category="lo", - description="EGYPTIAN HIEROGLYPH G038", + description="EGYPTIAN HIEROGLYPH N034", direction="l", linebreak="al", - unicodeslot=0x1316C, + unicodeslot=0x13214, }, - [0x1316D]={ + [0x13215]={ category="lo", - description="EGYPTIAN HIEROGLYPH G039", + description="EGYPTIAN HIEROGLYPH N034A", direction="l", linebreak="al", - unicodeslot=0x1316D, + unicodeslot=0x13215, }, - [0x1316E]={ + [0x13216]={ category="lo", - description="EGYPTIAN HIEROGLYPH G040", + description="EGYPTIAN HIEROGLYPH N035", direction="l", linebreak="al", - unicodeslot=0x1316E, + unicodeslot=0x13216, }, - [0x1316F]={ + [0x13217]={ category="lo", - description="EGYPTIAN HIEROGLYPH G041", + description="EGYPTIAN HIEROGLYPH N035A", direction="l", linebreak="al", - unicodeslot=0x1316F, + unicodeslot=0x13217, }, - [0x13170]={ + [0x13218]={ category="lo", - description="EGYPTIAN HIEROGLYPH G042", + description="EGYPTIAN HIEROGLYPH N036", direction="l", linebreak="al", - unicodeslot=0x13170, + unicodeslot=0x13218, }, - [0x13171]={ + [0x13219]={ category="lo", - description="EGYPTIAN HIEROGLYPH G043", + description="EGYPTIAN HIEROGLYPH N037", direction="l", linebreak="al", - unicodeslot=0x13171, + unicodeslot=0x13219, }, - [0x13172]={ + [0x1321A]={ category="lo", - description="EGYPTIAN HIEROGLYPH G043A", + description="EGYPTIAN HIEROGLYPH N037A", direction="l", linebreak="al", - unicodeslot=0x13172, + unicodeslot=0x1321A, }, - [0x13173]={ + [0x1321B]={ category="lo", - description="EGYPTIAN HIEROGLYPH G044", + description="EGYPTIAN HIEROGLYPH N038", direction="l", linebreak="al", - unicodeslot=0x13173, + unicodeslot=0x1321B, }, - [0x13174]={ + [0x1321C]={ category="lo", - description="EGYPTIAN HIEROGLYPH G045", + description="EGYPTIAN HIEROGLYPH N039", direction="l", linebreak="al", - unicodeslot=0x13174, + unicodeslot=0x1321C, }, - [0x13175]={ + [0x1321D]={ category="lo", - description="EGYPTIAN HIEROGLYPH G045A", + description="EGYPTIAN HIEROGLYPH N040", direction="l", linebreak="al", - unicodeslot=0x13175, + unicodeslot=0x1321D, }, - [0x13176]={ + [0x1321E]={ category="lo", - description="EGYPTIAN HIEROGLYPH G046", + description="EGYPTIAN HIEROGLYPH N041", direction="l", linebreak="al", - unicodeslot=0x13176, + unicodeslot=0x1321E, }, - [0x13177]={ + [0x1321F]={ category="lo", - description="EGYPTIAN HIEROGLYPH G047", + description="EGYPTIAN HIEROGLYPH N042", direction="l", linebreak="al", - unicodeslot=0x13177, + unicodeslot=0x1321F, }, - [0x13178]={ + [0x13220]={ category="lo", - description="EGYPTIAN HIEROGLYPH G048", + description="EGYPTIAN HIEROGLYPH NL001", direction="l", linebreak="al", - unicodeslot=0x13178, + unicodeslot=0x13220, }, - [0x13179]={ + [0x13221]={ category="lo", - description="EGYPTIAN HIEROGLYPH G049", + description="EGYPTIAN HIEROGLYPH NL002", direction="l", linebreak="al", - unicodeslot=0x13179, + unicodeslot=0x13221, }, - [0x1317A]={ + [0x13222]={ category="lo", - description="EGYPTIAN HIEROGLYPH G050", + description="EGYPTIAN HIEROGLYPH NL003", direction="l", linebreak="al", - unicodeslot=0x1317A, + unicodeslot=0x13222, }, - [0x1317B]={ + [0x13223]={ category="lo", - description="EGYPTIAN HIEROGLYPH G051", + description="EGYPTIAN HIEROGLYPH NL004", direction="l", linebreak="al", - unicodeslot=0x1317B, + unicodeslot=0x13223, }, - [0x1317C]={ + [0x13224]={ category="lo", - description="EGYPTIAN HIEROGLYPH G052", + description="EGYPTIAN HIEROGLYPH NL005", direction="l", linebreak="al", - unicodeslot=0x1317C, + unicodeslot=0x13224, }, - [0x1317D]={ + [0x13225]={ category="lo", - description="EGYPTIAN HIEROGLYPH G053", + description="EGYPTIAN HIEROGLYPH NL005A", direction="l", linebreak="al", - unicodeslot=0x1317D, + unicodeslot=0x13225, }, - [0x1317E]={ + [0x13226]={ category="lo", - description="EGYPTIAN HIEROGLYPH G054", + description="EGYPTIAN HIEROGLYPH NL006", direction="l", linebreak="al", - unicodeslot=0x1317E, + unicodeslot=0x13226, }, - [0x1317F]={ + [0x13227]={ category="lo", - description="EGYPTIAN HIEROGLYPH H001", + description="EGYPTIAN HIEROGLYPH NL007", direction="l", linebreak="al", - unicodeslot=0x1317F, + unicodeslot=0x13227, }, - [0x13180]={ + [0x13228]={ category="lo", - description="EGYPTIAN HIEROGLYPH H002", + description="EGYPTIAN HIEROGLYPH NL008", direction="l", linebreak="al", - unicodeslot=0x13180, + unicodeslot=0x13228, }, - [0x13181]={ + [0x13229]={ category="lo", - description="EGYPTIAN HIEROGLYPH H003", + description="EGYPTIAN HIEROGLYPH NL009", direction="l", linebreak="al", - unicodeslot=0x13181, + unicodeslot=0x13229, }, - [0x13182]={ + [0x1322A]={ category="lo", - description="EGYPTIAN HIEROGLYPH H004", + description="EGYPTIAN HIEROGLYPH NL010", direction="l", linebreak="al", - unicodeslot=0x13182, + unicodeslot=0x1322A, }, - [0x13183]={ + [0x1322B]={ category="lo", - description="EGYPTIAN HIEROGLYPH H005", + description="EGYPTIAN HIEROGLYPH NL011", direction="l", linebreak="al", - unicodeslot=0x13183, + unicodeslot=0x1322B, }, - [0x13184]={ + [0x1322C]={ category="lo", - description="EGYPTIAN HIEROGLYPH H006", + description="EGYPTIAN HIEROGLYPH NL012", direction="l", linebreak="al", - unicodeslot=0x13184, + unicodeslot=0x1322C, }, - [0x13185]={ + [0x1322D]={ category="lo", - description="EGYPTIAN HIEROGLYPH H006A", + description="EGYPTIAN HIEROGLYPH NL013", direction="l", linebreak="al", - unicodeslot=0x13185, + unicodeslot=0x1322D, }, - [0x13186]={ + [0x1322E]={ category="lo", - description="EGYPTIAN HIEROGLYPH H007", + description="EGYPTIAN HIEROGLYPH NL014", direction="l", linebreak="al", - unicodeslot=0x13186, + unicodeslot=0x1322E, }, - [0x13187]={ + [0x1322F]={ category="lo", - description="EGYPTIAN HIEROGLYPH H008", + description="EGYPTIAN HIEROGLYPH NL015", direction="l", linebreak="al", - unicodeslot=0x13187, + unicodeslot=0x1322F, }, - [0x13188]={ + [0x13230]={ category="lo", - description="EGYPTIAN HIEROGLYPH I001", + description="EGYPTIAN HIEROGLYPH NL016", direction="l", linebreak="al", - unicodeslot=0x13188, + unicodeslot=0x13230, }, - [0x13189]={ + [0x13231]={ category="lo", - description="EGYPTIAN HIEROGLYPH I002", + description="EGYPTIAN HIEROGLYPH NL017", direction="l", linebreak="al", - unicodeslot=0x13189, + unicodeslot=0x13231, }, - [0x1318A]={ + [0x13232]={ category="lo", - description="EGYPTIAN HIEROGLYPH I003", + description="EGYPTIAN HIEROGLYPH NL017A", direction="l", linebreak="al", - unicodeslot=0x1318A, + unicodeslot=0x13232, }, - [0x1318B]={ + [0x13233]={ category="lo", - description="EGYPTIAN HIEROGLYPH I004", + description="EGYPTIAN HIEROGLYPH NL018", direction="l", linebreak="al", - unicodeslot=0x1318B, + unicodeslot=0x13233, }, - [0x1318C]={ + [0x13234]={ category="lo", - description="EGYPTIAN HIEROGLYPH I005", + description="EGYPTIAN HIEROGLYPH NL019", direction="l", linebreak="al", - unicodeslot=0x1318C, + unicodeslot=0x13234, }, - [0x1318D]={ + [0x13235]={ category="lo", - description="EGYPTIAN HIEROGLYPH I005A", + description="EGYPTIAN HIEROGLYPH NL020", direction="l", linebreak="al", - unicodeslot=0x1318D, + unicodeslot=0x13235, }, - [0x1318E]={ + [0x13236]={ category="lo", - description="EGYPTIAN HIEROGLYPH I006", + description="EGYPTIAN HIEROGLYPH NU001", direction="l", linebreak="al", - unicodeslot=0x1318E, + unicodeslot=0x13236, }, - [0x1318F]={ + [0x13237]={ category="lo", - description="EGYPTIAN HIEROGLYPH I007", + description="EGYPTIAN HIEROGLYPH NU002", direction="l", linebreak="al", - unicodeslot=0x1318F, + unicodeslot=0x13237, }, - [0x13190]={ + [0x13238]={ category="lo", - description="EGYPTIAN HIEROGLYPH I008", + description="EGYPTIAN HIEROGLYPH NU003", direction="l", linebreak="al", - unicodeslot=0x13190, + unicodeslot=0x13238, }, - [0x13191]={ + [0x13239]={ category="lo", - description="EGYPTIAN HIEROGLYPH I009", + description="EGYPTIAN HIEROGLYPH NU004", direction="l", linebreak="al", - unicodeslot=0x13191, + unicodeslot=0x13239, }, - [0x13192]={ + [0x1323A]={ category="lo", - description="EGYPTIAN HIEROGLYPH I009A", + description="EGYPTIAN HIEROGLYPH NU005", direction="l", linebreak="al", - unicodeslot=0x13192, + unicodeslot=0x1323A, }, - [0x13193]={ + [0x1323B]={ category="lo", - description="EGYPTIAN HIEROGLYPH I010", + description="EGYPTIAN HIEROGLYPH NU006", direction="l", linebreak="al", - unicodeslot=0x13193, + unicodeslot=0x1323B, }, - [0x13194]={ + [0x1323C]={ category="lo", - description="EGYPTIAN HIEROGLYPH I010A", + description="EGYPTIAN HIEROGLYPH NU007", direction="l", linebreak="al", - unicodeslot=0x13194, + unicodeslot=0x1323C, }, - [0x13195]={ + [0x1323D]={ category="lo", - description="EGYPTIAN HIEROGLYPH I011", + description="EGYPTIAN HIEROGLYPH NU008", direction="l", linebreak="al", - unicodeslot=0x13195, + unicodeslot=0x1323D, }, - [0x13196]={ + [0x1323E]={ category="lo", - description="EGYPTIAN HIEROGLYPH I011A", + description="EGYPTIAN HIEROGLYPH NU009", direction="l", linebreak="al", - unicodeslot=0x13196, + unicodeslot=0x1323E, }, - [0x13197]={ + [0x1323F]={ category="lo", - description="EGYPTIAN HIEROGLYPH I012", + description="EGYPTIAN HIEROGLYPH NU010", direction="l", linebreak="al", - unicodeslot=0x13197, + unicodeslot=0x1323F, }, - [0x13198]={ + [0x13240]={ category="lo", - description="EGYPTIAN HIEROGLYPH I013", + description="EGYPTIAN HIEROGLYPH NU010A", direction="l", linebreak="al", - unicodeslot=0x13198, + unicodeslot=0x13240, }, - [0x13199]={ + [0x13241]={ category="lo", - description="EGYPTIAN HIEROGLYPH I014", + description="EGYPTIAN HIEROGLYPH NU011", direction="l", linebreak="al", - unicodeslot=0x13199, + unicodeslot=0x13241, }, - [0x1319A]={ + [0x13242]={ category="lo", - description="EGYPTIAN HIEROGLYPH I015", + description="EGYPTIAN HIEROGLYPH NU011A", direction="l", linebreak="al", - unicodeslot=0x1319A, + unicodeslot=0x13242, }, - [0x1319B]={ + [0x13243]={ category="lo", - description="EGYPTIAN HIEROGLYPH K001", + description="EGYPTIAN HIEROGLYPH NU012", direction="l", linebreak="al", - unicodeslot=0x1319B, + unicodeslot=0x13243, }, - [0x1319C]={ + [0x13244]={ category="lo", - description="EGYPTIAN HIEROGLYPH K002", + description="EGYPTIAN HIEROGLYPH NU013", direction="l", linebreak="al", - unicodeslot=0x1319C, + unicodeslot=0x13244, }, - [0x1319D]={ + [0x13245]={ category="lo", - description="EGYPTIAN HIEROGLYPH K003", + description="EGYPTIAN HIEROGLYPH NU014", direction="l", linebreak="al", - unicodeslot=0x1319D, + unicodeslot=0x13245, }, - [0x1319E]={ + [0x13246]={ category="lo", - description="EGYPTIAN HIEROGLYPH K004", + description="EGYPTIAN HIEROGLYPH NU015", direction="l", linebreak="al", - unicodeslot=0x1319E, + unicodeslot=0x13246, }, - [0x1319F]={ + [0x13247]={ category="lo", - description="EGYPTIAN HIEROGLYPH K005", + description="EGYPTIAN HIEROGLYPH NU016", direction="l", linebreak="al", - unicodeslot=0x1319F, + unicodeslot=0x13247, }, - [0x131A0]={ + [0x13248]={ category="lo", - description="EGYPTIAN HIEROGLYPH K006", + description="EGYPTIAN HIEROGLYPH NU017", direction="l", linebreak="al", - unicodeslot=0x131A0, + unicodeslot=0x13248, }, - [0x131A1]={ + [0x13249]={ category="lo", - description="EGYPTIAN HIEROGLYPH K007", + description="EGYPTIAN HIEROGLYPH NU018", direction="l", linebreak="al", - unicodeslot=0x131A1, + unicodeslot=0x13249, }, - [0x131A2]={ + [0x1324A]={ category="lo", - description="EGYPTIAN HIEROGLYPH K008", + description="EGYPTIAN HIEROGLYPH NU018A", direction="l", linebreak="al", - unicodeslot=0x131A2, + unicodeslot=0x1324A, }, - [0x131A3]={ + [0x1324B]={ category="lo", - description="EGYPTIAN HIEROGLYPH L001", + description="EGYPTIAN HIEROGLYPH NU019", direction="l", linebreak="al", - unicodeslot=0x131A3, + unicodeslot=0x1324B, }, - [0x131A4]={ + [0x1324C]={ category="lo", - description="EGYPTIAN HIEROGLYPH L002", + description="EGYPTIAN HIEROGLYPH NU020", direction="l", linebreak="al", - unicodeslot=0x131A4, + unicodeslot=0x1324C, }, - [0x131A5]={ + [0x1324D]={ category="lo", - description="EGYPTIAN HIEROGLYPH L002A", + description="EGYPTIAN HIEROGLYPH NU021", direction="l", linebreak="al", - unicodeslot=0x131A5, + unicodeslot=0x1324D, }, - [0x131A6]={ + [0x1324E]={ category="lo", - description="EGYPTIAN HIEROGLYPH L003", + description="EGYPTIAN HIEROGLYPH NU022", direction="l", linebreak="al", - unicodeslot=0x131A6, + unicodeslot=0x1324E, }, - [0x131A7]={ + [0x1324F]={ category="lo", - description="EGYPTIAN HIEROGLYPH L004", + description="EGYPTIAN HIEROGLYPH NU022A", direction="l", linebreak="al", - unicodeslot=0x131A7, + unicodeslot=0x1324F, }, - [0x131A8]={ + [0x13250]={ category="lo", - description="EGYPTIAN HIEROGLYPH L005", + description="EGYPTIAN HIEROGLYPH O001", direction="l", linebreak="al", - unicodeslot=0x131A8, + unicodeslot=0x13250, }, - [0x131A9]={ + [0x13251]={ category="lo", - description="EGYPTIAN HIEROGLYPH L006", + description="EGYPTIAN HIEROGLYPH O001A", direction="l", linebreak="al", - unicodeslot=0x131A9, + unicodeslot=0x13251, }, - [0x131AA]={ + [0x13252]={ category="lo", - description="EGYPTIAN HIEROGLYPH L006A", + description="EGYPTIAN HIEROGLYPH O002", direction="l", linebreak="al", - unicodeslot=0x131AA, + unicodeslot=0x13252, }, - [0x131AB]={ + [0x13253]={ category="lo", - description="EGYPTIAN HIEROGLYPH L007", + description="EGYPTIAN HIEROGLYPH O003", direction="l", linebreak="al", - unicodeslot=0x131AB, + unicodeslot=0x13253, }, - [0x131AC]={ + [0x13254]={ category="lo", - description="EGYPTIAN HIEROGLYPH L008", + description="EGYPTIAN HIEROGLYPH O004", direction="l", linebreak="al", - unicodeslot=0x131AC, + unicodeslot=0x13254, }, - [0x131AD]={ + [0x13255]={ category="lo", - description="EGYPTIAN HIEROGLYPH M001", + description="EGYPTIAN HIEROGLYPH O005", direction="l", linebreak="al", - unicodeslot=0x131AD, + unicodeslot=0x13255, }, - [0x131AE]={ + [0x13256]={ category="lo", - description="EGYPTIAN HIEROGLYPH M001A", + description="EGYPTIAN HIEROGLYPH O005A", direction="l", linebreak="al", - unicodeslot=0x131AE, + unicodeslot=0x13256, }, - [0x131AF]={ + [0x13257]={ category="lo", - description="EGYPTIAN HIEROGLYPH M001B", + description="EGYPTIAN HIEROGLYPH O006", direction="l", linebreak="al", - unicodeslot=0x131AF, + unicodeslot=0x13257, }, - [0x131B0]={ + [0x13258]={ category="lo", - description="EGYPTIAN HIEROGLYPH M002", + description="EGYPTIAN HIEROGLYPH O006A", direction="l", - linebreak="al", - unicodeslot=0x131B0, + linebreak="op", + unicodeslot=0x13258, }, - [0x131B1]={ + [0x13259]={ category="lo", - description="EGYPTIAN HIEROGLYPH M003", + description="EGYPTIAN HIEROGLYPH O006B", direction="l", - linebreak="al", - unicodeslot=0x131B1, + linebreak="op", + unicodeslot=0x13259, }, - [0x131B2]={ + [0x1325A]={ category="lo", - description="EGYPTIAN HIEROGLYPH M003A", + description="EGYPTIAN HIEROGLYPH O006C", direction="l", - linebreak="al", - unicodeslot=0x131B2, + linebreak="op", + unicodeslot=0x1325A, }, - [0x131B3]={ + [0x1325B]={ category="lo", - description="EGYPTIAN HIEROGLYPH M004", + description="EGYPTIAN HIEROGLYPH O006D", direction="l", - linebreak="al", - unicodeslot=0x131B3, + linebreak="cl", + unicodeslot=0x1325B, }, - [0x131B4]={ + [0x1325C]={ category="lo", - description="EGYPTIAN HIEROGLYPH M005", + description="EGYPTIAN HIEROGLYPH O006E", direction="l", - linebreak="al", - unicodeslot=0x131B4, + linebreak="cl", + unicodeslot=0x1325C, }, - [0x131B5]={ + [0x1325D]={ category="lo", - description="EGYPTIAN HIEROGLYPH M006", + description="EGYPTIAN HIEROGLYPH O006F", direction="l", - linebreak="al", - unicodeslot=0x131B5, + linebreak="cl", + unicodeslot=0x1325D, }, - [0x131B6]={ + [0x1325E]={ category="lo", - description="EGYPTIAN HIEROGLYPH M007", + description="EGYPTIAN HIEROGLYPH O007", direction="l", linebreak="al", - unicodeslot=0x131B6, + unicodeslot=0x1325E, }, - [0x131B7]={ + [0x1325F]={ category="lo", - description="EGYPTIAN HIEROGLYPH M008", + description="EGYPTIAN HIEROGLYPH O008", direction="l", linebreak="al", - unicodeslot=0x131B7, + unicodeslot=0x1325F, }, - [0x131B8]={ + [0x13260]={ category="lo", - description="EGYPTIAN HIEROGLYPH M009", + description="EGYPTIAN HIEROGLYPH O009", direction="l", linebreak="al", - unicodeslot=0x131B8, + unicodeslot=0x13260, }, - [0x131B9]={ + [0x13261]={ category="lo", - description="EGYPTIAN HIEROGLYPH M010", + description="EGYPTIAN HIEROGLYPH O010", direction="l", linebreak="al", - unicodeslot=0x131B9, + unicodeslot=0x13261, }, - [0x131BA]={ + [0x13262]={ category="lo", - description="EGYPTIAN HIEROGLYPH M010A", + description="EGYPTIAN HIEROGLYPH O010A", direction="l", linebreak="al", - unicodeslot=0x131BA, + unicodeslot=0x13262, }, - [0x131BB]={ + [0x13263]={ category="lo", - description="EGYPTIAN HIEROGLYPH M011", + description="EGYPTIAN HIEROGLYPH O010B", direction="l", linebreak="al", - unicodeslot=0x131BB, + unicodeslot=0x13263, }, - [0x131BC]={ + [0x13264]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012", + description="EGYPTIAN HIEROGLYPH O010C", direction="l", linebreak="al", - unicodeslot=0x131BC, + unicodeslot=0x13264, }, - [0x131BD]={ + [0x13265]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012A", + description="EGYPTIAN HIEROGLYPH O011", direction="l", linebreak="al", - unicodeslot=0x131BD, + unicodeslot=0x13265, }, - [0x131BE]={ + [0x13266]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012B", + description="EGYPTIAN HIEROGLYPH O012", direction="l", linebreak="al", - unicodeslot=0x131BE, + unicodeslot=0x13266, }, - [0x131BF]={ + [0x13267]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012C", + description="EGYPTIAN HIEROGLYPH O013", direction="l", linebreak="al", - unicodeslot=0x131BF, + unicodeslot=0x13267, }, - [0x131C0]={ + [0x13268]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012D", + description="EGYPTIAN HIEROGLYPH O014", direction="l", linebreak="al", - unicodeslot=0x131C0, + unicodeslot=0x13268, }, - [0x131C1]={ + [0x13269]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012E", + description="EGYPTIAN HIEROGLYPH O015", direction="l", linebreak="al", - unicodeslot=0x131C1, + unicodeslot=0x13269, }, - [0x131C2]={ + [0x1326A]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012F", + description="EGYPTIAN HIEROGLYPH O016", direction="l", linebreak="al", - unicodeslot=0x131C2, + unicodeslot=0x1326A, }, - [0x131C3]={ + [0x1326B]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012G", + description="EGYPTIAN HIEROGLYPH O017", direction="l", linebreak="al", - unicodeslot=0x131C3, + unicodeslot=0x1326B, }, - [0x131C4]={ + [0x1326C]={ category="lo", - description="EGYPTIAN HIEROGLYPH M012H", + description="EGYPTIAN HIEROGLYPH O018", direction="l", linebreak="al", - unicodeslot=0x131C4, + unicodeslot=0x1326C, }, - [0x131C5]={ + [0x1326D]={ category="lo", - description="EGYPTIAN HIEROGLYPH M013", + description="EGYPTIAN HIEROGLYPH O019", direction="l", linebreak="al", - unicodeslot=0x131C5, + unicodeslot=0x1326D, }, - [0x131C6]={ + [0x1326E]={ category="lo", - description="EGYPTIAN HIEROGLYPH M014", + description="EGYPTIAN HIEROGLYPH O019A", direction="l", linebreak="al", - unicodeslot=0x131C6, + unicodeslot=0x1326E, }, - [0x131C7]={ + [0x1326F]={ category="lo", - description="EGYPTIAN HIEROGLYPH M015", + description="EGYPTIAN HIEROGLYPH O020", direction="l", linebreak="al", - unicodeslot=0x131C7, + unicodeslot=0x1326F, }, - [0x131C8]={ + [0x13270]={ category="lo", - description="EGYPTIAN HIEROGLYPH M015A", + description="EGYPTIAN HIEROGLYPH O020A", direction="l", linebreak="al", - unicodeslot=0x131C8, + unicodeslot=0x13270, }, - [0x131C9]={ + [0x13271]={ category="lo", - description="EGYPTIAN HIEROGLYPH M016", + description="EGYPTIAN HIEROGLYPH O021", direction="l", linebreak="al", - unicodeslot=0x131C9, + unicodeslot=0x13271, }, - [0x131CA]={ + [0x13272]={ category="lo", - description="EGYPTIAN HIEROGLYPH M016A", + description="EGYPTIAN HIEROGLYPH O022", direction="l", linebreak="al", - unicodeslot=0x131CA, + unicodeslot=0x13272, }, - [0x131CB]={ + [0x13273]={ category="lo", - description="EGYPTIAN HIEROGLYPH M017", + description="EGYPTIAN HIEROGLYPH O023", direction="l", linebreak="al", - unicodeslot=0x131CB, + unicodeslot=0x13273, }, - [0x131CC]={ + [0x13274]={ category="lo", - description="EGYPTIAN HIEROGLYPH M017A", + description="EGYPTIAN HIEROGLYPH O024", direction="l", linebreak="al", - unicodeslot=0x131CC, + unicodeslot=0x13274, }, - [0x131CD]={ + [0x13275]={ category="lo", - description="EGYPTIAN HIEROGLYPH M018", + description="EGYPTIAN HIEROGLYPH O024A", direction="l", linebreak="al", - unicodeslot=0x131CD, + unicodeslot=0x13275, }, - [0x131CE]={ + [0x13276]={ category="lo", - description="EGYPTIAN HIEROGLYPH M019", + description="EGYPTIAN HIEROGLYPH O025", direction="l", linebreak="al", - unicodeslot=0x131CE, + unicodeslot=0x13276, }, - [0x131CF]={ + [0x13277]={ category="lo", - description="EGYPTIAN HIEROGLYPH M020", + description="EGYPTIAN HIEROGLYPH O025A", direction="l", linebreak="al", - unicodeslot=0x131CF, + unicodeslot=0x13277, }, - [0x131D0]={ + [0x13278]={ category="lo", - description="EGYPTIAN HIEROGLYPH M021", + description="EGYPTIAN HIEROGLYPH O026", direction="l", linebreak="al", - unicodeslot=0x131D0, + unicodeslot=0x13278, }, - [0x131D1]={ + [0x13279]={ category="lo", - description="EGYPTIAN HIEROGLYPH M022", + description="EGYPTIAN HIEROGLYPH O027", direction="l", linebreak="al", - unicodeslot=0x131D1, + unicodeslot=0x13279, }, - [0x131D2]={ + [0x1327A]={ category="lo", - description="EGYPTIAN HIEROGLYPH M022A", + description="EGYPTIAN HIEROGLYPH O028", direction="l", linebreak="al", - unicodeslot=0x131D2, + unicodeslot=0x1327A, }, - [0x131D3]={ + [0x1327B]={ category="lo", - description="EGYPTIAN HIEROGLYPH M023", + description="EGYPTIAN HIEROGLYPH O029", direction="l", linebreak="al", - unicodeslot=0x131D3, + unicodeslot=0x1327B, }, - [0x131D4]={ + [0x1327C]={ category="lo", - description="EGYPTIAN HIEROGLYPH M024", + description="EGYPTIAN HIEROGLYPH O029A", direction="l", linebreak="al", - unicodeslot=0x131D4, + unicodeslot=0x1327C, }, - [0x131D5]={ + [0x1327D]={ category="lo", - description="EGYPTIAN HIEROGLYPH M024A", + description="EGYPTIAN HIEROGLYPH O030", direction="l", linebreak="al", - unicodeslot=0x131D5, + unicodeslot=0x1327D, }, - [0x131D6]={ + [0x1327E]={ category="lo", - description="EGYPTIAN HIEROGLYPH M025", + description="EGYPTIAN HIEROGLYPH O030A", direction="l", linebreak="al", - unicodeslot=0x131D6, + unicodeslot=0x1327E, }, - [0x131D7]={ + [0x1327F]={ category="lo", - description="EGYPTIAN HIEROGLYPH M026", + description="EGYPTIAN HIEROGLYPH O031", direction="l", linebreak="al", - unicodeslot=0x131D7, + unicodeslot=0x1327F, }, - [0x131D8]={ + [0x13280]={ category="lo", - description="EGYPTIAN HIEROGLYPH M027", + description="EGYPTIAN HIEROGLYPH O032", direction="l", linebreak="al", - unicodeslot=0x131D8, + unicodeslot=0x13280, }, - [0x131D9]={ + [0x13281]={ category="lo", - description="EGYPTIAN HIEROGLYPH M028", + description="EGYPTIAN HIEROGLYPH O033", direction="l", linebreak="al", - unicodeslot=0x131D9, + unicodeslot=0x13281, }, - [0x131DA]={ + [0x13282]={ category="lo", - description="EGYPTIAN HIEROGLYPH M028A", + description="EGYPTIAN HIEROGLYPH O033A", direction="l", - linebreak="al", - unicodeslot=0x131DA, + linebreak="cl", + unicodeslot=0x13282, }, - [0x131DB]={ + [0x13283]={ category="lo", - description="EGYPTIAN HIEROGLYPH M029", + description="EGYPTIAN HIEROGLYPH O034", direction="l", linebreak="al", - unicodeslot=0x131DB, + unicodeslot=0x13283, }, - [0x131DC]={ + [0x13284]={ category="lo", - description="EGYPTIAN HIEROGLYPH M030", + description="EGYPTIAN HIEROGLYPH O035", direction="l", linebreak="al", - unicodeslot=0x131DC, + unicodeslot=0x13284, }, - [0x131DD]={ + [0x13285]={ category="lo", - description="EGYPTIAN HIEROGLYPH M031", + description="EGYPTIAN HIEROGLYPH O036", direction="l", linebreak="al", - unicodeslot=0x131DD, + unicodeslot=0x13285, }, - [0x131DE]={ + [0x13286]={ category="lo", - description="EGYPTIAN HIEROGLYPH M031A", + description="EGYPTIAN HIEROGLYPH O036A", direction="l", - linebreak="al", - unicodeslot=0x131DE, + linebreak="op", + unicodeslot=0x13286, }, - [0x131DF]={ + [0x13287]={ category="lo", - description="EGYPTIAN HIEROGLYPH M032", + description="EGYPTIAN HIEROGLYPH O036B", direction="l", - linebreak="al", - unicodeslot=0x131DF, + linebreak="cl", + unicodeslot=0x13287, }, - [0x131E0]={ + [0x13288]={ category="lo", - description="EGYPTIAN HIEROGLYPH M033", + description="EGYPTIAN HIEROGLYPH O036C", direction="l", - linebreak="al", - unicodeslot=0x131E0, + linebreak="op", + unicodeslot=0x13288, }, - [0x131E1]={ + [0x13289]={ category="lo", - description="EGYPTIAN HIEROGLYPH M033A", + description="EGYPTIAN HIEROGLYPH O036D", direction="l", - linebreak="al", - unicodeslot=0x131E1, + linebreak="cl", + unicodeslot=0x13289, }, - [0x131E2]={ + [0x1328A]={ category="lo", - description="EGYPTIAN HIEROGLYPH M033B", + description="EGYPTIAN HIEROGLYPH O037", direction="l", linebreak="al", - unicodeslot=0x131E2, + unicodeslot=0x1328A, }, - [0x131E3]={ + [0x1328B]={ category="lo", - description="EGYPTIAN HIEROGLYPH M034", + description="EGYPTIAN HIEROGLYPH O038", direction="l", linebreak="al", - unicodeslot=0x131E3, + unicodeslot=0x1328B, }, - [0x131E4]={ + [0x1328C]={ category="lo", - description="EGYPTIAN HIEROGLYPH M035", + description="EGYPTIAN HIEROGLYPH O039", direction="l", linebreak="al", - unicodeslot=0x131E4, + unicodeslot=0x1328C, }, - [0x131E5]={ + [0x1328D]={ category="lo", - description="EGYPTIAN HIEROGLYPH M036", + description="EGYPTIAN HIEROGLYPH O040", direction="l", linebreak="al", - unicodeslot=0x131E5, + unicodeslot=0x1328D, }, - [0x131E6]={ + [0x1328E]={ category="lo", - description="EGYPTIAN HIEROGLYPH M037", + description="EGYPTIAN HIEROGLYPH O041", direction="l", linebreak="al", - unicodeslot=0x131E6, + unicodeslot=0x1328E, }, - [0x131E7]={ + [0x1328F]={ category="lo", - description="EGYPTIAN HIEROGLYPH M038", + description="EGYPTIAN HIEROGLYPH O042", direction="l", linebreak="al", - unicodeslot=0x131E7, + unicodeslot=0x1328F, }, - [0x131E8]={ + [0x13290]={ category="lo", - description="EGYPTIAN HIEROGLYPH M039", + description="EGYPTIAN HIEROGLYPH O043", direction="l", linebreak="al", - unicodeslot=0x131E8, + unicodeslot=0x13290, }, - [0x131E9]={ + [0x13291]={ category="lo", - description="EGYPTIAN HIEROGLYPH M040", + description="EGYPTIAN HIEROGLYPH O044", direction="l", linebreak="al", - unicodeslot=0x131E9, + unicodeslot=0x13291, }, - [0x131EA]={ + [0x13292]={ category="lo", - description="EGYPTIAN HIEROGLYPH M040A", + description="EGYPTIAN HIEROGLYPH O045", direction="l", linebreak="al", - unicodeslot=0x131EA, + unicodeslot=0x13292, }, - [0x131EB]={ + [0x13293]={ category="lo", - description="EGYPTIAN HIEROGLYPH M041", + description="EGYPTIAN HIEROGLYPH O046", direction="l", linebreak="al", - unicodeslot=0x131EB, + unicodeslot=0x13293, }, - [0x131EC]={ + [0x13294]={ category="lo", - description="EGYPTIAN HIEROGLYPH M042", + description="EGYPTIAN HIEROGLYPH O047", direction="l", linebreak="al", - unicodeslot=0x131EC, + unicodeslot=0x13294, }, - [0x131ED]={ + [0x13295]={ category="lo", - description="EGYPTIAN HIEROGLYPH M043", + description="EGYPTIAN HIEROGLYPH O048", direction="l", linebreak="al", - unicodeslot=0x131ED, + unicodeslot=0x13295, }, - [0x131EE]={ + [0x13296]={ category="lo", - description="EGYPTIAN HIEROGLYPH M044", + description="EGYPTIAN HIEROGLYPH O049", direction="l", linebreak="al", - unicodeslot=0x131EE, + unicodeslot=0x13296, }, - [0x131EF]={ + [0x13297]={ category="lo", - description="EGYPTIAN HIEROGLYPH N001", + description="EGYPTIAN HIEROGLYPH O050", direction="l", linebreak="al", - unicodeslot=0x131EF, + unicodeslot=0x13297, }, - [0x131F0]={ + [0x13298]={ category="lo", - description="EGYPTIAN HIEROGLYPH N002", + description="EGYPTIAN HIEROGLYPH O050A", direction="l", linebreak="al", - unicodeslot=0x131F0, + unicodeslot=0x13298, }, - [0x131F1]={ + [0x13299]={ category="lo", - description="EGYPTIAN HIEROGLYPH N003", + description="EGYPTIAN HIEROGLYPH O050B", direction="l", linebreak="al", - unicodeslot=0x131F1, + unicodeslot=0x13299, }, - [0x131F2]={ + [0x1329A]={ category="lo", - description="EGYPTIAN HIEROGLYPH N004", + description="EGYPTIAN HIEROGLYPH O051", direction="l", linebreak="al", - unicodeslot=0x131F2, + unicodeslot=0x1329A, }, - [0x131F3]={ + [0x1329B]={ category="lo", - description="EGYPTIAN HIEROGLYPH N005", + description="EGYPTIAN HIEROGLYPH P001", direction="l", linebreak="al", - unicodeslot=0x131F3, + unicodeslot=0x1329B, }, - [0x131F4]={ + [0x1329C]={ category="lo", - description="EGYPTIAN HIEROGLYPH N006", + description="EGYPTIAN HIEROGLYPH P001A", direction="l", linebreak="al", - unicodeslot=0x131F4, + unicodeslot=0x1329C, }, - [0x131F5]={ + [0x1329D]={ category="lo", - description="EGYPTIAN HIEROGLYPH N007", + description="EGYPTIAN HIEROGLYPH P002", direction="l", linebreak="al", - unicodeslot=0x131F5, + unicodeslot=0x1329D, }, - [0x131F6]={ + [0x1329E]={ category="lo", - description="EGYPTIAN HIEROGLYPH N008", + description="EGYPTIAN HIEROGLYPH P003", direction="l", linebreak="al", - unicodeslot=0x131F6, + unicodeslot=0x1329E, }, - [0x131F7]={ + [0x1329F]={ category="lo", - description="EGYPTIAN HIEROGLYPH N009", + description="EGYPTIAN HIEROGLYPH P003A", direction="l", linebreak="al", - unicodeslot=0x131F7, + unicodeslot=0x1329F, }, - [0x131F8]={ + [0x132A0]={ category="lo", - description="EGYPTIAN HIEROGLYPH N010", + description="EGYPTIAN HIEROGLYPH P004", direction="l", linebreak="al", - unicodeslot=0x131F8, + unicodeslot=0x132A0, }, - [0x131F9]={ + [0x132A1]={ category="lo", - description="EGYPTIAN HIEROGLYPH N011", + description="EGYPTIAN HIEROGLYPH P005", direction="l", linebreak="al", - unicodeslot=0x131F9, + unicodeslot=0x132A1, }, - [0x131FA]={ + [0x132A2]={ category="lo", - description="EGYPTIAN HIEROGLYPH N012", + description="EGYPTIAN HIEROGLYPH P006", direction="l", linebreak="al", - unicodeslot=0x131FA, + unicodeslot=0x132A2, }, - [0x131FB]={ + [0x132A3]={ category="lo", - description="EGYPTIAN HIEROGLYPH N013", + description="EGYPTIAN HIEROGLYPH P007", direction="l", linebreak="al", - unicodeslot=0x131FB, + unicodeslot=0x132A3, }, - [0x131FC]={ + [0x132A4]={ category="lo", - description="EGYPTIAN HIEROGLYPH N014", + description="EGYPTIAN HIEROGLYPH P008", direction="l", linebreak="al", - unicodeslot=0x131FC, + unicodeslot=0x132A4, }, - [0x131FD]={ + [0x132A5]={ category="lo", - description="EGYPTIAN HIEROGLYPH N015", + description="EGYPTIAN HIEROGLYPH P009", direction="l", linebreak="al", - unicodeslot=0x131FD, + unicodeslot=0x132A5, }, - [0x131FE]={ + [0x132A6]={ category="lo", - description="EGYPTIAN HIEROGLYPH N016", + description="EGYPTIAN HIEROGLYPH P010", direction="l", linebreak="al", - unicodeslot=0x131FE, + unicodeslot=0x132A6, }, - [0x131FF]={ + [0x132A7]={ category="lo", - description="EGYPTIAN HIEROGLYPH N017", + description="EGYPTIAN HIEROGLYPH P011", direction="l", linebreak="al", - unicodeslot=0x131FF, + unicodeslot=0x132A7, }, - [0x13200]={ + [0x132A8]={ category="lo", - description="EGYPTIAN HIEROGLYPH N018", + description="EGYPTIAN HIEROGLYPH Q001", direction="l", linebreak="al", - unicodeslot=0x13200, + unicodeslot=0x132A8, }, - [0x13201]={ + [0x132A9]={ category="lo", - description="EGYPTIAN HIEROGLYPH N018A", + description="EGYPTIAN HIEROGLYPH Q002", direction="l", linebreak="al", - unicodeslot=0x13201, + unicodeslot=0x132A9, }, - [0x13202]={ + [0x132AA]={ category="lo", - description="EGYPTIAN HIEROGLYPH N018B", + description="EGYPTIAN HIEROGLYPH Q003", direction="l", linebreak="al", - unicodeslot=0x13202, + unicodeslot=0x132AA, }, - [0x13203]={ + [0x132AB]={ category="lo", - description="EGYPTIAN HIEROGLYPH N019", + description="EGYPTIAN HIEROGLYPH Q004", direction="l", linebreak="al", - unicodeslot=0x13203, + unicodeslot=0x132AB, }, - [0x13204]={ + [0x132AC]={ category="lo", - description="EGYPTIAN HIEROGLYPH N020", + description="EGYPTIAN HIEROGLYPH Q005", direction="l", linebreak="al", - unicodeslot=0x13204, + unicodeslot=0x132AC, }, - [0x13205]={ + [0x132AD]={ category="lo", - description="EGYPTIAN HIEROGLYPH N021", + description="EGYPTIAN HIEROGLYPH Q006", direction="l", linebreak="al", - unicodeslot=0x13205, + unicodeslot=0x132AD, }, - [0x13206]={ + [0x132AE]={ category="lo", - description="EGYPTIAN HIEROGLYPH N022", + description="EGYPTIAN HIEROGLYPH Q007", direction="l", linebreak="al", - unicodeslot=0x13206, + unicodeslot=0x132AE, }, - [0x13207]={ + [0x132AF]={ category="lo", - description="EGYPTIAN HIEROGLYPH N023", + description="EGYPTIAN HIEROGLYPH R001", direction="l", linebreak="al", - unicodeslot=0x13207, + unicodeslot=0x132AF, }, - [0x13208]={ + [0x132B0]={ category="lo", - description="EGYPTIAN HIEROGLYPH N024", + description="EGYPTIAN HIEROGLYPH R002", direction="l", linebreak="al", - unicodeslot=0x13208, + unicodeslot=0x132B0, }, - [0x13209]={ + [0x132B1]={ category="lo", - description="EGYPTIAN HIEROGLYPH N025", + description="EGYPTIAN HIEROGLYPH R002A", direction="l", linebreak="al", - unicodeslot=0x13209, + unicodeslot=0x132B1, }, - [0x1320A]={ + [0x132B2]={ category="lo", - description="EGYPTIAN HIEROGLYPH N025A", + description="EGYPTIAN HIEROGLYPH R003", direction="l", linebreak="al", - unicodeslot=0x1320A, + unicodeslot=0x132B2, }, - [0x1320B]={ + [0x132B3]={ category="lo", - description="EGYPTIAN HIEROGLYPH N026", + description="EGYPTIAN HIEROGLYPH R003A", direction="l", linebreak="al", - unicodeslot=0x1320B, + unicodeslot=0x132B3, }, - [0x1320C]={ + [0x132B4]={ category="lo", - description="EGYPTIAN HIEROGLYPH N027", + description="EGYPTIAN HIEROGLYPH R003B", direction="l", linebreak="al", - unicodeslot=0x1320C, + unicodeslot=0x132B4, }, - [0x1320D]={ + [0x132B5]={ category="lo", - description="EGYPTIAN HIEROGLYPH N028", + description="EGYPTIAN HIEROGLYPH R004", direction="l", linebreak="al", - unicodeslot=0x1320D, + unicodeslot=0x132B5, }, - [0x1320E]={ + [0x132B6]={ category="lo", - description="EGYPTIAN HIEROGLYPH N029", + description="EGYPTIAN HIEROGLYPH R005", direction="l", linebreak="al", - unicodeslot=0x1320E, + unicodeslot=0x132B6, }, - [0x1320F]={ + [0x132B7]={ category="lo", - description="EGYPTIAN HIEROGLYPH N030", + description="EGYPTIAN HIEROGLYPH R006", direction="l", linebreak="al", - unicodeslot=0x1320F, + unicodeslot=0x132B7, }, - [0x13210]={ + [0x132B8]={ category="lo", - description="EGYPTIAN HIEROGLYPH N031", + description="EGYPTIAN HIEROGLYPH R007", direction="l", linebreak="al", - unicodeslot=0x13210, + unicodeslot=0x132B8, }, - [0x13211]={ + [0x132B9]={ category="lo", - description="EGYPTIAN HIEROGLYPH N032", + description="EGYPTIAN HIEROGLYPH R008", direction="l", linebreak="al", - unicodeslot=0x13211, + unicodeslot=0x132B9, }, - [0x13212]={ + [0x132BA]={ category="lo", - description="EGYPTIAN HIEROGLYPH N033", + description="EGYPTIAN HIEROGLYPH R009", direction="l", linebreak="al", - unicodeslot=0x13212, + unicodeslot=0x132BA, }, - [0x13213]={ + [0x132BB]={ category="lo", - description="EGYPTIAN HIEROGLYPH N033A", + description="EGYPTIAN HIEROGLYPH R010", direction="l", linebreak="al", - unicodeslot=0x13213, + unicodeslot=0x132BB, }, - [0x13214]={ + [0x132BC]={ category="lo", - description="EGYPTIAN HIEROGLYPH N034", + description="EGYPTIAN HIEROGLYPH R010A", direction="l", linebreak="al", - unicodeslot=0x13214, + unicodeslot=0x132BC, }, - [0x13215]={ + [0x132BD]={ category="lo", - description="EGYPTIAN HIEROGLYPH N034A", + description="EGYPTIAN HIEROGLYPH R011", direction="l", linebreak="al", - unicodeslot=0x13215, + unicodeslot=0x132BD, }, - [0x13216]={ + [0x132BE]={ category="lo", - description="EGYPTIAN HIEROGLYPH N035", + description="EGYPTIAN HIEROGLYPH R012", direction="l", linebreak="al", - unicodeslot=0x13216, + unicodeslot=0x132BE, }, - [0x13217]={ + [0x132BF]={ category="lo", - description="EGYPTIAN HIEROGLYPH N035A", + description="EGYPTIAN HIEROGLYPH R013", direction="l", linebreak="al", - unicodeslot=0x13217, + unicodeslot=0x132BF, }, - [0x13218]={ + [0x132C0]={ category="lo", - description="EGYPTIAN HIEROGLYPH N036", + description="EGYPTIAN HIEROGLYPH R014", direction="l", linebreak="al", - unicodeslot=0x13218, + unicodeslot=0x132C0, }, - [0x13219]={ + [0x132C1]={ category="lo", - description="EGYPTIAN HIEROGLYPH N037", + description="EGYPTIAN HIEROGLYPH R015", direction="l", linebreak="al", - unicodeslot=0x13219, + unicodeslot=0x132C1, }, - [0x1321A]={ + [0x132C2]={ category="lo", - description="EGYPTIAN HIEROGLYPH N037A", + description="EGYPTIAN HIEROGLYPH R016", direction="l", linebreak="al", - unicodeslot=0x1321A, + unicodeslot=0x132C2, }, - [0x1321B]={ + [0x132C3]={ category="lo", - description="EGYPTIAN HIEROGLYPH N038", + description="EGYPTIAN HIEROGLYPH R016A", direction="l", linebreak="al", - unicodeslot=0x1321B, + unicodeslot=0x132C3, }, - [0x1321C]={ + [0x132C4]={ category="lo", - description="EGYPTIAN HIEROGLYPH N039", + description="EGYPTIAN HIEROGLYPH R017", direction="l", linebreak="al", - unicodeslot=0x1321C, + unicodeslot=0x132C4, }, - [0x1321D]={ + [0x132C5]={ category="lo", - description="EGYPTIAN HIEROGLYPH N040", + description="EGYPTIAN HIEROGLYPH R018", direction="l", linebreak="al", - unicodeslot=0x1321D, + unicodeslot=0x132C5, }, - [0x1321E]={ + [0x132C6]={ category="lo", - description="EGYPTIAN HIEROGLYPH N041", + description="EGYPTIAN HIEROGLYPH R019", direction="l", linebreak="al", - unicodeslot=0x1321E, + unicodeslot=0x132C6, }, - [0x1321F]={ + [0x132C7]={ category="lo", - description="EGYPTIAN HIEROGLYPH N042", + description="EGYPTIAN HIEROGLYPH R020", direction="l", linebreak="al", - unicodeslot=0x1321F, + unicodeslot=0x132C7, }, - [0x13220]={ + [0x132C8]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL001", + description="EGYPTIAN HIEROGLYPH R021", direction="l", linebreak="al", - unicodeslot=0x13220, + unicodeslot=0x132C8, }, - [0x13221]={ + [0x132C9]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL002", + description="EGYPTIAN HIEROGLYPH R022", direction="l", linebreak="al", - unicodeslot=0x13221, + unicodeslot=0x132C9, }, - [0x13222]={ + [0x132CA]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL003", + description="EGYPTIAN HIEROGLYPH R023", direction="l", linebreak="al", - unicodeslot=0x13222, + unicodeslot=0x132CA, }, - [0x13223]={ + [0x132CB]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL004", + description="EGYPTIAN HIEROGLYPH R024", direction="l", linebreak="al", - unicodeslot=0x13223, + unicodeslot=0x132CB, }, - [0x13224]={ + [0x132CC]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL005", + description="EGYPTIAN HIEROGLYPH R025", direction="l", linebreak="al", - unicodeslot=0x13224, + unicodeslot=0x132CC, }, - [0x13225]={ + [0x132CD]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL005A", + description="EGYPTIAN HIEROGLYPH R026", direction="l", linebreak="al", - unicodeslot=0x13225, + unicodeslot=0x132CD, }, - [0x13226]={ + [0x132CE]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL006", + description="EGYPTIAN HIEROGLYPH R027", direction="l", linebreak="al", - unicodeslot=0x13226, + unicodeslot=0x132CE, }, - [0x13227]={ + [0x132CF]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL007", + description="EGYPTIAN HIEROGLYPH R028", direction="l", linebreak="al", - unicodeslot=0x13227, + unicodeslot=0x132CF, }, - [0x13228]={ + [0x132D0]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL008", + description="EGYPTIAN HIEROGLYPH R029", direction="l", linebreak="al", - unicodeslot=0x13228, + unicodeslot=0x132D0, }, - [0x13229]={ + [0x132D1]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL009", + description="EGYPTIAN HIEROGLYPH S001", direction="l", linebreak="al", - unicodeslot=0x13229, + unicodeslot=0x132D1, }, - [0x1322A]={ + [0x132D2]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL010", + description="EGYPTIAN HIEROGLYPH S002", direction="l", linebreak="al", - unicodeslot=0x1322A, + unicodeslot=0x132D2, }, - [0x1322B]={ + [0x132D3]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL011", + description="EGYPTIAN HIEROGLYPH S002A", direction="l", linebreak="al", - unicodeslot=0x1322B, + unicodeslot=0x132D3, }, - [0x1322C]={ + [0x132D4]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL012", + description="EGYPTIAN HIEROGLYPH S003", direction="l", linebreak="al", - unicodeslot=0x1322C, + unicodeslot=0x132D4, }, - [0x1322D]={ + [0x132D5]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL013", + description="EGYPTIAN HIEROGLYPH S004", direction="l", linebreak="al", - unicodeslot=0x1322D, + unicodeslot=0x132D5, }, - [0x1322E]={ + [0x132D6]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL014", + description="EGYPTIAN HIEROGLYPH S005", direction="l", linebreak="al", - unicodeslot=0x1322E, + unicodeslot=0x132D6, }, - [0x1322F]={ + [0x132D7]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL015", + description="EGYPTIAN HIEROGLYPH S006", direction="l", linebreak="al", - unicodeslot=0x1322F, + unicodeslot=0x132D7, }, - [0x13230]={ + [0x132D8]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL016", + description="EGYPTIAN HIEROGLYPH S006A", direction="l", linebreak="al", - unicodeslot=0x13230, + unicodeslot=0x132D8, }, - [0x13231]={ + [0x132D9]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL017", + description="EGYPTIAN HIEROGLYPH S007", direction="l", linebreak="al", - unicodeslot=0x13231, + unicodeslot=0x132D9, }, - [0x13232]={ + [0x132DA]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL017A", + description="EGYPTIAN HIEROGLYPH S008", direction="l", linebreak="al", - unicodeslot=0x13232, + unicodeslot=0x132DA, }, - [0x13233]={ + [0x132DB]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL018", + description="EGYPTIAN HIEROGLYPH S009", direction="l", linebreak="al", - unicodeslot=0x13233, + unicodeslot=0x132DB, }, - [0x13234]={ + [0x132DC]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL019", + description="EGYPTIAN HIEROGLYPH S010", direction="l", linebreak="al", - unicodeslot=0x13234, + unicodeslot=0x132DC, }, - [0x13235]={ + [0x132DD]={ category="lo", - description="EGYPTIAN HIEROGLYPH NL020", + description="EGYPTIAN HIEROGLYPH S011", direction="l", linebreak="al", - unicodeslot=0x13235, + unicodeslot=0x132DD, }, - [0x13236]={ + [0x132DE]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU001", + description="EGYPTIAN HIEROGLYPH S012", direction="l", linebreak="al", - unicodeslot=0x13236, + unicodeslot=0x132DE, }, - [0x13237]={ + [0x132DF]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU002", + description="EGYPTIAN HIEROGLYPH S013", direction="l", linebreak="al", - unicodeslot=0x13237, + unicodeslot=0x132DF, }, - [0x13238]={ + [0x132E0]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU003", + description="EGYPTIAN HIEROGLYPH S014", direction="l", linebreak="al", - unicodeslot=0x13238, + unicodeslot=0x132E0, }, - [0x13239]={ + [0x132E1]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU004", + description="EGYPTIAN HIEROGLYPH S014A", direction="l", linebreak="al", - unicodeslot=0x13239, + unicodeslot=0x132E1, }, - [0x1323A]={ + [0x132E2]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU005", + description="EGYPTIAN HIEROGLYPH S014B", direction="l", linebreak="al", - unicodeslot=0x1323A, + unicodeslot=0x132E2, }, - [0x1323B]={ + [0x132E3]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU006", + description="EGYPTIAN HIEROGLYPH S015", direction="l", linebreak="al", - unicodeslot=0x1323B, + unicodeslot=0x132E3, }, - [0x1323C]={ + [0x132E4]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU007", + description="EGYPTIAN HIEROGLYPH S016", direction="l", linebreak="al", - unicodeslot=0x1323C, + unicodeslot=0x132E4, }, - [0x1323D]={ + [0x132E5]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU008", + description="EGYPTIAN HIEROGLYPH S017", direction="l", linebreak="al", - unicodeslot=0x1323D, + unicodeslot=0x132E5, }, - [0x1323E]={ + [0x132E6]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU009", + description="EGYPTIAN HIEROGLYPH S017A", direction="l", linebreak="al", - unicodeslot=0x1323E, + unicodeslot=0x132E6, }, - [0x1323F]={ + [0x132E7]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU010", + description="EGYPTIAN HIEROGLYPH S018", direction="l", linebreak="al", - unicodeslot=0x1323F, + unicodeslot=0x132E7, }, - [0x13240]={ + [0x132E8]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU010A", + description="EGYPTIAN HIEROGLYPH S019", direction="l", linebreak="al", - unicodeslot=0x13240, + unicodeslot=0x132E8, }, - [0x13241]={ + [0x132E9]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU011", + description="EGYPTIAN HIEROGLYPH S020", direction="l", linebreak="al", - unicodeslot=0x13241, + unicodeslot=0x132E9, }, - [0x13242]={ + [0x132EA]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU011A", + description="EGYPTIAN HIEROGLYPH S021", direction="l", linebreak="al", - unicodeslot=0x13242, + unicodeslot=0x132EA, }, - [0x13243]={ + [0x132EB]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU012", + description="EGYPTIAN HIEROGLYPH S022", direction="l", linebreak="al", - unicodeslot=0x13243, + unicodeslot=0x132EB, }, - [0x13244]={ + [0x132EC]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU013", + description="EGYPTIAN HIEROGLYPH S023", direction="l", linebreak="al", - unicodeslot=0x13244, + unicodeslot=0x132EC, }, - [0x13245]={ + [0x132ED]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU014", + description="EGYPTIAN HIEROGLYPH S024", direction="l", linebreak="al", - unicodeslot=0x13245, + unicodeslot=0x132ED, }, - [0x13246]={ + [0x132EE]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU015", + description="EGYPTIAN HIEROGLYPH S025", direction="l", linebreak="al", - unicodeslot=0x13246, + unicodeslot=0x132EE, }, - [0x13247]={ + [0x132EF]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU016", + description="EGYPTIAN HIEROGLYPH S026", direction="l", linebreak="al", - unicodeslot=0x13247, + unicodeslot=0x132EF, }, - [0x13248]={ + [0x132F0]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU017", + description="EGYPTIAN HIEROGLYPH S026A", direction="l", linebreak="al", - unicodeslot=0x13248, + unicodeslot=0x132F0, }, - [0x13249]={ + [0x132F1]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU018", + description="EGYPTIAN HIEROGLYPH S026B", direction="l", linebreak="al", - unicodeslot=0x13249, + unicodeslot=0x132F1, }, - [0x1324A]={ + [0x132F2]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU018A", + description="EGYPTIAN HIEROGLYPH S027", direction="l", linebreak="al", - unicodeslot=0x1324A, + unicodeslot=0x132F2, }, - [0x1324B]={ + [0x132F3]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU019", + description="EGYPTIAN HIEROGLYPH S028", direction="l", linebreak="al", - unicodeslot=0x1324B, + unicodeslot=0x132F3, }, - [0x1324C]={ + [0x132F4]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU020", + description="EGYPTIAN HIEROGLYPH S029", direction="l", linebreak="al", - unicodeslot=0x1324C, + unicodeslot=0x132F4, }, - [0x1324D]={ + [0x132F5]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU021", + description="EGYPTIAN HIEROGLYPH S030", direction="l", linebreak="al", - unicodeslot=0x1324D, + unicodeslot=0x132F5, }, - [0x1324E]={ + [0x132F6]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU022", + description="EGYPTIAN HIEROGLYPH S031", direction="l", linebreak="al", - unicodeslot=0x1324E, + unicodeslot=0x132F6, }, - [0x1324F]={ + [0x132F7]={ category="lo", - description="EGYPTIAN HIEROGLYPH NU022A", + description="EGYPTIAN HIEROGLYPH S032", direction="l", linebreak="al", - unicodeslot=0x1324F, + unicodeslot=0x132F7, }, - [0x13250]={ + [0x132F8]={ category="lo", - description="EGYPTIAN HIEROGLYPH O001", + description="EGYPTIAN HIEROGLYPH S033", direction="l", linebreak="al", - unicodeslot=0x13250, + unicodeslot=0x132F8, }, - [0x13251]={ + [0x132F9]={ category="lo", - description="EGYPTIAN HIEROGLYPH O001A", + description="EGYPTIAN HIEROGLYPH S034", direction="l", linebreak="al", - unicodeslot=0x13251, + unicodeslot=0x132F9, }, - [0x13252]={ + [0x132FA]={ category="lo", - description="EGYPTIAN HIEROGLYPH O002", + description="EGYPTIAN HIEROGLYPH S035", direction="l", linebreak="al", - unicodeslot=0x13252, + unicodeslot=0x132FA, }, - [0x13253]={ + [0x132FB]={ category="lo", - description="EGYPTIAN HIEROGLYPH O003", + description="EGYPTIAN HIEROGLYPH S035A", direction="l", linebreak="al", - unicodeslot=0x13253, + unicodeslot=0x132FB, }, - [0x13254]={ + [0x132FC]={ category="lo", - description="EGYPTIAN HIEROGLYPH O004", + description="EGYPTIAN HIEROGLYPH S036", direction="l", linebreak="al", - unicodeslot=0x13254, + unicodeslot=0x132FC, }, - [0x13255]={ + [0x132FD]={ category="lo", - description="EGYPTIAN HIEROGLYPH O005", + description="EGYPTIAN HIEROGLYPH S037", direction="l", linebreak="al", - unicodeslot=0x13255, + unicodeslot=0x132FD, }, - [0x13256]={ + [0x132FE]={ category="lo", - description="EGYPTIAN HIEROGLYPH O005A", + description="EGYPTIAN HIEROGLYPH S038", direction="l", linebreak="al", - unicodeslot=0x13256, + unicodeslot=0x132FE, }, - [0x13257]={ + [0x132FF]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006", + description="EGYPTIAN HIEROGLYPH S039", direction="l", linebreak="al", - unicodeslot=0x13257, + unicodeslot=0x132FF, }, - [0x13258]={ + [0x13300]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006A", + description="EGYPTIAN HIEROGLYPH S040", direction="l", - linebreak="op", - unicodeslot=0x13258, + linebreak="al", + unicodeslot=0x13300, }, - [0x13259]={ + [0x13301]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006B", + description="EGYPTIAN HIEROGLYPH S041", direction="l", - linebreak="op", - unicodeslot=0x13259, + linebreak="al", + unicodeslot=0x13301, }, - [0x1325A]={ + [0x13302]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006C", + description="EGYPTIAN HIEROGLYPH S042", direction="l", - linebreak="op", - unicodeslot=0x1325A, + linebreak="al", + unicodeslot=0x13302, }, - [0x1325B]={ + [0x13303]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006D", + description="EGYPTIAN HIEROGLYPH S043", direction="l", - linebreak="cl", - unicodeslot=0x1325B, + linebreak="al", + unicodeslot=0x13303, }, - [0x1325C]={ + [0x13304]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006E", + description="EGYPTIAN HIEROGLYPH S044", direction="l", - linebreak="cl", - unicodeslot=0x1325C, + linebreak="al", + unicodeslot=0x13304, }, - [0x1325D]={ + [0x13305]={ category="lo", - description="EGYPTIAN HIEROGLYPH O006F", + description="EGYPTIAN HIEROGLYPH S045", direction="l", - linebreak="cl", - unicodeslot=0x1325D, + linebreak="al", + unicodeslot=0x13305, }, - [0x1325E]={ + [0x13306]={ category="lo", - description="EGYPTIAN HIEROGLYPH O007", + description="EGYPTIAN HIEROGLYPH S046", direction="l", linebreak="al", - unicodeslot=0x1325E, + unicodeslot=0x13306, }, - [0x1325F]={ + [0x13307]={ category="lo", - description="EGYPTIAN HIEROGLYPH O008", + description="EGYPTIAN HIEROGLYPH T001", direction="l", linebreak="al", - unicodeslot=0x1325F, + unicodeslot=0x13307, }, - [0x13260]={ + [0x13308]={ category="lo", - description="EGYPTIAN HIEROGLYPH O009", + description="EGYPTIAN HIEROGLYPH T002", direction="l", linebreak="al", - unicodeslot=0x13260, + unicodeslot=0x13308, }, - [0x13261]={ + [0x13309]={ category="lo", - description="EGYPTIAN HIEROGLYPH O010", + description="EGYPTIAN HIEROGLYPH T003", direction="l", linebreak="al", - unicodeslot=0x13261, + unicodeslot=0x13309, }, - [0x13262]={ + [0x1330A]={ category="lo", - description="EGYPTIAN HIEROGLYPH O010A", + description="EGYPTIAN HIEROGLYPH T003A", direction="l", linebreak="al", - unicodeslot=0x13262, + unicodeslot=0x1330A, }, - [0x13263]={ + [0x1330B]={ category="lo", - description="EGYPTIAN HIEROGLYPH O010B", + description="EGYPTIAN HIEROGLYPH T004", direction="l", linebreak="al", - unicodeslot=0x13263, + unicodeslot=0x1330B, }, - [0x13264]={ + [0x1330C]={ category="lo", - description="EGYPTIAN HIEROGLYPH O010C", + description="EGYPTIAN HIEROGLYPH T005", direction="l", linebreak="al", - unicodeslot=0x13264, + unicodeslot=0x1330C, }, - [0x13265]={ + [0x1330D]={ category="lo", - description="EGYPTIAN HIEROGLYPH O011", + description="EGYPTIAN HIEROGLYPH T006", direction="l", linebreak="al", - unicodeslot=0x13265, + unicodeslot=0x1330D, }, - [0x13266]={ + [0x1330E]={ category="lo", - description="EGYPTIAN HIEROGLYPH O012", + description="EGYPTIAN HIEROGLYPH T007", direction="l", linebreak="al", - unicodeslot=0x13266, + unicodeslot=0x1330E, }, - [0x13267]={ + [0x1330F]={ category="lo", - description="EGYPTIAN HIEROGLYPH O013", + description="EGYPTIAN HIEROGLYPH T007A", direction="l", linebreak="al", - unicodeslot=0x13267, + unicodeslot=0x1330F, }, - [0x13268]={ + [0x13310]={ category="lo", - description="EGYPTIAN HIEROGLYPH O014", + description="EGYPTIAN HIEROGLYPH T008", direction="l", linebreak="al", - unicodeslot=0x13268, + unicodeslot=0x13310, }, - [0x13269]={ + [0x13311]={ category="lo", - description="EGYPTIAN HIEROGLYPH O015", + description="EGYPTIAN HIEROGLYPH T008A", direction="l", linebreak="al", - unicodeslot=0x13269, + unicodeslot=0x13311, }, - [0x1326A]={ + [0x13312]={ category="lo", - description="EGYPTIAN HIEROGLYPH O016", + description="EGYPTIAN HIEROGLYPH T009", direction="l", linebreak="al", - unicodeslot=0x1326A, + unicodeslot=0x13312, }, - [0x1326B]={ + [0x13313]={ category="lo", - description="EGYPTIAN HIEROGLYPH O017", + description="EGYPTIAN HIEROGLYPH T009A", direction="l", linebreak="al", - unicodeslot=0x1326B, + unicodeslot=0x13313, }, - [0x1326C]={ + [0x13314]={ category="lo", - description="EGYPTIAN HIEROGLYPH O018", + description="EGYPTIAN HIEROGLYPH T010", direction="l", linebreak="al", - unicodeslot=0x1326C, + unicodeslot=0x13314, }, - [0x1326D]={ + [0x13315]={ category="lo", - description="EGYPTIAN HIEROGLYPH O019", + description="EGYPTIAN HIEROGLYPH T011", direction="l", linebreak="al", - unicodeslot=0x1326D, + unicodeslot=0x13315, }, - [0x1326E]={ + [0x13316]={ category="lo", - description="EGYPTIAN HIEROGLYPH O019A", + description="EGYPTIAN HIEROGLYPH T011A", direction="l", linebreak="al", - unicodeslot=0x1326E, + unicodeslot=0x13316, }, - [0x1326F]={ + [0x13317]={ category="lo", - description="EGYPTIAN HIEROGLYPH O020", + description="EGYPTIAN HIEROGLYPH T012", direction="l", linebreak="al", - unicodeslot=0x1326F, + unicodeslot=0x13317, }, - [0x13270]={ + [0x13318]={ category="lo", - description="EGYPTIAN HIEROGLYPH O020A", + description="EGYPTIAN HIEROGLYPH T013", direction="l", linebreak="al", - unicodeslot=0x13270, + unicodeslot=0x13318, }, - [0x13271]={ + [0x13319]={ category="lo", - description="EGYPTIAN HIEROGLYPH O021", + description="EGYPTIAN HIEROGLYPH T014", direction="l", linebreak="al", - unicodeslot=0x13271, + unicodeslot=0x13319, }, - [0x13272]={ + [0x1331A]={ category="lo", - description="EGYPTIAN HIEROGLYPH O022", + description="EGYPTIAN HIEROGLYPH T015", direction="l", linebreak="al", - unicodeslot=0x13272, + unicodeslot=0x1331A, }, - [0x13273]={ + [0x1331B]={ category="lo", - description="EGYPTIAN HIEROGLYPH O023", + description="EGYPTIAN HIEROGLYPH T016", direction="l", linebreak="al", - unicodeslot=0x13273, + unicodeslot=0x1331B, }, - [0x13274]={ + [0x1331C]={ category="lo", - description="EGYPTIAN HIEROGLYPH O024", + description="EGYPTIAN HIEROGLYPH T016A", direction="l", linebreak="al", - unicodeslot=0x13274, + unicodeslot=0x1331C, }, - [0x13275]={ + [0x1331D]={ category="lo", - description="EGYPTIAN HIEROGLYPH O024A", + description="EGYPTIAN HIEROGLYPH T017", direction="l", linebreak="al", - unicodeslot=0x13275, + unicodeslot=0x1331D, }, - [0x13276]={ + [0x1331E]={ category="lo", - description="EGYPTIAN HIEROGLYPH O025", + description="EGYPTIAN HIEROGLYPH T018", direction="l", linebreak="al", - unicodeslot=0x13276, + unicodeslot=0x1331E, }, - [0x13277]={ + [0x1331F]={ category="lo", - description="EGYPTIAN HIEROGLYPH O025A", + description="EGYPTIAN HIEROGLYPH T019", direction="l", linebreak="al", - unicodeslot=0x13277, + unicodeslot=0x1331F, }, - [0x13278]={ + [0x13320]={ category="lo", - description="EGYPTIAN HIEROGLYPH O026", + description="EGYPTIAN HIEROGLYPH T020", direction="l", linebreak="al", - unicodeslot=0x13278, + unicodeslot=0x13320, }, - [0x13279]={ + [0x13321]={ category="lo", - description="EGYPTIAN HIEROGLYPH O027", + description="EGYPTIAN HIEROGLYPH T021", direction="l", linebreak="al", - unicodeslot=0x13279, + unicodeslot=0x13321, }, - [0x1327A]={ + [0x13322]={ category="lo", - description="EGYPTIAN HIEROGLYPH O028", + description="EGYPTIAN HIEROGLYPH T022", direction="l", linebreak="al", - unicodeslot=0x1327A, + unicodeslot=0x13322, }, - [0x1327B]={ + [0x13323]={ category="lo", - description="EGYPTIAN HIEROGLYPH O029", + description="EGYPTIAN HIEROGLYPH T023", direction="l", linebreak="al", - unicodeslot=0x1327B, + unicodeslot=0x13323, }, - [0x1327C]={ + [0x13324]={ category="lo", - description="EGYPTIAN HIEROGLYPH O029A", + description="EGYPTIAN HIEROGLYPH T024", direction="l", linebreak="al", - unicodeslot=0x1327C, + unicodeslot=0x13324, }, - [0x1327D]={ + [0x13325]={ category="lo", - description="EGYPTIAN HIEROGLYPH O030", + description="EGYPTIAN HIEROGLYPH T025", direction="l", linebreak="al", - unicodeslot=0x1327D, + unicodeslot=0x13325, }, - [0x1327E]={ + [0x13326]={ category="lo", - description="EGYPTIAN HIEROGLYPH O030A", + description="EGYPTIAN HIEROGLYPH T026", direction="l", linebreak="al", - unicodeslot=0x1327E, + unicodeslot=0x13326, }, - [0x1327F]={ + [0x13327]={ category="lo", - description="EGYPTIAN HIEROGLYPH O031", + description="EGYPTIAN HIEROGLYPH T027", direction="l", linebreak="al", - unicodeslot=0x1327F, + unicodeslot=0x13327, }, - [0x13280]={ + [0x13328]={ category="lo", - description="EGYPTIAN HIEROGLYPH O032", + description="EGYPTIAN HIEROGLYPH T028", direction="l", linebreak="al", - unicodeslot=0x13280, + unicodeslot=0x13328, }, - [0x13281]={ + [0x13329]={ category="lo", - description="EGYPTIAN HIEROGLYPH O033", + description="EGYPTIAN HIEROGLYPH T029", direction="l", linebreak="al", - unicodeslot=0x13281, + unicodeslot=0x13329, }, - [0x13282]={ + [0x1332A]={ category="lo", - description="EGYPTIAN HIEROGLYPH O033A", + description="EGYPTIAN HIEROGLYPH T030", direction="l", - linebreak="cl", - unicodeslot=0x13282, + linebreak="al", + unicodeslot=0x1332A, }, - [0x13283]={ + [0x1332B]={ category="lo", - description="EGYPTIAN HIEROGLYPH O034", + description="EGYPTIAN HIEROGLYPH T031", direction="l", linebreak="al", - unicodeslot=0x13283, + unicodeslot=0x1332B, }, - [0x13284]={ + [0x1332C]={ category="lo", - description="EGYPTIAN HIEROGLYPH O035", + description="EGYPTIAN HIEROGLYPH T032", direction="l", linebreak="al", - unicodeslot=0x13284, + unicodeslot=0x1332C, }, - [0x13285]={ + [0x1332D]={ category="lo", - description="EGYPTIAN HIEROGLYPH O036", + description="EGYPTIAN HIEROGLYPH T032A", direction="l", linebreak="al", - unicodeslot=0x13285, + unicodeslot=0x1332D, }, - [0x13286]={ + [0x1332E]={ category="lo", - description="EGYPTIAN HIEROGLYPH O036A", + description="EGYPTIAN HIEROGLYPH T033", direction="l", - linebreak="op", - unicodeslot=0x13286, + linebreak="al", + unicodeslot=0x1332E, }, - [0x13287]={ + [0x1332F]={ category="lo", - description="EGYPTIAN HIEROGLYPH O036B", + description="EGYPTIAN HIEROGLYPH T033A", direction="l", - linebreak="cl", - unicodeslot=0x13287, + linebreak="al", + unicodeslot=0x1332F, }, - [0x13288]={ + [0x13330]={ category="lo", - description="EGYPTIAN HIEROGLYPH O036C", + description="EGYPTIAN HIEROGLYPH T034", direction="l", - linebreak="op", - unicodeslot=0x13288, + linebreak="al", + unicodeslot=0x13330, }, - [0x13289]={ + [0x13331]={ category="lo", - description="EGYPTIAN HIEROGLYPH O036D", + description="EGYPTIAN HIEROGLYPH T035", direction="l", - linebreak="cl", - unicodeslot=0x13289, + linebreak="al", + unicodeslot=0x13331, }, - [0x1328A]={ + [0x13332]={ category="lo", - description="EGYPTIAN HIEROGLYPH O037", + description="EGYPTIAN HIEROGLYPH T036", direction="l", linebreak="al", - unicodeslot=0x1328A, + unicodeslot=0x13332, }, - [0x1328B]={ + [0x13333]={ category="lo", - description="EGYPTIAN HIEROGLYPH O038", + description="EGYPTIAN HIEROGLYPH U001", direction="l", linebreak="al", - unicodeslot=0x1328B, + unicodeslot=0x13333, }, - [0x1328C]={ + [0x13334]={ category="lo", - description="EGYPTIAN HIEROGLYPH O039", + description="EGYPTIAN HIEROGLYPH U002", direction="l", linebreak="al", - unicodeslot=0x1328C, + unicodeslot=0x13334, }, - [0x1328D]={ + [0x13335]={ category="lo", - description="EGYPTIAN HIEROGLYPH O040", + description="EGYPTIAN HIEROGLYPH U003", direction="l", linebreak="al", - unicodeslot=0x1328D, + unicodeslot=0x13335, }, - [0x1328E]={ + [0x13336]={ category="lo", - description="EGYPTIAN HIEROGLYPH O041", + description="EGYPTIAN HIEROGLYPH U004", direction="l", linebreak="al", - unicodeslot=0x1328E, + unicodeslot=0x13336, }, - [0x1328F]={ + [0x13337]={ category="lo", - description="EGYPTIAN HIEROGLYPH O042", + description="EGYPTIAN HIEROGLYPH U005", direction="l", linebreak="al", - unicodeslot=0x1328F, + unicodeslot=0x13337, }, - [0x13290]={ + [0x13338]={ category="lo", - description="EGYPTIAN HIEROGLYPH O043", + description="EGYPTIAN HIEROGLYPH U006", direction="l", linebreak="al", - unicodeslot=0x13290, + unicodeslot=0x13338, }, - [0x13291]={ + [0x13339]={ category="lo", - description="EGYPTIAN HIEROGLYPH O044", + description="EGYPTIAN HIEROGLYPH U006A", direction="l", linebreak="al", - unicodeslot=0x13291, + unicodeslot=0x13339, }, - [0x13292]={ + [0x1333A]={ category="lo", - description="EGYPTIAN HIEROGLYPH O045", + description="EGYPTIAN HIEROGLYPH U006B", direction="l", linebreak="al", - unicodeslot=0x13292, + unicodeslot=0x1333A, }, - [0x13293]={ + [0x1333B]={ category="lo", - description="EGYPTIAN HIEROGLYPH O046", + description="EGYPTIAN HIEROGLYPH U007", direction="l", linebreak="al", - unicodeslot=0x13293, + unicodeslot=0x1333B, }, - [0x13294]={ + [0x1333C]={ category="lo", - description="EGYPTIAN HIEROGLYPH O047", + description="EGYPTIAN HIEROGLYPH U008", direction="l", linebreak="al", - unicodeslot=0x13294, + unicodeslot=0x1333C, }, - [0x13295]={ + [0x1333D]={ category="lo", - description="EGYPTIAN HIEROGLYPH O048", + description="EGYPTIAN HIEROGLYPH U009", direction="l", linebreak="al", - unicodeslot=0x13295, + unicodeslot=0x1333D, }, - [0x13296]={ + [0x1333E]={ category="lo", - description="EGYPTIAN HIEROGLYPH O049", + description="EGYPTIAN HIEROGLYPH U010", direction="l", linebreak="al", - unicodeslot=0x13296, + unicodeslot=0x1333E, }, - [0x13297]={ + [0x1333F]={ category="lo", - description="EGYPTIAN HIEROGLYPH O050", + description="EGYPTIAN HIEROGLYPH U011", direction="l", linebreak="al", - unicodeslot=0x13297, + unicodeslot=0x1333F, }, - [0x13298]={ + [0x13340]={ category="lo", - description="EGYPTIAN HIEROGLYPH O050A", + description="EGYPTIAN HIEROGLYPH U012", direction="l", linebreak="al", - unicodeslot=0x13298, + unicodeslot=0x13340, }, - [0x13299]={ + [0x13341]={ category="lo", - description="EGYPTIAN HIEROGLYPH O050B", + description="EGYPTIAN HIEROGLYPH U013", direction="l", linebreak="al", - unicodeslot=0x13299, + unicodeslot=0x13341, }, - [0x1329A]={ + [0x13342]={ category="lo", - description="EGYPTIAN HIEROGLYPH O051", + description="EGYPTIAN HIEROGLYPH U014", direction="l", linebreak="al", - unicodeslot=0x1329A, + unicodeslot=0x13342, }, - [0x1329B]={ + [0x13343]={ category="lo", - description="EGYPTIAN HIEROGLYPH P001", + description="EGYPTIAN HIEROGLYPH U015", direction="l", linebreak="al", - unicodeslot=0x1329B, + unicodeslot=0x13343, }, - [0x1329C]={ + [0x13344]={ category="lo", - description="EGYPTIAN HIEROGLYPH P001A", + description="EGYPTIAN HIEROGLYPH U016", direction="l", linebreak="al", - unicodeslot=0x1329C, + unicodeslot=0x13344, }, - [0x1329D]={ + [0x13345]={ category="lo", - description="EGYPTIAN HIEROGLYPH P002", + description="EGYPTIAN HIEROGLYPH U017", direction="l", linebreak="al", - unicodeslot=0x1329D, + unicodeslot=0x13345, }, - [0x1329E]={ + [0x13346]={ category="lo", - description="EGYPTIAN HIEROGLYPH P003", + description="EGYPTIAN HIEROGLYPH U018", direction="l", linebreak="al", - unicodeslot=0x1329E, + unicodeslot=0x13346, }, - [0x1329F]={ + [0x13347]={ category="lo", - description="EGYPTIAN HIEROGLYPH P003A", + description="EGYPTIAN HIEROGLYPH U019", direction="l", linebreak="al", - unicodeslot=0x1329F, + unicodeslot=0x13347, }, - [0x132A0]={ + [0x13348]={ category="lo", - description="EGYPTIAN HIEROGLYPH P004", + description="EGYPTIAN HIEROGLYPH U020", direction="l", linebreak="al", - unicodeslot=0x132A0, + unicodeslot=0x13348, }, - [0x132A1]={ + [0x13349]={ category="lo", - description="EGYPTIAN HIEROGLYPH P005", + description="EGYPTIAN HIEROGLYPH U021", direction="l", linebreak="al", - unicodeslot=0x132A1, + unicodeslot=0x13349, }, - [0x132A2]={ + [0x1334A]={ category="lo", - description="EGYPTIAN HIEROGLYPH P006", + description="EGYPTIAN HIEROGLYPH U022", direction="l", linebreak="al", - unicodeslot=0x132A2, + unicodeslot=0x1334A, }, - [0x132A3]={ + [0x1334B]={ category="lo", - description="EGYPTIAN HIEROGLYPH P007", + description="EGYPTIAN HIEROGLYPH U023", direction="l", linebreak="al", - unicodeslot=0x132A3, + unicodeslot=0x1334B, }, - [0x132A4]={ + [0x1334C]={ category="lo", - description="EGYPTIAN HIEROGLYPH P008", + description="EGYPTIAN HIEROGLYPH U023A", direction="l", linebreak="al", - unicodeslot=0x132A4, + unicodeslot=0x1334C, }, - [0x132A5]={ + [0x1334D]={ category="lo", - description="EGYPTIAN HIEROGLYPH P009", + description="EGYPTIAN HIEROGLYPH U024", direction="l", linebreak="al", - unicodeslot=0x132A5, + unicodeslot=0x1334D, }, - [0x132A6]={ + [0x1334E]={ category="lo", - description="EGYPTIAN HIEROGLYPH P010", + description="EGYPTIAN HIEROGLYPH U025", direction="l", linebreak="al", - unicodeslot=0x132A6, + unicodeslot=0x1334E, }, - [0x132A7]={ + [0x1334F]={ category="lo", - description="EGYPTIAN HIEROGLYPH P011", + description="EGYPTIAN HIEROGLYPH U026", direction="l", linebreak="al", - unicodeslot=0x132A7, + unicodeslot=0x1334F, }, - [0x132A8]={ + [0x13350]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q001", + description="EGYPTIAN HIEROGLYPH U027", direction="l", linebreak="al", - unicodeslot=0x132A8, + unicodeslot=0x13350, }, - [0x132A9]={ + [0x13351]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q002", + description="EGYPTIAN HIEROGLYPH U028", direction="l", linebreak="al", - unicodeslot=0x132A9, + unicodeslot=0x13351, }, - [0x132AA]={ + [0x13352]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q003", + description="EGYPTIAN HIEROGLYPH U029", direction="l", linebreak="al", - unicodeslot=0x132AA, + unicodeslot=0x13352, }, - [0x132AB]={ + [0x13353]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q004", + description="EGYPTIAN HIEROGLYPH U029A", direction="l", linebreak="al", - unicodeslot=0x132AB, + unicodeslot=0x13353, }, - [0x132AC]={ + [0x13354]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q005", + description="EGYPTIAN HIEROGLYPH U030", direction="l", linebreak="al", - unicodeslot=0x132AC, + unicodeslot=0x13354, }, - [0x132AD]={ + [0x13355]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q006", + description="EGYPTIAN HIEROGLYPH U031", direction="l", linebreak="al", - unicodeslot=0x132AD, + unicodeslot=0x13355, }, - [0x132AE]={ + [0x13356]={ category="lo", - description="EGYPTIAN HIEROGLYPH Q007", + description="EGYPTIAN HIEROGLYPH U032", direction="l", linebreak="al", - unicodeslot=0x132AE, + unicodeslot=0x13356, }, - [0x132AF]={ + [0x13357]={ category="lo", - description="EGYPTIAN HIEROGLYPH R001", + description="EGYPTIAN HIEROGLYPH U032A", direction="l", linebreak="al", - unicodeslot=0x132AF, + unicodeslot=0x13357, }, - [0x132B0]={ + [0x13358]={ category="lo", - description="EGYPTIAN HIEROGLYPH R002", + description="EGYPTIAN HIEROGLYPH U033", direction="l", linebreak="al", - unicodeslot=0x132B0, + unicodeslot=0x13358, }, - [0x132B1]={ + [0x13359]={ category="lo", - description="EGYPTIAN HIEROGLYPH R002A", + description="EGYPTIAN HIEROGLYPH U034", direction="l", linebreak="al", - unicodeslot=0x132B1, + unicodeslot=0x13359, }, - [0x132B2]={ + [0x1335A]={ category="lo", - description="EGYPTIAN HIEROGLYPH R003", + description="EGYPTIAN HIEROGLYPH U035", direction="l", linebreak="al", - unicodeslot=0x132B2, + unicodeslot=0x1335A, }, - [0x132B3]={ + [0x1335B]={ category="lo", - description="EGYPTIAN HIEROGLYPH R003A", + description="EGYPTIAN HIEROGLYPH U036", direction="l", linebreak="al", - unicodeslot=0x132B3, + unicodeslot=0x1335B, }, - [0x132B4]={ + [0x1335C]={ category="lo", - description="EGYPTIAN HIEROGLYPH R003B", + description="EGYPTIAN HIEROGLYPH U037", direction="l", linebreak="al", - unicodeslot=0x132B4, + unicodeslot=0x1335C, }, - [0x132B5]={ + [0x1335D]={ category="lo", - description="EGYPTIAN HIEROGLYPH R004", + description="EGYPTIAN HIEROGLYPH U038", direction="l", linebreak="al", - unicodeslot=0x132B5, + unicodeslot=0x1335D, }, - [0x132B6]={ + [0x1335E]={ category="lo", - description="EGYPTIAN HIEROGLYPH R005", + description="EGYPTIAN HIEROGLYPH U039", direction="l", linebreak="al", - unicodeslot=0x132B6, + unicodeslot=0x1335E, }, - [0x132B7]={ + [0x1335F]={ category="lo", - description="EGYPTIAN HIEROGLYPH R006", + description="EGYPTIAN HIEROGLYPH U040", direction="l", linebreak="al", - unicodeslot=0x132B7, + unicodeslot=0x1335F, }, - [0x132B8]={ + [0x13360]={ category="lo", - description="EGYPTIAN HIEROGLYPH R007", + description="EGYPTIAN HIEROGLYPH U041", direction="l", linebreak="al", - unicodeslot=0x132B8, + unicodeslot=0x13360, }, - [0x132B9]={ + [0x13361]={ category="lo", - description="EGYPTIAN HIEROGLYPH R008", + description="EGYPTIAN HIEROGLYPH U042", direction="l", linebreak="al", - unicodeslot=0x132B9, + unicodeslot=0x13361, }, - [0x132BA]={ + [0x13362]={ category="lo", - description="EGYPTIAN HIEROGLYPH R009", + description="EGYPTIAN HIEROGLYPH V001", direction="l", linebreak="al", - unicodeslot=0x132BA, + unicodeslot=0x13362, }, - [0x132BB]={ + [0x13363]={ category="lo", - description="EGYPTIAN HIEROGLYPH R010", + description="EGYPTIAN HIEROGLYPH V001A", direction="l", linebreak="al", - unicodeslot=0x132BB, + unicodeslot=0x13363, }, - [0x132BC]={ + [0x13364]={ category="lo", - description="EGYPTIAN HIEROGLYPH R010A", + description="EGYPTIAN HIEROGLYPH V001B", direction="l", linebreak="al", - unicodeslot=0x132BC, + unicodeslot=0x13364, }, - [0x132BD]={ + [0x13365]={ category="lo", - description="EGYPTIAN HIEROGLYPH R011", + description="EGYPTIAN HIEROGLYPH V001C", direction="l", linebreak="al", - unicodeslot=0x132BD, + unicodeslot=0x13365, }, - [0x132BE]={ + [0x13366]={ category="lo", - description="EGYPTIAN HIEROGLYPH R012", + description="EGYPTIAN HIEROGLYPH V001D", direction="l", linebreak="al", - unicodeslot=0x132BE, + unicodeslot=0x13366, }, - [0x132BF]={ + [0x13367]={ category="lo", - description="EGYPTIAN HIEROGLYPH R013", + description="EGYPTIAN HIEROGLYPH V001E", direction="l", linebreak="al", - unicodeslot=0x132BF, + unicodeslot=0x13367, }, - [0x132C0]={ + [0x13368]={ category="lo", - description="EGYPTIAN HIEROGLYPH R014", + description="EGYPTIAN HIEROGLYPH V001F", direction="l", linebreak="al", - unicodeslot=0x132C0, + unicodeslot=0x13368, }, - [0x132C1]={ + [0x13369]={ category="lo", - description="EGYPTIAN HIEROGLYPH R015", + description="EGYPTIAN HIEROGLYPH V001G", direction="l", linebreak="al", - unicodeslot=0x132C1, + unicodeslot=0x13369, }, - [0x132C2]={ + [0x1336A]={ category="lo", - description="EGYPTIAN HIEROGLYPH R016", + description="EGYPTIAN HIEROGLYPH V001H", direction="l", linebreak="al", - unicodeslot=0x132C2, + unicodeslot=0x1336A, }, - [0x132C3]={ + [0x1336B]={ category="lo", - description="EGYPTIAN HIEROGLYPH R016A", + description="EGYPTIAN HIEROGLYPH V001I", direction="l", linebreak="al", - unicodeslot=0x132C3, + unicodeslot=0x1336B, }, - [0x132C4]={ + [0x1336C]={ category="lo", - description="EGYPTIAN HIEROGLYPH R017", + description="EGYPTIAN HIEROGLYPH V002", direction="l", linebreak="al", - unicodeslot=0x132C4, + unicodeslot=0x1336C, }, - [0x132C5]={ + [0x1336D]={ category="lo", - description="EGYPTIAN HIEROGLYPH R018", + description="EGYPTIAN HIEROGLYPH V002A", direction="l", linebreak="al", - unicodeslot=0x132C5, + unicodeslot=0x1336D, }, - [0x132C6]={ + [0x1336E]={ category="lo", - description="EGYPTIAN HIEROGLYPH R019", + description="EGYPTIAN HIEROGLYPH V003", direction="l", linebreak="al", - unicodeslot=0x132C6, + unicodeslot=0x1336E, }, - [0x132C7]={ + [0x1336F]={ category="lo", - description="EGYPTIAN HIEROGLYPH R020", + description="EGYPTIAN HIEROGLYPH V004", direction="l", linebreak="al", - unicodeslot=0x132C7, + unicodeslot=0x1336F, }, - [0x132C8]={ + [0x13370]={ category="lo", - description="EGYPTIAN HIEROGLYPH R021", + description="EGYPTIAN HIEROGLYPH V005", direction="l", linebreak="al", - unicodeslot=0x132C8, + unicodeslot=0x13370, }, - [0x132C9]={ + [0x13371]={ category="lo", - description="EGYPTIAN HIEROGLYPH R022", + description="EGYPTIAN HIEROGLYPH V006", direction="l", linebreak="al", - unicodeslot=0x132C9, + unicodeslot=0x13371, }, - [0x132CA]={ + [0x13372]={ category="lo", - description="EGYPTIAN HIEROGLYPH R023", + description="EGYPTIAN HIEROGLYPH V007", direction="l", linebreak="al", - unicodeslot=0x132CA, + unicodeslot=0x13372, }, - [0x132CB]={ + [0x13373]={ category="lo", - description="EGYPTIAN HIEROGLYPH R024", + description="EGYPTIAN HIEROGLYPH V007A", direction="l", linebreak="al", - unicodeslot=0x132CB, + unicodeslot=0x13373, }, - [0x132CC]={ + [0x13374]={ category="lo", - description="EGYPTIAN HIEROGLYPH R025", + description="EGYPTIAN HIEROGLYPH V007B", direction="l", linebreak="al", - unicodeslot=0x132CC, + unicodeslot=0x13374, }, - [0x132CD]={ + [0x13375]={ category="lo", - description="EGYPTIAN HIEROGLYPH R026", + description="EGYPTIAN HIEROGLYPH V008", direction="l", linebreak="al", - unicodeslot=0x132CD, + unicodeslot=0x13375, }, - [0x132CE]={ + [0x13376]={ category="lo", - description="EGYPTIAN HIEROGLYPH R027", + description="EGYPTIAN HIEROGLYPH V009", direction="l", linebreak="al", - unicodeslot=0x132CE, + unicodeslot=0x13376, }, - [0x132CF]={ + [0x13377]={ category="lo", - description="EGYPTIAN HIEROGLYPH R028", + description="EGYPTIAN HIEROGLYPH V010", direction="l", linebreak="al", - unicodeslot=0x132CF, + unicodeslot=0x13377, }, - [0x132D0]={ + [0x13378]={ category="lo", - description="EGYPTIAN HIEROGLYPH R029", + description="EGYPTIAN HIEROGLYPH V011", direction="l", linebreak="al", - unicodeslot=0x132D0, + unicodeslot=0x13378, }, - [0x132D1]={ + [0x13379]={ category="lo", - description="EGYPTIAN HIEROGLYPH S001", + description="EGYPTIAN HIEROGLYPH V011A", direction="l", - linebreak="al", - unicodeslot=0x132D1, + linebreak="op", + unicodeslot=0x13379, }, - [0x132D2]={ + [0x1337A]={ category="lo", - description="EGYPTIAN HIEROGLYPH S002", + description="EGYPTIAN HIEROGLYPH V011B", direction="l", - linebreak="al", - unicodeslot=0x132D2, + linebreak="cl", + unicodeslot=0x1337A, }, - [0x132D3]={ + [0x1337B]={ category="lo", - description="EGYPTIAN HIEROGLYPH S002A", + description="EGYPTIAN HIEROGLYPH V011C", direction="l", - linebreak="al", - unicodeslot=0x132D3, + linebreak="cl", + unicodeslot=0x1337B, }, - [0x132D4]={ + [0x1337C]={ category="lo", - description="EGYPTIAN HIEROGLYPH S003", + description="EGYPTIAN HIEROGLYPH V012", direction="l", linebreak="al", - unicodeslot=0x132D4, + unicodeslot=0x1337C, }, - [0x132D5]={ + [0x1337D]={ category="lo", - description="EGYPTIAN HIEROGLYPH S004", + description="EGYPTIAN HIEROGLYPH V012A", direction="l", linebreak="al", - unicodeslot=0x132D5, + unicodeslot=0x1337D, }, - [0x132D6]={ + [0x1337E]={ category="lo", - description="EGYPTIAN HIEROGLYPH S005", + description="EGYPTIAN HIEROGLYPH V012B", direction="l", linebreak="al", - unicodeslot=0x132D6, + unicodeslot=0x1337E, }, - [0x132D7]={ + [0x1337F]={ category="lo", - description="EGYPTIAN HIEROGLYPH S006", + description="EGYPTIAN HIEROGLYPH V013", direction="l", linebreak="al", - unicodeslot=0x132D7, + unicodeslot=0x1337F, }, - [0x132D8]={ + [0x13380]={ category="lo", - description="EGYPTIAN HIEROGLYPH S006A", + description="EGYPTIAN HIEROGLYPH V014", direction="l", linebreak="al", - unicodeslot=0x132D8, + unicodeslot=0x13380, }, - [0x132D9]={ + [0x13381]={ category="lo", - description="EGYPTIAN HIEROGLYPH S007", + description="EGYPTIAN HIEROGLYPH V015", direction="l", linebreak="al", - unicodeslot=0x132D9, + unicodeslot=0x13381, }, - [0x132DA]={ + [0x13382]={ category="lo", - description="EGYPTIAN HIEROGLYPH S008", + description="EGYPTIAN HIEROGLYPH V016", direction="l", linebreak="al", - unicodeslot=0x132DA, + unicodeslot=0x13382, }, - [0x132DB]={ + [0x13383]={ category="lo", - description="EGYPTIAN HIEROGLYPH S009", + description="EGYPTIAN HIEROGLYPH V017", direction="l", linebreak="al", - unicodeslot=0x132DB, + unicodeslot=0x13383, }, - [0x132DC]={ + [0x13384]={ category="lo", - description="EGYPTIAN HIEROGLYPH S010", + description="EGYPTIAN HIEROGLYPH V018", direction="l", linebreak="al", - unicodeslot=0x132DC, + unicodeslot=0x13384, }, - [0x132DD]={ + [0x13385]={ category="lo", - description="EGYPTIAN HIEROGLYPH S011", + description="EGYPTIAN HIEROGLYPH V019", direction="l", linebreak="al", - unicodeslot=0x132DD, + unicodeslot=0x13385, }, - [0x132DE]={ + [0x13386]={ category="lo", - description="EGYPTIAN HIEROGLYPH S012", + description="EGYPTIAN HIEROGLYPH V020", direction="l", linebreak="al", - unicodeslot=0x132DE, + unicodeslot=0x13386, }, - [0x132DF]={ + [0x13387]={ category="lo", - description="EGYPTIAN HIEROGLYPH S013", + description="EGYPTIAN HIEROGLYPH V020A", direction="l", linebreak="al", - unicodeslot=0x132DF, + unicodeslot=0x13387, }, - [0x132E0]={ + [0x13388]={ category="lo", - description="EGYPTIAN HIEROGLYPH S014", + description="EGYPTIAN HIEROGLYPH V020B", direction="l", linebreak="al", - unicodeslot=0x132E0, + unicodeslot=0x13388, }, - [0x132E1]={ + [0x13389]={ category="lo", - description="EGYPTIAN HIEROGLYPH S014A", + description="EGYPTIAN HIEROGLYPH V020C", direction="l", linebreak="al", - unicodeslot=0x132E1, + unicodeslot=0x13389, }, - [0x132E2]={ + [0x1338A]={ category="lo", - description="EGYPTIAN HIEROGLYPH S014B", + description="EGYPTIAN HIEROGLYPH V020D", direction="l", linebreak="al", - unicodeslot=0x132E2, + unicodeslot=0x1338A, }, - [0x132E3]={ + [0x1338B]={ category="lo", - description="EGYPTIAN HIEROGLYPH S015", + description="EGYPTIAN HIEROGLYPH V020E", direction="l", linebreak="al", - unicodeslot=0x132E3, + unicodeslot=0x1338B, }, - [0x132E4]={ + [0x1338C]={ category="lo", - description="EGYPTIAN HIEROGLYPH S016", + description="EGYPTIAN HIEROGLYPH V020F", direction="l", linebreak="al", - unicodeslot=0x132E4, + unicodeslot=0x1338C, }, - [0x132E5]={ + [0x1338D]={ category="lo", - description="EGYPTIAN HIEROGLYPH S017", + description="EGYPTIAN HIEROGLYPH V020G", direction="l", linebreak="al", - unicodeslot=0x132E5, + unicodeslot=0x1338D, }, - [0x132E6]={ + [0x1338E]={ category="lo", - description="EGYPTIAN HIEROGLYPH S017A", + description="EGYPTIAN HIEROGLYPH V020H", direction="l", linebreak="al", - unicodeslot=0x132E6, + unicodeslot=0x1338E, }, - [0x132E7]={ + [0x1338F]={ category="lo", - description="EGYPTIAN HIEROGLYPH S018", + description="EGYPTIAN HIEROGLYPH V020I", direction="l", linebreak="al", - unicodeslot=0x132E7, + unicodeslot=0x1338F, }, - [0x132E8]={ + [0x13390]={ category="lo", - description="EGYPTIAN HIEROGLYPH S019", + description="EGYPTIAN HIEROGLYPH V020J", direction="l", linebreak="al", - unicodeslot=0x132E8, + unicodeslot=0x13390, }, - [0x132E9]={ + [0x13391]={ category="lo", - description="EGYPTIAN HIEROGLYPH S020", + description="EGYPTIAN HIEROGLYPH V020K", direction="l", linebreak="al", - unicodeslot=0x132E9, + unicodeslot=0x13391, }, - [0x132EA]={ + [0x13392]={ category="lo", - description="EGYPTIAN HIEROGLYPH S021", + description="EGYPTIAN HIEROGLYPH V020L", direction="l", linebreak="al", - unicodeslot=0x132EA, + unicodeslot=0x13392, }, - [0x132EB]={ + [0x13393]={ category="lo", - description="EGYPTIAN HIEROGLYPH S022", + description="EGYPTIAN HIEROGLYPH V021", direction="l", linebreak="al", - unicodeslot=0x132EB, + unicodeslot=0x13393, }, - [0x132EC]={ + [0x13394]={ category="lo", - description="EGYPTIAN HIEROGLYPH S023", + description="EGYPTIAN HIEROGLYPH V022", direction="l", linebreak="al", - unicodeslot=0x132EC, + unicodeslot=0x13394, }, - [0x132ED]={ + [0x13395]={ category="lo", - description="EGYPTIAN HIEROGLYPH S024", + description="EGYPTIAN HIEROGLYPH V023", direction="l", linebreak="al", - unicodeslot=0x132ED, + unicodeslot=0x13395, }, - [0x132EE]={ + [0x13396]={ category="lo", - description="EGYPTIAN HIEROGLYPH S025", + description="EGYPTIAN HIEROGLYPH V023A", direction="l", linebreak="al", - unicodeslot=0x132EE, + unicodeslot=0x13396, }, - [0x132EF]={ + [0x13397]={ category="lo", - description="EGYPTIAN HIEROGLYPH S026", + description="EGYPTIAN HIEROGLYPH V024", direction="l", linebreak="al", - unicodeslot=0x132EF, + unicodeslot=0x13397, }, - [0x132F0]={ + [0x13398]={ category="lo", - description="EGYPTIAN HIEROGLYPH S026A", + description="EGYPTIAN HIEROGLYPH V025", direction="l", linebreak="al", - unicodeslot=0x132F0, + unicodeslot=0x13398, }, - [0x132F1]={ + [0x13399]={ category="lo", - description="EGYPTIAN HIEROGLYPH S026B", + description="EGYPTIAN HIEROGLYPH V026", direction="l", linebreak="al", - unicodeslot=0x132F1, + unicodeslot=0x13399, }, - [0x132F2]={ + [0x1339A]={ category="lo", - description="EGYPTIAN HIEROGLYPH S027", + description="EGYPTIAN HIEROGLYPH V027", direction="l", linebreak="al", - unicodeslot=0x132F2, + unicodeslot=0x1339A, }, - [0x132F3]={ + [0x1339B]={ category="lo", - description="EGYPTIAN HIEROGLYPH S028", + description="EGYPTIAN HIEROGLYPH V028", direction="l", linebreak="al", - unicodeslot=0x132F3, + unicodeslot=0x1339B, }, - [0x132F4]={ + [0x1339C]={ category="lo", - description="EGYPTIAN HIEROGLYPH S029", + description="EGYPTIAN HIEROGLYPH V028A", direction="l", linebreak="al", - unicodeslot=0x132F4, + unicodeslot=0x1339C, }, - [0x132F5]={ + [0x1339D]={ category="lo", - description="EGYPTIAN HIEROGLYPH S030", + description="EGYPTIAN HIEROGLYPH V029", direction="l", linebreak="al", - unicodeslot=0x132F5, + unicodeslot=0x1339D, }, - [0x132F6]={ + [0x1339E]={ category="lo", - description="EGYPTIAN HIEROGLYPH S031", + description="EGYPTIAN HIEROGLYPH V029A", direction="l", linebreak="al", - unicodeslot=0x132F6, + unicodeslot=0x1339E, }, - [0x132F7]={ + [0x1339F]={ category="lo", - description="EGYPTIAN HIEROGLYPH S032", + description="EGYPTIAN HIEROGLYPH V030", direction="l", linebreak="al", - unicodeslot=0x132F7, + unicodeslot=0x1339F, }, - [0x132F8]={ + [0x133A0]={ category="lo", - description="EGYPTIAN HIEROGLYPH S033", + description="EGYPTIAN HIEROGLYPH V030A", direction="l", linebreak="al", - unicodeslot=0x132F8, + unicodeslot=0x133A0, }, - [0x132F9]={ + [0x133A1]={ category="lo", - description="EGYPTIAN HIEROGLYPH S034", + description="EGYPTIAN HIEROGLYPH V031", direction="l", linebreak="al", - unicodeslot=0x132F9, + unicodeslot=0x133A1, }, - [0x132FA]={ + [0x133A2]={ category="lo", - description="EGYPTIAN HIEROGLYPH S035", + description="EGYPTIAN HIEROGLYPH V031A", direction="l", linebreak="al", - unicodeslot=0x132FA, + unicodeslot=0x133A2, }, - [0x132FB]={ + [0x133A3]={ category="lo", - description="EGYPTIAN HIEROGLYPH S035A", + description="EGYPTIAN HIEROGLYPH V032", direction="l", linebreak="al", - unicodeslot=0x132FB, + unicodeslot=0x133A3, }, - [0x132FC]={ + [0x133A4]={ category="lo", - description="EGYPTIAN HIEROGLYPH S036", + description="EGYPTIAN HIEROGLYPH V033", direction="l", linebreak="al", - unicodeslot=0x132FC, + unicodeslot=0x133A4, }, - [0x132FD]={ + [0x133A5]={ category="lo", - description="EGYPTIAN HIEROGLYPH S037", + description="EGYPTIAN HIEROGLYPH V033A", direction="l", linebreak="al", - unicodeslot=0x132FD, + unicodeslot=0x133A5, }, - [0x132FE]={ + [0x133A6]={ category="lo", - description="EGYPTIAN HIEROGLYPH S038", + description="EGYPTIAN HIEROGLYPH V034", direction="l", linebreak="al", - unicodeslot=0x132FE, + unicodeslot=0x133A6, }, - [0x132FF]={ + [0x133A7]={ category="lo", - description="EGYPTIAN HIEROGLYPH S039", + description="EGYPTIAN HIEROGLYPH V035", direction="l", linebreak="al", - unicodeslot=0x132FF, + unicodeslot=0x133A7, }, - [0x13300]={ + [0x133A8]={ category="lo", - description="EGYPTIAN HIEROGLYPH S040", + description="EGYPTIAN HIEROGLYPH V036", direction="l", linebreak="al", - unicodeslot=0x13300, + unicodeslot=0x133A8, }, - [0x13301]={ + [0x133A9]={ category="lo", - description="EGYPTIAN HIEROGLYPH S041", + description="EGYPTIAN HIEROGLYPH V037", direction="l", linebreak="al", - unicodeslot=0x13301, + unicodeslot=0x133A9, }, - [0x13302]={ + [0x133AA]={ category="lo", - description="EGYPTIAN HIEROGLYPH S042", + description="EGYPTIAN HIEROGLYPH V037A", direction="l", linebreak="al", - unicodeslot=0x13302, + unicodeslot=0x133AA, }, - [0x13303]={ + [0x133AB]={ category="lo", - description="EGYPTIAN HIEROGLYPH S043", + description="EGYPTIAN HIEROGLYPH V038", direction="l", linebreak="al", - unicodeslot=0x13303, + unicodeslot=0x133AB, }, - [0x13304]={ + [0x133AC]={ category="lo", - description="EGYPTIAN HIEROGLYPH S044", + description="EGYPTIAN HIEROGLYPH V039", direction="l", linebreak="al", - unicodeslot=0x13304, + unicodeslot=0x133AC, }, - [0x13305]={ + [0x133AD]={ category="lo", - description="EGYPTIAN HIEROGLYPH S045", + description="EGYPTIAN HIEROGLYPH V040", direction="l", linebreak="al", - unicodeslot=0x13305, + unicodeslot=0x133AD, }, - [0x13306]={ + [0x133AE]={ category="lo", - description="EGYPTIAN HIEROGLYPH S046", + description="EGYPTIAN HIEROGLYPH V040A", direction="l", linebreak="al", - unicodeslot=0x13306, + unicodeslot=0x133AE, }, - [0x13307]={ + [0x133AF]={ category="lo", - description="EGYPTIAN HIEROGLYPH T001", + description="EGYPTIAN HIEROGLYPH W001", direction="l", linebreak="al", - unicodeslot=0x13307, + unicodeslot=0x133AF, }, - [0x13308]={ + [0x133B0]={ category="lo", - description="EGYPTIAN HIEROGLYPH T002", + description="EGYPTIAN HIEROGLYPH W002", direction="l", linebreak="al", - unicodeslot=0x13308, + unicodeslot=0x133B0, }, - [0x13309]={ + [0x133B1]={ category="lo", - description="EGYPTIAN HIEROGLYPH T003", + description="EGYPTIAN HIEROGLYPH W003", direction="l", linebreak="al", - unicodeslot=0x13309, + unicodeslot=0x133B1, }, - [0x1330A]={ + [0x133B2]={ category="lo", - description="EGYPTIAN HIEROGLYPH T003A", + description="EGYPTIAN HIEROGLYPH W003A", direction="l", linebreak="al", - unicodeslot=0x1330A, + unicodeslot=0x133B2, }, - [0x1330B]={ + [0x133B3]={ category="lo", - description="EGYPTIAN HIEROGLYPH T004", + description="EGYPTIAN HIEROGLYPH W004", direction="l", linebreak="al", - unicodeslot=0x1330B, + unicodeslot=0x133B3, }, - [0x1330C]={ + [0x133B4]={ category="lo", - description="EGYPTIAN HIEROGLYPH T005", + description="EGYPTIAN HIEROGLYPH W005", direction="l", linebreak="al", - unicodeslot=0x1330C, + unicodeslot=0x133B4, }, - [0x1330D]={ + [0x133B5]={ category="lo", - description="EGYPTIAN HIEROGLYPH T006", + description="EGYPTIAN HIEROGLYPH W006", direction="l", linebreak="al", - unicodeslot=0x1330D, + unicodeslot=0x133B5, }, - [0x1330E]={ + [0x133B6]={ category="lo", - description="EGYPTIAN HIEROGLYPH T007", + description="EGYPTIAN HIEROGLYPH W007", direction="l", linebreak="al", - unicodeslot=0x1330E, + unicodeslot=0x133B6, }, - [0x1330F]={ + [0x133B7]={ category="lo", - description="EGYPTIAN HIEROGLYPH T007A", + description="EGYPTIAN HIEROGLYPH W008", direction="l", linebreak="al", - unicodeslot=0x1330F, + unicodeslot=0x133B7, }, - [0x13310]={ + [0x133B8]={ category="lo", - description="EGYPTIAN HIEROGLYPH T008", + description="EGYPTIAN HIEROGLYPH W009", direction="l", linebreak="al", - unicodeslot=0x13310, + unicodeslot=0x133B8, }, - [0x13311]={ + [0x133B9]={ category="lo", - description="EGYPTIAN HIEROGLYPH T008A", + description="EGYPTIAN HIEROGLYPH W009A", direction="l", linebreak="al", - unicodeslot=0x13311, + unicodeslot=0x133B9, }, - [0x13312]={ + [0x133BA]={ category="lo", - description="EGYPTIAN HIEROGLYPH T009", + description="EGYPTIAN HIEROGLYPH W010", direction="l", linebreak="al", - unicodeslot=0x13312, + unicodeslot=0x133BA, }, - [0x13313]={ + [0x133BB]={ category="lo", - description="EGYPTIAN HIEROGLYPH T009A", + description="EGYPTIAN HIEROGLYPH W010A", direction="l", linebreak="al", - unicodeslot=0x13313, + unicodeslot=0x133BB, }, - [0x13314]={ + [0x133BC]={ category="lo", - description="EGYPTIAN HIEROGLYPH T010", + description="EGYPTIAN HIEROGLYPH W011", direction="l", linebreak="al", - unicodeslot=0x13314, + unicodeslot=0x133BC, }, - [0x13315]={ + [0x133BD]={ category="lo", - description="EGYPTIAN HIEROGLYPH T011", + description="EGYPTIAN HIEROGLYPH W012", direction="l", linebreak="al", - unicodeslot=0x13315, + unicodeslot=0x133BD, }, - [0x13316]={ + [0x133BE]={ category="lo", - description="EGYPTIAN HIEROGLYPH T011A", + description="EGYPTIAN HIEROGLYPH W013", direction="l", linebreak="al", - unicodeslot=0x13316, + unicodeslot=0x133BE, }, - [0x13317]={ + [0x133BF]={ category="lo", - description="EGYPTIAN HIEROGLYPH T012", + description="EGYPTIAN HIEROGLYPH W014", direction="l", linebreak="al", - unicodeslot=0x13317, + unicodeslot=0x133BF, }, - [0x13318]={ + [0x133C0]={ category="lo", - description="EGYPTIAN HIEROGLYPH T013", + description="EGYPTIAN HIEROGLYPH W014A", direction="l", linebreak="al", - unicodeslot=0x13318, + unicodeslot=0x133C0, }, - [0x13319]={ + [0x133C1]={ category="lo", - description="EGYPTIAN HIEROGLYPH T014", + description="EGYPTIAN HIEROGLYPH W015", direction="l", linebreak="al", - unicodeslot=0x13319, + unicodeslot=0x133C1, }, - [0x1331A]={ + [0x133C2]={ category="lo", - description="EGYPTIAN HIEROGLYPH T015", + description="EGYPTIAN HIEROGLYPH W016", direction="l", linebreak="al", - unicodeslot=0x1331A, + unicodeslot=0x133C2, }, - [0x1331B]={ + [0x133C3]={ category="lo", - description="EGYPTIAN HIEROGLYPH T016", + description="EGYPTIAN HIEROGLYPH W017", direction="l", linebreak="al", - unicodeslot=0x1331B, + unicodeslot=0x133C3, }, - [0x1331C]={ + [0x133C4]={ category="lo", - description="EGYPTIAN HIEROGLYPH T016A", + description="EGYPTIAN HIEROGLYPH W017A", direction="l", linebreak="al", - unicodeslot=0x1331C, + unicodeslot=0x133C4, }, - [0x1331D]={ + [0x133C5]={ category="lo", - description="EGYPTIAN HIEROGLYPH T017", + description="EGYPTIAN HIEROGLYPH W018", direction="l", linebreak="al", - unicodeslot=0x1331D, + unicodeslot=0x133C5, }, - [0x1331E]={ + [0x133C6]={ category="lo", - description="EGYPTIAN HIEROGLYPH T018", + description="EGYPTIAN HIEROGLYPH W018A", direction="l", linebreak="al", - unicodeslot=0x1331E, + unicodeslot=0x133C6, }, - [0x1331F]={ + [0x133C7]={ category="lo", - description="EGYPTIAN HIEROGLYPH T019", + description="EGYPTIAN HIEROGLYPH W019", direction="l", linebreak="al", - unicodeslot=0x1331F, + unicodeslot=0x133C7, }, - [0x13320]={ + [0x133C8]={ category="lo", - description="EGYPTIAN HIEROGLYPH T020", + description="EGYPTIAN HIEROGLYPH W020", direction="l", linebreak="al", - unicodeslot=0x13320, + unicodeslot=0x133C8, }, - [0x13321]={ + [0x133C9]={ category="lo", - description="EGYPTIAN HIEROGLYPH T021", + description="EGYPTIAN HIEROGLYPH W021", direction="l", linebreak="al", - unicodeslot=0x13321, + unicodeslot=0x133C9, }, - [0x13322]={ + [0x133CA]={ category="lo", - description="EGYPTIAN HIEROGLYPH T022", + description="EGYPTIAN HIEROGLYPH W022", direction="l", linebreak="al", - unicodeslot=0x13322, + unicodeslot=0x133CA, }, - [0x13323]={ + [0x133CB]={ category="lo", - description="EGYPTIAN HIEROGLYPH T023", + description="EGYPTIAN HIEROGLYPH W023", direction="l", linebreak="al", - unicodeslot=0x13323, + unicodeslot=0x133CB, }, - [0x13324]={ + [0x133CC]={ category="lo", - description="EGYPTIAN HIEROGLYPH T024", + description="EGYPTIAN HIEROGLYPH W024", direction="l", linebreak="al", - unicodeslot=0x13324, + unicodeslot=0x133CC, }, - [0x13325]={ + [0x133CD]={ category="lo", - description="EGYPTIAN HIEROGLYPH T025", + description="EGYPTIAN HIEROGLYPH W024A", direction="l", linebreak="al", - unicodeslot=0x13325, + unicodeslot=0x133CD, }, - [0x13326]={ + [0x133CE]={ category="lo", - description="EGYPTIAN HIEROGLYPH T026", + description="EGYPTIAN HIEROGLYPH W025", direction="l", linebreak="al", - unicodeslot=0x13326, + unicodeslot=0x133CE, }, - [0x13327]={ + [0x133CF]={ category="lo", - description="EGYPTIAN HIEROGLYPH T027", + description="EGYPTIAN HIEROGLYPH X001", direction="l", linebreak="al", - unicodeslot=0x13327, + unicodeslot=0x133CF, }, - [0x13328]={ + [0x133D0]={ category="lo", - description="EGYPTIAN HIEROGLYPH T028", + description="EGYPTIAN HIEROGLYPH X002", direction="l", linebreak="al", - unicodeslot=0x13328, + unicodeslot=0x133D0, }, - [0x13329]={ + [0x133D1]={ category="lo", - description="EGYPTIAN HIEROGLYPH T029", + description="EGYPTIAN HIEROGLYPH X003", direction="l", linebreak="al", - unicodeslot=0x13329, + unicodeslot=0x133D1, }, - [0x1332A]={ + [0x133D2]={ category="lo", - description="EGYPTIAN HIEROGLYPH T030", + description="EGYPTIAN HIEROGLYPH X004", direction="l", linebreak="al", - unicodeslot=0x1332A, + unicodeslot=0x133D2, }, - [0x1332B]={ + [0x133D3]={ category="lo", - description="EGYPTIAN HIEROGLYPH T031", + description="EGYPTIAN HIEROGLYPH X004A", direction="l", linebreak="al", - unicodeslot=0x1332B, + unicodeslot=0x133D3, }, - [0x1332C]={ + [0x133D4]={ category="lo", - description="EGYPTIAN HIEROGLYPH T032", + description="EGYPTIAN HIEROGLYPH X004B", direction="l", linebreak="al", - unicodeslot=0x1332C, + unicodeslot=0x133D4, }, - [0x1332D]={ + [0x133D5]={ category="lo", - description="EGYPTIAN HIEROGLYPH T032A", + description="EGYPTIAN HIEROGLYPH X005", direction="l", linebreak="al", - unicodeslot=0x1332D, + unicodeslot=0x133D5, }, - [0x1332E]={ + [0x133D6]={ category="lo", - description="EGYPTIAN HIEROGLYPH T033", + description="EGYPTIAN HIEROGLYPH X006", direction="l", linebreak="al", - unicodeslot=0x1332E, + unicodeslot=0x133D6, }, - [0x1332F]={ + [0x133D7]={ category="lo", - description="EGYPTIAN HIEROGLYPH T033A", + description="EGYPTIAN HIEROGLYPH X006A", direction="l", linebreak="al", - unicodeslot=0x1332F, + unicodeslot=0x133D7, }, - [0x13330]={ + [0x133D8]={ category="lo", - description="EGYPTIAN HIEROGLYPH T034", + description="EGYPTIAN HIEROGLYPH X007", direction="l", linebreak="al", - unicodeslot=0x13330, + unicodeslot=0x133D8, }, - [0x13331]={ + [0x133D9]={ category="lo", - description="EGYPTIAN HIEROGLYPH T035", + description="EGYPTIAN HIEROGLYPH X008", direction="l", linebreak="al", - unicodeslot=0x13331, + unicodeslot=0x133D9, }, - [0x13332]={ + [0x133DA]={ category="lo", - description="EGYPTIAN HIEROGLYPH T036", + description="EGYPTIAN HIEROGLYPH X008A", direction="l", linebreak="al", - unicodeslot=0x13332, + unicodeslot=0x133DA, }, - [0x13333]={ + [0x133DB]={ category="lo", - description="EGYPTIAN HIEROGLYPH U001", + description="EGYPTIAN HIEROGLYPH Y001", direction="l", linebreak="al", - unicodeslot=0x13333, + unicodeslot=0x133DB, }, - [0x13334]={ + [0x133DC]={ category="lo", - description="EGYPTIAN HIEROGLYPH U002", + description="EGYPTIAN HIEROGLYPH Y001A", direction="l", linebreak="al", - unicodeslot=0x13334, + unicodeslot=0x133DC, }, - [0x13335]={ + [0x133DD]={ category="lo", - description="EGYPTIAN HIEROGLYPH U003", + description="EGYPTIAN HIEROGLYPH Y002", direction="l", linebreak="al", - unicodeslot=0x13335, + unicodeslot=0x133DD, }, - [0x13336]={ + [0x133DE]={ category="lo", - description="EGYPTIAN HIEROGLYPH U004", + description="EGYPTIAN HIEROGLYPH Y003", direction="l", linebreak="al", - unicodeslot=0x13336, + unicodeslot=0x133DE, }, - [0x13337]={ + [0x133DF]={ category="lo", - description="EGYPTIAN HIEROGLYPH U005", + description="EGYPTIAN HIEROGLYPH Y004", direction="l", linebreak="al", - unicodeslot=0x13337, + unicodeslot=0x133DF, }, - [0x13338]={ + [0x133E0]={ category="lo", - description="EGYPTIAN HIEROGLYPH U006", + description="EGYPTIAN HIEROGLYPH Y005", direction="l", linebreak="al", - unicodeslot=0x13338, + unicodeslot=0x133E0, }, - [0x13339]={ + [0x133E1]={ category="lo", - description="EGYPTIAN HIEROGLYPH U006A", + description="EGYPTIAN HIEROGLYPH Y006", direction="l", linebreak="al", - unicodeslot=0x13339, + unicodeslot=0x133E1, }, - [0x1333A]={ + [0x133E2]={ category="lo", - description="EGYPTIAN HIEROGLYPH U006B", + description="EGYPTIAN HIEROGLYPH Y007", direction="l", linebreak="al", - unicodeslot=0x1333A, + unicodeslot=0x133E2, }, - [0x1333B]={ + [0x133E3]={ category="lo", - description="EGYPTIAN HIEROGLYPH U007", + description="EGYPTIAN HIEROGLYPH Y008", direction="l", linebreak="al", - unicodeslot=0x1333B, + unicodeslot=0x133E3, }, - [0x1333C]={ + [0x133E4]={ category="lo", - description="EGYPTIAN HIEROGLYPH U008", + description="EGYPTIAN HIEROGLYPH Z001", direction="l", linebreak="al", - unicodeslot=0x1333C, + unicodeslot=0x133E4, }, - [0x1333D]={ + [0x133E5]={ category="lo", - description="EGYPTIAN HIEROGLYPH U009", + description="EGYPTIAN HIEROGLYPH Z002", direction="l", linebreak="al", - unicodeslot=0x1333D, + unicodeslot=0x133E5, }, - [0x1333E]={ + [0x133E6]={ category="lo", - description="EGYPTIAN HIEROGLYPH U010", + description="EGYPTIAN HIEROGLYPH Z002A", direction="l", linebreak="al", - unicodeslot=0x1333E, + unicodeslot=0x133E6, }, - [0x1333F]={ + [0x133E7]={ category="lo", - description="EGYPTIAN HIEROGLYPH U011", + description="EGYPTIAN HIEROGLYPH Z002B", direction="l", linebreak="al", - unicodeslot=0x1333F, + unicodeslot=0x133E7, }, - [0x13340]={ + [0x133E8]={ category="lo", - description="EGYPTIAN HIEROGLYPH U012", + description="EGYPTIAN HIEROGLYPH Z002C", direction="l", linebreak="al", - unicodeslot=0x13340, + unicodeslot=0x133E8, }, - [0x13341]={ + [0x133E9]={ category="lo", - description="EGYPTIAN HIEROGLYPH U013", + description="EGYPTIAN HIEROGLYPH Z002D", direction="l", linebreak="al", - unicodeslot=0x13341, + unicodeslot=0x133E9, }, - [0x13342]={ + [0x133EA]={ category="lo", - description="EGYPTIAN HIEROGLYPH U014", + description="EGYPTIAN HIEROGLYPH Z003", direction="l", linebreak="al", - unicodeslot=0x13342, + unicodeslot=0x133EA, }, - [0x13343]={ + [0x133EB]={ category="lo", - description="EGYPTIAN HIEROGLYPH U015", + description="EGYPTIAN HIEROGLYPH Z003A", direction="l", linebreak="al", - unicodeslot=0x13343, + unicodeslot=0x133EB, }, - [0x13344]={ + [0x133EC]={ category="lo", - description="EGYPTIAN HIEROGLYPH U016", + description="EGYPTIAN HIEROGLYPH Z003B", direction="l", linebreak="al", - unicodeslot=0x13344, + unicodeslot=0x133EC, }, - [0x13345]={ + [0x133ED]={ category="lo", - description="EGYPTIAN HIEROGLYPH U017", + description="EGYPTIAN HIEROGLYPH Z004", direction="l", linebreak="al", - unicodeslot=0x13345, + unicodeslot=0x133ED, }, - [0x13346]={ + [0x133EE]={ category="lo", - description="EGYPTIAN HIEROGLYPH U018", + description="EGYPTIAN HIEROGLYPH Z004A", direction="l", linebreak="al", - unicodeslot=0x13346, + unicodeslot=0x133EE, }, - [0x13347]={ + [0x133EF]={ category="lo", - description="EGYPTIAN HIEROGLYPH U019", + description="EGYPTIAN HIEROGLYPH Z005", direction="l", linebreak="al", - unicodeslot=0x13347, + unicodeslot=0x133EF, }, - [0x13348]={ + [0x133F0]={ category="lo", - description="EGYPTIAN HIEROGLYPH U020", + description="EGYPTIAN HIEROGLYPH Z005A", direction="l", linebreak="al", - unicodeslot=0x13348, + unicodeslot=0x133F0, }, - [0x13349]={ + [0x133F1]={ category="lo", - description="EGYPTIAN HIEROGLYPH U021", + description="EGYPTIAN HIEROGLYPH Z006", direction="l", linebreak="al", - unicodeslot=0x13349, + unicodeslot=0x133F1, }, - [0x1334A]={ + [0x133F2]={ category="lo", - description="EGYPTIAN HIEROGLYPH U022", + description="EGYPTIAN HIEROGLYPH Z007", direction="l", linebreak="al", - unicodeslot=0x1334A, + unicodeslot=0x133F2, }, - [0x1334B]={ + [0x133F3]={ category="lo", - description="EGYPTIAN HIEROGLYPH U023", + description="EGYPTIAN HIEROGLYPH Z008", direction="l", linebreak="al", - unicodeslot=0x1334B, + unicodeslot=0x133F3, }, - [0x1334C]={ + [0x133F4]={ category="lo", - description="EGYPTIAN HIEROGLYPH U023A", + description="EGYPTIAN HIEROGLYPH Z009", direction="l", linebreak="al", - unicodeslot=0x1334C, + unicodeslot=0x133F4, }, - [0x1334D]={ + [0x133F5]={ category="lo", - description="EGYPTIAN HIEROGLYPH U024", + description="EGYPTIAN HIEROGLYPH Z010", direction="l", linebreak="al", - unicodeslot=0x1334D, + unicodeslot=0x133F5, }, - [0x1334E]={ + [0x133F6]={ category="lo", - description="EGYPTIAN HIEROGLYPH U025", + description="EGYPTIAN HIEROGLYPH Z011", direction="l", linebreak="al", - unicodeslot=0x1334E, + unicodeslot=0x133F6, }, - [0x1334F]={ + [0x133F7]={ category="lo", - description="EGYPTIAN HIEROGLYPH U026", + description="EGYPTIAN HIEROGLYPH Z012", direction="l", linebreak="al", - unicodeslot=0x1334F, + unicodeslot=0x133F7, }, - [0x13350]={ + [0x133F8]={ category="lo", - description="EGYPTIAN HIEROGLYPH U027", + description="EGYPTIAN HIEROGLYPH Z013", direction="l", linebreak="al", - unicodeslot=0x13350, + unicodeslot=0x133F8, }, - [0x13351]={ + [0x133F9]={ category="lo", - description="EGYPTIAN HIEROGLYPH U028", + description="EGYPTIAN HIEROGLYPH Z014", direction="l", linebreak="al", - unicodeslot=0x13351, + unicodeslot=0x133F9, }, - [0x13352]={ + [0x133FA]={ category="lo", - description="EGYPTIAN HIEROGLYPH U029", + description="EGYPTIAN HIEROGLYPH Z015", direction="l", linebreak="al", - unicodeslot=0x13352, + unicodeslot=0x133FA, }, - [0x13353]={ + [0x133FB]={ category="lo", - description="EGYPTIAN HIEROGLYPH U029A", + description="EGYPTIAN HIEROGLYPH Z015A", direction="l", linebreak="al", - unicodeslot=0x13353, + unicodeslot=0x133FB, }, - [0x13354]={ + [0x133FC]={ category="lo", - description="EGYPTIAN HIEROGLYPH U030", + description="EGYPTIAN HIEROGLYPH Z015B", direction="l", linebreak="al", - unicodeslot=0x13354, + unicodeslot=0x133FC, }, - [0x13355]={ + [0x133FD]={ category="lo", - description="EGYPTIAN HIEROGLYPH U031", + description="EGYPTIAN HIEROGLYPH Z015C", direction="l", linebreak="al", - unicodeslot=0x13355, + unicodeslot=0x133FD, }, - [0x13356]={ + [0x133FE]={ category="lo", - description="EGYPTIAN HIEROGLYPH U032", + description="EGYPTIAN HIEROGLYPH Z015D", direction="l", linebreak="al", - unicodeslot=0x13356, + unicodeslot=0x133FE, }, - [0x13357]={ + [0x133FF]={ category="lo", - description="EGYPTIAN HIEROGLYPH U032A", + description="EGYPTIAN HIEROGLYPH Z015E", direction="l", linebreak="al", - unicodeslot=0x13357, + unicodeslot=0x133FF, }, - [0x13358]={ + [0x13400]={ category="lo", - description="EGYPTIAN HIEROGLYPH U033", + description="EGYPTIAN HIEROGLYPH Z015F", direction="l", linebreak="al", - unicodeslot=0x13358, + unicodeslot=0x13400, }, - [0x13359]={ + [0x13401]={ category="lo", - description="EGYPTIAN HIEROGLYPH U034", + description="EGYPTIAN HIEROGLYPH Z015G", direction="l", linebreak="al", - unicodeslot=0x13359, + unicodeslot=0x13401, }, - [0x1335A]={ + [0x13402]={ category="lo", - description="EGYPTIAN HIEROGLYPH U035", + description="EGYPTIAN HIEROGLYPH Z015H", direction="l", linebreak="al", - unicodeslot=0x1335A, + unicodeslot=0x13402, }, - [0x1335B]={ + [0x13403]={ category="lo", - description="EGYPTIAN HIEROGLYPH U036", + description="EGYPTIAN HIEROGLYPH Z015I", direction="l", linebreak="al", - unicodeslot=0x1335B, + unicodeslot=0x13403, }, - [0x1335C]={ + [0x13404]={ category="lo", - description="EGYPTIAN HIEROGLYPH U037", + description="EGYPTIAN HIEROGLYPH Z016", direction="l", linebreak="al", - unicodeslot=0x1335C, + unicodeslot=0x13404, }, - [0x1335D]={ + [0x13405]={ category="lo", - description="EGYPTIAN HIEROGLYPH U038", + description="EGYPTIAN HIEROGLYPH Z016A", direction="l", linebreak="al", - unicodeslot=0x1335D, + unicodeslot=0x13405, }, - [0x1335E]={ + [0x13406]={ category="lo", - description="EGYPTIAN HIEROGLYPH U039", + description="EGYPTIAN HIEROGLYPH Z016B", direction="l", linebreak="al", - unicodeslot=0x1335E, + unicodeslot=0x13406, }, - [0x1335F]={ + [0x13407]={ category="lo", - description="EGYPTIAN HIEROGLYPH U040", + description="EGYPTIAN HIEROGLYPH Z016C", direction="l", linebreak="al", - unicodeslot=0x1335F, + unicodeslot=0x13407, }, - [0x13360]={ + [0x13408]={ category="lo", - description="EGYPTIAN HIEROGLYPH U041", + description="EGYPTIAN HIEROGLYPH Z016D", direction="l", linebreak="al", - unicodeslot=0x13360, + unicodeslot=0x13408, }, - [0x13361]={ + [0x13409]={ category="lo", - description="EGYPTIAN HIEROGLYPH U042", + description="EGYPTIAN HIEROGLYPH Z016E", direction="l", linebreak="al", - unicodeslot=0x13361, + unicodeslot=0x13409, }, - [0x13362]={ + [0x1340A]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001", + description="EGYPTIAN HIEROGLYPH Z016F", direction="l", linebreak="al", - unicodeslot=0x13362, + unicodeslot=0x1340A, }, - [0x13363]={ + [0x1340B]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001A", + description="EGYPTIAN HIEROGLYPH Z016G", direction="l", linebreak="al", - unicodeslot=0x13363, + unicodeslot=0x1340B, }, - [0x13364]={ + [0x1340C]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001B", + description="EGYPTIAN HIEROGLYPH Z016H", direction="l", linebreak="al", - unicodeslot=0x13364, + unicodeslot=0x1340C, }, - [0x13365]={ + [0x1340D]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001C", + description="EGYPTIAN HIEROGLYPH AA001", direction="l", linebreak="al", - unicodeslot=0x13365, + unicodeslot=0x1340D, }, - [0x13366]={ + [0x1340E]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001D", + description="EGYPTIAN HIEROGLYPH AA002", direction="l", linebreak="al", - unicodeslot=0x13366, + unicodeslot=0x1340E, }, - [0x13367]={ + [0x1340F]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001E", + description="EGYPTIAN HIEROGLYPH AA003", direction="l", linebreak="al", - unicodeslot=0x13367, + unicodeslot=0x1340F, }, - [0x13368]={ + [0x13410]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001F", + description="EGYPTIAN HIEROGLYPH AA004", direction="l", linebreak="al", - unicodeslot=0x13368, + unicodeslot=0x13410, }, - [0x13369]={ + [0x13411]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001G", + description="EGYPTIAN HIEROGLYPH AA005", direction="l", linebreak="al", - unicodeslot=0x13369, + unicodeslot=0x13411, }, - [0x1336A]={ + [0x13412]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001H", + description="EGYPTIAN HIEROGLYPH AA006", direction="l", linebreak="al", - unicodeslot=0x1336A, + unicodeslot=0x13412, }, - [0x1336B]={ + [0x13413]={ category="lo", - description="EGYPTIAN HIEROGLYPH V001I", + description="EGYPTIAN HIEROGLYPH AA007", direction="l", linebreak="al", - unicodeslot=0x1336B, + unicodeslot=0x13413, }, - [0x1336C]={ + [0x13414]={ category="lo", - description="EGYPTIAN HIEROGLYPH V002", + description="EGYPTIAN HIEROGLYPH AA007A", direction="l", linebreak="al", - unicodeslot=0x1336C, + unicodeslot=0x13414, }, - [0x1336D]={ + [0x13415]={ category="lo", - description="EGYPTIAN HIEROGLYPH V002A", + description="EGYPTIAN HIEROGLYPH AA007B", direction="l", linebreak="al", - unicodeslot=0x1336D, + unicodeslot=0x13415, }, - [0x1336E]={ + [0x13416]={ category="lo", - description="EGYPTIAN HIEROGLYPH V003", + description="EGYPTIAN HIEROGLYPH AA008", direction="l", linebreak="al", - unicodeslot=0x1336E, + unicodeslot=0x13416, }, - [0x1336F]={ + [0x13417]={ category="lo", - description="EGYPTIAN HIEROGLYPH V004", + description="EGYPTIAN HIEROGLYPH AA009", direction="l", linebreak="al", - unicodeslot=0x1336F, + unicodeslot=0x13417, }, - [0x13370]={ + [0x13418]={ category="lo", - description="EGYPTIAN HIEROGLYPH V005", + description="EGYPTIAN HIEROGLYPH AA010", direction="l", linebreak="al", - unicodeslot=0x13370, + unicodeslot=0x13418, }, - [0x13371]={ + [0x13419]={ category="lo", - description="EGYPTIAN HIEROGLYPH V006", + description="EGYPTIAN HIEROGLYPH AA011", direction="l", linebreak="al", - unicodeslot=0x13371, + unicodeslot=0x13419, }, - [0x13372]={ + [0x1341A]={ category="lo", - description="EGYPTIAN HIEROGLYPH V007", + description="EGYPTIAN HIEROGLYPH AA012", direction="l", linebreak="al", - unicodeslot=0x13372, + unicodeslot=0x1341A, }, - [0x13373]={ + [0x1341B]={ category="lo", - description="EGYPTIAN HIEROGLYPH V007A", + description="EGYPTIAN HIEROGLYPH AA013", direction="l", linebreak="al", - unicodeslot=0x13373, + unicodeslot=0x1341B, }, - [0x13374]={ + [0x1341C]={ category="lo", - description="EGYPTIAN HIEROGLYPH V007B", + description="EGYPTIAN HIEROGLYPH AA014", direction="l", linebreak="al", - unicodeslot=0x13374, + unicodeslot=0x1341C, }, - [0x13375]={ + [0x1341D]={ category="lo", - description="EGYPTIAN HIEROGLYPH V008", + description="EGYPTIAN HIEROGLYPH AA015", direction="l", linebreak="al", - unicodeslot=0x13375, + unicodeslot=0x1341D, }, - [0x13376]={ + [0x1341E]={ category="lo", - description="EGYPTIAN HIEROGLYPH V009", + description="EGYPTIAN HIEROGLYPH AA016", direction="l", linebreak="al", - unicodeslot=0x13376, + unicodeslot=0x1341E, }, - [0x13377]={ + [0x1341F]={ category="lo", - description="EGYPTIAN HIEROGLYPH V010", + description="EGYPTIAN HIEROGLYPH AA017", direction="l", linebreak="al", - unicodeslot=0x13377, + unicodeslot=0x1341F, }, - [0x13378]={ + [0x13420]={ category="lo", - description="EGYPTIAN HIEROGLYPH V011", + description="EGYPTIAN HIEROGLYPH AA018", direction="l", linebreak="al", - unicodeslot=0x13378, + unicodeslot=0x13420, }, - [0x13379]={ + [0x13421]={ category="lo", - description="EGYPTIAN HIEROGLYPH V011A", + description="EGYPTIAN HIEROGLYPH AA019", direction="l", - linebreak="op", - unicodeslot=0x13379, + linebreak="al", + unicodeslot=0x13421, }, - [0x1337A]={ + [0x13422]={ category="lo", - description="EGYPTIAN HIEROGLYPH V011B", + description="EGYPTIAN HIEROGLYPH AA020", direction="l", - linebreak="cl", - unicodeslot=0x1337A, + linebreak="al", + unicodeslot=0x13422, }, - [0x1337B]={ + [0x13423]={ category="lo", - description="EGYPTIAN HIEROGLYPH V011C", + description="EGYPTIAN HIEROGLYPH AA021", direction="l", - linebreak="cl", - unicodeslot=0x1337B, + linebreak="al", + unicodeslot=0x13423, }, - [0x1337C]={ + [0x13424]={ category="lo", - description="EGYPTIAN HIEROGLYPH V012", + description="EGYPTIAN HIEROGLYPH AA022", direction="l", linebreak="al", - unicodeslot=0x1337C, + unicodeslot=0x13424, }, - [0x1337D]={ + [0x13425]={ category="lo", - description="EGYPTIAN HIEROGLYPH V012A", + description="EGYPTIAN HIEROGLYPH AA023", direction="l", linebreak="al", - unicodeslot=0x1337D, + unicodeslot=0x13425, }, - [0x1337E]={ + [0x13426]={ category="lo", - description="EGYPTIAN HIEROGLYPH V012B", + description="EGYPTIAN HIEROGLYPH AA024", direction="l", linebreak="al", - unicodeslot=0x1337E, + unicodeslot=0x13426, }, - [0x1337F]={ + [0x13427]={ category="lo", - description="EGYPTIAN HIEROGLYPH V013", + description="EGYPTIAN HIEROGLYPH AA025", direction="l", linebreak="al", - unicodeslot=0x1337F, + unicodeslot=0x13427, }, - [0x13380]={ + [0x13428]={ category="lo", - description="EGYPTIAN HIEROGLYPH V014", + description="EGYPTIAN HIEROGLYPH AA026", direction="l", linebreak="al", - unicodeslot=0x13380, + unicodeslot=0x13428, }, - [0x13381]={ + [0x13429]={ category="lo", - description="EGYPTIAN HIEROGLYPH V015", + description="EGYPTIAN HIEROGLYPH AA027", direction="l", linebreak="al", - unicodeslot=0x13381, + unicodeslot=0x13429, }, - [0x13382]={ + [0x1342A]={ category="lo", - description="EGYPTIAN HIEROGLYPH V016", + description="EGYPTIAN HIEROGLYPH AA028", direction="l", linebreak="al", - unicodeslot=0x13382, + unicodeslot=0x1342A, }, - [0x13383]={ + [0x1342B]={ category="lo", - description="EGYPTIAN HIEROGLYPH V017", + description="EGYPTIAN HIEROGLYPH AA029", direction="l", linebreak="al", - unicodeslot=0x13383, + unicodeslot=0x1342B, }, - [0x13384]={ + [0x1342C]={ category="lo", - description="EGYPTIAN HIEROGLYPH V018", + description="EGYPTIAN HIEROGLYPH AA030", direction="l", linebreak="al", - unicodeslot=0x13384, + unicodeslot=0x1342C, }, - [0x13385]={ + [0x1342D]={ category="lo", - description="EGYPTIAN HIEROGLYPH V019", + description="EGYPTIAN HIEROGLYPH AA031", direction="l", linebreak="al", - unicodeslot=0x13385, + unicodeslot=0x1342D, }, - [0x13386]={ + [0x1342E]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020", + description="EGYPTIAN HIEROGLYPH AA032", direction="l", linebreak="al", - unicodeslot=0x13386, + unicodeslot=0x1342E, }, - [0x13387]={ + [0x16800]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020A", + description="BAMUM LETTER PHASE-A NGKUE MFON", direction="l", linebreak="al", - unicodeslot=0x13387, + unicodeslot=0x16800, }, - [0x13388]={ + [0x16801]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020B", + description="BAMUM LETTER PHASE-A GBIEE FON", direction="l", linebreak="al", - unicodeslot=0x13388, + unicodeslot=0x16801, }, - [0x13389]={ + [0x16802]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020C", + description="BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE", direction="l", linebreak="al", - unicodeslot=0x13389, + unicodeslot=0x16802, }, - [0x1338A]={ + [0x16803]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020D", + description="BAMUM LETTER PHASE-A PON MFON PIPAEMBA", direction="l", linebreak="al", - unicodeslot=0x1338A, + unicodeslot=0x16803, }, - [0x1338B]={ + [0x16804]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020E", + description="BAMUM LETTER PHASE-A NAA MFON", direction="l", linebreak="al", - unicodeslot=0x1338B, + unicodeslot=0x16804, }, - [0x1338C]={ + [0x16805]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020F", + description="BAMUM LETTER PHASE-A SHUENSHUET", direction="l", linebreak="al", - unicodeslot=0x1338C, + unicodeslot=0x16805, }, - [0x1338D]={ + [0x16806]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020G", + description="BAMUM LETTER PHASE-A TITA MFON", direction="l", linebreak="al", - unicodeslot=0x1338D, + unicodeslot=0x16806, }, - [0x1338E]={ + [0x16807]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020H", + description="BAMUM LETTER PHASE-A NZA MFON", direction="l", linebreak="al", - unicodeslot=0x1338E, + unicodeslot=0x16807, }, - [0x1338F]={ + [0x16808]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020I", + description="BAMUM LETTER PHASE-A SHINDA PA NJI", direction="l", linebreak="al", - unicodeslot=0x1338F, + unicodeslot=0x16808, }, - [0x13390]={ + [0x16809]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020J", + description="BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE", direction="l", linebreak="al", - unicodeslot=0x13390, + unicodeslot=0x16809, }, - [0x13391]={ + [0x1680A]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020K", + description="BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA", direction="l", linebreak="al", - unicodeslot=0x13391, + unicodeslot=0x1680A, }, - [0x13392]={ + [0x1680B]={ category="lo", - description="EGYPTIAN HIEROGLYPH V020L", + description="BAMUM LETTER PHASE-A MAEMBGBIEE", direction="l", linebreak="al", - unicodeslot=0x13392, + unicodeslot=0x1680B, }, - [0x13393]={ + [0x1680C]={ category="lo", - description="EGYPTIAN HIEROGLYPH V021", + description="BAMUM LETTER PHASE-A TU MAEMBA", direction="l", linebreak="al", - unicodeslot=0x13393, + unicodeslot=0x1680C, }, - [0x13394]={ + [0x1680D]={ category="lo", - description="EGYPTIAN HIEROGLYPH V022", + description="BAMUM LETTER PHASE-A NGANGU", direction="l", linebreak="al", - unicodeslot=0x13394, + unicodeslot=0x1680D, }, - [0x13395]={ + [0x1680E]={ category="lo", - description="EGYPTIAN HIEROGLYPH V023", + description="BAMUM LETTER PHASE-A MAEMVEUX", direction="l", linebreak="al", - unicodeslot=0x13395, + unicodeslot=0x1680E, }, - [0x13396]={ + [0x1680F]={ category="lo", - description="EGYPTIAN HIEROGLYPH V023A", + description="BAMUM LETTER PHASE-A MANSUAE", direction="l", linebreak="al", - unicodeslot=0x13396, + unicodeslot=0x1680F, }, - [0x13397]={ + [0x16810]={ category="lo", - description="EGYPTIAN HIEROGLYPH V024", + description="BAMUM LETTER PHASE-A MVEUAENGAM", direction="l", linebreak="al", - unicodeslot=0x13397, + unicodeslot=0x16810, }, - [0x13398]={ + [0x16811]={ category="lo", - description="EGYPTIAN HIEROGLYPH V025", + description="BAMUM LETTER PHASE-A SEUNYAM", direction="l", linebreak="al", - unicodeslot=0x13398, + unicodeslot=0x16811, }, - [0x13399]={ + [0x16812]={ category="lo", - description="EGYPTIAN HIEROGLYPH V026", + description="BAMUM LETTER PHASE-A NTOQPEN", direction="l", linebreak="al", - unicodeslot=0x13399, + unicodeslot=0x16812, }, - [0x1339A]={ + [0x16813]={ category="lo", - description="EGYPTIAN HIEROGLYPH V027", + description="BAMUM LETTER PHASE-A KEUKEUTNDA", direction="l", linebreak="al", - unicodeslot=0x1339A, + unicodeslot=0x16813, }, - [0x1339B]={ + [0x16814]={ category="lo", - description="EGYPTIAN HIEROGLYPH V028", + description="BAMUM LETTER PHASE-A NKINDI", direction="l", linebreak="al", - unicodeslot=0x1339B, + unicodeslot=0x16814, }, - [0x1339C]={ + [0x16815]={ category="lo", - description="EGYPTIAN HIEROGLYPH V028A", + description="BAMUM LETTER PHASE-A SUU", direction="l", linebreak="al", - unicodeslot=0x1339C, + unicodeslot=0x16815, }, - [0x1339D]={ + [0x16816]={ category="lo", - description="EGYPTIAN HIEROGLYPH V029", + description="BAMUM LETTER PHASE-A NGKUENZEUM", direction="l", linebreak="al", - unicodeslot=0x1339D, + unicodeslot=0x16816, }, - [0x1339E]={ + [0x16817]={ category="lo", - description="EGYPTIAN HIEROGLYPH V029A", + description="BAMUM LETTER PHASE-A LAPAQ", direction="l", linebreak="al", - unicodeslot=0x1339E, + unicodeslot=0x16817, }, - [0x1339F]={ + [0x16818]={ category="lo", - description="EGYPTIAN HIEROGLYPH V030", + description="BAMUM LETTER PHASE-A LET KUT", direction="l", linebreak="al", - unicodeslot=0x1339F, + unicodeslot=0x16818, }, - [0x133A0]={ + [0x16819]={ category="lo", - description="EGYPTIAN HIEROGLYPH V030A", + description="BAMUM LETTER PHASE-A NTAP MFAA", direction="l", linebreak="al", - unicodeslot=0x133A0, + unicodeslot=0x16819, }, - [0x133A1]={ + [0x1681A]={ category="lo", - description="EGYPTIAN HIEROGLYPH V031", + description="BAMUM LETTER PHASE-A MAEKEUP", direction="l", linebreak="al", - unicodeslot=0x133A1, + unicodeslot=0x1681A, }, - [0x133A2]={ + [0x1681B]={ category="lo", - description="EGYPTIAN HIEROGLYPH V031A", + description="BAMUM LETTER PHASE-A PASHAE", direction="l", linebreak="al", - unicodeslot=0x133A2, + unicodeslot=0x1681B, }, - [0x133A3]={ + [0x1681C]={ category="lo", - description="EGYPTIAN HIEROGLYPH V032", + description="BAMUM LETTER PHASE-A GHEUAERAE", direction="l", linebreak="al", - unicodeslot=0x133A3, + unicodeslot=0x1681C, }, - [0x133A4]={ + [0x1681D]={ category="lo", - description="EGYPTIAN HIEROGLYPH V033", + description="BAMUM LETTER PHASE-A PAMSHAE", direction="l", linebreak="al", - unicodeslot=0x133A4, + unicodeslot=0x1681D, }, - [0x133A5]={ + [0x1681E]={ category="lo", - description="EGYPTIAN HIEROGLYPH V033A", + description="BAMUM LETTER PHASE-A MON NGGEUAET", direction="l", linebreak="al", - unicodeslot=0x133A5, + unicodeslot=0x1681E, }, - [0x133A6]={ + [0x1681F]={ category="lo", - description="EGYPTIAN HIEROGLYPH V034", + description="BAMUM LETTER PHASE-A NZUN MEUT", direction="l", linebreak="al", - unicodeslot=0x133A6, + unicodeslot=0x1681F, }, - [0x133A7]={ + [0x16820]={ category="lo", - description="EGYPTIAN HIEROGLYPH V035", + description="BAMUM LETTER PHASE-A U YUQ NAE", direction="l", linebreak="al", - unicodeslot=0x133A7, + unicodeslot=0x16820, }, - [0x133A8]={ + [0x16821]={ category="lo", - description="EGYPTIAN HIEROGLYPH V036", + description="BAMUM LETTER PHASE-A GHEUAEGHEUAE", direction="l", linebreak="al", - unicodeslot=0x133A8, + unicodeslot=0x16821, }, - [0x133A9]={ + [0x16822]={ category="lo", - description="EGYPTIAN HIEROGLYPH V037", + description="BAMUM LETTER PHASE-A NTAP NTAA", direction="l", linebreak="al", - unicodeslot=0x133A9, + unicodeslot=0x16822, }, - [0x133AA]={ + [0x16823]={ category="lo", - description="EGYPTIAN HIEROGLYPH V037A", + description="BAMUM LETTER PHASE-A SISA", direction="l", linebreak="al", - unicodeslot=0x133AA, + unicodeslot=0x16823, }, - [0x133AB]={ + [0x16824]={ category="lo", - description="EGYPTIAN HIEROGLYPH V038", + description="BAMUM LETTER PHASE-A MGBASA", direction="l", linebreak="al", - unicodeslot=0x133AB, + unicodeslot=0x16824, }, - [0x133AC]={ + [0x16825]={ category="lo", - description="EGYPTIAN HIEROGLYPH V039", + description="BAMUM LETTER PHASE-A MEUNJOMNDEUQ", direction="l", linebreak="al", - unicodeslot=0x133AC, + unicodeslot=0x16825, }, - [0x133AD]={ + [0x16826]={ category="lo", - description="EGYPTIAN HIEROGLYPH V040", + description="BAMUM LETTER PHASE-A MOOMPUQ", direction="l", linebreak="al", - unicodeslot=0x133AD, + unicodeslot=0x16826, }, - [0x133AE]={ + [0x16827]={ category="lo", - description="EGYPTIAN HIEROGLYPH V040A", + description="BAMUM LETTER PHASE-A KAFA", direction="l", linebreak="al", - unicodeslot=0x133AE, + unicodeslot=0x16827, }, - [0x133AF]={ + [0x16828]={ category="lo", - description="EGYPTIAN HIEROGLYPH W001", + description="BAMUM LETTER PHASE-A PA LEERAEWA", direction="l", linebreak="al", - unicodeslot=0x133AF, + unicodeslot=0x16828, }, - [0x133B0]={ + [0x16829]={ category="lo", - description="EGYPTIAN HIEROGLYPH W002", + description="BAMUM LETTER PHASE-A NDA LEERAEWA", direction="l", linebreak="al", - unicodeslot=0x133B0, + unicodeslot=0x16829, }, - [0x133B1]={ + [0x1682A]={ category="lo", - description="EGYPTIAN HIEROGLYPH W003", + description="BAMUM LETTER PHASE-A PET", direction="l", linebreak="al", - unicodeslot=0x133B1, + unicodeslot=0x1682A, }, - [0x133B2]={ + [0x1682B]={ category="lo", - description="EGYPTIAN HIEROGLYPH W003A", + description="BAMUM LETTER PHASE-A MAEMKPEN", direction="l", linebreak="al", - unicodeslot=0x133B2, + unicodeslot=0x1682B, }, - [0x133B3]={ + [0x1682C]={ category="lo", - description="EGYPTIAN HIEROGLYPH W004", + description="BAMUM LETTER PHASE-A NIKA", direction="l", linebreak="al", - unicodeslot=0x133B3, + unicodeslot=0x1682C, }, - [0x133B4]={ + [0x1682D]={ category="lo", - description="EGYPTIAN HIEROGLYPH W005", + description="BAMUM LETTER PHASE-A PUP", direction="l", linebreak="al", - unicodeslot=0x133B4, + unicodeslot=0x1682D, }, - [0x133B5]={ + [0x1682E]={ category="lo", - description="EGYPTIAN HIEROGLYPH W006", + description="BAMUM LETTER PHASE-A TUAEP", direction="l", linebreak="al", - unicodeslot=0x133B5, + unicodeslot=0x1682E, }, - [0x133B6]={ + [0x1682F]={ category="lo", - description="EGYPTIAN HIEROGLYPH W007", + description="BAMUM LETTER PHASE-A LUAEP", direction="l", linebreak="al", - unicodeslot=0x133B6, + unicodeslot=0x1682F, }, - [0x133B7]={ + [0x16830]={ category="lo", - description="EGYPTIAN HIEROGLYPH W008", + description="BAMUM LETTER PHASE-A SONJAM", direction="l", linebreak="al", - unicodeslot=0x133B7, + unicodeslot=0x16830, }, - [0x133B8]={ + [0x16831]={ category="lo", - description="EGYPTIAN HIEROGLYPH W009", + description="BAMUM LETTER PHASE-A TEUTEUWEN", direction="l", linebreak="al", - unicodeslot=0x133B8, + unicodeslot=0x16831, }, - [0x133B9]={ + [0x16832]={ category="lo", - description="EGYPTIAN HIEROGLYPH W009A", + description="BAMUM LETTER PHASE-A MAENYI", direction="l", linebreak="al", - unicodeslot=0x133B9, + unicodeslot=0x16832, }, - [0x133BA]={ + [0x16833]={ category="lo", - description="EGYPTIAN HIEROGLYPH W010", + description="BAMUM LETTER PHASE-A KET", direction="l", linebreak="al", - unicodeslot=0x133BA, + unicodeslot=0x16833, }, - [0x133BB]={ + [0x16834]={ category="lo", - description="EGYPTIAN HIEROGLYPH W010A", + description="BAMUM LETTER PHASE-A NDAANGGEUAET", direction="l", linebreak="al", - unicodeslot=0x133BB, + unicodeslot=0x16834, }, - [0x133BC]={ + [0x16835]={ category="lo", - description="EGYPTIAN HIEROGLYPH W011", + description="BAMUM LETTER PHASE-A KUOQ", direction="l", linebreak="al", - unicodeslot=0x133BC, + unicodeslot=0x16835, }, - [0x133BD]={ + [0x16836]={ category="lo", - description="EGYPTIAN HIEROGLYPH W012", + description="BAMUM LETTER PHASE-A MOOMEUT", direction="l", linebreak="al", - unicodeslot=0x133BD, + unicodeslot=0x16836, }, - [0x133BE]={ + [0x16837]={ category="lo", - description="EGYPTIAN HIEROGLYPH W013", + description="BAMUM LETTER PHASE-A SHUM", direction="l", linebreak="al", - unicodeslot=0x133BE, + unicodeslot=0x16837, }, - [0x133BF]={ + [0x16838]={ category="lo", - description="EGYPTIAN HIEROGLYPH W014", + description="BAMUM LETTER PHASE-A LOMMAE", direction="l", linebreak="al", - unicodeslot=0x133BF, + unicodeslot=0x16838, }, - [0x133C0]={ + [0x16839]={ category="lo", - description="EGYPTIAN HIEROGLYPH W014A", + description="BAMUM LETTER PHASE-A FIRI", direction="l", linebreak="al", - unicodeslot=0x133C0, + unicodeslot=0x16839, }, - [0x133C1]={ + [0x1683A]={ category="lo", - description="EGYPTIAN HIEROGLYPH W015", + description="BAMUM LETTER PHASE-A ROM", direction="l", linebreak="al", - unicodeslot=0x133C1, + unicodeslot=0x1683A, }, - [0x133C2]={ + [0x1683B]={ category="lo", - description="EGYPTIAN HIEROGLYPH W016", + description="BAMUM LETTER PHASE-A KPOQ", direction="l", linebreak="al", - unicodeslot=0x133C2, + unicodeslot=0x1683B, }, - [0x133C3]={ + [0x1683C]={ category="lo", - description="EGYPTIAN HIEROGLYPH W017", + description="BAMUM LETTER PHASE-A SOQ", direction="l", linebreak="al", - unicodeslot=0x133C3, + unicodeslot=0x1683C, }, - [0x133C4]={ + [0x1683D]={ category="lo", - description="EGYPTIAN HIEROGLYPH W017A", + description="BAMUM LETTER PHASE-A MAP PIEET", direction="l", linebreak="al", - unicodeslot=0x133C4, + unicodeslot=0x1683D, }, - [0x133C5]={ + [0x1683E]={ category="lo", - description="EGYPTIAN HIEROGLYPH W018", + description="BAMUM LETTER PHASE-A SHIRAE", direction="l", linebreak="al", - unicodeslot=0x133C5, + unicodeslot=0x1683E, }, - [0x133C6]={ + [0x1683F]={ category="lo", - description="EGYPTIAN HIEROGLYPH W018A", + description="BAMUM LETTER PHASE-A NTAP", direction="l", linebreak="al", - unicodeslot=0x133C6, + unicodeslot=0x1683F, }, - [0x133C7]={ + [0x16840]={ category="lo", - description="EGYPTIAN HIEROGLYPH W019", + description="BAMUM LETTER PHASE-A SHOQ NSHUT YUM", direction="l", linebreak="al", - unicodeslot=0x133C7, + unicodeslot=0x16840, }, - [0x133C8]={ + [0x16841]={ category="lo", - description="EGYPTIAN HIEROGLYPH W020", + description="BAMUM LETTER PHASE-A NYIT MONGKEUAEQ", direction="l", linebreak="al", - unicodeslot=0x133C8, + unicodeslot=0x16841, }, - [0x133C9]={ + [0x16842]={ category="lo", - description="EGYPTIAN HIEROGLYPH W021", + description="BAMUM LETTER PHASE-A PAARAE", direction="l", linebreak="al", - unicodeslot=0x133C9, + unicodeslot=0x16842, }, - [0x133CA]={ + [0x16843]={ category="lo", - description="EGYPTIAN HIEROGLYPH W022", + description="BAMUM LETTER PHASE-A NKAARAE", direction="l", linebreak="al", - unicodeslot=0x133CA, + unicodeslot=0x16843, }, - [0x133CB]={ + [0x16844]={ category="lo", - description="EGYPTIAN HIEROGLYPH W023", + description="BAMUM LETTER PHASE-A UNKNOWN", direction="l", linebreak="al", - unicodeslot=0x133CB, + unicodeslot=0x16844, }, - [0x133CC]={ + [0x16845]={ category="lo", - description="EGYPTIAN HIEROGLYPH W024", + description="BAMUM LETTER PHASE-A NGGEN", direction="l", linebreak="al", - unicodeslot=0x133CC, + unicodeslot=0x16845, }, - [0x133CD]={ + [0x16846]={ category="lo", - description="EGYPTIAN HIEROGLYPH W024A", + description="BAMUM LETTER PHASE-A MAESI", direction="l", linebreak="al", - unicodeslot=0x133CD, + unicodeslot=0x16846, }, - [0x133CE]={ + [0x16847]={ category="lo", - description="EGYPTIAN HIEROGLYPH W025", + description="BAMUM LETTER PHASE-A NJAM", direction="l", linebreak="al", - unicodeslot=0x133CE, + unicodeslot=0x16847, }, - [0x133CF]={ + [0x16848]={ category="lo", - description="EGYPTIAN HIEROGLYPH X001", + description="BAMUM LETTER PHASE-A MBANYI", direction="l", linebreak="al", - unicodeslot=0x133CF, + unicodeslot=0x16848, }, - [0x133D0]={ + [0x16849]={ category="lo", - description="EGYPTIAN HIEROGLYPH X002", + description="BAMUM LETTER PHASE-A NYET", direction="l", linebreak="al", - unicodeslot=0x133D0, + unicodeslot=0x16849, }, - [0x133D1]={ + [0x1684A]={ category="lo", - description="EGYPTIAN HIEROGLYPH X003", + description="BAMUM LETTER PHASE-A TEUAEN", direction="l", linebreak="al", - unicodeslot=0x133D1, + unicodeslot=0x1684A, }, - [0x133D2]={ + [0x1684B]={ category="lo", - description="EGYPTIAN HIEROGLYPH X004", + description="BAMUM LETTER PHASE-A SOT", direction="l", linebreak="al", - unicodeslot=0x133D2, + unicodeslot=0x1684B, }, - [0x133D3]={ + [0x1684C]={ category="lo", - description="EGYPTIAN HIEROGLYPH X004A", + description="BAMUM LETTER PHASE-A PAAM", direction="l", linebreak="al", - unicodeslot=0x133D3, + unicodeslot=0x1684C, }, - [0x133D4]={ + [0x1684D]={ category="lo", - description="EGYPTIAN HIEROGLYPH X004B", + description="BAMUM LETTER PHASE-A NSHIEE", direction="l", linebreak="al", - unicodeslot=0x133D4, + unicodeslot=0x1684D, }, - [0x133D5]={ + [0x1684E]={ category="lo", - description="EGYPTIAN HIEROGLYPH X005", + description="BAMUM LETTER PHASE-A MAEM", direction="l", linebreak="al", - unicodeslot=0x133D5, + unicodeslot=0x1684E, }, - [0x133D6]={ + [0x1684F]={ category="lo", - description="EGYPTIAN HIEROGLYPH X006", + description="BAMUM LETTER PHASE-A NYI", direction="l", linebreak="al", - unicodeslot=0x133D6, + unicodeslot=0x1684F, }, - [0x133D7]={ + [0x16850]={ category="lo", - description="EGYPTIAN HIEROGLYPH X006A", + description="BAMUM LETTER PHASE-A KAQ", direction="l", linebreak="al", - unicodeslot=0x133D7, + unicodeslot=0x16850, }, - [0x133D8]={ + [0x16851]={ category="lo", - description="EGYPTIAN HIEROGLYPH X007", + description="BAMUM LETTER PHASE-A NSHA", direction="l", linebreak="al", - unicodeslot=0x133D8, + unicodeslot=0x16851, }, - [0x133D9]={ + [0x16852]={ category="lo", - description="EGYPTIAN HIEROGLYPH X008", + description="BAMUM LETTER PHASE-A VEE", direction="l", linebreak="al", - unicodeslot=0x133D9, + unicodeslot=0x16852, }, - [0x133DA]={ + [0x16853]={ category="lo", - description="EGYPTIAN HIEROGLYPH X008A", + description="BAMUM LETTER PHASE-A LU", direction="l", linebreak="al", - unicodeslot=0x133DA, + unicodeslot=0x16853, }, - [0x133DB]={ + [0x16854]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y001", + description="BAMUM LETTER PHASE-A NEN", direction="l", linebreak="al", - unicodeslot=0x133DB, + unicodeslot=0x16854, }, - [0x133DC]={ + [0x16855]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y001A", + description="BAMUM LETTER PHASE-A NAQ", direction="l", linebreak="al", - unicodeslot=0x133DC, + unicodeslot=0x16855, }, - [0x133DD]={ + [0x16856]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y002", + description="BAMUM LETTER PHASE-A MBAQ", direction="l", linebreak="al", - unicodeslot=0x133DD, + unicodeslot=0x16856, }, - [0x133DE]={ + [0x16857]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y003", + description="BAMUM LETTER PHASE-B NSHUET", direction="l", linebreak="al", - unicodeslot=0x133DE, + unicodeslot=0x16857, }, - [0x133DF]={ + [0x16858]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y004", + description="BAMUM LETTER PHASE-B TU MAEMGBIEE", direction="l", linebreak="al", - unicodeslot=0x133DF, + unicodeslot=0x16858, }, - [0x133E0]={ + [0x16859]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y005", + description="BAMUM LETTER PHASE-B SIEE", direction="l", linebreak="al", - unicodeslot=0x133E0, + unicodeslot=0x16859, }, - [0x133E1]={ + [0x1685A]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y006", + description="BAMUM LETTER PHASE-B SET TU", direction="l", linebreak="al", - unicodeslot=0x133E1, + unicodeslot=0x1685A, }, - [0x133E2]={ + [0x1685B]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y007", + description="BAMUM LETTER PHASE-B LOM NTEUM", direction="l", linebreak="al", - unicodeslot=0x133E2, + unicodeslot=0x1685B, }, - [0x133E3]={ + [0x1685C]={ category="lo", - description="EGYPTIAN HIEROGLYPH Y008", + description="BAMUM LETTER PHASE-B MBA MAELEE", direction="l", linebreak="al", - unicodeslot=0x133E3, + unicodeslot=0x1685C, }, - [0x133E4]={ + [0x1685D]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z001", + description="BAMUM LETTER PHASE-B KIEEM", direction="l", linebreak="al", - unicodeslot=0x133E4, + unicodeslot=0x1685D, }, - [0x133E5]={ + [0x1685E]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z002", + description="BAMUM LETTER PHASE-B YEURAE", direction="l", linebreak="al", - unicodeslot=0x133E5, + unicodeslot=0x1685E, }, - [0x133E6]={ + [0x1685F]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z002A", + description="BAMUM LETTER PHASE-B MBAARAE", direction="l", linebreak="al", - unicodeslot=0x133E6, + unicodeslot=0x1685F, }, - [0x133E7]={ + [0x16860]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z002B", + description="BAMUM LETTER PHASE-B KAM", direction="l", linebreak="al", - unicodeslot=0x133E7, + unicodeslot=0x16860, }, - [0x133E8]={ + [0x16861]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z002C", + description="BAMUM LETTER PHASE-B PEESHI", direction="l", linebreak="al", - unicodeslot=0x133E8, + unicodeslot=0x16861, }, - [0x133E9]={ + [0x16862]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z002D", + description="BAMUM LETTER PHASE-B YAFU LEERAEWA", direction="l", linebreak="al", - unicodeslot=0x133E9, + unicodeslot=0x16862, }, - [0x133EA]={ + [0x16863]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z003", + description="BAMUM LETTER PHASE-B LAM NSHUT NYAM", direction="l", linebreak="al", - unicodeslot=0x133EA, + unicodeslot=0x16863, }, - [0x133EB]={ + [0x16864]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z003A", + description="BAMUM LETTER PHASE-B NTIEE SHEUOQ", direction="l", linebreak="al", - unicodeslot=0x133EB, + unicodeslot=0x16864, }, - [0x133EC]={ + [0x16865]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z003B", + description="BAMUM LETTER PHASE-B NDU NJAA", direction="l", linebreak="al", - unicodeslot=0x133EC, + unicodeslot=0x16865, }, - [0x133ED]={ + [0x16866]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z004", + description="BAMUM LETTER PHASE-B GHEUGHEUAEM", direction="l", linebreak="al", - unicodeslot=0x133ED, + unicodeslot=0x16866, }, - [0x133EE]={ + [0x16867]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z004A", + description="BAMUM LETTER PHASE-B PIT", direction="l", linebreak="al", - unicodeslot=0x133EE, + unicodeslot=0x16867, }, - [0x133EF]={ + [0x16868]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z005", + description="BAMUM LETTER PHASE-B TU NSIEE", direction="l", linebreak="al", - unicodeslot=0x133EF, + unicodeslot=0x16868, }, - [0x133F0]={ + [0x16869]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z005A", + description="BAMUM LETTER PHASE-B SHET NJAQ", direction="l", linebreak="al", - unicodeslot=0x133F0, + unicodeslot=0x16869, }, - [0x133F1]={ + [0x1686A]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z006", + description="BAMUM LETTER PHASE-B SHEUAEQTU", direction="l", linebreak="al", - unicodeslot=0x133F1, + unicodeslot=0x1686A, }, - [0x133F2]={ + [0x1686B]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z007", + description="BAMUM LETTER PHASE-B MFON TEUAEQ", direction="l", linebreak="al", - unicodeslot=0x133F2, + unicodeslot=0x1686B, }, - [0x133F3]={ + [0x1686C]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z008", + description="BAMUM LETTER PHASE-B MBIT MBAAKET", direction="l", linebreak="al", - unicodeslot=0x133F3, + unicodeslot=0x1686C, }, - [0x133F4]={ + [0x1686D]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z009", + description="BAMUM LETTER PHASE-B NYI NTEUM", direction="l", linebreak="al", - unicodeslot=0x133F4, + unicodeslot=0x1686D, }, - [0x133F5]={ + [0x1686E]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z010", + description="BAMUM LETTER PHASE-B KEUPUQ", direction="l", linebreak="al", - unicodeslot=0x133F5, + unicodeslot=0x1686E, }, - [0x133F6]={ + [0x1686F]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z011", + description="BAMUM LETTER PHASE-B GHEUGHEN", direction="l", linebreak="al", - unicodeslot=0x133F6, + unicodeslot=0x1686F, }, - [0x133F7]={ + [0x16870]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z012", + description="BAMUM LETTER PHASE-B KEUYEUX", direction="l", linebreak="al", - unicodeslot=0x133F7, + unicodeslot=0x16870, }, - [0x133F8]={ + [0x16871]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z013", + description="BAMUM LETTER PHASE-B LAANAE", direction="l", linebreak="al", - unicodeslot=0x133F8, + unicodeslot=0x16871, }, - [0x133F9]={ + [0x16872]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z014", + description="BAMUM LETTER PHASE-B PARUM", direction="l", linebreak="al", - unicodeslot=0x133F9, + unicodeslot=0x16872, }, - [0x133FA]={ + [0x16873]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015", + description="BAMUM LETTER PHASE-B VEUM", direction="l", linebreak="al", - unicodeslot=0x133FA, + unicodeslot=0x16873, }, - [0x133FB]={ + [0x16874]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015A", + description="BAMUM LETTER PHASE-B NGKINDI MVOP", direction="l", linebreak="al", - unicodeslot=0x133FB, + unicodeslot=0x16874, }, - [0x133FC]={ + [0x16875]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015B", + description="BAMUM LETTER PHASE-B NGGEU MBU", direction="l", linebreak="al", - unicodeslot=0x133FC, + unicodeslot=0x16875, }, - [0x133FD]={ + [0x16876]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015C", + description="BAMUM LETTER PHASE-B WUAET", direction="l", linebreak="al", - unicodeslot=0x133FD, + unicodeslot=0x16876, }, - [0x133FE]={ + [0x16877]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015D", + description="BAMUM LETTER PHASE-B SAKEUAE", direction="l", linebreak="al", - unicodeslot=0x133FE, + unicodeslot=0x16877, }, - [0x133FF]={ + [0x16878]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015E", + description="BAMUM LETTER PHASE-B TAAM", direction="l", linebreak="al", - unicodeslot=0x133FF, + unicodeslot=0x16878, }, - [0x13400]={ + [0x16879]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015F", + description="BAMUM LETTER PHASE-B MEUQ", direction="l", linebreak="al", - unicodeslot=0x13400, + unicodeslot=0x16879, }, - [0x13401]={ + [0x1687A]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015G", + description="BAMUM LETTER PHASE-B NGGUOQ", direction="l", linebreak="al", - unicodeslot=0x13401, + unicodeslot=0x1687A, }, - [0x13402]={ + [0x1687B]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015H", + description="BAMUM LETTER PHASE-B NGGUOQ LARGE", direction="l", linebreak="al", - unicodeslot=0x13402, + unicodeslot=0x1687B, }, - [0x13403]={ + [0x1687C]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z015I", + description="BAMUM LETTER PHASE-B MFIYAQ", direction="l", linebreak="al", - unicodeslot=0x13403, + unicodeslot=0x1687C, }, - [0x13404]={ + [0x1687D]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016", + description="BAMUM LETTER PHASE-B SUE", direction="l", linebreak="al", - unicodeslot=0x13404, + unicodeslot=0x1687D, }, - [0x13405]={ + [0x1687E]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016A", + description="BAMUM LETTER PHASE-B MBEURI", direction="l", linebreak="al", - unicodeslot=0x13405, + unicodeslot=0x1687E, }, - [0x13406]={ + [0x1687F]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016B", + description="BAMUM LETTER PHASE-B MONTIEEN", direction="l", linebreak="al", - unicodeslot=0x13406, + unicodeslot=0x1687F, }, - [0x13407]={ + [0x16880]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016C", + description="BAMUM LETTER PHASE-B NYAEMAE", direction="l", linebreak="al", - unicodeslot=0x13407, + unicodeslot=0x16880, }, - [0x13408]={ + [0x16881]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016D", + description="BAMUM LETTER PHASE-B PUNGAAM", direction="l", linebreak="al", - unicodeslot=0x13408, + unicodeslot=0x16881, }, - [0x13409]={ + [0x16882]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016E", + description="BAMUM LETTER PHASE-B MEUT NGGEET", direction="l", linebreak="al", - unicodeslot=0x13409, + unicodeslot=0x16882, }, - [0x1340A]={ + [0x16883]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016F", + description="BAMUM LETTER PHASE-B FEUX", direction="l", linebreak="al", - unicodeslot=0x1340A, + unicodeslot=0x16883, }, - [0x1340B]={ + [0x16884]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016G", + description="BAMUM LETTER PHASE-B MBUOQ", direction="l", linebreak="al", - unicodeslot=0x1340B, + unicodeslot=0x16884, }, - [0x1340C]={ + [0x16885]={ category="lo", - description="EGYPTIAN HIEROGLYPH Z016H", + description="BAMUM LETTER PHASE-B FEE", direction="l", linebreak="al", - unicodeslot=0x1340C, + unicodeslot=0x16885, }, - [0x1340D]={ + [0x16886]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA001", + description="BAMUM LETTER PHASE-B KEUAEM", direction="l", linebreak="al", - unicodeslot=0x1340D, + unicodeslot=0x16886, }, - [0x1340E]={ + [0x16887]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA002", + description="BAMUM LETTER PHASE-B MA NJEUAENA", direction="l", linebreak="al", - unicodeslot=0x1340E, + unicodeslot=0x16887, }, - [0x1340F]={ + [0x16888]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA003", + description="BAMUM LETTER PHASE-B MA NJUQA", direction="l", linebreak="al", - unicodeslot=0x1340F, + unicodeslot=0x16888, }, - [0x13410]={ + [0x16889]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA004", + description="BAMUM LETTER PHASE-B LET", direction="l", linebreak="al", - unicodeslot=0x13410, + unicodeslot=0x16889, }, - [0x13411]={ + [0x1688A]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA005", + description="BAMUM LETTER PHASE-B NGGAAM", direction="l", linebreak="al", - unicodeslot=0x13411, + unicodeslot=0x1688A, }, - [0x13412]={ + [0x1688B]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA006", + description="BAMUM LETTER PHASE-B NSEN", direction="l", linebreak="al", - unicodeslot=0x13412, + unicodeslot=0x1688B, }, - [0x13413]={ + [0x1688C]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA007", + description="BAMUM LETTER PHASE-B MA", direction="l", linebreak="al", - unicodeslot=0x13413, + unicodeslot=0x1688C, }, - [0x13414]={ + [0x1688D]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA007A", + description="BAMUM LETTER PHASE-B KIQ", direction="l", linebreak="al", - unicodeslot=0x13414, + unicodeslot=0x1688D, }, - [0x13415]={ + [0x1688E]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA007B", + description="BAMUM LETTER PHASE-B NGOM", direction="l", linebreak="al", - unicodeslot=0x13415, + unicodeslot=0x1688E, }, - [0x13416]={ + [0x1688F]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA008", + description="BAMUM LETTER PHASE-C NGKUE MAEMBA", direction="l", linebreak="al", - unicodeslot=0x13416, + unicodeslot=0x1688F, }, - [0x13417]={ + [0x16890]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA009", + description="BAMUM LETTER PHASE-C NZA", direction="l", linebreak="al", - unicodeslot=0x13417, + unicodeslot=0x16890, }, - [0x13418]={ + [0x16891]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA010", + description="BAMUM LETTER PHASE-C YUM", direction="l", linebreak="al", - unicodeslot=0x13418, + unicodeslot=0x16891, }, - [0x13419]={ + [0x16892]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA011", + description="BAMUM LETTER PHASE-C WANGKUOQ", direction="l", linebreak="al", - unicodeslot=0x13419, + unicodeslot=0x16892, }, - [0x1341A]={ + [0x16893]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA012", + description="BAMUM LETTER PHASE-C NGGEN", direction="l", linebreak="al", - unicodeslot=0x1341A, + unicodeslot=0x16893, }, - [0x1341B]={ + [0x16894]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA013", + description="BAMUM LETTER PHASE-C NDEUAEREE", direction="l", linebreak="al", - unicodeslot=0x1341B, + unicodeslot=0x16894, }, - [0x1341C]={ + [0x16895]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA014", + description="BAMUM LETTER PHASE-C NGKAQ", direction="l", linebreak="al", - unicodeslot=0x1341C, + unicodeslot=0x16895, }, - [0x1341D]={ + [0x16896]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA015", + description="BAMUM LETTER PHASE-C GHARAE", direction="l", linebreak="al", - unicodeslot=0x1341D, + unicodeslot=0x16896, }, - [0x1341E]={ + [0x16897]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA016", + description="BAMUM LETTER PHASE-C MBEEKEET", direction="l", linebreak="al", - unicodeslot=0x1341E, + unicodeslot=0x16897, }, - [0x1341F]={ + [0x16898]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA017", + description="BAMUM LETTER PHASE-C GBAYI", direction="l", linebreak="al", - unicodeslot=0x1341F, + unicodeslot=0x16898, }, - [0x13420]={ + [0x16899]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA018", + description="BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN", direction="l", linebreak="al", - unicodeslot=0x13420, + unicodeslot=0x16899, }, - [0x13421]={ + [0x1689A]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA019", + description="BAMUM LETTER PHASE-C NTU MBIT", direction="l", linebreak="al", - unicodeslot=0x13421, + unicodeslot=0x1689A, }, - [0x13422]={ + [0x1689B]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA020", + description="BAMUM LETTER PHASE-C MBEUM", direction="l", linebreak="al", - unicodeslot=0x13422, + unicodeslot=0x1689B, }, - [0x13423]={ + [0x1689C]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA021", + description="BAMUM LETTER PHASE-C PIRIEEN", direction="l", linebreak="al", - unicodeslot=0x13423, + unicodeslot=0x1689C, }, - [0x13424]={ + [0x1689D]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA022", + description="BAMUM LETTER PHASE-C NDOMBU", direction="l", linebreak="al", - unicodeslot=0x13424, + unicodeslot=0x1689D, }, - [0x13425]={ + [0x1689E]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA023", + description="BAMUM LETTER PHASE-C MBAA CABBAGE-TREE", direction="l", linebreak="al", - unicodeslot=0x13425, + unicodeslot=0x1689E, }, - [0x13426]={ + [0x1689F]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA024", + description="BAMUM LETTER PHASE-C KEUSHEUAEP", direction="l", linebreak="al", - unicodeslot=0x13426, + unicodeslot=0x1689F, }, - [0x13427]={ + [0x168A0]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA025", + description="BAMUM LETTER PHASE-C GHAP", direction="l", linebreak="al", - unicodeslot=0x13427, + unicodeslot=0x168A0, }, - [0x13428]={ + [0x168A1]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA026", + description="BAMUM LETTER PHASE-C KEUKAQ", direction="l", linebreak="al", - unicodeslot=0x13428, + unicodeslot=0x168A1, }, - [0x13429]={ + [0x168A2]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA027", + description="BAMUM LETTER PHASE-C YU MUOMAE", direction="l", linebreak="al", - unicodeslot=0x13429, + unicodeslot=0x168A2, }, - [0x1342A]={ + [0x168A3]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA028", + description="BAMUM LETTER PHASE-C NZEUM", direction="l", linebreak="al", - unicodeslot=0x1342A, + unicodeslot=0x168A3, }, - [0x1342B]={ + [0x168A4]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA029", + description="BAMUM LETTER PHASE-C MBUE", direction="l", linebreak="al", - unicodeslot=0x1342B, + unicodeslot=0x168A4, }, - [0x1342C]={ + [0x168A5]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA030", + description="BAMUM LETTER PHASE-C NSEUAEN", direction="l", linebreak="al", - unicodeslot=0x1342C, + unicodeslot=0x168A5, }, - [0x1342D]={ + [0x168A6]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA031", + description="BAMUM LETTER PHASE-C MBIT", direction="l", linebreak="al", - unicodeslot=0x1342D, + unicodeslot=0x168A6, }, - [0x1342E]={ + [0x168A7]={ category="lo", - description="EGYPTIAN HIEROGLYPH AA032", + description="BAMUM LETTER PHASE-C YEUQ", direction="l", linebreak="al", - unicodeslot=0x1342E, + unicodeslot=0x168A7, }, - [0x16800]={ + [0x168A8]={ category="lo", - description="BAMUM LETTER PHASE-A NGKUE MFON", + description="BAMUM LETTER PHASE-C KPARAQ", direction="l", linebreak="al", - unicodeslot=0x16800, + unicodeslot=0x168A8, }, - [0x16801]={ + [0x168A9]={ category="lo", - description="BAMUM LETTER PHASE-A GBIEE FON", + description="BAMUM LETTER PHASE-C KAA", direction="l", linebreak="al", - unicodeslot=0x16801, + unicodeslot=0x168A9, }, - [0x16802]={ + [0x168AA]={ category="lo", - description="BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE", + description="BAMUM LETTER PHASE-C SEUX", direction="l", linebreak="al", - unicodeslot=0x16802, + unicodeslot=0x168AA, }, - [0x16803]={ + [0x168AB]={ category="lo", - description="BAMUM LETTER PHASE-A PON MFON PIPAEMBA", + description="BAMUM LETTER PHASE-C NDIDA", direction="l", linebreak="al", - unicodeslot=0x16803, + unicodeslot=0x168AB, }, - [0x16804]={ + [0x168AC]={ category="lo", - description="BAMUM LETTER PHASE-A NAA MFON", + description="BAMUM LETTER PHASE-C TAASHAE", direction="l", linebreak="al", - unicodeslot=0x16804, + unicodeslot=0x168AC, }, - [0x16805]={ + [0x168AD]={ category="lo", - description="BAMUM LETTER PHASE-A SHUENSHUET", + description="BAMUM LETTER PHASE-C NJUEQ", direction="l", linebreak="al", - unicodeslot=0x16805, + unicodeslot=0x168AD, }, - [0x16806]={ + [0x168AE]={ category="lo", - description="BAMUM LETTER PHASE-A TITA MFON", + description="BAMUM LETTER PHASE-C TITA YUE", direction="l", linebreak="al", - unicodeslot=0x16806, + unicodeslot=0x168AE, }, - [0x16807]={ + [0x168AF]={ category="lo", - description="BAMUM LETTER PHASE-A NZA MFON", + description="BAMUM LETTER PHASE-C SUAET", direction="l", linebreak="al", - unicodeslot=0x16807, + unicodeslot=0x168AF, }, - [0x16808]={ + [0x168B0]={ category="lo", - description="BAMUM LETTER PHASE-A SHINDA PA NJI", + description="BAMUM LETTER PHASE-C NGGUAEN NYAM", direction="l", linebreak="al", - unicodeslot=0x16808, + unicodeslot=0x168B0, }, - [0x16809]={ + [0x168B1]={ category="lo", - description="BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE", + description="BAMUM LETTER PHASE-C VEUX", direction="l", linebreak="al", - unicodeslot=0x16809, + unicodeslot=0x168B1, }, - [0x1680A]={ + [0x168B2]={ category="lo", - description="BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA", + description="BAMUM LETTER PHASE-C NANSANAQ", direction="l", linebreak="al", - unicodeslot=0x1680A, + unicodeslot=0x168B2, }, - [0x1680B]={ + [0x168B3]={ category="lo", - description="BAMUM LETTER PHASE-A MAEMBGBIEE", + description="BAMUM LETTER PHASE-C MA KEUAERI", direction="l", linebreak="al", - unicodeslot=0x1680B, + unicodeslot=0x168B3, }, - [0x1680C]={ + [0x168B4]={ category="lo", - description="BAMUM LETTER PHASE-A TU MAEMBA", + description="BAMUM LETTER PHASE-C NTAA", direction="l", linebreak="al", - unicodeslot=0x1680C, + unicodeslot=0x168B4, }, - [0x1680D]={ + [0x168B5]={ category="lo", - description="BAMUM LETTER PHASE-A NGANGU", + description="BAMUM LETTER PHASE-C NGGUON", direction="l", linebreak="al", - unicodeslot=0x1680D, + unicodeslot=0x168B5, }, - [0x1680E]={ + [0x168B6]={ category="lo", - description="BAMUM LETTER PHASE-A MAEMVEUX", + description="BAMUM LETTER PHASE-C LAP", direction="l", linebreak="al", - unicodeslot=0x1680E, + unicodeslot=0x168B6, }, - [0x1680F]={ + [0x168B7]={ category="lo", - description="BAMUM LETTER PHASE-A MANSUAE", + description="BAMUM LETTER PHASE-C MBIRIEEN", direction="l", linebreak="al", - unicodeslot=0x1680F, + unicodeslot=0x168B7, }, - [0x16810]={ + [0x168B8]={ category="lo", - description="BAMUM LETTER PHASE-A MVEUAENGAM", + description="BAMUM LETTER PHASE-C MGBASAQ", direction="l", linebreak="al", - unicodeslot=0x16810, + unicodeslot=0x168B8, }, - [0x16811]={ + [0x168B9]={ category="lo", - description="BAMUM LETTER PHASE-A SEUNYAM", + description="BAMUM LETTER PHASE-C NTEUNGBA", direction="l", linebreak="al", - unicodeslot=0x16811, + unicodeslot=0x168B9, }, - [0x16812]={ + [0x168BA]={ category="lo", - description="BAMUM LETTER PHASE-A NTOQPEN", + description="BAMUM LETTER PHASE-C TEUTEUX", direction="l", linebreak="al", - unicodeslot=0x16812, + unicodeslot=0x168BA, }, - [0x16813]={ + [0x168BB]={ category="lo", - description="BAMUM LETTER PHASE-A KEUKEUTNDA", + description="BAMUM LETTER PHASE-C NGGUM", direction="l", linebreak="al", - unicodeslot=0x16813, + unicodeslot=0x168BB, }, - [0x16814]={ + [0x168BC]={ category="lo", - description="BAMUM LETTER PHASE-A NKINDI", + description="BAMUM LETTER PHASE-C FUE", direction="l", linebreak="al", - unicodeslot=0x16814, + unicodeslot=0x168BC, }, - [0x16815]={ + [0x168BD]={ category="lo", - description="BAMUM LETTER PHASE-A SUU", + description="BAMUM LETTER PHASE-C NDEUT", direction="l", linebreak="al", - unicodeslot=0x16815, + unicodeslot=0x168BD, }, - [0x16816]={ + [0x168BE]={ category="lo", - description="BAMUM LETTER PHASE-A NGKUENZEUM", + description="BAMUM LETTER PHASE-C NSA", direction="l", linebreak="al", - unicodeslot=0x16816, + unicodeslot=0x168BE, }, - [0x16817]={ + [0x168BF]={ category="lo", - description="BAMUM LETTER PHASE-A LAPAQ", + description="BAMUM LETTER PHASE-C NSHAQ", direction="l", linebreak="al", - unicodeslot=0x16817, + unicodeslot=0x168BF, }, - [0x16818]={ + [0x168C0]={ category="lo", - description="BAMUM LETTER PHASE-A LET KUT", + description="BAMUM LETTER PHASE-C BUNG", direction="l", linebreak="al", - unicodeslot=0x16818, + unicodeslot=0x168C0, }, - [0x16819]={ + [0x168C1]={ category="lo", - description="BAMUM LETTER PHASE-A NTAP MFAA", + description="BAMUM LETTER PHASE-C VEUAEPEN", direction="l", linebreak="al", - unicodeslot=0x16819, + unicodeslot=0x168C1, }, - [0x1681A]={ + [0x168C2]={ category="lo", - description="BAMUM LETTER PHASE-A MAEKEUP", + description="BAMUM LETTER PHASE-C MBERAE", direction="l", linebreak="al", - unicodeslot=0x1681A, + unicodeslot=0x168C2, }, - [0x1681B]={ + [0x168C3]={ category="lo", - description="BAMUM LETTER PHASE-A PASHAE", + description="BAMUM LETTER PHASE-C RU", direction="l", linebreak="al", - unicodeslot=0x1681B, + unicodeslot=0x168C3, }, - [0x1681C]={ + [0x168C4]={ category="lo", - description="BAMUM LETTER PHASE-A GHEUAERAE", + description="BAMUM LETTER PHASE-C NJAEM", direction="l", linebreak="al", - unicodeslot=0x1681C, + unicodeslot=0x168C4, }, - [0x1681D]={ + [0x168C5]={ category="lo", - description="BAMUM LETTER PHASE-A PAMSHAE", + description="BAMUM LETTER PHASE-C LAM", direction="l", linebreak="al", - unicodeslot=0x1681D, + unicodeslot=0x168C5, }, - [0x1681E]={ + [0x168C6]={ category="lo", - description="BAMUM LETTER PHASE-A MON NGGEUAET", + description="BAMUM LETTER PHASE-C TITUAEP", direction="l", linebreak="al", - unicodeslot=0x1681E, + unicodeslot=0x168C6, }, - [0x1681F]={ + [0x168C7]={ category="lo", - description="BAMUM LETTER PHASE-A NZUN MEUT", + description="BAMUM LETTER PHASE-C NSUOT NGOM", direction="l", linebreak="al", - unicodeslot=0x1681F, + unicodeslot=0x168C7, }, - [0x16820]={ + [0x168C8]={ category="lo", - description="BAMUM LETTER PHASE-A U YUQ NAE", + description="BAMUM LETTER PHASE-C NJEEEE", direction="l", linebreak="al", - unicodeslot=0x16820, + unicodeslot=0x168C8, }, - [0x16821]={ + [0x168C9]={ category="lo", - description="BAMUM LETTER PHASE-A GHEUAEGHEUAE", + description="BAMUM LETTER PHASE-C KET", direction="l", linebreak="al", - unicodeslot=0x16821, + unicodeslot=0x168C9, }, - [0x16822]={ + [0x168CA]={ category="lo", - description="BAMUM LETTER PHASE-A NTAP NTAA", + description="BAMUM LETTER PHASE-C NGGU", direction="l", linebreak="al", - unicodeslot=0x16822, + unicodeslot=0x168CA, }, - [0x16823]={ + [0x168CB]={ category="lo", - description="BAMUM LETTER PHASE-A SISA", + description="BAMUM LETTER PHASE-C MAESI", direction="l", linebreak="al", - unicodeslot=0x16823, + unicodeslot=0x168CB, }, - [0x16824]={ + [0x168CC]={ category="lo", - description="BAMUM LETTER PHASE-A MGBASA", + description="BAMUM LETTER PHASE-C MBUAEM", direction="l", linebreak="al", - unicodeslot=0x16824, + unicodeslot=0x168CC, }, - [0x16825]={ + [0x168CD]={ category="lo", - description="BAMUM LETTER PHASE-A MEUNJOMNDEUQ", + description="BAMUM LETTER PHASE-C LU", direction="l", linebreak="al", - unicodeslot=0x16825, + unicodeslot=0x168CD, }, - [0x16826]={ + [0x168CE]={ category="lo", - description="BAMUM LETTER PHASE-A MOOMPUQ", + description="BAMUM LETTER PHASE-C KUT", direction="l", linebreak="al", - unicodeslot=0x16826, + unicodeslot=0x168CE, }, - [0x16827]={ + [0x168CF]={ category="lo", - description="BAMUM LETTER PHASE-A KAFA", + description="BAMUM LETTER PHASE-C NJAM", direction="l", linebreak="al", - unicodeslot=0x16827, + unicodeslot=0x168CF, }, - [0x16828]={ + [0x168D0]={ category="lo", - description="BAMUM LETTER PHASE-A PA LEERAEWA", + description="BAMUM LETTER PHASE-C NGOM", direction="l", linebreak="al", - unicodeslot=0x16828, + unicodeslot=0x168D0, }, - [0x16829]={ + [0x168D1]={ category="lo", - description="BAMUM LETTER PHASE-A NDA LEERAEWA", + description="BAMUM LETTER PHASE-C WUP", direction="l", linebreak="al", - unicodeslot=0x16829, + unicodeslot=0x168D1, }, - [0x1682A]={ + [0x168D2]={ category="lo", - description="BAMUM LETTER PHASE-A PET", + description="BAMUM LETTER PHASE-C NGGUEET", direction="l", linebreak="al", - unicodeslot=0x1682A, + unicodeslot=0x168D2, }, - [0x1682B]={ + [0x168D3]={ category="lo", - description="BAMUM LETTER PHASE-A MAEMKPEN", + description="BAMUM LETTER PHASE-C NSOM", direction="l", linebreak="al", - unicodeslot=0x1682B, + unicodeslot=0x168D3, }, - [0x1682C]={ + [0x168D4]={ category="lo", - description="BAMUM LETTER PHASE-A NIKA", + description="BAMUM LETTER PHASE-C NTEN", direction="l", linebreak="al", - unicodeslot=0x1682C, + unicodeslot=0x168D4, }, - [0x1682D]={ + [0x168D5]={ category="lo", - description="BAMUM LETTER PHASE-A PUP", + description="BAMUM LETTER PHASE-C KUOP NKAARAE", direction="l", linebreak="al", - unicodeslot=0x1682D, + unicodeslot=0x168D5, }, - [0x1682E]={ + [0x168D6]={ category="lo", - description="BAMUM LETTER PHASE-A TUAEP", + description="BAMUM LETTER PHASE-C NSUN", direction="l", linebreak="al", - unicodeslot=0x1682E, + unicodeslot=0x168D6, }, - [0x1682F]={ + [0x168D7]={ category="lo", - description="BAMUM LETTER PHASE-A LUAEP", + description="BAMUM LETTER PHASE-C NDAM", direction="l", linebreak="al", - unicodeslot=0x1682F, + unicodeslot=0x168D7, }, - [0x16830]={ + [0x168D8]={ category="lo", - description="BAMUM LETTER PHASE-A SONJAM", + description="BAMUM LETTER PHASE-C MA NSIEE", direction="l", linebreak="al", - unicodeslot=0x16830, + unicodeslot=0x168D8, }, - [0x16831]={ + [0x168D9]={ category="lo", - description="BAMUM LETTER PHASE-A TEUTEUWEN", + description="BAMUM LETTER PHASE-C YAA", direction="l", linebreak="al", - unicodeslot=0x16831, + unicodeslot=0x168D9, }, - [0x16832]={ + [0x168DA]={ category="lo", - description="BAMUM LETTER PHASE-A MAENYI", + description="BAMUM LETTER PHASE-C NDAP", direction="l", linebreak="al", - unicodeslot=0x16832, + unicodeslot=0x168DA, }, - [0x16833]={ + [0x168DB]={ category="lo", - description="BAMUM LETTER PHASE-A KET", + description="BAMUM LETTER PHASE-C SHUEQ", direction="l", linebreak="al", - unicodeslot=0x16833, + unicodeslot=0x168DB, }, - [0x16834]={ + [0x168DC]={ category="lo", - description="BAMUM LETTER PHASE-A NDAANGGEUAET", + description="BAMUM LETTER PHASE-C SETFON", direction="l", linebreak="al", - unicodeslot=0x16834, + unicodeslot=0x168DC, }, - [0x16835]={ + [0x168DD]={ category="lo", - description="BAMUM LETTER PHASE-A KUOQ", + description="BAMUM LETTER PHASE-C MBI", direction="l", linebreak="al", - unicodeslot=0x16835, + unicodeslot=0x168DD, }, - [0x16836]={ + [0x168DE]={ category="lo", - description="BAMUM LETTER PHASE-A MOOMEUT", + description="BAMUM LETTER PHASE-C MAEMBA", direction="l", linebreak="al", - unicodeslot=0x16836, + unicodeslot=0x168DE, }, - [0x16837]={ + [0x168DF]={ category="lo", - description="BAMUM LETTER PHASE-A SHUM", + description="BAMUM LETTER PHASE-C MBANYI", direction="l", linebreak="al", - unicodeslot=0x16837, + unicodeslot=0x168DF, }, - [0x16838]={ + [0x168E0]={ category="lo", - description="BAMUM LETTER PHASE-A LOMMAE", + description="BAMUM LETTER PHASE-C KEUSEUX", direction="l", linebreak="al", - unicodeslot=0x16838, + unicodeslot=0x168E0, }, - [0x16839]={ + [0x168E1]={ category="lo", - description="BAMUM LETTER PHASE-A FIRI", + description="BAMUM LETTER PHASE-C MBEUX", direction="l", linebreak="al", - unicodeslot=0x16839, + unicodeslot=0x168E1, }, - [0x1683A]={ + [0x168E2]={ category="lo", - description="BAMUM LETTER PHASE-A ROM", + description="BAMUM LETTER PHASE-C KEUM", direction="l", linebreak="al", - unicodeslot=0x1683A, + unicodeslot=0x168E2, }, - [0x1683B]={ + [0x168E3]={ category="lo", - description="BAMUM LETTER PHASE-A KPOQ", + description="BAMUM LETTER PHASE-C MBAA PICKET", direction="l", linebreak="al", - unicodeslot=0x1683B, + unicodeslot=0x168E3, }, - [0x1683C]={ + [0x168E4]={ category="lo", - description="BAMUM LETTER PHASE-A SOQ", + description="BAMUM LETTER PHASE-C YUWOQ", direction="l", linebreak="al", - unicodeslot=0x1683C, + unicodeslot=0x168E4, }, - [0x1683D]={ + [0x168E5]={ category="lo", - description="BAMUM LETTER PHASE-A MAP PIEET", + description="BAMUM LETTER PHASE-C NJEUX", direction="l", linebreak="al", - unicodeslot=0x1683D, + unicodeslot=0x168E5, }, - [0x1683E]={ + [0x168E6]={ category="lo", - description="BAMUM LETTER PHASE-A SHIRAE", + description="BAMUM LETTER PHASE-C MIEE", direction="l", linebreak="al", - unicodeslot=0x1683E, + unicodeslot=0x168E6, }, - [0x1683F]={ + [0x168E7]={ category="lo", - description="BAMUM LETTER PHASE-A NTAP", + description="BAMUM LETTER PHASE-C MUAE", direction="l", linebreak="al", - unicodeslot=0x1683F, + unicodeslot=0x168E7, }, - [0x16840]={ + [0x168E8]={ category="lo", - description="BAMUM LETTER PHASE-A SHOQ NSHUT YUM", + description="BAMUM LETTER PHASE-C SHIQ", direction="l", linebreak="al", - unicodeslot=0x16840, + unicodeslot=0x168E8, }, - [0x16841]={ + [0x168E9]={ category="lo", - description="BAMUM LETTER PHASE-A NYIT MONGKEUAEQ", + description="BAMUM LETTER PHASE-C KEN LAW", direction="l", linebreak="al", - unicodeslot=0x16841, + unicodeslot=0x168E9, }, - [0x16842]={ + [0x168EA]={ category="lo", - description="BAMUM LETTER PHASE-A PAARAE", + description="BAMUM LETTER PHASE-C KEN FATIGUE", direction="l", linebreak="al", - unicodeslot=0x16842, + unicodeslot=0x168EA, }, - [0x16843]={ + [0x168EB]={ category="lo", - description="BAMUM LETTER PHASE-A NKAARAE", + description="BAMUM LETTER PHASE-C NGAQ", direction="l", linebreak="al", - unicodeslot=0x16843, + unicodeslot=0x168EB, }, - [0x16844]={ + [0x168EC]={ category="lo", - description="BAMUM LETTER PHASE-A UNKNOWN", + description="BAMUM LETTER PHASE-C NAQ", direction="l", linebreak="al", - unicodeslot=0x16844, + unicodeslot=0x168EC, }, - [0x16845]={ + [0x168ED]={ category="lo", - description="BAMUM LETTER PHASE-A NGGEN", + description="BAMUM LETTER PHASE-C LIQ", direction="l", linebreak="al", - unicodeslot=0x16845, + unicodeslot=0x168ED, }, - [0x16846]={ + [0x168EE]={ category="lo", - description="BAMUM LETTER PHASE-A MAESI", + description="BAMUM LETTER PHASE-C PIN", direction="l", linebreak="al", - unicodeslot=0x16846, + unicodeslot=0x168EE, }, - [0x16847]={ + [0x168EF]={ category="lo", - description="BAMUM LETTER PHASE-A NJAM", + description="BAMUM LETTER PHASE-C PEN", direction="l", linebreak="al", - unicodeslot=0x16847, + unicodeslot=0x168EF, }, - [0x16848]={ + [0x168F0]={ category="lo", - description="BAMUM LETTER PHASE-A MBANYI", + description="BAMUM LETTER PHASE-C TET", direction="l", linebreak="al", - unicodeslot=0x16848, + unicodeslot=0x168F0, }, - [0x16849]={ + [0x168F1]={ category="lo", - description="BAMUM LETTER PHASE-A NYET", + description="BAMUM LETTER PHASE-D MBUO", direction="l", linebreak="al", - unicodeslot=0x16849, + unicodeslot=0x168F1, }, - [0x1684A]={ + [0x168F2]={ category="lo", - description="BAMUM LETTER PHASE-A TEUAEN", + description="BAMUM LETTER PHASE-D WAP", direction="l", linebreak="al", - unicodeslot=0x1684A, + unicodeslot=0x168F2, }, - [0x1684B]={ + [0x168F3]={ category="lo", - description="BAMUM LETTER PHASE-A SOT", + description="BAMUM LETTER PHASE-D NJI", direction="l", linebreak="al", - unicodeslot=0x1684B, + unicodeslot=0x168F3, }, - [0x1684C]={ + [0x168F4]={ category="lo", - description="BAMUM LETTER PHASE-A PAAM", + description="BAMUM LETTER PHASE-D MFON", direction="l", linebreak="al", - unicodeslot=0x1684C, + unicodeslot=0x168F4, }, - [0x1684D]={ + [0x168F5]={ category="lo", - description="BAMUM LETTER PHASE-A NSHIEE", + description="BAMUM LETTER PHASE-D NJIEE", direction="l", linebreak="al", - unicodeslot=0x1684D, + unicodeslot=0x168F5, }, - [0x1684E]={ + [0x168F6]={ category="lo", - description="BAMUM LETTER PHASE-A MAEM", + description="BAMUM LETTER PHASE-D LIEE", direction="l", linebreak="al", - unicodeslot=0x1684E, + unicodeslot=0x168F6, }, - [0x1684F]={ + [0x168F7]={ category="lo", - description="BAMUM LETTER PHASE-A NYI", + description="BAMUM LETTER PHASE-D NJEUT", direction="l", linebreak="al", - unicodeslot=0x1684F, + unicodeslot=0x168F7, }, - [0x16850]={ + [0x168F8]={ category="lo", - description="BAMUM LETTER PHASE-A KAQ", + description="BAMUM LETTER PHASE-D NSHEE", direction="l", linebreak="al", - unicodeslot=0x16850, + unicodeslot=0x168F8, }, - [0x16851]={ + [0x168F9]={ category="lo", - description="BAMUM LETTER PHASE-A NSHA", + description="BAMUM LETTER PHASE-D NGGAAMAE", direction="l", linebreak="al", - unicodeslot=0x16851, + unicodeslot=0x168F9, }, - [0x16852]={ + [0x168FA]={ category="lo", - description="BAMUM LETTER PHASE-A VEE", + description="BAMUM LETTER PHASE-D NYAM", direction="l", linebreak="al", - unicodeslot=0x16852, + unicodeslot=0x168FA, }, - [0x16853]={ + [0x168FB]={ category="lo", - description="BAMUM LETTER PHASE-A LU", + description="BAMUM LETTER PHASE-D WUAEN", direction="l", linebreak="al", - unicodeslot=0x16853, + unicodeslot=0x168FB, }, - [0x16854]={ + [0x168FC]={ category="lo", - description="BAMUM LETTER PHASE-A NEN", + description="BAMUM LETTER PHASE-D NGKUN", direction="l", linebreak="al", - unicodeslot=0x16854, + unicodeslot=0x168FC, }, - [0x16855]={ + [0x168FD]={ category="lo", - description="BAMUM LETTER PHASE-A NAQ", + description="BAMUM LETTER PHASE-D SHEE", direction="l", linebreak="al", - unicodeslot=0x16855, + unicodeslot=0x168FD, }, - [0x16856]={ + [0x168FE]={ category="lo", - description="BAMUM LETTER PHASE-A MBAQ", + description="BAMUM LETTER PHASE-D NGKAP", direction="l", linebreak="al", - unicodeslot=0x16856, + unicodeslot=0x168FE, }, - [0x16857]={ + [0x168FF]={ category="lo", - description="BAMUM LETTER PHASE-B NSHUET", + description="BAMUM LETTER PHASE-D KEUAETMEUN", direction="l", linebreak="al", - unicodeslot=0x16857, + unicodeslot=0x168FF, }, - [0x16858]={ + [0x16900]={ category="lo", - description="BAMUM LETTER PHASE-B TU MAEMGBIEE", + description="BAMUM LETTER PHASE-D TEUT", direction="l", linebreak="al", - unicodeslot=0x16858, + unicodeslot=0x16900, }, - [0x16859]={ + [0x16901]={ category="lo", - description="BAMUM LETTER PHASE-B SIEE", + description="BAMUM LETTER PHASE-D SHEUAE", direction="l", linebreak="al", - unicodeslot=0x16859, + unicodeslot=0x16901, }, - [0x1685A]={ + [0x16902]={ category="lo", - description="BAMUM LETTER PHASE-B SET TU", + description="BAMUM LETTER PHASE-D NJAP", direction="l", linebreak="al", - unicodeslot=0x1685A, + unicodeslot=0x16902, }, - [0x1685B]={ + [0x16903]={ category="lo", - description="BAMUM LETTER PHASE-B LOM NTEUM", + description="BAMUM LETTER PHASE-D SUE", direction="l", linebreak="al", - unicodeslot=0x1685B, + unicodeslot=0x16903, }, - [0x1685C]={ + [0x16904]={ category="lo", - description="BAMUM LETTER PHASE-B MBA MAELEE", + description="BAMUM LETTER PHASE-D KET", direction="l", linebreak="al", - unicodeslot=0x1685C, + unicodeslot=0x16904, }, - [0x1685D]={ + [0x16905]={ category="lo", - description="BAMUM LETTER PHASE-B KIEEM", + description="BAMUM LETTER PHASE-D YAEMMAE", direction="l", linebreak="al", - unicodeslot=0x1685D, + unicodeslot=0x16905, }, - [0x1685E]={ + [0x16906]={ category="lo", - description="BAMUM LETTER PHASE-B YEURAE", + description="BAMUM LETTER PHASE-D KUOM", direction="l", linebreak="al", - unicodeslot=0x1685E, + unicodeslot=0x16906, }, - [0x1685F]={ + [0x16907]={ category="lo", - description="BAMUM LETTER PHASE-B MBAARAE", + description="BAMUM LETTER PHASE-D SAP", direction="l", linebreak="al", - unicodeslot=0x1685F, + unicodeslot=0x16907, }, - [0x16860]={ + [0x16908]={ category="lo", - description="BAMUM LETTER PHASE-B KAM", + description="BAMUM LETTER PHASE-D MFEUT", direction="l", linebreak="al", - unicodeslot=0x16860, + unicodeslot=0x16908, }, - [0x16861]={ + [0x16909]={ category="lo", - description="BAMUM LETTER PHASE-B PEESHI", + description="BAMUM LETTER PHASE-D NDEUX", direction="l", linebreak="al", - unicodeslot=0x16861, + unicodeslot=0x16909, }, - [0x16862]={ + [0x1690A]={ category="lo", - description="BAMUM LETTER PHASE-B YAFU LEERAEWA", + description="BAMUM LETTER PHASE-D MALEERI", direction="l", linebreak="al", - unicodeslot=0x16862, + unicodeslot=0x1690A, }, - [0x16863]={ + [0x1690B]={ category="lo", - description="BAMUM LETTER PHASE-B LAM NSHUT NYAM", + description="BAMUM LETTER PHASE-D MEUT", direction="l", linebreak="al", - unicodeslot=0x16863, + unicodeslot=0x1690B, }, - [0x16864]={ + [0x1690C]={ category="lo", - description="BAMUM LETTER PHASE-B NTIEE SHEUOQ", + description="BAMUM LETTER PHASE-D SEUAEQ", direction="l", linebreak="al", - unicodeslot=0x16864, + unicodeslot=0x1690C, }, - [0x16865]={ + [0x1690D]={ category="lo", - description="BAMUM LETTER PHASE-B NDU NJAA", + description="BAMUM LETTER PHASE-D YEN", direction="l", linebreak="al", - unicodeslot=0x16865, + unicodeslot=0x1690D, }, - [0x16866]={ + [0x1690E]={ category="lo", - description="BAMUM LETTER PHASE-B GHEUGHEUAEM", + description="BAMUM LETTER PHASE-D NJEUAEM", direction="l", linebreak="al", - unicodeslot=0x16866, + unicodeslot=0x1690E, }, - [0x16867]={ + [0x1690F]={ category="lo", - description="BAMUM LETTER PHASE-B PIT", + description="BAMUM LETTER PHASE-D KEUOT MBUAE", direction="l", linebreak="al", - unicodeslot=0x16867, + unicodeslot=0x1690F, }, - [0x16868]={ + [0x16910]={ category="lo", - description="BAMUM LETTER PHASE-B TU NSIEE", + description="BAMUM LETTER PHASE-D NGKEURI", direction="l", linebreak="al", - unicodeslot=0x16868, + unicodeslot=0x16910, }, - [0x16869]={ + [0x16911]={ category="lo", - description="BAMUM LETTER PHASE-B SHET NJAQ", + description="BAMUM LETTER PHASE-D TU", direction="l", linebreak="al", - unicodeslot=0x16869, + unicodeslot=0x16911, }, - [0x1686A]={ + [0x16912]={ category="lo", - description="BAMUM LETTER PHASE-B SHEUAEQTU", + description="BAMUM LETTER PHASE-D GHAA", direction="l", linebreak="al", - unicodeslot=0x1686A, + unicodeslot=0x16912, }, - [0x1686B]={ + [0x16913]={ category="lo", - description="BAMUM LETTER PHASE-B MFON TEUAEQ", + description="BAMUM LETTER PHASE-D NGKYEE", direction="l", linebreak="al", - unicodeslot=0x1686B, + unicodeslot=0x16913, }, - [0x1686C]={ + [0x16914]={ category="lo", - description="BAMUM LETTER PHASE-B MBIT MBAAKET", + description="BAMUM LETTER PHASE-D FEUFEUAET", direction="l", linebreak="al", - unicodeslot=0x1686C, + unicodeslot=0x16914, }, - [0x1686D]={ + [0x16915]={ category="lo", - description="BAMUM LETTER PHASE-B NYI NTEUM", + description="BAMUM LETTER PHASE-D NDEE", direction="l", linebreak="al", - unicodeslot=0x1686D, + unicodeslot=0x16915, }, - [0x1686E]={ + [0x16916]={ category="lo", - description="BAMUM LETTER PHASE-B KEUPUQ", + description="BAMUM LETTER PHASE-D MGBOFUM", direction="l", linebreak="al", - unicodeslot=0x1686E, + unicodeslot=0x16916, }, - [0x1686F]={ + [0x16917]={ category="lo", - description="BAMUM LETTER PHASE-B GHEUGHEN", + description="BAMUM LETTER PHASE-D LEUAEP", direction="l", linebreak="al", - unicodeslot=0x1686F, + unicodeslot=0x16917, }, - [0x16870]={ + [0x16918]={ category="lo", - description="BAMUM LETTER PHASE-B KEUYEUX", + description="BAMUM LETTER PHASE-D NDON", direction="l", linebreak="al", - unicodeslot=0x16870, + unicodeslot=0x16918, }, - [0x16871]={ + [0x16919]={ category="lo", - description="BAMUM LETTER PHASE-B LAANAE", + description="BAMUM LETTER PHASE-D MONI", direction="l", linebreak="al", - unicodeslot=0x16871, + unicodeslot=0x16919, }, - [0x16872]={ + [0x1691A]={ category="lo", - description="BAMUM LETTER PHASE-B PARUM", + description="BAMUM LETTER PHASE-D MGBEUN", direction="l", linebreak="al", - unicodeslot=0x16872, + unicodeslot=0x1691A, }, - [0x16873]={ + [0x1691B]={ category="lo", - description="BAMUM LETTER PHASE-B VEUM", + description="BAMUM LETTER PHASE-D PUUT", direction="l", linebreak="al", - unicodeslot=0x16873, + unicodeslot=0x1691B, }, - [0x16874]={ + [0x1691C]={ category="lo", - description="BAMUM LETTER PHASE-B NGKINDI MVOP", + description="BAMUM LETTER PHASE-D MGBIEE", direction="l", linebreak="al", - unicodeslot=0x16874, + unicodeslot=0x1691C, }, - [0x16875]={ + [0x1691D]={ category="lo", - description="BAMUM LETTER PHASE-B NGGEU MBU", + description="BAMUM LETTER PHASE-D MFO", direction="l", linebreak="al", - unicodeslot=0x16875, + unicodeslot=0x1691D, }, - [0x16876]={ + [0x1691E]={ category="lo", - description="BAMUM LETTER PHASE-B WUAET", + description="BAMUM LETTER PHASE-D LUM", direction="l", linebreak="al", - unicodeslot=0x16876, + unicodeslot=0x1691E, }, - [0x16877]={ + [0x1691F]={ category="lo", - description="BAMUM LETTER PHASE-B SAKEUAE", + description="BAMUM LETTER PHASE-D NSIEEP", direction="l", linebreak="al", - unicodeslot=0x16877, + unicodeslot=0x1691F, }, - [0x16878]={ + [0x16920]={ category="lo", - description="BAMUM LETTER PHASE-B TAAM", + description="BAMUM LETTER PHASE-D MBAA", direction="l", linebreak="al", - unicodeslot=0x16878, + unicodeslot=0x16920, }, - [0x16879]={ + [0x16921]={ category="lo", - description="BAMUM LETTER PHASE-B MEUQ", + description="BAMUM LETTER PHASE-D KWAET", direction="l", linebreak="al", - unicodeslot=0x16879, + unicodeslot=0x16921, }, - [0x1687A]={ + [0x16922]={ category="lo", - description="BAMUM LETTER PHASE-B NGGUOQ", + description="BAMUM LETTER PHASE-D NYET", direction="l", linebreak="al", - unicodeslot=0x1687A, + unicodeslot=0x16922, }, - [0x1687B]={ + [0x16923]={ category="lo", - description="BAMUM LETTER PHASE-B NGGUOQ LARGE", + description="BAMUM LETTER PHASE-D TEUAEN", direction="l", linebreak="al", - unicodeslot=0x1687B, + unicodeslot=0x16923, }, - [0x1687C]={ + [0x16924]={ category="lo", - description="BAMUM LETTER PHASE-B MFIYAQ", + description="BAMUM LETTER PHASE-D SOT", direction="l", linebreak="al", - unicodeslot=0x1687C, + unicodeslot=0x16924, }, - [0x1687D]={ + [0x16925]={ category="lo", - description="BAMUM LETTER PHASE-B SUE", + description="BAMUM LETTER PHASE-D YUWOQ", direction="l", linebreak="al", - unicodeslot=0x1687D, + unicodeslot=0x16925, }, - [0x1687E]={ + [0x16926]={ category="lo", - description="BAMUM LETTER PHASE-B MBEURI", + description="BAMUM LETTER PHASE-D KEUM", direction="l", linebreak="al", - unicodeslot=0x1687E, + unicodeslot=0x16926, }, - [0x1687F]={ + [0x16927]={ category="lo", - description="BAMUM LETTER PHASE-B MONTIEEN", + description="BAMUM LETTER PHASE-D RAEM", direction="l", linebreak="al", - unicodeslot=0x1687F, + unicodeslot=0x16927, }, - [0x16880]={ + [0x16928]={ category="lo", - description="BAMUM LETTER PHASE-B NYAEMAE", + description="BAMUM LETTER PHASE-D TEEEE", direction="l", linebreak="al", - unicodeslot=0x16880, + unicodeslot=0x16928, }, - [0x16881]={ + [0x16929]={ category="lo", - description="BAMUM LETTER PHASE-B PUNGAAM", + description="BAMUM LETTER PHASE-D NGKEUAEQ", direction="l", linebreak="al", - unicodeslot=0x16881, + unicodeslot=0x16929, }, - [0x16882]={ + [0x1692A]={ category="lo", - description="BAMUM LETTER PHASE-B MEUT NGGEET", + description="BAMUM LETTER PHASE-D MFEUAE", direction="l", linebreak="al", - unicodeslot=0x16882, + unicodeslot=0x1692A, }, - [0x16883]={ + [0x1692B]={ category="lo", - description="BAMUM LETTER PHASE-B FEUX", + description="BAMUM LETTER PHASE-D NSIEET", direction="l", linebreak="al", - unicodeslot=0x16883, + unicodeslot=0x1692B, }, - [0x16884]={ + [0x1692C]={ category="lo", - description="BAMUM LETTER PHASE-B MBUOQ", + description="BAMUM LETTER PHASE-D KEUP", direction="l", linebreak="al", - unicodeslot=0x16884, + unicodeslot=0x1692C, }, - [0x16885]={ + [0x1692D]={ category="lo", - description="BAMUM LETTER PHASE-B FEE", + description="BAMUM LETTER PHASE-D PIP", direction="l", linebreak="al", - unicodeslot=0x16885, + unicodeslot=0x1692D, }, - [0x16886]={ + [0x1692E]={ category="lo", - description="BAMUM LETTER PHASE-B KEUAEM", + description="BAMUM LETTER PHASE-D PEUTAE", direction="l", linebreak="al", - unicodeslot=0x16886, + unicodeslot=0x1692E, }, - [0x16887]={ + [0x1692F]={ category="lo", - description="BAMUM LETTER PHASE-B MA NJEUAENA", + description="BAMUM LETTER PHASE-D NYUE", direction="l", linebreak="al", - unicodeslot=0x16887, + unicodeslot=0x1692F, }, - [0x16888]={ + [0x16930]={ category="lo", - description="BAMUM LETTER PHASE-B MA NJUQA", + description="BAMUM LETTER PHASE-D LET", direction="l", linebreak="al", - unicodeslot=0x16888, + unicodeslot=0x16930, }, - [0x16889]={ + [0x16931]={ category="lo", - description="BAMUM LETTER PHASE-B LET", + description="BAMUM LETTER PHASE-D NGGAAM", direction="l", linebreak="al", - unicodeslot=0x16889, + unicodeslot=0x16931, }, - [0x1688A]={ + [0x16932]={ category="lo", - description="BAMUM LETTER PHASE-B NGGAAM", + description="BAMUM LETTER PHASE-D MFIEE", direction="l", linebreak="al", - unicodeslot=0x1688A, + unicodeslot=0x16932, }, - [0x1688B]={ + [0x16933]={ category="lo", - description="BAMUM LETTER PHASE-B NSEN", + description="BAMUM LETTER PHASE-D NGGWAEN", direction="l", linebreak="al", - unicodeslot=0x1688B, + unicodeslot=0x16933, }, - [0x1688C]={ + [0x16934]={ category="lo", - description="BAMUM LETTER PHASE-B MA", + description="BAMUM LETTER PHASE-D YUOM", direction="l", linebreak="al", - unicodeslot=0x1688C, + unicodeslot=0x16934, }, - [0x1688D]={ + [0x16935]={ category="lo", - description="BAMUM LETTER PHASE-B KIQ", + description="BAMUM LETTER PHASE-D PAP", direction="l", linebreak="al", - unicodeslot=0x1688D, + unicodeslot=0x16935, }, - [0x1688E]={ + [0x16936]={ category="lo", - description="BAMUM LETTER PHASE-B NGOM", + description="BAMUM LETTER PHASE-D YUOP", direction="l", linebreak="al", - unicodeslot=0x1688E, + unicodeslot=0x16936, }, - [0x1688F]={ + [0x16937]={ category="lo", - description="BAMUM LETTER PHASE-C NGKUE MAEMBA", + description="BAMUM LETTER PHASE-D NDAM", direction="l", linebreak="al", - unicodeslot=0x1688F, + unicodeslot=0x16937, }, - [0x16890]={ + [0x16938]={ category="lo", - description="BAMUM LETTER PHASE-C NZA", + description="BAMUM LETTER PHASE-D NTEUM", direction="l", linebreak="al", - unicodeslot=0x16890, + unicodeslot=0x16938, }, - [0x16891]={ + [0x16939]={ category="lo", - description="BAMUM LETTER PHASE-C YUM", + description="BAMUM LETTER PHASE-D SUAE", direction="l", linebreak="al", - unicodeslot=0x16891, + unicodeslot=0x16939, }, - [0x16892]={ + [0x1693A]={ category="lo", - description="BAMUM LETTER PHASE-C WANGKUOQ", + description="BAMUM LETTER PHASE-D KUN", direction="l", linebreak="al", - unicodeslot=0x16892, + unicodeslot=0x1693A, }, - [0x16893]={ + [0x1693B]={ category="lo", - description="BAMUM LETTER PHASE-C NGGEN", + description="BAMUM LETTER PHASE-D NGGEUX", direction="l", linebreak="al", - unicodeslot=0x16893, + unicodeslot=0x1693B, }, - [0x16894]={ + [0x1693C]={ category="lo", - description="BAMUM LETTER PHASE-C NDEUAEREE", + description="BAMUM LETTER PHASE-D NGKIEE", direction="l", linebreak="al", - unicodeslot=0x16894, + unicodeslot=0x1693C, }, - [0x16895]={ + [0x1693D]={ category="lo", - description="BAMUM LETTER PHASE-C NGKAQ", + description="BAMUM LETTER PHASE-D TUOT", direction="l", linebreak="al", - unicodeslot=0x16895, + unicodeslot=0x1693D, }, - [0x16896]={ + [0x1693E]={ category="lo", - description="BAMUM LETTER PHASE-C GHARAE", + description="BAMUM LETTER PHASE-D MEUN", direction="l", linebreak="al", - unicodeslot=0x16896, + unicodeslot=0x1693E, }, - [0x16897]={ + [0x1693F]={ category="lo", - description="BAMUM LETTER PHASE-C MBEEKEET", + description="BAMUM LETTER PHASE-D KUQ", direction="l", linebreak="al", - unicodeslot=0x16897, + unicodeslot=0x1693F, }, - [0x16898]={ + [0x16940]={ category="lo", - description="BAMUM LETTER PHASE-C GBAYI", + description="BAMUM LETTER PHASE-D NSUM", direction="l", linebreak="al", - unicodeslot=0x16898, + unicodeslot=0x16940, }, - [0x16899]={ + [0x16941]={ category="lo", - description="BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN", + description="BAMUM LETTER PHASE-D TEUN", direction="l", linebreak="al", - unicodeslot=0x16899, + unicodeslot=0x16941, }, - [0x1689A]={ + [0x16942]={ category="lo", - description="BAMUM LETTER PHASE-C NTU MBIT", + description="BAMUM LETTER PHASE-D MAENJET", direction="l", linebreak="al", - unicodeslot=0x1689A, + unicodeslot=0x16942, }, - [0x1689B]={ + [0x16943]={ category="lo", - description="BAMUM LETTER PHASE-C MBEUM", + description="BAMUM LETTER PHASE-D NGGAP", direction="l", linebreak="al", - unicodeslot=0x1689B, + unicodeslot=0x16943, }, - [0x1689C]={ + [0x16944]={ category="lo", - description="BAMUM LETTER PHASE-C PIRIEEN", + description="BAMUM LETTER PHASE-D LEUM", direction="l", linebreak="al", - unicodeslot=0x1689C, + unicodeslot=0x16944, }, - [0x1689D]={ + [0x16945]={ category="lo", - description="BAMUM LETTER PHASE-C NDOMBU", + description="BAMUM LETTER PHASE-D NGGUOM", direction="l", linebreak="al", - unicodeslot=0x1689D, + unicodeslot=0x16945, }, - [0x1689E]={ + [0x16946]={ category="lo", - description="BAMUM LETTER PHASE-C MBAA CABBAGE-TREE", + description="BAMUM LETTER PHASE-D NSHUT", direction="l", linebreak="al", - unicodeslot=0x1689E, + unicodeslot=0x16946, }, - [0x1689F]={ + [0x16947]={ category="lo", - description="BAMUM LETTER PHASE-C KEUSHEUAEP", + description="BAMUM LETTER PHASE-D NJUEQ", direction="l", linebreak="al", - unicodeslot=0x1689F, + unicodeslot=0x16947, }, - [0x168A0]={ + [0x16948]={ category="lo", - description="BAMUM LETTER PHASE-C GHAP", + description="BAMUM LETTER PHASE-D GHEUAE", direction="l", linebreak="al", - unicodeslot=0x168A0, + unicodeslot=0x16948, }, - [0x168A1]={ + [0x16949]={ category="lo", - description="BAMUM LETTER PHASE-C KEUKAQ", + description="BAMUM LETTER PHASE-D KU", direction="l", linebreak="al", - unicodeslot=0x168A1, + unicodeslot=0x16949, }, - [0x168A2]={ + [0x1694A]={ category="lo", - description="BAMUM LETTER PHASE-C YU MUOMAE", + description="BAMUM LETTER PHASE-D REN OLD", direction="l", linebreak="al", - unicodeslot=0x168A2, + unicodeslot=0x1694A, }, - [0x168A3]={ + [0x1694B]={ category="lo", - description="BAMUM LETTER PHASE-C NZEUM", + description="BAMUM LETTER PHASE-D TAE", direction="l", linebreak="al", - unicodeslot=0x168A3, + unicodeslot=0x1694B, }, - [0x168A4]={ + [0x1694C]={ category="lo", - description="BAMUM LETTER PHASE-C MBUE", + description="BAMUM LETTER PHASE-D TOQ", direction="l", linebreak="al", - unicodeslot=0x168A4, + unicodeslot=0x1694C, }, - [0x168A5]={ + [0x1694D]={ category="lo", - description="BAMUM LETTER PHASE-C NSEUAEN", + description="BAMUM LETTER PHASE-D NYI", direction="l", linebreak="al", - unicodeslot=0x168A5, + unicodeslot=0x1694D, }, - [0x168A6]={ + [0x1694E]={ category="lo", - description="BAMUM LETTER PHASE-C MBIT", + description="BAMUM LETTER PHASE-D RII", direction="l", linebreak="al", - unicodeslot=0x168A6, + unicodeslot=0x1694E, }, - [0x168A7]={ + [0x1694F]={ category="lo", - description="BAMUM LETTER PHASE-C YEUQ", + description="BAMUM LETTER PHASE-D LEEEE", direction="l", linebreak="al", - unicodeslot=0x168A7, + unicodeslot=0x1694F, }, - [0x168A8]={ + [0x16950]={ category="lo", - description="BAMUM LETTER PHASE-C KPARAQ", + description="BAMUM LETTER PHASE-D MEEEE", direction="l", linebreak="al", - unicodeslot=0x168A8, + unicodeslot=0x16950, }, - [0x168A9]={ + [0x16951]={ category="lo", - description="BAMUM LETTER PHASE-C KAA", + description="BAMUM LETTER PHASE-D M", direction="l", linebreak="al", - unicodeslot=0x168A9, + unicodeslot=0x16951, }, - [0x168AA]={ + [0x16952]={ category="lo", - description="BAMUM LETTER PHASE-C SEUX", + description="BAMUM LETTER PHASE-D SUU", direction="l", linebreak="al", - unicodeslot=0x168AA, + unicodeslot=0x16952, }, - [0x168AB]={ + [0x16953]={ category="lo", - description="BAMUM LETTER PHASE-C NDIDA", + description="BAMUM LETTER PHASE-D MU", direction="l", linebreak="al", - unicodeslot=0x168AB, + unicodeslot=0x16953, }, - [0x168AC]={ + [0x16954]={ category="lo", - description="BAMUM LETTER PHASE-C TAASHAE", + description="BAMUM LETTER PHASE-D SHII", direction="l", linebreak="al", - unicodeslot=0x168AC, + unicodeslot=0x16954, }, - [0x168AD]={ + [0x16955]={ category="lo", - description="BAMUM LETTER PHASE-C NJUEQ", + description="BAMUM LETTER PHASE-D SHEUX", direction="l", linebreak="al", - unicodeslot=0x168AD, + unicodeslot=0x16955, }, - [0x168AE]={ + [0x16956]={ category="lo", - description="BAMUM LETTER PHASE-C TITA YUE", + description="BAMUM LETTER PHASE-D KYEE", direction="l", linebreak="al", - unicodeslot=0x168AE, + unicodeslot=0x16956, }, - [0x168AF]={ + [0x16957]={ category="lo", - description="BAMUM LETTER PHASE-C SUAET", + description="BAMUM LETTER PHASE-D NU", direction="l", linebreak="al", - unicodeslot=0x168AF, + unicodeslot=0x16957, }, - [0x168B0]={ + [0x16958]={ category="lo", - description="BAMUM LETTER PHASE-C NGGUAEN NYAM", + description="BAMUM LETTER PHASE-D SHU", direction="l", linebreak="al", - unicodeslot=0x168B0, + unicodeslot=0x16958, }, - [0x168B1]={ + [0x16959]={ category="lo", - description="BAMUM LETTER PHASE-C VEUX", + description="BAMUM LETTER PHASE-D NTEE", direction="l", linebreak="al", - unicodeslot=0x168B1, + unicodeslot=0x16959, }, - [0x168B2]={ + [0x1695A]={ category="lo", - description="BAMUM LETTER PHASE-C NANSANAQ", + description="BAMUM LETTER PHASE-D PEE", direction="l", linebreak="al", - unicodeslot=0x168B2, + unicodeslot=0x1695A, }, - [0x168B3]={ + [0x1695B]={ category="lo", - description="BAMUM LETTER PHASE-C MA KEUAERI", + description="BAMUM LETTER PHASE-D NI", direction="l", linebreak="al", - unicodeslot=0x168B3, + unicodeslot=0x1695B, }, - [0x168B4]={ + [0x1695C]={ category="lo", - description="BAMUM LETTER PHASE-C NTAA", + description="BAMUM LETTER PHASE-D SHOQ", direction="l", linebreak="al", - unicodeslot=0x168B4, + unicodeslot=0x1695C, }, - [0x168B5]={ + [0x1695D]={ category="lo", - description="BAMUM LETTER PHASE-C NGGUON", + description="BAMUM LETTER PHASE-D PUQ", direction="l", linebreak="al", - unicodeslot=0x168B5, + unicodeslot=0x1695D, }, - [0x168B6]={ + [0x1695E]={ category="lo", - description="BAMUM LETTER PHASE-C LAP", + description="BAMUM LETTER PHASE-D MVOP", direction="l", linebreak="al", - unicodeslot=0x168B6, + unicodeslot=0x1695E, }, - [0x168B7]={ + [0x1695F]={ category="lo", - description="BAMUM LETTER PHASE-C MBIRIEEN", + description="BAMUM LETTER PHASE-D LOQ", direction="l", linebreak="al", - unicodeslot=0x168B7, + unicodeslot=0x1695F, }, - [0x168B8]={ + [0x16960]={ category="lo", - description="BAMUM LETTER PHASE-C MGBASAQ", + description="BAMUM LETTER PHASE-D REN MUCH", direction="l", linebreak="al", - unicodeslot=0x168B8, + unicodeslot=0x16960, }, - [0x168B9]={ + [0x16961]={ category="lo", - description="BAMUM LETTER PHASE-C NTEUNGBA", + description="BAMUM LETTER PHASE-D TI", direction="l", linebreak="al", - unicodeslot=0x168B9, + unicodeslot=0x16961, }, - [0x168BA]={ + [0x16962]={ category="lo", - description="BAMUM LETTER PHASE-C TEUTEUX", + description="BAMUM LETTER PHASE-D NTUU", direction="l", linebreak="al", - unicodeslot=0x168BA, + unicodeslot=0x16962, }, - [0x168BB]={ + [0x16963]={ category="lo", - description="BAMUM LETTER PHASE-C NGGUM", + description="BAMUM LETTER PHASE-D MBAA SEVEN", direction="l", linebreak="al", - unicodeslot=0x168BB, + unicodeslot=0x16963, }, - [0x168BC]={ + [0x16964]={ category="lo", - description="BAMUM LETTER PHASE-C FUE", + description="BAMUM LETTER PHASE-D SAQ", direction="l", linebreak="al", - unicodeslot=0x168BC, + unicodeslot=0x16964, }, - [0x168BD]={ + [0x16965]={ category="lo", - description="BAMUM LETTER PHASE-C NDEUT", + description="BAMUM LETTER PHASE-D FAA", direction="l", linebreak="al", - unicodeslot=0x168BD, + unicodeslot=0x16965, }, - [0x168BE]={ + [0x16966]={ category="lo", - description="BAMUM LETTER PHASE-C NSA", + description="BAMUM LETTER PHASE-E NDAP", direction="l", linebreak="al", - unicodeslot=0x168BE, + unicodeslot=0x16966, }, - [0x168BF]={ + [0x16967]={ category="lo", - description="BAMUM LETTER PHASE-C NSHAQ", + description="BAMUM LETTER PHASE-E TOON", direction="l", linebreak="al", - unicodeslot=0x168BF, + unicodeslot=0x16967, }, - [0x168C0]={ + [0x16968]={ category="lo", - description="BAMUM LETTER PHASE-C BUNG", + description="BAMUM LETTER PHASE-E MBEUM", direction="l", linebreak="al", - unicodeslot=0x168C0, + unicodeslot=0x16968, }, - [0x168C1]={ + [0x16969]={ category="lo", - description="BAMUM LETTER PHASE-C VEUAEPEN", + description="BAMUM LETTER PHASE-E LAP", direction="l", linebreak="al", - unicodeslot=0x168C1, + unicodeslot=0x16969, }, - [0x168C2]={ + [0x1696A]={ category="lo", - description="BAMUM LETTER PHASE-C MBERAE", + description="BAMUM LETTER PHASE-E VOM", direction="l", linebreak="al", - unicodeslot=0x168C2, + unicodeslot=0x1696A, }, - [0x168C3]={ + [0x1696B]={ category="lo", - description="BAMUM LETTER PHASE-C RU", + description="BAMUM LETTER PHASE-E LOON", direction="l", linebreak="al", - unicodeslot=0x168C3, + unicodeslot=0x1696B, }, - [0x168C4]={ + [0x1696C]={ category="lo", - description="BAMUM LETTER PHASE-C NJAEM", + description="BAMUM LETTER PHASE-E PAA", direction="l", linebreak="al", - unicodeslot=0x168C4, + unicodeslot=0x1696C, }, - [0x168C5]={ + [0x1696D]={ category="lo", - description="BAMUM LETTER PHASE-C LAM", + description="BAMUM LETTER PHASE-E SOM", direction="l", linebreak="al", - unicodeslot=0x168C5, + unicodeslot=0x1696D, }, - [0x168C6]={ + [0x1696E]={ category="lo", - description="BAMUM LETTER PHASE-C TITUAEP", + description="BAMUM LETTER PHASE-E RAQ", direction="l", linebreak="al", - unicodeslot=0x168C6, + unicodeslot=0x1696E, }, - [0x168C7]={ + [0x1696F]={ category="lo", - description="BAMUM LETTER PHASE-C NSUOT NGOM", + description="BAMUM LETTER PHASE-E NSHUOP", direction="l", linebreak="al", - unicodeslot=0x168C7, + unicodeslot=0x1696F, }, - [0x168C8]={ + [0x16970]={ category="lo", - description="BAMUM LETTER PHASE-C NJEEEE", + description="BAMUM LETTER PHASE-E NDUN", direction="l", linebreak="al", - unicodeslot=0x168C8, + unicodeslot=0x16970, }, - [0x168C9]={ + [0x16971]={ category="lo", - description="BAMUM LETTER PHASE-C KET", + description="BAMUM LETTER PHASE-E PUAE", direction="l", linebreak="al", - unicodeslot=0x168C9, + unicodeslot=0x16971, }, - [0x168CA]={ + [0x16972]={ category="lo", - description="BAMUM LETTER PHASE-C NGGU", + description="BAMUM LETTER PHASE-E TAM", direction="l", linebreak="al", - unicodeslot=0x168CA, + unicodeslot=0x16972, }, - [0x168CB]={ + [0x16973]={ category="lo", - description="BAMUM LETTER PHASE-C MAESI", + description="BAMUM LETTER PHASE-E NGKA", direction="l", linebreak="al", - unicodeslot=0x168CB, + unicodeslot=0x16973, }, - [0x168CC]={ + [0x16974]={ category="lo", - description="BAMUM LETTER PHASE-C MBUAEM", + description="BAMUM LETTER PHASE-E KPEUX", direction="l", linebreak="al", - unicodeslot=0x168CC, + unicodeslot=0x16974, }, - [0x168CD]={ + [0x16975]={ category="lo", - description="BAMUM LETTER PHASE-C LU", + description="BAMUM LETTER PHASE-E WUO", direction="l", linebreak="al", - unicodeslot=0x168CD, + unicodeslot=0x16975, }, - [0x168CE]={ + [0x16976]={ category="lo", - description="BAMUM LETTER PHASE-C KUT", + description="BAMUM LETTER PHASE-E SEE", direction="l", linebreak="al", - unicodeslot=0x168CE, + unicodeslot=0x16976, }, - [0x168CF]={ + [0x16977]={ category="lo", - description="BAMUM LETTER PHASE-C NJAM", + description="BAMUM LETTER PHASE-E NGGEUAET", direction="l", linebreak="al", - unicodeslot=0x168CF, + unicodeslot=0x16977, }, - [0x168D0]={ + [0x16978]={ category="lo", - description="BAMUM LETTER PHASE-C NGOM", + description="BAMUM LETTER PHASE-E PAAM", direction="l", linebreak="al", - unicodeslot=0x168D0, + unicodeslot=0x16978, }, - [0x168D1]={ + [0x16979]={ category="lo", - description="BAMUM LETTER PHASE-C WUP", + description="BAMUM LETTER PHASE-E TOO", direction="l", linebreak="al", - unicodeslot=0x168D1, + unicodeslot=0x16979, }, - [0x168D2]={ + [0x1697A]={ category="lo", - description="BAMUM LETTER PHASE-C NGGUEET", + description="BAMUM LETTER PHASE-E KUOP", direction="l", linebreak="al", - unicodeslot=0x168D2, + unicodeslot=0x1697A, }, - [0x168D3]={ + [0x1697B]={ category="lo", - description="BAMUM LETTER PHASE-C NSOM", + description="BAMUM LETTER PHASE-E LOM", direction="l", linebreak="al", - unicodeslot=0x168D3, + unicodeslot=0x1697B, }, - [0x168D4]={ + [0x1697C]={ category="lo", - description="BAMUM LETTER PHASE-C NTEN", + description="BAMUM LETTER PHASE-E NSHIEE", direction="l", linebreak="al", - unicodeslot=0x168D4, + unicodeslot=0x1697C, }, - [0x168D5]={ + [0x1697D]={ category="lo", - description="BAMUM LETTER PHASE-C KUOP NKAARAE", + description="BAMUM LETTER PHASE-E NGOP", direction="l", linebreak="al", - unicodeslot=0x168D5, + unicodeslot=0x1697D, }, - [0x168D6]={ + [0x1697E]={ category="lo", - description="BAMUM LETTER PHASE-C NSUN", + description="BAMUM LETTER PHASE-E MAEM", direction="l", linebreak="al", - unicodeslot=0x168D6, + unicodeslot=0x1697E, }, - [0x168D7]={ + [0x1697F]={ category="lo", - description="BAMUM LETTER PHASE-C NDAM", + description="BAMUM LETTER PHASE-E NGKEUX", direction="l", linebreak="al", - unicodeslot=0x168D7, + unicodeslot=0x1697F, }, - [0x168D8]={ + [0x16980]={ category="lo", - description="BAMUM LETTER PHASE-C MA NSIEE", + description="BAMUM LETTER PHASE-E NGOQ", direction="l", linebreak="al", - unicodeslot=0x168D8, + unicodeslot=0x16980, }, - [0x168D9]={ + [0x16981]={ category="lo", - description="BAMUM LETTER PHASE-C YAA", + description="BAMUM LETTER PHASE-E NSHUE", direction="l", linebreak="al", - unicodeslot=0x168D9, + unicodeslot=0x16981, }, - [0x168DA]={ + [0x16982]={ category="lo", - description="BAMUM LETTER PHASE-C NDAP", + description="BAMUM LETTER PHASE-E RIMGBA", direction="l", linebreak="al", - unicodeslot=0x168DA, + unicodeslot=0x16982, }, - [0x168DB]={ + [0x16983]={ category="lo", - description="BAMUM LETTER PHASE-C SHUEQ", + description="BAMUM LETTER PHASE-E NJEUX", direction="l", linebreak="al", - unicodeslot=0x168DB, + unicodeslot=0x16983, }, - [0x168DC]={ + [0x16984]={ category="lo", - description="BAMUM LETTER PHASE-C SETFON", + description="BAMUM LETTER PHASE-E PEEM", direction="l", linebreak="al", - unicodeslot=0x168DC, + unicodeslot=0x16984, }, - [0x168DD]={ + [0x16985]={ category="lo", - description="BAMUM LETTER PHASE-C MBI", + description="BAMUM LETTER PHASE-E SAA", direction="l", linebreak="al", - unicodeslot=0x168DD, + unicodeslot=0x16985, }, - [0x168DE]={ + [0x16986]={ category="lo", - description="BAMUM LETTER PHASE-C MAEMBA", + description="BAMUM LETTER PHASE-E NGGURAE", direction="l", linebreak="al", - unicodeslot=0x168DE, + unicodeslot=0x16986, }, - [0x168DF]={ + [0x16987]={ category="lo", - description="BAMUM LETTER PHASE-C MBANYI", + description="BAMUM LETTER PHASE-E MGBA", direction="l", linebreak="al", - unicodeslot=0x168DF, + unicodeslot=0x16987, }, - [0x168E0]={ + [0x16988]={ category="lo", - description="BAMUM LETTER PHASE-C KEUSEUX", + description="BAMUM LETTER PHASE-E GHEUX", direction="l", linebreak="al", - unicodeslot=0x168E0, + unicodeslot=0x16988, }, - [0x168E1]={ + [0x16989]={ category="lo", - description="BAMUM LETTER PHASE-C MBEUX", + description="BAMUM LETTER PHASE-E NGKEUAEM", direction="l", linebreak="al", - unicodeslot=0x168E1, + unicodeslot=0x16989, }, - [0x168E2]={ + [0x1698A]={ category="lo", - description="BAMUM LETTER PHASE-C KEUM", + description="BAMUM LETTER PHASE-E NJAEMLI", direction="l", linebreak="al", - unicodeslot=0x168E2, + unicodeslot=0x1698A, }, - [0x168E3]={ + [0x1698B]={ category="lo", - description="BAMUM LETTER PHASE-C MBAA PICKET", + description="BAMUM LETTER PHASE-E MAP", direction="l", linebreak="al", - unicodeslot=0x168E3, + unicodeslot=0x1698B, }, - [0x168E4]={ + [0x1698C]={ category="lo", - description="BAMUM LETTER PHASE-C YUWOQ", + description="BAMUM LETTER PHASE-E LOOT", direction="l", linebreak="al", - unicodeslot=0x168E4, + unicodeslot=0x1698C, }, - [0x168E5]={ + [0x1698D]={ category="lo", - description="BAMUM LETTER PHASE-C NJEUX", + description="BAMUM LETTER PHASE-E NGGEEEE", direction="l", linebreak="al", - unicodeslot=0x168E5, + unicodeslot=0x1698D, }, - [0x168E6]={ + [0x1698E]={ category="lo", - description="BAMUM LETTER PHASE-C MIEE", + description="BAMUM LETTER PHASE-E NDIQ", direction="l", linebreak="al", - unicodeslot=0x168E6, + unicodeslot=0x1698E, }, - [0x168E7]={ + [0x1698F]={ category="lo", - description="BAMUM LETTER PHASE-C MUAE", + description="BAMUM LETTER PHASE-E TAEN NTEUM", direction="l", linebreak="al", - unicodeslot=0x168E7, + unicodeslot=0x1698F, }, - [0x168E8]={ + [0x16990]={ category="lo", - description="BAMUM LETTER PHASE-C SHIQ", + description="BAMUM LETTER PHASE-E SET", direction="l", linebreak="al", - unicodeslot=0x168E8, + unicodeslot=0x16990, }, - [0x168E9]={ + [0x16991]={ category="lo", - description="BAMUM LETTER PHASE-C KEN LAW", + description="BAMUM LETTER PHASE-E PUM", direction="l", linebreak="al", - unicodeslot=0x168E9, + unicodeslot=0x16991, }, - [0x168EA]={ + [0x16992]={ category="lo", - description="BAMUM LETTER PHASE-C KEN FATIGUE", + description="BAMUM LETTER PHASE-E NDAA SOFTNESS", direction="l", linebreak="al", - unicodeslot=0x168EA, + unicodeslot=0x16992, }, - [0x168EB]={ + [0x16993]={ category="lo", - description="BAMUM LETTER PHASE-C NGAQ", + description="BAMUM LETTER PHASE-E NGGUAESHAE NYAM", direction="l", linebreak="al", - unicodeslot=0x168EB, + unicodeslot=0x16993, }, - [0x168EC]={ + [0x16994]={ category="lo", - description="BAMUM LETTER PHASE-C NAQ", + description="BAMUM LETTER PHASE-E YIEE", direction="l", linebreak="al", - unicodeslot=0x168EC, + unicodeslot=0x16994, }, - [0x168ED]={ + [0x16995]={ category="lo", - description="BAMUM LETTER PHASE-C LIQ", + description="BAMUM LETTER PHASE-E GHEUN", direction="l", linebreak="al", - unicodeslot=0x168ED, + unicodeslot=0x16995, }, - [0x168EE]={ + [0x16996]={ category="lo", - description="BAMUM LETTER PHASE-C PIN", + description="BAMUM LETTER PHASE-E TUAE", direction="l", linebreak="al", - unicodeslot=0x168EE, + unicodeslot=0x16996, }, - [0x168EF]={ + [0x16997]={ category="lo", - description="BAMUM LETTER PHASE-C PEN", + description="BAMUM LETTER PHASE-E YEUAE", direction="l", linebreak="al", - unicodeslot=0x168EF, + unicodeslot=0x16997, }, - [0x168F0]={ + [0x16998]={ category="lo", - description="BAMUM LETTER PHASE-C TET", + description="BAMUM LETTER PHASE-E PO", direction="l", linebreak="al", - unicodeslot=0x168F0, + unicodeslot=0x16998, }, - [0x168F1]={ + [0x16999]={ category="lo", - description="BAMUM LETTER PHASE-D MBUO", + description="BAMUM LETTER PHASE-E TUMAE", direction="l", linebreak="al", - unicodeslot=0x168F1, + unicodeslot=0x16999, }, - [0x168F2]={ + [0x1699A]={ category="lo", - description="BAMUM LETTER PHASE-D WAP", + description="BAMUM LETTER PHASE-E KEUAE", direction="l", linebreak="al", - unicodeslot=0x168F2, + unicodeslot=0x1699A, }, - [0x168F3]={ + [0x1699B]={ category="lo", - description="BAMUM LETTER PHASE-D NJI", + description="BAMUM LETTER PHASE-E SUAEN", direction="l", linebreak="al", - unicodeslot=0x168F3, + unicodeslot=0x1699B, }, - [0x168F4]={ + [0x1699C]={ category="lo", - description="BAMUM LETTER PHASE-D MFON", + description="BAMUM LETTER PHASE-E TEUAEQ", direction="l", linebreak="al", - unicodeslot=0x168F4, + unicodeslot=0x1699C, }, - [0x168F5]={ + [0x1699D]={ category="lo", - description="BAMUM LETTER PHASE-D NJIEE", + description="BAMUM LETTER PHASE-E VEUAE", direction="l", linebreak="al", - unicodeslot=0x168F5, + unicodeslot=0x1699D, }, - [0x168F6]={ + [0x1699E]={ category="lo", - description="BAMUM LETTER PHASE-D LIEE", + description="BAMUM LETTER PHASE-E WEUX", direction="l", linebreak="al", - unicodeslot=0x168F6, + unicodeslot=0x1699E, }, - [0x168F7]={ + [0x1699F]={ category="lo", - description="BAMUM LETTER PHASE-D NJEUT", + description="BAMUM LETTER PHASE-E LAAM", direction="l", linebreak="al", - unicodeslot=0x168F7, + unicodeslot=0x1699F, }, - [0x168F8]={ + [0x169A0]={ category="lo", - description="BAMUM LETTER PHASE-D NSHEE", + description="BAMUM LETTER PHASE-E PU", direction="l", linebreak="al", - unicodeslot=0x168F8, + unicodeslot=0x169A0, }, - [0x168F9]={ + [0x169A1]={ category="lo", - description="BAMUM LETTER PHASE-D NGGAAMAE", + description="BAMUM LETTER PHASE-E TAAQ", direction="l", linebreak="al", - unicodeslot=0x168F9, + unicodeslot=0x169A1, }, - [0x168FA]={ + [0x169A2]={ category="lo", - description="BAMUM LETTER PHASE-D NYAM", + description="BAMUM LETTER PHASE-E GHAAMAE", direction="l", linebreak="al", - unicodeslot=0x168FA, + unicodeslot=0x169A2, }, - [0x168FB]={ + [0x169A3]={ category="lo", - description="BAMUM LETTER PHASE-D WUAEN", + description="BAMUM LETTER PHASE-E NGEUREUT", direction="l", linebreak="al", - unicodeslot=0x168FB, + unicodeslot=0x169A3, }, - [0x168FC]={ + [0x169A4]={ category="lo", - description="BAMUM LETTER PHASE-D NGKUN", + description="BAMUM LETTER PHASE-E SHEUAEQ", direction="l", linebreak="al", - unicodeslot=0x168FC, + unicodeslot=0x169A4, }, - [0x168FD]={ + [0x169A5]={ category="lo", - description="BAMUM LETTER PHASE-D SHEE", + description="BAMUM LETTER PHASE-E MGBEN", direction="l", linebreak="al", - unicodeslot=0x168FD, + unicodeslot=0x169A5, }, - [0x168FE]={ + [0x169A6]={ category="lo", - description="BAMUM LETTER PHASE-D NGKAP", + description="BAMUM LETTER PHASE-E MBEE", direction="l", linebreak="al", - unicodeslot=0x168FE, + unicodeslot=0x169A6, }, - [0x168FF]={ + [0x169A7]={ category="lo", - description="BAMUM LETTER PHASE-D KEUAETMEUN", + description="BAMUM LETTER PHASE-E NZAQ", direction="l", linebreak="al", - unicodeslot=0x168FF, + unicodeslot=0x169A7, }, - [0x16900]={ + [0x169A8]={ category="lo", - description="BAMUM LETTER PHASE-D TEUT", + description="BAMUM LETTER PHASE-E NKOM", direction="l", linebreak="al", - unicodeslot=0x16900, + unicodeslot=0x169A8, }, - [0x16901]={ + [0x169A9]={ category="lo", - description="BAMUM LETTER PHASE-D SHEUAE", + description="BAMUM LETTER PHASE-E GBET", direction="l", linebreak="al", - unicodeslot=0x16901, + unicodeslot=0x169A9, }, - [0x16902]={ + [0x169AA]={ category="lo", - description="BAMUM LETTER PHASE-D NJAP", + description="BAMUM LETTER PHASE-E TUM", direction="l", linebreak="al", - unicodeslot=0x16902, + unicodeslot=0x169AA, }, - [0x16903]={ + [0x169AB]={ category="lo", - description="BAMUM LETTER PHASE-D SUE", + description="BAMUM LETTER PHASE-E KUET", direction="l", linebreak="al", - unicodeslot=0x16903, + unicodeslot=0x169AB, }, - [0x16904]={ + [0x169AC]={ category="lo", - description="BAMUM LETTER PHASE-D KET", + description="BAMUM LETTER PHASE-E YAP", direction="l", linebreak="al", - unicodeslot=0x16904, + unicodeslot=0x169AC, }, - [0x16905]={ + [0x169AD]={ category="lo", - description="BAMUM LETTER PHASE-D YAEMMAE", + description="BAMUM LETTER PHASE-E NYI CLEAVER", direction="l", linebreak="al", - unicodeslot=0x16905, + unicodeslot=0x169AD, }, - [0x16906]={ + [0x169AE]={ category="lo", - description="BAMUM LETTER PHASE-D KUOM", + description="BAMUM LETTER PHASE-E YIT", direction="l", linebreak="al", - unicodeslot=0x16906, + unicodeslot=0x169AE, }, - [0x16907]={ + [0x169AF]={ category="lo", - description="BAMUM LETTER PHASE-D SAP", + description="BAMUM LETTER PHASE-E MFEUQ", direction="l", linebreak="al", - unicodeslot=0x16907, + unicodeslot=0x169AF, }, - [0x16908]={ + [0x169B0]={ category="lo", - description="BAMUM LETTER PHASE-D MFEUT", + description="BAMUM LETTER PHASE-E NDIAQ", direction="l", linebreak="al", - unicodeslot=0x16908, + unicodeslot=0x169B0, }, - [0x16909]={ + [0x169B1]={ category="lo", - description="BAMUM LETTER PHASE-D NDEUX", + description="BAMUM LETTER PHASE-E PIEEQ", direction="l", linebreak="al", - unicodeslot=0x16909, + unicodeslot=0x169B1, }, - [0x1690A]={ + [0x169B2]={ category="lo", - description="BAMUM LETTER PHASE-D MALEERI", + description="BAMUM LETTER PHASE-E YUEQ", direction="l", linebreak="al", - unicodeslot=0x1690A, + unicodeslot=0x169B2, }, - [0x1690B]={ + [0x169B3]={ category="lo", - description="BAMUM LETTER PHASE-D MEUT", + description="BAMUM LETTER PHASE-E LEUAEM", direction="l", linebreak="al", - unicodeslot=0x1690B, + unicodeslot=0x169B3, }, - [0x1690C]={ + [0x169B4]={ category="lo", - description="BAMUM LETTER PHASE-D SEUAEQ", + description="BAMUM LETTER PHASE-E FUE", direction="l", linebreak="al", - unicodeslot=0x1690C, + unicodeslot=0x169B4, }, - [0x1690D]={ + [0x169B5]={ category="lo", - description="BAMUM LETTER PHASE-D YEN", + description="BAMUM LETTER PHASE-E GBEUX", direction="l", linebreak="al", - unicodeslot=0x1690D, + unicodeslot=0x169B5, }, - [0x1690E]={ + [0x169B6]={ category="lo", - description="BAMUM LETTER PHASE-D NJEUAEM", + description="BAMUM LETTER PHASE-E NGKUP", direction="l", linebreak="al", - unicodeslot=0x1690E, + unicodeslot=0x169B6, }, - [0x1690F]={ + [0x169B7]={ category="lo", - description="BAMUM LETTER PHASE-D KEUOT MBUAE", + description="BAMUM LETTER PHASE-E KET", direction="l", linebreak="al", - unicodeslot=0x1690F, + unicodeslot=0x169B7, }, - [0x16910]={ + [0x169B8]={ category="lo", - description="BAMUM LETTER PHASE-D NGKEURI", + description="BAMUM LETTER PHASE-E MAE", direction="l", linebreak="al", - unicodeslot=0x16910, + unicodeslot=0x169B8, }, - [0x16911]={ + [0x169B9]={ category="lo", - description="BAMUM LETTER PHASE-D TU", + description="BAMUM LETTER PHASE-E NGKAAMI", direction="l", linebreak="al", - unicodeslot=0x16911, + unicodeslot=0x169B9, }, - [0x16912]={ + [0x169BA]={ category="lo", - description="BAMUM LETTER PHASE-D GHAA", + description="BAMUM LETTER PHASE-E GHET", direction="l", linebreak="al", - unicodeslot=0x16912, + unicodeslot=0x169BA, }, - [0x16913]={ + [0x169BB]={ category="lo", - description="BAMUM LETTER PHASE-D NGKYEE", + description="BAMUM LETTER PHASE-E FA", direction="l", linebreak="al", - unicodeslot=0x16913, + unicodeslot=0x169BB, }, - [0x16914]={ + [0x169BC]={ category="lo", - description="BAMUM LETTER PHASE-D FEUFEUAET", + description="BAMUM LETTER PHASE-E NTUM", direction="l", linebreak="al", - unicodeslot=0x16914, + unicodeslot=0x169BC, }, - [0x16915]={ + [0x169BD]={ category="lo", - description="BAMUM LETTER PHASE-D NDEE", + description="BAMUM LETTER PHASE-E PEUT", direction="l", linebreak="al", - unicodeslot=0x16915, + unicodeslot=0x169BD, }, - [0x16916]={ + [0x169BE]={ category="lo", - description="BAMUM LETTER PHASE-D MGBOFUM", + description="BAMUM LETTER PHASE-E YEUM", direction="l", linebreak="al", - unicodeslot=0x16916, + unicodeslot=0x169BE, }, - [0x16917]={ + [0x169BF]={ category="lo", - description="BAMUM LETTER PHASE-D LEUAEP", + description="BAMUM LETTER PHASE-E NGGEUAE", direction="l", linebreak="al", - unicodeslot=0x16917, + unicodeslot=0x169BF, }, - [0x16918]={ + [0x169C0]={ category="lo", - description="BAMUM LETTER PHASE-D NDON", + description="BAMUM LETTER PHASE-E NYI BETWEEN", direction="l", linebreak="al", - unicodeslot=0x16918, + unicodeslot=0x169C0, }, - [0x16919]={ + [0x169C1]={ category="lo", - description="BAMUM LETTER PHASE-D MONI", + description="BAMUM LETTER PHASE-E NZUQ", direction="l", linebreak="al", - unicodeslot=0x16919, + unicodeslot=0x169C1, }, - [0x1691A]={ + [0x169C2]={ category="lo", - description="BAMUM LETTER PHASE-D MGBEUN", + description="BAMUM LETTER PHASE-E POON", direction="l", linebreak="al", - unicodeslot=0x1691A, + unicodeslot=0x169C2, }, - [0x1691B]={ + [0x169C3]={ category="lo", - description="BAMUM LETTER PHASE-D PUUT", + description="BAMUM LETTER PHASE-E MIEE", direction="l", linebreak="al", - unicodeslot=0x1691B, + unicodeslot=0x169C3, }, - [0x1691C]={ + [0x169C4]={ category="lo", - description="BAMUM LETTER PHASE-D MGBIEE", + description="BAMUM LETTER PHASE-E FUET", direction="l", linebreak="al", - unicodeslot=0x1691C, + unicodeslot=0x169C4, }, - [0x1691D]={ + [0x169C5]={ category="lo", - description="BAMUM LETTER PHASE-D MFO", + description="BAMUM LETTER PHASE-E NAE", direction="l", linebreak="al", - unicodeslot=0x1691D, + unicodeslot=0x169C5, }, - [0x1691E]={ + [0x169C6]={ category="lo", - description="BAMUM LETTER PHASE-D LUM", + description="BAMUM LETTER PHASE-E MUAE", direction="l", linebreak="al", - unicodeslot=0x1691E, + unicodeslot=0x169C6, }, - [0x1691F]={ + [0x169C7]={ category="lo", - description="BAMUM LETTER PHASE-D NSIEEP", + description="BAMUM LETTER PHASE-E GHEUAE", direction="l", linebreak="al", - unicodeslot=0x1691F, + unicodeslot=0x169C7, }, - [0x16920]={ + [0x169C8]={ category="lo", - description="BAMUM LETTER PHASE-D MBAA", + description="BAMUM LETTER PHASE-E FU I", direction="l", linebreak="al", - unicodeslot=0x16920, + unicodeslot=0x169C8, }, - [0x16921]={ + [0x169C9]={ category="lo", - description="BAMUM LETTER PHASE-D KWAET", + description="BAMUM LETTER PHASE-E MVI", direction="l", linebreak="al", - unicodeslot=0x16921, + unicodeslot=0x169C9, }, - [0x16922]={ + [0x169CA]={ category="lo", - description="BAMUM LETTER PHASE-D NYET", + description="BAMUM LETTER PHASE-E PUAQ", direction="l", linebreak="al", - unicodeslot=0x16922, + unicodeslot=0x169CA, }, - [0x16923]={ + [0x169CB]={ category="lo", - description="BAMUM LETTER PHASE-D TEUAEN", + description="BAMUM LETTER PHASE-E NGKUM", direction="l", linebreak="al", - unicodeslot=0x16923, + unicodeslot=0x169CB, }, - [0x16924]={ + [0x169CC]={ category="lo", - description="BAMUM LETTER PHASE-D SOT", + description="BAMUM LETTER PHASE-E KUT", direction="l", linebreak="al", - unicodeslot=0x16924, + unicodeslot=0x169CC, }, - [0x16925]={ + [0x169CD]={ category="lo", - description="BAMUM LETTER PHASE-D YUWOQ", + description="BAMUM LETTER PHASE-E PIET", direction="l", linebreak="al", - unicodeslot=0x16925, + unicodeslot=0x169CD, }, - [0x16926]={ + [0x169CE]={ category="lo", - description="BAMUM LETTER PHASE-D KEUM", + description="BAMUM LETTER PHASE-E NTAP", direction="l", linebreak="al", - unicodeslot=0x16926, + unicodeslot=0x169CE, }, - [0x16927]={ + [0x169CF]={ category="lo", - description="BAMUM LETTER PHASE-D RAEM", + description="BAMUM LETTER PHASE-E YEUAET", direction="l", linebreak="al", - unicodeslot=0x16927, + unicodeslot=0x169CF, }, - [0x16928]={ + [0x169D0]={ category="lo", - description="BAMUM LETTER PHASE-D TEEEE", + description="BAMUM LETTER PHASE-E NGGUP", direction="l", linebreak="al", - unicodeslot=0x16928, + unicodeslot=0x169D0, }, - [0x16929]={ + [0x169D1]={ category="lo", - description="BAMUM LETTER PHASE-D NGKEUAEQ", + description="BAMUM LETTER PHASE-E PA PEOPLE", direction="l", linebreak="al", - unicodeslot=0x16929, + unicodeslot=0x169D1, }, - [0x1692A]={ + [0x169D2]={ category="lo", - description="BAMUM LETTER PHASE-D MFEUAE", + description="BAMUM LETTER PHASE-E FU CALL", direction="l", linebreak="al", - unicodeslot=0x1692A, + unicodeslot=0x169D2, }, - [0x1692B]={ + [0x169D3]={ category="lo", - description="BAMUM LETTER PHASE-D NSIEET", + description="BAMUM LETTER PHASE-E FOM", direction="l", linebreak="al", - unicodeslot=0x1692B, + unicodeslot=0x169D3, }, - [0x1692C]={ + [0x169D4]={ category="lo", - description="BAMUM LETTER PHASE-D KEUP", + description="BAMUM LETTER PHASE-E NJEE", direction="l", linebreak="al", - unicodeslot=0x1692C, + unicodeslot=0x169D4, }, - [0x1692D]={ + [0x169D5]={ category="lo", - description="BAMUM LETTER PHASE-D PIP", + description="BAMUM LETTER PHASE-E A", direction="l", linebreak="al", - unicodeslot=0x1692D, + unicodeslot=0x169D5, }, - [0x1692E]={ + [0x169D6]={ category="lo", - description="BAMUM LETTER PHASE-D PEUTAE", + description="BAMUM LETTER PHASE-E TOQ", direction="l", linebreak="al", - unicodeslot=0x1692E, + unicodeslot=0x169D6, }, - [0x1692F]={ + [0x169D7]={ category="lo", - description="BAMUM LETTER PHASE-D NYUE", + description="BAMUM LETTER PHASE-E O", direction="l", linebreak="al", - unicodeslot=0x1692F, + unicodeslot=0x169D7, }, - [0x16930]={ + [0x169D8]={ category="lo", - description="BAMUM LETTER PHASE-D LET", + description="BAMUM LETTER PHASE-E I", direction="l", linebreak="al", - unicodeslot=0x16930, + unicodeslot=0x169D8, }, - [0x16931]={ + [0x169D9]={ category="lo", - description="BAMUM LETTER PHASE-D NGGAAM", + description="BAMUM LETTER PHASE-E LAQ", direction="l", linebreak="al", - unicodeslot=0x16931, + unicodeslot=0x169D9, }, - [0x16932]={ + [0x169DA]={ category="lo", - description="BAMUM LETTER PHASE-D MFIEE", + description="BAMUM LETTER PHASE-E PA PLURAL", direction="l", linebreak="al", - unicodeslot=0x16932, + unicodeslot=0x169DA, }, - [0x16933]={ + [0x169DB]={ category="lo", - description="BAMUM LETTER PHASE-D NGGWAEN", + description="BAMUM LETTER PHASE-E TAA", direction="l", linebreak="al", - unicodeslot=0x16933, + unicodeslot=0x169DB, }, - [0x16934]={ + [0x169DC]={ category="lo", - description="BAMUM LETTER PHASE-D YUOM", + description="BAMUM LETTER PHASE-E TAQ", direction="l", linebreak="al", - unicodeslot=0x16934, + unicodeslot=0x169DC, }, - [0x16935]={ + [0x169DD]={ category="lo", - description="BAMUM LETTER PHASE-D PAP", + description="BAMUM LETTER PHASE-E NDAA MY HOUSE", direction="l", linebreak="al", - unicodeslot=0x16935, + unicodeslot=0x169DD, }, - [0x16936]={ + [0x169DE]={ category="lo", - description="BAMUM LETTER PHASE-D YUOP", + description="BAMUM LETTER PHASE-E SHIQ", direction="l", linebreak="al", - unicodeslot=0x16936, + unicodeslot=0x169DE, }, - [0x16937]={ + [0x169DF]={ category="lo", - description="BAMUM LETTER PHASE-D NDAM", + description="BAMUM LETTER PHASE-E YEUX", direction="l", linebreak="al", - unicodeslot=0x16937, + unicodeslot=0x169DF, }, - [0x16938]={ + [0x169E0]={ category="lo", - description="BAMUM LETTER PHASE-D NTEUM", + description="BAMUM LETTER PHASE-E NGUAE", direction="l", linebreak="al", - unicodeslot=0x16938, + unicodeslot=0x169E0, }, - [0x16939]={ + [0x169E1]={ category="lo", - description="BAMUM LETTER PHASE-D SUAE", + description="BAMUM LETTER PHASE-E YUAEN", direction="l", linebreak="al", - unicodeslot=0x16939, + unicodeslot=0x169E1, }, - [0x1693A]={ + [0x169E2]={ category="lo", - description="BAMUM LETTER PHASE-D KUN", + description="BAMUM LETTER PHASE-E YOQ SWIMMING", direction="l", linebreak="al", - unicodeslot=0x1693A, + unicodeslot=0x169E2, }, - [0x1693B]={ + [0x169E3]={ category="lo", - description="BAMUM LETTER PHASE-D NGGEUX", + description="BAMUM LETTER PHASE-E YOQ COVER", direction="l", linebreak="al", - unicodeslot=0x1693B, + unicodeslot=0x169E3, }, - [0x1693C]={ + [0x169E4]={ category="lo", - description="BAMUM LETTER PHASE-D NGKIEE", + description="BAMUM LETTER PHASE-E YUQ", direction="l", linebreak="al", - unicodeslot=0x1693C, + unicodeslot=0x169E4, }, - [0x1693D]={ + [0x169E5]={ category="lo", - description="BAMUM LETTER PHASE-D TUOT", + description="BAMUM LETTER PHASE-E YUN", direction="l", linebreak="al", - unicodeslot=0x1693D, + unicodeslot=0x169E5, }, - [0x1693E]={ + [0x169E6]={ category="lo", - description="BAMUM LETTER PHASE-D MEUN", + description="BAMUM LETTER PHASE-E KEUX", direction="l", linebreak="al", - unicodeslot=0x1693E, + unicodeslot=0x169E6, }, - [0x1693F]={ + [0x169E7]={ category="lo", - description="BAMUM LETTER PHASE-D KUQ", + description="BAMUM LETTER PHASE-E PEUX", direction="l", linebreak="al", - unicodeslot=0x1693F, + unicodeslot=0x169E7, }, - [0x16940]={ + [0x169E8]={ category="lo", - description="BAMUM LETTER PHASE-D NSUM", + description="BAMUM LETTER PHASE-E NJEE EPOCH", direction="l", linebreak="al", - unicodeslot=0x16940, + unicodeslot=0x169E8, }, - [0x16941]={ + [0x169E9]={ category="lo", - description="BAMUM LETTER PHASE-D TEUN", + description="BAMUM LETTER PHASE-E PUE", direction="l", linebreak="al", - unicodeslot=0x16941, + unicodeslot=0x169E9, }, - [0x16942]={ + [0x169EA]={ category="lo", - description="BAMUM LETTER PHASE-D MAENJET", + description="BAMUM LETTER PHASE-E WUE", direction="l", linebreak="al", - unicodeslot=0x16942, + unicodeslot=0x169EA, }, - [0x16943]={ + [0x169EB]={ category="lo", - description="BAMUM LETTER PHASE-D NGGAP", + description="BAMUM LETTER PHASE-E FEE", direction="l", linebreak="al", - unicodeslot=0x16943, + unicodeslot=0x169EB, }, - [0x16944]={ + [0x169EC]={ category="lo", - description="BAMUM LETTER PHASE-D LEUM", + description="BAMUM LETTER PHASE-E VEE", direction="l", linebreak="al", - unicodeslot=0x16944, + unicodeslot=0x169EC, }, - [0x16945]={ + [0x169ED]={ category="lo", - description="BAMUM LETTER PHASE-D NGGUOM", + description="BAMUM LETTER PHASE-E LU", direction="l", linebreak="al", - unicodeslot=0x16945, + unicodeslot=0x169ED, }, - [0x16946]={ + [0x169EE]={ category="lo", - description="BAMUM LETTER PHASE-D NSHUT", + description="BAMUM LETTER PHASE-E MI", direction="l", linebreak="al", - unicodeslot=0x16946, + unicodeslot=0x169EE, }, - [0x16947]={ + [0x169EF]={ category="lo", - description="BAMUM LETTER PHASE-D NJUEQ", + description="BAMUM LETTER PHASE-E REUX", direction="l", linebreak="al", - unicodeslot=0x16947, + unicodeslot=0x169EF, }, - [0x16948]={ + [0x169F0]={ category="lo", - description="BAMUM LETTER PHASE-D GHEUAE", + description="BAMUM LETTER PHASE-E RAE", direction="l", linebreak="al", - unicodeslot=0x16948, + unicodeslot=0x169F0, }, - [0x16949]={ + [0x169F1]={ category="lo", - description="BAMUM LETTER PHASE-D KU", + description="BAMUM LETTER PHASE-E NGUAET", direction="l", linebreak="al", - unicodeslot=0x16949, + unicodeslot=0x169F1, }, - [0x1694A]={ + [0x169F2]={ category="lo", - description="BAMUM LETTER PHASE-D REN OLD", + description="BAMUM LETTER PHASE-E NGA", direction="l", linebreak="al", - unicodeslot=0x1694A, + unicodeslot=0x169F2, }, - [0x1694B]={ + [0x169F3]={ category="lo", - description="BAMUM LETTER PHASE-D TAE", + description="BAMUM LETTER PHASE-E SHO", direction="l", linebreak="al", - unicodeslot=0x1694B, + unicodeslot=0x169F3, }, - [0x1694C]={ + [0x169F4]={ category="lo", - description="BAMUM LETTER PHASE-D TOQ", + description="BAMUM LETTER PHASE-E SHOQ", direction="l", linebreak="al", - unicodeslot=0x1694C, + unicodeslot=0x169F4, }, - [0x1694D]={ + [0x169F5]={ category="lo", - description="BAMUM LETTER PHASE-D NYI", + description="BAMUM LETTER PHASE-E FU REMEDY", direction="l", linebreak="al", - unicodeslot=0x1694D, + unicodeslot=0x169F5, }, - [0x1694E]={ + [0x169F6]={ category="lo", - description="BAMUM LETTER PHASE-D RII", + description="BAMUM LETTER PHASE-E NA", direction="l", linebreak="al", - unicodeslot=0x1694E, + unicodeslot=0x169F6, }, - [0x1694F]={ + [0x169F7]={ category="lo", - description="BAMUM LETTER PHASE-D LEEEE", + description="BAMUM LETTER PHASE-E PI", direction="l", linebreak="al", - unicodeslot=0x1694F, + unicodeslot=0x169F7, }, - [0x16950]={ + [0x169F8]={ category="lo", - description="BAMUM LETTER PHASE-D MEEEE", + description="BAMUM LETTER PHASE-E LOQ", direction="l", linebreak="al", - unicodeslot=0x16950, + unicodeslot=0x169F8, }, - [0x16951]={ + [0x169F9]={ category="lo", - description="BAMUM LETTER PHASE-D M", + description="BAMUM LETTER PHASE-E KO", direction="l", linebreak="al", - unicodeslot=0x16951, + unicodeslot=0x169F9, }, - [0x16952]={ + [0x169FA]={ category="lo", - description="BAMUM LETTER PHASE-D SUU", + description="BAMUM LETTER PHASE-E MEN", direction="l", linebreak="al", - unicodeslot=0x16952, + unicodeslot=0x169FA, }, - [0x16953]={ + [0x169FB]={ category="lo", - description="BAMUM LETTER PHASE-D MU", + description="BAMUM LETTER PHASE-E MA", direction="l", linebreak="al", - unicodeslot=0x16953, + unicodeslot=0x169FB, }, - [0x16954]={ + [0x169FC]={ category="lo", - description="BAMUM LETTER PHASE-D SHII", + description="BAMUM LETTER PHASE-E MAQ", direction="l", linebreak="al", - unicodeslot=0x16954, + unicodeslot=0x169FC, }, - [0x16955]={ + [0x169FD]={ category="lo", - description="BAMUM LETTER PHASE-D SHEUX", + description="BAMUM LETTER PHASE-E TEU", direction="l", linebreak="al", - unicodeslot=0x16955, + unicodeslot=0x169FD, }, - [0x16956]={ + [0x169FE]={ category="lo", - description="BAMUM LETTER PHASE-D KYEE", + description="BAMUM LETTER PHASE-E KI", direction="l", linebreak="al", - unicodeslot=0x16956, + unicodeslot=0x169FE, }, - [0x16957]={ + [0x169FF]={ category="lo", - description="BAMUM LETTER PHASE-D NU", + description="BAMUM LETTER PHASE-E MON", direction="l", linebreak="al", - unicodeslot=0x16957, + unicodeslot=0x169FF, }, - [0x16958]={ + [0x16A00]={ category="lo", - description="BAMUM LETTER PHASE-D SHU", + description="BAMUM LETTER PHASE-E TEN", direction="l", linebreak="al", - unicodeslot=0x16958, + unicodeslot=0x16A00, }, - [0x16959]={ + [0x16A01]={ category="lo", - description="BAMUM LETTER PHASE-D NTEE", + description="BAMUM LETTER PHASE-E FAQ", direction="l", linebreak="al", - unicodeslot=0x16959, + unicodeslot=0x16A01, }, - [0x1695A]={ + [0x16A02]={ category="lo", - description="BAMUM LETTER PHASE-D PEE", + description="BAMUM LETTER PHASE-E GHOM", direction="l", linebreak="al", - unicodeslot=0x1695A, + unicodeslot=0x16A02, }, - [0x1695B]={ + [0x16A03]={ category="lo", - description="BAMUM LETTER PHASE-D NI", + description="BAMUM LETTER PHASE-F KA", direction="l", linebreak="al", - unicodeslot=0x1695B, + unicodeslot=0x16A03, }, - [0x1695C]={ + [0x16A04]={ category="lo", - description="BAMUM LETTER PHASE-D SHOQ", + description="BAMUM LETTER PHASE-F U", direction="l", linebreak="al", - unicodeslot=0x1695C, + unicodeslot=0x16A04, }, - [0x1695D]={ + [0x16A05]={ category="lo", - description="BAMUM LETTER PHASE-D PUQ", + description="BAMUM LETTER PHASE-F KU", direction="l", linebreak="al", - unicodeslot=0x1695D, + unicodeslot=0x16A05, }, - [0x1695E]={ + [0x16A06]={ category="lo", - description="BAMUM LETTER PHASE-D MVOP", + description="BAMUM LETTER PHASE-F EE", direction="l", linebreak="al", - unicodeslot=0x1695E, + unicodeslot=0x16A06, }, - [0x1695F]={ + [0x16A07]={ category="lo", - description="BAMUM LETTER PHASE-D LOQ", + description="BAMUM LETTER PHASE-F REE", direction="l", linebreak="al", - unicodeslot=0x1695F, + unicodeslot=0x16A07, }, - [0x16960]={ + [0x16A08]={ category="lo", - description="BAMUM LETTER PHASE-D REN MUCH", + description="BAMUM LETTER PHASE-F TAE", direction="l", linebreak="al", - unicodeslot=0x16960, + unicodeslot=0x16A08, }, - [0x16961]={ + [0x16A09]={ category="lo", - description="BAMUM LETTER PHASE-D TI", + description="BAMUM LETTER PHASE-F NYI", direction="l", linebreak="al", - unicodeslot=0x16961, + unicodeslot=0x16A09, }, - [0x16962]={ + [0x16A0A]={ category="lo", - description="BAMUM LETTER PHASE-D NTUU", + description="BAMUM LETTER PHASE-F LA", direction="l", linebreak="al", - unicodeslot=0x16962, + unicodeslot=0x16A0A, }, - [0x16963]={ + [0x16A0B]={ category="lo", - description="BAMUM LETTER PHASE-D MBAA SEVEN", + description="BAMUM LETTER PHASE-F RII", direction="l", linebreak="al", - unicodeslot=0x16963, + unicodeslot=0x16A0B, }, - [0x16964]={ + [0x16A0C]={ category="lo", - description="BAMUM LETTER PHASE-D SAQ", + description="BAMUM LETTER PHASE-F RIEE", direction="l", linebreak="al", - unicodeslot=0x16964, + unicodeslot=0x16A0C, }, - [0x16965]={ + [0x16A0D]={ category="lo", - description="BAMUM LETTER PHASE-D FAA", + description="BAMUM LETTER PHASE-F MEEEE", direction="l", linebreak="al", - unicodeslot=0x16965, + unicodeslot=0x16A0D, }, - [0x16966]={ + [0x16A0E]={ category="lo", - description="BAMUM LETTER PHASE-E NDAP", + description="BAMUM LETTER PHASE-F TAA", direction="l", linebreak="al", - unicodeslot=0x16966, + unicodeslot=0x16A0E, }, - [0x16967]={ + [0x16A0F]={ category="lo", - description="BAMUM LETTER PHASE-E TOON", + description="BAMUM LETTER PHASE-F NDAA", direction="l", linebreak="al", - unicodeslot=0x16967, + unicodeslot=0x16A0F, }, - [0x16968]={ + [0x16A10]={ category="lo", - description="BAMUM LETTER PHASE-E MBEUM", + description="BAMUM LETTER PHASE-F NJAEM", direction="l", linebreak="al", - unicodeslot=0x16968, + unicodeslot=0x16A10, }, - [0x16969]={ + [0x16A11]={ category="lo", - description="BAMUM LETTER PHASE-E LAP", + description="BAMUM LETTER PHASE-F M", direction="l", linebreak="al", - unicodeslot=0x16969, + unicodeslot=0x16A11, }, - [0x1696A]={ + [0x16A12]={ category="lo", - description="BAMUM LETTER PHASE-E VOM", + description="BAMUM LETTER PHASE-F SUU", direction="l", linebreak="al", - unicodeslot=0x1696A, + unicodeslot=0x16A12, }, - [0x1696B]={ + [0x16A13]={ category="lo", - description="BAMUM LETTER PHASE-E LOON", + description="BAMUM LETTER PHASE-F SHII", direction="l", linebreak="al", - unicodeslot=0x1696B, + unicodeslot=0x16A13, }, - [0x1696C]={ + [0x16A14]={ category="lo", - description="BAMUM LETTER PHASE-E PAA", + description="BAMUM LETTER PHASE-F SI", direction="l", linebreak="al", - unicodeslot=0x1696C, + unicodeslot=0x16A14, }, - [0x1696D]={ + [0x16A15]={ category="lo", - description="BAMUM LETTER PHASE-E SOM", + description="BAMUM LETTER PHASE-F SEUX", direction="l", linebreak="al", - unicodeslot=0x1696D, + unicodeslot=0x16A15, }, - [0x1696E]={ + [0x16A16]={ category="lo", - description="BAMUM LETTER PHASE-E RAQ", + description="BAMUM LETTER PHASE-F KYEE", direction="l", linebreak="al", - unicodeslot=0x1696E, + unicodeslot=0x16A16, }, - [0x1696F]={ + [0x16A17]={ category="lo", - description="BAMUM LETTER PHASE-E NSHUOP", + description="BAMUM LETTER PHASE-F KET", direction="l", linebreak="al", - unicodeslot=0x1696F, + unicodeslot=0x16A17, }, - [0x16970]={ + [0x16A18]={ category="lo", - description="BAMUM LETTER PHASE-E NDUN", + description="BAMUM LETTER PHASE-F NUAE", direction="l", linebreak="al", - unicodeslot=0x16970, + unicodeslot=0x16A18, }, - [0x16971]={ + [0x16A19]={ category="lo", - description="BAMUM LETTER PHASE-E PUAE", + description="BAMUM LETTER PHASE-F NU", direction="l", linebreak="al", - unicodeslot=0x16971, + unicodeslot=0x16A19, }, - [0x16972]={ + [0x16A1A]={ category="lo", - description="BAMUM LETTER PHASE-E TAM", + description="BAMUM LETTER PHASE-F NJUAE", direction="l", linebreak="al", - unicodeslot=0x16972, + unicodeslot=0x16A1A, }, - [0x16973]={ + [0x16A1B]={ category="lo", - description="BAMUM LETTER PHASE-E NGKA", + description="BAMUM LETTER PHASE-F YOQ", direction="l", linebreak="al", - unicodeslot=0x16973, + unicodeslot=0x16A1B, }, - [0x16974]={ + [0x16A1C]={ category="lo", - description="BAMUM LETTER PHASE-E KPEUX", + description="BAMUM LETTER PHASE-F SHU", direction="l", linebreak="al", - unicodeslot=0x16974, + unicodeslot=0x16A1C, }, - [0x16975]={ + [0x16A1D]={ category="lo", - description="BAMUM LETTER PHASE-E WUO", + description="BAMUM LETTER PHASE-F YA", direction="l", linebreak="al", - unicodeslot=0x16975, + unicodeslot=0x16A1D, }, - [0x16976]={ + [0x16A1E]={ category="lo", - description="BAMUM LETTER PHASE-E SEE", + description="BAMUM LETTER PHASE-F NSHA", direction="l", linebreak="al", - unicodeslot=0x16976, + unicodeslot=0x16A1E, }, - [0x16977]={ + [0x16A1F]={ category="lo", - description="BAMUM LETTER PHASE-E NGGEUAET", + description="BAMUM LETTER PHASE-F PEUX", direction="l", linebreak="al", - unicodeslot=0x16977, + unicodeslot=0x16A1F, }, - [0x16978]={ + [0x16A20]={ category="lo", - description="BAMUM LETTER PHASE-E PAAM", + description="BAMUM LETTER PHASE-F NTEE", direction="l", linebreak="al", - unicodeslot=0x16978, + unicodeslot=0x16A20, }, - [0x16979]={ + [0x16A21]={ category="lo", - description="BAMUM LETTER PHASE-E TOO", + description="BAMUM LETTER PHASE-F WUE", direction="l", linebreak="al", - unicodeslot=0x16979, + unicodeslot=0x16A21, }, - [0x1697A]={ + [0x16A22]={ category="lo", - description="BAMUM LETTER PHASE-E KUOP", + description="BAMUM LETTER PHASE-F PEE", direction="l", linebreak="al", - unicodeslot=0x1697A, + unicodeslot=0x16A22, }, - [0x1697B]={ + [0x16A23]={ category="lo", - description="BAMUM LETTER PHASE-E LOM", + description="BAMUM LETTER PHASE-F RU", direction="l", linebreak="al", - unicodeslot=0x1697B, + unicodeslot=0x16A23, }, - [0x1697C]={ + [0x16A24]={ category="lo", - description="BAMUM LETTER PHASE-E NSHIEE", + description="BAMUM LETTER PHASE-F NI", direction="l", linebreak="al", - unicodeslot=0x1697C, + unicodeslot=0x16A24, }, - [0x1697D]={ + [0x16A25]={ category="lo", - description="BAMUM LETTER PHASE-E NGOP", + description="BAMUM LETTER PHASE-F REUX", direction="l", linebreak="al", - unicodeslot=0x1697D, + unicodeslot=0x16A25, }, - [0x1697E]={ + [0x16A26]={ category="lo", - description="BAMUM LETTER PHASE-E MAEM", + description="BAMUM LETTER PHASE-F KEN", direction="l", linebreak="al", - unicodeslot=0x1697E, + unicodeslot=0x16A26, }, - [0x1697F]={ + [0x16A27]={ category="lo", - description="BAMUM LETTER PHASE-E NGKEUX", + description="BAMUM LETTER PHASE-F NGKWAEN", direction="l", linebreak="al", - unicodeslot=0x1697F, + unicodeslot=0x16A27, }, - [0x16980]={ + [0x16A28]={ category="lo", - description="BAMUM LETTER PHASE-E NGOQ", + description="BAMUM LETTER PHASE-F NGGA", direction="l", linebreak="al", - unicodeslot=0x16980, + unicodeslot=0x16A28, }, - [0x16981]={ + [0x16A29]={ category="lo", - description="BAMUM LETTER PHASE-E NSHUE", + description="BAMUM LETTER PHASE-F SHO", direction="l", linebreak="al", - unicodeslot=0x16981, + unicodeslot=0x16A29, }, - [0x16982]={ + [0x16A2A]={ category="lo", - description="BAMUM LETTER PHASE-E RIMGBA", + description="BAMUM LETTER PHASE-F PUAE", direction="l", linebreak="al", - unicodeslot=0x16982, + unicodeslot=0x16A2A, }, - [0x16983]={ + [0x16A2B]={ category="lo", - description="BAMUM LETTER PHASE-E NJEUX", + description="BAMUM LETTER PHASE-F FOM", direction="l", linebreak="al", - unicodeslot=0x16983, + unicodeslot=0x16A2B, }, - [0x16984]={ + [0x16A2C]={ category="lo", - description="BAMUM LETTER PHASE-E PEEM", + description="BAMUM LETTER PHASE-F WA", direction="l", linebreak="al", - unicodeslot=0x16984, + unicodeslot=0x16A2C, }, - [0x16985]={ + [0x16A2D]={ category="lo", - description="BAMUM LETTER PHASE-E SAA", + description="BAMUM LETTER PHASE-F LI", direction="l", linebreak="al", - unicodeslot=0x16985, + unicodeslot=0x16A2D, }, - [0x16986]={ + [0x16A2E]={ category="lo", - description="BAMUM LETTER PHASE-E NGGURAE", + description="BAMUM LETTER PHASE-F LOQ", direction="l", linebreak="al", - unicodeslot=0x16986, + unicodeslot=0x16A2E, }, - [0x16987]={ + [0x16A2F]={ category="lo", - description="BAMUM LETTER PHASE-E MGBA", + description="BAMUM LETTER PHASE-F KO", direction="l", linebreak="al", - unicodeslot=0x16987, + unicodeslot=0x16A2F, }, - [0x16988]={ + [0x16A30]={ category="lo", - description="BAMUM LETTER PHASE-E GHEUX", + description="BAMUM LETTER PHASE-F MBEN", direction="l", linebreak="al", - unicodeslot=0x16988, + unicodeslot=0x16A30, }, - [0x16989]={ + [0x16A31]={ category="lo", - description="BAMUM LETTER PHASE-E NGKEUAEM", + description="BAMUM LETTER PHASE-F REN", direction="l", linebreak="al", - unicodeslot=0x16989, + unicodeslot=0x16A31, }, - [0x1698A]={ + [0x16A32]={ category="lo", - description="BAMUM LETTER PHASE-E NJAEMLI", + description="BAMUM LETTER PHASE-F MA", direction="l", linebreak="al", - unicodeslot=0x1698A, + unicodeslot=0x16A32, }, - [0x1698B]={ + [0x16A33]={ category="lo", - description="BAMUM LETTER PHASE-E MAP", + description="BAMUM LETTER PHASE-F MO", direction="l", linebreak="al", - unicodeslot=0x1698B, + unicodeslot=0x16A33, }, - [0x1698C]={ + [0x16A34]={ category="lo", - description="BAMUM LETTER PHASE-E LOOT", + description="BAMUM LETTER PHASE-F MBAA", direction="l", linebreak="al", - unicodeslot=0x1698C, + unicodeslot=0x16A34, }, - [0x1698D]={ + [0x16A35]={ category="lo", - description="BAMUM LETTER PHASE-E NGGEEEE", + description="BAMUM LETTER PHASE-F TET", direction="l", linebreak="al", - unicodeslot=0x1698D, + unicodeslot=0x16A35, }, - [0x1698E]={ + [0x16A36]={ category="lo", - description="BAMUM LETTER PHASE-E NDIQ", + description="BAMUM LETTER PHASE-F KPA", direction="l", linebreak="al", - unicodeslot=0x1698E, + unicodeslot=0x16A36, }, - [0x1698F]={ + [0x16A37]={ category="lo", - description="BAMUM LETTER PHASE-E TAEN NTEUM", + description="BAMUM LETTER PHASE-F SAMBA", direction="l", linebreak="al", - unicodeslot=0x1698F, + unicodeslot=0x16A37, }, - [0x16990]={ + [0x16A38]={ category="lo", - description="BAMUM LETTER PHASE-E SET", + description="BAMUM LETTER PHASE-F VUEQ", direction="l", linebreak="al", - unicodeslot=0x16990, + unicodeslot=0x16A38, }, - [0x16991]={ + [0x16A40]={ category="lo", - description="BAMUM LETTER PHASE-E PUM", + description="MRO LETTER TA", direction="l", linebreak="al", - unicodeslot=0x16991, + unicodeslot=0x16A40, }, - [0x16992]={ + [0x16A41]={ category="lo", - description="BAMUM LETTER PHASE-E NDAA SOFTNESS", + description="MRO LETTER NGI", direction="l", linebreak="al", - unicodeslot=0x16992, + unicodeslot=0x16A41, }, - [0x16993]={ + [0x16A42]={ category="lo", - description="BAMUM LETTER PHASE-E NGGUAESHAE NYAM", + description="MRO LETTER YO", direction="l", linebreak="al", - unicodeslot=0x16993, + unicodeslot=0x16A42, }, - [0x16994]={ + [0x16A43]={ category="lo", - description="BAMUM LETTER PHASE-E YIEE", + description="MRO LETTER MIM", direction="l", linebreak="al", - unicodeslot=0x16994, + unicodeslot=0x16A43, }, - [0x16995]={ + [0x16A44]={ category="lo", - description="BAMUM LETTER PHASE-E GHEUN", + description="MRO LETTER BA", direction="l", linebreak="al", - unicodeslot=0x16995, + unicodeslot=0x16A44, }, - [0x16996]={ + [0x16A45]={ category="lo", - description="BAMUM LETTER PHASE-E TUAE", + description="MRO LETTER DA", direction="l", linebreak="al", - unicodeslot=0x16996, + unicodeslot=0x16A45, }, - [0x16997]={ + [0x16A46]={ category="lo", - description="BAMUM LETTER PHASE-E YEUAE", + description="MRO LETTER A", direction="l", linebreak="al", - unicodeslot=0x16997, + unicodeslot=0x16A46, }, - [0x16998]={ + [0x16A47]={ category="lo", - description="BAMUM LETTER PHASE-E PO", + description="MRO LETTER PHI", direction="l", linebreak="al", - unicodeslot=0x16998, + unicodeslot=0x16A47, }, - [0x16999]={ + [0x16A48]={ category="lo", - description="BAMUM LETTER PHASE-E TUMAE", + description="MRO LETTER KHAI", direction="l", linebreak="al", - unicodeslot=0x16999, + unicodeslot=0x16A48, }, - [0x1699A]={ + [0x16A49]={ category="lo", - description="BAMUM LETTER PHASE-E KEUAE", + description="MRO LETTER HAO", direction="l", linebreak="al", - unicodeslot=0x1699A, + unicodeslot=0x16A49, }, - [0x1699B]={ + [0x16A4A]={ category="lo", - description="BAMUM LETTER PHASE-E SUAEN", + description="MRO LETTER DAI", direction="l", linebreak="al", - unicodeslot=0x1699B, + unicodeslot=0x16A4A, }, - [0x1699C]={ + [0x16A4B]={ category="lo", - description="BAMUM LETTER PHASE-E TEUAEQ", + description="MRO LETTER CHU", direction="l", linebreak="al", - unicodeslot=0x1699C, + unicodeslot=0x16A4B, }, - [0x1699D]={ + [0x16A4C]={ category="lo", - description="BAMUM LETTER PHASE-E VEUAE", + description="MRO LETTER KEAAE", direction="l", linebreak="al", - unicodeslot=0x1699D, + unicodeslot=0x16A4C, }, - [0x1699E]={ + [0x16A4D]={ category="lo", - description="BAMUM LETTER PHASE-E WEUX", + description="MRO LETTER OL", direction="l", linebreak="al", - unicodeslot=0x1699E, + unicodeslot=0x16A4D, }, - [0x1699F]={ + [0x16A4E]={ category="lo", - description="BAMUM LETTER PHASE-E LAAM", + description="MRO LETTER MAEM", direction="l", linebreak="al", - unicodeslot=0x1699F, + unicodeslot=0x16A4E, }, - [0x169A0]={ + [0x16A4F]={ category="lo", - description="BAMUM LETTER PHASE-E PU", + description="MRO LETTER NIN", direction="l", linebreak="al", - unicodeslot=0x169A0, + unicodeslot=0x16A4F, }, - [0x169A1]={ + [0x16A50]={ category="lo", - description="BAMUM LETTER PHASE-E TAAQ", + description="MRO LETTER PA", direction="l", linebreak="al", - unicodeslot=0x169A1, + unicodeslot=0x16A50, }, - [0x169A2]={ + [0x16A51]={ category="lo", - description="BAMUM LETTER PHASE-E GHAAMAE", + description="MRO LETTER OO", direction="l", linebreak="al", - unicodeslot=0x169A2, + unicodeslot=0x16A51, }, - [0x169A3]={ + [0x16A52]={ category="lo", - description="BAMUM LETTER PHASE-E NGEUREUT", + description="MRO LETTER O", direction="l", linebreak="al", - unicodeslot=0x169A3, + unicodeslot=0x16A52, }, - [0x169A4]={ + [0x16A53]={ category="lo", - description="BAMUM LETTER PHASE-E SHEUAEQ", + description="MRO LETTER RO", direction="l", linebreak="al", - unicodeslot=0x169A4, + unicodeslot=0x16A53, }, - [0x169A5]={ + [0x16A54]={ category="lo", - description="BAMUM LETTER PHASE-E MGBEN", + description="MRO LETTER SHI", direction="l", linebreak="al", - unicodeslot=0x169A5, + unicodeslot=0x16A54, }, - [0x169A6]={ + [0x16A55]={ category="lo", - description="BAMUM LETTER PHASE-E MBEE", + description="MRO LETTER THEA", direction="l", linebreak="al", - unicodeslot=0x169A6, + unicodeslot=0x16A55, }, - [0x169A7]={ + [0x16A56]={ category="lo", - description="BAMUM LETTER PHASE-E NZAQ", + description="MRO LETTER EA", direction="l", linebreak="al", - unicodeslot=0x169A7, + unicodeslot=0x16A56, }, - [0x169A8]={ + [0x16A57]={ category="lo", - description="BAMUM LETTER PHASE-E NKOM", + description="MRO LETTER WA", direction="l", linebreak="al", - unicodeslot=0x169A8, + unicodeslot=0x16A57, }, - [0x169A9]={ + [0x16A58]={ category="lo", - description="BAMUM LETTER PHASE-E GBET", + description="MRO LETTER E", direction="l", linebreak="al", - unicodeslot=0x169A9, + unicodeslot=0x16A58, }, - [0x169AA]={ + [0x16A59]={ category="lo", - description="BAMUM LETTER PHASE-E TUM", + description="MRO LETTER KO", direction="l", linebreak="al", - unicodeslot=0x169AA, + unicodeslot=0x16A59, }, - [0x169AB]={ + [0x16A5A]={ category="lo", - description="BAMUM LETTER PHASE-E KUET", + description="MRO LETTER LAN", direction="l", linebreak="al", - unicodeslot=0x169AB, + unicodeslot=0x16A5A, }, - [0x169AC]={ + [0x16A5B]={ category="lo", - description="BAMUM LETTER PHASE-E YAP", + description="MRO LETTER LA", direction="l", linebreak="al", - unicodeslot=0x169AC, + unicodeslot=0x16A5B, }, - [0x169AD]={ + [0x16A5C]={ category="lo", - description="BAMUM LETTER PHASE-E NYI CLEAVER", + description="MRO LETTER HAI", direction="l", linebreak="al", - unicodeslot=0x169AD, + unicodeslot=0x16A5C, }, - [0x169AE]={ + [0x16A5D]={ category="lo", - description="BAMUM LETTER PHASE-E YIT", + description="MRO LETTER RI", direction="l", linebreak="al", - unicodeslot=0x169AE, + unicodeslot=0x16A5D, }, - [0x169AF]={ + [0x16A5E]={ category="lo", - description="BAMUM LETTER PHASE-E MFEUQ", + description="MRO LETTER TEK", direction="l", linebreak="al", - unicodeslot=0x169AF, + unicodeslot=0x16A5E, }, - [0x169B0]={ - category="lo", - description="BAMUM LETTER PHASE-E NDIAQ", + [0x16A60]={ + category="nd", + description="MRO DIGIT ZERO", direction="l", - linebreak="al", - unicodeslot=0x169B0, + linebreak="nu", + unicodeslot=0x16A60, }, - [0x169B1]={ + [0x16A61]={ + category="nd", + description="MRO DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x16A61, + }, + [0x16A62]={ + category="nd", + description="MRO DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x16A62, + }, + [0x16A63]={ + category="nd", + description="MRO DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x16A63, + }, + [0x16A64]={ + category="nd", + description="MRO DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x16A64, + }, + [0x16A65]={ + category="nd", + description="MRO DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x16A65, + }, + [0x16A66]={ + category="nd", + description="MRO DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x16A66, + }, + [0x16A67]={ + category="nd", + description="MRO DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x16A67, + }, + [0x16A68]={ + category="nd", + description="MRO DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x16A68, + }, + [0x16A69]={ + category="nd", + description="MRO DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x16A69, + }, + [0x16A6E]={ + category="po", + description="MRO DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x16A6E, + }, + [0x16A6F]={ + category="po", + description="MRO DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x16A6F, + }, + [0x16AD0]={ category="lo", - description="BAMUM LETTER PHASE-E PIEEQ", + description="BASSA VAH LETTER ENNI", direction="l", linebreak="al", - unicodeslot=0x169B1, + unicodeslot=0x16AD0, }, - [0x169B2]={ + [0x16AD1]={ category="lo", - description="BAMUM LETTER PHASE-E YUEQ", + description="BASSA VAH LETTER KA", direction="l", linebreak="al", - unicodeslot=0x169B2, + unicodeslot=0x16AD1, }, - [0x169B3]={ + [0x16AD2]={ category="lo", - description="BAMUM LETTER PHASE-E LEUAEM", + description="BASSA VAH LETTER SE", direction="l", linebreak="al", - unicodeslot=0x169B3, + unicodeslot=0x16AD2, }, - [0x169B4]={ + [0x16AD3]={ category="lo", - description="BAMUM LETTER PHASE-E FUE", + description="BASSA VAH LETTER FA", direction="l", linebreak="al", - unicodeslot=0x169B4, + unicodeslot=0x16AD3, }, - [0x169B5]={ + [0x16AD4]={ category="lo", - description="BAMUM LETTER PHASE-E GBEUX", + description="BASSA VAH LETTER MBE", direction="l", linebreak="al", - unicodeslot=0x169B5, + unicodeslot=0x16AD4, }, - [0x169B6]={ + [0x16AD5]={ category="lo", - description="BAMUM LETTER PHASE-E NGKUP", + description="BASSA VAH LETTER YIE", direction="l", linebreak="al", - unicodeslot=0x169B6, + unicodeslot=0x16AD5, }, - [0x169B7]={ + [0x16AD6]={ category="lo", - description="BAMUM LETTER PHASE-E KET", + description="BASSA VAH LETTER GAH", direction="l", linebreak="al", - unicodeslot=0x169B7, + unicodeslot=0x16AD6, }, - [0x169B8]={ + [0x16AD7]={ category="lo", - description="BAMUM LETTER PHASE-E MAE", + description="BASSA VAH LETTER DHII", direction="l", linebreak="al", - unicodeslot=0x169B8, + unicodeslot=0x16AD7, }, - [0x169B9]={ + [0x16AD8]={ category="lo", - description="BAMUM LETTER PHASE-E NGKAAMI", + description="BASSA VAH LETTER KPAH", direction="l", linebreak="al", - unicodeslot=0x169B9, + unicodeslot=0x16AD8, }, - [0x169BA]={ + [0x16AD9]={ category="lo", - description="BAMUM LETTER PHASE-E GHET", + description="BASSA VAH LETTER JO", direction="l", linebreak="al", - unicodeslot=0x169BA, + unicodeslot=0x16AD9, }, - [0x169BB]={ + [0x16ADA]={ category="lo", - description="BAMUM LETTER PHASE-E FA", + description="BASSA VAH LETTER HWAH", direction="l", linebreak="al", - unicodeslot=0x169BB, + unicodeslot=0x16ADA, }, - [0x169BC]={ + [0x16ADB]={ category="lo", - description="BAMUM LETTER PHASE-E NTUM", + description="BASSA VAH LETTER WA", direction="l", linebreak="al", - unicodeslot=0x169BC, + unicodeslot=0x16ADB, }, - [0x169BD]={ + [0x16ADC]={ category="lo", - description="BAMUM LETTER PHASE-E PEUT", + description="BASSA VAH LETTER ZO", direction="l", linebreak="al", - unicodeslot=0x169BD, + unicodeslot=0x16ADC, }, - [0x169BE]={ + [0x16ADD]={ category="lo", - description="BAMUM LETTER PHASE-E YEUM", + description="BASSA VAH LETTER GBU", direction="l", linebreak="al", - unicodeslot=0x169BE, + unicodeslot=0x16ADD, }, - [0x169BF]={ + [0x16ADE]={ category="lo", - description="BAMUM LETTER PHASE-E NGGEUAE", + description="BASSA VAH LETTER DO", direction="l", linebreak="al", - unicodeslot=0x169BF, + unicodeslot=0x16ADE, }, - [0x169C0]={ + [0x16ADF]={ category="lo", - description="BAMUM LETTER PHASE-E NYI BETWEEN", + description="BASSA VAH LETTER CE", direction="l", linebreak="al", - unicodeslot=0x169C0, + unicodeslot=0x16ADF, }, - [0x169C1]={ + [0x16AE0]={ category="lo", - description="BAMUM LETTER PHASE-E NZUQ", + description="BASSA VAH LETTER UWU", direction="l", linebreak="al", - unicodeslot=0x169C1, + unicodeslot=0x16AE0, }, - [0x169C2]={ + [0x16AE1]={ category="lo", - description="BAMUM LETTER PHASE-E POON", + description="BASSA VAH LETTER TO", direction="l", linebreak="al", - unicodeslot=0x169C2, + unicodeslot=0x16AE1, }, - [0x169C3]={ + [0x16AE2]={ category="lo", - description="BAMUM LETTER PHASE-E MIEE", + description="BASSA VAH LETTER BA", direction="l", linebreak="al", - unicodeslot=0x169C3, + unicodeslot=0x16AE2, }, - [0x169C4]={ + [0x16AE3]={ category="lo", - description="BAMUM LETTER PHASE-E FUET", + description="BASSA VAH LETTER VU", direction="l", linebreak="al", - unicodeslot=0x169C4, + unicodeslot=0x16AE3, }, - [0x169C5]={ + [0x16AE4]={ category="lo", - description="BAMUM LETTER PHASE-E NAE", + description="BASSA VAH LETTER YEIN", direction="l", linebreak="al", - unicodeslot=0x169C5, + unicodeslot=0x16AE4, }, - [0x169C6]={ + [0x16AE5]={ category="lo", - description="BAMUM LETTER PHASE-E MUAE", + description="BASSA VAH LETTER PA", direction="l", linebreak="al", - unicodeslot=0x169C6, + unicodeslot=0x16AE5, }, - [0x169C7]={ + [0x16AE6]={ category="lo", - description="BAMUM LETTER PHASE-E GHEUAE", + description="BASSA VAH LETTER WADDA", direction="l", linebreak="al", - unicodeslot=0x169C7, + unicodeslot=0x16AE6, }, - [0x169C8]={ + [0x16AE7]={ category="lo", - description="BAMUM LETTER PHASE-E FU I", + description="BASSA VAH LETTER A", direction="l", linebreak="al", - unicodeslot=0x169C8, + unicodeslot=0x16AE7, }, - [0x169C9]={ + [0x16AE8]={ category="lo", - description="BAMUM LETTER PHASE-E MVI", + description="BASSA VAH LETTER O", direction="l", linebreak="al", - unicodeslot=0x169C9, + unicodeslot=0x16AE8, }, - [0x169CA]={ + [0x16AE9]={ category="lo", - description="BAMUM LETTER PHASE-E PUAQ", + description="BASSA VAH LETTER OO", direction="l", linebreak="al", - unicodeslot=0x169CA, + unicodeslot=0x16AE9, }, - [0x169CB]={ + [0x16AEA]={ category="lo", - description="BAMUM LETTER PHASE-E NGKUM", + description="BASSA VAH LETTER U", direction="l", linebreak="al", - unicodeslot=0x169CB, + unicodeslot=0x16AEA, }, - [0x169CC]={ + [0x16AEB]={ category="lo", - description="BAMUM LETTER PHASE-E KUT", + description="BASSA VAH LETTER EE", direction="l", linebreak="al", - unicodeslot=0x169CC, + unicodeslot=0x16AEB, }, - [0x169CD]={ + [0x16AEC]={ category="lo", - description="BAMUM LETTER PHASE-E PIET", + description="BASSA VAH LETTER E", direction="l", linebreak="al", - unicodeslot=0x169CD, + unicodeslot=0x16AEC, }, - [0x169CE]={ + [0x16AED]={ category="lo", - description="BAMUM LETTER PHASE-E NTAP", + description="BASSA VAH LETTER I", direction="l", linebreak="al", - unicodeslot=0x169CE, + unicodeslot=0x16AED, }, - [0x169CF]={ + [0x16AF0]={ + category="mn", + combining=0x1, + description="BASSA VAH COMBINING HIGH TONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x16AF0, + }, + [0x16AF1]={ + category="mn", + combining=0x1, + description="BASSA VAH COMBINING LOW TONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x16AF1, + }, + [0x16AF2]={ + category="mn", + combining=0x1, + description="BASSA VAH COMBINING MID TONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x16AF2, + }, + [0x16AF3]={ + category="mn", + combining=0x1, + description="BASSA VAH COMBINING LOW-MID TONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x16AF3, + }, + [0x16AF4]={ + category="mn", + combining=0x1, + description="BASSA VAH COMBINING HIGH-LOW TONE", + direction="nsm", + linebreak="cm", + unicodeslot=0x16AF4, + }, + [0x16AF5]={ + category="po", + description="BASSA VAH FULL STOP", + direction="l", + linebreak="ba", + unicodeslot=0x16AF5, + }, + [0x16B00]={ category="lo", - description="BAMUM LETTER PHASE-E YEUAET", + description="PAHAWH HMONG VOWEL KEEB", direction="l", linebreak="al", - unicodeslot=0x169CF, + unicodeslot=0x16B00, }, - [0x169D0]={ + [0x16B01]={ category="lo", - description="BAMUM LETTER PHASE-E NGGUP", + description="PAHAWH HMONG VOWEL KEEV", direction="l", linebreak="al", - unicodeslot=0x169D0, + unicodeslot=0x16B01, }, - [0x169D1]={ + [0x16B02]={ category="lo", - description="BAMUM LETTER PHASE-E PA PEOPLE", + description="PAHAWH HMONG VOWEL KIB", direction="l", linebreak="al", - unicodeslot=0x169D1, + unicodeslot=0x16B02, }, - [0x169D2]={ + [0x16B03]={ category="lo", - description="BAMUM LETTER PHASE-E FU CALL", + description="PAHAWH HMONG VOWEL KIV", direction="l", linebreak="al", - unicodeslot=0x169D2, + unicodeslot=0x16B03, }, - [0x169D3]={ + [0x16B04]={ category="lo", - description="BAMUM LETTER PHASE-E FOM", + description="PAHAWH HMONG VOWEL KAUB", direction="l", linebreak="al", - unicodeslot=0x169D3, + unicodeslot=0x16B04, }, - [0x169D4]={ + [0x16B05]={ category="lo", - description="BAMUM LETTER PHASE-E NJEE", + description="PAHAWH HMONG VOWEL KAUV", direction="l", linebreak="al", - unicodeslot=0x169D4, + unicodeslot=0x16B05, }, - [0x169D5]={ + [0x16B06]={ category="lo", - description="BAMUM LETTER PHASE-E A", + description="PAHAWH HMONG VOWEL KUB", direction="l", linebreak="al", - unicodeslot=0x169D5, + unicodeslot=0x16B06, }, - [0x169D6]={ + [0x16B07]={ category="lo", - description="BAMUM LETTER PHASE-E TOQ", + description="PAHAWH HMONG VOWEL KUV", direction="l", linebreak="al", - unicodeslot=0x169D6, + unicodeslot=0x16B07, }, - [0x169D7]={ + [0x16B08]={ category="lo", - description="BAMUM LETTER PHASE-E O", + description="PAHAWH HMONG VOWEL KEB", direction="l", linebreak="al", - unicodeslot=0x169D7, + unicodeslot=0x16B08, }, - [0x169D8]={ + [0x16B09]={ category="lo", - description="BAMUM LETTER PHASE-E I", + description="PAHAWH HMONG VOWEL KEV", direction="l", linebreak="al", - unicodeslot=0x169D8, + unicodeslot=0x16B09, }, - [0x169D9]={ + [0x16B0A]={ category="lo", - description="BAMUM LETTER PHASE-E LAQ", + description="PAHAWH HMONG VOWEL KAIB", direction="l", linebreak="al", - unicodeslot=0x169D9, + unicodeslot=0x16B0A, }, - [0x169DA]={ + [0x16B0B]={ category="lo", - description="BAMUM LETTER PHASE-E PA PLURAL", + description="PAHAWH HMONG VOWEL KAIV", direction="l", linebreak="al", - unicodeslot=0x169DA, + unicodeslot=0x16B0B, }, - [0x169DB]={ + [0x16B0C]={ category="lo", - description="BAMUM LETTER PHASE-E TAA", + description="PAHAWH HMONG VOWEL KOOB", direction="l", linebreak="al", - unicodeslot=0x169DB, + unicodeslot=0x16B0C, }, - [0x169DC]={ + [0x16B0D]={ category="lo", - description="BAMUM LETTER PHASE-E TAQ", + description="PAHAWH HMONG VOWEL KOOV", direction="l", linebreak="al", - unicodeslot=0x169DC, + unicodeslot=0x16B0D, }, - [0x169DD]={ + [0x16B0E]={ category="lo", - description="BAMUM LETTER PHASE-E NDAA MY HOUSE", + description="PAHAWH HMONG VOWEL KAWB", direction="l", linebreak="al", - unicodeslot=0x169DD, + unicodeslot=0x16B0E, }, - [0x169DE]={ + [0x16B0F]={ category="lo", - description="BAMUM LETTER PHASE-E SHIQ", + description="PAHAWH HMONG VOWEL KAWV", direction="l", linebreak="al", - unicodeslot=0x169DE, + unicodeslot=0x16B0F, }, - [0x169DF]={ + [0x16B10]={ category="lo", - description="BAMUM LETTER PHASE-E YEUX", + description="PAHAWH HMONG VOWEL KUAB", direction="l", linebreak="al", - unicodeslot=0x169DF, + unicodeslot=0x16B10, }, - [0x169E0]={ + [0x16B11]={ category="lo", - description="BAMUM LETTER PHASE-E NGUAE", + description="PAHAWH HMONG VOWEL KUAV", direction="l", linebreak="al", - unicodeslot=0x169E0, + unicodeslot=0x16B11, }, - [0x169E1]={ + [0x16B12]={ category="lo", - description="BAMUM LETTER PHASE-E YUAEN", + description="PAHAWH HMONG VOWEL KOB", direction="l", linebreak="al", - unicodeslot=0x169E1, + unicodeslot=0x16B12, }, - [0x169E2]={ + [0x16B13]={ category="lo", - description="BAMUM LETTER PHASE-E YOQ SWIMMING", + description="PAHAWH HMONG VOWEL KOV", direction="l", linebreak="al", - unicodeslot=0x169E2, + unicodeslot=0x16B13, }, - [0x169E3]={ + [0x16B14]={ category="lo", - description="BAMUM LETTER PHASE-E YOQ COVER", + description="PAHAWH HMONG VOWEL KIAB", direction="l", linebreak="al", - unicodeslot=0x169E3, + unicodeslot=0x16B14, }, - [0x169E4]={ + [0x16B15]={ category="lo", - description="BAMUM LETTER PHASE-E YUQ", + description="PAHAWH HMONG VOWEL KIAV", direction="l", linebreak="al", - unicodeslot=0x169E4, + unicodeslot=0x16B15, }, - [0x169E5]={ + [0x16B16]={ category="lo", - description="BAMUM LETTER PHASE-E YUN", + description="PAHAWH HMONG VOWEL KAB", direction="l", linebreak="al", - unicodeslot=0x169E5, + unicodeslot=0x16B16, }, - [0x169E6]={ + [0x16B17]={ category="lo", - description="BAMUM LETTER PHASE-E KEUX", + description="PAHAWH HMONG VOWEL KAV", direction="l", linebreak="al", - unicodeslot=0x169E6, + unicodeslot=0x16B17, }, - [0x169E7]={ + [0x16B18]={ category="lo", - description="BAMUM LETTER PHASE-E PEUX", + description="PAHAWH HMONG VOWEL KWB", direction="l", linebreak="al", - unicodeslot=0x169E7, + unicodeslot=0x16B18, }, - [0x169E8]={ + [0x16B19]={ category="lo", - description="BAMUM LETTER PHASE-E NJEE EPOCH", + description="PAHAWH HMONG VOWEL KWV", direction="l", linebreak="al", - unicodeslot=0x169E8, + unicodeslot=0x16B19, }, - [0x169E9]={ + [0x16B1A]={ category="lo", - description="BAMUM LETTER PHASE-E PUE", + description="PAHAWH HMONG VOWEL KAAB", direction="l", linebreak="al", - unicodeslot=0x169E9, + unicodeslot=0x16B1A, }, - [0x169EA]={ + [0x16B1B]={ category="lo", - description="BAMUM LETTER PHASE-E WUE", + description="PAHAWH HMONG VOWEL KAAV", direction="l", linebreak="al", - unicodeslot=0x169EA, + unicodeslot=0x16B1B, }, - [0x169EB]={ + [0x16B1C]={ category="lo", - description="BAMUM LETTER PHASE-E FEE", + description="PAHAWH HMONG CONSONANT VAU", direction="l", linebreak="al", - unicodeslot=0x169EB, + unicodeslot=0x16B1C, }, - [0x169EC]={ + [0x16B1D]={ category="lo", - description="BAMUM LETTER PHASE-E VEE", + description="PAHAWH HMONG CONSONANT NTSAU", direction="l", linebreak="al", - unicodeslot=0x169EC, + unicodeslot=0x16B1D, }, - [0x169ED]={ + [0x16B1E]={ category="lo", - description="BAMUM LETTER PHASE-E LU", + description="PAHAWH HMONG CONSONANT LAU", direction="l", linebreak="al", - unicodeslot=0x169ED, + unicodeslot=0x16B1E, }, - [0x169EE]={ + [0x16B1F]={ category="lo", - description="BAMUM LETTER PHASE-E MI", + description="PAHAWH HMONG CONSONANT HAU", direction="l", linebreak="al", - unicodeslot=0x169EE, + unicodeslot=0x16B1F, }, - [0x169EF]={ + [0x16B20]={ category="lo", - description="BAMUM LETTER PHASE-E REUX", + description="PAHAWH HMONG CONSONANT NLAU", direction="l", linebreak="al", - unicodeslot=0x169EF, + unicodeslot=0x16B20, }, - [0x169F0]={ + [0x16B21]={ category="lo", - description="BAMUM LETTER PHASE-E RAE", + description="PAHAWH HMONG CONSONANT RAU", direction="l", linebreak="al", - unicodeslot=0x169F0, + unicodeslot=0x16B21, }, - [0x169F1]={ + [0x16B22]={ category="lo", - description="BAMUM LETTER PHASE-E NGUAET", + description="PAHAWH HMONG CONSONANT NKAU", direction="l", linebreak="al", - unicodeslot=0x169F1, + unicodeslot=0x16B22, }, - [0x169F2]={ + [0x16B23]={ category="lo", - description="BAMUM LETTER PHASE-E NGA", + description="PAHAWH HMONG CONSONANT QHAU", direction="l", linebreak="al", - unicodeslot=0x169F2, + unicodeslot=0x16B23, }, - [0x169F3]={ + [0x16B24]={ category="lo", - description="BAMUM LETTER PHASE-E SHO", + description="PAHAWH HMONG CONSONANT YAU", direction="l", linebreak="al", - unicodeslot=0x169F3, + unicodeslot=0x16B24, }, - [0x169F4]={ + [0x16B25]={ category="lo", - description="BAMUM LETTER PHASE-E SHOQ", + description="PAHAWH HMONG CONSONANT HLAU", direction="l", linebreak="al", - unicodeslot=0x169F4, + unicodeslot=0x16B25, }, - [0x169F5]={ + [0x16B26]={ category="lo", - description="BAMUM LETTER PHASE-E FU REMEDY", + description="PAHAWH HMONG CONSONANT MAU", direction="l", linebreak="al", - unicodeslot=0x169F5, + unicodeslot=0x16B26, }, - [0x169F6]={ + [0x16B27]={ category="lo", - description="BAMUM LETTER PHASE-E NA", + description="PAHAWH HMONG CONSONANT CHAU", direction="l", linebreak="al", - unicodeslot=0x169F6, + unicodeslot=0x16B27, }, - [0x169F7]={ + [0x16B28]={ category="lo", - description="BAMUM LETTER PHASE-E PI", + description="PAHAWH HMONG CONSONANT NCHAU", direction="l", linebreak="al", - unicodeslot=0x169F7, + unicodeslot=0x16B28, }, - [0x169F8]={ + [0x16B29]={ category="lo", - description="BAMUM LETTER PHASE-E LOQ", + description="PAHAWH HMONG CONSONANT HNAU", direction="l", linebreak="al", - unicodeslot=0x169F8, + unicodeslot=0x16B29, }, - [0x169F9]={ + [0x16B2A]={ category="lo", - description="BAMUM LETTER PHASE-E KO", + description="PAHAWH HMONG CONSONANT PLHAU", direction="l", linebreak="al", - unicodeslot=0x169F9, + unicodeslot=0x16B2A, }, - [0x169FA]={ + [0x16B2B]={ category="lo", - description="BAMUM LETTER PHASE-E MEN", + description="PAHAWH HMONG CONSONANT NTHAU", direction="l", linebreak="al", - unicodeslot=0x169FA, + unicodeslot=0x16B2B, }, - [0x169FB]={ + [0x16B2C]={ category="lo", - description="BAMUM LETTER PHASE-E MA", + description="PAHAWH HMONG CONSONANT NAU", direction="l", linebreak="al", - unicodeslot=0x169FB, + unicodeslot=0x16B2C, }, - [0x169FC]={ + [0x16B2D]={ category="lo", - description="BAMUM LETTER PHASE-E MAQ", + description="PAHAWH HMONG CONSONANT AU", direction="l", linebreak="al", - unicodeslot=0x169FC, + unicodeslot=0x16B2D, }, - [0x169FD]={ + [0x16B2E]={ category="lo", - description="BAMUM LETTER PHASE-E TEU", + description="PAHAWH HMONG CONSONANT XAU", direction="l", linebreak="al", - unicodeslot=0x169FD, + unicodeslot=0x16B2E, }, - [0x169FE]={ + [0x16B2F]={ category="lo", - description="BAMUM LETTER PHASE-E KI", + description="PAHAWH HMONG CONSONANT CAU", direction="l", linebreak="al", - unicodeslot=0x169FE, + unicodeslot=0x16B2F, }, - [0x169FF]={ - category="lo", - description="BAMUM LETTER PHASE-E MON", + [0x16B30]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM TUB", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B30, + }, + [0x16B31]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM SO", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B31, + }, + [0x16B32]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM KES", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B32, + }, + [0x16B33]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM KHAV", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B33, + }, + [0x16B34]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM SUAM", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B34, + }, + [0x16B35]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM HOM", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B35, + }, + [0x16B36]={ + category="mn", + combining=0xE6, + description="PAHAWH HMONG MARK CIM TAUM", + direction="nsm", + linebreak="cm", + unicodeslot=0x16B36, + }, + [0x16B37]={ + category="po", + description="PAHAWH HMONG SIGN VOS THOM", + direction="l", + linebreak="ba", + unicodeslot=0x16B37, + }, + [0x16B38]={ + category="po", + description="PAHAWH HMONG SIGN VOS TSHAB CEEB", + direction="l", + linebreak="ba", + unicodeslot=0x16B38, + }, + [0x16B39]={ + category="po", + description="PAHAWH HMONG SIGN CIM CHEEM", + direction="l", + linebreak="ba", + unicodeslot=0x16B39, + }, + [0x16B3A]={ + category="po", + description="PAHAWH HMONG SIGN VOS THIAB", direction="l", linebreak="al", - unicodeslot=0x169FF, + unicodeslot=0x16B3A, }, - [0x16A00]={ - category="lo", - description="BAMUM LETTER PHASE-E TEN", + [0x16B3B]={ + category="po", + description="PAHAWH HMONG SIGN VOS FEEM", direction="l", linebreak="al", - unicodeslot=0x16A00, + unicodeslot=0x16B3B, }, - [0x16A01]={ - category="lo", - description="BAMUM LETTER PHASE-E FAQ", + [0x16B3C]={ + category="so", + description="PAHAWH HMONG SIGN XYEEM NTXIV", direction="l", linebreak="al", - unicodeslot=0x16A01, + unicodeslot=0x16B3C, }, - [0x16A02]={ - category="lo", - description="BAMUM LETTER PHASE-E GHOM", + [0x16B3D]={ + category="so", + description="PAHAWH HMONG SIGN XYEEM RHO", direction="l", linebreak="al", - unicodeslot=0x16A02, + unicodeslot=0x16B3D, }, - [0x16A03]={ - category="lo", - description="BAMUM LETTER PHASE-F KA", + [0x16B3E]={ + category="so", + description="PAHAWH HMONG SIGN XYEEM TOV", direction="l", linebreak="al", - unicodeslot=0x16A03, + unicodeslot=0x16B3E, }, - [0x16A04]={ - category="lo", - description="BAMUM LETTER PHASE-F U", + [0x16B3F]={ + category="so", + description="PAHAWH HMONG SIGN XYEEM FAIB", direction="l", linebreak="al", - unicodeslot=0x16A04, + unicodeslot=0x16B3F, }, - [0x16A05]={ - category="lo", - description="BAMUM LETTER PHASE-F KU", + [0x16B40]={ + category="lm", + description="PAHAWH HMONG SIGN VOS SEEV", direction="l", linebreak="al", - unicodeslot=0x16A05, + unicodeslot=0x16B40, }, - [0x16A06]={ - category="lo", - description="BAMUM LETTER PHASE-F EE", + [0x16B41]={ + category="lm", + description="PAHAWH HMONG SIGN MEEJ SUAB", direction="l", linebreak="al", - unicodeslot=0x16A06, + unicodeslot=0x16B41, }, - [0x16A07]={ - category="lo", - description="BAMUM LETTER PHASE-F REE", + [0x16B42]={ + category="lm", + description="PAHAWH HMONG SIGN VOS NRUA", direction="l", linebreak="al", - unicodeslot=0x16A07, + unicodeslot=0x16B42, }, - [0x16A08]={ - category="lo", - description="BAMUM LETTER PHASE-F TAE", + [0x16B43]={ + category="lm", + description="PAHAWH HMONG SIGN IB YAM", direction="l", linebreak="al", - unicodeslot=0x16A08, + unicodeslot=0x16B43, }, - [0x16A09]={ - category="lo", - description="BAMUM LETTER PHASE-F NYI", + [0x16B44]={ + category="po", + description="PAHAWH HMONG SIGN XAUS", + direction="l", + linebreak="ba", + unicodeslot=0x16B44, + }, + [0x16B45]={ + category="so", + description="PAHAWH HMONG SIGN CIM TSOV ROG", direction="l", linebreak="al", - unicodeslot=0x16A09, + unicodeslot=0x16B45, }, - [0x16A0A]={ - category="lo", - description="BAMUM LETTER PHASE-F LA", + [0x16B50]={ + category="nd", + description="PAHAWH HMONG DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x16B50, + }, + [0x16B51]={ + category="nd", + description="PAHAWH HMONG DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x16B51, + }, + [0x16B52]={ + category="nd", + description="PAHAWH HMONG DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x16B52, + }, + [0x16B53]={ + category="nd", + description="PAHAWH HMONG DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x16B53, + }, + [0x16B54]={ + category="nd", + description="PAHAWH HMONG DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x16B54, + }, + [0x16B55]={ + category="nd", + description="PAHAWH HMONG DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x16B55, + }, + [0x16B56]={ + category="nd", + description="PAHAWH HMONG DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x16B56, + }, + [0x16B57]={ + category="nd", + description="PAHAWH HMONG DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x16B57, + }, + [0x16B58]={ + category="nd", + description="PAHAWH HMONG DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x16B58, + }, + [0x16B59]={ + category="nd", + description="PAHAWH HMONG DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x16B59, + }, + [0x16B5B]={ + category="no", + description="PAHAWH HMONG NUMBER TENS", direction="l", linebreak="al", - unicodeslot=0x16A0A, + unicodeslot=0x16B5B, }, - [0x16A0B]={ - category="lo", - description="BAMUM LETTER PHASE-F RII", + [0x16B5C]={ + category="no", + description="PAHAWH HMONG NUMBER HUNDREDS", direction="l", linebreak="al", - unicodeslot=0x16A0B, + unicodeslot=0x16B5C, }, - [0x16A0C]={ - category="lo", - description="BAMUM LETTER PHASE-F RIEE", + [0x16B5D]={ + category="no", + description="PAHAWH HMONG NUMBER TEN THOUSANDS", direction="l", linebreak="al", - unicodeslot=0x16A0C, + unicodeslot=0x16B5D, }, - [0x16A0D]={ - category="lo", - description="BAMUM LETTER PHASE-F MEEEE", + [0x16B5E]={ + category="no", + description="PAHAWH HMONG NUMBER MILLIONS", direction="l", linebreak="al", - unicodeslot=0x16A0D, + unicodeslot=0x16B5E, }, - [0x16A0E]={ - category="lo", - description="BAMUM LETTER PHASE-F TAA", + [0x16B5F]={ + category="no", + description="PAHAWH HMONG NUMBER HUNDRED MILLIONS", direction="l", linebreak="al", - unicodeslot=0x16A0E, + unicodeslot=0x16B5F, }, - [0x16A0F]={ - category="lo", - description="BAMUM LETTER PHASE-F NDAA", + [0x16B60]={ + category="no", + description="PAHAWH HMONG NUMBER TEN BILLIONS", direction="l", linebreak="al", - unicodeslot=0x16A0F, + unicodeslot=0x16B60, }, - [0x16A10]={ - category="lo", - description="BAMUM LETTER PHASE-F NJAEM", + [0x16B61]={ + category="no", + description="PAHAWH HMONG NUMBER TRILLIONS", direction="l", linebreak="al", - unicodeslot=0x16A10, + unicodeslot=0x16B61, }, - [0x16A11]={ + [0x16B63]={ category="lo", - description="BAMUM LETTER PHASE-F M", + description="PAHAWH HMONG SIGN VOS LUB", direction="l", linebreak="al", - unicodeslot=0x16A11, + unicodeslot=0x16B63, }, - [0x16A12]={ + [0x16B64]={ category="lo", - description="BAMUM LETTER PHASE-F SUU", + description="PAHAWH HMONG SIGN XYOO", direction="l", linebreak="al", - unicodeslot=0x16A12, + unicodeslot=0x16B64, }, - [0x16A13]={ + [0x16B65]={ category="lo", - description="BAMUM LETTER PHASE-F SHII", + description="PAHAWH HMONG SIGN HLI", direction="l", linebreak="al", - unicodeslot=0x16A13, + unicodeslot=0x16B65, }, - [0x16A14]={ + [0x16B66]={ category="lo", - description="BAMUM LETTER PHASE-F SI", + description="PAHAWH HMONG SIGN THIRD-STAGE HLI", direction="l", linebreak="al", - unicodeslot=0x16A14, + unicodeslot=0x16B66, }, - [0x16A15]={ + [0x16B67]={ category="lo", - description="BAMUM LETTER PHASE-F SEUX", + description="PAHAWH HMONG SIGN ZWJ THAJ", direction="l", linebreak="al", - unicodeslot=0x16A15, + unicodeslot=0x16B67, }, - [0x16A16]={ + [0x16B68]={ category="lo", - description="BAMUM LETTER PHASE-F KYEE", + description="PAHAWH HMONG SIGN HNUB", direction="l", linebreak="al", - unicodeslot=0x16A16, + unicodeslot=0x16B68, }, - [0x16A17]={ + [0x16B69]={ category="lo", - description="BAMUM LETTER PHASE-F KET", + description="PAHAWH HMONG SIGN NQIG", direction="l", linebreak="al", - unicodeslot=0x16A17, + unicodeslot=0x16B69, }, - [0x16A18]={ + [0x16B6A]={ category="lo", - description="BAMUM LETTER PHASE-F NUAE", + description="PAHAWH HMONG SIGN XIAB", direction="l", linebreak="al", - unicodeslot=0x16A18, + unicodeslot=0x16B6A, }, - [0x16A19]={ + [0x16B6B]={ category="lo", - description="BAMUM LETTER PHASE-F NU", + description="PAHAWH HMONG SIGN NTUJ", direction="l", linebreak="al", - unicodeslot=0x16A19, + unicodeslot=0x16B6B, }, - [0x16A1A]={ + [0x16B6C]={ category="lo", - description="BAMUM LETTER PHASE-F NJUAE", + description="PAHAWH HMONG SIGN AV", direction="l", linebreak="al", - unicodeslot=0x16A1A, + unicodeslot=0x16B6C, }, - [0x16A1B]={ + [0x16B6D]={ category="lo", - description="BAMUM LETTER PHASE-F YOQ", + description="PAHAWH HMONG SIGN TXHEEJ CEEV", direction="l", linebreak="al", - unicodeslot=0x16A1B, + unicodeslot=0x16B6D, }, - [0x16A1C]={ + [0x16B6E]={ category="lo", - description="BAMUM LETTER PHASE-F SHU", + description="PAHAWH HMONG SIGN MEEJ TSEEB", direction="l", linebreak="al", - unicodeslot=0x16A1C, + unicodeslot=0x16B6E, }, - [0x16A1D]={ + [0x16B6F]={ category="lo", - description="BAMUM LETTER PHASE-F YA", + description="PAHAWH HMONG SIGN TAU", direction="l", linebreak="al", - unicodeslot=0x16A1D, + unicodeslot=0x16B6F, }, - [0x16A1E]={ + [0x16B70]={ category="lo", - description="BAMUM LETTER PHASE-F NSHA", + description="PAHAWH HMONG SIGN LOS", direction="l", linebreak="al", - unicodeslot=0x16A1E, + unicodeslot=0x16B70, }, - [0x16A1F]={ + [0x16B71]={ category="lo", - description="BAMUM LETTER PHASE-F PEUX", + description="PAHAWH HMONG SIGN MUS", direction="l", linebreak="al", - unicodeslot=0x16A1F, + unicodeslot=0x16B71, }, - [0x16A20]={ + [0x16B72]={ category="lo", - description="BAMUM LETTER PHASE-F NTEE", + description="PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG", direction="l", linebreak="al", - unicodeslot=0x16A20, + unicodeslot=0x16B72, }, - [0x16A21]={ + [0x16B73]={ category="lo", - description="BAMUM LETTER PHASE-F WUE", + description="PAHAWH HMONG SIGN CIM CUAM TSHOOJ", direction="l", linebreak="al", - unicodeslot=0x16A21, + unicodeslot=0x16B73, }, - [0x16A22]={ + [0x16B74]={ category="lo", - description="BAMUM LETTER PHASE-F PEE", + description="PAHAWH HMONG SIGN CIM TXWV", direction="l", linebreak="al", - unicodeslot=0x16A22, + unicodeslot=0x16B74, }, - [0x16A23]={ + [0x16B75]={ category="lo", - description="BAMUM LETTER PHASE-F RU", + description="PAHAWH HMONG SIGN CIM TXWV CHWV", direction="l", linebreak="al", - unicodeslot=0x16A23, + unicodeslot=0x16B75, }, - [0x16A24]={ + [0x16B76]={ category="lo", - description="BAMUM LETTER PHASE-F NI", + description="PAHAWH HMONG SIGN CIM PUB DAWB", direction="l", linebreak="al", - unicodeslot=0x16A24, + unicodeslot=0x16B76, }, - [0x16A25]={ + [0x16B77]={ category="lo", - description="BAMUM LETTER PHASE-F REUX", + description="PAHAWH HMONG SIGN CIM NRES TOS", direction="l", linebreak="al", - unicodeslot=0x16A25, + unicodeslot=0x16B77, }, - [0x16A26]={ + [0x16B7D]={ category="lo", - description="BAMUM LETTER PHASE-F KEN", + description="PAHAWH HMONG CLAN SIGN TSHEEJ", direction="l", linebreak="al", - unicodeslot=0x16A26, + unicodeslot=0x16B7D, }, - [0x16A27]={ + [0x16B7E]={ category="lo", - description="BAMUM LETTER PHASE-F NGKWAEN", + description="PAHAWH HMONG CLAN SIGN YEEG", direction="l", linebreak="al", - unicodeslot=0x16A27, + unicodeslot=0x16B7E, }, - [0x16A28]={ + [0x16B7F]={ category="lo", - description="BAMUM LETTER PHASE-F NGGA", + description="PAHAWH HMONG CLAN SIGN LIS", direction="l", linebreak="al", - unicodeslot=0x16A28, + unicodeslot=0x16B7F, }, - [0x16A29]={ + [0x16B80]={ category="lo", - description="BAMUM LETTER PHASE-F SHO", + description="PAHAWH HMONG CLAN SIGN LAUJ", direction="l", linebreak="al", - unicodeslot=0x16A29, + unicodeslot=0x16B80, }, - [0x16A2A]={ + [0x16B81]={ category="lo", - description="BAMUM LETTER PHASE-F PUAE", + description="PAHAWH HMONG CLAN SIGN XYOOJ", direction="l", linebreak="al", - unicodeslot=0x16A2A, + unicodeslot=0x16B81, }, - [0x16A2B]={ + [0x16B82]={ category="lo", - description="BAMUM LETTER PHASE-F FOM", + description="PAHAWH HMONG CLAN SIGN KOO", direction="l", linebreak="al", - unicodeslot=0x16A2B, + unicodeslot=0x16B82, }, - [0x16A2C]={ + [0x16B83]={ category="lo", - description="BAMUM LETTER PHASE-F WA", + description="PAHAWH HMONG CLAN SIGN HAWJ", direction="l", linebreak="al", - unicodeslot=0x16A2C, + unicodeslot=0x16B83, }, - [0x16A2D]={ + [0x16B84]={ category="lo", - description="BAMUM LETTER PHASE-F LI", + description="PAHAWH HMONG CLAN SIGN MUAS", direction="l", linebreak="al", - unicodeslot=0x16A2D, + unicodeslot=0x16B84, }, - [0x16A2E]={ + [0x16B85]={ category="lo", - description="BAMUM LETTER PHASE-F LOQ", + description="PAHAWH HMONG CLAN SIGN THOJ", direction="l", linebreak="al", - unicodeslot=0x16A2E, + unicodeslot=0x16B85, }, - [0x16A2F]={ + [0x16B86]={ category="lo", - description="BAMUM LETTER PHASE-F KO", + description="PAHAWH HMONG CLAN SIGN TSAB", direction="l", linebreak="al", - unicodeslot=0x16A2F, + unicodeslot=0x16B86, }, - [0x16A30]={ + [0x16B87]={ category="lo", - description="BAMUM LETTER PHASE-F MBEN", + description="PAHAWH HMONG CLAN SIGN PHAB", direction="l", linebreak="al", - unicodeslot=0x16A30, + unicodeslot=0x16B87, }, - [0x16A31]={ + [0x16B88]={ category="lo", - description="BAMUM LETTER PHASE-F REN", + description="PAHAWH HMONG CLAN SIGN KHAB", direction="l", linebreak="al", - unicodeslot=0x16A31, + unicodeslot=0x16B88, }, - [0x16A32]={ + [0x16B89]={ category="lo", - description="BAMUM LETTER PHASE-F MA", + description="PAHAWH HMONG CLAN SIGN HAM", direction="l", linebreak="al", - unicodeslot=0x16A32, + unicodeslot=0x16B89, }, - [0x16A33]={ + [0x16B8A]={ category="lo", - description="BAMUM LETTER PHASE-F MO", + description="PAHAWH HMONG CLAN SIGN VAJ", direction="l", linebreak="al", - unicodeslot=0x16A33, + unicodeslot=0x16B8A, }, - [0x16A34]={ + [0x16B8B]={ category="lo", - description="BAMUM LETTER PHASE-F MBAA", + description="PAHAWH HMONG CLAN SIGN FAJ", direction="l", linebreak="al", - unicodeslot=0x16A34, + unicodeslot=0x16B8B, }, - [0x16A35]={ + [0x16B8C]={ category="lo", - description="BAMUM LETTER PHASE-F TET", + description="PAHAWH HMONG CLAN SIGN YAJ", direction="l", linebreak="al", - unicodeslot=0x16A35, + unicodeslot=0x16B8C, }, - [0x16A36]={ + [0x16B8D]={ category="lo", - description="BAMUM LETTER PHASE-F KPA", + description="PAHAWH HMONG CLAN SIGN TSWB", direction="l", linebreak="al", - unicodeslot=0x16A36, + unicodeslot=0x16B8D, }, - [0x16A37]={ + [0x16B8E]={ category="lo", - description="BAMUM LETTER PHASE-F SAMBA", + description="PAHAWH HMONG CLAN SIGN KWM", direction="l", linebreak="al", - unicodeslot=0x16A37, + unicodeslot=0x16B8E, }, - [0x16A38]={ + [0x16B8F]={ category="lo", - description="BAMUM LETTER PHASE-F VUEQ", + description="PAHAWH HMONG CLAN SIGN VWJ", direction="l", linebreak="al", - unicodeslot=0x16A38, + unicodeslot=0x16B8F, }, [0x16F00]={ category="lo", @@ -162988,6 +177539,1036 @@ characters.data={ linebreak="id", unicodeslot=0x1B001, }, + [0x1BC00]={ + category="lo", + description="DUPLOYAN LETTER H", + direction="l", + linebreak="al", + unicodeslot=0x1BC00, + }, + [0x1BC01]={ + category="lo", + description="DUPLOYAN LETTER X", + direction="l", + linebreak="al", + unicodeslot=0x1BC01, + }, + [0x1BC02]={ + category="lo", + description="DUPLOYAN LETTER P", + direction="l", + linebreak="al", + unicodeslot=0x1BC02, + }, + [0x1BC03]={ + category="lo", + description="DUPLOYAN LETTER T", + direction="l", + linebreak="al", + unicodeslot=0x1BC03, + }, + [0x1BC04]={ + category="lo", + description="DUPLOYAN LETTER F", + direction="l", + linebreak="al", + unicodeslot=0x1BC04, + }, + [0x1BC05]={ + category="lo", + description="DUPLOYAN LETTER K", + direction="l", + linebreak="al", + unicodeslot=0x1BC05, + }, + [0x1BC06]={ + category="lo", + description="DUPLOYAN LETTER L", + direction="l", + linebreak="al", + unicodeslot=0x1BC06, + }, + [0x1BC07]={ + category="lo", + description="DUPLOYAN LETTER B", + direction="l", + linebreak="al", + unicodeslot=0x1BC07, + }, + [0x1BC08]={ + category="lo", + description="DUPLOYAN LETTER D", + direction="l", + linebreak="al", + unicodeslot=0x1BC08, + }, + [0x1BC09]={ + category="lo", + description="DUPLOYAN LETTER V", + direction="l", + linebreak="al", + unicodeslot=0x1BC09, + }, + [0x1BC0A]={ + category="lo", + description="DUPLOYAN LETTER G", + direction="l", + linebreak="al", + unicodeslot=0x1BC0A, + }, + [0x1BC0B]={ + category="lo", + description="DUPLOYAN LETTER R", + direction="l", + linebreak="al", + unicodeslot=0x1BC0B, + }, + [0x1BC0C]={ + category="lo", + description="DUPLOYAN LETTER P N", + direction="l", + linebreak="al", + unicodeslot=0x1BC0C, + }, + [0x1BC0D]={ + category="lo", + description="DUPLOYAN LETTER D S", + direction="l", + linebreak="al", + unicodeslot=0x1BC0D, + }, + [0x1BC0E]={ + category="lo", + description="DUPLOYAN LETTER F N", + direction="l", + linebreak="al", + unicodeslot=0x1BC0E, + }, + [0x1BC0F]={ + category="lo", + description="DUPLOYAN LETTER K M", + direction="l", + linebreak="al", + unicodeslot=0x1BC0F, + }, + [0x1BC10]={ + category="lo", + description="DUPLOYAN LETTER R S", + direction="l", + linebreak="al", + unicodeslot=0x1BC10, + }, + [0x1BC11]={ + category="lo", + description="DUPLOYAN LETTER TH", + direction="l", + linebreak="al", + unicodeslot=0x1BC11, + }, + [0x1BC12]={ + category="lo", + description="DUPLOYAN LETTER SLOAN DH", + direction="l", + linebreak="al", + unicodeslot=0x1BC12, + }, + [0x1BC13]={ + category="lo", + description="DUPLOYAN LETTER DH", + direction="l", + linebreak="al", + unicodeslot=0x1BC13, + }, + [0x1BC14]={ + category="lo", + description="DUPLOYAN LETTER KK", + direction="l", + linebreak="al", + unicodeslot=0x1BC14, + }, + [0x1BC15]={ + category="lo", + description="DUPLOYAN LETTER SLOAN J", + direction="l", + linebreak="al", + unicodeslot=0x1BC15, + }, + [0x1BC16]={ + category="lo", + description="DUPLOYAN LETTER HL", + direction="l", + linebreak="al", + unicodeslot=0x1BC16, + }, + [0x1BC17]={ + category="lo", + description="DUPLOYAN LETTER LH", + direction="l", + linebreak="al", + unicodeslot=0x1BC17, + }, + [0x1BC18]={ + category="lo", + description="DUPLOYAN LETTER RH", + direction="l", + linebreak="al", + unicodeslot=0x1BC18, + }, + [0x1BC19]={ + category="lo", + description="DUPLOYAN LETTER M", + direction="l", + linebreak="al", + unicodeslot=0x1BC19, + }, + [0x1BC1A]={ + category="lo", + description="DUPLOYAN LETTER N", + direction="l", + linebreak="al", + unicodeslot=0x1BC1A, + }, + [0x1BC1B]={ + category="lo", + description="DUPLOYAN LETTER J", + direction="l", + linebreak="al", + unicodeslot=0x1BC1B, + }, + [0x1BC1C]={ + category="lo", + description="DUPLOYAN LETTER S", + direction="l", + linebreak="al", + unicodeslot=0x1BC1C, + }, + [0x1BC1D]={ + category="lo", + description="DUPLOYAN LETTER M N", + direction="l", + linebreak="al", + unicodeslot=0x1BC1D, + }, + [0x1BC1E]={ + category="lo", + description="DUPLOYAN LETTER N M", + direction="l", + linebreak="al", + unicodeslot=0x1BC1E, + }, + [0x1BC1F]={ + category="lo", + description="DUPLOYAN LETTER J M", + direction="l", + linebreak="al", + unicodeslot=0x1BC1F, + }, + [0x1BC20]={ + category="lo", + description="DUPLOYAN LETTER S J", + direction="l", + linebreak="al", + unicodeslot=0x1BC20, + }, + [0x1BC21]={ + category="lo", + description="DUPLOYAN LETTER M WITH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC21, + }, + [0x1BC22]={ + category="lo", + description="DUPLOYAN LETTER N WITH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC22, + }, + [0x1BC23]={ + category="lo", + description="DUPLOYAN LETTER J WITH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC23, + }, + [0x1BC24]={ + category="lo", + description="DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC24, + }, + [0x1BC25]={ + category="lo", + description="DUPLOYAN LETTER S WITH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC25, + }, + [0x1BC26]={ + category="lo", + description="DUPLOYAN LETTER S WITH DOT BELOW", + direction="l", + linebreak="al", + unicodeslot=0x1BC26, + }, + [0x1BC27]={ + category="lo", + description="DUPLOYAN LETTER M S", + direction="l", + linebreak="al", + unicodeslot=0x1BC27, + }, + [0x1BC28]={ + category="lo", + description="DUPLOYAN LETTER N S", + direction="l", + linebreak="al", + unicodeslot=0x1BC28, + }, + [0x1BC29]={ + category="lo", + description="DUPLOYAN LETTER J S", + direction="l", + linebreak="al", + unicodeslot=0x1BC29, + }, + [0x1BC2A]={ + category="lo", + description="DUPLOYAN LETTER S S", + direction="l", + linebreak="al", + unicodeslot=0x1BC2A, + }, + [0x1BC2B]={ + category="lo", + description="DUPLOYAN LETTER M N S", + direction="l", + linebreak="al", + unicodeslot=0x1BC2B, + }, + [0x1BC2C]={ + category="lo", + description="DUPLOYAN LETTER N M S", + direction="l", + linebreak="al", + unicodeslot=0x1BC2C, + }, + [0x1BC2D]={ + category="lo", + description="DUPLOYAN LETTER J M S", + direction="l", + linebreak="al", + unicodeslot=0x1BC2D, + }, + [0x1BC2E]={ + category="lo", + description="DUPLOYAN LETTER S J S", + direction="l", + linebreak="al", + unicodeslot=0x1BC2E, + }, + [0x1BC2F]={ + category="lo", + description="DUPLOYAN LETTER J S WITH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC2F, + }, + [0x1BC30]={ + category="lo", + description="DUPLOYAN LETTER J N", + direction="l", + linebreak="al", + unicodeslot=0x1BC30, + }, + [0x1BC31]={ + category="lo", + description="DUPLOYAN LETTER J N S", + direction="l", + linebreak="al", + unicodeslot=0x1BC31, + }, + [0x1BC32]={ + category="lo", + description="DUPLOYAN LETTER S T", + direction="l", + linebreak="al", + unicodeslot=0x1BC32, + }, + [0x1BC33]={ + category="lo", + description="DUPLOYAN LETTER S T R", + direction="l", + linebreak="al", + unicodeslot=0x1BC33, + }, + [0x1BC34]={ + category="lo", + description="DUPLOYAN LETTER S P", + direction="l", + linebreak="al", + unicodeslot=0x1BC34, + }, + [0x1BC35]={ + category="lo", + description="DUPLOYAN LETTER S P R", + direction="l", + linebreak="al", + unicodeslot=0x1BC35, + }, + [0x1BC36]={ + category="lo", + description="DUPLOYAN LETTER T S", + direction="l", + linebreak="al", + unicodeslot=0x1BC36, + }, + [0x1BC37]={ + category="lo", + description="DUPLOYAN LETTER T R S", + direction="l", + linebreak="al", + unicodeslot=0x1BC37, + }, + [0x1BC38]={ + category="lo", + description="DUPLOYAN LETTER W", + direction="l", + linebreak="al", + unicodeslot=0x1BC38, + }, + [0x1BC39]={ + category="lo", + description="DUPLOYAN LETTER WH", + direction="l", + linebreak="al", + unicodeslot=0x1BC39, + }, + [0x1BC3A]={ + category="lo", + description="DUPLOYAN LETTER W R", + direction="l", + linebreak="al", + unicodeslot=0x1BC3A, + }, + [0x1BC3B]={ + category="lo", + description="DUPLOYAN LETTER S N", + direction="l", + linebreak="al", + unicodeslot=0x1BC3B, + }, + [0x1BC3C]={ + category="lo", + description="DUPLOYAN LETTER S M", + direction="l", + linebreak="al", + unicodeslot=0x1BC3C, + }, + [0x1BC3D]={ + category="lo", + description="DUPLOYAN LETTER K R S", + direction="l", + linebreak="al", + unicodeslot=0x1BC3D, + }, + [0x1BC3E]={ + category="lo", + description="DUPLOYAN LETTER G R S", + direction="l", + linebreak="al", + unicodeslot=0x1BC3E, + }, + [0x1BC3F]={ + category="lo", + description="DUPLOYAN LETTER S K", + direction="l", + linebreak="al", + unicodeslot=0x1BC3F, + }, + [0x1BC40]={ + category="lo", + description="DUPLOYAN LETTER S K R", + direction="l", + linebreak="al", + unicodeslot=0x1BC40, + }, + [0x1BC41]={ + category="lo", + description="DUPLOYAN LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x1BC41, + }, + [0x1BC42]={ + category="lo", + description="DUPLOYAN LETTER SLOAN OW", + direction="l", + linebreak="al", + unicodeslot=0x1BC42, + }, + [0x1BC43]={ + category="lo", + description="DUPLOYAN LETTER OA", + direction="l", + linebreak="al", + unicodeslot=0x1BC43, + }, + [0x1BC44]={ + category="lo", + description="DUPLOYAN LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1BC44, + }, + [0x1BC45]={ + category="lo", + description="DUPLOYAN LETTER AOU", + direction="l", + linebreak="al", + unicodeslot=0x1BC45, + }, + [0x1BC46]={ + category="lo", + description="DUPLOYAN LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x1BC46, + }, + [0x1BC47]={ + category="lo", + description="DUPLOYAN LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1BC47, + }, + [0x1BC48]={ + category="lo", + description="DUPLOYAN LETTER IE", + direction="l", + linebreak="al", + unicodeslot=0x1BC48, + }, + [0x1BC49]={ + category="lo", + description="DUPLOYAN LETTER SHORT I", + direction="l", + linebreak="al", + unicodeslot=0x1BC49, + }, + [0x1BC4A]={ + category="lo", + description="DUPLOYAN LETTER UI", + direction="l", + linebreak="al", + unicodeslot=0x1BC4A, + }, + [0x1BC4B]={ + category="lo", + description="DUPLOYAN LETTER EE", + direction="l", + linebreak="al", + unicodeslot=0x1BC4B, + }, + [0x1BC4C]={ + category="lo", + description="DUPLOYAN LETTER SLOAN EH", + direction="l", + linebreak="al", + unicodeslot=0x1BC4C, + }, + [0x1BC4D]={ + category="lo", + description="DUPLOYAN LETTER ROMANIAN I", + direction="l", + linebreak="al", + unicodeslot=0x1BC4D, + }, + [0x1BC4E]={ + category="lo", + description="DUPLOYAN LETTER SLOAN EE", + direction="l", + linebreak="al", + unicodeslot=0x1BC4E, + }, + [0x1BC4F]={ + category="lo", + description="DUPLOYAN LETTER LONG I", + direction="l", + linebreak="al", + unicodeslot=0x1BC4F, + }, + [0x1BC50]={ + category="lo", + description="DUPLOYAN LETTER YE", + direction="l", + linebreak="al", + unicodeslot=0x1BC50, + }, + [0x1BC51]={ + category="lo", + description="DUPLOYAN LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x1BC51, + }, + [0x1BC52]={ + category="lo", + description="DUPLOYAN LETTER EU", + direction="l", + linebreak="al", + unicodeslot=0x1BC52, + }, + [0x1BC53]={ + category="lo", + description="DUPLOYAN LETTER XW", + direction="l", + linebreak="al", + unicodeslot=0x1BC53, + }, + [0x1BC54]={ + category="lo", + description="DUPLOYAN LETTER U N", + direction="l", + linebreak="al", + unicodeslot=0x1BC54, + }, + [0x1BC55]={ + category="lo", + description="DUPLOYAN LETTER LONG U", + direction="l", + linebreak="al", + unicodeslot=0x1BC55, + }, + [0x1BC56]={ + category="lo", + description="DUPLOYAN LETTER ROMANIAN U", + direction="l", + linebreak="al", + unicodeslot=0x1BC56, + }, + [0x1BC57]={ + category="lo", + description="DUPLOYAN LETTER UH", + direction="l", + linebreak="al", + unicodeslot=0x1BC57, + }, + [0x1BC58]={ + category="lo", + description="DUPLOYAN LETTER SLOAN U", + direction="l", + linebreak="al", + unicodeslot=0x1BC58, + }, + [0x1BC59]={ + category="lo", + description="DUPLOYAN LETTER OOH", + direction="l", + linebreak="al", + unicodeslot=0x1BC59, + }, + [0x1BC5A]={ + category="lo", + description="DUPLOYAN LETTER OW", + direction="l", + linebreak="al", + unicodeslot=0x1BC5A, + }, + [0x1BC5B]={ + category="lo", + description="DUPLOYAN LETTER OU", + direction="l", + linebreak="al", + unicodeslot=0x1BC5B, + }, + [0x1BC5C]={ + category="lo", + description="DUPLOYAN LETTER WA", + direction="l", + linebreak="al", + unicodeslot=0x1BC5C, + }, + [0x1BC5D]={ + category="lo", + description="DUPLOYAN LETTER WO", + direction="l", + linebreak="al", + unicodeslot=0x1BC5D, + }, + [0x1BC5E]={ + category="lo", + description="DUPLOYAN LETTER WI", + direction="l", + linebreak="al", + unicodeslot=0x1BC5E, + }, + [0x1BC5F]={ + category="lo", + description="DUPLOYAN LETTER WEI", + direction="l", + linebreak="al", + unicodeslot=0x1BC5F, + }, + [0x1BC60]={ + category="lo", + description="DUPLOYAN LETTER WOW", + direction="l", + linebreak="al", + unicodeslot=0x1BC60, + }, + [0x1BC61]={ + category="lo", + description="DUPLOYAN LETTER NASAL U", + direction="l", + linebreak="al", + unicodeslot=0x1BC61, + }, + [0x1BC62]={ + category="lo", + description="DUPLOYAN LETTER NASAL O", + direction="l", + linebreak="al", + unicodeslot=0x1BC62, + }, + [0x1BC63]={ + category="lo", + description="DUPLOYAN LETTER NASAL I", + direction="l", + linebreak="al", + unicodeslot=0x1BC63, + }, + [0x1BC64]={ + category="lo", + description="DUPLOYAN LETTER NASAL A", + direction="l", + linebreak="al", + unicodeslot=0x1BC64, + }, + [0x1BC65]={ + category="lo", + description="DUPLOYAN LETTER PERNIN AN", + direction="l", + linebreak="al", + unicodeslot=0x1BC65, + }, + [0x1BC66]={ + category="lo", + description="DUPLOYAN LETTER PERNIN AM", + direction="l", + linebreak="al", + unicodeslot=0x1BC66, + }, + [0x1BC67]={ + category="lo", + description="DUPLOYAN LETTER SLOAN EN", + direction="l", + linebreak="al", + unicodeslot=0x1BC67, + }, + [0x1BC68]={ + category="lo", + description="DUPLOYAN LETTER SLOAN AN", + direction="l", + linebreak="al", + unicodeslot=0x1BC68, + }, + [0x1BC69]={ + category="lo", + description="DUPLOYAN LETTER SLOAN ON", + direction="l", + linebreak="al", + unicodeslot=0x1BC69, + }, + [0x1BC6A]={ + category="lo", + description="DUPLOYAN LETTER VOCALIC M", + direction="l", + linebreak="al", + unicodeslot=0x1BC6A, + }, + [0x1BC70]={ + category="lo", + description="DUPLOYAN AFFIX LEFT HORIZONTAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC70, + }, + [0x1BC71]={ + category="lo", + description="DUPLOYAN AFFIX MID HORIZONTAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC71, + }, + [0x1BC72]={ + category="lo", + description="DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC72, + }, + [0x1BC73]={ + category="lo", + description="DUPLOYAN AFFIX LOW VERTICAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC73, + }, + [0x1BC74]={ + category="lo", + description="DUPLOYAN AFFIX MID VERTICAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC74, + }, + [0x1BC75]={ + category="lo", + description="DUPLOYAN AFFIX HIGH VERTICAL SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC75, + }, + [0x1BC76]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC76, + }, + [0x1BC77]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT", + direction="l", + linebreak="al", + unicodeslot=0x1BC77, + }, + [0x1BC78]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED TANGENT", + direction="l", + linebreak="al", + unicodeslot=0x1BC78, + }, + [0x1BC79]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED TAIL", + direction="l", + linebreak="al", + unicodeslot=0x1BC79, + }, + [0x1BC7A]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED E HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1BC7A, + }, + [0x1BC7B]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED I HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1BC7B, + }, + [0x1BC7C]={ + category="lo", + description="DUPLOYAN AFFIX ATTACHED TANGENT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1BC7C, + }, + [0x1BC80]={ + category="lo", + description="DUPLOYAN AFFIX HIGH ACUTE", + direction="l", + linebreak="al", + unicodeslot=0x1BC80, + }, + [0x1BC81]={ + category="lo", + description="DUPLOYAN AFFIX HIGH TIGHT ACUTE", + direction="l", + linebreak="al", + unicodeslot=0x1BC81, + }, + [0x1BC82]={ + category="lo", + description="DUPLOYAN AFFIX HIGH GRAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC82, + }, + [0x1BC83]={ + category="lo", + description="DUPLOYAN AFFIX HIGH LONG GRAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC83, + }, + [0x1BC84]={ + category="lo", + description="DUPLOYAN AFFIX HIGH DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC84, + }, + [0x1BC85]={ + category="lo", + description="DUPLOYAN AFFIX HIGH CIRCLE", + direction="l", + linebreak="al", + unicodeslot=0x1BC85, + }, + [0x1BC86]={ + category="lo", + description="DUPLOYAN AFFIX HIGH LINE", + direction="l", + linebreak="al", + unicodeslot=0x1BC86, + }, + [0x1BC87]={ + category="lo", + description="DUPLOYAN AFFIX HIGH WAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC87, + }, + [0x1BC88]={ + category="lo", + description="DUPLOYAN AFFIX HIGH VERTICAL", + direction="l", + linebreak="al", + unicodeslot=0x1BC88, + }, + [0x1BC90]={ + category="lo", + description="DUPLOYAN AFFIX LOW ACUTE", + direction="l", + linebreak="al", + unicodeslot=0x1BC90, + }, + [0x1BC91]={ + category="lo", + description="DUPLOYAN AFFIX LOW TIGHT ACUTE", + direction="l", + linebreak="al", + unicodeslot=0x1BC91, + }, + [0x1BC92]={ + category="lo", + description="DUPLOYAN AFFIX LOW GRAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC92, + }, + [0x1BC93]={ + category="lo", + description="DUPLOYAN AFFIX LOW LONG GRAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC93, + }, + [0x1BC94]={ + category="lo", + description="DUPLOYAN AFFIX LOW DOT", + direction="l", + linebreak="al", + unicodeslot=0x1BC94, + }, + [0x1BC95]={ + category="lo", + description="DUPLOYAN AFFIX LOW CIRCLE", + direction="l", + linebreak="al", + unicodeslot=0x1BC95, + }, + [0x1BC96]={ + category="lo", + description="DUPLOYAN AFFIX LOW LINE", + direction="l", + linebreak="al", + unicodeslot=0x1BC96, + }, + [0x1BC97]={ + category="lo", + description="DUPLOYAN AFFIX LOW WAVE", + direction="l", + linebreak="al", + unicodeslot=0x1BC97, + }, + [0x1BC98]={ + category="lo", + description="DUPLOYAN AFFIX LOW VERTICAL", + direction="l", + linebreak="al", + unicodeslot=0x1BC98, + }, + [0x1BC99]={ + category="lo", + description="DUPLOYAN AFFIX LOW ARROW", + direction="l", + linebreak="al", + unicodeslot=0x1BC99, + }, + [0x1BC9C]={ + category="so", + description="DUPLOYAN SIGN O WITH CROSS", + direction="l", + linebreak="al", + unicodeslot=0x1BC9C, + }, + [0x1BC9D]={ + category="mn", + description="DUPLOYAN THICK LETTER SELECTOR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1BC9D, + }, + [0x1BC9E]={ + category="mn", + combining=0x1, + description="DUPLOYAN DOUBLE MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x1BC9E, + }, + [0x1BC9F]={ + category="po", + description="DUPLOYAN PUNCTUATION CHINOOK FULL STOP", + direction="l", + linebreak="ba", + unicodeslot=0x1BC9F, + }, + [0x1BCA0]={ + category="cf", + description="SHORTHAND FORMAT LETTER OVERLAP", + direction="bn", + linebreak="cm", + unicodeslot=0x1BCA0, + }, + [0x1BCA1]={ + category="cf", + description="SHORTHAND FORMAT CONTINUING OVERLAP", + direction="bn", + linebreak="cm", + unicodeslot=0x1BCA1, + }, + [0x1BCA2]={ + category="cf", + description="SHORTHAND FORMAT DOWN STEP", + direction="bn", + linebreak="cm", + unicodeslot=0x1BCA2, + }, + [0x1BCA3]={ + category="cf", + description="SHORTHAND FORMAT UP STEP", + direction="bn", + linebreak="cm", + unicodeslot=0x1BCA3, + }, [0x1D000]={ category="so", description="BYZANTINE MUSICAL SYMBOL PSILI", @@ -165412,6 +180993,7 @@ characters.data={ }, [0x1D165]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING STEM", direction="l", linebreak="cm", @@ -165419,6 +181001,7 @@ characters.data={ }, [0x1D166]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING SPRECHGESANG STEM", direction="l", linebreak="cm", @@ -165426,6 +181009,7 @@ characters.data={ }, [0x1D167]={ category="mn", + combining=0x1, description="MUSICAL SYMBOL COMBINING TREMOLO-0x0001", direction="nsm", linebreak="cm", @@ -165433,6 +181017,7 @@ characters.data={ }, [0x1D168]={ category="mn", + combining=0x1, description="MUSICAL SYMBOL COMBINING TREMOLO-0x0002", direction="nsm", linebreak="cm", @@ -165440,6 +181025,7 @@ characters.data={ }, [0x1D169]={ category="mn", + combining=0x1, description="MUSICAL SYMBOL COMBINING TREMOLO-0x0003", direction="nsm", linebreak="cm", @@ -165468,6 +181054,7 @@ characters.data={ }, [0x1D16D]={ category="mc", + combining=0xE2, description="MUSICAL SYMBOL COMBINING AUGMENTATION DOT", direction="l", linebreak="cm", @@ -165475,6 +181062,7 @@ characters.data={ }, [0x1D16E]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING FLAG-0x0001", direction="l", linebreak="cm", @@ -165482,6 +181070,7 @@ characters.data={ }, [0x1D16F]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING FLAG-0x0002", direction="l", linebreak="cm", @@ -165489,6 +181078,7 @@ characters.data={ }, [0x1D170]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING FLAG-0x0003", direction="l", linebreak="cm", @@ -165496,6 +181086,7 @@ characters.data={ }, [0x1D171]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING FLAG-0x0004", direction="l", linebreak="cm", @@ -165503,6 +181094,7 @@ characters.data={ }, [0x1D172]={ category="mc", + combining=0xD8, description="MUSICAL SYMBOL COMBINING FLAG-0x0005", direction="l", linebreak="cm", @@ -165566,6 +181158,7 @@ characters.data={ }, [0x1D17B]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING ACCENT", direction="nsm", linebreak="cm", @@ -165573,6 +181166,7 @@ characters.data={ }, [0x1D17C]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING STACCATO", direction="nsm", linebreak="cm", @@ -165580,6 +181174,7 @@ characters.data={ }, [0x1D17D]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING TENUTO", direction="nsm", linebreak="cm", @@ -165587,6 +181182,7 @@ characters.data={ }, [0x1D17E]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING STACCATISSIMO", direction="nsm", linebreak="cm", @@ -165594,6 +181190,7 @@ characters.data={ }, [0x1D17F]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING MARCATO", direction="nsm", linebreak="cm", @@ -165601,6 +181198,7 @@ characters.data={ }, [0x1D180]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING MARCATO-STACCATO", direction="nsm", linebreak="cm", @@ -165608,6 +181206,7 @@ characters.data={ }, [0x1D181]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING ACCENT-STACCATO", direction="nsm", linebreak="cm", @@ -165615,6 +181214,7 @@ characters.data={ }, [0x1D182]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING LOURE", direction="nsm", linebreak="cm", @@ -165636,6 +181236,7 @@ characters.data={ }, [0x1D185]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING DOIT", direction="nsm", linebreak="cm", @@ -165643,6 +181244,7 @@ characters.data={ }, [0x1D186]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING RIP", direction="nsm", linebreak="cm", @@ -165650,6 +181252,7 @@ characters.data={ }, [0x1D187]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING FLIP", direction="nsm", linebreak="cm", @@ -165657,6 +181260,7 @@ characters.data={ }, [0x1D188]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING SMEAR", direction="nsm", linebreak="cm", @@ -165664,6 +181268,7 @@ characters.data={ }, [0x1D189]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING BEND", direction="nsm", linebreak="cm", @@ -165671,6 +181276,7 @@ characters.data={ }, [0x1D18A]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING DOUBLE TONGUE", direction="nsm", linebreak="cm", @@ -165678,6 +181284,7 @@ characters.data={ }, [0x1D18B]={ category="mn", + combining=0xDC, description="MUSICAL SYMBOL COMBINING TRIPLE TONGUE", direction="nsm", linebreak="cm", @@ -165895,6 +181502,7 @@ characters.data={ }, [0x1D1AA]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING DOWN BOW", direction="nsm", linebreak="cm", @@ -165902,6 +181510,7 @@ characters.data={ }, [0x1D1AB]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING UP BOW", direction="nsm", linebreak="cm", @@ -165909,6 +181518,7 @@ characters.data={ }, [0x1D1AC]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING HARMONIC", direction="nsm", linebreak="cm", @@ -165916,6 +181526,7 @@ characters.data={ }, [0x1D1AD]={ category="mn", + combining=0xE6, description="MUSICAL SYMBOL COMBINING SNAP PIZZICATO", direction="nsm", linebreak="cm", @@ -166727,6 +182338,7 @@ characters.data={ }, [0x1D242]={ category="mn", + combining=0xE6, description="COMBINING GREEK MUSICAL TRISEME", direction="nsm", linebreak="cm", @@ -166734,6 +182346,7 @@ characters.data={ }, [0x1D243]={ category="mn", + combining=0xE6, description="COMBINING GREEK MUSICAL TETRASEME", direction="nsm", linebreak="cm", @@ -166741,6 +182354,7 @@ characters.data={ }, [0x1D244]={ category="mn", + combining=0xE6, description="COMBINING GREEK MUSICAL PENTASEME", direction="nsm", linebreak="cm", @@ -167493,7 +183107,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D400, visual="bf", }, @@ -167502,7 +183116,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D401, visual="bf", }, @@ -167511,7 +183125,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D402, visual="bf", }, @@ -167520,7 +183134,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D403, visual="bf", }, @@ -167529,7 +183143,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D404, visual="bf", }, @@ -167538,7 +183152,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D405, visual="bf", }, @@ -167547,7 +183161,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D406, visual="bf", }, @@ -167556,7 +183170,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D407, visual="bf", }, @@ -167565,7 +183179,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D408, visual="bf", }, @@ -167574,7 +183188,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D409, visual="bf", }, @@ -167583,7 +183197,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D40A, visual="bf", }, @@ -167592,7 +183206,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D40B, visual="bf", }, @@ -167601,7 +183215,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D40C, visual="bf", }, @@ -167610,7 +183224,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D40D, visual="bf", }, @@ -167619,7 +183233,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D40E, visual="bf", }, @@ -167628,7 +183242,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D40F, visual="bf", }, @@ -167637,7 +183251,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D410, visual="bf", }, @@ -167646,7 +183260,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D411, visual="bf", }, @@ -167655,7 +183269,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D412, visual="bf", }, @@ -167664,7 +183278,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D413, visual="bf", }, @@ -167673,7 +183287,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D414, visual="bf", }, @@ -167682,7 +183296,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D415, visual="bf", }, @@ -167691,7 +183305,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D416, visual="bf", }, @@ -167700,7 +183314,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D417, visual="bf", }, @@ -167709,7 +183323,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D418, visual="bf", }, @@ -167718,7 +183332,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D419, visual="bf", }, @@ -167727,7 +183341,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D41A, visual="bf", }, @@ -167736,7 +183350,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D41B, visual="bf", }, @@ -167745,7 +183359,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D41C, visual="bf", }, @@ -167754,7 +183368,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D41D, visual="bf", }, @@ -167763,7 +183377,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D41E, visual="bf", }, @@ -167772,7 +183386,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D41F, visual="bf", }, @@ -167781,7 +183395,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D420, visual="bf", }, @@ -167790,7 +183404,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D421, visual="bf", }, @@ -167799,7 +183413,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D422, visual="bf", }, @@ -167808,7 +183422,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D423, visual="bf", }, @@ -167817,7 +183431,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D424, visual="bf", }, @@ -167826,7 +183440,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D425, visual="bf", }, @@ -167835,7 +183449,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D426, visual="bf", }, @@ -167844,7 +183458,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D427, visual="bf", }, @@ -167853,7 +183467,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D428, visual="bf", }, @@ -167862,7 +183476,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D429, visual="bf", }, @@ -167871,7 +183485,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D42A, visual="bf", }, @@ -167880,7 +183494,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D42B, visual="bf", }, @@ -167889,7 +183503,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D42C, visual="bf", }, @@ -167898,7 +183512,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D42D, visual="bf", }, @@ -167907,7 +183521,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D42E, visual="bf", }, @@ -167916,7 +183530,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D42F, visual="bf", }, @@ -167925,7 +183539,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D430, visual="bf", }, @@ -167934,7 +183548,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D431, visual="bf", }, @@ -167943,7 +183557,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D432, visual="bf", }, @@ -167952,7 +183566,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D433, visual="bf", }, @@ -167961,7 +183575,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D434, visual="it", }, @@ -167970,7 +183584,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D435, visual="it", }, @@ -167979,7 +183593,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D436, visual="it", }, @@ -167988,7 +183602,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D437, visual="it", }, @@ -167997,7 +183611,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D438, visual="it", }, @@ -168006,7 +183620,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D439, visual="it", }, @@ -168015,7 +183629,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D43A, visual="it", }, @@ -168024,7 +183638,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D43B, visual="it", }, @@ -168033,7 +183647,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D43C, visual="it", }, @@ -168042,7 +183656,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D43D, visual="it", }, @@ -168051,7 +183665,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D43E, visual="it", }, @@ -168060,7 +183674,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D43F, visual="it", }, @@ -168069,7 +183683,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D440, visual="it", }, @@ -168078,7 +183692,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D441, visual="it", }, @@ -168087,7 +183701,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D442, visual="it", }, @@ -168096,7 +183710,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D443, visual="it", }, @@ -168105,7 +183719,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D444, visual="it", }, @@ -168114,7 +183728,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D445, visual="it", }, @@ -168123,7 +183737,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D446, visual="it", }, @@ -168132,7 +183746,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D447, visual="it", }, @@ -168141,7 +183755,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D448, visual="it", }, @@ -168150,7 +183764,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D449, visual="it", }, @@ -168159,7 +183773,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D44A, visual="it", }, @@ -168168,7 +183782,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D44B, visual="it", }, @@ -168177,7 +183791,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D44C, visual="it", }, @@ -168186,7 +183800,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D44D, visual="it", }, @@ -168195,7 +183809,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D44E, visual="it", }, @@ -168204,7 +183818,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D44F, visual="it", }, @@ -168213,7 +183827,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D450, visual="it", }, @@ -168222,7 +183836,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D451, visual="it", }, @@ -168231,7 +183845,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D452, visual="it", }, @@ -168240,7 +183854,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D453, visual="it", }, @@ -168249,7 +183863,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D454, visual="it", }, @@ -168258,7 +183872,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D456, visual="it", }, @@ -168267,7 +183881,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D457, visual="it", }, @@ -168276,7 +183890,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D458, visual="it", }, @@ -168285,7 +183899,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D459, visual="it", }, @@ -168294,7 +183908,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D45A, visual="it", }, @@ -168303,7 +183917,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D45B, visual="it", }, @@ -168312,7 +183926,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D45C, visual="it", }, @@ -168321,7 +183935,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D45D, visual="it", }, @@ -168330,7 +183944,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D45E, visual="it", }, @@ -168339,7 +183953,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D45F, visual="it", }, @@ -168348,7 +183962,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D460, visual="it", }, @@ -168357,7 +183971,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D461, visual="it", }, @@ -168366,7 +183980,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D462, visual="it", }, @@ -168375,7 +183989,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D463, visual="it", }, @@ -168384,7 +183998,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D464, visual="it", }, @@ -168393,7 +184007,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D465, visual="it", }, @@ -168402,7 +184016,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D466, visual="it", }, @@ -168411,7 +184025,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D467, visual="it", }, @@ -168420,7 +184034,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D468, visual="bi", }, @@ -168429,7 +184043,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D469, visual="bi", }, @@ -168438,7 +184052,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D46A, visual="bi", }, @@ -168447,7 +184061,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D46B, visual="bi", }, @@ -168456,7 +184070,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D46C, visual="bi", }, @@ -168465,7 +184079,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D46D, visual="bi", }, @@ -168474,7 +184088,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D46E, visual="bi", }, @@ -168483,7 +184097,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D46F, visual="bi", }, @@ -168492,7 +184106,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D470, visual="bi", }, @@ -168501,7 +184115,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D471, visual="bi", }, @@ -168510,7 +184124,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D472, visual="bi", }, @@ -168519,7 +184133,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D473, visual="bi", }, @@ -168528,7 +184142,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D474, visual="bi", }, @@ -168537,7 +184151,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D475, visual="bi", }, @@ -168546,7 +184160,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D476, visual="bi", }, @@ -168555,7 +184169,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D477, visual="bi", }, @@ -168564,7 +184178,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D478, visual="bi", }, @@ -168573,7 +184187,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D479, visual="bi", }, @@ -168582,7 +184196,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D47A, visual="bi", }, @@ -168591,7 +184205,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D47B, visual="bi", }, @@ -168600,7 +184214,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D47C, visual="bi", }, @@ -168609,7 +184223,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D47D, visual="bi", }, @@ -168618,7 +184232,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D47E, visual="bi", }, @@ -168627,7 +184241,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D47F, visual="bi", }, @@ -168636,7 +184250,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D480, visual="bi", }, @@ -168645,7 +184259,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D481, visual="bi", }, @@ -168654,7 +184268,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D482, visual="bi", }, @@ -168663,7 +184277,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D483, visual="bi", }, @@ -168672,7 +184286,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D484, visual="bi", }, @@ -168681,7 +184295,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D485, visual="bi", }, @@ -168690,7 +184304,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D486, visual="bi", }, @@ -168699,7 +184313,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D487, visual="bi", }, @@ -168708,7 +184322,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D488, visual="bi", }, @@ -168717,7 +184331,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D489, visual="bi", }, @@ -168726,7 +184340,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D48A, visual="bi", }, @@ -168735,7 +184349,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D48B, visual="bi", }, @@ -168744,7 +184358,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D48C, visual="bi", }, @@ -168753,7 +184367,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D48D, visual="bi", }, @@ -168762,7 +184376,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D48E, visual="bi", }, @@ -168771,7 +184385,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D48F, visual="bi", }, @@ -168780,7 +184394,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D490, visual="bi", }, @@ -168789,7 +184403,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D491, visual="bi", }, @@ -168798,7 +184412,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D492, visual="bi", }, @@ -168807,7 +184421,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D493, visual="bi", }, @@ -168816,7 +184430,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D494, visual="bi", }, @@ -168825,7 +184439,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D495, visual="bi", }, @@ -168834,7 +184448,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D496, visual="bi", }, @@ -168843,7 +184457,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D497, visual="bi", }, @@ -168852,7 +184466,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D498, visual="bi", }, @@ -168861,7 +184475,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D499, visual="bi", }, @@ -168870,7 +184484,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D49A, visual="bi", }, @@ -168879,7 +184493,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D49B, visual="bi", }, @@ -168888,7 +184502,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D49C, }, [0x1D49E]={ @@ -168896,7 +184510,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D49E, }, [0x1D49F]={ @@ -168904,7 +184518,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D49F, }, [0x1D4A2]={ @@ -168912,7 +184526,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D4A2, }, [0x1D4A5]={ @@ -168920,7 +184534,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D4A5, }, [0x1D4A6]={ @@ -168928,7 +184542,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D4A6, }, [0x1D4A9]={ @@ -168936,7 +184550,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D4A9, }, [0x1D4AA]={ @@ -168944,7 +184558,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D4AA, }, [0x1D4AB]={ @@ -168952,7 +184566,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D4AB, }, [0x1D4AC]={ @@ -168960,7 +184574,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D4AC, }, [0x1D4AE]={ @@ -168968,7 +184582,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D4AE, }, [0x1D4AF]={ @@ -168976,7 +184590,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D4AF, }, [0x1D4B0]={ @@ -168984,7 +184598,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D4B0, }, [0x1D4B1]={ @@ -168992,7 +184606,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D4B1, }, [0x1D4B2]={ @@ -169000,7 +184614,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D4B2, }, [0x1D4B3]={ @@ -169008,7 +184622,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D4B3, }, [0x1D4B4]={ @@ -169016,7 +184630,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D4B4, }, [0x1D4B5]={ @@ -169024,7 +184638,7 @@ characters.data={ description="MATHEMATICAL SCRIPT CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D4B5, }, [0x1D4B6]={ @@ -169032,7 +184646,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D4B6, }, [0x1D4B7]={ @@ -169040,7 +184654,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D4B7, }, [0x1D4B8]={ @@ -169048,7 +184662,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D4B8, }, [0x1D4B9]={ @@ -169056,7 +184670,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D4B9, }, [0x1D4BB]={ @@ -169064,7 +184678,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D4BB, }, [0x1D4BD]={ @@ -169072,7 +184686,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D4BD, }, [0x1D4BE]={ @@ -169080,7 +184694,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D4BE, }, [0x1D4BF]={ @@ -169088,7 +184702,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D4BF, }, [0x1D4C0]={ @@ -169096,7 +184710,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D4C0, }, [0x1D4C1]={ @@ -169104,7 +184718,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D4C1, }, [0x1D4C2]={ @@ -169112,7 +184726,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D4C2, }, [0x1D4C3]={ @@ -169120,7 +184734,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D4C3, }, [0x1D4C5]={ @@ -169128,7 +184742,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D4C5, }, [0x1D4C6]={ @@ -169136,7 +184750,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D4C6, }, [0x1D4C7]={ @@ -169144,7 +184758,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D4C7, }, [0x1D4C8]={ @@ -169152,7 +184766,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D4C8, }, [0x1D4C9]={ @@ -169160,7 +184774,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D4C9, }, [0x1D4CA]={ @@ -169168,7 +184782,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D4CA, }, [0x1D4CB]={ @@ -169176,7 +184790,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D4CB, }, [0x1D4CC]={ @@ -169184,7 +184798,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D4CC, }, [0x1D4CD]={ @@ -169192,7 +184806,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D4CD, }, [0x1D4CE]={ @@ -169200,7 +184814,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D4CE, }, [0x1D4CF]={ @@ -169208,7 +184822,7 @@ characters.data={ description="MATHEMATICAL SCRIPT SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D4CF, }, [0x1D4D0]={ @@ -169216,7 +184830,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D4D0, visual="bf", }, @@ -169225,7 +184839,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D4D1, visual="bf", }, @@ -169234,7 +184848,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D4D2, visual="bf", }, @@ -169243,7 +184857,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D4D3, visual="bf", }, @@ -169252,7 +184866,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D4D4, visual="bf", }, @@ -169261,7 +184875,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D4D5, visual="bf", }, @@ -169270,7 +184884,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D4D6, visual="bf", }, @@ -169279,7 +184893,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D4D7, visual="bf", }, @@ -169288,7 +184902,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D4D8, visual="bf", }, @@ -169297,7 +184911,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D4D9, visual="bf", }, @@ -169306,7 +184920,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D4DA, visual="bf", }, @@ -169315,7 +184929,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D4DB, visual="bf", }, @@ -169324,7 +184938,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D4DC, visual="bf", }, @@ -169333,7 +184947,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D4DD, visual="bf", }, @@ -169342,7 +184956,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D4DE, visual="bf", }, @@ -169351,7 +184965,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D4DF, visual="bf", }, @@ -169360,7 +184974,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D4E0, visual="bf", }, @@ -169369,7 +184983,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D4E1, visual="bf", }, @@ -169378,7 +184992,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D4E2, visual="bf", }, @@ -169387,7 +185001,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D4E3, visual="bf", }, @@ -169396,7 +185010,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D4E4, visual="bf", }, @@ -169405,7 +185019,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D4E5, visual="bf", }, @@ -169414,7 +185028,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D4E6, visual="bf", }, @@ -169423,7 +185037,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D4E7, visual="bf", }, @@ -169432,7 +185046,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D4E8, visual="bf", }, @@ -169441,7 +185055,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D4E9, visual="bf", }, @@ -169450,7 +185064,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D4EA, visual="bf", }, @@ -169459,7 +185073,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D4EB, visual="bf", }, @@ -169468,7 +185082,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D4EC, visual="bf", }, @@ -169477,7 +185091,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D4ED, visual="bf", }, @@ -169486,7 +185100,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D4EE, visual="bf", }, @@ -169495,7 +185109,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D4EF, visual="bf", }, @@ -169504,7 +185118,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D4F0, visual="bf", }, @@ -169513,7 +185127,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D4F1, visual="bf", }, @@ -169522,7 +185136,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D4F2, visual="bf", }, @@ -169531,7 +185145,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D4F3, visual="bf", }, @@ -169540,7 +185154,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D4F4, visual="bf", }, @@ -169549,7 +185163,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D4F5, visual="bf", }, @@ -169558,7 +185172,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D4F6, visual="bf", }, @@ -169567,7 +185181,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D4F7, visual="bf", }, @@ -169576,7 +185190,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D4F8, visual="bf", }, @@ -169585,7 +185199,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D4F9, visual="bf", }, @@ -169594,7 +185208,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D4FA, visual="bf", }, @@ -169603,7 +185217,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D4FB, visual="bf", }, @@ -169612,7 +185226,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D4FC, visual="bf", }, @@ -169621,7 +185235,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D4FD, visual="bf", }, @@ -169630,7 +185244,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D4FE, visual="bf", }, @@ -169639,7 +185253,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D4FF, visual="bf", }, @@ -169648,7 +185262,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D500, visual="bf", }, @@ -169657,7 +185271,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D501, visual="bf", }, @@ -169666,7 +185280,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D502, visual="bf", }, @@ -169675,7 +185289,7 @@ characters.data={ description="MATHEMATICAL BOLD SCRIPT SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D503, visual="bf", }, @@ -169684,7 +185298,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D504, }, [0x1D505]={ @@ -169692,7 +185306,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D505, }, [0x1D507]={ @@ -169700,7 +185314,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D507, }, [0x1D508]={ @@ -169708,7 +185322,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D508, }, [0x1D509]={ @@ -169716,7 +185330,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D509, }, [0x1D50A]={ @@ -169724,7 +185338,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D50A, }, [0x1D50D]={ @@ -169732,7 +185346,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D50D, }, [0x1D50E]={ @@ -169740,7 +185354,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D50E, }, [0x1D50F]={ @@ -169748,7 +185362,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D50F, }, [0x1D510]={ @@ -169756,7 +185370,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D510, }, [0x1D511]={ @@ -169764,7 +185378,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D511, }, [0x1D512]={ @@ -169772,7 +185386,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D512, }, [0x1D513]={ @@ -169780,7 +185394,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D513, }, [0x1D514]={ @@ -169788,7 +185402,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D514, }, [0x1D516]={ @@ -169796,7 +185410,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D516, }, [0x1D517]={ @@ -169804,7 +185418,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D517, }, [0x1D518]={ @@ -169812,7 +185426,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D518, }, [0x1D519]={ @@ -169820,7 +185434,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D519, }, [0x1D51A]={ @@ -169828,7 +185442,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D51A, }, [0x1D51B]={ @@ -169836,7 +185450,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D51B, }, [0x1D51C]={ @@ -169844,7 +185458,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D51C, }, [0x1D51E]={ @@ -169852,7 +185466,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D51E, }, [0x1D51F]={ @@ -169860,7 +185474,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D51F, }, [0x1D520]={ @@ -169868,7 +185482,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D520, }, [0x1D521]={ @@ -169876,7 +185490,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D521, }, [0x1D522]={ @@ -169884,7 +185498,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D522, }, [0x1D523]={ @@ -169892,7 +185506,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D523, }, [0x1D524]={ @@ -169900,7 +185514,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D524, }, [0x1D525]={ @@ -169908,7 +185522,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D525, }, [0x1D526]={ @@ -169916,7 +185530,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D526, }, [0x1D527]={ @@ -169924,7 +185538,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D527, }, [0x1D528]={ @@ -169932,7 +185546,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D528, }, [0x1D529]={ @@ -169940,7 +185554,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D529, }, [0x1D52A]={ @@ -169948,7 +185562,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D52A, }, [0x1D52B]={ @@ -169956,7 +185570,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D52B, }, [0x1D52C]={ @@ -169964,7 +185578,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D52C, }, [0x1D52D]={ @@ -169972,7 +185586,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D52D, }, [0x1D52E]={ @@ -169980,7 +185594,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D52E, }, [0x1D52F]={ @@ -169988,7 +185602,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D52F, }, [0x1D530]={ @@ -169996,7 +185610,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D530, }, [0x1D531]={ @@ -170004,7 +185618,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D531, }, [0x1D532]={ @@ -170012,7 +185626,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D532, }, [0x1D533]={ @@ -170020,7 +185634,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D533, }, [0x1D534]={ @@ -170028,7 +185642,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D534, }, [0x1D535]={ @@ -170036,7 +185650,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D535, }, [0x1D536]={ @@ -170044,7 +185658,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D536, }, [0x1D537]={ @@ -170052,7 +185666,7 @@ characters.data={ description="MATHEMATICAL FRAKTUR SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D537, }, [0x1D538]={ @@ -170060,7 +185674,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D538, }, [0x1D539]={ @@ -170068,7 +185682,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D539, }, [0x1D53B]={ @@ -170076,7 +185690,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D53B, }, [0x1D53C]={ @@ -170084,7 +185698,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D53C, }, [0x1D53D]={ @@ -170092,7 +185706,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D53D, }, [0x1D53E]={ @@ -170100,7 +185714,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D53E, }, [0x1D540]={ @@ -170108,7 +185722,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D540, }, [0x1D541]={ @@ -170116,7 +185730,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D541, }, [0x1D542]={ @@ -170124,7 +185738,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D542, }, [0x1D543]={ @@ -170132,7 +185746,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D543, }, [0x1D544]={ @@ -170140,7 +185754,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D544, }, [0x1D546]={ @@ -170148,7 +185762,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D546, }, [0x1D54A]={ @@ -170156,7 +185770,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D54A, }, [0x1D54B]={ @@ -170164,7 +185778,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D54B, }, [0x1D54C]={ @@ -170172,7 +185786,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D54C, }, [0x1D54D]={ @@ -170180,7 +185794,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D54D, }, [0x1D54E]={ @@ -170188,7 +185802,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D54E, }, [0x1D54F]={ @@ -170196,7 +185810,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D54F, }, [0x1D550]={ @@ -170204,7 +185818,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D550, }, [0x1D552]={ @@ -170212,7 +185826,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D552, }, [0x1D553]={ @@ -170220,7 +185834,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D553, }, [0x1D554]={ @@ -170228,7 +185842,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D554, }, [0x1D555]={ @@ -170236,7 +185850,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D555, }, [0x1D556]={ @@ -170244,7 +185858,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D556, }, [0x1D557]={ @@ -170252,7 +185866,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D557, }, [0x1D558]={ @@ -170260,7 +185874,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D558, }, [0x1D559]={ @@ -170268,7 +185882,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D559, }, [0x1D55A]={ @@ -170276,7 +185890,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D55A, }, [0x1D55B]={ @@ -170284,7 +185898,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D55B, }, [0x1D55C]={ @@ -170292,7 +185906,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D55C, }, [0x1D55D]={ @@ -170300,7 +185914,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D55D, }, [0x1D55E]={ @@ -170308,7 +185922,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D55E, }, [0x1D55F]={ @@ -170316,7 +185930,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D55F, }, [0x1D560]={ @@ -170324,7 +185938,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D560, }, [0x1D561]={ @@ -170332,7 +185946,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D561, }, [0x1D562]={ @@ -170340,7 +185954,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D562, }, [0x1D563]={ @@ -170348,7 +185962,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D563, }, [0x1D564]={ @@ -170356,7 +185970,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D564, }, [0x1D565]={ @@ -170364,7 +185978,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D565, }, [0x1D566]={ @@ -170372,7 +185986,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D566, }, [0x1D567]={ @@ -170380,7 +185994,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D567, }, [0x1D568]={ @@ -170388,7 +186002,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D568, }, [0x1D569]={ @@ -170396,7 +186010,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D569, }, [0x1D56A]={ @@ -170404,7 +186018,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D56A, }, [0x1D56B]={ @@ -170412,7 +186026,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D56B, }, [0x1D56C]={ @@ -170420,7 +186034,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D56C, visual="bf", }, @@ -170429,7 +186043,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D56D, visual="bf", }, @@ -170438,7 +186052,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D56E, visual="bf", }, @@ -170447,7 +186061,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D56F, visual="bf", }, @@ -170456,7 +186070,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D570, visual="bf", }, @@ -170465,7 +186079,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D571, visual="bf", }, @@ -170474,7 +186088,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D572, visual="bf", }, @@ -170483,7 +186097,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D573, visual="bf", }, @@ -170492,7 +186106,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D574, visual="bf", }, @@ -170501,7 +186115,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D575, visual="bf", }, @@ -170510,7 +186124,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D576, visual="bf", }, @@ -170519,7 +186133,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D577, visual="bf", }, @@ -170528,7 +186142,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D578, visual="bf", }, @@ -170537,7 +186151,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D579, visual="bf", }, @@ -170546,7 +186160,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D57A, visual="bf", }, @@ -170555,7 +186169,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D57B, visual="bf", }, @@ -170564,7 +186178,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D57C, visual="bf", }, @@ -170573,7 +186187,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D57D, visual="bf", }, @@ -170582,7 +186196,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D57E, visual="bf", }, @@ -170591,7 +186205,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D57F, visual="bf", }, @@ -170600,7 +186214,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D580, visual="bf", }, @@ -170609,7 +186223,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D581, visual="bf", }, @@ -170618,7 +186232,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D582, visual="bf", }, @@ -170627,7 +186241,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D583, visual="bf", }, @@ -170636,7 +186250,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D584, visual="bf", }, @@ -170645,7 +186259,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D585, visual="bf", }, @@ -170654,7 +186268,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D586, visual="bf", }, @@ -170663,7 +186277,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D587, visual="bf", }, @@ -170672,7 +186286,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D588, visual="bf", }, @@ -170681,7 +186295,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D589, visual="bf", }, @@ -170690,7 +186304,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D58A, visual="bf", }, @@ -170699,7 +186313,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D58B, visual="bf", }, @@ -170708,7 +186322,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D58C, visual="bf", }, @@ -170717,7 +186331,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D58D, visual="bf", }, @@ -170726,7 +186340,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D58E, visual="bf", }, @@ -170735,7 +186349,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D58F, visual="bf", }, @@ -170744,7 +186358,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D590, visual="bf", }, @@ -170753,7 +186367,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D591, visual="bf", }, @@ -170762,7 +186376,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D592, visual="bf", }, @@ -170771,7 +186385,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D593, visual="bf", }, @@ -170780,7 +186394,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D594, visual="bf", }, @@ -170789,7 +186403,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D595, visual="bf", }, @@ -170798,7 +186412,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D596, visual="bf", }, @@ -170807,7 +186421,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D597, visual="bf", }, @@ -170816,7 +186430,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D598, visual="bf", }, @@ -170825,7 +186439,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D599, visual="bf", }, @@ -170834,7 +186448,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D59A, visual="bf", }, @@ -170843,7 +186457,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D59B, visual="bf", }, @@ -170852,7 +186466,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D59C, visual="bf", }, @@ -170861,7 +186475,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D59D, visual="bf", }, @@ -170870,7 +186484,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D59E, visual="bf", }, @@ -170879,7 +186493,7 @@ characters.data={ description="MATHEMATICAL BOLD FRAKTUR SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D59F, visual="bf", }, @@ -170888,7 +186502,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D5A0, }, [0x1D5A1]={ @@ -170896,7 +186510,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D5A1, }, [0x1D5A2]={ @@ -170904,7 +186518,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D5A2, }, [0x1D5A3]={ @@ -170912,7 +186526,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D5A3, }, [0x1D5A4]={ @@ -170920,7 +186534,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D5A4, }, [0x1D5A5]={ @@ -170928,7 +186542,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D5A5, }, [0x1D5A6]={ @@ -170936,7 +186550,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D5A6, }, [0x1D5A7]={ @@ -170944,7 +186558,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D5A7, }, [0x1D5A8]={ @@ -170952,7 +186566,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D5A8, }, [0x1D5A9]={ @@ -170960,7 +186574,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D5A9, }, [0x1D5AA]={ @@ -170968,7 +186582,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D5AA, }, [0x1D5AB]={ @@ -170976,7 +186590,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D5AB, }, [0x1D5AC]={ @@ -170984,7 +186598,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D5AC, }, [0x1D5AD]={ @@ -170992,7 +186606,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D5AD, }, [0x1D5AE]={ @@ -171000,7 +186614,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D5AE, }, [0x1D5AF]={ @@ -171008,7 +186622,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D5AF, }, [0x1D5B0]={ @@ -171016,7 +186630,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D5B0, }, [0x1D5B1]={ @@ -171024,7 +186638,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D5B1, }, [0x1D5B2]={ @@ -171032,7 +186646,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D5B2, }, [0x1D5B3]={ @@ -171040,7 +186654,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D5B3, }, [0x1D5B4]={ @@ -171048,7 +186662,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D5B4, }, [0x1D5B5]={ @@ -171056,7 +186670,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D5B5, }, [0x1D5B6]={ @@ -171064,7 +186678,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D5B6, }, [0x1D5B7]={ @@ -171072,7 +186686,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D5B7, }, [0x1D5B8]={ @@ -171080,7 +186694,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D5B8, }, [0x1D5B9]={ @@ -171088,7 +186702,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D5B9, }, [0x1D5BA]={ @@ -171096,7 +186710,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D5BA, }, [0x1D5BB]={ @@ -171104,7 +186718,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D5BB, }, [0x1D5BC]={ @@ -171112,7 +186726,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D5BC, }, [0x1D5BD]={ @@ -171120,7 +186734,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D5BD, }, [0x1D5BE]={ @@ -171128,7 +186742,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D5BE, }, [0x1D5BF]={ @@ -171136,7 +186750,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D5BF, }, [0x1D5C0]={ @@ -171144,7 +186758,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D5C0, }, [0x1D5C1]={ @@ -171152,7 +186766,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D5C1, }, [0x1D5C2]={ @@ -171160,7 +186774,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D5C2, }, [0x1D5C3]={ @@ -171168,7 +186782,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D5C3, }, [0x1D5C4]={ @@ -171176,7 +186790,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D5C4, }, [0x1D5C5]={ @@ -171184,7 +186798,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D5C5, }, [0x1D5C6]={ @@ -171192,7 +186806,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D5C6, }, [0x1D5C7]={ @@ -171200,7 +186814,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D5C7, }, [0x1D5C8]={ @@ -171208,7 +186822,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D5C8, }, [0x1D5C9]={ @@ -171216,7 +186830,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D5C9, }, [0x1D5CA]={ @@ -171224,7 +186838,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D5CA, }, [0x1D5CB]={ @@ -171232,7 +186846,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D5CB, }, [0x1D5CC]={ @@ -171240,7 +186854,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D5CC, }, [0x1D5CD]={ @@ -171248,7 +186862,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D5CD, }, [0x1D5CE]={ @@ -171256,7 +186870,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D5CE, }, [0x1D5CF]={ @@ -171264,7 +186878,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D5CF, }, [0x1D5D0]={ @@ -171272,7 +186886,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D5D0, }, [0x1D5D1]={ @@ -171280,7 +186894,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D5D1, }, [0x1D5D2]={ @@ -171288,7 +186902,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D5D2, }, [0x1D5D3]={ @@ -171296,7 +186910,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D5D3, }, [0x1D5D4]={ @@ -171304,7 +186918,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D5D4, visual="bf", }, @@ -171313,7 +186927,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D5D5, visual="bf", }, @@ -171322,7 +186936,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D5D6, visual="bf", }, @@ -171331,7 +186945,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D5D7, visual="bf", }, @@ -171340,7 +186954,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D5D8, visual="bf", }, @@ -171349,7 +186963,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D5D9, visual="bf", }, @@ -171358,7 +186972,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D5DA, visual="bf", }, @@ -171367,7 +186981,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D5DB, visual="bf", }, @@ -171376,7 +186990,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D5DC, visual="bf", }, @@ -171385,7 +186999,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D5DD, visual="bf", }, @@ -171394,7 +187008,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D5DE, visual="bf", }, @@ -171403,7 +187017,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D5DF, visual="bf", }, @@ -171412,7 +187026,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D5E0, visual="bf", }, @@ -171421,7 +187035,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D5E1, visual="bf", }, @@ -171430,7 +187044,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D5E2, visual="bf", }, @@ -171439,7 +187053,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D5E3, visual="bf", }, @@ -171448,7 +187062,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D5E4, visual="bf", }, @@ -171457,7 +187071,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D5E5, visual="bf", }, @@ -171466,7 +187080,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D5E6, visual="bf", }, @@ -171475,7 +187089,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D5E7, visual="bf", }, @@ -171484,7 +187098,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D5E8, visual="bf", }, @@ -171493,7 +187107,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D5E9, visual="bf", }, @@ -171502,7 +187116,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D5EA, visual="bf", }, @@ -171511,7 +187125,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D5EB, visual="bf", }, @@ -171520,7 +187134,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D5EC, visual="bf", }, @@ -171529,7 +187143,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D5ED, visual="bf", }, @@ -171538,7 +187152,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D5EE, visual="bf", }, @@ -171547,7 +187161,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D5EF, visual="bf", }, @@ -171556,7 +187170,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D5F0, visual="bf", }, @@ -171565,7 +187179,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D5F1, visual="bf", }, @@ -171574,7 +187188,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D5F2, visual="bf", }, @@ -171583,7 +187197,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D5F3, visual="bf", }, @@ -171592,7 +187206,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D5F4, visual="bf", }, @@ -171601,7 +187215,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D5F5, visual="bf", }, @@ -171610,7 +187224,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D5F6, visual="bf", }, @@ -171619,7 +187233,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D5F7, visual="bf", }, @@ -171628,7 +187242,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D5F8, visual="bf", }, @@ -171637,7 +187251,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D5F9, visual="bf", }, @@ -171646,7 +187260,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D5FA, visual="bf", }, @@ -171655,7 +187269,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D5FB, visual="bf", }, @@ -171664,7 +187278,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D5FC, visual="bf", }, @@ -171673,7 +187287,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D5FD, visual="bf", }, @@ -171682,7 +187296,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D5FE, visual="bf", }, @@ -171691,7 +187305,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D5FF, visual="bf", }, @@ -171700,7 +187314,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D600, visual="bf", }, @@ -171709,7 +187323,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D601, visual="bf", }, @@ -171718,7 +187332,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D602, visual="bf", }, @@ -171727,7 +187341,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D603, visual="bf", }, @@ -171736,7 +187350,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D604, visual="bf", }, @@ -171745,7 +187359,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D605, visual="bf", }, @@ -171754,7 +187368,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D606, visual="bf", }, @@ -171763,7 +187377,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D607, visual="bf", }, @@ -171772,7 +187386,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D608, visual="it", }, @@ -171781,7 +187395,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D609, visual="it", }, @@ -171790,7 +187404,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D60A, visual="it", }, @@ -171799,7 +187413,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D60B, visual="it", }, @@ -171808,7 +187422,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D60C, visual="it", }, @@ -171817,7 +187431,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D60D, visual="it", }, @@ -171826,7 +187440,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D60E, visual="it", }, @@ -171835,7 +187449,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D60F, visual="it", }, @@ -171844,7 +187458,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D610, visual="it", }, @@ -171853,7 +187467,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D611, visual="it", }, @@ -171862,7 +187476,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D612, visual="it", }, @@ -171871,7 +187485,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D613, visual="it", }, @@ -171880,7 +187494,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D614, visual="it", }, @@ -171889,7 +187503,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D615, visual="it", }, @@ -171898,7 +187512,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D616, visual="it", }, @@ -171907,7 +187521,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D617, visual="it", }, @@ -171916,7 +187530,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D618, visual="it", }, @@ -171925,7 +187539,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D619, visual="it", }, @@ -171934,7 +187548,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D61A, visual="it", }, @@ -171943,7 +187557,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D61B, visual="it", }, @@ -171952,7 +187566,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D61C, visual="it", }, @@ -171961,7 +187575,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D61D, visual="it", }, @@ -171970,7 +187584,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D61E, visual="it", }, @@ -171979,7 +187593,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D61F, visual="it", }, @@ -171988,7 +187602,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D620, visual="it", }, @@ -171997,7 +187611,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D621, visual="it", }, @@ -172006,7 +187620,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D622, visual="it", }, @@ -172015,7 +187629,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D623, visual="it", }, @@ -172024,7 +187638,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D624, visual="it", }, @@ -172033,7 +187647,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D625, visual="it", }, @@ -172042,7 +187656,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D626, visual="it", }, @@ -172051,7 +187665,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D627, visual="it", }, @@ -172060,7 +187674,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D628, visual="it", }, @@ -172069,7 +187683,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D629, visual="it", }, @@ -172078,7 +187692,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D62A, visual="it", }, @@ -172087,7 +187701,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D62B, visual="it", }, @@ -172096,7 +187710,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D62C, visual="it", }, @@ -172105,7 +187719,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D62D, visual="it", }, @@ -172114,7 +187728,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D62E, visual="it", }, @@ -172123,7 +187737,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D62F, visual="it", }, @@ -172132,7 +187746,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D630, visual="it", }, @@ -172141,7 +187755,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D631, visual="it", }, @@ -172150,7 +187764,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D632, visual="it", }, @@ -172159,7 +187773,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D633, visual="it", }, @@ -172168,7 +187782,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D634, visual="it", }, @@ -172177,7 +187791,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D635, visual="it", }, @@ -172186,7 +187800,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D636, visual="it", }, @@ -172195,7 +187809,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D637, visual="it", }, @@ -172204,7 +187818,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D638, visual="it", }, @@ -172213,7 +187827,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D639, visual="it", }, @@ -172222,7 +187836,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D63A, visual="it", }, @@ -172231,7 +187845,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D63B, visual="it", }, @@ -172240,7 +187854,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D63C, visual="bi", }, @@ -172249,7 +187863,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D63D, visual="bi", }, @@ -172258,7 +187872,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D63E, visual="bi", }, @@ -172267,7 +187881,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D63F, visual="bi", }, @@ -172276,7 +187890,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D640, visual="bi", }, @@ -172285,7 +187899,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D641, visual="bi", }, @@ -172294,7 +187908,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D642, visual="bi", }, @@ -172303,7 +187917,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D643, visual="bi", }, @@ -172312,7 +187926,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D644, visual="bi", }, @@ -172321,7 +187935,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D645, visual="bi", }, @@ -172330,7 +187944,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D646, visual="bi", }, @@ -172339,7 +187953,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D647, visual="bi", }, @@ -172348,7 +187962,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D648, visual="bi", }, @@ -172357,7 +187971,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D649, visual="bi", }, @@ -172366,7 +187980,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D64A, visual="bi", }, @@ -172375,7 +187989,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D64B, visual="bi", }, @@ -172384,7 +187998,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D64C, visual="bi", }, @@ -172393,7 +188007,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D64D, visual="bi", }, @@ -172402,7 +188016,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D64E, visual="bi", }, @@ -172411,7 +188025,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D64F, visual="bi", }, @@ -172420,7 +188034,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D650, visual="bi", }, @@ -172429,7 +188043,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D651, visual="bi", }, @@ -172438,7 +188052,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D652, visual="bi", }, @@ -172447,7 +188061,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D653, visual="bi", }, @@ -172456,7 +188070,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D654, visual="bi", }, @@ -172465,7 +188079,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D655, visual="bi", }, @@ -172474,7 +188088,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D656, visual="bi", }, @@ -172483,7 +188097,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D657, visual="bi", }, @@ -172492,7 +188106,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D658, visual="bi", }, @@ -172501,7 +188115,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D659, visual="bi", }, @@ -172510,7 +188124,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D65A, visual="bi", }, @@ -172519,7 +188133,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D65B, visual="bi", }, @@ -172528,7 +188142,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D65C, visual="bi", }, @@ -172537,7 +188151,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D65D, visual="bi", }, @@ -172546,7 +188160,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D65E, visual="bi", }, @@ -172555,7 +188169,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D65F, visual="bi", }, @@ -172564,7 +188178,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D660, visual="bi", }, @@ -172573,7 +188187,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D661, visual="bi", }, @@ -172582,7 +188196,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D662, visual="bi", }, @@ -172591,7 +188205,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D663, visual="bi", }, @@ -172600,7 +188214,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D664, visual="bi", }, @@ -172609,7 +188223,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D665, visual="bi", }, @@ -172618,7 +188232,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D666, visual="bi", }, @@ -172627,7 +188241,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D667, visual="bi", }, @@ -172636,7 +188250,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D668, visual="bi", }, @@ -172645,7 +188259,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D669, visual="bi", }, @@ -172654,7 +188268,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D66A, visual="bi", }, @@ -172663,7 +188277,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D66B, visual="bi", }, @@ -172672,7 +188286,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D66C, visual="bi", }, @@ -172681,7 +188295,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D66D, visual="bi", }, @@ -172690,7 +188304,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D66E, visual="bi", }, @@ -172699,7 +188313,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D66F, visual="bi", }, @@ -172708,7 +188322,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL A", direction="l", linebreak="al", - specials={ "font", 0x0041 }, + specials={ "font", 0x41 }, unicodeslot=0x1D670, }, [0x1D671]={ @@ -172716,7 +188330,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL B", direction="l", linebreak="al", - specials={ "font", 0x0042 }, + specials={ "font", 0x42 }, unicodeslot=0x1D671, }, [0x1D672]={ @@ -172724,7 +188338,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL C", direction="l", linebreak="al", - specials={ "font", 0x0043 }, + specials={ "font", 0x43 }, unicodeslot=0x1D672, }, [0x1D673]={ @@ -172732,7 +188346,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL D", direction="l", linebreak="al", - specials={ "font", 0x0044 }, + specials={ "font", 0x44 }, unicodeslot=0x1D673, }, [0x1D674]={ @@ -172740,7 +188354,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL E", direction="l", linebreak="al", - specials={ "font", 0x0045 }, + specials={ "font", 0x45 }, unicodeslot=0x1D674, }, [0x1D675]={ @@ -172748,7 +188362,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL F", direction="l", linebreak="al", - specials={ "font", 0x0046 }, + specials={ "font", 0x46 }, unicodeslot=0x1D675, }, [0x1D676]={ @@ -172756,7 +188370,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL G", direction="l", linebreak="al", - specials={ "font", 0x0047 }, + specials={ "font", 0x47 }, unicodeslot=0x1D676, }, [0x1D677]={ @@ -172764,7 +188378,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL H", direction="l", linebreak="al", - specials={ "font", 0x0048 }, + specials={ "font", 0x48 }, unicodeslot=0x1D677, }, [0x1D678]={ @@ -172772,7 +188386,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL I", direction="l", linebreak="al", - specials={ "font", 0x0049 }, + specials={ "font", 0x49 }, unicodeslot=0x1D678, }, [0x1D679]={ @@ -172780,7 +188394,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL J", direction="l", linebreak="al", - specials={ "font", 0x004A }, + specials={ "font", 0x4A }, unicodeslot=0x1D679, }, [0x1D67A]={ @@ -172788,7 +188402,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL K", direction="l", linebreak="al", - specials={ "font", 0x004B }, + specials={ "font", 0x4B }, unicodeslot=0x1D67A, }, [0x1D67B]={ @@ -172796,7 +188410,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL L", direction="l", linebreak="al", - specials={ "font", 0x004C }, + specials={ "font", 0x4C }, unicodeslot=0x1D67B, }, [0x1D67C]={ @@ -172804,7 +188418,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL M", direction="l", linebreak="al", - specials={ "font", 0x004D }, + specials={ "font", 0x4D }, unicodeslot=0x1D67C, }, [0x1D67D]={ @@ -172812,7 +188426,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL N", direction="l", linebreak="al", - specials={ "font", 0x004E }, + specials={ "font", 0x4E }, unicodeslot=0x1D67D, }, [0x1D67E]={ @@ -172820,7 +188434,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL O", direction="l", linebreak="al", - specials={ "font", 0x004F }, + specials={ "font", 0x4F }, unicodeslot=0x1D67E, }, [0x1D67F]={ @@ -172828,7 +188442,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL P", direction="l", linebreak="al", - specials={ "font", 0x0050 }, + specials={ "font", 0x50 }, unicodeslot=0x1D67F, }, [0x1D680]={ @@ -172836,7 +188450,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL Q", direction="l", linebreak="al", - specials={ "font", 0x0051 }, + specials={ "font", 0x51 }, unicodeslot=0x1D680, }, [0x1D681]={ @@ -172844,7 +188458,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL R", direction="l", linebreak="al", - specials={ "font", 0x0052 }, + specials={ "font", 0x52 }, unicodeslot=0x1D681, }, [0x1D682]={ @@ -172852,7 +188466,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL S", direction="l", linebreak="al", - specials={ "font", 0x0053 }, + specials={ "font", 0x53 }, unicodeslot=0x1D682, }, [0x1D683]={ @@ -172860,7 +188474,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL T", direction="l", linebreak="al", - specials={ "font", 0x0054 }, + specials={ "font", 0x54 }, unicodeslot=0x1D683, }, [0x1D684]={ @@ -172868,7 +188482,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL U", direction="l", linebreak="al", - specials={ "font", 0x0055 }, + specials={ "font", 0x55 }, unicodeslot=0x1D684, }, [0x1D685]={ @@ -172876,7 +188490,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL V", direction="l", linebreak="al", - specials={ "font", 0x0056 }, + specials={ "font", 0x56 }, unicodeslot=0x1D685, }, [0x1D686]={ @@ -172884,7 +188498,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL W", direction="l", linebreak="al", - specials={ "font", 0x0057 }, + specials={ "font", 0x57 }, unicodeslot=0x1D686, }, [0x1D687]={ @@ -172892,7 +188506,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL X", direction="l", linebreak="al", - specials={ "font", 0x0058 }, + specials={ "font", 0x58 }, unicodeslot=0x1D687, }, [0x1D688]={ @@ -172900,7 +188514,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL Y", direction="l", linebreak="al", - specials={ "font", 0x0059 }, + specials={ "font", 0x59 }, unicodeslot=0x1D688, }, [0x1D689]={ @@ -172908,7 +188522,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE CAPITAL Z", direction="l", linebreak="al", - specials={ "font", 0x005A }, + specials={ "font", 0x5A }, unicodeslot=0x1D689, }, [0x1D68A]={ @@ -172916,7 +188530,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL A", direction="l", linebreak="al", - specials={ "font", 0x0061 }, + specials={ "font", 0x61 }, unicodeslot=0x1D68A, }, [0x1D68B]={ @@ -172924,7 +188538,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL B", direction="l", linebreak="al", - specials={ "font", 0x0062 }, + specials={ "font", 0x62 }, unicodeslot=0x1D68B, }, [0x1D68C]={ @@ -172932,7 +188546,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL C", direction="l", linebreak="al", - specials={ "font", 0x0063 }, + specials={ "font", 0x63 }, unicodeslot=0x1D68C, }, [0x1D68D]={ @@ -172940,7 +188554,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL D", direction="l", linebreak="al", - specials={ "font", 0x0064 }, + specials={ "font", 0x64 }, unicodeslot=0x1D68D, }, [0x1D68E]={ @@ -172948,7 +188562,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL E", direction="l", linebreak="al", - specials={ "font", 0x0065 }, + specials={ "font", 0x65 }, unicodeslot=0x1D68E, }, [0x1D68F]={ @@ -172956,7 +188570,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL F", direction="l", linebreak="al", - specials={ "font", 0x0066 }, + specials={ "font", 0x66 }, unicodeslot=0x1D68F, }, [0x1D690]={ @@ -172964,7 +188578,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL G", direction="l", linebreak="al", - specials={ "font", 0x0067 }, + specials={ "font", 0x67 }, unicodeslot=0x1D690, }, [0x1D691]={ @@ -172972,7 +188586,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL H", direction="l", linebreak="al", - specials={ "font", 0x0068 }, + specials={ "font", 0x68 }, unicodeslot=0x1D691, }, [0x1D692]={ @@ -172980,7 +188594,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL I", direction="l", linebreak="al", - specials={ "font", 0x0069 }, + specials={ "font", 0x69 }, unicodeslot=0x1D692, }, [0x1D693]={ @@ -172988,7 +188602,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL J", direction="l", linebreak="al", - specials={ "font", 0x006A }, + specials={ "font", 0x6A }, unicodeslot=0x1D693, }, [0x1D694]={ @@ -172996,7 +188610,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL K", direction="l", linebreak="al", - specials={ "font", 0x006B }, + specials={ "font", 0x6B }, unicodeslot=0x1D694, }, [0x1D695]={ @@ -173004,7 +188618,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL L", direction="l", linebreak="al", - specials={ "font", 0x006C }, + specials={ "font", 0x6C }, unicodeslot=0x1D695, }, [0x1D696]={ @@ -173012,7 +188626,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL M", direction="l", linebreak="al", - specials={ "font", 0x006D }, + specials={ "font", 0x6D }, unicodeslot=0x1D696, }, [0x1D697]={ @@ -173020,7 +188634,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL N", direction="l", linebreak="al", - specials={ "font", 0x006E }, + specials={ "font", 0x6E }, unicodeslot=0x1D697, }, [0x1D698]={ @@ -173028,7 +188642,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL O", direction="l", linebreak="al", - specials={ "font", 0x006F }, + specials={ "font", 0x6F }, unicodeslot=0x1D698, }, [0x1D699]={ @@ -173036,7 +188650,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL P", direction="l", linebreak="al", - specials={ "font", 0x0070 }, + specials={ "font", 0x70 }, unicodeslot=0x1D699, }, [0x1D69A]={ @@ -173044,7 +188658,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL Q", direction="l", linebreak="al", - specials={ "font", 0x0071 }, + specials={ "font", 0x71 }, unicodeslot=0x1D69A, }, [0x1D69B]={ @@ -173052,7 +188666,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL R", direction="l", linebreak="al", - specials={ "font", 0x0072 }, + specials={ "font", 0x72 }, unicodeslot=0x1D69B, }, [0x1D69C]={ @@ -173060,7 +188674,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL S", direction="l", linebreak="al", - specials={ "font", 0x0073 }, + specials={ "font", 0x73 }, unicodeslot=0x1D69C, }, [0x1D69D]={ @@ -173068,7 +188682,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL T", direction="l", linebreak="al", - specials={ "font", 0x0074 }, + specials={ "font", 0x74 }, unicodeslot=0x1D69D, }, [0x1D69E]={ @@ -173076,7 +188690,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL U", direction="l", linebreak="al", - specials={ "font", 0x0075 }, + specials={ "font", 0x75 }, unicodeslot=0x1D69E, }, [0x1D69F]={ @@ -173084,7 +188698,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL V", direction="l", linebreak="al", - specials={ "font", 0x0076 }, + specials={ "font", 0x76 }, unicodeslot=0x1D69F, }, [0x1D6A0]={ @@ -173092,7 +188706,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL W", direction="l", linebreak="al", - specials={ "font", 0x0077 }, + specials={ "font", 0x77 }, unicodeslot=0x1D6A0, }, [0x1D6A1]={ @@ -173100,7 +188714,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL X", direction="l", linebreak="al", - specials={ "font", 0x0078 }, + specials={ "font", 0x78 }, unicodeslot=0x1D6A1, }, [0x1D6A2]={ @@ -173108,7 +188722,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL Y", direction="l", linebreak="al", - specials={ "font", 0x0079 }, + specials={ "font", 0x79 }, unicodeslot=0x1D6A2, }, [0x1D6A3]={ @@ -173116,7 +188730,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE SMALL Z", direction="l", linebreak="al", - specials={ "font", 0x007A }, + specials={ "font", 0x7A }, unicodeslot=0x1D6A3, }, [0x1D6A4]={ @@ -173126,7 +188740,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="imath", - specials={ "font", 0x0131 }, + specials={ "font", 0x131 }, unicodeslot=0x1D6A4, visual="it", }, @@ -173137,7 +188751,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="jmath", - specials={ "font", 0x0237 }, + specials={ "font", 0x237 }, unicodeslot=0x1D6A5, visual="it", }, @@ -173146,7 +188760,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x0391 }, + specials={ "font", 0x391 }, unicodeslot=0x1D6A8, visual="bf", }, @@ -173155,7 +188769,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL BETA", direction="l", linebreak="al", - specials={ "font", 0x0392 }, + specials={ "font", 0x392 }, unicodeslot=0x1D6A9, visual="bf", }, @@ -173164,7 +188778,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x1D6AA, visual="bf", }, @@ -173173,7 +188787,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL DELTA", direction="l", linebreak="al", - specials={ "font", 0x0394 }, + specials={ "font", 0x394 }, unicodeslot=0x1D6AB, visual="bf", }, @@ -173182,7 +188796,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x0395 }, + specials={ "font", 0x395 }, unicodeslot=0x1D6AC, visual="bf", }, @@ -173191,7 +188805,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL ZETA", direction="l", linebreak="al", - specials={ "font", 0x0396 }, + specials={ "font", 0x396 }, unicodeslot=0x1D6AD, visual="bf", }, @@ -173200,7 +188814,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL ETA", direction="l", linebreak="al", - specials={ "font", 0x0397 }, + specials={ "font", 0x397 }, unicodeslot=0x1D6AE, visual="bf", }, @@ -173209,7 +188823,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL THETA", direction="l", linebreak="al", - specials={ "font", 0x0398 }, + specials={ "font", 0x398 }, unicodeslot=0x1D6AF, visual="bf", }, @@ -173218,7 +188832,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL IOTA", direction="l", linebreak="al", - specials={ "font", 0x0399 }, + specials={ "font", 0x399 }, unicodeslot=0x1D6B0, visual="bf", }, @@ -173227,7 +188841,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x039A }, + specials={ "font", 0x39A }, unicodeslot=0x1D6B1, visual="bf", }, @@ -173236,7 +188850,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x039B }, + specials={ "font", 0x39B }, unicodeslot=0x1D6B2, visual="bf", }, @@ -173245,7 +188859,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL MU", direction="l", linebreak="al", - specials={ "font", 0x039C }, + specials={ "font", 0x39C }, unicodeslot=0x1D6B3, visual="bf", }, @@ -173254,7 +188868,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL NU", direction="l", linebreak="al", - specials={ "font", 0x039D }, + specials={ "font", 0x39D }, unicodeslot=0x1D6B4, visual="bf", }, @@ -173263,7 +188877,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL XI", direction="l", linebreak="al", - specials={ "font", 0x039E }, + specials={ "font", 0x39E }, unicodeslot=0x1D6B5, visual="bf", }, @@ -173272,7 +188886,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x039F }, + specials={ "font", 0x39F }, unicodeslot=0x1D6B6, visual="bf", }, @@ -173281,7 +188895,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x1D6B7, visual="bf", }, @@ -173290,7 +188904,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL RHO", direction="l", linebreak="al", - specials={ "font", 0x03A1 }, + specials={ "font", 0x3A1 }, unicodeslot=0x1D6B8, visual="bf", }, @@ -173299,7 +188913,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F4 }, + specials={ "font", 0x3F4 }, unicodeslot=0x1D6B9, visual="bf", }, @@ -173308,7 +188922,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03A3 }, + specials={ "font", 0x3A3 }, unicodeslot=0x1D6BA, visual="bf", }, @@ -173317,7 +188931,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL TAU", direction="l", linebreak="al", - specials={ "font", 0x03A4 }, + specials={ "font", 0x3A4 }, unicodeslot=0x1D6BB, visual="bf", }, @@ -173326,7 +188940,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03A5 }, + specials={ "font", 0x3A5 }, unicodeslot=0x1D6BC, visual="bf", }, @@ -173335,7 +188949,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL PHI", direction="l", linebreak="al", - specials={ "font", 0x03A6 }, + specials={ "font", 0x3A6 }, unicodeslot=0x1D6BD, visual="bf", }, @@ -173344,7 +188958,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL CHI", direction="l", linebreak="al", - specials={ "font", 0x03A7 }, + specials={ "font", 0x3A7 }, unicodeslot=0x1D6BE, visual="bf", }, @@ -173353,7 +188967,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL PSI", direction="l", linebreak="al", - specials={ "font", 0x03A8 }, + specials={ "font", 0x3A8 }, unicodeslot=0x1D6BF, visual="bf", }, @@ -173362,7 +188976,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03A9 }, + specials={ "font", 0x3A9 }, unicodeslot=0x1D6C0, visual="bf", }, @@ -173380,7 +188994,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x03B1 }, + specials={ "font", 0x3B1 }, unicodeslot=0x1D6C2, visual="bf", }, @@ -173389,7 +189003,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL BETA", direction="l", linebreak="al", - specials={ "font", 0x03B2 }, + specials={ "font", 0x3B2 }, unicodeslot=0x1D6C3, visual="bf", }, @@ -173398,7 +189012,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x1D6C4, visual="bf", }, @@ -173407,7 +189021,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL DELTA", direction="l", linebreak="al", - specials={ "font", 0x03B4 }, + specials={ "font", 0x3B4 }, unicodeslot=0x1D6C5, visual="bf", }, @@ -173416,7 +189030,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x03B5 }, + specials={ "font", 0x3B5 }, unicodeslot=0x1D6C6, visual="bf", }, @@ -173425,7 +189039,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL ZETA", direction="l", linebreak="al", - specials={ "font", 0x03B6 }, + specials={ "font", 0x3B6 }, unicodeslot=0x1D6C7, visual="bf", }, @@ -173434,7 +189048,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL ETA", direction="l", linebreak="al", - specials={ "font", 0x03B7 }, + specials={ "font", 0x3B7 }, unicodeslot=0x1D6C8, visual="bf", }, @@ -173443,7 +189057,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL THETA", direction="l", linebreak="al", - specials={ "font", 0x03B8 }, + specials={ "font", 0x3B8 }, unicodeslot=0x1D6C9, visual="bf", }, @@ -173452,7 +189066,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL IOTA", direction="l", linebreak="al", - specials={ "font", 0x03B9 }, + specials={ "font", 0x3B9 }, unicodeslot=0x1D6CA, visual="bf", }, @@ -173461,7 +189075,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x03BA }, + specials={ "font", 0x3BA }, unicodeslot=0x1D6CB, visual="bf", }, @@ -173470,7 +189084,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x03BB }, + specials={ "font", 0x3BB }, unicodeslot=0x1D6CC, visual="bf", }, @@ -173479,7 +189093,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL MU", direction="l", linebreak="al", - specials={ "font", 0x03BC }, + specials={ "font", 0x3BC }, unicodeslot=0x1D6CD, visual="bf", }, @@ -173488,7 +189102,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL NU", direction="l", linebreak="al", - specials={ "font", 0x03BD }, + specials={ "font", 0x3BD }, unicodeslot=0x1D6CE, visual="bf", }, @@ -173497,7 +189111,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL XI", direction="l", linebreak="al", - specials={ "font", 0x03BE }, + specials={ "font", 0x3BE }, unicodeslot=0x1D6CF, visual="bf", }, @@ -173506,7 +189120,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x03BF }, + specials={ "font", 0x3BF }, unicodeslot=0x1D6D0, visual="bf", }, @@ -173515,7 +189129,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x1D6D1, visual="bf", }, @@ -173524,7 +189138,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL RHO", direction="l", linebreak="al", - specials={ "font", 0x03C1 }, + specials={ "font", 0x3C1 }, unicodeslot=0x1D6D2, visual="bf", }, @@ -173533,7 +189147,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL FINAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C2 }, + specials={ "font", 0x3C2 }, unicodeslot=0x1D6D3, visual="bf", }, @@ -173542,7 +189156,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C3 }, + specials={ "font", 0x3C3 }, unicodeslot=0x1D6D4, visual="bf", }, @@ -173551,7 +189165,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL TAU", direction="l", linebreak="al", - specials={ "font", 0x03C4 }, + specials={ "font", 0x3C4 }, unicodeslot=0x1D6D5, visual="bf", }, @@ -173560,7 +189174,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03C5 }, + specials={ "font", 0x3C5 }, unicodeslot=0x1D6D6, visual="bf", }, @@ -173569,7 +189183,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL PHI", direction="l", linebreak="al", - specials={ "font", 0x03C6 }, + specials={ "font", 0x3C6 }, unicodeslot=0x1D6D7, visual="bf", }, @@ -173578,7 +189192,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL CHI", direction="l", linebreak="al", - specials={ "font", 0x03C7 }, + specials={ "font", 0x3C7 }, unicodeslot=0x1D6D8, visual="bf", }, @@ -173587,7 +189201,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL PSI", direction="l", linebreak="al", - specials={ "font", 0x03C8 }, + specials={ "font", 0x3C8 }, unicodeslot=0x1D6D9, visual="bf", }, @@ -173596,7 +189210,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03C9 }, + specials={ "font", 0x3C9 }, unicodeslot=0x1D6DA, visual="bf", }, @@ -173614,7 +189228,7 @@ characters.data={ description="MATHEMATICAL BOLD EPSILON SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F5 }, + specials={ "font", 0x3F5 }, unicodeslot=0x1D6DC, visual="bf", }, @@ -173623,7 +189237,7 @@ characters.data={ description="MATHEMATICAL BOLD THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D1 }, + specials={ "font", 0x3D1 }, unicodeslot=0x1D6DD, visual="bf", }, @@ -173632,7 +189246,7 @@ characters.data={ description="MATHEMATICAL BOLD KAPPA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F0 }, + specials={ "font", 0x3F0 }, unicodeslot=0x1D6DE, visual="bf", }, @@ -173641,7 +189255,7 @@ characters.data={ description="MATHEMATICAL BOLD PHI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D5 }, + specials={ "font", 0x3D5 }, unicodeslot=0x1D6DF, visual="bf", }, @@ -173650,7 +189264,7 @@ characters.data={ description="MATHEMATICAL BOLD RHO SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F1 }, + specials={ "font", 0x3F1 }, unicodeslot=0x1D6E0, visual="bf", }, @@ -173659,7 +189273,7 @@ characters.data={ description="MATHEMATICAL BOLD PI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D6 }, + specials={ "font", 0x3D6 }, unicodeslot=0x1D6E1, visual="bf", }, @@ -173668,7 +189282,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x0391 }, + specials={ "font", 0x391 }, unicodeslot=0x1D6E2, visual="it", }, @@ -173677,7 +189291,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL BETA", direction="l", linebreak="al", - specials={ "font", 0x0392 }, + specials={ "font", 0x392 }, unicodeslot=0x1D6E3, visual="it", }, @@ -173686,7 +189300,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x1D6E4, visual="it", }, @@ -173695,7 +189309,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL DELTA", direction="l", linebreak="al", - specials={ "font", 0x0394 }, + specials={ "font", 0x394 }, unicodeslot=0x1D6E5, visual="it", }, @@ -173704,7 +189318,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x0395 }, + specials={ "font", 0x395 }, unicodeslot=0x1D6E6, visual="it", }, @@ -173713,7 +189327,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL ZETA", direction="l", linebreak="al", - specials={ "font", 0x0396 }, + specials={ "font", 0x396 }, unicodeslot=0x1D6E7, visual="it", }, @@ -173722,7 +189336,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL ETA", direction="l", linebreak="al", - specials={ "font", 0x0397 }, + specials={ "font", 0x397 }, unicodeslot=0x1D6E8, visual="it", }, @@ -173731,7 +189345,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL THETA", direction="l", linebreak="al", - specials={ "font", 0x0398 }, + specials={ "font", 0x398 }, unicodeslot=0x1D6E9, visual="it", }, @@ -173740,7 +189354,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL IOTA", direction="l", linebreak="al", - specials={ "font", 0x0399 }, + specials={ "font", 0x399 }, unicodeslot=0x1D6EA, visual="it", }, @@ -173749,7 +189363,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x039A }, + specials={ "font", 0x39A }, unicodeslot=0x1D6EB, visual="it", }, @@ -173758,7 +189372,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x039B }, + specials={ "font", 0x39B }, unicodeslot=0x1D6EC, visual="it", }, @@ -173767,7 +189381,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL MU", direction="l", linebreak="al", - specials={ "font", 0x039C }, + specials={ "font", 0x39C }, unicodeslot=0x1D6ED, visual="it", }, @@ -173776,7 +189390,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL NU", direction="l", linebreak="al", - specials={ "font", 0x039D }, + specials={ "font", 0x39D }, unicodeslot=0x1D6EE, visual="it", }, @@ -173785,7 +189399,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL XI", direction="l", linebreak="al", - specials={ "font", 0x039E }, + specials={ "font", 0x39E }, unicodeslot=0x1D6EF, visual="it", }, @@ -173794,7 +189408,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x039F }, + specials={ "font", 0x39F }, unicodeslot=0x1D6F0, visual="it", }, @@ -173803,7 +189417,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x1D6F1, visual="it", }, @@ -173812,7 +189426,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL RHO", direction="l", linebreak="al", - specials={ "font", 0x03A1 }, + specials={ "font", 0x3A1 }, unicodeslot=0x1D6F2, visual="it", }, @@ -173821,7 +189435,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F4 }, + specials={ "font", 0x3F4 }, unicodeslot=0x1D6F3, visual="it", }, @@ -173830,7 +189444,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03A3 }, + specials={ "font", 0x3A3 }, unicodeslot=0x1D6F4, visual="it", }, @@ -173839,7 +189453,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL TAU", direction="l", linebreak="al", - specials={ "font", 0x03A4 }, + specials={ "font", 0x3A4 }, unicodeslot=0x1D6F5, visual="it", }, @@ -173848,7 +189462,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03A5 }, + specials={ "font", 0x3A5 }, unicodeslot=0x1D6F6, visual="it", }, @@ -173857,7 +189471,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL PHI", direction="l", linebreak="al", - specials={ "font", 0x03A6 }, + specials={ "font", 0x3A6 }, unicodeslot=0x1D6F7, visual="it", }, @@ -173866,7 +189480,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL CHI", direction="l", linebreak="al", - specials={ "font", 0x03A7 }, + specials={ "font", 0x3A7 }, unicodeslot=0x1D6F8, visual="it", }, @@ -173875,7 +189489,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL PSI", direction="l", linebreak="al", - specials={ "font", 0x03A8 }, + specials={ "font", 0x3A8 }, unicodeslot=0x1D6F9, visual="it", }, @@ -173884,7 +189498,7 @@ characters.data={ description="MATHEMATICAL ITALIC CAPITAL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03A9 }, + specials={ "font", 0x3A9 }, unicodeslot=0x1D6FA, visual="it", }, @@ -173903,7 +189517,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x03B1 }, + specials={ "font", 0x3B1 }, unicodeslot=0x1D6FC, visual="it", }, @@ -173912,7 +189526,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL BETA", direction="l", linebreak="al", - specials={ "font", 0x03B2 }, + specials={ "font", 0x3B2 }, unicodeslot=0x1D6FD, visual="it", }, @@ -173921,7 +189535,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x1D6FE, visual="it", }, @@ -173930,7 +189544,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL DELTA", direction="l", linebreak="al", - specials={ "font", 0x03B4 }, + specials={ "font", 0x3B4 }, unicodeslot=0x1D6FF, visual="it", }, @@ -173939,7 +189553,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x03B5 }, + specials={ "font", 0x3B5 }, unicodeslot=0x1D700, visual="it", }, @@ -173948,7 +189562,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL ZETA", direction="l", linebreak="al", - specials={ "font", 0x03B6 }, + specials={ "font", 0x3B6 }, unicodeslot=0x1D701, visual="it", }, @@ -173957,7 +189571,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL ETA", direction="l", linebreak="al", - specials={ "font", 0x03B7 }, + specials={ "font", 0x3B7 }, unicodeslot=0x1D702, visual="it", }, @@ -173966,7 +189580,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL THETA", direction="l", linebreak="al", - specials={ "font", 0x03B8 }, + specials={ "font", 0x3B8 }, unicodeslot=0x1D703, visual="it", }, @@ -173975,7 +189589,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL IOTA", direction="l", linebreak="al", - specials={ "font", 0x03B9 }, + specials={ "font", 0x3B9 }, unicodeslot=0x1D704, visual="it", }, @@ -173984,7 +189598,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x03BA }, + specials={ "font", 0x3BA }, unicodeslot=0x1D705, visual="it", }, @@ -173993,7 +189607,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x03BB }, + specials={ "font", 0x3BB }, unicodeslot=0x1D706, visual="it", }, @@ -174002,7 +189616,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL MU", direction="l", linebreak="al", - specials={ "font", 0x03BC }, + specials={ "font", 0x3BC }, unicodeslot=0x1D707, visual="it", }, @@ -174011,7 +189625,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL NU", direction="l", linebreak="al", - specials={ "font", 0x03BD }, + specials={ "font", 0x3BD }, unicodeslot=0x1D708, visual="it", }, @@ -174020,7 +189634,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL XI", direction="l", linebreak="al", - specials={ "font", 0x03BE }, + specials={ "font", 0x3BE }, unicodeslot=0x1D709, visual="it", }, @@ -174029,7 +189643,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x03BF }, + specials={ "font", 0x3BF }, unicodeslot=0x1D70A, visual="it", }, @@ -174038,7 +189652,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x1D70B, visual="it", }, @@ -174047,7 +189661,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL RHO", direction="l", linebreak="al", - specials={ "font", 0x03C1 }, + specials={ "font", 0x3C1 }, unicodeslot=0x1D70C, visual="it", }, @@ -174056,7 +189670,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL FINAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C2 }, + specials={ "font", 0x3C2 }, unicodeslot=0x1D70D, visual="it", }, @@ -174065,7 +189679,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C3 }, + specials={ "font", 0x3C3 }, unicodeslot=0x1D70E, visual="it", }, @@ -174074,7 +189688,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL TAU", direction="l", linebreak="al", - specials={ "font", 0x03C4 }, + specials={ "font", 0x3C4 }, unicodeslot=0x1D70F, visual="it", }, @@ -174083,7 +189697,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03C5 }, + specials={ "font", 0x3C5 }, unicodeslot=0x1D710, visual="it", }, @@ -174092,7 +189706,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL PHI", direction="l", linebreak="al", - specials={ "font", 0x03C6 }, + specials={ "font", 0x3C6 }, unicodeslot=0x1D711, visual="it", }, @@ -174101,7 +189715,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL CHI", direction="l", linebreak="al", - specials={ "font", 0x03C7 }, + specials={ "font", 0x3C7 }, unicodeslot=0x1D712, visual="it", }, @@ -174110,7 +189724,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL PSI", direction="l", linebreak="al", - specials={ "font", 0x03C8 }, + specials={ "font", 0x3C8 }, unicodeslot=0x1D713, visual="it", }, @@ -174119,7 +189733,7 @@ characters.data={ description="MATHEMATICAL ITALIC SMALL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03C9 }, + specials={ "font", 0x3C9 }, unicodeslot=0x1D714, visual="it", }, @@ -174137,7 +189751,7 @@ characters.data={ description="MATHEMATICAL ITALIC EPSILON SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F5 }, + specials={ "font", 0x3F5 }, unicodeslot=0x1D716, visual="it", }, @@ -174148,7 +189762,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="vartheta", - specials={ "font", 0x03D1 }, + specials={ "font", 0x3D1 }, unicodeslot=0x1D717, visual="it", }, @@ -174159,7 +189773,7 @@ characters.data={ linebreak="al", mathclass="default", mathname="varkappa", - specials={ "font", 0x03F0 }, + specials={ "font", 0x3F0 }, unicodeslot=0x1D718, visual="it", }, @@ -174168,7 +189782,7 @@ characters.data={ description="MATHEMATICAL ITALIC PHI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D5 }, + specials={ "font", 0x3D5 }, unicodeslot=0x1D719, visual="it", }, @@ -174179,7 +189793,7 @@ characters.data={ linebreak="al", mathclass="variable", mathname="varrho", - specials={ "font", 0x03F1 }, + specials={ "font", 0x3F1 }, unicodeslot=0x1D71A, visual="it", }, @@ -174188,7 +189802,7 @@ characters.data={ description="MATHEMATICAL ITALIC PI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D6 }, + specials={ "font", 0x3D6 }, unicodeslot=0x1D71B, visual="it", }, @@ -174197,7 +189811,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x0391 }, + specials={ "font", 0x391 }, unicodeslot=0x1D71C, visual="bi", }, @@ -174206,7 +189820,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL BETA", direction="l", linebreak="al", - specials={ "font", 0x0392 }, + specials={ "font", 0x392 }, unicodeslot=0x1D71D, visual="bi", }, @@ -174215,7 +189829,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x1D71E, visual="bi", }, @@ -174224,7 +189838,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL DELTA", direction="l", linebreak="al", - specials={ "font", 0x0394 }, + specials={ "font", 0x394 }, unicodeslot=0x1D71F, visual="bi", }, @@ -174233,7 +189847,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x0395 }, + specials={ "font", 0x395 }, unicodeslot=0x1D720, visual="bi", }, @@ -174242,7 +189856,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL ZETA", direction="l", linebreak="al", - specials={ "font", 0x0396 }, + specials={ "font", 0x396 }, unicodeslot=0x1D721, visual="bi", }, @@ -174251,7 +189865,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL ETA", direction="l", linebreak="al", - specials={ "font", 0x0397 }, + specials={ "font", 0x397 }, unicodeslot=0x1D722, visual="bi", }, @@ -174260,7 +189874,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL THETA", direction="l", linebreak="al", - specials={ "font", 0x0398 }, + specials={ "font", 0x398 }, unicodeslot=0x1D723, visual="bi", }, @@ -174269,7 +189883,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL IOTA", direction="l", linebreak="al", - specials={ "font", 0x0399 }, + specials={ "font", 0x399 }, unicodeslot=0x1D724, visual="bi", }, @@ -174278,7 +189892,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x039A }, + specials={ "font", 0x39A }, unicodeslot=0x1D725, visual="bi", }, @@ -174287,7 +189901,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x039B }, + specials={ "font", 0x39B }, unicodeslot=0x1D726, visual="bi", }, @@ -174296,7 +189910,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL MU", direction="l", linebreak="al", - specials={ "font", 0x039C }, + specials={ "font", 0x39C }, unicodeslot=0x1D727, visual="bi", }, @@ -174305,7 +189919,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL NU", direction="l", linebreak="al", - specials={ "font", 0x039D }, + specials={ "font", 0x39D }, unicodeslot=0x1D728, visual="bi", }, @@ -174314,7 +189928,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL XI", direction="l", linebreak="al", - specials={ "font", 0x039E }, + specials={ "font", 0x39E }, unicodeslot=0x1D729, visual="bi", }, @@ -174323,7 +189937,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x039F }, + specials={ "font", 0x39F }, unicodeslot=0x1D72A, visual="bi", }, @@ -174332,7 +189946,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x1D72B, visual="bi", }, @@ -174341,7 +189955,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL RHO", direction="l", linebreak="al", - specials={ "font", 0x03A1 }, + specials={ "font", 0x3A1 }, unicodeslot=0x1D72C, visual="bi", }, @@ -174350,7 +189964,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F4 }, + specials={ "font", 0x3F4 }, unicodeslot=0x1D72D, visual="bi", }, @@ -174359,7 +189973,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03A3 }, + specials={ "font", 0x3A3 }, unicodeslot=0x1D72E, visual="bi", }, @@ -174368,7 +189982,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL TAU", direction="l", linebreak="al", - specials={ "font", 0x03A4 }, + specials={ "font", 0x3A4 }, unicodeslot=0x1D72F, visual="bi", }, @@ -174377,7 +189991,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03A5 }, + specials={ "font", 0x3A5 }, unicodeslot=0x1D730, visual="bi", }, @@ -174386,7 +190000,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL PHI", direction="l", linebreak="al", - specials={ "font", 0x03A6 }, + specials={ "font", 0x3A6 }, unicodeslot=0x1D731, visual="bi", }, @@ -174395,7 +190009,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL CHI", direction="l", linebreak="al", - specials={ "font", 0x03A7 }, + specials={ "font", 0x3A7 }, unicodeslot=0x1D732, visual="bi", }, @@ -174404,7 +190018,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL PSI", direction="l", linebreak="al", - specials={ "font", 0x03A8 }, + specials={ "font", 0x3A8 }, unicodeslot=0x1D733, visual="bi", }, @@ -174413,7 +190027,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC CAPITAL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03A9 }, + specials={ "font", 0x3A9 }, unicodeslot=0x1D734, visual="bi", }, @@ -174431,7 +190045,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x03B1 }, + specials={ "font", 0x3B1 }, unicodeslot=0x1D736, visual="bi", }, @@ -174440,7 +190054,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL BETA", direction="l", linebreak="al", - specials={ "font", 0x03B2 }, + specials={ "font", 0x3B2 }, unicodeslot=0x1D737, visual="bi", }, @@ -174449,7 +190063,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x1D738, visual="bi", }, @@ -174458,7 +190072,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL DELTA", direction="l", linebreak="al", - specials={ "font", 0x03B4 }, + specials={ "font", 0x3B4 }, unicodeslot=0x1D739, visual="bi", }, @@ -174467,7 +190081,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x03B5 }, + specials={ "font", 0x3B5 }, unicodeslot=0x1D73A, visual="bi", }, @@ -174476,7 +190090,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL ZETA", direction="l", linebreak="al", - specials={ "font", 0x03B6 }, + specials={ "font", 0x3B6 }, unicodeslot=0x1D73B, visual="bi", }, @@ -174485,7 +190099,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL ETA", direction="l", linebreak="al", - specials={ "font", 0x03B7 }, + specials={ "font", 0x3B7 }, unicodeslot=0x1D73C, visual="bi", }, @@ -174494,7 +190108,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL THETA", direction="l", linebreak="al", - specials={ "font", 0x03B8 }, + specials={ "font", 0x3B8 }, unicodeslot=0x1D73D, visual="bi", }, @@ -174503,7 +190117,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL IOTA", direction="l", linebreak="al", - specials={ "font", 0x03B9 }, + specials={ "font", 0x3B9 }, unicodeslot=0x1D73E, visual="bi", }, @@ -174512,7 +190126,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x03BA }, + specials={ "font", 0x3BA }, unicodeslot=0x1D73F, visual="bi", }, @@ -174521,7 +190135,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x03BB }, + specials={ "font", 0x3BB }, unicodeslot=0x1D740, visual="bi", }, @@ -174530,7 +190144,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL MU", direction="l", linebreak="al", - specials={ "font", 0x03BC }, + specials={ "font", 0x3BC }, unicodeslot=0x1D741, visual="bi", }, @@ -174539,7 +190153,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL NU", direction="l", linebreak="al", - specials={ "font", 0x03BD }, + specials={ "font", 0x3BD }, unicodeslot=0x1D742, visual="bi", }, @@ -174548,7 +190162,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL XI", direction="l", linebreak="al", - specials={ "font", 0x03BE }, + specials={ "font", 0x3BE }, unicodeslot=0x1D743, visual="bi", }, @@ -174557,7 +190171,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x03BF }, + specials={ "font", 0x3BF }, unicodeslot=0x1D744, visual="bi", }, @@ -174566,7 +190180,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x1D745, visual="bi", }, @@ -174575,7 +190189,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL RHO", direction="l", linebreak="al", - specials={ "font", 0x03C1 }, + specials={ "font", 0x3C1 }, unicodeslot=0x1D746, visual="bi", }, @@ -174584,7 +190198,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C2 }, + specials={ "font", 0x3C2 }, unicodeslot=0x1D747, visual="bi", }, @@ -174593,7 +190207,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C3 }, + specials={ "font", 0x3C3 }, unicodeslot=0x1D748, visual="bi", }, @@ -174602,7 +190216,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL TAU", direction="l", linebreak="al", - specials={ "font", 0x03C4 }, + specials={ "font", 0x3C4 }, unicodeslot=0x1D749, visual="bi", }, @@ -174611,7 +190225,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03C5 }, + specials={ "font", 0x3C5 }, unicodeslot=0x1D74A, visual="bi", }, @@ -174620,7 +190234,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL PHI", direction="l", linebreak="al", - specials={ "font", 0x03C6 }, + specials={ "font", 0x3C6 }, unicodeslot=0x1D74B, visual="bi", }, @@ -174629,7 +190243,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL CHI", direction="l", linebreak="al", - specials={ "font", 0x03C7 }, + specials={ "font", 0x3C7 }, unicodeslot=0x1D74C, visual="bi", }, @@ -174638,7 +190252,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL PSI", direction="l", linebreak="al", - specials={ "font", 0x03C8 }, + specials={ "font", 0x3C8 }, unicodeslot=0x1D74D, visual="bi", }, @@ -174647,7 +190261,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC SMALL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03C9 }, + specials={ "font", 0x3C9 }, unicodeslot=0x1D74E, visual="bi", }, @@ -174665,7 +190279,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC EPSILON SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F5 }, + specials={ "font", 0x3F5 }, unicodeslot=0x1D750, visual="bi", }, @@ -174674,7 +190288,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D1 }, + specials={ "font", 0x3D1 }, unicodeslot=0x1D751, visual="bi", }, @@ -174683,7 +190297,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC KAPPA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F0 }, + specials={ "font", 0x3F0 }, unicodeslot=0x1D752, visual="bi", }, @@ -174692,7 +190306,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC PHI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D5 }, + specials={ "font", 0x3D5 }, unicodeslot=0x1D753, visual="bi", }, @@ -174701,7 +190315,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC RHO SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F1 }, + specials={ "font", 0x3F1 }, unicodeslot=0x1D754, visual="bi", }, @@ -174710,7 +190324,7 @@ characters.data={ description="MATHEMATICAL BOLD ITALIC PI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D6 }, + specials={ "font", 0x3D6 }, unicodeslot=0x1D755, visual="bi", }, @@ -174719,7 +190333,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x0391 }, + specials={ "font", 0x391 }, unicodeslot=0x1D756, visual="bf", }, @@ -174728,7 +190342,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA", direction="l", linebreak="al", - specials={ "font", 0x0392 }, + specials={ "font", 0x392 }, unicodeslot=0x1D757, visual="bf", }, @@ -174737,7 +190351,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x1D758, visual="bf", }, @@ -174746,7 +190360,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA", direction="l", linebreak="al", - specials={ "font", 0x0394 }, + specials={ "font", 0x394 }, unicodeslot=0x1D759, visual="bf", }, @@ -174755,7 +190369,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x0395 }, + specials={ "font", 0x395 }, unicodeslot=0x1D75A, visual="bf", }, @@ -174764,7 +190378,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA", direction="l", linebreak="al", - specials={ "font", 0x0396 }, + specials={ "font", 0x396 }, unicodeslot=0x1D75B, visual="bf", }, @@ -174773,7 +190387,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA", direction="l", linebreak="al", - specials={ "font", 0x0397 }, + specials={ "font", 0x397 }, unicodeslot=0x1D75C, visual="bf", }, @@ -174782,7 +190396,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA", direction="l", linebreak="al", - specials={ "font", 0x0398 }, + specials={ "font", 0x398 }, unicodeslot=0x1D75D, visual="bf", }, @@ -174791,7 +190405,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA", direction="l", linebreak="al", - specials={ "font", 0x0399 }, + specials={ "font", 0x399 }, unicodeslot=0x1D75E, visual="bf", }, @@ -174800,7 +190414,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x039A }, + specials={ "font", 0x39A }, unicodeslot=0x1D75F, visual="bf", }, @@ -174809,7 +190423,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x039B }, + specials={ "font", 0x39B }, unicodeslot=0x1D760, visual="bf", }, @@ -174818,7 +190432,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL MU", direction="l", linebreak="al", - specials={ "font", 0x039C }, + specials={ "font", 0x39C }, unicodeslot=0x1D761, visual="bf", }, @@ -174827,7 +190441,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL NU", direction="l", linebreak="al", - specials={ "font", 0x039D }, + specials={ "font", 0x39D }, unicodeslot=0x1D762, visual="bf", }, @@ -174836,7 +190450,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL XI", direction="l", linebreak="al", - specials={ "font", 0x039E }, + specials={ "font", 0x39E }, unicodeslot=0x1D763, visual="bf", }, @@ -174845,7 +190459,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x039F }, + specials={ "font", 0x39F }, unicodeslot=0x1D764, visual="bf", }, @@ -174854,7 +190468,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x1D765, visual="bf", }, @@ -174863,7 +190477,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO", direction="l", linebreak="al", - specials={ "font", 0x03A1 }, + specials={ "font", 0x3A1 }, unicodeslot=0x1D766, visual="bf", }, @@ -174872,7 +190486,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F4 }, + specials={ "font", 0x3F4 }, unicodeslot=0x1D767, visual="bf", }, @@ -174881,7 +190495,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03A3 }, + specials={ "font", 0x3A3 }, unicodeslot=0x1D768, visual="bf", }, @@ -174890,7 +190504,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU", direction="l", linebreak="al", - specials={ "font", 0x03A4 }, + specials={ "font", 0x3A4 }, unicodeslot=0x1D769, visual="bf", }, @@ -174899,7 +190513,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03A5 }, + specials={ "font", 0x3A5 }, unicodeslot=0x1D76A, visual="bf", }, @@ -174908,7 +190522,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI", direction="l", linebreak="al", - specials={ "font", 0x03A6 }, + specials={ "font", 0x3A6 }, unicodeslot=0x1D76B, visual="bf", }, @@ -174917,7 +190531,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI", direction="l", linebreak="al", - specials={ "font", 0x03A7 }, + specials={ "font", 0x3A7 }, unicodeslot=0x1D76C, visual="bf", }, @@ -174926,7 +190540,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI", direction="l", linebreak="al", - specials={ "font", 0x03A8 }, + specials={ "font", 0x3A8 }, unicodeslot=0x1D76D, visual="bf", }, @@ -174935,7 +190549,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03A9 }, + specials={ "font", 0x3A9 }, unicodeslot=0x1D76E, visual="bf", }, @@ -174953,7 +190567,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x03B1 }, + specials={ "font", 0x3B1 }, unicodeslot=0x1D770, visual="bf", }, @@ -174962,7 +190576,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL BETA", direction="l", linebreak="al", - specials={ "font", 0x03B2 }, + specials={ "font", 0x3B2 }, unicodeslot=0x1D771, visual="bf", }, @@ -174971,7 +190585,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x1D772, visual="bf", }, @@ -174980,7 +190594,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL DELTA", direction="l", linebreak="al", - specials={ "font", 0x03B4 }, + specials={ "font", 0x3B4 }, unicodeslot=0x1D773, visual="bf", }, @@ -174989,7 +190603,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x03B5 }, + specials={ "font", 0x3B5 }, unicodeslot=0x1D774, visual="bf", }, @@ -174998,7 +190612,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL ZETA", direction="l", linebreak="al", - specials={ "font", 0x03B6 }, + specials={ "font", 0x3B6 }, unicodeslot=0x1D775, visual="bf", }, @@ -175007,7 +190621,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL ETA", direction="l", linebreak="al", - specials={ "font", 0x03B7 }, + specials={ "font", 0x3B7 }, unicodeslot=0x1D776, visual="bf", }, @@ -175016,7 +190630,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL THETA", direction="l", linebreak="al", - specials={ "font", 0x03B8 }, + specials={ "font", 0x3B8 }, unicodeslot=0x1D777, visual="bf", }, @@ -175025,7 +190639,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL IOTA", direction="l", linebreak="al", - specials={ "font", 0x03B9 }, + specials={ "font", 0x3B9 }, unicodeslot=0x1D778, visual="bf", }, @@ -175034,7 +190648,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x03BA }, + specials={ "font", 0x3BA }, unicodeslot=0x1D779, visual="bf", }, @@ -175043,7 +190657,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x03BB }, + specials={ "font", 0x3BB }, unicodeslot=0x1D77A, visual="bf", }, @@ -175052,7 +190666,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL MU", direction="l", linebreak="al", - specials={ "font", 0x03BC }, + specials={ "font", 0x3BC }, unicodeslot=0x1D77B, visual="bf", }, @@ -175061,7 +190675,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL NU", direction="l", linebreak="al", - specials={ "font", 0x03BD }, + specials={ "font", 0x3BD }, unicodeslot=0x1D77C, visual="bf", }, @@ -175070,7 +190684,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL XI", direction="l", linebreak="al", - specials={ "font", 0x03BE }, + specials={ "font", 0x3BE }, unicodeslot=0x1D77D, visual="bf", }, @@ -175079,7 +190693,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x03BF }, + specials={ "font", 0x3BF }, unicodeslot=0x1D77E, visual="bf", }, @@ -175088,7 +190702,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x1D77F, visual="bf", }, @@ -175097,7 +190711,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL RHO", direction="l", linebreak="al", - specials={ "font", 0x03C1 }, + specials={ "font", 0x3C1 }, unicodeslot=0x1D780, visual="bf", }, @@ -175106,7 +190720,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C2 }, + specials={ "font", 0x3C2 }, unicodeslot=0x1D781, visual="bf", }, @@ -175115,7 +190729,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C3 }, + specials={ "font", 0x3C3 }, unicodeslot=0x1D782, visual="bf", }, @@ -175124,7 +190738,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL TAU", direction="l", linebreak="al", - specials={ "font", 0x03C4 }, + specials={ "font", 0x3C4 }, unicodeslot=0x1D783, visual="bf", }, @@ -175133,7 +190747,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03C5 }, + specials={ "font", 0x3C5 }, unicodeslot=0x1D784, visual="bf", }, @@ -175142,7 +190756,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL PHI", direction="l", linebreak="al", - specials={ "font", 0x03C6 }, + specials={ "font", 0x3C6 }, unicodeslot=0x1D785, visual="bf", }, @@ -175151,7 +190765,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL CHI", direction="l", linebreak="al", - specials={ "font", 0x03C7 }, + specials={ "font", 0x3C7 }, unicodeslot=0x1D786, visual="bf", }, @@ -175160,7 +190774,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL PSI", direction="l", linebreak="al", - specials={ "font", 0x03C8 }, + specials={ "font", 0x3C8 }, unicodeslot=0x1D787, visual="bf", }, @@ -175169,7 +190783,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03C9 }, + specials={ "font", 0x3C9 }, unicodeslot=0x1D788, visual="bf", }, @@ -175187,7 +190801,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F5 }, + specials={ "font", 0x3F5 }, unicodeslot=0x1D78A, visual="bf", }, @@ -175196,7 +190810,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D1 }, + specials={ "font", 0x3D1 }, unicodeslot=0x1D78B, visual="bf", }, @@ -175205,7 +190819,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F0 }, + specials={ "font", 0x3F0 }, unicodeslot=0x1D78C, visual="bf", }, @@ -175214,7 +190828,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D5 }, + specials={ "font", 0x3D5 }, unicodeslot=0x1D78D, visual="bf", }, @@ -175223,7 +190837,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F1 }, + specials={ "font", 0x3F1 }, unicodeslot=0x1D78E, visual="bf", }, @@ -175232,7 +190846,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD PI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D6 }, + specials={ "font", 0x3D6 }, unicodeslot=0x1D78F, visual="bf", }, @@ -175241,7 +190855,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x0391 }, + specials={ "font", 0x391 }, unicodeslot=0x1D790, visual="bi", }, @@ -175250,7 +190864,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA", direction="l", linebreak="al", - specials={ "font", 0x0392 }, + specials={ "font", 0x392 }, unicodeslot=0x1D791, visual="bi", }, @@ -175259,7 +190873,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x0393 }, + specials={ "font", 0x393 }, unicodeslot=0x1D792, visual="bi", }, @@ -175268,7 +190882,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA", direction="l", linebreak="al", - specials={ "font", 0x0394 }, + specials={ "font", 0x394 }, unicodeslot=0x1D793, visual="bi", }, @@ -175277,7 +190891,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x0395 }, + specials={ "font", 0x395 }, unicodeslot=0x1D794, visual="bi", }, @@ -175286,7 +190900,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA", direction="l", linebreak="al", - specials={ "font", 0x0396 }, + specials={ "font", 0x396 }, unicodeslot=0x1D795, visual="bi", }, @@ -175295,7 +190909,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA", direction="l", linebreak="al", - specials={ "font", 0x0397 }, + specials={ "font", 0x397 }, unicodeslot=0x1D796, visual="bi", }, @@ -175304,7 +190918,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA", direction="l", linebreak="al", - specials={ "font", 0x0398 }, + specials={ "font", 0x398 }, unicodeslot=0x1D797, visual="bi", }, @@ -175313,7 +190927,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA", direction="l", linebreak="al", - specials={ "font", 0x0399 }, + specials={ "font", 0x399 }, unicodeslot=0x1D798, visual="bi", }, @@ -175322,7 +190936,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x039A }, + specials={ "font", 0x39A }, unicodeslot=0x1D799, visual="bi", }, @@ -175331,7 +190945,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x039B }, + specials={ "font", 0x39B }, unicodeslot=0x1D79A, visual="bi", }, @@ -175340,7 +190954,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU", direction="l", linebreak="al", - specials={ "font", 0x039C }, + specials={ "font", 0x39C }, unicodeslot=0x1D79B, visual="bi", }, @@ -175349,7 +190963,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU", direction="l", linebreak="al", - specials={ "font", 0x039D }, + specials={ "font", 0x39D }, unicodeslot=0x1D79C, visual="bi", }, @@ -175358,7 +190972,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI", direction="l", linebreak="al", - specials={ "font", 0x039E }, + specials={ "font", 0x39E }, unicodeslot=0x1D79D, visual="bi", }, @@ -175367,7 +190981,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x039F }, + specials={ "font", 0x39F }, unicodeslot=0x1D79E, visual="bi", }, @@ -175376,7 +190990,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI", direction="l", linebreak="al", - specials={ "font", 0x03A0 }, + specials={ "font", 0x3A0 }, unicodeslot=0x1D79F, visual="bi", }, @@ -175385,7 +190999,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO", direction="l", linebreak="al", - specials={ "font", 0x03A1 }, + specials={ "font", 0x3A1 }, unicodeslot=0x1D7A0, visual="bi", }, @@ -175394,7 +191008,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F4 }, + specials={ "font", 0x3F4 }, unicodeslot=0x1D7A1, visual="bi", }, @@ -175403,7 +191017,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03A3 }, + specials={ "font", 0x3A3 }, unicodeslot=0x1D7A2, visual="bi", }, @@ -175412,7 +191026,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU", direction="l", linebreak="al", - specials={ "font", 0x03A4 }, + specials={ "font", 0x3A4 }, unicodeslot=0x1D7A3, visual="bi", }, @@ -175421,7 +191035,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03A5 }, + specials={ "font", 0x3A5 }, unicodeslot=0x1D7A4, visual="bi", }, @@ -175430,7 +191044,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI", direction="l", linebreak="al", - specials={ "font", 0x03A6 }, + specials={ "font", 0x3A6 }, unicodeslot=0x1D7A5, visual="bi", }, @@ -175439,7 +191053,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI", direction="l", linebreak="al", - specials={ "font", 0x03A7 }, + specials={ "font", 0x3A7 }, unicodeslot=0x1D7A6, visual="bi", }, @@ -175448,7 +191062,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI", direction="l", linebreak="al", - specials={ "font", 0x03A8 }, + specials={ "font", 0x3A8 }, unicodeslot=0x1D7A7, visual="bi", }, @@ -175457,7 +191071,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03A9 }, + specials={ "font", 0x3A9 }, unicodeslot=0x1D7A8, visual="bi", }, @@ -175475,7 +191089,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA", direction="l", linebreak="al", - specials={ "font", 0x03B1 }, + specials={ "font", 0x3B1 }, unicodeslot=0x1D7AA, visual="bi", }, @@ -175484,7 +191098,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA", direction="l", linebreak="al", - specials={ "font", 0x03B2 }, + specials={ "font", 0x3B2 }, unicodeslot=0x1D7AB, visual="bi", }, @@ -175493,7 +191107,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA", direction="l", linebreak="al", - specials={ "font", 0x03B3 }, + specials={ "font", 0x3B3 }, unicodeslot=0x1D7AC, visual="bi", }, @@ -175502,7 +191116,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA", direction="l", linebreak="al", - specials={ "font", 0x03B4 }, + specials={ "font", 0x3B4 }, unicodeslot=0x1D7AD, visual="bi", }, @@ -175511,7 +191125,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON", direction="l", linebreak="al", - specials={ "font", 0x03B5 }, + specials={ "font", 0x3B5 }, unicodeslot=0x1D7AE, visual="bi", }, @@ -175520,7 +191134,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA", direction="l", linebreak="al", - specials={ "font", 0x03B6 }, + specials={ "font", 0x3B6 }, unicodeslot=0x1D7AF, visual="bi", }, @@ -175529,7 +191143,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA", direction="l", linebreak="al", - specials={ "font", 0x03B7 }, + specials={ "font", 0x3B7 }, unicodeslot=0x1D7B0, visual="bi", }, @@ -175538,7 +191152,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA", direction="l", linebreak="al", - specials={ "font", 0x03B8 }, + specials={ "font", 0x3B8 }, unicodeslot=0x1D7B1, visual="bi", }, @@ -175547,7 +191161,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA", direction="l", linebreak="al", - specials={ "font", 0x03B9 }, + specials={ "font", 0x3B9 }, unicodeslot=0x1D7B2, visual="bi", }, @@ -175556,7 +191170,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA", direction="l", linebreak="al", - specials={ "font", 0x03BA }, + specials={ "font", 0x3BA }, unicodeslot=0x1D7B3, visual="bi", }, @@ -175565,7 +191179,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA", direction="l", linebreak="al", - specials={ "font", 0x03BB }, + specials={ "font", 0x3BB }, unicodeslot=0x1D7B4, visual="bi", }, @@ -175574,7 +191188,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU", direction="l", linebreak="al", - specials={ "font", 0x03BC }, + specials={ "font", 0x3BC }, unicodeslot=0x1D7B5, visual="bi", }, @@ -175583,7 +191197,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU", direction="l", linebreak="al", - specials={ "font", 0x03BD }, + specials={ "font", 0x3BD }, unicodeslot=0x1D7B6, visual="bi", }, @@ -175592,7 +191206,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI", direction="l", linebreak="al", - specials={ "font", 0x03BE }, + specials={ "font", 0x3BE }, unicodeslot=0x1D7B7, visual="bi", }, @@ -175601,7 +191215,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON", direction="l", linebreak="al", - specials={ "font", 0x03BF }, + specials={ "font", 0x3BF }, unicodeslot=0x1D7B8, visual="bi", }, @@ -175610,7 +191224,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI", direction="l", linebreak="al", - specials={ "font", 0x03C0 }, + specials={ "font", 0x3C0 }, unicodeslot=0x1D7B9, visual="bi", }, @@ -175619,7 +191233,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO", direction="l", linebreak="al", - specials={ "font", 0x03C1 }, + specials={ "font", 0x3C1 }, unicodeslot=0x1D7BA, visual="bi", }, @@ -175628,7 +191242,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C2 }, + specials={ "font", 0x3C2 }, unicodeslot=0x1D7BB, visual="bi", }, @@ -175637,7 +191251,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA", direction="l", linebreak="al", - specials={ "font", 0x03C3 }, + specials={ "font", 0x3C3 }, unicodeslot=0x1D7BC, visual="bi", }, @@ -175646,7 +191260,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU", direction="l", linebreak="al", - specials={ "font", 0x03C4 }, + specials={ "font", 0x3C4 }, unicodeslot=0x1D7BD, visual="bi", }, @@ -175655,7 +191269,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON", direction="l", linebreak="al", - specials={ "font", 0x03C5 }, + specials={ "font", 0x3C5 }, unicodeslot=0x1D7BE, visual="bi", }, @@ -175664,7 +191278,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI", direction="l", linebreak="al", - specials={ "font", 0x03C6 }, + specials={ "font", 0x3C6 }, unicodeslot=0x1D7BF, visual="bi", }, @@ -175673,7 +191287,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI", direction="l", linebreak="al", - specials={ "font", 0x03C7 }, + specials={ "font", 0x3C7 }, unicodeslot=0x1D7C0, visual="bi", }, @@ -175682,7 +191296,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI", direction="l", linebreak="al", - specials={ "font", 0x03C8 }, + specials={ "font", 0x3C8 }, unicodeslot=0x1D7C1, visual="bi", }, @@ -175691,7 +191305,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA", direction="l", linebreak="al", - specials={ "font", 0x03C9 }, + specials={ "font", 0x3C9 }, unicodeslot=0x1D7C2, visual="bi", }, @@ -175709,7 +191323,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F5 }, + specials={ "font", 0x3F5 }, unicodeslot=0x1D7C4, visual="bi", }, @@ -175718,7 +191332,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D1 }, + specials={ "font", 0x3D1 }, unicodeslot=0x1D7C5, visual="bi", }, @@ -175727,7 +191341,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F0 }, + specials={ "font", 0x3F0 }, unicodeslot=0x1D7C6, visual="bi", }, @@ -175736,7 +191350,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D5 }, + specials={ "font", 0x3D5 }, unicodeslot=0x1D7C7, visual="bi", }, @@ -175745,7 +191359,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03F1 }, + specials={ "font", 0x3F1 }, unicodeslot=0x1D7C8, visual="bi", }, @@ -175754,7 +191368,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL", direction="l", linebreak="al", - specials={ "font", 0x03D6 }, + specials={ "font", 0x3D6 }, unicodeslot=0x1D7C9, visual="bi", }, @@ -175763,7 +191377,7 @@ characters.data={ description="MATHEMATICAL BOLD CAPITAL DIGAMMA", direction="l", linebreak="al", - specials={ "font", 0x03DC }, + specials={ "font", 0x3DC }, unicodeslot=0x1D7CA, visual="bf", }, @@ -175772,7 +191386,7 @@ characters.data={ description="MATHEMATICAL BOLD SMALL DIGAMMA", direction="l", linebreak="al", - specials={ "font", 0x03DD }, + specials={ "font", 0x3DD }, unicodeslot=0x1D7CB, visual="bf", }, @@ -175781,7 +191395,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT ZERO", direction="en", linebreak="nu", - specials={ "font", 0x0030 }, + specials={ "font", 0x30 }, unicodeslot=0x1D7CE, visual="bf", }, @@ -175790,7 +191404,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT ONE", direction="en", linebreak="nu", - specials={ "font", 0x0031 }, + specials={ "font", 0x31 }, unicodeslot=0x1D7CF, visual="bf", }, @@ -175799,7 +191413,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT TWO", direction="en", linebreak="nu", - specials={ "font", 0x0032 }, + specials={ "font", 0x32 }, unicodeslot=0x1D7D0, visual="bf", }, @@ -175808,7 +191422,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT THREE", direction="en", linebreak="nu", - specials={ "font", 0x0033 }, + specials={ "font", 0x33 }, unicodeslot=0x1D7D1, visual="bf", }, @@ -175817,7 +191431,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT FOUR", direction="en", linebreak="nu", - specials={ "font", 0x0034 }, + specials={ "font", 0x34 }, unicodeslot=0x1D7D2, visual="bf", }, @@ -175826,7 +191440,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT FIVE", direction="en", linebreak="nu", - specials={ "font", 0x0035 }, + specials={ "font", 0x35 }, unicodeslot=0x1D7D3, visual="bf", }, @@ -175835,7 +191449,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT SIX", direction="en", linebreak="nu", - specials={ "font", 0x0036 }, + specials={ "font", 0x36 }, unicodeslot=0x1D7D4, visual="bf", }, @@ -175844,7 +191458,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT SEVEN", direction="en", linebreak="nu", - specials={ "font", 0x0037 }, + specials={ "font", 0x37 }, unicodeslot=0x1D7D5, visual="bf", }, @@ -175853,7 +191467,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT EIGHT", direction="en", linebreak="nu", - specials={ "font", 0x0038 }, + specials={ "font", 0x38 }, unicodeslot=0x1D7D6, visual="bf", }, @@ -175862,7 +191476,7 @@ characters.data={ description="MATHEMATICAL BOLD DIGIT NINE", direction="en", linebreak="nu", - specials={ "font", 0x0039 }, + specials={ "font", 0x39 }, unicodeslot=0x1D7D7, visual="bf", }, @@ -175871,7 +191485,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO", direction="en", linebreak="nu", - specials={ "font", 0x0030 }, + specials={ "font", 0x30 }, unicodeslot=0x1D7D8, }, [0x1D7D9]={ @@ -175879,7 +191493,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT ONE", direction="en", linebreak="nu", - specials={ "font", 0x0031 }, + specials={ "font", 0x31 }, unicodeslot=0x1D7D9, }, [0x1D7DA]={ @@ -175887,7 +191501,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT TWO", direction="en", linebreak="nu", - specials={ "font", 0x0032 }, + specials={ "font", 0x32 }, unicodeslot=0x1D7DA, }, [0x1D7DB]={ @@ -175895,7 +191509,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT THREE", direction="en", linebreak="nu", - specials={ "font", 0x0033 }, + specials={ "font", 0x33 }, unicodeslot=0x1D7DB, }, [0x1D7DC]={ @@ -175903,7 +191517,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR", direction="en", linebreak="nu", - specials={ "font", 0x0034 }, + specials={ "font", 0x34 }, unicodeslot=0x1D7DC, }, [0x1D7DD]={ @@ -175911,7 +191525,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE", direction="en", linebreak="nu", - specials={ "font", 0x0035 }, + specials={ "font", 0x35 }, unicodeslot=0x1D7DD, }, [0x1D7DE]={ @@ -175919,7 +191533,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT SIX", direction="en", linebreak="nu", - specials={ "font", 0x0036 }, + specials={ "font", 0x36 }, unicodeslot=0x1D7DE, }, [0x1D7DF]={ @@ -175927,7 +191541,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN", direction="en", linebreak="nu", - specials={ "font", 0x0037 }, + specials={ "font", 0x37 }, unicodeslot=0x1D7DF, }, [0x1D7E0]={ @@ -175935,7 +191549,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT", direction="en", linebreak="nu", - specials={ "font", 0x0038 }, + specials={ "font", 0x38 }, unicodeslot=0x1D7E0, }, [0x1D7E1]={ @@ -175943,7 +191557,7 @@ characters.data={ description="MATHEMATICAL DOUBLE-STRUCK DIGIT NINE", direction="en", linebreak="nu", - specials={ "font", 0x0039 }, + specials={ "font", 0x39 }, unicodeslot=0x1D7E1, }, [0x1D7E2]={ @@ -175951,7 +191565,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT ZERO", direction="en", linebreak="nu", - specials={ "font", 0x0030 }, + specials={ "font", 0x30 }, unicodeslot=0x1D7E2, }, [0x1D7E3]={ @@ -175959,7 +191573,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT ONE", direction="en", linebreak="nu", - specials={ "font", 0x0031 }, + specials={ "font", 0x31 }, unicodeslot=0x1D7E3, }, [0x1D7E4]={ @@ -175967,7 +191581,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT TWO", direction="en", linebreak="nu", - specials={ "font", 0x0032 }, + specials={ "font", 0x32 }, unicodeslot=0x1D7E4, }, [0x1D7E5]={ @@ -175975,7 +191589,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT THREE", direction="en", linebreak="nu", - specials={ "font", 0x0033 }, + specials={ "font", 0x33 }, unicodeslot=0x1D7E5, }, [0x1D7E6]={ @@ -175983,7 +191597,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT FOUR", direction="en", linebreak="nu", - specials={ "font", 0x0034 }, + specials={ "font", 0x34 }, unicodeslot=0x1D7E6, }, [0x1D7E7]={ @@ -175991,7 +191605,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT FIVE", direction="en", linebreak="nu", - specials={ "font", 0x0035 }, + specials={ "font", 0x35 }, unicodeslot=0x1D7E7, }, [0x1D7E8]={ @@ -175999,7 +191613,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT SIX", direction="en", linebreak="nu", - specials={ "font", 0x0036 }, + specials={ "font", 0x36 }, unicodeslot=0x1D7E8, }, [0x1D7E9]={ @@ -176007,7 +191621,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT SEVEN", direction="en", linebreak="nu", - specials={ "font", 0x0037 }, + specials={ "font", 0x37 }, unicodeslot=0x1D7E9, }, [0x1D7EA]={ @@ -176015,7 +191629,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT EIGHT", direction="en", linebreak="nu", - specials={ "font", 0x0038 }, + specials={ "font", 0x38 }, unicodeslot=0x1D7EA, }, [0x1D7EB]={ @@ -176023,7 +191637,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF DIGIT NINE", direction="en", linebreak="nu", - specials={ "font", 0x0039 }, + specials={ "font", 0x39 }, unicodeslot=0x1D7EB, }, [0x1D7EC]={ @@ -176031,7 +191645,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO", direction="en", linebreak="nu", - specials={ "font", 0x0030 }, + specials={ "font", 0x30 }, unicodeslot=0x1D7EC, visual="bf", }, @@ -176040,7 +191654,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT ONE", direction="en", linebreak="nu", - specials={ "font", 0x0031 }, + specials={ "font", 0x31 }, unicodeslot=0x1D7ED, visual="bf", }, @@ -176049,7 +191663,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT TWO", direction="en", linebreak="nu", - specials={ "font", 0x0032 }, + specials={ "font", 0x32 }, unicodeslot=0x1D7EE, visual="bf", }, @@ -176058,7 +191672,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT THREE", direction="en", linebreak="nu", - specials={ "font", 0x0033 }, + specials={ "font", 0x33 }, unicodeslot=0x1D7EF, visual="bf", }, @@ -176067,7 +191681,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR", direction="en", linebreak="nu", - specials={ "font", 0x0034 }, + specials={ "font", 0x34 }, unicodeslot=0x1D7F0, visual="bf", }, @@ -176076,7 +191690,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE", direction="en", linebreak="nu", - specials={ "font", 0x0035 }, + specials={ "font", 0x35 }, unicodeslot=0x1D7F1, visual="bf", }, @@ -176085,7 +191699,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT SIX", direction="en", linebreak="nu", - specials={ "font", 0x0036 }, + specials={ "font", 0x36 }, unicodeslot=0x1D7F2, visual="bf", }, @@ -176094,7 +191708,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN", direction="en", linebreak="nu", - specials={ "font", 0x0037 }, + specials={ "font", 0x37 }, unicodeslot=0x1D7F3, visual="bf", }, @@ -176103,7 +191717,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT", direction="en", linebreak="nu", - specials={ "font", 0x0038 }, + specials={ "font", 0x38 }, unicodeslot=0x1D7F4, visual="bf", }, @@ -176112,7 +191726,7 @@ characters.data={ description="MATHEMATICAL SANS-SERIF BOLD DIGIT NINE", direction="en", linebreak="nu", - specials={ "font", 0x0039 }, + specials={ "font", 0x39 }, unicodeslot=0x1D7F5, visual="bf", }, @@ -176121,7 +191735,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT ZERO", direction="en", linebreak="nu", - specials={ "font", 0x0030 }, + specials={ "font", 0x30 }, unicodeslot=0x1D7F6, }, [0x1D7F7]={ @@ -176129,7 +191743,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT ONE", direction="en", linebreak="nu", - specials={ "font", 0x0031 }, + specials={ "font", 0x31 }, unicodeslot=0x1D7F7, }, [0x1D7F8]={ @@ -176137,7 +191751,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT TWO", direction="en", linebreak="nu", - specials={ "font", 0x0032 }, + specials={ "font", 0x32 }, unicodeslot=0x1D7F8, }, [0x1D7F9]={ @@ -176145,7 +191759,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT THREE", direction="en", linebreak="nu", - specials={ "font", 0x0033 }, + specials={ "font", 0x33 }, unicodeslot=0x1D7F9, }, [0x1D7FA]={ @@ -176153,7 +191767,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT FOUR", direction="en", linebreak="nu", - specials={ "font", 0x0034 }, + specials={ "font", 0x34 }, unicodeslot=0x1D7FA, }, [0x1D7FB]={ @@ -176161,7 +191775,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT FIVE", direction="en", linebreak="nu", - specials={ "font", 0x0035 }, + specials={ "font", 0x35 }, unicodeslot=0x1D7FB, }, [0x1D7FC]={ @@ -176169,7 +191783,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT SIX", direction="en", linebreak="nu", - specials={ "font", 0x0036 }, + specials={ "font", 0x36 }, unicodeslot=0x1D7FC, }, [0x1D7FD]={ @@ -176177,7 +191791,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT SEVEN", direction="en", linebreak="nu", - specials={ "font", 0x0037 }, + specials={ "font", 0x37 }, unicodeslot=0x1D7FD, }, [0x1D7FE]={ @@ -176185,7 +191799,7 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT EIGHT", direction="en", linebreak="nu", - specials={ "font", 0x0038 }, + specials={ "font", 0x38 }, unicodeslot=0x1D7FE, }, [0x1D7FF]={ @@ -176193,16 +191807,1514 @@ characters.data={ description="MATHEMATICAL MONOSPACE DIGIT NINE", direction="en", linebreak="nu", - specials={ "font", 0x0039 }, + specials={ "font", 0x39 }, unicodeslot=0x1D7FF, }, + [0x1E800]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M001 KI", + direction="r", + linebreak="al", + unicodeslot=0x1E800, + }, + [0x1E801]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M002 KA", + direction="r", + linebreak="al", + unicodeslot=0x1E801, + }, + [0x1E802]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M003 KU", + direction="r", + linebreak="al", + unicodeslot=0x1E802, + }, + [0x1E803]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M065 KEE", + direction="r", + linebreak="al", + unicodeslot=0x1E803, + }, + [0x1E804]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M095 KE", + direction="r", + linebreak="al", + unicodeslot=0x1E804, + }, + [0x1E805]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M076 KOO", + direction="r", + linebreak="al", + unicodeslot=0x1E805, + }, + [0x1E806]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M048 KO", + direction="r", + linebreak="al", + unicodeslot=0x1E806, + }, + [0x1E807]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M179 KUA", + direction="r", + linebreak="al", + unicodeslot=0x1E807, + }, + [0x1E808]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M004 WI", + direction="r", + linebreak="al", + unicodeslot=0x1E808, + }, + [0x1E809]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M005 WA", + direction="r", + linebreak="al", + unicodeslot=0x1E809, + }, + [0x1E80A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M006 WU", + direction="r", + linebreak="al", + unicodeslot=0x1E80A, + }, + [0x1E80B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M126 WEE", + direction="r", + linebreak="al", + unicodeslot=0x1E80B, + }, + [0x1E80C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M118 WE", + direction="r", + linebreak="al", + unicodeslot=0x1E80C, + }, + [0x1E80D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M114 WOO", + direction="r", + linebreak="al", + unicodeslot=0x1E80D, + }, + [0x1E80E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M045 WO", + direction="r", + linebreak="al", + unicodeslot=0x1E80E, + }, + [0x1E80F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M194 WUI", + direction="r", + linebreak="al", + unicodeslot=0x1E80F, + }, + [0x1E810]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M143 WEI", + direction="r", + linebreak="al", + unicodeslot=0x1E810, + }, + [0x1E811]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M061 WVI", + direction="r", + linebreak="al", + unicodeslot=0x1E811, + }, + [0x1E812]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M049 WVA", + direction="r", + linebreak="al", + unicodeslot=0x1E812, + }, + [0x1E813]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M139 WVE", + direction="r", + linebreak="al", + unicodeslot=0x1E813, + }, + [0x1E814]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M007 MIN", + direction="r", + linebreak="al", + unicodeslot=0x1E814, + }, + [0x1E815]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M008 MAN", + direction="r", + linebreak="al", + unicodeslot=0x1E815, + }, + [0x1E816]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M009 MUN", + direction="r", + linebreak="al", + unicodeslot=0x1E816, + }, + [0x1E817]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M059 MEN", + direction="r", + linebreak="al", + unicodeslot=0x1E817, + }, + [0x1E818]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M094 MON", + direction="r", + linebreak="al", + unicodeslot=0x1E818, + }, + [0x1E819]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M154 MUAN", + direction="r", + linebreak="al", + unicodeslot=0x1E819, + }, + [0x1E81A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M189 MUEN", + direction="r", + linebreak="al", + unicodeslot=0x1E81A, + }, + [0x1E81B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M010 BI", + direction="r", + linebreak="al", + unicodeslot=0x1E81B, + }, + [0x1E81C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M011 BA", + direction="r", + linebreak="al", + unicodeslot=0x1E81C, + }, + [0x1E81D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M012 BU", + direction="r", + linebreak="al", + unicodeslot=0x1E81D, + }, + [0x1E81E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M150 BEE", + direction="r", + linebreak="al", + unicodeslot=0x1E81E, + }, + [0x1E81F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M097 BE", + direction="r", + linebreak="al", + unicodeslot=0x1E81F, + }, + [0x1E820]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M103 BOO", + direction="r", + linebreak="al", + unicodeslot=0x1E820, + }, + [0x1E821]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M138 BO", + direction="r", + linebreak="al", + unicodeslot=0x1E821, + }, + [0x1E822]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M013 I", + direction="r", + linebreak="al", + unicodeslot=0x1E822, + }, + [0x1E823]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M014 A", + direction="r", + linebreak="al", + unicodeslot=0x1E823, + }, + [0x1E824]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M015 U", + direction="r", + linebreak="al", + unicodeslot=0x1E824, + }, + [0x1E825]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M163 EE", + direction="r", + linebreak="al", + unicodeslot=0x1E825, + }, + [0x1E826]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M100 E", + direction="r", + linebreak="al", + unicodeslot=0x1E826, + }, + [0x1E827]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M165 OO", + direction="r", + linebreak="al", + unicodeslot=0x1E827, + }, + [0x1E828]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M147 O", + direction="r", + linebreak="al", + unicodeslot=0x1E828, + }, + [0x1E829]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M137 EI", + direction="r", + linebreak="al", + unicodeslot=0x1E829, + }, + [0x1E82A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M131 IN", + direction="r", + linebreak="al", + unicodeslot=0x1E82A, + }, + [0x1E82B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M135 IN", + direction="r", + linebreak="al", + unicodeslot=0x1E82B, + }, + [0x1E82C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M195 AN", + direction="r", + linebreak="al", + unicodeslot=0x1E82C, + }, + [0x1E82D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M178 EN", + direction="r", + linebreak="al", + unicodeslot=0x1E82D, + }, + [0x1E82E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M019 SI", + direction="r", + linebreak="al", + unicodeslot=0x1E82E, + }, + [0x1E82F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M020 SA", + direction="r", + linebreak="al", + unicodeslot=0x1E82F, + }, + [0x1E830]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M021 SU", + direction="r", + linebreak="al", + unicodeslot=0x1E830, + }, + [0x1E831]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M162 SEE", + direction="r", + linebreak="al", + unicodeslot=0x1E831, + }, + [0x1E832]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M116 SE", + direction="r", + linebreak="al", + unicodeslot=0x1E832, + }, + [0x1E833]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M136 SOO", + direction="r", + linebreak="al", + unicodeslot=0x1E833, + }, + [0x1E834]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M079 SO", + direction="r", + linebreak="al", + unicodeslot=0x1E834, + }, + [0x1E835]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M196 SIA", + direction="r", + linebreak="al", + unicodeslot=0x1E835, + }, + [0x1E836]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M025 LI", + direction="r", + linebreak="al", + unicodeslot=0x1E836, + }, + [0x1E837]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M026 LA", + direction="r", + linebreak="al", + unicodeslot=0x1E837, + }, + [0x1E838]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M027 LU", + direction="r", + linebreak="al", + unicodeslot=0x1E838, + }, + [0x1E839]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M084 LEE", + direction="r", + linebreak="al", + unicodeslot=0x1E839, + }, + [0x1E83A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M073 LE", + direction="r", + linebreak="al", + unicodeslot=0x1E83A, + }, + [0x1E83B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M054 LOO", + direction="r", + linebreak="al", + unicodeslot=0x1E83B, + }, + [0x1E83C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M153 LO", + direction="r", + linebreak="al", + unicodeslot=0x1E83C, + }, + [0x1E83D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M110 LONG LE", + direction="r", + linebreak="al", + unicodeslot=0x1E83D, + }, + [0x1E83E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M016 DI", + direction="r", + linebreak="al", + unicodeslot=0x1E83E, + }, + [0x1E83F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M017 DA", + direction="r", + linebreak="al", + unicodeslot=0x1E83F, + }, + [0x1E840]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M018 DU", + direction="r", + linebreak="al", + unicodeslot=0x1E840, + }, + [0x1E841]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M089 DEE", + direction="r", + linebreak="al", + unicodeslot=0x1E841, + }, + [0x1E842]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M180 DOO", + direction="r", + linebreak="al", + unicodeslot=0x1E842, + }, + [0x1E843]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M181 DO", + direction="r", + linebreak="al", + unicodeslot=0x1E843, + }, + [0x1E844]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M022 TI", + direction="r", + linebreak="al", + unicodeslot=0x1E844, + }, + [0x1E845]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M023 TA", + direction="r", + linebreak="al", + unicodeslot=0x1E845, + }, + [0x1E846]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M024 TU", + direction="r", + linebreak="al", + unicodeslot=0x1E846, + }, + [0x1E847]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M091 TEE", + direction="r", + linebreak="al", + unicodeslot=0x1E847, + }, + [0x1E848]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M055 TE", + direction="r", + linebreak="al", + unicodeslot=0x1E848, + }, + [0x1E849]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M104 TOO", + direction="r", + linebreak="al", + unicodeslot=0x1E849, + }, + [0x1E84A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M069 TO", + direction="r", + linebreak="al", + unicodeslot=0x1E84A, + }, + [0x1E84B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M028 JI", + direction="r", + linebreak="al", + unicodeslot=0x1E84B, + }, + [0x1E84C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M029 JA", + direction="r", + linebreak="al", + unicodeslot=0x1E84C, + }, + [0x1E84D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M030 JU", + direction="r", + linebreak="al", + unicodeslot=0x1E84D, + }, + [0x1E84E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M157 JEE", + direction="r", + linebreak="al", + unicodeslot=0x1E84E, + }, + [0x1E84F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M113 JE", + direction="r", + linebreak="al", + unicodeslot=0x1E84F, + }, + [0x1E850]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M160 JOO", + direction="r", + linebreak="al", + unicodeslot=0x1E850, + }, + [0x1E851]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M063 JO", + direction="r", + linebreak="al", + unicodeslot=0x1E851, + }, + [0x1E852]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M175 LONG JO", + direction="r", + linebreak="al", + unicodeslot=0x1E852, + }, + [0x1E853]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M031 YI", + direction="r", + linebreak="al", + unicodeslot=0x1E853, + }, + [0x1E854]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M032 YA", + direction="r", + linebreak="al", + unicodeslot=0x1E854, + }, + [0x1E855]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M033 YU", + direction="r", + linebreak="al", + unicodeslot=0x1E855, + }, + [0x1E856]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M109 YEE", + direction="r", + linebreak="al", + unicodeslot=0x1E856, + }, + [0x1E857]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M080 YE", + direction="r", + linebreak="al", + unicodeslot=0x1E857, + }, + [0x1E858]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M141 YOO", + direction="r", + linebreak="al", + unicodeslot=0x1E858, + }, + [0x1E859]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M121 YO", + direction="r", + linebreak="al", + unicodeslot=0x1E859, + }, + [0x1E85A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M034 FI", + direction="r", + linebreak="al", + unicodeslot=0x1E85A, + }, + [0x1E85B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M035 FA", + direction="r", + linebreak="al", + unicodeslot=0x1E85B, + }, + [0x1E85C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M036 FU", + direction="r", + linebreak="al", + unicodeslot=0x1E85C, + }, + [0x1E85D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M078 FEE", + direction="r", + linebreak="al", + unicodeslot=0x1E85D, + }, + [0x1E85E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M075 FE", + direction="r", + linebreak="al", + unicodeslot=0x1E85E, + }, + [0x1E85F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M133 FOO", + direction="r", + linebreak="al", + unicodeslot=0x1E85F, + }, + [0x1E860]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M088 FO", + direction="r", + linebreak="al", + unicodeslot=0x1E860, + }, + [0x1E861]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M197 FUA", + direction="r", + linebreak="al", + unicodeslot=0x1E861, + }, + [0x1E862]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M101 FAN", + direction="r", + linebreak="al", + unicodeslot=0x1E862, + }, + [0x1E863]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M037 NIN", + direction="r", + linebreak="al", + unicodeslot=0x1E863, + }, + [0x1E864]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M038 NAN", + direction="r", + linebreak="al", + unicodeslot=0x1E864, + }, + [0x1E865]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M039 NUN", + direction="r", + linebreak="al", + unicodeslot=0x1E865, + }, + [0x1E866]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M117 NEN", + direction="r", + linebreak="al", + unicodeslot=0x1E866, + }, + [0x1E867]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M169 NON", + direction="r", + linebreak="al", + unicodeslot=0x1E867, + }, + [0x1E868]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M176 HI", + direction="r", + linebreak="al", + unicodeslot=0x1E868, + }, + [0x1E869]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M041 HA", + direction="r", + linebreak="al", + unicodeslot=0x1E869, + }, + [0x1E86A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M186 HU", + direction="r", + linebreak="al", + unicodeslot=0x1E86A, + }, + [0x1E86B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M040 HEE", + direction="r", + linebreak="al", + unicodeslot=0x1E86B, + }, + [0x1E86C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M096 HE", + direction="r", + linebreak="al", + unicodeslot=0x1E86C, + }, + [0x1E86D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M042 HOO", + direction="r", + linebreak="al", + unicodeslot=0x1E86D, + }, + [0x1E86E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M140 HO", + direction="r", + linebreak="al", + unicodeslot=0x1E86E, + }, + [0x1E86F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M083 HEEI", + direction="r", + linebreak="al", + unicodeslot=0x1E86F, + }, + [0x1E870]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M128 HOOU", + direction="r", + linebreak="al", + unicodeslot=0x1E870, + }, + [0x1E871]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M053 HIN", + direction="r", + linebreak="al", + unicodeslot=0x1E871, + }, + [0x1E872]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M130 HAN", + direction="r", + linebreak="al", + unicodeslot=0x1E872, + }, + [0x1E873]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M087 HUN", + direction="r", + linebreak="al", + unicodeslot=0x1E873, + }, + [0x1E874]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M052 HEN", + direction="r", + linebreak="al", + unicodeslot=0x1E874, + }, + [0x1E875]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M193 HON", + direction="r", + linebreak="al", + unicodeslot=0x1E875, + }, + [0x1E876]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M046 HUAN", + direction="r", + linebreak="al", + unicodeslot=0x1E876, + }, + [0x1E877]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M090 NGGI", + direction="r", + linebreak="al", + unicodeslot=0x1E877, + }, + [0x1E878]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M043 NGGA", + direction="r", + linebreak="al", + unicodeslot=0x1E878, + }, + [0x1E879]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M082 NGGU", + direction="r", + linebreak="al", + unicodeslot=0x1E879, + }, + [0x1E87A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M115 NGGEE", + direction="r", + linebreak="al", + unicodeslot=0x1E87A, + }, + [0x1E87B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M146 NGGE", + direction="r", + linebreak="al", + unicodeslot=0x1E87B, + }, + [0x1E87C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M156 NGGOO", + direction="r", + linebreak="al", + unicodeslot=0x1E87C, + }, + [0x1E87D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M120 NGGO", + direction="r", + linebreak="al", + unicodeslot=0x1E87D, + }, + [0x1E87E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M159 NGGAA", + direction="r", + linebreak="al", + unicodeslot=0x1E87E, + }, + [0x1E87F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M127 NGGUA", + direction="r", + linebreak="al", + unicodeslot=0x1E87F, + }, + [0x1E880]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M086 LONG NGGE", + direction="r", + linebreak="al", + unicodeslot=0x1E880, + }, + [0x1E881]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M106 LONG NGGOO", + direction="r", + linebreak="al", + unicodeslot=0x1E881, + }, + [0x1E882]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M183 LONG NGGO", + direction="r", + linebreak="al", + unicodeslot=0x1E882, + }, + [0x1E883]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M155 GI", + direction="r", + linebreak="al", + unicodeslot=0x1E883, + }, + [0x1E884]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M111 GA", + direction="r", + linebreak="al", + unicodeslot=0x1E884, + }, + [0x1E885]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M168 GU", + direction="r", + linebreak="al", + unicodeslot=0x1E885, + }, + [0x1E886]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M190 GEE", + direction="r", + linebreak="al", + unicodeslot=0x1E886, + }, + [0x1E887]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M166 GUEI", + direction="r", + linebreak="al", + unicodeslot=0x1E887, + }, + [0x1E888]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M167 GUAN", + direction="r", + linebreak="al", + unicodeslot=0x1E888, + }, + [0x1E889]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M184 NGEN", + direction="r", + linebreak="al", + unicodeslot=0x1E889, + }, + [0x1E88A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M057 NGON", + direction="r", + linebreak="al", + unicodeslot=0x1E88A, + }, + [0x1E88B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M177 NGUAN", + direction="r", + linebreak="al", + unicodeslot=0x1E88B, + }, + [0x1E88C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M068 PI", + direction="r", + linebreak="al", + unicodeslot=0x1E88C, + }, + [0x1E88D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M099 PA", + direction="r", + linebreak="al", + unicodeslot=0x1E88D, + }, + [0x1E88E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M050 PU", + direction="r", + linebreak="al", + unicodeslot=0x1E88E, + }, + [0x1E88F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M081 PEE", + direction="r", + linebreak="al", + unicodeslot=0x1E88F, + }, + [0x1E890]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M051 PE", + direction="r", + linebreak="al", + unicodeslot=0x1E890, + }, + [0x1E891]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M102 POO", + direction="r", + linebreak="al", + unicodeslot=0x1E891, + }, + [0x1E892]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M066 PO", + direction="r", + linebreak="al", + unicodeslot=0x1E892, + }, + [0x1E893]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M145 MBI", + direction="r", + linebreak="al", + unicodeslot=0x1E893, + }, + [0x1E894]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M062 MBA", + direction="r", + linebreak="al", + unicodeslot=0x1E894, + }, + [0x1E895]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M122 MBU", + direction="r", + linebreak="al", + unicodeslot=0x1E895, + }, + [0x1E896]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M047 MBEE", + direction="r", + linebreak="al", + unicodeslot=0x1E896, + }, + [0x1E897]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M188 MBEE", + direction="r", + linebreak="al", + unicodeslot=0x1E897, + }, + [0x1E898]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M072 MBE", + direction="r", + linebreak="al", + unicodeslot=0x1E898, + }, + [0x1E899]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M172 MBOO", + direction="r", + linebreak="al", + unicodeslot=0x1E899, + }, + [0x1E89A]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M174 MBO", + direction="r", + linebreak="al", + unicodeslot=0x1E89A, + }, + [0x1E89B]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M187 MBUU", + direction="r", + linebreak="al", + unicodeslot=0x1E89B, + }, + [0x1E89C]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M161 LONG MBE", + direction="r", + linebreak="al", + unicodeslot=0x1E89C, + }, + [0x1E89D]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M105 LONG MBOO", + direction="r", + linebreak="al", + unicodeslot=0x1E89D, + }, + [0x1E89E]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M142 LONG MBO", + direction="r", + linebreak="al", + unicodeslot=0x1E89E, + }, + [0x1E89F]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M132 KPI", + direction="r", + linebreak="al", + unicodeslot=0x1E89F, + }, + [0x1E8A0]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M092 KPA", + direction="r", + linebreak="al", + unicodeslot=0x1E8A0, + }, + [0x1E8A1]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M074 KPU", + direction="r", + linebreak="al", + unicodeslot=0x1E8A1, + }, + [0x1E8A2]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M044 KPEE", + direction="r", + linebreak="al", + unicodeslot=0x1E8A2, + }, + [0x1E8A3]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M108 KPE", + direction="r", + linebreak="al", + unicodeslot=0x1E8A3, + }, + [0x1E8A4]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M112 KPOO", + direction="r", + linebreak="al", + unicodeslot=0x1E8A4, + }, + [0x1E8A5]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M158 KPO", + direction="r", + linebreak="al", + unicodeslot=0x1E8A5, + }, + [0x1E8A6]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M124 GBI", + direction="r", + linebreak="al", + unicodeslot=0x1E8A6, + }, + [0x1E8A7]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M056 GBA", + direction="r", + linebreak="al", + unicodeslot=0x1E8A7, + }, + [0x1E8A8]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M148 GBU", + direction="r", + linebreak="al", + unicodeslot=0x1E8A8, + }, + [0x1E8A9]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M093 GBEE", + direction="r", + linebreak="al", + unicodeslot=0x1E8A9, + }, + [0x1E8AA]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M107 GBE", + direction="r", + linebreak="al", + unicodeslot=0x1E8AA, + }, + [0x1E8AB]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M071 GBOO", + direction="r", + linebreak="al", + unicodeslot=0x1E8AB, + }, + [0x1E8AC]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M070 GBO", + direction="r", + linebreak="al", + unicodeslot=0x1E8AC, + }, + [0x1E8AD]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M171 RA", + direction="r", + linebreak="al", + unicodeslot=0x1E8AD, + }, + [0x1E8AE]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M123 NDI", + direction="r", + linebreak="al", + unicodeslot=0x1E8AE, + }, + [0x1E8AF]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M129 NDA", + direction="r", + linebreak="al", + unicodeslot=0x1E8AF, + }, + [0x1E8B0]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M125 NDU", + direction="r", + linebreak="al", + unicodeslot=0x1E8B0, + }, + [0x1E8B1]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M191 NDEE", + direction="r", + linebreak="al", + unicodeslot=0x1E8B1, + }, + [0x1E8B2]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M119 NDE", + direction="r", + linebreak="al", + unicodeslot=0x1E8B2, + }, + [0x1E8B3]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M067 NDOO", + direction="r", + linebreak="al", + unicodeslot=0x1E8B3, + }, + [0x1E8B4]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M064 NDO", + direction="r", + linebreak="al", + unicodeslot=0x1E8B4, + }, + [0x1E8B5]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M152 NJA", + direction="r", + linebreak="al", + unicodeslot=0x1E8B5, + }, + [0x1E8B6]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M192 NJU", + direction="r", + linebreak="al", + unicodeslot=0x1E8B6, + }, + [0x1E8B7]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M149 NJEE", + direction="r", + linebreak="al", + unicodeslot=0x1E8B7, + }, + [0x1E8B8]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M134 NJOO", + direction="r", + linebreak="al", + unicodeslot=0x1E8B8, + }, + [0x1E8B9]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M182 VI", + direction="r", + linebreak="al", + unicodeslot=0x1E8B9, + }, + [0x1E8BA]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M185 VA", + direction="r", + linebreak="al", + unicodeslot=0x1E8BA, + }, + [0x1E8BB]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M151 VU", + direction="r", + linebreak="al", + unicodeslot=0x1E8BB, + }, + [0x1E8BC]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M173 VEE", + direction="r", + linebreak="al", + unicodeslot=0x1E8BC, + }, + [0x1E8BD]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M085 VE", + direction="r", + linebreak="al", + unicodeslot=0x1E8BD, + }, + [0x1E8BE]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M144 VOO", + direction="r", + linebreak="al", + unicodeslot=0x1E8BE, + }, + [0x1E8BF]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M077 VO", + direction="r", + linebreak="al", + unicodeslot=0x1E8BF, + }, + [0x1E8C0]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M164 NYIN", + direction="r", + linebreak="al", + unicodeslot=0x1E8C0, + }, + [0x1E8C1]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M058 NYAN", + direction="r", + linebreak="al", + unicodeslot=0x1E8C1, + }, + [0x1E8C2]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M170 NYUN", + direction="r", + linebreak="al", + unicodeslot=0x1E8C2, + }, + [0x1E8C3]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M098 NYEN", + direction="r", + linebreak="al", + unicodeslot=0x1E8C3, + }, + [0x1E8C4]={ + category="lo", + description="MENDE KIKAKUI SYLLABLE M060 NYON", + direction="r", + linebreak="al", + unicodeslot=0x1E8C4, + }, + [0x1E8C7]={ + category="no", + description="MENDE KIKAKUI DIGIT ONE", + direction="r", + linebreak="al", + unicodeslot=0x1E8C7, + }, + [0x1E8C8]={ + category="no", + description="MENDE KIKAKUI DIGIT TWO", + direction="r", + linebreak="al", + unicodeslot=0x1E8C8, + }, + [0x1E8C9]={ + category="no", + description="MENDE KIKAKUI DIGIT THREE", + direction="r", + linebreak="al", + unicodeslot=0x1E8C9, + }, + [0x1E8CA]={ + category="no", + description="MENDE KIKAKUI DIGIT FOUR", + direction="r", + linebreak="al", + unicodeslot=0x1E8CA, + }, + [0x1E8CB]={ + category="no", + description="MENDE KIKAKUI DIGIT FIVE", + direction="r", + linebreak="al", + unicodeslot=0x1E8CB, + }, + [0x1E8CC]={ + category="no", + description="MENDE KIKAKUI DIGIT SIX", + direction="r", + linebreak="al", + unicodeslot=0x1E8CC, + }, + [0x1E8CD]={ + category="no", + description="MENDE KIKAKUI DIGIT SEVEN", + direction="r", + linebreak="al", + unicodeslot=0x1E8CD, + }, + [0x1E8CE]={ + category="no", + description="MENDE KIKAKUI DIGIT EIGHT", + direction="r", + linebreak="al", + unicodeslot=0x1E8CE, + }, + [0x1E8CF]={ + category="no", + description="MENDE KIKAKUI DIGIT NINE", + direction="r", + linebreak="al", + unicodeslot=0x1E8CF, + }, + [0x1E8D0]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER TEENS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D0, + }, + [0x1E8D1]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER TENS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D1, + }, + [0x1E8D2]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER HUNDREDS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D2, + }, + [0x1E8D3]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER THOUSANDS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D3, + }, + [0x1E8D4]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D4, + }, + [0x1E8D5]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D5, + }, + [0x1E8D6]={ + category="mn", + combining=0xDC, + description="MENDE KIKAKUI COMBINING NUMBER MILLIONS", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E8D6, + }, [0x1EE00]={ category="lo", comment="check math properties", description="ARABIC MATHEMATICAL ALEF", direction="al", linebreak="al", - specials={ "font", 0x0627 }, + specials={ "font", 0x627 }, unicodeslot=0x1EE00, }, [0x1EE01]={ @@ -176211,7 +193323,7 @@ characters.data={ description="ARABIC MATHEMATICAL BEH", direction="al", linebreak="al", - specials={ "font", 0x0628 }, + specials={ "font", 0x628 }, unicodeslot=0x1EE01, }, [0x1EE02]={ @@ -176220,7 +193332,7 @@ characters.data={ description="ARABIC MATHEMATICAL JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EE02, }, [0x1EE03]={ @@ -176229,7 +193341,7 @@ characters.data={ description="ARABIC MATHEMATICAL DAL", direction="al", linebreak="al", - specials={ "font", 0x062F }, + specials={ "font", 0x62F }, unicodeslot=0x1EE03, }, [0x1EE05]={ @@ -176238,7 +193350,7 @@ characters.data={ description="ARABIC MATHEMATICAL WAW", direction="al", linebreak="al", - specials={ "font", 0x0648 }, + specials={ "font", 0x648 }, unicodeslot=0x1EE05, }, [0x1EE06]={ @@ -176247,7 +193359,7 @@ characters.data={ description="ARABIC MATHEMATICAL ZAIN", direction="al", linebreak="al", - specials={ "font", 0x0632 }, + specials={ "font", 0x632 }, unicodeslot=0x1EE06, }, [0x1EE07]={ @@ -176256,7 +193368,7 @@ characters.data={ description="ARABIC MATHEMATICAL HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EE07, }, [0x1EE08]={ @@ -176265,7 +193377,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAH", direction="al", linebreak="al", - specials={ "font", 0x0637 }, + specials={ "font", 0x637 }, unicodeslot=0x1EE08, }, [0x1EE09]={ @@ -176274,7 +193386,7 @@ characters.data={ description="ARABIC MATHEMATICAL YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EE09, }, [0x1EE0A]={ @@ -176283,7 +193395,7 @@ characters.data={ description="ARABIC MATHEMATICAL KAF", direction="al", linebreak="al", - specials={ "font", 0x0643 }, + specials={ "font", 0x643 }, unicodeslot=0x1EE0A, }, [0x1EE0B]={ @@ -176292,7 +193404,7 @@ characters.data={ description="ARABIC MATHEMATICAL LAM", direction="al", linebreak="al", - specials={ "font", 0x0644 }, + specials={ "font", 0x644 }, unicodeslot=0x1EE0B, }, [0x1EE0C]={ @@ -176301,7 +193413,7 @@ characters.data={ description="ARABIC MATHEMATICAL MEEM", direction="al", linebreak="al", - specials={ "font", 0x0645 }, + specials={ "font", 0x645 }, unicodeslot=0x1EE0C, }, [0x1EE0D]={ @@ -176310,7 +193422,7 @@ characters.data={ description="ARABIC MATHEMATICAL NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EE0D, }, [0x1EE0E]={ @@ -176319,7 +193431,7 @@ characters.data={ description="ARABIC MATHEMATICAL SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EE0E, }, [0x1EE0F]={ @@ -176328,7 +193440,7 @@ characters.data={ description="ARABIC MATHEMATICAL AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EE0F, }, [0x1EE10]={ @@ -176337,7 +193449,7 @@ characters.data={ description="ARABIC MATHEMATICAL FEH", direction="al", linebreak="al", - specials={ "font", 0x0641 }, + specials={ "font", 0x641 }, unicodeslot=0x1EE10, }, [0x1EE11]={ @@ -176346,7 +193458,7 @@ characters.data={ description="ARABIC MATHEMATICAL SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EE11, }, [0x1EE12]={ @@ -176355,7 +193467,7 @@ characters.data={ description="ARABIC MATHEMATICAL QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EE12, }, [0x1EE13]={ @@ -176364,7 +193476,7 @@ characters.data={ description="ARABIC MATHEMATICAL REH", direction="al", linebreak="al", - specials={ "font", 0x0631 }, + specials={ "font", 0x631 }, unicodeslot=0x1EE13, }, [0x1EE14]={ @@ -176373,7 +193485,7 @@ characters.data={ description="ARABIC MATHEMATICAL SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EE14, }, [0x1EE15]={ @@ -176382,7 +193494,7 @@ characters.data={ description="ARABIC MATHEMATICAL TEH", direction="al", linebreak="al", - specials={ "font", 0x062A }, + specials={ "font", 0x62A }, unicodeslot=0x1EE15, }, [0x1EE16]={ @@ -176391,7 +193503,7 @@ characters.data={ description="ARABIC MATHEMATICAL THEH", direction="al", linebreak="al", - specials={ "font", 0x062B }, + specials={ "font", 0x62B }, unicodeslot=0x1EE16, }, [0x1EE17]={ @@ -176400,7 +193512,7 @@ characters.data={ description="ARABIC MATHEMATICAL KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EE17, }, [0x1EE18]={ @@ -176409,7 +193521,7 @@ characters.data={ description="ARABIC MATHEMATICAL THAL", direction="al", linebreak="al", - specials={ "font", 0x0630 }, + specials={ "font", 0x630 }, unicodeslot=0x1EE18, }, [0x1EE19]={ @@ -176418,7 +193530,7 @@ characters.data={ description="ARABIC MATHEMATICAL DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EE19, }, [0x1EE1A]={ @@ -176427,7 +193539,7 @@ characters.data={ description="ARABIC MATHEMATICAL ZAH", direction="al", linebreak="al", - specials={ "font", 0x0638 }, + specials={ "font", 0x638 }, unicodeslot=0x1EE1A, }, [0x1EE1B]={ @@ -176436,7 +193548,7 @@ characters.data={ description="ARABIC MATHEMATICAL GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EE1B, }, [0x1EE1C]={ @@ -176445,7 +193557,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOTLESS BEH", direction="al", linebreak="al", - specials={ "font", 0x066E }, + specials={ "font", 0x66E }, unicodeslot=0x1EE1C, }, [0x1EE1D]={ @@ -176454,7 +193566,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOTLESS NOON", direction="al", linebreak="al", - specials={ "font", 0x06BA }, + specials={ "font", 0x6BA }, unicodeslot=0x1EE1D, }, [0x1EE1E]={ @@ -176463,7 +193575,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOTLESS FEH", direction="al", linebreak="al", - specials={ "font", 0x06A1 }, + specials={ "font", 0x6A1 }, unicodeslot=0x1EE1E, }, [0x1EE1F]={ @@ -176472,7 +193584,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOTLESS QAF", direction="al", linebreak="al", - specials={ "font", 0x066F }, + specials={ "font", 0x66F }, unicodeslot=0x1EE1F, }, [0x1EE21]={ @@ -176481,7 +193593,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL BEH", direction="al", linebreak="al", - specials={ "font", 0x0628 }, + specials={ "font", 0x628 }, unicodeslot=0x1EE21, }, [0x1EE22]={ @@ -176490,7 +193602,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EE22, }, [0x1EE24]={ @@ -176499,7 +193611,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL HEH", direction="al", linebreak="al", - specials={ "font", 0x0647 }, + specials={ "font", 0x647 }, unicodeslot=0x1EE24, }, [0x1EE27]={ @@ -176508,7 +193620,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EE27, }, [0x1EE29]={ @@ -176517,7 +193629,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EE29, }, [0x1EE2A]={ @@ -176526,7 +193638,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL KAF", direction="al", linebreak="al", - specials={ "font", 0x0643 }, + specials={ "font", 0x643 }, unicodeslot=0x1EE2A, }, [0x1EE2B]={ @@ -176535,7 +193647,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL LAM", direction="al", linebreak="al", - specials={ "font", 0x0644 }, + specials={ "font", 0x644 }, unicodeslot=0x1EE2B, }, [0x1EE2C]={ @@ -176544,7 +193656,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL MEEM", direction="al", linebreak="al", - specials={ "font", 0x0645 }, + specials={ "font", 0x645 }, unicodeslot=0x1EE2C, }, [0x1EE2D]={ @@ -176553,7 +193665,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EE2D, }, [0x1EE2E]={ @@ -176562,7 +193674,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EE2E, }, [0x1EE2F]={ @@ -176571,7 +193683,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EE2F, }, [0x1EE30]={ @@ -176580,7 +193692,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL FEH", direction="al", linebreak="al", - specials={ "font", 0x0641 }, + specials={ "font", 0x641 }, unicodeslot=0x1EE30, }, [0x1EE31]={ @@ -176589,7 +193701,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EE31, }, [0x1EE32]={ @@ -176598,7 +193710,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EE32, }, [0x1EE34]={ @@ -176607,7 +193719,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EE34, }, [0x1EE35]={ @@ -176616,7 +193728,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL TEH", direction="al", linebreak="al", - specials={ "font", 0x062A }, + specials={ "font", 0x62A }, unicodeslot=0x1EE35, }, [0x1EE36]={ @@ -176625,7 +193737,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL THEH", direction="al", linebreak="al", - specials={ "font", 0x062B }, + specials={ "font", 0x62B }, unicodeslot=0x1EE36, }, [0x1EE37]={ @@ -176634,7 +193746,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EE37, }, [0x1EE39]={ @@ -176643,7 +193755,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EE39, }, [0x1EE3B]={ @@ -176652,7 +193764,7 @@ characters.data={ description="ARABIC MATHEMATICAL INITIAL GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EE3B, }, [0x1EE42]={ @@ -176661,7 +193773,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EE42, }, [0x1EE47]={ @@ -176670,7 +193782,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EE47, }, [0x1EE49]={ @@ -176679,7 +193791,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EE49, }, [0x1EE4B]={ @@ -176688,7 +193800,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED LAM", direction="al", linebreak="al", - specials={ "font", 0x0644 }, + specials={ "font", 0x644 }, unicodeslot=0x1EE4B, }, [0x1EE4D]={ @@ -176697,7 +193809,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EE4D, }, [0x1EE4E]={ @@ -176706,7 +193818,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EE4E, }, [0x1EE4F]={ @@ -176715,7 +193827,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EE4F, }, [0x1EE51]={ @@ -176724,7 +193836,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EE51, }, [0x1EE52]={ @@ -176733,7 +193845,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EE52, }, [0x1EE54]={ @@ -176742,7 +193854,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EE54, }, [0x1EE57]={ @@ -176751,7 +193863,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EE57, }, [0x1EE59]={ @@ -176760,7 +193872,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EE59, }, [0x1EE5B]={ @@ -176769,7 +193881,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EE5B, }, [0x1EE5D]={ @@ -176778,7 +193890,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED DOTLESS NOON", direction="al", linebreak="al", - specials={ "font", 0x06BA }, + specials={ "font", 0x6BA }, unicodeslot=0x1EE5D, }, [0x1EE5F]={ @@ -176787,7 +193899,7 @@ characters.data={ description="ARABIC MATHEMATICAL TAILED DOTLESS QAF", direction="al", linebreak="al", - specials={ "font", 0x066F }, + specials={ "font", 0x66F }, unicodeslot=0x1EE5F, }, [0x1EE61]={ @@ -176796,7 +193908,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED BEH", direction="al", linebreak="al", - specials={ "font", 0x0628 }, + specials={ "font", 0x628 }, unicodeslot=0x1EE61, }, [0x1EE62]={ @@ -176805,7 +193917,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EE62, }, [0x1EE64]={ @@ -176814,7 +193926,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED HEH", direction="al", linebreak="al", - specials={ "font", 0x0647 }, + specials={ "font", 0x647 }, unicodeslot=0x1EE64, }, [0x1EE67]={ @@ -176823,7 +193935,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EE67, }, [0x1EE68]={ @@ -176832,7 +193944,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED TAH", direction="al", linebreak="al", - specials={ "font", 0x0637 }, + specials={ "font", 0x637 }, unicodeslot=0x1EE68, }, [0x1EE69]={ @@ -176841,7 +193953,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EE69, }, [0x1EE6A]={ @@ -176850,7 +193962,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED KAF", direction="al", linebreak="al", - specials={ "font", 0x0643 }, + specials={ "font", 0x643 }, unicodeslot=0x1EE6A, }, [0x1EE6C]={ @@ -176859,7 +193971,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED MEEM", direction="al", linebreak="al", - specials={ "font", 0x0645 }, + specials={ "font", 0x645 }, unicodeslot=0x1EE6C, }, [0x1EE6D]={ @@ -176868,7 +193980,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EE6D, }, [0x1EE6E]={ @@ -176877,7 +193989,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EE6E, }, [0x1EE6F]={ @@ -176886,7 +193998,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EE6F, }, [0x1EE70]={ @@ -176895,7 +194007,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED FEH", direction="al", linebreak="al", - specials={ "font", 0x0641 }, + specials={ "font", 0x641 }, unicodeslot=0x1EE70, }, [0x1EE71]={ @@ -176904,7 +194016,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EE71, }, [0x1EE72]={ @@ -176913,7 +194025,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EE72, }, [0x1EE74]={ @@ -176922,7 +194034,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EE74, }, [0x1EE75]={ @@ -176931,7 +194043,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED TEH", direction="al", linebreak="al", - specials={ "font", 0x062A }, + specials={ "font", 0x62A }, unicodeslot=0x1EE75, }, [0x1EE76]={ @@ -176940,7 +194052,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED THEH", direction="al", linebreak="al", - specials={ "font", 0x062B }, + specials={ "font", 0x62B }, unicodeslot=0x1EE76, }, [0x1EE77]={ @@ -176949,7 +194061,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EE77, }, [0x1EE79]={ @@ -176958,7 +194070,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EE79, }, [0x1EE7A]={ @@ -176967,7 +194079,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED ZAH", direction="al", linebreak="al", - specials={ "font", 0x0638 }, + specials={ "font", 0x638 }, unicodeslot=0x1EE7A, }, [0x1EE7B]={ @@ -176976,7 +194088,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EE7B, }, [0x1EE7C]={ @@ -176985,7 +194097,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED DOTLESS BEH", direction="al", linebreak="al", - specials={ "font", 0x066E }, + specials={ "font", 0x66E }, unicodeslot=0x1EE7C, }, [0x1EE7E]={ @@ -176994,7 +194106,7 @@ characters.data={ description="ARABIC MATHEMATICAL STRETCHED DOTLESS FEH", direction="al", linebreak="al", - specials={ "font", 0x06A1 }, + specials={ "font", 0x6A1 }, unicodeslot=0x1EE7E, }, [0x1EE80]={ @@ -177003,7 +194115,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED ALEF", direction="al", linebreak="al", - specials={ "font", 0x0627 }, + specials={ "font", 0x627 }, unicodeslot=0x1EE80, }, [0x1EE81]={ @@ -177012,7 +194124,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED BEH", direction="al", linebreak="al", - specials={ "font", 0x0628 }, + specials={ "font", 0x628 }, unicodeslot=0x1EE81, }, [0x1EE82]={ @@ -177021,7 +194133,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EE82, }, [0x1EE83]={ @@ -177030,7 +194142,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED DAL", direction="al", linebreak="al", - specials={ "font", 0x062F }, + specials={ "font", 0x62F }, unicodeslot=0x1EE83, }, [0x1EE84]={ @@ -177039,7 +194151,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED HEH", direction="al", linebreak="al", - specials={ "font", 0x0647 }, + specials={ "font", 0x647 }, unicodeslot=0x1EE84, }, [0x1EE85]={ @@ -177048,7 +194160,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED WAW", direction="al", linebreak="al", - specials={ "font", 0x0648 }, + specials={ "font", 0x648 }, unicodeslot=0x1EE85, }, [0x1EE86]={ @@ -177057,7 +194169,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED ZAIN", direction="al", linebreak="al", - specials={ "font", 0x0632 }, + specials={ "font", 0x632 }, unicodeslot=0x1EE86, }, [0x1EE87]={ @@ -177066,7 +194178,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EE87, }, [0x1EE88]={ @@ -177075,7 +194187,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED TAH", direction="al", linebreak="al", - specials={ "font", 0x0637 }, + specials={ "font", 0x637 }, unicodeslot=0x1EE88, }, [0x1EE89]={ @@ -177084,7 +194196,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EE89, }, [0x1EE8B]={ @@ -177093,7 +194205,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED LAM", direction="al", linebreak="al", - specials={ "font", 0x0644 }, + specials={ "font", 0x644 }, unicodeslot=0x1EE8B, }, [0x1EE8C]={ @@ -177102,7 +194214,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED MEEM", direction="al", linebreak="al", - specials={ "font", 0x0645 }, + specials={ "font", 0x645 }, unicodeslot=0x1EE8C, }, [0x1EE8D]={ @@ -177111,7 +194223,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EE8D, }, [0x1EE8E]={ @@ -177120,7 +194232,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EE8E, }, [0x1EE8F]={ @@ -177129,7 +194241,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EE8F, }, [0x1EE90]={ @@ -177138,7 +194250,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED FEH", direction="al", linebreak="al", - specials={ "font", 0x0641 }, + specials={ "font", 0x641 }, unicodeslot=0x1EE90, }, [0x1EE91]={ @@ -177147,7 +194259,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EE91, }, [0x1EE92]={ @@ -177156,7 +194268,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EE92, }, [0x1EE93]={ @@ -177165,7 +194277,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED REH", direction="al", linebreak="al", - specials={ "font", 0x0631 }, + specials={ "font", 0x631 }, unicodeslot=0x1EE93, }, [0x1EE94]={ @@ -177174,7 +194286,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EE94, }, [0x1EE95]={ @@ -177183,7 +194295,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED TEH", direction="al", linebreak="al", - specials={ "font", 0x062A }, + specials={ "font", 0x62A }, unicodeslot=0x1EE95, }, [0x1EE96]={ @@ -177192,7 +194304,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED THEH", direction="al", linebreak="al", - specials={ "font", 0x062B }, + specials={ "font", 0x62B }, unicodeslot=0x1EE96, }, [0x1EE97]={ @@ -177201,7 +194313,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EE97, }, [0x1EE98]={ @@ -177210,7 +194322,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED THAL", direction="al", linebreak="al", - specials={ "font", 0x0630 }, + specials={ "font", 0x630 }, unicodeslot=0x1EE98, }, [0x1EE99]={ @@ -177219,7 +194331,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EE99, }, [0x1EE9A]={ @@ -177228,7 +194340,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED ZAH", direction="al", linebreak="al", - specials={ "font", 0x0638 }, + specials={ "font", 0x638 }, unicodeslot=0x1EE9A, }, [0x1EE9B]={ @@ -177237,7 +194349,7 @@ characters.data={ description="ARABIC MATHEMATICAL LOOPED GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EE9B, }, [0x1EEA1]={ @@ -177246,7 +194358,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK BEH", direction="al", linebreak="al", - specials={ "font", 0x0628 }, + specials={ "font", 0x628 }, unicodeslot=0x1EEA1, }, [0x1EEA2]={ @@ -177255,7 +194367,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM", direction="al", linebreak="al", - specials={ "font", 0x062C }, + specials={ "font", 0x62C }, unicodeslot=0x1EEA2, }, [0x1EEA3]={ @@ -177264,7 +194376,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK DAL", direction="al", linebreak="al", - specials={ "font", 0x062F }, + specials={ "font", 0x62F }, unicodeslot=0x1EEA3, }, [0x1EEA5]={ @@ -177273,7 +194385,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK WAW", direction="al", linebreak="al", - specials={ "font", 0x0648 }, + specials={ "font", 0x648 }, unicodeslot=0x1EEA5, }, [0x1EEA6]={ @@ -177282,7 +194394,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN", direction="al", linebreak="al", - specials={ "font", 0x0632 }, + specials={ "font", 0x632 }, unicodeslot=0x1EEA6, }, [0x1EEA7]={ @@ -177291,7 +194403,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK HAH", direction="al", linebreak="al", - specials={ "font", 0x062D }, + specials={ "font", 0x62D }, unicodeslot=0x1EEA7, }, [0x1EEA8]={ @@ -177300,7 +194412,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK TAH", direction="al", linebreak="al", - specials={ "font", 0x0637 }, + specials={ "font", 0x637 }, unicodeslot=0x1EEA8, }, [0x1EEA9]={ @@ -177309,7 +194421,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK YEH", direction="al", linebreak="al", - specials={ "font", 0x064A }, + specials={ "font", 0x64A }, unicodeslot=0x1EEA9, }, [0x1EEAB]={ @@ -177318,7 +194430,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK LAM", direction="al", linebreak="al", - specials={ "font", 0x0644 }, + specials={ "font", 0x644 }, unicodeslot=0x1EEAB, }, [0x1EEAC]={ @@ -177327,7 +194439,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM", direction="al", linebreak="al", - specials={ "font", 0x0645 }, + specials={ "font", 0x645 }, unicodeslot=0x1EEAC, }, [0x1EEAD]={ @@ -177336,7 +194448,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK NOON", direction="al", linebreak="al", - specials={ "font", 0x0646 }, + specials={ "font", 0x646 }, unicodeslot=0x1EEAD, }, [0x1EEAE]={ @@ -177345,7 +194457,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN", direction="al", linebreak="al", - specials={ "font", 0x0633 }, + specials={ "font", 0x633 }, unicodeslot=0x1EEAE, }, [0x1EEAF]={ @@ -177354,7 +194466,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK AIN", direction="al", linebreak="al", - specials={ "font", 0x0639 }, + specials={ "font", 0x639 }, unicodeslot=0x1EEAF, }, [0x1EEB0]={ @@ -177363,7 +194475,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK FEH", direction="al", linebreak="al", - specials={ "font", 0x0641 }, + specials={ "font", 0x641 }, unicodeslot=0x1EEB0, }, [0x1EEB1]={ @@ -177372,7 +194484,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK SAD", direction="al", linebreak="al", - specials={ "font", 0x0635 }, + specials={ "font", 0x635 }, unicodeslot=0x1EEB1, }, [0x1EEB2]={ @@ -177381,7 +194493,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK QAF", direction="al", linebreak="al", - specials={ "font", 0x0642 }, + specials={ "font", 0x642 }, unicodeslot=0x1EEB2, }, [0x1EEB3]={ @@ -177390,7 +194502,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK REH", direction="al", linebreak="al", - specials={ "font", 0x0631 }, + specials={ "font", 0x631 }, unicodeslot=0x1EEB3, }, [0x1EEB4]={ @@ -177399,7 +194511,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN", direction="al", linebreak="al", - specials={ "font", 0x0634 }, + specials={ "font", 0x634 }, unicodeslot=0x1EEB4, }, [0x1EEB5]={ @@ -177408,7 +194520,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK TEH", direction="al", linebreak="al", - specials={ "font", 0x062A }, + specials={ "font", 0x62A }, unicodeslot=0x1EEB5, }, [0x1EEB6]={ @@ -177417,7 +194529,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK THEH", direction="al", linebreak="al", - specials={ "font", 0x062B }, + specials={ "font", 0x62B }, unicodeslot=0x1EEB6, }, [0x1EEB7]={ @@ -177426,7 +194538,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH", direction="al", linebreak="al", - specials={ "font", 0x062E }, + specials={ "font", 0x62E }, unicodeslot=0x1EEB7, }, [0x1EEB8]={ @@ -177435,7 +194547,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK THAL", direction="al", linebreak="al", - specials={ "font", 0x0630 }, + specials={ "font", 0x630 }, unicodeslot=0x1EEB8, }, [0x1EEB9]={ @@ -177444,7 +194556,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK DAD", direction="al", linebreak="al", - specials={ "font", 0x0636 }, + specials={ "font", 0x636 }, unicodeslot=0x1EEB9, }, [0x1EEBA]={ @@ -177453,7 +194565,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH", direction="al", linebreak="al", - specials={ "font", 0x0638 }, + specials={ "font", 0x638 }, unicodeslot=0x1EEBA, }, [0x1EEBB]={ @@ -177462,7 +194574,7 @@ characters.data={ description="ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN", direction="al", linebreak="al", - specials={ "font", 0x063A }, + specials={ "font", 0x63A }, unicodeslot=0x1EEBB, }, [0x1EEF0]={ @@ -178696,6 +195808,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F0BE, }, + [0x1F0BF]={ + category="so", + description="PLAYING CARD RED JOKER", + direction="on", + linebreak="id", + unicodeslot=0x1F0BF, + }, [0x1F0C1]={ category="so", description="PLAYING CARD ACE OF DIAMONDS", @@ -178906,13 +196025,167 @@ characters.data={ linebreak="id", unicodeslot=0x1F0DF, }, + [0x1F0E0]={ + category="so", + description="PLAYING CARD FOOL", + direction="on", + linebreak="id", + unicodeslot=0x1F0E0, + }, + [0x1F0E1]={ + category="so", + description="PLAYING CARD TRUMP-1", + direction="on", + linebreak="id", + unicodeslot=0x1F0E1, + }, + [0x1F0E2]={ + category="so", + description="PLAYING CARD TRUMP-2", + direction="on", + linebreak="id", + unicodeslot=0x1F0E2, + }, + [0x1F0E3]={ + category="so", + description="PLAYING CARD TRUMP-3", + direction="on", + linebreak="id", + unicodeslot=0x1F0E3, + }, + [0x1F0E4]={ + category="so", + description="PLAYING CARD TRUMP-4", + direction="on", + linebreak="id", + unicodeslot=0x1F0E4, + }, + [0x1F0E5]={ + category="so", + description="PLAYING CARD TRUMP-5", + direction="on", + linebreak="id", + unicodeslot=0x1F0E5, + }, + [0x1F0E6]={ + category="so", + description="PLAYING CARD TRUMP-6", + direction="on", + linebreak="id", + unicodeslot=0x1F0E6, + }, + [0x1F0E7]={ + category="so", + description="PLAYING CARD TRUMP-7", + direction="on", + linebreak="id", + unicodeslot=0x1F0E7, + }, + [0x1F0E8]={ + category="so", + description="PLAYING CARD TRUMP-8", + direction="on", + linebreak="id", + unicodeslot=0x1F0E8, + }, + [0x1F0E9]={ + category="so", + description="PLAYING CARD TRUMP-9", + direction="on", + linebreak="id", + unicodeslot=0x1F0E9, + }, + [0x1F0EA]={ + category="so", + description="PLAYING CARD TRUMP-10", + direction="on", + linebreak="id", + unicodeslot=0x1F0EA, + }, + [0x1F0EB]={ + category="so", + description="PLAYING CARD TRUMP-11", + direction="on", + linebreak="id", + unicodeslot=0x1F0EB, + }, + [0x1F0EC]={ + category="so", + description="PLAYING CARD TRUMP-12", + direction="on", + linebreak="id", + unicodeslot=0x1F0EC, + }, + [0x1F0ED]={ + category="so", + description="PLAYING CARD TRUMP-13", + direction="on", + linebreak="id", + unicodeslot=0x1F0ED, + }, + [0x1F0EE]={ + category="so", + description="PLAYING CARD TRUMP-14", + direction="on", + linebreak="id", + unicodeslot=0x1F0EE, + }, + [0x1F0EF]={ + category="so", + description="PLAYING CARD TRUMP-15", + direction="on", + linebreak="id", + unicodeslot=0x1F0EF, + }, + [0x1F0F0]={ + category="so", + description="PLAYING CARD TRUMP-16", + direction="on", + linebreak="id", + unicodeslot=0x1F0F0, + }, + [0x1F0F1]={ + category="so", + description="PLAYING CARD TRUMP-17", + direction="on", + linebreak="id", + unicodeslot=0x1F0F1, + }, + [0x1F0F2]={ + category="so", + description="PLAYING CARD TRUMP-18", + direction="on", + linebreak="id", + unicodeslot=0x1F0F2, + }, + [0x1F0F3]={ + category="so", + description="PLAYING CARD TRUMP-19", + direction="on", + linebreak="id", + unicodeslot=0x1F0F3, + }, + [0x1F0F4]={ + category="so", + description="PLAYING CARD TRUMP-20", + direction="on", + linebreak="id", + unicodeslot=0x1F0F4, + }, + [0x1F0F5]={ + category="so", + description="PLAYING CARD TRUMP-21", + direction="on", + linebreak="id", + unicodeslot=0x1F0F5, + }, [0x1F100]={ category="no", cjkwd="a", description="DIGIT ZERO FULL STOP", direction="en", linebreak="ai", - specials={ "compat", 0x0030, 0x002E }, + specials={ "compat", 0x30, 0x2E }, unicodeslot=0x1F100, }, [0x1F101]={ @@ -178921,7 +196194,7 @@ characters.data={ description="DIGIT ZERO COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0030, 0x002C }, + specials={ "compat", 0x30, 0x2C }, unicodeslot=0x1F101, }, [0x1F102]={ @@ -178930,7 +196203,7 @@ characters.data={ description="DIGIT ONE COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0031, 0x002C }, + specials={ "compat", 0x31, 0x2C }, unicodeslot=0x1F102, }, [0x1F103]={ @@ -178939,7 +196212,7 @@ characters.data={ description="DIGIT TWO COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0032, 0x002C }, + specials={ "compat", 0x32, 0x2C }, unicodeslot=0x1F103, }, [0x1F104]={ @@ -178948,7 +196221,7 @@ characters.data={ description="DIGIT THREE COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0033, 0x002C }, + specials={ "compat", 0x33, 0x2C }, unicodeslot=0x1F104, }, [0x1F105]={ @@ -178957,7 +196230,7 @@ characters.data={ description="DIGIT FOUR COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0034, 0x002C }, + specials={ "compat", 0x34, 0x2C }, unicodeslot=0x1F105, }, [0x1F106]={ @@ -178966,7 +196239,7 @@ characters.data={ description="DIGIT FIVE COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0035, 0x002C }, + specials={ "compat", 0x35, 0x2C }, unicodeslot=0x1F106, }, [0x1F107]={ @@ -178975,7 +196248,7 @@ characters.data={ description="DIGIT SIX COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0036, 0x002C }, + specials={ "compat", 0x36, 0x2C }, unicodeslot=0x1F107, }, [0x1F108]={ @@ -178984,7 +196257,7 @@ characters.data={ description="DIGIT SEVEN COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0037, 0x002C }, + specials={ "compat", 0x37, 0x2C }, unicodeslot=0x1F108, }, [0x1F109]={ @@ -178993,7 +196266,7 @@ characters.data={ description="DIGIT EIGHT COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0038, 0x002C }, + specials={ "compat", 0x38, 0x2C }, unicodeslot=0x1F109, }, [0x1F10A]={ @@ -179002,16 +196275,30 @@ characters.data={ description="DIGIT NINE COMMA", direction="en", linebreak="ai", - specials={ "compat", 0x0039, 0x002C }, + specials={ "compat", 0x39, 0x2C }, unicodeslot=0x1F10A, }, + [0x1F10B]={ + category="no", + description="DINGBAT CIRCLED SANS-SERIF DIGIT ZERO", + direction="on", + linebreak="ai", + unicodeslot=0x1F10B, + }, + [0x1F10C]={ + category="no", + description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO", + direction="on", + linebreak="ai", + unicodeslot=0x1F10C, + }, [0x1F110]={ category="so", cjkwd="a", description="PARENTHESIZED LATIN CAPITAL LETTER A", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0041, 0x0029 }, + specials={ "compat", 0x28, 0x41, 0x29 }, unicodeslot=0x1F110, }, [0x1F111]={ @@ -179020,7 +196307,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER B", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0042, 0x0029 }, + specials={ "compat", 0x28, 0x42, 0x29 }, unicodeslot=0x1F111, }, [0x1F112]={ @@ -179029,7 +196316,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER C", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0043, 0x0029 }, + specials={ "compat", 0x28, 0x43, 0x29 }, unicodeslot=0x1F112, }, [0x1F113]={ @@ -179038,7 +196325,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER D", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0044, 0x0029 }, + specials={ "compat", 0x28, 0x44, 0x29 }, unicodeslot=0x1F113, }, [0x1F114]={ @@ -179047,7 +196334,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER E", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0045, 0x0029 }, + specials={ "compat", 0x28, 0x45, 0x29 }, unicodeslot=0x1F114, }, [0x1F115]={ @@ -179056,7 +196343,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER F", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0046, 0x0029 }, + specials={ "compat", 0x28, 0x46, 0x29 }, unicodeslot=0x1F115, }, [0x1F116]={ @@ -179065,7 +196352,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER G", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0047, 0x0029 }, + specials={ "compat", 0x28, 0x47, 0x29 }, unicodeslot=0x1F116, }, [0x1F117]={ @@ -179074,7 +196361,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER H", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0048, 0x0029 }, + specials={ "compat", 0x28, 0x48, 0x29 }, unicodeslot=0x1F117, }, [0x1F118]={ @@ -179083,7 +196370,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER I", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0049, 0x0029 }, + specials={ "compat", 0x28, 0x49, 0x29 }, unicodeslot=0x1F118, }, [0x1F119]={ @@ -179092,7 +196379,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER J", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004A, 0x0029 }, + specials={ "compat", 0x28, 0x4A, 0x29 }, unicodeslot=0x1F119, }, [0x1F11A]={ @@ -179101,7 +196388,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER K", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004B, 0x0029 }, + specials={ "compat", 0x28, 0x4B, 0x29 }, unicodeslot=0x1F11A, }, [0x1F11B]={ @@ -179110,7 +196397,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER L", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004C, 0x0029 }, + specials={ "compat", 0x28, 0x4C, 0x29 }, unicodeslot=0x1F11B, }, [0x1F11C]={ @@ -179119,7 +196406,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER M", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004D, 0x0029 }, + specials={ "compat", 0x28, 0x4D, 0x29 }, unicodeslot=0x1F11C, }, [0x1F11D]={ @@ -179128,7 +196415,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER N", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004E, 0x0029 }, + specials={ "compat", 0x28, 0x4E, 0x29 }, unicodeslot=0x1F11D, }, [0x1F11E]={ @@ -179137,7 +196424,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER O", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x004F, 0x0029 }, + specials={ "compat", 0x28, 0x4F, 0x29 }, unicodeslot=0x1F11E, }, [0x1F11F]={ @@ -179146,7 +196433,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER P", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0050, 0x0029 }, + specials={ "compat", 0x28, 0x50, 0x29 }, unicodeslot=0x1F11F, }, [0x1F120]={ @@ -179155,7 +196442,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER Q", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0051, 0x0029 }, + specials={ "compat", 0x28, 0x51, 0x29 }, unicodeslot=0x1F120, }, [0x1F121]={ @@ -179164,7 +196451,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER R", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0052, 0x0029 }, + specials={ "compat", 0x28, 0x52, 0x29 }, unicodeslot=0x1F121, }, [0x1F122]={ @@ -179173,7 +196460,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER S", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0053, 0x0029 }, + specials={ "compat", 0x28, 0x53, 0x29 }, unicodeslot=0x1F122, }, [0x1F123]={ @@ -179182,7 +196469,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER T", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0054, 0x0029 }, + specials={ "compat", 0x28, 0x54, 0x29 }, unicodeslot=0x1F123, }, [0x1F124]={ @@ -179191,7 +196478,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER U", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0055, 0x0029 }, + specials={ "compat", 0x28, 0x55, 0x29 }, unicodeslot=0x1F124, }, [0x1F125]={ @@ -179200,7 +196487,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER V", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0056, 0x0029 }, + specials={ "compat", 0x28, 0x56, 0x29 }, unicodeslot=0x1F125, }, [0x1F126]={ @@ -179209,7 +196496,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER W", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0057, 0x0029 }, + specials={ "compat", 0x28, 0x57, 0x29 }, unicodeslot=0x1F126, }, [0x1F127]={ @@ -179218,7 +196505,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER X", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0058, 0x0029 }, + specials={ "compat", 0x28, 0x58, 0x29 }, unicodeslot=0x1F127, }, [0x1F128]={ @@ -179227,7 +196514,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER Y", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x0059, 0x0029 }, + specials={ "compat", 0x28, 0x59, 0x29 }, unicodeslot=0x1F128, }, [0x1F129]={ @@ -179236,7 +196523,7 @@ characters.data={ description="PARENTHESIZED LATIN CAPITAL LETTER Z", direction="l", linebreak="ai", - specials={ "compat", 0x0028, 0x005A, 0x0029 }, + specials={ "compat", 0x28, 0x5A, 0x29 }, unicodeslot=0x1F129, }, [0x1F12A]={ @@ -179245,7 +196532,7 @@ characters.data={ description="TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S", direction="l", linebreak="ai", - specials={ "compat", 0x3014, 0x0053, 0x3015 }, + specials={ "compat", 0x3014, 0x53, 0x3015 }, unicodeslot=0x1F12A, }, [0x1F12B]={ @@ -179254,7 +196541,7 @@ characters.data={ description="CIRCLED ITALIC LATIN CAPITAL LETTER C", direction="l", linebreak="ai", - specials={ "circle", 0x0043 }, + specials={ "circle", 0x43 }, unicodeslot=0x1F12B, }, [0x1F12C]={ @@ -179263,7 +196550,7 @@ characters.data={ description="CIRCLED ITALIC LATIN CAPITAL LETTER R", direction="l", linebreak="ai", - specials={ "circle", 0x0052 }, + specials={ "circle", 0x52 }, unicodeslot=0x1F12C, }, [0x1F12D]={ @@ -179272,7 +196559,7 @@ characters.data={ description="CIRCLED CD", direction="l", linebreak="ai", - specials={ "circle", 0x0043, 0x0044 }, + specials={ "circle", 0x43, 0x44 }, unicodeslot=0x1F12D, }, [0x1F12E]={ @@ -179280,7 +196567,7 @@ characters.data={ description="CIRCLED WZ", direction="l", linebreak="al", - specials={ "circle", 0x0057, 0x005A }, + specials={ "circle", 0x57, 0x5A }, unicodeslot=0x1F12E, }, [0x1F130]={ @@ -179289,7 +196576,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER A", direction="l", linebreak="ai", - specials={ "square", 0x0041 }, + specials={ "square", 0x41 }, unicodeslot=0x1F130, }, [0x1F131]={ @@ -179298,7 +196585,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER B", direction="l", linebreak="ai", - specials={ "square", 0x0042 }, + specials={ "square", 0x42 }, unicodeslot=0x1F131, }, [0x1F132]={ @@ -179307,7 +196594,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER C", direction="l", linebreak="ai", - specials={ "square", 0x0043 }, + specials={ "square", 0x43 }, unicodeslot=0x1F132, }, [0x1F133]={ @@ -179316,7 +196603,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER D", direction="l", linebreak="ai", - specials={ "square", 0x0044 }, + specials={ "square", 0x44 }, unicodeslot=0x1F133, }, [0x1F134]={ @@ -179325,7 +196612,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER E", direction="l", linebreak="ai", - specials={ "square", 0x0045 }, + specials={ "square", 0x45 }, unicodeslot=0x1F134, }, [0x1F135]={ @@ -179334,7 +196621,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER F", direction="l", linebreak="ai", - specials={ "square", 0x0046 }, + specials={ "square", 0x46 }, unicodeslot=0x1F135, }, [0x1F136]={ @@ -179343,7 +196630,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER G", direction="l", linebreak="ai", - specials={ "square", 0x0047 }, + specials={ "square", 0x47 }, unicodeslot=0x1F136, }, [0x1F137]={ @@ -179352,7 +196639,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER H", direction="l", linebreak="ai", - specials={ "square", 0x0048 }, + specials={ "square", 0x48 }, unicodeslot=0x1F137, }, [0x1F138]={ @@ -179361,7 +196648,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER I", direction="l", linebreak="ai", - specials={ "square", 0x0049 }, + specials={ "square", 0x49 }, unicodeslot=0x1F138, }, [0x1F139]={ @@ -179370,7 +196657,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER J", direction="l", linebreak="ai", - specials={ "square", 0x004A }, + specials={ "square", 0x4A }, unicodeslot=0x1F139, }, [0x1F13A]={ @@ -179379,7 +196666,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER K", direction="l", linebreak="ai", - specials={ "square", 0x004B }, + specials={ "square", 0x4B }, unicodeslot=0x1F13A, }, [0x1F13B]={ @@ -179388,7 +196675,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER L", direction="l", linebreak="ai", - specials={ "square", 0x004C }, + specials={ "square", 0x4C }, unicodeslot=0x1F13B, }, [0x1F13C]={ @@ -179397,7 +196684,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER M", direction="l", linebreak="ai", - specials={ "square", 0x004D }, + specials={ "square", 0x4D }, unicodeslot=0x1F13C, }, [0x1F13D]={ @@ -179406,7 +196693,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER N", direction="l", linebreak="ai", - specials={ "square", 0x004E }, + specials={ "square", 0x4E }, unicodeslot=0x1F13D, }, [0x1F13E]={ @@ -179415,7 +196702,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER O", direction="l", linebreak="ai", - specials={ "square", 0x004F }, + specials={ "square", 0x4F }, unicodeslot=0x1F13E, }, [0x1F13F]={ @@ -179424,7 +196711,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER P", direction="l", linebreak="ai", - specials={ "square", 0x0050 }, + specials={ "square", 0x50 }, unicodeslot=0x1F13F, }, [0x1F140]={ @@ -179433,7 +196720,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER Q", direction="l", linebreak="ai", - specials={ "square", 0x0051 }, + specials={ "square", 0x51 }, unicodeslot=0x1F140, }, [0x1F141]={ @@ -179442,7 +196729,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER R", direction="l", linebreak="ai", - specials={ "square", 0x0052 }, + specials={ "square", 0x52 }, unicodeslot=0x1F141, }, [0x1F142]={ @@ -179451,7 +196738,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER S", direction="l", linebreak="ai", - specials={ "square", 0x0053 }, + specials={ "square", 0x53 }, unicodeslot=0x1F142, }, [0x1F143]={ @@ -179460,7 +196747,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER T", direction="l", linebreak="ai", - specials={ "square", 0x0054 }, + specials={ "square", 0x54 }, unicodeslot=0x1F143, }, [0x1F144]={ @@ -179469,7 +196756,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER U", direction="l", linebreak="ai", - specials={ "square", 0x0055 }, + specials={ "square", 0x55 }, unicodeslot=0x1F144, }, [0x1F145]={ @@ -179478,7 +196765,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER V", direction="l", linebreak="ai", - specials={ "square", 0x0056 }, + specials={ "square", 0x56 }, unicodeslot=0x1F145, }, [0x1F146]={ @@ -179487,7 +196774,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER W", direction="l", linebreak="ai", - specials={ "square", 0x0057 }, + specials={ "square", 0x57 }, unicodeslot=0x1F146, }, [0x1F147]={ @@ -179496,7 +196783,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER X", direction="l", linebreak="ai", - specials={ "square", 0x0058 }, + specials={ "square", 0x58 }, unicodeslot=0x1F147, }, [0x1F148]={ @@ -179505,7 +196792,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER Y", direction="l", linebreak="ai", - specials={ "square", 0x0059 }, + specials={ "square", 0x59 }, unicodeslot=0x1F148, }, [0x1F149]={ @@ -179514,7 +196801,7 @@ characters.data={ description="SQUARED LATIN CAPITAL LETTER Z", direction="l", linebreak="ai", - specials={ "square", 0x005A }, + specials={ "square", 0x5A }, unicodeslot=0x1F149, }, [0x1F14A]={ @@ -179523,7 +196810,7 @@ characters.data={ description="SQUARED HV", direction="l", linebreak="ai", - specials={ "square", 0x0048, 0x0056 }, + specials={ "square", 0x48, 0x56 }, unicodeslot=0x1F14A, }, [0x1F14B]={ @@ -179532,7 +196819,7 @@ characters.data={ description="SQUARED MV", direction="l", linebreak="ai", - specials={ "square", 0x004D, 0x0056 }, + specials={ "square", 0x4D, 0x56 }, unicodeslot=0x1F14B, }, [0x1F14C]={ @@ -179541,7 +196828,7 @@ characters.data={ description="SQUARED SD", direction="l", linebreak="ai", - specials={ "square", 0x0053, 0x0044 }, + specials={ "square", 0x53, 0x44 }, unicodeslot=0x1F14C, }, [0x1F14D]={ @@ -179550,7 +196837,7 @@ characters.data={ description="SQUARED SS", direction="l", linebreak="ai", - specials={ "square", 0x0053, 0x0053 }, + specials={ "square", 0x53, 0x53 }, unicodeslot=0x1F14D, }, [0x1F14E]={ @@ -179559,7 +196846,7 @@ characters.data={ description="SQUARED PPV", direction="l", linebreak="ai", - specials={ "square", 0x0050, 0x0050, 0x0056 }, + specials={ "square", 0x50, 0x50, 0x56 }, unicodeslot=0x1F14E, }, [0x1F14F]={ @@ -179568,7 +196855,7 @@ characters.data={ description="SQUARED WC", direction="l", linebreak="ai", - specials={ "square", 0x0057, 0x0043 }, + specials={ "square", 0x57, 0x43 }, unicodeslot=0x1F14F, }, [0x1F150]={ @@ -179784,7 +197071,7 @@ characters.data={ description="RAISED MC SIGN", direction="on", linebreak="al", - specials={ "super", 0x004D, 0x0043 }, + specials={ "super", 0x4D, 0x43 }, unicodeslot=0x1F16A, }, [0x1F16B]={ @@ -179792,7 +197079,7 @@ characters.data={ description="RAISED MD SIGN", direction="on", linebreak="al", - specials={ "super", 0x004D, 0x0044 }, + specials={ "super", 0x4D, 0x44 }, unicodeslot=0x1F16B, }, [0x1F170]={ @@ -180061,7 +197348,7 @@ characters.data={ description="SQUARE DJ", direction="l", linebreak="ai", - specials={ "square", 0x0044, 0x004A }, + specials={ "square", 0x44, 0x4A }, unicodeslot=0x1F190, }, [0x1F191]={ @@ -181078,6 +198365,90 @@ characters.data={ linebreak="id", unicodeslot=0x1F320, }, + [0x1F321]={ + category="so", + description="THERMOMETER", + direction="on", + linebreak="id", + unicodeslot=0x1F321, + }, + [0x1F322]={ + category="so", + description="BLACK DROPLET", + direction="on", + linebreak="id", + unicodeslot=0x1F322, + }, + [0x1F323]={ + category="so", + description="WHITE SUN", + direction="on", + linebreak="id", + unicodeslot=0x1F323, + }, + [0x1F324]={ + category="so", + description="WHITE SUN WITH SMALL CLOUD", + direction="on", + linebreak="id", + unicodeslot=0x1F324, + }, + [0x1F325]={ + category="so", + description="WHITE SUN BEHIND CLOUD", + direction="on", + linebreak="id", + unicodeslot=0x1F325, + }, + [0x1F326]={ + category="so", + description="WHITE SUN BEHIND CLOUD WITH RAIN", + direction="on", + linebreak="id", + unicodeslot=0x1F326, + }, + [0x1F327]={ + category="so", + description="CLOUD WITH RAIN", + direction="on", + linebreak="id", + unicodeslot=0x1F327, + }, + [0x1F328]={ + category="so", + description="CLOUD WITH SNOW", + direction="on", + linebreak="id", + unicodeslot=0x1F328, + }, + [0x1F329]={ + category="so", + description="CLOUD WITH LIGHTNING", + direction="on", + linebreak="id", + unicodeslot=0x1F329, + }, + [0x1F32A]={ + category="so", + description="CLOUD WITH TORNADO", + direction="on", + linebreak="id", + unicodeslot=0x1F32A, + }, + [0x1F32B]={ + category="so", + description="FOG", + direction="on", + linebreak="id", + unicodeslot=0x1F32B, + }, + [0x1F32C]={ + category="so", + description="WIND BLOWING FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F32C, + }, [0x1F330]={ category="so", description="CHESTNUT", @@ -181120,6 +198491,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F335, }, + [0x1F336]={ + category="so", + description="HOT PEPPER", + direction="on", + linebreak="id", + unicodeslot=0x1F336, + }, [0x1F337]={ category="so", description="TULIP", @@ -181610,6 +198988,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F37C, }, + [0x1F37D]={ + category="so", + description="FORK AND KNIFE WITH PLATE", + direction="on", + linebreak="id", + unicodeslot=0x1F37D, + }, [0x1F380]={ category="so", description="RIBBON", @@ -181750,6 +199135,90 @@ characters.data={ linebreak="id", unicodeslot=0x1F393, }, + [0x1F394]={ + category="so", + description="HEART WITH TIP ON THE LEFT", + direction="on", + linebreak="id", + unicodeslot=0x1F394, + }, + [0x1F395]={ + category="so", + description="BOUQUET OF FLOWERS", + direction="on", + linebreak="id", + unicodeslot=0x1F395, + }, + [0x1F396]={ + category="so", + description="MILITARY MEDAL", + direction="on", + linebreak="id", + unicodeslot=0x1F396, + }, + [0x1F397]={ + category="so", + description="REMINDER RIBBON", + direction="on", + linebreak="id", + unicodeslot=0x1F397, + }, + [0x1F398]={ + category="so", + description="MUSICAL KEYBOARD WITH JACKS", + direction="on", + linebreak="id", + unicodeslot=0x1F398, + }, + [0x1F399]={ + category="so", + description="STUDIO MICROPHONE", + direction="on", + linebreak="id", + unicodeslot=0x1F399, + }, + [0x1F39A]={ + category="so", + description="LEVEL SLIDER", + direction="on", + linebreak="id", + unicodeslot=0x1F39A, + }, + [0x1F39B]={ + category="so", + description="CONTROL KNOBS", + direction="on", + linebreak="id", + unicodeslot=0x1F39B, + }, + [0x1F39C]={ + category="so", + description="BEAMED ASCENDING MUSICAL NOTES", + direction="on", + linebreak="al", + unicodeslot=0x1F39C, + }, + [0x1F39D]={ + category="so", + description="BEAMED DESCENDING MUSICAL NOTES", + direction="on", + linebreak="al", + unicodeslot=0x1F39D, + }, + [0x1F39E]={ + category="so", + description="FILM FRAMES", + direction="on", + linebreak="id", + unicodeslot=0x1F39E, + }, + [0x1F39F]={ + category="so", + description="ADMISSION TICKETS", + direction="on", + linebreak="id", + unicodeslot=0x1F39F, + }, [0x1F3A0]={ category="so", description="CAROUSEL HORSE", @@ -182009,6 +199478,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F3C4, }, + [0x1F3C5]={ + category="so", + description="SPORTS MEDAL", + direction="on", + linebreak="id", + unicodeslot=0x1F3C5, + }, [0x1F3C6]={ category="so", description="TROPHY", @@ -182044,6 +199520,118 @@ characters.data={ linebreak="id", unicodeslot=0x1F3CA, }, + [0x1F3CB]={ + category="so", + description="WEIGHT LIFTER", + direction="on", + linebreak="id", + unicodeslot=0x1F3CB, + }, + [0x1F3CC]={ + category="so", + description="GOLFER", + direction="on", + linebreak="id", + unicodeslot=0x1F3CC, + }, + [0x1F3CD]={ + category="so", + description="RACING MOTORCYCLE", + direction="on", + linebreak="id", + unicodeslot=0x1F3CD, + }, + [0x1F3CE]={ + category="so", + description="RACING CAR", + direction="on", + linebreak="id", + unicodeslot=0x1F3CE, + }, + [0x1F3D4]={ + category="so", + description="SNOW CAPPED MOUNTAIN", + direction="on", + linebreak="id", + unicodeslot=0x1F3D4, + }, + [0x1F3D5]={ + category="so", + description="CAMPING", + direction="on", + linebreak="id", + unicodeslot=0x1F3D5, + }, + [0x1F3D6]={ + category="so", + description="BEACH WITH UMBRELLA", + direction="on", + linebreak="id", + unicodeslot=0x1F3D6, + }, + [0x1F3D7]={ + category="so", + description="BUILDING CONSTRUCTION", + direction="on", + linebreak="id", + unicodeslot=0x1F3D7, + }, + [0x1F3D8]={ + category="so", + description="HOUSE BUILDINGS", + direction="on", + linebreak="id", + unicodeslot=0x1F3D8, + }, + [0x1F3D9]={ + category="so", + description="CITYSCAPE", + direction="on", + linebreak="id", + unicodeslot=0x1F3D9, + }, + [0x1F3DA]={ + category="so", + description="DERELICT HOUSE BUILDING", + direction="on", + linebreak="id", + unicodeslot=0x1F3DA, + }, + [0x1F3DB]={ + category="so", + description="CLASSICAL BUILDING", + direction="on", + linebreak="id", + unicodeslot=0x1F3DB, + }, + [0x1F3DC]={ + category="so", + description="DESERT", + direction="on", + linebreak="id", + unicodeslot=0x1F3DC, + }, + [0x1F3DD]={ + category="so", + description="DESERT ISLAND", + direction="on", + linebreak="id", + unicodeslot=0x1F3DD, + }, + [0x1F3DE]={ + category="so", + description="NATIONAL PARK", + direction="on", + linebreak="id", + unicodeslot=0x1F3DE, + }, + [0x1F3DF]={ + category="so", + description="STADIUM", + direction="on", + linebreak="id", + unicodeslot=0x1F3DF, + }, [0x1F3E0]={ category="so", description="HOUSE BUILDING", @@ -182163,6 +199751,55 @@ characters.data={ linebreak="id", unicodeslot=0x1F3F0, }, + [0x1F3F1]={ + category="so", + description="WHITE PENNANT", + direction="on", + linebreak="id", + unicodeslot=0x1F3F1, + }, + [0x1F3F2]={ + category="so", + description="BLACK PENNANT", + direction="on", + linebreak="id", + unicodeslot=0x1F3F2, + }, + [0x1F3F3]={ + category="so", + description="WAVING WHITE FLAG", + direction="on", + linebreak="id", + unicodeslot=0x1F3F3, + }, + [0x1F3F4]={ + category="so", + description="WAVING BLACK FLAG", + direction="on", + linebreak="id", + unicodeslot=0x1F3F4, + }, + [0x1F3F5]={ + category="so", + description="ROSETTE", + direction="on", + linebreak="id", + unicodeslot=0x1F3F5, + }, + [0x1F3F6]={ + category="so", + description="BLACK ROSETTE", + direction="on", + linebreak="id", + unicodeslot=0x1F3F6, + }, + [0x1F3F7]={ + category="so", + description="LABEL", + direction="on", + linebreak="id", + unicodeslot=0x1F3F7, + }, [0x1F400]={ category="so", description="RAT", @@ -182604,6 +200241,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F43E, }, + [0x1F43F]={ + category="so", + description="CHIPMUNK", + direction="on", + linebreak="id", + unicodeslot=0x1F43F, + }, [0x1F440]={ category="so", description="EYES", @@ -182611,6 +200255,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F440, }, + [0x1F441]={ + category="so", + description="EYE", + direction="on", + linebreak="id", + unicodeslot=0x1F441, + }, [0x1F442]={ category="so", description="EAR", @@ -183885,6 +201536,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F4F7, }, + [0x1F4F8]={ + category="so", + description="CAMERA WITH FLASH", + direction="on", + linebreak="id", + unicodeslot=0x1F4F8, + }, [0x1F4F9]={ category="so", description="VIDEO CAMERA", @@ -183913,6 +201571,20 @@ characters.data={ linebreak="id", unicodeslot=0x1F4FC, }, + [0x1F4FD]={ + category="so", + description="FILM PROJECTOR", + direction="on", + linebreak="id", + unicodeslot=0x1F4FD, + }, + [0x1F4FE]={ + category="so", + description="PORTABLE STEREO", + direction="on", + linebreak="id", + unicodeslot=0x1F4FE, + }, [0x1F500]={ category="so", description="TWISTED RIGHTWARDS ARROWS", @@ -184347,6 +202019,20 @@ characters.data={ linebreak="al", unicodeslot=0x1F53D, }, + [0x1F53E]={ + category="so", + description="LOWER RIGHT SHADOWED WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F53E, + }, + [0x1F53F]={ + category="so", + description="UPPER RIGHT SHADOWED WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F53F, + }, [0x1F540]={ category="so", description="CIRCLED CROSS POMMEE", @@ -184375,6 +202061,55 @@ characters.data={ linebreak="al", unicodeslot=0x1F543, }, + [0x1F544]={ + category="so", + description="NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F544, + }, + [0x1F545]={ + category="so", + description="SYMBOL FOR MARKS CHAPTER", + direction="on", + linebreak="al", + unicodeslot=0x1F545, + }, + [0x1F546]={ + category="so", + description="WHITE LATIN CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F546, + }, + [0x1F547]={ + category="so", + description="HEAVY LATIN CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F547, + }, + [0x1F548]={ + category="so", + description="CELTIC CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F548, + }, + [0x1F549]={ + category="so", + description="OM SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x1F549, + }, + [0x1F54A]={ + category="so", + description="DOVE OF PEACE", + direction="on", + linebreak="id", + unicodeslot=0x1F54A, + }, [0x1F550]={ category="so", description="CLOCK FACE ONE OCLOCK", @@ -184543,6 +202278,1021 @@ characters.data={ linebreak="id", unicodeslot=0x1F567, }, + [0x1F568]={ + category="so", + description="RIGHT SPEAKER", + direction="on", + linebreak="id", + unicodeslot=0x1F568, + }, + [0x1F569]={ + category="so", + description="RIGHT SPEAKER WITH ONE SOUND WAVE", + direction="on", + linebreak="id", + unicodeslot=0x1F569, + }, + [0x1F56A]={ + category="so", + description="RIGHT SPEAKER WITH THREE SOUND WAVES", + direction="on", + linebreak="id", + unicodeslot=0x1F56A, + }, + [0x1F56B]={ + category="so", + description="BULLHORN", + direction="on", + linebreak="id", + unicodeslot=0x1F56B, + }, + [0x1F56C]={ + category="so", + description="BULLHORN WITH SOUND WAVES", + direction="on", + linebreak="id", + unicodeslot=0x1F56C, + }, + [0x1F56D]={ + category="so", + description="RINGING BELL", + direction="on", + linebreak="id", + unicodeslot=0x1F56D, + }, + [0x1F56E]={ + category="so", + description="BOOK", + direction="on", + linebreak="id", + unicodeslot=0x1F56E, + }, + [0x1F56F]={ + category="so", + description="CANDLE", + direction="on", + linebreak="id", + unicodeslot=0x1F56F, + }, + [0x1F570]={ + category="so", + description="MANTELPIECE CLOCK", + direction="on", + linebreak="id", + unicodeslot=0x1F570, + }, + [0x1F571]={ + category="so", + description="BLACK SKULL AND CROSSBONES", + direction="on", + linebreak="id", + unicodeslot=0x1F571, + }, + [0x1F572]={ + category="so", + description="NO PIRACY", + direction="on", + linebreak="id", + unicodeslot=0x1F572, + }, + [0x1F573]={ + category="so", + description="HOLE", + direction="on", + linebreak="id", + unicodeslot=0x1F573, + }, + [0x1F574]={ + category="so", + description="MAN IN BUSINESS SUIT LEVITATING", + direction="on", + linebreak="id", + unicodeslot=0x1F574, + }, + [0x1F575]={ + category="so", + description="SLEUTH OR SPY", + direction="on", + linebreak="id", + unicodeslot=0x1F575, + }, + [0x1F576]={ + category="so", + description="DARK SUNGLASSES", + direction="on", + linebreak="id", + unicodeslot=0x1F576, + }, + [0x1F577]={ + category="so", + description="SPIDER", + direction="on", + linebreak="id", + unicodeslot=0x1F577, + }, + [0x1F578]={ + category="so", + description="SPIDER WEB", + direction="on", + linebreak="id", + unicodeslot=0x1F578, + }, + [0x1F579]={ + category="so", + description="JOYSTICK", + direction="on", + linebreak="id", + unicodeslot=0x1F579, + }, + [0x1F57B]={ + category="so", + description="LEFT HAND TELEPHONE RECEIVER", + direction="on", + linebreak="id", + unicodeslot=0x1F57B, + }, + [0x1F57C]={ + category="so", + description="TELEPHONE RECEIVER WITH PAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F57C, + }, + [0x1F57D]={ + category="so", + description="RIGHT HAND TELEPHONE RECEIVER", + direction="on", + linebreak="id", + unicodeslot=0x1F57D, + }, + [0x1F57E]={ + category="so", + description="WHITE TOUCHTONE TELEPHONE", + direction="on", + linebreak="id", + unicodeslot=0x1F57E, + }, + [0x1F57F]={ + category="so", + description="BLACK TOUCHTONE TELEPHONE", + direction="on", + linebreak="id", + unicodeslot=0x1F57F, + }, + [0x1F580]={ + category="so", + description="TELEPHONE ON TOP OF MODEM", + direction="on", + linebreak="id", + unicodeslot=0x1F580, + }, + [0x1F581]={ + category="so", + description="CLAMSHELL MOBILE PHONE", + direction="on", + linebreak="id", + unicodeslot=0x1F581, + }, + [0x1F582]={ + category="so", + description="BACK OF ENVELOPE", + direction="on", + linebreak="id", + unicodeslot=0x1F582, + }, + [0x1F583]={ + category="so", + description="STAMPED ENVELOPE", + direction="on", + linebreak="id", + unicodeslot=0x1F583, + }, + [0x1F584]={ + category="so", + description="ENVELOPE WITH LIGHTNING", + direction="on", + linebreak="id", + unicodeslot=0x1F584, + }, + [0x1F585]={ + category="so", + description="FLYING ENVELOPE", + direction="on", + linebreak="id", + unicodeslot=0x1F585, + }, + [0x1F586]={ + category="so", + description="PEN OVER STAMPED ENVELOPE", + direction="on", + linebreak="id", + unicodeslot=0x1F586, + }, + [0x1F587]={ + category="so", + description="LINKED PAPERCLIPS", + direction="on", + linebreak="id", + unicodeslot=0x1F587, + }, + [0x1F588]={ + category="so", + description="BLACK PUSHPIN", + direction="on", + linebreak="id", + unicodeslot=0x1F588, + }, + [0x1F589]={ + category="so", + description="LOWER LEFT PENCIL", + direction="on", + linebreak="id", + unicodeslot=0x1F589, + }, + [0x1F58A]={ + category="so", + description="LOWER LEFT BALLPOINT PEN", + direction="on", + linebreak="id", + unicodeslot=0x1F58A, + }, + [0x1F58B]={ + category="so", + description="LOWER LEFT FOUNTAIN PEN", + direction="on", + linebreak="id", + unicodeslot=0x1F58B, + }, + [0x1F58C]={ + category="so", + description="LOWER LEFT PAINTBRUSH", + direction="on", + linebreak="id", + unicodeslot=0x1F58C, + }, + [0x1F58D]={ + category="so", + description="LOWER LEFT CRAYON", + direction="on", + linebreak="id", + unicodeslot=0x1F58D, + }, + [0x1F58E]={ + category="so", + description="LEFT WRITING HAND", + direction="on", + linebreak="id", + unicodeslot=0x1F58E, + }, + [0x1F58F]={ + category="so", + description="TURNED OK HAND SIGN", + direction="on", + linebreak="id", + unicodeslot=0x1F58F, + }, + [0x1F590]={ + category="so", + description="RAISED HAND WITH FINGERS SPLAYED", + direction="on", + linebreak="id", + unicodeslot=0x1F590, + }, + [0x1F591]={ + category="so", + description="REVERSED RAISED HAND WITH FINGERS SPLAYED", + direction="on", + linebreak="id", + unicodeslot=0x1F591, + }, + [0x1F592]={ + category="so", + description="REVERSED THUMBS UP SIGN", + direction="on", + linebreak="id", + unicodeslot=0x1F592, + }, + [0x1F593]={ + category="so", + description="REVERSED THUMBS DOWN SIGN", + direction="on", + linebreak="id", + unicodeslot=0x1F593, + }, + [0x1F594]={ + category="so", + description="REVERSED VICTORY HAND", + direction="on", + linebreak="id", + unicodeslot=0x1F594, + }, + [0x1F595]={ + category="so", + description="REVERSED HAND WITH MIDDLE FINGER EXTENDED", + direction="on", + linebreak="id", + unicodeslot=0x1F595, + }, + [0x1F596]={ + category="so", + description="RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS", + direction="on", + linebreak="id", + unicodeslot=0x1F596, + }, + [0x1F597]={ + category="so", + description="WHITE DOWN POINTING LEFT HAND INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F597, + }, + [0x1F598]={ + category="so", + description="SIDEWAYS WHITE LEFT POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F598, + }, + [0x1F599]={ + category="so", + description="SIDEWAYS WHITE RIGHT POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F599, + }, + [0x1F59A]={ + category="so", + description="SIDEWAYS BLACK LEFT POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59A, + }, + [0x1F59B]={ + category="so", + description="SIDEWAYS BLACK RIGHT POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59B, + }, + [0x1F59C]={ + category="so", + description="BLACK LEFT POINTING BACKHAND INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59C, + }, + [0x1F59D]={ + category="so", + description="BLACK RIGHT POINTING BACKHAND INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59D, + }, + [0x1F59E]={ + category="so", + description="SIDEWAYS WHITE UP POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59E, + }, + [0x1F59F]={ + category="so", + description="SIDEWAYS WHITE DOWN POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F59F, + }, + [0x1F5A0]={ + category="so", + description="SIDEWAYS BLACK UP POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F5A0, + }, + [0x1F5A1]={ + category="so", + description="SIDEWAYS BLACK DOWN POINTING INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F5A1, + }, + [0x1F5A2]={ + category="so", + description="BLACK UP POINTING BACKHAND INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F5A2, + }, + [0x1F5A3]={ + category="so", + description="BLACK DOWN POINTING BACKHAND INDEX", + direction="on", + linebreak="id", + unicodeslot=0x1F5A3, + }, + [0x1F5A5]={ + category="so", + description="DESKTOP COMPUTER", + direction="on", + linebreak="id", + unicodeslot=0x1F5A5, + }, + [0x1F5A6]={ + category="so", + description="KEYBOARD AND MOUSE", + direction="on", + linebreak="id", + unicodeslot=0x1F5A6, + }, + [0x1F5A7]={ + category="so", + description="THREE NETWORKED COMPUTERS", + direction="on", + linebreak="id", + unicodeslot=0x1F5A7, + }, + [0x1F5A8]={ + category="so", + description="PRINTER", + direction="on", + linebreak="id", + unicodeslot=0x1F5A8, + }, + [0x1F5A9]={ + category="so", + description="POCKET CALCULATOR", + direction="on", + linebreak="id", + unicodeslot=0x1F5A9, + }, + [0x1F5AA]={ + category="so", + description="BLACK HARD SHELL FLOPPY DISK", + direction="on", + linebreak="id", + unicodeslot=0x1F5AA, + }, + [0x1F5AB]={ + category="so", + description="WHITE HARD SHELL FLOPPY DISK", + direction="on", + linebreak="id", + unicodeslot=0x1F5AB, + }, + [0x1F5AC]={ + category="so", + description="SOFT SHELL FLOPPY DISK", + direction="on", + linebreak="id", + unicodeslot=0x1F5AC, + }, + [0x1F5AD]={ + category="so", + description="TAPE CARTRIDGE", + direction="on", + linebreak="id", + unicodeslot=0x1F5AD, + }, + [0x1F5AE]={ + category="so", + description="WIRED KEYBOARD", + direction="on", + linebreak="id", + unicodeslot=0x1F5AE, + }, + [0x1F5AF]={ + category="so", + description="ONE BUTTON MOUSE", + direction="on", + linebreak="id", + unicodeslot=0x1F5AF, + }, + [0x1F5B0]={ + category="so", + description="TWO BUTTON MOUSE", + direction="on", + linebreak="id", + unicodeslot=0x1F5B0, + }, + [0x1F5B1]={ + category="so", + description="THREE BUTTON MOUSE", + direction="on", + linebreak="id", + unicodeslot=0x1F5B1, + }, + [0x1F5B2]={ + category="so", + description="TRACKBALL", + direction="on", + linebreak="id", + unicodeslot=0x1F5B2, + }, + [0x1F5B3]={ + category="so", + description="OLD PERSONAL COMPUTER", + direction="on", + linebreak="id", + unicodeslot=0x1F5B3, + }, + [0x1F5B4]={ + category="so", + description="HARD DISK", + direction="on", + linebreak="id", + unicodeslot=0x1F5B4, + }, + [0x1F5B5]={ + category="so", + description="SCREEN", + direction="on", + linebreak="id", + unicodeslot=0x1F5B5, + }, + [0x1F5B6]={ + category="so", + description="PRINTER ICON", + direction="on", + linebreak="id", + unicodeslot=0x1F5B6, + }, + [0x1F5B7]={ + category="so", + description="FAX ICON", + direction="on", + linebreak="id", + unicodeslot=0x1F5B7, + }, + [0x1F5B8]={ + category="so", + description="OPTICAL DISC ICON", + direction="on", + linebreak="id", + unicodeslot=0x1F5B8, + }, + [0x1F5B9]={ + category="so", + description="DOCUMENT WITH TEXT", + direction="on", + linebreak="id", + unicodeslot=0x1F5B9, + }, + [0x1F5BA]={ + category="so", + description="DOCUMENT WITH TEXT AND PICTURE", + direction="on", + linebreak="id", + unicodeslot=0x1F5BA, + }, + [0x1F5BB]={ + category="so", + description="DOCUMENT WITH PICTURE", + direction="on", + linebreak="id", + unicodeslot=0x1F5BB, + }, + [0x1F5BC]={ + category="so", + description="FRAME WITH PICTURE", + direction="on", + linebreak="id", + unicodeslot=0x1F5BC, + }, + [0x1F5BD]={ + category="so", + description="FRAME WITH TILES", + direction="on", + linebreak="id", + unicodeslot=0x1F5BD, + }, + [0x1F5BE]={ + category="so", + description="FRAME WITH AN X", + direction="on", + linebreak="id", + unicodeslot=0x1F5BE, + }, + [0x1F5BF]={ + category="so", + description="BLACK FOLDER", + direction="on", + linebreak="id", + unicodeslot=0x1F5BF, + }, + [0x1F5C0]={ + category="so", + description="FOLDER", + direction="on", + linebreak="id", + unicodeslot=0x1F5C0, + }, + [0x1F5C1]={ + category="so", + description="OPEN FOLDER", + direction="on", + linebreak="id", + unicodeslot=0x1F5C1, + }, + [0x1F5C2]={ + category="so", + description="CARD INDEX DIVIDERS", + direction="on", + linebreak="id", + unicodeslot=0x1F5C2, + }, + [0x1F5C3]={ + category="so", + description="CARD FILE BOX", + direction="on", + linebreak="id", + unicodeslot=0x1F5C3, + }, + [0x1F5C4]={ + category="so", + description="FILE CABINET", + direction="on", + linebreak="id", + unicodeslot=0x1F5C4, + }, + [0x1F5C5]={ + category="so", + description="EMPTY NOTE", + direction="on", + linebreak="id", + unicodeslot=0x1F5C5, + }, + [0x1F5C6]={ + category="so", + description="EMPTY NOTE PAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F5C6, + }, + [0x1F5C7]={ + category="so", + description="EMPTY NOTE PAD", + direction="on", + linebreak="id", + unicodeslot=0x1F5C7, + }, + [0x1F5C8]={ + category="so", + description="NOTE", + direction="on", + linebreak="id", + unicodeslot=0x1F5C8, + }, + [0x1F5C9]={ + category="so", + description="NOTE PAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F5C9, + }, + [0x1F5CA]={ + category="so", + description="NOTE PAD", + direction="on", + linebreak="id", + unicodeslot=0x1F5CA, + }, + [0x1F5CB]={ + category="so", + description="EMPTY DOCUMENT", + direction="on", + linebreak="id", + unicodeslot=0x1F5CB, + }, + [0x1F5CC]={ + category="so", + description="EMPTY PAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F5CC, + }, + [0x1F5CD]={ + category="so", + description="EMPTY PAGES", + direction="on", + linebreak="id", + unicodeslot=0x1F5CD, + }, + [0x1F5CE]={ + category="so", + description="DOCUMENT", + direction="on", + linebreak="id", + unicodeslot=0x1F5CE, + }, + [0x1F5CF]={ + category="so", + description="PAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F5CF, + }, + [0x1F5D0]={ + category="so", + description="PAGES", + direction="on", + linebreak="id", + unicodeslot=0x1F5D0, + }, + [0x1F5D1]={ + category="so", + description="WASTEBASKET", + direction="on", + linebreak="id", + unicodeslot=0x1F5D1, + }, + [0x1F5D2]={ + category="so", + description="SPIRAL NOTE PAD", + direction="on", + linebreak="id", + unicodeslot=0x1F5D2, + }, + [0x1F5D3]={ + category="so", + description="SPIRAL CALENDAR PAD", + direction="on", + linebreak="id", + unicodeslot=0x1F5D3, + }, + [0x1F5D4]={ + category="so", + description="DESKTOP WINDOW", + direction="on", + linebreak="al", + unicodeslot=0x1F5D4, + }, + [0x1F5D5]={ + category="so", + description="MINIMIZE", + direction="on", + linebreak="al", + unicodeslot=0x1F5D5, + }, + [0x1F5D6]={ + category="so", + description="MAXIMIZE", + direction="on", + linebreak="al", + unicodeslot=0x1F5D6, + }, + [0x1F5D7]={ + category="so", + description="OVERLAP", + direction="on", + linebreak="al", + unicodeslot=0x1F5D7, + }, + [0x1F5D8]={ + category="so", + description="CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS", + direction="on", + linebreak="al", + unicodeslot=0x1F5D8, + }, + [0x1F5D9]={ + category="so", + description="CANCELLATION X", + direction="on", + linebreak="al", + unicodeslot=0x1F5D9, + }, + [0x1F5DA]={ + category="so", + description="INCREASE FONT SIZE SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x1F5DA, + }, + [0x1F5DB]={ + category="so", + description="DECREASE FONT SIZE SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x1F5DB, + }, + [0x1F5DC]={ + category="so", + description="COMPRESSION", + direction="on", + linebreak="id", + unicodeslot=0x1F5DC, + }, + [0x1F5DD]={ + category="so", + description="OLD KEY", + direction="on", + linebreak="id", + unicodeslot=0x1F5DD, + }, + [0x1F5DE]={ + category="so", + description="ROLLED-UP NEWSPAPER", + direction="on", + linebreak="id", + unicodeslot=0x1F5DE, + }, + [0x1F5DF]={ + category="so", + description="PAGE WITH CIRCLED TEXT", + direction="on", + linebreak="id", + unicodeslot=0x1F5DF, + }, + [0x1F5E0]={ + category="so", + description="STOCK CHART", + direction="on", + linebreak="id", + unicodeslot=0x1F5E0, + }, + [0x1F5E1]={ + category="so", + description="DAGGER KNIFE", + direction="on", + linebreak="id", + unicodeslot=0x1F5E1, + }, + [0x1F5E2]={ + category="so", + description="LIPS", + direction="on", + linebreak="id", + unicodeslot=0x1F5E2, + }, + [0x1F5E3]={ + category="so", + description="SPEAKING HEAD IN SILHOUETTE", + direction="on", + linebreak="id", + unicodeslot=0x1F5E3, + }, + [0x1F5E4]={ + category="so", + description="THREE RAYS ABOVE", + direction="on", + linebreak="id", + unicodeslot=0x1F5E4, + }, + [0x1F5E5]={ + category="so", + description="THREE RAYS BELOW", + direction="on", + linebreak="id", + unicodeslot=0x1F5E5, + }, + [0x1F5E6]={ + category="so", + description="THREE RAYS LEFT", + direction="on", + linebreak="id", + unicodeslot=0x1F5E6, + }, + [0x1F5E7]={ + category="so", + description="THREE RAYS RIGHT", + direction="on", + linebreak="id", + unicodeslot=0x1F5E7, + }, + [0x1F5E8]={ + category="so", + description="LEFT SPEECH BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5E8, + }, + [0x1F5E9]={ + category="so", + description="RIGHT SPEECH BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5E9, + }, + [0x1F5EA]={ + category="so", + description="TWO SPEECH BUBBLES", + direction="on", + linebreak="id", + unicodeslot=0x1F5EA, + }, + [0x1F5EB]={ + category="so", + description="THREE SPEECH BUBBLES", + direction="on", + linebreak="id", + unicodeslot=0x1F5EB, + }, + [0x1F5EC]={ + category="so", + description="LEFT THOUGHT BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5EC, + }, + [0x1F5ED]={ + category="so", + description="RIGHT THOUGHT BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5ED, + }, + [0x1F5EE]={ + category="so", + description="LEFT ANGER BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5EE, + }, + [0x1F5EF]={ + category="so", + description="RIGHT ANGER BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5EF, + }, + [0x1F5F0]={ + category="so", + description="MOOD BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5F0, + }, + [0x1F5F1]={ + category="so", + description="LIGHTNING MOOD BUBBLE", + direction="on", + linebreak="id", + unicodeslot=0x1F5F1, + }, + [0x1F5F2]={ + category="so", + description="LIGHTNING MOOD", + direction="on", + linebreak="id", + unicodeslot=0x1F5F2, + }, + [0x1F5F3]={ + category="so", + description="BALLOT BOX WITH BALLOT", + direction="on", + linebreak="id", + unicodeslot=0x1F5F3, + }, + [0x1F5F4]={ + category="so", + description="BALLOT SCRIPT X", + direction="on", + linebreak="al", + unicodeslot=0x1F5F4, + }, + [0x1F5F5]={ + category="so", + description="BALLOT BOX WITH SCRIPT X", + direction="on", + linebreak="al", + unicodeslot=0x1F5F5, + }, + [0x1F5F6]={ + category="so", + description="BALLOT BOLD SCRIPT X", + direction="on", + linebreak="al", + unicodeslot=0x1F5F6, + }, + [0x1F5F7]={ + category="so", + description="BALLOT BOX WITH BOLD SCRIPT X", + direction="on", + linebreak="al", + unicodeslot=0x1F5F7, + }, + [0x1F5F8]={ + category="so", + description="LIGHT CHECK MARK", + direction="on", + linebreak="al", + unicodeslot=0x1F5F8, + }, + [0x1F5F9]={ + category="so", + description="BALLOT BOX WITH BOLD CHECK", + direction="on", + linebreak="al", + unicodeslot=0x1F5F9, + }, + [0x1F5FA]={ + category="so", + description="WORLD MAP", + direction="on", + linebreak="id", + unicodeslot=0x1F5FA, + }, [0x1F5FB]={ category="so", description="MOUNT FUJI", @@ -185033,6 +203783,20 @@ characters.data={ linebreak="id", unicodeslot=0x1F640, }, + [0x1F641]={ + category="so", + description="SLIGHTLY FROWNING FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F641, + }, + [0x1F642]={ + category="so", + description="SLIGHTLY SMILING FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F642, + }, [0x1F645]={ category="so", description="FACE WITH NO GOOD GESTURE", @@ -185110,6 +203874,342 @@ characters.data={ linebreak="id", unicodeslot=0x1F64F, }, + [0x1F650]={ + category="so", + description="NORTH WEST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F650, + }, + [0x1F651]={ + category="so", + description="SOUTH WEST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F651, + }, + [0x1F652]={ + category="so", + description="NORTH EAST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F652, + }, + [0x1F653]={ + category="so", + description="SOUTH EAST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F653, + }, + [0x1F654]={ + category="so", + description="TURNED NORTH WEST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F654, + }, + [0x1F655]={ + category="so", + description="TURNED SOUTH WEST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F655, + }, + [0x1F656]={ + category="so", + description="TURNED NORTH EAST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F656, + }, + [0x1F657]={ + category="so", + description="TURNED SOUTH EAST POINTING LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F657, + }, + [0x1F658]={ + category="so", + description="NORTH WEST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F658, + }, + [0x1F659]={ + category="so", + description="SOUTH WEST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F659, + }, + [0x1F65A]={ + category="so", + description="NORTH EAST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65A, + }, + [0x1F65B]={ + category="so", + description="SOUTH EAST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65B, + }, + [0x1F65C]={ + category="so", + description="HEAVY NORTH WEST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65C, + }, + [0x1F65D]={ + category="so", + description="HEAVY SOUTH WEST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65D, + }, + [0x1F65E]={ + category="so", + description="HEAVY NORTH EAST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65E, + }, + [0x1F65F]={ + category="so", + description="HEAVY SOUTH EAST POINTING VINE LEAF", + direction="on", + linebreak="al", + unicodeslot=0x1F65F, + }, + [0x1F660]={ + category="so", + description="NORTH WEST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F660, + }, + [0x1F661]={ + category="so", + description="SOUTH WEST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F661, + }, + [0x1F662]={ + category="so", + description="NORTH EAST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F662, + }, + [0x1F663]={ + category="so", + description="SOUTH EAST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F663, + }, + [0x1F664]={ + category="so", + description="HEAVY NORTH WEST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F664, + }, + [0x1F665]={ + category="so", + description="HEAVY SOUTH WEST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F665, + }, + [0x1F666]={ + category="so", + description="HEAVY NORTH EAST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F666, + }, + [0x1F667]={ + category="so", + description="HEAVY SOUTH EAST POINTING BUD", + direction="on", + linebreak="al", + unicodeslot=0x1F667, + }, + [0x1F668]={ + category="so", + description="HOLLOW QUILT SQUARE ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F668, + }, + [0x1F669]={ + category="so", + description="HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F669, + }, + [0x1F66A]={ + category="so", + description="SOLID QUILT SQUARE ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F66A, + }, + [0x1F66B]={ + category="so", + description="SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F66B, + }, + [0x1F66C]={ + category="so", + description="LEFTWARDS ROCKET", + direction="on", + linebreak="al", + unicodeslot=0x1F66C, + }, + [0x1F66D]={ + category="so", + description="UPWARDS ROCKET", + direction="on", + linebreak="al", + unicodeslot=0x1F66D, + }, + [0x1F66E]={ + category="so", + description="RIGHTWARDS ROCKET", + direction="on", + linebreak="al", + unicodeslot=0x1F66E, + }, + [0x1F66F]={ + category="so", + description="DOWNWARDS ROCKET", + direction="on", + linebreak="al", + unicodeslot=0x1F66F, + }, + [0x1F670]={ + category="so", + description="SCRIPT LIGATURE ET ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F670, + }, + [0x1F671]={ + category="so", + description="HEAVY SCRIPT LIGATURE ET ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F671, + }, + [0x1F672]={ + category="so", + description="LIGATURE OPEN ET ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F672, + }, + [0x1F673]={ + category="so", + description="HEAVY LIGATURE OPEN ET ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F673, + }, + [0x1F674]={ + category="so", + description="HEAVY AMPERSAND ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F674, + }, + [0x1F675]={ + category="so", + description="SWASH AMPERSAND ORNAMENT", + direction="on", + linebreak="al", + unicodeslot=0x1F675, + }, + [0x1F676]={ + category="so", + description="SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT", + direction="on", + linebreak="qu", + unicodeslot=0x1F676, + }, + [0x1F677]={ + category="so", + description="SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT", + direction="on", + linebreak="qu", + unicodeslot=0x1F677, + }, + [0x1F678]={ + category="so", + description="SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT", + direction="on", + linebreak="qu", + unicodeslot=0x1F678, + }, + [0x1F679]={ + category="so", + description="HEAVY INTERROBANG ORNAMENT", + direction="on", + linebreak="ns", + unicodeslot=0x1F679, + }, + [0x1F67A]={ + category="so", + description="SANS-SERIF INTERROBANG ORNAMENT", + direction="on", + linebreak="ns", + unicodeslot=0x1F67A, + }, + [0x1F67B]={ + category="so", + description="HEAVY SANS-SERIF INTERROBANG ORNAMENT", + direction="on", + linebreak="ns", + unicodeslot=0x1F67B, + }, + [0x1F67C]={ + category="so", + description="VERY HEAVY SOLIDUS", + direction="on", + linebreak="al", + unicodeslot=0x1F67C, + }, + [0x1F67D]={ + category="so", + description="VERY HEAVY REVERSE SOLIDUS", + direction="on", + linebreak="al", + unicodeslot=0x1F67D, + }, + [0x1F67E]={ + category="so", + description="CHECKER BOARD", + direction="on", + linebreak="al", + unicodeslot=0x1F67E, + }, + [0x1F67F]={ + category="so", + description="REVERSE CHECKER BOARD", + direction="on", + linebreak="al", + unicodeslot=0x1F67F, + }, [0x1F680]={ category="so", description="ROCKET", @@ -185399,206 +204499,395 @@ characters.data={ }, [0x1F6A9]={ category="so", - description="TRIANGULAR FLAG ON POST", + description="TRIANGULAR FLAG ON POST", + direction="on", + linebreak="id", + unicodeslot=0x1F6A9, + }, + [0x1F6AA]={ + category="so", + description="DOOR", + direction="on", + linebreak="id", + unicodeslot=0x1F6AA, + }, + [0x1F6AB]={ + category="so", + description="NO ENTRY SIGN", + direction="on", + linebreak="id", + unicodeslot=0x1F6AB, + }, + [0x1F6AC]={ + category="so", + description="SMOKING SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6AC, + }, + [0x1F6AD]={ + category="so", + description="NO SMOKING SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6AD, + }, + [0x1F6AE]={ + category="so", + description="PUT LITTER IN ITS PLACE SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6AE, + }, + [0x1F6AF]={ + category="so", + description="DO NOT LITTER SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6AF, + }, + [0x1F6B0]={ + category="so", + description="POTABLE WATER SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6B0, + }, + [0x1F6B1]={ + category="so", + description="NON-POTABLE WATER SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6B1, + }, + [0x1F6B2]={ + category="so", + description="BICYCLE", + direction="on", + linebreak="id", + unicodeslot=0x1F6B2, + }, + [0x1F6B3]={ + category="so", + description="NO BICYCLES", + direction="on", + linebreak="id", + unicodeslot=0x1F6B3, + }, + [0x1F6B4]={ + category="so", + description="BICYCLIST", + direction="on", + linebreak="id", + unicodeslot=0x1F6B4, + }, + [0x1F6B5]={ + category="so", + description="MOUNTAIN BICYCLIST", + direction="on", + linebreak="id", + unicodeslot=0x1F6B5, + }, + [0x1F6B6]={ + category="so", + description="PEDESTRIAN", + direction="on", + linebreak="id", + unicodeslot=0x1F6B6, + }, + [0x1F6B7]={ + category="so", + description="NO PEDESTRIANS", + direction="on", + linebreak="id", + unicodeslot=0x1F6B7, + }, + [0x1F6B8]={ + category="so", + description="CHILDREN CROSSING", + direction="on", + linebreak="id", + unicodeslot=0x1F6B8, + }, + [0x1F6B9]={ + category="so", + description="MENS SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6B9, + }, + [0x1F6BA]={ + category="so", + description="WOMENS SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6BA, + }, + [0x1F6BB]={ + category="so", + description="RESTROOM", + direction="on", + linebreak="id", + unicodeslot=0x1F6BB, + }, + [0x1F6BC]={ + category="so", + description="BABY SYMBOL", + direction="on", + linebreak="id", + unicodeslot=0x1F6BC, + }, + [0x1F6BD]={ + category="so", + description="TOILET", + direction="on", + linebreak="id", + unicodeslot=0x1F6BD, + }, + [0x1F6BE]={ + category="so", + description="WATER CLOSET", + direction="on", + linebreak="id", + unicodeslot=0x1F6BE, + }, + [0x1F6BF]={ + category="so", + description="SHOWER", + direction="on", + linebreak="id", + unicodeslot=0x1F6BF, + }, + [0x1F6C0]={ + category="so", + description="BATH", + direction="on", + linebreak="id", + unicodeslot=0x1F6C0, + }, + [0x1F6C1]={ + category="so", + description="BATHTUB", + direction="on", + linebreak="id", + unicodeslot=0x1F6C1, + }, + [0x1F6C2]={ + category="so", + description="PASSPORT CONTROL", + direction="on", + linebreak="id", + unicodeslot=0x1F6C2, + }, + [0x1F6C3]={ + category="so", + description="CUSTOMS", + direction="on", + linebreak="id", + unicodeslot=0x1F6C3, + }, + [0x1F6C4]={ + category="so", + description="BAGGAGE CLAIM", direction="on", linebreak="id", - unicodeslot=0x1F6A9, + unicodeslot=0x1F6C4, }, - [0x1F6AA]={ + [0x1F6C5]={ category="so", - description="DOOR", + description="LEFT LUGGAGE", direction="on", linebreak="id", - unicodeslot=0x1F6AA, + unicodeslot=0x1F6C5, }, - [0x1F6AB]={ + [0x1F6C6]={ category="so", - description="NO ENTRY SIGN", + description="TRIANGLE WITH ROUNDED CORNERS", direction="on", linebreak="id", - unicodeslot=0x1F6AB, + unicodeslot=0x1F6C6, }, - [0x1F6AC]={ + [0x1F6C7]={ category="so", - description="SMOKING SYMBOL", + description="PROHIBITED SIGN", direction="on", linebreak="id", - unicodeslot=0x1F6AC, + unicodeslot=0x1F6C7, }, - [0x1F6AD]={ + [0x1F6C8]={ category="so", - description="NO SMOKING SYMBOL", + description="CIRCLED INFORMATION SOURCE", direction="on", linebreak="id", - unicodeslot=0x1F6AD, + unicodeslot=0x1F6C8, }, - [0x1F6AE]={ + [0x1F6C9]={ category="so", - description="PUT LITTER IN ITS PLACE SYMBOL", + description="BOYS SYMBOL", direction="on", linebreak="id", - unicodeslot=0x1F6AE, + unicodeslot=0x1F6C9, }, - [0x1F6AF]={ + [0x1F6CA]={ category="so", - description="DO NOT LITTER SYMBOL", + description="GIRLS SYMBOL", direction="on", linebreak="id", - unicodeslot=0x1F6AF, + unicodeslot=0x1F6CA, }, - [0x1F6B0]={ + [0x1F6CB]={ category="so", - description="POTABLE WATER SYMBOL", + description="COUCH AND LAMP", direction="on", linebreak="id", - unicodeslot=0x1F6B0, + unicodeslot=0x1F6CB, }, - [0x1F6B1]={ + [0x1F6CC]={ category="so", - description="NON-POTABLE WATER SYMBOL", + description="SLEEPING ACCOMMODATION", direction="on", linebreak="id", - unicodeslot=0x1F6B1, + unicodeslot=0x1F6CC, }, - [0x1F6B2]={ + [0x1F6CD]={ category="so", - description="BICYCLE", + description="SHOPPING BAGS", direction="on", linebreak="id", - unicodeslot=0x1F6B2, + unicodeslot=0x1F6CD, }, - [0x1F6B3]={ + [0x1F6CE]={ category="so", - description="NO BICYCLES", + description="BELLHOP BELL", direction="on", linebreak="id", - unicodeslot=0x1F6B3, + unicodeslot=0x1F6CE, }, - [0x1F6B4]={ + [0x1F6CF]={ category="so", - description="BICYCLIST", + description="BED", direction="on", linebreak="id", - unicodeslot=0x1F6B4, + unicodeslot=0x1F6CF, }, - [0x1F6B5]={ + [0x1F6E0]={ category="so", - description="MOUNTAIN BICYCLIST", + description="HAMMER AND WRENCH", direction="on", linebreak="id", - unicodeslot=0x1F6B5, + unicodeslot=0x1F6E0, }, - [0x1F6B6]={ + [0x1F6E1]={ category="so", - description="PEDESTRIAN", + description="SHIELD", direction="on", linebreak="id", - unicodeslot=0x1F6B6, + unicodeslot=0x1F6E1, }, - [0x1F6B7]={ + [0x1F6E2]={ category="so", - description="NO PEDESTRIANS", + description="OIL DRUM", direction="on", linebreak="id", - unicodeslot=0x1F6B7, + unicodeslot=0x1F6E2, }, - [0x1F6B8]={ + [0x1F6E3]={ category="so", - description="CHILDREN CROSSING", + description="MOTORWAY", direction="on", linebreak="id", - unicodeslot=0x1F6B8, + unicodeslot=0x1F6E3, }, - [0x1F6B9]={ + [0x1F6E4]={ category="so", - description="MENS SYMBOL", + description="RAILWAY TRACK", direction="on", linebreak="id", - unicodeslot=0x1F6B9, + unicodeslot=0x1F6E4, }, - [0x1F6BA]={ + [0x1F6E5]={ category="so", - description="WOMENS SYMBOL", + description="MOTOR BOAT", direction="on", linebreak="id", - unicodeslot=0x1F6BA, + unicodeslot=0x1F6E5, }, - [0x1F6BB]={ + [0x1F6E6]={ category="so", - description="RESTROOM", + description="UP-POINTING MILITARY AIRPLANE", direction="on", linebreak="id", - unicodeslot=0x1F6BB, + unicodeslot=0x1F6E6, }, - [0x1F6BC]={ + [0x1F6E7]={ category="so", - description="BABY SYMBOL", + description="UP-POINTING AIRPLANE", direction="on", linebreak="id", - unicodeslot=0x1F6BC, + unicodeslot=0x1F6E7, }, - [0x1F6BD]={ + [0x1F6E8]={ category="so", - description="TOILET", + description="UP-POINTING SMALL AIRPLANE", direction="on", linebreak="id", - unicodeslot=0x1F6BD, + unicodeslot=0x1F6E8, }, - [0x1F6BE]={ + [0x1F6E9]={ category="so", - description="WATER CLOSET", + description="SMALL AIRPLANE", direction="on", linebreak="id", - unicodeslot=0x1F6BE, + unicodeslot=0x1F6E9, }, - [0x1F6BF]={ + [0x1F6EA]={ category="so", - description="SHOWER", + description="NORTHEAST-POINTING AIRPLANE", direction="on", linebreak="id", - unicodeslot=0x1F6BF, + unicodeslot=0x1F6EA, }, - [0x1F6C0]={ + [0x1F6EB]={ category="so", - description="BATH", + description="AIRPLANE DEPARTURE", direction="on", linebreak="id", - unicodeslot=0x1F6C0, + unicodeslot=0x1F6EB, }, - [0x1F6C1]={ + [0x1F6EC]={ category="so", - description="BATHTUB", + description="AIRPLANE ARRIVING", direction="on", linebreak="id", - unicodeslot=0x1F6C1, + unicodeslot=0x1F6EC, }, - [0x1F6C2]={ + [0x1F6F0]={ category="so", - description="PASSPORT CONTROL", + description="SATELLITE", direction="on", linebreak="id", - unicodeslot=0x1F6C2, + unicodeslot=0x1F6F0, }, - [0x1F6C3]={ + [0x1F6F1]={ category="so", - description="CUSTOMS", + description="ONCOMING FIRE ENGINE", direction="on", linebreak="id", - unicodeslot=0x1F6C3, + unicodeslot=0x1F6F1, }, - [0x1F6C4]={ + [0x1F6F2]={ category="so", - description="BAGGAGE CLAIM", + description="DIESEL LOCOMOTIVE", direction="on", linebreak="id", - unicodeslot=0x1F6C4, + unicodeslot=0x1F6F2, }, - [0x1F6C5]={ + [0x1F6F3]={ category="so", - description="LEFT LUGGAGE", + description="PASSENGER SHIP", direction="on", linebreak="id", - unicodeslot=0x1F6C5, + unicodeslot=0x1F6F3, }, [0x1F700]={ category="so", @@ -186412,6 +205701,1637 @@ characters.data={ linebreak="al", unicodeslot=0x1F773, }, + [0x1F780]={ + category="so", + description="BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x1F780, + }, + [0x1F781]={ + category="so", + description="BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x1F781, + }, + [0x1F782]={ + category="so", + description="BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x1F782, + }, + [0x1F783]={ + category="so", + description="BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE", + direction="on", + linebreak="al", + unicodeslot=0x1F783, + }, + [0x1F784]={ + category="so", + description="BLACK SLIGHTLY SMALL CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F784, + }, + [0x1F785]={ + category="so", + description="MEDIUM BOLD WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F785, + }, + [0x1F786]={ + category="so", + description="BOLD WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F786, + }, + [0x1F787]={ + category="so", + description="HEAVY WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F787, + }, + [0x1F788]={ + category="so", + description="VERY HEAVY WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F788, + }, + [0x1F789]={ + category="so", + description="EXTREMELY HEAVY WHITE CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F789, + }, + [0x1F78A]={ + category="so", + description="WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F78A, + }, + [0x1F78B]={ + category="so", + description="ROUND TARGET", + direction="on", + linebreak="al", + unicodeslot=0x1F78B, + }, + [0x1F78C]={ + category="so", + description="BLACK TINY SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F78C, + }, + [0x1F78D]={ + category="so", + description="BLACK SLIGHTLY SMALL SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F78D, + }, + [0x1F78E]={ + category="so", + description="LIGHT WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F78E, + }, + [0x1F78F]={ + category="so", + description="MEDIUM WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F78F, + }, + [0x1F790]={ + category="so", + description="BOLD WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F790, + }, + [0x1F791]={ + category="so", + description="HEAVY WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F791, + }, + [0x1F792]={ + category="so", + description="VERY HEAVY WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F792, + }, + [0x1F793]={ + category="so", + description="EXTREMELY HEAVY WHITE SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F793, + }, + [0x1F794]={ + category="so", + description="WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F794, + }, + [0x1F795]={ + category="so", + description="WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE", + direction="on", + linebreak="al", + unicodeslot=0x1F795, + }, + [0x1F796]={ + category="so", + description="SQUARE TARGET", + direction="on", + linebreak="al", + unicodeslot=0x1F796, + }, + [0x1F797]={ + category="so", + description="BLACK TINY DIAMOND", + direction="on", + linebreak="al", + unicodeslot=0x1F797, + }, + [0x1F798]={ + category="so", + description="BLACK VERY SMALL DIAMOND", + direction="on", + linebreak="al", + unicodeslot=0x1F798, + }, + [0x1F799]={ + category="so", + description="BLACK MEDIUM SMALL DIAMOND", + direction="on", + linebreak="al", + unicodeslot=0x1F799, + }, + [0x1F79A]={ + category="so", + description="WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND", + direction="on", + linebreak="al", + unicodeslot=0x1F79A, + }, + [0x1F79B]={ + category="so", + description="WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND", + direction="on", + linebreak="al", + unicodeslot=0x1F79B, + }, + [0x1F79C]={ + category="so", + description="DIAMOND TARGET", + direction="on", + linebreak="al", + unicodeslot=0x1F79C, + }, + [0x1F79D]={ + category="so", + description="BLACK TINY LOZENGE", + direction="on", + linebreak="al", + unicodeslot=0x1F79D, + }, + [0x1F79E]={ + category="so", + description="BLACK VERY SMALL LOZENGE", + direction="on", + linebreak="al", + unicodeslot=0x1F79E, + }, + [0x1F79F]={ + category="so", + description="BLACK MEDIUM SMALL LOZENGE", + direction="on", + linebreak="al", + unicodeslot=0x1F79F, + }, + [0x1F7A0]={ + category="so", + description="WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE", + direction="on", + linebreak="al", + unicodeslot=0x1F7A0, + }, + [0x1F7A1]={ + category="so", + description="THIN GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A1, + }, + [0x1F7A2]={ + category="so", + description="LIGHT GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A2, + }, + [0x1F7A3]={ + category="so", + description="MEDIUM GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A3, + }, + [0x1F7A4]={ + category="so", + description="BOLD GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A4, + }, + [0x1F7A5]={ + category="so", + description="VERY BOLD GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A5, + }, + [0x1F7A6]={ + category="so", + description="VERY HEAVY GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A6, + }, + [0x1F7A7]={ + category="so", + description="EXTREMELY HEAVY GREEK CROSS", + direction="on", + linebreak="al", + unicodeslot=0x1F7A7, + }, + [0x1F7A8]={ + category="so", + description="THIN SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7A8, + }, + [0x1F7A9]={ + category="so", + description="LIGHT SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7A9, + }, + [0x1F7AA]={ + category="so", + description="MEDIUM SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7AA, + }, + [0x1F7AB]={ + category="so", + description="BOLD SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7AB, + }, + [0x1F7AC]={ + category="so", + description="HEAVY SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7AC, + }, + [0x1F7AD]={ + category="so", + description="VERY HEAVY SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7AD, + }, + [0x1F7AE]={ + category="so", + description="EXTREMELY HEAVY SALTIRE", + direction="on", + linebreak="al", + unicodeslot=0x1F7AE, + }, + [0x1F7AF]={ + category="so", + description="LIGHT FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7AF, + }, + [0x1F7B0]={ + category="so", + description="MEDIUM FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B0, + }, + [0x1F7B1]={ + category="so", + description="BOLD FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B1, + }, + [0x1F7B2]={ + category="so", + description="HEAVY FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B2, + }, + [0x1F7B3]={ + category="so", + description="VERY HEAVY FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B3, + }, + [0x1F7B4]={ + category="so", + description="EXTREMELY HEAVY FIVE SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B4, + }, + [0x1F7B5]={ + category="so", + description="LIGHT SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B5, + }, + [0x1F7B6]={ + category="so", + description="MEDIUM SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B6, + }, + [0x1F7B7]={ + category="so", + description="BOLD SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B7, + }, + [0x1F7B8]={ + category="so", + description="HEAVY SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B8, + }, + [0x1F7B9]={ + category="so", + description="VERY HEAVY SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7B9, + }, + [0x1F7BA]={ + category="so", + description="EXTREMELY HEAVY SIX SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BA, + }, + [0x1F7BB]={ + category="so", + description="LIGHT EIGHT SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BB, + }, + [0x1F7BC]={ + category="so", + description="MEDIUM EIGHT SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BC, + }, + [0x1F7BD]={ + category="so", + description="BOLD EIGHT SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BD, + }, + [0x1F7BE]={ + category="so", + description="HEAVY EIGHT SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BE, + }, + [0x1F7BF]={ + category="so", + description="VERY HEAVY EIGHT SPOKED ASTERISK", + direction="on", + linebreak="al", + unicodeslot=0x1F7BF, + }, + [0x1F7C0]={ + category="so", + description="LIGHT THREE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C0, + }, + [0x1F7C1]={ + category="so", + description="MEDIUM THREE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C1, + }, + [0x1F7C2]={ + category="so", + description="THREE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C2, + }, + [0x1F7C3]={ + category="so", + description="MEDIUM THREE POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C3, + }, + [0x1F7C4]={ + category="so", + description="LIGHT FOUR POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C4, + }, + [0x1F7C5]={ + category="so", + description="MEDIUM FOUR POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C5, + }, + [0x1F7C6]={ + category="so", + description="FOUR POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C6, + }, + [0x1F7C7]={ + category="so", + description="MEDIUM FOUR POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C7, + }, + [0x1F7C8]={ + category="so", + description="REVERSE LIGHT FOUR POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C8, + }, + [0x1F7C9]={ + category="so", + description="LIGHT FIVE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7C9, + }, + [0x1F7CA]={ + category="so", + description="HEAVY FIVE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CA, + }, + [0x1F7CB]={ + category="so", + description="MEDIUM SIX POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CB, + }, + [0x1F7CC]={ + category="so", + description="HEAVY SIX POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CC, + }, + [0x1F7CD]={ + category="so", + description="SIX POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CD, + }, + [0x1F7CE]={ + category="so", + description="MEDIUM EIGHT POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CE, + }, + [0x1F7CF]={ + category="so", + description="HEAVY EIGHT POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7CF, + }, + [0x1F7D0]={ + category="so", + description="VERY HEAVY EIGHT POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7D0, + }, + [0x1F7D1]={ + category="so", + description="HEAVY EIGHT POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7D1, + }, + [0x1F7D2]={ + category="so", + description="LIGHT TWELVE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7D2, + }, + [0x1F7D3]={ + category="so", + description="HEAVY TWELVE POINTED BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7D3, + }, + [0x1F7D4]={ + category="so", + description="HEAVY TWELVE POINTED PINWHEEL STAR", + direction="on", + linebreak="al", + unicodeslot=0x1F7D4, + }, + [0x1F800]={ + category="so", + description="LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F800, + }, + [0x1F801]={ + category="so", + description="UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F801, + }, + [0x1F802]={ + category="so", + description="RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F802, + }, + [0x1F803]={ + category="so", + description="DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F803, + }, + [0x1F804]={ + category="so", + description="LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F804, + }, + [0x1F805]={ + category="so", + description="UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F805, + }, + [0x1F806]={ + category="so", + description="RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F806, + }, + [0x1F807]={ + category="so", + description="DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F807, + }, + [0x1F808]={ + category="so", + description="LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F808, + }, + [0x1F809]={ + category="so", + description="UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F809, + }, + [0x1F80A]={ + category="so", + description="RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F80A, + }, + [0x1F80B]={ + category="so", + description="DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F80B, + }, + [0x1F810]={ + category="so", + description="LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F810, + }, + [0x1F811]={ + category="so", + description="UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F811, + }, + [0x1F812]={ + category="so", + description="RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F812, + }, + [0x1F813]={ + category="so", + description="DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F813, + }, + [0x1F814]={ + category="so", + description="LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F814, + }, + [0x1F815]={ + category="so", + description="UPWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F815, + }, + [0x1F816]={ + category="so", + description="RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F816, + }, + [0x1F817]={ + category="so", + description="DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F817, + }, + [0x1F818]={ + category="so", + description="HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F818, + }, + [0x1F819]={ + category="so", + description="HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F819, + }, + [0x1F81A]={ + category="so", + description="HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81A, + }, + [0x1F81B]={ + category="so", + description="HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81B, + }, + [0x1F81C]={ + category="so", + description="HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81C, + }, + [0x1F81D]={ + category="so", + description="HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81D, + }, + [0x1F81E]={ + category="so", + description="HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81E, + }, + [0x1F81F]={ + category="so", + description="HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F81F, + }, + [0x1F820]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F820, + }, + [0x1F821]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F821, + }, + [0x1F822]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F822, + }, + [0x1F823]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F823, + }, + [0x1F824]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F824, + }, + [0x1F825]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F825, + }, + [0x1F826]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F826, + }, + [0x1F827]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F827, + }, + [0x1F828]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F828, + }, + [0x1F829]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F829, + }, + [0x1F82A]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82A, + }, + [0x1F82B]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82B, + }, + [0x1F82C]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82C, + }, + [0x1F82D]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82D, + }, + [0x1F82E]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82E, + }, + [0x1F82F]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F82F, + }, + [0x1F830]={ + category="so", + description="LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F830, + }, + [0x1F831]={ + category="so", + description="UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F831, + }, + [0x1F832]={ + category="so", + description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F832, + }, + [0x1F833]={ + category="so", + description="DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT", + direction="on", + linebreak="al", + unicodeslot=0x1F833, + }, + [0x1F834]={ + category="so", + description="LEFTWARDS FINGER-POST ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F834, + }, + [0x1F835]={ + category="so", + description="UPWARDS FINGER-POST ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F835, + }, + [0x1F836]={ + category="so", + description="RIGHTWARDS FINGER-POST ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F836, + }, + [0x1F837]={ + category="so", + description="DOWNWARDS FINGER-POST ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F837, + }, + [0x1F838]={ + category="so", + description="LEFTWARDS SQUARED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F838, + }, + [0x1F839]={ + category="so", + description="UPWARDS SQUARED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F839, + }, + [0x1F83A]={ + category="so", + description="RIGHTWARDS SQUARED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83A, + }, + [0x1F83B]={ + category="so", + description="DOWNWARDS SQUARED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83B, + }, + [0x1F83C]={ + category="so", + description="LEFTWARDS COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83C, + }, + [0x1F83D]={ + category="so", + description="UPWARDS COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83D, + }, + [0x1F83E]={ + category="so", + description="RIGHTWARDS COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83E, + }, + [0x1F83F]={ + category="so", + description="DOWNWARDS COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F83F, + }, + [0x1F840]={ + category="so", + description="LEFTWARDS HEAVY COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F840, + }, + [0x1F841]={ + category="so", + description="UPWARDS HEAVY COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F841, + }, + [0x1F842]={ + category="so", + description="RIGHTWARDS HEAVY COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F842, + }, + [0x1F843]={ + category="so", + description="DOWNWARDS HEAVY COMPRESSED ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F843, + }, + [0x1F844]={ + category="so", + description="LEFTWARDS HEAVY ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F844, + }, + [0x1F845]={ + category="so", + description="UPWARDS HEAVY ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F845, + }, + [0x1F846]={ + category="so", + description="RIGHTWARDS HEAVY ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F846, + }, + [0x1F847]={ + category="so", + description="DOWNWARDS HEAVY ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F847, + }, + [0x1F850]={ + category="so", + description="LEFTWARDS SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F850, + }, + [0x1F851]={ + category="so", + description="UPWARDS SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F851, + }, + [0x1F852]={ + category="so", + description="RIGHTWARDS SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F852, + }, + [0x1F853]={ + category="so", + description="DOWNWARDS SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F853, + }, + [0x1F854]={ + category="so", + description="NORTH WEST SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F854, + }, + [0x1F855]={ + category="so", + description="NORTH EAST SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F855, + }, + [0x1F856]={ + category="so", + description="SOUTH EAST SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F856, + }, + [0x1F857]={ + category="so", + description="SOUTH WEST SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F857, + }, + [0x1F858]={ + category="so", + description="LEFT RIGHT SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F858, + }, + [0x1F859]={ + category="so", + description="UP DOWN SANS-SERIF ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F859, + }, + [0x1F860]={ + category="so", + description="WIDE-HEADED LEFTWARDS LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F860, + }, + [0x1F861]={ + category="so", + description="WIDE-HEADED UPWARDS LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F861, + }, + [0x1F862]={ + category="so", + description="WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F862, + }, + [0x1F863]={ + category="so", + description="WIDE-HEADED DOWNWARDS LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F863, + }, + [0x1F864]={ + category="so", + description="WIDE-HEADED NORTH WEST LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F864, + }, + [0x1F865]={ + category="so", + description="WIDE-HEADED NORTH EAST LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F865, + }, + [0x1F866]={ + category="so", + description="WIDE-HEADED SOUTH EAST LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F866, + }, + [0x1F867]={ + category="so", + description="WIDE-HEADED SOUTH WEST LIGHT BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F867, + }, + [0x1F868]={ + category="so", + description="WIDE-HEADED LEFTWARDS BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F868, + }, + [0x1F869]={ + category="so", + description="WIDE-HEADED UPWARDS BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F869, + }, + [0x1F86A]={ + category="so", + description="WIDE-HEADED RIGHTWARDS BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86A, + }, + [0x1F86B]={ + category="so", + description="WIDE-HEADED DOWNWARDS BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86B, + }, + [0x1F86C]={ + category="so", + description="WIDE-HEADED NORTH WEST BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86C, + }, + [0x1F86D]={ + category="so", + description="WIDE-HEADED NORTH EAST BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86D, + }, + [0x1F86E]={ + category="so", + description="WIDE-HEADED SOUTH EAST BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86E, + }, + [0x1F86F]={ + category="so", + description="WIDE-HEADED SOUTH WEST BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F86F, + }, + [0x1F870]={ + category="so", + description="WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F870, + }, + [0x1F871]={ + category="so", + description="WIDE-HEADED UPWARDS MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F871, + }, + [0x1F872]={ + category="so", + description="WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F872, + }, + [0x1F873]={ + category="so", + description="WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F873, + }, + [0x1F874]={ + category="so", + description="WIDE-HEADED NORTH WEST MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F874, + }, + [0x1F875]={ + category="so", + description="WIDE-HEADED NORTH EAST MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F875, + }, + [0x1F876]={ + category="so", + description="WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F876, + }, + [0x1F877]={ + category="so", + description="WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F877, + }, + [0x1F878]={ + category="so", + description="WIDE-HEADED LEFTWARDS HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F878, + }, + [0x1F879]={ + category="so", + description="WIDE-HEADED UPWARDS HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F879, + }, + [0x1F87A]={ + category="so", + description="WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87A, + }, + [0x1F87B]={ + category="so", + description="WIDE-HEADED DOWNWARDS HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87B, + }, + [0x1F87C]={ + category="so", + description="WIDE-HEADED NORTH WEST HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87C, + }, + [0x1F87D]={ + category="so", + description="WIDE-HEADED NORTH EAST HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87D, + }, + [0x1F87E]={ + category="so", + description="WIDE-HEADED SOUTH EAST HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87E, + }, + [0x1F87F]={ + category="so", + description="WIDE-HEADED SOUTH WEST HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F87F, + }, + [0x1F880]={ + category="so", + description="WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F880, + }, + [0x1F881]={ + category="so", + description="WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F881, + }, + [0x1F882]={ + category="so", + description="WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F882, + }, + [0x1F883]={ + category="so", + description="WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F883, + }, + [0x1F884]={ + category="so", + description="WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F884, + }, + [0x1F885]={ + category="so", + description="WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F885, + }, + [0x1F886]={ + category="so", + description="WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F886, + }, + [0x1F887]={ + category="so", + description="WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F887, + }, + [0x1F890]={ + category="so", + description="LEFTWARDS TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F890, + }, + [0x1F891]={ + category="so", + description="UPWARDS TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F891, + }, + [0x1F892]={ + category="so", + description="RIGHTWARDS TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F892, + }, + [0x1F893]={ + category="so", + description="DOWNWARDS TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F893, + }, + [0x1F894]={ + category="so", + description="LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F894, + }, + [0x1F895]={ + category="so", + description="UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F895, + }, + [0x1F896]={ + category="so", + description="RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F896, + }, + [0x1F897]={ + category="so", + description="DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", + direction="on", + linebreak="al", + unicodeslot=0x1F897, + }, + [0x1F898]={ + category="so", + description="LEFTWARDS ARROW WITH NOTCHED TAIL", + direction="on", + linebreak="al", + unicodeslot=0x1F898, + }, + [0x1F899]={ + category="so", + description="UPWARDS ARROW WITH NOTCHED TAIL", + direction="on", + linebreak="al", + unicodeslot=0x1F899, + }, + [0x1F89A]={ + category="so", + description="RIGHTWARDS ARROW WITH NOTCHED TAIL", + direction="on", + linebreak="al", + unicodeslot=0x1F89A, + }, + [0x1F89B]={ + category="so", + description="DOWNWARDS ARROW WITH NOTCHED TAIL", + direction="on", + linebreak="al", + unicodeslot=0x1F89B, + }, + [0x1F89C]={ + category="so", + description="HEAVY ARROW SHAFT WIDTH ONE", + direction="on", + linebreak="al", + unicodeslot=0x1F89C, + }, + [0x1F89D]={ + category="so", + description="HEAVY ARROW SHAFT WIDTH TWO THIRDS", + direction="on", + linebreak="al", + unicodeslot=0x1F89D, + }, + [0x1F89E]={ + category="so", + description="HEAVY ARROW SHAFT WIDTH ONE HALF", + direction="on", + linebreak="al", + unicodeslot=0x1F89E, + }, + [0x1F89F]={ + category="so", + description="HEAVY ARROW SHAFT WIDTH ONE THIRD", + direction="on", + linebreak="al", + unicodeslot=0x1F89F, + }, + [0x1F8A0]={ + category="so", + description="LEFTWARDS BOTTOM-SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A0, + }, + [0x1F8A1]={ + category="so", + description="RIGHTWARDS BOTTOM SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A1, + }, + [0x1F8A2]={ + category="so", + description="LEFTWARDS TOP SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A2, + }, + [0x1F8A3]={ + category="so", + description="RIGHTWARDS TOP SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A3, + }, + [0x1F8A4]={ + category="so", + description="LEFTWARDS LEFT-SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A4, + }, + [0x1F8A5]={ + category="so", + description="RIGHTWARDS RIGHT-SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A5, + }, + [0x1F8A6]={ + category="so", + description="LEFTWARDS RIGHT-SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A6, + }, + [0x1F8A7]={ + category="so", + description="RIGHTWARDS LEFT-SHADED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A7, + }, + [0x1F8A8]={ + category="so", + description="LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A8, + }, + [0x1F8A9]={ + category="so", + description="RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8A9, + }, + [0x1F8AA]={ + category="so", + description="LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8AA, + }, + [0x1F8AB]={ + category="so", + description="RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW", + direction="on", + linebreak="al", + unicodeslot=0x1F8AB, + }, + [0x1F8AC]={ + category="so", + description="WHITE ARROW SHAFT WIDTH ONE", + direction="on", + linebreak="al", + unicodeslot=0x1F8AC, + }, + [0x1F8AD]={ + category="so", + description="WHITE ARROW SHAFT WIDTH TWO THIRDS", + direction="on", + linebreak="al", + unicodeslot=0x1F8AD, + }, [0x2F800]={ category="lo", cjkwd="w", diff --git a/Master/texmf-dist/tex/context/base/char-enc.lua b/Master/texmf-dist/tex/context/base/char-enc.lua index 048837eec18..c2061891ad4 100644 --- a/Master/texmf-dist/tex/context/base/char-enc.lua +++ b/Master/texmf-dist/tex/context/base/char-enc.lua @@ -9,6 +9,8 @@ if not modules then modules = { } end modules ['char-enc'] = { -- Thanks to tex4ht for these mappings. +local next = next + local allocate, setinitializer = utilities.storage.allocate, utilities.storage.setinitializer characters = characters or { } @@ -169,7 +171,10 @@ characters.synonyms = allocate { -- afm mess -- that table.print would not work on this file unless it is accessed once. This -- why the serializer does a dummy access. -local enccodes = allocate() characters.enccodes = enccodes +local enccodes = allocate() +characters.enccodes = enccodes + + -- maybe omit context name -> then same as encodings.make_unicode_vector local function initialize() for unicode, data in next, characters.data do @@ -179,7 +184,9 @@ local function initialize() end end for name, unicode in next, characters.synonyms do - if not enccodes[name] then enccodes[name] = unicode end + if not enccodes[name] then + enccodes[name] = unicode + end end end diff --git a/Master/texmf-dist/tex/context/base/char-ent.lua b/Master/texmf-dist/tex/context/base/char-ent.lua index 58ee9472ca3..e48856a8440 100644 --- a/Master/texmf-dist/tex/context/base/char-ent.lua +++ b/Master/texmf-dist/tex/context/base/char-ent.lua @@ -332,7 +332,7 @@ local entities = utilities.storage.allocate { ["NestedLessLess"] = "≪", -- U+0226A ["Nfr"] = "𝔑", -- U+1D511 ["Ngr"] = "Ν", -- U+0039D - ["NoBreak"] = "⁠", -- U+02060 + ["NoBreak"] = "⁠", -- U+02060 ["NonBreakingSpace"] = " ", -- U+000A0 ["Nopf"] = "ℕ", -- U+02115 ["Not"] = "⫬", -- U+02AEC @@ -2252,6 +2252,8 @@ local entities = utilities.storage.allocate { characters = characters or { } characters.entities = entities -entities.plusminus = "±" -- 0x000B1 -entities.minusplus = "∓" -- 0x02213 -entities.cdots = utf.char(0x02026) -- U+02026 +entities.plusminus = "±" -- U+000B1 +entities.minusplus = "∓" -- U+02213 +entities.Hat = "ˆ" -- U+002C6 -- better as this will stretch +entities.cdots = "⋯" -- U+022EF +entities.dots = "…" -- U+02026 diff --git a/Master/texmf-dist/tex/context/base/char-fio.lua b/Master/texmf-dist/tex/context/base/char-fio.lua new file mode 100644 index 00000000000..ab255593575 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/char-fio.lua @@ -0,0 +1,94 @@ +if not modules then modules = { } end modules ['char-fio'] = { + version = 1.001, + comment = "companion to char-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- % directives="filters.utf.reorder=false" + + +local next = next + +-- -- + +local sequencers = utilities.sequencers +local appendaction = sequencers.appendaction +local enableaction = sequencers.enableaction +local disableaction = sequencers.disableaction + +local utffilters = characters.filters.utf + +local textfileactions = resolvers.openers.helpers.textfileactions +local textlineactions = resolvers.openers.helpers.textlineactions + +appendaction (textfileactions,"system","characters.filters.utf.reorder") +disableaction(textfileactions, "characters.filters.utf.reorder") + +appendaction (textlineactions,"system","characters.filters.utf.reorder") +disableaction(textlineactions, "characters.filters.utf.reorder") + +appendaction (textfileactions,"system","characters.filters.utf.collapse") +disableaction(textfileactions, "characters.filters.utf.collapse") + +appendaction (textfileactions,"system","characters.filters.utf.decompose") +disableaction(textfileactions, "characters.filters.utf.decompose") + +local report = logs.reporter("unicode filter") +local reporting = "no" + +-- this is messy as for performance reasons i don't want this to happen +-- per line by default + +local enforced = { + ["characters.filters.utf.reorder"] = true, + ["characters.filters.utf.collapse"] = true, + ["characters.filters.utf.decompose"] = true, +} + +function utffilters.enable() + for k, v in next, enforced do + if v then + if reporting == "yes" then + report("%a enabled",k) + end + enableaction(textfileactions,v) + else + if reporting == "yes" then + report("%a not enabled",k) + end + end + end + reporting = "never" +end + +local function configure(what,v) + if v == "line" then + disableaction(textfileactions,what) + enableaction (textlineactions,what) + elseif not toboolean(v) then + if reporting ~= "never" then + report("%a disabled",k) + reporting = "yes" + end + enforced[what] = false + disableaction(textfileactions,what) + disableaction(textlineactions,what) + else -- true or text + enableaction (textfileactions,what) + disableaction(textlineactions,what) + end +end + +directives.register("filters.utf.reorder", function(v) configure("characters.filters.utf.reorder", v) end) +directives.register("filters.utf.collapse", function(v) configure("characters.filters.utf.collapse", v) end) +directives.register("filters.utf.decompose", function(v) configure("characters.filters.utf.decompose",v) end) + +utffilters.setskippable { "mkiv", "mkvi", "mkix", "mkxi" } + +interfaces.implement { + name = "enableutf", + onlyonce = true, + actions = utffilters.enable +} diff --git a/Master/texmf-dist/tex/context/base/char-ini.lua b/Master/texmf-dist/tex/context/base/char-ini.lua index 7dc381031fc..a1dd911f214 100644 --- a/Master/texmf-dist/tex/context/base/char-ini.lua +++ b/Master/texmf-dist/tex/context/base/char-ini.lua @@ -7,26 +7,33 @@ if not modules then modules = { } end modules ['char-ini'] = { } -- todo: make two files, one for format generation, one for format use +-- todo: move some to char-utf -- we can remove the tag range starting at 0xE0000 (special applications) local utfchar, utfbyte, utfvalues, ustring, utotable = utf.char, utf.byte, utf.values, utf.ustring, utf.totable local concat, unpack, tohash = table.concat, table.unpack, table.tohash local next, tonumber, type, rawget, rawset = next, tonumber, type, rawget, rawset -local format, lower, gsub, match, gmatch = string.format, string.lower, string.gsub, string.match, string.match, string.gmatch -local P, R, Cs, lpegmatch, patterns = lpeg.P, lpeg.R, lpeg.Cs, lpeg.match, lpeg.patterns +local format, lower, gsub = string.format, string.lower, string.gsub +local P, R, S, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cs -local utf8byte = patterns.utf8byte -local utf8char = patterns.utf8char +if not characters then require("char-def") end -local allocate = utilities.storage.allocate -local mark = utilities.storage.mark +local lpegpatterns = lpeg.patterns +local lpegmatch = lpeg.match +local utf8byte = lpegpatterns.utf8byte +local utf8character = lpegpatterns.utf8character -local setmetatableindex = table.setmetatableindex +local utfchartabletopattern = lpeg.utfchartabletopattern -local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end) +local allocate = utilities.storage.allocate +local mark = utilities.storage.mark -local report_defining = logs.reporter("characters") +local setmetatableindex = table.setmetatableindex + +local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end) + +local report_defining = logs.reporter("characters") --[[ldx--

This module implements some methods and creates additional datastructured @@ -37,6 +44,12 @@ from the big character table that we use for all kind of purposes: loaded!

--ldx]]-- +-- todo: in 'char-def.lua' assume defaults: +-- +-- directtions = l +-- cjkwd = a +-- linebreak = al + characters = characters or { } local characters = characters local data = characters.data @@ -54,7 +67,7 @@ end local pattern = (P("0x") + P("U+")) * ((R("09","AF")^1 * P(-1)) / function(s) return tonumber(s,16) end) -patterns.chartonumber = pattern +lpegpatterns.chartonumber = pattern local function chartonumber(k) if type(k) == "string" then @@ -145,6 +158,7 @@ local blocks = allocate { ["bamum"] = { first = 0x0A6A0, last = 0x0A6FF, description = "Bamum" }, ["bamumsupplement"] = { first = 0x16800, last = 0x16A3F, description = "Bamum Supplement" }, ["basiclatin"] = { first = 0x00000, last = 0x0007F, otf="latn", description = "Basic Latin" }, + ["bassavah"] = { first = 0x16AD0, last = 0x16AFF, description = "Bassa Vah" }, ["batak"] = { first = 0x01BC0, last = 0x01BFF, description = "Batak" }, ["bengali"] = { first = 0x00980, last = 0x009FF, otf="beng", description = "Bengali" }, ["blockelements"] = { first = 0x02580, last = 0x0259F, otf="bopo", description = "Block Elements" }, @@ -156,8 +170,9 @@ local blocks = allocate { ["buginese"] = { first = 0x01A00, last = 0x01A1F, otf="bugi", description = "Buginese" }, ["buhid"] = { first = 0x01740, last = 0x0175F, otf="buhd", description = "Buhid" }, ["byzantinemusicalsymbols"] = { first = 0x1D000, last = 0x1D0FF, otf="byzm", description = "Byzantine Musical Symbols" }, - ["commonindicnumberforms"] = { first = 0x0A830, last = 0x0A83F, description = "Common Indic Number Forms" }, ["carian"] = { first = 0x102A0, last = 0x102DF, description = "Carian" }, + ["caucasianalbanian"] = { first = 0x10530, last = 0x1056F, description = "Caucasian Albanian" }, + ["chakma"] = { first = 0x11100, last = 0x1114F, description = "Chakma" }, ["cham"] = { first = 0x0AA00, last = 0x0AA5F, description = "Cham" }, ["cherokee"] = { first = 0x013A0, last = 0x013FF, otf="cher", description = "Cherokee" }, ["cjkcompatibility"] = { first = 0x03300, last = 0x033FF, otf="hang", description = "CJK Compatibility" }, @@ -170,12 +185,17 @@ local blocks = allocate { ["cjkunifiedideographs"] = { first = 0x04E00, last = 0x09FFF, otf="hang", description = "CJK Unified Ideographs", catcode = "letter" }, ["cjkunifiedideographsextensiona"] = { first = 0x03400, last = 0x04DBF, otf="hang", description = "CJK Unified Ideographs Extension A" }, ["cjkunifiedideographsextensionb"] = { first = 0x20000, last = 0x2A6DF, otf="hang", description = "CJK Unified Ideographs Extension B" }, + ["cjkunifiedideographsextensionc"] = { first = 0x2A700, last = 0x2B73F, description = "CJK Unified Ideographs Extension C" }, + ["cjkunifiedideographsextensiond"] = { first = 0x2B740, last = 0x2B81F, description = "CJK Unified Ideographs Extension D" }, ["combiningdiacriticalmarks"] = { first = 0x00300, last = 0x0036F, description = "Combining Diacritical Marks" }, + ["combiningdiacriticalmarksextended"] = { first = 0x01AB0, last = 0x01AFF, description = "Combining Diacritical Marks Extended" }, ["combiningdiacriticalmarksforsymbols"] = { first = 0x020D0, last = 0x020FF, description = "Combining Diacritical Marks for Symbols" }, ["combiningdiacriticalmarkssupplement"] = { first = 0x01DC0, last = 0x01DFF, description = "Combining Diacritical Marks Supplement" }, ["combininghalfmarks"] = { first = 0x0FE20, last = 0x0FE2F, description = "Combining Half Marks" }, + ["commonindicnumberforms"] = { first = 0x0A830, last = 0x0A83F, description = "Common Indic Number Forms" }, ["controlpictures"] = { first = 0x02400, last = 0x0243F, description = "Control Pictures" }, ["coptic"] = { first = 0x02C80, last = 0x02CFF, otf="copt", description = "Coptic" }, + ["copticepactnumbers"] = { first = 0x102E0, last = 0x102FF, description = "Coptic Epact Numbers" }, ["countingrodnumerals"] = { first = 0x1D360, last = 0x1D37F, description = "Counting Rod Numerals" }, ["cuneiform"] = { first = 0x12000, last = 0x123FF, otf="xsux", description = "Cuneiform" }, ["cuneiformnumbersandpunctuation"] = { first = 0x12400, last = 0x1247F, otf="xsux", description = "Cuneiform Numbers and Punctuation" }, @@ -188,161 +208,256 @@ local blocks = allocate { ["deseret"] = { first = 0x10400, last = 0x1044F, otf="dsrt", description = "Deseret" }, ["devanagari"] = { first = 0x00900, last = 0x0097F, otf="deva", description = "Devanagari" }, ["devanagariextended"] = { first = 0x0A8E0, last = 0x0A8FF, description = "Devanagari Extended" }, - ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" }, - ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" }, - ["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" }, - ["emoticons"] = { first = 0x1F600, last = 0x1F64F, description = "Emoticons" }, - ["enclosedalphanumericsupplement"] = { first = 0x1F100, last = 0x1F1FF, description = "Enclosed Alphanumeric Supplement" }, - ["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" }, - ["enclosedcjklettersandmonths"] = { first = 0x03200, last = 0x032FF, description = "Enclosed CJK Letters and Months" }, - ["enclosedideographicsupplement"] = { first = 0x1F200, last = 0x1F2FF, description = "Enclosed Ideographic Supplement" }, - ["ethiopic"] = { first = 0x01200, last = 0x0137F, otf="ethi", description = "Ethiopic" }, - ["ethiopicextended"] = { first = 0x02D80, last = 0x02DDF, otf="ethi", description = "Ethiopic Extended" }, - ["ethiopicextendeda"] = { first = 0x0AB00, last = 0x0AB2F, description = "Ethiopic Extended-A" }, - ["ethiopicsupplement"] = { first = 0x01380, last = 0x0139F, otf="ethi", description = "Ethiopic Supplement" }, - ["generalpunctuation"] = { first = 0x02000, last = 0x0206F, description = "General Punctuation" }, - ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, description = "Geometric Shapes" }, - ["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" }, - ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" }, - ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" }, - ["gothic"] = { first = 0x10330, last = 0x1034F, otf="goth", description = "Gothic" }, - ["greekandcoptic"] = { first = 0x00370, last = 0x003FF, otf="grek", description = "Greek and Coptic" }, - ["greekextended"] = { first = 0x01F00, last = 0x01FFF, otf="grek", description = "Greek Extended" }, - ["gujarati"] = { first = 0x00A80, last = 0x00AFF, otf="gujr", description = "Gujarati" }, - ["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, otf="guru", description = "Gurmukhi" }, - ["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" }, - ["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, otf="jamo", description = "Hangul Compatibility Jamo" }, - ["hanguljamo"] = { first = 0x01100, last = 0x011FF, otf="jamo", description = "Hangul Jamo" }, - ["hanguljamoextendeda"] = { first = 0x0A960, last = 0x0A97F, description = "Hangul Jamo Extended-A" }, - ["hanguljamoextendedb"] = { first = 0x0D7B0, last = 0x0D7FF, description = "Hangul Jamo Extended-B" }, - ["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, otf="hang", description = "Hangul Syllables" }, - ["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" }, - ["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" }, - ["highprivateusesurrogates"] = { first = 0x0DB80, last = 0x0DBFF, description = "High Private Use Surrogates" }, - ["highsurrogates"] = { first = 0x0D800, last = 0x0DB7F, description = "High Surrogates" }, - ["hiragana"] = { first = 0x03040, last = 0x0309F, otf="kana", description = "Hiragana" }, - ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" }, - ["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" }, - ["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" }, - ["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" }, - ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" }, - ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" }, - ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" }, - ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" }, - ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" }, - ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" }, - ["kannada"] = { first = 0x00C80, last = 0x00CFF, otf="knda", description = "Kannada" }, - ["katakana"] = { first = 0x030A0, last = 0x030FF, otf="kana", description = "Katakana" }, - ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, otf="kana", description = "Katakana Phonetic Extensions" }, - ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" }, - ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, otf="khar", description = "Kharoshthi" }, - ["khmer"] = { first = 0x01780, last = 0x017FF, otf="khmr", description = "Khmer" }, - ["khmersymbols"] = { first = 0x019E0, last = 0x019FF, otf="khmr", description = "Khmer Symbols" }, - ["lao"] = { first = 0x00E80, last = 0x00EFF, otf="lao", description = "Lao" }, - ["latinextendeda"] = { first = 0x00100, last = 0x0017F, otf="latn", description = "Latin Extended-A" }, - ["latinextendedadditional"] = { first = 0x01E00, last = 0x01EFF, otf="latn", description = "Latin Extended Additional" }, - ["latinextendedb"] = { first = 0x00180, last = 0x0024F, otf="latn", description = "Latin Extended-B" }, - ["latinextendedc"] = { first = 0x02C60, last = 0x02C7F, otf="latn", description = "Latin Extended-C" }, - ["latinextendedd"] = { first = 0x0A720, last = 0x0A7FF, otf="latn", description = "Latin Extended-D" }, - ["latinsupplement"] = { first = 0x00080, last = 0x000FF, otf="latn", description = "Latin-1 Supplement" }, - ["lepcha"] = { first = 0x01C00, last = 0x01C4F, description = "Lepcha" }, - ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, description = "Letterlike Symbols" }, - ["limbu"] = { first = 0x01900, last = 0x0194F, otf="limb", description = "Limbu" }, - ["linearbideograms"] = { first = 0x10080, last = 0x100FF, otf="linb", description = "Linear B Ideograms" }, - ["linearbsyllabary"] = { first = 0x10000, last = 0x1007F, otf="linb", description = "Linear B Syllabary" }, - ["lisu"] = { first = 0x0A4D0, last = 0x0A4FF, description = "Lisu" }, - ["lowsurrogates"] = { first = 0x0DC00, last = 0x0DFFF, description = "Low Surrogates" }, - ["lycian"] = { first = 0x10280, last = 0x1029F, description = "Lycian" }, - ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" }, - ["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" }, - ["malayalam"] = { first = 0x00D00, last = 0x00D7F, otf="mlym", description = "Malayalam" }, - ["mandiac"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" }, - ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, description = "Mathematical Alphanumeric Symbols" }, - ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, description = "Mathematical Operators" }, - ["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" }, - ["meeteimayekextensions"] = { first = 0x0AAE0, last = 0x0AAFF, description = "Meetei Mayek Extensions" }, - ["meroiticcursive"] = { first = 0x109A0, last = 0x109FF, description = "Meroitic Cursive" }, - ["meroitichieroglyphs"] = { first = 0x10980, last = 0x1099F, description = "Meroitic Hieroglyphs" }, - ["miao"] = { first = 0x16F00, last = 0x16F9F, description = "Miao" }, - ["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF, description = "Miscellaneous Mathematical Symbols-A" }, - ["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF, description = "Miscellaneous Mathematical Symbols-B" }, - ["miscellaneoussymbols"] = { first = 0x02600, last = 0x026FF, description = "Miscellaneous Symbols" }, - ["miscellaneoussymbolsandarrows"] = { first = 0x02B00, last = 0x02BFF, description = "Miscellaneous Symbols and Arrows" }, - ["miscellaneoussymbolsandpictographs"] = { first = 0x1F300, last = 0x1F5FF, description = "Miscellaneous Symbols And Pictographs" }, - ["miscellaneoustechnical"] = { first = 0x02300, last = 0x023FF, description = "Miscellaneous Technical" }, - ["modifiertoneletters"] = { first = 0x0A700, last = 0x0A71F, description = "Modifier Tone Letters" }, - ["mongolian"] = { first = 0x01800, last = 0x018AF, otf="mong", description = "Mongolian" }, - ["musicalsymbols"] = { first = 0x1D100, last = 0x1D1FF, otf="musc", description = "Musical Symbols" }, - ["myanmar"] = { first = 0x01000, last = 0x0109F, otf="mymr", description = "Myanmar" }, - ["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" }, - ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" }, - ["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" }, - ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" }, - ["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" }, - ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" }, - ["olditalic"] = { first = 0x10300, last = 0x1032F, otf="ital", description = "Old Italic" }, - ["oldpersian"] = { first = 0x103A0, last = 0x103DF, otf="xpeo", description = "Old Persian" }, - ["oldsoutharabian"] = { first = 0x10A60, last = 0x10A7F, description = "Old South Arabian" }, - ["odlturkic"] = { first = 0x10C00, last = 0x10C4F, description = "Old Turkic" }, - ["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" }, - ["oriya"] = { first = 0x00B00, last = 0x00B7F, otf="orya", description = "Oriya" }, - ["osmanya"] = { first = 0x10480, last = 0x104AF, otf="osma", description = "Osmanya" }, - ["phagspa"] = { first = 0x0A840, last = 0x0A87F, otf="phag", description = "Phags-pa" }, - ["phaistosdisc"] = { first = 0x101D0, last = 0x101FF, description = "Phaistos Disc" }, - ["phoenician"] = { first = 0x10900, last = 0x1091F, otf="phnx", description = "Phoenician" }, - ["phoneticextensions"] = { first = 0x01D00, last = 0x01D7F, description = "Phonetic Extensions" }, - ["phoneticextensionssupplement"] = { first = 0x01D80, last = 0x01DBF, description = "Phonetic Extensions Supplement" }, - ["playingcards"] = { first = 0x1F0A0, last = 0x1F0FF, description = "Playing Cards" }, - ["privateusearea"] = { first = 0x0E000, last = 0x0F8FF, description = "Private Use Area" }, - ["rejang"] = { first = 0x0A930, last = 0x0A95F, description = "Rejang" }, - ["ruminumeralsymbols"] = { first = 0x10E60, last = 0x10E7F, description = "Rumi Numeral Symbols" }, - ["runic"] = { first = 0x016A0, last = 0x016FF, otf="runr", description = "Runic" }, - ["samaritan"] = { first = 0x00800, last = 0x0083F, description = "Samaritan" }, - ["saurashtra"] = { first = 0x0A880, last = 0x0A8DF, description = "Saurashtra" }, - ["sharada"] = { first = 0x11180, last = 0x111DF, description = "Sharada" }, - ["shavian"] = { first = 0x10450, last = 0x1047F, otf="shaw", description = "Shavian" }, - ["sinhala"] = { first = 0x00D80, last = 0x00DFF, otf="sinh", description = "Sinhala" }, - ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" }, - ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" }, - ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" }, - ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" }, - ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" }, - ["sundanesesupplement"] = { first = 0x01CC0, last = 0x01CCF, description = "Sundanese Supplement" }, - ["superscriptsandsubscripts"] = { first = 0x02070, last = 0x0209F, description = "Superscripts and Subscripts" }, - ["supplementalarrowsa"] = { first = 0x027F0, last = 0x027FF, description = "Supplemental Arrows-A" }, - ["supplementalarrowsb"] = { first = 0x02900, last = 0x0297F, description = "Supplemental Arrows-B" }, - ["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF, description = "Supplemental Mathematical Operators" }, - ["supplementalpunctuation"] = { first = 0x02E00, last = 0x02E7F, description = "Supplemental Punctuation" }, - ["supplementaryprivateuseareaa"] = { first = 0xF0000, last = 0xFFFFF, description = "Supplementary Private Use Area-A" }, - ["supplementaryprivateuseareab"] = { first = 0x100000,last = 0x10FFFF, description = "Supplementary Private Use Area-B" }, - ["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" }, - ["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" }, - ["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" }, - ["tagbanwa"] = { first = 0x01760, last = 0x0177F, otf="tagb", description = "Tagbanwa" }, - ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" }, - ["taile"] = { first = 0x01950, last = 0x0197F, otf="tale", description = "Tai Le" }, - ["taitham"] = { first = 0x01A20, last = 0x01AAF, description = "Tai Tham" }, - ["taiviet"] = { first = 0x0AA80, last = 0x0AADF, description = "Tai Viet" }, - ["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" }, - ["takri"] = { first = 0x11680, last = 0x116CF, description = "Takri" }, - ["tamil"] = { first = 0x00B80, last = 0x00BFF, otf="taml", description = "Tamil" }, - ["telugu"] = { first = 0x00C00, last = 0x00C7F, otf="telu", description = "Telugu" }, - ["thaana"] = { first = 0x00780, last = 0x007BF, otf="thaa", description = "Thaana" }, - ["thai"] = { first = 0x00E00, last = 0x00E7F, otf="thai", description = "Thai" }, - ["tibetan"] = { first = 0x00F00, last = 0x00FFF, otf="tibt", description = "Tibetan" }, - ["tifinagh"] = { first = 0x02D30, last = 0x02D7F, otf="tfng", description = "Tifinagh" }, - ["transportandmapsymbols"] = { first = 0x1F680, last = 0x1F6FF, description = "Transport And Map Symbols" }, - ["ugaritic"] = { first = 0x10380, last = 0x1039F, otf="ugar", description = "Ugaritic" }, - ["unifiedcanadianaboriginalsyllabics"] = { first = 0x01400, last = 0x0167F, otf="cans", description = "Unified Canadian Aboriginal Syllabics" }, - ["unifiedcanadianaboriginalsyllabicsextended"] = { first = 0x018B0, last = 0x018FF, description = "Unified Canadian Aboriginal Syllabics Extended" }, - ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" }, - ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" }, - ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" }, - ["vedicextensions"] = { first = 0x01CD0, last = 0x01CFF, description = "Vedic Extensions" }, - ["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" }, - ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" }, - ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" }, - ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" }, + ["digitsarabicindic"] = { first = 0x00660, last = 0x00669, math = true }, + -- ["digitsbengali"] = { first = 0x009E6, last = 0x009EF, math = true }, + ["digitsbold"] = { first = 0x1D7CE, last = 0x1D7D8, math = true }, + -- ["digitsdevanagari"] = { first = 0x00966, last = 0x0096F, math = true }, + ["digitsdoublestruck"] = { first = 0x1D7D8, last = 0x1D7E2, math = true }, + -- ["digitsethiopic"] = { first = 0x01369, last = 0x01371, math = true }, + ["digitsextendedarabicindic"] = { first = 0x006F0, last = 0x006F9, math = true }, + -- ["digitsgujarati"] = { first = 0x00AE6, last = 0x00AEF, math = true }, + -- ["digitsgurmukhi"] = { first = 0x00A66, last = 0x00A6F, math = true }, + -- ["digitskannada"] = { first = 0x00CE6, last = 0x00CEF, math = true }, + -- ["digitskhmer"] = { first = 0x017E0, last = 0x017E9, math = true }, + -- ["digitslao"] = { first = 0x00ED0, last = 0x00ED9, math = true }, + ["digitslatin"] = { first = 0x00030, last = 0x00039, math = true }, + -- ["digitsmalayalam"] = { first = 0x00D66, last = 0x00D6F, math = true }, + -- ["digitsmongolian"] = { first = 0x01810, last = 0x01809, math = true }, + ["digitsmonospace"] = { first = 0x1D7F6, last = 0x1D80F, math = true }, + -- ["digitsmyanmar"] = { first = 0x01040, last = 0x01049, math = true }, + ["digitsnormal"] = { first = 0x00030, last = 0x00039, math = true }, + -- ["digitsoriya"] = { first = 0x00B66, last = 0x00B6F, math = true }, + ["digitssansserifbold"] = { first = 0x1D7EC, last = 0x1D805, math = true }, + ["digitssansserifnormal"] = { first = 0x1D7E2, last = 0x1D7EC, math = true }, + -- ["digitstamil"] = { first = 0x00030, last = 0x00039, math = true }, -- no zero + -- ["digitstelugu"] = { first = 0x00C66, last = 0x00C6F, math = true }, + -- ["digitsthai"] = { first = 0x00E50, last = 0x00E59, math = true }, + -- ["digitstibetan"] = { first = 0x00F20, last = 0x00F29, math = true }, + ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" }, + ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" }, + ["duployan"] = { first = 0x1BC00, last = 0x1BC9F, description = "Duployan" }, + ["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" }, + ["elbasan"] = { first = 0x10500, last = 0x1052F, description = "Elbasan" }, + ["emoticons"] = { first = 0x1F600, last = 0x1F64F, description = "Emoticons" }, + ["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" }, + ["enclosedalphanumericsupplement"] = { first = 0x1F100, last = 0x1F1FF, description = "Enclosed Alphanumeric Supplement" }, + ["enclosedcjklettersandmonths"] = { first = 0x03200, last = 0x032FF, description = "Enclosed CJK Letters and Months" }, + ["enclosedideographicsupplement"] = { first = 0x1F200, last = 0x1F2FF, description = "Enclosed Ideographic Supplement" }, + ["ethiopic"] = { first = 0x01200, last = 0x0137F, otf="ethi", description = "Ethiopic" }, + ["ethiopicextended"] = { first = 0x02D80, last = 0x02DDF, otf="ethi", description = "Ethiopic Extended" }, + ["ethiopicextendeda"] = { first = 0x0AB00, last = 0x0AB2F, description = "Ethiopic Extended-A" }, + ["ethiopicsupplement"] = { first = 0x01380, last = 0x0139F, otf="ethi", description = "Ethiopic Supplement" }, + ["generalpunctuation"] = { first = 0x02000, last = 0x0206F, description = "General Punctuation" }, + ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, description = "Geometric Shapes" }, + ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, math = true }, + ["geometricshapesextended"] = { first = 0x1F780, last = 0x1F7FF, description = "Geometric Shapes Extended" }, + ["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" }, + ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" }, + ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" }, + ["gothic"] = { first = 0x10330, last = 0x1034F, otf="goth", description = "Gothic" }, + ["grantha"] = { first = 0x11300, last = 0x1137F, description = "Grantha" }, + ["greekandcoptic"] = { first = 0x00370, last = 0x003FF, otf="grek", description = "Greek and Coptic" }, + ["greekextended"] = { first = 0x01F00, last = 0x01FFF, otf="grek", description = "Greek Extended" }, + ["gujarati"] = { first = 0x00A80, last = 0x00AFF, otf="gujr", description = "Gujarati" }, + ["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, otf="guru", description = "Gurmukhi" }, + ["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" }, + ["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, otf="jamo", description = "Hangul Compatibility Jamo" }, + ["hanguljamo"] = { first = 0x01100, last = 0x011FF, otf="jamo", description = "Hangul Jamo" }, + ["hanguljamoextendeda"] = { first = 0x0A960, last = 0x0A97F, description = "Hangul Jamo Extended-A" }, + ["hanguljamoextendedb"] = { first = 0x0D7B0, last = 0x0D7FF, description = "Hangul Jamo Extended-B" }, + ["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, otf="hang", description = "Hangul Syllables" }, + ["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" }, + ["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" }, + ["highprivateusesurrogates"] = { first = 0x0DB80, last = 0x0DBFF, description = "High Private Use Surrogates" }, + ["highsurrogates"] = { first = 0x0D800, last = 0x0DB7F, description = "High Surrogates" }, + ["hiragana"] = { first = 0x03040, last = 0x0309F, otf="kana", description = "Hiragana" }, + ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" }, + ["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" }, + ["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" }, + ["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" }, + ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" }, + ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" }, + ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" }, + ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" }, + ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" }, + ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" }, + ["kannada"] = { first = 0x00C80, last = 0x00CFF, otf="knda", description = "Kannada" }, + ["katakana"] = { first = 0x030A0, last = 0x030FF, otf="kana", description = "Katakana" }, + ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, otf="kana", description = "Katakana Phonetic Extensions" }, + ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" }, + ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, otf="khar", description = "Kharoshthi" }, + ["khmer"] = { first = 0x01780, last = 0x017FF, otf="khmr", description = "Khmer" }, + ["khmersymbols"] = { first = 0x019E0, last = 0x019FF, otf="khmr", description = "Khmer Symbols" }, + ["khojki"] = { first = 0x11200, last = 0x1124F, description = "Khojki" }, + ["khudawadi"] = { first = 0x112B0, last = 0x112FF, description = "Khudawadi" }, + ["lao"] = { first = 0x00E80, last = 0x00EFF, otf="lao", description = "Lao" }, + ["latinextendeda"] = { first = 0x00100, last = 0x0017F, otf="latn", description = "Latin Extended-A" }, + ["latinextendedadditional"] = { first = 0x01E00, last = 0x01EFF, otf="latn", description = "Latin Extended Additional" }, + ["latinextendedb"] = { first = 0x00180, last = 0x0024F, otf="latn", description = "Latin Extended-B" }, + ["latinextendedc"] = { first = 0x02C60, last = 0x02C7F, otf="latn", description = "Latin Extended-C" }, + ["latinextendedd"] = { first = 0x0A720, last = 0x0A7FF, otf="latn", description = "Latin Extended-D" }, + ["latinextendede"] = { first = 0x0AB30, last = 0x0AB6F, description = "Latin Extended-E" }, + ["latinsupplement"] = { first = 0x00080, last = 0x000FF, otf="latn", description = "Latin-1 Supplement" }, + ["lepcha"] = { first = 0x01C00, last = 0x01C4F, description = "Lepcha" }, + ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, description = "Letterlike Symbols" }, + ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, math = true }, + ["limbu"] = { first = 0x01900, last = 0x0194F, otf="limb", description = "Limbu" }, + ["lineara"] = { first = 0x10600, last = 0x1077F, description = "Linear A" }, + ["linearbideograms"] = { first = 0x10080, last = 0x100FF, otf="linb", description = "Linear B Ideograms" }, + ["linearbsyllabary"] = { first = 0x10000, last = 0x1007F, otf="linb", description = "Linear B Syllabary" }, + ["lisu"] = { first = 0x0A4D0, last = 0x0A4FF, description = "Lisu" }, + ["lowercasebold"] = { first = 0x1D41A, last = 0x1D433, math = true }, + ["lowercaseboldfraktur"] = { first = 0x1D586, last = 0x1D59F, math = true }, + ["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B, math = true }, + ["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503, math = true }, + ["lowercasedoublestruck"] = { first = 0x1D552, last = 0x1D56B, math = true }, + ["lowercasefraktur"] = { first = 0x1D51E, last = 0x1D537, math = true }, + ["lowercasegreekbold"] = { first = 0x1D6C2, last = 0x1D6DB, math = true }, + ["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F, math = true }, + ["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715, math = true }, + ["lowercasegreeknormal"] = { first = 0x003B1, last = 0x003CA, math = true }, + ["lowercasegreeksansserifbold"] = { first = 0x1D770, last = 0x1D789, math = true }, + ["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3, math = true }, + ["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467, math = true }, + ["lowercasemonospace"] = { first = 0x1D68A, last = 0x1D6A3, math = true }, + ["lowercasenormal"] = { first = 0x00061, last = 0x0007A, math = true }, + ["lowercasesansserifbold"] = { first = 0x1D5EE, last = 0x1D607, math = true }, + ["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F, math = true }, + ["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B, math = true }, + ["lowercasesansserifnormal"] = { first = 0x1D5BA, last = 0x1D5D3, math = true }, + ["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF, math = true }, + ["lowsurrogates"] = { first = 0x0DC00, last = 0x0DFFF, description = "Low Surrogates" }, + ["lycian"] = { first = 0x10280, last = 0x1029F, description = "Lycian" }, + ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" }, + ["mahajani"] = { first = 0x11150, last = 0x1117F, description = "Mahajani" }, + ["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" }, + ["malayalam"] = { first = 0x00D00, last = 0x00D7F, otf="mlym", description = "Malayalam" }, + ["mandaic"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" }, + ["manichaean"] = { first = 0x10AC0, last = 0x10AFF, description = "Manichaean" }, + ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, math = true, description = "Mathematical Alphanumeric Symbols" }, + ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, math = true, description = "Mathematical Operators" }, + ["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" }, + ["meeteimayekextensions"] = { first = 0x0AAE0, last = 0x0AAFF, description = "Meetei Mayek Extensions" }, + ["mendekikakui"] = { first = 0x1E800, last = 0x1E8DF, description = "Mende Kikakui" }, + ["meroiticcursive"] = { first = 0x109A0, last = 0x109FF, description = "Meroitic Cursive" }, + ["meroitichieroglyphs"] = { first = 0x10980, last = 0x1099F, description = "Meroitic Hieroglyphs" }, + ["miao"] = { first = 0x16F00, last = 0x16F9F, description = "Miao" }, + ["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF, math = true, description = "Miscellaneous Mathematical Symbols-A" }, + ["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF, math = true, description = "Miscellaneous Mathematical Symbols-B" }, + ["miscellaneoussymbols"] = { first = 0x02600, last = 0x026FF, math = true, description = "Miscellaneous Symbols" }, + ["miscellaneoussymbolsandarrows"] = { first = 0x02B00, last = 0x02BFF, math = true, description = "Miscellaneous Symbols and Arrows" }, + ["miscellaneoussymbolsandpictographs"] = { first = 0x1F300, last = 0x1F5FF, description = "Miscellaneous Symbols and Pictographs" }, + ["miscellaneoustechnical"] = { first = 0x02300, last = 0x023FF, math = true, description = "Miscellaneous Technical" }, + ["modi"] = { first = 0x11600, last = 0x1165F, description = "Modi" }, + ["modifiertoneletters"] = { first = 0x0A700, last = 0x0A71F, description = "Modifier Tone Letters" }, + ["mongolian"] = { first = 0x01800, last = 0x018AF, otf="mong", description = "Mongolian" }, + ["mro"] = { first = 0x16A40, last = 0x16A6F, description = "Mro" }, + ["musicalsymbols"] = { first = 0x1D100, last = 0x1D1FF, otf="musc", description = "Musical Symbols" }, + ["myanmar"] = { first = 0x01000, last = 0x0109F, otf="mymr", description = "Myanmar" }, + ["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" }, + ["myanmarextendedb"] = { first = 0x0A9E0, last = 0x0A9FF, description = "Myanmar Extended-B" }, + ["nabataean"] = { first = 0x10880, last = 0x108AF, description = "Nabataean" }, + ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" }, + ["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" }, + ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" }, + ["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" }, + ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" }, + ["olditalic"] = { first = 0x10300, last = 0x1032F, otf="ital", description = "Old Italic" }, + ["oldnortharabian"] = { first = 0x10A80, last = 0x10A9F, description = "Old North Arabian" }, + ["oldpermic"] = { first = 0x10350, last = 0x1037F, description = "Old Permic" }, + ["oldpersian"] = { first = 0x103A0, last = 0x103DF, otf="xpeo", description = "Old Persian" }, + ["oldsoutharabian"] = { first = 0x10A60, last = 0x10A7F, description = "Old South Arabian" }, + ["oldturkic"] = { first = 0x10C00, last = 0x10C4F, description = "Old Turkic" }, + ["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" }, + ["oriya"] = { first = 0x00B00, last = 0x00B7F, otf="orya", description = "Oriya" }, + ["ornamentaldingbats"] = { first = 0x1F650, last = 0x1F67F, description = "Ornamental Dingbats" }, + ["osmanya"] = { first = 0x10480, last = 0x104AF, otf="osma", description = "Osmanya" }, + ["pahawhhmong"] = { first = 0x16B00, last = 0x16B8F, description = "Pahawh Hmong" }, + ["palmyrene"] = { first = 0x10860, last = 0x1087F, description = "Palmyrene" }, + ["paucinhau"] = { first = 0x11AC0, last = 0x11AFF, description = "Pau Cin Hau" }, + ["phagspa"] = { first = 0x0A840, last = 0x0A87F, otf="phag", description = "Phags-pa" }, + ["phaistosdisc"] = { first = 0x101D0, last = 0x101FF, description = "Phaistos Disc" }, + ["phoenician"] = { first = 0x10900, last = 0x1091F, otf="phnx", description = "Phoenician" }, + ["phoneticextensions"] = { first = 0x01D00, last = 0x01D7F, description = "Phonetic Extensions" }, + ["phoneticextensionssupplement"] = { first = 0x01D80, last = 0x01DBF, description = "Phonetic Extensions Supplement" }, + ["playingcards"] = { first = 0x1F0A0, last = 0x1F0FF, description = "Playing Cards" }, + ["privateusearea"] = { first = 0x0E000, last = 0x0F8FF, description = "Private Use Area" }, + ["psalterpahlavi"] = { first = 0x10B80, last = 0x10BAF, description = "Psalter Pahlavi" }, + ["rejang"] = { first = 0x0A930, last = 0x0A95F, description = "Rejang" }, + ["ruminumeralsymbols"] = { first = 0x10E60, last = 0x10E7F, description = "Rumi Numeral Symbols" }, + ["runic"] = { first = 0x016A0, last = 0x016FF, otf="runr", description = "Runic" }, + ["samaritan"] = { first = 0x00800, last = 0x0083F, description = "Samaritan" }, + ["saurashtra"] = { first = 0x0A880, last = 0x0A8DF, description = "Saurashtra" }, + ["sharada"] = { first = 0x11180, last = 0x111DF, description = "Sharada" }, + ["shavian"] = { first = 0x10450, last = 0x1047F, otf="shaw", description = "Shavian" }, + ["shorthandformatcontrols"] = { first = 0x1BCA0, last = 0x1BCAF, description = "Shorthand Format Controls" }, + ["siddham"] = { first = 0x11580, last = 0x115FF, description = "Siddham" }, + ["sinhala"] = { first = 0x00D80, last = 0x00DFF, otf="sinh", description = "Sinhala" }, + ["sinhalaarchaicnumbers"] = { first = 0x111E0, last = 0x111FF, description = "Sinhala Archaic Numbers" }, + ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" }, + ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" }, + ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" }, + ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" }, + ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" }, + ["sundanesesupplement"] = { first = 0x01CC0, last = 0x01CCF, description = "Sundanese Supplement" }, + ["superscriptsandsubscripts"] = { first = 0x02070, last = 0x0209F, description = "Superscripts and Subscripts" }, + ["supplementalarrowsa"] = { first = 0x027F0, last = 0x027FF, math = true, description = "Supplemental Arrows-A" }, + ["supplementalarrowsb"] = { first = 0x02900, last = 0x0297F, math = true, description = "Supplemental Arrows-B" }, + ["supplementalarrowsc"] = { first = 0x1F800, last = 0x1F8FF, math = true, description = "Supplemental Arrows-C" }, + ["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF, math = true, description = "Supplemental Mathematical Operators" }, + ["supplementalpunctuation"] = { first = 0x02E00, last = 0x02E7F, description = "Supplemental Punctuation" }, + ["supplementaryprivateuseareaa"] = { first = 0xF0000, last = 0xFFFFF, description = "Supplementary Private Use Area-A" }, + ["supplementaryprivateuseareab"] = { first = 0x100000,last = 0x10FFFF, description = "Supplementary Private Use Area-B" }, + ["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" }, + ["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" }, + ["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" }, + ["tagbanwa"] = { first = 0x01760, last = 0x0177F, otf="tagb", description = "Tagbanwa" }, + ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" }, + ["taile"] = { first = 0x01950, last = 0x0197F, otf="tale", description = "Tai Le" }, + ["taitham"] = { first = 0x01A20, last = 0x01AAF, description = "Tai Tham" }, + ["taiviet"] = { first = 0x0AA80, last = 0x0AADF, description = "Tai Viet" }, + ["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" }, + ["takri"] = { first = 0x11680, last = 0x116CF, description = "Takri" }, + ["tamil"] = { first = 0x00B80, last = 0x00BFF, otf="taml", description = "Tamil" }, + ["telugu"] = { first = 0x00C00, last = 0x00C7F, otf="telu", description = "Telugu" }, + ["thaana"] = { first = 0x00780, last = 0x007BF, otf="thaa", description = "Thaana" }, + ["thai"] = { first = 0x00E00, last = 0x00E7F, otf="thai", description = "Thai" }, + ["tibetan"] = { first = 0x00F00, last = 0x00FFF, otf="tibt", description = "Tibetan" }, + ["tifinagh"] = { first = 0x02D30, last = 0x02D7F, otf="tfng", description = "Tifinagh" }, + ["tirhuta"] = { first = 0x11480, last = 0x114DF, description = "Tirhuta" }, + ["transportandmapsymbols"] = { first = 0x1F680, last = 0x1F6FF, description = "Transport and Map Symbols" }, + ["ugaritic"] = { first = 0x10380, last = 0x1039F, otf="ugar", description = "Ugaritic" }, + ["unifiedcanadianaboriginalsyllabics"] = { first = 0x01400, last = 0x0167F, otf="cans", description = "Unified Canadian Aboriginal Syllabics" }, + ["unifiedcanadianaboriginalsyllabicsextended"] = { first = 0x018B0, last = 0x018FF, description = "Unified Canadian Aboriginal Syllabics Extended" }, + ["uppercasebold"] = { first = 0x1D400, last = 0x1D419, math = true }, + ["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585, math = true }, + ["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481, math = true }, + ["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9, math = true }, + ["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551, math = true }, + ["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D, math = true }, + ["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1, math = true }, + ["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735, math = true }, + ["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB, math = true }, + ["uppercasegreeknormal"] = { first = 0x00391, last = 0x003AA, math = true }, + ["uppercasegreeksansserifbold"] = { first = 0x1D756, last = 0x1D76F, math = true }, + ["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9, math = true }, + ["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D, math = true }, + ["uppercasemonospace"] = { first = 0x1D670, last = 0x1D689, math = true }, + ["uppercasenormal"] = { first = 0x00041, last = 0x0005A, math = true }, + ["uppercasesansserifbold"] = { first = 0x1D5D4, last = 0x1D5ED, math = true }, + ["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655, math = true }, + ["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621, math = true }, + ["uppercasesansserifnormal"] = { first = 0x1D5A0, last = 0x1D5B9, math = true }, + ["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5, math = true }, + ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" }, + ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" }, + ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" }, + ["vedicextensions"] = { first = 0x01CD0, last = 0x01CFF, description = "Vedic Extensions" }, + ["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" }, + ["warangciti"] = { first = 0x118A0, last = 0x118FF, description = "Warang Citi" }, + ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" }, + ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" }, + ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" }, } characters.blocks = blocks @@ -379,13 +494,15 @@ setmetatableindex(otfscripts,function(t,unicode) return "dflt" end) +local splitter = lpeg.splitat(S(":-")) + function characters.getrange(name) -- used in font fallback definitions (name or range) local range = blocks[name] if range then return range.first, range.last, range.description, range.gaps end name = gsub(name,'"',"0x") -- goodie: tex hex notation - local start, stop = match(name,"^(.-)[%-%:](.-)$") + local start, stop = lpegmatch(splitter,name) if start and stop then start, stop = tonumber(start,16) or tonumber(start), tonumber(stop,16) or tonumber(stop) if start and stop then @@ -492,7 +609,68 @@ setmetatableindex(characters.is_punctuation,mti) -- linebreak: todo: hash -- -- normative : BK CR LF CM SG GL CB SP ZW NL WJ JL JV JT H2 H3 --- informative : XX OP CL QU NS EX SY IS PR PO NU AL ID IN HY BB BA SA AI B2 new:CP +-- informative : XX OP CL CP QU NS EX SY IS PR PO NU AL ID IN HY BB BA SA AI B2 HL CJ RI +-- +-- comments taken from standard: + +characters.linebreaks = { + + -- non-tailorable line breaking classes + + ["bk"] = "mandatory break", -- nl, ps : cause a line break (after) + ["cr"] = "carriage return", -- cr : cause a line break (after), except between cr and lf + ["lf"] = "line feed", -- lf : cause a line break (after) + ["cm"] = "combining mark", -- combining marks, control codes : prohibit a line break between the character and the preceding character + ["nl"] = "next line", -- nel : cause a line break (after) + ["sg"] = "surrogate", -- surrogates :do not occur in well-formed text + ["wj"] = "word joiner", -- wj : prohibit line breaks before and after + ["zw"] = "zero width space", -- zwsp : provide a break opportunity + ["gl"] = "non-breaking (glue)", -- cgj, nbsp, zwnbsp : prohibit line breaks before and after + ["sp"] = "space", -- space : enable indirect line breaks + + -- break opportunities + + ["b2"] = "break opportunity before and after", -- em dash : provide a line break opportunity before and after the character + ["ba"] = "break after", -- spaces, hyphens : generally provide a line break opportunity after the character + ["bb"] = "break before", -- punctuation used in dictionaries : generally provide a line break opportunity before the character + ["hy"] = "hyphen", -- hyphen-minus : provide a line break opportunity after the character, except in numeric context + ["cb"] = "contingent break opportunity", -- inline objects : provide a line break opportunity contingent on additional information + + -- characters prohibiting certain breaks + + ["cl"] = "close punctuation", -- “}”, “❳”, “⟫” etc. : prohibit line breaks before + ["cp"] = "close parenthesis", -- “)”, “]” : prohibit line breaks before + ["ex"] = "exclamation/interrogation", -- “!”, “?”, etc. : prohibit line breaks before + ["in"] = "inseparable", -- leaders : allow only indirect line breaks between pairs + ["ns"] = "nonstarter", -- “‼”, “‽”, “⁇”, “⁉”, etc. : allow only indirect line breaks before + ["op"] = "open punctuation", -- “(“, “[“, “{“, etc. : prohibit line breaks after + ["qu"] = "quotation", -- quotation marks : act like they are both opening and closing + + -- numeric context + + ["is"] = "infix numeric separator", -- . , : prevent breaks after any and before numeric + ["nu"] = "numeric", -- digits : form numeric expressions for line breaking purposes + ["po"] = "postfix numeric", -- %, ¢ : do not break following a numeric expression + ["pr"] = "prefix numeric", -- $, £, ¥, etc. : do not break in front of a numeric expression + ["sy"] = "symbols allowing break after", -- / : prevent a break before, and allow a break after + + -- other characters + + ["ai"] = "ambiguous (alphabetic or ideographic)", -- characters with ambiguous east asian width : act like al when the resolved eaw is n; otherwise, act as id + ["al"] = "alphabetic", -- alphabets and regular symbols : are alphabetic characters or symbols that are used with alphabetic characters + ["cj"] = "conditional japanese starter", -- small kana : treat as ns or id for strict or normal breaking. + ["h2"] = "hangul lv syllable", -- hangul : form korean syllable blocks + ["h3"] = "hangul lvt syllable", -- hangul : form korean syllable blocks + ["hl"] = "hebrew letter", -- hebrew : do not break around a following hyphen; otherwise act as alphabetic + ["id"] = "ideographic", -- ideographs : break before or after, except in some numeric context + ["jl"] = "hangul l jamo", -- conjoining jamo : form korean syllable blocks + ["jv"] = "hangul v jamo", -- conjoining jamo : form korean syllable blocks + ["jt"] = "hangul t jamo", -- conjoining jamo : form korean syllable blocks + ["ri"] = "regional indicator", -- regional indicator symbol letter a .. z : keep together, break before and after from others + ["sa"] = "complex context dependent (south east asian)", -- south east asian: thai, lao, khmer : provide a line break opportunity contingent on additional, language-specific context analysis + ["xx"] = "unknown", -- most unassigned, private-use : have as yet unknown line breaking behavior or unassigned code positions + +} -- east asian width: -- @@ -600,10 +778,10 @@ of the official .

-- we could make them virtual: characters.contextnames[n] -function characters.contextname(n) return data[n].contextname or "" end -function characters.adobename (n) return data[n].adobename or "" end -function characters.description(n) return data[n].description or "" end --------- characters.category (n) return data[n].category or "" end +function characters.contextname(n) return data[n] and data[n].contextname or "" end +function characters.adobename (n) return data[n] and data[n].adobename or "" end +function characters.description(n) return data[n] and data[n].description or "" end +-------- characters.category (n) return data[n] and data[n].category or "" end function characters.category(n,verbose) local c = data[n].category @@ -768,17 +946,159 @@ end ----- toupper = Cs((utf8byte/ucchars)^0) ----- toshape = Cs((utf8byte/shchars)^0) -local tolower = Cs((utf8char/lcchars)^0) -local toupper = Cs((utf8char/ucchars)^0) -local toshape = Cs((utf8char/shchars)^0) +local tolower = Cs((utf8character/lcchars)^0) -- no need to check spacing +local toupper = Cs((utf8character/ucchars)^0) -- no need to check spacing +local toshape = Cs((utf8character/shchars)^0) -- no need to check spacing + +lpegpatterns.tolower = tolower -- old ones ... will be overloaded +lpegpatterns.toupper = toupper -- old ones ... will be overloaded +lpegpatterns.toshape = toshape -- old ones ... will be overloaded + +-- function characters.lower (str) return lpegmatch(tolower,str) end +-- function characters.upper (str) return lpegmatch(toupper,str) end +-- function characters.shaped(str) return lpegmatch(toshape,str) end + +-- local superscripts = allocate() characters.superscripts = superscripts +-- local subscripts = allocate() characters.subscripts = subscripts + +-- if storage then +-- storage.register("characters/superscripts", superscripts, "characters.superscripts") +-- storage.register("characters/subscripts", subscripts, "characters.subscripts") +-- end + +-- end + +if not characters.splits then + + local char = allocate() + local compat = allocate() -patterns.tolower = tolower -patterns.toupper = toupper -patterns.toshape = toshape + local splits = { + char = char, + compat = compat, + } -function characters.lower (str) return lpegmatch(tolower,str) end -function characters.upper (str) return lpegmatch(toupper,str) end -function characters.shaped(str) return lpegmatch(toshape,str) end + characters.splits = splits + + -- [0x013F] = { 0x004C, 0x00B7 } + -- [0x0140] = { 0x006C, 0x00B7 } + + for unicode, data in next, characters.data do + local specials = data.specials + if specials and #specials > 2 then + local kind = specials[1] + if kind == "compat" then + compat[unicode] = { unpack(specials,2) } + elseif kind == "char" then + char [unicode] = { unpack(specials,2) } + end + end + end + + if storage then + storage.register("characters/splits", splits, "characters.splits") + end + +end + +if not characters.lhash then + + local lhash = allocate() characters.lhash = lhash -- nil if no conversion + local uhash = allocate() characters.uhash = uhash -- nil if no conversion + local shash = allocate() characters.shash = shash -- nil if no conversion + + for k, v in next, characters.data do + -- if k < 0x11000 then + local l = v.lccode + if l then + -- we have an uppercase + if type(l) == "number" then + lhash[utfchar(k)] = utfchar(l) + elseif #l == 2 then + lhash[utfchar(k)] = utfchar(l[1]) .. utfchar(l[2]) + else + inspect(v) + end + else + local u = v.uccode + if u then + -- we have an lowercase + if type(u) == "number" then + uhash[utfchar(k)] = utfchar(u) + elseif #u == 2 then + uhash[utfchar(k)] = utfchar(u[1]) .. utfchar(u[2]) + else + inspect(v) + end + end + end + local s = v.shcode + if s then + if type(s) == "number" then + shash[utfchar(k)] = utfchar(s) + elseif #s == 2 then + shash[utfchar(k)] = utfchar(s[1]) .. utfchar(s[2]) + else + inspect(v) + end + end + -- end + end + + if storage then + storage.register("characters/lhash", lhash, "characters.lhash") + storage.register("characters/uhash", uhash, "characters.uhash") + storage.register("characters/shash", shash, "characters.shash") + end + +end + +local lhash = characters.lhash mark(lhash) +local uhash = characters.uhash mark(uhash) +local shash = characters.shash mark(shash) + +local utf8lowercharacter = utfchartabletopattern(lhash) / lhash +local utf8uppercharacter = utfchartabletopattern(uhash) / uhash +local utf8shapecharacter = utfchartabletopattern(shash) / shash + +local utf8lower = Cs((utf8lowercharacter + utf8character)^0) +local utf8upper = Cs((utf8uppercharacter + utf8character)^0) +local utf8shape = Cs((utf8shapecharacter + utf8character)^0) + +lpegpatterns.utf8lowercharacter = utf8lowercharacter -- one character +lpegpatterns.utf8uppercharacter = utf8uppercharacter -- one character +lpegpatterns.utf8shapecharacter = utf8shapecharacter -- one character + +lpegpatterns.utf8lower = utf8lower -- string +lpegpatterns.utf8upper = utf8upper -- string +lpegpatterns.utf8shape = utf8shape -- string + +function characters.lower (str) return lpegmatch(utf8lower,str) end +function characters.upper (str) return lpegmatch(utf8upper,str) end +function characters.shaped(str) return lpegmatch(utf8shape,str) end + +-- local str = [[ +-- ÀÁÂÃÄÅàáâãäå àáâãäåàáâãäå ÀÁÂÃÄÅÀÁÂÃÄÅ AAAAAAaaaaaa +-- ÆÇæç æçæç ÆÇÆÇ AECaec +-- ÈÉÊËèéêë èéêëèéêë ÈÉÊËÈÉÊË EEEEeeee +-- ÌÍÎÏÞìíîïþ ìíîïþìíîïþ ÌÍÎÏÞÌÍÎÏÞ IIIIÞiiiiþ +-- Ðð ðð ÐÐ Ðð +-- Ññ ññ ÑÑ Nn +-- ÒÓÔÕÖòóôõö òóôõöòóôõö ÒÓÔÕÖÒÓÔÕÖ OOOOOooooo +-- Øø øø ØØ Oo +-- ÙÚÛÜùúûü ùúûüùúûü ÙÚÛÜÙÚÛÜ UUUUuuuu +-- Ýýÿ ýýÿ ÝÝŸ Yyy +-- ß ß SS ss +-- Ţţ ţţ ŢŢ Tt +-- ]] +-- +-- local lower = characters.lower print(lower(str)) +-- local upper = characters.upper print(upper(str)) +-- local shaped = characters.shaped print(shaped(str)) +-- +-- local c, n = os.clock(), 10000 +-- for i=1,n do lower(str) upper(str) shaped(str) end -- 2.08 => 0.77 +-- print(os.clock()-c,n*#str*3) -- maybe: (twice as fast when much ascii) -- @@ -827,15 +1147,6 @@ end function characters.uccode(n) return uccodes[n] end -- obsolete function characters.lccode(n) return lccodes[n] end -- obsolete -function characters.safechar(n) - local c = data[n] - if c and c.contextname then - return "\\" .. c.contextname - else - return utfchar(n) - end -end - function characters.shape(n) local shcode = shcodes[n] if not shcode then @@ -890,41 +1201,42 @@ end -- groupdata[group] = gdata -- end ---~ characters.data, characters.groups = chardata, groupdata - ---~ [0xF0000]={ ---~ category="co", ---~ cjkwd="a", ---~ description="", ---~ direction="l", ---~ unicodeslot=0xF0000, ---~ }, ---~ [0xFFFFD]={ ---~ category="co", ---~ cjkwd="a", ---~ description="", ---~ direction="l", ---~ unicodeslot=0xFFFFD, ---~ }, ---~ [0x100000]={ ---~ category="co", ---~ cjkwd="a", ---~ description="", ---~ direction="l", ---~ unicodeslot=0x100000, ---~ }, ---~ [0x10FFFD]={ ---~ category="co", ---~ cjkwd="a", ---~ description="", ---~ direction="l", ---~ unicodeslot=0x10FFFD, ---~ }, +-- characters.data, characters.groups = chardata, groupdata + +-- [0xF0000]={ +-- category="co", +-- cjkwd="a", +-- description="", +-- direction="l", +-- unicodeslot=0xF0000, +-- }, +-- [0xFFFFD]={ +-- category="co", +-- cjkwd="a", +-- description="", +-- direction="l", +-- unicodeslot=0xFFFFD, +-- }, +-- [0x100000]={ +-- category="co", +-- cjkwd="a", +-- description="", +-- direction="l", +-- unicodeslot=0x100000, +-- }, +-- [0x10FFFD]={ +-- category="co", +-- cjkwd="a", +-- description="", +-- direction="l", +-- unicodeslot=0x10FFFD, +-- }, if not characters.superscripts then local superscripts = allocate() characters.superscripts = superscripts local subscripts = allocate() characters.subscripts = subscripts + local fractions = allocate() characters.fractions = fractions -- skipping U+02120 (service mark) U+02122 (trademark) @@ -944,16 +1256,24 @@ if not characters.superscripts then elseif trace_defining then report_defining("ignoring %s %a, char %c, description %a","subscript",ustring(k),k,v.description) end + elseif what == "fraction" then + if #specials > 1 then + fractions[k] = { unpack(specials,2) } + elseif trace_defining then + report_defining("ignoring %s %a, char %c, description %a","fraction",ustring(k),k,v.description) + end end end end -- print(table.serialize(superscripts, "superscripts", { hexify = true })) -- print(table.serialize(subscripts, "subscripts", { hexify = true })) + -- print(table.serialize(fractions, "fractions", { hexify = true })) if storage then storage.register("characters/superscripts", superscripts, "characters.superscripts") storage.register("characters/subscripts", subscripts, "characters.subscripts") + storage.register("characters/fractions", fractions, "characters.fractions") end end @@ -976,259 +1296,6 @@ function characters.showstring(str) end end --- the following code will move to char-tex.lua - --- tex - -if not tex or not context or not commands then return characters end - -local tex = tex -local texsetlccode = tex.setlccode -local texsetuccode = tex.setuccode -local texsetsfcode = tex.setsfcode -local texsetcatcode = tex.setcatcode - -local contextsprint = context.sprint -local ctxcatcodes = catcodes.numbers.ctxcatcodes - ---[[ldx-- -

Instead of using a file to define the named glyphs, we -use the table. After all, we have this information available anyway.

---ldx]]-- - -function commands.makeactive(n,name) -- - contextsprint(ctxcatcodes,format("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name)) - -- context("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name) -end - -function commands.utfchar(c,n) - if n then - -- contextsprint(c,charfromnumber(n)) - contextsprint(c,utfchar(n)) - else - -- contextsprint(charfromnumber(c)) - contextsprint(utfchar(c)) - end -end - -function commands.safechar(n) - local c = data[n] - if c and c.contextname then - contextsprint("\\" .. c.contextname) -- context[c.contextname]() - else - contextsprint(utfchar(n)) - end -end - -tex.uprint = commands.utfchar - -local forbidden = tohash { -- at least now - 0x00A0, - 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, - 0x202F, - 0x205F, - -- 0xFEFF, -} - -function characters.define(tobelettered, tobeactivated) -- catcodetables - - if trace_defining then - report_defining("defining active character commands") - end - - local activated, a = { }, 0 - - for u, chr in next, data do -- these will be commands - local fallback = chr.fallback - if fallback then - contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") - a = a + 1 - activated[a] = u - else - local contextname = chr.contextname - if contextname then - local category = chr.category - if is_character[category] then - if chr.unicodeslot < 128 then - if is_letter[category] then - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s - else - contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s - end - else - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s - end - elseif is_command[category] and not forbidden[u] then - contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") - a = a + 1 - activated[a] = u - end - end - end - end - - if tobelettered then -- shared - local saved = tex.catcodetable - for i=1,#tobelettered do - tex.catcodetable = tobelettered[i] - if trace_defining then - report_defining("defining letters (global, shared)") - end - for u, chr in next, data do - if not chr.fallback and is_letter[chr.category] and u >= 128 and u <= 65536 then - texsetcatcode(u,11) - end - local range = chr.range - if range then - for i=1,range.first,range.last do -- tricky as not all are letters - texsetcatcode(i,11) - end - end - end - texsetcatcode(0x200C,11) -- non-joiner - texsetcatcode(0x200D,11) -- joiner - for k, v in next, blocks do - if v.catcode == "letter" then - for i=v.first,v.last do - texsetcatcode(i,11) - end - end - end - end - tex.catcodetable = saved - end - - local nofactivated = #tobeactivated - if tobeactivated and nofactivated > 0 then - for i=1,nofactivated do - local u = activated[i] - if u then - report_defining("character %U is active in set %a, containing %a",u,data[u].description,tobeactivated) - end - end - local saved = tex.catcodetable - for i=1,#tobeactivated do - local vector = tobeactivated[i] - if trace_defining then - report_defining("defining %a active characters in vector %a",nofactivated,vector) - end - tex.catcodetable = vector - for i=1,nofactivated do - local u = activated[i] - if u then - texsetcatcode(u,13) - end - end - end - tex.catcodetable = saved - end - -end - ---[[ldx-- -

Setting the lccodes is also done in a loop over the data table.

---ldx]]-- - -local sfmode = "unset" -- unset, traditional, normal - -function characters.setcodes() - if trace_defining then - report_defining("defining lc and uc codes") - end - local traditional = sfstate == "traditional" or sfstate == "unset" - for code, chr in next, data do - local cc = chr.category - if is_letter[cc] then - local range = chr.range - if range then - for i=range.first,range.last do - texsetcatcode(i,11) -- letter - texsetlccode(i,i,i) -- self self - end - else - local lc, uc = chr.lccode, chr.uccode - if not lc then - chr.lccode, lc = code, code - elseif type(lc) == "table" then - lc = code - end - if not uc then - chr.uccode, uc = code, code - elseif type(uc) == "table" then - uc = code - end - texsetcatcode(code,11) -- letter - texsetlccode(code,lc,uc) - if traditional and cc == "lu" then - texsetsfcode(code,999) - end - end - elseif is_mark[cc] then - texsetlccode(code,code,code) -- for hyphenation - end - end - if traditional then - sfstate = "traditional" - end -end - --- If this is something that is not documentwide and used a lot, then we --- need a more clever approach (trivial but not now). - -local function setuppersfcodes(v,n) - if sfstate ~= "unset" then - report_defining("setting uppercase sf codes to %a",n) - for code, chr in next, data do - if chr.category == "lu" then - texsetsfcode(code,n) - end - end - end - sfstate = v -end - -directives.register("characters.spaceafteruppercase",function(v) - if v == "traditional" then - setuppersfcodes(v,999) - elseif v == "normal" then - setuppersfcodes(v,1000) - end -end) - --- tex - -function commands.chardescription(slot) - local d = data[slot] - if d then - context(d.description) - end -end - --- xml - -characters.activeoffset = 0x10000 -- there will be remapped in that byte range - -function commands.remapentity(chr,slot) - contextsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr)) -end - --- xml.entities = xml.entities or { } --- --- storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml --- --- function characters.setmkiventities() --- local entities = xml.entities --- entities.lt = "<" --- entities.amp = "&" --- entities.gt = ">" --- end --- --- function characters.setmkiientities() --- local entities = xml.entities --- entities.lt = utfchar(characters.activeoffset + utfbyte("<")) --- entities.amp = utfchar(characters.activeoffset + utfbyte("&")) --- entities.gt = utfchar(characters.activeoffset + utfbyte(">")) --- end +-- code moved to char-tex.lua -commands.definecatcodetable = characters.define -commands.setcharactercodes = characters.setcodes +return characters diff --git a/Master/texmf-dist/tex/context/base/char-ini.mkiv b/Master/texmf-dist/tex/context/base/char-ini.mkiv index db52ae7239f..bb4483b7527 100644 --- a/Master/texmf-dist/tex/context/base/char-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/char-ini.mkiv @@ -13,11 +13,10 @@ \writestatus{loading}{ConTeXt Character Support / Initialization} -\registerctxluafile{char-def}{1.001} % let's load this one first -\registerctxluafile{char-ini}{1.001} -\registerctxluafile{char-cjk}{1.001} +\registerctxluafile{char-fio}{1.001} \registerctxluafile{char-map}{1.001} % maybe we will load this someplace else \registerctxluafile{char-tex}{1.001} +\registerctxluafile{char-ent}{1.001} \unprotect @@ -43,7 +42,8 @@ % use \normalUchar when possible .. the next one is nice for documents and it also accepts % 0x prefixed numbers -\def\utfchar#1{\ctxcommand{utfchar(\number#1)}} +\def\utfchar #1{\clf_utfchar \numexpr#1\relax} +\def\safechar#1{\clf_safechar\numexpr#1\relax} \def\checkedchar {\relax\ifmmode\expandafter\checkedmathchar\else\expandafter\checkedtextchar\fi} % #1#2 \def\checkedmathchar#1#2{#2} @@ -65,30 +65,26 @@ % \def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax} % \def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax } -\ctxcommand{setcharactercodes()} - % Is setting up vrb tpa and tpb needed? -\ctxcommand{definecatcodetable( - { % letter catcodes - \number\texcatcodes, - \number\ctxcatcodes, - \number\notcatcodes, - %number\mthcatcodes, - \number\vrbcatcodes, - \number\prtcatcodes, - \number\tpacatcodes, - \number\tpbcatcodes, - \number\txtcatcodes, - }, - { % activate catcodes - \number\ctxcatcodes, - \number\notcatcodes, - \number\prtcatcodes, % new - } -)} - -\def\chardescription#1% - {\ctxcommand{chardescription(\number#1)}} +% move to lua side + +%clf_setcharactercodes + +\clf_setlettercatcodes\texcatcodes +\clf_setlettercatcodes\ctxcatcodes +\clf_setlettercatcodes\notcatcodes +%clf_setlettercatcodes\mthcatcodes +\clf_setlettercatcodes\vrbcatcodes +\clf_setlettercatcodes\prtcatcodes +\clf_setlettercatcodes\tpacatcodes +\clf_setlettercatcodes\tpbcatcodes +\clf_setlettercatcodes\txtcatcodes + +\clf_setactivecatcodes\ctxcatcodes +\clf_setactivecatcodes\notcatcodes +\clf_setactivecatcodes\prtcatcodes + +\def\chardescription#1{\clf_chardescription#1\relax} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/char-tex.lua b/Master/texmf-dist/tex/context/base/char-tex.lua index 472cae930c3..48dccfe7915 100644 --- a/Master/texmf-dist/tex/context/base/char-tex.lua +++ b/Master/texmf-dist/tex/context/base/char-tex.lua @@ -6,17 +6,118 @@ if not modules then modules = { } end modules ['char-tex'] = { license = "see context related readme files" } -local lpeg = lpeg -local find = string.find +local lpeg = lpeg +local next, type = next, type +local format, find, gmatch = string.format, string.find, string.gmatch +local utfchar, utfbyte = utf.char, utf.byte +local concat, tohash = table.concat, table.tohash local P, C, R, S, V, Cs, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.V, lpeg.Cs, lpeg.Cc -local U, lpegmatch = lpeg.patterns.utf8, lpeg.match -local allocate, mark = utilities.storage.allocate, utilities.storage.mark +local lpegpatterns = lpeg.patterns +local lpegmatch = lpeg.match +local utfchartabletopattern = lpeg.utfchartabletopattern + +local allocate = utilities.storage.allocate +local mark = utilities.storage.mark + +local context = context +local commands = commands +local implement = interfaces.implement + +local characters = characters +local texcharacters = { } +characters.tex = texcharacters +local utffilters = characters.filters.utf + +local is_character = characters.is_character +local is_letter = characters.is_letter +local is_command = characters.is_command +local is_spacing = characters.is_spacing +local is_mark = characters.is_mark +local is_punctuation = characters.is_punctuation + +local data = characters.data if not data then return end +local blocks = characters.blocks + +local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end) + +local report_defining = logs.reporter("characters") + +--[[ldx-- +

In order to deal with 8-bit output, we need to find a way to go from to +8-bit. This is handled in the engine itself.

+ +

This leaves us problems with characters that are specific to like +{}, $ and alike. We can remap some chars that tex input files +are sensitive for to a private area (while writing to a utility file) and revert then +to their original slot when we read in such a file. Instead of reverting, we can (when +we resolve characters to glyphs) map them to their right glyph there. For this purpose +we can use the private planes 0x0F0000 and 0x100000.

+--ldx]]-- + +local low = allocate() +local high = allocate() +local escapes = allocate() +local special = "~#$%^&_{}\\|" -- "~#$%{}\\|" + +local private = { + low = low, + high = high, + escapes = escapes, +} + +utffilters.private = private + +for ch in gmatch(special,".") do + local cb + if type(ch) == "number" then + cb, ch = ch, utfchar(ch) + else + cb = utfbyte(ch) + end + if cb < 256 then + escapes[ch] = "\\" .. ch + low[ch] = utfchar(0x0F0000 + cb) + if ch == "%" then + ch = "%%" -- nasty, but we need this as in replacements (also in lpeg) % is interpreted + end + high[utfchar(0x0F0000 + cb)] = ch + end +end + +local tohigh = lpeg.replacer(low) -- frozen, only for basic tex +local tolow = lpeg.replacer(high) -- frozen, only for basic tex + +lpegpatterns.utftohigh = tohigh +lpegpatterns.utftolow = tolow + +function utffilters.harden(str) + return lpegmatch(tohigh,str) +end + +function utffilters.soften(str) + return lpegmatch(tolow,str) +end + +private.escape = utf.remapper(escapes) -- maybe: ,"dynamic" +private.replace = utf.remapper(low) -- maybe: ,"dynamic" +private.revert = utf.remapper(high) -- maybe: ,"dynamic" + +--[[ldx-- +

We get a more efficient variant of this when we integrate +replacements in collapser. This more or less renders the previous +private code redundant. The following code is equivalent but the +first snippet uses the relocated dollars.

-characters = characters or { } -local characters = characters -characters.tex = characters.tex or { } + +[󰀤x󰀤] [$x$] + +--ldx]]-- + +-- using the tree-lpeg-mapper would be nice but we also need to deal with end-of-string +-- cases: "\"\i" and don't want "\relax" to be seen as \r e lax" (for which we need to mess +-- with spaces local accentmapping = allocate { ['"'] = { [""] = "¨", @@ -128,7 +229,7 @@ local accentmapping = allocate { }, } -characters.tex.accentmapping = accentmapping +texcharacters.accentmapping = accentmapping local accent_map = allocate { -- incomplete ['~'] = "̃" , -- ̃ Ẽ @@ -150,7 +251,7 @@ local accent_map = allocate { -- incomplete -- ̰ Ḛ } --- local accents = table.concat(table.keys(accentmapping)) -- was _map +-- local accents = concat(table.keys(accentmapping)) -- was _map local function remap_accent(a,c,braced) local m = accentmapping[a] @@ -171,86 +272,495 @@ local function remap_accent(a,c,braced) end end -local command_map = allocate { - ["i"] = "ı", - ["l"] = "ł", - ["ss"] = "ß", - ["ae"] = "æ", - ["AE"] = "Æ", - ["oe"] = "œ", - ["OE"] = "Œ", - ["o"] = "ø", - ["O"] = "Ø", - ["aa"] = "å", - ["AA"] = "Å", +local commandmapping = allocate { + ["aa"] = "å", ["AA"] = "Å", + ["ae"] = "æ", ["AE"] = "Æ", + ["cc"] = "ç", ["CC"] = "Ç", + ["i"] = "ı", ["j"] = "ȷ", + ["ij"] = "ij", ["IJ"] = "IJ", + ["l"] = "ł", ["L"] = "Ł", + ["o"] = "ø", ["O"] = "Ø", + ["oe"] = "œ", ["OE"] = "Œ", + ["sz"] = "ß", ["SZ"] = "SZ", ["SS"] = "ß", } --- no need for U here - -local achar = R("az","AZ") + P("ı") + P("\\i") +texcharacters.commandmapping = commandmapping -local spaces = P(" ")^0 -local no_l = P("{") / "" -local no_r = P("}") / "" -local no_b = P('\\') / "" +-- local achar = R("az","AZ") + P("ı") + P("\\i") +-- +-- local spaces = P(" ")^0 +-- local no_l = P("{") / "" +-- local no_r = P("}") / "" +-- local no_b = P('\\') / "" +-- +-- local lUr = P("{") * C(achar) * P("}") +-- +-- local accents_1 = [["'.=^`~]] +-- local accents_2 = [[Hckruv]] +-- +-- local accent = P('\\') * ( +-- C(S(accents_1)) * (lUr * Cc(true) + C(achar) * Cc(false)) + -- we need achar for ı etc, could be sped up +-- C(S(accents_2)) * lUr * Cc(true) +-- ) / remap_accent +-- +-- local csname = P('\\') * C(R("az","AZ")^1) +-- +-- local command = ( +-- csname + +-- P("{") * csname * spaces * P("}") +-- ) / commandmapping -- remap_commands +-- +-- local both_1 = Cs { "run", +-- accent = accent, +-- command = command, +-- run = (V("accent") + no_l * V("accent") * no_r + V("command") + P(1))^0, +-- } +-- +-- local both_2 = Cs { "run", +-- accent = accent, +-- command = command, +-- run = (V("accent") + V("command") + no_l * ( V("accent") + V("command") ) * no_r + P(1))^0, +-- } +-- +-- function texcharacters.toutf(str,strip) +-- if not find(str,"\\") then +-- return str +-- elseif strip then +-- return lpegmatch(both_1,str) +-- else +-- return lpegmatch(both_2,str) +-- end +-- end -local lUr = P("{") * C(achar) * P("}") +local untex -local accents_1 = [["'.=^`~]] -local accents_2 = [[Hckruv]] +local function toutfpattern() + if not untex then + local hash = { } + for k, v in next, accentmapping do + for kk, vv in next, v do + if (k >= "a" and k <= "z") or (k >= "A" and k <= "Z") then + hash[ "\\"..k.." "..kk ] = vv + hash["{\\"..k.." "..kk.."}"] = vv + else + hash["\\" ..k ..kk ] = vv + hash["{\\"..k ..kk.."}"] = vv + end + hash["\\" ..k.."{"..kk.."}" ] = vv + hash["{\\"..k.."{"..kk.."}}"] = vv + end + end + for k, v in next, commandmapping do + hash["\\"..k.." "] = v + hash["{\\"..k.."}"] = v + hash["{\\"..k.." }"] = v + end + untex = utfchartabletopattern(hash) / hash + end + return untex +end -local accent = P('\\') * ( - C(S(accents_1)) * (lUr * Cc(true) + C(achar) * Cc(false)) + -- we need achar for ı etc, could be sped up - C(S(accents_2)) * lUr * Cc(true) -) / remap_accent +texcharacters.toutfpattern = toutfpattern -local csname = P('\\') * C(R("az","AZ")^1) +local pattern = nil -local command = ( - csname + - P("{") * csname * spaces * P("}") -) / command_map -- remap_commands +local function prepare() + pattern = Cs((toutfpattern() + P(1))^0) + return pattern +end -local both_1 = Cs { "run", - accent = accent, - command = command, - run = (V("accent") + no_l * V("accent") * no_r + V("command") + P(1))^0, -} +function texcharacters.toutf(str,strip) + if str == "" then + return str + elseif not find(str,"\\") then + return str + -- elseif strip then + else + return lpegmatch(pattern or prepare(),str) + end +end -local both_2 = Cs { "run", - accent = accent, - command = command, - run = (V("accent") + V("command") + no_l * ( V("accent") + V("command") ) * no_r + P(1))^0, -} +-- print(texcharacters.toutf([[\~{Z}]],true)) +-- print(texcharacters.toutf([[\'\i]],true)) +-- print(texcharacters.toutf([[\'{\i}]],true)) +-- print(texcharacters.toutf([[\"{e}]],true)) +-- print(texcharacters.toutf([[\" {e}]],true)) +-- print(texcharacters.toutf([[{\"{e}}]],true)) +-- print(texcharacters.toutf([[{\" {e}}]],true)) +-- print(texcharacters.toutf([[{\l}]],true)) +-- print(texcharacters.toutf([[{\l }]],true)) +-- print(texcharacters.toutf([[\v{r}]],true)) +-- print(texcharacters.toutf([[fo{\"o}{\ss}ar]],true)) +-- print(texcharacters.toutf([[H{\'a}n Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}} Th{\'a}nh]],true)) -function characters.tex.toutf(str,strip) - if not find(str,"\\") then - return str - elseif strip then - return lpegmatch(both_1,str) +function texcharacters.safechar(n) -- was characters.safechar + local c = data[n] + if c and c.contextname then + return "\\" .. c.contextname else - return lpegmatch(both_2,str) + return utfchar(n) end end --- print(characters.tex.toutf([[\~{Z}]],true)) --- print(characters.tex.toutf([[\'\i]],true)) --- print(characters.tex.toutf([[\'{\i}]],true)) --- print(characters.tex.toutf([[\"{e}]],true)) --- print(characters.tex.toutf([[\" {e}]],true)) --- print(characters.tex.toutf([[{\"{e}}]],true)) --- print(characters.tex.toutf([[{\" {e}}]],true)) --- print(characters.tex.toutf([[{\l}]],true)) --- print(characters.tex.toutf([[{\l }]],true)) --- print(characters.tex.toutf([[\v{r}]],true)) --- print(characters.tex.toutf([[fo{\"o}{\ss}ar]],true)) --- print(characters.tex.toutf([[H{\'a}n Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}} Th{\'a}nh]],true)) - -function characters.tex.defineaccents() +if not context or not commands then + -- used in e.g. mtx-bibtex + return +end + +-- all kind of initializations + +local tex = tex +local texsetlccode = tex.setlccode +local texsetuccode = tex.setuccode +local texsetsfcode = tex.setsfcode +local texsetcatcode = tex.setcatcode + +local contextsprint = context.sprint +local ctxcatcodes = catcodes.numbers.ctxcatcodes + +function texcharacters.defineaccents() + local ctx_dodefineaccentcommand = context.dodefineaccentcommand + local ctx_dodefineaccent = context.dodefineaccent + local ctx_dodefinecommand = context.dodefinecommand for accent, group in next, accentmapping do - context.dodefineaccentcommand(accent) + ctx_dodefineaccentcommand(accent) for character, mapping in next, group do - context.dodefineaccent(accent,character,mapping) + ctx_dodefineaccent(accent,character,mapping) + end + end + for command, mapping in next, commandmapping do + ctx_dodefinecommand(command,mapping) + end +end + +implement { -- a waste of scanner but consistent + name = "defineaccents", + actions = texcharacters.defineaccents +} + +--[[ldx-- +

Instead of using a file to define the named glyphs, we +use the table. After all, we have this information available anyway.

+--ldx]]-- + +function commands.makeactive(n,name) -- not used + contextsprint(ctxcatcodes,format("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name)) + -- context("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name) +end + +implement { + name = "utfchar", + actions = { utfchar, contextsprint }, + arguments = "integer" +} + +implement { + name = "safechar", + actions = { texcharacters.safechar, contextsprint }, + arguments = "integer" +} + +implement { + name = "uchar", + arguments = { "integer", "integer" }, + actions = function(h,l) + context(utfchar(h*256+l)) + end +} + +tex.uprint = commands.utfchar + +-- in contect we don't use lc and uc codes (in fact in luatex we should have a hf code) +-- so at some point we might drop this + +local forbidden = tohash { -- at least now + 0x00A0, + 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, + 0x202F, + 0x205F, + -- 0xFEFF, +} + +local csletters = characters.csletters -- also a signal that we have initialized +local activated = { } +local sfmode = "unset" -- unset, traditional, normal +local block_too = false + +directives.register("characters.blockstoo",function(v) block_too = v end) + +-- If this is something that is not documentwide and used a lot, then we +-- need a more clever approach (trivial but not now). + +local function setuppersfcodes(v,n) + if sfstate ~= "unset" then + report_defining("setting uppercase sf codes to %a",n) + for u, chr in next, data do + if chr.category == "lu" then + texsetsfcode(u,n) + end end end + sfstate = v end + +directives.register("characters.spaceafteruppercase",function(v) + if v == "traditional" then + setuppersfcodes(v,999) + elseif v == "normal" then + setuppersfcodes(v,1000) + end +end) + +if not csletters then + + csletters = allocate() + characters.csletters = csletters + + report_defining("setting up character related codes and commands") + + if sfstate == "unset" then + sfstate = "traditional" + end + + local traditional = sfstate == "traditional" + + for u, chr in next, data do -- will move up + local fallback = chr.fallback + if fallback then + contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") + activated[#activated+1] = u + else + local contextname = chr.contextname + local category = chr.category + local isletter = is_letter[category] + if contextname then + if is_character[category] then + if chr.unicodeslot < 128 then + if isletter then + -- setmacro + local c = utfchar(u) + contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + csletters[c] = u + else + -- setchar + contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s + end + else + -- setmacro + local c = utfchar(u) + contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + if isletter and u >= 32 and u <= 65536 then + csletters[c] = u + end + end + -- + if isletter then + local lc, uc = chr.lccode, chr.uccode + if not lc then + chr.lccode, lc = u, u + elseif type(lc) == "table" then + lc = u + end + if not uc then + chr.uccode, uc = u, u + elseif type(uc) == "table" then + uc = u + end + texsetlccode(u,lc,uc) + if traditional and category == "lu" then + texsetsfcode(code,999) + end + end + -- + elseif is_command[category] and not forbidden[u] then + -- set + contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") + activated[#activated+1] = u + elseif is_mark[category] then + texsetlccode(u,u,u) -- for hyphenation + end + elseif isletter and u >= 32 and u <= 65536 then + csletters[utfchar(u)] = u + -- + local lc, uc = chr.lccode, chr.uccode + if not lc then + chr.lccode, lc = u, u + elseif type(lc) == "table" then + lc = u + end + if not uc then + chr.uccode, uc = u, u + elseif type(uc) == "table" then + uc = u + end + texsetlccode(u,lc,uc) + if traditional and category == "lu" then + texsetsfcode(code,999) + end + -- + elseif is_mark[category] then + -- + texsetlccode(u,u,u) -- for hyphenation + -- + end + end + end + + if blocks_too then + -- this slows down format generation by over 10 percent + for k, v in next, blocks do + if v.catcode == "letter" then + for u=v.first,v.last do + csletters[utfchar(u)] = u + -- + -- texsetlccode(u,u,u) -- self self + -- + end + end + end + end + + if storage then + storage.register("characters/csletters", csletters, "characters.csletters") + end + +else + mark(csletters) + +end + +lpegpatterns.csletter = utfchartabletopattern(csletters) + +-- todo: get rid of activated +-- todo: move first loop out ,merge with above + +function characters.setlettercatcodes(cct) + if trace_defining then + report_defining("assigning letter catcodes to catcode table %a",cct) + end + local saved = tex.catcodetable + tex.catcodetable = cct + texsetcatcode(0x200C,11) -- non-joiner + texsetcatcode(0x200D,11) -- joiner + for c, u in next, csletters do + texsetcatcode(u,11) + end + -- for u, chr in next, data do + -- if not chr.fallback and is_letter[chr.category] and u >= 32 and u <= 65536 then + -- texsetcatcode(u,11) + -- end + -- local range = chr.range + -- if range then + -- for i=1,range.first,range.last do -- tricky as not all are letters + -- texsetcatcode(i,11) + -- end + -- end + -- end + -- for k, v in next, blocks do + -- if v.catcode == "letter" then + -- for u=v.first,v.last do + -- texsetcatcode(u,11) + -- end + -- end + -- end + tex.catcodetable = saved +end + +function characters.setactivecatcodes(cct) + local saved = tex.catcodetable + tex.catcodetable = cct + for i=1,#activated do + local u = activated[i] + texsetcatcode(u,13) + if trace_defining then + report_defining("character %U (%s) is active in set %a",u,data[u].description,cct) + end + end + tex.catcodetable = saved +end + +--[[ldx-- +

Setting the lccodes is also done in a loop over the data table.

+--ldx]]-- + +-- function characters.setcodes() -- we could loop over csletters +-- if trace_defining then +-- report_defining("defining lc and uc codes") +-- end +-- local traditional = sfstate == "traditional" or sfstate == "unset" +-- for code, chr in next, data do +-- local cc = chr.category +-- if is_letter[cc] then +-- local range = chr.range +-- if range then +-- for i=range.first,range.last do +-- texsetlccode(i,i,i) -- self self +-- end +-- else +-- local lc, uc = chr.lccode, chr.uccode +-- if not lc then +-- chr.lccode, lc = code, code +-- elseif type(lc) == "table" then +-- lc = code +-- end +-- if not uc then +-- chr.uccode, uc = code, code +-- elseif type(uc) == "table" then +-- uc = code +-- end +-- texsetlccode(code,lc,uc) +-- if traditional and cc == "lu" then +-- texsetsfcode(code,999) +-- end +-- end +-- elseif is_mark[cc] then +-- texsetlccode(code,code,code) -- for hyphenation +-- end +-- end +-- if traditional then +-- sfstate = "traditional" +-- end +-- end + +-- tex + +implement { + name = "chardescription", + arguments = "integer", + actions = function(slot) + local d = data[slot] + if d then + context(d.description) + end + end, +} + +-- xml + +characters.activeoffset = 0x10000 -- there will be remapped in that byte range + +function commands.remapentity(chr,slot) -- not used + contextsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr)) +end + +-- xml.entities = xml.entities or { } +-- +-- storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml +-- +-- function characters.setmkiventities() +-- local entities = xml.entities +-- entities.lt = "<" +-- entities.amp = "&" +-- entities.gt = ">" +-- end +-- +-- function characters.setmkiientities() +-- local entities = xml.entities +-- entities.lt = utfchar(characters.activeoffset + utfbyte("<")) +-- entities.amp = utfchar(characters.activeoffset + utfbyte("&")) +-- entities.gt = utfchar(characters.activeoffset + utfbyte(">")) +-- end + +implement { name = "setlettercatcodes", scope = "private", actions = characters.setlettercatcodes, arguments = "integer" } +implement { name = "setactivecatcodes", scope = "private", actions = characters.setactivecatcodes, arguments = "integer" } +--------- { name = "setcharactercodes", scope = "private", actions = characters.setcodes } diff --git a/Master/texmf-dist/tex/context/base/char-utf.lua b/Master/texmf-dist/tex/context/base/char-utf.lua index d406b8bfefe..9ed861be097 100644 --- a/Master/texmf-dist/tex/context/base/char-utf.lua +++ b/Master/texmf-dist/tex/context/base/char-utf.lua @@ -6,11 +6,6 @@ if not modules then modules = { } end modules ['char-utf'] = { license = "see context related readme files" } --- todo: trackers --- todo: no longer special characters (high) here, only needed in special cases and --- these don't go through this file anyway --- graphemes: basic symbols - --[[ldx--

When a sequence of characters enters the application, it may be neccessary to collapse subsequences into their composed variant.

@@ -24,33 +19,51 @@ of output (for instance ).

over a string.

--ldx]]-- -local concat, gmatch, gsub, find = table.concat, string.gmatch, string.gsub, string.find +local gsub, find = string.gsub, string.find +local concat, sortedhash, keys, sort = table.concat, table.sortedhash, table.keys, table.sort local utfchar, utfbyte, utfcharacters, utfvalues = utf.char, utf.byte, utf.characters, utf.values -local allocate = utilities.storage.allocate -local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns +local P, Cs, Cmt, Ct = lpeg.P, lpeg.Cs, lpeg.Cmt, lpeg.Ct + +if not characters then require("char-def") end +if not characters.blocks then require("char-ini") end + +local lpegmatch = lpeg.match +local lpegpatterns = lpeg.patterns +local p_utf8character = lpegpatterns.utf8character +local p_utf8byte = lpegpatterns.utf8byte +local utfchartabletopattern = lpeg.utfchartabletopattern + +local formatters = string.formatters + +local allocate = utilities.storage.allocate or function() return { } end + +local charfromnumber = characters.fromnumber -local charfromnumber = characters.fromnumber +characters = characters or { } +local characters = characters -characters = characters or { } -local characters = characters +local graphemes = allocate() +characters.graphemes = graphemes -characters.graphemes = allocate() -local graphemes = characters.graphemes +local collapsed = allocate() +characters.collapsed = collapsed -characters.combined = allocate() -local combined = characters.combined +local combined = allocate() +characters.combined = combined -characters.decomposed = allocate() -local decomposed = characters.decomposed +local decomposed = allocate() +characters.decomposed = decomposed -characters.mathpairs = allocate() -local mathpairs = characters.mathpairs +local mathpairs = allocate() +characters.mathpairs = mathpairs -characters.filters = allocate() -local filters = characters.filters +local filters = allocate() +characters.filters = filters -filters.utf = filters.utf or { } -local utffilters = characters.filters.utf +local utffilters = { } +characters.filters.utf = utffilters + +local data = characters.data -- is characters.combined cached? @@ -59,7 +72,9 @@ local utffilters = characters.filters.utf to depend on collapsing.

--ldx]]-- --- for the moment, will be entries in char-def.lua +-- for the moment, will be entries in char-def.lua .. this is just a subset that for +-- typographic (font) reasons we want to have split ... if we decompose all, we get +-- problems with fonts local decomposed = allocate { ["IJ"] = "IJ", @@ -81,24 +96,97 @@ local decomposed = allocate { characters.decomposed = decomposed -local function initialize() -- maybe only 'mn' +-- local function initialize() -- maybe only 'mn' +-- local data = characters.data +-- for unicode, v in next, data do +-- -- using vs and first testing for length is faster (.02->.01 s) +-- local vs = v.specials +-- if vs and #vs == 3 then +-- local vc = vs[1] +-- if vc == "char" then +-- local one, two = vs[2], vs[3] +-- if data[two].category == "mn" then +-- local cgf = combined[one] +-- if not cgf then +-- cgf = { [two] = unicode } +-- combined[one] = cgf +-- else +-- cgf[two] = unicode +-- end +-- end +-- local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) +-- local cgf = graphemes[first] +-- if not cgf then +-- cgf = { [second] = combination } +-- graphemes[first] = cgf +-- else +-- cgf[second] = combination +-- end +-- if v.mathclass or v.mathspec then +-- local mps = mathpairs[two] +-- if not mps then +-- mps = { [one] = unicode } +-- mathpairs[two] = mps +-- else +-- mps[one] = unicode -- here unicode +-- end +-- local mps = mathpairs[second] +-- if not mps then +-- mps = { [first] = combination } +-- mathpairs[second] = mps +-- else +-- mps[first] = combination +-- end +-- end +-- -- elseif vc == "compat" then +-- -- else +-- -- local description = v.description +-- -- if find(description,"LIGATURE") then +-- -- if vs then +-- -- local t = { } +-- -- for i=2,#vs do +-- -- t[#t+1] = utfchar(vs[i]) +-- -- end +-- -- decomposed[utfchar(unicode)] = concat(t) +-- -- else +-- -- local vs = v.shcode +-- -- if vs then +-- -- local t = { } +-- -- for i=1,#vs do +-- -- t[i] = utfchar(vs[i]) +-- -- end +-- -- decomposed[utfchar(unicode)] = concat(t) +-- -- end +-- -- end +-- -- end +-- end +-- end +-- end +-- initialize = false +-- characters.initialize = function() end -- when used outside tex +-- end + +local function initialize() local data = characters.data + local function backtrack(v,last,target) + local vs = v.specials + if vs and #vs == 3 and vs[1] == "char" then + local one, two = vs[2], vs[3] + local first, second = utfchar(one), utfchar(two) .. last + collapsed[first..second] = target + backtrack(data[one],second,target) + end + end for unicode, v in next, data do - -- using vs and first testing for length is faster (.02->.01 s) local vs = v.specials - local vc = vs and #vs == 3 and vs[1] - if vc == "char" then + if vs and #vs == 3 and vs[1] == "char" then + -- local one, two = vs[2], vs[3] - if data[two].category == "mn" then - local cgf = combined[one] - if not cgf then - cgf = { [two] = unicode } - combined[one] = cgf - else - cgf[two] = unicode - end - end local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) + -- + collapsed[first..second] = combination + backtrack(data[one],second,combination) + -- sort of obsolete: local cgf = graphemes[first] if not cgf then cgf = { [second] = combination } @@ -106,6 +194,7 @@ local function initialize() -- maybe only 'mn' else cgf[second] = combination end + -- if v.mathclass or v.mathspec then local mps = mathpairs[two] if not mps then @@ -122,239 +211,165 @@ local function initialize() -- maybe only 'mn' mps[first] = combination end end - -- elseif vc == "compat" then - -- else - -- local description = v.description - -- if find(description,"LIGATURE") then - -- if vs then - -- local t = { } - -- for i=2,#vs do - -- t[#t+1] = utfchar(vs[i]) - -- end - -- decomposed[utfchar(unicode)] = concat(t) - -- else - -- local vs = v.shcode - -- if vs then - -- local t = { } - -- for i=1,#vs do - -- t[i] = utfchar(vs[i]) - -- end - -- decomposed[utfchar(unicode)] = concat(t) - -- end - -- end - -- end end end initialize = false - characters.initialize = function() end -- when used outside tex + characters.initialize = function() end end characters.initialize = initialize --- utffilters.addgrapheme(utfchar(318),'l','\string~') --- utffilters.addgrapheme('c','a','b') - -function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number - local result = charfromnumber(result) - local first = charfromnumber(first) - local second = charfromnumber(second) - if not graphemes[first] then - graphemes[first] = { [second] = result } - else - graphemes[first][second] = result - end -end - --[[ldx-- -

In order to deal with 8-bit output, we need to find a way to go from to -8-bit. This is handled in the engine itself.

- -

This leaves us problems with characters that are specific to like -{}, $ and alike. We can remap some chars that tex input files -are sensitive for to a private area (while writing to a utility file) and revert then -to their original slot when we read in such a file. Instead of reverting, we can (when -we resolve characters to glyphs) map them to their right glyph there. For this purpose -we can use the private planes 0x0F0000 and 0x100000.

+

The next variant has lazy token collecting, on a 140 page mk.tex this saves +about .25 seconds, which is understandable because we have no graphemes and +not collecting tokens is not only faster but also saves garbage collecting. +

--ldx]]-- -local low = allocate() -local high = allocate() -local escapes = allocate() -local special = "~#$%^&_{}\\|" -- "~#$%{}\\|" - -local private = { - low = low, - high = high, - escapes = escapes, -} - -utffilters.private = private - -local tohigh = lpeg.replacer(low) -- frozen, only for basic tex -local tolow = lpeg.replacer(high) -- frozen, only for basic tex - -lpegpatterns.utftohigh = tohigh -lpegpatterns.utftolow = tolow - -function utffilters.harden(str) - return lpegmatch(tohigh,str) -end - -function utffilters.soften(str) - return lpegmatch(tolow,str) -end +local skippable = { } +local filesuffix = file.suffix -local function set(ch) - local cb - if type(ch) == "number" then - cb, ch = ch, utfchar(ch) - else - cb = utfbyte(ch) +function utffilters.setskippable(suffix,value) + if value == nil then + value = true end - if cb < 256 then - escapes[ch] = "\\" .. ch - low[ch] = utfchar(0x0F0000 + cb) - if ch == "%" then - ch = "%%" -- nasty, but we need this as in replacements (also in lpeg) % is interpreted + if type(suffix) == "table" then + for i=1,#suffix do + skippable[suffix[i]] = value end - high[utfchar(0x0F0000 + cb)] = ch + else + skippable[suffix] = value end end -private.set = set - --- function private.escape (str) return gsub(str,"(.)", escapes) end --- function private.replace(str) return utfgsub(str,"(.)", low ) end --- function private.revert (str) return utfgsub(str,"(.)", high ) end - -private.escape = utf.remapper(escapes) -private.replace = utf.remapper(low) -private.revert = utf.remapper(high) - -for ch in gmatch(special,".") do set(ch) end - ---[[ldx-- -

We get a more efficient variant of this when we integrate -replacements in collapser. This more or less renders the previous -private code redundant. The following code is equivalent but the -first snippet uses the relocated dollars.

+-- function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse) +-- if skippable[filesuffix(filename)] then +-- return str +-- -- elseif find(filename,"^virtual://") then +-- -- return str +-- -- else +-- -- -- print("\n"..filename) +-- end +-- if str and str ~= "" then +-- local nstr = #str +-- if nstr > 1 then +-- if initialize then -- saves a call +-- initialize() +-- end +-- local tokens, t, first, done, n = { }, 0, false, false, 0 +-- for second in utfcharacters(str) do +-- if done then +-- if first then +-- if second == " " then +-- t = t + 1 +-- tokens[t] = first +-- first = second +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- t = t + 1 +-- -- tokens[t] = first +-- -- first = crs +-- -- else +-- local cgf = graphemes[first] +-- if cgf and cgf[second] then +-- first = cgf[second] +-- else +-- t = t + 1 +-- tokens[t] = first +-- first = second +-- end +-- -- end +-- end +-- elseif second == " " then +-- first = second +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- first = crs +-- -- else +-- first = second +-- -- end +-- end +-- elseif second == " " then +-- first = nil +-- n = n + 1 +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- for s in utfcharacters(str) do +-- -- if n == 1 then +-- -- break +-- -- else +-- -- t = t + 1 +-- -- tokens[t] = s +-- -- n = n - 1 +-- -- end +-- -- end +-- -- if first then +-- -- t = t + 1 +-- -- tokens[t] = first +-- -- end +-- -- first = crs +-- -- done = true +-- -- else +-- local cgf = graphemes[first] +-- if cgf and cgf[second] then +-- for s in utfcharacters(str) do +-- if n == 1 then +-- break +-- else +-- t = t + 1 +-- tokens[t] = s +-- n = n - 1 +-- end +-- end +-- first = cgf[second] +-- done = true +-- else +-- first = second +-- n = n + 1 +-- end +-- -- end +-- end +-- end +-- if done then +-- if first then +-- t = t + 1 +-- tokens[t] = first +-- end +-- return concat(tokens) -- seldom called +-- end +-- elseif nstr > 0 then +-- return high[str] or str -- this will go from here +-- end +-- end +-- return str +-- end - -[󰀤x󰀤] [$x$] - +-- this is about twice as fast -

The next variant has lazy token collecting, on a 140 page mk.tex this saves -about .25 seconds, which is understandable because we have no graphemes and -not collecting tokens is not only faster but also saves garbage collecting. -

---ldx]]-- +local p_collapse = nil -- so we can reset if needed -local skippable = table.tohash { "mkiv", "mkvi" } -local filesuffix = file.suffix +local function prepare() + if initialize then + initialize() + end + local tree = utfchartabletopattern(collapsed) + p_collapse = Cs((tree/collapsed + p_utf8character)^0 * P(-1)) -- the P(1) is needed in order to accept non utf +end -function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse) - if skippable[filesuffix(filename)] then - return str - -- elseif find(filename,"^virtual://") then - -- return str - -- else - -- -- print("\n"..filename) +function utffilters.collapse(str,filename) + if not p_collapse then + prepare() end - if str and str ~= "" then - local nstr = #str - if nstr > 1 then - if initialize then -- saves a call - initialize() - end - local tokens, t, first, done, n = { }, 0, false, false, 0 - for second in utfcharacters(str) do - if done then - if first then - if second == " " then - t = t + 1 - tokens[t] = first - first = second - else - -- local crs = high[second] - -- if crs then - -- t = t + 1 - -- tokens[t] = first - -- first = crs - -- else - local cgf = graphemes[first] - if cgf and cgf[second] then - first = cgf[second] - else - t = t + 1 - tokens[t] = first - first = second - end - -- end - end - elseif second == " " then - first = second - else - -- local crs = high[second] - -- if crs then - -- first = crs - -- else - first = second - -- end - end - elseif second == " " then - first = nil - n = n + 1 - else - -- local crs = high[second] - -- if crs then - -- for s in utfcharacters(str) do - -- if n == 1 then - -- break - -- else - -- t = t + 1 - -- tokens[t] = s - -- n = n - 1 - -- end - -- end - -- if first then - -- t = t + 1 - -- tokens[t] = first - -- end - -- first = crs - -- done = true - -- else - local cgf = graphemes[first] - if cgf and cgf[second] then - for s in utfcharacters(str) do - if n == 1 then - break - else - t = t + 1 - tokens[t] = s - n = n - 1 - end - end - first = cgf[second] - done = true - else - first = second - n = n + 1 - end - -- end - end - end - if done then - if first then - t = t + 1 - tokens[t] = first - end - return concat(tokens) -- seldom called - end - elseif nstr > 0 then - return high[str] or str - end + if not str or #str == "" or #str == 1 then + return str + elseif filename and skippable[filesuffix(filename)] then -- we could hash the collapsables or do a quicker test + return str + else + return lpegmatch(p_collapse,str) or str end - return str end -- function utffilters.decompose(str) @@ -399,40 +414,231 @@ end -- return str -- end -local tree = lpeg.utfchartabletopattern(table.keys(decomposed)) -local finder = lpeg.finder(tree,false,true) -local replacer = lpeg.replacer(tree,decomposed,false,true) +-- local replacer = nil +-- local finder = nil +-- +-- function utffilters.decompose(str) -- 3 to 4 times faster than the above +-- if not replacer then +-- if initialize then +-- initialize() +-- end +-- local tree = utfchartabletopattern(decomposed) +-- finder = lpeg.finder(tree,false,true) +-- replacer = lpeg.replacer(tree,decomposed,false,true) +-- end +-- if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then +-- return lpegmatch(replacer,str) +-- end +-- return str +-- end + +local p_decompose = nil + +local function prepare() + if initialize then + initialize() + end + local tree = utfchartabletopattern(decomposed) + p_decompose = Cs((tree/decomposed + p_utf8character)^0 * P(-1)) +end -function utffilters.decompose(str) -- 3 to 4 times faster than the above - if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then - return lpegmatch(replacer,str) +function utffilters.decompose(str,filename) -- 3 to 4 times faster than the above + if not p_decompose then + prepare() + end + if str and str ~= "" and #str > 1 then + return lpegmatch(p_decompose,str) + end + if not str or #str == "" or #str < 2 then + return str + elseif filename and skippable[filesuffix(filename)] then + return str + else + return lpegmatch(p_decompose,str) or str end return str end -local sequencers = utilities.sequencers +-- utffilters.addgrapheme(utfchar(318),'l','\string~') +-- utffilters.addgrapheme('c','a','b') + +function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number + local result = charfromnumber(result) + local first = charfromnumber(first) + local second = charfromnumber(second) + if not graphemes[first] then + graphemes[first] = { [second] = result } + else + graphemes[first][second] = result + end + local pair = first .. second + if not composed[pair] then + composed[pair] = result + p_composed = nil + end +end + +interfaces.implement { + name = "addgrapheme", + actions = utffilters.addgrapheme, + arguments = { "string", "string", "string" } +} + +-- -- + +local p_reorder = nil + +-- local sorter = function(a,b) return b[2] < a[2] end +-- +-- local function swapper(s,p,t) +-- local old = { } +-- for i=1,#t do +-- old[i] = t[i][1] +-- end +-- old = concat(old) +-- sort(t,sorter) +-- for i=1,#t do +-- t[i] = t[i][1] +-- end +-- local new = concat(t) +-- if old ~= new then +-- print("reordered",old,"->",new) +-- end +-- return p, new +-- end + +-- -- the next one isnto stable for similar weights + +local sorter = function(a,b) + return b[2] < a[2] +end + +local function swapper(s,p,t) + sort(t,sorter) + for i=1,#t do + t[i] = t[i][1] + end + return p, concat(t) +end -if sequencers then +-- -- the next one keeps similar weights in the original order +-- +-- local sorter = function(a,b) +-- local b2, a2 = b[2], a[2] +-- if a2 == b2 then +-- return b[3] > a[3] +-- else +-- return b2 < a2 +-- end +-- end +-- +-- local function swapper(s,p,t) +-- for i=1,#t do +-- t[i][3] = i +-- end +-- sort(t,sorter) +-- for i=1,#t do +-- t[i] = t[i][1] +-- end +-- return p, concat(t) +-- end - local textfileactions = resolvers.openers.helpers.textfileactions +-- at some point exceptions will become an option, for now it's an experiment +-- to overcome bugs (that have become features) in unicode .. or we might decide +-- for an extra ordering key in char-def that takes precedence over combining - sequencers.appendaction (textfileactions,"system","characters.filters.utf.collapse") - sequencers.disableaction(textfileactions,"characters.filters.utf.collapse") +local exceptions = { + -- frozen unicode bug + ["َّ"] = "َّ", -- U+64E .. U+651 => U+651 .. U+64E +} - sequencers.appendaction (textfileactions,"system","characters.filters.utf.decompose") - sequencers.disableaction(textfileactions,"characters.filters.utf.decompose") +local function prepare() + local hash = { } + for k, v in sortedhash(characters.data) do + local combining = v.combining -- v.ordering or v.combining + if combining then + hash[utfchar(k)] = { utfchar(k), combining, 0 } -- slot 3 can be used in sort + end + end + local e = utfchartabletopattern(exceptions) + local p = utfchartabletopattern(hash) + p_reorder = Cs((e/exceptions + Cmt(Ct((p/hash)^2),swapper) + p_utf8character)^0) * P(-1) +end - function characters.filters.utf.enable() - sequencers.enableaction(textfileactions,"characters.filters.utf.collapse") - sequencers.enableaction(textfileactions,"characters.filters.utf.decompose") +function utffilters.reorder(str,filename) + if not p_reorder then + prepare() + end + if not str or #str == "" or #str < 2 then + return str + elseif filename and skippable[filesuffix(filename)] then + return str + else + return lpegmatch(p_reorder,str) or str end + return str +end - directives.register("filters.utf.collapse", function(v) - sequencers[v and "enableaction" or "disableaction"](textfileactions,"characters.filters.utf.collapse") - end) +-- local collapse = utffilters.collapse +-- local decompose = utffilters.decompose +-- local preprocess = utffilters.preprocess +-- +-- local c1, c2, c3 = "a", "̂", "̃" +-- local r2, r3 = "â", "ẫ" +-- local l1 = "ffl" +-- +-- local str = c1..c2..c3 .. " " .. c1..c2 .. " " .. l1 +-- local res = r3 .. " " .. r2 .. " " .. "ffl" +-- +-- local text = io.loaddata("t:/sources/tufte.tex") +-- +-- local function test(n) +-- local data = text .. string.rep(str,100) .. text +-- local okay = text .. string.rep(res,100) .. text +-- local t = os.clock() +-- for i=1,10000 do +-- collapse(data) +-- decompose(data) +-- -- preprocess(data) +-- end +-- print(os.clock()-t,decompose(collapse(data))==okay,decompose(collapse(str))) +-- end +-- +-- test(050) +-- test(150) +-- +-- local old = "foo" .. string.char(0xE1) .. "bar" +-- local new = collapse(old) +-- print(old,new) + +-- local one_old = "فَأَصَّدَّقَ دَّ" local one_new = utffilters.reorder(one_old) +-- local two_old = "فَأَصَّدَّقَ دَّ" local two_new = utffilters.reorder(two_old) +-- +-- print(one_old,two_old,one_old==two_old,false) +-- print(one_new,two_new,one_new==two_new,true) +-- +-- local test = "foo" .. utf.reverse("ؚ" .. "ً" .. "ٌ" .. "ٍ" .. "َ" .. "ُ" .. "ِ" .. "ّ" .. "ْ" ) .. "bar" +-- local done = utffilters.reorder(test) +-- +-- print(test,done,test==done,false) + +local f_default = formatters["[%U] "] +local f_description = formatters["[%s] "] + +local function convert(n) + local d = data[n] + d = d and d.description + if d then + return f_description(d) + else + return f_default(n) + end +end - directives.register("filters.utf.decompose", function(v) - sequencers[v and "enableaction" or "disableaction"](textfileactions,"characters.filters.utf.decompose") - end) +local pattern = Cs((p_utf8byte / convert)^1) +function utffilters.verbose(data) + return data and lpegmatch(pattern,data) or "" end + +return characters diff --git a/Master/texmf-dist/tex/context/base/char-utf.mkiv b/Master/texmf-dist/tex/context/base/char-utf.mkiv index 280e7ef6daf..fe9f402ef23 100644 --- a/Master/texmf-dist/tex/context/base/char-utf.mkiv +++ b/Master/texmf-dist/tex/context/base/char-utf.mkiv @@ -22,24 +22,17 @@ \unprotect +\registerctxluafile{char-def}{1.001} +\registerctxluafile{char-ini}{1.001} \registerctxluafile{char-utf}{1.001} +\registerctxluafile{char-cjk}{1.001} %D We enable collapsing (combining characters) by default, but %D since the source files are rather simple, we postpone the %D initialization till runtime. -% resolvers.filters.install('utf',characters.filters.utf.collapse) - -% \appendtoks -% \ctxlua{ -% local textfileactions = resolvers.openers.helpers.textfileactions -% utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.collapse") -% utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.decompose") -% }% -% \to \everyjob - \appendtoks - \ctxlua{characters.filters.utf.enable()}% + \clf_enableutf % not needed when we create a format so we do it now \to \everyjob %D The next one influences input parsing. @@ -49,6 +42,6 @@ %D \stoptyping \unexpanded\def\definecomposedutf#1 #2 #3 % - {\ctxlua{characters.filters.utf.addgrapheme("#1","#2","#3")}} + {\clf_addgrapheme{#1}{#2}{#3}} \protect diff --git a/Master/texmf-dist/tex/context/base/chem-ini.lua b/Master/texmf-dist/tex/context/base/chem-ini.lua index 10db1a1e44e..f7d10ffa272 100644 --- a/Master/texmf-dist/tex/context/base/chem-ini.lua +++ b/Master/texmf-dist/tex/context/base/chem-ini.lua @@ -32,12 +32,31 @@ function chemistry.molecule(str) return lpegmatch(moleculeparser,str) end -function commands.molecule(str) - if trace_molecules then - local rep = lpegmatch(moleculeparser,str) - report_chemistry("molecule %a becomes %a",str,rep) - context(rep) - else - context(lpegmatch(moleculeparser,str)) - end -end +interfaces.implement { + name = "molecule", + arguments = "string", + actions = function(str) + if trace_molecules then + local rep = lpegmatch(moleculeparser,str) + report_chemistry("molecule %a becomes %a",str,rep) + context(rep) + else + context(lpegmatch(moleculeparser,str)) + end + end, +} + +-- interfaces.implement { +-- name = "molecule", +-- scope = "private", +-- action = function() +-- local str = scanstring() +-- if trace_molecules then +-- local rep = lpegmatch(moleculeparser,str) +-- report_chemistry("molecule %a becomes %a",str,rep) +-- context(rep) +-- else +-- context(lpegmatch(moleculeparser,str)) +-- end +-- end, +-- } diff --git a/Master/texmf-dist/tex/context/base/chem-ini.mkiv b/Master/texmf-dist/tex/context/base/chem-ini.mkiv index 357bceefa66..9a44b4f1aee 100644 --- a/Master/texmf-dist/tex/context/base/chem-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/chem-ini.mkiv @@ -37,7 +37,7 @@ %D \typebuffer \getbuffer \unexpanded\def\molecule#1% - {\ctxcommand{molecule(\!!bs#1\!!es)}} + {\clf_molecule{#1}} %D For old times sake: diff --git a/Master/texmf-dist/tex/context/base/chem-str.lua b/Master/texmf-dist/tex/context/base/chem-str.lua index cd7a2db0690..d724394bb1d 100644 --- a/Master/texmf-dist/tex/context/base/chem-str.lua +++ b/Master/texmf-dist/tex/context/base/chem-str.lua @@ -44,6 +44,8 @@ local P, R, S, C, Cs, Ct, Cc, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpe local variables = interfaces and interfaces.variables local commands = commands local context = context +local implement = interfaces.implement + local formatters = string.formatters local texgetcount = tex.getcount @@ -60,11 +62,14 @@ local mpnamedcolor = attributes.colors.mpnamedcolor local topoints = number.topoints local todimen = string.todimen +local trialtypesetting = context.trialtypesetting + chemistry = chemistry or { } local chemistry = chemistry chemistry.instance = "chemistry" chemistry.format = "metafun" +chemistry.method = "double" chemistry.structures = 0 local common_keys = { @@ -422,7 +427,11 @@ local function process(level,spec,text,n,rulethickness,rulecolor,offset,default_ insert(sstack,variant) m = m + 1 ; metacode[m] = syntax.save.direct elseif operation == "restore" then - variant = remove(sstack) + if #sstack > 0 then + variant = remove(sstack) + else + report_chemistry("restore without save") + end local ss = syntax[variant] keys, max = ss.keys, ss.max m = m + 1 ; metacode[m] = syntax.restore.direct @@ -721,7 +730,7 @@ function chemistry.start(settings) width, left, right, sp_width = calculated(width, left, right,bondlength,unit,scale) height, bottom, top, sp_height = calculated(height,bottom,top, bondlength,unit,scale) -- - if width ~= "true" and height ~= "true" and texgetcount("@@trialtypesetting") ~= 0 then + if width ~= "true" and height ~= "true" and trialtypesetting() then if trace_structure then report_chemistry("skipping trial run") end @@ -762,6 +771,7 @@ function chemistry.stop() metapost.graphic { instance = chemistry.instance, format = chemistry.format, + method = chemistry.method, data = mpcode, definitions = f_initialize, } @@ -770,14 +780,12 @@ function chemistry.stop() end end -function chemistry.component(spec,text,settings) +function chemistry.component(spec,text,rulethickness,rulecolor) if metacode then - rulethickness, rulecolor, offset = settings.rulethickness, settings.rulecolor local spec = settings_to_array_with_repeat(spec,true) -- no lower? local text = settings_to_array_with_repeat(text,true) - -- inspect(spec) metacode[#metacode+1] = f_start_component - process(1,spec,text,1,rulethickness,rulecolor) -- offset? + process(1,spec,text,1,rulethickness,rulecolor) metacode[#metacode+1] = f_stop_component end end @@ -790,11 +798,52 @@ end) -- interfaces -commands.undefinechemical = chemistry.undefine -commands.definechemical = chemistry.define -commands.startchemical = chemistry.start -commands.stopchemical = chemistry.stop -commands.chemicalcomponent = chemistry.component +implement { + name = "undefinechemical", + actions = chemistry.undefine, + arguments = "string" +} + +implement { + name = "definechemical", + actions = chemistry.define, + arguments = { "string", "string", "string" } +} + +implement { + name = "startchemical", + actions = chemistry.start, + arguments = { + { + { "width" }, + { "height" }, + { "left" }, + { "right" }, + { "top" }, + { "bottom" }, + { "scale" }, + { "rotation" }, + { "symalign" }, + { "axis" }, + { "framecolor" }, + { "rulethickness" }, + { "offset" }, + { "unit" }, + { "factor" } + } + } +} + +implement { + name = "stopchemical", + actions = chemistry.stop, +} + +implement { + name = "chemicalcomponent", + actions = chemistry.component, + arguments = { "string", "string", "string", "string" } +} -- todo: top / bottom -- maybe add "=" for double and "≡" for triple? @@ -811,7 +860,9 @@ local inline = { ["space"] = "\\chemicalspace", } -function commands.inlinechemical(spec) +local ctx_chemicalinline = context.chemicalinline + +function chemistry.inlinechemical(spec) local spec = settings_to_array_with_repeat(spec,true) for i=1,#spec do local s = spec[i] @@ -819,7 +870,13 @@ function commands.inlinechemical(spec) if inl then context(inl) -- could be a fast context.sprint else - context.chemicalinline(molecule(s)) + ctx_chemicalinline(molecule(s)) end end end + +implement { + name = "inlinechemical", + actions = chemistry.inlinechemical, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/chem-str.mkiv b/Master/texmf-dist/tex/context/base/chem-str.mkiv index 6aec16f9e09..f18b422f266 100644 --- a/Master/texmf-dist/tex/context/base/chem-str.mkiv +++ b/Master/texmf-dist/tex/context/base/chem-str.mkiv @@ -62,12 +62,12 @@ %D a historical and practical reason (like shared keys with different meaning %D that could clash, e.g.\ align). -\defineMPinstance +\defineMPinstance % not really needed as we set in lua [chemistry] [\s!format=metafun, %\s!extensions=\v!yes, % Should we add extensions and initializations? %\s!initializations=\v!yes, % Would this give EmWidth, etc.? - ] + \c!method=\s!double] \startMPdefinitions{chemistry} input mp-chem.mpiv ; @@ -88,7 +88,7 @@ {\startnointerference \edef\currentdefinedchemical{#1}% \let\chemical\chem_chemical_nested - \ctxcommand{undefinechemical("#1")}% + \clf_undefinechemical{#1}% #2% flush \stopnointerference} @@ -96,7 +96,7 @@ {\dodoubleempty\chem_chemical_nested_indeed} \def\chem_chemical_nested_indeed[#1][#2]% - {\ctxcommand{definechemical("\currentdefinedchemical",\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es)}} + {\clf_definechemical{\currentdefinedchemical}{#1}{\detokenize{#2}}} % chemical symbols @@ -149,39 +149,39 @@ \settrue\indisplaychemical \forgetall \ifsecondargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setupcurrentchemical[#1]}% same as \currentchemical {\edef\currentchemical{#1}% \setupcurrentchemical[#2]}% \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\setupcurrentchemical[#1]}% same as \currentchemical {\edef\currentchemical{#1}}% \fi\fi \the\everystructurechemical \setbox\b_chem_result\hbox\bgroup - \ctxcommand{startchemical { - width = "\chemicalparameter\c!width", - height = "\chemicalparameter\c!height", - left = "\chemicalparameter\c!left", - right = "\chemicalparameter\c!right", - top = "\chemicalparameter\c!top", - bottom = "\chemicalparameter\c!bottom", - scale = "\chemicalparameter\c!scale", - rotation = "\chemicalparameter\c!rotation", - symalign = "\chemicalparameter\c!symalign", - axis = "\chemicalparameter\c!axis", - framecolor = "\MPcolor{\chemicalparameter\c!framecolor}", - rulethickness = \number\dimexpr\chemicalparameter\c!rulethickness\relax, - offset = \number\dimexpr\chemicalparameter\c!offset\relax, - unit = \number\dimexpr\chemicalparameter\c!unit\relax, - factor = \number\chemicalparameter\c!factor, - } }% + \clf_startchemical + width {\chemicalparameter\c!width}% + height {\chemicalparameter\c!height}% + left {\chemicalparameter\c!left}% + right {\chemicalparameter\c!right}% + top {\chemicalparameter\c!top}% + bottom {\chemicalparameter\c!bottom}% + scale {\chemicalparameter\c!scale}% + rotation {\chemicalparameter\c!rotation}% + symalign {\chemicalparameter\c!symalign}% + axis {\chemicalparameter\c!axis}% + framecolor {\MPcolor{\chemicalparameter\c!framecolor}}% + rulethickness {\number\dimexpr\chemicalparameter\c!rulethickness}% + offset {\number\dimexpr\chemicalparameter\c!offset}% + unit {\number\dimexpr\chemicalparameter\c!unit}% + factor {\number\chemicalparameter\c!factor}% + \relax \startnointerference} \unexpanded\def\stopchemical {\stopnointerference - \ctxcommand{stopchemical()}% + \clf_stopchemical \egroup \d_chem_width \wd\b_chem_result \d_chem_height\ht\b_chem_result @@ -222,17 +222,21 @@ \def\strc_chem_indeed_three[#1][#2][#3]% {\writestatus\m!chemicals{hyperlinked chemicals not yet supported}% todo reference, for the moment ignored - \ctxcommand{chemicalcomponent(\!!bs#2\!!es, \!!bs\detokenize{#3}\!!es, { % maybe also pass first two args this way - rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points - rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup - } ) }% + \clf_chemicalcomponent + {#2}% + {\detokenize{#3}}% + {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points + {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup + \relax \ignorespaces} \def\strc_chem_indeed_two[#1][#2]% - {\ctxcommand{chemicalcomponent(\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es, { % maybe also pass first two args this way - rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points - rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup - } ) }% + {\clf_chemicalcomponent + {#1}% + {\detokenize{#2}}% + {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points + {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup + \relax \ignorespaces} \appendtoks @@ -311,8 +315,8 @@ \def\chem_arrow_construct#1#2#3% {\enspace \mathematics{#1% - {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#3\!!es)}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}% - {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#2\!!es)}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}% + {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#3}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}% + {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#2}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}% \enspace} % special macros (probably needs some more work) @@ -505,7 +509,7 @@ \begingroup \scratchcounter\normalmathstyle \usechemicalstyleandcolor\c!style\c!color - \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\ctxcommand{inlinechemical(\!!bs#1\!!es)}}}% + \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\clf_inlinechemical{#1}}}% \endgroup} \unexpanded\def\displaychemical @@ -531,7 +535,7 @@ \unexpanded\def\inlinechemical#1% {\dontleavehmode - \hbox{\usechemicalstyleandcolor\c!style\c!color\ctxcommand{inlinechemical(\!!bs#1\!!es)}}} + \hbox{\usechemicalstyleandcolor\c!style\c!color\clf_inlinechemical{#1}}} \unexpanded\def\chemicalbondrule {\hbox{\vrule\s!height.75\exheight\s!depth-\dimexpr.75\exheight-\linewidth\relax\s!width\emwidth\relax}} @@ -720,7 +724,7 @@ \c!rotation=0, % unitless number (interpreted as degrees) \c!symalign=\v!auto, \c!location=, % not yet used (was interaction related in mkii) - \c!offset=.25em, + \c!offset=.25\emwidth, \c!unit=\emwidth, \c!factor=3, \c!color=, diff --git a/Master/texmf-dist/tex/context/base/cldf-bas.lua b/Master/texmf-dist/tex/context/base/cldf-bas.lua index b982fc364e0..1067a17d57e 100644 --- a/Master/texmf-dist/tex/context/base/cldf-bas.lua +++ b/Master/texmf-dist/tex/context/base/cldf-bas.lua @@ -24,10 +24,10 @@ if not modules then modules = { } end modules ['cldf-bas'] = { -- maybe use context.generics -local type = type -local format = string.format -local utfchar = utf.char -local concat = table.concat +local type = type +local format = string.format +local utfchar = utf.char +local concat = table.concat local context = context local generics = context.generics @@ -49,13 +49,23 @@ function context.char(k) -- used as escape too, so don't change to utf elseif n > 0 then context([[\char%s\relax]],concat(k,[[\relax\char]])) end - elseif k then - context([[\char%s\relax]],k) + else + if type(k) == "string" then + k = tonumber(k) + end + if type(k) == "number" then + context([[\char%s\relax]],k) + end end end function context.utfchar(k) - context(utfchar(k)) + if type(k) == "string" then + k = tonumber(k) + end + if type(k) == "number" then + context(utfchar(k)) + end end -- plain variants diff --git a/Master/texmf-dist/tex/context/base/cldf-ini.lua b/Master/texmf-dist/tex/context/base/cldf-ini.lua index 0a0f71266b7..da284ba5ead 100644 --- a/Master/texmf-dist/tex/context/base/cldf-ini.lua +++ b/Master/texmf-dist/tex/context/base/cldf-ini.lua @@ -28,19 +28,27 @@ if not modules then modules = { } end modules ['cldf-ini'] = { -- the the differences between the lua and luajit hashers can lead to quite a slowdown -- in some cases. -local tex = tex +-- context(lpeg.match(lpeg.patterns.texescape,"${}")) +-- context(string.formatters["%!tex!"]("${}")) +-- context("%!tex!","${}") -context = context or { } -local context = context - -local format, gsub, validstring, stripstring = string.format, string.gsub, string.valid, string.strip -local next, type, tostring, tonumber, setmetatable, unpack, select = next, type, tostring, tonumber, setmetatable, unpack, select +local format, validstring, stripstring = string.format, string.valid, string.strip +local next, type, tostring, tonumber, setmetatable, unpack, select, rawset = next, type, tostring, tonumber, setmetatable, unpack, select, rawset local insert, remove, concat = table.insert, table.remove, table.concat local lpegmatch, lpegC, lpegS, lpegP, lpegV, lpegCc, lpegCs, patterns = lpeg.match, lpeg.C, lpeg.S, lpeg.P, lpeg.V, lpeg.Cc, lpeg.Cs, lpeg.patterns -local formatters = string.formatters -- using formatteds is slower in this case +local formatters = string.formatters -- using formatters is slower in this case + +context = context or { } +commands = commands or { } +interfaces = interfaces or { } + +local context = context +local commands = commands +local interfaces = interfaces local loaddata = io.loaddata +local tex = tex local texsprint = tex.sprint local texprint = tex.print local texwrite = tex.write @@ -83,7 +91,7 @@ local storefunction, flushfunction local storenode, flushnode local registerfunction, unregisterfunction, reservefunction, knownfunctions, callfunctiononce -if luafunctions then +-- if luafunctions then local freed, nofused, noffreed = { }, 0, 0 -- maybe use the number of @@trialtypesetting @@ -144,26 +152,123 @@ if luafunctions then end end - registerfunction = function(f) - if type(f) == "string" then - f = loadstring(f) + -- registerfunction = function(f) + -- if type(f) == "string" then + -- f = loadstring(f) + -- end + -- if type(f) ~= "function" then + -- f = function() report_cld("invalid function %A",f) end + -- end + -- if noffreed > 0 then + -- local n = freed[noffreed] + -- freed[noffreed] = nil + -- noffreed = noffreed - 1 + -- luafunctions[n] = f + -- return n + -- else + -- nofused = nofused + 1 + -- luafunctions[nofused] = f + -- return nofused + -- end + -- end + + storage.storedfunctions = storage.storedfunctions or { } + local storedfunctions = storage.storedfunctions + local initex = environment.initex + + storage.register("storage/storedfunctions", storedfunctions, "storage.storedfunctions") + + local f_resolve = nil + local p_resolve = ((1-lpegP("."))^1 / function(s) f_resolve = f_resolve[s] end * lpegP(".")^0)^1 + + function resolvestoredfunction(str) + f_resolve = global + lpegmatch(p_resolve,str) + return f_resolve + end + + local function expose(slot,f,...) -- so we can register yet undefined functions + local func = resolvestoredfunction(f) + if not func then + func = function() report_cld("beware: unknown function %i called: %s",slot,f) end end - if type(f) ~= "function" then - f = function() report_cld("invalid function %A",f) end + luafunctions[slot] = func + return func(...) + end + + if initex then + -- todo: log stored functions + else + local slots = table.sortedkeys(storedfunctions) + local last = #slots + if last > 0 then + -- we restore the references + for i=1,last do + local slot = slots[i] + local data = storedfunctions[slot] + luafunctions[slot] = function(...) + return expose(slot,data,...) + end + end + -- we now know how many are defined + nofused = slots[last] + -- normally there are no holes in the list yet + for i=1,nofused do + if not luafunctions[i] then + noffreed = noffreed + 1 + freed[noffreed] = i + end + end + -- report_cld("%s registered functions, %s freed slots",last,noffreed) end + end + + registerfunction = function(f,direct) -- either f=code or f=namespace,direct=name + local slot, func if noffreed > 0 then - local n = freed[noffreed] + slot = freed[noffreed] freed[noffreed] = nil noffreed = noffreed - 1 - luafunctions[n] = f - return n else nofused = nofused + 1 - luafunctions[nofused] = f - return nofused + slot = nofused + end + if direct then + if initex then + func = function(...) + expose(slot,f,...) + end + if initex then + storedfunctions[slot] = f + end + else + func = resolvestoredfunction(f) + end + if type(func) ~= "function" then + func = function() report_cld("invalid resolve %A",f) end + end + elseif type(f) == "string" then + func = loadstring(f) + if type(func) ~= "function" then + func = function() report_cld("invalid code %A",f) end + end + elseif type(f) == "function" then + func = f + else + func = function() report_cld("invalid function %A",f) end end + luafunctions[slot] = func + return slot end + -- do + -- commands.test = function(str) report_cld("test function: %s", str) end + -- if initex then + -- registerfunction("commands.test") -- number 1 + -- end + -- luafunctions[1]("okay") + -- end + unregisterfunction = function(slot) if luafunctions[slot] then noffreed = noffreed + 1 @@ -197,92 +302,121 @@ if luafunctions then knownfunctions = luafunctions -else + -- The next hack is a convenient way to define scanners at the Lua end and + -- get them available at the TeX end. There is some dirty magic needed to + -- prevent overload during format loading. - local luafunctions, noffunctions = { }, 0 - local luanodes, nofnodes = { }, 0 + -- interfaces.scanners.foo = function() context("[%s]",tokens.scanners.string()) end : \scan_foo - usedstack = function() - return noffunctions + nofnodes, 0 - end + interfaces.storedscanners = interfaces.storedscanners or { } + local storedscanners = interfaces.storedscanners - flushfunction = function(n) - local sn = luafunctions[n] - if not sn then - report_cld("data with id %a cannot be found on stack",n) - elseif not sn() and texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private! - luafunctions[n] = nil - end - end - - storefunction = function(ti) - noffunctions = noffunctions + 1 - luafunctions[noffunctions] = ti - return noffunctions - end - -- freefunction = function(n) - -- luafunctions[n] = nil - -- end + storage.register("interfaces/storedscanners", storedscanners, "interfaces.storedscanners") - flushnode = function(n) - local sn = luanodes[n] - if not sn then - report_cld("data with id %a cannot be found on stack",n) - elseif texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private! - writenode(sn) - luanodes[n] = nil + local interfacescanners = table.setmetatablenewindex(function(t,k,v) + if storedscanners[k] 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 - writenode(copynodelist(sn)) + -- todo: allocate slot here and pass it + storedscanners[k] = true + -- report_cld("installing interface scanner: %s",k) + context("\\installctxscanner{clf_%s}{interfaces.scanners.%s}",k,k) end - end + rawset(t,k,v) + end) - storenode = function(ti) - nofnodes = nofnodes + 1 - luanodes[nofnodes] = ti - return nofnodes - end - - _cldf_ = flushfunction -- global - _cldn_ = flushnode -- global - -- _cldl_ = function(n) return luafunctions[n]() end -- luafunctions(n) - _cldl_ = luafunctions - - registerfunction = function(f) - if type(f) == "string" then - f = loadstring(f) - end - if type(f) ~= "function" then - f = function() report_cld("invalid function %A",f) end - end - noffunctions = noffunctions + 1 - luafunctions[noffunctions] = f - return noffunctions - end + interfaces.scanners = interfacescanners - unregisterfunction = function(slot) - if luafunctions[slot] then - luafunctions[slot] = nil - else - report_cld("invalid function slot %A",slot) - end - end - - reservefunction = function() - noffunctions = noffunctions + 1 - return noffunctions - end - - callfunctiononce = function(slot) - luafunctions[slot](slot) - luafunctions[slot] = nil - end - - table.setmetatablecall(luafunctions,function(t,n) return luafunctions[n](n) end) - - knownfunctions = luafunctions - -end +-- else -- by now this is obsolete +-- +-- local luafunctions, noffunctions = { }, 0 +-- local luanodes, nofnodes = { }, 0 +-- +-- usedstack = function() +-- return noffunctions + nofnodes, 0 +-- end +-- +-- flushfunction = function(n) +-- local sn = luafunctions[n] +-- if not sn then +-- report_cld("data with id %a cannot be found on stack",n) +-- elseif not sn() and texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private! +-- luafunctions[n] = nil +-- end +-- end +-- +-- storefunction = function(ti) +-- noffunctions = noffunctions + 1 +-- luafunctions[noffunctions] = ti +-- return noffunctions +-- end +-- +-- -- freefunction = function(n) +-- -- luafunctions[n] = nil +-- -- end +-- +-- flushnode = function(n) +-- local sn = luanodes[n] +-- if not sn then +-- report_cld("data with id %a cannot be found on stack",n) +-- elseif texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private! +-- writenode(sn) +-- luanodes[n] = nil +-- else +-- writenode(copynodelist(sn)) +-- end +-- end +-- +-- storenode = function(ti) +-- nofnodes = nofnodes + 1 +-- luanodes[nofnodes] = ti +-- return nofnodes +-- end +-- +-- _cldf_ = flushfunction -- global +-- _cldn_ = flushnode -- global +-- -- _cldl_ = function(n) return luafunctions[n]() end -- luafunctions(n) +-- _cldl_ = luafunctions +-- +-- registerfunction = function(f) +-- if type(f) == "string" then +-- f = loadstring(f) +-- end +-- if type(f) ~= "function" then +-- f = function() report_cld("invalid function %A",f) end +-- end +-- noffunctions = noffunctions + 1 +-- luafunctions[noffunctions] = f +-- return noffunctions +-- end +-- +-- unregisterfunction = function(slot) +-- if luafunctions[slot] then +-- luafunctions[slot] = nil +-- else +-- report_cld("invalid function slot %A",slot) +-- end +-- end +-- +-- reservefunction = function() +-- noffunctions = noffunctions + 1 +-- return noffunctions +-- end +-- +-- callfunctiononce = function(slot) +-- luafunctions[slot](slot) +-- luafunctions[slot] = nil +-- end +-- +-- table.setmetatablecall(luafunctions,function(t,n) return luafunctions[n](n) end) +-- +-- knownfunctions = luafunctions +-- +-- end context.registerfunction = registerfunction context.unregisterfunction = unregisterfunction @@ -291,8 +425,31 @@ context.knownfunctions = knownfunctions context.callfunctiononce = callfunctiononce _cldo_ = callfunctiononce context.storenode = storenode -- private helper -function commands.ctxfunction(code) - context(registerfunction(code)) +function commands.ctxfunction(code,namespace) + context(registerfunction(code,namespace)) +end + +function commands.ctxscanner(name,code,namespace) + local n = registerfunction(code,namespace) + if storedscanners[name] then + storedscanners[name] = n + end + context(n) +end + +local function dummy() end + +function commands.ctxresetter(name) + return function() + if storedscanners[name] then + rawset(interfacescanners,name,dummy) + context.resetctxscanner("clf_" .. name) + end + end +end + +function context.trialtypesetting() + return texgetcount("@@trialtypesetting") ~= 0 end -- local f_cldo = formatters["_cldo_(%i)"] diff --git a/Master/texmf-dist/tex/context/base/cldf-prs.lua b/Master/texmf-dist/tex/context/base/cldf-prs.lua index 1554b5e57f9..3c3836a3ee8 100644 --- a/Master/texmf-dist/tex/context/base/cldf-prs.lua +++ b/Master/texmf-dist/tex/context/base/cldf-prs.lua @@ -12,58 +12,54 @@ local lpegmatch, patterns = lpeg.match, lpeg.patterns local P, R, V, Cc, Cs = lpeg.P, lpeg.R, lpeg.V, lpeg.Cc, lpeg.Cs local format = string.format -local cpatterns = patterns.context or { } -patterns.context = cpatterns +local cpatterns = patterns.context or { } +patterns.context = cpatterns -local utf8char = patterns.utf8char -local cardinal = patterns.cardinal +local utf8character = patterns.utf8character +local cardinal = patterns.cardinal -local leftbrace = P("{") -local rightbrace = P("}") -local backslash = P("\\") -local csname = backslash * P(1) * (1-backslash-leftbrace)^0 * P(" ")^0 -local sign = P("+") / "\\textplus " - + P("-") / "\\textminus " -local nested = P { leftbrace * (V(1) + (1-rightbrace))^0 * rightbrace } -local subscript = P("_") -local superscript = P("^") +local leftbrace = P("{") +local rightbrace = P("}") +local backslash = P("\\") +local csname = backslash * P(1) * (1-backslash-leftbrace)^0 * P(" ")^0 +local sign = P("+") / "\\textplus " + + P("-") / "\\textminus " +local nested = P { leftbrace * (V(1) + (1-rightbrace))^0 * rightbrace } +local subscript = P("_") +local superscript = P("^") --- local scripts = P { "start", --- start = V("csname") + V("lowfirst") + V("highfirst"), --- csname = csname, --- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8char)), --- lowfirst = subscript * ( Cc("\\lohi{%s}{%s}") * V("content") * superscript + Cc("\\low{%s}" ) ) * V("content") / format, --- highfirst = superscript * ( Cc("\\hilo{%s}{%s}") * V("content") * subscript + Cc("\\high{%s}") ) * V("content") / format, --- } +-- local scripts = P { "start", +-- start = V("csname") + V("lowfirst") + V("highfirst"), +-- csname = csname, +-- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8character)), +-- lowfirst = subscript * ( Cc("\\lohi{%s}{%s}") * V("content") * superscript + Cc("\\low{%s}" ) ) * V("content") / format, +-- highfirst = superscript * ( Cc("\\hilo{%s}{%s}") * V("content") * subscript + Cc("\\high{%s}") ) * V("content") / format, +-- } --- local scripts = P { "start", --- start = (V("csname") + V("lowfirst") + V("highfirst"))^1, --- csname = csname, --- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8char)), --- lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"), --- highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"), --- } +-- local scripts = P { "start", +-- start = (V("csname") + V("lowfirst") + V("highfirst"))^1, +-- csname = csname, +-- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8character)), +-- lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"), +-- highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"), +-- } -local scripted = Cs { "start", - start = (V("csname") + V("nested") + V("lowfirst") + V("highfirst") + V("utf8char"))^1, - rest = V("csname") + V("nested") + V("lowfirst") + V("highfirst"), - csname = csname, - utf8char = utf8char, - -- nested = leftbrace * (V("rest") + (V("utf8char")-rightbrace))^0 * rightbrace, - nested = leftbrace * (V("start") -rightbrace)^0 * rightbrace, - content = Cs(V("nested") + sign^-1 * (cardinal + V("utf8char"))), - content = V("nested") + sign^-1 * (cardinal + V("utf8char")), - lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"), - highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"), - } +local scripted = Cs { "start", + start = (V("csname") + V("nested") + V("lowfirst") + V("highfirst") + V("character"))^1, + rest = V("csname") + V("nested") + V("lowfirst") + V("highfirst"), + csname = csname, + character = utf8character, + -- nested = leftbrace * (V("rest") + (V("character")-rightbrace))^0 * rightbrace, + nested = leftbrace * (V("start") -rightbrace)^0 * rightbrace, + -- content = Cs(V("nested") + sign^-1 * (cardinal + V("character"))), + content = V("nested") + sign^-1 * (cardinal + V("character")) + sign, + lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"), + highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"), + } - --- local scripted = Cs((scripts)) - --- cpatterns.scripts = scripts -cpatterns.csname = csname -cpatterns.scripted = scripted -cpatterns.nested = nested +cpatterns.csname = csname +cpatterns.scripted = scripted +cpatterns.nested = nested -- print(lpegmatch(scripted,"10^-3_x")) -- print(lpegmatch(scripted,"\\L {C_5}")) diff --git a/Master/texmf-dist/tex/context/base/cldf-scn.lua b/Master/texmf-dist/tex/context/base/cldf-scn.lua new file mode 100644 index 00000000000..5f7e0c74bbd --- /dev/null +++ b/Master/texmf-dist/tex/context/base/cldf-scn.lua @@ -0,0 +1,163 @@ +if not modules then modules = { } end modules ['cldf-scn'] = { + version = 1.001, + comment = "companion to cldf-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local load, type = load, type + +local formatters = string.formatters +local char = string.char +local concat = table.concat + +local lpegmatch = lpeg.match +local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted) + +local f_action_f = formatters["action%s(%s)"] +local f_action_s = formatters["local action%s = action[%s]"] +local f_command = formatters["local action = tokens._action\n%\nt\nreturn function(%s) return %s end"] + +local interfaces = interfaces +local commands = commands +local scanners = interfaces.scanners + +local compile = tokens.compile or function() end + +local dummy = function() end + +local report = logs.reporter("interfaces","implementor") + +function interfaces.implement(specification) + local actions = specification.actions + local name = specification.name + local arguments = specification.arguments + local private = specification.scope == "private" + local onlyonce = specification.onlyonce + if not actions then + if name then + report("error: no actions for %a",name) + else + report("error: no actions and no name") + end + return + end + if name == "" then + name = nil + end + local scanner + local resetter = onlyonce and name and commands.ctxresetter(name) + if resetter then + local scan = compile(specification) + if private then + scanner = function() + resetter() + return scan() + end + else + scanner = function() + commands[name] = dummy + resetter() + return scan() + end + end + else + scanner = compile(specification) + end + if not name then + return scanner + end + if scanners[name] and not specification.overload then + report("warning: 'scanners.%s' is redefined",name) + end + scanners[name] = scanner + if private then + return + end + local command + if onlyonce then + if type(actions) == "function" then + actions = { actions } + elseif #actions == 1 then + actions = { actions[1] } + end + end + if type(actions) == "function" then + command = actions + elseif #actions == 1 then + command = actions[1] + else + -- this one is not yet complete .. compare tokens + tokens._action = actions + local f = { } + local args + if not arguments then + args = "" + elseif type(arguments) == "table" then + local a = { } + for i=1,#arguments do + local v = arguments[i] + local t = type(v) + if t == "boolean" then + a[i] = tostring(v) + elseif t == "number" then + a[i] = tostring(v) + elseif t == "string" then + local s = lpegmatch(p_unquoted,v) + if s and v ~= s then + a[i] = v -- a string, given as "'foo'" or '"foo"' + else + a[i] = char(96+i) + end + else + -- nothing special for tables + a[i] = char(96+i) + end + end + args = concat(a,",") + else + args = "a" + end + command = args + for i=1,#actions do + command = f_action_f(i,command) + f[#f+1] = f_action_s(i,i) + end + command = f_command(f,args,command) + command = load(command) + if command then + if resetter then + local cmd = command() + command = function() + commands[name] = dummy + resetter() + cmd() + end + else + command = command() + end + end + tokens._action = nil + end + if commands[name] and not specification.overload then + report("warning: 'commands.%s' is redefined",name) + end + commands[name] = command + -- return scanner, command +end + +-- it's convenient to have copies here: + +interfaces.setmacro = tokens.setters.macro +interfaces.setcount = tokens.setters.count +interfaces.setdimen = tokens.setters.dimen + +interfaces.strings = table.setmetatableindex(function(t,k) + local v = { } + for i=1,k do + v[i] = "string" + end + t[k] = v + return v +end) diff --git a/Master/texmf-dist/tex/context/base/colo-ext.mkiv b/Master/texmf-dist/tex/context/base/colo-ext.mkiv index 8878da48522..c076fda9e5a 100644 --- a/Master/texmf-dist/tex/context/base/colo-ext.mkiv +++ b/Master/texmf-dist/tex/context/base/colo-ext.mkiv @@ -29,13 +29,13 @@ %D %D will negate the colors in box zero. -\unexpanded\def\negatecolorbox#1% - {\setbox#1\hbox - {\startnegative % might change - % \startcolor[\s!white]\vrule\s!height\ht#1\s!depth\dp#1\s!width\wd#1\stopcolor - \blackrule[\c!color=\s!white,\c!height=\ht#1,\c!depth=\dp#1,\c!width=\wd#1]% - \hskip-\wd#1% - \box#1% +\unexpanded\def\negatecolorbox#1% or just set attr of #1 + {\setbox#1\hbox to \wd#1% + {\scratchdimen\wd#1\relax + \startnegative % might change + \blackrule[\c!color=\s!white,\c!height=\ht#1,\c!depth=\dp#1,\c!width=\scratchdimen]% + \hskip-\scratchdimen + \leaders\box#1\hfill% this triggers application to the box .. a real dirty hack! \stopnegative}} %D There are in principle two ways to handle overprint: bound to colors @@ -47,10 +47,10 @@ \installcorenamespace{colorintent} \unexpanded\def\registercolorintent#1#2% - {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\ctxcommand{registercolorintent('#2')} }} + {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\clf_registercolorintent{#2}}} \unexpanded\def\colo_intents_set - {\ctxcommand{enablecolorintents()}% + {\clf_enablecolorintents \unexpanded\gdef\colo_intents_set##1{\csname\??colorintent##1\endcsname}% \colo_intents_set} diff --git a/Master/texmf-dist/tex/context/base/colo-grp.mkiv b/Master/texmf-dist/tex/context/base/colo-grp.mkiv index 11b759062dc..e296bbc33d9 100644 --- a/Master/texmf-dist/tex/context/base/colo-grp.mkiv +++ b/Master/texmf-dist/tex/context/base/colo-grp.mkiv @@ -65,7 +65,7 @@ \processcommalist[#3]{\colo_groups_define_entry{#1}{#2}}} \def\colo_groups_define_checked[#1][#2][#3]% - {\doifinstringelse{:}{#2} + {\doifelseinstring{:}{#2} {\colo_groups_define_normal[#1][\v!rgb][#2]} {\doloop % inherited {\ifcsname\??colorgroup#2:\recurselevel\endcsname diff --git a/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv index 9bc6befbaa9..dd14cc7d21d 100644 --- a/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv +++ b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv @@ -53,8 +53,8 @@ \definecolor [darkmagenta] [r=.4, g=0, b=.4] \definecolor [darkyellow] [r=.4, g=.4, b=0] -\definecolor [darkgray] [s=.60] -\definecolor [middlegray] [s=.725] +\definecolor [darkgray] [s=.40] +\definecolor [middlegray] [s=.625] \definecolor [lightgray] [s=.85] %D These colors are mapped to interface dependant colornames. diff --git a/Master/texmf-dist/tex/context/base/colo-ini.lua b/Master/texmf-dist/tex/context/base/colo-ini.lua index 94e9e6615ef..1065aadc064 100644 --- a/Master/texmf-dist/tex/context/base/colo-ini.lua +++ b/Master/texmf-dist/tex/context/base/colo-ini.lua @@ -14,11 +14,18 @@ local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local formatters = string.formatters local trace_define = false trackers.register("colors.define",function(v) trace_define = v end) +local trace_pgf = false trackers.register("colors.pgf", function(v) trace_pgf = v end) local report_colors = logs.reporter("colors","defining") +local report_pgf = logs.reporter("colors","pgf") -local attributes, backends, storage = attributes, backends, storage -local context, commands = context, commands +local attributes = attributes +local backends = backends +local storage = storage +local context = context +local commands = commands + +local implement = interfaces.implement local settings_to_hash_strict = utilities.parsers.settings_to_hash_strict @@ -26,8 +33,8 @@ local colors = attributes.colors local transparencies = attributes.transparencies local colorintents = attributes.colorintents local registrations = backends.registrations -local settexattribute = tex.setattribute -local gettexattribute = tex.getattribute +local texsetattribute = tex.setattribute +local texgetattribute = tex.getattribute local a_color = attributes.private('color') local a_transparency = attributes.private('transparency') @@ -48,7 +55,7 @@ storage.register("attributes/colors/sets",colorsets,"attributes.colors.sets") local stack = { } -function colors.pushset(name) +local function pushset(name) insert(stack,colorset) colorset = colorsets[name] if not colorset then @@ -57,14 +64,18 @@ function colors.pushset(name) end end -function colors.popset(name) +local function popset() colorset = remove(stack) end -function colors.setlist(name) +local function setlist(name) return table.sortedkeys(name and name ~= "" and colorsets[name] or colorsets.default or {}) end +colors.pushset = pushset +colors.popset = popset +colors.setlist = setlist + local context_colordefagc = context.colordefagc local context_colordefagt = context.colordefagt local context_colordefalc = context.colordefalc @@ -242,18 +253,22 @@ colors.forcedmodel = forcedmodel colors.couple = true -function colors.definetransparency(name,n) +local function definetransparency(name,n) transparent[name] = n end +colors.definetransparency = definetransparency + local registered = { } -local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p) +local function do_registerspotcolor(parent,parentnumber,e,f,d,p) if not registered[parent] then local v = colorvalues[parentnumber] if v then local model = colors.default -- else problems with shading etc - if model == 1 then model = v[1] end + if model == 1 then + model = v[1] + end if e and e ~= "" then registrations.spotcolorname(parent,e) -- before registration of the color end @@ -269,23 +284,25 @@ local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p) end end -local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template - if not registered[parent] then - local v = colorvalues[parentnumber] - if v then - local model = colors.default -- else problems with shading etc - if model == 1 then model = v[1] end - if model == 2 then - registrations.grayindexcolor(parent,f,d,p,v[2]) - elseif model == 3 then - registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5]) - elseif model == 4 then - registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9]) - end - end - registered[parent] = true - end -end +-- local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template +-- if not registered[parent] then +-- local v = colorvalues[parentnumber] +-- if v then +-- local model = colors.default -- else problems with shading etc +-- if model == 1 then +-- model = v[1] +-- end +-- if model == 2 then +-- registrations.grayindexcolor(parent,f,d,p,v[2]) +-- elseif model == 3 then +-- registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5]) +-- elseif model == 4 then +-- registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9]) +-- end +-- end +-- registered[parent] = true +-- end +-- end function colors.definesimplegray(name,s) return register_color(name,'gray',s) -- we still need to get rid of 'color' @@ -323,17 +340,19 @@ directives.register("colors.pgf",function(v) end end) -function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent +local defineintermediatecolor + +local function defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent local what, one, two, three = lpegmatch(specialcolor,str) if what == "H" then -- for old times sake (if we need to feed from xml or so) definecolor(name, register_color(name,'rgb',one,two,three),global) elseif what == "M" then -- intermediate - return colors.defineintermediatecolor(name,one,l_color[two],l_color[three],l_transparency[two],l_transparency[three],"",global,freeze) + return defineintermediatecolor(name,one,l_color[two],l_color[three],l_transparency[two],l_transparency[three],"",global,freeze) elseif what == "P" then -- pgf for tikz - return colors.defineintermediatecolor(name,two,l_color[one],l_color[three],l_transparency[one],l_transparency[three],"",global,freeze) + return defineintermediatecolor(name,two,l_color[one],l_color[three],l_transparency[one],l_transparency[three],"",global,freeze) else local settings = settings_to_hash_strict(str) if settings then @@ -389,23 +408,25 @@ function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent colorset[name] = true-- maybe we can store more end -function colors.isblack(ca) -- maybe commands +local function isblack(ca) -- maybe commands local cv = ca > 0 and colorvalues[ca] return (cv and cv[2] == 0) or false end -function colors.definespotcolor(name,parent,str,global) +colors.isblack = isblack + +local function definespotcolor(name,parent,str,global) if parent == "" or find(parent,"=",1,true) then - colors.registerspotcolor(name, parent) + colors.registerspotcolor(name, parent) -- does that work? no attr elseif name ~= parent then local cp = attributes_list[a_color][parent] if cp then local t = settings_to_hash_strict(str) if t then local tp = tonumber(t.p) or 1 - do_registerspotcolor(parent, name, cp, t.e, 1, "", tp) -- p not really needed, only diagnostics + do_registerspotcolor(parent,cp,t.e,1,"",tp) -- p not really needed, only diagnostics if name and name ~= "" then - definecolor(name, register_color(name,'spot', parent, 1, "", tp), true) + definecolor(name,register_color(name,'spot',parent,1,"",tp),true) local ta, tt = t.a, t.t if ta and tt then definetransparent(name, transparencies.register(name,transparent[ta] or tonumber(ta) or 1,tonumber(tt) or 1), global) @@ -428,13 +449,56 @@ function colors.registerspotcolor(parent, str) local t = settings_to_hash_strict(str) e = (t and t.e) or "" end - do_registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics + do_registerspotcolor(parent, cp, e, 1, "", 1) -- p not really needed, only diagnostics + end +end + +local function f(i,colors,fraction) + local otf = 0 + for c=1,#colors do + otf = otf + (tonumber(fraction[c]) or 1) * colors[c][i] + end + if otf > 1 then + otf = 1 + end + return otf +end + +local function definemixcolor(makename,name,fractions,cs,global,freeze) + local values = { } + for i=1,#cs do -- do fraction in here + local v = colorvalues[cs[i]] + if not v then + return + end + values[i] = v + end + if #values > 0 then + csone = values[1][1] + local ca + if csone == 2 then + ca = register_color(name,'gray',f(2,values,fractions)) + elseif csone == 3 then + ca = register_color(name,'rgb', f(3,values,fractions), + f(4,values,fractions), + f(5,values,fractions)) + elseif csone == 4 then + ca = register_color(name,'cmyk',f(6,values,fractions), + f(7,values,fractions), + f(8,values,fractions), + f(9,values,fractions)) + else + ca = register_color(name,'gray',f(2,values,fractions)) + end + definecolor(name,ca,global,freeze) + else + report_colors("invalid specification of components for color %a",makename) end end -function colors.definemultitonecolor(name,multispec,colorspec,selfspec) +local function definemultitonecolor(name,multispec,colorspec,selfspec) local dd, pp, nn, max = { }, { }, { }, 0 - for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do -- use settings_to_array + for k,v in gmatch(multispec,"([^=,]+)=([^%,]*)") do -- use settings_to_array max = max + 1 dd[max] = k pp[max] = v @@ -445,17 +509,17 @@ function colors.definemultitonecolor(name,multispec,colorspec,selfspec) local parent = gsub(lower(nn),"[^%d%a%.]+","_") if not colorspec or colorspec == "" then local cc = { } for i=1,max do cc[i] = l_color[dd[i]] end - colors.definemixcolor(parent,pp,cc,global,freeze) -- can become local + definemixcolor(name,parent,pp,cc,global,freeze) -- can become local else if selfspec ~= "" then colorspec = colorspec .. "," .. selfspec end - colors.defineprocesscolor(parent,colorspec,true,true) + defineprocesscolor(parent,colorspec,true,true) end local cp = attributes_list[a_color][parent] dd, pp = concat(dd,','), concat(pp,',') if cp then - do_registerspotcolor(parent, name, cp, "", max, dd, pp) + do_registerspotcolor(parent, cp, "", max, dd, pp) definecolor(name, register_color(name, 'spot', parent, max, dd, pp), true) local t = settings_to_hash_strict(selfspec) if t and t.a and t.t then @@ -469,8 +533,13 @@ function colors.definemultitonecolor(name,multispec,colorspec,selfspec) colorset[name] = true-- maybe we can store more end --- will move to mlib-col as colors in m,p are somewhat messy due to the fact --- that we cannot cast +colors.defineprocesscolor = defineprocesscolor +colors.definespotcolor = definespotcolor +colors.definemultitonecolor = definemultitonecolor + +-- will move to mlib-col as colors in mp are somewhat messy due to the fact +-- that we cannot cast .. so we really need to use (s,s,s) for gray in order +-- to be able to map onto 'color' local function mpcolor(model,ca,ta,default) local cv = colorvalues[ca] @@ -488,7 +557,8 @@ local function mpcolor(model,ca,ta,default) elseif model == 4 then return formatters["transparent(%s,%s,cmyk(%s,%s,%s,%s))"](tv[1],tv[2],cv[6],cv[7],cv[8],cv[9]) elseif model == 5 then - return formatters['transparent(%s,%s,multitonecolor("%s",%s,"%s","%s"))'](tv[1],tv[2],cv[10],cv[11],cv[12],cv[13]) + -- return formatters['transparent(%s,%s,multitonecolor("%s",%s,"%s","%s"))'](tv[1],tv[2],cv[10],cv[11],cv[12],cv[13]) + return formatters['transparent(%s,%s,namedcolor("%s"))'](tv[1],tv[2],cv[10]) else -- see ** in meta-ini.mkiv: return formatters["transparent(%s,%s,(%s))"](tv[1],tv[2],cv[2]) return formatters["transparent(%s,%s,(%s,%s,%s))"](tv[1],tv[2],cv[3],cv[4],cv[5]) end @@ -500,7 +570,8 @@ local function mpcolor(model,ca,ta,default) elseif model == 4 then return formatters["cmyk(%s,%s,%s,%s)"](cv[6],cv[7],cv[8],cv[9]) elseif model == 5 then - return formatters['multitonecolor("%s",%s,"%s","%s")'](cv[10],cv[11],cv[12],cv[13]) + -- return formatters['multitonecolor("%s",%s,"%s","%s")'](cv[10],cv[11],cv[12],cv[13]) + return formatters['namedcolor("%s")'](cv[10]) else -- see ** in meta-ini.mkiv: return formatters["%s"]((cv[2])) return formatters["(%s,%s,%s)"](cv[3],cv[4],cv[5]) end @@ -512,7 +583,7 @@ local function mpcolor(model,ca,ta,default) end local function mpnamedcolor(name) - return mpcolor(gettexattribute(a_colorspace),l_color[name] or l_color.black) + return mpcolor(texgetattribute(a_colorspace),l_color[name] or l_color.black) end local function mpoptions(model,ca,ta,default) -- will move to mlib-col @@ -682,7 +753,7 @@ local function complement(one,fraction,i) return otf end -function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze) +defineintermediatecolor = function(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze) fraction = tonumber(fraction) or 1 local one, two = colorvalues[c_one], colorvalues[c_two] if one then @@ -738,48 +809,17 @@ function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,sp end end -local function f(i,colors,fraction) - local otf = 0 - for c=1,#colors do - otf = otf + (tonumber(fraction[c]) or 1) * colors[c][i] - end - if otf > 1 then - otf = 1 - end - return otf -end - -function colors.definemixcolor(name,fractions,cs,global,freeze) - local values = { } - for i=1,#cs do -- do fraction in here - local v = colorvalues[cs[i]] - if not v then - return - end - values[i] = v - end - local csone = values[1][1] - local ca - if csone == 2 then - ca = register_color(name,'gray',f(2,values,fractions)) - elseif csone == 3 then - ca = register_color(name,'rgb', f(3,values,fractions), - f(4,values,fractions), - f(5,values,fractions)) - elseif csone == 4 then - ca = register_color(name,'cmyk',f(6,values,fractions), - f(7,values,fractions), - f(8,values,fractions), - f(9,values,fractions)) - else - ca = register_color(name,'gray',f(2,values,fractions)) - end - definecolor(name,ca,global,freeze) -end +colors.defineintermediatecolor = defineintermediatecolor -- for the moment downward compatible -local patterns = { "colo-imp-%s.mkiv", "colo-imp-%s.tex", "colo-%s.mkiv", "colo-%s.tex" } +local patterns = { + "colo-imp-%s.mkiv", + "colo-imp-%s.tex", + -- obsolete: + "colo-%s.mkiv", + "colo-%s.tex" +} local function action(name,foundname) -- could be one command @@ -796,7 +836,7 @@ local function failure(name) report_colors("unknown library %a",name) end -function colors.usecolors(name) +local function usecolors(name) commands.uselibrary { category = "color definition", name = name, @@ -807,52 +847,121 @@ function colors.usecolors(name) } end --- interface (todo: use locals) +colors.usecolors = usecolors -local setcolormodel = colors.setmodel +-- backend magic -function commands.setcolormodel(model,weight) - settexattribute(a_colorspace,setcolormodel(model,weight)) -end +local currentpagecolormodel --- function commands.setrastercolor(name,s) --- settexattribute(a_color,colors.definesimplegray(name,s)) --- end +function colors.setpagecolormodel(model) + currentpagecolormodel = model +end -function commands.registermaintextcolor(a) - colors.main = a +function colors.getpagecolormodel() + return currentpagecolormodel end -commands.defineprocesscolor = colors.defineprocesscolor -commands.definespotcolor = colors.definespotcolor -commands.definemultitonecolor = colors.definemultitonecolor -commands.definetransparency = colors.definetransparency -commands.defineintermediatecolor = colors.defineintermediatecolor +-- interface -function commands.spotcolorname (a) context(spotcolorname (a)) end -function commands.spotcolorparent (a) context(spotcolorparent (a)) end -function commands.spotcolorvalue (a) context(spotcolorvalue (a)) end -function commands.colorcomponents (a,s) context(colorcomponents (a,s)) end -function commands.transparencycomponents(a,s) context(transparencycomponents(a,s)) end -function commands.processcolorcomponents(a,s) context(processcolorcomponents(a,s)) end -function commands.formatcolor (...) context(formatcolor (...)) end -function commands.formatgray (...) context(formatgray (...)) end +local setcolormodel = colors.setmodel -function commands.mpcolor(model,ca,ta,default) - context(mpcolor(model,ca,ta,default)) -end +implement { + name = "setcolormodel", + arguments = { "string", "boolean" }, + actions = function(model,weight) + texsetattribute(a_colorspace,setcolormodel(model,weight)) + end +} -function commands.mpoptions(model,ca,ta,default) - context(mpoptions(model,ca,ta,default)) -end +implement { + name = "setpagecolormodel", + actions = colors.setpagecolormodel, + arguments = { "string" }, +} -function commands.doifblackelse(a) - commands.doifelse(colors.isblack(a)) -end +implement { + name = "defineprocesscolorlocal", + actions = defineprocesscolor, + arguments = { "string", "string", false, "boolean" } +} -function commands.doifdrawingblackelse() - commands.doifelse(colors.isblack(gettexattribute(a_color))) -end +implement { + name = "defineprocesscolorglobal", + actions = defineprocesscolor, + arguments = { "string", "string", true, "boolean" } +} + +implement { + name = "defineprocesscolordummy", + actions = defineprocesscolor, + arguments = { "'d_u_m_m_y'", "string", false, false } +} + +implement { + name = "definespotcolorglobal", + actions = definespotcolor, + arguments = { "string", "string", "string", true } +} + +implement { + name = "definemultitonecolorglobal", + actions = definemultitonecolor, + arguments = { "string", "string", "string", "string", true } +} + +implement { + name = "registermaintextcolor", + actions = function(main) + colors.main = main + end, + arguments = { "integer" } +} + +implement { + name = "definetransparency", + actions = definetransparency, + arguments = { "string", "integer" } +} + +implement { + name = "defineintermediatecolor", + actions = defineintermediatecolor, + arguments = { "string", "string", "integer", "integer", "integer", "integer", "string", false, "boolean" } +} + +implement { name = "spotcolorname", actions = { spotcolorname, context }, arguments = "integer" } +implement { name = "spotcolorparent", actions = { spotcolorparent, context }, arguments = "integer" } +implement { name = "spotcolorvalue", actions = { spotcolorvalue, context }, arguments = "integer" } +implement { name = "colorcomponents", actions = { colorcomponents, context }, arguments = "integer" } +implement { name = "transparencycomponents", actions = { transparencycomponents, context }, arguments = "integer" } +implement { name = "processcolorcomponents", actions = { processcolorcomponents, context }, arguments = "integer" } +implement { name = "formatcolor", actions = { formatcolor, context }, arguments = { "integer", "string" } } +implement { name = "formatgray", actions = { formatgray, context }, arguments = { "integer", "string" } } + +implement { + name = "mpcolor", + actions = { mpcolor, context }, + arguments = { "integer", "integer", "integer" } +} + +implement { + name = "mpoptions", + actions = { mpoptions, context }, + arguments = { "integer", "integer", "integer" } +} + +local ctx_doifelse = commands.doifelse + +implement { + name = "doifelsedrawingblack", + actions = function() ctx_doifelse(isblack(texgetattribute(a_color))) end +} + +implement { + name = "doifelseblack", + actions = { isblack, ctx_doifelse }, + arguments = "integer" +} -- function commands.withcolorsinset(name,command) -- local set @@ -872,51 +981,67 @@ end -- end -- end -commands.startcolorset = colors.pushset -commands.stopcolorset = colors.popset - -commands.usecolors = colors.usecolors +implement { name = "startcolorset", actions = pushset, arguments = "string" } +implement { name = "stopcolorset", actions = popset } +implement { name = "usecolors", actions = usecolors, arguments = "string" } -- bonus -function commands.pgfxcolorspec(ca) -- {}{}{colorspace}{list} - -- local cv = attributes.colors.values[ca] - local cv = colorvalues[ca] - if cv then - local model = cv[1] - if model == 2 then - context("{gray}{%1.3f}",cv[2]) - elseif model == 3 then - context("{rgb}{%1.3f,%1.3f,%1.3f}",cv[3],cv[4],cv[5]) - elseif model == 4 then - context("{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",cv[6],cv[7],cv[8],cv[9]) +do + + local function pgfxcolorspec(model,ca) -- {}{}{colorspace}{list} + -- local cv = attributes.colors.values[ca] + local cv = colorvalues[ca] + local str + if cv then + if model and model ~= 0 then + model = model + else + model = forcedmodel(cv[1]) + end + if model == 3 then + str = formatters["{rgb}{%1.3f,%1.3f,%1.3f}"](cv[3],cv[4],cv[5]) + elseif model == 4 then + str = formatters["{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}"](cv[6],cv[7],cv[8],cv[9]) + else -- there is no real gray + str = formatters["{rgb}{%1.3f,%1.3f,%1.3f}"](cv[2],cv[2],cv[2]) + end else - context("{gray}{%1.3f}",cv[2]) + str = "{rgb}{0,0,0}" end - else - context("{gray}{0}") + if trace_pgf then + report_pgf("model %a, string %a",model,str) + end + return str end -end --- function commands.pgfregistercolor(name,attribute) --- local cv = colorvalues[ca] --- context.pushcatcodes('prt') --- if cv then --- local model = forcedmodel(cv[1]) --- if model == 2 then --- context["pgfutil@definecolor"]("{%s}{gray}{%1.3f}",name,cv[2]) --- elseif model == 3 then --- context["pgfutil@definecolor"]("{%s}{rgb}{%1.3f,%1.3f,%1.3f}",name,cv[3],cv[4],cv[5]) --- elseif model == 4 then --- context["pgfutil@definecolor"]("{%s}{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",name,cv[6],cv[7],cv[8],cv[9]) --- else --- context["pgfutil@definecolor"]("{%s}{gray}{0}",name) --- end --- else --- context["pgfutil@definecolor"]("{%s}{gray}{0}",name) --- end --- context.popcatcodes() --- end + implement { + name = "pgfxcolorspec", + actions = { pgfxcolorspec, context }, + arguments = { "integer", "integer" } + } + + -- function commands.pgfregistercolor(name,attribute) + -- local cv = colorvalues[ca] + -- context.pushcatcodes('prt') + -- if cv then + -- local model = forcedmodel(cv[1]) + -- if model == 2 then + -- context["pgfutil@definecolor"]("{%s}{gray}{%1.3f}",name,cv[2]) + -- elseif model == 3 then + -- context["pgfutil@definecolor"]("{%s}{rgb}{%1.3f,%1.3f,%1.3f}",name,cv[3],cv[4],cv[5]) + -- elseif model == 4 then + -- context["pgfutil@definecolor"]("{%s}{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",name,cv[6],cv[7],cv[8],cv[9]) + -- else + -- context["pgfutil@definecolor"]("{%s}{gray}{0}",name) + -- end + -- else + -- context["pgfutil@definecolor"]("{%s}{gray}{0}",name) + -- end + -- context.popcatcodes() + -- end + +end -- handy diff --git a/Master/texmf-dist/tex/context/base/colo-ini.mkiv b/Master/texmf-dist/tex/context/base/colo-ini.mkiv index 6aa51b218e9..1eb3d8d7e6e 100644 --- a/Master/texmf-dist/tex/context/base/colo-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/colo-ini.mkiv @@ -203,9 +203,9 @@ %D \usecolors[dem] %D \stoptyping -\unexpanded\def\startcolorset[#1]{\ctxcommand{startcolorset("#1")}} -\unexpanded\def\stopcolorset {\ctxcommand{stopcolorset()}} -\unexpanded\def\usecolors [#1]{\ctxcommand{usecolors("#1")}} +\unexpanded\def\startcolorset[#1]{\clf_startcolorset{#1}} +\unexpanded\def\stopcolorset {\clf_stopcolorset} +\unexpanded\def\usecolors [#1]{\clf_usecolors{#1}} \let\setupcolor\usecolors @@ -255,14 +255,14 @@ \colo_helpers_set_current_model \ifproductionrun \edef\p_pagecolormodel{\directcolorsparameter\c!pagecolormodel}% - \ctxcommand{synchronizecolormodel("\ifx\p_pagecolormodel\v!auto \currentcolormodel \else \p_pagecolormodel \fi")}% + \clf_setpagecolormodel{\ifx\p_pagecolormodel\v!auto\currentcolormodel\else\p_pagecolormodel\fi}% \fi \to \everysetupcolors \appendtoks \setupcolors[\c!state=\v!start]% - \ctxcommand{enablecolor()}% % this can as well happen when - \ctxcommand{enabletransparency()}% % the handler is defined in lua + \clf_enablecolor % this can as well happen when + \clf_enabletransparency % the handler is defined in lua \let\colo_helpers_show_message\showmessage \to \everyjob @@ -367,7 +367,7 @@ {\dodoubleargument\colo_palets_define} \unexpanded\def\colo_palets_define[#1][#2]% todo - {\doifassignmentelse{#2} + {\doifelseassignment{#2} {%\colo_helpers_show_message\m!colors6{#1}% \let\m_colo_palets_tmp\empty \setevalue{\??colorpaletspecification#1}{#2}% @@ -382,7 +382,7 @@ % {\colo_palets_define_two{#1}[#2]}% \def\colo_palets_define_one#1#2% get rid of { } - {\doifassignmentelse{#2} % catch empty entries + {\doifelseassignment{#2} % catch empty entries {\colo_palets_define_two{#1}[#2]} {\colo_palets_define_three{#1}{#2}}} @@ -563,7 +563,7 @@ \def\colo_helpers_set_model#1% direct {\edef\currentcolormodel{#1}% - \ctxcommand{setcolormodel('\currentcolormodel',\v_colo_weight_state)}} % sets attribute at lua end + \clf_setcolormodel{\currentcolormodel}\v_colo_weight_state\relax} % sets attribute at lua end \colo_helpers_set_model\s!all @@ -688,24 +688,42 @@ \attribute\colorattribute\attributeunsetvalue \attribute\transparencyattribute\attributeunsetvalue} +% todo: check if color is overloading a non-color command + +\newcount\c_colo_protection + +\unexpanded\def\startprotectedcolors + {\advance\c_colo_protection\plusone} + +\unexpanded\def\stopprotectedcolors + {\advance\c_colo_protection\minusone} + \def\colo_basics_define[#1][#2]% - {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}% - \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\colo_basics_define_global[#1][#2]% - {\ctxcommand{defineprocesscolor("#1","#2",true,\v_colo_freeze_state)}% - \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorglobal{#1}{#2}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\colo_basics_define_named[#1][#2]% currently same as define - {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}% - \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\dodefinefastcolor[#1][#2]% still not fast but ok (might change) - {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}% - \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\colo_basics_defined_and_activated#1% - {\ctxcommand{defineprocesscolor("\v_colo_dummy_name","#1",false,false)}% + {\clf_defineprocesscolordummy{#1}% \colo_helpers_activate_dummy} \def\colo_basics_define_process @@ -716,12 +734,16 @@ \fi} \def\colo_basics_define_process_yes[#1][#2][#3]% - {\ctxcommand{defineprocesscolor("#1","\processcolorcomponents{#2},#3",false,\v_colo_freeze_state)}% - \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorlocal{#1}{\processcolorcomponents{#2},#3}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\colo_basics_define_process_nop[#1][#2][#3]% - {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}% - \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax + \ifcase\c_colo_protection + \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}% + \fi} % Spotcolors used setxvalue but that messes up currentcolor % and probably no global is needed either but they are global @@ -729,17 +751,21 @@ % spot colors often are a document wide property \def\colo_basics_define_spot[#1][#2][#3]% - {\ctxcommand{definespotcolor("#1","#2","#3",true)}% - \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_definespotcolorglobal{#1}{#2}{#3}% + \ifcase\c_colo_protection + \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}% + \fi} \def\colo_basics_define_multitone[#1][#2][#3][#4]% - {\ctxcommand{definemultitonecolor("#1","#2","#3","#4",true)}% - \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}} + {\clf_definemultitonecolorglobal{#1}{#2}{#3}{#4}% + \ifcase\c_colo_protection + \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}% + \fi} %D Transparencies (only): \def\colo_basics_define_transpancy[#1][#2]% - {\ctxcommand{definetransparency("#1",#2)}} + {\clf_definetransparency{#1}#2\relax} % A goodie that replaces the startMPcolor hackery @@ -791,10 +817,15 @@ {\colo_basics_define_intermediate_indeed[#1][#2][#3]} \def\colo_basics_define_intermediate_indeed[#1][#2,#3,#4][#5]% - {\ctxcommand{defineintermediatecolor("#1","#2", - \thecolorattribute{#3},\thecolorattribute{#4}, - \thetransparencyattribute{#3},\thetransparencyattribute{#4}, - "#5",false,\v_colo_freeze_state)}% not global + {\clf_defineintermediatecolor % not global + {#1}{#2}% + \thecolorattribute{#3} % + \thecolorattribute{#4} % + \thetransparencyattribute{#3} % + \thetransparencyattribute{#4} % + {#5}% + \v_colo_freeze_state + \relax \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}} %D Here is a more efficient helper for pgf: @@ -833,8 +864,10 @@ %D %D \stopmode -\def\pgf@context@registercolor#1% bonus macro - {\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\ctxcommand{pgfxcolorspec(\thecolorattribute{#1})}}} +\def\pgf@context@registercolor#1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\zerocount\thecolorattribute{#1}}} +\def\pgf@context@registergray #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plustwo \thecolorattribute{#1}}} +\def\pgf@context@registerrgb #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusthree\thecolorattribute{#1}}} +\def\pgf@context@registercmyk #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusfour \thecolorattribute{#1}}} %D \starttyping %D \ifdefined\pgf@context@registercolor @@ -849,7 +882,7 @@ %D command. Later on we will explain the use of palets. We %D define ourselves a color conditional first. -\def\doifcolorelse#1% +\def\doifelsecolor#1% {\ifcsname\??colorattribute\currentcolorprefix#1\endcsname \expandafter\firstoftwoarguments \else\ifcsname\??colorattribute#1\endcsname @@ -858,6 +891,8 @@ \doubleexpandafter\secondoftwoarguments \fi\fi} +\let\doifcolorelse\doifelsecolor + \def\doifcolor#1% {\ifcsname\??colorattribute\currentcolorprefix#1\endcsname \expandafter\firstofoneargument @@ -916,7 +951,7 @@ {\let\maintextcolor\s!themaintextcolor \definecolor[\maintextcolor][#1]% can be fast one \colo_helpers_activate\maintextcolor - \ctxcommand{registermaintextcolor(\thecolorattribute\maintextcolor)}} + \clf_registermaintextcolor\thecolorattribute\maintextcolor\relax} \unexpanded\def\starttextcolor[#1]% {\doifsomething{#1} @@ -958,7 +993,7 @@ \to \everysetupcolors \def\colo_palets_define_set#1#2#3% - {\doifassignmentelse{#3}% \definepalet[test][xx={y=.4}] + {\doifelseassignment{#3}% \definepalet[test][xx={y=.4}] {\definecolor[\??colorpalet#1:#2][#3]% \colo_helpers_set_value{\??colorsetter #1:#2}{\colo_helpers_inherited_palet_ca{#1}{#2}}% \colo_helpers_set_value{\??colorattribute #1:#2}{\colo_helpers_inherited_palet_cs{#1}{#2}}% @@ -1029,27 +1064,43 @@ \let\colorformatseparator\space -\def\MPcolor #1{\ctxcommand{mpcolor(\number\attribute\colormodelattribute,\number\colo_helpers_inherited_current_ca{#1},\number\colo_helpers_inherited_current_ta{#1})}} -\def\MPoptions #1{\ctxcommand{mpoptions(\number\attribute\colormodelattribute,\number\colo_helpers_inherited_current_ca{#1},\number\colo_helpers_inherited_current_ta{#1})}} +\def\MPcolor#1% + {\clf_mpcolor + \attribute\colormodelattribute + \colo_helpers_inherited_current_ca{#1} % + \colo_helpers_inherited_current_ta{#1} } + + +\def\MPoptions#1% + {\clf_mpoptions + \attribute\colormodelattribute + \colo_helpers_inherited_current_ca{#1} % + \colo_helpers_inherited_current_ta{#1} } + \def\thecolorattribute #1{\number\csname\??colorattribute \ifcsname\??colorattribute \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorattribute #1\endcsname#1\fi\fi\endcsname} \def\thetransparencyattribute#1{\number\csname\??transparencyattribute\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencyattribute#1\endcsname#1\fi\fi\endcsname} - \def\thecolormodelattribute {\the\attribute\colormodelattribute} -\def\internalspotcolorname #1{\ctxcommand{spotcolorname(\thecolorattribute{#1})}} -\def\internalspotcolorparent #1{\ctxcommand{spotcolorparent(\thecolorattribute{#1})}} -\def\internalspotcolorsize #1{\ctxcommand{spotcolorvalue(\thecolorattribute{#1})}} +\def\internalspotcolorname #1{\clf_spotcolorname \thecolorattribute{#1} } +\def\internalspotcolorparent #1{\clf_spotcolorparent\thecolorattribute{#1} } +\def\internalspotcolorsize #1{\clf_spotcolorvalue \thecolorattribute{#1} } + +\def\colorcomponents #1{\clf_colorcomponents \thecolorattribute {#1} } +\def\transparencycomponents #1{\clf_transparencycomponents\thetransparencyattribute{#1} } +\def\processcolorcomponents #1{\clf_processcolorcomponents\thecolorattribute {#1} } + +\def\colorvalue #1{\clf_formatcolor\thecolorattribute{#1}{\colorformatseparator}} +\def\grayvalue #1{\clf_formatgray \thecolorattribute{#1}{\colorformatseparator}} -\def\colorcomponents #1{\ctxcommand{colorcomponents(\thecolorattribute{#1})}} -\def\transparencycomponents #1{\ctxcommand{transparencycomponents(\thetransparencyattribute{#1})}} -\def\processcolorcomponents #1{\ctxcommand{processcolorcomponents(\thecolorattribute{#1},",")}} +\def\doifelseblack #1{\clf_doifelseblack\thecolorattribute{#1} } +\def\doifelsedrawingblack {\clf_doifelsedrawingblack} -\def\colorvalue #1{\ctxcommand{formatcolor(\thecolorattribute{#1},"\colorformatseparator")}} -\def\grayvalue #1{\ctxcommand{formatgray (\thecolorattribute{#1},"\colorformatseparator")}} +\let\doifblackelse \doifelseblack +\let\doifdrawingblackelse \doifelsedrawingblack -\def\doifblackelse #1{\ctxcommand{doifblackelse(\thecolorattribute{#1})}} -\def\doifdrawingblackelse {\ctxcommand{doifdrawingblackelse()}} +\let\doifblackelse \doifelseblack +\let\doifdrawingblackelse\doifelsedrawingblack %D \macros %D {forcecolorhack} @@ -1071,7 +1122,7 @@ % \normal added else fails in metafun manual (leaders do a hard scan) -\unexpanded\def\forcecolorhack{\leaders\hrule\hskip\zeropoint} +\unexpanded\def\forcecolorhack{\leaders\hrule\hskip\zeropoint\relax} % relax is needed ! %D We default to the colors defined in \type {colo-imp-rgb} and %D support both \RGB\ and \CMYK\ output. Transparencies are defined diff --git a/Master/texmf-dist/tex/context/base/colo-run.mkiv b/Master/texmf-dist/tex/context/base/colo-run.mkiv index 5084fdd351e..16f54c3b5fb 100644 --- a/Master/texmf-dist/tex/context/base/colo-run.mkiv +++ b/Master/texmf-dist/tex/context/base/colo-run.mkiv @@ -46,7 +46,7 @@ \gdef\colo_show_palet[#1][#2]% {\ifcsname\??colorpalet#1\endcsname - \doifinsetelse\v!vertical{#2} \colo_palets_show_vertical \colo_palets_show_horizontal [#1][#2]% + \doifelseinset\v!vertical{#2} \colo_palets_show_vertical \colo_palets_show_horizontal [#1][#2]% \fi} \gdef\colo_palets_show_vertical[#1][#2]% @@ -58,7 +58,7 @@ \setuppalet[#1] \tabskip\zeropoint \def\colo_palets_show_palet##1% - {\doifinsetelse\v!number{#2}{##1\hskip.5em}{}& + {\doifelseinset\v!number{#2}{##1\hskip.5em}{}& \color[##1]{\vrule\s!width3em\s!height\strutht\s!depth\strutdp}% \graycolor[##1]{\vrule\s!width3em\s!height\strutht\s!depth\strutdp}& \doifinset\v!value{#2}{\hskip.5em\colorvalue{##1}}\crcr} @@ -155,7 +155,7 @@ \gdef\colo_groups_show[#1][#2]% {\doifcolor{#1:1} - {\doifinsetelse\v!vertical{#2} \colo_groups_show_vertical \colo_groups_show_horizontal [#1][#2]}} + {\doifelseinset\v!vertical{#2} \colo_groups_show_vertical \colo_groups_show_horizontal [#1][#2]}} \gdef\colo_groups_show_horizontal[#1][#2]% {\vbox @@ -177,7 +177,7 @@ \hbox {\doifinset\v!name{#2} {\strut - \doifinsetelse\v!value{#2} + \doifelseinset\v!value{#2} {\raise3\lineheight\hbox{#1\hskip.5em}} {#1}% \hskip.5em}% diff --git a/Master/texmf-dist/tex/context/base/colo-xwi.mkii b/Master/texmf-dist/tex/context/base/colo-xwi.mkii index 557e9c57c54..13d04759e77 100644 --- a/Master/texmf-dist/tex/context/base/colo-xwi.mkii +++ b/Master/texmf-dist/tex/context/base/colo-xwi.mkii @@ -8,11 +8,12 @@ %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. %D I've forgotten where I got these definitions from, but maybe -%D they can be of use. +%D they can be of use. Watch out, these colors are in the rgb +%D color space, so cyan is not defined in cmyk! \definecolor [aliceblue] [r=0.94,g=0.97,b=1.00] \definecolor [antiquewhite] [r=0.98,g=0.92,b=0.84] diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkii b/Master/texmf-dist/tex/context/base/cont-fil.mkii index e05d8eac46d..604ea233d06 100644 --- a/Master/texmf-dist/tex/context/base/cont-fil.mkii +++ b/Master/texmf-dist/tex/context/base/cont-fil.mkii @@ -124,4 +124,6 @@ \definefilesynonym [letter] [cor-01] \definefilesynonym [memo] [cor-02] +\definefilesynonym [syn-01] [syntax] + \endinput diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkiv b/Master/texmf-dist/tex/context/base/cont-fil.mkiv index 8e9be155bfe..a1159b7f54f 100644 --- a/Master/texmf-dist/tex/context/base/cont-fil.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-fil.mkiv @@ -116,5 +116,6 @@ \definefilesynonym [mat-11] [math-characters] \definefilesynonym [fnt-11] [fonts-system] \definefilesynonym [fnt-23] [fonts-shapes] +\definefilesynonym [syn-01] [syntax] \endinput diff --git a/Master/texmf-dist/tex/context/base/cont-log.mkiv b/Master/texmf-dist/tex/context/base/cont-log.mkiv index 99e08450bae..598140d3268 100644 --- a/Master/texmf-dist/tex/context/base/cont-log.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-log.mkiv @@ -13,10 +13,9 @@ \writestatus{loading}{ConTeXt TeX Logos} -%D The system that is used to typeset this text is called \TEX, -%D typeset with an lowered~E. From te beginning of \TEX, -%D authors of macro packages adapted this raising and lowering -%D style. In this module we define some of those logos. +%D The system that is used to typeset this text is called \TEX, typeset with an +%D lowered~E. From te beginning of \TEX, authors of macro packages adapted this +%D raising and lowering style. In this module we define some of those logos. \unprotect @@ -26,7 +25,7 @@ \setbox\scratchbox\hbox{M}% T% \kern-.1667\wd\scratchbox - \lower.5ex\hbox{E}% + \lower.5\exheight\hbox{E}% \kern-.125\wd\scratchbox X% \endgroup} @@ -48,40 +47,40 @@ \unexpanded\def\TaBlE {T% - \kern-.27em\lower.5ex\hbox{A}% - \kern-.18emB% - \kern-.1em\lower.5ex\hbox{L}% - \kern-.075emE} + \kern-.27\emwidth\lower.5\exheight\hbox{A}% + \kern-.18\emwidth B% + \kern-.1\emwidth\lower.5\exheight\hbox{L}% + \kern-.075\emwidth E} \unexpanded\def\PiCTeX {P% - \kern-.12em\lower.5ex\hbox{I}% - \kern-.075em C% - \kern-.11em\TeX} + \kern-.12\emwidth\lower.5\exheight\hbox{I}% + \kern-.075\emwidth C% + \kern-.11\emwidth\TeX} \def\syst_logos_ams_script#1% - {$\cal\ifdim\bodyfontsize>1.1em\scriptstyle\fi#1$} + {$\cal\ifdim\bodyfontsize>1.1\emwidth\scriptstyle\fi#1$} \unexpanded\def\AmSTeX {\dontleavehmode \syst_logos_ams_script A% - \kern-.1667em\lower.5ex\hbox{\syst_logos_ams_script M}% - \kern-.125em\syst_logos_ams_script S% + \kern-.1667\emwidth\lower.5\exheight\hbox{\syst_logos_ams_script M}% + \kern-.125\emwidth\syst_logos_ams_script S% -\TeX} \unexpanded\def\LamSTeX {L% - \kern-.4em\raise.3ex\hbox{\syst_logos_ams_script A}% - \kern-.25em\lower.4ex\hbox{\syst_logos_ams_script M}% - \kern-.1em{\syst_logos_ams_script S}% + \kern-.4\emwidth\raise.3\exheight\hbox{\syst_logos_ams_script A}% + \kern-.25\emwidth\lower.4\exheight\hbox{\syst_logos_ams_script M}% + \kern-.1\emwidth{\syst_logos_ams_script S}% -\TeX} -\unexpanded\def\AmSLaTeX - {\dontleavehmode - \syst_logos_ams_script A% - \kern-.1667em\lower.5ex\hbox{\syst_logos_ams_script M}% - \kern-.125em\AMSswitch S% - -\LaTeX} +% \unexpanded\def\AmSLaTeX +% {\dontleavehmode +% \syst_logos_ams_script A% +% \kern-.1667\emwidth\lower.5\exheight\hbox{\syst_logos_ams_script M}% +% \kern-.125\emwidth{\syst_logos_ams_script S}% +% -\LaTeX} %D Alternative \CONTEXT\ logo, first Idris S.~Hamid's version: %D @@ -94,31 +93,31 @@ \unexpanded\def\Context % wrong usage of \getscaledglyph {\dontleavehmode \begingroup - C\kern -.0667em\getscaledglyph{.8}\empty{O\kern -.0667emN\kern - -.0549emT\doifitalicelse{\kern-.1em}{\kern-.1667em}\lower.5ex\hbox - {E}\doifitalicelse\empty{\kern-.11em}X\kern-.055emT}% + C\kern -.0667\emwidth\getscaledglyph{.8}\empty{O\kern -.0667\emwidth N\kern + -.0549\emwidth T\doifelseitalic{\kern-.1\emwidth}{\kern-.1667\emwidth}\lower.5\exheight\hbox + {E}\doifelseitalic\empty{\kern-.11em}X\kern-.055\emwidth T}% \endgroup} -%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the -%D current fontsize, an ugly but usefull hack. +%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the current fontsize, an +%D ugly but usefull hack. \let\logofont\nullfont -\loadmapfile[original-base.map] % stil needed? +\loadmapfile[original-base.map] % stil needed? not if we assume afm \unexpanded\def\setMFPfont% more sensitive for low level changes {\font\logofont=logo% - \ifx\fontalternative\s!bf\else - \ifx\fontalternative\s!it\else - \ifx\fontalternative\s!sl\else - \ifx\fontalternative\s!bi\else - \ifx\fontalternative\s!bs\else + \ifx\fontalternative\s!bf\s!bf\else + \ifx\fontalternative\s!it\s!sl\else + \ifx\fontalternative\s!sl\s!sl\else + \ifx\fontalternative\s!bi\s!bf\else + \ifx\fontalternative\s!bs\s!bf\else \fi\fi\fi\fi\fi 10 at \currentfontscale\bodyfontsize % there is no afm in the minimals yet \logofont} \def\syst_logos_meta_hyphen % there is no hyphenchar in this font - {\discretionary{\vrule\s!height.33em\s!depth-.27em\s!width.33em}{}{}} + {\discretionary{\vrule\s!height.33\emwidth\s!depth-.27\emwidth\s!width.33\emwidth}{}{}} \unexpanded\def\MetaFont {\dontleavehmode @@ -146,9 +145,8 @@ %D CONTEXT, PPCHTEX, %D AMSTEX, LATEX, LAMSTEX} %D -%D We define the funny written ones as well as the less -%D error prone upper case names (in \CONTEXT\ we tend to -%D write all user defined commands, like abbreviations, in +%D We define the funny written ones as well as the less error prone upper case names +%D (in \CONTEXT\ we tend to write all user defined commands, like abbreviations, in %D uppercase.) \unexpanded\def\METAFONT {\MetaFont} @@ -165,18 +163,18 @@ \unexpanded\def\LAMSTEX {\LamSTeX} \unexpanded\def\INRSTEX {inrs\TeX} -%D And this is how they show up: \TeX, \MetaFont, \MetaPost, -%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX, -%D \LamSTeX. +%D And this is how they show up: \TeX, \MetaFont, \MetaPost, \PiCTeX, \TaBlE, \ConTeXt, +%D \PPCHTeX, \AmSTeX, \LaTeX, \LamSTeX. %D Some placeholders: -\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX} -\unexpanded\def\pdfTeX {pdf\TeX} -\unexpanded\def\pdfeTeX{pdfe-\TeX} -\unexpanded\def\luaTeX {lua\TeX} -\unexpanded\def\metaTeX{meta\TeX} -\unexpanded\def\XeTeX {X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX} +\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX} +\unexpanded\def\pdfTeX {pdf\TeX} +\unexpanded\def\pdfeTeX {pdfe-\TeX} +\unexpanded\def\luaTeX {lua\TeX} +\unexpanded\def\luajitTeX{luajit\TeX} +\unexpanded\def\metaTeX {meta\TeX} +\unexpanded\def\XeTeX {X\lower.5\exheight\hbox{\kern-.15\emwidth\mirror{E}}\kern-.1667\emwidth\TeX} % Adapted from a patch by Mojca: @@ -185,9 +183,9 @@ \raise\dimexpr\ht\scratchbox+\dp\scratchbox\relax\hbox{\rotate[\c!rotation=180]{\box\scratchbox}}} \unexpanded\def\XeTeX - {X\lower.5ex + {X\lower.5\exheight \hbox - {\kern-.15em + {\kern-.15\emwidth \iffontchar\font"018E\relax \char"018E% \else @@ -198,14 +196,15 @@ \ifx\fontalternative\s!bs\syst_logos_xetex_e\else \mirror{E}\fi\fi\fi\fi\fi \fi}% - \kern-.1667em\TeX} + \kern-.1667\emwidth\TeX} -\let\ETEX \eTeX -\let\PDFTEX \pdfTeX -\let\PDFETEX\pdfeTeX -\let\LUATEX \luaTeX -\let\LuaTeX \luaTeX -\let\XETEX \XeTeX +\let\ETEX \eTeX +\let\PDFTEX \pdfTeX +\let\PDFETEX \pdfeTeX +\let\LUATEX \luaTeX +\let\LUAJITTEX\luajitTeX +\let\LuaTeX \luaTeX +\let\XETEX \XeTeX % \unexpanded\def\MkApproved % joke, not used so it might move % {\dontleavehmode\rotate @@ -265,22 +264,36 @@ \TeX \endgroup} -\let\luaTeX \LuaTeX -\let\LUATEX \LuaTeX +\unexpanded\def\LuajitTeX + {\dontleavehmode + \begingroup + % at this moment there is no real need for kerning tT + Luajit\kern\zeropoint\TeX + \endgroup} + +\let\luaTeX \LuaTeX +\let\luajitTeX\LuajitTeX +\let\LUATEX \LuaTeX +\let\LUAJITTEX\LuajitTeX \unexpanded\def\MKII{MkII} \unexpanded\def\MKIV{MkIV} \unexpanded\def\MKVI{MkVI} +\unexpanded\def\MKIX{MkIX} +\unexpanded\def\MKXI{MkXI} \unexpanded\def\MPII{MpII} \unexpanded\def\MPIV{MpIV} +\unexpanded\def\MPVI{MpVI} \appendtoks - \def\ConTeXt {ConTeXt}% - \def\MetaPost{MetaPost}% - \def\MetaFont{MetaFont}% - \def\MetaFun {MetaFun}% - \def\TeX {TeX}% + \def\ConTeXt {ConTeXt}% + \def\MetaPost {MetaPost}% + \def\MetaFont {MetaFont}% + \def\MetaFun {MetaFun}% + \def\TeX {TeX}% + \def\LuaTeX {LuaTeX}% + \def\LuajitTeX{LuajitTeX}% \to \everysimplifycommands \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/cont-new.mkiv b/Master/texmf-dist/tex/context/base/cont-new.mkiv index af32e8f35c9..2b7028e336b 100644 --- a/Master/texmf-dist/tex/context/base/cont-new.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2014.05.21 22:04} +\newcontextversion{2015.04.18 14:41} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. @@ -32,6 +32,61 @@ % \inheritmaintextcolor % \to \everymargindatacontent +% This is experimental; if this changes we need to adapt the mb-mp style too. It's +% not in the core yet. +% +% \def\ActionY{\blank\inleftmargin{\shownofparlines}} +% \def\ActionN{\inleftmargin{\shownofparlines}} +% +% \saveparnumber +% ... +% \checknofparlines +% \ifnum\nofparlines<2 +% \ActionY +% \else +% \ActionN +% \fi +% ... + +\newcount\c_typo_par_current +\newcount\c_typo_par_saved +\newcount\c_typo_par_lines +\newcount\c_typo_par_temp + +\appendtoks + \advance\c_typo_par_current\plusone % local + %\llap{\infofont[\the\c_typo_par_saved:\the\c_typo_par_current]\quad}% +\to \everypar + +\unexpanded\def\saveparnumber % the upcoming number + {\c_typo_par_saved\c_typo_par_current} % local + +\def\savedparnumber {\number\c_typo_par_saved} +\def\currentparnumber{\number\c_typo_par_current} +\def\nofparlines {\number\c_typo_par_lines} +\let\savedparstate \empty + +\unexpanded\def\shownofparlines + {\dontleavehmode\hbox\bgroup + \infofont[\savedparstate]% + \egroup} + +\unexpanded\def\checknofparlines + {\c_typo_par_temp\numexpr\c_typo_par_saved+\plusone\relax + \ifhmode + \c_typo_par_lines\zerocount + \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}% + \else\ifnum\c_typo_par_current=\c_typo_par_temp + \c_typo_par_lines\prevgraf + \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space\number\prevgraf}% + \else\ifnum\c_typo_par_temp>\c_typo_par_current + \c_typo_par_lines\zerocount + \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}% + \else + \c_typo_par_lines\maxdimen + \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space+}% + \fi\fi\fi} + %D Maybe: \unexpanded\def\tightvbox{\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\vbox} diff --git a/Master/texmf-dist/tex/context/base/cont-run.lua b/Master/texmf-dist/tex/context/base/cont-run.lua new file mode 100644 index 00000000000..08bbe5c3c25 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/cont-run.lua @@ -0,0 +1,252 @@ +if not modules then modules = { } end modules ['cont-run'] = { + version = 1.001, + comment = "companion to cont-yes.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- When a style is loaded there is a good change that we never enter +-- this code. + +local report = logs.reporter("system") + +local type, tostring = type, tostring + +local report = logs.reporter("sandbox","call") +local fastserialize = table.fastserialize +local quoted = string.quoted +local possiblepath = sandbox.possiblepath + +local context = context +local implement = interfaces.implement + +local qualified = { } +local writeable = { } +local readable = { } +local blocked = { } +local trace_files = false +local trace_calls = false +local nofcalls = 0 +local nofrejected = 0 +local logfilename = "sandbox.log" + +local function registerstats() + statistics.register("sandboxing", function() + if trace_files then + return string.format("%s calls, %s rejected, logdata in '%s'",nofcalls,nofrejected,logfilename) + else + return string.format("%s calls, %s rejected",nofcalls,nofrejected) + end + end) + registerstats = false +end + +local function logsandbox(details) + local comment = details.comment + local result = details.result + local arguments = details.arguments + for i=1,#arguments do + local argument = arguments[i] + local t = type(argument) + if t == "string" then + arguments[i] = quoted(argument) + if trace_files and possiblepath(argument) then + local q = qualified[argument] + if q then + local c = q[comment] + if c then + local r = c[result] + if r then + c[result] = r + 1 + else + c[result] = r + end + else + q[comment] = { + [result] = 1 + } + end + else + qualified[argument] = { + [comment] = { + [result] = 1 + } + } + end + end + elseif t == "table" then + arguments[i] = fastserialize(argument) + else + arguments[i] = tostring(argument) + end + end + if trace_calls then + report("%s(%,t) => %l",details.comment,arguments,result) + end + nofcalls = nofcalls + 1 + if not result then + nofrejected = nofrejected + 1 + end +end + +local ioopen = sandbox.original(io.open) + +local function logsandboxfiles(name,what,asked,okay) + -- we're only interested in permitted access + if not okay then + blocked [asked] = blocked [asked] or 0 + 1 + elseif what == "*" or what == "w" then + writeable[asked] = writeable[asked] or 0 + 1 + else + readable [asked] = readable [asked] or 0 + 1 + end +end + +function sandbox.logcalls() + if not trace_calls then + trace_calls = true + sandbox.setlogger(logsandbox) + if registerstats then + registerstats() + end + end +end + +function sandbox.logfiles() + if not trace_files then + trace_files = true + sandbox.setlogger(logsandbox) + sandbox.setfilenamelogger(logsandboxfiles) + luatex.registerstopactions(function() + table.save(logfilename,{ + calls = { + nofcalls = nofcalls, + nofrejected = nofrejected, + filenames = qualified, + }, + checkednames = { + readable = readable, + writeable = writeable, + blocked = blocked, + }, + }) + end) + if registerstats then + registerstats() + end + end +end + +trackers.register("sandbox.tracecalls",sandbox.logcalls) +trackers.register("sandbox.tracefiles",sandbox.logfiles) + +local sandboxing = environment.arguments.sandbox + +if sandboxing then + + report("enabling sandbox") + + sandbox.enable() + + if type(sandboxing) == "string" then + sandboxing = utilities.parsers.settings_to_hash(sandboxing) + if sandboxing.calls then + sandbox.logcalls() + end + if sandboxing.files then + sandbox.logfiles() + end + end + + -- Nicer would be if we could just disable write 18 and keep os.execute + -- which in fact we can do by defining write18 as macro instead of + -- primitive ... todo. + + -- We block some potential escapes from protection. + + context [[ + \let\primitive \relax + \let\normalprimitive\relax + \let\normalwrite \relax + ]] + +end + +local function processjob() + + environment.initializefilenames() -- todo: check if we really need to pre-prep the filename + + local arguments = environment.arguments + local suffix = environment.suffix + local filename = environment.filename -- hm, not inputfilename ! + + if not filename or filename == "" then + -- skip + elseif suffix == "xml" or arguments.forcexml then + + -- Maybe we should move the preamble parsing here as it + -- can be part of (any) loaded (sub) file. The \starttext + -- wrapping might go away. + + report("processing as xml: %s",filename) + + context.starttext() + context.xmlprocess("main",filename,"") + context.stoptext() + + elseif suffix == "cld" or arguments.forcecld then + + report("processing as cld: %s",filename) + + context.runfile(filename) + + elseif suffix == "lua" or arguments.forcelua then + + -- The wrapping might go away. Why is is it there in the + -- first place. + + report("processing as lua: %s",filename) + + context.starttext() + context.ctxlua(string.format('dofile("%s")',filename)) + context.stoptext() + + elseif suffix == "mp" or arguments.forcemp then + + report("processing as metapost: %s",filename) + + context.starttext() + context.processMPfigurefile(filename) + context.stoptext() + + -- elseif suffix == "prep" then + -- + -- -- Why do we wrap here. Because it can be xml? Let's get rid + -- -- of prepping in general. + -- + -- context.starttext() + -- context.input(filename) + -- context.stoptext() + + else + + -- \writestatus{system}{processing as tex} + -- We have a regular tex file so no \starttext yet as we can + -- load fonts. + + -- context.enabletrackers { "resolvers.*" } + context.input(filename) + -- context.disabletrackers { "resolvers.*" } + + end + + context.finishjob() + +end + +implement { + name = "processjob", + onlyonce = true, + actions = processjob, +} diff --git a/Master/texmf-dist/tex/context/base/cont-run.mkiv b/Master/texmf-dist/tex/context/base/cont-run.mkiv new file mode 100644 index 00000000000..fcca7b58133 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/cont-run.mkiv @@ -0,0 +1,20 @@ +%D \module +%D [ file=cont-run, +%D version=2014.12.26, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Runner, +%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. + +\writestatus{loading}{ConTeXt Core Macros / Runner} + +\unprotect + +\registerctxluafile{cont-run}{1.001} + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/cont-yes.mkiv b/Master/texmf-dist/tex/context/base/cont-yes.mkiv index 1a10fc30ec4..0b7f3231baf 100644 --- a/Master/texmf-dist/tex/context/base/cont-yes.mkiv +++ b/Master/texmf-dist/tex/context/base/cont-yes.mkiv @@ -15,79 +15,85 @@ % wraping as we can assume proper styling. It's a left-over from % mkii that we need to get rid of. -\startluacode - - -- When a style is loaded there is a good change that we never enter - -- this code. - - local report = logs.reporter("system") - - environment.initializefilenames() -- todo: check if we really need to pre-prep the filename - - local arguments = environment.arguments - local suffix = environment.suffix - local filename = environment.filename -- hm, not inputfilename ! - - if suffix == "xml" or arguments.forcexml then - - -- Maybe we should move the preamble parsing here as it - -- can be part of (any) loaded (sub) file. The \starttext - -- wrapping might go away. - - report("processing as xml: %s",filename) - - context.starttext() - context.xmlprocess("main",filename,"") - context.stoptext() - - elseif suffix == "cld" or arguments.forcecld then - - report("processing as cld: %s",filename) - - context.runfile(filename) - - elseif suffix == "lua" or arguments.forcelua then - - -- The wrapping might go away. Why is is it there in the - -- first place. - - report("processing as lua: %s",filename) - - context.starttext() - context.ctxlua(string.format('dofile("%s")',filename)) - context.stoptext() - - elseif suffix == "mp" or arguments.forcemp then - - report("processing as metapost: %s",filename) - - context.starttext() - context.processMPfigurefile(filename) - context.stoptext() - - -- elseif suffix == "prep" then - -- - -- -- Why do we wrap here. Because it can be xml? Let's get rid - -- -- of prepping in general. - -- - -- context.starttext() - -- context.input(filename) - -- context.stoptext() - - else - - -- \writestatus{system}{processing as tex} - -- We have a regular tex file so no \starttext yet as we can - -- load fonts. - - -- context.enabletrackers { "resolvers.*" } - context.input(filename) - -- context.disabletrackers { "resolvers.*" } - - end - - context.finishjob() - -\stopluacode +% now moved to cont-run.lua +% +% \startluacode +% +% -- When a style is loaded there is a good change that we never enter +% -- this code. +% +% local report = logs.reporter("system") +% +% environment.initializefilenames() -- todo: check if we really need to pre-prep the filename +% +% local arguments = environment.arguments +% local suffix = environment.suffix +% local filename = environment.filename -- hm, not inputfilename ! +% +% if suffix == "xml" or arguments.forcexml then +% +% -- Maybe we should move the preamble parsing here as it +% -- can be part of (any) loaded (sub) file. The \starttext +% -- wrapping might go away. +% +% report("processing as xml: %s",filename) +% +% context.starttext() +% context.xmlprocess("main",filename,"") +% context.stoptext() +% +% elseif suffix == "cld" or arguments.forcecld then +% +% report("processing as cld: %s",filename) +% +% context.runfile(filename) +% +% elseif suffix == "lua" or arguments.forcelua then +% +% -- The wrapping might go away. Why is is it there in the +% -- first place. +% +% report("processing as lua: %s",filename) +% +% context.starttext() +% context.ctxlua(string.format('dofile("%s")',filename)) +% context.stoptext() +% +% elseif suffix == "mp" or arguments.forcemp then +% +% report("processing as metapost: %s",filename) +% +% context.starttext() +% context.processMPfigurefile(filename) +% context.stoptext() +% +% -- elseif suffix == "prep" then +% -- +% -- -- Why do we wrap here. Because it can be xml? Let's get rid +% -- -- of prepping in general. +% -- +% -- context.starttext() +% -- context.input(filename) +% -- context.stoptext() +% +% else +% +% -- \writestatus{system}{processing as tex} +% -- We have a regular tex file so no \starttext yet as we can +% -- load fonts. +% +% -- context.enabletrackers { "resolvers.*" } +% context.input(filename) +% -- context.disabletrackers { "resolvers.*" } +% +% end +% +% context.finishjob() +% +% \stopluacode + +% We don't want to be in protected mode! + +\getvalue{clf_processjob} % from cont-run.lua \endinput diff --git a/Master/texmf-dist/tex/context/base/context-version.pdf b/Master/texmf-dist/tex/context/base/context-version.pdf index cf428c00ec4..9aee6f9bfda 100644 Binary files a/Master/texmf-dist/tex/context/base/context-version.pdf and b/Master/texmf-dist/tex/context/base/context-version.pdf differ diff --git a/Master/texmf-dist/tex/context/base/context.mkiv b/Master/texmf-dist/tex/context/base/context.mkiv index 9774f645ff1..034b403c409 100644 --- a/Master/texmf-dist/tex/context/base/context.mkiv +++ b/Master/texmf-dist/tex/context/base/context.mkiv @@ -11,6 +11,17 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +% Here is some timing (2015-04-01) luajittex format generation: +% +% 2.6 sec : normal make +% 2.0 sec : with terminal output piped to file +% 0.2 sec : format dumped +% 0.2 sec : char-def/char-ini (no bytecode) +% +% So a format still saves some 1.5 seconds (with luajjitex) startup and +% on network shares cq. when no files are cached by the os it's of course +% much worse. A zero run is .27 sec with luajittex. + % Welcome to context, pronounced as kontekst (rather dutch) and not as % conτεχt. @@ -28,7 +39,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2014.05.21 22:04} +\edef\contextversion{2015.04.18 14:41} \edef\contextkind {beta} %D For those who want to use this: @@ -99,6 +110,9 @@ % From here on we have \unexpanded being \normalprotected, as we already had % \unexpanded long before etex came around. +\loadmarkfile{luat-ini} +\loadmarkfile{toks-ini} + \loadmarkfile{syst-aux} \loadmarkfile{syst-lua} \loadmarkfile{syst-con} @@ -106,15 +120,20 @@ \loadmarkfile{syst-fnt} \loadmarkfile{syst-rtp} +\loadmarkfile{luat-usr} + +% \loadmarkfile{luat-ini} % moved up +% \loadmarkfile{toks-ini} % moved up + \loadmkvifile{file-ini} \loadmkvifile{file-res} \loadmkvifile{file-lib} \loadmarkfile{supp-dir} -\loadmarkfile{char-ini} -\loadmarkfile{char-utf} -\loadmarkfile{char-act} +\loadmarkfile{char-utf} % generic code (i.e. not much tex) ... could become unic-ini +\loadmarkfile{char-ini} % tex / context specific +\loadmarkfile{char-act} % even more specific \loadmarkfile{mult-ini} \loadmarkfile{mult-sys} @@ -126,9 +145,10 @@ \loadmarkfile{cldf-int} % interface -\loadmarkfile{luat-ini} +% \loadmarkfile{luat-ini} -\loadmarkfile{toks-ini} +\loadmarkfile{toks-tra} +%loadmarkfile{toks-map} % obsolete, never used \loadmarkfile{attr-ini} @@ -172,6 +192,8 @@ \loadmarkfile{typo-ini} \loadmarkfile{typo-bld} % par builders +\loadmarkfile{typo-inj} + \loadmkvifile{file-syn} \loadmkvifile{file-mod} @@ -184,6 +206,7 @@ \loadmarkfile{hand-ini} \loadmarkfile{lang-ini} +\loadmarkfile{lang-hyp} \loadmarkfile{lang-lab} \loadmarkfile{unic-ini} @@ -221,6 +244,8 @@ \loadmkvifile{typo-prc} +\loadmarkfile{anch-pos} + \loadmkvifile{strc-ini} \loadmarkfile{strc-tag} \loadmarkfile{strc-doc} @@ -248,7 +273,7 @@ \loadmarkfile{spac-def} \loadmarkfile{spac-grd} -\loadmarkfile{anch-pos} +%loadmarkfile{anch-pos} \loadmkvifile{scrn-ini} \loadmkvifile{scrn-ref} @@ -386,6 +411,7 @@ \loadmarkfile{trac-jus} \loadmarkfile{typo-cln} +\loadmarkfile{typo-wrp} \loadmarkfile{typo-spa} \loadmarkfile{typo-krn} \loadmkvifile{typo-itc} @@ -397,6 +423,9 @@ \loadmkvifile{typo-txt} \loadmarkfile{typo-drp} \loadmarkfile{typo-fln} +\loadmarkfile{typo-sus} +\loadmarkfile{typo-lig} +\loadmarkfile{typo-chr} \loadmkvifile{type-ini} \loadmarkfile{type-set} @@ -408,7 +437,7 @@ \loadmarkfile{prop-ini} % only for downward compatibility -\loadmarkfile{mlib-ctx} +\loadmarkfile{mlib-ctx} % messy order \loadmarkfile{meta-ini} \loadmarkfile{meta-tex} @@ -520,6 +549,8 @@ \loadmarkfile{back-exp} +\loadmarkfile{cont-run} % the main runner (used in cont-yes.mkiv) + \setupcurrentlanguage[\defaultlanguagetag] \prependtoks diff --git a/Master/texmf-dist/tex/context/base/core-con.lua b/Master/texmf-dist/tex/context/base/core-con.lua index 3ccfb3e23f3..be462e1d2f2 100644 --- a/Master/texmf-dist/tex/context/base/core-con.lua +++ b/Master/texmf-dist/tex/context/base/core-con.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['core-con'] = { license = "see context related readme files" } +-- todo: split into char-lan.lua and core-con.lua + --[[ldx--

This module implements a bunch of conversions. Some are more efficient than their counterpart, some are even @@ -22,6 +24,7 @@ local P, C, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.Cs, lpeg.match local context = context local commands = commands +local implement = interfaces.implement local settings_to_array = utilities.parsers.settings_to_array local allocate = utilities.storage.allocate @@ -37,8 +40,8 @@ local languages = languages converters.number = tonumber converters.numbers = tonumber -commands.number = context -commands.numbers = context +implement { name = "number", actions = context } +implement { name = "numbers", actions = context } -- to be reconsidered ... languages namespace here, might become local plus a register command @@ -58,6 +61,14 @@ local counters = allocate { 0x006F, 0x0070, 0x0072, 0x0073, 0x0161, 0x0074, 0x0075, 0x0076, 0x007A, 0x017E }, + ['spanish'] = { + 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, + 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, + 0x006B, 0x006C, 0x006D, 0x006E, 0x00F1, + 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, + 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A + }, ['greek'] = { -- this should be the lowercase table -- 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, -- 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, @@ -129,6 +140,7 @@ counters['ar'] = counters['arabic'] counters['gr'] = counters['greek'] counters['g'] = counters['greek'] counters['sl'] = counters['slovenian'] +counters['es'] = counters['spanish'] counters['kr'] = counters['korean'] counters['kr-p'] = counters['korean-parent'] counters['kr-c'] = counters['korean-circle'] @@ -146,6 +158,9 @@ counters['koreannumerals'] = counters['korean'] counters['koreanparentnumerals'] = counters['korean-parent'] counters['koreancirclenumerals'] = counters['korean-circle'] +counters['sloveniannumerals'] = counters['slovenian'] +counters['spanishnumerals'] = counters['spanish'] + local fallback = utfbyte('0') local function chr(n,m) @@ -189,6 +204,8 @@ converters.maxchrs = maxchrs local lowercharacter = characters.lcchars local uppercharacter = characters.ucchars +local defaultcounter = counters.default + local function do_alphabetic(n,mapping,mapper,t) -- todo: make zero based variant (initial n + 1) if not t then t = { } @@ -205,14 +222,17 @@ local function do_alphabetic(n,mapping,mapper,t) -- todo: make zero based varian end end -function converters.alphabetic(n,code) - return do_alphabetic(n,counters[code] or counters.default,lowercharacter) +local function alphabetic(n,code) + return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,lowercharacter) end -function converters.Alphabetic(n,code) - return do_alphabetic(n,counters[code] or counters.default,uppercharacter) +local function Alphabetic(n,code) + return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,uppercharacter) end +converters.alphabetic = alphabetic +converters.Alphabetic = Alphabetic + local lower_offset = 96 local upper_offset = 64 @@ -226,12 +246,13 @@ converters['A'] = converters.Characters converters['AK'] = converters.Characters converters['KA'] = converters.Characters -function commands.alphabetic(n,c) context(do_alphabetic(n,counters[c],lowercharacter)) end -function commands.Alphabetic(n,c) context(do_alphabetic(n,counters[c],uppercharacter)) end -function commands.character (n) context(chr (n,lower_offset)) end -function commands.Character (n) context(chr (n,upper_offset)) end -function commands.characters(n) context(chrs(n,lower_offset)) end -function commands.Characters(n) context(chrs(n,upper_offset)) end +implement { name = "alphabetic", actions = { alphabetic, context }, arguments = { "integer", "string" } } +implement { name = "Alphabetic", actions = { Alphabetic, context }, arguments = { "integer", "string" } } + +implement { name = "character", actions = { chr, context }, arguments = { "integer", lower_offset } } +implement { name = "Character", actions = { chr, context }, arguments = { "integer", upper_offset } } +implement { name = "characters", actions = { chrs, context }, arguments = { "integer", lower_offset } } +implement { name = "Characters", actions = { chrs, context }, arguments = { "integer", upper_offset } } local weekday = os.weekday -- moved to l-os local isleapyear = os.isleapyear -- moved to l-os @@ -257,20 +278,22 @@ converters.leapyear = leapyear converters.nofdays = nofdays converters.textime = textime -function commands.weekday (day,month,year) context(weekday (day,month,year)) end -function commands.leapyear(year) context(leapyear(year)) end -- rather useless, only for ifcase -function commands.nofdays (year,month) context(nofdays (year,month)) end - -function commands.year () context(date("%Y")) end -function commands.month () context(date("%m")) end -function commands.hour () context(date("%H")) end -function commands.minute () context(date("%M")) end -function commands.second () context(date("%S")) end -function commands.textime() context(textime()) end - -function commands.doifleapyearelse(year) - commands.doifelse(isleapyear(year)) -end +implement { name = "weekday", actions = { weekday, context }, arguments = { "integer", "integer", "integer" } } +implement { name = "leapyear", actions = { leapyear, context }, arguments = { "integer" } } +implement { name = "nofdays", actions = { nofdays, context }, arguments = { "integer", "integer" } } + +implement { name = "year", actions = { date, context }, arguments = "'%Y'" } +implement { name = "month", actions = { date, context }, arguments = "'%m'" } +implement { name = "hour", actions = { date, context }, arguments = "'%H'" } +implement { name = "minute", actions = { date, context }, arguments = "'%M'" } +implement { name = "second", actions = { date, context }, arguments = "'%S'" } +implement { name = "textime", actions = { textime, context } } + +implement { + name = "doifelseleapyear", + actions = { isleapyear, commands.doifelse }, + arguments = "integer" +} local roman = { { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' }, @@ -297,8 +320,17 @@ converters['R'] = converters.Romannumerals converters['KR'] = converters.Romannumerals converters['RK'] = converters.Romannumerals -function commands.romannumerals(n) context(lower(toroman(n))) end -function commands.Romannumerals(n) context( toroman(n)) end +implement { + name = "romannumerals", + actions = { toroman, lower, context }, + arguments = "integer", +} + +implement { + name = "Romannumerals", + actions = { toroman, context }, + arguments = "integer", +} --~ local small = { --~ 0x0627, 0x066E, 0x062D, 0x062F, 0x0647, 0x0648, 0x0631 @@ -351,8 +383,17 @@ converters.toabjad = toabjad function converters.abjadnumerals (n) return toabjad(n,false) end function converters.abjadnodotnumerals(n) return toabjad(n,true ) end -function commands.abjadnumerals (n) context(toabjad(n,false)) end -function commands.abjadnodotnumerals(n) context(toabjad(n,true )) end +implement { + name = "abjadnumerals", + actions = { toabjad, context }, + arguments = { "integer", false } +} + +implement { + name = "abjadnodotnumerals", + actions = { toabjad, context }, + arguments = { "integer", true } +} local vector = { normal = { @@ -494,36 +535,59 @@ end converters.tochinese = tochinese -function converters.chinesenumerals (n) return tochinese(n,"normal") end -function converters.chinesecapnumerals(n) return tochinese(n,"cap" ) end -function converters.chineseallnumerals(n) return tochinese(n,"all" ) end +function converters.chinesenumerals (n,how) return tochinese(n,how or "normal") end +function converters.chinesecapnumerals(n) return tochinese(n,"cap") end +function converters.chineseallnumerals(n) return tochinese(n,"all") end converters['cn'] = converters.chinesenumerals converters['cn-c'] = converters.chinesecapnumerals converters['cn-a'] = converters.chineseallnumerals -function commands.chinesenumerals (n) context(tochinese(n,"normal")) end -function commands.chinesecapnumerals(n) context(tochinese(n,"cap" )) end -function commands.chineseallnumerals(n) context(tochinese(n,"all" )) end +implement { + name = "chinesenumerals", + actions = { tochinese, context }, + arguments = { "integer", "string" } +} + +-- this is a temporary solution: we need a better solution when we have +-- more languages + +function converters.spanishnumerals(n) return alphabetic(n,"es") end +function converters.Spanishnumerals(n) return Alphabetic(n,"es") end +function converters.sloviannumerals(n) return alphabetic(n,"sl") end +function converters.Sloviannumerals(n) return Alphabetic(n,"sl") end + +converters['characters:es'] = converters.spanishnumerals +converters['characters:sl'] = converters.sloveniannumerals + +converters['Characters:es'] = converters.Spanishnumerals +converters['Characters:sl'] = converters.Sloveniannumerals converters.sequences = converters.sequences or { } local sequences = converters.sequences storage.register("converters/sequences", sequences, "converters.sequences") -function converters.define(name,set) +function converters.define(name,set) -- ,language) + -- if language then + -- name = name .. ":" .. language + -- end sequences[name] = settings_to_array(set) end -commands.defineconversion = converters.define +implement { + name = "defineconversion", + actions = converters.define, + arguments = { "string", "string" } +} -local function convert(method,n) -- todo: language - local converter = converters[method] +local function convert(method,n,language) + local converter = language and converters[method..":"..language] or converters[method] if converter then return converter(n) else local lowermethod = lower(method) - local linguistic = counters[lowermethod] + local linguistic = counters[lowermethod] if linguistic then return do_alphabetic(n,linguistic,lowermethod == method and lowercharacter or uppercharacter) end @@ -535,18 +599,29 @@ local function convert(method,n) -- todo: language else return sequence[n] end - else - return n end + return n end end converters.convert = convert -function commands.checkedconversion(method,n) - context(convert(method,n)) +local function valid(method,language) + return converters[method..":"..language] or converters[method] or sequences[method] end +implement { + name = "doifelseconverter", + actions = { valid, commands.doifelse }, + arguments = { "string", "string" } +} + +implement { + name = "checkedconversion", + actions = { convert, context }, + arguments = { "string", "integer" } +} + -- Well, since the one asking for this didn't test it the following code is not -- enabled. -- @@ -720,7 +795,7 @@ function converters.ordinal(n,language) return t and t(n) end -function commands.ordinal(n,language) +local function ctxordinal(n,language) local t = language and ordinals[language] local o = t and t(n) context(n) @@ -729,6 +804,12 @@ function commands.ordinal(n,language) end end +implement { + name = "ordinal", + actions = ctxordinal, + arguments = { "string", "string" } +} + -- verbose numbers local data = allocate() @@ -891,7 +972,7 @@ local words = { [900] = "novecientos", [1000] = "mil", [1000^2] = "millón", - [1000^3] = "mil millónes", + [1000^3] = "mil millones", [1000^4] = "billón", } @@ -971,24 +1052,42 @@ function converters.verbose.translate(n,language) return t and t.translate(n) or n end -function commands.verbose(n,language) +local function verbose(n,language) local t = language and data[language] context(t and t.translate(n) or n) end +implement { + name = "verbose", + actions = verbose, + arguments = { "integer", "string" } +} + -- These are just helpers but not really for the tex end. Do we have to -- use translate here? local whitespace = lpeg.patterns.whitespace -local word = (1-whitespace) / characters.upper * (1-whitespace)^1 -local spacing = whitespace^1 -local pattern_one = Cs(word * P(1)^1) -local pattern_all = Cs((word + spacing)^1) +local word = lpeg.patterns.utf8uppercharacter^-1 * (1-whitespace)^1 +local pattern_one = Cs( whitespace^0 * word^-1 * P(1)^0) +local pattern_all = Cs((whitespace^1 + word)^1) + +function converters.word (s) return s end -- dummies for typos +function converters.words(s) return s end -- dummies for typos +function converters.Word (s) return lpegmatch(pattern_one,s) or s end +function converters.Words(s) return lpegmatch(pattern_all,s) or s end + +converters.upper = characters.upper +converters.lower = characters.lower -function converters.word (s) return s end -function converters.words(s) return s end -function converters.Word (s) return lpegmatch(pattern_one,s) end -function converters.Words(s) return lpegmatch(pattern_all,s) end +-- print(converters.Word("foo bar")) +-- print(converters.Word(" foo bar")) +-- print(converters.Word("123 foo bar")) +-- print(converters.Word(" 123 foo bar")) + +-- print(converters.Words("foo bar")) +-- print(converters.Words(" foo bar")) +-- print(converters.Words("123 foo bar")) +-- print(converters.Words(" 123 foo bar")) -- -- @@ -1026,33 +1125,60 @@ local months = { -- not variables.january "december", } -function commands.dayname(n) - context.labeltext(days[n] or "unknown") +local function dayname(n) + return days[n] or "unknown" end -function commands.weekdayname(day,month,year) - context.labeltext(days[weekday(day,month,year)] or "unknown") +local function weekdayname(day,month,year) + return days[weekday(day,month,year)] or "unknown" end -function commands.monthname(n) - context.labeltext(months[n] or "unknown") +local function monthname(n) + return months[n] or "unknown" end -function commands.monthmnem(n) +local function monthmnem(n) local m = months[n] - context.labeltext(m and (m ..":mnem") or "unknown") + return m and (m ..":mnem") or "unknown" end +implement { + name = "dayname", + actions = { dayname, context.labeltext }, + arguments = "integer", +} + +implement { + name = "weekdayname", + actions = { weekdayname, context.labeltext }, + arguments = { "integer", "integer", "integer" } +} + +implement { + name = "monthname", + actions = { monthname, context.labeltext }, + arguments = { "integer" } +} + +implement { + name = "monthmnem", + actions = { monthmnem, context.labeltext }, + arguments = { "integer" } +} + -- a prelude to a function that we can use at the lua end -- day:ord month:mmem -- j and jj obsolete -function commands.currentdate(str,currentlanguage) -- second argument false : no label +local function currentdate(str,currentlanguage) -- second argument false : no label local list = utilities.parsers.settings_to_array(str) local splitlabel = languages.labels.split or string.itself -- we need to get the loading order right local year, month, day = tex.year, tex.month, tex.day local auto = true + if currentlanguage == "" then + currentlanguage = false + end for i=1,#list do local entry = list[i] local tag, plus = splitlabel(entry) @@ -1078,9 +1204,9 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no if currentlanguage == false then context(months[month] or "unknown") elseif mnemonic then - commands.monthmnem(month) + context.labeltext(monthmnem(month)) else - commands.monthname(month) + context.labeltext(monthname(month)) end elseif tag == "mm" then context("%02i",month) @@ -1090,7 +1216,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no if currentlanguage == false then context(days[day] or "unknown") else - context.convertnumber(v_day,day) + context.convertnumber(v_day,day) -- why not direct end whatordinal = day elseif tag == "dd" then @@ -1104,7 +1230,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no if currentlanguage == false then context(days[wd] or "unknown") else - commands.dayname(wd) + context.labeltext(days[wd] or "unknown") end elseif tag == "W" then context(weekday(day,month,year)) @@ -1127,6 +1253,20 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no end end -function commands.rawdate(str) - commands.currentdate(str,false) -end +implement { + name = "currentdate", + actions = currentdate, + arguments = { "string", "string" } +} + +implement { + name = "rawdate", + actions = currentdate, + arguments = { "string", false } +} + +implement { + name = "unihex", + actions = { formatters["U+%05X"], context }, + arguments = "integer" +} diff --git a/Master/texmf-dist/tex/context/base/core-con.mkiv b/Master/texmf-dist/tex/context/base/core-con.mkiv index 47c7c88d590..f7d718f4482 100644 --- a/Master/texmf-dist/tex/context/base/core-con.mkiv +++ b/Master/texmf-dist/tex/context/base/core-con.mkiv @@ -67,44 +67,43 @@ %D \showsetup{romannumerals} %D \showsetup{Romannumerals} -\def\romannumerals#1{\ctxcommand{romannumerals(\number#1)}} -\def\Romannumerals#1{\ctxcommand{Romannumerals(\number#1)}} +\def\romannumerals#1{\clf_romannumerals\numexpr#1\relax} +\def\Romannumerals#1{\clf_Romannumerals\numexpr#1\relax} %D Arabic etc: -\def\abjadnumerals #1{\ctxcommand{abjadnumerals (\number#1)}} -\def\abjadnodotnumerals#1{\ctxcommand{abjadnodotnumerals(\number#1)}} -\def\abjadnaivenumerals#1{\ctxcommand{arabicnumerals (\number#1)}} +\def\abjadnumerals #1{\clf_abjadnumerals \numexpr#1\relax} +\def\abjadnodotnumerals#1{\clf_abjadnodotnumerals\numexpr#1\relax} +\def\abjadnaivenumerals#1{\clf_alphabetic \numexpr#1\relax{arabic}} % okay? -\def\languagecharacters#1{\ctxcommand{alphabetic(\number#1,"\currentlanguage")}} % new -\def\languageCharacters#1{\ctxcommand{Alphabetic(\number#1,"\currentlanguage")}} % new +\def\languagecharacters#1{\clf_alphabetic\numexpr#1\relax{\currentlanguage}} % new +\def\languageCharacters#1{\clf_Alphabetic\numexpr#1\relax{\currentlanguage}} % new -% we could use an auxiliary macro to save some bytes in the format -% -% \def\dolanguagecharacters#1#2{\ctxcommand{alphabetic(\number#2,"#1")}} - -\def\thainumerals #1{\ctxcommand{alphabetic(\number#1,"thai")}} -\def\devanagarinumerals#1{\ctxcommand{alphabetic(\number#1,"devanagari")}} -\def\gurmurkhinumerals #1{\ctxcommand{alphabetic(\number#1,"gurmurkhi")}} -\def\gujaratinumerals #1{\ctxcommand{alphabetic(\number#1,"gujarati")}} -\def\tibetannumerals #1{\ctxcommand{alphabetic(\number#1,"tibetan")}} -\def\greeknumerals #1{\ctxcommand{alphabetic(\number#1,"greek")}} -\def\Greeknumerals #1{\ctxcommand{Alphabetic(\number#1,"greek")}} -\def\arabicnumerals #1{\ctxcommand{alphabetic(\number#1,"arabic")}} -\def\persiannumerals #1{\ctxcommand{alphabetic(\number#1,"persian")}} +\def\alphabeticnumerals#1{\clf_alphabetic\numexpr#1\relax{}} +\def\Alphabeticnumerals#1{\clf_Alphabetic\numexpr#1\relax{}} + +\def\thainumerals #1{\clf_alphabetic\numexpr#1\relax{thai}} +\def\devanagarinumerals#1{\clf_alphabetic\numexpr#1\relax{devanagari}} +\def\gurmurkhinumerals #1{\clf_alphabetic\numexpr#1\relax{gurmurkhi}} +\def\gujaratinumerals #1{\clf_alphabetic\numexpr#1\relax{gujarati}} +\def\tibetannumerals #1{\clf_alphabetic\numexpr#1\relax{tibetan}} +\def\greeknumerals #1{\clf_alphabetic\numexpr#1\relax{greek}} +\def\Greeknumerals #1{\clf_Alphabetic\numexpr#1\relax{greek}} +\def\arabicnumerals #1{\clf_alphabetic\numexpr#1\relax{arabic}} +\def\persiannumerals #1{\clf_alphabetic\numexpr#1\relax{persian}} \let\arabicexnumerals \persiannumerals -\def\koreannumerals #1{\ctxcommand{alphabetic(\number#1,"korean")}} -\def\koreannumeralsp #1{\ctxcommand{alphabetic(\number#1,"korean-parent")}} -\def\koreannumeralsc #1{\ctxcommand{alphabetic(\number#1,"korean-circle")}} +\def\koreannumerals #1{\clf_alphabetic\numexpr#1\relax{korean}} +\def\koreannumeralsp #1{\clf_alphabetic\numexpr#1\relax{korean-parent}} +\def\koreannumeralsc #1{\clf_alphabetic\numexpr#1\relax{korean-circle}} \let\koreanparentnumerals\koreannumeralsp \let\koreancirclenumerals\koreannumeralsc -\def\chinesenumerals #1{\ctxcommand{chinesenumerals (\number#1)}} -\def\chinesecapnumerals#1{\ctxcommand{chinesecapnumerals(\number#1,"cap")}} -\def\chineseallnumerals#1{\ctxcommand{chineseallnumerals(\number#1,"all")}} +\def\chinesenumerals #1{\clf_chinesenumerals\numexpr#1\relax{normal}} +\def\chinesecapnumerals#1{\clf_chinesenumerals\numexpr#1\relax{cap}} +\def\chineseallnumerals#1{\clf_chinesenumerals\numexpr#1\relax{all}} %D \macros %D {character,Character} @@ -124,8 +123,8 @@ \def\unknowncharacter{-} % else in lists \relax -\def\character#1{\ctxcommand{character(\number#1)}} -\def\Character#1{\ctxcommand{Character(\number#1)}} +\def\character#1{\clf_character\numexpr#1\relax} +\def\Character#1{\clf_Character\numexpr#1\relax} %D \macros %D {characters,Characters} @@ -136,8 +135,8 @@ %D \showsetup{characters} %D \showsetup{Characters} -\def\characters#1{\ctxcommand{characters(\number#1)}} -\def\Characters#1{\ctxcommand{Characters(\number#1)}} +\def\characters#1{\clf_characters\numexpr#1\relax} +\def\Characters#1{\clf_Characters\numexpr#1\relax} %D \macros %D {greeknumerals,Greeknumerals} @@ -206,8 +205,8 @@ %D %D Anyhow, the conversion looks like: -\unexpanded\def\monthlong #1{\ctxcommand{monthname(#1)}} -\unexpanded\def\monthshort#1{\ctxcommand{monthmnem(#1)}} +\unexpanded\def\monthlong #1{\clf_monthname\numexpr#1\relax} +\unexpanded\def\monthshort#1{\clf_monthmnem\numexpr#1\relax} \let\convertmonth\monthlong % for old times sake @@ -240,16 +239,16 @@ %D \showsetup{weekday} %D \showsetup{WEEKDAY} -\unexpanded\def\weekday#1{\ctxcommand{day(#1)}} -\unexpanded\def\WEEKDAY#1{\WORD{\weekday{#1}}} +\unexpanded\def\weekday#1{\clf_day\numexpr#1\relax} +\unexpanded\def\WEEKDAY#1{\WORD{\clf_day\numexpr#1\relax}} %D \macros %D {getdayoftheweek, dayoftheweek} \newcount\normalweekday - \def\dayoftheweek #1#2#3{\ctxcommand{weekdayname(\number#1,\number#2,\number#3)}} % name -\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\ctxcommand{weekday(\number#1,\number#2,\number#3)}\relax} % number + \def\dayoftheweek #1#2#3{\clf_weekdayname\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax} % name +\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\clf_weekday\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax\relax} % number %D Using this macro in %D @@ -294,14 +293,16 @@ %D %D The number of days is available in the macro \type {\numberofdays}. -\def\doifleapyearelse#1% - {\ctxcommand{doifleapyearelse(\number#1)}} +\def\doifelseleapyear#1% + {\clf_doifelseleapyear\numexpr#1\relax} + +\let\doifleapyearelse\doifelseleapyear \unexpanded\def\getdayspermonth#1#2% - {\edef\numberofdays{\ctxcommand{nofdays(\number#1,\number#2)}}} + {\edef\numberofdays{\clf_nofdays\numexpr#1\relax\numexpr#2\relax}} \def\dayspermonth#1#2% - {\ctxcommand{nofdays(\number#1,\number#2)}} + {\clf_nofdays\numexpr#1\relax\numexpr#2\relax} % \dayoftheweek{2006}{9}{15} % \doifleapyearelse{2000}{OK}{NOT OK} @@ -413,7 +414,7 @@ {\begingroup \the\everycurrentdate \doifsomething{#1}{\edef\currentdatespecification{#1}}% - \ctxcommand{currentdate(\!!bs\currentdatespecification\!!es,"\labellanguage")}% + \clf_currentdate{\currentdatespecification}{\labellanguage}% \endgroup} \unexpanded\def\date @@ -434,7 +435,7 @@ \endgroup} \def\rawdate[#1]% expandable and no labels - {\ctxcommand{rawdate(\!!bs\currentdatespecification\!!es)}} + {\clf_rawdate{\currentdatespecification}} %D \macros %D {currenttime} @@ -443,9 +444,9 @@ %D to the previous date macro using the keys \type {h}, \type {m} and a separator. \unexpanded\def\calculatecurrenttime - {\edef\currenthour {\ctxcommand{hour ()}}% - \edef\currentminute{\ctxcommand{minute()}}% - \edef\currentsecond{\ctxcommand{second()}}} + {\edef\currenthour {\clf_hour }% + \edef\currentminute{\clf_minute}% + \edef\currentsecond{\clf_second}} \let\currenthour \!!plusone \let\currentminute\!!plusone @@ -454,7 +455,7 @@ \def\currenttimespecification{h,:,m} \unexpanded\def\currenttime - {\doifnextoptionalelse\syst_converters_current_time_yes\syst_converters_current_time_nop} + {\doifelsenextoptional\syst_converters_current_time_yes\syst_converters_current_time_nop} \unexpanded\def\syst_converters_current_time_yes[#1]% {\calculatecurrenttime @@ -520,6 +521,13 @@ \installcorenamespace {conversionarguments} \installcorenamespace {conversionwords} +%D It might be better to move more to lua as we also need conversion there +%D and doublicating logic doesn't make things cleaner. It means that all +%D conversions will get a language argument too. However, we permit definitions +%D at the \TEX\ end so we have to provide some hybrid method. + +% checkedconversion(method,n,language) + \unexpanded\def\defineconversion {\dotripleempty\syst_converters_define_conversion} @@ -531,13 +539,13 @@ \fi} \def\syst_converters_define_conversion_indeed#1#2#3% - {\doifinstringelse{,}{\detokenize{#3}} - {\ctxcommand{defineconversion("#2",\!!bs\detokenize{#3}\!!es)}% + {\doifelseinstring{,}{\detokenize{#3}} + {\clf_defineconversion{#2}{\detokenize{#3}}% a set e.g. of symbols \setgvalue{\??conversion#1}{\syst_converters_checked_conversion{#2}}} {\setgvalue{\??conversion#1}{#3}}} \def\syst_converters_checked_conversion#1#2% - {\ctxcommand{checkedconversion("#1",#2)}} + {\clf_checkedconversion{#1}\numexpr#2\relax} %D If a conversion is just a font switch then we need to make sure that the %D number is indeed ends up as number in the input, so we need to handle the @@ -557,7 +565,11 @@ \setvalue{\??conversionarguments2}#1{\csname\??conversion #1\endcsname} \letvalue{\??conversionarguments3}\syst_converters_checked_conversion -\def\doifconversiondefinedelse#1% +% we can also add a \ctxcommand{doifelseconversion("#1","\currentlanguage")} to check +% if we have definitions that are not matched at the lua end .. eventually we might do +% that when more shows up + +\def\doifelseconversiondefined#1% {\ifcsname\??conversion\currentlanguage#1\endcsname \expandafter\firstoftwoarguments \else\ifcsname\??conversion#1\endcsname @@ -573,6 +585,9 @@ \expandafter\secondoftwoarguments \fi} +\let\doifconversiondefinedelse\doifelseconversiondefined +\let\doifconversionnumberelse \doifelseconversionnumber + %D Handy. \setvalue{\??conversionwords\v!one }{1} @@ -595,10 +610,10 @@ \def\highordinalstr #1{\high{\notsmallcapped{#1}}} \def\ordinalstr #1{\notsmallcapped{#1}} -\def\ordinaldaynumber #1{\ctxcommand{ordinal(#1,"\currentlanguage")}} +\def\ordinaldaynumber #1{\clf_ordinal\numexpr#1\relax{\currentlanguage}} -\def\verbosenumber #1{\ctxcommand{verbose(#1,"\currentlanguage")}} -\def\VerboseNumber #1{\Words{\ctxcommand{verbose(#1,"\currentlanguage")}}} +\def\verbosenumber #1{\clf_verbose\numexpr#1\relax{\currentlanguage}} +\def\VerboseNumber #1{\Words{\clf_verbose\numexpr#1\relax{\currentlanguage}}} %D As longs as symbols are linked to levels or numbers, we can also use the %D conversion mechanism, but in for instance the itemization macros, we prefer @@ -627,6 +642,9 @@ \defineconversion [AK] [\smallcappedcharacters] \defineconversion [KA] [\smallcappedcharacters] +\defineconversion [\v!alphabetic] [\alphabeticnumerals] +\defineconversion [\v!Alphabetic] [\Alphabeticnumerals] + \defineconversion [\v!number] [\numbers] \defineconversion [\v!numbers] [\numbers] \defineconversion [\v!Numbers] [\Numbers] @@ -662,6 +680,9 @@ \defineconversion [g] [\greeknumerals] \defineconversion [G] [\Greeknumerals] +%defineconversion [ñ] [\spanishnumerals] +%defineconversion [Ñ] [\Spanishnumerals] + \defineconversion [abjadnumerals] [\abjadnumerals] \defineconversion [abjadnodotnumerals] [\adjadnodotnumerals] \defineconversion [abjadnaivenumerals] [\adjadnaivenumerals] @@ -693,6 +714,46 @@ \defineconversion [cn-c] [\chinesecapnumerals] \defineconversion [cn-a] [\chineseallnumerals] +%D Moved from lang-def.mkiv: +%D +%D Define these as the general character enumeration when language is Slovenian. If +%D you feel uncomfortable with this, mail Mojca, since she promised to to take the +%D heat. Pablo was next to request this. We changed characters to numerals for this +%D feature. We do need these definitions for mechanisms like itemize that check +%D for converters. + +\def\sloveniannumerals#1{\clf_alphabetic\numexpr#1\relax{sl}} +\def\slovenianNumerals#1{\clf_Alphabetic\numexpr#1\relax{sl}} + +\def\spanishnumerals #1{\clf_alphabetic\numexpr#1\relax{es}} +\def\spanishNumerals #1{\clf_Alphabetic\numexpr#1\relax{es}} + +\defineconversion [\s!sl] [character] [\sloveniannumerals] +\defineconversion [\s!sl] [Character] [\slovenianNumerals] +\defineconversion [\s!sl] [characters] [\sloveniannumerals] +\defineconversion [\s!sl] [Characters] [\slovenianNumerals] + +\defineconversion [\s!sl] [a] [\sloveniannumerals] +\defineconversion [\s!sl] [A] [\slovenianNumerals] +\defineconversion [\s!sl] [AK] [\smallcapped\sloveniannumerals] +\defineconversion [\s!sl] [KA] [\smallcapped\sloveniannumerals] + +\defineconversion [\s!es] [character] [\spanishnumerals] +\defineconversion [\s!es] [Character] [\spanishNumerals] +\defineconversion [\s!es] [characters] [\spanishnumerals] +\defineconversion [\s!es] [Characters] [\spanishNumerals] + +\defineconversion [\s!es] [a] [\spanishnumerals] +\defineconversion [\s!es] [A] [\spanishNumerals] +\defineconversion [\s!es] [AK] [\smallcapped\spanishnumerals] +\defineconversion [\s!es] [KA] [\smallcapped\spanishnumerals] + +\defineconversion [sloveniannumerals] [\sloveniannumerals] +\defineconversion [slovenianNumerals] [\slovenianNumerals] + +\defineconversion [spanishnumerals] [\spanishnumerals] +\defineconversion [spanishNumerals] [\spanishNumerals] + %D In case a font has no greek (WS): \defineconversion [mathgreek] @@ -701,6 +762,10 @@ \m{ν},\m{ξ},\m{ο},\m{π},\m{ρ},\m{σ}, \m{τ},\m{υ},\m{φ},\m{χ},\m{ψ},\m{ω}] +%D Handy too (expanded!): + +\def\unihex#1{\clf_unihex\numexpr#1\relax} + %D Symbol sets: \ifdefined\symbol \else \def\symbol[#1]{#1} \fi % todo diff --git a/Master/texmf-dist/tex/context/base/core-ctx.lua b/Master/texmf-dist/tex/context/base/core-ctx.lua index 18978a53021..c20691cd7be 100644 --- a/Master/texmf-dist/tex/context/base/core-ctx.lua +++ b/Master/texmf-dist/tex/context/base/core-ctx.lua @@ -39,12 +39,12 @@ local xmltext = xml.text local report_prepfiles = logs.reporter("system","prepfiles") -commands = commands or { } -local commands = commands +local commands = commands +local implement = interfaces.implement -ctxrunner = ctxrunner or { } +ctxrunner = ctxrunner or { } -ctxrunner.prepfiles = utilities.storage.allocate() +ctxrunner.prepfiles = utilities.storage.allocate() local function dontpreparefile(t,k) return k -- we only store when we have a prepper @@ -254,7 +254,7 @@ function ctxrunner.load(ctxname) for i=1,#runners do local command = runners[i] report_prepfiles("command: %s",command) - local result = os.spawn(command) or 0 + local result = os.execute(command) or 0 -- if result > 0 then -- report_prepfiles("error, return code: %s",result) -- end @@ -301,35 +301,55 @@ local function resolve(name) -- used a few times later on return ctxrunner.prepfiles[file.collapsepath(name)] or false end -local processfile = commands.processfile -local doifinputfileelse = commands.doifinputfileelse - -function commands.processfile(name,maxreadlevel) -- overloaded - local prepname = resolve(name) - if prepname then - return processfile(prepname,0) - end - return processfile(name,maxreadlevel) +function ctxrunner.preparedfile(name) + return resolve(name) or name end -function commands.doifinputfileelse(name,depth) - local prepname = resolve(name) - if prepname then - return doifinputfileelse(prepname,0) +local processfile = commands.processfile +local doifelseinputfile = commands.doifelseinputfile + +implement { + name = "processfile", + overload = true, + arguments = { "string", "integer" }, + actions = function(name,maxreadlevel) -- overloaded + local prepname = resolve(name) + if prepname then + return processfile(prepname,0) + end + return processfile(name,maxreadlevel) end - return doifinputfileelse(name,depth) -end +} -function commands.preparedfile(name) - return resolve(name) or name -end +implement { + name = "doifelseinputfile", + overload = true, + arguments = { "string", "integer" }, + actions = function(name,depth) + local prepname = resolve(name) + if prepname then + return doifelseinputfile(prepname,0) + end + return doifelseinputfile(name,depth) + end +} -function commands.getctxfile() - local ctxfile = document.arguments.ctx or "" - if ctxfile ~= "" then - ctxrunner.load(ctxfile) -- do we need to locate it? +-- implement { +-- name = "preparedfile", -- not used +-- arguments = "string", +-- actions = { ctxrunner.preparedfile, context } +-- } + +implement { + name = "setdocumentctxfile", + onlyonce = true, + actions = function() + local ctxfile = document.arguments.ctx or "" + if ctxfile ~= "" then + ctxrunner.load(ctxfile) -- do we need to locate it? + end end -end +} function ctxrunner.resolve(name) -- used a few times later on local collapsedname = file.collapsepath(name,".") diff --git a/Master/texmf-dist/tex/context/base/core-ctx.mkiv b/Master/texmf-dist/tex/context/base/core-ctx.mkiv index 59115621aa7..e6372d0996a 100644 --- a/Master/texmf-dist/tex/context/base/core-ctx.mkiv +++ b/Master/texmf-dist/tex/context/base/core-ctx.mkiv @@ -17,11 +17,13 @@ \unprotect -\unexpanded\def\job_options_get_commandline {\ctxcommand{getcommandline()}} -\unexpanded\def\job_options_get_ctxfile {\ctxcommand{getctxfile()}} -\unexpanded\def\job_options_set_modes {\ctxcommand{setdocumentmodes()}} -\unexpanded\def\job_options_set_modules {\ctxcommand{setdocumentmodules()}} -\unexpanded\def\job_options_set_environments{\ctxcommand{setdocumentenvironments()}} -\unexpanded\def\job_options_set_filenames {\ctxcommand{setdocumentfilenames()}} +% called directly in core-def.mkiv +% +% \unexpanded\def\job_options_get_commandline {\clf_setdocumentcommandline} +% \unexpanded\def\job_options_get_ctxfile {\clf_setdocumentctxfile} +% \unexpanded\def\job_options_set_modes {\clf_setdocumentmodes} +% \unexpanded\def\job_options_set_modules {\clf_setdocumentmodules} +% \unexpanded\def\job_options_set_environments{\clf_setdocumentenvironments} +% \unexpanded\def\job_options_set_filenames {\clf_setdocumentfilenames} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/core-dat.lua b/Master/texmf-dist/tex/context/base/core-dat.lua index 242d362d0f6..ca6ec43730c 100644 --- a/Master/texmf-dist/tex/context/base/core-dat.lua +++ b/Master/texmf-dist/tex/context/base/core-dat.lua @@ -13,7 +13,8 @@ replaces the twopass data mechanism.

local tonumber, tostring, type = tonumber, tostring, type -local context, commands = context, commands +local context = context +local commands = commands local trace_datasets = false trackers.register("job.datasets" , function(v) trace_datasets = v end) local trace_pagestates = false trackers.register("job.pagestates", function(v) trace_pagestates = v end) @@ -33,6 +34,8 @@ local v_yes = interfaces.variables.yes local new_latelua = nodes.pool.latelua +local implement = interfaces.implement + local collected = allocate() local tobesaved = allocate() @@ -138,7 +141,7 @@ function datasets.getdata(name,tag,key,default) return default end -function commands.setdataset(settings) +local function setdataset(settings) settings.convert = true local name, tag = setdata(settings) if settings.delay ~= v_yes then @@ -150,7 +153,7 @@ function commands.setdataset(settings) end end -function commands.datasetvariable(name,tag,key) +local function datasetvariable(name,tag,key) local t = collected[name] if t == nil then if trace_datasets then @@ -175,6 +178,25 @@ function commands.datasetvariable(name,tag,key) end end +implement { + name = "setdataset", + actions = setdataset, + arguments = { + { + { "name" }, + { "tag" }, + { "delay" }, + { "data" }, + } + } +} + +implement { + name = "datasetvariable", + actions = datasetvariable, + arguments = { "string", "string", "string" } +} + --[[ldx--

We also provide an efficient variant for page states.

--ldx]]-- @@ -245,7 +267,7 @@ function pagestates.realpage(name,tag,default) return default end -function commands.setpagestate(settings) +local function setpagestate(settings) local name, tag, data = setstate(settings) if type(tag) == "number" then context(new_latelua(formatters["job.pagestates.extend(%q,%i)"](name,tag))) @@ -254,7 +276,7 @@ function commands.setpagestate(settings) end end -function commands.pagestaterealpage(name,tag) +local function pagestaterealpage(name,tag) local t = collected[name] t = t and (t[tag] or t[tonumber(tag)]) if t then @@ -262,8 +284,32 @@ function commands.pagestaterealpage(name,tag) end end -function commands.setpagestaterealpageno(name,tag) +local function setpagestaterealpageno(name,tag) local t = collected[name] t = t and (t[tag] or t[tonumber(tag)]) texsetcount("realpagestateno",t or texgetcount("realpageno")) end + +implement { + name = "setpagestate", + actions = setpagestate, + arguments = { + { + { "name" }, + { "tag" }, + { "delay" }, + } + } +} + +implement { + name = "pagestaterealpage", + actions = pagestaterealpage, + arguments = { "string", "string" } +} + +implement { + name = "setpagestaterealpageno", + actions = setpagestaterealpageno, + arguments = { "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/core-dat.mkiv b/Master/texmf-dist/tex/context/base/core-dat.mkiv index 5aef39d691a..26b1f14b5c0 100644 --- a/Master/texmf-dist/tex/context/base/core-dat.mkiv +++ b/Master/texmf-dist/tex/context/base/core-dat.mkiv @@ -51,26 +51,26 @@ \def\syst_datasets_set_named[#1][#2][#3]% {\begingroup \edef\currentdataset{#1}% - \ctxcommand{setdataset{ - name = "\currentdataset", - tag = \!!bs#2\!!es, - delay = "\datasetparameter\c!delay", - data = \!!bs#3\!!es - }}% + \clf_setdataset + name {\currentdataset}% + tag {#2}% + delay {\datasetparameter\c!delay}% + data {#3}% + \relax \endgroup} \def\syst_datasets_set_indexed[#1][#2][#3]% {\begingroup \edef\currentdataset{#1}% - \ctxcommand{setdataset{ - name = "\currentdataset", - delay = "\datasetparameter\c!delay", - data = \!!bs#2\!!es - }}% + \clf_setdataset + name {\currentdataset}% + delay {\datasetparameter\c!delay}% + data {#2}% + \relax \endgroup} \def\datasetvariable#1#2#3% - {\ctxcommand{datasetvariable("#1","#2","#3")}} + {\clf_datasetvariable{#1}{#2}{#3}} \installcorenamespace{pagestate} @@ -85,17 +85,17 @@ \def\syst_pagestates_set[#1][#2]% {\begingroup \edef\currentpagestate{#1}% - \ctxcommand{setpagestate{ - name = "\currentpagestate", - tag = \!!bs#2\!!es, - delay = "\pagestateparameter\c!delay", - }}% + \clf_setpagestate + name {\currentpagestate}% + tag {#2}% + delay {\pagestateparameter\c!delay}% + \relax \endgroup} \def\pagestaterealpage#1#2% - {\ctxcommand{pagestaterealpage("#1","#2")}} + {\clf_pagestaterealpage{#1}{#2}} \def\setpagestaterealpageno#1#2% - {\ctxcommand{setpagestaterealpageno("#1","#2")}} + {\clf_setpagestaterealpageno{#1}{#2}} \protect diff --git a/Master/texmf-dist/tex/context/base/core-def.mkiv b/Master/texmf-dist/tex/context/base/core-def.mkiv index 99bed6d34d6..acd411faccb 100644 --- a/Master/texmf-dist/tex/context/base/core-def.mkiv +++ b/Master/texmf-dist/tex/context/base/core-def.mkiv @@ -107,17 +107,17 @@ \initializenewlinechar \calculatecurrenttime \syst_files_load - \job_options_get_commandline % expands some commands - \job_options_get_ctxfile % might expand some commands - \job_options_set_filenames + \clf_setdocumentcommandline + \clf_setdocumentctxfile + \clf_setdocumentfilenames \font_preloads_at_every_job \settopskip % brrr \initializemainlanguage \initializepagebackgrounds \initializepagecounters - \job_options_set_modes - \job_options_set_modules - \job_options_set_environments + \clf_setdocumentmodes + \clf_setdocumentmodules + \clf_setdocumentenvironments \to \everyjob \appendtoks diff --git a/Master/texmf-dist/tex/context/base/core-env.lua b/Master/texmf-dist/tex/context/base/core-env.lua index 2cc84299bce..a3a87b7f78e 100644 --- a/Master/texmf-dist/tex/context/base/core-env.lua +++ b/Master/texmf-dist/tex/context/base/core-env.lua @@ -13,19 +13,15 @@ if not modules then modules = { } end modules ['core-env'] = { local P, C, S, Cc, lpegmatch, patterns = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc, lpeg.match, lpeg.patterns -local csname_id = token.csname_id -local create = token.create local texgetcount = tex.getcount local texsetcount = tex.setcount local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex +local setmetatablecall = table.setmetatablecall local context = context -local undefined = csname_id("*undefined*crap*") -local iftrue = create("iftrue")[2] -- inefficient hack - tex.modes = allocate { } tex.systemmodes = allocate { } tex.constants = allocate { } @@ -36,52 +32,204 @@ tex.isdefined = allocate { } local modes = { } local systemmodes = { } -setmetatableindex(tex.modes, function(t,k) - local m = modes[k] - if m then - return m() - else - local n = "mode>" .. k - if csname_id(n) == undefined then - return false +-- if newtoken then -- we keep the old code for historic reasons + + -- undefined: mode == 0 or cmdname = "undefined_cs" + + local create = newtoken.create + + local cache = table.setmetatableindex(function(t,k) + local v = create(k) + t[k] = v + return v + end) + + -- we can have a modes cache too + + local iftrue = cache["iftrue"].mode + local undefined = cache["*undefined*crap*"].mode -- is this ok? + + setmetatableindex(tex.modes, function(t,k) + local m = modes[k] + if m then + return m() else - modes[k] = function() return texgetcount(n) >= 1 end - return texgetcount(n) >= 1 + local n = "mode>" .. k + if cache[n].mode == 0 then + return false + else + modes[k] = function() return texgetcount(n) == 1 end + return texgetcount(n) == 1 -- 2 is prevented + end end - end -end) + end) -setmetatableindex(tex.systemmodes, function(t,k) - local m = systemmodes[k] - if m then - return m() - else - local n = "mode>*" .. k - if csname_id(n) == undefined then - return false + setmetatableindex(tex.systemmodes, function(t,k) + local m = systemmodes[k] + if m then + return m() else - systemmodes[k] = function() return texgetcount(n) >= 1 end - return texgetcount(n) >= 1 + local n = "mode>*" .. k + if cache[n].mode == 0 then + return false + else + systemmodes[k] = function() return texgetcount(n) == 1 end + return texgetcount(n) == 1 -- 2 is prevented + end end + end) + + setmetatableindex(tex.constants, function(t,k) + return cache[k].mode ~= 0 and texgetcount(k) or 0 + end) + + setmetatableindex(tex.conditionals, function(t,k) -- 0 == true + return cache[k].mode ~= 0 and texgetcount(k) == 0 + end) + + table.setmetatableindex(tex.ifs, function(t,k) + -- local mode = cache[k].mode + -- if mode == 0 then + -- return nil + -- else + -- return mode == iftrue + -- end + return cache[k].mode == iftrue + end) + + setmetatableindex(tex.isdefined, function(t,k) + return k and cache[k].mode ~= 0 + end) + + setmetatablecall(tex.isdefined, function(t,k) + return k and cache[k].mode ~= 0 + end) + + local dimencode = cache["scratchdimen" ].command + local countcode = cache["scratchcounter"].command + local tokencode = cache["scratchtoken" ].command + local skipcode = cache["scratchskip" ].command + + local types = { + [dimencode] = "dimen", + [countcode] = "count", + [tokencode] = "token", + [skipcode ] = "skip", + } + + function tex.isdimen(name) + return cache[name].command == dimencode + end + + function tex.iscount(name) + return cache[name].command == countcode end -end) -setmetatableindex(tex.constants, function(t,k) - return csname_id(k) ~= undefined and texgetcount(k) or 0 -end) + function tex.istoken(name) + return cache[name].command == tokencode + end -setmetatableindex(tex.conditionals, function(t,k) -- 0 == true - return csname_id(k) ~= undefined and texgetcount(k) == 0 -end) + function tex.isskip(name) + return cache[name].command == skipcode + end -setmetatableindex(tex.ifs, function(t,k) - -- k = "if" .. k -- better not - return csname_id(k) ~= undefined and create(k)[2] == iftrue -- inefficient, this create, we need a helper -end) + function tex.type(name) + return types[cache[name].command] or "macro" + end -setmetatableindex(tex.isdefined, function(t,k) - return csname_id(k) ~= undefined -end) +-- else +-- +-- local csname_id = token.csname_id +-- local create = token.create +-- +-- local undefined = csname_id("*undefined*crap*") +-- local iftrue = create("iftrue")[2] -- inefficient hack +-- +-- setmetatableindex(tex.modes, function(t,k) +-- local m = modes[k] +-- if m then +-- return m() +-- else +-- local n = "mode>" .. k +-- if csname_id(n) == undefined then +-- return false +-- else +-- modes[k] = function() return texgetcount(n) == 1 end +-- return texgetcount(n) == 1 -- 2 is prevented +-- end +-- end +-- end) +-- +-- setmetatableindex(tex.systemmodes, function(t,k) +-- local m = systemmodes[k] +-- if m then +-- return m() +-- else +-- local n = "mode>*" .. k +-- if csname_id(n) == undefined then +-- return false +-- else +-- systemmodes[k] = function() return texgetcount(n) == 1 end +-- return texgetcount(n) == 1 -- 2 is prevented +-- end +-- end +-- end) +-- +-- setmetatableindex(tex.constants, function(t,k) +-- return csname_id(k) ~= undefined and texgetcount(k) or 0 +-- end) +-- +-- setmetatableindex(tex.conditionals, function(t,k) -- 0 == true +-- return csname_id(k) ~= undefined and texgetcount(k) == 0 +-- end) +-- +-- setmetatableindex(tex.ifs, function(t,k) +-- -- k = "if" .. k -- better not +-- return csname_id(k) ~= undefined and create(k)[2] == iftrue -- inefficient, this create, we need a helper +-- end) +-- +-- setmetatableindex(tex.isdefined, function(t,k) +-- return k and csname_id(k) ~= undefined +-- end) +-- setmetatablecall(tex.isdefined, function(t,k) +-- return k and csname_id(k) ~= undefined +-- end) +-- +-- local lookuptoken = token.lookup +-- +-- local dimencode = lookuptoken("scratchdimen" )[1] +-- local countcode = lookuptoken("scratchcounter")[1] +-- local tokencode = lookuptoken("scratchtoken" )[1] +-- local skipcode = lookuptoken("scratchskip" )[1] +-- +-- local types = { +-- [dimencode] = "dimen", +-- [countcode] = "count", +-- [tokencode] = "token", +-- [skipcode ] = "skip", +-- } +-- +-- function tex.isdimen(name) +-- return lookuptoken(name)[1] == dimencode +-- end +-- +-- function tex.iscount(name) +-- return lookuptoken(name)[1] == countcode +-- end +-- +-- function tex.istoken(name) +-- return lookuptoken(name)[1] == tokencode +-- end +-- +-- function tex.isskip(name) +-- return lookuptoken(name)[1] == skipcode +-- end +-- +-- function tex.type(name) +-- return types[lookuptoken(name)[1]] or "macro" +-- end +-- +-- end function context.setconditional(name,value) if value then @@ -91,27 +239,6 @@ function context.setconditional(name,value) end end - --- todo : global - --- not possible as we let at the tex end to zerocount and plusone --- --- function tex.settrue(name,glob) --- if glob then --- texsetcount("global",name,0) --- else --- texsetcount(name,0) --- end --- end --- --- function tex.setfalse(name,glob) --- if glob then --- texsetcount("global",name,1) --- else --- texsetcount(name,1) --- end --- end - ---- arg = P("{") * C(patterns.nested) * P("}") + Cc("") local sep = S("), ") @@ -126,45 +253,9 @@ local pattern = ( + sep^1 )^1 -function commands.autosetups(str) - lpegmatch(pattern,str) -end - --- new (inefficient) - -local lookuptoken = token.lookup - -local dimencode = lookuptoken("scratchdimen" )[1] -local countcode = lookuptoken("scratchcounter")[1] -local tokencode = lookuptoken("scratchtoken" )[1] -local skipcode = lookuptoken("scratchskip" )[1] - -local types = { - [dimencode] = "dimen", - [countcode] = "count", - [tokencode] = "token", - [skipcode ] = "skip", +interfaces.implement { + name = "autosetups", + actions = function(str) lpegmatch(pattern,str) end, + arguments = "string" } -function tex.isdimen(name) - return lookuptoken(name)[1] == dimencode -end - -function tex.iscount(name) - return lookuptoken(name)[1] == countcode -end - -function tex.istoken(name) - return lookuptoken(name)[1] == tokencode -end - -function tex.isskip(name) - return lookuptoken(name)[1] == skipcode -end - -function tex.type(name) - return types[lookuptoken(name)[1]] or "macro" -end - --- inspect(tex.isdimen("xxxxxxxxxxxxxxx")) --- inspect(tex.isdimen("textwidth")) diff --git a/Master/texmf-dist/tex/context/base/core-env.mkiv b/Master/texmf-dist/tex/context/base/core-env.mkiv index 75b65418f50..bebc1bef08c 100644 --- a/Master/texmf-dist/tex/context/base/core-env.mkiv +++ b/Master/texmf-dist/tex/context/base/core-env.mkiv @@ -46,8 +46,6 @@ \installcorenamespace{modestack} -% todo: check prevent mode, also at the lua end - \setnewconstant\disabledmode \zerocount \setnewconstant\enabledmode \plusone \setnewconstant\preventedmode\plustwo @@ -59,7 +57,7 @@ \def\syst_modes_new#1% {\expandafter\newcount\csname\??mode#1\endcsname} -\unexpanded\def\newmode#1% +\unexpanded\def\newmode#1% so, no change of already set modes ! {\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi} \unexpanded\def\setmode#1% @@ -113,8 +111,6 @@ \unexpanded\def\globalenablemode {\let\syst_mode_prefix\global\unprotect\syst_modes_enable } \unexpanded\def\globaldisablemode{\let\syst_mode_prefix\global\unprotect\syst_modes_disable} -\let\definemode\disablemode % nicer - \def\syst_modes_prevent[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax} \def\syst_modes_enable [#1]{\protect\rawprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax} \def\syst_modes_disable[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax} @@ -135,10 +131,47 @@ \syst_mode_prefix\csname\??mode#1\endcsname\disabledmode \fi} +%D If you do a lot of mode testing, it makes sense to define modes (or disable them +%D explicitly if unset. This makes testing twice as fast. Often one enables modes +%D beforehand, in which case \type {\definemode} would reset the mode. The optional +%D second argument \type {keep} will prevent changing the already set mode but defines +%D it when undefined. + +\unexpanded\def\definemode + {\unprotect + \dodoubleempty\syst_modes_define} + +\def\syst_modes_define[#1][#2]% + {\protect + \edef\m_modes_asked{#2}% + \rawprocesscommacommand[#1]\syst_modes_define_indeed} + +\def\syst_modes_define_indeed#1% + {\ifcsname\??mode#1\endcsname + % already set + \else + \syst_modes_new{#1} + \fi + \ifx\m_modes_asked\v!keep + % not changes, disabled when undefined + \else + \csname\??mode#1\endcsname\ifx\m_modes_asked\v!yes\enabledmode\else\disabledmode\fi + \fi} + % handy for mp \def\booleanmodevalue#1% - {\ifcsname\??mode#1\endcsname\ifcase\csname\??mode#1\endcsname\s!false\else\s!true\fi\else\s!false\fi} + {\ifcsname\??mode#1\endcsname + \ifcase\csname\??mode#1\endcsname + \s!false + \or + \s!true + \else + \s!false + \fi + \else + \s!false + \fi} % check macros @@ -148,6 +181,27 @@ \newconditional\c_checked_mode +% one + +% \def\syst_modes_check_indeed#1% +% {\ifcsname\??mode#1\endcsname +% \ifcase\csname\??mode#1\endcsname\else +% \let\syst_modes_check_step\gobbleoneargument +% \fi +% \fi} +% +% \def\syst_modes_check#1#2#3% +% {\let\syst_modes_check_step\syst_modes_check_indeed +% \rawprocesscommacommand[#3]\syst_modes_check_step +% \ifx\syst_modes_check_step\gobbleoneargument +% \expandafter#1% +% \else +% \expandafter#2% +% \fi} + +% modes .. twice as fast on defined modes .. we could use definers and make it even faster +% if needed + \def\syst_modes_check_indeed#1% {\ifcsname\??mode#1\endcsname \ifcase\csname\??mode#1\endcsname\else @@ -155,7 +209,7 @@ \fi \fi} -\def\syst_modes_check#1#2#3% +\def\syst_modes_check_nop#1#2#3% {\let\syst_modes_check_step\syst_modes_check_indeed \rawprocesscommacommand[#3]\syst_modes_check_step \ifx\syst_modes_check_step\gobbleoneargument @@ -164,10 +218,32 @@ \expandafter#2% \fi} +\def\syst_modes_check_yes#1#2#3% + {\ifcase\csname\??mode#3\endcsname + \expandafter#2% + \or + \expandafter#1% + \else + \expandafter#2% + \fi} + +\def\syst_modes_check#1#2#3% + {\ifcsname\??mode#3\endcsname + \expandafter\syst_modes_check_yes + \else + \expandafter\syst_modes_check_nop + \fi#1#2{#3}} + +% all + \def\syst_modes_check_all_indeed#1% {\ifcsname\??mode#1\endcsname \ifcase\csname\??mode#1\endcsname \let\syst_modes_check_all_step\gobbleoneargument + \or + % enabled + \else + \let\syst_modes_check_all_step\gobbleoneargument \fi \else \let\syst_modes_check_all_step\gobbleoneargument @@ -182,17 +258,20 @@ \expandafter#1% \fi} -\unexpanded\def\doifmodeelse {\syst_modes_check\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifelsemode {\syst_modes_check\firstoftwoarguments\secondoftwoarguments} \unexpanded\def\doifmode {\syst_modes_check\firstofoneargument\gobbleoneargument} \unexpanded\def\doifnotmode {\syst_modes_check\gobbleoneargument\firstofoneargument} \unexpanded\def\startmode [#1]{\syst_modes_check\donothing\syst_modes_stop_yes{#1}} \unexpanded\def\startnotmode [#1]{\syst_modes_check\syst_modes_stop_nop\donothing{#1}} -\unexpanded\def\doifallmodeselse {\syst_modes_check_all\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifelseallmodes {\syst_modes_check_all\firstoftwoarguments\secondoftwoarguments} \unexpanded\def\doifallmodes {\syst_modes_check_all\firstofoneargument\gobbleoneargument} \unexpanded\def\doifnotallmodes {\syst_modes_check_all\gobbleoneargument\firstofoneargument} \unexpanded\def\startallmodes [#1]{\syst_modes_check_all\donothing\syst_modes_stop_all_yes{#1}} \unexpanded\def\startnotallmodes[#1]{\syst_modes_check_all\syst_modes_stop_all_nop\donothing{#1}} +\let\doifmodeelse \doifelsemode +\let\doifallmodeselse \doifelseallmodes + \unexpanded\def\stopmode {} % no relax \unexpanded\def\stopnotmode {} % no relax \unexpanded\def\stopallmodes {} % no relax @@ -272,8 +351,8 @@ \unexpanded\def\startmodeset {\pushmacro\c_syst_modes_set_done - \setfalse\conditionalfalse - \doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit} + \setfalse\c_syst_modes_set_done + \doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit} \def\syst_modes_set_start[#1]% {\edef\m_mode_case{#1}% @@ -293,10 +372,10 @@ \def\syst_modes_set_yes#1% {\settrue\c_syst_modes_set_done #1% - \doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit} + \doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit} \def\syst_modes_set_nop#1% - {\doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit} + {\doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit} \def\syst_modes_set_quit#1\stopmodeset {\popmacro\c_syst_modes_set_done} @@ -314,16 +393,16 @@ \unexpanded\def\startsetups{} % to please dep checker \unexpanded\def\stopsetups {} % to please dep checker -\expanded % will become obsolete - {\def\expandafter\noexpand\csname\e!start\v!setups\endcsname - {\begingroup\noexpand\doifnextoptionalcselse - {\noexpand\dostartsetupsA\expandafter\noexpand\csname\e!stop\v!setups\endcsname} - {\noexpand\dostartsetupsB\expandafter\noexpand\csname\e!stop\v!setups\endcsname}}} - -\letvalue{\e!stop\v!setups}\relax +% \expanded % will become obsolete +% {\def\expandafter\noexpand\csname\e!start\v!setups\endcsname +% {\begingroup\noexpand\doifnextoptionalcselse +% {\noexpand\dostartsetupsA\expandafter\noexpand\csname\e!stop\v!setups\endcsname} +% {\noexpand\dostartsetupsB\expandafter\noexpand\csname\e!stop\v!setups\endcsname}}} +% +% \letvalue{\e!stop\v!setups}\relax -\unexpanded\def\setups{\doifnextbgroupelse\syst_setups_a\syst_setups_b} % {..} or [..] -\unexpanded\def\setup {\doifnextbgroupelse\syst_setups \syst_setups_c} % {..} or [..] +\unexpanded\def\setups{\doifelsenextbgroup\syst_setups_a\syst_setups_b} % {..} or [..] +\unexpanded\def\setup {\doifelsenextbgroup\syst_setups \syst_setups_c} % {..} or [..] \def\syst_setups_a #1{\processcommacommand[#1]\syst_setups} % {..} \def\syst_setups_b[#1]{\processcommacommand[#1]\syst_setups} % [..] @@ -359,6 +438,28 @@ % % \def\syst_setups_normal#1% % {:\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi\endcsname\empty} % takes one argument +% +% only makes sense with many setups +% +% \def\syst_setups% the grid option will be extended to other main modes +% {\ifgridsnapping +% \expandafter\syst_setups_grid +% \else +% \expandafter\syst_setups_normal +% \fi} +% +% \def\syst_setups_normal#1% the grid option will be extended to other main modes +% {\csname\??setup +% :\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi +% \endcsname\empty} % takes one argument +% +% \def\syst_setups_grid#1% the grid option will be extended to other main modes +% {\csname\??setup +% \ifcsname\??setup\v!grid:#1\endcsname\v!grid:#1\else:\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi\fi +% \endcsname\empty} % takes one argument +% +% \let\directsetup\syst_setups +% \let\texsetup \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup % We can consider: % @@ -369,6 +470,12 @@ % but it won't work out well with multiple setups (intercepted at the % lua end) that then get only one argument. +% no checking and we assume it being defined: + +\def\fastsetup #1{\csname\??setup:#1\endcsname\empty} +\def\fastsetupwithargument #1#2{\csname\??setup:#2\endcsname{#1}} +\def\fastsetupwithargumentswapped #1{\csname\??setup:#1\endcsname} + % the next one is meant for \c!setups situations, hence the check for % a shortcut @@ -395,11 +502,11 @@ % setups={S1,lua(S2),xml(test{123}),S3} \def\syst_setups_process_local - {\ctxcommand{autosetups("\m_syst_setups_asked")}% + {\clf_autosetups{\m_syst_setups_asked}% \relax} % let's prevent lookahead \def\autosetups#1% - {\ctxcommand{autosetups("#1")}} + {\clf_autosetups{#1}} \edef\setupwithargument#1% saves a few expansions {\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#1\endcsname#1\noexpand\else\letterpercent\noexpand\fi\endcsname} @@ -410,13 +517,15 @@ \let\directsetup\syst_setups \let\texsetup \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup -\unexpanded\def\doifsetupselse#1% to be done: grid +\unexpanded\def\doifelsesetups#1% to be done: grid {\ifcsname\??setup:#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifsetupselse\doifelsesetups + \unexpanded\def\doifsetups#1% to be done: grid {\ifcsname\??setup:#1\endcsname \expandafter\firstofoneargument @@ -487,11 +596,11 @@ % Is doglobal still relevant? Maybe always global? Or never? Anyway, it will become obsolete. -\unexpanded\def\startluasetups {\begingroup\doifnextoptionalcselse\syst_setups_start_lua_a\syst_setups_start_lua_b} \let\stopluasetups \relax -\unexpanded\def\startxmlsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_xml_a\syst_setups_start_xml_b} \let\stopxmlsetups \relax -\unexpanded\def\startrawsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_raw_a\syst_setups_start_raw_b} \let\stoprawsetups \relax -\unexpanded\def\startlocalsetups{\begingroup\doifnextoptionalcselse\syst_setups_start_loc_a\syst_setups_start_loc_b} \let\stoplocalsetups \relax -\unexpanded\def\startsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_tex_a\syst_setups_start_tex_b} \let\stopsetups \relax +\unexpanded\def\startluasetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_lua_a\syst_setups_start_lua_b} \let\stopluasetups \relax +\unexpanded\def\startxmlsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_xml_a\syst_setups_start_xml_b} \let\stopxmlsetups \relax +\unexpanded\def\startrawsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_raw_a\syst_setups_start_raw_b} \let\stoprawsetups \relax +\unexpanded\def\startlocalsetups{\begingroup\doifelsenextoptionalcs\syst_setups_start_loc_a\syst_setups_start_loc_b} \let\stoplocalsetups \relax +\unexpanded\def\startsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_tex_a\syst_setups_start_tex_b} \let\stopsetups \relax \def\syst_setups_start_lua_indeed#1#2#3\stopluasetups {\endgroup\dodoglobal\expandafter\def\csname\??setup#1:#2\expandafter\endcsname\expandafter##\expandafter1\expandafter{#3}} \def\syst_setups_start_xml_indeed#1#2#3\stopxmlsetups {\endgroup\dodoglobal\expandafter\def\csname\??setup#1:#2\expandafter\endcsname\expandafter##\expandafter1\expandafter{#3}} @@ -539,14 +648,14 @@ \def\systemsetups#1{\syst_setups{\systemsetupsprefix#1}} -\def\resetsetups[#1]% see x-fo for usage +\unexpanded\def\resetsetups[#1]% see x-fo for usage {\ifcsname\??setup\ifgridsnapping\v!grid\fi:#1\endcsname \dodoglobal\letbeundefined{\??setup\ifgridsnapping\v!grid\fi:#1}% \else \dodoglobal\letbeundefined{\??setup:#1}% \fi} -\def\showsetupsdefinition[#1]% +\unexpanded\def\showsetupsdefinition[#1]% {\showvalue{\??setup:#1}} % temp hack for debugging %D \macros @@ -633,6 +742,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doifvariableelse\doifelsevariable + \unexpanded\def\doifvariable#1#2% {\ifcsname\??variables#1:#2\endcsname \expandafter\firstofoneargument @@ -647,18 +758,52 @@ \expandafter\firstofoneargument \fi} +%D A few more (we could use a public test variable so that we only need +%D to expand once, assuming expandable variables): + +\letvalue{\??variables:}\empty + +\unexpanded\def\doifelseemptyvariable#1#2% + {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}% + \ifx\m_syst_string_one\empty + \expandafter\firstoffourarguments + \else + \expandafter\secondoftwoarguments + \fi} + +\let\doifemptyvariableelse\doifelseemptyvariable + +\unexpanded\def\doifemptyvariable#1#2% + {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}% + \ifx\m_syst_string_one\empty + \expandafter\firstofoneargument + \else + \expandafter\gobbleoneargument + \fi} + +\unexpanded\def\doifnotemptyvariable#1#2% + {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}% + \ifx\m_syst_string_one\empty + \expandafter\gobbleoneargument + \else + \expandafter\firstofoneargument + \fi} + + \def\getvariabledefault#1#2% #3% can be command, so no ifcsname here {\executeifdefined{\??variables#1:#2}}% {#3} \unexpanded\def\setupenv {\dotripleargument\syst_variables_set[\getrawparameters][\s!environment]} -\unexpanded\def\doifenvelse{\doifelsevariable \s!environment} +\unexpanded\def\doifelseenv{\doifelsevariable \s!environment} \unexpanded\def\doifenv {\doifvariable \s!environment} \unexpanded\def\doifnotenv {\doifnotvariable \s!environment} \def\env {\getvariable \s!environment} \def\envvar {\getvariabledefault\s!environment} +\let\doifenvelse\doifelseenv + %D \macros %D {defineselector,setupselector,select,directselect} %D diff --git a/Master/texmf-dist/tex/context/base/core-ini.mkiv b/Master/texmf-dist/tex/context/base/core-ini.mkiv index 711c43f9465..c338f6f814e 100644 --- a/Master/texmf-dist/tex/context/base/core-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/core-ini.mkiv @@ -172,6 +172,9 @@ \newif \ifdoingblocks \newif \ifgridsnapping +\newconstant\pageduplexmode % 0 single 1 double 2 mix +\newconstant\pagebodymode % 0 not 1 normal pagebody 2 spread + %D \macros %D {ifproductionrun} %D diff --git a/Master/texmf-dist/tex/context/base/core-sys.lua b/Master/texmf-dist/tex/context/base/core-sys.lua index 22b0e457c7b..cf74d68f461 100644 --- a/Master/texmf-dist/tex/context/base/core-sys.lua +++ b/Master/texmf-dist/tex/context/base/core-sys.lua @@ -9,46 +9,13 @@ if not modules then modules = { } end modules ['core-sys'] = { local lower, format, gsub = string.lower, string.format, string.gsub local suffixonly, basename, removesuffix = file.suffix, file.basename, file.removesuffix -local environment = environment +local environment = environment +local context = context +local implement = interfaces.implement local report_files = logs.reporter("system","files") --- function commands.updatefilenames(jobname,fulljobname,inputfilename,outputfilename) --- -- --- environment.jobname = jobname --- -- --- local jobfilename = gsub(fulljobname or jobname or inputfilename or tex.jobname or "","%./","") --- -- --- environment.jobfilename = jobfilename --- environment.jobfilesuffix = lower(suffixonly(environment.jobfilename)) --- -- --- local inputfilename = gsub(inputfilename or "","%./","") --- environment.inputfilename = inputfilename --- environment.inputfilebarename = removesuffix(basename(inputfilename)) --- -- --- local inputfilerealsuffix = suffixonly(inputfilename) --- environment.inputfilerealsuffix = inputfilerealsuffix --- -- --- local inputfilesuffix = inputfilerealsuffix == "" and "tex" or lower(inputfilerealsuffix) --- environment.inputfilesuffix = inputfilesuffix --- -- --- local outputfilename = outputfilename or environment.inputfilebarename or "" --- environment.outputfilename = outputfilename --- -- --- local runpath = resolvers.cleanpath(lfs.currentdir()) --- environment.runpath = runpath --- -- --- statistics.register("running on path", function() --- return environment.runpath --- end) --- -- --- statistics.register("job file properties", function() --- return format("jobname %a, input %a, suffix %a",jobfilename,inputfilename,inputfilesuffix) --- end) --- -- --- end - -function environment.initializefilenames() -- commands.updatefilenames(jobname,fulljobname,input,result) +function environment.initializefilenames() local arguments = environment.arguments @@ -90,6 +57,17 @@ function environment.initializefilenames() -- commands.updatefilenames(jobname,f function environment.initializefilenames() end end +-- we could set a macro (but will that work when we're expanding? needs testing!) + +implement { name = "operatingsystem", actions = function() context(os.platform) end } +implement { name = "jobfilename", actions = function() context(environment.jobfilename) end } +implement { name = "jobfilesuffix", actions = function() context(environment.jobfilesuffix) end } +implement { name = "inputfilebarename", actions = function() context(environment.inputfilebarename) end } +implement { name = "inputfilerealsuffix", actions = function() context(environment.inputfilerealsuffix) end } +implement { name = "inputfilesuffix", actions = function() context(environment.inputfilesuffix) end } +implement { name = "inputfilename", actions = function() context(environment.inputfilename) end } +implement { name = "outputfilename", actions = function() context(environment.outputfilename) end } + statistics.register("result saved in file", function() -- suffix will be fetched from backend local outputfilename = environment.outputfilename or environment.jobname or tex.jobname or "" @@ -99,3 +77,11 @@ statistics.register("result saved in file", function() return format("%s.%s",outputfilename,"dvi") -- hard to imagine end end) + +implement { + name = "systemlog", + arguments = { "string", "string", "string" }, + actions = function(whereto,category,text) + logs.system(whereto,"context",tex.jobname,category,text) + end, +} diff --git a/Master/texmf-dist/tex/context/base/core-sys.mkiv b/Master/texmf-dist/tex/context/base/core-sys.mkiv index c07722f56ee..27bbec0b103 100644 --- a/Master/texmf-dist/tex/context/base/core-sys.mkiv +++ b/Master/texmf-dist/tex/context/base/core-sys.mkiv @@ -35,24 +35,24 @@ %D End of lines to the output. \TEX\ will map this onto the platform specific %D line ending. I hate this mess. -\edef\operatingsystem {\cldcontext{os.platform}} +\let\operatingsystem\clf_operatingsystem %D The jobname is what gets loaded by the cont-yes stub file. This name %D also determines the name of tuc etc files. -\def \jobfilename {\cldcontext{environment.jobfilename or ""}} -\def \jobfilesuffix {\cldcontext{environment.jobfilesuffix or ""}} +\let\jobfilename \clf_jobfilename +\let\jobfilesuffix\clf_jobfilesuffix %D However, that one can itself load another file. -\def \inputfilebarename {\cldcontext{environment.inputfilebarename or ""}} -\def \inputfilerealsuffix{\cldcontext{environment.inputfilerealsuffix or ""}} -\def \inputfilesuffix {\cldcontext{environment.inputfilesuffix or ""}} -\def \inputfilename {\cldcontext{environment.inputfilename or ""}} +\let\inputfilebarename \clf_inputfilebarename +\let\inputfilerealsuffix\clf_inputfilerealsuffix +\let\inputfilesuffix \clf_inputfilesuffix +\let\inputfilename \clf_inputfilename %D The output name is only used for some checking. -\def \outputfilename {\cldcontext{environment.outputfilename or ""}} +\let\outputfilename\clf_outputfilename \installcorenamespace{system} @@ -230,6 +230,8 @@ \dostoptagged \startstopparameter\c!inbetween}} +% \definestartstop[tracing][\c!style=\tt] + % \unexpanded\def\ignorestartstop[#1]% % {\unexpanded\expandafter\def\csname\e!start#1\expandafter\endcsname\expandafter % {\expandafter\gobbleuntil\csname\e!stop#1\endcsname}} @@ -240,8 +242,14 @@ \installcommandhandler \??highlight {highlight} \??highlight % we could do with less +\setuphighlight + [\c!command=\v!yes] + \appendtoks - \setuevalue\currenthighlight{\typo_highlights_indeed{\currenthighlight}}% + \edef\p_command{\highlightparameter\c!command}% + \ifx\p_command\v!yes + \setuevalue\currenthighlight{\typo_highlights_indeed{\currenthighlight}}% + \fi \to \everydefinehighlight \ifdefined\dotaghighlight \else \let\dotaghighlight\relax \fi @@ -254,13 +262,29 @@ \dotaghighlight} {\dostoptagged}} +\unexpanded\def\highlight[#1]% + {\typo_highlights_indeed{#1}} + +\unexpanded\def\starthighlight[#1]% + {\begingroup + \def\currenthighlight{#1}% + \dostarttagged\t!highlight\currenthighlight + \usehighlightstyleandcolor\c!style\c!color + \dotaghighlight} + +\unexpanded\def\stophighlight + {\dostoptagged + \endgroup} + +\let\directhighlight\typo_highlights_indeed + \unexpanded\def\defineexpandable - {\doifnextoptionalelse + {\doifelsenextoptional {\syst_basics_define_yes\def}% {\syst_basics_define_nop\def}} \unexpanded\def\define - {\doifnextoptionalelse + {\doifelsenextoptional {\syst_basics_define_yes{\unexpanded\def}}% {\syst_basics_define_nop{\unexpanded\def}}} @@ -399,5 +423,31 @@ % \processcommalist[#1]\docommand % \endgroup} +\unexpanded\def\syst_log_indeed#1#2#3% + {\ctxcommand{systemlog("#1","#2",\!!bs#3\!!es)}} + +\let\systemlog\syst_log_indeed + +\unexpanded\def\systemlogfirst + {\ifcase\directsystemparameter\c!n\relax + \expandafter\syst_log_indeed + \or + \expandafter\syst_log_indeed + \else + \expandafter\gobblethreearguments + \fi} + +\unexpanded\def\systemloglast + {\ifcase\directsystemparameter\c!n\relax + \expandafter\syst_log_indeed + \or + \expandafter\gobblethreearguments + \or + \expandafter\gobblethreearguments + \or + \expandafter\gobblethreearguments + \or + \expandafter\syst_log_indeed + \fi} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/core-two.lua b/Master/texmf-dist/tex/context/base/core-two.lua index 1f2bc7c6cf8..bb1afa7db2f 100644 --- a/Master/texmf-dist/tex/context/base/core-two.lua +++ b/Master/texmf-dist/tex/context/base/core-two.lua @@ -42,9 +42,13 @@ end jobpasses.define = allocate -function jobpasses.save(id,str) +function jobpasses.save(id,str,index) local jti = allocate(id) - jti[#jti+1] = str + if index then + jti[index] = str + else + jti[#jti+1] = str + end end function jobpasses.savetagged(id,tag,str) @@ -140,18 +144,36 @@ jobpasses.inlist = inlist -- interface -function commands.gettwopassdata (id) local r = get (id) if r then context(r) end end -function commands.getfirsttwopassdata(id) local r = first(id) if r then context(r) end end -function commands.getlasttwopassdata (id) local r = last (id) if r then context(r) end end -function commands.findtwopassdata (id,n) local r = find (id,n) if r then context(r) end end -function commands.gettwopassdatalist (id) local r = list (id) if r then context(r) end end -function commands.counttwopassdata (id) local r = count(id) if r then context(r) end end -function commands.checktwopassdata (id) local r = check(id) if r then context(r) end end +local implement = interfaces.implement -commands.definetwopasslist = jobpasses.define -commands.savetwopassdata = jobpasses.save -commands.savetaggedtwopassdata = jobpasses.savetagged +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 = "gettwopassdatalist", actions = { list , context }, arguments = "string" } +implement { name = "counttwopassdata", actions = { count, context }, arguments = "string" } +implement { name = "checktwopassdata", actions = { check, context }, arguments = "string" } -function commands.doifelseintwopassdata(id,str) - commands.doifelse(inlist(id,str)) -end +implement { + name = "definetwopasslist", + actions = jobpasses.define, + arguments = "string" +} + +implement { + name = "savetwopassdata", + actions = jobpasses.save, + arguments = { "string", "string" } +} + +implement { + name = "savetaggedtwopassdata", + actions = jobpasses.savetagged, + arguments = { "string", "string", "string" } +} + +implement { + name = "doifelseintwopassdata", + actions = { inlist, commands.doifelse }, + arguments = { "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/core-two.mkiv b/Master/texmf-dist/tex/context/base/core-two.mkiv index b08914ef407..5a791dea2f7 100644 --- a/Master/texmf-dist/tex/context/base/core-two.mkiv +++ b/Master/texmf-dist/tex/context/base/core-two.mkiv @@ -73,10 +73,10 @@ \registerctxluafile{core-two}{1.001} -\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxcommand {savetwopassdata('#1',"#3")}}} +\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\clf_savetwopassdata{#1}{#3}}} \def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}} \def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}} -\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxcommand {savetaggedtwopassdata('#1','#3',"#4")}}} +\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\clf_savetaggedtwopassdata{#1}{#3}{#4}}} \def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatecommand{savetaggedtwopassdata('#1','#3',"#4")}}} % temp hack: needs a proper \starteverytimeluacode @@ -87,7 +87,7 @@ \newif \iftwopassdatafound % obsolete, will go -\def\syst_twopass_check +\def\syst_twopass_check % can be delegated to lua once obsolete is gone {\ifx\twopassdata\empty \twopassdatafoundfalse % obsolete \setfalse\twopassdatafound @@ -104,18 +104,19 @@ {\twopassdatafoundtrue % obsolete \settrue\twopassdatafound} -\unexpanded\def\definetwopasslist #1{\ctxcommand{definetwopasslist('#1')}} -\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\ctxcommand{gettwopassdata ("#1")}}\syst_twopass_check} -\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\ctxcommand{checktwopassdata ("#1")}}\syst_twopass_check} -\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\ctxcommand{findtwopassdata("#1","#2")}}\syst_twopass_check} -\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\ctxcommand{getfirsttwopassdata ("#1")}}\syst_twopass_check} -\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\ctxcommand{getlasttwopassdata ("#1")}}% - \edef\noftwopassitems{\ctxcommand{counttwopassdata ("#1")}}\syst_twopass_check} -\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\ctxcommand{gettwopassdatalist ("#2")}}} -\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxcommand{gettwopassdatalist ("#1")}}} +\unexpanded\def\definetwopasslist #1{\clf_definetwopasslist{#1}} +\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\clf_gettwopassdata {#1}}\syst_twopass_check} +\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\clf_checktwopassdata {#1}}\syst_twopass_check} +\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\clf_findtwopassdata {#1}{#2}}\syst_twopass_check} +\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\clf_getfirsttwopassdata {#1}}\syst_twopass_check} +\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\clf_getlasttwopassdata {#1}}% + \edef\noftwopassitems{\clf_counttwopassdata {#1}}\syst_twopass_check} +\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\clf_gettwopassdatalist {#2}}} +\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\clf_gettwopassdatalist {#1}}} -\unexpanded\def\doifelseintwopassdata #1#2{\ctxcommand{doifelseintwopassdata("#1","#2")}} +\unexpanded\def\doifelseintwopassdata #1#2{\clf_doifelseintwopassdata{#1}{#2}} + \let\doifintwopassdataelse \doifelseintwopassdata \let\getfromtwopassdata \findtwopassdata \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/core-uti.lua b/Master/texmf-dist/tex/context/base/core-uti.lua index 1903ad8236b..346dec89e9e 100644 --- a/Master/texmf-dist/tex/context/base/core-uti.lua +++ b/Master/texmf-dist/tex/context/base/core-uti.lua @@ -29,6 +29,8 @@ local packers = utilities.packers local allocate = utilities.storage.allocate local mark = utilities.storage.mark +local implement = interfaces.implement + local texgetcount = tex.getcount local report_passes = logs.reporter("job","passes") @@ -36,7 +38,7 @@ local report_passes = logs.reporter("job","passes") job = job or { } local job = job -job.version = 1.25 +job.version = 1.29 job.packversion = 1.02 -- some day we will implement loading of other jobs and then we need @@ -62,21 +64,35 @@ end job.comment("version",job.version) -local enabled = true +local enabled = true +local initialized = false directives.register("job.save",function(v) enabled = v end) +----------.register("job.keep",function(v) kept = v end) function job.disablesave() -- can be command enabled = false end function job.initialize(loadname,savename) - job.load(loadname) -- has to come after structure is defined ! - luatex.registerstopactions(function() - if enabled and not status.lasterrorstring or status.lasterrorstring == "" then - job.save(savename) + if not initialized then + if not loadname or loadname == "" then + loadname = tex.jobname .. ".tuc" + end + if not savename or savename == "" then + savename = tex.jobname .. ".tua" end - end) + job.load(loadname) -- has to come after structure is defined ! + luatex.registerstopactions(function() + if enabled and not status.lasterrorstring or status.lasterrorstring == "" then + -- if kept then + -- job.keep(loadname) -- could move to mtx-context instead + -- end + job.save(savename) + end + end) + initialized = true + end end function job.register(collected, tobesaved, initializer, finalizer, serializer) @@ -283,6 +299,28 @@ function job.loadother(filename) statistics.stoptiming(_load_) end +-- function job.keep(filename) +-- local suffix = file.suffix(filename) +-- local base = file.removesuffix(filename) +-- if suffix == "" then +-- suffix = "tuc" +-- end +-- for i=1,10 do +-- local tmpname = format("%s-%s-%02d.tmp",base,suffix,i) +-- if lfs.isfile(tmpname) then +-- os.remove(tmpname) +-- report_passes("removing %a",tmpname) +-- end +-- end +-- if lfs.isfile(filename) then +-- local tmpname = format("%s-%s-%02d.tmp",base,suffix,environment.currentrun or 1) +-- report_passes("copying %a into %a",filename,tmpname) +-- file.copy(filename,tmpname) +-- else +-- report_passes("no file %a, nothing kept",filename) +-- end +-- end + -- eventually this will end up in strc-ini statistics.register("startup time", function() @@ -352,6 +390,24 @@ function statistics.formatruntime(runtime) end end +implement { + name = "savevariable", + actions = job.variables.save, + arguments = { "string", "string" } +} -commands.savevariable = job.variables.save -commands.setjobcomment = job.comment +implement { + name = "setjobcomment", + actions = job.comment, + arguments = { { "*" } } +} + +implement { + name = "initializejob", + actions = job.initialize +} + +implement { + name = "disablejobsave", + actions = job.disablesave +} diff --git a/Master/texmf-dist/tex/context/base/core-uti.mkiv b/Master/texmf-dist/tex/context/base/core-uti.mkiv index 5937240b9c6..cdd8958ff62 100644 --- a/Master/texmf-dist/tex/context/base/core-uti.mkiv +++ b/Master/texmf-dist/tex/context/base/core-uti.mkiv @@ -18,21 +18,19 @@ \registerctxluafile{core-uti}{1.001} \def\savecurrentvalue#1#2% immediate, so not \unexpanded - {\ctxcommand{savevariable("\strippedcsname#1","#2")}} + {\clf_savevariable{\strippedcsname#1}{#2}} \appendtoks - \ctxlua{job.comment{ - file = tex.jobname, - format = "\contextformat", - stamp = "\contextversion", - escape = "\!!bs\space...\space\!!es" - }}% + \clf_setjobcomment + file {tex.jobname}% + format {\contextformat}% + stamp {\contextversion}% + escape {\!!bs\space...\space\!!es}% + \relax \to \everystarttext \appendtoks - \ctxlua { - job.initialize(tex.jobname .. ".tuc",tex.jobname .. ".tua") - }% + \clf_initializejob \to \everyjob \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/data-crl.lua b/Master/texmf-dist/tex/context/base/data-crl.lua index 445bd5b0a70..fba5a62305b 100644 --- a/Master/texmf-dist/tex/context/base/data-crl.lua +++ b/Master/texmf-dist/tex/context/base/data-crl.lua @@ -28,7 +28,7 @@ local function runcurl(specification) if not io.exists(cachename) then cached[original] = cachename local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original - os.spawn(command) + os.execute(command) end if io.exists(cachename) then cached[original] = cachename diff --git a/Master/texmf-dist/tex/context/base/data-env.lua b/Master/texmf-dist/tex/context/base/data-env.lua index 58a081506b0..1d7728c22c9 100644 --- a/Master/texmf-dist/tex/context/base/data-env.lua +++ b/Master/texmf-dist/tex/context/base/data-env.lua @@ -18,11 +18,13 @@ local formats = allocate() local suffixes = allocate() local dangerous = allocate() local suffixmap = allocate() +local usertypes = allocate() resolvers.formats = formats resolvers.suffixes = suffixes resolvers.dangerous = dangerous resolvers.suffixmap = suffixmap +resolvers.usertypes = usertypes local luasuffixes = utilities.lua.suffixes @@ -92,11 +94,13 @@ local relations = allocate { -- todo: handlers also here names = { "mp" }, variable = 'MPINPUTS', suffixes = { 'mp', 'mpvi', 'mpiv', 'mpii' }, + usertype = true, }, tex = { names = { "tex" }, variable = 'TEXINPUTS', - suffixes = { 'tex', "mkvi", "mkiv", "mkii" }, + suffixes = { "tex", "mkvi", "mkiv", "mkii", "cld", "lfg", "xml" }, -- known suffixes have less lookups + usertype = true, }, icc = { names = { "icc", "icc profile", "icc profiles" }, @@ -112,6 +116,7 @@ local relations = allocate { -- todo: handlers also here names = { "lua" }, variable = 'LUAINPUTS', suffixes = { luasuffixes.lua, luasuffixes.luc, luasuffixes.tma, luasuffixes.tmc }, + usertype = true, }, lib = { names = { "lib" }, @@ -120,11 +125,15 @@ local relations = allocate { -- todo: handlers also here }, bib = { names = { 'bib' }, + variable = 'BIBINPUTS', suffixes = { 'bib' }, + usertype = true, }, bst = { names = { 'bst' }, + variable = 'BSTINPUTS', suffixes = { 'bst' }, + usertype = true, }, fontconfig = { names = { 'fontconfig', 'fontconfig file', 'fontconfig files' }, @@ -210,8 +219,9 @@ function resolvers.updaterelations() for name, relation in next, categories do local rn = relation.names local rv = relation.variable - local rs = relation.suffixes if rn and rv then + local rs = relation.suffixes + local ru = relation.usertype for i=1,#rn do local rni = lower(gsub(rn[i]," ","")) formats[rni] = rv @@ -223,8 +233,9 @@ function resolvers.updaterelations() end end end - end - if rs then + if ru then + usertypes[name] = true + end end end end diff --git a/Master/texmf-dist/tex/context/base/data-exp.lua b/Master/texmf-dist/tex/context/base/data-exp.lua index 9534e73a092..0a739617101 100644 --- a/Master/texmf-dist/tex/context/base/data-exp.lua +++ b/Master/texmf-dist/tex/context/base/data-exp.lua @@ -11,16 +11,20 @@ local concat, sort = table.concat, table.sort local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local Ct, Cs, Cc, Carg, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.P, lpeg.C, lpeg.S local type, next = type, next +local isdir = lfs.isdir local ostype = os.type -local collapsepath = file.collapsepath +local collapsepath, joinpath, basename = file.collapsepath, file.join, file.basename local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) local trace_expansions = false trackers.register("resolvers.expansions", function(v) trace_expansions = v end) +local trace_globbing = true trackers.register("resolvers.globbing", function(v) trace_globbing = v end) local report_expansions = logs.reporter("resolvers","expansions") +local report_globbing = logs.reporter("resolvers","globbing") -local resolvers = resolvers +local resolvers = resolvers +local resolveprefix = resolvers.resolve -- As this bit of code is somewhat special it gets its own module. After -- all, when working on the main resolver code, I don't want to scroll @@ -177,34 +181,28 @@ end -- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}} -- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c} -local cleanup = lpeg.replacer { - { "!" , "" }, - { "\\" , "/" }, -} +local usedhomedir = nil +local donegation = (P("!") /"" )^0 +local doslashes = (P("\\")/"/" + 1)^0 -function resolvers.cleanpath(str) -- tricky, maybe only simple paths - local doslashes = (P("\\")/"/" + 1)^0 - local donegation = (P("!") /"" )^0 - local homedir = lpegmatch(Cs(donegation * doslashes),environment.homedir or "") - if homedir == "~" or homedir == "" or not lfs.isdir(homedir) then - if trace_expansions then - report_expansions("no home dir set, ignoring dependent paths") - end - function resolvers.cleanpath(str) - if not str or find(str,"~",1,true) then - return "" -- special case - else - return lpegmatch(cleanup,str) +local function expandedhome() + if not usedhomedir then + usedhomedir = lpegmatch(Cs(donegation * doslashes),environment.homedir or "") + if usedhomedir == "~" or usedhomedir == "" or not isdir(usedhomedir) then + if trace_expansions then + report_expansions("no home dir set, ignoring dependent path using current path") end - end - else - local dohome = ((P("~")+P("$HOME"))/homedir)^0 - local cleanup = Cs(donegation * dohome * doslashes) - function resolvers.cleanpath(str) - return str and lpegmatch(cleanup,str) or "" + usedhomedir = "." end end - return resolvers.cleanpath(str) + return usedhomedir +end + +local dohome = ((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0 +local cleanup = Cs(donegation * dohome * doslashes) + +resolvers.cleanpath = function(str) + return str and lpegmatch(cleanup,str) or "" end -- print(resolvers.cleanpath("")) @@ -216,11 +214,18 @@ end -- This one strips quotes and funny tokens. -local expandhome = P("~") / "$HOME" -- environment.homedir or "home:" +-- we have several options here: +-- +-- expandhome = P("~") / "$HOME" : relocateble +-- expandhome = P("~") / "home:" : relocateble +-- expandhome = P("~") / environment.homedir : frozen but unexpanded +-- expandhome = P("~") = dohome : frozen and expanded -local dodouble = P('"')/"" * (expandhome + (1 - P('"')))^0 * P('"')/"" -local dosingle = P("'")/"" * (expandhome + (1 - P("'")))^0 * P("'")/"" -local dostring = (expandhome + 1 )^0 +local expandhome = P("~") / "$HOME" + +local dodouble = P('"') / "" * (expandhome + (1 - P('"')))^0 * P('"') / "" +local dosingle = P("'") / "" * (expandhome + (1 - P("'")))^0 * P("'") / "" +local dostring = (expandhome + 1 )^0 local stripper = Cs( lpegpatterns.unspacer * (dosingle + dodouble + dostring) * lpegpatterns.unspacer @@ -285,7 +290,7 @@ end function resolvers.joinpath(str) if type(str) == 'table' then - return file.joinpath(str) + return joinpath(str) else return str end @@ -293,25 +298,25 @@ end -- The next function scans directories and returns a hash where the -- entries are either strings or tables. - +-- -- starting with . or .. etc or funny char - ---~ local l_forbidden = S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t") ---~ local l_confusing = P(" ") ---~ local l_character = lpegpatterns.utf8 ---~ local l_dangerous = P(".") - ---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * P(-1) ---~ ----- l_normal = l_normal * Cc(true) + Cc(false) - ---~ local function test(str) ---~ print(str,lpegmatch(l_normal,str)) ---~ end ---~ test("ヒラギノ明朝 Pro W3") ---~ test("..ヒラギノ明朝 Pro W3") ---~ test(":ヒラギノ明朝 Pro W3;") ---~ test("ヒラギノ明朝 /Pro W3;") ---~ test("ヒラギノ明朝 Pro W3") +-- +-- local l_forbidden = S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t") +-- local l_confusing = P(" ") +-- local l_character = lpegpatterns.utf8 +-- local l_dangerous = P(".") +-- +-- local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * P(-1) +-- ----- l_normal = l_normal * Cc(true) + Cc(false) +-- +-- local function test(str) +-- print(str,lpegmatch(l_normal,str)) +-- end +-- test("ヒラギノ明朝 Pro W3") +-- test("..ヒラギノ明朝 Pro W3") +-- test(":ヒラギノ明朝 Pro W3;") +-- test("ヒラギノ明朝 /Pro W3;") +-- test("ヒラギノ明朝 Pro W3") -- a lot of this caching can be stripped away when we have ssd's everywhere -- @@ -319,41 +324,67 @@ end local attributes, directory = lfs.attributes, lfs.dir -local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t")) -local timer = { } -local scanned = { } -local nofscans = 0 -local scancache = { } +local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t")) +local lessweird = P(".")^1 + lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t")) +local timer = { } +local scanned = { } +local nofscans = 0 +local scancache = { } +local fullcache = { } +----- simplecache = { } +local nofsharedscans = 0 + +-- So, we assume either a lowercase name or a mixed case one but only one such case +-- as having Foo fOo foo FoO FOo etc on the system is braindead in any sane project. -local function scan(files,spec,path,n,m,r) - local full = (path == "" and spec) or (spec .. path .. '/') +local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) + local full = path == "" and spec or (spec .. path .. '/') local dirs = { } local nofdirs = 0 + local pattern = tolerant and lessweird or weird for name in directory(full) do - if not lpegmatch(weird,name) then - local mode = attributes(full..name,'mode') - if mode == 'file' then + if not lpegmatch(pattern,name) then + local mode = attributes(full..name,"mode") + if mode == "file" then n = n + 1 - local f = files[name] - if f then - if type(f) == 'string' then - files[name] = { f, path } + local lower = lower(name) + local paths = files[lower] + if paths then + if onlyone then + -- forget about it else - f[#f+1] = path + if type(paths) == "string" then + files[lower] = { paths, path } + else + paths[#paths+1] = path + end + if name ~= lower then + local rl = remap[lower] + if not rl then + remap[lower] = name + r = r + 1 + elseif trace_globbing and rl ~= name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end + end end else -- probably unique anyway - files[name] = path - local lower = lower(name) + files[lower] = path if name ~= lower then - files["remap:"..lower] = name - r = r + 1 + local rl = remap[lower] + if not rl then + remap[lower] = name + r = r + 1 + elseif trace_globbing and rl ~= name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end - elseif mode == 'directory' then + elseif mode == "directory" then m = m + 1 nofdirs = nofdirs + 1 if path ~= "" then - dirs[nofdirs] = path..'/'..name + dirs[nofdirs] = path .. "/" .. name else dirs[nofdirs] = name end @@ -363,113 +394,72 @@ local function scan(files,spec,path,n,m,r) if nofdirs > 0 then sort(dirs) for i=1,nofdirs do - files, n, m, r = scan(files,spec,dirs[i],n,m,r) + files, remap, n, m, r = scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)] = files - return files, n, m, r + return files, remap, n, m, r end -local fullcache = { } - -function resolvers.scanfiles(path,branch,usecache) - statistics.starttiming(timer) - local realpath = resolvers.resolve(path) -- no shortcut +function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant) + local realpath = resolveprefix(path) if usecache then - local files = fullcache[realpath] - if files then + local content = fullcache[realpath] + if content then if trace_locating then - report_expansions("using caches scan of path %a, branch %a",path,branch or path) + report_expansions("using cached scan of path %a, branch %a",path,branch or path) end - return files + nofsharedscans = nofsharedscans + 1 + return content end end + -- + statistics.starttiming(timer) if trace_locating then report_expansions("scanning path %a, branch %a",path,branch or path) end - local files, n, m, r = scan({ },realpath .. '/',"",0,0,0) - files.__path__ = path -- can be selfautoparent:texmf-whatever - files.__files__ = n - files.__directories__ = m - files.__remappings__ = r - if trace_locating then - report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r) + local content + if isdir(realpath) then + local files, remap, n, m, r = scan({ },{ },realpath .. '/',"",0,0,0,onlyonce,tolerant) + content = { + metadata = { + path = path, -- can be selfautoparent:texmf-whatever + files = n, + directories = m, + remappings = r, + }, + files = files, + remap = remap, + } + if trace_locating then + report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r) + end + else + content = { + metadata = { + path = path, -- can be selfautoparent:texmf-whatever + files = 0, + directories = 0, + remappings = 0, + }, + files = { }, + remap = { }, + } + if trace_locating then + report_expansions("invalid path %a",realpath) + end end if usecache then scanned[#scanned+1] = realpath - fullcache[realpath] = files + fullcache[realpath] = content end nofscans = nofscans + 1 statistics.stoptiming(timer) - return files + return content end -local function simplescan(files,spec,path) -- first match only, no map and such - local full = (path == "" and spec) or (spec .. path .. '/') - local dirs = { } - local nofdirs = 0 - for name in directory(full) do - if not lpegmatch(weird,name) then - local mode = attributes(full..name,'mode') - if mode == 'file' then - if not files[name] then - -- only first match - files[name] = path - end - elseif mode == 'directory' then - nofdirs = nofdirs + 1 - if path ~= "" then - dirs[nofdirs] = path..'/'..name - else - dirs[nofdirs] = name - end - end - end - end - if nofdirs > 0 then - sort(dirs) - for i=1,nofdirs do - files = simplescan(files,spec,dirs[i]) - end - end - return files -end - -local simplecache = { } -local nofsharedscans = 0 - function resolvers.simplescanfiles(path,branch,usecache) - statistics.starttiming(timer) - local realpath = resolvers.resolve(path) -- no shortcut - if usecache then - local files = simplecache[realpath] - if not files then - files = scancache[realpath] - if files then - nofsharedscans = nofsharedscans + 1 - end - end - if files then - if trace_locating then - report_expansions("using caches scan of path %a, branch %a",path,branch or path) - end - return files - end - end - if trace_locating then - report_expansions("scanning path %a, branch %a",path,branch or path) - end - local files = simplescan({ },realpath .. '/',"") - if trace_locating then - report_expansions("%s files found",table.count(files)) - end - if usecache then - scanned[#scanned+1] = realpath - simplecache[realpath] = files - end - nofscans = nofscans + 1 - statistics.stoptiming(timer) - return files + return resolvers.scanfiles(path,branch,usecache,true,true) -- onlyonce end function resolvers.scandata() @@ -482,4 +472,57 @@ function resolvers.scandata() } end ---~ print(table.serialize(resolvers.scanfiles("t:/sources"))) +function resolvers.get_from_content(content,path,name) -- or (content,name) + if not content then + return + end + local files = content.files + if not files then + return + end + local remap = content.remap + if not remap then + return + end + if name then + -- this one resolves a remapped name + local used = lower(name) + return path, remap[used] or used + else + -- this one does a lookup and resolves a remapped name + local name = path + local used = lower(name) + local path = files[used] + if path then + return path, remap[used] or used + end + end +end + +local nothing = function() end + +function resolvers.filtered_from_content(content,pattern) + if content and type(pattern) == "string" then + local pattern = lower(pattern) + local files = content.files + local remap = content.remap + if files and remap then + local n = next(files) + local function iterator() + while n do + local k = n + n = next(files,k) + if find(k,pattern) then + return files[k], remap and remap[k] or k + end + end + end + return iterator + end + end + return nothing +end + + +-- inspect(resolvers.simplescanfiles("e:/temporary/mb-mp")) +-- inspect(resolvers.scanfiles("e:/temporary/mb-mp")) diff --git a/Master/texmf-dist/tex/context/base/data-fil.lua b/Master/texmf-dist/tex/context/base/data-fil.lua index 09129e03ce8..b699fc9e38f 100644 --- a/Master/texmf-dist/tex/context/base/data-fil.lua +++ b/Master/texmf-dist/tex/context/base/data-fil.lua @@ -10,7 +10,8 @@ local trace_locating = false trackers.register("resolvers.locating", function(v local report_files = logs.reporter("resolvers","files") -local resolvers = resolvers +local resolvers = resolvers +local resolveprefix = resolvers.resolve local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers local locators, hashers, generators, concatinators = resolvers.locators, resolvers.hashers, resolvers.generators, resolvers.concatinators @@ -18,35 +19,34 @@ local locators, hashers, generators, concatinators = resolvers.locators, resolve local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check function locators.file(specification) - local name = specification.filename - local realname = resolvers.resolve(name) -- no shortcut + local filename = specification.filename + local realname = resolveprefix(filename) -- no shortcut if realname and realname ~= '' and lfs.isdir(realname) then if trace_locating then - report_files("file locator %a found as %a",name,realname) + report_files("file locator %a found as %a",filename,realname) end - resolvers.appendhash('file',name,true) -- cache + resolvers.appendhash('file',filename,true) -- cache elseif trace_locating then - report_files("file locator %a not found",name) + report_files("file locator %a not found",filename) end end function hashers.file(specification) - local name = specification.filename - local content = caches.loadcontent(name,'files') - resolvers.registerfilehash(name,content,content==nil) + local pathname = specification.filename + local content = caches.loadcontent(pathname,'files') + resolvers.registerfilehash(pathname,content,content==nil) end function generators.file(specification) - local path = specification.filename - local content = resolvers.scanfiles(path,false,true) -- scan once ---~ inspect(content) - resolvers.registerfilehash(path,content,true) + local pathname = specification.filename + local content = resolvers.scanfiles(pathname,false,true) -- scan once + resolvers.registerfilehash(pathname,content,true) end concatinators.file = file.join function finders.file(specification,filetype) - local filename = specification.filename + local filename = specification.filename local foundname = resolvers.findfile(filename,filetype) if foundname and foundname ~= "" then if trace_locating then diff --git a/Master/texmf-dist/tex/context/base/data-ini.lua b/Master/texmf-dist/tex/context/base/data-ini.lua index bbd233ae7f7..c74ff2e04b2 100644 --- a/Master/texmf-dist/tex/context/base/data-ini.lua +++ b/Master/texmf-dist/tex/context/base/data-ini.lua @@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['data-ini'] = { license = "see context related readme files", } +local next, type, getmetatable, rawset = next, type, getmetatable, rawset local gsub, find, gmatch, char = string.gsub, string.find, string.gmatch, string.char -local next, type = next, type - local filedirname, filebasename, filejoin = file.dirname, file.basename, file.join +local ostype, osname, osuname, ossetenv, osgetenv = os.type, os.name, os.uname, os.setenv, os.getenv + +local P, S, R, C, Cs, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.match local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) local trace_detail = false trackers.register("resolvers.details", function(v) trace_detail = v end) @@ -17,11 +19,9 @@ local trace_expansions = false trackers.register("resolvers.expansions", functi local report_initialization = logs.reporter("resolvers","initialization") -local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv - --- The code here used to be part of a data-res but for convenience --- we now split it over multiple files. As this file is now the --- starting point we introduce resolvers here. +-- The code here used to be part of a data-res but for convenience we now split it over multiple +-- files. As this file is now the starting point we introduce resolvers here. We also put some +-- helpers here that later can be reimplemented of extended. resolvers = resolvers or { } local resolvers = resolvers @@ -225,8 +225,136 @@ end -- a forward definition -if not resolvers.resolve then - function resolvers.resolve (s) return s end - function resolvers.unresolve(s) return s end - function resolvers.repath (s) return s end +-- Because we use resolvers.resolve a lot later on, we will implement the basics here and +-- add more later. + +local prefixes = utilities.storage.allocate() +resolvers.prefixes = prefixes + +local resolved = { } +local abstract = { } +local dynamic = { } + +function resolvers.resetresolve(str) + resolved, abstract = { }, { } +end + +function resolvers.allprefixes(separator) + local all = table.sortedkeys(prefixes) + if separator then + for i=1,#all do + all[i] = all[i] .. ":" + end + end + return all +end + +local function _resolve_(method,target) + local action = prefixes[method] + if action then + return action(target) + else + return method .. ":" .. target + end +end + +function resolvers.unresolve(str) + return abstract[str] or str +end + +function resolvers.setdynamic(str) + dynamic[str] = true +end + +-- home:xx;selfautoparent:xx; + +local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0) + +local prefix = C(R("az")^2) * P(":") +local target = C((1-S(" \"\';,"))^1) +local notarget = (#S(";,") + P(-1)) * Cc("") + +local p_resolve = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0) +local p_simple = prefix * P(-1) + +local function resolve(str) -- use schemes, this one is then for the commandline only + if type(str) == "table" then + local res = { } + for i=1,#str do + res[i] = resolve(str[i]) + end + return res + end + -- already resolved + local res = resolved[str] + if res then + return res + end + -- simple resolving of (dynamic) methods + local simple = lpegmatch(p_simple,str) + local action = prefixes[simple] + if action then + local res = action(res) + if not dynamic[simple] then + resolved[simple] = res + abstract[res] = simple + end + return res + end + -- more extensive resolving (multiple too) + res = lpegmatch(p_resolve,str) + resolved[str] = res + abstract[res] = str + return res +end + +resolvers.resolve = resolve + +if type(osuname) == "function" then + + for k, v in next, osuname() do + if not prefixes[k] then + prefixes[k] = function() return v end + end + end + +end + +if ostype == "unix" then + + -- We need to distringuish between a prefix and something else : so we + -- have a special repath variant for linux. Also, when a new prefix is + -- defined, we need to remake the matcher. + + local pattern + + local function makepattern(t,k,v) + if t then + rawset(t,k,v) + end + local colon = P(":") + for k, v in table.sortedpairs(prefixes) do + if p then + p = P(k) + p + else + p = P(k) + end + end + pattern = Cs((p * colon + colon/";" + P(1))^0) + end + + makepattern() + + table.setmetatablenewindex(prefixes,makepattern) + + function resolvers.repath(str) + return lpegmatch(pattern,str) + end + +else -- already the default: + + function resolvers.repath(str) + return str + end + end diff --git a/Master/texmf-dist/tex/context/base/data-lst.lua b/Master/texmf-dist/tex/context/base/data-lst.lua index 8996fa251ed..e4621a6e16d 100644 --- a/Master/texmf-dist/tex/context/base/data-lst.lua +++ b/Master/texmf-dist/tex/context/base/data-lst.lua @@ -8,12 +8,16 @@ if not modules then modules = { } end modules ['data-lst'] = { -- used in mtxrun, can be loaded later .. todo -local find, concat, upper, format = string.find, table.concat, string.upper, string.format +local rawget, type, next = rawget, type, next + +local find, concat, upper = string.find, table.concat, string.upper local fastcopy, sortedpairs = table.fastcopy, table.sortedpairs -resolvers.listers = resolvers.listers or { } +local resolvers = resolvers +local listers = resolvers.listers or { } +resolvers.listers = listers -local resolvers = resolvers +local resolveprefix = resolvers.resolve local report_lists = logs.reporter("resolvers","lists") @@ -25,7 +29,7 @@ local function tabstr(str) end end -function resolvers.listers.variables(pattern) +function listers.variables(pattern) local instance = resolvers.instance local environment = instance.environment local variables = instance.variables @@ -46,10 +50,10 @@ function resolvers.listers.variables(pattern) for key, value in sortedpairs(configured) do if key ~= "" and (pattern == "" or find(upper(key),pattern)) then report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset") + report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") + report_lists(" var: %s",tabstr(configured[key]) or "unset") + report_lists(" exp: %s",tabstr(expansions[key]) or "unset") + report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") end end instance.environment = fastcopy(env) @@ -59,15 +63,15 @@ end local report_resolved = logs.reporter("system","resolved") -function resolvers.listers.configurations() +function listers.configurations() local configurations = resolvers.instance.specification for i=1,#configurations do - report_resolved("file : %s",resolvers.resolve(configurations[i])) + report_resolved("file : %s",resolveprefix(configurations[i])) end report_resolved("") local list = resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec)) for i=1,#list do - local li = resolvers.resolve(list[i]) + local li = resolveprefix(list[i]) if lfs.isdir(li) then report_resolved("path - %s",li) else diff --git a/Master/texmf-dist/tex/context/base/data-lua.lua b/Master/texmf-dist/tex/context/base/data-lua.lua index 0e7c81181bb..7c12a5940f5 100644 --- a/Master/texmf-dist/tex/context/base/data-lua.lua +++ b/Master/texmf-dist/tex/context/base/data-lua.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['data-lua'] = { -- This is now a plug in into l-lua (as we also use the extra paths elsewhere). -local resolvers, package = resolvers, package +local package, lpeg = package, lpeg local gsub = string.gsub local concat = table.concat @@ -16,18 +16,21 @@ local addsuffix = file.addsuffix local P, S, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.Cs, lpeg.match -local luasuffixes = { 'tex', 'lua' } -local libsuffixes = { 'lib' } -local luaformats = { 'TEXINPUTS', 'LUAINPUTS' } -local libformats = { 'CLUAINPUTS' } -local helpers = package.helpers or { } -local methods = helpers.methods or { } +local luasuffixes = { 'tex', 'lua' } +local libsuffixes = { 'lib' } +local luaformats = { 'TEXINPUTS', 'LUAINPUTS' } +local libformats = { 'CLUAINPUTS' } +local helpers = package.helpers or { } +local methods = helpers.methods or { } + +local resolvers = resolvers +local resolveprefix = resolvers.resolve + +helpers.report = logs.reporter("resolvers","libraries") trackers.register("resolvers.libraries", function(v) helpers.trace = v end) trackers.register("resolvers.locating", function(v) helpers.trace = v end) -helpers.report = logs.reporter("resolvers","libraries") - helpers.sequence = { "already loaded", "preload table", @@ -44,7 +47,7 @@ helpers.sequence = { local pattern = Cs(P("!")^0 / "" * (P("/") * P(-1) / "/" + P("/")^1 / "/" + 1)^0) function helpers.cleanpath(path) -- hm, don't we have a helper for this? - return resolvers.resolve(lpegmatch(pattern,path)) + return resolveprefix(lpegmatch(pattern,path)) end local loadedaslib = helpers.loadedaslib diff --git a/Master/texmf-dist/tex/context/base/data-met.lua b/Master/texmf-dist/tex/context/base/data-met.lua index 67b9eb22b27..4e8a48f50e1 100644 --- a/Master/texmf-dist/tex/context/base/data-met.lua +++ b/Master/texmf-dist/tex/context/base/data-met.lua @@ -36,8 +36,6 @@ local function splitmethod(filename) -- todo: filetype in specification end filename = file.collapsepath(filename,".") -- hm, we should keep ./ in some cases - -- filename = gsub(filename,"^%./",getcurrentdir().."/") -- we will merge dir.expandname and collapse some day - if not find(filename,"://",1,true) then return { scheme = "file", path = filename, original = filename, filename = filename } end diff --git a/Master/texmf-dist/tex/context/base/data-pre.lua b/Master/texmf-dist/tex/context/base/data-pre.lua index f2f5bddc44c..1c5016f8644 100644 --- a/Master/texmf-dist/tex/context/base/data-pre.lua +++ b/Master/texmf-dist/tex/context/base/data-pre.lua @@ -6,63 +6,61 @@ if not modules then modules = { } end modules ['data-pre'] = { license = "see context related readme files" } --- It could be interesting to hook the resolver in the file --- opener so that unresolved prefixes travel around and we --- get more abstraction. +local resolvers = resolvers +local prefixes = resolvers.prefixes --- As we use this beforehand we will move this up in the chain --- of loading. +local cleanpath = resolvers.cleanpath +local findgivenfile = resolvers.findgivenfile +local expansion = resolvers.expansion +local getenv = resolvers.getenv -- we can probably also use resolvers.expansion ---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex")) +local basename = file.basename +local dirname = file.dirname +local joinpath = file.join -local resolvers = resolvers -local prefixes = utilities.storage.allocate() -resolvers.prefixes = prefixes - -local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion -local getenv = resolvers.getenv -- we can probably also use resolvers.expansion -local P, S, R, C, Cs, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.match -local joinpath, basename, dirname = file.join, file.basename, file.dirname -local getmetatable, rawset, type = getmetatable, rawset, type - --- getenv = function(...) return resolvers.getenv(...) end -- needs checking (definitions changes later on) +local isfile = lfs.isfile prefixes.environment = function(str) return cleanpath(expansion(str)) end -prefixes.relative = function(str,n) -- lfs.isfile - if io.exists(str) then - -- nothing - elseif io.exists("./" .. str) then - str = "./" .. str - else - local p = "../" - for i=1,n or 2 do - if io.exists(p .. str) then - str = p .. str - break - else - p = p .. "../" +local function relative(str,n) + if not isfile(str) then + local pstr = "./" .. str + if isfile(pstr) then + str = pstr + else + local p = "../" + for i=1,n or 2 do + local pstr = p .. str + if isfile(pstr) then + str = pstr + break + else + p = p .. "../" + end end end end return cleanpath(str) end +local function locate(str) + local fullname = findgivenfile(str) or "" + return cleanpath(fullname ~= "" and fullname or str) +end + +prefixes.relative = relative +prefixes.locate = locate + prefixes.auto = function(str) - local fullname = prefixes.relative(str) - if not lfs.isfile(fullname) then - fullname = prefixes.locate(str) + local fullname = relative(str) + if not isfile(fullname) then + fullname = locate(str) end return fullname end -prefixes.locate = function(str) - local fullname = findgivenfile(str) or "" - return cleanpath((fullname ~= "" and fullname) or str) -end - prefixes.filename = function(str) local fullname = findgivenfile(str) or "" return cleanpath(basename((fullname ~= "" and fullname) or str)) -- no cleanpath needed here @@ -89,25 +87,6 @@ prefixes.home = function(str) return cleanpath(joinpath(getenv('HOME'),str)) end -local function toppath() - local inputstack = resolvers.inputstack -- dependency, actually the code should move but it's - if not inputstack then -- more convenient to keep it here - return "." - end - local pathname = dirname(inputstack[#inputstack] or "") - if pathname == "" then - return "." - else - return pathname - end -end - -resolvers.toppath = toppath - -prefixes.toppath = function(str) - return cleanpath(joinpath(toppath(),str)) -end - prefixes.env = prefixes.environment prefixes.rel = prefixes.relative prefixes.loc = prefixes.locate @@ -116,131 +95,48 @@ prefixes.full = prefixes.locate prefixes.file = prefixes.filename prefixes.path = prefixes.pathname -function resolvers.allprefixes(separator) - local all = table.sortedkeys(prefixes) - if separator then - for i=1,#all do - all[i] = all[i] .. ":" - end - end - return all -end +-- This one assumes that inputstack is set (used in the tex loader). It is a momentary resolve +-- as the top of the input stack changes. -local function _resolve_(method,target) - local action = prefixes[method] - if action then - return action(target) - else - return method .. ":" .. target +local function toppath() + local inputstack = resolvers.inputstack -- dependency, actually the code should move but it's + if not inputstack then -- more convenient to keep it here + return "." end -end - -local resolved, abstract = { }, { } - -function resolvers.resetresolve(str) - resolved, abstract = { }, { } -end - --- todo: use an lpeg (see data-lua for !! / stripper) - --- local function resolve(str) -- use schemes, this one is then for the commandline only --- if type(str) == "table" then --- local t = { } --- for i=1,#str do --- t[i] = resolve(str[i]) --- end --- return t --- else --- local res = resolved[str] --- if not res then --- res = gsub(str,"([a-z][a-z]+):([^ \"\';,]*)",_resolve_) -- home:xx;selfautoparent:xx; etc (comma added) --- resolved[str] = res --- abstract[res] = str --- end --- return res --- end --- end - --- home:xx;selfautoparent:xx; - -local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0) - -local prefix = C(R("az")^2) * P(":") -local target = C((1-S(" \"\';,"))^1) -local notarget = (#S(";,") + P(-1)) * Cc("") - -local pattern = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0) - -local function resolve(str) -- use schemes, this one is then for the commandline only - if type(str) == "table" then - local t = { } - for i=1,#str do - t[i] = resolve(str[i]) - end - return t + local pathname = dirname(inputstack[#inputstack] or "") + if pathname == "" then + return "." else - local res = resolved[str] - if not res then - res = lpegmatch(pattern,str) - resolved[str] = res - abstract[res] = str - end - return res + return pathname end end -local function unresolve(str) - return abstract[str] or str -end - -resolvers.resolve = resolve -resolvers.unresolve = unresolve +-- The next variant is similar but bound to explicitly registered paths. Practice should +-- show if that gives the same results as the previous one. It is meant for a project +-- stucture. -if type(os.uname) == "function" then - - for k, v in next, os.uname() do - if not prefixes[k] then - prefixes[k] = function() return v end - end +local function jobpath() + local path = resolvers.stackpath() + if not path or path == "" then + return "." + else + return path end - end -if os.type == "unix" then - - -- We need to distringuish between a prefix and something else : so we - -- have a special repath variant for linux. Also, when a new prefix is - -- defined, we need to remake the matcher. - - local pattern - - local function makepattern(t,k,v) - if t then - rawset(t,k,v) - end - local colon = P(":") - for k, v in table.sortedpairs(prefixes) do - if p then - p = P(k) + p - else - p = P(k) - end - end - pattern = Cs((p * colon + colon/";" + P(1))^0) - end +resolvers.toppath = toppath +resolvers.jobpath = jobpath - makepattern() +-- This hook sit into the resolver: - getmetatable(prefixes).__newindex = makepattern +prefixes.toppath = function(str) return cleanpath(joinpath(toppath(),str)) end -- str can be nil or empty +prefixes.jobpath = function(str) return cleanpath(joinpath(jobpath(),str)) end -- str can be nil or empty - function resolvers.repath(str) - return lpegmatch(pattern,str) - end +resolvers.setdynamic("toppath") +resolvers.setdynamic("jobpath") -else -- already the default: +-- for a while (obsolete): - function resolvers.repath(str) - return str - end +prefixes.jobfile = prefixes.jobpath -end +resolvers.setdynamic("jobfile") diff --git a/Master/texmf-dist/tex/context/base/data-res.lua b/Master/texmf-dist/tex/context/base/data-res.lua index d79d78a728b..cbda21ce212 100644 --- a/Master/texmf-dist/tex/context/base/data-res.lua +++ b/Master/texmf-dist/tex/context/base/data-res.lua @@ -18,7 +18,7 @@ if not modules then modules = { } end modules ['data-res'] = { -- todo: cache:/// home:/// selfautoparent:/// (sometime end 2012) local gsub, find, lower, upper, match, gmatch = string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch -local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys +local concat, insert, remove, sortedkeys, sortedhash = table.concat, table.insert, table.remove, table.sortedkeys, table.sortedhash local next, type, rawget = next, type, rawget local os = os @@ -29,35 +29,48 @@ local formatters = string.formatters local filedirname = file.dirname local filebasename = file.basename local suffixonly = file.suffixonly +local addsuffix = file.addsuffix +local removesuffix = file.removesuffix local filejoin = file.join local collapsepath = file.collapsepath local joinpath = file.joinpath +local is_qualified_path = file.is_qualified_path + local allocate = utilities.storage.allocate local settings_to_array = utilities.parsers.settings_to_array + +local getcurrentdir = lfs.currentdir +local isfile = lfs.isfile +local isdir = lfs.isdir + local setmetatableindex = table.setmetatableindex local luasuffixes = utilities.lua.suffixes -local getcurrentdir = lfs.currentdir local trace_locating = false trackers .register("resolvers.locating", function(v) trace_locating = v end) local trace_detail = false trackers .register("resolvers.details", function(v) trace_detail = v end) local trace_expansions = false trackers .register("resolvers.expansions", function(v) trace_expansions = v end) +local trace_paths = false trackers .register("resolvers.paths", function(v) trace_paths = v end) local resolve_otherwise = true directives.register("resolvers.otherwise", function(v) resolve_otherwise = v end) local report_resolving = logs.reporter("resolvers","resolving") -local resolvers = resolvers +local resolvers = resolvers local expandedpathfromlist = resolvers.expandedpathfromlist local checkedvariable = resolvers.checkedvariable local splitconfigurationpath = resolvers.splitconfigurationpath local methodhandler = resolvers.methodhandler +local filtered = resolvers.filtered_from_content +local lookup = resolvers.get_from_content +local cleanpath = resolvers.cleanpath +local resolveprefix = resolvers.resolve -local initializesetter = utilities.setters.initialize +local initializesetter = utilities.setters.initialize local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv -resolvers.cacheversion = '1.0.1' -resolvers.configbanner = '' +resolvers.cacheversion = "1.100" +resolvers.configbanner = "" resolvers.homedir = environment.homedir resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" } resolvers.luacnfname = "texmfcnf.lua" @@ -134,6 +147,7 @@ local unset_variable = "unset" local formats = resolvers.formats local suffixes = resolvers.suffixes +local usertypes = resolvers.usertypes local dangerous = resolvers.dangerous local suffixmap = resolvers.suffixmap @@ -155,7 +169,7 @@ function resolvers.setenv(key,value,raw) -- we feed back into the environment, and as this is used -- by other applications (via os.execute) we need to make -- sure that prefixes are resolve - ossetenv(key,raw and value or resolvers.resolve(value)) + ossetenv(key,raw and value or resolveprefix(value)) end end @@ -178,7 +192,7 @@ resolvers.env = getenv -- We are going to use some metatable trickery where we backtrack from -- expansion to variable to environment. -local function resolve(k) +local function resolvevariable(k) return instance.expansions[k] end @@ -191,12 +205,12 @@ local somekey = C(R("az","AZ","09","__","--")^1) local somethingelse = P(";") * ((1-S("!{}/\\"))^1 * P(";") / "") + P(";") * (P(";") / "") + P(1) -local variableexpander = Cs( (somevariable * (somekey/resolve) + somethingelse)^1 ) +local variableexpander = Cs( (somevariable * (somekey/resolvevariable) + somethingelse)^1 ) local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";" local variablecleaner = Cs((cleaner + P(1))^0) -local somevariable = R("az","AZ","09","__","--")^1 / resolve +local somevariable = R("az","AZ","09","__","--")^1 / resolvevariable local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/"")) local variableresolver = Cs((variable + P(1))^0) @@ -206,9 +220,12 @@ end function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only - if trace_locating then + -- normally we only need one instance but for special cases we can (re)load one so + -- we stick to this model. + + if trace_locating then report_resolving("creating instance") - end + end local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate() @@ -223,6 +240,7 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp foundintrees = allocate(), hashes = allocate(), hashed = allocate(), + pathlists = false,-- delayed specification = allocate(), lists = allocate(), data = allocate(), -- only for loading @@ -235,6 +253,7 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp savelists = true, pattern = nil, -- lists force_suffixes = true, + pathstack = { }, } setmetatableindex(variables,function(t,k) @@ -291,8 +310,14 @@ function resolvers.reset() end local function reset_hashes() - instance.lists = { } - instance.found = { } + instance.lists = { } + instance.pathlists = false + instance.found = { } +end + +local function reset_caches() + instance.lists = { } + instance.pathlists = false end local slash = P("/") @@ -356,14 +381,14 @@ local function identify_configuration_files() for i=1,#cnfpaths do local filepath = cnfpaths[i] local filename = collapsepath(filejoin(filepath,luacnfname)) - local realname = resolvers.resolve(filename) -- can still have "//" ... needs checking + local realname = resolveprefix(filename) -- can still have "//" ... needs checking -- todo: environment.skipweirdcnfpaths directive if trace_locating then - local fullpath = gsub(resolvers.resolve(collapsepath(filepath)),"//","/") + local fullpath = gsub(resolveprefix(collapsepath(filepath)),"//","/") local weirdpath = find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true) report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath) end - if lfs.isfile(realname) then + if isfile(realname) then specification[#specification+1] = filename -- unresolved as we use it in matching, relocatable if trace_locating then report_resolving("found configuration file %a",realname) @@ -386,7 +411,7 @@ local function load_configuration_files() local filename = specification[i] local pathname = filedirname(filename) local filename = filejoin(pathname,luacnfname) - local realname = resolvers.resolve(filename) -- no shortcut + local realname = resolveprefix(filename) -- no shortcut local blob = loadfile(realname) if blob then local setups = instance.setups @@ -394,7 +419,7 @@ local function load_configuration_files() local parent = data and data.parent if parent then local filename = filejoin(pathname,parent) - local realname = resolvers.resolve(filename) -- no shortcut + local realname = resolveprefix(filename) -- no shortcut local blob = loadfile(realname) if blob then local parentdata = blob() @@ -419,7 +444,7 @@ local function load_configuration_files() elseif variables[k] == nil then if trace_locating and not warning then report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable", - k,resolvers.resolve(filename)) + k,resolveprefix(filename)) warning = true end variables[k] = v @@ -492,7 +517,7 @@ local function locate_file_databases() local stripped = lpegmatch(inhibitstripper,path) -- the !! thing if stripped ~= "" then local runtime = stripped == path - path = resolvers.cleanpath(path) + path = cleanpath(path) local spec = resolvers.splitmethod(stripped) if runtime and (spec.noscheme or spec.scheme == "file") then stripped = "tree:///" .. stripped @@ -558,8 +583,8 @@ function resolvers.renew(hashname) report_resolving("identifying tree %a",hashname) end end - local realpath = resolvers.resolve(hashname) - if lfs.isdir(realpath) then + local realpath = resolveprefix(hashname) + if isdir(realpath) then if trace_locating then report_resolving("using path %a",realpath) end @@ -681,25 +706,62 @@ function resolvers.unexpandedpath(str) return joinpath(resolvers.unexpandedpathlist(str)) end +function resolvers.pushpath(name) + local pathstack = instance.pathstack + local lastpath = pathstack[#pathstack] + local pluspath = filedirname(name) + if lastpath then + lastpath = collapsepath(filejoin(lastpath,pluspath)) + else + lastpath = collapsepath(pluspath) + end + insert(pathstack,lastpath) + if trace_paths then + report_resolving("pushing path %a",lastpath) + end +end + +function resolvers.poppath() + local pathstack = instance.pathstack + if trace_paths and #pathstack > 0 then + report_resolving("popping path %a",pathstack[#pathstack]) + end + remove(pathstack) +end + +function resolvers.stackpath() + local pathstack = instance.pathstack + local currentpath = pathstack[#pathstack] + return currentpath ~= "" and currentpath or nil +end + local done = { } function resolvers.resetextrapath() local ep = instance.extra_paths if not ep then - ep, done = { }, { } - instance.extra_paths = ep + done = { } + instance.extra_paths = { } elseif #ep > 0 then - instance.lists, done = { }, { } + done = { } + reset_caches() end end function resolvers.registerextrapath(paths,subpaths) - paths = settings_to_array(paths) - subpaths = settings_to_array(subpaths) - local ep = instance.extra_paths or { } - local oldn = #ep - local newn = oldn - local nofpaths = #paths + if not subpaths or subpaths == "" then + if not paths or path == "" then + return -- invalid spec + elseif done[paths] then + return -- already done + end + end + local paths = settings_to_array(paths) + local subpaths = settings_to_array(subpaths) + local ep = instance.extra_paths or { } + local oldn = #ep + local newn = oldn + local nofpaths = #paths local nofsubpaths = #subpaths if nofpaths > 0 then if nofsubpaths > 0 then @@ -710,7 +772,7 @@ function resolvers.registerextrapath(paths,subpaths) local ps = p .. "/" .. s if not done[ps] then newn = newn + 1 - ep[newn] = resolvers.cleanpath(ps) + ep[newn] = cleanpath(ps) done[ps] = true end end @@ -720,7 +782,7 @@ function resolvers.registerextrapath(paths,subpaths) local p = paths[i] if not done[p] then newn = newn + 1 - ep[newn] = resolvers.cleanpath(p) + ep[newn] = cleanpath(p) done[p] = true end end @@ -732,7 +794,7 @@ function resolvers.registerextrapath(paths,subpaths) local ps = ep[i] .. "/" .. s if not done[ps] then newn = newn + 1 - ep[newn] = resolvers.cleanpath(ps) + ep[newn] = cleanpath(ps) done[ps] = true end end @@ -741,57 +803,80 @@ function resolvers.registerextrapath(paths,subpaths) if newn > 0 then instance.extra_paths = ep -- register paths end - if newn > oldn then - instance.lists = { } -- erase the cache + if newn ~= oldn then + reset_caches() end end -local function made_list(instance,list) - local ep = instance.extra_paths - if not ep or #ep == 0 then - return list +function resolvers.pushextrapath(path) + local paths = settings_to_array(path) + if instance.extra_stack then + insert(instance.extra_stack,1,paths) else - local done, new, newn = { }, { }, 0 - -- honour . .. ../.. but only when at the start - for k=1,#list do - local v = list[k] - if not done[v] then - if find(v,"^[%.%/]$") then - done[v] = true - newn = newn + 1 - new[newn] = v - else - break - end - end - end - -- first the extra paths - for k=1,#ep do - local v = ep[k] + instance.extra_stack = { paths } + end + reset_caches() +end + +function resolvers.popextrapath() + if instance.extra_stack then + reset_caches() + return remove(instance.extra_stack,1) + end +end + +local function made_list(instance,list,extra_too) + local done = { } + local new = { } + local newn = 0 + -- a helper + local function add(p) + for k=1,#p do + local v = p[k] if not done[v] then done[v] = true newn = newn + 1 new[newn] = v end end - -- next the formal paths - for k=1,#list do - local v = list[k] - if not done[v] then - done[v] = true - newn = newn + 1 - new[newn] = v + end + -- honour . .. ../.. but only when at the start + for k=1,#list do + local v = list[k] + if done[v] then + -- skip + elseif find(v,"^[%.%/]$") then + done[v] = true + newn = newn + 1 + new[newn] = v + else + break + end + end + if extra_too then + -- first the stacked paths + local es = instance.extra_stack + if es and #es > 0 then + for k=1,#es do + add(es[k]) end end - return new + -- then the extra paths + local ep = instance.extra_paths + if ep and #ep > 0 then + add(ep) + end end + -- last the formal paths + add(list) + return new end function resolvers.cleanpathlist(str) local t = resolvers.expandedpathlist(str) if t then for i=1,#t do - t[i] = collapsepath(resolvers.cleanpath(t[i])) + t[i] = collapsepath(cleanpath(t[i])) end end return t @@ -801,22 +886,22 @@ function resolvers.expandpath(str) return joinpath(resolvers.expandedpathlist(str)) end -function resolvers.expandedpathlist(str) +function resolvers.expandedpathlist(str,extra_too) if not str then return { } - elseif instance.savelists then + elseif instance.savelists then -- hm, what if two cases, with and without extra_too str = lpegmatch(dollarstripper,str) local lists = instance.lists local lst = lists[str] if not lst then - local l = made_list(instance,resolvers.splitpath(resolvers.expansion(str))) + local l = made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too) lst = expandedpathfromlist(l) lists[str] = lst end return lst else local lst = resolvers.splitpath(resolvers.expansion(str)) - return made_list(instance,expandedpathfromlist(lst)) + return made_list(instance,expandedpathfromlist(lst),extra_too) end end @@ -830,6 +915,14 @@ function resolvers.expandpathfromvariable(str) return joinpath(resolvers.expandedpathlistfromvariable(str)) end +function resolvers.cleanedpathlist(v) -- can be cached if needed + local t = resolvers.expandedpathlist(v) + for i=1,#t do + t[i] = resolvers.resolve(resolvers.cleanpath(t[i])) + end + return t +end + function resolvers.expandbraces(str) -- output variable and brace expansion of STRING -- local ori = resolvers.variable(str) -- if ori == "" then @@ -851,7 +944,7 @@ function resolvers.registerfilehash(name,content,someerror) end local function isreadable(name) - local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir + local readable = isfile(name) -- not file.is_readable(name) asit can be a dir if trace_detail then if readable then report_resolving("file %a is readable",name) @@ -862,75 +955,59 @@ local function isreadable(name) return readable end --- name --- name/name +-- name | name/name -local function collect_files(names) - local filelist, noffiles = { }, 0 +local function collect_files(names) -- potential files .. sort of too much when asking for just one file + local filelist = { } -- but we need it for pattern matching later on + local noffiles = 0 + local function check(hash,root,pathname,path,name) + if not pathname or find(path,pathname) then + local variant = hash.type + local search = filejoin(root,path,name) -- funny no concatinator + local result = methodhandler('concatinators',variant,root,path,name) + if trace_detail then + report_resolving("match: variant %a, search %a, result %a",variant,search,result) + end + noffiles = noffiles + 1 + filelist[noffiles] = { variant, search, result } + end + end for k=1,#names do - local fname = names[k] + local filename = names[k] if trace_detail then - report_resolving("checking name %a",fname) + report_resolving("checking name %a",filename) end - local bname = filebasename(fname) - local dname = filedirname(fname) - if dname == "" or find(dname,"^%.") then - dname = false + local basename = filebasename(filename) + local pathname = filedirname(filename) + if pathname == "" or find(pathname,"^%.") then + pathname = false else - dname = gsub(dname,"%*",".*") - dname = "/" .. dname .. "$" + pathname = gsub(pathname,"%*",".*") + pathname = "/" .. pathname .. "$" end local hashes = instance.hashes for h=1,#hashes do - local hash = hashes[h] - local blobpath = hash.name - local files = blobpath and instance.files[blobpath] - if files then + local hash = hashes[h] + local hashname = hash.name + local content = hashname and instance.files[hashname] + if content then if trace_detail then - report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname) + report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname) end - local blobfile = files[bname] - if not blobfile then - local rname = "remap:"..bname - blobfile = files[rname] - if blobfile then - bname = files[rname] - blobfile = files[bname] - end - end - if blobfile then - local blobroot = files.__path__ or blobpath - if type(blobfile) == 'string' then - if not dname or find(blobfile,dname) then - local variant = hash.type - -- local search = filejoin(blobpath,blobfile,bname) - local search = filejoin(blobroot,blobfile,bname) - local result = methodhandler('concatinators',hash.type,blobroot,blobfile,bname) - if trace_detail then - report_resolving("match: variant %a, search %a, result %a",variant,search,result) - end - noffiles = noffiles + 1 - filelist[noffiles] = { variant, search, result } - end + local path, name = lookup(content,basename) + if path then + local metadata = content.metadata + local realroot = metadata and metadata.path or hashname + if type(path) == "string" then + check(hash,realroot,pathname,path,name) else - for kk=1,#blobfile do - local vv = blobfile[kk] - if not dname or find(vv,dname) then - local variant = hash.type - -- local search = filejoin(blobpath,vv,bname) - local search = filejoin(blobroot,vv,bname) - local result = methodhandler('concatinators',hash.type,blobroot,vv,bname) - if trace_detail then - report_resolving("match: variant %a, search %a, result %a",variant,search,result) - end - noffiles = noffiles + 1 - filelist[noffiles] = { variant, search, result } - end + for i=1,#path do + check(hash,realroot,pathname,path[i],name) end end end elseif trace_locating then - report_resolving("no match in %a (%s)",blobpath,bname) + report_resolving("no match in %a (%s)",hashname,basename) end end end @@ -961,7 +1038,7 @@ end local function can_be_dir(name) -- can become local local fakepaths = instance.fakepaths if not fakepaths[name] then - if lfs.isdir(name) then + if isdir(name) then fakepaths[name] = 1 -- directory else fakepaths[name] = 2 -- no directory @@ -987,10 +1064,11 @@ local function find_analyze(filename,askedformat,allresults) if askedformat == "" then if ext == "" or not suffixmap[ext] then local defaultsuffixes = resolvers.defaultsuffixes + local formatofsuffix = resolvers.formatofsuffix for i=1,#defaultsuffixes do local forcedname = filename .. '.' .. defaultsuffixes[i] wantedfiles[#wantedfiles+1] = forcedname - filetype = resolvers.formatofsuffix(forcedname) + filetype = formatofsuffix(forcedname) if trace_locating then report_resolving("forcing filetype %a",filetype) end @@ -1032,7 +1110,7 @@ local function find_wildcard(filename,allresults) if trace_locating then report_resolving("checking wildcard %a", filename) end - local method, result = resolvers.findwildcardfiles(filename) + local result = resolvers.findwildcardfiles(filename) if result then return "wildcard", result end @@ -1040,7 +1118,7 @@ local function find_wildcard(filename,allresults) end local function find_qualified(filename,allresults,askedformat,alsostripped) -- this one will be split too - if not file.is_qualified_path(filename) then + if not is_qualified_path(filename) then return end if trace_locating then @@ -1136,50 +1214,91 @@ local function check_subpath(fname) end end -local function find_intree(filename,filetype,wantedfiles,allresults) +-- this caching is not really needed (seldom accessed) but more readable +-- we could probably move some to a higher level but then we need to adapt +-- more code ... maybe some day + +local function makepathlist(list,filetype) local typespec = resolvers.variableofformat(filetype) - local pathlist = resolvers.expandedpathlist(typespec) - local method = "intree" + local pathlist = resolvers.expandedpathlist(typespec,filetype and usertypes[filetype]) -- only extra path with user files + local entry = { } if pathlist and #pathlist > 0 then + for k=1,#pathlist do + local path = pathlist[k] + local prescanned = find(path,'^!!') + local resursive = find(path,'//$') + local pathname = lpegmatch(inhibitstripper,path) + local expression = makepathexpression(pathname) + local barename = gsub(pathname,"/+$","") + barename = resolveprefix(barename) + local scheme = url.hasscheme(barename) + local schemename = gsub(barename,"%.%*$",'') -- after scheme + -- local prescanned = path ~= pathname -- ^!! + -- local resursive = find(pathname,'//$') + entry[k] = { + path = path, + pathname = pathname, + prescanned = prescanned, + recursive = recursive, + expression = expression, + barename = barename, + scheme = scheme, + schemename = schemename, + } + end + entry.typespec = typespec + list[filetype] = entry + else + list[filetype] = false + end + return entry +end + +-- pathlist : resolved +-- dirlist : unresolved or resolved +-- filelist : unresolved + +local function find_intree(filename,filetype,wantedfiles,allresults) + local pathlists = instance.pathlists + if not pathlists then + pathlists = setmetatableindex(allocate(),makepathlist) + instance.pathlists = pathlists + end + local pathlist = pathlists[filetype] + if pathlist then -- list search - local filelist = collect_files(wantedfiles) - local dirlist = { } + local method = "intree" + local filelist = collect_files(wantedfiles) -- okay, a bit over the top when we just look relative to the current path + local dirlist = { } + local result = { } if filelist then for i=1,#filelist do dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble end end if trace_detail then - report_resolving("checking filename %a",filename) + report_resolving("checking filename %a in tree",filename) end - local resolve = resolvers.resolve - local result = { } - -- pathlist : resolved - -- dirlist : unresolved or resolved - -- filelist : unresolved for k=1,#pathlist do - local path = pathlist[k] - local pathname = lpegmatch(inhibitstripper,path) - local doscan = path == pathname -- no ^!! - if not find (pathname,'//$') then - doscan = false -- we check directly on the path - end - local done = false + local entry = pathlist[k] + local path = entry.path + local pathname = entry.pathname + local done = false -- using file list if filelist then -- database -- compare list entries with permitted pattern -- /xx /xx// - local expression = makepathexpression(pathname) + local expression = entry.expression if trace_detail then report_resolving("using pattern %a for path %a",expression,pathname) end for k=1,#filelist do local fl = filelist[k] - local f = fl[2] - local d = dirlist[k] + local f = fl[2] + local d = dirlist[k] -- resolve is new: - if find(d,expression) or find(resolve(d),expression) then + if find(d,expression) or find(resolveprefix(d),expression) then -- todo, test for readable - result[#result+1] = resolve(fl[3]) -- no shortcut + result[#result+1] = resolveprefix(fl[3]) -- no shortcut done = true if allresults then if trace_detail then @@ -1199,61 +1318,74 @@ local function find_intree(filename,filetype,wantedfiles,allresults) if done then method = "database" else - method = "filesystem" -- bonus, even when !! is specified - pathname = gsub(pathname,"/+$","") - pathname = resolve(pathname) - local scheme = url.hasscheme(pathname) + -- beware: we don't honor allresults here in a next attempt (done false) + -- but that is kind of special anyway + method = "filesystem" -- bonus, even when !! is specified + local scheme = entry.scheme if not scheme or scheme == "file" then - local pname = gsub(pathname,"%.%*$",'') + local pname = entry.schemename if not find(pname,"*",1,true) then if can_be_dir(pname) then - -- quick root scan first - for k=1,#wantedfiles do - local w = wantedfiles[k] - local fname = check_subpath(filejoin(pname,w)) - if fname then - result[#result+1] = fname - done = true - if not allresults then - break - end + -- hm, rather useless as we don't go deeper and if we would we could also + -- auto generate the file database .. however, we need this for extra paths + -- that are not hashed (like sources on my machine) .. so, this is slightly + -- out of order but at least fast (and we seldom end up here, only when a file + -- is not already found +-- inspect(entry) + if not done and not entry.prescanned then + if trace_detail then + report_resolving("quick root scan for %a",pname) end - end - if not done and doscan then - -- collect files in path (and cache the result) - local files = resolvers.simplescanfiles(pname,false,true) for k=1,#wantedfiles do local w = wantedfiles[k] - local subpath = files[w] - if not subpath or subpath == "" then - -- rootscan already done - elseif type(subpath) == "string" then - local fname = check_subpath(filejoin(pname,subpath,w)) - if fname then - result[#result+1] = fname - done = true - if not allresults then - break - end + local fname = check_subpath(filejoin(pname,w)) + if fname then + result[#result+1] = fname + done = true + if not allresults then + break end - else - for i=1,#subpath do - local sp = subpath[i] - if sp == "" then - -- roottest already done - else - local fname = check_subpath(filejoin(pname,sp,w)) - if fname then - result[#result+1] = fname - done = true - if not allresults then - break + end + end + if not done and entry.recursive then -- maybe also when allresults + -- collect files in path (and cache the result) + if trace_detail then + report_resolving("scanning filesystem for %a",pname) + end + local files = resolvers.simplescanfiles(pname,false,true) + for k=1,#wantedfiles do + local w = wantedfiles[k] + local subpath = files[w] + if not subpath or subpath == "" then + -- rootscan already done + elseif type(subpath) == "string" then + local fname = check_subpath(filejoin(pname,subpath,w)) + if fname then + result[#result+1] = fname + done = true + if not allresults then + break + end + end + else + for i=1,#subpath do + local sp = subpath[i] + if sp == "" then + -- roottest already done + else + local fname = check_subpath(filejoin(pname,sp,w)) + if fname then + result[#result+1] = fname + done = true + if not allresults then + break + end end end end - end - if done and not allresults then - break + if done and not allresults then + break + end end end end @@ -1262,6 +1394,20 @@ local function find_intree(filename,filetype,wantedfiles,allresults) else -- no access needed for non existing path, speedup (esp in large tree with lots of fake) end + else + -- we can have extra_paths that are urls + for k=1,#wantedfiles do + -- independent url scanner + local pname = entry.barename + local fname = methodhandler('finders',pname .. "/" .. wantedfiles[k]) + if fname then + result[#result+1] = fname + done = true + if not allresults then + break + end + end + end end end -- todo recursive scanning @@ -1299,7 +1445,7 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults) -- other local filelist = collect_files(wantedfiles) local fl = filelist and filelist[1] if fl then - return "otherwise", { resolvers.resolve(fl[3]) } -- filename + return "otherwise", { resolveprefix(fl[3]) } -- filename end end @@ -1307,6 +1453,9 @@ end -- always analyze .. todo: use url split collect_instance_files = function(filename,askedformat,allresults) -- uses nested + if not filename or filename == "" then + return { } + end askedformat = askedformat or "" filename = collapsepath(filename,".") @@ -1344,7 +1493,11 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste else local method, result, stamp, filetype, wantedfiles if instance.remember then - stamp = formatters["%s--%s"](filename,askedformat) + if askedformat == "" then + stamp = formatters["%s::%s"](suffixonly(filename),filename) + else + stamp = formatters["%s::%s"](askedformat,filename) + end result = stamp and instance.found[stamp] if result then if trace_locating then @@ -1380,7 +1533,7 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste end if stamp then if trace_locating then - report_resolving("remembering file %a",filename) + report_resolving("remembering file %a using hash %a",filename,stamp) end instance.found[stamp] = result end @@ -1391,6 +1544,9 @@ end -- -- -- end of main file search routing -- -- -- local function findfiles(filename,filetype,allresults) + if not filename or filename == "" then + return { } + end local result, status = collect_instance_files(filename,filetype or "",allresults) if not result or #result == 0 then local lowered = lower(filename) @@ -1414,44 +1570,39 @@ function resolvers.findpath(filename,filetype) end local function findgivenfiles(filename,allresults) - local bname, result = filebasename(filename), { } - local hashes = instance.hashes - local noffound = 0 - for k=1,#hashes do - local hash = hashes[k] - local files = instance.files[hash.name] or { } - local blist = files[bname] - if not blist then - local rname = "remap:"..bname - blist = files[rname] - if blist then - bname = files[rname] - blist = files[bname] - end + local base = filebasename(filename) + local result = { } + local hashes = instance.hashes + -- + local function okay(hash,path,name) + local found = methodhandler('concatinators',hash.type,hash.name,path,name) + if found and found ~= "" then + result[#result+1] = resolveprefix(found) + return not allresults end - if blist then - if type(blist) == 'string' then - local found = methodhandler('concatinators',hash.type,hash.name,blist,bname) or "" - if found ~= "" then - noffound = noffound + 1 - result[noffound] = resolvers.resolve(found) - if not allresults then - break - end + end + -- + for k=1,#hashes do + local hash = hashes[k] + local content = instance.files[hash.name] + if content then + local path, name = lookup(content,base) + if not path then + -- no match + elseif type(path) == "string" then + if okay(hash,path,name) then + return result end else - for kk=1,#blist do - local vv = blist[kk] - local found = methodhandler('concatinators',hash.type,hash.name,vv,bname) or "" - if found ~= "" then - noffound = noffound + 1 - result[noffound] = resolvers.resolve(found) - if not allresults then break end + for i=1,#path do + if okay(hash,path[i],name) then + return result end end end end end + -- return result end @@ -1463,37 +1614,6 @@ function resolvers.findgivenfile(filename) return findgivenfiles(filename,false)[1] or "" end -local function doit(path,blist,bname,tag,variant,result,allresults) - local done = false - if blist and variant then - local resolve = resolvers.resolve -- added - if type(blist) == 'string' then - -- make function and share code - if find(lower(blist),path) then - local full = methodhandler('concatinators',variant,tag,blist,bname) or "" - result[#result+1] = resolve(full) - done = true - end - else - for kk=1,#blist do - local vv = blist[kk] - if find(lower(vv),path) then - local full = methodhandler('concatinators',variant,tag,vv,bname) or "" - result[#result+1] = resolve(full) - done = true - if not allresults then break end - end - end - end - end - return done -end - ---~ local makewildcard = Cs( ---~ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*" ---~ + (P("^")^0 * P("/") / "") * (P("*")/".*" + P("-")/"%%-" + P("?")/"."+ P("\\")/"/" + P(1))^0 ---~ ) - local makewildcard = Cs( (P("^")^0 * P("/") * P(-1) + P(-1)) /".*" + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0 @@ -1503,37 +1623,80 @@ function resolvers.wildcardpattern(pattern) return lpegmatch(makewildcard,pattern) or pattern end -local function findwildcardfiles(filename,allresults,result) -- todo: remap: and lpeg - result = result or { } ---~ local path = lower(lpegmatch(makewildcard,filedirname (filename))) ---~ local name = lower(lpegmatch(makewildcard,filebasename(filename))) - local base = filebasename(filename) - local dirn = filedirname(filename) - local path = lower(lpegmatch(makewildcard,dirn) or dirn) - local name = lower(lpegmatch(makewildcard,base) or base) - local files, done = instance.files, false +-- we use more function calls than before but we also have smaller trees so +-- why bother + +local function findwildcardfiles(filename,allresults,result) + local result = result or { } + local base = filebasename(filename) + local dirn = filedirname(filename) + local path = lower(lpegmatch(makewildcard,dirn) or dirn) + local name = lower(lpegmatch(makewildcard,base) or base) + local files = instance.files + -- if find(name,"*",1,true) then local hashes = instance.hashes + local function okay(found,path,base,hashname,hashtype) + if find(found,path) then + local full = methodhandler('concatinators',hashtype,hashname,found,base) + if full and full ~= "" then + result[#result+1] = resolveprefix(full) + return not allresults + end + end + end for k=1,#hashes do - local hash = hashes[k] - local hashname, hashtype = hash.name, hash.type - for kk, hh in next, files[hashname] do - if not find(kk,"^remap:") then - if find(lower(kk),name) then - if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end - if done and not allresults then break end + local hash = hashes[k] + local hashname = hash.name + local hashtype = hash.type + if hashname and hashtype then + for found, base in filtered(files[hashname],name) do + if type(found) == 'string' then + if okay(found,path,base,hashname,hashtype) then + break + end + else + for i=1,#found do + if okay(found[i],path,base,hashname,hashtype) then + break + end + end end end end end else + local function okayokay(found,path,base,hashname,hashtype) + if find(found,path) then + local full = methodhandler('concatinators',hashtype,hashname,found,base) + if full and full ~= "" then + result[#result+1] = resolveprefix(full) + return not allresults + end + end + end + -- local hashes = instance.hashes --- inspect(hashes) for k=1,#hashes do - local hash = hashes[k] - local hashname, hashtype = hash.name, hash.type - if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done = true end - if done and not allresults then break end + local hash = hashes[k] + local hashname = hash.name + local hashtype = hash.type + if hashname and hashtype then + local found, base = lookup(content,base) + if not found then + -- nothing + elseif type(found) == 'string' then + if okay(found,path,base,hashname,hashtype) then + break + end + else + for i=1,#found do + if okay(found[i],path,base,hashname,hashtype) then + break + end + end + end + end end end -- we can consider also searching the paths not in the database, but then @@ -1626,7 +1789,7 @@ end function resolvers.dowithpath(name,func) local pathlist = resolvers.expandedpathlist(name) for i=1,#pathlist do - func("^"..resolvers.cleanpath(pathlist[i])) + func("^"..cleanpath(pathlist[i])) end end @@ -1636,23 +1799,23 @@ end function resolvers.locateformat(name) local engine = environment.ownmain or "luatex" - local barename = file.removesuffix(name) - local fullname = file.addsuffix(barename,"fmt") + local barename = removesuffix(name) + local fullname = addsuffix(barename,"fmt") local fmtname = caches.getfirstreadablefile(fullname,"formats",engine) or "" if fmtname == "" then fmtname = resolvers.findfile(fullname) - fmtname = resolvers.cleanpath(fmtname) + fmtname = cleanpath(fmtname) end if fmtname ~= "" then - local barename = file.removesuffix(fmtname) - local luaname = file.addsuffix(barename,luasuffixes.lua) - local lucname = file.addsuffix(barename,luasuffixes.luc) - local luiname = file.addsuffix(barename,luasuffixes.lui) - if lfs.isfile(luiname) then + local barename = removesuffix(fmtname) + local luaname = addsuffix(barename,luasuffixes.lua) + local lucname = addsuffix(barename,luasuffixes.luc) + local luiname = addsuffix(barename,luasuffixes.lui) + if isfile(luiname) then return barename, luiname - elseif lfs.isfile(lucname) then + elseif isfile(lucname) then return barename, lucname - elseif lfs.isfile(luaname) then + elseif isfile(luaname) then return barename, luaname end end @@ -1671,35 +1834,29 @@ end function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead local instance = resolvers.instance - local hashes = instance.hashes + local hashes = instance.hashes for i=1,#hashes do - local hash = hashes[i] + local hash = hashes[i] local blobtype = hash.type local blobpath = hash.name - if blobpath then + if blobtype and blobpath then + local total = 0 + local checked = 0 + local done = 0 if before then before(blobtype,blobpath,pattern) end - local files = instance.files[blobpath] - local total, checked, done = 0, 0, 0 - if files then - for k, v in table.sortedhash(files) do -- next, files do, beware: this is not the resolve order - total = total + 1 - if find(k,"^remap:") then - -- forget about these - elseif find(k,pattern) then - if type(v) == "string" then - checked = checked + 1 - if handle(blobtype,blobpath,v,k) then - done = done + 1 - end - else - checked = checked + #v - for i=1,#v do - if handle(blobtype,blobpath,v[i],k) then - done = done + 1 - end - end + for path, name in filtered(instance.files[blobpath],pattern) do + if type(path) == "string" then + checked = checked + 1 + if handle(blobtype,blobpath,path,name) then + done = done + 1 + end + else + checked = checked + #path + for i=1,#path do + if handle(blobtype,blobpath,path[i],name) then + done = done + 1 end end end @@ -1711,8 +1868,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, end end -resolvers.obsolete = resolvers.obsolete or { } -local obsolete = resolvers.obsolete +local obsolete = resolvers.obsolete or { } +resolvers.obsolete = obsolete resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles diff --git a/Master/texmf-dist/tex/context/base/data-sch.lua b/Master/texmf-dist/tex/context/base/data-sch.lua index adc774489d7..d79e0c7ef59 100644 --- a/Master/texmf-dist/tex/context/base/data-sch.lua +++ b/Master/texmf-dist/tex/context/base/data-sch.lua @@ -31,8 +31,18 @@ function cleaners.none(specification) return specification.original end -function cleaners.strip(specification) - return (gsub(specification.original,"[^%a%d%.]+","-")) -- so we keep periods +-- function cleaners.strip(specification) +-- -- todo: only keep suffix periods, so after the last +-- return (gsub(specification.original,"[^%a%d%.]+","-")) -- so we keep periods +-- end + +function cleaners.strip(specification) -- keep suffixes + local path, name = file.splitbase(specification.original) + if path == "" then + return (gsub(name,"[^%a%d%.]+","-")) + else + return (gsub((gsub(path,"%.","-") .. "-" .. name),"[^%a%d%.]+","-")) + end end function cleaners.md5(specification) @@ -55,7 +65,7 @@ local cached, loaded, reused, thresholds, handlers = { }, { }, { }, { }, { } local function runcurl(name,cachename) -- we use sockets instead or the curl library when possible local command = "curl --silent --insecure --create-dirs --output " .. cachename .. " " .. name - os.spawn(command) + os.execute(command) end local function fetch(specification) diff --git a/Master/texmf-dist/tex/context/base/data-tex.lua b/Master/texmf-dist/tex/context/base/data-tex.lua index 04c5ef469ee..b6b97a0a989 100644 --- a/Master/texmf-dist/tex/context/base/data-tex.lua +++ b/Master/texmf-dist/tex/context/base/data-tex.lua @@ -77,13 +77,13 @@ function helpers.textopener(tag,filename,filehandle,coding) report_tex("%a opener: %a opened using method %a",tag,filename,coding) end if coding == "utf-16-be" then - lines = utf.utf16_to_utf8_be(lines) + lines = utf.utf16_to_utf8_be_t(lines) elseif coding == "utf-16-le" then - lines = utf.utf16_to_utf8_le(lines) + lines = utf.utf16_to_utf8_le_t(lines) elseif coding == "utf-32-be" then - lines = utf.utf32_to_utf8_be(lines) + lines = utf.utf32_to_utf8_be_t(lines) elseif coding == "utf-32-le" then - lines = utf.utf32_to_utf8_le(lines) + lines = utf.utf32_to_utf8_le_t(lines) else -- utf8 or unknown (could be a mkvi file) local runner = textfileactions.runner if runner then diff --git a/Master/texmf-dist/tex/context/base/data-tmf.lua b/Master/texmf-dist/tex/context/base/data-tmf.lua index c522251932e..e0ccac257a1 100644 --- a/Master/texmf-dist/tex/context/base/data-tmf.lua +++ b/Master/texmf-dist/tex/context/base/data-tmf.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-tmf'] = { license = "see context related readme files" } -local resolvers = resolvers +local resolvers = resolvers local report_tds = logs.reporter("resolvers","tds") diff --git a/Master/texmf-dist/tex/context/base/data-tmp.lua b/Master/texmf-dist/tex/context/base/data-tmp.lua index 3e109dcfe6d..8ee5792cc48 100644 --- a/Master/texmf-dist/tex/context/base/data-tmp.lua +++ b/Master/texmf-dist/tex/context/base/data-tmp.lua @@ -35,6 +35,7 @@ local report_caches = logs.reporter("resolvers","caches") local report_resolvers = logs.reporter("resolvers","caching") local resolvers = resolvers +local cleanpath = resolvers.cleanpath -- intermezzo @@ -72,7 +73,7 @@ local writable, readables, usedreadables = nil, { }, { } local function identify() -- Combining the loops makes it messy. First we check the format cache path -- and when the last component is not present we try to create it. - local texmfcaches = resolvers.cleanpathlist("TEXMFCACHE") + local texmfcaches = resolvers.cleanpathlist("TEXMFCACHE") -- forward ref if texmfcaches then for k=1,#texmfcaches do local cachepath = texmfcaches[k] @@ -369,10 +370,12 @@ function caches.contentstate() return content_state or { } end -function caches.loadcontent(cachename,dataname) - local name = caches.hashed(cachename) - local full, path = caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees") - local filename = file.join(path,name) +function caches.loadcontent(cachename,dataname,filename) + if not filename then + local name = caches.hashed(cachename) + local full, path = caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees") + filename = file.join(path,name) + end local blob = loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua)) if blob then local data = blob() @@ -406,10 +409,12 @@ function caches.collapsecontent(content) end end -function caches.savecontent(cachename,dataname,content) - local name = caches.hashed(cachename) - local full, path = caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees") - local filename = file.join(path,name) -- is full +function caches.savecontent(cachename,dataname,content,filename) + if not filename then + local name = caches.hashed(cachename) + local full, path = caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees") + filename = file.join(path,name) -- is full + end local luaname = addsuffix(filename,luasuffixes.lua) local lucname = addsuffix(filename,luasuffixes.luc) if trace_locating then diff --git a/Master/texmf-dist/tex/context/base/data-tre.lua b/Master/texmf-dist/tex/context/base/data-tre.lua index 0a8b00d9bfb..4388731f98c 100644 --- a/Master/texmf-dist/tex/context/base/data-tre.lua +++ b/Master/texmf-dist/tex/context/base/data-tre.lua @@ -6,50 +6,89 @@ if not modules then modules = { } end modules ['data-tre'] = { license = "see context related readme files" } --- \input tree://oeps1/**/oeps.tex +-- tree://e:/temporary/mb-mp/**/drawing.jpg +-- tree://e:/temporary/mb-mp/**/Drawing.jpg +-- tree://t:./**/tufte.tex +-- tree://t:/./**/tufte.tex +-- tree://t:/**/tufte.tex +-- dirlist://e:/temporary/mb-mp/**/drawing.jpg +-- dirlist://e:/temporary/mb-mp/**/Drawing.jpg +-- dirlist://e:/temporary/mb-mp/**/just/some/place/drawing.jpg +-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg +-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg?option=fileonly +-- dirlist://///storage-2/resources/mb-mp/**/drawing.jpg +-- dirlist://e:/**/drawing.jpg -local find, gsub, format = string.find, string.gsub, string.format +local find, gsub, lower = string.find, string.gsub, string.lower +local basename, dirname, joinname = file.basename, file.dirname, file .join +local globdir, isdir, isfile = dir.glob, lfs.isdir, lfs.isfile +local P, lpegmatch = lpeg.P, lpeg.match local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) -local report_trees = logs.reporter("resolvers","trees") +local report_trees = logs.reporter("resolvers","trees") -local resolvers = resolvers +local resolvers = resolvers +local resolveprefix = resolvers.resolve +local notfound = resolvers.finders.notfound +local lookup = resolvers.get_from_content -local done, found, notfound = { }, { }, resolvers.finders.notfound +-- A tree search is rather dumb ... there is some basic caching of searched trees +-- but nothing is cached over runs ... it's also a wildcard one so we cannot use +-- the normal scanner. -function resolvers.finders.tree(specification) +local collectors = { } +local found = { } + +function resolvers.finders.tree(specification) -- to be adapted to new formats local spec = specification.filename - local fnd = found[spec] - if fnd == nil then + local okay = found[spec] + if okay == nil then if spec ~= "" then - local path, name = file.dirname(spec), file.basename(spec) - if path == "" then path = "." end - local hash = done[path] - if not hash then - local pattern = path .. "/*" -- we will use the proper splitter - hash = dir.glob(pattern) - done[path] = hash + local path = dirname(spec) + local name = basename(spec) + if path == "" then + path = "." + end + local names = collectors[path] + if not names then + local pattern = find(path,"/%*+$") and path or (path .. "/*") + names = globdir(pattern) + collectors[path] = names end local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$" - for k=1,#hash do - local v = hash[k] - if find(v,pattern) then - found[spec] = v - return v + for i=1,#names do + local fullname = names[i] + if find(fullname,pattern) then + found[spec] = fullname + return fullname + end + end + -- let's be nice: + local pattern = lower(pattern) + for i=1,#names do + local fullname = lower(names[i]) + if find(fullname,pattern) then + if isfile(fullname) then + found[spec] = fullname + return fullname + else + -- no os name mapping + break + end end end end - fnd = notfound() -- false - found[spec] = fnd + okay = notfound() -- false + found[spec] = okay end - return fnd + return okay end function resolvers.locators.tree(specification) local name = specification.filename - local realname = resolvers.resolve(name) -- no shortcut - if realname and realname ~= '' and lfs.isdir(realname) then + local realname = resolveprefix(name) -- no shortcut + if realname and realname ~= '' and isdir(realname) then if trace_locating then report_trees("locator %a found",realname) end @@ -61,15 +100,134 @@ end function resolvers.hashers.tree(specification) local name = specification.filename - if trace_locating then - report_trees("analysing %a",name) - end + -- if trace_locating then + report_trees("analyzing %a",name) + -- end resolvers.methodhandler("hashers",name) resolvers.generators.file(specification) end -resolvers.concatinators.tree = resolvers.concatinators.file -resolvers.generators.tree = resolvers.generators.file -resolvers.openers.tree = resolvers.openers.file -resolvers.loaders.tree = resolvers.loaders.file +-- This is a variation on tree lookups but this time we do cache in the given +-- root. We use a similar hasher as the resolvers because we have to deal with +-- for instance trees with 50K xml files plus a similar amount of resources to +-- deal and we don't want too much overhead. + +local collectors = { } +local splitter = lpeg.splitat("/**/") +local stripper = lpeg.replacer { [P("/") * P("*")^1 * P(-1)] = "" } + +table.setmetatableindex(collectors, function(t,k) + local rootname = lpegmatch(stripper,k) + local dataname = joinname(rootname,"dirlist") + local content = caches.loadcontent(dataname,"files",dataname) + if not content then + -- path branch usecache onlyonce tolerant + content = resolvers.scanfiles(rootname,nil,nil,false,true) -- so we accept crap + caches.savecontent(dataname,"files",content,dataname) + end + t[k] = content + return content +end) + + +local function checked(root,p,n) + if p then + if type(p) == "table" then + for i=1,#p do + local fullname = joinname(root,p[i],n) + if isfile(fullname) then -- safeguard + return fullname + end + end + else + local fullname = joinname(root,p,n) + if isfile(fullname) then -- safeguard + return fullname + end + end + end + return notfound() +end + +-- no funny characters in path but in filename permitted .. sigh + +local function resolve(specification) -- can be called directly too + local filename = specification.filename + -- inspect(specification) + if filename ~= "" then + local root, rest = lpegmatch(splitter,filename) + if root and rest then + local path, name = dirname(rest), basename(rest) + if name ~= rest then + local content = collectors[root] + local p, n = lookup(content,name) + if not p then + return notfound() + end + local pattern = ".*/" .. path .. "$" + local istable = type(p) == "table" + if istable then + for i=1,#p do + local pi = p[i] + if pi == path or find(pi,pattern) then + local fullname = joinname(root,pi,n) + if isfile(fullname) then -- safeguard + return fullname + end + end + end + elseif p == path or find(p,pattern) then + local fullname = joinname(root,p,n) + if isfile(fullname) then -- safeguard + return fullname + end + end + local queries = specification.queries + if queries and queries.option == "fileonly" then + return checked(root,p,n) + else + return notfound() + end + end + end + local path, name = dirname(filename), basename(filename) + local root = lpegmatch(stripper,path) + local content = collectors[path] + local p, n = lookup(content,name) + if p then + return checked(root,p,n) + end + end + return notfound() +end + +resolvers.finders .dirlist = resolve +resolvers.locators .dirlist = resolvers.locators .tree +resolvers.hashers .dirlist = resolvers.hashers .tree +resolvers.generators.dirlist = resolvers.generators.file +resolvers.openers .dirlist = resolvers.openers .file +resolvers.loaders .dirlist = resolvers.loaders .file + +function resolvers.finders.dirfile(specification) + local queries = specification.queries + if queries then + queries.option = "fileonly" + else + specification.queries = { option = "fileonly" } + end + return resolve(specification) +end + +resolvers.locators .dirfile = resolvers.locators .dirlist +resolvers.hashers .dirfile = resolvers.hashers .dirlist +resolvers.generators.dirfile = resolvers.generators.dirlist +resolvers.openers .dirfile = resolvers.openers .dirlist +resolvers.loaders .dirfile = resolvers.loaders .dirlist + +-- local locate = collectors[ [[E:\temporary\mb-mp]] ] +-- local locate = collectors( [[\\storage-2\resources\mb-mp]] ) + +-- print(resolvers.findtexfile("tree://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg")) +-- print(resolvers.findtexfile("tree://t:/**/tufte.tex")) +-- print(resolvers.findtexfile("dirlist://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg")) diff --git a/Master/texmf-dist/tex/context/base/data-vir.lua b/Master/texmf-dist/tex/context/base/data-vir.lua index 48fec54e065..7e25c822d07 100644 --- a/Master/texmf-dist/tex/context/base/data-vir.lua +++ b/Master/texmf-dist/tex/context/base/data-vir.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-vir'] = { license = "see context related readme files" } -local format, validstrings = string.format, string.valid +local formatters, validstrings = string.formatters, string.valid local trace_virtual = false local report_virtual = logs.reporter("resolvers","virtual") @@ -18,14 +18,14 @@ local resolvers = resolvers local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers -local data = { } -local n = 0 -- hm, number can be query -local template = "virtual://%s.%s" +local data = { } +local n = 0 -- hm, number can be query +local f_virtual = formatters["virtual://%s.%s"] function savers.virtual(specification,content) n = n + 1 -- one number for all namespaces local path = specification.path - local filename = format(template,path ~= "" and path or "virtualfile",n) + local filename = f_virtual(path ~= "" and path or "virtualfile",n) if trace_virtual then report_virtual("saver: file %a saved",filename) end diff --git a/Master/texmf-dist/tex/context/base/data-zip.lua b/Master/texmf-dist/tex/context/base/data-zip.lua index 5db69670c6d..2be88e0fc1c 100644 --- a/Master/texmf-dist/tex/context/base/data-zip.lua +++ b/Master/texmf-dist/tex/context/base/data-zip.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-zip'] = { license = "see context related readme files" } --- partly redone .. needs testing +-- real old code ... partly redone .. needs testing due to changes as well as a decent overhaul local format, find, match = string.format, string.find, string.match @@ -37,18 +37,6 @@ local archives = zip.archives zip.registeredfiles = zip.registeredfiles or { } local registeredfiles = zip.registeredfiles -local limited = false - -directives.register("system.inputmode", function(v) - if not limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - zip.open = i_limiter.protect(zip.open) - limited = true - end - end -end) - local function validzip(str) -- todo: use url splitter if not find(str,"^zip://") then return "zip:///" .. str @@ -64,7 +52,7 @@ function zip.openarchive(name) local arch = archives[name] if not arch then local full = resolvers.findfile(name) or "" - arch = (full ~= "" and zip.open(full)) or false + arch = full ~= "" and zip.open(full) or false archives[name] = arch end return arch @@ -235,30 +223,42 @@ function resolvers.usezipfile(archive) end function resolvers.registerzipfile(z,tree) - local files, filter = { }, "" - if tree == "" then - filter = "^(.+)/(.-)$" - else - filter = format("^%s/(.+)/(.-)$",tree) - end + local names = { } + local files = { } -- somewhat overkill .. todo + local remap = { } -- somewhat overkill .. todo + local n = 0 + local filter = tree == "" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree) + local register = resolvers.registerfile if trace_locating then report_zip("registering: using filter %a",filter) end - local register, n = resolvers.registerfile, 0 for i in z:files() do - local path, name = match(i.filename,filter) - if path then - if name and name ~= '' then - register(files, name, path) - n = n + 1 - else - -- directory + local filename = i.filename + local path, name = match(filename,filter) + if not path then + n = n + 1 + register(names,filename,"") + local usedname = lower(filename) + files[usedname] = "" + if usedname ~= filename then + remap[usedname] = filename end - else - register(files, i.filename, '') + elseif name and name ~= "" then n = n + 1 + register(names,name,path) + local usedname = lower(name) + files[usedname] = path + if usedname ~= name then + remap[usedname] = name + end + else + -- directory end end report_zip("registering: %s files registered",n) - return files + return { + -- metadata = { }, + files = files, + remap = remap, + } end diff --git a/Master/texmf-dist/tex/context/base/enco-ini.mkiv b/Master/texmf-dist/tex/context/base/enco-ini.mkiv index ab3aa488da1..b2e7efd3e5e 100644 --- a/Master/texmf-dist/tex/context/base/enco-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/enco-ini.mkiv @@ -66,12 +66,16 @@ \fi\fi \endcsname} +\unexpanded\def\enco_define_command#1#2% + {\setuvalue{\string#1}{#2}} + \let\dohandleaccent \enco_handle_accent % maybe useful \let\dodefineaccent \enco_define_accent % used at the lua end \let\dodefineaccentcommand\enco_define_accent_command % used at the lua end +\let\dodefinecommand \enco_define_command % used at the lua end \unexpanded\def\definecharacter#1 #2 % - {\doifnumberelse{\string#2} + {\doifelsenumber{\string#2} {\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax} {\setuvalue{\string#1}{#2}}} @@ -106,7 +110,7 @@ \unexpanded\def\buildtextaccent#1#2% we could do all at the lua end {\begingroup % but that's no fun (yet) \setbox\b_enco_accent\hbox{#1}% - \ctxcommand{buildtextaccent(\number\b_enco_accent)}#2% + \clf_buildtextaccent\b_enco_accent#2% \endgroup} \unexpanded\def\bottomaccent#1#2#3#4#5% down right slantcorrection accent char @@ -208,11 +212,42 @@ \def\pound {£} \def\sterling{£} \def\promille {‰} \def\permille{‰} -% tex specific (obsolete) +% tex specific + +\ifdefined\textpercent + \let\percent \textpercent + \let\procent \textpercent + \let\ampersand \textampersand + \let\dollar \textdollar + \let\hash \texthash +\else + \def\percent {\textpercent} + \def\procent {\textpercent} + \def\ampersand {\textampersand} + \def\dollar {\textdollar} + \def\hash {\texthash} +\fi + +% from enco-mis: + +\unexpanded\def\fakepercent + {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle0}}} + +\unexpanded\def\fakeperthousand + {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle00}}} + +\unexpanded\def\fakepermine + {\dontleavehmode + \bgroup + \setbox\scratchbox\hbox + {\mathematics{+}}% + \hbox to \wd\scratchbox + {\hss + \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4\emwidth/\kern-.3\emwidth\normalsubscript{\scriptscriptstyle-}}% + \hss}% + \egroup} -\def\procent {\percent} -\def\dollar {\textdollar} -\def\permine {\fakepermine} +\def\permine{\fakepermine} % some more @@ -250,9 +285,27 @@ \chardef\textcontrolspace"2423 -\unexpanded\def\fallbackcontrolspace - %{\getglyph{ComputerModernMono}\textcontrolspace} - {\getglyph{LMTypewriter-Regular}\textcontrolspace} +\installcorenamespace{controlspace} + +% \unexpanded\def\fallbackcontrolspace % beware: non-matching widths +% {\hbox to \interwordspace{\hss\getglyph{LMTypewriter-Regular}\textcontrolspace\hss}% + +\unexpanded\def\fallbackcontrolspace % beware, current font, we also need to honor color + {\hbox to \interwordspace \bgroup + \hss + \ifcsname\??controlspace\number\interwordspace\endcsname + \csname\??controlspace\number\interwordspace\endcsname + \else + \enco_fast_control_space_define % only regular + \fi + \textcontrolspace + \hss + \egroup} + +\unexpanded\def\enco_fast_control_space_define + {\scratchdimen\interwordspace + \definedfont[LMTypewriter-Regular at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody]% see font-sym.mkiv + \expandafter\glet\csname\??controlspace\number\scratchdimen\endcsname\lastrawfontcall} \unexpanded\def\normalcontrolspace {\iffontchar\font\textcontrolspace @@ -263,29 +316,35 @@ \let\textvisiblespace\normalcontrolspace -\unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped) - {\enco_fast_control_space} - -\def\enco_fast_control_space +\unexpanded\def\optionalcontrolspace {\iffontchar\font\textcontrolspace - \enco_fast_control_space_nop + \textcontrolspace \else - \enco_fast_control_space_yes - \fi - \enco_fast_control_space} - -\newbox\b_enco_control_space - -\def\enco_fast_control_space_nop - {\let\enco_fast_control_space\textcontrolspace} - -\def\enco_fast_control_space_yes - {\setbox\b_enco_control_space\hbox{\space}% - \setbox\b_enco_control_space\hbox to \wd\b_enco_control_space{\hss\fallbackcontrolspace\hss}% - \let\enco_fast_control_space\flushcontrolspacebox} + \asciispacechar % used for export ! + \fi} -\def\flushcontrolspacebox - {\copy\b_enco_control_space} +% \unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped) +% {\enco_fast_control_space} +% +% \def\enco_fast_control_space +% {\iffontchar\font\textcontrolspace +% \enco_fast_control_space_nop +% \else +% \enco_fast_control_space_yes +% \fi +% \enco_fast_control_space} +% +% \newbox\b_enco_control_space +% +% \def\enco_fast_control_space_nop +% {\let\enco_fast_control_space\textcontrolspace} +% +% \def\enco_fast_control_space_yes +% {\setbox\b_enco_control_space\fallbackcontrolspace +% \let\enco_fast_control_space\flushcontrolspacebox} +% +% \def\flushcontrolspacebox +% {\copy\b_enco_control_space} % a few defaults (\{}), we really need the verbose \empty as it will be % stringified .. anyhow, we define this at the lua end now but keep it here as a @@ -305,26 +364,7 @@ % \defineaccent u {\empty} {\textbreve} % \defineaccent v {\empty} {\textcaron} -\ctxlua{characters.tex.defineaccents()} - -% from enco-mis: - -\unexpanded\def\fakepercent - {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle0}}} - -\unexpanded\def\fakeperthousand - {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle00}}} - -\unexpanded\def\fakepermine - {\dontleavehmode - \bgroup - \setbox\scratchbox\hbox - {\mathematics{+}}% - \hbox to \wd\scratchbox - {\hss - \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4\emwidth/\kern-.3\emwidth\normalsubscript{\scriptscriptstyle-}}% - \hss}% - \egroup} +\clf_defineaccents % one time %D A smaller and bolder variant, more like the math and monospaced ones. @@ -365,37 +405,105 @@ \unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax} \unexpanded\def\fraction#1#2{\mathematics{#1\over#2}} -\def\periodswidth {.5em} -\def\periodsdefault{3} % was 5, but now it's like \unknown - -\unexpanded\def\periods - {\dosingleempty\enco_periods} - +% \def\periodswidth {.5em} +% \def\periodsdefault{3} % was 5, but now it's like \unknown +% +% \unexpanded\def\periods +% {\dosingleempty\enco_periods} +% % \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2 % {\dontleavehmode % \begingroup % \scratchdimen\periodswidth % \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen -% {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}% +% {\leaders\hbox to \scratchdimen{\hss\periodsymbol\hss}\hss}% % \endgroup} % % better for export: +% +% \unexpanded\def\enco_periods[#1]% todo: also n=,width= or maybe just #1,#2 +% {\dontleavehmode +% \hbox\bgroup +% \setbox\scratchbox\hbox to \periodswidth{\hss\periodsymbol\hss}% +% \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}% +% \egroup} +% +% \unexpanded\def\unknown +% {\periods\relax} % relax prevents lookahead for [] +% +% per request: + +%D \startbuffer +%D \startlines +%D x\periods x +%D x\periods[10]x +%D x\periods[n=10,symbol={,}]x +%D x\periods[n=4,symbol={!!},width=1em]x +%D x\periods[n=4,symbol={!!},width=fit]x +%D x\periods[n=4,symbol={!!},width=fit,distance=1em]x +%D x\unknown x +%D \stoplines +%D \stopbuffer +%D +%D \typbuffer \getbuffer + +\def\periodswidth {.5\emwidth} % downward compatible +\def\periodsdefault{3} % downward compatible + +\installcorenamespace {periods} + +\installsetuponlycommandhandler \??periods {periods} + +\setupperiods + [\c!n=\periodsdefault, + \c!width=\periodswidth, % can also be \v!fit + \c!distance=.25\emwidth, + \c!symbol=.] -\unexpanded\def\enco_periods[#1]% todo: also n=,width= or maybe just #1,#2 +\unexpanded\def\periods {\dontleavehmode \hbox\bgroup - \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}% - \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}% + \doifelsenextoptional\enco_periods_yes\enco_periods_nop} + +\unexpanded\def\enco_periods_yes[#1]% + {\doifelseassignment{#1} + {\setupcurrentperiods[#1]% + \scratchcounter\periodsparameter\c!n} + {\doifelsenothing{#1} + {\scratchcounter\periodsparameter\c!n}% + {\scratchcounter#1}}% + \enco_periods_finish} + +\unexpanded\def\enco_periods_nop + {\scratchcounter\periodsparameter\c!n + \enco_periods_finish} + +\unexpanded\def\enco_periods_finish + {\edef\p_width{\periodsparameter\c!width}% + \ifx\p_width\v!fit + \enco_periods_finish_fit + \else + \enco_periods_finish_width + \fi \egroup} +\unexpanded\def\enco_periods_finish_width + {\setbox\scratchbox\hbox to \p_width + {\hss\periodsparameter\c!symbol\hss}% + \dorecurse\scratchcounter{\copy\scratchbox}} + +\unexpanded\def\enco_periods_finish_fit + {\edef\p_symbol{\periodsparameter\c!symbol}% + \scratchdistance\periodsparameter\c!distance + \hskip\scratchdistance + \dorecurse\scratchcounter{\p_symbol\hskip\scratchdistance}} + \unexpanded\def\unknown - {\periods\relax} % relax prevents lookahead for [] + {\dontleavehmode + \hbox\bgroup + \enco_periods_nop} -% Example by Wolfgang Schuster on the context list: -% -% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}} -% -% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World. +%D Left-overs: \appendtoks \let\buildtextaccent\secondoftwoarguments diff --git a/Master/texmf-dist/tex/context/base/export-example.css b/Master/texmf-dist/tex/context/base/export-example.css index dbecc01feae..af99d95dbe4 100644 --- a/Master/texmf-dist/tex/context/base/export-example.css +++ b/Master/texmf-dist/tex/context/base/export-example.css @@ -7,65 +7,100 @@ */ +/* + + Because empty div elements are not seen we put a comment in them so that empty + table cells etc work ok. + + We can style individual elements in several ways and we support in this css file + meaningful elements as well as divs. If needed you can use the chain field as well + as chain elements in the div class for styling groups. + + \definefloat[myfloata] + \definefloat[myfloatb][myfloatbs][figure] + + context|div.float.myfloata { } float[detail='myfloata'] { } + context|div.float.myfloatb { } float[detail='myfloatb'] { } + context|div.float.figure { } float[detail='figure'] { } + context|div.float.figure.myfloatb { } float[chain~='figure'][detail='myfloata'] { } + context|div.myfloata { } *[detail='myfloata'] { } + context|div.myfloatb { } *[detail='myfloatb'] { } + context|div.figure { } *[chain~='figure'] { } + context|div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { } + +*/ + +@namespace context url('http://www.pragma-ade.com/context/export') ; + /* ignore : mixed */ /* metadata: display */ -ignore { +ignore, context|div.ignore { + display : none ; +} + +ignore, context|div.private { display : none ; } -xmetadata { +xmetadata, context|div.xmetadata { display : none ; } -xmetavariable { +xmetavariable, context|div.xmetavariable { display : none ; } /* document : display */ -document:before { +document:before, context|div.document:before { content : attr(title) ; font-size : 44pt ; font-weight : bold ; margin-bottom : 1em ; } -document { +document, context|div.document { font-family : "DejaVu Serif", "Lucida Bright", serif ; font-size : 12pt ; + line-height : 14.4pt; max-width : 50em ; padding : 1em ; /* text-align : justify ; */ + text-align : justify ; /* hyphens : manual ; */ /* text-justify : inter-word ; */ } -document>metadata { - font-family : "Lucida Console", "DejaVu Sans Mono", monospace ; +document>metadata, context|div.document context|div.metadata { + font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; margin-bottom : 2em ; } -document>metadata>metavariable[name="title"]:before { +document>metadata>metavariable[name="title"]:before, + context|div.document context|div.metadata context|div.metavariable.name-title:before { content : "title\00A0\00A0\00A0:\00A0" ; } -document>metadata>metavariable[name="author"]:before { - content : "author\00A0\00A0:\00A0" ; +document>metadata>metavariable[name="author"]:before, + context|div.document context|div.metadata context|div.metavariable.name-author:before { + content : "author\00A0\00A0:\00A0" ; } -document>metadata>metavariable[name="version"]:before { +document>metadata>metavariable[name="version"]:before, + context|div.document context|div.metadata context|div.metavariable.name-version:before { content : "version\00A0:\00A0" ; } -document>metadata>metavariable[name="title"], document>metadata>metavariable[name="author"], document>metadata>metavariable[name="version"] { +document>metadata>metavariable[name="title"], document>metadata>metavariable[name="author"], document>metadata>metavariable[name="version"], + context|div.document context|div.metadata context|div.metavariable.name-title, context|div.document context|div.metadata context|div.metavariable.name-author, context|div.document context|div.metadata context|div.metavariable.name-version { display : block ; } /* paragraph : mixed */ /* p : mixed */ -paragraph, p { +paragraph, p, context|div.paragraph, context|div.p { display : block ; margin-top : 0.5em ; margin-bottom : 0.5em ; @@ -73,7 +108,7 @@ paragraph, p { /* break : display */ -break { +break, context|div.break { display : block ; margin-bottom : 0.5em ; } @@ -81,14 +116,15 @@ break { /* construct : inline */ /* highlight : inline */ -construct { +construct, context|div.construct { } -construct[detail="important"] { +construct[detail="important"], context|div.construct.important { font-weight : bold ; } -highlight { /* todo: style and color */ +highlight, context|div.highlight { /* todo: style and color */ + display : inline ; } /* section : display */ @@ -96,76 +132,95 @@ highlight { /* todo: style and color */ /* sectionnumber : mixed */ /* sectioncontent : display */ -section { +section, context|div.section { display : block ; } -sectioncontent { +sectioncontent, context|div.sectioncontent { display : block ; margin-top : 1em ; margin-bottom : 1em ; } -section[detail="chapter"], section[detail="title"] { - margin-top : 3em ; - margin-bottom : 2em ; +section[detail="chapter"], section[detail="title"], + context|div.section.chapter, context|div.section.title { + page-break-before : always ; + page-break-after : avoid ; + margin-top : 3em ; + margin-bottom : 2em ; } -section[detail="section"], section[detail="subject"] { - margin-top : 2.5em ; - margin-bottom : 2.5em ; +section[detail="section"], section[detail="subject"], + context|div.section.section, context|div.section.subject { + page-break-after : avoid ; + margin-top : 2.5em ; + margin-bottom : 2.5em ; } -section[detail="subsection"], section[detail="subsubject"] { - margin-top : 2em ; - margin-bottom : 2em ; +section[detail="subsection"], section[detail="subsubject"], + context|div.section.subsection, context|div.section.subsubject { + page-break-after : avoid ; + margin-top : 2em ; + margin-bottom : 2em ; } -section[detail="subsubsection"], section[detail="subsubsubject"] { - margin-top : 1em ; - margin-bottom : 0em ; +section[detail="subsubsection"], section[detail="subsubsubject"], + context|div.section.subsubsection, context|div.section.subsubsubject { + page-break-after : avoid ; + margin-top : 1em ; + margin-bottom : 0em ; } -section[detail="summary"], section[detail="subsummary"] { +section[detail="summary"], section[detail="subsummary"], + context|div.section.summary, context|div.section.subsummary { margin-top : 1em ; margin-bottom : 1em ; } -section[detail="chapter"]>sectionnumber { +section[detail="chapter"]>sectionnumber, + context|div.section.chapter context|div.sectionnumber { display : inline-block ; margin-right : 1em ; font-size : 3em ; font-weight : bold ; } -section[detail="chapter"]>sectiontitle, section[detail="title"]>sectiontitle { +section[detail="chapter"]>sectiontitle, section[detail="title"]>sectiontitle, + context|div.section.chapter context|div.sectiontitle, context|div.section.title context|div.sectiontitle { + display : inline-block ; font-size : 3em ; font-weight : bold ; } -section[detail="section"]>sectiontitle, section[detail="subject"]>sectiontitle { +section[detail="section"]>sectiontitle, section[detail="subject"]>sectiontitle, + context|div.section.section context|div.sectiontitle, context|div.section.subject context|div.sectiontitle { + display : inline-block ; font-size : 2.5em ; font-weight : bold ; } -section[detail="subsection"]>sectiontitle, section[detail="subsubject"]>sectiontitle{ +section[detail="subsection"]>sectiontitle, section[detail="subsubject"]>sectiontitle, + context|div.section.subsection context|div.sectiontitle, context|div.section.subsubject context|div.sectiontitle { + display : inline-block ; font-size : 2em ; font-weight : bold ; } -section[detail="subsubsection"]>sectiontitle, section[detail="subsubsubject"]>sectiontitle{ +section[detail="subsubsection"]>sectiontitle, section[detail="subsubsubject"]>sectiontitle, + context|div.section.subsubsection context|div.sectiontitle, context|div.section.subsubsubject context|div.sectiontitle { + display : inline-block ; font-size : 1em ; font-weight : bold ; } -section[detail="section"]>sectionnumber { +section[detail="section"]>sectionnumber, context|div.section.section context|div.sectionnumber { display : inline-block ; margin-right : 1em ; font-size : 2.5em ; font-weight : bold ; } -section[detail="summary"]>sectiontitle { +section[detail="summary"]>sectiontitle, context|div.section.summary context|div.sectiontitle { display : block ; margin-top : 1em ; margin-bottom : 1em ; @@ -175,21 +230,14 @@ section[detail="summary"]>sectiontitle { border-width : .15em; } -section[detail="subsection"]>sectionnumber { - display : inline-block ; - margin-right : 1em ; - font-size : 2em ; - font-weight : bold ; -} - -section[detail="subsection"]>sectionnumber { +section[detail="subsection"]>sectionnumber, context|div.section.subsection context|div.sectionnumber { display : inline-block ; margin-right : 1em ; font-size : 1em ; font-weight : bold ; } -section[detail="subsummary"]>sectiontitle { +section[detail="subsummary"]>sectiontitle, context|div.section.subsummary context|div.sectiontitle { display : block ; margin-top : 1em ; margin-bottom : 1em ; @@ -217,37 +265,37 @@ section[detail="subsummary"]>sectiontitle { glyphs : 'Α' 'B' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Μ' 'Ν' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Υ' 'Φ' 'Χ' 'Ψ' 'Ω' ; } -itemgroup { +itemgroup, context|div.itemgroup { display : block ; margin-bottom : 0.5em ; margin-top : 0.5em ; } -itemgroup[symbol="1"] { list-style-type : disc ; } -itemgroup[symbol="2"] { list-style-type : square ; } -itemgroup[symbol="3"] { list-style-type : square ; } -itemgroup[symbol="4"] { list-style-type : square ; } -itemgroup[symbol="5"] { list-style-type : circ ; } -itemgroup[symbol="a"] { list-style-type : lower-alpha ; } -itemgroup[symbol="A"] { list-style-type : alpha ; } -itemgroup[symbol="r"] { list-style-type : lower-roman ; } -itemgroup[symbol="R"] { list-style-type : upper-roman ; } -itemgroup[symbol="n"] { list-style-type : decimal ; } -itemgroup[symbol="g"] { list-style-type : lower-greek ; } -itemgroup[symbol="G"] { list-style-type : upper-greek ; } - -item { +itemgroup[symbol="1"], context|div.itemgroup.symbol-1 { list-style-type : disc ; } +itemgroup[symbol="2"], context|div.itemgroup.symbol-2 { list-style-type : square ; } +itemgroup[symbol="3"], context|div.itemgroup.symbol-3 { list-style-type : square ; } +itemgroup[symbol="4"], context|div.itemgroup.symbol-4 { list-style-type : square ; } +itemgroup[symbol="5"], context|div.itemgroup.symbol-5 { list-style-type : circ ; } +itemgroup[symbol="a"], context|div.itemgroup.symbol-a { list-style-type : lower-alpha ; } +itemgroup[symbol="A"], context|div.itemgroup.symbol-A { list-style-type : alpha ; } +itemgroup[symbol="r"], context|div.itemgroup.symbol-r { list-style-type : lower-roman ; } +itemgroup[symbol="R"], context|div.itemgroup.symbol-R { list-style-type : upper-roman ; } +itemgroup[symbol="n"], context|div.itemgroup.symbol-n { list-style-type : decimal ; } +itemgroup[symbol="g"], context|div.itemgroup.symbol-g { list-style-type : lower-greek ; } +itemgroup[symbol="G"], context|div.itemgroup.symbol-G { list-style-type : upper-greek ; } + +item, context|div.item { display : list-item ; margin-left : 1em ; margin-bottom : 0.5em ; margin-top : 0.5em ; } -itemtag { +itemtag, context|div.item { display: none ; } -itemcontent { +itemcontent, context|div.itemcontent { } /* description : display */ @@ -255,13 +303,14 @@ itemcontent { /* descriptioncontent : mixed */ /* descriptionsymbol : inline */ -description { +description, context|div.description { display : block ; margin-bottom : 1em ; margin-top : 1em ; } -descriptiontag { +descriptiontag, context|div.descriptiontag { + display : inline ; float : left ; clear : left ; margin-right : 1em ; @@ -269,10 +318,11 @@ descriptiontag { font-weight : bold ; } -descriptioncontent { +descriptioncontent, context|div.descriptioncontent { } -descriptionsymbol { +descriptionsymbol, context|div.descriptionsymbol { + display : inline ; } /* verbatimblock : display */ @@ -280,46 +330,47 @@ descriptionsymbol { /* verbatimline : mixed */ /* verbatim : inline */ -verbatimblock { +verbatimblock, context|div.verbatimblock { background-color : rgb(50%,50%,100%) ; display : block ; padding : 1em ; margin-bottom : 1em ; margin-top : 1em ; - font-family : "Lucida Console", "DejaVu Sans Mono", monospace ; + font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; } -verbatimlines+verbatimlines { +verbatimlines+verbatimlines, context|div.verbatimlines+context|div.verbatimlines { display : block ; margin-top : 1em ; } -verbatimline { +verbatimline, context|div.verbatimline { display : block ; white-space : pre-wrap ; } -verbatim { +verbatim, context|div.verbatim { + display : inline ; white-space : pre-wrap ; color : rgb(60%,60%,0%) ; - font-family : "Lucida Console", "DejaVu Sans Mono", monospace ; + font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; } /* lines : display */ /* line : mixed */ -lines { +lines, context|div.lines { display : block ; margin-bottom : 1em ; margin-top : 1em ; } -lines+lines { +lines+lines, context|div.lines+context|div.lines { display : block ; margin-top : 1em ; } -line { +line, context|div.line { display : block ; white-space : pre-wrap ; } @@ -327,7 +378,7 @@ line { /* synonym : inline */ /* sorting : inline */ -sorting, synonym { +sorting, synonym, context|div.sorting, context|div.synonym { display : inline ; font-variant : small-caps ; } @@ -342,41 +393,54 @@ sorting, synonym { /* registerpage : inline */ /* registerpagerange : mixed */ -register { +register, context|div.register { display: none ; } +registerlocation, context|div.registerlocation { + display: inline ; +} + +registerlocation:after, context|div.registerlocation:after { + content : "\25B6\00A0\00A0" ; + color : rgb(40%,40%,40%) ; + font-size : x-small ; + line-height : 0 ; + padding-top : 0.5ex ; + vertical-align : top ; +} + /* table : display */ /* tablerow : display */ /* tablecell : mixed */ -table { +table, context|div.table { display : table ; } -tablerow { +tablerow, context|div.tablerow { display : table-row ; } -tablecell[align="middle"] { +tablecell[align="middle"], context|div.tablecell.align-middle { display : table-cell ; text-align : center ; padding : .1em ; } -tablecell[align="flushleft"] { +tablecell[align="flushleft"], context|div.tablecell.align-flushleft { display : table-cell ; text-align : left ; padding : .1em ; } -tablecell[align="flushright"] { +tablecell[align="flushright"], context|div.tablecell.align-flushright { display : table-cell ; text-align : right ; padding : .1em ; } -tablecell { +tablecell, context|div.tablecell { display : table-cell ; text-align : left ; padding : .1em ; @@ -386,36 +450,40 @@ tablecell { /* tabulaterow : display */ /* tabulatecell : mixed */ -tabulate { +tabulate, context|div.tabulate { display : table ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -tabulaterow { +floatcontent>tabulate, context|div.floatcontent context|div.tabulate { + margin-left : 0em ; +} + +tabulaterow, context|div.tabulaterow { display : table-row ; } -tabulatecell[align="middle"] { +tabulatecell[align="middle"], context|div.tabulatecell.align-middle { display : table-cell ; text-align : center ; padding-right : 1em ; } -tabulatecell[align="flushleft"] { +tabulatecell[align="flushleft"], context|div.tabulatecell.align-flushleft { display : table-cell ; text-align : left ; padding-right : 1em ; } -tabulatecell[align="flushright"] { +tabulatecell[align="flushright"], context|div.tabulatecell.align-flushright { display : table-cell ; text-align : right ; padding-right : 1em ; } -tabulatecell { +tabulatecell, context|div.tabulatecell { display : table-cell ; text-align : left ; padding-right : 1em ; @@ -426,23 +494,23 @@ tabulatecell { /* combinationcontent : mixed */ /* combinationcaption : mixed */ -combination { +combination, context|div.combination { display : table ; margin-top : 0em ; margin-bottom : 0em ; } -combinationpair { +combinationpair, context|div.combinationpair { display : table-cell ; padding-right : 1em ; } -combinationcontent { +combinationcontent, context|div.combinationcontent { display : table-row ; text-align : center ; } -combinationcaption { +combinationcaption, context|div.combinationcaption { display : table-row ; padding-top : 1ex ; text-align : center ; @@ -456,36 +524,39 @@ combinationcaption { /* listdata : mixed */ /* listpage : mixed */ -list { +list, context|div.list { display : block ; } -listitem[detail="chapter"] { +listitem[detail="chapter"], context|div.listitem.chapter { display : block ; margin-top : 1em ; font-weight : bold ; } -listitem[detail="section"] { +listitem[detail="section"], context|div.listitem.section { display : block ; } -listitem[detail="subsection"] { +listitem[detail="subsection"], context|div.listitem.subsection { display : block ; + display : inline-block ; } -listtag { +listtag, context|div.listtag { display : inline-block ; width : 5em ; } -listcontent { +listcontent, context|div.listcontent { + display : inline-block ; } -listdata { +listdata, context|div.listdata { + display : inline-block ; } -listpage { +listpage, context|div.listpage { display : none ; } @@ -495,35 +566,43 @@ listpage { /* :lang(en) */ -delimited[detail="quotation"]:before, delimitedblock[detail="quotation"]:before { - content : "\201C" ; +delimited[detail="quotation"]:before, delimitedblock[detail="quotation"]:before, + context|div.delimited.quotation:before, context|div.delimitedblock.quotation:before { + /* content : "\201C" ; */ + font-style : italic ; } -delimited[detail="quotation"]:after, delimitedblock[detail="quotation"]:after { - content : "\201D" ; +delimited[detail="quotation"]:after, delimitedblock[detail="quotation"]:after, + context|div.delimited.quotation:after, context|div.delimitedblock.quotation:after { + /* content : "\201D" ; */ + font-style : italic ; } -delimited[detail="quote"]:before, delimitedblock[detail="quote"]:before { - content : "\2018" ; +delimited[detail="quote"]:before, delimitedblock[detail="quote"]:before, + context|div.delimited.quote:before, context|div.delimitedblock.quote:before { + /* content : "\2018" ; */ + font-style : italic ; } -delimited[detail="quote"]:after, delimitedblock[detail="quote"]:after { - content : "\2019" ; +delimited[detail="quote"]:after, delimitedblock[detail="quote"]:after, + context|div.delimited.quote:after, context|div.delimitedblock.quote:after { + /* content : "\2019" ; */ + font-style : italic ; } -delimited { +delimited, context|div.delimited { display : inline } -delimitedblock { +delimitedblock, context|div.delimitedblock { display : block } -subsentence:before, subsentence:after { +subsentence:before, subsentence:after, context|div.subsentence:before, context|div.subsentence:after { content : "\2014" ; } -subsentence { +subsentence, context|div.subsentence { display : inline } @@ -537,32 +616,36 @@ subsentence { /* floattext : mixed */ /* floatcontent : mixed */ -float { +float, context|div.float { display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -floatcaption { +floatcaption, context|div.floatcaption { display : block ; margin-top : 0.5em ; color : rgb(60%,60%,0%) ; } -floatlabel { +floatlabel, context|div.floatlabel { + display : inline-block ; font-weight : bold ; - margin-right : 1em ; + margin-right : 0.25em ; } -floatnumber { - font-weight : bold ; +floatnumber, context|div.floatnumber { + display : inline ; + font-weight : bold ; + margin-right : 0.25em ; } -floattext { +floattext, context|div.floattext { + display : inline ; } -floatcontent { +floatcontent, context|div.floatcontent { } /* image : mixed */ @@ -576,11 +659,11 @@ floatcontent { height : 5.994cm ; } */ -mpgraphic:before { /* does not work with empty element */ +mpgraphic:before, context|div.mpgraphic:before { /* does not work with empty element */ content : "[runtime metapost graphic]" ; } -mpgraphic { +mpgraphic, context|div.mpgraphic { display : inline ; } @@ -592,52 +675,68 @@ mpgraphic { /* formulanumber : mixed */ /* formulacontent : display */ -formula { +formula, context|div.formula { display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -subformula { /* todo */ +subformula, context|div.subformula { /* todo */ display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -formulaset { /* todo */ +formulaset, context|div.formulaset { /* todo */ display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -formulacaption { /* todo */ +formulacaption, context|div.formulacaption { /* todo */ display : block ; margin-top : 0.5em ; color : rgb(60%,60%,0%) ; } -formulalabel { +formulalabel, context|div.formulalabel { + display : inline ; font-weight : bold ; - margin-right : 1em ; + margin-right : .25em ; } -formulanumber { +formulanumber, context|div.formulanumber { + display : inline ; font-weight : bold ; } -formulacontent { +formulacontent, context|div.formulacontent { display : block ; } -/* link : inline */ +link, context|div.link { + display : inline ; +} /* margintextblock : inline */ /* margintext : inline */ -/* math : inline */ +margintext, context|div.margintext { + display : block ; + font-weight : bold ; + margin-top : 1em ; + margin-bottom : 1em ; +} + +margintext:before, context|div.margintext:before { + content : "\25B6\00A0\00A0" ; + color : rgb(40%,40%,40%) ; +} + +/* math : inline | display */ /* mn : mixed */ /* mi : mixed */ /* mo : mixed */ @@ -660,67 +759,86 @@ formulacontent { /* mtr : display */ /* mtd : display */ +context|div.math-inline { + display : inline ; + vertical-align : 0 ; /* this will be set directly */ +} + +context|div.math-display { + display : block ; + margin : 1ex 0ex 1em 3em ; +} + /* quantity : inline */ /* unit : inline */ /* number : inline */ -quantity { +quantity, context|div.quantity { + display : inline ; } -quantity>unit { +quantity>unit, context|div.quantity>context|div.unit { + display : inline ; } -quantity>number { +quantity>number, context|div.quantity>context|div.number { + display : inline ; } /* sub : inline */ /* sup : inline */ /* subsup : inline */ -sup { +sup, context|div.sup { + display : inline-block ; font-size : xx-small ; - line-height : 0 ; - vertical-align : top ; + vertical-align : super ; } -sub { +sub, context|div.sub { + display : inline-block ; font-size : xx-small ; - line-height : 0 ; - vertical-align : bottom ; + vertical-align : sub ; } - -subsup>sup { +subsup>sup, context|div.subsup>context|div.sup { + display : inline ; vertical-align : top ; } -subsup>sub { +subsup>sub, context|div.subsup>context|div.sub { + display : inline ; vertical-align : bottom ; } -/* xhtml */ +/* links */ -a[href] { - text-decoration : none ; - color : inherit ; -} - -a[href]:hover { - color : rgb(50%,0%,0%) ; - text-decoration : underline ; +context|div[href]:hover { + color : rgb(50%,0%,0%) ; + background-color : rgb(85%,85%,85%) ; } /* setups */ -setup { - display : block ; +setup, context|div.setup { + display : block ; } -comment { +comment, context|div.comment { background-color : rgb(50%,75%,100%) ; display : block ; padding : 1em ; - margin-bottom : 1em ; - margin-top : 1em ; - font-family : "Lucida Console", "DejaVu Sans Mono", monospace ; + margin-bottom : 2ex ; + margin-top : 2ex ; + font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; +} + +/* special */ + +c, context|div.c { + display : inline ; +} + +warning, context|div.warning { + display : none ; } diff --git a/Master/texmf-dist/tex/context/base/export-example.tex b/Master/texmf-dist/tex/context/base/export-example.tex index 3a70b92fdaa..32cb79c5ea2 100644 --- a/Master/texmf-dist/tex/context/base/export-example.tex +++ b/Master/texmf-dist/tex/context/base/export-example.tex @@ -9,9 +9,7 @@ hyphen=yes] \setupbackend - [export=export-example.xml, - xhtml=export-example.xhtml, - css=export-example.css] + [export=yes] % \setupalign % [flushleft] diff --git a/Master/texmf-dist/tex/context/base/file-ini.lua b/Master/texmf-dist/tex/context/base/file-ini.lua index 3314bb33dfb..2a0271a9d80 100644 --- a/Master/texmf-dist/tex/context/base/file-ini.lua +++ b/Master/texmf-dist/tex/context/base/file-ini.lua @@ -11,29 +11,42 @@ if not modules then modules = { } end modules ['file-ini'] = { . These methods have counterparts at the end.

--ldx]]-- + +local implement = interfaces.implement +local setmacro = interfaces.setmacro +local setcount = interfaces.setcount + resolvers.jobs = resolvers.jobs or { } -local texsetcount = tex.setcount +local filenametotable = file.nametotable +local findtexfile = resolvers.findtexfile -local context_setvalue = context.setvalue local commands_doifelse = commands.doifelse -function commands.splitfilename(fullname) - local t = file.nametotable(fullname) - local path = t.path - texsetcount("splitoffkind",(path == "" and 0) or (path == '.' and 1) or 2) - context_setvalue("splitofffull",fullname) - context_setvalue("splitoffpath",path) - context_setvalue("splitoffname",t.name) - context_setvalue("splitoffbase",t.base) - context_setvalue("splitofftype",t.suffix) +local function splitfilename(full) + local split = filenametotable(full) + local path = split.path + setcount("splitoffkind",(path == "" and 0) or (path == '.' and 1) or 2) + setmacro("splitofffull",full or "") + setmacro("splitoffpath",path or "") + setmacro("splitoffname",split.name or "") + setmacro("splitoffbase",split.base or "") + setmacro("splitofftype",split.suffix or "") end -function commands.doifparentfileelse(n) - commands_doifelse(n == environment.jobname or n == environment.jobname .. '.tex' or n == environment.outputfilename) +local function isparentfile(name) + return + name == environment.jobname + or name == environment.jobname .. '.tex' + or name == environment.outputfilename end -function commands.doiffileexistelse(name) - local foundname = resolvers.findtexfile(name) - commands_doifelse(foundname and foundname ~= "") +local function istexfile(name) + local name = name and findtexfile(name) + return name ~= "" and name end + +implement { name = "splitfilename", actions = splitfilename, arguments = "string" } +implement { name = "doifelseparentfile", actions = { isparentfile, commands_doifelse }, arguments = "string" } +implement { name = "doifelsepathexist", actions = { lfs.isdir, commands_doifelse }, arguments = "string" } +implement { name = "doifelsefileexist", actions = { istexfile, commands_doifelse }, arguments = "string" } diff --git a/Master/texmf-dist/tex/context/base/file-ini.mkvi b/Master/texmf-dist/tex/context/base/file-ini.mkvi index 989241dd1a7..cb9f18cf962 100644 --- a/Master/texmf-dist/tex/context/base/file-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/file-ini.mkvi @@ -103,11 +103,11 @@ \the\everystartreadingfile \pushcatcodetable % saveguard \setcatcodetable\ctxcatcodes - \ctxcommand{pushregime()}}% temporarily this way + \clf_pushregime}% temporarily this way \unexpanded\def\stopreadingfile {\popcatcodetable % saveguard - \ctxcommand{popregime()}% temporarily this way + \clf_popregime % temporarily this way \the\everystopreadingfile \global\advance\readingfilelevel\minusone} @@ -125,7 +125,7 @@ \def\inputgivenfile#name{\normalinput{#name}} %D \macros -%D {doiffileelse} +%D {doifelsefile} %D %D The next alternative only looks if a file is present. No %D loading is done. This one obeys the standard \TEX\ lookup. @@ -134,11 +134,19 @@ %D \doiffileelse {filename} {found} {not found} %D \stoptyping -\def\doiffileexistselse#name{\ctxcommand{doiffileexistelse([[#name]])}} +\unexpanded\def\doifelsefile {\clf_doifelsefileexist} +\unexpanded\def\doifelsepath {\clf_doifelsepathexist} +\unexpanded\def\doiffile #name{\clf_doifelsefileexist{#name}\firstofoneargument\gobbleoneargument} +\unexpanded\def\doifnotfile #name{\clf_doifelsefileexist{#name}\gobbleoneargument\firstofoneargument} -\def\doiffileelse {\doiffileexistselse} -\def\doiffile #name{\doiffileexistselse{#name}\firstofoneargument\gobbleoneargument} -\def\doifnotfile #name{\doiffileexistselse{#name}\gobbleoneargument\firstofoneargument} +\let\doiffileelse\doifelsefile +\let\doifpathelse\doifelsepath + +\let\doifelsefileexists\doifelsefile +\let\doifelsepathexists\doifelsepath + +\let\doiffileexistselse\doifelsefileexists +\let\doifpathexistselse\doifelsepathexists %D \macros %D {doifparentfileelse} @@ -149,7 +157,9 @@ \ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi -\def\doifparentfileelse#name{\ctxcommand{doifparentfileelse([[#name]])}} +\unexpanded\def\doifelseparentfile{\clf_doifelseparentfile} + +\let\doifparentfileelse\doifelseparentfile %D \macros %D {splitfilename} @@ -185,7 +195,7 @@ \let\splitoffname\empty \let\splitofftype\empty -\def\splitfilename#name{\ctxcommand{splitfilename([[#name]])}} +\unexpanded\def\splitfilename{\clf_splitfilename} %D \macros %D {doonlyonce, doinputonce, doendinputonce} @@ -216,7 +226,7 @@ \fi} \unexpanded\def\doinputonce#name% - {\doonlyonce{#name}{\doiffileelse{#name}{\inputgivenfile{#name}}\donothing}} + {\doonlyonce{#name}{\doifelsefile{#name}{\inputgivenfile{#name}}\donothing}} \unexpanded\def\doendinputonce#name% {\ifcsname\??fileonce#name\endcsname diff --git a/Master/texmf-dist/tex/context/base/file-job.lua b/Master/texmf-dist/tex/context/base/file-job.lua index c88eb7e9de1..3a034f0a33e 100644 --- a/Master/texmf-dist/tex/context/base/file-job.lua +++ b/Master/texmf-dist/tex/context/base/file-job.lua @@ -11,15 +11,20 @@ if not modules then modules = { } end modules ['file-job'] = { local gsub, match, find = string.gsub, string.match, string.find local insert, remove, concat = table.insert, table.remove, table.concat -local validstring = string.valid +local validstring, formatters = string.valid, string.formatters local sortedhash = table.sortedhash -local formatters = string.formatters -local commands, resolvers, context = commands, resolvers, context +local commands = commands +local resolvers = resolvers +local context = context -local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end) +local ctx_doifelse = commands.doifelse -local report_jobfiles = logs.reporter("system","jobfiles") +local implement = interfaces.implement + +local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end) + +local report_jobfiles = logs.reporter("system","jobfiles") local texsetcount = tex.setcount local elements = interfaces.elements @@ -42,6 +47,16 @@ local is_qualified_path = file.is_qualified_path local cleanpath = resolvers.cleanpath local inputstack = resolvers.inputstack +local resolveprefix = resolvers.resolve + +local hasscheme = url.hasscheme + +local jobresolvers = resolvers.jobs + +local registerextrapath = resolvers.registerextrapath +local resetextrapath = resolvers.resetextrapath +local pushextrapath = resolvers.pushextrapath +local popextrapath = resolvers.popextrapath local v_outer = variables.outer local v_text = variables.text @@ -56,7 +71,7 @@ local c_prefix = variables.prefix local function findctxfile(name) -- loc ? any ? if is_qualified_path(name) then -- maybe when no suffix do some test for tex return name - elseif not url.hasscheme(name) then + elseif not hasscheme(name) then return resolvers.finders.byscheme("loc",name) or "" else return resolvers.findtexfile(name) or "" @@ -65,44 +80,94 @@ end resolvers.findctxfile = findctxfile -function commands.processfile(name) - name = findctxfile(name) - if name ~= "" then - context.input(name) +implement { + name = "processfile", + arguments = "string", + actions = function(name) + name = findctxfile(name) + if name ~= "" then + context.input(name) + end end -end +} -function commands.doifinputfileelse(name) - commands.doifelse(findctxfile(name) ~= "") -end +implement { + name = "doifelseinputfile", + arguments = "string", + actions = function(name) + ctx_doifelse(findctxfile(name) ~= "") + end +} -function commands.locatefilepath(name) - context(dirname(findctxfile(name))) -end +implement { + name = "locatefilepath", + arguments = "string", + actions = function(name) + context(dirname(findctxfile(name))) + end +} -function commands.usepath(paths) - resolvers.registerextrapath(paths) -end +implement { + name = "usepath", + arguments = "string", + actions = function(paths) + report_jobfiles("using path: %s",paths) + registerextrapath(paths) + end +} -function commands.usesubpath(subpaths) - resolvers.registerextrapath(nil,subpaths) -end +implement { + name = "pushpath", + arguments = "string", + actions = function(paths) + report_jobfiles("pushing path: %s",paths) + pushextrapath(paths) + end +} -function commands.allinputpaths() - context(concat(resolvers.instance.extra_paths or { },",")) -end +implement { + name = "poppath", + actions = function(paths) + popextrapath() + report_jobfiles("popping path") + end +} -function commands.setdocumentfilenames() - environment.initializefilenames() -end +implement { + name = "usesubpath", + arguments = "string", + actions = function(subpaths) + report_jobfiles("using subpath: %s",subpaths) + registerextrapath(nil,subpaths) + end +} -function commands.usezipfile(name,tree) - if tree and tree ~= "" then - resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree)) - else - resolvers.usezipfile(formatters["zip:///%s"](name)) +implement { + name = "resetpath", + actions = function() + report_jobfiles("resetting path") + resetextrapath() end -end +} + +implement { + name = "allinputpaths", + actions = function() + context(concat(resolvers.instance.extra_paths or { },",")) + end +} + +implement { + name = "usezipfile", + arguments = { "string", "string" }, + actions = function(name,tree) + if tree and tree ~= "" then + resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree)) + else + resolvers.usezipfile(formatters["zip:///%s"](name)) + end + end +} local report_system = logs.reporter("system") @@ -113,7 +178,7 @@ local luapatterns = { "%s" .. utilities.lua.suffixes.luc, "%s.lua" } local cldpatterns = { "%s.cld" } local xmlpatterns = { "%s.xml" } -local uselibrary = commands.uselibrary +local uselibrary = resolvers.uselibrary local input = context.input -- status @@ -124,23 +189,36 @@ local processstack = { } local processedfile = "" local processedfiles = { } -function commands.processedfile() - context(processedfile) -end +implement { + name = "processedfile", + actions = function() + context(processedfile) + end +} -function commands.processedfiles() - context(concat(processedfiles,",")) -end +implement { + name = "processedfiles", + actions = function() + context(concat(processedfiles,",")) + end +} -function commands.dostarttextfile(name) - insert(processstack,name) - processedfile = name - insert(processedfiles,name) -end +implement { + name = "dostarttextfile", + arguments = "string", + actions = function(name) + insert(processstack,name) + processedfile = name + insert(processedfiles,name) + end +} -function commands.dostoptextfile() - processedfile = remove(processstack) or "" -end +implement { + name = "dostoptextfile", + actions = function() + processedfile = remove(processstack) or "" + end +} local function startprocessing(name,notext) if not notext then @@ -158,6 +236,11 @@ end -- +local typestack = { } +local currenttype = v_text + +-- + local action = function(name,foundname) input(foundname) end local failure = function(name,foundname) report_jobfiles("unknown %s file %a","tex",name) end @@ -216,11 +299,6 @@ local function usexmlfile(name,onlyonce,notext) stopprocessing(notext) end -commands.usetexfile = usetexfile -commands.useluafile = useluafile -commands.usecldfile = usecldfile -commands.usexmlfile = usexmlfile - local suffixes = { mkvi = usetexfile, mkiv = usetexfile, @@ -233,21 +311,36 @@ local suffixes = { } local function useanyfile(name,onlyonce) - local s = suffixes[file.suffix(name)] + local s = suffixes[suffixonly(name)] + context(function() resolvers.pushpath(name) end) if s then - s(removesuffix(name),onlyonce) + -- s(removesuffix(name),onlyonce) + s(name,onlyonce) -- so, first with suffix, then without else usetexfile(name,onlyonce) -- e.g. ctx file ---~ resolvers.readfilename(name) + -- resolvers.readfilename(name) end + context(resolvers.poppath) end -commands.useanyfile = useanyfile +implement { name = "usetexfile", actions = usetexfile, arguments = "string" } +implement { name = "useluafile", actions = useluafile, arguments = "string" } +implement { name = "usecldfile", actions = usecldfile, arguments = "string" } +implement { name = "usexmlfile", actions = usexmlfile, arguments = "string" } + +implement { name = "usetexfileonce", actions = usetexfile, arguments = { "string", true } } +implement { name = "useluafileonce", actions = useluafile, arguments = { "string", true } } +implement { name = "usecldfileonce", actions = usecldfile, arguments = { "string", true } } +implement { name = "usexmlfileonce", actions = usexmlfile, arguments = { "string", true } } -function resolvers.jobs.usefile(name,onlyonce,notext) - local s = suffixes[file.suffix(name)] +implement { name = "useanyfile", actions = useanyfile, arguments = "string" } +implement { name = "useanyfileonce", actions = useanyfile, arguments = { "string", true } } + +function jobresolvers.usefile(name,onlyonce,notext) + local s = suffixes[suffixonly(name)] if s then - s(removesuffix(name),onlyonce,notext) + -- s(removesuffix(name),onlyonce,notext) + s(name,onlyonce,notext) -- so, first with suffix, then without end end @@ -262,6 +355,8 @@ local function startstoperror() startstoperror = dummyfunction end +local stopped + local function starttext() if textlevel == 0 then if trace_jobfiles then @@ -275,73 +370,86 @@ local function starttext() end local function stoptext() - if textlevel == 0 then - startstoperror() - elseif textlevel > 0 then - textlevel = textlevel - 1 - end - texsetcount("global","textlevel",textlevel) - if textlevel <= 0 then - if trace_jobfiles then - report_jobfiles("stopping text") + if not stopped then + if textlevel == 0 then + startstoperror() + elseif textlevel > 0 then + textlevel = textlevel - 1 + end + texsetcount("global","textlevel",textlevel) + if textlevel <= 0 then + if trace_jobfiles then + report_jobfiles("stopping text") + end + context.dostoptext() + -- registerfileinfo[end]jobfilename + context.finalend() + stopped = true end - context.dostoptext() - -- registerfileinfo[end]jobfilename - context.finalend() - commands.stoptext = dummyfunction end end -commands.starttext = starttext -commands.stoptext = stoptext +implement { name = "starttext", actions = starttext } +implement { name = "stoptext", actions = stoptext } -function commands.forcequitjob(reason) - if reason then - report_system("forcing quit: %s",reason) - else - report_system("forcing quit") +implement { + name = "forcequitjob", + arguments = "string", + actions = function(reason) + if reason then + report_system("forcing quit: %s",reason) + else + report_system("forcing quit") + end + context.batchmode() + while textlevel >= 0 do + context.stoptext() + end end - context.batchmode() - while textlevel >= 0 do +} + +implement { + name = "forceendjob", + actions = function() + report_system([[don't use \end to finish a document]]) context.stoptext() end -end - -function commands.forceendjob() - report_system([[don't use \end to finish a document]]) - context.stoptext() -end +} -function commands.autostarttext() - if textlevel == 0 then - report_system([[auto \starttext ... \stoptext]]) +implement { + name = "autostarttext", + actions = function() + if textlevel == 0 then + report_system([[auto \starttext ... \stoptext]]) + end + context.starttext() end - context.starttext() -end +} -commands.autostoptext = stoptext +implement { + name = "autostoptext", + actions = stoptext +} -- project structure -function commands.processfilemany(name) - useanyfile(name,false) -end - -function commands.processfileonce(name) - useanyfile(name,true) -end - -function commands.processfilenone(name) - -- skip file -end - --- +implement { + name = "processfilemany", + arguments = { "string", false }, + actions = useanyfile +} -local typestack = { } -local pathstack = { } +implement { + name = "processfileonce", + arguments = { "string", true }, + actions = useanyfile +} -local currenttype = v_text -local currentpath = "." +implement { + name = "processfilenone", + arguments = "string", + actions = dummyfunction, +} local tree = { type = "text", name = "", branches = { } } local treestack = { } @@ -401,10 +509,11 @@ luatex.registerstopactions(function() logspoptarget() end) -job.structure = job.structure or { } -job.structure.collected = job.structure.collected or { } -job.structure.tobesaved = root -job.structure.components = { } +local jobstructure = job.structure or { } +job.structure = jobstructure +jobstructure.collected = jobstructure.collected or { } +jobstructure.tobesaved = root +jobstructure.components = { } local function initialize() local function collect(root,result) @@ -420,7 +529,7 @@ local function initialize() end return result end - job.structure.components = collect(job.structure.collected,{}) + jobstructure.components = collect(jobstructure.collected,{}) end job.register('job.structure.collected',root,initialize) @@ -432,48 +541,67 @@ local context_processfilemany = context.processfilemany local context_processfileonce = context.processfileonce local context_processfilenone = context.processfilenone +-- we need a plug in the nested loaded, push pop pseudo current dir + +local function processfilecommon(name,action) + -- experiment, might go away +-- if not hasscheme(name) then +-- local path = dirname(name) +-- if path ~= "" then +-- registerextrapath(path) +-- report_jobfiles("adding search path %a",path) +-- end +-- end + -- till here + action(name) +end + +local function processfilemany(name) processfilecommon(name,context_processfilemany) end +local function processfileonce(name) processfilecommon(name,context_processfileonce) end +local function processfilenone(name) processfilecommon(name,context_processfilenone) end + local processors = utilities.storage.allocate { -- [v_outer] = { - -- [v_text] = { "many", context_processfilemany }, - -- [v_project] = { "once", context_processfileonce }, - -- [v_environment] = { "once", context_processfileonce }, - -- [v_product] = { "once", context_processfileonce }, - -- [v_component] = { "many", context_processfilemany }, + -- [v_text] = { "many", processfilemany }, + -- [v_project] = { "once", processfileonce }, + -- [v_environment] = { "once", processfileonce }, + -- [v_product] = { "once", processfileonce }, + -- [v_component] = { "many", processfilemany }, -- }, [v_text] = { - [v_text] = { "many", context_processfilemany }, - [v_project] = { "once", context_processfileonce }, -- dubious - [v_environment] = { "once", context_processfileonce }, - [v_product] = { "many", context_processfilemany }, -- dubious - [v_component] = { "many", context_processfilemany }, + [v_text] = { "many", processfilemany }, + [v_project] = { "once", processfileonce }, -- dubious + [v_environment] = { "once", processfileonce }, + [v_product] = { "many", processfilemany }, -- dubious + [v_component] = { "many", processfilemany }, }, [v_project] = { - [v_text] = { "many", context_processfilemany }, - [v_project] = { "none", context_processfilenone }, - [v_environment] = { "once", context_processfileonce }, - [v_product] = { "none", context_processfilenone }, - [v_component] = { "none", context_processfilenone }, + [v_text] = { "many", processfilemany }, + [v_project] = { "none", processfilenone }, + [v_environment] = { "once", processfileonce }, + [v_product] = { "none", processfilenone }, + [v_component] = { "none", processfilenone }, }, [v_environment] = { - [v_text] = { "many", context_processfilemany }, - [v_project] = { "none", context_processfilenone }, - [v_environment] = { "once", context_processfileonce }, - [v_product] = { "none", context_processfilenone }, - [v_component] = { "none", context_processfilenone }, + [v_text] = { "many", processfilemany }, + [v_project] = { "none", processfilenone }, + [v_environment] = { "once", processfileonce }, + [v_product] = { "none", processfilenone }, + [v_component] = { "none", processfilenone }, }, [v_product] = { - [v_text] = { "many", context_processfilemany }, - [v_project] = { "once", context_processfileonce }, - [v_environment] = { "once", context_processfileonce }, - [v_product] = { "many", context_processfilemany }, - [v_component] = { "many", context_processfilemany }, + [v_text] = { "many", processfilemany }, + [v_project] = { "once", processfileonce }, + [v_environment] = { "once", processfileonce }, + [v_product] = { "many", processfilemany }, + [v_component] = { "many", processfilemany }, }, [v_component] = { - [v_text] = { "many", context_processfilemany }, - [v_project] = { "once", context_processfileonce }, - [v_environment] = { "once", context_processfileonce }, - [v_product] = { "none", context_processfilenone }, - [v_component] = { "many", context_processfilemany }, + [v_text] = { "many", processfilemany }, + [v_project] = { "once", processfileonce }, + [v_environment] = { "once", processfileonce }, + [v_product] = { "none", processfilenone }, + [v_component] = { "many", processfilemany }, } } @@ -493,7 +621,7 @@ local stop = { [v_component] = context.stoptext, } -resolvers.jobs.processors = processors +jobresolvers.processors = processors local function topofstack(what) local stack = stacks[what] @@ -520,22 +648,22 @@ local function justacomponent() end end -resolvers.jobs.productcomponent = productcomponent -resolvers.jobs.justacomponent = justacomponent +jobresolvers.productcomponent = productcomponent +jobresolvers.justacomponent = justacomponent -function resolvers.jobs.currentproject () return topofstack(v_project ) end -function resolvers.jobs.currentproduct () return topofstack(v_product ) end -function resolvers.jobs.currentcomponent () return topofstack(v_component ) end -function resolvers.jobs.currentenvironment() return topofstack(v_environment) end +function jobresolvers.currentproject () return topofstack(v_project ) end +function jobresolvers.currentproduct () return topofstack(v_product ) end +function jobresolvers.currentcomponent () return topofstack(v_component ) end +function jobresolvers.currentenvironment() return topofstack(v_environment) end local done = { } -local tolerant = false -- too messy, mkii user with the wrong sructure should adapt +local tolerant = false -- too messy, mkii user with the wrong structure should adapt local function process(what,name) local depth = #typestack local process -- - name = resolvers.resolve(name) + name = resolveprefix(name) -- -- if not tolerant then -- okay, would be best but not compatible with mkii @@ -589,10 +717,10 @@ local function process(what,name) end end -function commands.useproject (name) process(v_project, name) end -function commands.useenvironment(name) process(v_environment,name) end -function commands.useproduct (name) process(v_product, name) end -function commands.usecomponent (name) process(v_component, name) end +implement { name = "useproject", actions = function(name) process(v_project, name) end, arguments = "string" } +implement { name = "useenvironment", actions = function(name) process(v_environment,name) end, arguments = "string" } +implement { name = "useproduct", actions = function(name) process(v_product, name) end, arguments = "string" } -- will be overloaded +implement { name = "usecomponent", actions = function(name) process(v_component, name) end, arguments = "string" } -- todo: setsystemmode to currenttype -- todo: make start/stop commands at the tex end @@ -614,9 +742,7 @@ local stop = { local function gotonextlevel(what,name) -- todo: something with suffix name insert(stacks[what],name) insert(typestack,currenttype) - insert(pathstack,currentpath) currenttype = what - currentpath = dirname(name) pushtree(what,name) if start[what] then start[what]() @@ -628,7 +754,6 @@ local function gotopreviouslevel(what) stop[what]() end poptree() - currentpath = remove(pathstack) or "." currenttype = remove(typestack) or v_text remove(stacks[what]) -- not currenttype ... weak recovery -- context.endinput() -- does not work @@ -642,20 +767,20 @@ local function autoname(name) return name end -function commands.startproject (name) gotonextlevel(v_project, autoname(name)) end -function commands.startproduct (name) gotonextlevel(v_product, autoname(name)) end -function commands.startcomponent (name) gotonextlevel(v_component, autoname(name)) end -function commands.startenvironment(name) gotonextlevel(v_environment,autoname(name)) end +implement { name = "startproject", actions = function(name) gotonextlevel(v_project, autoname(name)) end, arguments = "string" } +implement { name = "startproduct", actions = function(name) gotonextlevel(v_product, autoname(name)) end, arguments = "string" } +implement { name = "startcomponent", actions = function(name) gotonextlevel(v_component, autoname(name)) end, arguments = "string" } +implement { name = "startenvironment", actions = function(name) gotonextlevel(v_environment,autoname(name)) end, arguments = "string" } -function commands.stopproject () gotopreviouslevel(v_project ) end -function commands.stopproduct () gotopreviouslevel(v_product ) end -function commands.stopcomponent () gotopreviouslevel(v_component ) end -function commands.stopenvironment() gotopreviouslevel(v_environment) end +implement { name = "stopproject", actions = function() gotopreviouslevel(v_project ) end } +implement { name = "stopproduct", actions = function() gotopreviouslevel(v_product ) end } +implement { name = "stopcomponent", actions = function() gotopreviouslevel(v_component ) end } +implement { name = "stopenvironment", actions = function() gotopreviouslevel(v_environment) end } -function commands.currentproject () context(topofstack(v_project )) end -function commands.currentproduct () context(topofstack(v_product )) end -function commands.currentcomponent () context(topofstack(v_component )) end -function commands.currentenvironment() context(topofstack(v_environment)) end +implement { name = "currentproject", actions = function() context(topofstack(v_project )) end } +implement { name = "currentproduct", actions = function() context(topofstack(v_product )) end } +implement { name = "currentcomponent", actions = function() context(topofstack(v_component )) end } +implement { name = "currentenvironment", actions = function() context(topofstack(v_environment)) end } -- -- -- this will move -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -684,7 +809,7 @@ local function convertexamodes(str) end end -function commands.loadexamodes(filename) +function environment.loadexamodes(filename) if not filename or filename == "" then filename = removesuffix(tex.jobname) end @@ -697,6 +822,12 @@ function commands.loadexamodes(filename) end end +implement { + name = "loadexamodes", + actions = environment.loadexamodes, + arguments = "string" +} + -- changed in mtx-context -- code moved from luat-ini @@ -739,20 +870,50 @@ function document.setfilename(i,name) end end -function document.getargument(key,default) -- commands +function document.getargument(key,default) local v = document.arguments[key] if type(v) == "boolean" then v = (v and "yes") or "no" document.arguments[key] = v end - context(v or default or "") + return v or default or "" end -function document.getfilename(i) -- commands - context(document.files[tonumber(i)] or "") +function document.getfilename(i) + return document.files[tonumber(i)] or "" end -function commands.getcommandline() -- has to happen at the tex end in order to expand +implement { + name = "setdocumentargument", + actions = document.setargument, + arguments = { "string", "string" } +} + +implement { + name = "setdocumentdefaultargument", + actions = document.setdefaultargument, + arguments = { "string", "string" } +} + +implement { + name = "setdocumentfilename", + actions = document.setfilename, + arguments = { "integer", "string" } +} + +implement { + name = "getdocumentargument", + actions = { document.getargument, context }, + arguments = { "string", "string" } +} + +implement { + name = "getdocumentfilename", + actions = { document.getfilename, context }, + arguments = "integer" +} + +function document.setcommandline() -- has to happen at the tex end in order to expand -- the document[arguments|files] tables are copies @@ -891,21 +1052,36 @@ local function apply(list,action) end end -function commands.setdocumentmodes() -- was setup: *runtime:modes +function document.setmodes() -- was setup: *runtime:modes apply(document.options.ctxfile .modes,context.enablemode) apply(document.options.commandline.modes,context.enablemode) end -function commands.setdocumentmodules() -- was setup: *runtime:modules +function document.setmodules() -- was setup: *runtime:modules apply(document.options.ctxfile .modules,context.usemodule) apply(document.options.commandline.modules,context.usemodule) end -function commands.setdocumentenvironments() -- was setup: *runtime:environments +function document.setenvironments() -- was setup: *runtime:environments apply(document.options.ctxfile .environments,context.environment) apply(document.options.commandline.environments,context.environment) end +function document.setfilenames() + local initialize = environment.initializefilenames + if initialize then + initialize() + else + -- fatal error + end +end + +implement { name = "setdocumentcommandline", actions = document.setcommandline, onlyonce = true } +implement { name = "setdocumentmodes", actions = document.setmodes, onlyonce = true } +implement { name = "setdocumentmodules", actions = document.setmodules, onlyonce = true } +implement { name = "setdocumentenvironments", actions = document.setenvironments, onlyonce = true } +implement { name = "setdocumentfilenames", actions = document.setfilenames, onlyonce = true } + local report_files = logs.reporter("system","files") local report_options = logs.reporter("system","options") local report_file = logs.reporter("used file") @@ -936,16 +1112,24 @@ luatex.registerstopactions(function() logsnewline() report_options("start commandline options") logsnewline() - for argument, value in sortedhash(arguments) do - report_option("%s=%A",argument,value) + if arguments and next(arguments) then + for argument, value in sortedhash(arguments) do + report_option("%s=%A",argument,value) + end + else + report_file("no arguments") end logsnewline() report_options("stop commandline options") logsnewline() report_options("start commandline files") logsnewline() - for i=1,#files do - report_file("% 4i: %s",i,files[i]) + if files and #files > 0 then + for i=1,#files do + report_file("% 4i: %s",i,files[i]) + end + else + report_file("no files") end logsnewline() report_options("stop commandline files") @@ -1009,15 +1193,20 @@ if environment.initex then end -function commands.doifelsecontinuewithfile(inpname,basetoo) - local inpnamefull = addsuffix(inpname,"tex") - local inpfilefull = addsuffix(environment.inputfilename,"tex") - local continue = inpnamefull == inpfilefull - if basetoo and not continue then - continue = inpnamefull == basename(inpfilefull) - end - if continue then - report_system("continuing input file %a",inpname) +implement { + name = "doifelsecontinuewithfile", + arguments = "string", + actions = function(inpname,basetoo) + local inpnamefull = addsuffix(inpname,"tex") + local inpfilefull = addsuffix(environment.inputfilename,"tex") + local continue = inpnamefull == inpfilefull + -- if basetoo and not continue then + if not continue then + continue = inpnamefull == basename(inpfilefull) + end + if continue then + report_system("continuing input file %a",inpname) + end + ctx_doifelse(continue) end - commands.doifelse(continue) -end +} diff --git a/Master/texmf-dist/tex/context/base/file-job.mkvi b/Master/texmf-dist/tex/context/base/file-job.mkvi index 5f646ed289c..7814aba3f62 100644 --- a/Master/texmf-dist/tex/context/base/file-job.mkvi +++ b/Master/texmf-dist/tex/context/base/file-job.mkvi @@ -21,29 +21,59 @@ % processing -\unexpanded\def\doifinputfileelse#name% - {\ctxcommand{doifinputfileelse("#name")}} +\unexpanded\def\doifelseinputfile#name% + {\clf_doifelseinputfile{#name}} + +\let\doifinputfileelse\doifelseinputfile \unexpanded\def\processfile#name% - {\ctxcommand{processfile("#name")}} + {\clf_processfile{#name}} % path control +%D In the following example the lookup order is \type {.}, {/foo}, \type +%D {foo/bar} as one can always explicitly prefix a wanted file. +%D +%D \starttyping +%D \pushpath[foo] +%D \pushpath[foo/bar] +%D \input test +%D \poppath +%D \poppath +%D \stoptyping + \unexpanded\def\usepath[#path]% - {\ctxcommand{usepath("#path")}} + {\clf_usepath{#path}} \unexpanded\def\usesubpath[#path]% - {\ctxcommand{usesubpath("#path")}} + {\clf_usesubpath{#path}} + +\unexpanded\def\pushpath[#path]% + {\clf_pushpath{#path}} + +\unexpanded\def\poppath + {\clf_poppath} + +\unexpanded\def\resetpath % not the pushed paths + {\clf_resetpath} \def\allinputpaths - {\ctxcommand{allinputpaths()}} + {\clf_allinputpaths} % helper (not really needed nowadays) \let\locatedfilepath\empty \unexpanded\def\locatefilepath#name% no [] ? - {\edef\locatedfilepath{\ctxcommand{locatefilepath("#name")}}} + {\edef\locatedfilepath{\clf_locatefilepath{#name}}} + +% % maybe: +% +% % \dirlist{c:/data/temporary/foo}{images/bar.jpg} +% % \dirfile{c:/data/temporary/foo}{images/bar.jpg} +% +% \def\dirlist#1#2{dirlist://#1/**/#2} +% \def\dirfile#1#2{dirlist://#1/**/#2?option=fileonly} % zip files are tree'd @@ -51,7 +81,7 @@ {\dodoubleempty\syst_files_use_zip_file} \def\syst_files_use_zip_file[#zipname][#subtree]% - {\ctxcommand{usezipfile("#zipname","#subtree")}} + {\clf_usezipfile{#zipname}{#subtree}} % exa stuff might become obsolete: @@ -59,7 +89,7 @@ {\dosingleempty\syst_files_load_exa_modes} \def\syst_files_load_exa_modes[#name]% - {\ctxcommand{loadexamodes("#name")}} + {\clf_loadexamodes{#name}} % runtime files (maybe also do this in lua?) @@ -77,14 +107,6 @@ \def\syst_files_load_indeed#name% from now on we assume a suffix to be part of the name {\readsysfile{#name}{\showmessage\m!system2{#name}}\donothing} -% obsolete, but we keep it as reference of what happened -% -% \unexpanded\def\loadoptionfile -% {\readjobfile{\jobname.\f!optionextension} -% {\writestatus\m!system{\jobname.\f!optionextension\space loaded}% -% \ctxcommand{copyfiletolog("\jobname.\f!optionextension")}}% -% {\writestatus\m!system{no \jobname.\f!optionextension}}} - % document structure \ifdefined\textlevel \else \newcount\textlevel \fi % might go away @@ -105,15 +127,15 @@ \global\everybye\emptytoks \the\everygoodbye \global\everygoodbye\emptytoks - \doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing + \doifelsesometoks\everynotabene{\writeline\the\everynotabene\writeline}\donothing \normalend} % tex's \end -\unexpanded\def\starttext {\ctxcommand{starttext()}} -\unexpanded\def\stoptext {\ctxcommand{stoptext()}} -\unexpanded\def\forcequitjob {\ctxcommand{forcequitjob()}} -\unexpanded\def\end {\ctxcommand{forceendjob()}} -\unexpanded\def\autostarttext{\ctxcommand{autostarttext()}} -\unexpanded\def\autostoptext {\ctxcommand{autostoptext()}} +\unexpanded\def\starttext {\clf_starttext} +\unexpanded\def\stoptext {\clf_stoptext} +\unexpanded\def\forcequitjob {\clf_forcequitjob} +\unexpanded\def\end {\clf_forceendjob} +\unexpanded\def\autostarttext{\clf_autostarttext} +\unexpanded\def\autostoptext {\clf_autostoptext} \unexpanded\def\finishjob{\stoptext} % nicer in luatex call commandline @@ -125,39 +147,39 @@ % protect structure -\unexpanded\def\processfilemany#name{\ctxcommand{processfilemany("#name")}} -\unexpanded\def\processfileonce#name{\ctxcommand{processfileonce("#name")}} -\unexpanded\def\processfilenone#name{\ctxcommand{processfilenone("#name")}} +\unexpanded\def\processfilemany#name{\clf_processfilemany{#name}} +\unexpanded\def\processfileonce#name{\clf_processfileonce{#name}} +\unexpanded\def\processfilenone#name{\clf_processfilenone{#name}} -\unexpanded\def\project {\doifnextoptionalcselse\useproject \syst_structure_arg_project} -\unexpanded\def\product {\doifnextoptionalcselse\useproduct \syst_structure_arg_product} -\unexpanded\def\component {\doifnextoptionalcselse\usecomponent \syst_structure_arg_component} -\unexpanded\def\environment{\doifnextoptionalcselse\useenvironment\syst_structure_arg_environment} +\unexpanded\def\project {\doifelsenextoptionalcs\useproject \syst_structure_arg_project} +\unexpanded\def\product {\doifelsenextoptionalcs\useproduct \syst_structure_arg_product} +\unexpanded\def\component {\doifelsenextoptionalcs\usecomponent \syst_structure_arg_component} +\unexpanded\def\environment{\doifelsenextoptionalcs\useenvironment\syst_structure_arg_environment} -\def\syst_structure_arg_project #name {\ctxcommand{useproject ("#name")}} -\def\syst_structure_arg_product #name {\ctxcommand{useproduct ("#name")}} -\def\syst_structure_arg_component #name {\ctxcommand{usecomponent ("#name")}} -\def\syst_structure_arg_environment#name {\ctxcommand{useenvironment("#name")}} +\def\syst_structure_arg_project #name {\clf_useproject {#name}} +\def\syst_structure_arg_product #name {\clf_useproduct {#name}} +\def\syst_structure_arg_component #name {\clf_usecomponent {#name}} +\def\syst_structure_arg_environment#name {\clf_useenvironment{#name}} -\unexpanded\def\startproject {\doifnextoptionalcselse\syst_structure_start_opt_project \syst_structure_start_arg_project } -\unexpanded\def\startproduct {\doifnextoptionalcselse\syst_structure_start_opt_product \syst_structure_start_arg_product } -\unexpanded\def\startcomponent {\doifnextoptionalcselse\syst_structure_start_opt_component \syst_structure_start_arg_component } -\unexpanded\def\startenvironment{\doifnextoptionalcselse\syst_structure_start_opt_environment\syst_structure_start_arg_environment} +\unexpanded\def\startproject {\doifelsenextoptionalcs\syst_structure_start_opt_project \syst_structure_start_arg_project } +\unexpanded\def\startproduct {\doifelsenextoptionalcs\syst_structure_start_opt_product \syst_structure_start_arg_product } +\unexpanded\def\startcomponent {\doifelsenextoptionalcs\syst_structure_start_opt_component \syst_structure_start_arg_component } +\unexpanded\def\startenvironment{\doifelsenextoptionalcs\syst_structure_start_opt_environment\syst_structure_start_arg_environment} -\def\syst_structure_start_arg_project #name {\ctxcommand{startproject ("#name")}} -\def\syst_structure_start_arg_product #name {\ctxcommand{startproduct ("#name")}} -\def\syst_structure_start_arg_component #name {\ctxcommand{startcomponent ("#name")}} -\def\syst_structure_start_arg_environment#name {\ctxcommand{startenvironment("#name")}} +\def\syst_structure_start_arg_project #name {\clf_startproject {#name}} +\def\syst_structure_start_arg_product #name {\clf_startproduct {#name}} +\def\syst_structure_start_arg_component #name {\clf_startcomponent {#name}} +\def\syst_structure_start_arg_environment#name {\clf_startenvironment{#name}} -\unexpanded\def\useproject [#name]{\ctxcommand{useproject ("#name")}} -\unexpanded\def\useproduct [#name]{\ctxcommand{useproduct ("#name")}} -\unexpanded\def\usecomponent [#name]{\ctxcommand{usecomponent ("#name")}} -\unexpanded\def\useenvironment[#name]{\ctxcommand{useenvironment("#name")}} +\unexpanded\def\useproject [#name]{\clf_useproject {#name}} +\unexpanded\def\useproduct [#name]{\clf_useproduct {#name}} +\unexpanded\def\usecomponent [#name]{\clf_usecomponent {#name}} +\unexpanded\def\useenvironment[#name]{\clf_useenvironment{#name}} -\unexpanded\def\syst_structure_start_opt_project [#name]{\ctxcommand{startproject ("#name")}} -\unexpanded\def\syst_structure_start_opt_product [#name]{\ctxcommand{startproduct ("#name")}} -\unexpanded\def\syst_structure_start_opt_component [#name]{\ctxcommand{startcomponent ("#name")}} -\unexpanded\def\syst_structure_start_opt_environment[#name]{\ctxcommand{startenvironment("#name")}} +\unexpanded\def\syst_structure_start_opt_project [#name]{\clf_startproject {#name}} +\unexpanded\def\syst_structure_start_opt_product [#name]{\clf_startproduct {#name}} +\unexpanded\def\syst_structure_start_opt_component [#name]{\clf_startcomponent {#name}} +\unexpanded\def\syst_structure_start_opt_environment[#name]{\clf_startenvironment{#name}} \newconditional\endofinput % hack, needed because \endinput happens one level down in the input when we write from lua @@ -170,34 +192,35 @@ \endinput \fi} -\unexpanded\def\stopproject {\ctxcommand{stopproject ()}\honorendofinput} -\unexpanded\def\stopproduct {\ctxcommand{stopproduct ()}\honorendofinput} -\unexpanded\def\stopcomponent {\ctxcommand{stopcomponent ()}\honorendofinput} -\unexpanded\def\stopenvironment {\ctxcommand{stopenvironment()}\honorendofinput} +\unexpanded\def\stopproject {\clf_stopproject \honorendofinput} +\unexpanded\def\stopproduct {\clf_stopproduct \honorendofinput} +\unexpanded\def\stopcomponent {\clf_stopcomponent \honorendofinput} +\unexpanded\def\stopenvironment {\clf_stopenvironment\honorendofinput} -\def\currentproject {\ctxcommand{currentproject ()}} -\def\currentproduct {\ctxcommand{currentproduct ()}} -\def\currentcomponent {\ctxcommand{currentcomponent ()}} -\def\currentenvironment {\ctxcommand{currentenvironment()}} -\def\processedfile {\ctxcommand{processedfile()}} -\def\processedfiles {\ctxcommand{processedfiles()}} + \let\currentproject \clf_currentproject + \let\currentproduct \clf_currentproduct + \let\currentcomponent \clf_currentcomponent + \let\currentenvironment \clf_currentenvironment + \let\processedfile \clf_processedfile + \let\processedfiles \clf_processedfiles -\unexpanded\def\dostarttextfile #name{\ctxcommand{dostarttextfile(name)}} -\unexpanded\def\dostoptextfile {\ctxcommand{dostoptextfile()}} +\unexpanded\def\dostarttextfile #name{\clf_dostarttextfile{name}} +\unexpanded\def\dostoptextfile {\clf_dostoptextfile} -\unexpanded\def\loadtexfile [#name]{\ctxcommand{usetexfile("#name")}} -\unexpanded\def\loadluafile [#name]{\ctxcommand{useluafile("#name")}} -\unexpanded\def\loadcldfile [#name]{\ctxcommand{usecldfile("#name")}} -\unexpanded\def\loadanyfile [#name]{\ctxcommand{useanyfile("#name")}} +\unexpanded\def\loadtexfile [#name]{\clf_usetexfile{#name}} +\unexpanded\def\loadluafile [#name]{\clf_useluafile{#name}} +\unexpanded\def\loadcldfile [#name]{\clf_usecldfile{#name}} +\unexpanded\def\loadanyfile [#name]{\clf_useanyfile{#name}} -\unexpanded\def\loadtexfileonce [#name]{\ctxcommand{usetexfile("#name",true)}} -\unexpanded\def\loadluafileonce [#name]{\ctxcommand{useluafile("#name",true)}} -\unexpanded\def\loadcldfileonce [#name]{\ctxcommand{usecldfile("#name",true)}} -\unexpanded\def\loadanyfileonce [#name]{\ctxcommand{useanyfile("#name",true)}} +\unexpanded\def\loadtexfileonce [#name]{\clf_usetexfileonce{#name}} +\unexpanded\def\loadluafileonce [#name]{\clf_useluafileonce{#name}} +\unexpanded\def\loadcldfileonce [#name]{\clf_usecldfileonce{#name}} +\unexpanded\def\loadanyfileonce [#name]{\clf_useanyfileonce{#name}} %D Handy for modules that have a test/demo appended (true added). -\unexpanded\def\continueifinputfile#name{\ctxcommand{doifelsecontinuewithfile("#name",true)}\relax\endinput} % we cannot do \endinput via lua +\unexpanded\def\continueifinputfile#name% + {\clf_doifelsecontinuewithfile{#name}\relax\endinput} % we cannot do \endinput via lua % \startproject test % 1: \startmode[*project] project \stopmode \endgraf @@ -233,13 +256,13 @@ \newsystemmode\v!environment \unexpanded\def\startprojectindeed - {\starttext + {%starttext \pushsystemmode\v!project \setsystemmode\v!project} \unexpanded\def\stopprojectindeed {\popsystemmode\v!project - \stoptext + %stoptext \signalendofinput\v!project} \unexpanded\def\startproductindeed diff --git a/Master/texmf-dist/tex/context/base/file-lib.lua b/Master/texmf-dist/tex/context/base/file-lib.lua index 3311321c521..361608ea3cf 100644 --- a/Master/texmf-dist/tex/context/base/file-lib.lua +++ b/Master/texmf-dist/tex/context/base/file-lib.lua @@ -9,10 +9,18 @@ if not modules then modules = { } end modules ['file-lib'] = { -- todo: check all usage of truefilename at the tex end and remove -- files there (and replace definitions by full names) -local format = string.format +local format, gsub = string.format, string.gsub -local trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end) -local report_files = logs.reporter("files","readfile") +local trace_libraries = false trackers.register("resolvers.libraries", function(v) trace_libraries = v end) +----- trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end) + +local report_library = logs.reporter("files","library") +----- report_files = logs.reporter("files","readfile") + +local suffixonly = file.suffix +local removesuffix = file.removesuffix + +local getreadfilename = resolvers.getreadfilename local loaded = { } local defaultpatterns = { "%s" } @@ -25,7 +33,7 @@ local function defaultfailure(name) report_files("asked name %a, not found",name) end -function commands.uselibrary(specification) -- todo; reporter +function resolvers.uselibrary(specification) -- todo: reporter local name = specification.name if name and name ~= "" then local patterns = specification.patterns or defaultpatterns @@ -34,32 +42,49 @@ function commands.uselibrary(specification) -- todo; reporter local onlyonce = specification.onlyonce local files = utilities.parsers.settings_to_array(name) local truename = environment.truefilename - local done = false + local function found(filename) + local somename = truename and truename(filename) or filename + local foundname = getreadfilename("any",".",somename) -- maybe some day also an option not to backtrack .. and ../.. (or block global) + return foundname ~= "" and foundname + end for i=1,#files do local filename = files[i] - if not loaded[filename] then + if loaded[filename] then + -- next one + else if onlyonce then loaded[filename] = true -- todo: base this on return value end - for i=1,#patterns do - local somename = format(patterns[i],filename) - if truename then - somename = truename(somename) + local foundname = nil + local barename = removesuffix(filename) + -- direct search (we have an explicit suffix) + if barename ~= filename then + foundname = found(filename) + if trace_libraries then + report_library("checking %a: %s",filename,foundname or "not found") end - local foundname = resolvers.getreadfilename("any",".",somename) or "" - if foundname ~= "" then - action(name,foundname) - done = true - break + end + if not foundname then + -- pattern based search + for i=1,#patterns do + local wanted = format(patterns[i],barename) + foundname = found(wanted) + if trace_libraries then + report_library("checking %a as %a: %s",filename,wanted,foundname or "not found") + end + if foundname then + break + end end end - if done then - break + if foundname then + action(name,foundname) + elseif failure then + failure(name) end end end - if failure and not done then - failure(name) - end end end + +commands.uselibrary = resolvers.uselibrary -- for the moment diff --git a/Master/texmf-dist/tex/context/base/file-mod.lua b/Master/texmf-dist/tex/context/base/file-mod.lua index 2f34d9dd2a9..7f3763c5ded 100644 --- a/Master/texmf-dist/tex/context/base/file-mod.lua +++ b/Master/texmf-dist/tex/context/base/file-mod.lua @@ -18,25 +18,41 @@ if not modules then modules = { } end modules ['file-mod'] = { at the side.

--ldx]]-- -local format, concat, tonumber = string.format, table.concat, tonumber +local format, find, concat, tonumber = string.format, string.find, table.concat, tonumber local trace_modules = false trackers .register("modules.loading", function(v) trace_modules = v end) local permit_unprefixed = false directives.register("modules.permitunprefixed", function(v) permit_unprefixed = v end) local report_modules = logs.reporter("resolvers","modules") -commands = commands or { } local commands = commands - local context = context +local implement = interfaces.implement local findbyscheme = resolvers.finders.byscheme -- use different one local iterator = utilities.parsers.iterator -- modules can have a specific suffix or can specify one -local prefixes = { "m", "p", "s", "x", "v", "t" } -local suffixes = { "mkvi", "mkiv", "tex", "cld", "lua" } -- order might change and how about cld +local prefixes = { + "m", -- module, extends functionality + "p", -- private code + "s", -- styles + "x", -- xml specific modules + -- "v", -- an old internal one for examples + "t", -- third party extensions +} + +-- the order might change and how about cld + +local suffixes = { + "mkvi", -- proprocessed mkiv files + "mkiv", -- mkiv files + "tex", -- normally source code files + "cld", -- context lua documents (often stand alone) + "lua", -- lua files +} + local modstatus = { } local function usemodule(name,hasscheme) @@ -80,11 +96,11 @@ local function usemodule(name,hasscheme) end end -function commands.usemodules(prefix,askedname,truename) +function environment.usemodules(prefix,askedname,truename) local truename = truename or environment.truefilename(askedname) local hasprefix = prefix and prefix ~= "" local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename - local status = modstatus[hashname] + local status = modstatus[hashname] or false -- yet unset if status == 0 then -- not found elseif status == 1 then @@ -118,9 +134,11 @@ function commands.usemodules(prefix,askedname,truename) end if status then -- ok, don't change - elseif not permit_unprefixed then - -- forget about it - elseif usemodule(truename) then + elseif find(truename,"%-") and usemodule(truename) then + -- assume a user namespace + report_modules("using user prefixed file %a",truename) + status = 1 + elseif permit_unprefixed and usemodule(truename) then report_modules("using unprefixed file %a",truename) status = 1 else @@ -165,23 +183,60 @@ end) -- moved from syst-lua.lua: -local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber) +local lpegmatch = lpeg.match +local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber) -function commands.doifolderversionelse(one,two) -- one >= two - if not two then +function environment.comparedversion(one,two) -- one >= two + if not two or two == "" then one, two = environment.version, one elseif one == "" then one = environment.version end - one = lpeg.match(splitter,one) - two = lpeg.match(splitter,two) + one = lpegmatch(splitter,one) + two = lpegmatch(splitter,two) one = (one[1] or 0) * 10000 + (one[2] or 0) * 100 + (one[3] or 0) two = (two[1] or 0) * 10000 + (two[2] or 0) * 100 + (two[3] or 0) - commands.doifelse(one>=two) + if one < two then + return -1 + elseif one > two then + return 1 + else + return 0 + end end -function commands.useluamodule(list) +environment.comparedversion = comparedversion + + +function environment.useluamodule(list) for filename in iterator(list) do environment.loadluafile(filename) end end + +local strings = interfaces.strings + +implement { + name = "usemodules", + actions = environment.usemodules, + arguments = strings[2] +} + +implement { + name = "doifelseolderversion", + actions = function(one,two) commands.doifelse(comparedversion(one,two) >= 0) end, + arguments = strings[2] +} + +implement { + name = "useluamodule", + actions = environment.useluamodule, + arguments = "string" +} + +implement { + name = "loadluamodule", + actions = function(name) dofile(resolvers.findctxfile(name)) end, -- hack + arguments = "string" +} + diff --git a/Master/texmf-dist/tex/context/base/file-mod.mkvi b/Master/texmf-dist/tex/context/base/file-mod.mkvi index 1591a69cc15..f043a68e875 100644 --- a/Master/texmf-dist/tex/context/base/file-mod.mkvi +++ b/Master/texmf-dist/tex/context/base/file-mod.mkvi @@ -37,39 +37,6 @@ \let\usemodule \usemodules \let\usetexmodule\usemodules -% \def\strc_modules_use[#category][#name][#parameters]% -% {\pushmacro\currentmodule -% \pushmacro\currentmoduleparameters -% \let\currentmoduleparameters\empty -% \ifthirdargument -% \singleexpandafter\strc_modules_use_a -% \else\ifsecondargument -% \doubleexpandafter\strc_modules_use_b -% \else -% \doubleexpandafter\strc_modules_use_c -% \fi\fi -% % here we load -% \popmacro\currentmoduleparameters -% \popmacro\currentmodule} -% -% \def\strc_modules_use_a[#category][#name][#parameters]% -% {\doifsomething{#name} -% {\def\currentmoduleparameters{#parameters}% -% \processcommalist[#name]{\strc_modules_use_indeed{#category}}}} -% -% \def\strc_modules_use_b[#category][#name][#parameters]% -% {\doifsomething{#name} -% {\doifassignmentelse{#name} -% {\def\currentmoduleparameters{#name}% -% \processcommalist[#category]{\strc_modules_use_indeed\empty}} -% {\processcommalist[#name]{\strc_modules_use_indeed{#category}}}}} -% -% \def\strc_modules_use_c[#category][#name][#parameters]% -% {\processcommalist[#category]{\strc_modules_use_indeed\empty}} -% -% \def\strc_modules_use_indeed#category#name% -% {\ctxcommand{usemodules("#category","#name","\truefilename{#name}")}} - \def\strc_modules_use[#category][#name][#parameters]% category=t|m|x|p|... {\pushmacro\currentmodule \pushmacro\currentmodulecategory @@ -79,7 +46,7 @@ \edef\currentmodule {#name}% \def \currentmoduleparameters{#parameters}% \else\ifsecondargument - \doifassignmentelse{#name} + \doifelseassignment{#name} {\let\currentmodulecategory \empty \edef\currentmodule {#category}% \edef\currentmoduleparameters{#name}} @@ -96,8 +63,8 @@ \popmacro\currentmodulecategory \popmacro\currentmodule} -\def\strc_modules_use_indeed#category#name% truefilename moved to lua end - {\ctxcommand{usemodules("#category","#name")}} % ,"\truefilename{#name}")}} +\def\strc_modules_use_indeed#category#name% + {\clf_usemodules{#category}{#name}} \installcorenamespace{module} @@ -107,7 +74,7 @@ \newtoks\everysetupmodule \unexpanded\def\startmodule - {\doifnextoptionalcselse\syst_modules_start_yes\syst_modules_start_nop} + {\doifelsenextoptionalcs\syst_modules_start_yes\syst_modules_start_nop} \def\syst_modules_start_yes[#name]% {\pushmacro\currentmodule @@ -157,8 +124,8 @@ \def\currentmoduleparameter{\moduleparameter\currentmodule} % no need for inlining -\unexpanded\def\useluamodule [#name]{\ctxlua{dofile(resolvers.findctxfile("#name"))}} -\unexpanded\def\luaenvironment #name {\ctxlua{dofile(resolvers.findctxfile("#name"))}} +\unexpanded\def\useluamodule [#name]{\clf_loadluamodule{#1}} % why not use useluamodule +\unexpanded\def\luaenvironment #name {\clf_loadluamodule{#1}} % \usemodule[newmml] % \usemodule[newmml][a=b] @@ -238,10 +205,13 @@ %D %D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional). -\unexpanded\def\doifolderversionelse#parent#child{\ctxcommand{doifolderversionelse("#parent","#child")}} -\unexpanded\def\doifoldercontextelse #child{\ctxcommand{doifolderversionelse("#child")}} +\unexpanded\def\doifelseolderversion#parent#child{\clf_doifelseolderversion{#parent}{#child}} +\unexpanded\def\doifelseoldercontext #child{\clf_doifelseolderversion{#child}{}} + +\let\doifolderversionelse\doifelseolderversion +\let\doifoldercontextelse\doifelseoldercontext -%D Relatively new: +%D Relatively new (no need for a speedup here): \unexpanded\def\syst_modules_direct_lua#1#2% {\edef\m_module_command_command {#1}% @@ -284,8 +254,8 @@ \ctxlua{#2(\!!bs#3\!!es,\!!bs#4\!!es)}% \directsetup{module:#1:stop}} -\def\installmodulecommandluaone #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_one_lua {\strippedcsname#1}{#2}}}} -\def\installmodulecommandluatwo #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_two_lua {\strippedcsname#1}{#2}}}} +\def\installmodulecommandluaone#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_one_lua{\strippedcsname#1}{#2}}}} +\def\installmodulecommandluatwo#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_two_lua{\strippedcsname#1}{#2}}}} % obsolete % @@ -299,6 +269,6 @@ % new: -\unexpanded\def\useluamodule[#1]{\ctxcommand{useluamodule("#1")}} +\unexpanded\def\useluamodule[#1]{\clf_useluamodule{#1}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/file-res.lua b/Master/texmf-dist/tex/context/base/file-res.lua index 9ae7a6b061b..08a3e22af8f 100644 --- a/Master/texmf-dist/tex/context/base/file-res.lua +++ b/Master/texmf-dist/tex/context/base/file-res.lua @@ -17,7 +17,10 @@ local report_files = logs.reporter("files","readfile") resolvers.maxreadlevel = 2 -directives.register("resolvers.maxreadlevel", function(v) resolvers.maxreadlevel = tonumber(v) or resolvers.maxreadlevel end) +directives.register("resolvers.maxreadlevel", function(v) + -- resolvers.maxreadlevel = (v == false and 0) or (v == true and 2) or tonumber(v) or 2 + resolvers.maxreadlevel = v == false and 0 or tonumber(v) or 2 +end) local finders, loaders, openers = resolvers.finders, resolvers.loaders, resolvers.openers @@ -131,7 +134,7 @@ openers.fix = openers.file loaders.fix = loaders.file openers.set = openers.file loaders.set = loaders.file openers.any = openers.file loaders.any = loaders.file -function getreadfilename(scheme,path,name) -- better do a split and then pass table +local function getreadfilename(scheme,path,name) -- better do a split and then pass table local fullname if hasscheme(name) or is_qualified_path(name) then fullname = name @@ -146,16 +149,24 @@ end resolvers.getreadfilename = getreadfilename -function commands.getreadfilename(scheme,path,name) - context(getreadfilename(scheme,path,name)) -end - -- a name belonging to the run but also honoring qualified -function commands.locfilename(name) - context(getreadfilename("loc",".",name)) -end +local implement = interfaces.implement -function commands.doiflocfileelse(name) - commands.doifelse(isfile(getreadfilename("loc",".",name))) -end +implement { + name = "getreadfilename", + actions = { getreadfilename, context }, + arguments = { "string", "string", "string" } +} + +implement { + name = "locfilename", + actions = { getreadfilename, context }, + arguments = { "'loc'","'.'", "string" }, +} + +implement { + name = "doifelselocfile", + actions = { getreadfilename, isfile, commands.doifelse }, + arguments = { "'loc'","'.'", "string" }, +} diff --git a/Master/texmf-dist/tex/context/base/file-res.mkvi b/Master/texmf-dist/tex/context/base/file-res.mkvi index 5162e63bee3..17f4cf44c5c 100644 --- a/Master/texmf-dist/tex/context/base/file-res.mkvi +++ b/Master/texmf-dist/tex/context/base/file-res.mkvi @@ -70,7 +70,7 @@ \let\readfilename\empty \def\syst_files_read_file#protocol#path#name% #true #false - {\edef\readfilename{\ctxcommand{getreadfilename("#protocol","#path","#name")}}% + {\edef\readfilename{\clf_getreadfilename{#protocol}{#path}{#name}}% \ifx\readfilename\empty \expandafter\secondoftwoarguments \else @@ -145,7 +145,9 @@ %D \doiflocfileelse {filename} {before loading} {not found} %D \stoptyping -\unexpanded\def\doiflocfileelse#name{\ctxcommand{doiflocfileelse([[#name]])}} - \def\locfilename #name{\ctxcommand{locfilename([[#name]])}} +\unexpanded\def\doifelselocfile#name{\clf_doifelselocfile{#name}} + \def\locfilename #name{\clf_locfilename {#name}} + +\let\doiflocfileelse\doifelselocfile \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/file-syn.lua b/Master/texmf-dist/tex/context/base/file-syn.lua index c1f9a5f4817..b6ad27c8325 100644 --- a/Master/texmf-dist/tex/context/base/file-syn.lua +++ b/Master/texmf-dist/tex/context/base/file-syn.lua @@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['file-syn'] = { license = "see context related readme files" } -local report_files = logs.reporter("files") environment.filesynonyms = environment.filesynonyms or { } local filesynonyms = environment.filesynonyms -local settings_to_array = utilities.parsers.settings_to_array -local findfile = resolvers.findfile +local settings_to_array = utilities.parsers.settings_to_array +local findfile = resolvers.findfile + +local implement = interfaces.implement + +local report_files = logs.reporter("files") storage.register("environment/filesynonyms", filesynonyms, "environment.filesynonyms") @@ -27,11 +30,7 @@ end environment.truefilename = truefilename -function commands.truefilename(name) - context(truefilename(name)) -end - -function commands.definefilesynonym(name,realname) +function environment.definefilesynonym(name,realname) local names = settings_to_array(name) for i=1,#names do local name = names[i] @@ -43,7 +42,7 @@ function commands.definefilesynonym(name,realname) end end -function commands.definefilefallback(name,alternatives) +function environment.definefilefallback(name,alternatives) local names = settings_to_array(alternatives) for i=1,#names do local realname = findfile(names[i]) @@ -53,3 +52,21 @@ function commands.definefilefallback(name,alternatives) end end end + +implement { + name = "truefilename", + actions = { truefilename, context }, + arguments = "string" +} + +implement { + name = "definefilesynonym", + actions = environment.definefilesynonym, + arguments = { "string", "string" } +} + +implement { + name = "definefilefallback", + actions = environment,definefilefallback, + arguments = { "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/file-syn.mkvi b/Master/texmf-dist/tex/context/base/file-syn.mkvi index b61bd8ae4d8..52ecd0d71e3 100644 --- a/Master/texmf-dist/tex/context/base/file-syn.mkvi +++ b/Master/texmf-dist/tex/context/base/file-syn.mkvi @@ -46,8 +46,8 @@ \unexpanded\def\definefilesynonym {\dodoubleempty \syst_files_define_synonym } \unexpanded\def\definefilefallback{\dodoubleargument\syst_files_define_fallback} % still used? -\def\syst_files_define_synonym [#name][#realname]{\ctxcommand{definefilesynonym ("#name","#realname")}} -\def\syst_files_define_fallback[#name][#alternatives]{\ctxcommand{definefilefallback("#name","#alternatives")}} +\def\syst_files_define_synonym [#name][#realname]{\clf_definefilesynonym {#name}{#realname}} +\def\syst_files_define_fallback[#name][#alternatives]{\clf_definefilefallback{#name}{#alternatives}} %D \macros %D {truefilename} @@ -61,6 +61,6 @@ %D %D The implementation shows that nesting is supported. -\def\truefilename#1{\ctxcommand{truefilename("#1")}} +\def\truefilename#1{\clf_truefilename{#1}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/font-afm.lua b/Master/texmf-dist/tex/context/base/font-afm.lua index 46ea8a42323..a96c6686e30 100644 --- a/Master/texmf-dist/tex/context/base/font-afm.lua +++ b/Master/texmf-dist/tex/context/base/font-afm.lua @@ -40,19 +40,26 @@ local trace_defining = false trackers.register("fonts.defining", function(v local report_afm = logs.reporter("fonts","afm loading") +local setmetatableindex = table.setmetatableindex + local findbinfile = resolvers.findbinfile local definers = fonts.definers local readers = fonts.readers local constructors = fonts.constructors +local fontloader = fontloader +local font_to_table = fontloader.to_table +local open_font = fontloader.open +local close_font = fontloader.close + local afm = constructors.newhandler("afm") local pfb = constructors.newhandler("pfb") local afmfeatures = constructors.newfeatures("afm") local registerafmfeature = afmfeatures.register -afm.version = 1.410 -- incrementing this number one up will force a re-cache +afm.version = 1.500 -- incrementing this number one up will force a re-cache afm.cache = containers.define("fonts", "afm", afm.version, true) afm.autoprefixed = true -- this will become false some day (catches texnansi-blabla.*) @@ -62,6 +69,8 @@ afm.addligatures = true -- best leave this set to true afm.addtexligatures = true -- best leave this set to true afm.addkerns = true -- best leave this set to true +local overloads = fonts.mappings.overloads + local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes local function setmode(tfmdata,value) @@ -218,10 +227,10 @@ end local function get_indexes(data,pfbname) data.resources.filename = resolvers.unresolve(pfbname) -- no shortcut - local pfbblob = fontloader.open(pfbname) + local pfbblob = open_font(pfbname) if pfbblob then local characters = data.characters - local pfbdata = fontloader.to_table(pfbblob) + local pfbdata = font_to_table(pfbblob) if pfbdata then local glyphs = pfbdata.glyphs if glyphs then @@ -247,7 +256,7 @@ local function get_indexes(data,pfbname) elseif trace_loading then report_afm("no data in pfb file %a",pfbname) end - fontloader.close(pfbblob) + close_font(pfbblob) elseif trace_loading then report_afm("invalid pfb file %a",pfbname) end @@ -315,7 +324,7 @@ by adding ligatures and kern information to the afm derived data. That way we can set them faster when defining a font.

--ldx]]-- -local addkerns, addligatures, addtexligatures, unify, normalize -- we will implement these later +local addkerns, addligatures, addtexligatures, unify, normalize, fixnames -- we will implement these later function afm.load(filename) -- hm, for some reasons not resolved yet @@ -362,6 +371,7 @@ function afm.load(filename) addkerns(data) end normalize(data) + fixnames(data) report_afm("add tounicode data") fonts.mappings.addtounicode(data,filename) data.size = size @@ -369,6 +379,7 @@ function afm.load(filename) data.pfbsize = pfbsize data.pfbtime = pfbtime report_afm("saving %a in cache",name) + data.resources.unicodes = nil -- consistent with otf but here we save not much data = containers.write(afm.cache, name, data) data = containers.read(afm.cache,name) end @@ -432,13 +443,29 @@ unify = function(data, filename) resources.filename = resolvers.unresolve(filename) -- no shortcut resources.unicodes = unicodes -- name to unicode resources.marks = { } -- todo - resources.names = names -- name to index + -- resources.names = names -- name to index resources.private = private end normalize = function(data) end +fixnames = function(data) + for k, v in next, data.descriptions do + local n = v.name + local r = overloads[n] + if r then + local name = r.name + if trace_indexing then + report_afm("renaming characters %a to %a",n,name) + end + v.name = name + v.unicode = r.unicode + end + end +end + + --[[ldx--

These helpers extend the basic table with extra ligatures, texligatures and extra kerns. This saves quite some lookups later.

@@ -449,7 +476,7 @@ local addthem = function(rawdata,ligatures) local descriptions = rawdata.descriptions local resources = rawdata.resources local unicodes = resources.unicodes - local names = resources.names + -- local names = resources.names for ligname, ligdata in next, ligatures do local one = descriptions[unicodes[ligname]] if one then @@ -608,8 +635,8 @@ local function copytotfm(data) local filename = constructors.checkedfilename(resources) local fontname = metadata.fontname or metadata.fullname local fullname = metadata.fullname or metadata.fontname - local endash = unicodes['space'] - local emdash = unicodes['emdash'] + local endash = 0x0020 -- space + local emdash = 0x2014 local spacer = "space" local spaceunits = 500 -- @@ -669,7 +696,7 @@ local function copytotfm(data) parameters.x_height = charxheight else -- same as otf - local x = unicodes['x'] + local x = 0x0078 -- x if x then local x = descriptions[x] if x then @@ -729,7 +756,34 @@ function afm.setfeatures(tfmdata,features) end end -local function checkfeatures(specification) +local function addtables(data) + local resources = data.resources + local lookuptags = resources.lookuptags + local unicodes = resources.unicodes + if not lookuptags then + lookuptags = { } + resources.lookuptags = lookuptags + end + setmetatableindex(lookuptags,function(t,k) + local v = type(k) == "number" and ("lookup " .. k) or k + t[k] = v + return v + end) + if not unicodes then + unicodes = { } + resources.unicodes = unicodes + setmetatableindex(unicodes,function(t,k) + setmetatableindex(unicodes,nil) + for u, d in next, data.descriptions do + local n = d.name + if n then + t[n] = u + end + end + return rawget(t,k) + end) + end + constructors.addcoreunicodes(unicodes) -- do we really need this? end local function afmtotfm(specification) @@ -759,6 +813,7 @@ local function afmtotfm(specification) if not tfmdata then local rawdata = afm.load(afmname) if rawdata and next(rawdata) then + addtables(rawdata) adddimensions(rawdata) tfmdata = copytotfm(rawdata) if tfmdata and next(tfmdata) then @@ -808,6 +863,7 @@ those that make sense for this format.

local function prepareligatures(tfmdata,ligatures,value) if value then local descriptions = tfmdata.descriptions + local hasligatures = false for unicode, character in next, tfmdata.characters do local description = descriptions[unicode] local dligatures = description.ligatures @@ -823,17 +879,20 @@ local function prepareligatures(tfmdata,ligatures,value) type = 0 } end + hasligatures = true end end + tfmdata.properties.hasligatures = hasligatures end end local function preparekerns(tfmdata,kerns,value) if value then - local rawdata = tfmdata.shared.rawdata - local resources = rawdata.resources - local unicodes = resources.unicodes + local rawdata = tfmdata.shared.rawdata + local resources = rawdata.resources + local unicodes = resources.unicodes local descriptions = tfmdata.descriptions + local haskerns = false for u, chr in next, tfmdata.characters do local d = descriptions[u] local newkerns = d[kerns] @@ -849,8 +908,10 @@ local function preparekerns(tfmdata,kerns,value) kerns[uk] = v end end + haskerns = true end end + tfmdata.properties.haskerns = haskerns end end diff --git a/Master/texmf-dist/tex/context/base/font-agl.lua b/Master/texmf-dist/tex/context/base/font-agl.lua index 5ee34b0287c..122d1adc2d1 100644 --- a/Master/texmf-dist/tex/context/base/font-agl.lua +++ b/Master/texmf-dist/tex/context/base/font-agl.lua @@ -656,12 +656,18 @@ end -- We load this table only when needed. We could use a loading mechanism -- return the table but there are no more vectors like this so why bother. +-- +-- Well, we currently hav ethis table preloaded anyway. -fonts.encodings = fonts.encodings or { } - -fonts.encodings.agl = { +local agl = { names = names, -- unicode -> name unicodes = unicodes, -- name -> unicode synonyms = synonyms, -- merged into the other two extras = extras, -- merged into the other two } + +fonts = fonts or { } +fonts.encodings = fonts.encodings or { } +fonts.encodings.agl = agl + +return agl diff --git a/Master/texmf-dist/tex/context/base/font-chk.lua b/Master/texmf-dist/tex/context/base/font-chk.lua index 591d59d6558..41205ce5ed7 100644 --- a/Master/texmf-dist/tex/context/base/font-chk.lua +++ b/Master/texmf-dist/tex/context/base/font-chk.lua @@ -17,6 +17,8 @@ local fastcopy = table.fastcopy local report_fonts = logs.reporter("fonts","checking") +local allocate = utilities.storage.allocate + local fonts = fonts fonts.checkers = fonts.checkers or { } @@ -44,6 +46,8 @@ local tasks = nodes.tasks local enableaction = tasks.enableaction local disableaction = tasks.disableaction +local implement = interfaces.implement + local glyph_code = nodes.nodecodes.glyph local nuts = nodes.nuts @@ -88,7 +92,7 @@ end fonts.loggers.onetimemessage = onetimemessage -local mapping = { -- this is just an experiment to illustrate some principles elsewhere +local mapping = allocate { -- this is just an experiment to illustrate some principles elsewhere lu = "placeholder uppercase red", ll = "placeholder lowercase red", lt = "placeholder uppercase red", @@ -113,9 +117,15 @@ local mapping = { -- this is just an experiment to illustrate some principles el so = "placeholder lowercase yellow", } -table.setmetatableindex(mapping,function(t,k) v = "placeholder unknown gray" t[k] = v return v end) +table.setmetatableindex(mapping, + function(t,k) + v = "placeholder unknown gray" + t[k] = v + return v + end +) -local fakes = { +local fakes = allocate { { name = "lowercase", code = ".025 -.175 m .425 -.175 l .425 .525 l .025 .525 l .025 -.175 l .025 0 l .425 0 l .025 -.175 m h S", @@ -153,7 +163,7 @@ local fakes = { }, } -local variants = { +local variants = allocate { { tag = "gray", r = .6, g = .6, b = .6 }, { tag = "red", r = .6, g = 0, b = 0 }, { tag = "green", r = 0, g = .6, b = 0 }, @@ -216,6 +226,28 @@ function commands.getplaceholderchar(name) context(helpers.getprivatenode(fontdata[id],name)) end +local function placeholder(font,char) + local tfmdata = fontdata[font] + local properties = tfmdata.properties + local privates = properties.privates + local category = chardata[char].category + local fakechar = mapping[category] + local p = privates and privates[fakechar] + if not p then + addmissingsymbols(tfmdata) + p = properties.privates[fakechar] + end + if properties.lateprivates then + -- frozen already + return "node", getprivatenode(tfmdata,fakechar) + else + -- good, we have \definefontfeature[default][default][missing=yes] + return "char", p + end +end + +checkers.placeholder = placeholder + function checkers.missing(head) local lastfont, characters, found = nil, nil, nil head = tonut(head) @@ -249,27 +281,15 @@ function checkers.missing(head) end elseif action == "replace" then for i=1,#found do - local n = found[i] - local font = getfont(n) - local char = getchar(n) - local tfmdata = fontdata[font] - local properties = tfmdata.properties - local privates = properties.privates - local category = chardata[char].category - local fakechar = mapping[category] - local p = privates and privates[fakechar] - if not p then - addmissingsymbols(tfmdata) - p = properties.privates[fakechar] - end - if properties.lateprivates then -- .frozen - -- bad, we don't have them at the tex end - local fake = getprivatenode(tfmdata,fakechar) - insert_node_after(head,n,fake) - head = remove_node(head,n,true) + local node = found[i] + local kind, char = placeholder(getfont(node),getchar(node)) + if kind == "node" then + insert_node_after(head,node,tonut(char)) + head = remove_node(head,node,true) + elseif kind == "char" then + setfield(node,"char",char) else - -- good, we have \definefontfeature[default][default][missing=yes] - setfield(n,"char",p) + -- error end end else @@ -278,13 +298,17 @@ function checkers.missing(head) return tonode(head), false end -local relevant = { "missing (will be deleted)", "missing (will be flagged)", "missing" } +local relevant = { + "missing (will be deleted)", + "missing (will be flagged)", + "missing" +} -function checkers.getmissing(id) +local function getmissing(id) if id then - local list = checkers.getmissing(font.current()) + local list = getmissing(font.current()) if list then - local _, list = next(checkers.getmissing(font.current())) + local _, list = next(getmissing(font.current())) return list else return { } @@ -314,6 +338,8 @@ function checkers.getmissing(id) end end +checkers.getmissing = getmissing + local tracked = false trackers.register("fonts.missing", function(v) @@ -329,24 +355,6 @@ trackers.register("fonts.missing", function(v) action = v end) -function commands.checkcharactersinfont() - enableaction("processors","fonts.checkers.missing") - tracked = true -end - -function commands.removemissingcharacters() - enableaction("processors","fonts.checkers.missing") - action = "remove" - tracked = true -end - -function commands.replacemissingcharacters() - enableaction("processors","fonts.checkers.missing") - action = "replace" - otffeatures.defaults.missing = true - tracked = true -end - local report_characters = logs.reporter("fonts","characters") local report_character = logs.reporter("missing") diff --git a/Master/texmf-dist/tex/context/base/font-chk.mkiv b/Master/texmf-dist/tex/context/base/font-chk.mkiv index 4572041c28e..4c8967532e8 100644 --- a/Master/texmf-dist/tex/context/base/font-chk.mkiv +++ b/Master/texmf-dist/tex/context/base/font-chk.mkiv @@ -21,11 +21,9 @@ % % \definefontfeature[default][default][missing=yes] % \enabletrackers[fonts.missing=replace] -% -% or better: -\unexpanded\def\checkcharactersinfont {\ctxcommand{checkcharactersinfont()}} -\unexpanded\def\removemissingcharacters {\ctxcommand{removemissingcharacters()}} -\unexpanded\def\replacemissingcharacters{\ctxcommand{replacemissingcharacters()}} +\unexpanded\def\checkcharactersinfont {\enabletrackers[fonts.missing]} +\unexpanded\def\removemissingcharacters {\enabletrackers[fonts.missing=remove]} +\unexpanded\def\replacemissingcharacters{\enabletrackers[fonts.missing=replace]} \endinput diff --git a/Master/texmf-dist/tex/context/base/font-cid.lua b/Master/texmf-dist/tex/context/base/font-cid.lua index e4b565313b4..0eaacdfbd54 100644 --- a/Master/texmf-dist/tex/context/base/font-cid.lua +++ b/Master/texmf-dist/tex/context/base/font-cid.lua @@ -74,7 +74,7 @@ local function loadcidfile(filename) ordering = ordering, filename = filename, unicodes = unicodes, - names = names + names = names, } end end @@ -112,15 +112,28 @@ function cid.getmap(specification) report_otf("invalid cidinfo specification, table expected") return end - local registry = specification.registry - local ordering = specification.ordering + local registry = specification.registry + local ordering = specification.ordering local supplement = specification.supplement - -- check for already loaded file - local filename = format(registry,ordering,supplement) - local found = cidmap[lower(filename)] + local filename = format(registry,ordering,supplement) + local lowername = lower(filename) + local found = cidmap[lowername] if found then return found end + if ordering == "Identity" then + local found = { + supplement = supplement, + registry = registry, + ordering = ordering, + filename = filename, + unicodes = { }, + names = { }, + } + cidmap[lowername] = found + return found + end + -- check for already loaded file if trace_loading then report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement) end diff --git a/Master/texmf-dist/tex/context/base/font-col.lua b/Master/texmf-dist/tex/context/base/font-col.lua index 187e33311ee..997c57c9f92 100644 --- a/Master/texmf-dist/tex/context/base/font-col.lua +++ b/Master/texmf-dist/tex/context/base/font-col.lua @@ -45,6 +45,8 @@ local currentfont = font.current local fontpatternhassize = fonts.helpers.fontpatternhassize +local implement = interfaces.implement + local list = { } local current = 0 local enabled = false @@ -275,9 +277,38 @@ end -- interface -commands.fontcollectiondefine = collections.define -commands.fontcollectionreset = collections.reset -commands.fontcollectionprepare = collections.prepare -commands.fontcollectionreport = collections.report -commands.fontcollectionregister = collections.registermain -commands.fontcollectionclone = collections.clonevector +implement { + name = "fontcollectiondefine", + actions = collections.define, + arguments = { "string", "string", "string", "string" } +} + +implement { + name = "fontcollectionreset", + actions = collections.reset, + arguments = { "string", "string" } +} + +implement { + name = "fontcollectionprepare", + actions = collections.prepare, + arguments = "string" +} + +implement { + name = "fontcollectionreport", + actions = collections.report, + arguments = "string" +} + +implement { + name = "fontcollectionregister", + actions = collections.registermain, + arguments = "string" +} + +implement { + name = "fontcollectionclone", + actions = collections.clonevector, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/font-col.mkvi b/Master/texmf-dist/tex/context/base/font-col.mkvi index 34a1b04a808..bc8e8151ed1 100644 --- a/Master/texmf-dist/tex/context/base/font-col.mkvi +++ b/Master/texmf-dist/tex/context/base/font-col.mkvi @@ -34,13 +34,13 @@ \unexpanded\def\resetfontfallback {\dodoubleempty \font_fallbacks_reset } \def\font_fallbacks_define[#name][#font][#ranges][#settings]% - {\ctxcommand{fontcollectiondefine("#name","#font",\!!bs#ranges\!!es,\!!bs#settings\!!es)}} + {\clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}} \def\font_fallbacks_reset[#name][#font]% - {\ctxcommand{fontcollectionreset("#name","#font")}} + {\clf_fontcollectionreset{#name}{#font}} \def\font_fallbacks_prepare#name% - {\ctxcommand{fontcollectionprepare("#name")}} % add fallbacks to last font + {\clf_fontcollectionprepare{#name}} % add fallbacks to last font % we might as well move the handling to lua but then we need to pass the % fallbacks, skewchar etc. @@ -77,7 +77,7 @@ {\endgroup} \def\font_fallbacks_clone_unique#specification#scale% kind of dododefinefont - {\ctxcommand{fontcollectionreport("defining #specification (relative scale: #scale)")}% brrr + {\clf_fontcollectionreport{defining #specification (relative scale: #scale)}% brrr \setfalse\c_font_auto_size \let\lastfontidentifier\s!dummy \def\v_font_size_relative{#scale}% @@ -89,8 +89,8 @@ \def\font_fallbacks_clone_inherited#font% also a second argument {\font_fallbacks_clone_unique{#font \savedfontspec}} -\def\font_fallbacks_register_main #name{\ctxcommand{fontcollectionregister("#name")}} -\def\font_fallbacks_prepare_clone_vectors#name{\ctxcommand{fontcollectionclone("#name")}} +\def\font_fallbacks_register_main #name{\clf_fontcollectionregister{#name}} +\def\font_fallbacks_prepare_clone_vectors#name{\clf_fontcollectionclone{#name}} % check : only replace when present in replacement font (default: no) % force : force replacent even when basefont has glyph (default: yes) diff --git a/Master/texmf-dist/tex/context/base/font-con.lua b/Master/texmf-dist/tex/context/base/font-con.lua index aca7055235e..72fbb5c0dcc 100644 --- a/Master/texmf-dist/tex/context/base/font-con.lua +++ b/Master/texmf-dist/tex/context/base/font-con.lua @@ -45,6 +45,8 @@ constructors.cache = containers.define("fonts", "constructors", constr constructors.privateoffset = 0xF0000 -- 0x10FFFF +constructors.cacheintex = true -- so we see the original table in fonts.font + -- Some experimental helpers (handy for tracing): -- -- todo: extra: @@ -394,7 +396,8 @@ function constructors.scale(tfmdata,specification) targetparameters.forcedsize = forcedsize -- context specific targetparameters.extrafactor = extrafactor -- context specific -- - local tounicode = resources.tounicode + local tounicode = fonts.mappings.tounicode + -- local defaultwidth = resources.defaultwidth or 0 local defaultheight = resources.defaultheight or 0 local defaultdepth = resources.defaultdepth or 0 @@ -436,6 +439,7 @@ function constructors.scale(tfmdata,specification) target.tounicode = 1 target.cidinfo = properties.cidinfo target.format = properties.format + target.cache = constructors.cacheintex and "yes" or "renew" -- local fontname = properties.fontname or tfmdata.fontname -- for the moment we fall back on local fullname = properties.fullname or tfmdata.fullname -- names in the tfmdata although @@ -453,6 +457,7 @@ function constructors.scale(tfmdata,specification) target.psname = psname target.name = name -- + -- properties.fontname = fontname properties.fullname = fullname properties.filename = filename @@ -500,7 +505,9 @@ function constructors.scale(tfmdata,specification) local autoitalicamount = properties.autoitalicamount local stackmath = not properties.nostackmath local nonames = properties.noglyphnames - local nodemode = properties.mode == "node" + local haskerns = properties.haskerns or properties.mode == "base" -- we can have afm in node mode + local hasligatures = properties.hasligatures or properties.mode == "base" -- we can have afm in node mode + local realdimensions = properties.realdimensions -- if changed and not next(changed) then changed = false @@ -594,43 +601,45 @@ function constructors.scale(tfmdata,specification) -- we can have a dumb mode (basemode without math etc) that skips most -- for unicode, character in next, characters do - local chr, description, index, touni + local chr, description, index if changed then - -- basemode hack (we try to catch missing tounicodes, e.g. needed for ssty in math cambria) local c = changed[unicode] if c then - local ligatures = character.ligatures -- the original ligatures (as we cannot rely on remapping) description = descriptions[c] or descriptions[unicode] or character character = characters[c] or character index = description.index or c - if tounicode then - touni = tounicode[index] -- nb: index! - if not touni then -- goodie - local d = descriptions[unicode] or characters[unicode] - local i = d.index or unicode - touni = tounicode[i] -- nb: index! - end - end - if ligatures and not character.ligatures then - character.ligatures = ligatures -- the original targets (for now at least.. see libertine smallcaps) - end else description = descriptions[unicode] or character index = description.index or unicode - if tounicode then - touni = tounicode[index] -- nb: index! - end end else description = descriptions[unicode] or character index = description.index or unicode - if tounicode then - touni = tounicode[index] -- nb: index! - end end local width = description.width local height = description.height local depth = description.depth + if realdimensions then + -- this is mostly for checking issues + if not height or height == 0 then + local bb = description.boundingbox + local ht = bb[4] + if ht ~= 0 then + height = ht + end + if not depth or depth == 0 then + local dp = -bb[2] + if dp ~= 0 then + depth = dp + end + end + elseif not depth or depth == 0 then + local dp = -description.boundingbox[2] + if dp ~= 0 then + depth = dp + end + end + end if width then width = hdelta*width else width = scaledwidth end if height then height = vdelta*height else height = scaledheight end -- if depth then depth = vdelta*depth else depth = scaleddepth end @@ -669,8 +678,10 @@ function constructors.scale(tfmdata,specification) } end end - if touni then - chr.tounicode = touni + local isunicode = description.unicode + if isunicode then + chr.unicode = isunicode + chr.tounicode = tounicode(isunicode) end if hasquality then -- we could move these calculations elsewhere (saves calculations) @@ -767,7 +778,7 @@ function constructors.scale(tfmdata,specification) end end end - if not nodemode then + if haskerns then local vk = character.kerns if vk then local s = sharedkerns[vk] @@ -778,6 +789,8 @@ function constructors.scale(tfmdata,specification) end chr.kerns = s end + end + if hasligatures then local vl = character.ligatures if vl then if true then @@ -965,6 +978,8 @@ function constructors.finalize(tfmdata) tfmdata.slant = nil tfmdata.units_per_em = nil -- + tfmdata.cache = nil + -- properties.finalized = true -- return tfmdata @@ -1362,3 +1377,50 @@ function constructors.applymanipulators(what,tfmdata,features,trace,report) end end end + +function constructors.addcoreunicodes(unicodes) -- maybe make this a metatable if used at all + if not unicodes then + unicodes = { } + end + unicodes.space = 0x0020 + unicodes.hyphen = 0x002D + unicodes.zwj = 0x200D + unicodes.zwnj = 0x200C + return unicodes +end + +-- -- keep for a while: old tounicode code +-- +-- if changed then +-- -- basemode hack (we try to catch missing tounicodes, e.g. needed for ssty in math cambria) +-- local c = changed[unicode] +-- if c then +-- -- local ligatures = character.ligatures -- the original ligatures (as we cannot rely on remapping) +-- description = descriptions[c] or descriptions[unicode] or character +-- character = characters[c] or character +-- index = description.index or c +-- if tounicode then +-- touni = tounicode[index] -- nb: index! +-- if not touni then -- goodie +-- local d = descriptions[unicode] or characters[unicode] +-- local i = d.index or unicode +-- touni = tounicode[i] -- nb: index! +-- end +-- end +-- -- if ligatures and not character.ligatures then +-- -- character.ligatures = ligatures -- the original targets (for now at least.. see libertine smallcaps) +-- -- end +-- else +-- description = descriptions[unicode] or character +-- index = description.index or unicode +-- if tounicode then +-- touni = tounicode[index] -- nb: index! +-- end +-- end +-- else +-- description = descriptions[unicode] or character +-- index = description.index or unicode +-- if tounicode then +-- touni = tounicode[index] -- nb: index! +-- end +-- end diff --git a/Master/texmf-dist/tex/context/base/font-ctx.lua b/Master/texmf-dist/tex/context/base/font-ctx.lua index 2bfcf38598a..2c96e9ac2be 100644 --- a/Master/texmf-dist/tex/context/base/font-ctx.lua +++ b/Master/texmf-dist/tex/context/base/font-ctx.lua @@ -21,6 +21,7 @@ local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, uti local formatcolumns = utilities.formatters.formatcolumns local mergehashes = utilities.parsers.mergehashes local formatters = string.formatters +local basename = file.basename local tostring, next, type, rawget, tonumber = tostring, next, type, rawget, tonumber local utfchar, utfbyte = utf.char, utf.byte @@ -44,6 +45,8 @@ local report_mapfiles = logs.reporter("fonts","mapfiles") local setmetatableindex = table.setmetatableindex +local implement = interfaces.implement + local fonts = fonts local handlers = fonts.handlers local otf = handlers.otf -- brrr @@ -57,6 +60,10 @@ local helpers = fonts.helpers local hashes = fonts.hashes local currentfont = font.current +local encodings = fonts.encodings +----- aglunicodes = encodings.agl.unicodes +local aglunicodes = nil -- delayed loading + local nuts = nodes.nuts local tonut = nuts.tonut @@ -78,18 +85,22 @@ local texdefinefont = tex.definefont local texsp = tex.sp local fontdata = hashes.identifiers -local characters = hashes.chardata +local characters = hashes.characters local descriptions = hashes.descriptions local properties = hashes.properties local resources = hashes.resources +local unicodes = hashes.unicodes local csnames = hashes.csnames -local marks = hashes.markdata local lastmathids = hashes.lastmathids local exheights = hashes.exheights local emwidths = hashes.emwidths +local parameters = hashes.parameters local designsizefilename = fontgoodies.designsizes.filename +local context_char = context.char +local context_getvalue = context.getvalue + local otffeatures = otf.features local otftables = otf.tables @@ -134,10 +145,12 @@ end -- this will move elsewhere ... -function fonts.helpers.name(tfmdata) - return file.basename(type(tfmdata) == "number" and properties[tfmdata].name or tfmdata.properties.name) +local function getfontname(tfmdata) + return basename(type(tfmdata) == "number" and properties[tfmdata].name or tfmdata.properties.name) end +fonts.helpers.name = getfontname + if _LUAVERSION < 5.2 then utilities.strings.formatters.add(formatters,"font:name", [["'"..fontname(%s).."'"]], "local fontname = fonts.helpers.name") @@ -213,7 +226,6 @@ function constructors.trytosharefont(target,tfmdata) end end - directives.register("fonts.checksharing",function(v) if not v then report_defining("font sharing in backend is disabled") @@ -221,19 +233,6 @@ directives.register("fonts.checksharing",function(v) constructors.sharefonts = v end) -local limited = false - -directives.register("system.inputmode", function(v) - if not limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - fontloader.open = i_limiter.protect(fontloader.open) - fontloader.info = i_limiter.protect(fontloader.info) - limited = true - end - end -end) - function definers.resetnullfont() -- resetting is needed because tikz misuses nullfont local parameters = fonts.nulldata.parameters @@ -251,7 +250,17 @@ function definers.resetnullfont() definers.resetnullfont = function() end end -commands.resetnullfont = definers.resetnullfont +implement { + name = "resetnullfont", + onlyonce = true, + actions = function() + for i=1,7 do + -- we have no direct method yet + context([[\fontdimen%s\nullfont\zeropoint]],i) + end + definers.resetnullfont() + end +} -- this cannot be a feature initializer as there is no auto namespace -- so we never enter the loop then; we can store the defaults in the tma @@ -878,7 +887,10 @@ end specifiers.splitcontext = splitcontext function specifiers.contexttostring(name,kind,separator,yes,no,strict,omit) -- not used - return hash_to_string(mergedtable(handlers[kind].features.defaults or {},setups[name] or {}),separator,yes,no,strict,omit) + return hash_to_string( + mergedtable(handlers[kind].features.defaults or {},setups[name] or {}), + separator, yes, no, strict, omit or { "number" } + ) end local function starred(features) -- no longer fallbacks here @@ -900,11 +912,11 @@ local separator = S(";,") local equal = P("=") local spaces = space^0 local sometext = C((1-equal-space-separator)^1) -local truevalue = P("+") * spaces * sometext * Cc(true) -- "yes" -local falsevalue = P("-") * spaces * sometext * Cc(false) -- "no" +local truevalue = P("+") * spaces * sometext * Cc(true) +local falsevalue = P("-") * spaces * sometext * Cc(false) +local somevalue = sometext * spaces * Cc(true) local keyvalue = sometext * spaces * equal * spaces * sometext -local somevalue = sometext * spaces * Cc(true) -- "yes" -local pattern = Cf(Ct("") * (space + separator + Cg(keyvalue + falsevalue + truevalue + somevalue))^0, rawset) +local pattern = Cf(Ct("") * (space + separator + Cg(falsevalue + truevalue + keyvalue + somevalue))^0, rawset) local function colonized(specification) specification.features.normal = normalize_features(lpegmatch(pattern,specification.detail)) @@ -956,14 +968,30 @@ local getspecification = definers.getspecification do -- else too many locals - local ctx_setdefaultfontname = context.fntsetdefname - local ctx_setsomefontname = context.fntsetsomename - local ctx_setemptyfontsize = context.fntsetnopsize - local ctx_setsomefontsize = context.fntsetsomesize - local ctx_letvaluerelax = context.letvaluerelax + ----- ctx_setdefaultfontname = context.fntsetdefname + ----- ctx_setsomefontname = context.fntsetsomename + ----- ctx_setemptyfontsize = context.fntsetnopsize + ----- ctx_setsomefontsize = context.fntsetsomesize + ----- ctx_letvaluerelax = context.letvaluerelax + + local starttiming = statistics.starttiming + local stoptiming = statistics.stoptiming + + local scanners = tokens.scanners + local scanstring = scanners.string + local scaninteger = scanners.integer + local scanboolean = scanners.boolean + + local setmacro = tokens.setters.macro - function commands.definefont_one(str) - statistics.starttiming(fonts) + local scanners = interfaces.scanners + + -- function commands.definefont_one(str) + + scanners.definefont_one = function() + local str = scanstring() + + starttiming(fonts) if trace_defining then report_defining("memory usage before: %s",statistics.memused()) report_defining("start stage one: %s",str) @@ -972,29 +1000,31 @@ do -- else too many locals local lookup, name, sub, method, detail = getspecification(fullname) if not name then report_defining("strange definition %a",str) - ctx_setdefaultfontname() + -- ctx_setdefaultfontname() elseif name == "unknown" then - ctx_setdefaultfontname() + -- ctx_setdefaultfontname() else - ctx_setsomefontname(name) + -- ctx_setsomefontname(name) + setmacro("somefontname",name,"global") end -- we can also use a count for the size if size and size ~= "" then local mode, size = lpegmatch(sizepattern,size) if size and mode then texsetcount("scaledfontmode",mode) - ctx_setsomefontsize(size) + -- ctx_setsomefontsize(size) + setmacro("somefontsize",size) else texsetcount("scaledfontmode",0) - ctx_setemptyfontsize() + -- ctx_setemptyfontsize() end elseif true then -- so we don't need to check in tex texsetcount("scaledfontmode",2) - ctx_setemptyfontsize() + -- ctx_setemptyfontsize() else texsetcount("scaledfontmode",0) - ctx_setemptyfontsize() + -- ctx_setemptyfontsize() end specification = definers.makespecification(str,lookup,name,sub,method,detail,size) if trace_defining then @@ -1011,8 +1041,29 @@ do -- else too many locals return (gsub(cs,".->", "")) end - function commands.definefont_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks, - mathsize,textsize,relativeid,classgoodies,goodies,classdesignsize,fontdesignsize,scaledfontmode) + -- function commands.definefont_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks, + -- mathsize,textsize,relativeid,classgoodies,goodies,classdesignsize,fontdesignsize,scaledfontmode) + + scanners.definefont_two = function() + + local global = scanboolean() -- \ifx\fontclass\empty\s!false\else\s!true\fi + local cs = scanstring () -- {#csname}% + local str = scanstring () -- \somefontfile + local size = scaninteger() -- \d_font_scaled_font_size + local inheritancemode = scaninteger() -- \c_font_feature_inheritance_mode + local classfeatures = scanstring () -- \m_font_class_features + local fontfeatures = scanstring () -- \m_font_features + local classfallbacks = scanstring () -- \m_font_class_fallbacks + local fontfallbacks = scanstring () -- \m_font_fallbacks + local mathsize = scaninteger() -- \fontface + local textsize = scaninteger() -- \d_font_scaled_text_face + local relativeid = scaninteger() -- \relativefontid + local classgoodies = scanstring () -- \m_font_class_goodies + local goodies = scanstring () -- \m_font_goodies + local classdesignsize = scanstring () -- \m_font_class_designsize + local fontdesignsize = scanstring () -- \m_font_designsize + local scaledfontmode = scaninteger() -- \scaledfontmode + if trace_defining then report_defining("start stage two: %s (size %s)",str,size) end @@ -1112,7 +1163,8 @@ do -- else too many locals if not tfmdata then report_defining("unable to define %a as %a",name,nice_cs(cs)) lastfontid = -1 - ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one + texsetcount("scaledfontsize",0) + -- ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one elseif type(tfmdata) == "number" then if trace_defining then report_defining("reusing %s, id %a, target %a, features %a / %a, fallbacks %a / %a, goodies %a / %a, designsize %a / %a", @@ -1122,7 +1174,8 @@ do -- else too many locals texdefinefont(global,cs,tfmdata) -- resolved (when designsize is used): local size = fontdata[tfmdata].parameters.size or 0 - ctx_setsomefontsize(size .. "sp") + -- ctx_setsomefontsize(size .. "sp") + setmacro("somefontsize",size.."sp") texsetcount("scaledfontsize",size) lastfontid = tfmdata else @@ -1149,7 +1202,8 @@ do -- else too many locals end -- resolved (when designsize is used): local size = tfmdata.parameters.size or 655360 - ctx_setsomefontsize(size .. "sp") + setmacro("somefontsize",size.."sp") + -- ctx_setsomefontsize(size .. "sp") texsetcount("scaledfontsize",size) lastfontid = id end @@ -1167,16 +1221,18 @@ do -- else too many locals lastmathids[mathsize] = lastfontid end -- - statistics.stoptiming(fonts) + stoptiming(fonts) end + -- + function definers.define(specification) -- local name = specification.name if not name or name == "" then return -1 else - statistics.starttiming(fonts) + starttiming(fonts) -- -- following calls expect a few properties to be set: -- @@ -1232,26 +1288,25 @@ do -- else too many locals constructors.finalize(tfmdata) return id, tfmdata end - statistics.stoptiming(fonts) + stoptiming(fonts) end end -end - --- local id, cs = fonts.definers.internal { } --- local id, cs = fonts.definers.internal { number = 2 } --- local id, cs = fonts.definers.internal { name = "dejavusans" } - -do + -- local id, cs = fonts.definers.internal { } + -- local id, cs = fonts.definers.internal { number = 2 } + -- local id, cs = fonts.definers.internal { name = "dejavusans" } local n = 0 function definers.internal(specification,cs) specification = specification or { } local name = specification.name - local size = specification.size and number.todimen(specification.size) or texgetdimen("bodyfontsize") + local size = tonumber(specification.size) local number = tonumber(specification.number) local id = nil + if not size then + size = texgetdimen("bodyfontsize") + end if number then id = number elseif name and name ~= "" then @@ -1275,6 +1330,17 @@ do return id, csnames[id] end + -- here + + local infofont = 0 + + function fonts.infofont() + if infofont == 0 then + infofont = definers.define { name = "dejavusansmono", size = tex.sp("6pt") } + end + return infofont + end + end local enable_auto_r_scale = false @@ -1306,7 +1372,7 @@ function constructors.calculatescale(tfmdata,scaledpoints,relativeid,specificati end end end - scaledpoints, delta = calculatescale(tfmdata,scaledpoints) + local scaledpoints, delta = calculatescale(tfmdata,scaledpoints) -- if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific (we need to hash rscale then) -- local relativedata = fontdata[relativeid] -- local rfmdata = relativedata and relativedata.unscaled and relativedata.unscaled @@ -1395,10 +1461,10 @@ end local mappings = fonts.mappings local loaded = { -- prevent loading (happens in cont-sys files) - ["original-base.map" ] = true, - ["original-ams-base.map" ] = true, - ["original-ams-euler.map"] = true, - ["original-public-lm.map"] = true, + -- ["original-base.map" ] = true, + -- ["original-ams-base.map" ] = true, + -- ["original-ams-euler.map"] = true, + -- ["original-public-lm.map"] = true, } function mappings.loadfile(name) @@ -1436,20 +1502,178 @@ end mappings.reset() -- resets the default file +implement { + name = "loadmapfile", + actions = mappings.loadfile, + arguments = "string" +} + +implement { + name = "loadmapline", + actions = mappings.loadline, + arguments = "string" +} + +implement { + name = "resetmapfiles", + actions = mappings.reset, + arguments = "string" +} + -- we need an 'do after the banner hook' -- => commands local function nametoslot(name) local t = type(name) + local s = nil if t == "string" then - return resources[true].unicodes[name] + local slot = unicodes[true][name] + if slot then + return slot + end + if not aglunicodes then + aglunicodes = encodings.agl.unicodes + end + slot = aglunicodes[name] + if characters[true][slot] then + return slot + else + -- not in font + end elseif t == "number" then - return n + if characters[true][name] then + return slot + else + -- not in font + end end end -helpers.nametoslot = nametoslot +local function indextoslot(index) + local r = resources[true] + if r then + local indices = r.indices + if not indices then + indices = { } + local c = characters[true] + for unicode, data in next, c do + local di = data.index + if di then + indices[di] = unicode + end + end + r.indices = indices + end + return indices[tonumber(index)] + end +end + +do -- else too many locals + + local entities = characters.entities + local lowered = { } -- delayed initialization + + setmetatableindex(lowered,function(t,k) + for k, v in next, entities do + local l = lower(k) + if not entities[l] then + lowered[l] = v + end + end + setmetatableindex(lowered,nil) + return lowered[k] + end) + + local methods = { + -- entity + e = function(name) + return entities[name] or lowered[name] or name + end, + -- hexadecimal unicode + x = function(name) + local n = tonumber(name,16) + return n and utfchar(n) or name + end, + -- decimal unicode + d = function(name) + local n = tonumber(name) + return n and utfchar(n) or name + end, + -- hexadecimal index (slot) + s = function(name) + local n = tonumber(name,16) + local n = n and indextoslot(n) + return n and utfchar(n) or name + end, + -- decimal index + i = function(name) + local n = tonumber(name) + local n = n and indextoslot(n) + return n and utfchar(n) or name + end, + -- name + n = function(name) + local n = nametoslot(name) + return n and utfchar(n) or name + end, + -- char + c = function(name) + return name + end, + } + + -- -- nicer: + -- + -- setmetatableindex(methods,function(t,k) return methods.c end) + -- + -- local splitter = (C(1) * P(":") + Cc("c")) * C(P(1)^1) / function(method,name) + -- return methods[method](name) + -- end + -- + -- -- more efficient: + + local splitter = C(1) * P(":") * C(P(1)^1) / function(method,name) + local action = methods[method] + return action and action(name) or name + end + + local function tochar(str) + local t = type(str) + if t == "number" then + return utfchar(str) + elseif t == "string" then + return lpegmatch(splitter,str) or str + else + return str + end + end + + helpers.nametoslot = nametoslot + helpers.indextoslot = indextoslot + helpers.tochar = tochar + + -- interfaces: + + implement { + name = "fontchar", + actions = { nametoslot, context_char }, + arguments = "string", + } + + implement { + name = "fontcharbyindex", + actions = { indextoslot, context_char }, + arguments = "integer", + } + + implement { + name = "tochar", + actions = { tochar, context }, + arguments = "string", + } + +end -- this will change ... @@ -1573,15 +1797,21 @@ function fonts.definetypeface(name,t) local boldwidth = t.boldwidth or t.width or p.boldwidth or p.width or "normal" Shape = Shapes[shape] or "Serif" ctx_startfontclass { name } - ctx_definefontsynonym( { format("%s", Shape) }, { format("spec:%s-%s-regular-%s", fontname, normalweight, normalwidth) } ) - ctx_definefontsynonym( { format("%sBold", Shape) }, { format("spec:%s-%s-regular-%s", fontname, boldweight, boldwidth ) } ) - ctx_definefontsynonym( { format("%sBoldItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, boldweight, boldwidth ) } ) - ctx_definefontsynonym( { format("%sItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, normalweight, normalwidth) } ) + ctx_definefontsynonym( { formatters["%s"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, normalweight, normalwidth) } ) + ctx_definefontsynonym( { formatters["%sBold"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, boldweight, boldwidth ) } ) + ctx_definefontsynonym( { formatters["%sBoldItalic"](Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, boldweight, boldwidth ) } ) + ctx_definefontsynonym( { formatters["%sItalic"] (Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, normalweight, normalwidth) } ) ctx_stopfontclass() local settings = sequenced({ features= t.features },",") ctx_dofastdefinetypeface(name, shortcut, shape, size, settings) end +implement { + name = "definetypeface", + actions = fonts.definetypeface, + arguments = { "string", "string" } +} + function fonts.current() -- todo: also handle name return fontdata[currentfont()] or fontdata[0] end @@ -1590,101 +1820,6 @@ function fonts.currentid() return currentfont() or 0 end --- interfaces - -local context_char = context.char -local context_getvalue = context.getvalue - -local commands_doifelse = commands.doifelse - -function commands.fontchar(n) - n = nametoslot(n) - if n then - context_char(n) - end -end - -function commands.doifelsecurrentfonthasfeature(name) -- can be made faster with a supportedfeatures hash - local f = fontdata[currentfont()] - f = f and f.shared - f = f and f.rawdata - f = f and f.resources - f = f and f.features - commands_doifelse(f and (f.gpos[name] or f.gsub[name])) -end - -local p, f = 1, formatters["%0.1fpt"] -- normally this value is changed only once - -local stripper = lpeg.patterns.stripzeros - -function commands.nbfs(amount,precision) - if precision ~= p then - p = precision - f = formatters["%0." .. p .. "fpt"] - end - context(lpegmatch(stripper,f(amount/65536))) -end - -function commands.featureattribute(tag) - context(contextnumber(tag)) -end - -function commands.setfontfeature(tag) - texsetattribute(0,contextnumber(tag)) -end - -function commands.resetfontfeature() - texsetattribute(0,0) -end - --- function commands.addfs(tag) withset(tag, 1) end --- function commands.subfs(tag) withset(tag,-1) end --- function commands.addff(tag) withfnt(tag, 2) end -- on top of font features --- function commands.subff(tag) withfnt(tag,-2) end -- on top of font features - -function commands.cleanfontname (name) context(names.cleanname(name)) end - -function commands.fontlookupinitialize (name) names.lookup(name) end -function commands.fontlookupnoffound () context(names.noflookups()) end -function commands.fontlookupgetkeyofindex(key,index) context(names.getlookupkey(key,index)) end -function commands.fontlookupgetkey (key) context(names.getlookupkey(key)) end - --- this might move to a runtime module: - -function commands.showchardata(n) - local tfmdata = fontdata[currentfont()] - if tfmdata then - if type(n) == "string" then - n = utfbyte(n) - end - local chr = tfmdata.characters[n] - if chr then - report_status("%s @ %s => %U => %c => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,n,serialize(chr,false)) - end - end -end - -function commands.showfontparameters(tfmdata) - -- this will become more clever - local tfmdata = tfmdata or fontdata[currentfont()] - if tfmdata then - local parameters = tfmdata.parameters - local mathparameters = tfmdata.mathparameters - local properties = tfmdata.properties - local hasparameters = parameters and next(parameters) - local hasmathparameters = mathparameters and next(mathparameters) - if hasparameters then - report_status("%s @ %s => text parameters => %s",properties.fullname,parameters.size,serialize(parameters,false)) - end - if hasmathparameters then - report_status("%s @ %s => math parameters => %s",properties.fullname,parameters.size,serialize(mathparameters,false)) - end - if not hasparameters and not hasmathparameters then - report_status("%s @ %s => no text parameters and/or math parameters",properties.fullname,parameters.size) - end - end -end - -- for the moment here, this will become a chain of extras that is -- hooked into the ctx registration (or scaler or ...) @@ -1866,79 +2001,152 @@ end -- end -- end -function commands.setfontofid(id) - context_getvalue(csnames[id]) -end +do --- more interfacing: + local scanners = tokens.scanners + local scanstring = scanners.string + local scaninteger = scanners.integer + local scandimen = scanners.dimen + local scanboolean = scanners.boolean -commands.definefontfeature = presetcontext + local setmacro = tokens.setters.macro -local cache = { } + local scanners = interfaces.scanners -local hows = { - ["+"] = "add", - ["-"] = "subtract", - ["="] = "replace", -} + function constructors.currentfonthasfeature(n) + local f = fontdata[currentfont()] + if not f then return end f = f.shared + if not f then return end f = f.rawdata + if not f then return end f = f.resources + if not f then return end f = f.features + return f and (f.gpos[n] or f.gsub[n]) + end -function commands.feature(how,parent,name,font) -- 0/1 test temporary for testing - if not how or how == 0 then - if trace_features and texgetattribute(0) ~= 0 then - report_cummulative("font %!font:name!, reset",fontdata[font or true]) - end - texsetattribute(0,0) - elseif how == true or how == 1 then - local hash = "feature > " .. parent - local done = cache[hash] - if trace_features and done then - report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]]) - end - texsetattribute(0,done or 0) - else - local full = parent .. how .. name - local hash = "feature > " .. full - local done = cache[hash] - if not done then - local n = setups[full] - if n then - -- already defined - else - n = mergecontextfeatures(parent,name,how,full) + implement { + name = "doifelsecurrentfonthasfeature", + actions = { currentfonthasfeature, commands.doifelse }, + arguments = "string" + } + + -- local p, f = 1, formatters["%0.1fpt"] -- normally this value is changed only once + -- + -- local stripper = lpeg.patterns.stripzeros + -- + -- function commands.nbfs(amount,precision) + -- if precision ~= p then + -- p = precision + -- f = formatters["%0." .. p .. "fpt"] + -- end + -- context(lpegmatch(stripper,f(amount/65536))) + -- end + + local f = formatters["%0.2fpt"] -- normally this value is changed only once + + local stripper = lpeg.patterns.stripzeros + + scanners.nbfs = function() + context(lpegmatch(stripper,f(scandimen()/65536))) + end + + commands.featureattribute = function(tag) context(contextnumber(tag)) end + commands.setfontfeature = function(tag) texsetattribute(0,contextnumber(tag)) end + commands.resetfontfeature = function() texsetattribute(0,0) end + commands.setfontofid = function(id) context_getvalue(csnames[id]) end + commands.definefontfeature = presetcontext + + scanners.featureattribute = function() context(contextnumber(scanstring())) end + scanners.setfontfeature = function() texsetattribute(0,contextnumber(scanstring())) end + scanners.resetfontfeature = function() texsetattribute(0,0) end + scanners.setfontofid = function() context_getvalue(csnames[scaninteger()]) end + scanners.definefontfeature = function() presetcontext(scanstring(),scanstring(),scanstring()) end + + local cache = { } + + local hows = { + ["+"] = "add", + ["-"] = "subtract", + ["="] = "replace", + } + + local function setfeature(how,parent,name,font) -- 0/1 test temporary for testing + if not how or how == 0 then + if trace_features and texgetattribute(0) ~= 0 then + report_cummulative("font %!font:name!, reset",fontdata[font or true]) + end + texsetattribute(0,0) + elseif how == true or how == 1 then + local hash = "feature > " .. parent + local done = cache[hash] + if trace_features and done then + report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]]) end - done = registercontextfeature(hash,full,how) - cache[hash] = done - if trace_features then - report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]]) + texsetattribute(0,done or 0) + else + local full = parent .. how .. name + local hash = "feature > " .. full + local done = cache[hash] + if not done then + local n = setups[full] + if n then + -- already defined + else + n = mergecontextfeatures(parent,name,how,full) + end + done = registercontextfeature(hash,full,how) + cache[hash] = done + if trace_features then + report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]]) + end end + texsetattribute(0,done) end - texsetattribute(0,done) end -end -function commands.featurelist(...) - context(fonts.specifiers.contexttostring(...)) -end + local function resetfeature() + if trace_features and texgetattribute(0) ~= 0 then + report_cummulative("font %!font:name!, reset",fontdata[true]) + end + texsetattribute(0,0) + end -function commands.registerlanguagefeatures() - local specifications = languages.data.specifications - for i=1,#specifications do - local specification = specifications[i] - local language = specification.opentype - if language then - local script = specification.opentypescript or specification.script - if script then - local context = specification.context - if type(context) == "table" then - for i=1,#context do - definecontext(context[i], { language = language, script = script}) + local function registerlanguagefeatures() + local specifications = languages.data.specifications + for i=1,#specifications do + local specification = specifications[i] + local language = specification.opentype + if language then + local script = specification.opentypescript or specification.script + if script then + local context = specification.context + if type(context) == "table" then + for i=1,#context do + definecontext(context[i], { language = language, script = script}) + end + elseif type(context) == "string" then + definecontext(context, { language = language, script = script}) end - elseif type(context) == "string" then - definecontext(context, { language = language, script = script}) end end end end + + implement { name = "resetfeature", actions = resetfeature } + implement { name = "addfeature", actions = setfeature, arguments = { "'+'", "string", "string" } } + implement { name = "subtractfeature", actions = setfeature, arguments = { "'-'", "string", "string" } } + implement { name = "replacefeature", actions = setfeature, arguments = { "'='", "string", "string" } } + implement { name = "revivefeature", actions = setfeature, arguments = { true, "string" } } + + implement { + name = "featurelist", + actions = { fonts.specifiers.contexttostring, context }, + arguments = { "string", "'otf'", "string", "'yes'", "'no'", true } + } + + implement { + name = "registerlanguagefeatures", + actions = registerlanguagefeatures, + } + end -- a fontkern plug: @@ -1956,11 +2164,11 @@ end) directives.register("nodes.injections.fontkern", function(v) setfield(kern,"subtype",v and 0 or 1) end) --- here +-- here (todo: closure) local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end) -local otffeatures = constructors.newfeatures("otf") +----- otffeatures = constructors.newfeatures("otf") local registerotffeature = otffeatures.register local analyzers = fonts.analyzers @@ -1979,7 +2187,7 @@ local glyph_code = nodes.nodecodes.glyph local states = analyzers.states -local names = { +local colornames = { [states.init] = "font:1", [states.medi] = "font:2", [states.fina] = "font:3", @@ -2000,7 +2208,7 @@ local function markstates(head) for glyph in traverse_by_id(glyph_code,head) do local a = getprop(glyph,a_state) if a then - local name = names[a] + local name = colornames[a] if name then local color = m_color[name] if color then @@ -2055,11 +2263,130 @@ function methods.nocolor(head,font,attr) return head, true end -function commands.purefontname(name) +local function purefontname(name) if type(name) == "number" then - name = fonts.helpers.name(name) + name = getfontname(name) end if type(name) == "string" then - context(file.basename(name)) + return basename(name) + end +end + +implement { + name = "purefontname", + actions = { purefontname, context }, + arguments = "string", +} + +local list = storage.shared.bodyfontsizes or { } +storage.shared.bodyfontsizes = list + +implement { + name = "registerbodyfontsize", + arguments = "string", + actions = function(size) + list[size] = true + end +} + +implement { + name = "getbodyfontsizes", + arguments = "string", + actions = function(separator) + context(concat(sortedkeys(list),separator)) + end +} + +implement { + name = "processbodyfontsizes", + arguments = "string", + actions = function(command) + local keys = sortedkeys(list) + if command then + local action = context[command] + for i=1,#keys do + action(keys[i]) + end + else + context(concat(keys,",")) + end + end +} + +implement { + name = "cleanfontname", + actions = { names.cleanname, context }, + arguments = "string" +} + +implement { + name = "fontlookupinitialize", + actions = names.lookup, + arguments = "string", +} + +implement { + name = "fontlookupnoffound", + actions = { names.noflookups, context }, +} + +implement { + name = "fontlookupgetkeyofindex", + actions = { names.getlookupkey, context }, + arguments = { "string", "integer"} +} + +implement { + name = "fontlookupgetkey", + actions = { names.getlookupkey, context }, + arguments = "string" +} + +-- this might move to a runtime module: + +function commands.showchardata(n) + local tfmdata = fontdata[currentfont()] + if tfmdata then + if type(n) == "string" then + n = utfbyte(n) + end + local chr = tfmdata.characters[n] + if chr then + report_status("%s @ %s => %U => %c => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,n,serialize(chr,false)) + end end end + +function commands.showfontparameters(tfmdata) + -- this will become more clever + local tfmdata = tfmdata or fontdata[currentfont()] + if tfmdata then + local parameters = tfmdata.parameters + local mathparameters = tfmdata.mathparameters + local properties = tfmdata.properties + local hasparameters = parameters and next(parameters) + local hasmathparameters = mathparameters and next(mathparameters) + if hasparameters then + report_status("%s @ %s => text parameters => %s",properties.fullname,parameters.size,serialize(parameters,false)) + end + if hasmathparameters then + report_status("%s @ %s => math parameters => %s",properties.fullname,parameters.size,serialize(mathparameters,false)) + end + if not hasparameters and not hasmathparameters then + report_status("%s @ %s => no text parameters and/or math parameters",properties.fullname,parameters.size) + end + end +end + +implement { + name = "currentdesignsize", + actions = function() + context(parameters[currentfont()].designsize) + end +} + +implement { + name = "doifelsefontpresent", + actions = { names.exists, commands.doifelse }, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/font-def.lua b/Master/texmf-dist/tex/context/base/font-def.lua index e5c5d990ce2..fdded3c369c 100644 --- a/Master/texmf-dist/tex/context/base/font-def.lua +++ b/Master/texmf-dist/tex/context/base/font-def.lua @@ -433,8 +433,8 @@ function definers.read(specification,size,id) -- id can be optional, name can al elseif trace_defining and type(tfmdata) == "table" then local properties = tfmdata.properties or { } local parameters = tfmdata.parameters or { } - report_defining("using %s font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", - properties.format, id, properties.name, parameters.size, properties.encodingbytes, + report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", + properties.format or "unknown", id, properties.name, parameters.size, properties.encodingbytes, properties.encodingname, properties.fullname, file.basename(properties.filename)) end statistics.stoptiming(fonts) diff --git a/Master/texmf-dist/tex/context/base/font-enc.lua b/Master/texmf-dist/tex/context/base/font-enc.lua index 5305f0736a6..2e8b722de39 100644 --- a/Master/texmf-dist/tex/context/base/font-enc.lua +++ b/Master/texmf-dist/tex/context/base/font-enc.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['font-enc'] = { -- this module is obsolete +local next = next local match, gmatch, gsub = string.match, string.gmatch, string.gsub local setmetatableindex = table.setmetatableindex @@ -125,7 +126,12 @@ function encodings.make_unicode_vector() end end for name, code in next, characters.synonyms do - vector[code], hash[name] = name, code + if not vector[code] then + vector[code] = name + end + if not hash[name] then + hash[name] = code + end end return containers.write(encodings.cache, 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash }) end diff --git a/Master/texmf-dist/tex/context/base/font-enh.lua b/Master/texmf-dist/tex/context/base/font-enh.lua index 2bf0741f535..3439a434ab4 100644 --- a/Master/texmf-dist/tex/context/base/font-enh.lua +++ b/Master/texmf-dist/tex/context/base/font-enh.lua @@ -114,24 +114,24 @@ local registerotffeature = otffeatures.register -- unicodes = { -- a1 = 0x2701, -local tosixteen = fonts.mappings.tounicode16 +----- tosixteen = fonts.mappings.tounicode16 local function initializeunicoding(tfmdata) local goodies = tfmdata.goodies local newcoding = nil - local tounicode = false + -- local tounicode = false for i=1,#goodies do local remapping = goodies[i].remapping if remapping and remapping.unicodes then - newcoding = remapping.unicodes -- names to unicodes - tounicode = remapping.tounicode + newcoding = remapping.unicodes -- names to unicodes + -- tounicode = remapping.tounicode -- not used end end if newcoding then local characters = tfmdata.characters local descriptions = tfmdata.descriptions local oldcoding = tfmdata.resources.unicodes - local tounicodes = tfmdata.resources.tounicode -- index to unicode + -- local tounicodes = tfmdata.resources.tounicode -- index to unicode local originals = { } for name, newcode in next, newcoding do local oldcode = oldcoding[name] @@ -153,15 +153,15 @@ local function initializeunicoding(tfmdata) else oldcoding[name] = newcode end - if tounicode then - local description = descriptions[newcode] - if description then - local index = description.index - if not tounicodes[index] then - tounicodes[index] = tosixteen(newcode) -- shared (we could have a metatable) - end - end - end + -- if tounicode then + -- local description = descriptions[newcode] + -- if description then + -- local index = description.index + -- if not tounicodes[index] then + -- tounicodes[index] = tosixteen(newcode) -- shared (we could have a metatable) + -- end + -- end + -- end if trace_unicoding then if oldcode then report_unicoding("aliasing glyph %a from %U to %U",name,oldcode,newcode) diff --git a/Master/texmf-dist/tex/context/base/font-ext.lua b/Master/texmf-dist/tex/context/base/font-ext.lua index ede2151d6b5..b7817c140b0 100644 --- a/Master/texmf-dist/tex/context/base/font-ext.lua +++ b/Master/texmf-dist/tex/context/base/font-ext.lua @@ -7,19 +7,17 @@ if not modules then modules = { } end modules ['font-ext'] = { } local next, type, byte = next, type, string.byte -local gmatch, concat, format = string.gmatch, table.concat, string.format -local utfchar = utf.char -local commands, context = commands, context -local fonts, utilities = fonts, utilities +local context = context +local fonts = fonts +local utilities = utilities -local trace_protrusion = false trackers.register("fonts.protrusion", function(v) trace_protrusion = v end) -local trace_expansion = false trackers.register("fonts.expansion", function(v) trace_expansion = v end) +local trace_protrusion = false trackers.register("fonts.protrusion", function(v) trace_protrusion = v end) +local trace_expansion = false trackers.register("fonts.expansion", function(v) trace_expansion = v end) local report_expansions = logs.reporter("fonts","expansions") local report_protrusions = logs.reporter("fonts","protrusions") - --- todo: byte(..) => 0xHHHH +local report_opbd = logs.reporter("fonts","otf opbd") --[[ldx--

When we implement functions that deal with features, most of them @@ -42,6 +40,8 @@ local getparameters = utilities.parsers.getparameters local setmetatableindex = table.setmetatableindex +local implement = interfaces.implement + -- -- -- -- -- -- -- shared -- -- -- -- -- -- @@ -79,10 +79,6 @@ expansions.vectors = vectors classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 } -function commands.setupfontexpansion(class,settings) - getparameters(classes,class,'preset',settings) -end - classes['quality'] = { stretch = 2, shrink = 2, step = .5, vector = 'default', factor = 1 } @@ -172,7 +168,11 @@ registerafmfeature { fonts.goodies.register("expansions", function(...) return fonts.goodies.report("expansions", trace_expansion, ...) end) -local report_opbd = logs.reporter("fonts","otf opbd") +implement { + name = "setupfontexpansion", + arguments = { "string", "string" }, + actions = function(class,settings) getparameters(classes,class,'preset',settings) end +} -- -- -- -- -- -- -- protrusion @@ -191,10 +191,6 @@ local vectors = protrusions.vectors classes.preset = { factor = 1, left = 1, right = 1 } -function commands.setupfontprotrusion(class,settings) - getparameters(classes,class,'preset',settings) -end - classes['pure'] = { vector = 'pure', factor = 1 } @@ -328,8 +324,10 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd) local characters = tfmdata.characters local descriptions = tfmdata.descriptions local properties = tfmdata.properties + local resources = tfmdata.resources local rawdata = tfmdata.shared.rawdata local lookuphash = rawdata.lookuphash + local lookuptags = resources.lookuptags local script = properties.script local language = properties.language local done, factor, left, right = false, 1, 1, 1 @@ -349,14 +347,14 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd) local data = lookuphash[lookup] if data then if trace_protrusion then - report_protrusions("setting left using lfbd lookup %a",lookup) + report_protrusions("setting left using lfbd lookup %a",lookuptags[lookup]) end for k, v in next, data do -- local p = - v[3] / descriptions[k].width-- or 1 ~= 0 too but the same local p = - (v[1] / 1000) * factor * left characters[k].left_protruding = p if trace_protrusion then - report_protrusions("lfbd -> %s -> %C -> %0.03f (% t)",lookup,k,p,v) + report_protrusions("lfbd -> %s -> %C -> %0.03f (% t)",lookuptags[lookup],k,p,v) end end done = true @@ -372,14 +370,14 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd) local data = lookuphash[lookup] if data then if trace_protrusion then - report_protrusions("setting right using rtbd lookup %a",lookup) + report_protrusions("setting right using rtbd lookup %a",lookuptags[lookup]) end for k, v in next, data do -- local p = v[3] / descriptions[k].width -- or 3 local p = (v[1] / 1000) * factor * right characters[k].right_protruding = p if trace_protrusion then - report_protrusions("rtbd -> %s -> %C -> %0.03f (% t)",lookup,k,p,v) + report_protrusions("rtbd -> %s -> %C -> %0.03f (% t)",lookuptags[lookup],k,p,v) end end end @@ -487,6 +485,12 @@ registerafmfeature { fonts.goodies.register("protrusions", function(...) return fonts.goodies.report("protrusions", trace_protrusion, ...) end) +implement { + name = "setupfontprotrusion", + arguments = { "string", "string" }, + actions = function(class,settings) getparameters(classes,class,'preset',settings) end +} + -- -- -- local function initializenostackmath(tfmdata,value) @@ -502,6 +506,19 @@ registerotffeature { } } +local function initializerealdimensions(tfmdata,value) + tfmdata.properties.realdimensions = value and true +end + +registerotffeature { + name = "realdimensions", + description = "accept negative dimenions", + initializers = { + base = initializerealdimensions, + node = initializerealdimensions, + } +} + local function initializeitlc(tfmdata,value) -- hm, always value if value then -- the magic 40 and it formula come from Dohyun Kim but we might need another guess @@ -887,11 +904,17 @@ registerotffeature { -- a handy helper (might change or be moved to another namespace) -local new_special = nodes.pool.special -local new_glyph = nodes.pool.glyph +local nodepool = nodes.pool + +local new_special = nodepool.special +local new_glyph = nodepool.glyph +local new_rule = nodepool.rule local hpack_node = node.hpack -function fonts.helpers.addprivate(tfmdata,name,characterdata) +local helpers = fonts.helpers +local currentfont = font.current + +function helpers.addprivate(tfmdata,name,characterdata) local properties = tfmdata.properties local privates = properties.privates local lastprivate = properties.lastprivate @@ -915,19 +938,19 @@ function fonts.helpers.addprivate(tfmdata,name,characterdata) return lastprivate end -function fonts.helpers.getprivatenode(tfmdata,name) +local function getprivatenode(tfmdata,name) local properties = tfmdata.properties local privates = properties and properties.privates if privates then local p = privates[name] if p then - local char = tfmdata.characters[p] + local char = tfmdata.characters[p] local commands = char.commands if commands then - local fake = hpack_node(new_special(commands[1][2])) - fake.width = char.width + local fake = hpack_node(new_special(commands[1][2])) + fake.width = char.width fake.height = char.height - fake.depth = char.depth + fake.depth = char.depth return fake else -- todo: set current attribibutes @@ -937,12 +960,18 @@ function fonts.helpers.getprivatenode(tfmdata,name) end end -function fonts.helpers.hasprivate(tfmdata,name) +helpers.getprivatenode = getprivatenode + +function helpers.hasprivate(tfmdata,name) local properties = tfmdata.properties local privates = properties and properties.privates return privates and privates[name] or false end -function commands.getprivatechar(name) - context(fonts.helpers.getprivatenode(fontdata[font.current()],name)) -end +implement { + name = "getprivatechar", + arguments = "string", + actions = function(name) + context(getprivatenode(fontdata[currentfont()],name)) + end +} diff --git a/Master/texmf-dist/tex/context/base/font-fbk.lua b/Master/texmf-dist/tex/context/base/font-fbk.lua index 48e2167e656..22644f04674 100644 --- a/Master/texmf-dist/tex/context/base/font-fbk.lua +++ b/Master/texmf-dist/tex/context/base/font-fbk.lua @@ -19,18 +19,20 @@ local trace_combining_define = false trackers.register("fonts.composing.defi trackers.register("fonts.combining", "fonts.composing.define") -- for old times sake (and manuals) trackers.register("fonts.combining.all", "fonts.composing.*") -- for old times sake (and manuals) -local report_combining = logs.reporter("fonts","combining") +local report_combining = logs.reporter("fonts","combining") -local force_combining = false -- just for demo purposes (see mk) +local force_combining = false -- just for demo purposes (see mk) -local allocate = utilities.storage.allocate +local allocate = utilities.storage.allocate local fonts = fonts local handlers = fonts.handlers local constructors = fonts.constructors -local registerotffeature = handlers.otf.features.register -local registerafmfeature = handlers.afm.features.register +local otf = handlers.otf +local afm = handlers.afm +local registerotffeature = otf.features.register +local registerafmfeature = afm.features.register local unicodecharacters = characters.data local unicodefallbacks = characters.fallbacks @@ -302,3 +304,32 @@ end -- {'special', 'pdf: /Fm\XX\space Do'}, -- {'special', 'pdf: Q'}, -- {'special', 'pdf: Q'}, + +-- new and experimental + +local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } } +local noflags = { } + +local char_specification = { + type = "ligature", + features = everywhere, + data = characters.splits.char, + order = { "char-ligatures" }, + flags = noflags, + prepend = true, +} + +local compat_specification = { + type = "ligature", + features = everywhere, + data = characters.splits.compat, + order = { "compat-ligatures" }, + flags = noflags, + prepend = true, +} + +otf.addfeature("char-ligatures", char_specification) -- xlig (extra) +otf.addfeature("compat-ligatures",compat_specification) -- plig (pseudo) + +registerotffeature { name = 'char-ligatures', description = 'unicode char specials to ligatures' } +registerotffeature { name = 'compat-ligatures', description = 'unicode compat specials to ligatures' } diff --git a/Master/texmf-dist/tex/context/base/font-fea.mkvi b/Master/texmf-dist/tex/context/base/font-fea.mkvi index 35a9a642a1b..5f6f1b5d5ad 100644 --- a/Master/texmf-dist/tex/context/base/font-fea.mkvi +++ b/Master/texmf-dist/tex/context/base/font-fea.mkvi @@ -123,13 +123,13 @@ {\dotripleargument\font_basics_define_font_feature} \def\font_basics_define_font_feature[#featureset][#parent][#settings]% - {\ctxcommand{definefontfeature("#featureset","#parent","#settings")}} + {\clf_definefontfeature{#featureset}{#parent}{#settings}} \unexpanded\def\fontfeatureslist {\dodoubleargument\font_basics_features_list} \def\font_basics_features_list[#name][#separator]% todo: arg voor type - {\cldcommand{featurelist("#name","otf","\luaescapestring{#separator}","yes","no",true,{"number"})}} + {\clf_featurelist{#name}{\detokenize{#separator}}} \attribute\zerocount\zerocount % first in list, so fast match @@ -143,11 +143,11 @@ % hashing at this end is slower -\unexpanded\def\addfeature {\doifnextoptionalcselse\font_feature_add_yes \font_feature_add_nop } -\unexpanded\def\subtractfeature {\doifnextoptionalcselse\font_feature_subtract_yes \font_feature_subtract_nop } -\unexpanded\def\replacefeature {\doifnextoptionalcselse\font_feature_replace_yes \font_feature_replace_nop } -\unexpanded\def\resetandaddfeature{\doifnextoptionalcselse\font_feature_reset_add_yes\font_feature_reset_add_nop} -\unexpanded\def\feature {\doifnextoptionalcselse\font_feature_yes \font_feature_nop } +\unexpanded\def\addfeature {\doifelsenextoptionalcs\font_feature_add_yes \font_feature_add_nop } +\unexpanded\def\subtractfeature {\doifelsenextoptionalcs\font_feature_subtract_yes \font_feature_subtract_nop } +\unexpanded\def\replacefeature {\doifelsenextoptionalcs\font_feature_replace_yes \font_feature_replace_nop } +\unexpanded\def\resetandaddfeature{\doifelsenextoptionalcs\font_feature_reset_add_yes\font_feature_reset_add_nop} +\unexpanded\def\feature {\doifelsenextoptionalcs\font_feature_yes \font_feature_nop } \unexpanded\def\font_feature_add_yes [#feature]{\edef\m_font_feature_asked{#feature}\font_feature_add} \unexpanded\def\font_feature_add_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_add} @@ -176,7 +176,7 @@ \fi} \unexpanded\def\font_feature_add_indeed - {\ctxcommand{feature("+","\m_font_feature_list","\m_font_feature_asked")}% + {\clf_addfeature{\m_font_feature_list}{\m_font_feature_asked}% \edef\m_font_feature_list{\m_font_feature_list+\m_font_feature_asked}% also + at the lua end \c_font_feature_state\plusone \let\currentfeature\m_font_feature_asked} @@ -191,7 +191,7 @@ \fi} \unexpanded\def\font_feature_subtract_indeed - {\ctxcommand{feature("-","\m_font_feature_list","\m_font_feature_asked")}% + {\clf_subtractfeature{\m_font_feature_list}{\m_font_feature_asked}% \edef\m_font_feature_list{\m_font_feature_list-\m_font_feature_asked}% also - at the lua end \c_font_feature_state\minusone \let\currentfeature\m_font_feature_asked} @@ -206,7 +206,7 @@ \fi} \unexpanded\def\font_feature_replace_indeed - {\ctxcommand{feature("=","\m_font_feature_list","\m_font_feature_asked")}% + {\clf_replacefeature{\m_font_feature_list}{\m_font_feature_asked}% \edef\m_font_feature_list{\m_font_feature_list=\m_font_feature_asked}% also = at the lua end \c_font_feature_state\zerocount \let\currentfeature\m_font_feature_asked} @@ -220,7 +220,7 @@ {\let\m_font_feature_asked\empty \let\currentfeature \s!current \let\m_font_feature_list \s!current - \ctxcommand{feature(false)}} + \clf_resetfeature} \unexpanded\def\revivefeature {\ifx\currentfeature\s!current \else @@ -228,7 +228,7 @@ \fi} \unexpanded\def\font_feature_revive_indeed - {\ctxcommand{feature(true,"\m_font_feature_list")}} + {\clf_revivefeature{\m_font_feature_list}} \unexpanded\def\font_feature_reset_add {\ifnum\c_font_feature_state=\plusone @@ -240,7 +240,7 @@ \fi} \unexpanded\def\font_feature_reset_add_indeed - {\ctxcommand{feature("+","\s!current","\m_font_feature_asked")}% + {\clf_addfeature{\s!current}{\m_font_feature_asked}% \edef\m_font_feature_list{\s!current+\m_font_feature_asked}% also + at the lua end \c_font_feature_state\plusone \let\currentfeature\m_font_feature_asked} @@ -284,12 +284,12 @@ % just for old times sake: \unexpanded\def\featureattribute#feature% - {\ctxcommand{featureattribute("#feature")}} + {\clf_featureattribute{#feature}} \unexpanded\def\setfontfeature#feature% {\edef\currentfeature{#feature}% \let\m_font_feature_list\currentfeature - \ctxcommand{setfontfeature("\currentfeature")}} + \clf_setfontfeature{\currentfeature}} \let\resetfontfeature\resetfeature @@ -324,11 +324,13 @@ % \doifelsecurrentfonthasfeature{kern}{YES}{NO} \def\doifelsecurrentfonthasfeature#feature% - {\ctxcommand{doifelsecurrentfonthasfeature("#feature")}} + {\clf_doifelsecurrentfonthasfeature{#feature}} + +\let\doifcurrentfonthasfeatureelse\doifelsecurrentfonthasfeature % new: -\ctxcommand{registerlanguagefeatures()} +\clf_registerlanguagefeatures % also new diff --git a/Master/texmf-dist/tex/context/base/font-fil.mkvi b/Master/texmf-dist/tex/context/base/font-fil.mkvi index 158bcda713d..1a20d1cd84a 100644 --- a/Master/texmf-dist/tex/context/base/font-fil.mkvi +++ b/Master/texmf-dist/tex/context/base/font-fil.mkvi @@ -89,11 +89,11 @@ \def\font_basics_define_font_synonym_nop {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file - \doifnextoptionalcselse\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil} + \doifelsenextoptionalcs\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil} \def\font_basics_define_font_synonym_yes {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file - \doifnextoptionalcselse\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil} + \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil} \def\font_basics_define_font_synonym_nop_opt[#specification]% {\let\p_features \undefined @@ -241,6 +241,8 @@ \doubleexpandafter\secondoftwoarguments \fi\fi} +\let\doiffontsynonymelse\doifelsefontsynonym + %D \macros %D {tracedfontname} %D @@ -290,75 +292,75 @@ % resolve \def\font_helpers_set_features_yes#name% - {\ifcsname\??fontfile\fontclass#name\s!features \endcsname\expandafter\let\expandafter\m_font_features % class + symbolic_name - \csname\??fontfile\fontclass#name\s!features \endcsname\else - \ifcsname\??fontfile #name\s!features \endcsname\expandafter\let\expandafter\m_font_features % symbolic_name - \csname\??fontfile #name\s!features \endcsname\else + {\ifcsname\??fontfile\fontclass#name\s!features \endcsname \edef\m_font_features % class + symbolic_name + {\csname\??fontfile\fontclass#name\s!features \endcsname}\else + \ifcsname\??fontfile #name\s!features \endcsname \edef\m_font_features % symbolic_name + {\csname\??fontfile #name\s!features \endcsname}\else \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_features_yes % class + parent_name - \csname\??fontfile\fontclass #name\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_features_yes % parent_name - \csname\??fontfile #name\endcsname\else + \csname\??fontfile\fontclass #name\endcsname \else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_features_yes % parent_name + \csname\??fontfile #name\endcsname \else \let\m_font_features\empty\fi\fi\fi\fi} \def\font_helpers_set_fallbacks_yes#name% - {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks - \csname\??fontfile\fontclass#name\s!fallbacks\endcsname\else - \ifcsname\??fontfile #name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks - \csname\??fontfile #name\s!fallbacks\endcsname\else - \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_fallbacks_yes - \csname\??fontfile\fontclass #name\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_fallbacks_yes - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks + {\csname\??fontfile\fontclass#name\s!fallbacks\endcsname}\else + \ifcsname\??fontfile #name\s!fallbacks\endcsname \edef\m_font_fallbacks + {\csname\??fontfile #name\s!fallbacks\endcsname}\else + \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_fallbacks_yes + \csname\??fontfile\fontclass #name\endcsname \else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_fallbacks_yes + \csname\??fontfile #name\endcsname \else \let\m_font_fallbacks\empty\fi\fi\fi\fi} \def\font_helpers_set_goodies_yes#name% - {\ifcsname\??fontfile\fontclass#name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies - \csname\??fontfile\fontclass#name\s!goodies \endcsname\else - \ifcsname\??fontfile #name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies - \csname\??fontfile #name\s!goodies \endcsname\else - \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_goodies_yes - \csname\??fontfile\fontclass #name\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_goodies_yes - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile\fontclass#name\s!goodies \endcsname \edef\m_font_goodies + {\csname\??fontfile\fontclass#name\s!goodies \endcsname}\else + \ifcsname\??fontfile #name\s!goodies \endcsname \edef\m_font_goodies + {\csname\??fontfile #name\s!goodies \endcsname}\else + \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_goodies_yes + \csname\??fontfile\fontclass #name\endcsname \else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_goodies_yes + \csname\??fontfile #name\endcsname \else \let\m_font_goodies\empty\fi\fi\fi\fi} \def\font_helpers_set_designsize_yes#name% - {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize - \csname\??fontfile\fontclass#name\s!designsize\endcsname\else - \ifcsname\??fontfile #name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize - \csname\??fontfile #name\s!designsize\endcsname\else - \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_designsize_yes - \csname\??fontfile\fontclass #name\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_designsize_yes - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize + {\csname\??fontfile\fontclass#name\s!designsize\endcsname}\else + \ifcsname\??fontfile #name\s!designsize\endcsname \edef\m_font_designsize + {\csname\??fontfile #name\s!designsize\endcsname}\else + \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_designsize_yes + \csname\??fontfile\fontclass #name\endcsname \else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_designsize_yes + \csname\??fontfile #name\endcsname \else \let\m_font_designsize\empty\fi\fi\fi\fi} \def\font_helpers_set_features_nop#name% - {\ifcsname\??fontfile#name\s!features \endcsname\expandafter\let\expandafter\m_font_features - \csname\??fontfile#name\s!features \endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_features_nop - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile#name\s!features \endcsname \edef\m_font_features + {\csname\??fontfile#name\s!features \endcsname}\else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_features_nop + \csname\??fontfile #name\endcsname \else \let\m_font_features\empty\fi\fi} \def\font_helpers_set_fallbacks_nop#name% - {\ifcsname\??fontfile#name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks - \csname\??fontfile#name\s!fallbacks\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_fallbacks_nop - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks + {\csname\??fontfile#name\s!fallbacks\endcsname}\else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_fallbacks_nop + \csname\??fontfile #name\endcsname \else \let\m_font_fallbacks\empty\fi\fi} \def\font_helpers_set_goodies_nop#name% - {\ifcsname\??fontfile#name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies - \csname\??fontfile#name\s!goodies \endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_goodies_nop - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile#name\s!goodies \endcsname \edef\m_font_goodies + {\csname\??fontfile#name\s!goodies \endcsname}\else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_goodies_nop + \csname\??fontfile #name\endcsname \else \let\m_font_goodies\empty\fi\fi} \def\font_helpers_set_designsize_nop#name% - {\ifcsname\??fontfile#name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize - \csname\??fontfile#name\s!designsize\endcsname\else - \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_designsize_nop - \csname\??fontfile #name\endcsname\else + {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize + {\csname\??fontfile#name\s!designsize\endcsname}\else + \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_designsize_nop + \csname\??fontfile #name\endcsname \else \let\m_font_designsize\empty\fi\fi} \def\font_helpers_update_font_parameters_yes diff --git a/Master/texmf-dist/tex/context/base/font-gds.lua b/Master/texmf-dist/tex/context/base/font-gds.lua index 9e7cb841e3f..073d9ed57d1 100644 --- a/Master/texmf-dist/tex/context/base/font-gds.lua +++ b/Master/texmf-dist/tex/context/base/font-gds.lua @@ -9,10 +9,12 @@ if not modules then modules = { } end modules ['font-gds'] = { -- depends on ctx local type, next, tonumber = type, next, tonumber -local gmatch, format, lower, find, splitup = string.gmatch, string.format, string.lower, string.find, string.splitup -local texsp = tex.sp +local gmatch, lower, find, splitup = string.gmatch, string.lower, string.find, string.splitup -local fonts, nodes, attributes, node = fonts, nodes, attributes, node +local fonts = fonts +local nodes = nodes +local attributes = attributes +local node = node local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end) local report_goodies = logs.reporter("fonts","goodies") @@ -20,6 +22,11 @@ local report_goodies = logs.reporter("fonts","goodies") local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex +local implement = interfaces.implement + +local texsp = tex.sp +local formatters = string.formatters + local otf = fonts.handlers.otf local afm = fonts.handlers.afm local tfm = fonts.handlers.tfm @@ -429,7 +436,7 @@ local function setextrafeatures(tfmdata) addotffeature(tfmdata.shared.rawdata,feature,specification) registerotffeature { name = feature, - description = format("extra: %s",feature) + description = formatters["extra: %s"](feature) } end end @@ -819,8 +826,17 @@ end -- interface -commands.loadfontgoodies = fontgoodies.load -commands.enablefontcolorschemes = colorschemes.enable +implement { + name = "loadfontgoodies", + actions = fontgoodies.load, + arguments = "string" +} + +implement { + name = "enablefontcolorschemes", + onlyonce = true, + actions = colorschemes.enable +} -- weird place ... depends on math @@ -853,7 +869,7 @@ local function setkeepligatures(tfmdata,value) if letterspacing then local keptligatures = letterspacing.keptligatures if keptligatures then - local unicodes = tfmdata.resources.unicodes + local unicodes = tfmdata.resources.unicodes -- so we accept names local hash = { } for k, v in next, keptligatures do local u = unicodes[k] diff --git a/Master/texmf-dist/tex/context/base/font-gds.mkvi b/Master/texmf-dist/tex/context/base/font-gds.mkvi index 6d979842872..e9c34e807af 100644 --- a/Master/texmf-dist/tex/context/base/font-gds.mkvi +++ b/Master/texmf-dist/tex/context/base/font-gds.mkvi @@ -46,10 +46,10 @@ \definesystemattribute[colorscheme][public] \unexpanded\def\loadfontgoodies[#filename]% - {\ctxcommand{loadfontgoodies("#filename")}} + {\clf_loadfontgoodies{#filename}} \unexpanded\def\setfontcolorscheme % will move to the lua end - {\ctxcommand{enablefontcolorschemes()}% + {\clf_enablefontcolorschemes \unexpanded\xdef\setfontcolorscheme[##1]{\attribute\colorschemeattribute##1\relax}% \setfontcolorscheme} diff --git a/Master/texmf-dist/tex/context/base/font-hsh.lua b/Master/texmf-dist/tex/context/base/font-hsh.lua index 1b0dd08b83c..07acf2138c7 100644 --- a/Master/texmf-dist/tex/context/base/font-hsh.lua +++ b/Master/texmf-dist/tex/context/base/font-hsh.lua @@ -35,6 +35,8 @@ local italics = hashes.italics or allocate() local lastmathids = hashes.lastmathids or allocate() local dynamics = hashes.dynamics or allocate() local unicodes = hashes.unicodes or allocate() +local originals = hashes.originals or allocate() +local modes = hashes.modes or allocate() hashes.characters = characters hashes.descriptions = descriptions @@ -52,6 +54,8 @@ hashes.italics = italics hashes.lastmathids = lastmathids hashes.dynamics = dynamics hashes.unicodes = unicodes +hashes.originals = originals +hashes.modes = modes local nodepool = nodes.pool local dummyglyph = nodepool.register(nodepool.glyph()) @@ -261,21 +265,41 @@ setmetatableindex(dynamics, function(t,k) end end) -setmetatableindex(unicodes, function(t,k) +setmetatableindex(unicodes, function(t,k) -- always a unicode + if k == true then + return unicodes[currentfont()] + else + local resources = resources[k] + local unicodes = resources and resources.unicodes or { } + t[k] = unicodes + return unicodes + end +end) + +setmetatableindex(originals, function(t,k) -- always a unicode if k == true then return originals[currentfont()] else - local resources = resources[k] - local originals = resources and resources.originals or { } - local characters = characters[k] - local unicodes = { } - setmetatableindex(unicodes,function(t,k) - local v = originals[characters[k].index] or k - t[k] = v + local resolved = { } + setmetatableindex(resolved,function(t,name) + local u = unicodes[k][name] + local d = u and descriptions[k][u] + local v = d and d.unicode or u or 0 -- so we return notdef (at least for the moment) + t[name] = u return v end) - t[k] = unicodes - return unicodes + t[k] = resolved + return resolved + end +end) + +setmetatableindex(modes, function(t,k) + if k == true then + return modes[currentfont()] + else + local mode = properties[k].mode or "base" + t[k] = mode + return mode end end) diff --git a/Master/texmf-dist/tex/context/base/font-ini.lua b/Master/texmf-dist/tex/context/base/font-ini.lua index 884b22474c2..c547f89acf9 100644 --- a/Master/texmf-dist/tex/context/base/font-ini.lua +++ b/Master/texmf-dist/tex/context/base/font-ini.lua @@ -29,4 +29,4 @@ fonts.readers = { } fonts.definers = { methods = { } } fonts.loggers = { register = function() end } -fontloader.totable = fontloader.to_table +fontloader.totable = fontloader.to_table -- not used diff --git a/Master/texmf-dist/tex/context/base/font-ini.mkvi b/Master/texmf-dist/tex/context/base/font-ini.mkvi index c1e6d939055..c04952a9e89 100644 --- a/Master/texmf-dist/tex/context/base/font-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/font-ini.mkvi @@ -363,7 +363,7 @@ \let\thedefinedfont\relax % not to be confused with \everydefinefont \unexpanded\def\definedfont - {\doifnextoptionalcselse\font_basics_defined_font_yes\font_basics_defined_font_nop} + {\doifelsenextoptionalcs\font_basics_defined_font_yes\font_basics_defined_font_nop} \def\font_basics_defined_font_yes[#specification]% {\c_font_feature_inheritance_mode\c_font_feature_inheritance_fontonly @@ -419,24 +419,39 @@ %D When we assign for instance 12pt to a \DIMENSION\ register the \type %D {\the}'d value comes out as 12.0pt, which is often not the way users %D specify the bodyfont size. Therefore we use normalized values. They -%D are caches to save overhead in \LUA\ calls. +%D are cached to save overhead in \LUA\ calls. -\setnewconstant\fontdigits\plustwo +% \setnewconstant\fontdigits\plustwo % from now on always 2 \installcorenamespace{fontnormalizedbody} +% \def\normalizebodyfontsize#macro#body% +% {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname +% \ifx#macro\relax +% \normalizebodyfontsize_indeed#macro{#body}% +% \fi} +% +% \def\normalizebodyfontsize_indeed#macro#body% +% {\edef#macro{\ctxcommand{nbfs(\number\dimexpr#body,\number\fontdigits)}}% +% \global\expandafter\let\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname#macro} +% +% \def\thenormalizedbodyfontsize#body% +% {\ctxcommand{nbfs(\number\dimexpr#body\relax,\number\fontdigits)}} +% +% caching is less relevant now + \def\normalizebodyfontsize#macro#body% - {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname + {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\dimexpr#body\endcsname \ifx#macro\relax \normalizebodyfontsize_indeed#macro{#body}% \fi} \def\normalizebodyfontsize_indeed#macro#body% - {\edef#macro{\ctxcommand{nbfs(\number\dimexpr#body,\number\fontdigits)}}% - \global\expandafter\let\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname#macro} + {\edef#macro{\clf_nbfs\dimexpr#body\relax}% + \global\expandafter\let\csname\??fontnormalizedbody\number\dimexpr#body\endcsname#macro} \def\thenormalizedbodyfontsize#body% - {\ctxcommand{nbfs(\number\dimexpr#body\relax,\number\fontdigits)}} + {\clf_nbfs\dimexpr#body\relax} \edef\normalizedglobalbodyfontsize{\thenormalizedbodyfontsize\bodyfontsize} \edef\normalizedlocalbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize} @@ -723,7 +738,9 @@ \unexpanded\def\font_helpers_low_level_define#specification#csname% {% we can now set more at the lua end - \ctxcommand{definefont_one(\!!bs\luaescapestring{#specification}\!!es)}% the escapestring catches at \somedimen + \global\let\somefontname\defaultfontfile + \let\somefontsize\empty + \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen % sets \scaledfontmode and \somefontname and \somefontsize \ifcase\fontface\relax % \let\v_font_size_absolute\textface % fontbody @@ -774,39 +791,43 @@ \else \d_font_scaled_text_face\textface \fi - \edef\somefontspec{at \number\d_font_scaled_font_size sp}% probably no longer used, needs checking + \edef\somefontspec{at \number\d_font_scaled_font_size sp}% \edef\somefontfile{\truefontname\somefontname}% \ifx\somefontfile\s!unknown \edef\somefontfile{\defaultfontfile}% \fi - \ifx\somefontfile\s!unknown - \edef\somefontfile{\defaultfontfile}% - \fi \font_helpers_update_font_parameters \font_helpers_update_font_class_parameters % \writestatus{fonts}{low level define: #csname/\somefontfile/\number\d_font_scaled_font_size/\fontface/\number\d_font_scaled_text_face}% - \ctxcommand{definefont_two( - \ifx\fontclass\empty false\else true\fi, - "#csname", - \!!bs\somefontfile\!!es, - \number\d_font_scaled_font_size, - \number\c_font_feature_inheritance_mode, - "\m_font_class_features", - "\m_font_features", - "\m_font_class_fallbacks", - "\m_font_fallbacks", - \fontface, % 1/2/3: text script scriptscript 0/4/5: body x xx - \number\d_font_scaled_text_face, - "\number\relativefontid", % experiment - "\m_font_class_goodies", % experiment (not yet used) - "\m_font_goodies", - "\m_font_class_designsize", - "\m_font_designsize", - \number\scaledfontmode - )}% - \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks) - \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname - \the\everydefinefont + \clf_definefont_two + \ifx\fontclass\empty\s!false\else\s!true\fi + {#csname}% + {\somefontfile}% + \d_font_scaled_font_size + \c_font_feature_inheritance_mode + {\m_font_class_features}% + {\m_font_features}% + {\m_font_class_fallbacks}% + {\m_font_fallbacks}% + \fontface + \d_font_scaled_text_face + \relativefontid + {\m_font_class_goodies}% + {\m_font_goodies}% + {\m_font_class_designsize}% + {\m_font_designsize}% + \scaledfontmode + \relax + \ifcase\scaledfontsize + %\scaledfontsize\plusone + \let\somefontspec\empty + \let\lastrawfontcall\relax + \expandafter\let\csname#csname\endcsname\relax + \else + \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks) + \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname + \the\everydefinefont + \fi \c_font_feature_inheritance_mode\c_font_feature_inheritance_default} \def\font_helpers_check_body_scale#fontsize% gets character (x xx a etc) @@ -830,10 +851,10 @@ %D The following macros are used at the \LUA\ end. Watch the \type {\normal} %D hackery: this makes the mkvi parser happy. -\normaldef\fntsetdefname {\global\let\somefontname\defaultfontfile} % do before calling -\normaldef\fntsetsomename{\normalgdef\somefontname} % takes argument -\normaldef\fntsetnopsize {\let\somefontsize\empty} % do before calling -\normaldef\fntsetsomesize{\normaldef\somefontsize} % takes argument +% \normaldef\fntsetdefname {\global\let\somefontname\defaultfontfile} % do before calling +% \normaldef\fntsetnopsize {\let\somefontsize\empty} % do before calling +% \normaldef\fntsetsomename{\normalgdef\somefontname} % takes argument +% \normaldef\fntsetsomesize{\normaldef\somefontsize} % takes argument \newif\ifskipfontcharacteristics \skipfontcharacteristicstrue @@ -878,7 +899,7 @@ \fi} \def\font_basics_define_font_a[#name][#specification][#settings]% [name][spec][1.6 | line=10pt | setup_id] - {\doifsetupselse{#settings}% + {\doifelsesetups{#settings}% {\setuvalue{#name}{\font_basics_define_font_with_setups {#name}{#specification}{#settings}}} {\setuvalue{#name}{\font_basics_define_font_with_parameters{#name}{#specification}{#settings}}}} @@ -900,11 +921,19 @@ \unexpanded\def\definefrozenfont {\dotripleempty\font_basics_define_frozen_font} +% \def\font_basics_define_frozen_font[#name][#specification][#settings]% +% {\begingroup +% \font_basics_define_font[#name][#specification][#settings]% +% \csname#name\endcsname +% \expandafter\expandafter\expandafter\endgroup\expandafter\let\csname#name\endcsname\lastrawfontcall} + \def\font_basics_define_frozen_font[#name][#specification][#settings]% {\begingroup \font_basics_define_font[#name][#specification][#settings]% \csname#name\endcsname - \expandafter\endgroup\expandafter\let\csname#name\endcsname\lastrawfontcall} + \global\let\lastglobalrawfontcall\lastrawfontcall + \endgroup + \expandafter\let\csname#name\endcsname\lastglobalrawfontcall} %D The instance namespace protection makes the switch local so that we can redefine a %D logical name and/or change the size in between. @@ -1158,7 +1187,9 @@ \installcorenamespace{fontenvironmentknown} -\let\bodyfontenvironmentlist\empty % used in font-run (might change) +% \let\bodyfontenvironmentlist\empty % used in font-run (might change) + +\newtoks\bodyfontenvironmentlist \def\font_helpers_register_environment#class#body% {\expandafter\let\csname\??fontenvironmentknown#class#body\endcsname\empty} @@ -1179,6 +1210,12 @@ %D a bodyfont is loaded but changing them afterwards can be sort of tricky as %D values are not consulted afterwards. +\def\processbodyfontenvironmentlist#1% no \unexpanded as then we cannot use it in alignments + {\clf_processbodyfontsizes{\strippedcsname#1}} + +\def\bodyfontenvironmentlist + {\clf_getbodyfontsizes} + \def\font_basics_define_body_font_environment_class[#class][#body][#settings]% {\edef\m_font_body{#body}% \ifx\m_font_body\s!default @@ -1187,7 +1224,8 @@ \else \normalizebodyfontsize\m_font_body_normalized\m_font_body \font_basics_define_body_font_environment_size[#class][\m_font_body_normalized][#settings]% - \addtocommalist\m_font_body_normalized\bodyfontenvironmentlist + %\addtocommalist\m_font_body_normalized\bodyfontenvironmentlist + \clf_registerbodyfontsize{\m_font_body_normalized}% \fi} %D The empty case uses the same code but needs to ignore the current class @@ -1367,19 +1405,19 @@ {\font_basics_define_body_font_a[bwhatever][\s!rm][]} \unexpanded\def\font_basics_define_body_font_a[#whatever]% - {\doifnumberelse{#whatever}% + {\doifelsenumber{#whatever}% \font_basics_define_body_font_body \font_basics_define_body_font_name [#whatever]} \unexpanded\def\font_basics_define_body_font_body[#body][#style][#specification]% - {\doifassignmentelse{#specification} + {\doifelseassignment{#specification} \font_basics_define_body_font_body_assignment \font_basics_define_body_font_body_identifier [#body][#style][#specification]}% \unexpanded\def\font_basics_define_body_font_name[#name][#style][#specification]% - {\doifassignmentelse{#specification} + {\doifelseassignment{#specification} \font_basics_define_body_font_name_assignment \font_basics_define_body_font_name_identifier [#name][#style][#specification]}% @@ -1640,13 +1678,13 @@ \fi} \def\font_helpers_set_font_check_size#option% - {\doifnumberelse{#option}{\font_helpers_check_bodyfont_environment{#option}{#option}}\donothing} + {\doifelsenumber{#option}{\font_helpers_check_bodyfont_environment{#option}{#option}}\donothing} \def\font_helpers_set_font_set_font#method#option% method=1: set, method=2: switch {\doifsomething{#option}{\font_helpers_set_font_set_font_option{#method}{#option}}} \def\font_helpers_set_font_set_font_option#method#option% - {\doifnumberelse{#option}% + {\doifelsenumber{#option}% \font_helpers_set_font_set_font_option_body \font_helpers_set_font_set_font_option_keyword {#method}{#option}{#option}} @@ -1988,8 +2026,29 @@ %D takes a bit more time. Keep in mind that the fontsize is %D represented by a character or empty. -\unexpanded\def\tx {\font_helpers_set_current_font_x_alternative \fontalternative} -\unexpanded\def\txx{\font_helpers_set_current_font_xx_alternative\fontalternative} +% \unexpanded\def\tx {\font_helpers_set_current_font_x_alternative \fontalternative} +% \unexpanded\def\txx{\font_helpers_set_current_font_xx_alternative\fontalternative} + +\unexpanded\def\tx + {\ifmmode + \scriptstyle + \else + \let\fontface\!!plusfour + \let\fontalternative\fontalternative + \font_helpers_synchronize_font + \fi + \currentxfontsize\plusone + \let\tx\txx} + +\unexpanded\def\txx + {\ifmmode + \scriptscriptstyle + \else + \let\fontface\!!plusfive + \let\fontalternative\fontalternative + \font_helpers_synchronize_font + \fi + \currentxfontsize\plustwo} \let\normaltx \tx \let\normaltxx\txx @@ -2082,7 +2141,7 @@ % \newtoks \everyswitchtobodyfont \unexpanded\def\setupbodyfont - {\doifnextoptionalcselse\font_basics_setupbodyfont_yes\font_basics_setupbodyfont_nop} + {\doifelsenextoptionalcs\font_basics_setupbodyfont_yes\font_basics_setupbodyfont_nop} \def\font_basics_setupbodyfont_nop {\restoreglobalbodyfont @@ -2114,6 +2173,13 @@ \unexpanded\def\switchtobodyfont[#specification]% could become an ifx {\doifsomething{#specification}{\font_basics_switchtobodyfont{#specification}}} + +\unexpanded\def\usebodyfontparameter#1% + {\edef\m_font_bodyfont_asked{#1\c!bodyfont}% + \ifx\m_font_bodyfont_asked\empty\else + \font_basics_switchtobodyfont\m_font_bodyfont_asked + \fi} + \def\font_helpers_switch_bodyfont_step {\font_basics_switch_points\m_font_step \font_basics_switch_style \fontstyle} @@ -2169,14 +2235,28 @@ %D Handy for manuals: -\unexpanded\def\fontchar#character% - {\ctxcommand{fontchar("#character")}} -%D The next auxilliary macro is an alternative to \type -%D {\fontname}. +%D The \type {\tochar} commmand takes a specification: +%D +%D \starttabulate[|l|l|l|] +%D \NC e \NC entity \NC e:eacute \NC \NR +%D \NC x \NC hexadecimal unicode \NC x:013D \NC \NR +%D \NC d \NC decimal unicode \NC d:123 \NC \NR +%D \NC s \NC hexadecimal index (slot) \NC s:210D \NC \NR +%D \NC i \NC decimal index \NC i:456 \NC \NR +%D \NC n \NC name \NC n:eight \NC \NR +%D \NC c \NC name \NC c:x \NC \NR +%D \stoptabulate +%D +%D This is an expandable command! + +\unexpanded\def\fontchar #character{\clf_fontchar{#character}} +\unexpanded\def\fontcharbyindex #index{\clf_fontcharbyindex#index\relax} + \def\tochar #specifications{\clf_tochar{#specifications}} % expanded (also used in edef) + +%D The next auxilliary macro is an alternative to \type {\fontname}. -\def\purefontname#font{\ctxcommand{purefontname("\fontname#font")}} -%def\purefontname#font{\ctxcommand{purefontname(\number\fontid#font)}} +\def\purefontname#font{\clf_purefontname{\fontname#font}} %D \macros %D {switchstyleonly} @@ -2191,7 +2271,7 @@ %D \stoptyping \unexpanded\def\switchstyleonly - {\doifnextoptionalcselse\font_basics_switch_style_only_opt\font_basics_switch_style_only_arg} + {\doifelsenextoptionalcs\font_basics_switch_style_only_opt\font_basics_switch_style_only_arg} \def\font_basics_switch_style_only_arg#name% stupid version {\font_helpers_set_current_font_style{\csname\??fontshortstyle\checkedstrippedcsname#name\endcsname}% diff --git a/Master/texmf-dist/tex/context/base/font-inj.lua b/Master/texmf-dist/tex/context/base/font-inj.lua new file mode 100644 index 00000000000..cb9ed891cfc --- /dev/null +++ b/Master/texmf-dist/tex/context/base/font-inj.lua @@ -0,0 +1,1052 @@ +if not modules then modules = { } end modules ['font-inj'] = { + version = 1.001, + comment = "companion to font-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", +} + +-- This property based variant is not faster but looks nicer than the attribute one. We +-- need to use rawget (which is apbout 4 times slower than a direct access but we cannot +-- get/set that one for our purpose! + +if not nodes.properties then return end + +local next, rawget = next, rawget +local utfchar = utf.char +local fastcopy = table.fastcopy + +local trace_injections = false trackers.register("fonts.injections", function(v) trace_injections = v end) + +local report_injections = logs.reporter("fonts","injections") + +local attributes, nodes, node = attributes, nodes, node + +fonts = fonts +local fontdata = fonts.hashes.identifiers + +nodes.injections = nodes.injections or { } +local injections = nodes.injections + +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc +local kern_code = nodecodes.kern + +local nuts = nodes.nuts +local nodepool = nuts.pool + +local newkern = nodepool.kern + +local tonode = nuts.tonode +local tonut = nuts.tonut + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local traverse_id = nuts.traverse_id +local insert_node_before = nuts.insert_before +local insert_node_after = nuts.insert_after +local find_tail = nuts.tail + +local properties = nodes.properties.data + +function injections.installnewkern(nk) + newkern = nk or newkern +end + +local nofregisteredkerns = 0 +local nofregisteredpairs = 0 +local nofregisteredmarks = 0 +local nofregisteredcursives = 0 +----- markanchors = { } -- one base can have more marks +local keepregisteredcounts = false + +function injections.keepcounts() + keepregisteredcounts = true +end + +function injections.resetcounts() + nofregisteredkerns = 0 + nofregisteredpairs = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + keepregisteredcounts = false +end + +-- We need to make sure that a possible metatable will not kick in +-- unexpectedly. + +function injections.reset(n) + local p = rawget(properties,n) + if p and rawget(p,"injections") then + p.injections = nil + end +end + +function injections.copy(target,source) + local sp = rawget(properties,source) + if sp then + local tp = rawget(properties,target) + local si = rawget(sp,"injections") + if si then + si = fastcopy(si) + if tp then + tp.injections = si + else + propertydata[target] = { + injections = si, + } + end + else + if tp then + tp.injections = nil + end + end + end +end + +function injections.setligaindex(n,index) + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + i.ligaindex = index + else + p.injections = { + ligaindex = index + } + end + else + properties[n] = { + injections = { + ligaindex = index + } + } + end +end + +function injections.getligaindex(n,default) + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + return i.ligaindex or default + end + end + return default +end + +function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes + local dx = factor*(exit[1]-entry[1]) + local dy = -factor*(exit[2]-entry[2]) + local ws, wn = tfmstart.width, tfmnext.width + nofregisteredcursives = nofregisteredcursives + 1 + if rlmode < 0 then + dx = -(dx + wn) + else + dx = dx - ws + end + -- + local p = rawget(properties,start) + if p then + local i = rawget(p,"injections") + if i then + i.cursiveanchor = true + else + p.injections = { + cursiveanchor = true, + } + end + else + properties[start] = { + injections = { + cursiveanchor = true, + }, + } + end + local p = rawget(properties,nxt) + if p then + local i = rawget(p,"injections") + if i then + i.cursivex = dx + i.cursivey = dy + else + p.injections = { + cursivex = dx, + cursivey = dy, + } + end + else + properties[nxt] = { + injections = { + cursivex = dx, + cursivey = dy, + }, + } + end + return dx, dy, nofregisteredcursives +end + +function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used + local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4] + if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then -- okay? + local yoffset = y - h + local leftkern = x -- both kerns are set in a pair kern compared + local rightkern = w - x -- to normal kerns where we set only leftkern + if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then + nofregisteredpairs = nofregisteredpairs + 1 + if rlmode and rlmode < 0 then + leftkern, rightkern = rightkern, leftkern + end + local p = rawget(properties,current) + if p then + local i = rawget(p,"injections") + if i then + if leftkern ~= 0 then + i.leftkern = (i.leftkern or 0) + leftkern + end + if rightkern ~= 0 then + i.rightkern = (i.rightkern or 0) + rightkern + end + if yoffset ~= 0 then + i.yoffset = (i.yoffset or 0) + yoffset + end + elseif leftkern ~= 0 or rightkern ~= 0 then + p.injections = { + leftkern = leftkern, + rightkern = rightkern, + yoffset = yoffset, + } + else + p.injections = { + yoffset = yoffset, + } + end + elseif leftkern ~= 0 or rightkern ~= 0 then + properties[current] = { + injections = { + leftkern = leftkern, + rightkern = rightkern, + yoffset = yoffset, + }, + } + else + properties[current] = { + injections = { + yoffset = yoffset, + }, + } + end + return x, y, w, h, nofregisteredpairs + end + end + return x, y, w, h -- no bound +end + +-- this needs checking for rl < 0 but it is unlikely that a r2l script +-- uses kernclasses between glyphs so we're probably safe (KE has a +-- problematic font where marks interfere with rl < 0 in the previous +-- case) + +function injections.setkern(current,factor,rlmode,x,injection) + local dx = factor * x + if dx ~= 0 then + nofregisteredkerns = nofregisteredkerns + 1 + local p = rawget(properties,current) + if not injection then + injection = "injections" + end + if p then + local i = rawget(p,injection) + if i then + i.leftkern = dx + (i.leftkern or 0) + else + p[injection] = { + leftkern = dx, + } + end + else + properties[current] = { + [injection] = { + leftkern = dx, + }, + } + end + return dx, nofregisteredkerns + else + return 0, 0 + end +end + +function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) -- ba=baseanchor, ma=markanchor + local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2]) + nofregisteredmarks = nofregisteredmarks + 1 + -- markanchors[nofregisteredmarks] = base + if rlmode >= 0 then + dx = tfmbase.width - dx -- see later commented ox + end + local p = rawget(properties,start) + if p then + local i = rawget(p,"injections") + if i then + i.markx = dx + i.marky = dy + i.markdir = rlmode or 0 + i.markbase = nofregisteredmarks + i.markbasenode = base + else + p.injections = { + markx = dx, + marky = dy, + markdir = rlmode or 0, + markbase = nofregisteredmarks, + markbasenode = base, + } + end + else + properties[start] = { + injections = { + markx = dx, + marky = dy, + markdir = rlmode or 0, + markbase = nofregisteredmarks, + markbasenode = base, + }, + } + end + return dx, dy, nofregisteredmarks +end + +local function dir(n) + return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset" +end + +local function showchar(n,nested) + local char = getchar(n) + report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char) +end + +local function show(n,what,nested,symbol) + if n then + local p = rawget(properties,n) + if p then + local i = rawget(p,what) + if i then + local leftkern = i.leftkern or 0 + local rightkern = i.rightkern or 0 + local yoffset = i.yoffset or 0 + local markx = i.markx or 0 + local marky = i.marky or 0 + local markdir = i.markdir or 0 + local markbase = i.markbase or 0 -- will be markbasenode + local cursivex = i.cursivex or 0 + local cursivey = i.cursivey or 0 + local ligaindex = i.ligaindex or 0 + local margin = nested and 4 or 2 + -- + if rightkern ~= 0 or yoffset ~= 0 then + report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset) + elseif leftkern ~= 0 then + report_injections("%w%s kern: dx %p",margin,symbol,leftkern) + end + if markx ~= 0 or marky ~= 0 or markbase ~= 0 then + report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase ~= 0 and "yes" or "no") + end + if cursivex ~= 0 or cursivey ~= 0 then + report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey) + end + if ligaindex ~= 0 then + report_injections("%w%s liga: index %i",margin,symbol,ligaindex) + end + end + end + end +end + +local function showsub(n,what,where) + report_injections("begin subrun: %s",where) + for n in traverse_id(glyph_code,n) do + showchar(n,where) + show(n,what,where," ") + end + report_injections("end subrun") +end + +local function trace(head,where) + report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", + where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) + local n = head + while n do + local id = getid(n) + if id == glyph_code then + showchar(n) + show(n,"injections",false," ") + show(n,"preinjections",false,"<") + show(n,"postinjections",false,">") + show(n,"replaceinjections",false,"=") + elseif id == disc_code then + local pre = getfield(n,"pre") + local post = getfield(n,"post") + local replace = getfield(n,"replace") + if pre then + showsub(pre,"preinjections","pre") + end + if post then + showsub(post,"postinjections","post") + end + if replace then + showsub(replace,"replaceinjections","replace") + end + end + n = getnext(n) + end + report_injections("end run") +end + +local function show_result(head) + local current = head + local skipping = false + while current do + local id = getid(current) + if id == glyph_code then + report_injections("char: %C, width %p, xoffset %p, yoffset %p", + getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset")) + skipping = false + elseif id == kern_code then + report_injections("kern: %p",getfield(current,"kern")) + skipping = false + elseif not skipping then + report_injections() + skipping = true + end + current = getnext(current) + end +end + +-- we could also check for marks here but maybe not all are registered (needs checking) + +local function collect_glyphs_1(head) + local glyphs, nofglyphs = { }, 0 + local marks, nofmarks = { }, 0 + local nf, tm = nil, nil + for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts + if getsubtype(n) < 256 then + local f = getfont(n) + if f ~= nf then + nf = f + tm = fontdata[nf].resources.marks -- other hash in ctx + end + if tm and tm[getchar(n)] then + nofmarks = nofmarks + 1 + marks[nofmarks] = n + else + nofglyphs = nofglyphs + 1 + glyphs[nofglyphs] = n + end + -- yoffsets can influence curs steps + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + end + end + end + end + return glyphs, nofglyphs, marks, nofmarks +end + +local function collect_glyphs_2(head) + local glyphs, nofglyphs = { }, 0 + local marks, nofmarks = { }, 0 + local nf, tm = nil, nil + for n in traverse_id(glyph_code,head) do + if getsubtype(n) < 256 then + local f = getfont(n) + if f ~= nf then + nf = f + tm = fontdata[nf].resources.marks -- other hash in ctx + end + if tm and tm[getchar(n)] then + nofmarks = nofmarks + 1 + marks[nofmarks] = n + else + nofglyphs = nofglyphs + 1 + glyphs[nofglyphs] = n + end + end + end + return glyphs, nofglyphs, marks, nofmarks +end + +local function inject_marks(marks,nofmarks) + for i=1,nofmarks do + local n = marks[i] + local pn = rawget(properties,n) + if pn then + pn = rawget(pn,"injections") + if pn then + local p = pn.markbasenode + if p then + local px = getfield(p,"xoffset") + local ox = 0 + local rightkern = nil + local pp = rawget(properties,p) + if pp then + pp = rawget(pp,"injections") + if pp then + rightkern = pp.rightkern + end + end + if rightkern then -- x and w ~= 0 + if pn.markdir < 0 then + -- kern(w-x) glyph(p) kern(x) mark(n) + ox = px - pn.markx - rightkern + -- report_injections("r2l case 1: %p",ox) + else + -- kern(x) glyph(p) kern(w-x) mark(n) + -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern + local leftkern = pp.leftkern + if leftkern then + ox = px - pn.markx + else + ox = px - pn.markx - leftkern + end +-- report_injections("l2r case 1: %p",ox) + end + else + -- we need to deal with fonts that have marks with width + -- if pn.markdir < 0 then + -- ox = px - pn.markx + -- -- report_injections("r2l case 3: %p",ox) + -- else + -- -- ox = px - getfield(p,"width") + pn.markx + ox = px - pn.markx + -- report_injections("l2r case 3: %p",ox) + -- end + local wn = getfield(n,"width") -- in arial marks have widths + if wn ~= 0 then + -- bad: we should center + -- insert_node_before(head,n,newkern(-wn/2)) + -- insert_node_after(head,n,newkern(-wn/2)) + pn.leftkern = -wn/2 + pn.rightkern = -wn/2 + -- wx[n] = { 0, -wn/2, 0, -wn } + end + -- so far + end + setfield(n,"xoffset",ox) + -- + local py = getfield(p,"yoffset") + local oy = 0 + if marks[p] then + oy = py + pn.marky + else + oy = getfield(n,"yoffset") + py + pn.marky + end + setfield(n,"yoffset",oy) + else + -- normally this can't happen (only when in trace mode which is a special case anyway) + -- report_injections("missing mark anchor %i",pn.markbase or 0) + end + end + end + end +end + +local function inject_cursives(glyphs,nofglyphs) + local cursiveanchor, lastanchor = nil, nil + local minc, maxc, last = 0, 0, nil + for i=1,nofglyphs do + local n = glyphs[i] + local pn = rawget(properties,n) + if pn then + pn = rawget(pn,"injections") + end + if pn then + local cursivex = pn.cursivex + if cursivex then + if cursiveanchor then + if cursivex ~= 0 then + pn.leftkern = (pn.leftkern or 0) + cursivex + end + if lastanchor then + if maxc == 0 then + minc = lastanchor + end + maxc = lastanchor + properties[cursiveanchor].cursivedy = pn.cursivey + end + last = n + else + maxc = 0 + end + elseif maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? + end + maxc = 0 + end + if pn.cursiveanchor then + cursiveanchor = n + lastanchor = i + else + cursiveanchor = nil + lastanchor = nil + if maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? + end + maxc = 0 + end + end + elseif maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",getfield(ti,"yoffset") + ny) -- ? + end + maxc = 0 + cursiveanchor = nil + lastanchor = nil + end + -- if maxc > 0 and not cursiveanchor then + -- local ny = getfield(n,"yoffset") + -- for i=maxc,minc,-1 do + -- local ti = glyphs[i] + -- ny = ny + properties[ti].cursivedy + -- setfield(ti,"yoffset",ny) -- why not add ? + -- end + -- maxc = 0 + -- end + end + if last and maxc > 0 then + local ny = getfield(last,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? + end + end +end + +local function inject_kerns(head,glyphs,nofglyphs) + -- todo: pre/post/replace + for i=1,#glyphs do + local n = glyphs[i] + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + insert_node_before(head,n,newkern(leftkern)) -- type 0/2 + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) -- type 0/2 + end + end + end + end +end + +local function inject_everything(head,where) + head = tonut(head) + if trace_injections then + trace(head,"everything") + end + local glyphs, nofglyphs, marks, nofmarks + if nofregisteredpairs > 0 then + glyphs, nofglyphs, marks, nofmarks = collect_glyphs_1(head) + else + glyphs, nofglyphs, marks, nofmarks = collect_glyphs_2(head) + end + if nofglyphs > 0 then + if nofregisteredcursives > 0 then + inject_cursives(glyphs,nofglyphs) + end + if nofregisteredmarks > 0 then -- and nofmarks > 0 + inject_marks(marks,nofmarks) + end + inject_kerns(head,glyphs,nofglyphs) + end + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredkerns = 0 + nofregisteredpairs = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + end + return tonode(head), true +end + +local function inject_kerns_only(head,where) + head = tonut(head) + if trace_injections then + trace(head,"kerns") + end + local n = head + local p = nil + while n do + local id = getid(n) + if id == glyph_code then + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + if p then + local d = getfield(p,"post") + if d then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + end + end + local d = getfield(p,"replace") + if d then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + end + else + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + setfield(p,"replace",newkern(leftkern)) + end + end + end + else + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + head = insert_node_before(head,n,newkern(leftkern)) + end + end + end + end + else + break + end + p = nil + elseif id == disc_code then + local d = getfield(n,"pre") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"preinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"pre",h) + end + end + local d = getfield(n,"post") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"post",h) + end + end + local d = getfield(n,"replace") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) -- why can it be empty { } + if pn then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"replace",h) + end + end + p = n + else + p = nil + end + n = getnext(n) + end + -- + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredkerns = 0 + end + return tonode(head), true +end + +local function inject_pairs_only(head,where) + head = tonut(head) + if trace_injections then + trace(head,"pairs") + end + -- + local n = head + local p = nil + while n do + local id = getid(n) + if id == glyph_code then + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + if p then + local d = getfield(p,"post") + if d then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end + end + end + local d = getfield(p,"replace") + if d then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end + end + else + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + setfield(p,"replace",newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end + end + end + else + -- this is the most common case + local i = rawget(pn,"injections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + insert_node_before(head,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end + end + end + end + else + break + end + p = nil + elseif id == disc_code then + local d = getfield(n,"pre") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(p,"preinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"pre",h) + end + end + local d = getfield(n,"post") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(p,"postinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"post",h) + end + end + local d = getfield(n,"replace") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(pn,"replaceinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"replace",h) + end + end + p = n + else + p = nil + end + n = getnext(n) + end + -- + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredpairs = 0 + nofregisteredkerns = 0 + end + return tonode(head), true +end + +function injections.handler(head,where) -- optimize for n=1 ? + if nofregisteredmarks > 0 or nofregisteredcursives > 0 then + return inject_everything(head,where) + elseif nofregisteredpairs > 0 then + return inject_pairs_only(head,where) + elseif nofregisteredkerns > 0 then + return inject_kerns_only(head,where) + else + return head, false + end +end diff --git a/Master/texmf-dist/tex/context/base/font-lib.mkvi b/Master/texmf-dist/tex/context/base/font-lib.mkvi index bfd85245cff..59074b07df2 100644 --- a/Master/texmf-dist/tex/context/base/font-lib.mkvi +++ b/Master/texmf-dist/tex/context/base/font-lib.mkvi @@ -19,7 +19,7 @@ \registerctxluafile{font-log}{1.001} \registerctxluafile{font-con}{1.001} \registerctxluafile{font-enc}{1.001} -%registerctxluafile{font-agl}{1.001} % loaded when needed, saves 100K in format +\registerctxluafile{font-agl}{1.001} % if needed we can comment this and delay loading \registerctxluafile{font-cid}{1.001} % cid maps \registerctxluafile{font-map}{1.001} \registerctxluafile{font-syn}{1.001} @@ -39,12 +39,13 @@ \registerctxluafile{font-otf}{1.001} % otf main \registerctxluafile{font-otb}{1.001} % otf main base -\doiffileelse{font-inj.lua} - {\registerctxluafile{font-inj}{1.001}} % new method (for the moment only local) - {\registerctxluafile{node-inj}{1.001}} % old method +% \doiffileelse{font-inj.lua} +% {\registerctxluafile{font-inj}{1.001}} % new method (for the moment only local) +% {\registerctxluafile{node-inj}{1.001}} % old method -%registerctxluafile{font-ota}{1.001} % otf analyzers -\registerctxluafile{font-otx}{1.001} % otf analyzers +\registerctxluafile{font-inj}{1.001} % the old method (lacks some features) + +\registerctxluafile{font-ota}{1.001} % otf analyzers \registerctxluafile{font-otn}{1.001} % otf main node \registerctxluafile{font-otd}{1.001} % otf dynamics (does an overload) \registerctxluafile{font-otp}{1.001} % otf pack @@ -90,17 +91,16 @@ %D \stoptyping % we can also move the lookups to the fonts.namespace (of commands) +% one can also directly use the clf calls when speed is needed -% these will be renamed but it needs synchronization with WS - -\def\dolookupfontbyspec #1{\ctxcommand{fontlookupinitialize("#1")}} -\def\dolookupnoffound {\ctxcommand{fontlookupnoffound()}} -\def\dolookupgetkeyofindex#1#2{\ctxcommand{fontlookupgetkeyofindex("#1",#2)}} -\def\dolookupgetkey #1{\ctxcommand{fontlookupgetkey("#1")}} -\def\cleanfontname #1{\ctxcommand{cleanfontname("#1")}} +\def\dolookupfontbyspec #1{\clf_fontlookupinitialize{#1}} +\def\dolookupnoffound {\clf_fontlookupnoffound} +\def\dolookupgetkeyofindex#1#2{\clf_fontlookupgetkeyofindex{#1}\numexpr#2\relax} +\def\dolookupgetkey #1{\clf_fontlookupgetkey{#1}} +\def\cleanfontname #1{\clf_cleanfontname{#1}} % new: -\unexpanded\def\setfontofid#1{\ctxcommand{setfontofid(#1)}} +\unexpanded\def\setfontofid#1{\ctf_setfontofid#1\relax} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/font-map.lua b/Master/texmf-dist/tex/context/base/font-map.lua index f74e13e8161..449a00f2efd 100644 --- a/Master/texmf-dist/tex/context/base/font-map.lua +++ b/Master/texmf-dist/tex/context/base/font-map.lua @@ -6,12 +6,13 @@ if not modules then modules = { } end modules ['font-map'] = { license = "see context related readme files" } -local tonumber = tonumber +local tonumber, next, type = tonumber, next, type local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower local P, R, S, C, Ct, Cc, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.match local utfbyte = utf.byte local floor = math.floor +local formatters = string.formatters local trace_loading = false trackers.register("fonts.loading", function(v) trace_loading = v end) local trace_mapping = false trackers.register("fonts.mapping", function(v) trace_unimapping = v end) @@ -22,6 +23,8 @@ local fonts = fonts or { } local mappings = fonts.mappings or { } fonts.mappings = mappings +local allocate = utilities.storage.allocate + --[[ldx--

Eventually this code will disappear because map files are kind of obsolete. Some code may move to runtime or auxiliary modules.

@@ -66,11 +69,14 @@ local function makenameparser(str) end end +local f_single = formatters["%04X"] +local f_double = formatters["%04X%04X"] + local function tounicode16(unicode,name) if unicode < 0x10000 then - return format("%04X",unicode) + return f_single(unicode) elseif unicode < 0x1FFFFFFFFF then - return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) + return f_double(floor(unicode/1024),unicode%1024+0xDC00) else report_fonts("can't convert %a in %a into tounicode",unicode,name) end @@ -79,18 +85,46 @@ end local function tounicode16sequence(unicodes,name) local t = { } for l=1,#unicodes do - local unicode = unicodes[l] - if unicode < 0x10000 then - t[l] = format("%04X",unicode) + local u = unicodes[l] + if u < 0x10000 then + t[l] = f_single(u) elseif unicode < 0x1FFFFFFFFF then - t[l] = format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) + t[l] = f_double(floor(u/1024),u%1024+0xDC00) else - report_fonts ("can't convert %a in %a into tounicode",unicode,name) + report_fonts ("can't convert %a in %a into tounicode",u,name) + return end end return concat(t) end +local function tounicode(unicode,name) + if type(unicode) == "table" then + local t = { } + for l=1,#unicode do + local u = unicode[l] + if u < 0x10000 then + t[l] = f_single(u) + elseif u < 0x1FFFFFFFFF then + t[l] = f_double(floor(u/1024),u%1024+0xDC00) + else + report_fonts ("can't convert %a in %a into tounicode",u,name) + return + end + end + return concat(t) + else + if unicode < 0x10000 then + return f_single(unicode) + elseif unicode < 0x1FFFFFFFFF then + return f_double(floor(unicode/1024),unicode%1024+0xDC00) + else + report_fonts("can't convert %a in %a into tounicode",unicode,name) + end + end +end + + local function fromunicode16(str) if #str == 4 then return tonumber(str,16) @@ -136,6 +170,7 @@ end mappings.loadlumtable = loadlumtable mappings.makenameparser = makenameparser +mappings.tounicode = tounicode mappings.tounicode16 = tounicode16 mappings.tounicode16sequence = tounicode16sequence mappings.fromunicode16 = fromunicode16 @@ -149,6 +184,8 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator * -- print(string.formatters["%s: [% t]"](name,split)) -- end +-- maybe: ff fi fl ffi ffl => f_f f_i f_l f_f_i f_f_l + -- test("i.f_") -- test("this") -- test("this.that") @@ -156,33 +193,54 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator * -- test("such_so_more") -- test("such_so_more.that") +-- to be completed .. for fonts that use unicodes for ligatures which +-- is a actually a bad thing and should be avoided in the first place + +local overloads = allocate { + IJ = { name = "I_J", unicode = { 0x49, 0x4A }, mess = 0x0132 }, + ij = { name = "i_j", unicode = { 0x69, 0x6A }, mess = 0x0133 }, + ff = { name = "f_f", unicode = { 0x66, 0x66 }, mess = 0xFB00 }, + fi = { name = "f_i", unicode = { 0x66, 0x69 }, mess = 0xFB01 }, + fl = { name = "f_l", unicode = { 0x66, 0x6C }, mess = 0xFB02 }, + ffi = { name = "f_f_i", unicode = { 0x66, 0x66, 0x69 }, mess = 0xFB03 }, + ffl = { name = "f_f_l", unicode = { 0x66, 0x66, 0x6C }, mess = 0xFB04 }, + fj = { name = "f_j", unicode = { 0x66, 0x6A } }, + fk = { name = "f_k", unicode = { 0x66, 0x6B } }, +} + +for k, v in next, overloads do + local name = v.name + local mess = v.mess + if name then + overloads[name] = v + end + if mess then + overloads[mess] = v + end +end + +mappings.overloads = overloads + function mappings.addtounicode(data,filename) local resources = data.resources local properties = data.properties local descriptions = data.descriptions local unicodes = resources.unicodes + local lookuptypes = resources.lookuptypes if not unicodes then return end -- we need to move this code - unicodes['space'] = unicodes['space'] or 32 - unicodes['hyphen'] = unicodes['hyphen'] or 45 - unicodes['zwj'] = unicodes['zwj'] or 0x200D - unicodes['zwnj'] = unicodes['zwnj'] or 0x200C - -- the tounicode mapping is sparse and only needed for alternatives + unicodes['space'] = unicodes['space'] or 32 + unicodes['hyphen'] = unicodes['hyphen'] or 45 + unicodes['zwj'] = unicodes['zwj'] or 0x200D + unicodes['zwnj'] = unicodes['zwnj'] or 0x200C local private = fonts.constructors.privateoffset - local unknown = format("%04X",utfbyte("?")) local unicodevector = fonts.encodings.agl.unicodes -- loaded runtime in context - local tounicode = { } - local originals = { } - resources.tounicode = tounicode - resources.originals = originals + ----- namevector = fonts.encodings.agl.names -- loaded runtime in context + local missing = { } local lumunic, uparser, oparser local cidinfo, cidnames, cidcodes, usedmap - if false then -- will become an option - lumunic = loadlumtable(filename) - lumunic = lumunic and lumunic.tounicode - end -- cidinfo = properties.cidinfo usedmap = cidinfo and fonts.cid.getmap(cidinfo) @@ -197,12 +255,16 @@ function mappings.addtounicode(data,filename) for unic, glyph in next, descriptions do local index = glyph.index local name = glyph.name - if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then + local r = overloads[name] + if r then + -- get rid of weird ligatures + -- glyph.name = r.name + glyph.unicode = r.unicode + elseif unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then local unicode = lumunic and lumunic[name] or unicodevector[name] if unicode then - originals[index] = unicode - tounicode[index] = tounicode16(unicode,name) - ns = ns + 1 + glyph.unicode = unicode + ns = ns + 1 end -- cidmap heuristics, beware, there is no guarantee for a match unless -- the chain resolves @@ -211,9 +273,8 @@ function mappings.addtounicode(data,filename) if foundindex then unicode = cidcodes[foundindex] -- name to number if unicode then - originals[index] = unicode - tounicode[index] = tounicode16(unicode,name) - ns = ns + 1 + glyph.unicode = unicode + ns = ns + 1 else local reference = cidnames[foundindex] -- number to name if reference then @@ -221,23 +282,20 @@ function mappings.addtounicode(data,filename) if foundindex then unicode = cidcodes[foundindex] if unicode then - originals[index] = unicode - tounicode[index] = tounicode16(unicode,name) - ns = ns + 1 + glyph.unicode = unicode + ns = ns + 1 end end if not unicode or unicode == "" then local foundcodes, multiple = lpegmatch(uparser,reference) if foundcodes then - originals[index] = foundcodes + glyph.unicode = foundcodes if multiple then - tounicode[index] = tounicode16sequence(foundcodes) - nl = nl + 1 - unicode = true + nl = nl + 1 + unicode = true else - tounicode[index] = tounicode16(foundcodes,name) - ns = ns + 1 - unicode = foundcodes + ns = ns + 1 + unicode = foundcodes end end end @@ -284,11 +342,9 @@ function mappings.addtounicode(data,filename) if n == 0 then -- done then -- nothing elseif n == 1 then - originals[index] = t[1] - tounicode[index] = tounicode16(t[1],name) + glyph.unicode = t[1] else - originals[index] = t - tounicode[index] = tounicode16sequence(t) + glyph.unicode = t end nl = nl + 1 end @@ -296,32 +352,163 @@ function mappings.addtounicode(data,filename) if not unicode or unicode == "" then local foundcodes, multiple = lpegmatch(uparser,name) if foundcodes then + glyph.unicode = foundcodes if multiple then - originals[index] = foundcodes - tounicode[index] = tounicode16sequence(foundcodes,name) - nl = nl + 1 - unicode = true + nl = nl + 1 + unicode = true else - originals[index] = foundcodes - tounicode[index] = tounicode16(foundcodes,name) - ns = ns + 1 - unicode = foundcodes + ns = ns + 1 + unicode = foundcodes end end end - -- if not unicode then - -- originals[index] = 0xFFFD - -- tounicode[index] = "FFFD" + -- check using substitutes and alternates + local r = overloads[unicode] + if r then + unicode = r.unicode + glyph.unicode = unicode + end + -- + if not unicode then + missing[name] = true + end + end + end + if next(missing) then + local guess = { } + -- helper + local function check(gname,code,unicode) + local description = descriptions[code] + -- no need to add a self reference + local variant = description.name + if variant == gname then + return + end + -- the variant already has a unicode (normally that resultrs in a default tounicode to self) + local unic = unicodes[variant] + if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then + -- no default mapping and therefore maybe no tounicode yet + else + return + end + -- the variant already has a tounicode + if descriptions[code].unicode then + return + end + -- add to the list + local g = guess[variant] + -- local r = overloads[unicode] + -- if r then + -- unicode = r.unicode -- end + if g then + g[gname] = unicode + else + guess[variant] = { [gname] = unicode } + end + end + -- + for unicode, description in next, descriptions do + local slookups = description.slookups + if slookups then + local gname = description.name + for tag, data in next, slookups do + local lookuptype = lookuptypes[tag] + if lookuptype == "alternate" then + for i=1,#data do + check(gname,data[i],unicode) + end + elseif lookuptype == "substitution" then + check(gname,data,unicode) + end + end + end + local mlookups = description.mlookups + if mlookups then + local gname = description.name + for tag, list in next, mlookups do + local lookuptype = lookuptypes[tag] + if lookuptype == "alternate" then + for i=1,#list do + local data = list[i] + for i=1,#data do + check(gname,data[i],unicode) + end + end + elseif lookuptype == "substitution" then + for i=1,#list do + check(gname,list[i],unicode) + end + end + end + end + end + -- resolve references + local done = true + while done do + done = false + for k, v in next, guess do + if type(v) ~= "number" then + for kk, vv in next, v do + if vv == -1 or vv >= private or (vv >= 0xE000 and vv <= 0xF8FF) or vv == 0xFFFE or vv == 0xFFFF then + local uu = guess[kk] + if type(uu) == "number" then + guess[k] = uu + done = true + end + else + guess[k] = vv + done = true + end + end + end + end + end + -- wrap up + local orphans = 0 + local guessed = 0 + for k, v in next, guess do + if type(v) == "number" then + descriptions[unicodes[k]].unicode = descriptions[v].unicode or v -- can also be a table + guessed = guessed + 1 + else + local t = nil + local l = lower(k) + local u = unicodes[l] + if not u then + orphans = orphans + 1 + elseif u == -1 or u >= private or (u >= 0xE000 and u <= 0xF8FF) or u == 0xFFFE or u == 0xFFFF then + local unicode = descriptions[u].unicode + if unicode then + descriptions[unicodes[k]].unicode = unicode + guessed = guessed + 1 + else + orphans = orphans + 1 + end + else + orphans = orphans + 1 + end + end + end + if trace_loading and orphans > 0 or guessed > 0 then + report_fonts("%s glyphs with no related unicode, %s guessed, %s orphans",guessed+orphans,guessed,orphans) end end if trace_mapping then for unic, glyph in table.sortedhash(descriptions) do - local name = glyph.name - local index = glyph.index - local toun = tounicode[index] - if toun then - report_fonts("internal slot %U, name %a, unicode %U, tounicode %a",index,name,unic,toun) + local name = glyph.name + local index = glyph.index + local unicode = glyph.unicode + if unicode then + if type(unicode) == "table" then + local unicodes = { } + for i=1,#unicode do + unicodes[i] = formatters("%U",unicode[i]) + end + report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,unic,unicodes) + else + report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,unic,unicode) + end else report_fonts("internal slot %U, name %a, unicode %U",index,name,unic) end diff --git a/Master/texmf-dist/tex/context/base/font-mis.lua b/Master/texmf-dist/tex/context/base/font-mis.lua index 7385d6f3116..0ec95ee1b56 100644 --- a/Master/texmf-dist/tex/context/base/font-mis.lua +++ b/Master/texmf-dist/tex/context/base/font-mis.lua @@ -22,9 +22,15 @@ local handlers = fonts.handlers handlers.otf = handlers.otf or { } local otf = handlers.otf -otf.version = otf.version or 2.755 +otf.version = otf.version or 2.803 otf.cache = otf.cache or containers.define("fonts", "otf", otf.version, true) +local fontloader = fontloader +local font_to_table = fontloader.to_table +local open_font = fontloader.open +local get_font_info = fontloader.info +local close_font = fontloader.close + function otf.loadcached(filename,format,sub) -- no recache when version mismatch local name = file.basename(file.removesuffix(filename)) @@ -54,10 +60,10 @@ function fonts.helpers.getfeatures(name,t,script,language) -- maybe per font typ if data and data.resources and data.resources.features then return data.resources.features else - local ff = fontloader.open(filename) + local ff = open_font(filename) if ff then - local data = fontloader.to_table(ff) - fontloader.close(ff) + local data = font_to_table(ff) + close_font(ff) local features = { } for k=1,#featuregroups do local what = featuregroups[k] diff --git a/Master/texmf-dist/tex/context/base/font-nod.lua b/Master/texmf-dist/tex/context/base/font-nod.lua index 8251dc58842..26c736582b1 100644 --- a/Master/texmf-dist/tex/context/base/font-nod.lua +++ b/Master/texmf-dist/tex/context/base/font-nod.lua @@ -11,10 +11,10 @@ if not modules then modules = { } end modules ['font-nod'] = { might become a runtime module instead. This module will be cleaned up!

--ldx]]-- -local tonumber, tostring = tonumber, tostring +local tonumber, tostring, rawget = tonumber, tostring, rawget local utfchar = utf.char -local concat = table.concat -local match, gmatch, concat, rep = string.match, string.gmatch, table.concat, string.rep +local concat, fastcopy = table.concat, table.fastcopy +local match, rep = string.match, string.rep local report_nodes = logs.reporter("fonts","tracing") @@ -75,6 +75,7 @@ local copy_node_list = nuts.copy_list local hpack_node_list = nuts.hpack local free_node_list = nuts.flush_list local traverse_nodes = nuts.traverse +local traverse_id = nuts.traverse_id local protect_glyphs = nuts.protect_glyphs local nodepool = nuts.pool @@ -91,6 +92,25 @@ local fontcharacters = hashes.characters local fontproperties = hashes.properties local fontparameters = hashes.parameters +local properties = nodes.properties.data + +-- direct.set_properties_mode(true,false) +-- direct.set_properties_mode(true,true) -- default + +local function freeze(h,where) + -- report_nodes("freezing %s",where) + for n in traverse_nodes(tonut(h)) do -- todo: disc but not traced anyway + local p = properties[n] + if p then + local i = p.injections if i then p.injections = fastcopy(i) end + -- local i = r.preinjections if i then p.preinjections = fastcopy(i) end + -- local i = r.postinjections if i then p.postinjections = fastcopy(i) end + -- local i = r.replaceinjections if i then p.replaceinjections = fastcopy(i) end + -- only injections + end + end +end + function char_tracers.collect(head,list,tag,n) head = tonut(head) n = n or 0 @@ -103,7 +123,7 @@ function char_tracers.collect(head,list,tag,n) ok, fn = false, f end local c = getchar(head) - local i = fontidentifiers[f].indices[c] or 0 + -- local i = fontidentifiers[f].indices[c] or 0 -- zero anyway as indices is nilled if not ok then ok = true n = n + 1 @@ -111,9 +131,28 @@ function char_tracers.collect(head,list,tag,n) list[n][tag] = { } end local l = list[n][tag] - l[#l+1] = { c, f, i } + -- l[#l+1] = { c, f, i } + l[#l+1] = { c, f } elseif id == disc_code then -- skip +-- local replace = getfield(head,"replace") +-- if replace then +-- for n in traverse_id(glyph_code,replace) do +-- l[#l+1] = { c, f } +-- end +-- end +-- local pre = getfield(head,"pre") +-- if pre then +-- for n in traverse_id(glyph_code,pre) do +-- l[#l+1] = { c, f } +-- end +-- end +-- local post = getfield(head,"post") +-- if post then +-- for n in traverse_id(glyph_code,post) do +-- l[#l+1] = { c, f } +-- end +-- end else ok = false end @@ -127,7 +166,8 @@ function char_tracers.equal(ta, tb) else for i=1,#ta do local a, b = ta[i], tb[i] - if a[1] ~= b[1] or a[2] ~= b[2] or a[3] ~= b[3] then + -- if a[1] ~= b[1] or a[2] ~= b[2] or a[3] ~= b[3] then + if a[1] ~= b[1] or a[2] ~= b[2] then return false end end @@ -160,20 +200,20 @@ function char_tracers.unicodes(t,decimal) return concat(tt," ") end -function char_tracers.indices(t,decimal) - local tt = { } - for i=1,#t do - local n = t[i][3] - if n == 0 then - tt[i] = "-" - elseif decimal then - tt[i] = n - else - tt[i] = f_unicode(n) - end - end - return concat(tt," ") -end +-- function char_tracers.indices(t,decimal) +-- local tt = { } +-- for i=1,#t do +-- local n = t[i][3] +-- if n == 0 then +-- tt[i] = "-" +-- elseif decimal then +-- tt[i] = n +-- else +-- tt[i] = f_unicode(n) +-- end +-- end +-- return concat(tt," ") +-- end function char_tracers.start() local npc = handlers.characters -- should accept nuts too @@ -248,7 +288,8 @@ end function step_tracers.glyphs(n,i) local c = collection[i] if c then - local b = hpack_node_list(copy_node_list(c)) -- multiple arguments + local c = copy_node_list(c) + local b = hpack_node_list(c) -- multiple arguments setbox(n,b) end end @@ -311,21 +352,59 @@ function step_tracers.font(command) end end -function step_tracers.codes(i,command) +local colors = { + pre = { "darkred" }, + post = { "darkgreen" }, + replace = { "darkblue" }, +} + +function step_tracers.codes(i,command,space) local c = collection[i] + + local function showchar(c) + if command then + local f, c = getfont(c), getchar(c) + local d = fontdescriptions[f] + local d = d and d[c] + context[command](f,c,d and d.class or "") + else + context("[%s:U+%04X]",getfont(c),getchar(c)) + end + end + + local function showdisc(d,w,what) + if w then + context.startcolor(colors[what]) + context("%s:",what) + for c in traverse_id(glyph_code,w) do + showchar(c) + end + context[space]() + context.stopcolor() + end + end + while c do local id = getid(c) if id == glyph_code then - if command then - local f, c = getfont(c), getchar(c) - local d = fontdescriptions[f] - local d = d and d[c] - context[command](f,c,d and d.class or "") - else - context("[%s:U+%04X]",getfont(c),getchar(c)) - end + showchar(c) elseif id == whatsit_code and (getsubtype(c) == localpar_code or getsubtype(c) == dir_code) then context("[%s]",getfield(c,"dir")) + elseif id == disc_code then + local pre = getfield(c,"pre") + local post = getfield(c,"post") + local replace = getfield(c,"replace") + if pre or post or replace then + context("[") + context[space]() + showdisc(c,pre,"pre") + showdisc(c,post,"post") + showdisc(c,replace,"replace") + context[space]() + context("]") + else + context("[disc]") + end else context("[%s]",nodecodes[id]) end @@ -355,9 +434,11 @@ end function step_tracers.check(head) if collecting then step_tracers.reset() - local n = copy_node_list(tonut(head)) - injections.handler(n,nil,"trace",true) - -- handlers.protectglyphs(n) -- can be option + local h = tonut(head) + local n = copy_node_list(h) + freeze(n,"check") + injections.keepcounts(n) -- one-time + injections.handler(n,"trace") protect_glyphs(n) collection[1] = n end @@ -367,9 +448,11 @@ function step_tracers.register(head) if collecting then local nc = #collection+1 if messages[nc] then - local n = copy_node_list(tonut(head)) - injections.handler(n,nil,"trace",true) - -- handlers.protectglyphs(n) -- can be option + local h = tonut(head) + local n = copy_node_list(h) + freeze(n,"register") + injections.keepcounts(n) -- one-time + injections.handler(n,"trace") protect_glyphs(n) collection[nc] = n end @@ -405,16 +488,18 @@ local function toutf(list,result,nofresult,stopcriterium) if fc then local fcc = fc[c] if fcc then - -- == fromunicode - local u = fcc.tounicode - if u then - for s in gmatch(u,"....") do + local u = fcc.unicode + if not u then + nofresult = nofresult + 1 + result[nofresult] = utfchar(c) + elseif type(u) == "table" then + for i=1,#u do nofresult = nofresult + 1 - result[nofresult] = utfchar(tonumber(s,16)) + result[nofresult] = utfchar(u[i]) end else nofresult = nofresult + 1 - result[nofresult] = utfchar(c) + result[nofresult] = utfchar(u) end else nofresult = nofresult + 1 diff --git a/Master/texmf-dist/tex/context/base/font-odv.lua b/Master/texmf-dist/tex/context/base/font-odv.lua index 079027ffedb..40b1efbb4a9 100644 --- a/Master/texmf-dist/tex/context/base/font-odv.lua +++ b/Master/texmf-dist/tex/context/base/font-odv.lua @@ -181,6 +181,25 @@ end -- we might need to have consonants etc per script and initialize a local table -- pointing to the right one. +-- 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, diff --git a/Master/texmf-dist/tex/context/base/font-ota.lua b/Master/texmf-dist/tex/context/base/font-ota.lua index 8d60ddc0e61..1f1534870a8 100644 --- a/Master/texmf-dist/tex/context/base/font-ota.lua +++ b/Master/texmf-dist/tex/context/base/font-ota.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['font-ota'] = { +if not modules then modules = { } end modules ['font-otx'] = { version = 1.001, comment = "companion to font-otf.lua (analysing)", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -6,10 +6,7 @@ if not modules then modules = { } end modules ['font-ota'] = { license = "see context related readme files" } --- this might become scrp-*.lua - --- [attr] : getprop or getattr --- [attr] : setprop or setattr +-- context only local type = type @@ -29,21 +26,35 @@ local methods = allocate() analyzers.initializers = initializers analyzers.methods = methods -analyzers.useunicodemarks = false +---------.useunicodemarks = false local a_state = attributes.private('state') +local nuts = nodes.nuts +local tonut = nuts.tonut + +local getfield = nuts.getfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getprop = nuts.getprop +local setprop = nuts.setprop +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local traverse_id = nuts.traverse_id +local traverse_node_list = nuts.traverse +local end_of_math = nuts.end_of_math + local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local disc_code = nodecodes.disc local math_code = nodecodes.math -local traverse_id = node.traverse_id -local traverse_node_list = node.traverse -local end_of_math = node.end_of_math - local fontdata = fonts.hashes.identifiers local categories = characters and characters.categories or { } -- sorry, only in context +local chardata = characters and characters.data local otffeatures = fonts.constructors.newfeatures("otf") local registerotffeature = otffeatures.register @@ -90,63 +101,70 @@ local features = { pstf = s_pstf, } -analyzers.states = states -analyzers.features = features +analyzers.states = states +analyzers.features = features +analyzers.useunicodemarks = false -- todo: analyzers per script/lang, cross font, so we need an font id hash -> script -- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace -function analyzers.setstate(head,font) +function analyzers.setstate(head,font) -- we can skip math local useunicodemarks = analyzers.useunicodemarks local tfmdata = fontdata[font] local descriptions = tfmdata.descriptions local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean + current = tonut(current) while current do - local id = current.id - if id == glyph_code and current.font == font then + local id = getid(current) + if id == glyph_code and getfont(current) == font then done = true - local char = current.char + local char = getchar(current) local d = descriptions[char] if d then - if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then + if d.class == "mark" then + done = true + setprop(current,a_state,s_mark) + elseif useunicodemarks and categories[char] == "mn" then done = true - current[a_state] = s_mark + setprop(current,a_state,s_mark) elseif n == 0 then first, last, n = current, current, 1 - current[a_state] = s_init + setprop(current,a_state,s_init) else last, n = current, n+1 - current[a_state] = s_medi + setprop(current,a_state,s_medi) end else -- finish if first and first == last then - last[a_state] = s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(last,a_state,s_fina) end first, last, n = nil, nil, 0 end elseif id == disc_code then - -- always in the middle - current[a_state] = s_medi + -- always in the middle .. it doesn't make much sense to assign a property + -- here ... we might at some point decide to flag the components when present + -- but even then it's kind of bogus + setprop(current,a_state,s_medi) last = current else -- finish if first and first == last then - last[a_state] = s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(last,a_state,s_fina) end first, last, n = nil, nil, 0 if id == math_code then current = end_of_math(current) end end - current = current.next + current = getnext(current) end if first and first == last then - last[a_state] = s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state] = s_fina + setprop(last,a_state,s_fina) end return head, done end @@ -203,234 +221,194 @@ registerotffeature { -- latin methods.latn = analyzers.setstate - --- This info eventually can go into char-def and we will have a state --- table for generic then (unicode recognized all states but in practice --- only has only --- --- isolated : isol --- final : isol_fina --- medial : isol_fina_medi_init --- --- so in practice, without analyzer it's rather useless info which is --- why having it in char-def makes only sense for special purposes (like) --- like tracing cq. visualizing. - -local tatweel = 0x0640 -local zwnj = 0x200C -local zwj = 0x200D - -local isolated = { -- isol - [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true, - [0x0604] = true, - [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true, - [0x06DD] = true, - -- mandaic - [0x0856] = true, [0x0858] = true, [0x0857] = true, - -- n'ko - [0x07FA] = true, - -- also here: - [zwnj] = true, -} - -local final = { -- isol_fina - [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true, - [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true, - [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true, - [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true, - [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true, - [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true, - [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true, - [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true, - [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true, - [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true, - [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true, - [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true, - [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true, - [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true, - [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true, - [0x0778] = true, [0x0779] = true, - [0x08AA] = true, [0x08AB] = true, [0x08AC] = true, - [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true, - -- syriac - [0x0710] = true, [0x0715] = true, [0x0716] = true, [0x0717] = true, - [0x0718] = true, [0x0719] = true, [0x0728] = true, [0x072A] = true, - [0x072C] = true, [0x071E] = true, - [0x072F] = true, [0x074D] = true, - -- mandaic - [0x0840] = true, [0x0849] = true, [0x0854] = true, [0x0846] = true, - [0x084F] = true -} - -local medial = { -- isol_fina_medi_init - [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true, - [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true, - [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true, - [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true, - [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true, - [0x0641] = true, [0x0642] = true, [0x0643] = true, - [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true, - [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true, - [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true, - [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true, - [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true, - [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true, - [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true, - [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true, - [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true, - [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true, - [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true, - [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true, - [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true, - [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true, - [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true, - [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true, - [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true, - [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true, - [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true, - [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true, - [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true, - [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true, - [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true, - [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true, - [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true, - [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true, - [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true, - [0x077E] = true, [0x077F] = true, - [0x08A0] = true, [0x08A2] = true, [0x08A4] = true, [0x08A5] = true, - [0x08A6] = true, [0x0620] = true, [0x08A8] = true, [0x08A9] = true, - [0x08A7] = true, [0x08A3] = true, - -- syriac - [0x0712] = true, [0x0713] = true, [0x0714] = true, [0x071A] = true, - [0x071B] = true, [0x071C] = true, [0x071D] = true, [0x071F] = true, - [0x0720] = true, [0x0721] = true, [0x0722] = true, [0x0723] = true, - [0x0724] = true, [0x0725] = true, [0x0726] = true, [0x0727] = true, - [0x0729] = true, [0x072B] = true, [0x072D] = true, [0x072E] = true, - [0x074E] = true, [0x074F] = true, - -- mandaic - [0x0841] = true, [0x0842] = true, [0x0843] = true, [0x0844] = true, - [0x0845] = true, [0x0847] = true, [0x0848] = true, [0x0855] = true, - [0x0851] = true, [0x084E] = true, [0x084D] = true, [0x084A] = true, - [0x084B] = true, [0x084C] = true, [0x0850] = true, [0x0852] = true, - [0x0853] = true, - -- n'ko - [0x07D7] = true, [0x07E8] = true, [0x07D9] = true, [0x07EA] = true, - [0x07CA] = true, [0x07DB] = true, [0x07CC] = true, [0x07DD] = true, - [0x07CE] = true, [0x07DF] = true, [0x07D4] = true, [0x07E5] = true, - [0x07E9] = true, [0x07E7] = true, [0x07E3] = true, [0x07E2] = true, - [0x07E0] = true, [0x07E1] = true, [0x07DE] = true, [0x07DC] = true, - [0x07D1] = true, [0x07DA] = true, [0x07D8] = true, [0x07D6] = true, - [0x07D2] = true, [0x07D0] = true, [0x07CF] = true, [0x07CD] = true, - [0x07CB] = true, [0x07D3] = true, [0x07E4] = true, [0x07D5] = true, - [0x07E6] = true, - -- also here: - [tatweel]= true, - [zwj] = true, -} +-------.dflt = analyzers.setstate % can be an option or just the default local arab_warned = { } --- todo: gref - local function warning(current,what) - local char = current.char + local char = getchar(current) if not arab_warned[char] then log.report("analyze","arab: character %C has no %a class",char,what) arab_warned[char] = true end end --- potential optimization: local medial_final = table.merged(medial,final) +local mappers = { + l = s_init, -- left + d = s_medi, -- double + c = s_medi, -- joiner + r = s_fina, -- right + u = s_isol, -- nonjoiner +} -local function finish(first,last) - if last then - if first == last then - local fc = first.char - if medial[fc] or final[fc] then - first[a_state] = s_isol - else - warning(first,"isol") - first[a_state] = s_error +local classifiers = { } -- we can also use this trick for devanagari + +local first_arabic, last_arabic = characters.blockrange("arabic") +local first_syriac, last_syriac = characters.blockrange("syriac") +local first_mandiac, last_mandiac = characters.blockrange("mandiac") +local first_nko, last_nko = characters.blockrange("nko") + +table.setmetatableindex(classifiers,function(t,k) + local c = chardata[k] + local v = false + if c then + local arabic = c.arabic + if arabic then + v = mappers[arabic] + if not v then + log.report("analyze","error in mapping arabic %C",k) + -- error + v = false end - else - local lc = last.char - if medial[lc] or final[lc] then - -- if laststate == 1 or laststate == 2 or laststate == 4 then - last[a_state] = s_fina + elseif k >= first_arabic and k <= last_arabic or k >= first_syriac and k <= last_syriac or + k >= first_mandiac and k <= last_mandiac or k >= first_nko and k <= last_nko then + if categories[k] == "mn" then + v = s_mark else - warning(last,"fina") - last[a_state] = s_error + v = s_rest end - end - first, last = nil, nil - elseif first then - -- first and last are either both set so we never com here - local fc = first.char - if medial[fc] or final[fc] then - first[a_state] = s_isol else - warning(first,"isol") - first[a_state] = s_error end - first = nil end - return first, last -end + t[k] = v + return v +end) function methods.arab(head,font,attr) - local useunicodemarks = analyzers.useunicodemarks - local tfmdata = fontdata[font] - local marks = tfmdata.resources.marks - local first, last, current, done = nil, nil, head, false + local first, last = nil, nil + local c_first, c_last = nil, nil + local current, done = head, false + current = tonut(current) while current do - local id = current.id - if id == glyph_code and current.font == font and current.subtype<256 and not current[a_state] then + local id = getid(current) + if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then done = true - local char = current.char - if marks[char] or (useunicodemarks and categories[char] == "mn") then - current[a_state] = s_mark - elseif isolated[char] then -- can be zwj or zwnj too - first, last = finish(first,last) - current[a_state] = s_isol - first, last = nil, nil - elseif not first then - if medial[char] then - current[a_state] = s_init - first, last = first or current, current - elseif final[char] then - current[a_state] = s_isol + local char = getchar(current) + local classifier = classifiers[char] + if not classifier then + if last then + if c_last == s_medi or c_last == s_fina then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end + first, last = nil, nil + elseif first then + if c_first == s_medi or c_first == s_fina then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + first = nil + end + elseif classifier == s_mark then + setprop(current,a_state,s_mark) + elseif classifier == s_isol then + if last then + if c_last == s_medi or c_last == s_fina then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end first, last = nil, nil - else -- no arab - first, last = finish(first,last) + elseif first then + if c_first == s_medi or c_first == s_fina then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + first = nil end - elseif medial[char] then - first, last = first or current, current - current[a_state] = s_medi - elseif final[char] then - if not last[a_state] == s_init then - -- tricky, we need to check what last may be ! - last[a_state] = s_medi + setprop(current,a_state,s_isol) + elseif classifier == s_medi then + if first then + last = current + c_last = classifier + setprop(current,a_state,s_medi) + else + setprop(current,a_state,s_init) + first = current + c_first = classifier + end + elseif classifier == s_fina then + if last then + if getprop(last,a_state) ~= s_init then + setprop(last,a_state,s_medi) + end + setprop(current,a_state,s_fina) + first, last = nil, nil + elseif first then + -- if getprop(first,a_state) ~= s_init then + -- -- needs checking + -- setprop(first,a_state,s_medi) + -- end + setprop(current,a_state,s_fina) + first = nil + else + setprop(current,a_state,s_isol) + end + else -- classifier == s_rest + setprop(current,a_state,s_rest) + if last then + if c_last == s_medi or c_last == s_fina then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end + first, last = nil, nil + elseif first then + if c_first == s_medi or c_first == s_fina then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + first = nil end - current[a_state] = s_fina - first, last = nil, nil - elseif char >= 0x0600 and char <= 0x06FF then -- needs checking - current[a_state] = s_rest - first, last = finish(first,last) - else -- no - first, last = finish(first,last) end else - if first or last then - first, last = finish(first,last) + if last then + if c_last == s_medi or c_last == s_fina then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end + first, last = nil, nil + elseif first then + if c_first == s_medi or c_first == s_fina then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + first = nil end - if id == math_code then + if id == math_code then -- a bit duplicate as we test for glyphs twice current = end_of_math(current) end end - current = current.next + current = getnext(current) end - if first or last then - finish(first,last) + if last then + if c_last == s_medi or c_last == s_fina then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end + elseif first then + if c_first == s_medi or c_first == s_fina then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end end return head, done end diff --git a/Master/texmf-dist/tex/context/base/font-otb.lua b/Master/texmf-dist/tex/context/base/font-otb.lua index 2e98d3ecbb9..4e955a19774 100644 --- a/Master/texmf-dist/tex/context/base/font-otb.lua +++ b/Master/texmf-dist/tex/context/base/font-otb.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['font-otb'] = { } local concat = table.concat local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip -local type, next, tonumber, tostring = type, next, tonumber, tostring +local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget local lpegmatch = lpeg.match local utfchar = utf.char @@ -63,40 +63,40 @@ local function gref(descriptions,n) end end -local function cref(feature,lookupname) +local function cref(feature,lookuptags,lookupname) if lookupname then - return formatters["feature %a, lookup %a"](feature,lookupname) + return formatters["feature %a, lookup %a"](feature,lookuptags[lookupname]) else return formatters["feature %a"](feature) end end -local function report_alternate(feature,lookupname,descriptions,unicode,replacement,value,comment) +local function report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,comment) report_prepare("%s: base alternate %s => %s (%S => %S)", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), replacement and gref(descriptions,replacement), value, comment) end -local function report_substitution(feature,lookupname,descriptions,unicode,substitution) +local function report_substitution(feature,lookuptags,lookupname,descriptions,unicode,substitution) report_prepare("%s: base substitution %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), gref(descriptions,substitution)) end -local function report_ligature(feature,lookupname,descriptions,unicode,ligature) +local function report_ligature(feature,lookuptags,lookupname,descriptions,unicode,ligature) report_prepare("%s: base ligature %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,ligature), gref(descriptions,unicode)) end -local function report_kern(feature,lookupname,descriptions,unicode,otherunicode,value) +local function report_kern(feature,lookuptags,lookupname,descriptions,unicode,otherunicode,value) report_prepare("%s: base kern %s + %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), gref(descriptions,otherunicode), value) @@ -181,7 +181,7 @@ local function finalize_ligatures(tfmdata,ligatures) local characters = tfmdata.characters local descriptions = tfmdata.descriptions local resources = tfmdata.resources - local unicodes = resources.unicodes + local unicodes = resources.unicodes -- we use rawget in order to avoid bulding the table local private = resources.private local alldone = false while not alldone do @@ -217,12 +217,12 @@ local function finalize_ligatures(tfmdata,ligatures) local secondname = firstname .. "_" .. secondcode if i == size - 1 then target = unicode - if not unicodes[secondname] then + if not rawget(unicodes,secondname) then unicodes[secondname] = unicode -- map final ligature onto intermediates end okay = true else - target = unicodes[secondname] + target = rawget(unicodes,secondname) if not target then break end @@ -258,6 +258,7 @@ local function finalize_ligatures(tfmdata,ligatures) end end resources.private = private + return true end end @@ -265,13 +266,14 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local characters = tfmdata.characters local descriptions = tfmdata.descriptions local resources = tfmdata.resources + local properties = tfmdata.properties local changed = tfmdata.changed - local unicodes = resources.unicodes local lookuphash = resources.lookuphash local lookuptypes = resources.lookuptypes + local lookuptags = resources.lookuptags local ligatures = { } - local alternate = tonumber(value) + local alternate = tonumber(value) or true and 1 local defaultalt = otf.defaultbasealternate local trace_singles = trace_baseinit and trace_singles @@ -279,39 +281,39 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local trace_ligatures = trace_baseinit and trace_ligatures local actions = { - substitution = function(lookupdata,lookupname,description,unicode) + substitution = function(lookupdata,lookuptags,lookupname,description,unicode) if trace_singles then - report_substitution(feature,lookupname,descriptions,unicode,lookupdata) + report_substitution(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) end changed[unicode] = lookupdata end, - alternate = function(lookupdata,lookupname,description,unicode) + alternate = function(lookupdata,lookuptags,lookupname,description,unicode) local replacement = lookupdata[alternate] if replacement then changed[unicode] = replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") end elseif defaultalt == "first" then replacement = lookupdata[1] changed[unicode] = replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end elseif defaultalt == "last" then replacement = lookupdata[#data] if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end else if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") end end end, - ligature = function(lookupdata,lookupname,description,unicode) + ligature = function(lookupdata,lookuptags,lookupname,description,unicode) if trace_ligatures then - report_ligature(feature,lookupname,descriptions,unicode,lookupdata) + report_ligature(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) end ligatures[#ligatures+1] = { unicode, lookupdata } end, @@ -328,7 +330,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local lookuptype = lookuptypes[lookupname] local action = actions[lookuptype] if action then - action(lookupdata,lookupname,description,unicode) + action(lookupdata,lookuptags,lookupname,description,unicode) end end end @@ -343,24 +345,25 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local action = actions[lookuptype] if action then for i=1,#lookuplist do - action(lookuplist[i],lookupname,description,unicode) + action(lookuplist[i],lookuptags,lookupname,description,unicode) end end end end end end - - finalize_ligatures(tfmdata,ligatures) + properties.hasligatures = finalize_ligatures(tfmdata,ligatures) end local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist) -- todo what kind of kerns, currently all local characters = tfmdata.characters local descriptions = tfmdata.descriptions local resources = tfmdata.resources - local unicodes = resources.unicodes + local properties = tfmdata.properties + local lookuptags = resources.lookuptags local sharedkerns = { } local traceindeed = trace_baseinit and trace_kerns + local haskerns = false for unicode, character in next, characters do local description = descriptions[unicode] local rawkerns = description.kerns -- shared @@ -384,13 +387,13 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist newkerns = { [otherunicode] = value } done = true if traceindeed then - report_kern(feature,lookup,descriptions,unicode,otherunicode,value) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) end elseif not newkerns[otherunicode] then -- first wins newkerns[otherunicode] = value done = true if traceindeed then - report_kern(feature,lookup,descriptions,unicode,otherunicode,value) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) end end end @@ -399,12 +402,14 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist if done then sharedkerns[rawkerns] = newkerns character.kerns = newkerns -- no empty assignments + haskerns = true else sharedkerns[rawkerns] = false end end end end + properties.haskerns = haskerns end basemethods.independent = { @@ -434,13 +439,13 @@ local function make_1(present,tree,name) end end -local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookupname) +local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookuptags,lookupname) for k, v in next, tree do if k == "ligature" then local character = characters[preceding] if not character then if trace_baseinit then - report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookupname,v,preceding) + report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookuptags[lookupname],v,preceding) end character = makefake(tfmdata,name,present) end @@ -461,7 +466,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don else local code = present[name] or unicode local name = name .. "_" .. k - make_2(present,tfmdata,characters,v,name,code,k,done,lookupname) + make_2(present,tfmdata,characters,v,name,code,k,done,lookuptags,lookupname) end end end @@ -473,9 +478,10 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local changed = tfmdata.changed local lookuphash = resources.lookuphash local lookuptypes = resources.lookuptypes + local lookuptags = resources.lookuptags local ligatures = { } - local alternate = tonumber(value) + local alternate = tonumber(value) or true and 1 local defaultalt = otf.defaultbasealternate local trace_singles = trace_baseinit and trace_singles @@ -489,36 +495,36 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for unicode, data in next, lookupdata do if lookuptype == "substitution" then if trace_singles then - report_substitution(feature,lookupname,descriptions,unicode,data) + report_substitution(feature,lookuptags,lookupname,descriptions,unicode,data) end changed[unicode] = data elseif lookuptype == "alternate" then - local replacement = data[alternate] + local replacement = data[alternate] if replacement then changed[unicode] = replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") end elseif defaultalt == "first" then replacement = data[1] changed[unicode] = replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end elseif defaultalt == "last" then replacement = data[#data] if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end else if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") end end elseif lookuptype == "ligature" then ligatures[#ligatures+1] = { unicode, data, lookupname } if trace_ligatures then - report_ligature(feature,lookupname,descriptions,unicode,data) + report_ligature(feature,lookuptags,lookupname,descriptions,unicode,data) end end end @@ -541,7 +547,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for i=1,nofligatures do local ligature = ligatures[i] local unicode, tree, lookupname = ligature[1], ligature[2], ligature[3] - make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookupname) + make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookuptags,lookupname) end end @@ -552,11 +558,11 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist local characters = tfmdata.characters local descriptions = tfmdata.descriptions local resources = tfmdata.resources + local properties = tfmdata.properties local lookuphash = resources.lookuphash + local lookuptags = resources.lookuptags local traceindeed = trace_baseinit and trace_kerns - -- check out this sharedkerns trickery - for l=1,#lookuplist do local lookupname = lookuplist[l] local lookupdata = lookuphash[lookupname] @@ -571,7 +577,7 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist for otherunicode, kern in next, data do if not kerns[otherunicode] and kern ~= 0 then kerns[otherunicode] = kern - report_kern(feature,lookup,descriptions,unicode,otherunicode,kern) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,kern) end end else @@ -602,7 +608,7 @@ local function featuresinitializer(tfmdata,value) if true then -- value then local starttime = trace_preparing and os.clock() local features = tfmdata.shared.features - local fullname = trace_preparing and tfmdata.properties.fullname + local fullname = tfmdata.properties.fullname or "?" if features then applybasemethod("initializehashes",tfmdata) local collectlookups = otf.collectlookups @@ -648,21 +654,22 @@ local function featuresinitializer(tfmdata,value) if order then for i=1,#order do -- local feature = order[i] - if features[feature] then + local value = features[feature] + if value then local validlookups, lookuplist = collectlookups(rawdata,feature,script,language) if not validlookups then -- skip elseif basesubstitutions and basesubstitutions[feature] then if trace_preparing then - report_prepare("filtering base feature %a for %a",feature,fullname) + report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value) end applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) elseif basepositionings and basepositionings[feature] then if trace_preparing then - report_prepare("filtering base feature %a for %a",feature,fullname) + report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value) end - applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist) + applybasemethod("preparepositionings",tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) end end diff --git a/Master/texmf-dist/tex/context/base/font-otf.lua b/Master/texmf-dist/tex/context/base/font-otf.lua index 0a5d1cfea04..85eebaaebd0 100644 --- a/Master/texmf-dist/tex/context/base/font-otf.lua +++ b/Master/texmf-dist/tex/context/base/font-otf.lua @@ -24,7 +24,9 @@ local reversed, concat, remove, sortedkeys = table.reversed, table.concat, table local ioflush = io.flush local fastcopy, tohash, derivetable = table.fastcopy, table.tohash, table.derive local formatters = string.formatters +local P, R, S, C, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.match +local setmetatableindex = table.setmetatableindex local allocate = utilities.storage.allocate local registertracker = trackers.register local registerdirective = directives.register @@ -33,13 +35,16 @@ local stoptiming = statistics.stoptiming local elapsedtime = statistics.elapsedtime local findbinfile = resolvers.findbinfile -local trace_private = false registertracker("otf.private", function(v) trace_private = v end) -local trace_loading = false registertracker("otf.loading", function(v) trace_loading = v end) -local trace_features = false registertracker("otf.features", function(v) trace_features = v end) -local trace_dynamics = false registertracker("otf.dynamics", function(v) trace_dynamics = v end) -local trace_sequences = false registertracker("otf.sequences", function(v) trace_sequences = v end) -local trace_markwidth = false registertracker("otf.markwidth", function(v) trace_markwidth = v end) -local trace_defining = false registertracker("fonts.defining", function(v) trace_defining = v end) +local trace_private = false registertracker("otf.private", function(v) trace_private = v end) +local trace_loading = false registertracker("otf.loading", function(v) trace_loading = v end) +local trace_features = false registertracker("otf.features", function(v) trace_features = v end) +local trace_dynamics = false registertracker("otf.dynamics", function(v) trace_dynamics = v end) +local trace_sequences = false registertracker("otf.sequences", function(v) trace_sequences = v end) +local trace_markwidth = false registertracker("otf.markwidth", function(v) trace_markwidth = v end) +local trace_defining = false registertracker("fonts.defining", function(v) trace_defining = v end) + +local compact_lookups = true registertracker("otf.compactlookups", function(v) compact_lookups = v end) +local purge_names = true registertracker("otf.purgenames", function(v) purge_names = v end) local report_otf = logs.reporter("fonts","otf loading") @@ -48,13 +53,18 @@ local otf = fonts.handlers.otf otf.glists = { "gsub", "gpos" } -otf.version = 2.755 -- beware: also sync font-mis.lua +otf.version = 2.803 -- beware: also sync font-mis.lua otf.cache = containers.define("fonts", "otf", otf.version, true) -local fontdata = fonts.hashes.identifiers +local hashes = fonts.hashes +local definers = fonts.definers +local readers = fonts.readers +local constructors = fonts.constructors + +local fontdata = hashes and hashes.identifiers local chardata = characters and characters.data -- not used -local otffeatures = fonts.constructors.newfeatures("otf") +local otffeatures = constructors.newfeatures("otf") local registerotffeature = otffeatures.register local enhancers = allocate() @@ -62,13 +72,8 @@ otf.enhancers = enhancers local patches = { } enhancers.patches = patches -local definers = fonts.definers -local readers = fonts.readers -local constructors = fonts.constructors - local forceload = false local cleanup = 0 -- mk: 0=885M 1=765M 2=735M (regular run 730M) -local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive local packdata = true local syncspace = true local forcenotdef = false @@ -80,7 +85,12 @@ local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes local wildcard = "*" local default = "dflt" -local fontloaderfields = fontloader.fields +local fontloader = fontloader +local open_font = fontloader.open +local close_font = fontloader.close +local font_fields = fontloader.fields +local apply_featurefile = fontloader.apply_featurefile + local mainfields = nil local glyphfields = nil -- not used yet @@ -93,11 +103,11 @@ formats.dfont = "truetype" registerdirective("fonts.otf.loader.cleanup", function(v) cleanup = tonumber(v) or (v and 1) or 0 end) registerdirective("fonts.otf.loader.force", function(v) forceload = v end) -registerdirective("fonts.otf.loader.usemetatables", function(v) usemetatables = v end) registerdirective("fonts.otf.loader.pack", function(v) packdata = v end) registerdirective("fonts.otf.loader.syncspace", function(v) syncspace = v end) registerdirective("fonts.otf.loader.forcenotdef", function(v) forcenotdef = v end) registerdirective("fonts.otf.loader.overloadkerns", function(v) overloadkerns = v end) +-----------------("fonts.otf.loader.alldimensions", function(v) alldimensions = v end) function otf.fileformat(filename) local leader = lower(io.loadchunk(filename,4)) @@ -134,7 +144,7 @@ local function load_featurefile(raw,featurefile) if trace_loading then report_otf("using featurefile %a", featurefile) end - fontloader.apply_featurefile(raw, featurefile) + apply_featurefile(raw, featurefile) end end @@ -203,7 +213,6 @@ local valid_fields = table.tohash { "extrema_bound", "familyname", "fontname", - "fontname", "fontstyle_id", "fontstyle_name", "fullname", @@ -256,7 +265,7 @@ local ordered_enhancers = { "analyze glyphs", "analyze math", - "prepare tounicode", -- maybe merge with prepare + -- "prepare tounicode", "reorganize lookups", "reorganize mark classes", @@ -275,10 +284,15 @@ local ordered_enhancers = { "check metadata", "check extra features", -- after metadata + "prepare tounicode", + "check encoding", -- moved "add duplicates", "cleanup tables", + + "compact lookups", + "purge names", } --[[ldx-- @@ -430,12 +444,12 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone report_otf("loading %a, hash %a",filename,hash) local fontdata, messages if sub then - fontdata, messages = fontloader.open(filename,sub) + fontdata, messages = open_font(filename,sub) else - fontdata, messages = fontloader.open(filename) + fontdata, messages = open_font(filename) end if fontdata then - mainfields = mainfields or (fontloaderfields and fontloaderfields(fontdata)) + mainfields = mainfields or (font_fields and font_fields(fontdata)) end if trace_loading and messages and #messages > 0 then if type(messages) == "string" then @@ -480,6 +494,8 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone lookuptypes = { }, }, + warnings = { + }, metadata = { -- raw metadata, not to be used }, @@ -492,7 +508,7 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone }, helpers = { -- might go away tounicodelist = splitter, - tounicodetable = lpeg.Ct(splitter), + tounicodetable = Ct(splitter), }, } starttiming(data) @@ -517,7 +533,7 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone report_otf("preprocessing and caching time %s, packtime %s", elapsedtime(data),packdata and elapsedtime(packtime) or 0) end - fontloader.close(fontdata) -- free memory + close_font(fontdata) -- free memory if cleanup > 3 then collectgarbage("collect") end @@ -535,6 +551,39 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone report_otf("loading from cache using hash %a",hash) end enhance("unpack",data,filename,nil,false) + -- + local resources = data.resources + local lookuptags = resources.lookuptags + local unicodes = resources.unicodes + if not lookuptags then + lookuptags = { } + resources.lookuptags = lookuptags + end + setmetatableindex(lookuptags,function(t,k) + local v = type(k) == "number" and ("lookup " .. k) or k + t[k] = v + return v + end) + if not unicodes then + unicodes = { } + resources.unicodes = unicodes + setmetatableindex(unicodes,function(t,k) + -- use rawget when no table has to be built + setmetatableindex(unicodes,nil) + for u, d in next, data.descriptions do + local n = d.name + if n then + t[n] = u + -- report_otf("accessing known name %a",k) + else + -- report_otf("accessing unknown name %a",k) + end + end + return rawget(t,k) + end) + end + constructors.addcoreunicodes(unicodes) -- do we really need this? + -- if applyruntimefixes then applyruntimefixes(filename,data) end @@ -576,31 +625,29 @@ actions["add dimensions"] = function(data,filename) local defaultheight = resources.defaultheight or 0 local defaultdepth = resources.defaultdepth or 0 local basename = trace_markwidth and file.basename(filename) - if usemetatables then - for _, d in next, descriptions do - local wd = d.width - if not wd then - d.width = defaultwidth - elseif trace_markwidth and wd ~= 0 and d.class == "mark" then - report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) - -- d.width = -wd - end - setmetatable(d,mt) + for _, d in next, descriptions do + local bb, wd = d.boundingbox, d.width + if not wd then + -- or bb? + d.width = defaultwidth + elseif trace_markwidth and wd ~= 0 and d.class == "mark" then + report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) + -- d.width = -wd end - else - for _, d in next, descriptions do - local bb, wd = d.boundingbox, d.width - if not wd then - d.width = defaultwidth - elseif trace_markwidth and wd ~= 0 and d.class == "mark" then - report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) - -- d.width = -wd - end - -- if forcenotdef and not d.name then - -- d.name = ".notdef" - -- end - if bb then - local ht, dp = bb[4], -bb[2] + -- if forcenotdef and not d.name then + -- d.name = ".notdef" + -- end + if bb then + local ht = bb[4] + local dp = -bb[2] + -- if alldimensions then + -- if ht ~= 0 then + -- d.height = ht + -- end + -- if dp ~= 0 then + -- d.depth = dp + -- end + -- else if ht == 0 or ht < 0 then -- not set else @@ -611,7 +658,7 @@ actions["add dimensions"] = function(data,filename) else d.depth = dp end - end + -- end end end end @@ -683,28 +730,31 @@ actions["prepare glyphs"] = function(data,filename,raw) if includesubfonts then metadata.subfonts[cidindex] = somecopy(subfont) end + -- we have delayed loading so we cannot use next for index=0,subfont.glyphcnt-1 do -- we could take the previous glyphcnt instead of 0 local glyph = cidglyphs[index] if glyph then local unicode = glyph.unicode -if unicode >= 0x00E000 and unicode <= 0x00F8FF then + if unicode >= 0x00E000 and unicode <= 0x00F8FF then unicode = -1 -elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFD then + elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFD then unicode = -1 -elseif unicode >= 0x100000 and unicode <= 0x10FFFD then + elseif unicode >= 0x100000 and unicode <= 0x10FFFD then unicode = -1 -end - local name = glyph.name or cidnames[index] + end + local name = glyph.name or cidnames[index] if not unicode or unicode == -1 then -- or unicode >= criterium then unicode = cidunicodes[index] end if unicode and descriptions[unicode] then - report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + if trace_private then + report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + end unicode = -1 end if not unicode or unicode == -1 then -- or unicode >= criterium then if not name then - name = format("u%06X",private) + name = format("u%06X.ctx",private) end unicode = private unicodes[name] = private @@ -714,14 +764,25 @@ end private = private + 1 nofnames = nofnames + 1 else + -- if unicode > criterium then + -- local taken = descriptions[unicode] + -- if taken then + -- private = private + 1 + -- descriptions[private] = taken + -- unicodes[taken.name] = private + -- indices[taken.index] = private + -- if trace_private then + -- report_otf("slot %U is moved to %U due to private in font",unicode) + -- end + -- end + -- end if not name then - name = format("u%06X",unicode) + name = format("u%06X.ctx",unicode) end unicodes[name] = unicode nofunicodes = nofunicodes + 1 end indices[index] = unicode -- each index is unique (at least now) - local description = { -- width = glyph.width, boundingbox = glyph.boundingbox, @@ -730,7 +791,6 @@ end index = index, glyph = glyph, } - descriptions[unicode] = description else -- report_otf("potential problem: glyph %U is used but empty",index) @@ -762,12 +822,37 @@ end end private = private + 1 else + -- We have a font that uses and exposes the private area. As this is rather unreliable it's + -- advised no to trust slots here (better use glyphnames). Anyway, we need a double check: + -- we need to move already moved entries and we also need to bump the next private to after + -- the (currently) last slot. This could leave us with a hole but we have holes anyway. + if unicode > criterium then + -- \definedfont[file:HANBatang-LVT.ttf] \fontchar{uF0135} \char"F0135 + local taken = descriptions[unicode] + if taken then + if unicode >= private then + private = unicode + 1 -- restart private (so we can have mixed now) + else + private = private + 1 -- move on + end + descriptions[private] = taken + unicodes[taken.name] = private + indices[taken.index] = private + if trace_private then + report_otf("slot %U is moved to %U due to private in font",unicode) + end + else + if unicode >= private then + private = unicode + 1 -- restart (so we can have mixed now) + end + end + end unicodes[name] = unicode end indices[index] = unicode - if not name then - name = format("u%06X",unicode) - end + -- if not name then + -- name = format("u%06X",unicode) -- u%06X.ctx + -- end descriptions[unicode] = { -- width = glyph.width, boundingbox = glyph.boundingbox, @@ -921,8 +1006,8 @@ actions["add duplicates"] = function(data,filename,raw) local description = descriptions[unicode] local n = 0 for _, description in next, descriptions do + local kerns = description.kerns if kerns then - local kerns = description.kerns for _, k in next, kerns do local ku = k[unicode] if ku then @@ -1260,9 +1345,9 @@ local function s_uncover(splitter,cache,cover) local uncovered = cache[cover] if not uncovered then uncovered = lpegmatch(splitter,cover) --- for i=1,#uncovered do --- uncovered[i] = { [uncovered[i]] = true } --- end + -- for i=1,#uncovered do + -- uncovered[i] = { [uncovered[i]] = true } + -- end cache[cover] = uncovered end return { uncovered } @@ -1276,9 +1361,14 @@ local function t_hashed(t,cache) local ti = t[i] local tih = cache[ti] if not tih then - tih = { } - for i=1,#ti do - tih[ti[i]] = true + local tn = #ti + if tn == 1 then + tih = { [ti[1]] = true } + else + tih = { } + for i=1,tn do + tih[ti[i]] = true + end end cache[ti] = tih end @@ -1294,12 +1384,17 @@ end local function s_hashed(t,cache) if t then - local ht = { } local tf = t[1] - for i=1,#tf do - ht[i] = { [tf[i]] = true } + local nf = #tf + if nf == 1 then + return { [tf[1]] = true } + else + local ht = { } + for i=1,nf do + ht[i] = { [tf[i]] = true } + end + return ht end - return ht else return nil end @@ -1460,12 +1555,12 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo local fore = glyphs.fore if fore and fore ~= "" then fore = s_uncover(splitter,s_u_cache,fore) - rule.before = s_hashed(fore,s_h_cache) + rule.after = s_hashed(fore,s_h_cache) end local back = glyphs.back if back then back = s_uncover(splitter,s_u_cache,back) - rule.after = s_hashed(back,s_h_cache) + rule.before = s_hashed(back,s_h_cache) end local names = glyphs.names if names then @@ -1473,6 +1568,14 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo rule.current = s_hashed(names,s_h_cache) end rule.glyphs = nil + local lookups = rule.lookups + if lookups then + for i=1,#names do + if not lookups[i] then + lookups[i] = "" -- fix sparse array + end + end + end end end end @@ -1490,7 +1593,9 @@ local function check_variants(unicode,the_variants,splitter,unicodes) for i=1,#glyphs do local g = glyphs[i] if done[g] then - report_otf("skipping cyclic reference %U in math variant %U",g,unicode) + if i > 1 then + report_otf("skipping cyclic reference %U in math variant %U",g,unicode) + end else if n == 0 then n = 1 @@ -1636,6 +1741,8 @@ actions["merge kern classes"] = function(data,filename,raw) local lookup = subtable.lookup or subtable.name if kernclass then -- the next one is quite slow if #kernclass > 0 then + -- it's a table with one entry .. a future luatex can just + -- omit that level kernclass = kernclass[1] lookup = type(kernclass.lookup) == "string" and kernclass.lookup or lookup report_otf("fixing kernclass table of lookup %a",lookup) @@ -1740,6 +1847,12 @@ end -- future versions will remove _ +local valid = (R("\x00\x7E") - S("(){}[]<>%/ \n\r\f\v"))^0 * P(-1) + +local function valid_ps_name(str) + return str and str ~= "" and #str < 64 and lpegmatch(valid,str) and true or false +end + actions["check metadata"] = function(data,filename,raw) local metadata = data.metadata for _, k in next, mainfields do @@ -1759,16 +1872,54 @@ actions["check metadata"] = function(data,filename,raw) end -- if metadata.validation_state and table.contains(metadata.validation_state,"bad_ps_fontname") then - local name = file.nameonly(filename) - metadata.fontname = "bad-fontname-" .. name - metadata.fullname = "bad-fullname-" .. name + -- the ff library does a bit too much (and wrong) checking ... so we need to catch this + -- at least for now + local function valid(what) + local names = raw.names + for i=1,#names do + local list = names[i] + local names = list.names + if names then + local name = names[what] + if name and valid_ps_name(name) then + return name + end + end + end + end + local function check(what) + local oldname = metadata[what] + if valid_ps_name(oldname) then + report_otf("ignoring warning %a because %s %a is proper ASCII","bad_ps_fontname",what,oldname) + else + local newname = valid(what) + if not newname then + newname = formatters["bad-%s-%s"](what,file.nameonly(filename)) + end + local warning = formatters["overloading %s from invalid ASCII name %a to %a"](what,oldname,newname) + data.warnings[#data.warnings+1] = warning + report_otf(warning) + metadata[what] = newname + end + end + check("fontname") + check("fullname") end -- end actions["cleanup tables"] = function(data,filename,raw) - data.resources.indices = nil -- not needed - data.helpers = nil + local duplicates = data.resources.duplicates + if duplicates then + for k, v in next, duplicates do + if #v == 1 then + duplicates[k] = v[1] + end + end + end + data.resources.indices = nil -- not needed + data.resources.unicodes = nil -- delayed + data.helpers = nil -- tricky as we have no unicodes any more end -- kern: ttf has a table with kerns @@ -1866,6 +2017,8 @@ actions["reorganize glyph lookups"] = function(data,filename,raw) end +local zero = { 0, 0 } + actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we replace inplace we safe entries local descriptions = data.descriptions for unicode, description in next, descriptions do @@ -1874,14 +2027,37 @@ actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we rep for class, data in next, anchors do if class == "baselig" then for tag, specification in next, data do - for i=1,#specification do - local si = specification[i] - specification[i] = { si.x or 0, si.y or 0 } + -- for i=1,#specification do + -- local si = specification[i] + -- specification[i] = { si.x or 0, si.y or 0 } + -- end + -- can be sparse so we need to fill the holes + local n = 0 + for k, v in next, specification do + if k > n then + n = k + end + local x, y = v.x, v.y + if x or y then + specification[k] = { x or 0, y or 0 } + else + specification[k] = zero + end end + local t = { } + for i=1,n do + t[i] = specification[i] or zero + end + data[tag] = t -- so # is okay (nicer for packer) end else for tag, specification in next, data do - data[tag] = { specification.x or 0, specification.y or 0 } + local x, y = specification.x, specification.y + if x or y then + data[tag] = { x or 0, y or 0 } + else + data[tag] = zero + end end end end @@ -1890,6 +2066,164 @@ actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we rep end end +local bogusname = (P("uni") + P("u")) * R("AF","09")^4 + + (P("index") + P("glyph") + S("Ii") * P("dentity") * P(".")^0) * R("09")^1 +local uselessname = (1-bogusname)^0 * bogusname + +actions["purge names"] = function(data,filename,raw) -- not used yet + if purge_names then + local n = 0 + for u, d in next, data.descriptions do + if lpegmatch(uselessname,d.name) then + n = n + 1 + d.name = nil + end + -- d.comment = nil + end + if n > 0 then + report_otf("%s bogus names removed",n) + end + end +end + +actions["compact lookups"] = function(data,filename,raw) + if not compact_lookups then + report_otf("not compacting") + return + end + -- create keyhash + local last = 0 + local tags = table.setmetatableindex({ }, + function(t,k) + last = last + 1 + t[k] = last + return last + end + ) + -- + local descriptions = data.descriptions + local resources = data.resources + -- + for u, d in next, descriptions do + -- + -- -- we can also compact anchors and cursives (basechar basemark baselig mark) + -- + local slookups = d.slookups + if type(slookups) == "table" then + local s = { } + for k, v in next, slookups do + s[tags[k]] = v + end + d.slookups = s + end + -- + local mlookups = d.mlookups + if type(mlookups) == "table" then + local m = { } + for k, v in next, mlookups do + m[tags[k]] = v + end + d.mlookups = m + end + -- + local kerns = d.kerns + if type(kerns) == "table" then + local t = { } + for k, v in next, kerns do + t[tags[k]] = v + end + d.kerns = t + end + end + -- + local lookups = data.lookups + if lookups then + local l = { } + for k, v in next, lookups do + local rules = v.rules + if rules then + for i=1,#rules do + local l = rules[i].lookups + if type(l) == "table" then + for i=1,#l do + l[i] = tags[l[i]] + end + end + end + end + l[tags[k]] = v + end + data.lookups = l + end + -- + local lookups = resources.lookups + if lookups then + local l = { } + for k, v in next, lookups do + local s = v.subtables + if type(s) == "table" then + for i=1,#s do + s[i] = tags[s[i]] + end + end + l[tags[k]] = v + end + resources.lookups = l + end + -- + local sequences = resources.sequences + if sequences then + for i=1,#sequences do + local s = sequences[i] + local n = s.name + if n then + s.name = tags[n] + end + local t = s.subtables + if type(t) == "table" then + for i=1,#t do + t[i] = tags[t[i]] + end + end + end + end + -- + local lookuptypes = resources.lookuptypes + if lookuptypes then + local l = { } + for k, v in next, lookuptypes do + l[tags[k]] = v + end + resources.lookuptypes = l + end + -- + local anchor_to_lookup = resources.anchor_to_lookup + if anchor_to_lookup then + for anchor, lookups in next, anchor_to_lookup do + local l = { } + for lookup, value in next, lookups do + l[tags[lookup]] = value + end + anchor_to_lookup[anchor] = l + end + end + -- + local lookup_to_anchor = resources.lookup_to_anchor + if lookup_to_anchor then + local l = { } + for lookup, value in next, lookup_to_anchor do + l[tags[lookup]] = value + end + resources.lookup_to_anchor = l + end + -- + tags = table.swapped(tags) + -- + report_otf("%s lookup tags compacted",#tags) + -- + resources.lookuptags = tags +end + -- modes: node, base, none function otf.setfeatures(tfmdata,features) @@ -1915,6 +2249,7 @@ end local function copytotfm(data,cache_id) if data then local metadata = data.metadata + local warnings = data.warnings local resources = data.resources local properties = derivetable(data.properties) local descriptions = derivetable(data.descriptions) @@ -2009,6 +2344,7 @@ local function copytotfm(data,cache_id) local filename = constructors.checkedfilename(resources) local fontname = metadata.fontname local fullname = metadata.fullname or fontname + local psname = fontname or fullname local units = metadata.units_per_em or 1000 -- if units == 0 then -- catch bugs in fonts @@ -2028,8 +2364,8 @@ local function copytotfm(data,cache_id) parameters.charwidth = charwidth parameters.charxheight = charxheight -- - local space = 0x0020 -- unicodes['space'], unicodes['emdash'] - local emdash = 0x2014 -- unicodes['space'], unicodes['emdash'] + local space = 0x0020 + local emdash = 0x2014 if monospaced then if descriptions[space] then spaceunits, spacer = descriptions[space].width, "space" @@ -2078,7 +2414,7 @@ local function copytotfm(data,cache_id) if charxheight then parameters.x_height = charxheight else - local x = 0x78 -- unicodes['x'] + local x = 0x0078 if x then local x = descriptions[x] if x then @@ -2102,11 +2438,20 @@ local function copytotfm(data,cache_id) properties.filename = filename properties.fontname = fontname properties.fullname = fullname - properties.psname = fontname or fullname + properties.psname = psname properties.name = filename or fullname -- -- properties.name = specification.name -- properties.sub = specification.sub + -- + if warnings and #warnings > 0 then + report_otf("warnings for font: %s",filename) + report_otf() + for i=1,#warnings do + report_otf(" %s",warnings[i]) + end + report_otf() + end return { characters = characters, descriptions = descriptions, @@ -2115,6 +2460,7 @@ local function copytotfm(data,cache_id) resources = resources, properties = properties, goodies = goodies, + warnings = warnings, } end end @@ -2135,14 +2481,23 @@ local function otftotfm(specification) if duplicates then local nofduplicates, nofduplicated = 0, 0 for parent, list in next, duplicates do - for i=1,#list do - local unicode = list[i] - if not descriptions[unicode] then - descriptions[unicode] = descriptions[parent] -- or copy + if type(list) == "table" then + local n = #list + for i=1,n do + local unicode = list[i] + if not descriptions[unicode] then + descriptions[unicode] = descriptions[parent] -- or copy + nofduplicated = nofduplicated + 1 + end + end + nofduplicates = nofduplicates + n + else + if not descriptions[list] then + descriptions[list] = descriptions[parent] -- or copy nofduplicated = nofduplicated + 1 end + nofduplicates = nofduplicates + 1 end - nofduplicates = nofduplicates + #list end if trace_otf and nofduplicated ~= nofduplicates then report_otf("%i extra duplicates copied out of %i",nofduplicated,nofduplicates) diff --git a/Master/texmf-dist/tex/context/base/font-otn.lua b/Master/texmf-dist/tex/context/base/font-otn.lua index 25c750ae88f..52fcbcbd6cd 100644 --- a/Master/texmf-dist/tex/context/base/font-otn.lua +++ b/Master/texmf-dist/tex/context/base/font-otn.lua @@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['font-otn'] = { license = "see context related readme files", } +-- todo: looks like we have a leak somewhere (probably in ligatures) +-- todo: copy attributes to disc + -- this is a context version which can contain experimental code, but when we -- have serious patches we also need to change the other two font-otn files @@ -26,7 +29,6 @@ if not modules then modules = { } end modules ['font-otn'] = { -- todo: -- --- kerning is probably not yet ok for latin around dics nodes (interesting challenge) -- extension infrastructure (for usage out of context) -- sorting features according to vendors/renderers -- alternative loop quitters @@ -38,7 +40,18 @@ if not modules then modules = { } end modules ['font-otn'] = { -- mark (to mark) code is still not what it should be (too messy but we need some more extreem husayni tests) -- remove some optimizations (when I have a faster machine) -- --- maybe redo the lot some way (more context specific) +-- beware: +-- +-- we do some disc jugling where we need to keep in mind that the +-- pre, post and replace fields can have prev pointers to a nesting +-- node ... i wonder if that is still needed +-- +-- not possible: +-- +-- \discretionary {alpha-} {betagammadelta} +-- {\discretionary {alphabeta-} {gammadelta} +-- {\discretionary {alphabetagamma-} {delta} +-- {alphabetagammadelta}}} --[[ldx--

This module is a bit more split up that I'd like but since we also want to test @@ -121,7 +134,6 @@ results in different tables.

-- chainmore : multiple substitutions triggered by contextual lookup (e.g. fij -> f + ij) -- -- remark: the 'not implemented yet' variants will be done when we have fonts that use them --- remark: we need to check what to do with discretionaries -- We used to have independent hashes for lookups but as the tags are unique -- we now use only one hash. If needed we can have multiple again but in that @@ -129,16 +141,14 @@ results in different tables.

-- Todo: make plugin feature that operates on char/glyphnode arrays -local concat, insert, remove = table.concat, table.insert, table.remove -local gmatch, gsub, find, match, lower, strip = string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip -local type, next, tonumber, tostring = type, next, tonumber, tostring -local lpegmatch = lpeg.match +local type, next, tonumber = type, next, tonumber local random = math.random local formatters = string.formatters local logs, trackers, nodes, attributes = logs, trackers, nodes, attributes -local registertracker = trackers.register +local registertracker = trackers.register +local registerdirective = directives.register local fonts = fonts local otf = fonts.handlers.otf @@ -160,12 +170,25 @@ local trace_steps = false registertracker("otf.steps", function(v local trace_skips = false registertracker("otf.skips", function(v) trace_skips = v end) local trace_directions = false registertracker("otf.directions", function(v) trace_directions = v end) +local trace_kernruns = false registertracker("otf.kernruns", function(v) trace_kernruns = v end) +local trace_discruns = false registertracker("otf.discruns", function(v) trace_discruns = v end) +local trace_compruns = false registertracker("otf.compruns", function(v) trace_compruns = v end) + +local quit_on_no_replacement = true -- maybe per font +local check_discretionaries = true -- "trace" +local zwnjruns = true + +registerdirective("otf.zwnjruns", function(v) zwnjruns = v end) +registerdirective("otf.chain.quitonnoreplacement",function(value) quit_on_no_replacement = value end) + + local report_direct = logs.reporter("fonts","otf direct") local report_subchain = logs.reporter("fonts","otf subchain") local report_chain = logs.reporter("fonts","otf chain") local report_process = logs.reporter("fonts","otf process") local report_prepare = logs.reporter("fonts","otf prepare") local report_warning = logs.reporter("fonts","otf warning") +local report_run = logs.reporter("fonts","otf run") registertracker("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end) registertracker("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end) @@ -194,12 +217,18 @@ local getfont = nuts.getfont local getsubtype = nuts.getsubtype local getchar = nuts.getchar +local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local delete_node = nuts.delete +local remove_node = nuts.remove local copy_node = nuts.copy +local copy_node_list = nuts.copy_list local find_node_tail = nuts.tail local flush_node_list = nuts.flush_list +local free_node = nuts.free local end_of_math = nuts.end_of_math +local traverse_nodes = nuts.traverse +local traverse_id = nuts.traverse_id local setmetatableindex = table.setmetatableindex @@ -223,26 +252,31 @@ local dir_code = whatcodes.dir local localpar_code = whatcodes.localpar local discretionary_code = disccodes.discretionary +local regular_code = disccodes.regular +local automatic_code = disccodes.automatic local ligature_code = glyphcodes.ligature local privateattribute = attributes.private -- Something is messed up: we have two mark / ligature indices, one at the injection --- end and one here ... this is bases in KE's patches but there is something fishy +-- end and one here ... this is based on KE's patches but there is something fishy -- there as I'm pretty sure that for husayni we need some connection (as it's much -- more complex than an average font) but I need proper examples of all cases, not -- of only some. local a_state = privateattribute('state') -local a_cursbase = privateattribute('cursbase') -- to be checked -local a_ligacomp = privateattribute('ligacomp') -- assigned here (ideally it should be combined) +local a_cursbase = privateattribute('cursbase') -- to be checked, probably can go local injections = nodes.injections local setmark = injections.setmark local setcursive = injections.setcursive local setkern = injections.setkern local setpair = injections.setpair +local resetinjection = injections.reset +local copyinjection = injections.copy +local setligaindex = injections.setligaindex +local getligaindex = injections.getligaindex local cursonce = true @@ -267,6 +301,7 @@ local currentfont = false local lookuptable = false local anchorlookups = false local lookuptypes = false +local lookuptags = false local handlers = { } local rlmode = 0 local featurevalue = false @@ -321,20 +356,20 @@ end local function cref(kind,chainname,chainlookupname,lookupname,index) -- not in the mood to alias f_ if index then - return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index) + return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index) elseif lookupname then - return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname) + return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname]) elseif chainlookupname then - return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname) + return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname]) elseif chainname then - return formatters["feature %a, chain %a"](kind,chainname) + return formatters["feature %a, chain %a"](kind,lookuptags[chainname]) else return formatters["feature %a"](kind) end end local function pref(kind,lookupname) - return formatters["feature %a, lookup %a"](kind,lookupname) + return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname]) end -- We can assume that languages that use marks are not hyphenated. We can also assume @@ -351,10 +386,60 @@ local function copy_glyph(g) -- next and prev are untouched ! if components then setfield(g,"components",nil) local n = copy_node(g) + copyinjection(n,g) -- we need to preserve the lig indices setfield(g,"components",components) return n else - return copy_node(g) + local n = copy_node(g) + copyinjection(n,g) -- we need to preserve the lig indices + return n + end +end + +-- temp here (context) + +local function collapse_disc(start,next) + local replace1 = getfield(start,"replace") + local replace2 = getfield(next,"replace") + if replace1 and replace2 then + local pre2 = getfield(next,"pre") + local post2 = getfield(next,"post") + setfield(replace1,"prev",nil) + if pre2 then + local pre1 = getfield(start,"pre") + if pre1 then + flush_node_list(pre1) + end + local pre1 = copy_node_list(replace1) + local tail1 = find_node_tail(pre1) + setfield(tail1,"next",pre2) + setfield(pre2,"prev",tail1) + setfield(start,"pre",pre1) + setfield(next,"pre",nil) + else + setfield(start,"pre",nil) + end + if post2 then + local post1 = getfield(start,"post") + if post1 then + flush_node_list(post1) + end + setfield(start,"post",post2) + else + setfield(start,"post",nil) + end + local tail1 = find_node_tail(replace1) + setfield(tail1,"next",replace2) + setfield(replace2,"prev",tail1) + setfield(start,"replace",replace1) + setfield(next,"replace",nil) + -- + local nextnext = getnext(next) + setfield(nextnext,"prev",start) + setfield(start,"next",nextnext) + free_node(next) + else + -- maybe remove it end end @@ -372,6 +457,7 @@ local function markstoligature(kind,lookupname,head,start,stop,char) if head == start then head = base end + resetinjection(base) setfield(base,"char",char) setfield(base,"subtype",ligature_code) setfield(base,"components",start) @@ -412,24 +498,99 @@ local function getcomponentindex(start) end end --- eventually we will do positioning in an other way (needs addional w/h/d fields) +local a_noligature = attributes.private("noligature") +local prehyphenchar = languages and languages.prehyphenchar +local posthyphenchar = languages and languages.posthyphenchar +----- preexhyphenchar = languages and languages.preexhyphenchar +----- postexhyphenchar = languages and languages.postexhyphenchar + +if prehyphenchar then + + -- okay + +elseif context then + + report_warning("no language support") os.exit() + +else + + local newlang = lang.new + local getpre = lang.prehyphenchar + local getpost = lang.posthyphenchar + -- local getpreex = lang.preexhyphenchar + -- local getpostex = lang.postexhyphenchar + + prehyphenchar = function(l) local l = newlang(l) return l and getpre (l) or -1 end + posthyphenchar = function(l) local l = newlang(l) return l and getpost (l) or -1 end + -- preexhyphenchar = function(l) local l = newlang(l) return l and getpreex (l) or -1 end + -- postexhyphenchar = function(l) local l = newlang(l) return l and getpostex(l) or -1 end + +end + +local function addhyphens(template,pre,post) + -- inserted by hyphenation algorithm + local l = getfield(template,"lang") + local p = prehyphenchar(l) + if p and p > 0 then + local c = copy_node(template) + setfield(c,"char",p) + if pre then + local t = find_node_tail(pre) + setfield(t,"next",c) + setfield(c,"prev",t) + else + pre = c + end + end + local p = posthyphenchar(l) + if p and p > 0 then + local c = copy_node(template) + setfield(c,"char",p) + if post then + -- post has a prev nesting node .. alternatively we could + local prev = getprev(post) + setfield(c,"next",post) + setfield(post,"prev",c) + if prev then + setfield(prev,"next",c) + setfield(c,"prev",prev) + end + else + post = c + end + end + return pre, post +end local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head + if getattr(start,a_noligature) == 1 then + -- so we can do: e\noligature{ff}e e\noligature{f}fie (we only look at the first) + return head, start + end if start == stop and getchar(start) == char then + resetinjection(start) setfield(start,"char",char) return head, start end + -- needs testing (side effects): + local components = getfield(base,"components") + if components then + flush_node_list(components) + end + -- local prev = getprev(start) local next = getnext(stop) + local comp = start setfield(start,"prev",nil) setfield(stop,"next",nil) local base = copy_glyph(start) if start == head then head = base end + resetinjection(base) setfield(base,"char",char) setfield(base,"subtype",ligature_code) - setfield(base,"components",start) -- start can have components + setfield(base,"components",comp) -- start can have components .. do we need to flush? if prev then setfield(prev,"next",base) end @@ -452,11 +613,13 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun baseindex = baseindex + componentindex componentindex = getcomponentindex(start) elseif not deletemarks then -- quite fishy - setprop(start,a_ligacomp,baseindex + (getprop(start,a_ligacomp) or componentindex)) + setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getprop(start,a_ligacomp)) + logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end - head, current = insert_node_after(head,current,copy_node(start)) -- unlikely that mark has components + local n = copy_node(start) + copyinjection(n,start) + head, current = insert_node_after(head,current,n) -- unlikely that mark has components elseif trace_marks then logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) end @@ -468,15 +631,79 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun while start and getid(start) == glyph_code do local char = getchar(start) if marks[char] then - setprop(start,a_ligacomp,baseindex + (getprop(start,a_ligacomp) or componentindex)) + setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getprop(start,a_ligacomp)) + logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end else break end start = getnext(start) end + else + -- discfound ... forget about marks .. probably no scripts that hyphenate and have marks + local discprev = getfield(discfound,"prev") + local discnext = getfield(discfound,"next") + if discprev and discnext then + local subtype = getsubtype(discfound) + if subtype == discretionary_code then + local pre = getfield(discfound,"pre") + local post = getfield(discfound,"post") + local replace = getfield(discfound,"replace") + if not replace then -- todo: signal simple hyphen + local prev = getfield(base,"prev") + local copied = copy_node_list(comp) + setfield(discnext,"prev",nil) -- also blocks funny assignments + setfield(discprev,"next",nil) -- also blocks funny assignments + if pre then + setfield(comp,"next",pre) + setfield(pre,"prev",comp) + end + pre = comp + if post then + local tail = find_node_tail(post) + setfield(tail,"next",discnext) + setfield(discnext,"prev",tail) + setfield(post,"prev",nil) + else + post = discnext + end + setfield(prev,"next",discfound) + setfield(next,"prev",discfound) + setfield(discfound,"next",next) + setfield(discfound,"prev",prev) + setfield(base,"next",nil) + setfield(base,"prev",nil) + setfield(base,"components",copied) + setfield(discfound,"pre",pre) + setfield(discfound,"post",post) + setfield(discfound,"replace",base) + setfield(discfound,"subtype",discretionary_code) + base = prev -- restart + end + elseif discretionary_code == regular_code then + -- local prev = getfield(base,"prev") + -- local next = getfield(base,"next") + local copied = copy_node_list(comp) + setfield(discnext,"prev",nil) -- also blocks funny assignments + setfield(discprev,"next",nil) -- also blocks funny assignments + local pre, post = addhyphens(comp,comp,discnext,subtype) -- takes from components + setfield(prev,"next",discfound) + setfield(next,"prev",discfound) + setfield(discfound,"next",next) + setfield(discfound,"prev",prev) + setfield(base,"next",nil) + setfield(base,"prev",nil) + setfield(base,"components",copied) + setfield(discfound,"pre",pre) + setfield(discfound,"post",post) + setfield(discfound,"replace",base) + setfield(discfound,"subtype",discretionary_code) + base = next -- or restart + else + -- forget about it in generic usage + end + end end return head, base end @@ -485,6 +712,7 @@ function handlers.gsub_single(head,start,kind,lookupname,replacement) if trace_singles then logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement)) end + resetinjection(start) setfield(start,"char",replacement) return head, start, true end @@ -524,6 +752,7 @@ end local function multiple_glyphs(head,start,multiple,ignoremarks) local nofmultiples = #multiple if nofmultiples > 0 then + resetinjection(start) setfield(start,"char",multiple[1]) if nofmultiples > 1 then local sn = getnext(start) @@ -534,6 +763,7 @@ local function multiple_glyphs(head,start,multiple,ignoremarks) -- local sn = getnext(sn) -- end local n = copy_node(start) -- ignore components + resetinjection(n) setfield(n,"char",multiple[k]) setfield(n,"next",sn) setfield(n,"prev",start) @@ -560,6 +790,7 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence if trace_alternatives then logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment) end + resetinjection(start) setfield(start,"char",choice) else if trace_alternatives then @@ -577,7 +808,7 @@ function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence) end function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) - local s, stop, discfound = getnext(start), nil, false + local s, stop = getnext(start), nil local startchar = getchar(start) if marks[startchar] then while s do @@ -605,24 +836,30 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) else head, start = markstoligature(kind,lookupname,head,start,stop,lig) end - return head, start, true + return head, start, true, false else -- ok, goto next lookup end end else - local skipmark = sequence.flags[1] + local skipmark = sequence.flags[1] + local discfound = false + local lastdisc = nil while s do local id = getid(s) - if id == glyph_code and getsubtype(s)<256 then - if getfont(s) == currentfont then + if id == glyph_code and getsubtype(s)<256 then -- not needed + if getfont(s) == currentfont then -- also not needed only when mark local char = getchar(s) if skipmark and marks[char] then s = getnext(s) - else - local lg = ligature[char] + else -- ligature is a tree + local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font if lg then - stop = s + if not discfound and lastdisc then + discfound = lastdisc + lastdisc = nil + end + stop = s -- needed for fake so outside then ligature = lg s = getnext(s) else @@ -633,13 +870,13 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) break end elseif id == disc_code then - discfound = true + lastdisc = s s = getnext(s) else break end end - local lig = ligature.ligature + local lig = ligature.ligature -- can't we get rid of this .ligature? if lig then if stop then if trace_ligatures then @@ -651,19 +888,34 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) end else -- weird but happens (in some arabic font) + resetinjection(start) setfield(start,"char",lig) if trace_ligatures then logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig)) end end - return head, start, true + return head, start, true, discfound else - -- weird but happens + -- weird but happens, pseudo ligatures ... just the components end end - return head, start, false + return head, start, false, discfound end +-- function is_gsub_ligature(start,ligature) -- limited case: in disc nodes, only latin, always glyphs +-- local s = getnext(start) +-- while s do +-- local lg = ligature[getchar(s)] +-- if lg then +-- ligature = lg +-- s = getnext(s) +-- else +-- return +-- end +-- end +-- return ligature and ligature.ligature +-- end + --[[ldx--

We get hits on a mark, but we're not sure if the it has to be applied so we need to explicitly test for basechar, baselig and basemark entries.

@@ -752,7 +1004,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ end end end - local index = getprop(start,a_ligacomp) + local index = getligaindex(start) local baseanchors = descriptions[basechar] if baseanchors then baseanchors = baseanchors.anchors @@ -802,10 +1054,10 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence local markchar = getchar(start) if marks[markchar] then local base = getprev(start) -- [glyph] [basemark] [start=mark] - local slc = getprop(start,a_ligacomp) + local slc = getligaindex(start) if slc then -- a rather messy loop ... needs checking with husayni while base do - local blc = getprop(base,a_ligacomp) + local blc = getligaindex(base) if blc and blc ~= slc then base = getprev(base) else @@ -909,16 +1161,16 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) end end -function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence) +function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence,injection) local startchar = getchar(start) - local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar]) + local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,injection) -- ,characters[startchar]) if trace_kerns then logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h) end return head, start, false end -function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) +function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence,lookuphash,i,injection) -- todo: kerns in disc nodes: pre, post, replace -> loop over disc too -- todo: kerns in components of ligatures local snext = getnext(start) @@ -942,14 +1194,14 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) local a, b = krn[2], krn[3] if a and #a > 0 then local startchar = getchar(start) - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) + local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,injection) -- characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b > 0 then local startchar = getchar(start) - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) + local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,injection) -- characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) end @@ -969,7 +1221,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) end done = true elseif krn ~= 0 then - local k = setkern(snext,factor,rlmode,krn) + local k = setkern(snext,factor,rlmode,krn,injection) if trace_kerns then logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) end @@ -1032,6 +1284,7 @@ function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,loo if trace_singles then logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement)) end + resetinjection(start) setfield(start,"char",replacement) return head, start, true else @@ -1086,8 +1339,7 @@ as less as needed but that would also make the code even more messy.

-- end --[[ldx-- -

Here we replace start by a single variant, First we delete the rest of the -match.

+

Here we replace start by a single variant.

--ldx]]-- function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex) @@ -1095,7 +1347,7 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo local current = start local subtables = currentlookup.subtables if #subtables > 1 then - logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," ")) + logwarning("todo: check if we need to loop over the replacements: % t",subtables) end while current do if getid(current) == glyph_code then @@ -1116,7 +1368,84 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo if trace_singles then logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement)) end - setfield(current,"char",replacement) + resetinjection(current) + if check_discretionaries then + -- some fonts use a chain lookup to replace e.g. an f in a fi ligature + -- and there can be a disc node in between ... the next code tries to catch + -- this + local next = getnext(current) + local prev = getprev(current) -- todo: just remember it above + local done = false + if next then + if getid(next) == disc_code then + local subtype = getsubtype(next) + if subtype == discretionary_code then + setfield(next,"prev",prev) + setfield(prev,"next",next) + setfield(current,"prev",nil) + setfield(current,"next",nil) + local replace = getfield(next,"replace") + local pre = getfield(next,"pre") + local new = copy_node(current) + setfield(new,"char",replacement) + if replace then + setfield(new,"next",replace) + setfield(replace,"prev",new) + end + if pre then + setfield(current,"next",pre) + setfield(pre,"prev",current) + end + setfield(next,"replace",new) -- also updates tail + setfield(next,"pre",current) -- also updates tail + end + start = next + done = true + local next = getnext(start) + if next and getid(next) == disc_code then + collapse_disc(start,next) + end + end + end + if not done and prev then + if getid(prev) == disc_code then + local subtype = getsubtype(prev) + if subtype == discretionary_code then + setfield(next,"prev",prev) + setfield(prev,"next",next) + setfield(current,"prev",nil) + setfield(current,"next",nil) + local replace = getfield(prev,"replace") + local post = getfield(prev,"post") + local new = copy_node(current) + setfield(new,"char",replacement) + if replace then + local tail = find_node_tail(replace) + setfield(tail,"next",new) + setfield(new,"prev",tail) + else + replace = new + end + if post then + local tail = find_node_tail(post) + setfield(tail,"next",current) + setfield(current,"prev",tail) + else + post = current + end + setfield(prev,"replace",replace) -- also updates tail + setfield(prev,"post",post) -- also updates tail + start = prev + done = true + end + end + end + if not done then + setfield(current,"char",replacement) + end + else + setfield(current,"char",replacement) + end end end return head, start, true @@ -1132,8 +1461,7 @@ end chainmores.gsub_single = chainprocs.gsub_single --[[ldx-- -

Here we replace start by a sequence of new glyphs. First we delete the rest of -the match.

+

Here we replace start by a sequence of new glyphs.

--ldx]]-- function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) @@ -1197,6 +1525,7 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext if trace_alternatives then logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment) end + resetinjection(start) setfield(start,"char",choice) else if trace_alternatives then @@ -1249,12 +1578,22 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, while s do local id = getid(s) if id == disc_code then - s = getnext(s) - discfound = true + if not discfound then + discfound = s + end + if s == stop then + break -- okay? or before the disc + else + s = getnext(s) + end else local schar = getchar(s) if skipmark and marks[schar] then -- marks +-- if s == stop then -- maybe add this +-- break +-- else s = getnext(s) +-- end else local lg = ligatures[schar] if lg then @@ -1283,7 +1622,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, end end head, start = toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound) - return head, start, true, nofreplacements + return head, start, true, nofreplacements, discfound elseif trace_bugs then if start == stop then logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) @@ -1293,7 +1632,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, end end end - return head, start, false, 0 + return head, start, false, 0, false end chainmores.gsub_ligature = chainprocs.gsub_ligature @@ -1392,7 +1731,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon end end -- todo: like marks a ligatures hash - local index = getprop(start,a_ligacomp) + local index = getligaindex(start) local baseanchors = descriptions[basechar].anchors if baseanchors then local baseanchors = baseanchors['baselig'] @@ -1443,10 +1782,10 @@ function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext end if markanchors then local base = getprev(start) -- [glyph] [basemark] [start=mark] - local slc = getprop(start,a_ligacomp) + local slc = getligaindex(start) if slc then -- a rather messy loop ... needs checking with husayni while base do - local blc = getprop(base,a_ligacomp) + local blc = getligaindex(base) if blc and blc ~= slc then base = getprev(base) else @@ -1565,7 +1904,7 @@ function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lo if kerns then kerns = kerns[startchar] -- needed ? if kerns then - local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar]) + local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns) -- ,characters[startchar]) if trace_kerns then logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h) end @@ -1605,14 +1944,14 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look local a, b = krn[2], krn[3] if a and #a > 0 then local startchar = getchar(start) - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) + local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a) -- ,characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b > 0 then local startchar = getchar(start) - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) + local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b) -- ,characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) end @@ -1666,12 +2005,6 @@ local function show_skip(kind,chainname,char,ck,class) end end -local quit_on_no_replacement = true - -directives.register("otf.chain.quitonnoreplacement",function(value) -- maybe per font - quit_on_no_replacement = value -end) - local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash) -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6] local flags = sequence.flags @@ -1741,7 +2074,36 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq break end elseif id == disc_code then - last = getnext(last) + if check_discretionaries then + local replace = getfield(last,"replace") + if replace then + -- so far we never entered this branch + while replace do + if seq[n][getchar(replace)] then + n = n + 1 + replace = getnext(replace) + if not replace then + break + elseif n > l then +-- match = false + break + end + else + match = false + break + end + end + if not match then + break + elseif check_discretionaries == "trace" then + report_chain("check disc action in current") + end + else + last = getnext(last) -- no skipping here + end + else + last = getnext(last) -- no skipping here + end else match = false break @@ -1787,7 +2149,39 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq break end elseif id == disc_code then - -- skip 'm + -- the special case: f i where i becomes dottless i .. + if check_discretionaries then + local replace = getfield(prev,"replace") + if replace then + -- we seldom enter this branch (e.g. on brill efficient) + replace = find_node_tail(replace) + local finish = getprev(replace) + while replace do + if seq[n][getchar(replace)] then + n = n - 1 + replace = getprev(replace) + if not replace or replace == finish then + break + elseif n < 1 then +-- match = false + break + end + else + match = false + break + end + end + if not match then + break + elseif check_discretionaries == "trace" then + report_chain("check disc action in before") + end + else + -- skip 'm + end + else + -- skip 'm + end elseif seq[n][32] then n = n -1 else @@ -1796,7 +2190,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end prev = getprev(prev) elseif seq[n][32] then -- somewhat special, as zapfino can have many preceding spaces - n = n -1 + n = n - 1 else match = false break @@ -1804,6 +2198,8 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end elseif f == 2 then match = seq[1][32] +-- elseif f > 2 then +-- match = false -- KE ? else for n=f-1,1 do if not seq[n][32] then @@ -1848,7 +2244,35 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq break end elseif id == disc_code then - -- skip 'm + if check_discretionaries then + local replace = getfield(current,"replace") + if replace then + -- so far we never entered this branch + while replace do + if seq[n][getchar(replace)] then + n = n + 1 + replace = getnext(replace) + if not replace then + break + elseif n > s then + break + end + else + match = false + break + end + end + if not match then + break + elseif check_discretionaries == "trace" then + report_chain("check disc action in after") + end + else + -- skip 'm + end + else + -- skip 'm + end elseif seq[n][32] then -- brrr n = n + 1 else @@ -1911,7 +2335,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end else local i = 1 - repeat + while true do if skipped then while true do local char = getchar(start) @@ -1952,12 +2376,14 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end end end - if start then + if i > nofchainlookups then + break + elseif start then start = getnext(start) else -- weird end - until i > nofchainlookups + end end else local replacements = ck[7] @@ -2133,6 +2559,186 @@ end -- -- the action -- end +-- assumptions: +-- +-- * languages that use complex disc nodes + +-- optimization comes later ... + +local function kernrun(disc,run) -- we can assume that prev and next are glyphs + if trace_kernruns then + report_run("kern") -- will be more detailed + end + -- + local prev = getprev(disc) -- todo, keep these in the main loop + local next = getnext(disc) -- todo, keep these in the main loop + -- + local pre = getfield(disc,"pre") + if not pre then + -- go on + elseif prev then + local nest = getprev(pre) + setfield(pre,"prev",prev) + setfield(prev,"next",pre) + run(prev,"preinjections") + setfield(pre,"prev",nest) + setfield(prev,"next",disc) + else + run(pre,"preinjections") + end + -- + local post = getfield(disc,"post") + if not post then + -- go on + elseif next then + local tail = find_node_tail(post) + setfield(tail,"next",next) + setfield(next,"prev",tail) + run(post,"postinjections",tail) + setfield(tail,"next",nil) + setfield(next,"prev",disc) + else + run(post,"postinjections") + end + -- + local replace = getfield(disc,"replace") + if not replace then + -- this should be already done by discfound + elseif prev and next then + local tail = find_node_tail(replace) + local nest = getprev(replace) + setfield(replace,"prev",prev) + setfield(prev,"next",replace) + setfield(tail,"next",next) + setfield(next,"prev",tail) + run(prev,"replaceinjections",tail) + setfield(replace,"prev",nest) + setfield(prev,"next",disc) + setfield(tail,"next",nil) + setfield(next,"prev",disc) + elseif prev then + local nest = getprev(replace) + setfield(replace,"prev",prev) + setfield(prev,"next",replace) + run(prev,"replaceinjections") + setfield(replace,"prev",nest) + setfield(prev,"next",disc) + elseif next then + local tail = find_node_tail(replace) + setfield(tail,"next",next) + setfield(next,"prev",tail) + run(replace,"replaceinjections",tail) + setfield(tail,"next",nil) + setfield(next,"prev",disc) + else + run(replace,"replaceinjections") + end +end + +-- the if new test might be dangerous as luatex will check / set some tail stuff +-- in a temp node + +local function comprun(disc,run) + if trace_compruns then + report_run("comp: %s",languages.serializediscretionary(disc)) + end + -- + local pre = getfield(disc,"pre") + if pre then + local new, done = run(pre) + if done then + setfield(disc,"pre",new) + end + end + -- + local post = getfield(disc,"post") + if post then + local new, done = run(post) + if done then + setfield(disc,"post",new) + end + end + -- + local replace = getfield(disc,"replace") + if replace then + local new, done = run(replace) + if done then + setfield(disc,"replace",new) + end + end +end + +local function testrun(disc,trun,crun) + local next = getnext(disc) + if next then + local replace = getfield(disc,"replace") + if replace then + local prev = getprev(disc) + if prev then + -- only look ahead + local tail = find_node_tail(replace) + -- local nest = getprev(replace) + setfield(tail,"next",next) + setfield(next,"prev",tail) + if trun(replace,next) then + setfield(disc,"replace",nil) -- beware, side effects of nest so first + setfield(prev,"next",replace) + setfield(replace,"prev",prev) + setfield(next,"prev",tail) + setfield(tail,"next",next) + setfield(disc,"prev",nil) + setfield(disc,"next",nil) + flush_node_list(disc) + return replace -- restart + else + setfield(tail,"next",nil) + setfield(next,"prev",disc) + end + else + -- weird case + end + else + -- no need + end + else + -- weird case + end + comprun(disc,crun) + return next +end + +local function discrun(disc,drun,krun) + local next = getnext(disc) + local prev = getprev(disc) + if trace_discruns then + report_run("disc") -- will be more detailed + end + if next and prev then + setfield(prev,"next",next) + -- setfield(next,"prev",prev) + drun(prev) + setfield(prev,"next",disc) + -- setfield(next,"prev",disc) + end + -- + local pre = getfield(disc,"pre") + if not pre then + -- go on + elseif prev then + local nest = getprev(pre) + setfield(pre,"prev",prev) + setfield(prev,"next",pre) + krun(prev,"preinjections") + setfield(pre,"prev",nest) + setfield(prev,"next",disc) + else + run(pre,"preinjections") + end + return next +end + +-- todo: maybe run lr and rl stretches + local function featuresprocessor(head,font,attr) local lookuphash = lookuphashes[font] -- we can also check sequences here @@ -2156,6 +2762,7 @@ local function featuresprocessor(head,font,attr) anchorlookups = resources.lookup_to_anchor lookuptable = resources.lookups lookuptypes = resources.lookuptypes + lookuptags = resources.lookuptags currentfont = font rlmode = 0 @@ -2176,21 +2783,28 @@ local function featuresprocessor(head,font,attr) -- todo: retain prev + -- We don't goto the next node of a disc node is created so that we can then treat + -- the pre, post and replace. It's abit of a hack but works out ok for most cases. + + -- there can be less subtype and attr checking in the comprun etc helpers + for s=1,#datasets do - local dataset = datasets[s] - featurevalue = dataset[1] -- todo: pass to function instead of using a global - - local sequence = dataset[5] -- sequences[s] -- also dataset[5] - local rlparmode = 0 - local topstack = 0 - local success = false - local attribute = dataset[2] - local chain = dataset[3] -- sequence.chain or 0 - local typ = sequence.type - local subtables = sequence.subtables + local dataset = datasets[s] + featurevalue = dataset[1] -- todo: pass to function instead of using a global + local attribute = dataset[2] + local chain = dataset[3] -- sequence.chain or 0 + local kind = dataset[4] + local sequence = dataset[5] -- sequences[s] -- also dataset[5] + local rlparmode = 0 + local topstack = 0 + local success = false + local typ = sequence.type + local gpossing = typ == "gpos_single" or typ == "gpos_pair" + local subtables = sequence.subtables + local handler = handlers[typ] + if chain < 0 then -- this is a limited case, no special treatments like 'init' etc - local handler = handlers[typ] -- we need to get rid of this slide! probably no longer needed in latest luatex local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo while start do @@ -2204,13 +2818,16 @@ local function featuresprocessor(head,font,attr) a = true end if a then + local char = getchar(start) for i=1,#subtables do local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[getchar(start)] + -- local lookupmatch = lookupcache[getchar(start)] + local lookupmatch = lookupcache[start] if lookupmatch then - head, start, success = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) + -- todo: disc? + head, start, success = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) if success then break end @@ -2231,7 +2848,6 @@ local function featuresprocessor(head,font,attr) end end else - local handler = handlers[typ] local ns = #subtables local start = head -- local ? rlmode = 0 -- to be checked ? @@ -2242,13 +2858,15 @@ local function featuresprocessor(head,font,attr) report_missing_cache(typ,lookupname) else - local function subrun(start) - -- mostly for gsub, gpos would demand a more clever approach + local function c_run(start) -- no need to check for 256 and attr probably also the same local head = start local done = false while start do local id = getid(start) - if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + if id ~= glyph_code then + -- very unlikely + start = getnext(start) + elseif getfont(start) == font and getsubtype(start) < 256 then local a = getattr(start,0) if a then a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) @@ -2260,7 +2878,7 @@ local function featuresprocessor(head,font,attr) if lookupmatch then -- sequence kan weg local ok - head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) + head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1) if ok then done = true end @@ -2270,48 +2888,106 @@ local function featuresprocessor(head,font,attr) start = getnext(start) end else - start = getnext(start) + return head, false end end if done then - success = true - return head + success = true -- needed in this subrun? end + return head, done end - local function kerndisc(disc) -- we can assume that prev and next are glyphs - local prev = getprev(disc) - local next = getnext(disc) - if prev and next then - setfield(prev,"next",next) - -- setfield(next,"prev",prev) - local a = getattr(prev,0) - if a then - a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) + local function t_run(start,stop) + while start ~= stop do + local id = getid(start) + if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) + if a then + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) + else + a = not attribute or getprop(start,a_state) == attribute + end + if a then + local lookupmatch = lookupcache[getchar(start)] + if lookupmatch then -- hm, hyphens can match (tlig) so we need to really check + -- if we need more than ligatures we can outline the code and use functions + local s = getnext(start) + local l = nil + while s do + local lg = lookupmatch[getchar(s)] + if lg then + l = lg + s = getnext(s) + else + break + end + end + if l and l.ligature then + return true + end + end + end + start = getnext(start) else - a = not attribute or getprop(prev,a_state) == attribute + break end - if a then - local lookupmatch = lookupcache[getchar(prev)] - if lookupmatch then - -- sequence kan weg - local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) - if ok then - done = true - success = true + end + end + + local function d_run(prev) -- we can assume that prev and next are glyphs + local a = getattr(prev,0) + if a then + a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) + else + a = not attribute or getprop(prev,a_state) == attribute + end + if a then + local lookupmatch = lookupcache[getchar(prev)] + if lookupmatch then + -- sequence kan weg + local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,1) + if ok then + done = true + success = true + end + end + end + end + + local function k_run(sub,injection,last) + local a = getattr(sub,0) + if a then + a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute) + else + a = not attribute or getprop(sub,a_state) == attribute + end + if a then + -- sequence kan weg + for n in traverse_nodes(sub) do -- only gpos + if n == last then + break + end + local id = getid(n) + if id == glyph_code then + local lookupmatch = lookupcache[getchar(n)] + if lookupmatch then + local h, d, ok = handler(sub,n,kind,lookupname,lookupmatch,sequence,lookuphash,1,injection) + if ok then + done = true + success = true + end end + else + -- message end end - setfield(prev,"next",disc) - -- setfield(next,"prev",disc) end - return next end while start do local id = getid(start) if id == glyph_code then - if getfont(start) == font and getsubtype(start) < 256 then + if getfont(start) == font and getsubtype(start) < 256 then -- why a 256 test ... local a = getattr(start,0) if a then a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) @@ -2319,44 +2995,46 @@ local function featuresprocessor(head,font,attr) a = not attribute or getprop(start,a_state) == attribute end if a then - local lookupmatch = lookupcache[getchar(start)] + local char = getchar(start) + local lookupmatch = lookupcache[char] if lookupmatch then -- sequence kan weg local ok - head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) + head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1) if ok then success = true + elseif gpossing and zwnjruns and char == zwnj then + discrun(start,d_run) end + elseif gpossing and zwnjruns and char == zwnj then + discrun(start,d_run) end if start then start = getnext(start) end else - start = getnext(start) + start = getnext(start) end else start = getnext(start) end elseif id == disc_code then - -- mostly for gsub - if getsubtype(start) == discretionary_code then - local pre = getfield(start,"pre") - if pre then - local new = subrun(pre) - if new then setfield(start,"pre",new) end - end - local post = getfield(start,"post") - if post then - local new = subrun(post) - if new then setfield(start,"post",new) end - end - local replace = getfield(start,"replace") - if replace then - local new = subrun(replace) - if new then setfield(start,"replace",new) end - end -elseif typ == "gpos_single" or typ == "gpos_pair" then - kerndisc(start) - end - start = getnext(start) + local discretionary = getsubtype(start) == discretionary_code + if gpossing then + if discretionary then + kernrun(start,k_run) + else + discrun(start,d_run,k_run) + end + start = getnext(start) + elseif discretionary then + if typ == "gsub_ligature" then + start = testrun(start,t_run,c_run) + else + comprun(start,c_run) + start = getnext(start) + end + else + start = getnext(start) + end elseif id == whatsit_code then -- will be function local subtype = getsubtype(start) if subtype == dir_code then @@ -2401,15 +3079,18 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then end end end + else - local function subrun(start) - -- mostly for gsub, gpos would demand a more clever approach + local function c_run(start) local head = start local done = false while start do local id = getid(start) - if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + if id ~= glyph_code then + -- very unlikely + start = getnext(start) + elseif getfont(start) == font and getsubtype(start) < 256 then local a = getattr(start,0) if a then a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) @@ -2417,15 +3098,17 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then a = not attribute or getprop(start,a_state) == attribute end if a then + local char = getchar(start) for i=1,ns do local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[getchar(start)] + -- local lookupmatch = lookupcache[getchar(start)] + local lookupmatch = lookupcache[char] if lookupmatch then -- we could move all code inline but that makes things even more unreadable local ok - head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) + head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) if ok then done = true break @@ -2443,50 +3126,127 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then start = getnext(start) end else - start = getnext(start) + return head, false end end if done then success = true - return head end + return head, done end - local function kerndisc(disc) -- we can assume that prev and next are glyphs - local prev = getprev(disc) - local next = getnext(disc) - if prev and next then - setfield(prev,"next",next) - -- setfield(next,"prev",prev) - local a = getattr(prev,0) - if a then - a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) - else - a = not attribute or getprop(prev,a_state) == attribute + local function d_run(prev) + local a = getattr(prev,0) + if a then + a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) + else + a = not attribute or getprop(prev,a_state) == attribute + end + if a then + -- brr prev can be disc + local char = getchar(prev) + for i=1,ns do + local lookupname = subtables[i] + local lookupcache = lookuphash[lookupname] + if lookupcache then + local lookupmatch = lookupcache[char] + if lookupmatch then + -- we could move all code inline but that makes things even more unreadable + local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,i) + if ok then + done = true + break + end + end + else + report_missing_cache(typ,lookupname) + end end - if a then - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[getchar(prev)] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) - if ok then - done = true - break + end + end + + local function k_run(sub,injection,last) + local a = getattr(sub,0) + if a then + a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute) + else + a = not attribute or getprop(sub,a_state) == attribute + end + if a then + for n in traverse_nodes(sub) do -- only gpos + if n == last then + break + end + local id = getid(n) + if id == glyph_code then + local char = getchar(n) + for i=1,ns do + local lookupname = subtables[i] + local lookupcache = lookuphash[lookupname] + if lookupcache then + local lookupmatch = lookupcache[char] + if lookupmatch then + local h, d, ok = handler(head,n,kind,lookupname,lookupmatch,sequence,lookuphash,i,injection) + if ok then + done = true + break + end end + else + report_missing_cache(typ,lookupname) end - else - report_missing_cache(typ,lookupname) end + else + -- message end end - setfield(prev,"next",disc) - -- setfield(next,"prev",disc) end - return next + end + + local function t_run(start,stop) + while start ~= stop do + local id = getid(start) + if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) + if a then + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) + else + a = not attribute or getprop(start,a_state) == attribute + end + if a then + local char = getchar(start) + for i=1,ns do + local lookupname = subtables[i] + local lookupcache = lookuphash[lookupname] + if lookupcache then + local lookupmatch = lookupcache[char] + if lookupmatch then + -- if we need more than ligatures we can outline the code and use functions + local s = getnext(start) + local l = nil + while s do + local lg = lookupmatch[getchar(s)] + if lg then + l = lg + s = getnext(s) + else + break + end + end + if l and l.ligature then + return true + end + end + else + report_missing_cache(typ,lookupname) + end + end + end + start = getnext(start) + else + break + end + end end while start do @@ -2504,18 +3264,23 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[getchar(start)] + local char = getchar(start) + local lookupmatch = lookupcache[char] if lookupmatch then -- we could move all code inline but that makes things even more unreadable local ok - head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) + head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) if ok then success = true break elseif not start then -- don't ask why ... shouldn't happen break + elseif gpossing and zwnjruns and char == zwnj then + discrun(start,d_run) end + elseif gpossing and zwnjruns and char == zwnj then + discrun(start,d_run) end else report_missing_cache(typ,lookupname) @@ -2529,27 +3294,24 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then start = getnext(start) end elseif id == disc_code then - -- mostly for gsub - if getsubtype(start) == discretionary_code then - local pre = getfield(start,"pre") - if pre then - local new = subrun(pre) - if new then setfield(start,"pre",new) end - end - local post = getfield(start,"post") - if post then - local new = subrun(post) - if new then setfield(start,"post",new) end + local discretionary = getsubtype(start) == discretionary_code + if gpossing then + if discretionary then + kernrun(start,k_run) + else + discrun(start,d_run,k_run) end - local replace = getfield(start,"replace") - if replace then - local new = subrun(replace) - if new then setfield(start,"replace",new) end + start = getnext(start) + elseif discretionary then + if typ == "gsub_ligature" then + start = testrun(start,t_run,c_run) + else + comprun(start,c_run) + start = getnext(start) end -elseif typ == "gpos_single" or typ == "gpos_pair" then - kerndisc(start) + else + start = getnext(start) end - start = getnext(start) elseif id == whatsit_code then local subtype = getsubtype(start) if subtype == dir_code then @@ -2600,6 +3362,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then if trace_steps then -- ? registerstep(head) end + end head = tonode(head) @@ -2756,6 +3519,7 @@ local function prepare_contextchains(tfmdata) local rawdata = tfmdata.shared.rawdata local resources = rawdata.resources local lookuphash = resources.lookuphash + local lookuptags = resources.lookuptags local lookups = rawdata.lookups if lookups then for lookupname, lookupdata in next, rawdata.lookups do @@ -2769,7 +3533,7 @@ local function prepare_contextchains(tfmdata) report_prepare("unsupported format %a",format) elseif not validformat[lookuptype] then -- todo: dejavu-serif has one (but i need to see what use it has) - report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname) + report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname]) else local contexts = lookuphash[lookupname] if not contexts then @@ -2825,7 +3589,7 @@ local function prepare_contextchains(tfmdata) -- no rules end else - report_prepare("missing lookuptype for lookupname %a",lookupname) + report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname]) end end end diff --git a/Master/texmf-dist/tex/context/base/font-otp.lua b/Master/texmf-dist/tex/context/base/font-otp.lua index c80ee86ae61..63e4184c19a 100644 --- a/Master/texmf-dist/tex/context/base/font-otp.lua +++ b/Master/texmf-dist/tex/context/base/font-otp.lua @@ -140,6 +140,11 @@ end -- return b -- end +-- beware: we cannot unpack and repack the same table because then sharing +-- interferes (we could catch this if needed) .. so for now: save, reload +-- and repack in such cases (never needed anyway) .. a tricky aspect is that +-- we then need to sort more thanks to random hashing + local function packdata(data) if data then -- stripdata(data) @@ -750,27 +755,28 @@ local function unpackdata(data) rule.replacements = tv end end - local fore = rule.fore - if fore then - local tv = tables[fore] - if tv then - rule.fore = tv - end - end - local back = rule.back - if back then - local tv = tables[back] - if tv then - rule.back = tv - end - end - local names = rule.names - if names then - local tv = tables[names] - if tv then - rule.names = tv - end - end + -- local fore = rule.fore + -- if fore then + -- local tv = tables[fore] + -- if tv then + -- rule.fore = tv + -- end + -- end + -- local back = rule.back + -- if back then + -- local tv = tables[back] + -- if tv then + -- rule.back = tv + -- end + -- end + -- local names = rule.names + -- if names then + -- local tv = tables[names] + -- if tv then + -- rule.names = tv + -- end + -- end + -- local lookups = rule.lookups if lookups then local tv = tables[lookups] @@ -897,3 +903,4 @@ if otf.enhancers.register then end otf.enhancers.unpack = unpackdata -- used elsewhere +otf.enhancers.pack = packdata -- used elsewhere diff --git a/Master/texmf-dist/tex/context/base/font-ott.lua b/Master/texmf-dist/tex/context/base/font-ott.lua index 1e23090565b..1f9a1ac041a 100644 --- a/Master/texmf-dist/tex/context/base/font-ott.lua +++ b/Master/texmf-dist/tex/context/base/font-ott.lua @@ -858,15 +858,18 @@ function otf.features.normalize(features) if uv then -- report_checks("feature value %a first seen at %a",value,key) else - if type(value) == "string" then + uv = tonumber(value) -- before boolean as there we also handle 0/1 + if uv then + -- we're okay + elseif type(value) == "string" then local b = is_boolean(value) if type(b) == "nil" then - uv = tonumber(value) or lower(value) + uv = lower(value) else uv = b end else - uv = v + uv = value end if not rawget(features,k) then k = rawget(verbosefeatures,k) or k diff --git a/Master/texmf-dist/tex/context/base/font-otx.lua b/Master/texmf-dist/tex/context/base/font-otx.lua deleted file mode 100644 index dc0469e398e..00000000000 --- a/Master/texmf-dist/tex/context/base/font-otx.lua +++ /dev/null @@ -1,419 +0,0 @@ -if not modules then modules = { } end modules ['font-otx'] = { - version = 1.001, - comment = "companion to font-otf.lua (analysing)", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- context only - -local type = type - -if not trackers then trackers = { register = function() end } end - ------ trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end) - -local fonts, nodes, node = fonts, nodes, node - -local allocate = utilities.storage.allocate - -local otf = fonts.handlers.otf - -local analyzers = fonts.analyzers -local initializers = allocate() -local methods = allocate() - -analyzers.initializers = initializers -analyzers.methods = methods ----------.useunicodemarks = false - -local a_state = attributes.private('state') - -local nuts = nodes.nuts -local tonut = nuts.tonut - -local getfield = nuts.getfield -local getnext = nuts.getnext -local getprev = nuts.getprev -local getid = nuts.getid -local getprop = nuts.getprop -local setprop = nuts.setprop -local getfont = nuts.getfont -local getsubtype = nuts.getsubtype -local getchar = nuts.getchar - -local traverse_id = nuts.traverse_id -local traverse_node_list = nuts.traverse -local end_of_math = nuts.end_of_math - -local nodecodes = nodes.nodecodes -local glyph_code = nodecodes.glyph -local disc_code = nodecodes.disc -local math_code = nodecodes.math - -local fontdata = fonts.hashes.identifiers -local categories = characters and characters.categories or { } -- sorry, only in context -local chardata = characters and characters.data - -local otffeatures = fonts.constructors.newfeatures("otf") -local registerotffeature = otffeatures.register - ---[[ldx-- -

Analyzers run per script and/or language and are needed in order to -process features right.

---ldx]]-- - --- never use these numbers directly - -local s_init = 1 local s_rphf = 7 -local s_medi = 2 local s_half = 8 -local s_fina = 3 local s_pref = 9 -local s_isol = 4 local s_blwf = 10 -local s_mark = 5 local s_pstf = 11 -local s_rest = 6 - -local states = { - init = s_init, - medi = s_medi, - fina = s_fina, - isol = s_isol, - mark = s_mark, - rest = s_rest, - rphf = s_rphf, - half = s_half, - pref = s_pref, - blwf = s_blwf, - pstf = s_pstf, -} - -local features = { - init = s_init, - medi = s_medi, - fina = s_fina, - isol = s_isol, - -- mark = s_mark, - -- rest = s_rest, - rphf = s_rphf, - half = s_half, - pref = s_pref, - blwf = s_blwf, - pstf = s_pstf, -} - -analyzers.states = states -analyzers.features = features -analyzers.useunicodemarks = false - --- todo: analyzers per script/lang, cross font, so we need an font id hash -> script --- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace - -function analyzers.setstate(head,font) -- we can skip math - local useunicodemarks = analyzers.useunicodemarks - local tfmdata = fontdata[font] - local descriptions = tfmdata.descriptions - local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean - current = tonut(current) - while current do - local id = getid(current) - if id == glyph_code and getfont(current) == font then - done = true - local char = getchar(current) - local d = descriptions[char] - if d then - if d.class == "mark" then - done = true - setprop(current,a_state,s_mark) - elseif useunicodemarks and categories[char] == "mn" then - done = true - setprop(current,a_state,s_mark) - elseif n == 0 then - first, last, n = current, current, 1 - setprop(current,a_state,s_init) - else - last, n = current, n+1 - setprop(current,a_state,s_medi) - end - else -- finish - if first and first == last then - setprop(last,a_state,s_isol) - elseif last then - setprop(last,a_state,s_fina) - end - first, last, n = nil, nil, 0 - end - elseif id == disc_code then - -- always in the middle - setprop(current,a_state,s_medi) - last = current - else -- finish - if first and first == last then - setprop(last,a_state,s_isol) - elseif last then - setprop(last,a_state,s_fina) - end - first, last, n = nil, nil, 0 - if id == math_code then - current = end_of_math(current) - end - end - current = getnext(current) - end - if first and first == last then - setprop(last,a_state,s_isol) - elseif last then - setprop(last,a_state,s_fina) - end - return head, done -end - --- in the future we will use language/script attributes instead of the --- font related value, but then we also need dynamic features which is --- somewhat slower; and .. we need a chain of them - -local function analyzeinitializer(tfmdata,value) -- attr - local script, language = otf.scriptandlanguage(tfmdata) -- attr - local action = initializers[script] - if not action then - -- skip - elseif type(action) == "function" then - return action(tfmdata,value) - else - local action = action[language] - if action then - return action(tfmdata,value) - end - end -end - -local function analyzeprocessor(head,font,attr) - local tfmdata = fontdata[font] - local script, language = otf.scriptandlanguage(tfmdata,attr) - local action = methods[script] - if not action then - -- skip - elseif type(action) == "function" then - return action(head,font,attr) - else - action = action[language] - if action then - return action(head,font,attr) - end - end - return head, false -end - -registerotffeature { - name = "analyze", - description = "analysis of character classes", - default = true, - initializers = { - node = analyzeinitializer, - }, - processors = { - position = 1, - node = analyzeprocessor, - } -} - --- latin - -methods.latn = analyzers.setstate - -local arab_warned = { } - -local function warning(current,what) - local char = getchar(current) - if not arab_warned[char] then - log.report("analyze","arab: character %C has no %a class",char,what) - arab_warned[char] = true - end -end - -local mappers = { - l = s_init, -- left - d = s_medi, -- double - c = s_medi, -- joiner - r = s_fina, -- right - u = s_isol, -- nonjoiner -} - -local classifiers = { } -- we can also use this trick for devanagari - -local first_arabic, last_arabic = characters.blockrange("arabic") -local first_syriac, last_syriac = characters.blockrange("syriac") -local first_mandiac, last_mandiac = characters.blockrange("mandiac") -local first_nko, last_nko = characters.blockrange("nko") - -table.setmetatableindex(classifiers,function(t,k) - local c = chardata[k] - local v = false - if c then - local arabic = c.arabic - if arabic then - v = mappers[arabic] - if not v then - log.report("analyze","error in mapping arabic %C",k) - -- error - v = false - end - elseif k >= first_arabic and k <= last_arabic or k >= first_syriac and k <= last_syriac or - k >= first_mandiac and k <= last_mandiac or k >= first_nko and k <= last_nko then - if categories[k] == "mn" then - v = s_mark - else - v = s_rest - end - else - end - end - t[k] = v - return v -end) - -function methods.arab(head,font,attr) - local first, last = nil, nil - local c_first, c_last = nil, nil - local current, done = head, false - current = tonut(current) - while current do - local id = getid(current) - if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then - done = true - local char = getchar(current) - local classifier = classifiers[char] - if not classifier then - if last then - if c_last == s_medi or c_last == s_fina then - setprop(last,a_state,s_fina) - else - warning(last,"fina") - setprop(last,a_state,s_error) - end - first, last = nil, nil - elseif first then - if c_first == s_medi or c_first == s_fina then - setprop(first,a_state,s_isol) - else - warning(first,"isol") - setprop(first,a_state,s_error) - end - first = nil - end - elseif classifier == s_mark then - setprop(current,a_state,s_mark) - elseif classifier == s_isol then - if last then - if c_last == s_medi or c_last == s_fina then - setprop(last,a_state,s_fina) - else - warning(last,"fina") - setprop(last,a_state,s_error) - end - first, last = nil, nil - elseif first then - if c_first == s_medi or c_first == s_fina then - setprop(first,a_state,s_isol) - else - warning(first,"isol") - setprop(first,a_state,s_error) - end - first = nil - end - setprop(current,a_state,s_isol) - elseif classifier == s_medi then - if first then - last = current - c_last = classifier - setprop(current,a_state,s_medi) - else - setprop(current,a_state,s_init) - first = current - c_first = classifier - end - elseif classifier == s_fina then - if last then - if getprop(last,a_state) ~= s_init then - setprop(last,a_state,s_medi) - end - setprop(current,a_state,s_fina) - first, last = nil, nil - elseif first then - -- if getprop(first,a_state) ~= s_init then - -- -- needs checking - -- setprop(first,a_state,s_medi) - -- end - setprop(current,a_state,s_fina) - first = nil - else - setprop(current,a_state,s_isol) - end - else -- classifier == s_rest - setprop(current,a_state,s_rest) - if last then - if c_last == s_medi or c_last == s_fina then - setprop(last,a_state,s_fina) - else - warning(last,"fina") - setprop(last,a_state,s_error) - end - first, last = nil, nil - elseif first then - if c_first == s_medi or c_first == s_fina then - setprop(first,a_state,s_isol) - else - warning(first,"isol") - setprop(first,a_state,s_error) - end - first = nil - end - end - else - if last then - if c_last == s_medi or c_last == s_fina then - setprop(last,a_state,s_fina) - else - warning(last,"fina") - setprop(last,a_state,s_error) - end - first, last = nil, nil - elseif first then - if c_first == s_medi or c_first == s_fina then - setprop(first,a_state,s_isol) - else - warning(first,"isol") - setprop(first,a_state,s_error) - end - first = nil - end - if id == math_code then -- a bit duplicate as we test for glyphs twice - current = end_of_math(current) - end - end - current = getnext(current) - end - if last then - if c_last == s_medi or c_last == s_fina then - setprop(last,a_state,s_fina) - else - warning(last,"fina") - setprop(last,a_state,s_error) - end - elseif first then - if c_first == s_medi or c_first == s_fina then - setprop(first,a_state,s_isol) - else - warning(first,"isol") - setprop(first,a_state,s_error) - end - end - return head, done -end - -methods.syrc = methods.arab -methods.mand = methods.arab -methods.nko = methods.arab - -directives.register("otf.analyze.useunicodemarks",function(v) - analyzers.useunicodemarks = v -end) diff --git a/Master/texmf-dist/tex/context/base/font-pre.mkiv b/Master/texmf-dist/tex/context/base/font-pre.mkiv index fc6eb289e64..c184a2118db 100644 --- a/Master/texmf-dist/tex/context/base/font-pre.mkiv +++ b/Master/texmf-dist/tex/context/base/font-pre.mkiv @@ -100,14 +100,14 @@ features=no] \definefontfeature - [semetic-complete] + [semitic-complete] [mode=node,analyze=yes,language=dflt,ccmp=yes, init=yes,medi=yes,fina=yes,isol=yes, mark=yes,mkmk=yes,kern=yes,curs=yes, liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes] \definefontfeature - [semetic-simple] + [semitic-simple] [mode=node,analyze=yes,language=dflt,ccmp=yes, init=yes,medi=yes,fina=yes,isol=yes, mark=yes,mkmk=yes,kern=yes,curs=yes, @@ -115,22 +115,22 @@ \definefontfeature [arabic] - [semetic-complete] + [semitic-complete] [script=arab] \definefontfeature [hebrew] - [semetic-complete] + [semitic-complete] [script=hebr] \definefontfeature [simplearabic] - [semetic-simple] + [semitic-simple] [script=arab] \definefontfeature [simplehebrew] - [semetic-simple] + [semitic-simple] [script=hebr] % \definefont [DevaOne] [file:chandas.ttf*devanagari-one at 12pt] @@ -496,15 +496,16 @@ \definefontsize[\s!a] \definefontsize[\s!b] \definefontsize[\s!c] \definefontsize[\s!d] -\definealternativestyle [\v!mediaeval] [\os] [] -\definealternativestyle [\v!normal] [\tf] [] -\definealternativestyle [\v!bold] [\bf] [] -\definealternativestyle [\v!type] [\tt] [] -\definealternativestyle [\v!mono] [\tt] [] -\definealternativestyle [\v!slanted] [\sl] [] -\definealternativestyle [\v!italic] [\it] [] -\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] [] -\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] [] +\definealternativestyle [\v!mediaeval] [\os] [] +\definealternativestyle [\v!normal] [\tf] [] +\definealternativestyle [\v!bold] [\bf] [] +\definealternativestyle [\v!type] [\tt] [] +\definealternativestyle [\v!mono] [\tt] [] +\definealternativestyle [\v!monobold] [\tt\bf] [] +\definealternativestyle [\v!slanted] [\sl] [] +\definealternativestyle [\v!italic] [\it] [] +\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] [] +\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] [] \definealternativestyle [\v!small,\v!smallnormal] [\setsmallbodyfont\tf] [] \definealternativestyle [\v!smallbold] [\setsmallbodyfont\bf] [] @@ -584,6 +585,7 @@ \definefontfeature[f:smallcaps][smcp=yes] \definefontfeature[f:oldstyle] [onum=yes] \definefontfeature[f:tabular] [tnum=yes] +\definefontfeature[f:superiors][sups=yes] \definealternativestyle [\v!smallcaps] [\setsmallcaps] [\setsmallcaps] \definealternativestyle [\v!oldstyle] [\setoldstyle ] [\setoldstyle ] @@ -591,6 +593,7 @@ \unexpanded\def\setsmallcaps{\doaddfeature{f:smallcaps}} \unexpanded\def\setoldstyle {\doaddfeature{f:oldstyle}} \unexpanded\def\settabular {\doaddfeature{f:tabular}} +\unexpanded\def\setsuperiors{\doaddfeature{f:superiors}} %D \macros %D {tinyfont} @@ -617,6 +620,22 @@ \definefont[infofont][dejavusansmono at 6pt] % todo \the\everybodyfont +%D Optimization (later we overload in math): + +\unexpanded\def\normaltf{\let\fontalternative\s!tf\font_helpers_synchronize_font} +\unexpanded\def\normalbf{\let\fontalternative\s!bf\font_helpers_synchronize_font} +\unexpanded\def\normalit{\let\fontalternative\s!it\font_helpers_synchronize_font} +\unexpanded\def\normalsl{\let\fontalternative\s!sl\font_helpers_synchronize_font} +\unexpanded\def\normalbi{\let\fontalternative\s!bi\font_helpers_synchronize_font} +\unexpanded\def\normalbs{\let\fontalternative\s!bs\font_helpers_synchronize_font} + +\let\tf\normaltf +\let\bf\normalbf +\let\it\normalit +\let\sl\normalsl +\let\bi\normalbi +\let\bs\normalbs + \protect \endinput % LM math vs CM math (analysis by Taco): @@ -652,3 +671,30 @@ % % /lessorequalslant % /greaterorequalslant + +% \unprotect +% +% \definehighlight[\v!italic ][\c!command=\v!no,\c!style=\v!italic] +% \definehighlight[\v!bold ][\c!command=\v!no,\c!style=\v!bold] +% \definehighlight[\v!bolditalic][\c!command=\v!no,\c!style=\v!bolditalic] +% \definehighlight[\v!mono] [\c!command=\v!no,\c!style=\v!mono] +% \definehighlight[\v!monobold] [\c!command=\v!no,\c!style=\v!monobold] +% +% \definehighlight[important] [\c!command=\v!no,\c!style=\v!bold] +% \definehighlight[unimportant] [\c!command=\v!no,\c!color=darkgray] +% \definehighlight[warning] [\c!command=\v!no,\c!style=\v!bold,\c!color=darkblue] +% \definehighlight[error] [\c!command=\v!no,\c!style=\v!bold,\c!color=darkred] +% +% \protect +% +% \starttext +% \highlight[italic] {italic} +% \highlight[bolditalic] {bolditalic} +% \highlight[bold] {bold} +% \highlight[mono] {mono} +% \highlight[monobold] {monobold} +% \highlight[important] {important} +% \highlight[unimportant]{unimportant} +% \highlight[warning] {warning} +% \highlight[error] {error} +% \stoptext diff --git a/Master/texmf-dist/tex/context/base/font-run.mkiv b/Master/texmf-dist/tex/context/base/font-run.mkiv index cb40adedd90..1b8843b94c5 100644 --- a/Master/texmf-dist/tex/context/base/font-run.mkiv +++ b/Master/texmf-dist/tex/context/base/font-run.mkiv @@ -12,8 +12,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D [This code is hooked into the core macros and saves some -%D format space. It needs a cleanup.] +%D [This code is hooked into the core macros and saves some format +%D space. It needs a cleanup.] \unprotect @@ -100,8 +100,8 @@ &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript &&\tttf\tx\s!x&&\tttf\tx\s!xx&&\tttf\tx\v!small&&\tttf\tx\v!big &&\tttf\tx\c!interlinespace&\cr - \noalign{\hrule} - \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}} + \noalign{\hrule}% + \processbodyfontenvironmentlist\next}} \ifinsidefloat\else\stopbaselinecorrection\fi} \unexpanded\gdef\showfont diff --git a/Master/texmf-dist/tex/context/base/font-sel.lua b/Master/texmf-dist/tex/context/base/font-sel.lua index 86300c2dbcb..c3431a213ca 100644 --- a/Master/texmf-dist/tex/context/base/font-sel.lua +++ b/Master/texmf-dist/tex/context/base/font-sel.lua @@ -20,6 +20,8 @@ local v_simplefonts = interfaces.variables.simplefonts local v_selectfont = interfaces.variables.selectfont local v_default = interfaces.variables.default +local implement = interfaces.implement + local selectfont = fonts.select or { } fonts.select = selectfont @@ -299,12 +301,12 @@ local mathsettings = { }, } -function commands.defineselectfont(settings) +function selectfont.define(settings) local index = #data + 1 data[index] = settings selectfont.searchfiles(index) selectfont.filterinput(index) - context(index) + return index end local function savefont(data,alternative,entries) @@ -493,6 +495,14 @@ function selectfont.filterinput(index) end end +local ctx_definefontsynonym = context.definefontsynonym +local ctx_resetfontfallback = context.resetfontfallback +local ctx_startfontclass = context.startfontclass +local ctx_stopfontclass = context.stopfontclass +local ctx_loadfontgoodies = context.loadfontgoodies +local ctx_definefontfallback = context.definefontfallback +local ctx_definetypeface = context.definetypeface + local function definefontsynonym(data,alternative,index,fallback) local fontdata = data.fonts and data.fonts[alternative] local style = data.metadata.style @@ -526,20 +536,24 @@ local function definefontsynonym(data,alternative,index,fallback) local designsize = entry["designsize"] or 100 if designsize == 100 or designsize == 110 or designsize == 120 or designsize == 0 or #fontdata == 1 then local filepath, filename = splitbase(entry["filename"]) + if entry["format"] == "ttc" or entry["format"] == "dfont" then + filename = formatters["%s(%s)"](filename, entry["rawname"]) + end registerdesignsizes( fontfile, "default", filename ) break end end if fallback then - context.definefontsynonym( { fontname }, { fontfile }, { features = features } ) + -- can we use + ctx_definefontsynonym( { fontname }, { fontfile }, { features = features } ) else - context.definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } ) + ctx_definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } ) end else if fallback then - context.definefontsynonym( { fontname }, { fontparent }, { features = features } ) + ctx_definefontsynonym( { fontname }, { fontparent }, { features = features } ) else - context.definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } ) + ctx_definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } ) end end end @@ -552,11 +566,11 @@ local function definetypescript(index) local typeface = data.metadata.typeface local style = data.metadata.style if entry and entry["tf"] then - context.startfontclass( { typeface } ) + ctx_startfontclass( { typeface } ) if goodies ~= "" then goodies = utilities.parsers.settings_to_array(goodies) for _, goodie in next, goodies do - context.loadfontgoodies( { goodie } ) + ctx_loadfontgoodies( { goodie } ) end end for alternative, _ in next, alternatives do @@ -564,7 +578,7 @@ local function definetypescript(index) definefontsynonym(data,alternative) end end - context.stopfontclass() + ctx_stopfontclass() else -- regular style not available, loading aborted end @@ -595,20 +609,20 @@ local function definetextfontfallback(data,alternative,index) local synonym = formatters["%s-%s-%s-fallback-%s"](typeface, style, alternative, index) local fallback = formatters["%s-%s-%s"] (typeface, style, alternative) if index == 1 then - context.resetfontfallback( { fallback } ) + ctx_resetfontfallback( { fallback } ) end - context.definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } ) + ctx_definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } ) end local function definetextfallback(entry,index) local data = data[index] local typeface = data.metadata.typeface - context.startfontclass( { typeface } ) + ctx_startfontclass( { typeface } ) for alternative, _ in next, alternatives do definefontsynonym (data,alternative,entry,true) definetextfontfallback(data,alternative,entry) end - context.stopfontclass() + ctx_stopfontclass() -- inspect(data) end @@ -624,14 +638,14 @@ local function definemathfontfallback(data,alternative,index) local fontdata = data.fonts and data.fonts[alternative] local fallback = formatters["%s-%s-%s"](typeface, style, alternative) if index == 1 then - context.resetfontfallback( { fallback } ) + ctx_resetfontfallback( { fallback } ) end if fontdata and #fontdata > 0 then for _, entry in next, fontdata do local filename = entry["filename"] local designsize = entry["designsize"] or 100 if designsize == 100 or designsize == 110 or designsize == 120 or designsize == 0 or #fontdata == 1 then - context.definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } ) + ctx_definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } ) break end end @@ -642,13 +656,13 @@ local function definemathfallback(entry,index) local data = data[index] local typeface = data.metadata.typeface local style = data.metadata.style - context.startfontclass( { typeface } ) + ctx_startfontclass( { typeface } ) for alternative, _ in next, alternatives do if synonyms[style][alternative] then definemathfontfallback(data,alternative,entry) end end - context.stopfontclass() + ctx_stopfontclass() -- inspect(data) end @@ -676,7 +690,7 @@ local function definetextfont(index) local style = styles[data.metadata.style] local designsize = data.options.opticals == v_yes and "auto" or "default" local scale = data.options.scale ~= "" and data.options.scale or 1 - context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } ) + ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } ) end local function definemathfont(index) @@ -688,9 +702,9 @@ local function definemathfont(index) local typescript = cleanname(data.metadata.family) local entries = data.fonts if entries then - context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } ) + ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } ) else - context.definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } ) + ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } ) end end @@ -708,5 +722,49 @@ function selectfont.definetypeface(index) -- inspect(data) end -commands.definefontfamily = selectfont.definetypeface -commands.definefallbackfamily = selectfont.registerfallback +local styles = { + { "tf" }, { "bf" }, { "it" }, { "sl" }, { "bi" }, { "bs" }, { "sc" }, +} + +implement { + name = "defineselectfont", + actions = { selectfont.define, context }, + arguments = { + { + { + "metadata", { + { "typeface" }, + { "style" }, + { "family" }, + } + }, + { + "options", { + { "opticals" }, + { "scale" }, + { "goodies" }, + { "alternative" }, + { "range" }, + { "offset" }, + { "check" }, + { "force" }, + } + }, + { "alternatives", styles }, + { "files", styles }, + { "features", styles }, + } + } +} + +implement { + name = "definefontfamily", + actions = selectfont.definetypeface, + arguments = "integer" +} + +implement { + name = "definefallbackfamily", + actions = selectfont.registerfallback, + arguments = { "string", "string", "integer"} +} diff --git a/Master/texmf-dist/tex/context/base/font-sel.mkvi b/Master/texmf-dist/tex/context/base/font-sel.mkvi index 0b9a4bda987..820d211eb69 100644 --- a/Master/texmf-dist/tex/context/base/font-sel.mkvi +++ b/Master/texmf-dist/tex/context/base/font-sel.mkvi @@ -1,6 +1,6 @@ %D \module %D [ file=font-sel, -%D version=2014.03.10, +%D version=2014.07.27, %D title=\CONTEXT\ User Module, %D subtitle=Selectfont, %D author=Wolfgang Schuster, @@ -27,51 +27,49 @@ \fi \setexpandedselectfontparameter\c!style {\expandnamespaceparameter\??selectfontstyle \selectfontparameter\c!style \s!rm }% \setexpandedselectfontparameter\c!alternative{\expandnamespaceparameter\??selectfontalternative\selectfontparameter\c!alternative\v!default}% - \xdef\selectfont_index{\ctxcommand{ - defineselectfont { - metadata = { - typeface = "\selectfontparameter\c!name", - style = "\selectfontparameter\c!style", - family = "\selectfontparameter\c!family", - }, - options = { - opticals = "\selectfontparameter\c!opticalsize", - scale = "\selectfontparameter\c!scale", - goodies = "\selectfontparameter\c!goodies", - alternative = "\selectfontparameter\c!alternative", - range = "\selectfontparameter\c!range", % fallback only - offset = "\selectfontparameter\c!offset", % fallback only - check = "\selectfontparameter\c!check", % fallback only - force = "\selectfontparameter\c!force", % fallback only - }, - alternatives = { - ["tf"] = "\selectfontparameter\s!tf", - ["bf"] = "\selectfontparameter\s!bf", - ["it"] = "\selectfontparameter\s!it", - ["sl"] = "\selectfontparameter\s!sl", - ["bi"] = "\selectfontparameter\s!bi", - ["bs"] = "\selectfontparameter\s!bs", - ["sc"] = "\selectfontparameter\s!sc", - }, - files = { - ["tf"] = "\selectfontparameter\c!regularfont", - ["bf"] = "\selectfontparameter\c!boldfont", - ["it"] = "\selectfontparameter\c!italicfont", - ["sl"] = "\selectfontparameter\c!slantedfont", - ["bi"] = "\selectfontparameter\c!bolditalicfont", - ["bs"] = "\selectfontparameter\c!boldslantedfont", - ["sc"] = "\selectfontparameter\c!smallcapsfont", - }, - features = { - ["tf"] = "\selectfontparameter\c!regularfeatures", - ["bf"] = "\selectfontparameter\c!boldfeatures", - ["it"] = "\selectfontparameter\c!italicfeatures", - ["sl"] = "\selectfontparameter\c!slantedfeatures", - ["bi"] = "\selectfontparameter\c!bolditalicfeatures", - ["bs"] = "\selectfontparameter\c!boldslantedfeatures", - ["sc"] = "\selectfontparameter\c!smallcapsfeatures", - } - }}}% + \xdef\selectfont_index{\clf_defineselectfont + metadata {% + typeface {\selectfontparameter\c!name}% + style {\selectfontparameter\c!style}% + family {\selectfontparameter\c!family}% + } + options {% + opticals {\selectfontparameter\c!opticalsize}% + scale {\selectfontparameter\c!scale}% + goodies {\selectfontparameter\c!goodies}% + alternative {\selectfontparameter\c!alternative}% + range {\selectfontparameter\c!range}% fallback only + offset {\selectfontparameter\c!offset}% fallback only + check {\selectfontparameter\c!check}% fallback only + force {\selectfontparameter\c!force}% fallback only + } + alternatives {% + tf {\selectfontparameter\s!tf}% + bf {\selectfontparameter\s!bf}% + it {\selectfontparameter\s!it}% + sl {\selectfontparameter\s!sl}% + bi {\selectfontparameter\s!bi}% + bs {\selectfontparameter\s!bs}% + sc {\selectfontparameter\s!sc}% + } + files {% + tf {\selectfontparameter\c!regularfont}% + bf {\selectfontparameter\c!boldfont}% + it {\selectfontparameter\c!italicfont}% + sl {\selectfontparameter\c!slantedfont}% + bi {\selectfontparameter\c!bolditalicfont}% + bs {\selectfontparameter\c!boldslantedfont}% + sc {\selectfontparameter\c!smallcapsfont}% + } + features {% + tf {\selectfontparameter\c!regularfeatures}% + bf {\selectfontparameter\c!boldfeatures}% + it {\selectfontparameter\c!italicfeatures}% + sl {\selectfontparameter\c!slantedfeatures}% + bi {\selectfontparameter\c!bolditalicfeatures}% + bs {\selectfontparameter\c!boldslantedfeatures}% + sc {\selectfontparameter\c!smallcapsfeatures}% + }}% \endgroup} %D \macros @@ -104,7 +102,7 @@ {\dodoubleargument\selectfont_preset_define} \def\selectfont_preset_define[#name][#settings]% - {\doifassignmentelse{#settings} + {\doifelseassignment{#settings} {\setvalue{\??selectfontpreset#name}{\setupcurrentselectfont[#settings]}} {\setvalue{\??selectfontpreset#name}{\csname\??selectfontpreset#settings\endcsname}}} @@ -115,18 +113,74 @@ % unknown preset \fi} -%definefontfamilypreset [range:chinese] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,bopomofo,bopomofoextended}] -%definefontfamilypreset [range:japanese] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,hiragana,katakana}] -%definefontfamilypreset [range:korean] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,hangulcompatibilityjamo,hanguljamo,hanguljamoextendeda,hanguljamoextendedb,hangulsyllables}] -%definefontfamilypreset [range:cyrillic] [\c!range={cyrillic,cyrillicextendeda,cyrillicextendedb,cyrillicsupplement}] -%definefontfamilypreset [range:greek] [\c!range={greekandcoptic,greekextended,ancientgreeknumbers}] - -\definefontfamilypreset [range:chinese] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x03100-0x0312F,0x031A0-0x031BF}] -\definefontfamilypreset [range:japanese] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x03040-0x0309F,0x030A0-0x030FF}] -\definefontfamilypreset [range:korean] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x01100-0x011FF,0x03130-0x0318F,0x0A960-0x0D7FF}] -\definefontfamilypreset [range:cyrillic] [\c!range={0x00400-0x0052F,0x02DE0-0x02DFF,0x0A640-0x0A69F}] -\definefontfamilypreset [range:greek] [\c!range={0x00370-0x003FF,0x01F00-0x01FFF,0x10140-0x1018F}] -\definefontfamilypreset [range:hebrew] [\c!range={0x00590-0x005FF,0x0FB00-0x0FB4F}] +\definefontfamilypreset + [range:chinese] + [\c!range={cjkcompatibilityforms, + cjkcompatibilityideographs, + cjkcompatibilityideographssupplement, + cjkradicalssupplement, + cjkstrokes, + cjksymbolsandpunctuation, + cjkunifiedideographs, + cjkunifiedideographsextensiona, + cjkunifiedideographsextensionb, + halfwidthandfullwidthforms, + verticalforms, + bopomofo, + bopomofoextended}] + +\definefontfamilypreset + [range:japanese] + [\crange={cjkcompatibilityforms, + cjkcompatibilityideographs, + cjkcompatibilityideographssupplement, + cjkradicalssupplement, + cjkstrokes, + cjksymbolsandpunctuation, + cjkunifiedideographs, + cjkunifiedideographsextensiona, + cjkunifiedideographsextensionb, + halfwidthandfullwidthforms, + verticalforms, + hiragana, + katakana}] + +\definefontfamilypreset + [range:korean] + [\c!range={cjkcompatibilityforms, + cjkcompatibilityideographs, + cjkcompatibilityideographssupplement, + cjkradicalssupplement, + cjkstrokes, + cjksymbolsandpunctuation, + cjkunifiedideographs, + cjkunifiedideographsextensiona, + cjkunifiedideographsextensionb, + halfwidthandfullwidthforms, + verticalforms, + hangulcompatibilityjamo, + hanguljamo, + hanguljamoextendeda, + hanguljamoextendedb, + hangulsyllables}] + +\definefontfamilypreset + [range:cyrillic] + [\c!range={cyrillic, + cyrillicextendeda, + cyrillicextendedb, + cyrillicsupplement}] + +\definefontfamilypreset + [range:greek] + [\c!range={greekandcoptic, + greekextended, + ancientgreeknumbers}] + +\definefontfamilypreset + [range:hebrew] + [\c!range={hebrew, + alphabeticpresentationforms}] \definefontfamilypreset [math:digitsnormal] [\c!range=digitsnormal] \definefontfamilypreset [math:digitsbold] [\c!range=digitsnormal,\c!offset=digitsbold,\s!tf=style:bold] @@ -226,7 +280,7 @@ %D \stoptyping %D %D When a document contains different languages and the global font lacks some characters -%D for one language, one could set a different font where these characters are taken from. +%D for one language, one could set a different font where these charcters are taken from. %D This fallback font (there can be more than one for a certain style) could be set with %D the \tex{definefallbackfamily} command which takes the same argument as %D the \tex{definefontfamily} command. @@ -271,20 +325,20 @@ {\doquadrupleempty\selectfont_family_define} \def\selectfont_family_define[#typeface][#style][#family][#settings]% - {\doifassignmentelse{#settings} + {\doifelseassignment{#settings} {\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]} {\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}% - \ctxcommand{definefontfamily(\selectfont_index)}} + \clf_definefontfamily\selectfont_index\relax} \unexpanded\def\definefallbackfamily {\doquadrupleempty\selectfont_fallback_define} \def\selectfont_fallback_define[#typeface][#style][#family][#settings]% - {\doifassignmentelse{#settings} + {\doifelseassignment{#settings} {\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]} {\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}% \edef\p_selectfont_style{\expandnamespacevalue\??selectfontstyle{#style}\s!rm}% - \ctxcommand{definefallbackfamily("#typeface","\p_selectfont_style",\selectfont_index)}} + \clf_definefallbackfamily{#typeface}{\p_selectfont_style}\selectfont_index\relax} %D \macros %D {setupfontfamily,setupfallbackfamily} @@ -332,7 +386,8 @@ \unexpanded\def\selectfont_set_default {\selectfont_set_font_family[\v!serif][Latin Modern Roman][\c!opticalsize=\v!yes]% \selectfont_set_font_family[\v!sans] [Latin Modern Sans] [\c!opticalsize=\v!yes]% - \selectfont_set_font_family[\v!mono] [Latin Modern Mono] [\c!opticalsize=\v!yes,\c!features=\s!none]} + \selectfont_set_font_family[\v!mono] [Latin Modern Mono] [\c!opticalsize=\v!yes,\c!features=\s!none]% + \selectfont_set_font_family[\v!math] [Latin Modern Math] [\c!opticalsize=\v!yes]} \unexpanded\def\setupfallbackfamily {\dotripleempty\selectfont_fallback_setup} diff --git a/Master/texmf-dist/tex/context/base/font-set.mkvi b/Master/texmf-dist/tex/context/base/font-set.mkvi index f94d6c86e0c..b29545ace3f 100644 --- a/Master/texmf-dist/tex/context/base/font-set.mkvi +++ b/Master/texmf-dist/tex/context/base/font-set.mkvi @@ -41,13 +41,15 @@ \let\m_font_fallback_name\empty -\def\font_preloads_reset_nullfont % this is needed because some macro packages (tikz) misuse \nullfont - {\dorecurse\plusseven{\fontdimen\recurselevel\nullfont\zeropoint}% keep en eye on this as: - \ctxcommand{resetnullfont()}% in luatex 0.70 this will also do the previous - \globallet\font_preloads_reset_nullfont\relax} +% keep as reference: +% +% \def\font_preloads_reset_nullfont % this is needed because some macro packages (tikz) misuse \nullfont +% {\dorecurse\plusseven{\fontdimen\recurselevel\nullfont\zeropoint}% keep en eye on this as: +% \clf_resetnullfont % in luatex 0.70 this will also do the previous +% \globallet\font_preloads_reset_nullfont\relax} \def\font_preload_check_mode - {\doifmodeelse{lmmath} + {\doifelsemode{lmmath} {\def\m_font_fallback_name{modern-designsize-virtual}}% this will stay {\def\m_font_fallback_name{modern-designsize}}% % this might become 'modern' \glet\font_preload_check_mode\relax} @@ -81,7 +83,8 @@ \glet\fourthstagepreloadfonts \relax \global\everyhbox\emptytoks \global\everyvbox\emptytoks - \font_preloads_reset_nullfont} + % old: \font_preloads_reset_nullfont, new: + \clf_resetnullfont} \appendtoks \font_preloads_reset @@ -90,7 +93,9 @@ \def\font_preloads_reset_checked {\glet\font_preload_default_fonts_tt\relax \glet\font_preload_default_fonts_mm\relax - \glet\font_preloads_third_stage \relax} + \glet\font_preloads_third_stage \relax +% \glet\font_preloads_fourth_stage \relax + } \def\font_preloads_zero_stage_indeed {\definedfont[\s!file:lmmono10-regular sa 1]} @@ -101,7 +106,7 @@ \font_preloads_zero_stage} \unexpanded\def\font_preloads_first_stage % % *nofonts -> *preloadfonts - {\doifmodeelse{*preloadfonts} + {\doifelsemode{*preloadfonts} {\font_preload_default_fonts \writestatus\m!fonts{preloading latin modern fonts (first stage)}} {\writestatus\m!fonts{latin modern fonts are not preloaded}}} @@ -132,7 +137,7 @@ \unexpanded\def\font_preloads_fourth_stage {\begingroup %ifzeropt\fontcharwd\font\number`!\relax - \setbox\scratchbox\hbox{checking fonts}% + \setbox\scratchbox\hbox{c o n t e x t}% \ifzeropt\wd\scratchbox \writeline \writestatus\m!fonts{!! No bodyfont has been defined and no defaults have been}% diff --git a/Master/texmf-dist/tex/context/base/font-sol.lua b/Master/texmf-dist/tex/context/base/font-sol.lua index a41e4a67946..bbb2997f42b 100644 --- a/Master/texmf-dist/tex/context/base/font-sol.lua +++ b/Master/texmf-dist/tex/context/base/font-sol.lua @@ -45,6 +45,8 @@ local v_preroll = variables.preroll local v_random = variables.random local v_split = variables.split +local implement = interfaces.implement + local settings_to_array = utilities.parsers.settings_to_array local settings_to_hash = utilities.parsers.settings_to_hash @@ -907,8 +909,52 @@ end -- interface -commands.definefontsolution = splitters.define -commands.startfontsolution = splitters.start -commands.stopfontsolution = splitters.stop -commands.setfontsolution = splitters.set -commands.resetfontsolution = splitters.reset +implement { + name = "definefontsolution", + actions = splitters.define, + arguments = { + "string", + { + { "goodies" }, + { "solution" }, + { "less" }, + { "more" }, + } + } +} + +implement { + name = "startfontsolution", + actions = splitters.start, + arguments = { + "string", + { + { "method" }, + { "criterium" }, + { "randomseed" }, + } + } +} + +implement { + name = "stopfontsolution", + actions = splitters.stop +} + +implement { + name = "setfontsolution", + actions = splitters.set, + arguments = { + "string", + { + { "method" }, + { "criterium" }, + { "randomseed" }, + } + } +} + +implement { + name = "resetfontsolution", + actions = splitters.reset +} diff --git a/Master/texmf-dist/tex/context/base/font-sol.mkvi b/Master/texmf-dist/tex/context/base/font-sol.mkvi index b40e37ceddf..d065b78ea55 100644 --- a/Master/texmf-dist/tex/context/base/font-sol.mkvi +++ b/Master/texmf-dist/tex/context/base/font-sol.mkvi @@ -85,24 +85,30 @@ \let\setupfontsolutions\setupfontsolution \appendtoks - \ctxcommand{definefontsolution("\currentfontsolution",{ % these are frozen - goodies = "\fontsolutionparameter\s!goodies", - solution = "\fontsolutionparameter\c!solution", - less = "\fontsolutionparameter\c!less", - more = "\fontsolutionparameter\c!more", - })} + \clf_definefontsolution + {\currentfontsolution}% + {% these are frozen + goodies {\fontsolutionparameter\s!goodies}% + solution {\fontsolutionparameter\c!solution}% + less {\fontsolutionparameter\c!less}% + more {\fontsolutionparameter\c!more}% + }% + \relax \to \everydefinefontsolution \unexpanded\def\setfontsolution[#solution]% just one {\edef\currentfontsolution{#solution}% - \ctxcommand{setfontsolution("\currentfontsolution",{ - method = "\fontsolutionparameter\c!method", - criterium = "\fontsolutionparameter\c!criterium", - % randomseed = "\fontsolutionparameter\c!random", - })}} + \clf_setfontsolution + {\currentfontsolution}% + {% + method {\fontsolutionparameter\c!method}% + criterium {\fontsolutionparameter\c!criterium}% + % randomseed {\fontsolutionparameter\c!random}% + }% + \relax} \unexpanded\def\resetfontsolution % resets all - {\ctxcommand{resetfontsolution()}% + {\clf_resetfontsolution \let\currentfontsolution\empty} \unexpanded\def\startfontsolution % [#1] @@ -111,7 +117,7 @@ \unexpanded\def\stopfontsolution {\ifhmode\par\fi - \ctxcommand{stopfontsolution()}% + \clf_stopfontsolution \popmacro\currentfontsolution} % We initialize this module at the \LUA\ end. diff --git a/Master/texmf-dist/tex/context/base/font-sty.mkvi b/Master/texmf-dist/tex/context/base/font-sty.mkvi index 03fa598c2f2..673cf25aecd 100644 --- a/Master/texmf-dist/tex/context/base/font-sty.mkvi +++ b/Master/texmf-dist/tex/context/base/font-sty.mkvi @@ -279,7 +279,7 @@ {\groupedcommand{\font_styles_use_defined{#name}}{}} % or {\font_styles_apply_grouped{#name}} \setvalue{\??styleargument3}#specification% - {\doifassignmentelse{#specification}\font_styles_assignment\font_styles_direct{#specification}} + {\doifelseassignment{#specification}\font_styles_assignment\font_styles_direct{#specification}} \def\font_styles_assignment#specification{\groupedcommand{\font_styles_use_generic{#specification}}{}} \def\font_styles_direct #specification{\groupedcommand{\definedfont[#specification]}{}} @@ -311,7 +311,7 @@ {\font_styles_use_defined{#name}} \setvalue{\??styleenvironment3}#specification% - {\doifassignmentelse{#specification}\font_styles_start_assignment\font_styles_start_direct{#specification}} + {\doifelseassignment{#specification}\font_styles_start_assignment\font_styles_start_direct{#specification}} \def\font_styles_start_assignment#specification{\font_styles_use_generic{#specification}} \def\font_styles_start_direct #specification{\definedfont[#specification]\relax} diff --git a/Master/texmf-dist/tex/context/base/font-sym.mkvi b/Master/texmf-dist/tex/context/base/font-sym.mkvi index c8ca49f7470..a21bea0ba62 100644 --- a/Master/texmf-dist/tex/context/base/font-sym.mkvi +++ b/Master/texmf-dist/tex/context/base/font-sym.mkvi @@ -110,12 +110,14 @@ %D The next macro can be used to make decisions based on the shape: -\def\doifitalicelse#yes#nop% +\def\doifelseitalic#yes#nop% {\ifx\fontalternative\s!sl#yes\else \ifx\fontalternative\s!it#yes\else \ifx\fontalternative\s!bs#yes\else \ifx\fontalternative\s!bi#yes\else#nop\fi\fi\fi\fi} +\let\doifitalicelse\doifelseitalic + %D For an example of usage of the following command, %D see \type {cont-log.tex}. %D @@ -167,15 +169,15 @@ \currentsymbolfont \global\expandafter\let\csname\??symbolfont\askedsymbolfont\endcsname\lastrawfontcall} -\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}} -\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}} -\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}} -\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}} +\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_fontchar{#character}}} +\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_fontchar{#character}}} +\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}} +\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}} % this one is wrong: \unexpanded\def\getscaledglyph#scale#name#content% - {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifnumberelse{#content}\char\donothing#content}} + {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifelsenumber{#content}\char\donothing#content}} \let\getglyph \getglyphstyled % old \let\getrawglyph \getglyphdirect % old @@ -234,7 +236,7 @@ %D \macros{doiffontcharelse} -\unexpanded\def\doiffontcharelse#specification#unicode% this could be a direct lua call +\unexpanded\def\doifelsefontchar#specification#unicode% this could be a direct lua call {\begingroup \font_basics_define_font_without_parameters{thedefinedfont}{#specification}% \iffontchar\font#unicode\relax @@ -243,4 +245,6 @@ \endgroup\expandafter\secondoftwoarguments \fi} +\let\doiffontcharelse\doifelsefontchar + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/font-syn.lua b/Master/texmf-dist/tex/context/base/font-syn.lua index 18ed46a2f88..bf46c85730f 100644 --- a/Master/texmf-dist/tex/context/base/font-syn.lua +++ b/Master/texmf-dist/tex/context/base/font-syn.lua @@ -33,7 +33,14 @@ local exists = io.exists local findfile = resolvers.findfile local cleanpath = resolvers.cleanpath -local resolveresolved = resolvers.resolve +local resolveprefix = resolvers.resolve + +local fontloader = fontloader +local font_to_table = fontloader.to_table +local open_font = fontloader.open +local get_font_info = fontloader.info +local close_font = fontloader.close +local font_fields = fontloader.fields local settings_to_hash = utilities.parsers.settings_to_hash_tolerant @@ -50,7 +57,7 @@ using a table that has keys filtered from the font related files.

fonts = fonts or { } -- also used elsewhere -local names = font.names or allocate { } +local names = fonts.names or allocate { } fonts.names = names local filters = names.filters or { } @@ -298,10 +305,10 @@ end but to keep the overview, we define them here.

--ldx]]-- -filters.otf = fontloader.info -filters.ttf = fontloader.info -filters.ttc = fontloader.info -filters.dfont = fontloader.info +filters.otf = get_font_info +filters.ttf = get_font_info +filters.ttc = get_font_info +filters.dfont = get_font_info -- We had this as temporary solution because we needed a bit more info but in the -- meantime it got an interesting side effect: currently luatex delays loading of e.g. @@ -311,12 +318,12 @@ filters.dfont = fontloader.info -- missing: names, units_per_em, design_range_bottom, design_range_top, design_size, -- pfminfo, top_side_bearing --- function fontloader.fullinfo(...) -- check with taco what we get / could get --- local ff = fontloader.open(...) +-- local function get_full_info(...) -- check with taco what we get / could get +-- local ff = open_font(...) -- if ff then --- local d = ff -- and fontloader.to_table(ff) +-- local d = ff -- and font_to_table(ff) -- d.glyphs, d.subfonts, d.gpos, d.gsub, d.lookups = nil, nil, nil, nil, nil --- fontloader.close(ff) +-- close_font(ff) -- return d -- else -- return nil, "error in loading font" @@ -327,10 +334,10 @@ filters.dfont = fontloader.info -- return these keys/values (and maybe some more) but at least we close the loader which -- might save some memory in the end. --- function fontloader.fullinfo(name) --- local ff = fontloader.open(name) +-- local function get_full_info(name) +-- local ff = open_font(name) -- if ff then --- local fields = table.tohash(fontloader.fields(ff),true) +-- local fields = table.tohash(font_fields(ff),true) -- isn't that one stable -- local d = { -- names = fields.names and ff.names, -- familyname = fields.familyname and ff.familyname, @@ -349,36 +356,68 @@ filters.dfont = fontloader.info -- setmetatableindex(d,function(t,k) -- report_names("warning, trying to access field %a in font table of %a",k,name) -- end) --- fontloader.close(ff) +-- close_font(ff) -- return d -- else -- return nil, "error in loading font" -- end -- end --- As we have lazy loading anyway, this one still is full and with less code than --- the previous one. But this depends on the garbage collector to kick in. +-- more efficient: + +local fields = nil -function fontloader.fullinfo(...) - local ff = fontloader.open(...) +local function get_full_info(name) + local ff = open_font(name) if ff then - local d = { } -- ff is userdata so [1] or # fails on it - setmetatableindex(d,ff) + if not fields then + fields = table.tohash(font_fields(ff),true) + end + -- unfortunately luatex aborts when a field is not available + local d = { + names = fields.names and ff.names, + familyname = fields.familyname and ff.familyname, + fullname = fields.fullname and ff.fullname, + fontname = fields.fontname and ff.fontname, + weight = fields.weight and ff.weight, + italicangle = fields.italicangle and ff.italicangle, + units_per_em = fields.units_per_em and ff.units_per_em, + design_range_bottom = fields.design_range_bottom and ff.design_range_bottom, + design_range_top = fields.design_range_top and ff.design_range_top, + design_size = fields.design_size and ff.design_size, + italicangle = fields.italicangle and ff.italicangle, + pfminfo = fields.pfminfo and ff.pfminfo, + top_side_bearing = fields.top_side_bearing and ff.top_side_bearing, -- not there + } + setmetatableindex(d,function(t,k) + report_names("warning, trying to access field %a in font table of %a",k,name) + end) + close_font(ff) return d else return nil, "error in loading font" end end --- We don't get the design_* values here as for that the fontloader has to load feature --- info and therefore we're not much better off than using 'open'. --- --- if tonumber(status.luatex_version) > 78 or (tonumber(status.luatex_version) == 78 and tonumber(status.luatex_revision) > 0) then --- fontloader.fullinfo = fontloader.info +-- As we have lazy loading anyway, this one still is full and with less code than +-- the previous one. But this depends on the garbage collector to kick in and in the +-- current version that somehow happens not that often (on my machine I end up with +-- soem 3 GB extra before that happens). + +-- local function get_full_info(...) +-- local ff = open_font(...) +-- if ff then +-- local d = { } -- ff is userdata so [1] or # fails on it +-- setmetatableindex(d,ff) +-- return d -- garbage collection will do the close_font(ff) +-- else +-- return nil, "error in loading font" +-- end -- end -filters.otf = fontloader.fullinfo -filters.ttf = fontloader.fullinfo +fontloader.fullinfo = get_full_info +filters .otf = get_full_info +filters .ttf = get_full_info function filters.afm(name) -- we could parse the afm file as well, and then report an error but @@ -408,7 +447,7 @@ function filters.afm(name) end function filters.pfb(name) - return fontloader.info(name) + return get_font_info(name) end --[[ldx-- @@ -1065,15 +1104,15 @@ local function analyzefiles(olddata) resolvers.dowithfilesintree(".*%." .. suffix .. "$", function(method,root,path,name) if method == "file" or method == "tree" then local completename = root .."/" .. path .. "/" .. name - completename = resolveresolved(completename) -- no shortcut + completename = resolveprefix(completename) -- no shortcut identify(completename,name,suffix,name) return true end end, function(blobtype,blobpath,pattern) - blobpath = resolveresolved(blobpath) -- no shortcut + blobpath = resolveprefix(blobpath) -- no shortcut report_names("scanning path %a for %s files",blobpath,suffix) end, function(blobtype,blobpath,pattern,total,checked,done) - blobpath = resolveresolved(blobpath) -- no shortcut + blobpath = resolveprefix(blobpath) -- no shortcut report_names("%s entries found, %s %s files checked, %s okay",total,checked,suffix,done) end) end diff --git a/Master/texmf-dist/tex/context/base/font-tfm.lua b/Master/texmf-dist/tex/context/base/font-tfm.lua index 827d7058696..ab03788516a 100644 --- a/Master/texmf-dist/tex/context/base/font-tfm.lua +++ b/Master/texmf-dist/tex/context/base/font-tfm.lua @@ -70,16 +70,17 @@ local function read_from_tfm(specification) properties.fontname = tfmdata.fontname properties.psname = tfmdata.psname properties.filename = specification.filename + properties.format = fonts.formats.tfm -- better than nothing parameters.size = size - shared.rawdata = { } - shared.features = features - shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil -- tfmdata.properties = properties tfmdata.resources = resources tfmdata.parameters = parameters tfmdata.shared = shared -- + shared.rawdata = { } + shared.features = features + shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil parameters.slant = parameters.slant or parameters[1] or 0 parameters.space = parameters.space or parameters[2] or 0 parameters.space_stretch = parameters.space_stretch or parameters[3] or 0 @@ -114,6 +115,11 @@ local function read_from_tfm(specification) features.encoding = encoding end end + -- let's play safe: + properties.haskerns = true + properties.haslogatures = true + resources.unicodes = { } + resources.lookuptags = { } -- return tfmdata end diff --git a/Master/texmf-dist/tex/context/base/font-tra.mkiv b/Master/texmf-dist/tex/context/base/font-tra.mkiv index 45d8a728059..b0c3ae55b5a 100644 --- a/Master/texmf-dist/tex/context/base/font-tra.mkiv +++ b/Master/texmf-dist/tex/context/base/font-tra.mkiv @@ -95,7 +95,9 @@ %D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO} %D \stoptyping -\unexpanded\def\doiffontpresentelse#1{\ctxcommand{doifelse(fonts.names.exists("#1"))}} +\unexpanded\def\doifelsefontpresent#1{\clf_doifelsefontpresent{#1}} + +\let\doiffontpresentelse\doifelsefontpresent % experimental, maybe this becomes a module @@ -114,11 +116,14 @@ {\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}% \unhbox\otfcollector} -\unexpanded\def\otfstepcharcommand#1#2#3% font char class +\unexpanded\def\otfstepspace {\removeunwantedspaces - \hskip.5\emwidth \s!plus .125\emwidth\relax - \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% - \hskip.5\emwidth \s!plus .125\emwidth\relax} + \hskip.5\emwidth \s!plus .125\emwidth \s!minus .125\emwidth\relax} + +\unexpanded\def\otfstepcharcommand#1#2#3% font char class + {\otfstepspace + \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% + \otfstepspace} \unexpanded\def\otfstepfontcommand#1#2#3% id font size {\begingroup @@ -142,7 +147,7 @@ {\ctxlua{nodes.tracers.steppers.font("otfstepfontcommand")}} \unexpanded\def\showotfstepchars#1% - {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand")}} + {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand","otfstepspace")}} \unexpanded\def\showotfstepmessages#1% {\ctxlua{nodes.tracers.steppers.messages(#1,"otfstepmessagecommand",true)}} diff --git a/Master/texmf-dist/tex/context/base/font-uni.mkiv b/Master/texmf-dist/tex/context/base/font-uni.mkiv index 223d27606b7..91a488ff205 100644 --- a/Master/texmf-dist/tex/context/base/font-uni.mkiv +++ b/Master/texmf-dist/tex/context/base/font-uni.mkiv @@ -13,14 +13,14 @@ \writestatus{loading}{ConTeXt Font Macros / Unicode} -%D In \MKIV\ we only provide the \type {\uchar} macro and -%D implement it as just an \UTF\ converter. We expand it so -%D best not use not use it for active characters. +%D In \MKIV\ we only provide the \type {\uchar} macro and implement it as just +%D an \UTF\ converter. We expand it so best not use not use it for active +%D characters. In practice this command is probably never used anyway but we keep +%D if for old styles. \unprotect -%def\uchar#1#2{\ctxcommand{uchar(,)}} -\def\uchar#1#2{\cldcontext{utf.char(\number\numexpr#1*256+#2\relax)}} +\def\uchar#1#2{\clf_uchar\numexpr#1\relax\numexpr#2\relax} \let\uc\uchar diff --git a/Master/texmf-dist/tex/context/base/grph-epd.lua b/Master/texmf-dist/tex/context/base/grph-epd.lua index 4f9d4609765..17f04d593da 100644 --- a/Master/texmf-dist/tex/context/base/grph-epd.lua +++ b/Master/texmf-dist/tex/context/base/grph-epd.lua @@ -22,4 +22,13 @@ function figures.mergegoodies(optionlist) if all or options[variables.layer] then codeinjections.mergeviewerlayers() end + if all or options[variables.bookmark] then + codeinjections.mergebookmarks() + end end + +interfaces.implement { + name = "figure_mergegoodies", + actions = figures.mergegoodies, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/grph-epd.mkiv b/Master/texmf-dist/tex/context/base/grph-epd.mkiv index 58526fd44dd..2df195589b4 100644 --- a/Master/texmf-dist/tex/context/base/grph-epd.mkiv +++ b/Master/texmf-dist/tex/context/base/grph-epd.mkiv @@ -17,12 +17,12 @@ \registerctxluafile{grph-epd}{1.001} -\def\figurereference{\ctxcommand{figurestatus("reference")}} % might become private +\def\figurereference{\clf_figurestatus{reference}{}} % might become private \defineoverlay[system:graphics:epdf][\directsetup{system:graphics:epdf}] \startsetups system:graphics:epdf - \ctxlua{figures.mergegoodies("\externalfigureparameter\c!interaction")}% + \clf_figure_mergegoodies{\externalfigureparameter\c!interaction}% \reference[\figurereference]{}% todo: dest area \stopsetups @@ -32,7 +32,7 @@ \c!offset=\v!overlay, \c!background={\v!foreground,system:graphics:epdf}] -\def\grph_epdf_add_overlay +\unexpanded\def\grph_epdf_add_overlay {\global\setbox\foundexternalfigure\vbox\bgroup \system_graphics_epdf{\box\foundexternalfigure}% \egroup} diff --git a/Master/texmf-dist/tex/context/base/grph-fig.mkiv b/Master/texmf-dist/tex/context/base/grph-fig.mkiv index 9b9333fa9a1..f5152874d0d 100644 --- a/Master/texmf-dist/tex/context/base/grph-fig.mkiv +++ b/Master/texmf-dist/tex/context/base/grph-fig.mkiv @@ -45,7 +45,7 @@ {\ifsecondargument \grph_buffers_typeset_indeed[#1][#2]% \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\grph_buffers_typeset_indeed[\jobname][#1]}% {\grph_buffers_typeset_indeed[#1][]}% \else @@ -53,7 +53,7 @@ \fi\fi} \def\grph_buffers_typeset_indeed[#1][#2]% we could use the via files - {\doifnot{#1}{*}{\xdef\lasttypesetbuffer{\ctxcommand{runbuffer("#1",true)}}}% + {\doifnot{#1}{*}{\xdef\lasttypesetbuffer{\clf_runbuffer{#1}}}% \ifcase\c_grph_buffers_mode % typesetonly \or @@ -94,7 +94,7 @@ \def\grph_typesetting_process_indeed#1#2#3#4% options settings-a filename settings-b {\begingroup - \edef\m_typesetting_name{\cldcontext{job.files.context("#3","#1")}}% + \edef\m_typesetting_name{\clf_runcontextjob{#3}{#1}}% \ifx\m_typesetting_name\empty \else \expanded{\externalfigure[\m_typesetting_name]}[#2,#4]% \fi diff --git a/Master/texmf-dist/tex/context/base/grph-fil.lua b/Master/texmf-dist/tex/context/base/grph-fil.lua index 3449f1779c2..c1532ce25e3 100644 --- a/Master/texmf-dist/tex/context/base/grph-fil.lua +++ b/Master/texmf-dist/tex/context/base/grph-fil.lua @@ -69,3 +69,9 @@ function jobfiles.context(name,options) return file.replacesuffix(name,"pdf") end end + +interfaces.implement { + name = "runcontextjob", + arguments = { "string", "string" }, + actions = { jobfiles.context, context } +} diff --git a/Master/texmf-dist/tex/context/base/grph-inc.lua b/Master/texmf-dist/tex/context/base/grph-inc.lua index d89c52996c7..8a064c8e9c8 100644 --- a/Master/texmf-dist/tex/context/base/grph-inc.lua +++ b/Master/texmf-dist/tex/context/base/grph-inc.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['grph-inc'] = { license = "see context related readme files" } +-- todo: files are sometimes located twice -- todo: empty filename or only suffix always false (not found) -- lowercase types -- mps tex tmp svg @@ -37,6 +38,8 @@ The TeX-Lua mix is suboptimal. This has to do with the fact that we cannot run TeX code from within Lua. Some more functionality will move to Lua. ]]-- +-- todo: store loaded pages per pdf file someplace + local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch local contains = table.contains local concat, insert, remove = table.concat, table.insert, table.remove @@ -46,7 +49,7 @@ local formatters = string.formatters local longtostring = string.longtostring local expandfilename = dir.expandname -local P, lpegmatch = lpeg.P, lpeg.match +local P, R, S, Cc, C, Cs, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cc, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.match local settings_to_array = utilities.parsers.settings_to_array local settings_to_hash = utilities.parsers.settings_to_hash @@ -56,24 +59,37 @@ local replacetemplate = utilities.templates.replace local images = img +local hasscheme = url.hasscheme +local urlhashed = url.hashed + +local resolveprefix = resolvers.resolve + local texgetbox = tex.getbox local texsetbox = tex.setbox local hpack = node.hpack +local new_latelua = nodes.pool.latelua + local context = context +local implement = interfaces.implement local variables = interfaces.variables + local codeinjections = backends.codeinjections local nodeinjections = backends.nodeinjections -local trace_figures = false trackers.register("graphics.locating", function(v) trace_figures = v end) -local trace_bases = false trackers.register("graphics.bases", function(v) trace_bases = v end) -local trace_programs = false trackers.register("graphics.programs", function(v) trace_programs = v end) -local trace_conversion = false trackers.register("graphics.conversion", function(v) trace_conversion = v end) -local trace_inclusion = false trackers.register("graphics.inclusion", function(v) trace_inclusion = v end) +local trace_figures = false trackers.register ("graphics.locating", function(v) trace_figures = v end) +local trace_bases = false trackers.register ("graphics.bases", function(v) trace_bases = v end) +local trace_programs = false trackers.register ("graphics.programs", function(v) trace_programs = v end) +local trace_conversion = false trackers.register ("graphics.conversion", function(v) trace_conversion = v end) +local trace_inclusion = false trackers.register ("graphics.inclusion", function(v) trace_inclusion = v end) + +local extra_check = false directives.register("graphics.extracheck", function(v) extra_check = v end) local report_inclusion = logs.reporter("graphics","inclusion") +local report_figures = logs.reporter("system","graphics") +local report_figure = logs.reporter("used graphic") local f_hash_part = formatters["%s->%s->%s"] local f_hash_full = formatters["%s->%s->%s->%s->%s->%s->%s"] @@ -85,23 +101,41 @@ local v_high = variables.high local v_global = variables["global"] local v_local = variables["local"] local v_default = variables.default +local v_auto = variables.auto local maxdimen = 2^30-1 function images.check(figure) if figure then - local width = figure.width + local width = figure.width local height = figure.height + if width <= 0 or height <= 0 then + report_inclusion("image %a has bad dimensions (%p,%p), discarding", + figure.filename,width,height) + return false, "bad dimensions" + end + local xres = figure.xres + local yres = figure.yres + local changes = false if height > width then if height > maxdimen then figure.height = maxdimen figure.width = width * maxdimen/height - report_inclusion("limiting natural dimensions of %a (%s)",figure.filename,"height") + changed = true end elseif width > maxdimen then figure.width = maxdimen figure.height = height * maxdimen/width - report_inclusion("limiting natural dimensions of %a (%s)",figure.filename,"width") + changed = true + end + if changed then + report_inclusion("limiting natural dimensions of %a, old %p * %p, new %p * %p", + figure.filename,width,height,figure.width,figure.height) + end + if width >=maxdimen or height >= maxdimen then + report_inclusion("image %a is too large (%p,%p), discarding", + figure.filename,width,height) + return false, "dimensions too large" end return figure end @@ -160,6 +194,7 @@ end figures = figures or { } local figures = figures +figures.images = images figures.boxnumber = figures.boxnumber or 0 figures.defaultsearch = true figures.defaultwidth = 0 @@ -228,10 +263,74 @@ local figures_magics = allocate { { format = "pdf", pattern = (1 - P("%PDF"))^0 * P("%PDF") }, } +local figures_native = allocate { + pdf = true, + jpg = true, + jp2 = true, + png = true, +} + figures.formats = figures_formats -- frozen figures.magics = figures_magics -- frozen figures.order = figures_order -- frozen +-- name checker + +local okay = P("m_k_i_v_") + +local pattern = (R("az","AZ") * P(":"))^-1 * ( -- a-z : | A-Z : + (okay + R("az","09") + S("_/") - P("_")^2)^1 * (P(".") * R("az")^1)^0 * P(-1) + -- a-z | single _ | / + (okay + R("az","09") + S("-/") - P("-")^2)^1 * (P(".") * R("az")^1)^0 * P(-1) + -- a-z | single - | / + (okay + R("AZ","09") + S("_/") - P("_")^2)^1 * (P(".") * R("AZ")^1)^0 * P(-1) + -- A-Z | single _ | / + (okay + R("AZ","09") + S("-/") - P("-")^2)^1 * (P(".") * R("AZ")^1)^0 * P(-1) -- A-Z | single - | / +) * Cc(false) + Cc(true) + +function figures.badname(name) + if not name then + -- bad anyway + elseif not hasscheme(name) then + return lpegmatch(pattern,name) + else + return lpegmatch(pattern,file.basename(name)) + end +end + +local trace_names = false + +trackers.register("graphics.lognames", function(v) + if v and not trace_names then + luatex.registerstopactions(function() + if figures.nofprocessed > 0 then + local report_newline = logs.newline + logs.pushtarget("logfile") + report_newline() + report_figures("start names") + for _, data in table.sortedhash(figures_found) do + report_newline() + report_figure("asked : %s",data.askedname) + if data.found then + report_figure("format : %s",data.format) + report_figure("found : %s",data.foundname) + report_figure("used : %s",data.fullname) + if data.badname then + report_figure("comment : %s","bad name") + elseif data.comment then + report_figure("comment : %s",data.comment) + end + else + report_figure("comment : %s","not found") + end + end + report_newline() + report_figures("stop names") + report_newline() + logs.poptarget() + end + end) + trace_names = true + end +end) + -- We can set the order but only indirectly so that we can check for support. function figures.setorder(list) -- can be table or string @@ -330,6 +429,9 @@ end function figures.registersuffix (suffix, target) register('list', target,suffix ) end function figures.registerpattern(pattern,target) register('pattern',target,pattern) end +implement { name = "registerfiguresuffix", actions = register, arguments = { "'list'", "string", "string" } } +implement { name = "registerfigurepattern", actions = register, arguments = { "'pattern'", "string", "string" } } + local last_locationset = last_locationset or nil local last_pathlist = last_pathlist or nil @@ -367,6 +469,8 @@ function figures.setpaths(locationset,pathlist) end end +implement { name = "setfigurepaths", actions = figures.setpaths, arguments = { "string", "string" } } + -- check conversions and handle it here function figures.hash(data) @@ -452,14 +556,15 @@ end function figures.push(request) statistics.starttiming(figures) - local figuredata = figures.initialize(request) + local figuredata = figures.initialize(request) -- we could use table.sparse but we set them later anyway insert(callstack,figuredata) lastfiguredata = figuredata return figuredata end function figures.pop() - lastfiguredata = remove(callstack) or lastfiguredata + remove(callstack) + lastfiguredata = callstack[#callstack] or lastfiguredata statistics.stoptiming(figures) end @@ -479,17 +584,13 @@ end figures.get = get -function commands.figurevariable(category,tag,default) - context(get(category,tag,default)) -end +implement { name = "figurestatus", actions = { get, context }, arguments = { "'status'", "string", "string" } } +implement { name = "figurerequest", actions = { get, context }, arguments = { "'request'", "string", "string" } } +implement { name = "figureused", actions = { get, context }, arguments = { "'used'", "string", "string" } } -function commands.figurestatus (tag,default) context(get("status", tag,default)) end -function commands.figurerequest(tag,default) context(get("request",tag,default)) end -function commands.figureused (tag,default) context(get("used", tag,default)) end - -function commands.figurefilepath() context(file.dirname (get("used","fullname"))) end -function commands.figurefilename() context(file.nameonly(get("used","fullname"))) end -function commands.figurefiletype() context(file.extname (get("used","fullname"))) end +implement { name = "figurefilepath", actions = { get, file.dirname, context }, arguments = { "'used'", "'fullname'" } } +implement { name = "figurefilename", actions = { get, file.nameonly, context }, arguments = { "'used'", "'fullname'" } } +implement { name = "figurefiletype", actions = { get, file.extname, context }, arguments = { "'used'", "'fullname'" } } -- todo: local path or cache path @@ -510,12 +611,31 @@ local function forbiddenname(filename) end end +local function rejected(specification) + if extra_check then + local fullname = specification.fullname + if fullname and figures_native[file.suffix(fullname)] and not figures.guess(fullname) then + specification.comment = "probably a bad file" + specification.found = false + specification.error = true + report_inclusion("file %a looks bad",fullname) + return true + end + end +end + local function register(askedname,specification) if not specification then - specification = { } + specification = { askedname = askedname, comment = "invalid specification" } elseif forbiddenname(specification.fullname) then - specification = { } - else + specification = { askedname = askedname, comment = "forbidden name" } + elseif specification.internal then + -- no filecheck needed + specification.found = true + if trace_figures then + report_inclusion("format %a internally supported by engine",specification.format) + end + elseif not rejected(specification) then local format = specification.format if format then local conversion = specification.conversion @@ -552,6 +672,9 @@ local function register(askedname,specification) report_inclusion("no converter for %a to %a",format,newformat) end if converter then + -- + -- todo: outline as helper function + -- local oldname = specification.fullname local newpath = file.dirname(oldname) local oldbase = file.basename(oldname) @@ -567,20 +690,23 @@ local function register(askedname,specification) -- local fc = specification.cache or figures.cachepaths.path if fc and fc ~= "" and fc ~= "." then - newpath = fc + newpath = gsub(fc,"%*",newpath) -- so cachedir can be "/data/cache/*" else newbase = defaultprefix .. newbase end - if not file.is_writable(newpath) then - if trace_conversion then - report_inclusion("path %a is not writable, forcing conversion path %a",newpath,".") - end - newpath = "." - end local subpath = specification.subpath or figures.cachepaths.subpath if subpath and subpath ~= "" and subpath ~= "." then newpath = newpath .. "/" .. subpath end + if not lfs.isdir(newpath) then + dir.makedirs(newpath) + if not file.is_writable(newpath) then + if trace_conversion then + report_inclusion("path %a is not writable, forcing conversion path %a",newpath,".") + end + newpath = "." + end + end local prefix = specification.prefix or figures.cachepaths.prefix if prefix and prefix ~= "" then newbase = prefix .. newbase @@ -602,7 +728,6 @@ local function register(askedname,specification) local newbase = newbase .. "." .. newformat -- local newname = file.join(newpath,newbase) - dir.makedirs(newpath) oldname = collapsepath(oldname) newname = collapsepath(newname) local oldtime = lfs.attributes(oldname,'modification') or 0 @@ -626,7 +751,7 @@ local function register(askedname,specification) format = newformat if not figures_suffixes[format] then -- maybe the new format is lowres.png (saves entry in suffixes) - -- so let's do thsi extra check + -- so let's do this extra check local suffix = file.suffix(newformat) if figures_suffixes[suffix] then if trace_figures then @@ -636,29 +761,44 @@ local function register(askedname,specification) end end elseif io.exists(oldname) then - specification.fullname = oldname -- was newname + report_inclusion("file %a is bugged",oldname) + if format and validtypes[format] then + specification.fullname = oldname + end specification.converted = false + specification.bugged = true end end end - local found = figures_suffixes[format] -- validtypes[format] - if not found then - specification.found = false - if trace_figures then - report_inclusion("format %a is not supported",format) - end - else - specification.found = true - if trace_figures then - if validtypes[format] then -- format? + if format then + local found = figures_suffixes[format] -- validtypes[format] + if not found then + specification.found = false + if trace_figures then + report_inclusion("format %a is not supported",format) + end + elseif validtypes[format] then + specification.found = true + if trace_figures then report_inclusion("format %a natively supported by backend",format) - else + end + else + specification.found = true -- else no foo.1 mps conversion + if trace_figures then report_inclusion("format %a supported by output file format",format) end end + else + specification.askedname = askedname + specification.found = false end end - specification.foundname = specification.foundname or specification.fullname + if specification.found then + specification.foundname = specification.foundname or specification.fullname + else + specification.foundname = nil + end + specification.badname = figures.badname(askedname) local askedhash = f_hash_part(askedname,specification.conversion or "default",specification.resolution or "default") figures_found[askedhash] = specification return specification @@ -667,13 +807,16 @@ end local resolve_too = false -- true local internalschemes = { - file = true, + file = true, + tree = true, + dirfile = true, + dirtree = true, } local function locate(request) -- name, format, cache -- not resolvers.cleanpath(request.name) as it fails on a!b.pdf and b~c.pdf -- todo: more restricted cleanpath - local askedname = request.name + local askedname = request.name or "" local askedhash = f_hash_part(askedname,request.conversion or "default",request.resolution or "default") local foundname = figures_found[askedhash] if foundname then @@ -684,11 +827,18 @@ local function locate(request) -- name, format, cache local askedconversion = request.conversion local askedresolution = request.resolution -- - if request.format == "" or request.format == "unknown" then - request.format = nil + local askedformat = request.format + if not askedformat or askedformat == "" or askedformat == "unknown" then + askedformat = file.suffix(askedname) or "" + elseif askedformat == v_auto then + if trace_figures then + report_inclusion("ignoring suffix of %a",askedname) + end + askedformat = "" + askedname = file.removesuffix(askedname) end -- protocol check - local hashed = url.hashed(askedname) + local hashed = urlhashed(askedname) if not hashed then -- go on elseif internalschemes[hashed.scheme] then @@ -697,6 +847,7 @@ local function locate(request) -- name, format, cache askedname = path end else + -- local fname = methodhandler('finders',pathname .. "/" .. wantedfiles[k]) local foundname = resolvers.findbinfile(askedname) if not foundname or not lfs.isfile(foundname) then -- foundname can be dummy if trace_figures then @@ -705,7 +856,6 @@ local function locate(request) -- name, format, cache -- url not found return register(askedname) end - local askedformat = request.format or file.suffix(askedname) or "" local guessedformat = figures.guess(foundname) if askedformat ~= guessedformat then if trace_figures then @@ -728,9 +878,8 @@ local function locate(request) -- name, format, cache end end -- we could use the hashed data instead - local askedpath= file.is_rootbased_path(askedname) + local askedpath = file.is_rootbased_path(askedname) local askedbase = file.basename(askedname) - local askedformat = request.format or file.suffix(askedname) or "" if askedformat ~= "" then askedformat = lower(askedformat) if trace_figures then @@ -750,7 +899,7 @@ local function locate(request) -- name, format, cache end end if format then - local foundname, quitscanning, forcedformat = figures.exists(askedname,format,resolve_too) -- not askedformat + local foundname, quitscanning, forcedformat, internal = figures.exists(askedname,format,resolve_too) -- not askedformat if foundname then return register(askedname, { askedname = askedname, @@ -760,6 +909,7 @@ local function locate(request) -- name, format, cache -- foundname = foundname, -- no conversion = askedconversion, resolution = askedresolution, + internal = internal, }) elseif quitscanning then return register(askedname) @@ -784,7 +934,7 @@ local function locate(request) -- name, format, cache else -- type given for i=1,#figure_paths do - local path = figure_paths[i] + local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:) local check = path .. "/" .. askedname -- we pass 'true' as it can be an url as well, as the type -- is given we don't waste much time @@ -792,7 +942,7 @@ local function locate(request) -- name, format, cache if foundname then return register(check, { askedname = askedname, - fullname = check, + fullname = foundname, -- check, format = askedformat, cache = askedcache, conversion = askedconversion, @@ -850,9 +1000,9 @@ local function locate(request) -- name, format, cache -- local name = file.replacesuffix(askedbase,suffix) local name = file.replacesuffix(askedname,suffix) for i=1,#figure_paths do - local path = figure_paths[i] + local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:) local check = path .. "/" .. name - local isfile = url.hashed(check).scheme == "file" + local isfile = internalschemes[urlhashed(check).scheme] if not isfile then if trace_figures then report_inclusion("warning: skipping path %a",path) @@ -878,7 +1028,7 @@ local function locate(request) -- name, format, cache report_inclusion("unknown format, using path strategy") end for i=1,#figure_paths do - local path = figure_paths[i] + local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:) for j=1,#figures_order do local format = figures_order[j] local list = figures_formats[format].list or { format } @@ -942,7 +1092,7 @@ function identifiers.default(data) du.fullname = fullname -- can be cached ds.fullname = foundname -- original ds.format = l.format - ds.status = (l.found and 10) or 0 + ds.status = (l.bugged and 0) or (l.found and 10) or 0 end return data end @@ -952,8 +1102,8 @@ function figures.identify(data) local list = identifiers.list -- defined at the end for i=1,#list do local identifier = list[i] - data = identifier(data) - if data.status.status > 0 then + local data = identifier(data) + if data and (not data.status and data.status.status > 0) then break end end @@ -969,12 +1119,57 @@ function figures.check(data) return (checkers[data.status.format] or checkers.generic)(data) end +local trace_usage = false +local used_images = { } + +trackers.register("graphics.usage", function(v) + if v and not trace_usage then + luatex.registerstopactions(function() + local found = { } + for _, t in table.sortedhash(figures_found) do + found[#found+1] = t + for k, v in next, t do + if v == false or v == "" then + t[k] = nil + end + end + end + for i=1,#used_images do + local u = used_images[i] + local s = u.status + if s then + s.status = nil -- doesn't say much here + if s.error then + u.used = { } -- better show that it's not used + end + end + for _, t in next, u do + for k, v in next, t do + if v == false or v == "" then + t[k] = nil + end + end + end + end + table.save(file.nameonly(environment.jobname) .. "-figures-usage.lua",{ + found = found, + used = used_images, + } ) + end) + trace_usage = true + end +end) + function figures.include(data) data = data or callstack[#callstack] or lastfiguredata + if trace_usage then + used_images[#used_images+1] = data + end return (includers[data.status.format] or includers.generic)(data) end function figures.scale(data) -- will become lua code + data = data or callstack[#callstack] or lastfiguredata context.doscalefigure() return data end @@ -1011,11 +1206,15 @@ end function existers.generic(askedname,resolve) -- not findbinfile local result - if lfs.isfile(askedname) then + if hasscheme(askedname) then + result = resolvers.findbinfile(askedname) + elseif lfs.isfile(askedname) then result = askedname elseif resolve then - result = resolvers.findbinfile(askedname) or "" - if result == "" then result = false end + result = resolvers.findbinfile(askedname) + end + if not result or result == "" then + result = false end if trace_figures then if result then @@ -1029,11 +1228,11 @@ end function checkers.generic(data) local dr, du, ds = data.request, data.used, data.status - local name = du.fullname or "unknown generic" - local page = du.page or dr.page - local size = dr.size or "crop" + local name = du.fullname or "unknown generic" + local page = du.page or dr.page + local size = dr.size or "crop" local color = dr.color or "natural" - local mask = dr.mask or "none" + local mask = dr.mask or "none" local conversion = dr.conversion local resolution = dr.resolution if not conversion or conversion == "" then @@ -1053,9 +1252,18 @@ function checkers.generic(data) } codeinjections.setfigurecolorspace(data,figure) codeinjections.setfiguremask(data,figure) - figure = figure and images.check(images.scan(figure)) or false + if figure then + local f, comment = images.check(images.scan(figure)) + if not f then + ds.comment = comment + ds.found = false + ds.error = true + end + figure = f + end local f, d = codeinjections.setfigurealternative(data,figure) - figure, data = f or figure, d or data + figure = f or figure + data = d or data figures_loaded[hash] = figure if trace_conversion then report_inclusion("new graphic, using hash %a",hash) @@ -1081,12 +1289,19 @@ function checkers.generic(data) return data end +local nofimages = 0 +local pofimages = { } + +function figures.getrealpage(index) + return pofimages[index] or 0 +end + function includers.generic(data) local dr, du, ds = data.request, data.used, data.status -- here we set the 'natural dimensions' - dr.width = du.width - dr.height = du.height - local hash = figures.hash(data) + dr.width = du.width + dr.height = du.height + local hash = figures.hash(data) local figure = figures_used[hash] -- figures.registerresource { -- filename = du.fullname, @@ -1102,9 +1317,17 @@ function includers.generic(data) figures_used[hash] = figure end if figure then - local nr = figures.boxnumber - -- it looks like we have a leak in attributes here .. todo - local box = hpack(images.node(figure)) -- images.node(figure) not longer valid + local nr = figures.boxnumber + nofimages = nofimages + 1 + ds.pageindex = nofimages + local image = images.node(figure) + local pager = new_latelua(function() + pofimages[nofimages] = pofimages[nofimages] or tex.count.realpageno -- so when reused we register the first one only + end) + image.next = pager + pager.prev = image + local box = hpack(image) -- images.node(figure) not longer valid + indexed[figure.index] = figure box.width, box.height, box.depth = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet) texsetbox(nr,box) @@ -1178,6 +1401,8 @@ includers.mov = includers.nongeneric internalschemes.mprun = true +-- mprun.foo.1 mprun.6 mprun:foo.2 + local function internal(askedname) local spec, mprun, mpnum = match(lower(askedname),"mprun([:%.]?)(.-)%.(%d+)") if spec ~= "" then @@ -1190,7 +1415,7 @@ end function existers.mps(askedname) local mprun, mpnum = internal(askedname) if mpnum then - return askedname + return askedname, true, "mps", true else return existers.generic(askedname) end @@ -1211,7 +1436,7 @@ includers.mps = includers.nongeneric function existers.tex(askedname) askedname = resolvers.findfile(askedname) - return askedname ~= "" and askedname or false + return askedname ~= "" and askedname or false, true, "tex", true end function checkers.tex(data) @@ -1225,7 +1450,7 @@ includers.tex = includers.nongeneric function existers.buffer(askedname) local name = file.nameonly(askedname) local okay = buffers.exists(name) - return okay and name, true -- always quit scanning + return okay and name, true, "buffer", true -- always quit scanning end function checkers.buffer(data) @@ -1252,7 +1477,10 @@ includers.auto = includers.generic -- -- -- cld -- -- -- -existers.cld = existers.tex +function existers.cld(askedname) + askedname = resolvers.findfile(askedname) + return askedname ~= "" and askedname or false, true, "cld", true +end function checkers.cld(data) return checkers_nongeneric(data,function() context.docheckfigurecld(data.used.fullname) end) @@ -1270,20 +1498,38 @@ end -- programs.makeoptions = makeoptions local function runprogram(binary,argument,variables) - local binary = match(binary,"[%S]+") -- to be sure + -- move this check to the runner code + local found = nil + if type(binary) == "table" then + for i=1,#binary do + local b = binary[i] + found = os.which(b) + if found then + binary = b + break + end + end + if not found then + binary = concat(binary, " | ") + end + elseif binary then + found = os.which(match(binary,"[%S]+")) + end if type(argument) == "table" then argument = concat(argument," ") -- for old times sake end - if not os.which(binary) then - report_inclusion("program %a is not installed, not running command: %s",binary,command) + if not found then + report_inclusion("program %a is not installed",binary or "?") elseif not argument or argument == "" then - report_inclusion("nothing to run, unknown program %a",binary) + report_inclusion("nothing to run, no arguments for program %a",binary) else - local command = format([["%s" %s]],binary,replacetemplate(longtostring(argument),variables)) + -- no need to use the full found filename (found) .. we also don't quote the program + -- name any longer as in luatex there is too much messing with these names + local command = format([[%s %s]],binary,replacetemplate(longtostring(argument),variables)) if trace_conversion or trace_programs then report_inclusion("running command: %s",command) end - os.spawn(command) + os.execute(command) end end @@ -1298,13 +1544,15 @@ local epsconverter = converters.eps or { } converters.eps = epsconverter converters.ps = epsconverter +-- todo: colorspace + local epstopdf = { resolutions = { [v_low] = "screen", [v_medium] = "ebook", [v_high] = "prepress", }, - command = os.type == "windows" and "gswin32c" or "gs", + command = os.type == "windows" and { "gswin64c", "gswin32c" } or "gs", -- -dProcessDSCComments=false argument = [[ -q @@ -1315,8 +1563,10 @@ local epstopdf = { -dAutoRotatePages=/None -dPDFSETTINGS=/%presets% -dEPSCrop - -sOutputFile=%newname% - %oldname% + -dCompatibilityLevel=%level% + -sOutputFile="%newname%" + %colorspace% + "%oldname%" -c quit ]], } @@ -1324,14 +1574,66 @@ local epstopdf = { programs.epstopdf = epstopdf programs.gs = epstopdf -function epsconverter.pdf(oldname,newname,resolution) -- the resolution interface might change +local cleanups = { } +local cleaners = { } + +local whitespace = lpeg.patterns.whitespace +local quadruple = Ct((whitespace^0 * lpeg.patterns.number/tonumber * whitespace^0)^4) +local betterbox = P("%%BoundingBox:") * quadruple + * P("%%HiResBoundingBox:") * quadruple + * P("%AI3_Cropmarks:") * quadruple + * P("%%CropBox:") * quadruple + / function(b,h,m,c) + return formatters["%%%%BoundingBox: %i %i %i %i\n%%%%HiResBoundingBox: %F %F %F %F\n%%%%CropBox: %F %F %F %F\n"]( + m[1],m[2],m[3],m[4], + m[1],m[2],m[3],m[4], + m[1],m[2],m[3],m[4] + ) + end +local nocrap = P("%") / "" * ( + (P("AI9_PrivateDataBegin") * P(1)^0) / "%%%%EOF" + + (P("%EOF") * whitespace^0 * P("%AI9_PrintingDataEnd") * P(1)^0) / "%%%%EOF" + + (P("AI7_Thumbnail") * (1-P("%%EndData"))^0 * P("%%EndData")) / "" + ) +local whatever = nocrap + P(1) +local pattern = Cs((betterbox * whatever^1 + whatever)^1) + +directives.register("graphics.conversion.eps.cleanup.ai",function(v) cleanups.ai = v end) + +cleaners.ai = function(name) + local tmpname = name .. ".tmp" + io.savedata(tmpname,lpegmatch(pattern,io.loaddata(name))) + return tmpname +end + +function epsconverter.pdf(oldname,newname,resolution,colorspace) -- the resolution interface might change local epstopdf = programs.epstopdf -- can be changed - local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high + local presets = epstopdf.resolutions[resolution or "high"] or epstopdf.resolutions.high + local level = codeinjections.getformatoption("pdf_level") or "1.3" + local tmpname = oldname + if cleanups.ai then + tmpname = cleaners.ai(oldname) + end + if colorspace == "gray" then + colorspace = "-sColorConversionStrategy=Gray -sProcessColorModel=DeviceGray" + -- colorspace = "-sColorConversionStrategy=Gray" + else + colorspace = nil + end runprogram(epstopdf.command, epstopdf.argument, { - newname = newname, - oldname = oldname, - presets = presets, + newname = newname, + oldname = tmpname, + presets = presets, + level = tostring(level), + colorspace = colorspace, } ) + if tmpname ~= oldname then + os.remove(tmpname) + end +end + +epsconverter["gray.pdf"] = function(oldname,newname,resolution) -- the resolution interface might change + epsconverter.pdf(oldname,newname,resolution,"gray") end epsconverter.default = epsconverter.pdf @@ -1339,22 +1641,23 @@ epsconverter.default = epsconverter.pdf local pdfconverter = converters.pdf or { } converters.pdf = pdfconverter -programs.pdftoeps = { - command = "pdftops", - argument = [[-eps "%oldname%" "%newname%]], -} - -pdfconverter.stripped = function(oldname,newname) - local pdftoeps = programs.pdftoeps -- can be changed - local epstopdf = programs.epstopdf -- can be changed - local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high - local tmpname = newname .. ".tmp" - runprogram(pdftoeps.command, pdftoeps.argument, { oldname = oldname, newname = tmpname, presets = presets }) - runprogram(epstopdf.command, epstopdf.argument, { oldname = tmpname, newname = newname, presets = presets }) - os.remove(tmpname) -end - -figures.registersuffix("stripped","pdf") +-- programs.pdftoeps = { +-- command = "pdftops", +-- argument = [[-eps "%oldname%" "%newname%"]], +-- } +-- +-- pdfconverter.stripped = function(oldname,newname) +-- local pdftoeps = programs.pdftoeps -- can be changed +-- local epstopdf = programs.epstopdf -- can be changed +-- local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high +-- local level = codeinjections.getformatoption("pdf_level") or "1.3" +-- local tmpname = newname .. ".tmp" +-- runprogram(pdftoeps.command, pdftoeps.argument, { oldname = oldname, newname = tmpname, presets = presets, level = level }) +-- runprogram(epstopdf.command, epstopdf.argument, { oldname = tmpname, newname = newname, presets = presets, level = level }) +-- os.remove(tmpname) +-- end +-- +-- figures.registersuffix("stripped","pdf") -- -- -- svg -- -- -- @@ -1431,14 +1734,111 @@ bmpconverter.default = converter -- todo: lowres +-- cmyk conversion + +-- ecirgb_v2.icc +-- ecirgb_v2_iccv4.icc +-- isocoated_v2_300_eci.icc +-- isocoated_v2_eci.icc +-- srgb.icc +-- srgb_v4_icc_preference.icc + +-- [[convert %?colorspace: -colorspace "%colorspace%" ?%]] + +local rgbprofile = "srgb_v4_icc_preference.icc" -- srgb.icc +local cmykprofile = "isocoated_v2_300_eci.icc" -- isocoated_v2_eci.icc + +directives.register("graphics.conversion.rgbprofile", function(v) rgbprofile = type(v) == "string" and v or rgbprofile end) +directives.register("graphics.conversion.cmykprofile",function(v) cmykprofile = type(v) == "string" and v or cmykprofile end) + +local function profiles() + if not lfs.isfile(rgbprofile) then + local found = resolvers.findfile(rgbprofile) + if found and found ~= "" then + rgbprofile = found + else + report_figures("unknown profile %a",rgbprofile) + end + end + if not lfs.isfile(cmykprofile) then + local found = resolvers.findfile(cmykprofile) + if found and found ~= "" then + cmykprofile = found + else + report_figures("unknown profile %a",cmykprofile) + end + end + return rgbprofile, cmykprofile +end + +programs.pngtocmykpdf = { + command = "gm", + argument = [[convert -compress Zip -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]], +} + +programs.jpgtocmykpdf = { + command = "gm", + argument = [[convert -compress JPEG -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]], +} + +programs.pngtograypdf = { + command = "gm", + argument = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]], +} + +programs.jpgtograypdf = { + command = "gm", + argument = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]], +} + +figures.converters.png = { + ["cmyk.pdf"] = function(oldname,newname,resolution) + local rgbprofile, cmykprofile = profiles() + runprogram(programs.pngtocmykpdf.command, programs.pngtocmykpdf.argument, { + -- runprogram(programs.pngtocmykpdf, { + rgbprofile = rgbprofile, + cmykprofile = cmykprofile, + oldname = oldname, + newname = newname, + } ) + end, + ["gray.pdf"] = function(oldname,newname,resolution) + runprogram(programs.pngtograypdf.command, programs.pngtograypdf.argument, { + -- runprogram(programs.pngtograypdf, { + oldname = oldname, + newname = newname, + } ) + end, +} + +figures.converters.jpg = { + ["cmyk.pdf"] = function(oldname,newname,resolution) + local rgbprofile, cmykprofile = profiles() + runprogram(programs.jpgtocmykpdf.command, programs.jpgtocmykpdf.argument, { + -- runprogram(programs.jpgtocmykpdf, { + rgbprofile = rgbprofile, + cmykprofile = cmykprofile, + oldname = oldname, + newname = newname, + } ) + end, + ["gray.pdf"] = function(oldname,newname,resolution) + runprogram(programs.jpgtograypdf.command, programs.jpgtograypdf.argument, { + -- runprogram(programs.jpgtograypdf, { + oldname = oldname, + newname = newname, + } ) + end, +} + -- -- -- bases -- -- -- local bases = allocate() figures.bases = bases -local bases_list = nil -- index => { basename, fullname, xmlroot } -local bases_used = nil -- [basename] => { basename, fullname, xmlroot } -- pointer to list -local bases_found = nil +local bases_list = nil -- index => { basename, fullname, xmlroot } +local bases_used = nil -- [basename] => { basename, fullname, xmlroot } -- pointer to list +local bases_found = nil local bases_enabled = false local function reset() @@ -1473,6 +1873,8 @@ function bases.use(basename) end end +implement { name = "usefigurebase", actions = bases.use, arguments = "string" } + local function bases_find(basename,askedlabel) if trace_bases then report_inclusion("checking for %a in base %a",askedlabel,basename) @@ -1485,7 +1887,7 @@ local function bases_find(basename,askedlabel) if base[2] == nil then -- no yet located for i=1,#figure_paths do - local path = figure_paths[i] + local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:) local xmlfile = path .. "/" .. basename if io.exists(xmlfile) then base[2] = xmlfile @@ -1503,10 +1905,10 @@ local function bases_find(basename,askedlabel) page = page + 1 if xml.text(e) == askedlabel then t = { - base = file.replacesuffix(base[2],"pdf"), + base = file.replacesuffix(base[2],"pdf"), format = "pdf", - name = xml.text(e,"../*:file"), -- to be checked - page = page, + name = xml.text(e,"../*:file"), -- to be checked + page = page, } bases_found[askedlabel] = t if trace_bases then @@ -1541,13 +1943,13 @@ function identifiers.base(data) local dr, du, ds = data.request, data.used, data.status local fbl = bases_locate(dr.name or dr.label) if fbl then - du.page = fbl.page - du.format = fbl.format + du.page = fbl.page + du.format = fbl.format du.fullname = fbl.base ds.fullname = fbl.name - ds.format = fbl.format - ds.page = fbl.page - ds.status = 10 + ds.format = fbl.format + ds.page = fbl.page + ds.status = 10 end end return data @@ -1566,7 +1968,15 @@ identifiers.list = { statistics.register("graphics processing time", function() local nofprocessed = figures.nofprocessed if nofprocessed > 0 then - return format("%s seconds including tex, %s processed images", statistics.elapsedtime(figures),nofprocessed) + local nofnames, nofbadnames = 0, 0 + for hash, data in next, figures_found do + nofnames = nofnames + 1 + if data.badname then + nofbadnames = nofbadnames + 1 + end + end + return format("%s seconds including tex, %s processed images, %s unique asked, %s bad names", + statistics.elapsedtime(figures),nofprocessed,nofnames,nofbadnames) else return nil end @@ -1618,8 +2028,59 @@ end -- interfacing -commands.setfigurelookuporder = figures.setorder +implement { + name = "figure_push", + scope = "private", + actions = figures.push, + arguments = { + { + { "name" }, + { "label" }, + { "page" }, + { "size" }, + { "object" }, + { "prefix" }, + { "cache" }, + { "format" }, + { "preset" }, + { "controls" }, + { "resources" }, + { "preview" }, + { "display" }, + { "mask" }, + { "conversion" }, + { "resolution" }, + { "color" }, + { "repeat" }, + { "width", "dimen" }, + { "height", "dimen" }, + } + } +} --- +-- beware, we get a number passed by default + +implement { name = "figure_pop", scope = "private", actions = figures.pop } +implement { name = "figure_done", scope = "private", actions = figures.done } +implement { name = "figure_dummy", scope = "private", actions = figures.dummy } +implement { name = "figure_identify", scope = "private", actions = figures.identify } +implement { name = "figure_scale", scope = "private", actions = figures.scale } +implement { name = "figure_check", scope = "private", actions = figures.check } +implement { name = "figure_include", scope = "private", actions = figures.include } -figures.images = images +implement { + name = "setfigurelookuporder", + actions = figures.setorder, + arguments = "string" +} + +implement { + name = "figure_reset", + scope = "private", + arguments = { "integer", "dimen", "dimen" }, + actions = function(box,width,height) + figures.boxnumber = box + figures.defaultwidth = width + figures.defaultheight = height + end +} diff --git a/Master/texmf-dist/tex/context/base/grph-inc.mkiv b/Master/texmf-dist/tex/context/base/grph-inc.mkiv index e8b63cc4bb9..6b7f2bd6359 100644 --- a/Master/texmf-dist/tex/context/base/grph-inc.mkiv +++ b/Master/texmf-dist/tex/context/base/grph-inc.mkiv @@ -11,6 +11,11 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +% \enabledirectives[graphics.conversion.eps.cleanup.ai] + +% \setupexternalfigures[directory=dirfile://./test/**] +% \externalfigure[crappname(2).eps][frame=on] + % todo: messages \writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion} @@ -147,6 +152,11 @@ %D the already set parameters need to be set again or otherwise %D the old values will be used. +%D New: \type {method=auto}: strips suffix and uses \quote {order} which is handy in +%D some of four workflows where sources are used for web and print and where +%D the web tools need a suffix (like gif) which we don't want as we want a high +%D quality format. + \newconditional\c_grph_include_trace_inheritance \installtextracker @@ -174,14 +184,14 @@ \def\grph_include_use[#1][#2][#3][#4]% {\doifelsenothing{#1} {\doifsomething{#2} - {\doifassignmentelse{#3} + {\doifelseassignment{#3} {\grph_include_use_indeed{#2}{#2}{#3}{#4}} {\grph_include_use_indeed{#2}{#2}\empty{#4}}}} {\doifelsenothing{#2} - {\doifassignmentelse{#3} + {\doifelseassignment{#3} {\grph_include_use_indeed{#1}{#1}\empty{#3}} {\grph_include_use_indeed{#1}{#1}{#3}{#4}}} - {\doifassignmentelse{#3} + {\doifelseassignment{#3} {\grph_include_use_indeed{#1}{#2}\empty{#3}} {\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}} @@ -300,56 +310,56 @@ \edef\p_label {\externalfigureparameter\c!label}% % \dostarttagged\t!image\empty - \ctxlua{figures.push { - name = "\p_grph_include_name", - label = "\ifx\p_label\empty\p_grph_include_label\else\p_label\fi", - page = "\externalfigureparameter\c!page", - size = "\externalfigureparameter\c!size", - object = "\externalfigureparameter\c!object", - prefix = "\externalfigureparameter\c!prefix", - cache = "\externalfigureparameter\c!cache", - format = "\externalfigureparameter\c!method", - preset = "\externalfigureparameter\c!prefix", - controls = "\externalfigureparameter\c!controls", - resources = "\externalfigureparameter\c!resources", - preview = "\externalfigureparameter\c!preview", - display = "\externalfigureparameter\c!display", - mask = "\externalfigureparameter\c!mask", - conversion = "\externalfigureparameter\c!conversion", - resolution = "\externalfigureparameter\c!resolution", - color = "\internalspotcolorparent{\externalfigureparameter\c!color}", % hack is needed - ["repeat"] = "\externalfigureparameter\c!repeat", - \ifx\p_width\empty \else - width = \number\dimexpr\p_width, - \fi - \ifx\p_height\empty \else - height = \number\dimexpr\p_height, - \fi - } }% - \ctxlua{figures.identify()}% - % also mode: checkpresense only + \clf_figure_push + name {\p_grph_include_name}% + label {\ifx\p_label\empty\p_grph_include_label\else\p_label\fi}% + page {\externalfigureparameter\c!page}% + size {\externalfigureparameter\c!size}% + object {\externalfigureparameter\c!object}% + prefix {\externalfigureparameter\c!prefix}% + cache {\externalfigureparameter\c!cache}% + format {\externalfigureparameter\c!method}% + preset {\externalfigureparameter\c!prefix}% + controls {\externalfigureparameter\c!controls}% + resources {\externalfigureparameter\c!resources}% + preview {\externalfigureparameter\c!preview}% + display {\externalfigureparameter\c!display}% + mask {\externalfigureparameter\c!mask}% + conversion {\externalfigureparameter\c!conversion}% + resolution {\externalfigureparameter\c!resolution}% + color {\internalspotcolorparent{\externalfigureparameter\c!color}}% hack is needed + repeat {\externalfigureparameter\c!repeat}% + \ifx\p_width\empty \else + width \dimexpr\p_width\relax + \fi + \ifx\p_height\empty \else + height \dimexpr\p_height\relax + \fi + \relax + \clf_figure_identify + \relax \ifconditional\c_grph_include_test_only \ifcase\figurestatus \else - \ctxlua{figures.check()}% - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% - \ctxlua{figures.done()}% + \clf_figure_check + \clf_figure_dummy + \clf_figure_scale + \clf_figure_done \fi \grph_include_set_mode \else \ifcase\figurestatus - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% + \clf_figure_dummy + \clf_figure_scale \else - \ctxlua{figures.check()}% - \ctxlua{figures.include()}% - \ctxlua{figures.scale()}% + \clf_figure_check + \clf_figure_include + \clf_figure_scale \fi - \ctxlua{figures.done()}% + \clf_figure_done \grph_include_set_mode \grph_include_finalize \fi - \ctxlua{figures.pop()}% + \clf_figure_pop \dotagfigure \naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}% \dostoptagged @@ -416,13 +426,13 @@ {\dodoubleargument\grph_include_set_type_synonym} \def\grph_include_set_type_synonym[#1][#2]% - {\ctxlua{figures.registersuffix("#1","#2")}} + {\clf_registerfiguresuffix{#1}{#2}} %D Additional paths can be installed with the regular setup command. The next %D macro picks up the list. \unexpanded\def\setfigurepathlist - {\ctxlua{figures.setpaths("\externalfigureparameter\c!location",\!!bs\externalfigureparameter\c!directory\!!es)}} + {\clf_setfigurepaths{\externalfigureparameter\c!location}{\externalfigureparameter\c!directory}} %D Variables: @@ -432,36 +442,36 @@ \def\defaultfigurewidth {8\lineheight} \def\defaultfigureheight {6\lineheight} -\def\figurestatus {\numexpr\ctxcommand{figurestatus("status",0)}\relax} % number: 0 = not found -\def\figurewidth {\ctxcommand{figurestatus("width",0)}sp} -\def\figureheight {\ctxcommand{figurestatus("height",0)}sp} -\def\figurexscale {\ctxcommand{figurestatus("xscale",1)}} -\def\figureyscale {\ctxcommand{figurestatus("yscale",1)}} - -\def\figuresize {\ctxcommand{figurerequest("size")}} -\def\figurelabel {\ctxcommand{figurerequest("label")}} -\def\figurefileoriginal {\ctxcommand{figurerequest("name")}} -\def\figurefilepage {\ctxcommand{figurerequest("page",1)}} -\def\figurefileoptions {\ctxcommand{figurerequest("options")}} -\def\figurefileconversion{\ctxcommand{figurerequest("conversion")}} -\def\figurefilecache {\ctxcommand{figurerequest("cache")}} -\def\figurefileprefix {\ctxcommand{figurerequest("prefix")}} - -\def\figurenaturalwidth {\ctxcommand{figureused("width", \number\dimexpr\defaultfigurewidth \relax)}sp} -\def\figurenaturalheight {\ctxcommand{figureused("height",\number\dimexpr\defaultfigureheight\relax)}sp} -\def\figurexresolution {\ctxcommand{figureused("xresolution",0)}} -\def\figureyresolution {\ctxcommand{figureused("yresolution",0)}} -\def\figurexsize {\ctxcommand{figureused("xsize",0)}} -\def\figureysize {\ctxcommand{figureused("ysize",0)}} -\def\figurecolordepth {\ctxcommand{figureused("colordepth",0)}} -\def\figuredepth {\ctxcommand{figureused("depth",0)}} - -\def\figurefullname {\ctxcommand{figureused("fullname")}} -\def\noffigurepages {\ctxcommand{figureused("pages",0)}} - -\def\figurefilepath {\ctxcommand{figurefilepath()}} -\def\figurefilename {\ctxcommand{figurefilename()}} -\def\figurefiletype {\ctxcommand{figurefiletype()}} +\def\figurestatus {\numexpr\clf_figurestatus{status}{0}\relax} % number: 0 = not found +\def\figurewidth {\clf_figurestatus{width}{0}sp} +\def\figureheight {\clf_figurestatus{height}{0}sp} +\def\figurexscale {\clf_figurestatus{xscale}{1}} +\def\figureyscale {\clf_figurestatus{yscale}{1}} + +\def\figuresize {\clf_figurerequest{size}{}} +\def\figurelabel {\clf_figurerequest{label}{}} +\def\figurefileoriginal {\clf_figurerequest{name}{}} +\def\figurefilepage {\clf_figurerequest{page}{1}} +\def\figurefileoptions {\clf_figurerequest{options}{}} +\def\figurefileconversion{\clf_figurerequest{conversion}{}} +\def\figurefilecache {\clf_figurerequest{cache}{}} +\def\figurefileprefix {\clf_figurerequest{prefix}{}} + +\def\figurenaturalwidth {\clf_figureused{width}{\number\dimexpr\defaultfigurewidth\relax}sp} +\def\figurenaturalheight {\clf_figureused{height}{\number\dimexpr\defaultfigureheight\relax}sp} +\def\figurexresolution {\clf_figureused{xresolution}{0}} +\def\figureyresolution {\clf_figureused{yresolution}{0}} +\def\figurexsize {\clf_figureused{xsize}{0}} +\def\figureysize {\clf_figureused{ysize}{0}} +\def\figurecolordepth {\clf_figureused{colordepth}{0}} +\def\figuredepth {\clf_figureused{depth}{0}} + +\def\figurefullname {\clf_figureused{fullname}{}} +\def\noffigurepages {\clf_figureused{pages}{0}} + +\def\figurefilepath {\clf_figurefilepath} +\def\figurefilename {\clf_figurefilename} +\def\figurefiletype {\clf_figurefiletype} \let\naturalfigurewidth \figurenaturalwidth \let\naturalfigureheight \figurenaturalheight @@ -500,12 +510,14 @@ \fi} \appendtoks - \ctxlua { % figures.defaultwidth .. maybe a dimen some day - figures.setpaths("\externalfigureparameter\c!location","\externalfigureparameter\c!directory") ; - figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ; - figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ; - figures.boxnumber = \number\foundexternalfigure ; - }% + \clf_setfigurepaths + {\externalfigureparameter\c!location}% + {\externalfigureparameter\c!directory}% + \clf_figure_reset + \foundexternalfigure + \defaultfigurewidth + \defaultfigureheight + \relax \to \everyexternalfigureresets \appendtoks @@ -629,7 +641,7 @@ \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]% \stopnointerference} -\unexpanded\def\doiffigureelse#1% +\unexpanded\def\doifelsefigure#1% {\getfiguredimensions[#1]% so data is available ! \ifcase\figurestatus \expandafter\secondoftwoarguments @@ -637,6 +649,8 @@ \expandafter\firstoftwoarguments \fi} +\let\doiffigureelse\doifelsefigure + % No placement, handy for preprocessing: \unexpanded\def\registerexternalfigure @@ -661,14 +675,14 @@ % Figure bases \unexpanded\def\usefigurebase[#1]% - {\ctxlua{figures.bases.use("#1")}} + {\clf_usefigurebase{#1}} \appendtoks \setfigurepathlist % the path may be used elsewhere too (as in x-res-04) \to \everysetupexternalfigure \appendtoks - \ctxcommand{setfigurelookuporder("\externalfigureparameter\c!order")}% + \clf_setfigurelookuporder{\externalfigureparameter\c!order}% \to \everysetupexternalfigure \definecolor[missingfigurecolor][s=.8] @@ -762,7 +776,7 @@ {\writestatus\m!system{the \string\showexternalfigures\space command is not (yet) implemented in mkiv}} \unexpanded\def\overlayfigure#1% - {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]} + {\externalfigure[#1][\c!width=\d_overlay_width,\c!height=\d_overlay_height]} % Bonus: diff --git a/Master/texmf-dist/tex/context/base/grph-raw.lua b/Master/texmf-dist/tex/context/base/grph-raw.lua index 4c5b031ea98..62e96fcc9d7 100644 --- a/Master/texmf-dist/tex/context/base/grph-raw.lua +++ b/Master/texmf-dist/tex/context/base/grph-raw.lua @@ -40,3 +40,18 @@ function figures.bitmapimage(t) report_bitmap("invalid specification") end end + +interfaces.implement { + name = "bitmapimage", + actions = figures.bitmapimage, + arguments = { + { + { "data" }, + { "colorspace" }, + { "width" }, + { "height" }, + { "xresolution" }, + { "yresolution" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/grph-raw.mkiv b/Master/texmf-dist/tex/context/base/grph-raw.mkiv index 1c683556412..8978ba2671b 100644 --- a/Master/texmf-dist/tex/context/base/grph-raw.mkiv +++ b/Master/texmf-dist/tex/context/base/grph-raw.mkiv @@ -46,14 +46,14 @@ \unexpanded\def\bitmapimage[#1]#2% {\hbox\bgroup \getdummyparameters[\c!color=rgb,\c!width=,\c!height=,\c!x=,\c!y=,#1]% - \ctxlua{figures.bitmapimage { % we could pass #1 directly ... todo - data = \!!bs#2\!!es, - colorspace = "\directdummyparameter\c!color", - width = "\directdummyparameter\c!width", - height = "\directdummyparameter\c!height", - xresolution = "\directdummyparameter\c!x", - yresolution = "\directdummyparameter\c!y", - }}% + \clf_bitmapimage + data {#2}% + colorspace {\directdummyparameter\c!color}% + width {\directdummyparameter\c!width}% + height {\directdummyparameter\c!height}% + xresolution {\directdummyparameter\c!x}% + yresolution {\directdummyparameter\c!y}% + \relax \egroup} \unexpanded\def\startbitmapimage[#1]#2\stopbitmapimage diff --git a/Master/texmf-dist/tex/context/base/grph-trf.mkiv b/Master/texmf-dist/tex/context/base/grph-trf.mkiv index d907c1b0ca3..fca5c7cf6ef 100644 --- a/Master/texmf-dist/tex/context/base/grph-trf.mkiv +++ b/Master/texmf-dist/tex/context/base/grph-trf.mkiv @@ -108,7 +108,7 @@ \edef\currentscale{#1}% \setupcurrentscale[#2]% \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\let\currentscale\empty \setupcurrentscale[#1]} {\edef\currentscale{#1}}% @@ -318,11 +318,11 @@ \def\m_grph_scale_factor_set{\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef \def\grph_scale_by_factor - {\doifinsetelse\p_factor\m_grph_scale_factor_set + {\doifelseinset\p_factor\m_grph_scale_factor_set \grph_scale_by_factor_a - {\doifinsetelse\p_hfactor\m_grph_scale_factor_set + {\doifelseinset\p_hfactor\m_grph_scale_factor_set \grph_scale_by_factor_b - {\doifinsetelse\p_wfactor\m_grph_scale_factor_set + {\doifelseinset\p_wfactor\m_grph_scale_factor_set \grph_scale_by_factor_c \grph_scale_by_factor_d}}} @@ -1080,18 +1080,18 @@ {\boxcursor\box\nextbox} \setvalue{\??rotatepreset\v!left}% - {\edef\p_rotation_rotation{\doifoddpageelse{90}{270}}} + {\edef\p_rotation_rotation{\doifelseoddpage{90}{270}}} \setvalue{\??rotatepreset\v!right}% - {\edef\p_rotation_rotation{\doifoddpageelse{270}{90}}} + {\edef\p_rotation_rotation{\doifelseoddpage{270}{90}}} \setvalue{\??rotatepreset\v!inner}% {\signalrightpage - \doifrightpageelse{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}} + \doifelserightpage{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}} \setvalue{\??rotatepreset\v!outer}% {\signalrightpage - \doifrightpageelse{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}} + \doifelserightpage{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}} \setvalue{\??rotatepreset\v!default}% {\edef\p_rotation_rotation{\realnumber{\p_rotation_rotation}}}% get rid of leading zeros and spaces diff --git a/Master/texmf-dist/tex/context/base/hand-ini.mkiv b/Master/texmf-dist/tex/context/base/hand-ini.mkiv index 450794d276f..fd18e3221d0 100644 --- a/Master/texmf-dist/tex/context/base/hand-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/hand-ini.mkiv @@ -42,8 +42,8 @@ \unexpanded\def\setupfontexpansion {\dodoubleargument\font_expansion_setup } \unexpanded\def\setupfontprotrusion{\dodoubleargument\font_protrusion_setup} -\def\font_expansion_setup [#1][#2]{\ctxcommand{setupfontexpansion ("#1","#2")}} -\def\font_protrusion_setup[#1][#2]{\ctxcommand{setupfontprotrusion("#1","#2")}} +\def\font_expansion_setup [#1][#2]{\clf_setupfontexpansion {#1}{#2}} +\def\font_protrusion_setup[#1][#2]{\clf_setupfontprotrusion{#1}{#2}} % \setupfontprotrusion[quality-upright][vector=quality] % \setupfontprotrusion[quality-slanted][vector=quality,right=1.5] @@ -51,10 +51,10 @@ \let\pdfadjustspacing\relax \newcount\pdfadjustspacing % a little bit protection \let\pdfprotrudechars\relax \newcount\pdfprotrudechars % a little bit protection -\def\font_expansion_enable {\normalpdfadjustspacing\plustwo } -\def\font_expansion_disable {\normalpdfadjustspacing\zerocount} -\def\font_protruding_enable {\normalpdfprotrudechars\plustwo } -\def\font_protruding_disable{\normalpdfprotrudechars\zerocount} +\def\font_expansion_enable {\normalpdfadjustspacing\plustwo } % these will become normal primitives +\def\font_expansion_disable {\normalpdfadjustspacing\zerocount} % these will become normal primitives +\def\font_protruding_enable {\normalpdfprotrudechars\plustwo } % these will become normal primitives +\def\font_protruding_disable{\normalpdfprotrudechars\zerocount} % these will become normal primitives \appendtoks \font_expansion_disable \to \everyforgetall % Here or not here? \appendtoks \font_protruding_disable \to \everyforgetall % Here or not here? diff --git a/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv index aaec257f259..cbd53fffb4a 100644 --- a/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv +++ b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv @@ -30,29 +30,34 @@ %D On into Yes. Also, we've changed the test for the on value %D into !Off as we dón't know what value it gets in the reader. +% Is this still okay? We can have unicode now, can't we? Anyway it's kind of +% messy and unneeded in these unicode times. + \startluasetups javascript:pdfencoding - local verbatim = context.verbatim - verbatim("{\n") - for accent, group in table.sortedhash(characters.tex.accentmapping) do - for character, mapping in table.sortedhash(group) do + local ctx_verbatim = context.verbatim + local utfbyte = utf.byte + local sortedhash = table.sortedhash + + ctx_verbatim("{\n") + for accent, group in sortedhash(characters.tex.accentmapping) do + for character, mapping in sortedhash(group) do if character == "" then character = " " end if accent == '"' then - verbatim(" '\\\\%s%s' : '\\u%04X',\n",accent,character,utf.byte(mapping)) + ctx_verbatim(" '\\\\%s%s' : '\\u%04X',\n",accent,character,utfbyte(mapping)) else - verbatim(' "\\\\%s%s" : "\\u%04X",\n',accent,character,utf.byte(mapping)) + ctx_verbatim(' "\\\\%s%s" : "\\u%04X",\n',accent,character,utfbyte(mapping)) end end end - verbatim(" '\\\\OE' : '\\u0152',\n") - verbatim(" '\\\\oe' : '\\u0153',\n") - verbatim(" '\\\\AE' : '\\u00C6',\n") - verbatim(" '\\\\ae' : '\\u00E6',\n") - verbatim(" '\\\\<<' : '\\u00AB',\n") - verbatim(" '\\\\>>' : '\\u00BB',\n") - verbatim(" '\\\\ss' : '\\u00DF' \n") - verbatim("}\n") + for command, mapping in sortedhash(characters.tex.commandmapping) do + ctx_verbatim(' "\\\\%s" : "\\u%04X",\n',command,utfbyte(mapping)) + end + -- ctx_verbatim(" '\\\\<<' : '\\u00AB',\n") + -- ctx_verbatim(" '\\\\>>' : '\\u00BB',\n") + ctx_verbatim("}\n") + \stopluasetups % maybe make { } tex braces in javascript code so that we can call lua diff --git a/Master/texmf-dist/tex/context/base/java-ini.lua b/Master/texmf-dist/tex/context/base/java-ini.lua index 67337949465..069eb5ab610 100644 --- a/Master/texmf-dist/tex/context/base/java-ini.lua +++ b/Master/texmf-dist/tex/context/base/java-ini.lua @@ -19,7 +19,7 @@ local variables = interfaces.variables local formatters = string.formatters local context = context -local commands = commands +local implement = interfaces.implement local trace_javascript = false trackers.register("backends.javascript", function(v) trace_javascript = v end) @@ -196,7 +196,13 @@ function javascripts.flushpreambles() return t end -local patterns = { "java-imp-%s.mkiv", "java-imp-%s.tex", "java-%s.mkiv", "java-%s.tex" } +local patterns = { + "java-imp-%s.mkiv", + "java-imp-%s.tex", + -- obsolete: + "java-%s.mkiv", + "java-%s.tex" +} local function action(name,foundname) context.startnointerference() @@ -213,7 +219,7 @@ end function javascripts.usescripts(name) if name ~= variables.reset then -- reset is obsolete - commands.uselibrary { + resolvers.uselibrary { name = name, patterns = patterns, action = action, @@ -225,8 +231,38 @@ end -- interface -commands.storejavascriptcode = interactions.javascripts.storecode -commands.storejavascriptpreamble = interactions.javascripts.storepreamble -commands.addtojavascriptpreamble = interactions.javascripts.addtopreamble -commands.usejavascriptpreamble = interactions.javascripts.usepreamblenow -commands.usejavascriptscripts = interactions.javascripts.usescripts +implement { + name = "storejavascriptcode", + actions = javascripts.storecode, + arguments = "string" +} + +implement { + name = "storejavascriptpreamble", + actions = javascripts.storepreamble, + arguments = "string" +} + +implement { + name = "setjavascriptpreamble", + actions = javascripts.setpreamble, + arguments = { "string", "string" } +} + +implement { + name = "addtojavascriptpreamble", + actions = javascripts.addtopreamble, + arguments = { "string", "string" } +} + +implement { + name = "usejavascriptpreamble", + actions = javascripts.usepreamblenow, + arguments = "string" +} + +implement { + name = "usejavascriptscripts", + actions = javascripts.usescripts, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/java-ini.mkiv b/Master/texmf-dist/tex/context/base/java-ini.mkiv index e4f0bf28b4c..d6fe4dd8a05 100644 --- a/Master/texmf-dist/tex/context/base/java-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/java-ini.mkiv @@ -105,15 +105,17 @@ %D This macro can be used to force inclusion of postponed %D \JAVASCRIPT\ preambles. +\def\m_java_escape_u{\letterbackslash u} + \unexpanded\def\startJScode {\begingroup \obeylualines \obeyluatokens - \def\u{\letterbackslash u}% + \let\u\m_java_escape_u \java_start_code} \def\java_start_code#1\stopJScode - {\normalexpanded{\endgroup\ctxcommand{storejavascriptcode(\!!bs#1\!!es)}}} + {\normalexpanded{\endgroup\clf_storejavascriptcode{#1}}} \let\stopJScode\relax @@ -121,16 +123,16 @@ {\begingroup \obeylualines \obeyluatokens - \def\u{\letterbackslash u}% + \let\u\m_java_escape_u \java_start_preamble} \def\java_start_preamble#1\stopJSpreamble - {\normalexpanded{\endgroup\ctxcommand{storejavascriptpreamble(\!!bs#1\!!es)}}} + {\normalexpanded{\endgroup\clf_storejavascriptpreamble{#1}}} \let\stopJSpreamble\relax -\unexpanded\def\setJSpreamble #1#2{\ctxcommand{storejavascriptpreamble("#1",\!!bs#2\!!es)}} -\unexpanded\def\addtoJSpreamble#1#2{\ctxcommand{addtojavascriptpreamble("#1",\!!bs#2\!!es)}} +\unexpanded\def\setJSpreamble #1#2{\clf_setjavascriptpreamble {#1}{#2}} +\unexpanded\def\addtoJSpreamble#1#2{\clf_addtojavascriptpreamble{#1}{#2}} %D \macros %D {useJSscripts} @@ -147,11 +149,11 @@ %D %D The not so complicated implementation of this macro is: -\def\useJSscripts +\unexpanded\def\useJSscripts {\dodoubleempty\java_use_scripts} \def\java_use_scripts[#1][#2]% - {\ctxcommand{usejavascriptscripts(\!!bs#1\!!es)}% two steps as this one calls tex code - \ctxcommand{usejavascriptpreamble("#2")}} % so this one comes later + {\clf_usejavascriptscripts {#1}% two steps as this one calls tex code + \clf_usejavascriptpreamble{#2}}% so this one comes later \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/l-boolean.lua b/Master/texmf-dist/tex/context/base/l-boolean.lua index 8d11080e7fc..8f18d4c003d 100644 --- a/Master/texmf-dist/tex/context/base/l-boolean.lua +++ b/Master/texmf-dist/tex/context/base/l-boolean.lua @@ -57,11 +57,11 @@ function string.booleanstring(str) end end -function string.is_boolean(str,default) +function string.is_boolean(str,default,strict) if type(str) == "string" then - if str == "true" or str == "yes" or str == "on" or str == "t" or str == "1" then + if str == "true" or str == "yes" or str == "on" or str == "t" or (not strict and str == "1") then return true - elseif str == "false" or str == "no" or str == "off" or str == "f" or str == "0" then + elseif str == "false" or str == "no" or str == "off" or str == "f" or (not strict and str == "0") then return false end end diff --git a/Master/texmf-dist/tex/context/base/l-dir.lua b/Master/texmf-dist/tex/context/base/l-dir.lua index 25721206046..81ac65e506d 100644 --- a/Master/texmf-dist/tex/context/base/l-dir.lua +++ b/Master/texmf-dist/tex/context/base/l-dir.lua @@ -6,10 +6,11 @@ if not modules then modules = { } end modules ['l-dir'] = { license = "see context related readme files" } --- dir.expandname will be merged with cleanpath and collapsepath +-- todo: dir.expandname will be sped up and merged with cleanpath and collapsepath +-- todo: keep track of currentdir (chdir, pushdir, popdir) local type, select = type, select -local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub +local find, gmatch, match, gsub, sub = string.find, string.gmatch, string.match, string.gsub, string.sub local concat, insert, remove, unpack = table.concat, table.insert, table.remove, table.unpack local lpegmatch = lpeg.match @@ -21,8 +22,8 @@ local lfs = lfs local attributes = lfs.attributes local walkdir = lfs.dir -local isdir = lfs.isdir -local isfile = lfs.isfile +local isdir = lfs.isdir -- not robust, will be overloaded anyway +local isfile = lfs.isfile -- not robust, will be overloaded anyway local currentdir = lfs.currentdir local chdir = lfs.chdir local mkdir = lfs.mkdir @@ -31,20 +32,41 @@ local onwindows = os.type == "windows" or find(os.getenv("PATH"),";",1,true) -- in case we load outside luatex -if not isdir then - function isdir(name) - local a = attributes(name) - return a and a.mode == "directory" +if onwindows then + + -- lfs.isdir does not like trailing / + -- lfs.dir accepts trailing / + + local tricky = S("/\\") * P(-1) + + isdir = function(name) + if lpegmatch(tricky,name) then + return attributes(name,"mode") == "directory" + else + return attributes(name.."/.","mode") == "directory" + end + end + + isfile = function(name) + return attributes(name,"mode") == "file" + end + + lfs.isdir = isdir + lfs.isfile = isfile + +else + + isdir = function(name) + return attributes(name,"mode") == "directory" end - lfs.isdir = isdir -end -if not isfile then - function isfile(name) - local a = attributes(name) - return a and a.mode == "file" + isfile = function(name) + return attributes(name,"mode") == "file" end + + lfs.isdir = isdir lfs.isfile = isfile + end -- handy @@ -53,63 +75,104 @@ function dir.current() return (gsub(currentdir(),"\\","/")) end --- optimizing for no find (*) does not save time - ---~ local function globpattern(path,patt,recurse,action) -- fails in recent luatex due to some change in lfs ---~ local ok, scanner ---~ if path == "/" then ---~ ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe ---~ else ---~ ok, scanner = xpcall(function() return walkdir(path) end, function() end) -- kepler safe ---~ end ---~ if ok and type(scanner) == "function" then ---~ if not find(path,"/$") then path = path .. '/' end ---~ for name in scanner do ---~ local full = path .. name ---~ local mode = attributes(full,'mode') ---~ if mode == 'file' then ---~ if find(full,patt) then ---~ action(full) ---~ end ---~ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then ---~ globpattern(full,patt,recurse,action) ---~ end ---~ end ---~ end ---~ end - -local lfsisdir = isdir - -local function isdir(path) - path = gsub(path,"[/\\]+$","") - return lfsisdir(path) -end +-- somewhat optimized -lfs.isdir = isdir +local function glob_pattern_function(path,patt,recurse,action) + if isdir(path) then + local usedpath + if path == "/" then + usedpath = "/." + elseif not find(path,"/$") then + usedpath = path .. "/." + path = path .. "/" + else + usedpath = path + end + local dirs + for name in walkdir(usedpath) do + if name ~= "." and name ~= ".." then + local full = path .. name + local mode = attributes(full,'mode') + if mode == 'file' then + if not patt or find(full,patt) then + action(full) + end + elseif recurse and mode == "directory" then + if not dirs then + dirs = { full } + else + dirs[#dirs+1] = full + end + end + end + end + if dirs then + for i=1,#dirs do + glob_pattern_function(dirs[i],patt,recurse,action) + end + end + end +end -local function globpattern(path,patt,recurse,action) - if path == "/" then - path = path .. "." - elseif not find(path,"/$") then - path = path .. '/' +local function glob_pattern_table(path,patt,recurse,result) + if not result then + result = { } end - if isdir(path) then -- lfs.isdir does not like trailing / - for name in walkdir(path) do -- lfs.dir accepts trailing / - local full = path .. name - local mode = attributes(full,'mode') - if mode == 'file' then - if find(full,patt) then - action(full) + if isdir(path) then + local usedpath + if path == "/" then + usedpath = "/." + elseif not find(path,"/$") then + usedpath = path .. "/." + path = path .. "/" + else + usedpath = path + end + local dirs + for name in walkdir(usedpath) do + if name ~= "." and name ~= ".." then + local full = path .. name + local mode = attributes(full,'mode') + if mode == 'file' then + if not patt or find(full,patt) then + result[#result+1] = full + end + elseif recurse and mode == "directory" then + if not dirs then + dirs = { full } + else + dirs[#dirs+1] = full + end end - elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then - globpattern(full,patt,recurse,action) + end + end + if dirs then + for i=1,#dirs do + glob_pattern_table(dirs[i],patt,recurse,result) end end end + return result +end + +local function globpattern(path,patt,recurse,method) + local kind = type(method) + if patt and sub(patt,1,-3) == path then + patt = false + end + if kind == "function" then + return glob_pattern_function(path,patt,recurse,method) + elseif kind == "table" then + return glob_pattern_table(path,patt,recurse,method) + else + return glob_pattern_table(path,patt,recurse,{ }) + end end dir.globpattern = globpattern +-- never or seldom used so far: + local function collectpattern(path,patt,recurse,result) local ok, scanner result = result or { } @@ -119,18 +182,26 @@ local function collectpattern(path,patt,recurse,result) ok, scanner, first = xpcall(function() return walkdir(path) end, function() end) -- kepler safe end if ok and type(scanner) == "function" then - if not find(path,"/$") then path = path .. '/' end + if not find(path,"/$") then + path = path .. '/' + end for name in scanner, first do - local full = path .. name - local attr = attributes(full) - local mode = attr.mode - if mode == 'file' then - if find(full,patt) then + if name == "." then + -- skip + elseif name == ".." then + -- skip + else + local full = path .. name + local attr = attributes(full) + local mode = attr.mode + if mode == 'file' then + if find(full,patt) then + result[name] = attr + end + elseif recurse and mode == "directory" then + attr.list = collectpattern(full,patt,recurse) result[name] = attr end - elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then - attr.list = collectpattern(full,patt,recurse) - result[name] = attr end end end @@ -139,19 +210,14 @@ end dir.collectpattern = collectpattern -local separator +local separator, pattern if onwindows then -- we could sanitize here --- pattern = Ct { --- [1] = (C(P(".") + S("/\\")^1) + C(R("az","AZ") * P(":") * S("/\\")^0) + Cc("./")) * V(2) * V(3), --- [2] = C(((1-S("*?/\\"))^0 * S("/\\"))^0), --- [3] = C(P(1)^0) --- } - local slash = S("/\\") / "/" - pattern = Ct { +-- pattern = Ct { + pattern = { [1] = (Cs(P(".") + slash^1) + Cs(R("az","AZ") * P(":") * slash^0) + Cc("./")) * V(2) * V(3), [2] = Cs(((1-S("*?/\\"))^0 * slash)^0), [3] = Cs(P(1)^0) @@ -159,7 +225,8 @@ if onwindows then -- we could sanitize here else -- assume unix - pattern = Ct { +-- pattern = Ct { + pattern = { [1] = (C(P(".") + P("/")^1) + Cc("./")) * V(2) * V(3), [2] = C(((1-S("*?/"))^0 * P("/"))^0), [3] = C(P(1)^0) @@ -186,12 +253,11 @@ local function glob(str,t) elseif isfile(str) then t(str) else - local split = lpegmatch(pattern,str) -- we could use the file splitter - if split then - local root, path, base = split[1], split[2], split[3] + local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter + if root and path and base then local recurse = find(base,"**",1,true) -- find(base,"%*%*") - local start = root .. path - local result = lpegmatch(filter,start .. base) + local start = root .. path + local result = lpegmatch(filter,start .. base) globpattern(start,result,recurse,t) end end @@ -210,16 +276,12 @@ local function glob(str,t) return { str } end else - local split = lpegmatch(pattern,str) -- we could use the file splitter - if split then - local t = t or { } - local action = action or function(name) t[#t+1] = name end - local root, path, base = split[1], split[2], split[3] - local recurse = find(base,"**",1,true) -- find(base,"%*%*") - local start = root .. path - local result = lpegmatch(filter,start .. base) - globpattern(start,result,recurse,action) - return t + local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter + if root and path and base then + local recurse = find(base,"**",1,true) -- find(base,"%*%*") + local start = root .. path + local result = lpegmatch(filter,start .. base) + return globpattern(start,result,recurse,t) else return { } end @@ -229,11 +291,20 @@ end dir.glob = glob ---~ list = dir.glob("**/*.tif") ---~ list = dir.glob("/**/*.tif") ---~ list = dir.glob("./**/*.tif") ---~ list = dir.glob("oeps/**/*.tif") ---~ list = dir.glob("/oeps/**/*.tif") +-- local c = os.clock() +-- local t = dir.glob("e:/**") +-- local t = dir.glob("t:/sources/**") +-- local t = dir.glob("t:/**") +-- print(os.clock()-c,#t) + +-- for i=1,3000 do print(t[i]) end +-- for i=1,10 do print(t[i]) end + +-- list = dir.glob("**/*.tif") +-- list = dir.glob("/**/*.tif") +-- list = dir.glob("./**/*.tif") +-- list = dir.glob("oeps/**/*.tif") +-- list = dir.glob("/oeps/**/*.tif") local function globfiles(path,recurse,func,files) -- func == pattern or function if type(func) == "string" then @@ -275,10 +346,10 @@ function dir.ls(pattern) return concat(glob(pattern),"\n") end ---~ mkdirs("temp") ---~ mkdirs("a/b/c") ---~ mkdirs(".","/a/b/c") ---~ mkdirs("a","b","c") +-- mkdirs("temp") +-- mkdirs("a/b/c") +-- mkdirs(".","/a/b/c") +-- mkdirs("a","b","c") local make_indeed = true -- false @@ -347,17 +418,17 @@ if onwindows then return pth, (isdir(pth) == true) end - --~ print(dir.mkdirs("","","a","c")) - --~ print(dir.mkdirs("a")) - --~ print(dir.mkdirs("a:")) - --~ print(dir.mkdirs("a:/b/c")) - --~ print(dir.mkdirs("a:b/c")) - --~ print(dir.mkdirs("a:/bbb/c")) - --~ print(dir.mkdirs("/a/b/c")) - --~ print(dir.mkdirs("/aaa/b/c")) - --~ print(dir.mkdirs("//a/b/c")) - --~ print(dir.mkdirs("///a/b/c")) - --~ print(dir.mkdirs("a/bbb//ccc/")) + -- print(dir.mkdirs("","","a","c")) + -- print(dir.mkdirs("a")) + -- print(dir.mkdirs("a:")) + -- print(dir.mkdirs("a:/b/c")) + -- print(dir.mkdirs("a:b/c")) + -- print(dir.mkdirs("a:/bbb/c")) + -- print(dir.mkdirs("/a/b/c")) + -- print(dir.mkdirs("/aaa/b/c")) + -- print(dir.mkdirs("//a/b/c")) + -- print(dir.mkdirs("///a/b/c")) + -- print(dir.mkdirs("a/bbb//ccc/")) else @@ -408,64 +479,75 @@ else return pth, (isdir(pth) == true) end - --~ print(dir.mkdirs("","","a","c")) - --~ print(dir.mkdirs("a")) - --~ print(dir.mkdirs("/a/b/c")) - --~ print(dir.mkdirs("/aaa/b/c")) - --~ print(dir.mkdirs("//a/b/c")) - --~ print(dir.mkdirs("///a/b/c")) - --~ print(dir.mkdirs("a/bbb//ccc/")) + -- print(dir.mkdirs("","","a","c")) + -- print(dir.mkdirs("a")) + -- print(dir.mkdirs("/a/b/c")) + -- print(dir.mkdirs("/aaa/b/c")) + -- print(dir.mkdirs("//a/b/c")) + -- print(dir.mkdirs("///a/b/c")) + -- print(dir.mkdirs("a/bbb//ccc/")) end dir.makedirs = dir.mkdirs --- we can only define it here as it uses dir.current -if onwindows then +do - function dir.expandname(str) -- will be merged with cleanpath and collapsepath - local first, nothing, last = match(str,"^(//)(//*)(.*)$") - if first then - first = dir.current() .. "/" -- dir.current sanitizes - end - if not first then - first, last = match(str,"^(//)/*(.*)$") - end - if not first then - first, last = match(str,"^([a-zA-Z]:)(.*)$") - if first and not find(last,"^/") then - local d = currentdir() - if chdir(first) then - first = dir.current() + -- we can only define it here as it uses dir.chdir and we also need to + -- make sure we use the non sandboxed variant because otherwise we get + -- into a recursive loop due to usage of expandname in the file resolver + + local chdir = sandbox and sandbox.original(chdir) or chdir + + if onwindows then + + local xcurrentdir = dir.current + + function dir.expandname(str) -- will be merged with cleanpath and collapsepath\ + local first, nothing, last = match(str,"^(//)(//*)(.*)$") + if first then + first = xcurrentdir() .. "/" -- xcurrentdir sanitizes + end + if not first then + first, last = match(str,"^(//)/*(.*)$") + end + if not first then + first, last = match(str,"^([a-zA-Z]:)(.*)$") + if first and not find(last,"^/") then + local d = currentdir() -- push / pop + if chdir(first) then + first = xcurrentdir() -- xcurrentdir sanitizes + end + chdir(d) end - chdir(d) + end + if not first then + first, last = xcurrentdir(), str + end + last = gsub(last,"//","/") + last = gsub(last,"/%./","/") + last = gsub(last,"^/*","") + first = gsub(first,"/*$","") + if last == "" or last == "." then + return first + else + return first .. "/" .. last end end - if not first then - first, last = dir.current(), str - end - last = gsub(last,"//","/") - last = gsub(last,"/%./","/") - last = gsub(last,"^/*","") - first = gsub(first,"/*$","") - if last == "" or last == "." then - return first - else - return first .. "/" .. last - end - end -else + else - function dir.expandname(str) -- will be merged with cleanpath and collapsepath - if not find(str,"^/") then - str = currentdir() .. "/" .. str + function dir.expandname(str) -- will be merged with cleanpath and collapsepath + if not find(str,"^/") then + str = currentdir() .. "/" .. str + end + str = gsub(str,"//","/") + str = gsub(str,"/%./","/") + str = gsub(str,"(.)/%.$","%1") + return str end - str = gsub(str,"//","/") - str = gsub(str,"/%./","/") - str = gsub(str,"(.)/%.$","%1") - return str + end end diff --git a/Master/texmf-dist/tex/context/base/l-file.lua b/Master/texmf-dist/tex/context/base/l-file.lua index ebb2b39f4a2..7ed6370f260 100644 --- a/Master/texmf-dist/tex/context/base/l-file.lua +++ b/Master/texmf-dist/tex/context/base/l-file.lua @@ -15,51 +15,53 @@ if not lfs then lfs = optionalrequire("lfs") end -if not lfs then - - lfs = { - getcurrentdir = function() - return "." - end, - attributes = function() - return nil - end, - isfile = function(name) - local f = io.open(name,'rb') - if f then - f:close() - return true - end - end, - isdir = function(name) - print("you need to load lfs") - return false - end - } - -elseif not lfs.isfile then - - local attributes = lfs.attributes - - function lfs.isdir(name) - return attributes(name,"mode") == "directory" - end - - function lfs.isfile(name) - return attributes(name,"mode") == "file" - end - - -- function lfs.isdir(name) - -- local a = attributes(name) - -- return a and a.mode == "directory" - -- end - - -- function lfs.isfile(name) - -- local a = attributes(name) - -- return a and a.mode == "file" - -- end - -end +-- -- see later +-- +-- if not lfs then +-- +-- lfs = { +-- getcurrentdir = function() +-- return "." +-- end, +-- attributes = function() +-- return nil +-- end, +-- isfile = function(name) +-- local f = io.open(name,'rb') +-- if f then +-- f:close() +-- return true +-- end +-- end, +-- isdir = function(name) +-- print("you need to load lfs") +-- return false +-- end +-- } +-- +-- elseif not lfs.isfile then +-- +-- local attributes = lfs.attributes +-- +-- function lfs.isdir(name) +-- return attributes(name,"mode") == "directory" +-- end +-- +-- function lfs.isfile(name) +-- return attributes(name,"mode") == "file" +-- end +-- +-- -- function lfs.isdir(name) +-- -- local a = attributes(name) +-- -- return a and a.mode == "directory" +-- -- end +-- +-- -- function lfs.isfile(name) +-- -- local a = attributes(name) +-- -- return a and a.mode == "file" +-- -- end +-- +-- end local insert, concat = table.insert, table.concat local match, find, gmatch = string.match, string.find, string.gmatch @@ -72,6 +74,28 @@ local checkedsplit = string.checkedsplit local P, R, S, C, Cs, Cp, Cc, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Ct +-- better this way: + +local tricky = S("/\\") * P(-1) +local attributes = lfs.attributes + +if sandbox then + sandbox.redefine(lfs.isfile,"lfs.isfile") + sandbox.redefine(lfs.isdir, "lfs.isdir") +end + +function lfs.isdir(name) + if lpegmatch(tricky,name) then + return attributes(name,"mode") == "directory" + else + return attributes(name.."/.","mode") == "directory" + end +end + +function lfs.isfile(name) + return attributes(name,"mode") == "file" +end + local colon = P(":") local period = P(".") local periods = P("..") @@ -133,8 +157,8 @@ file.suffix = suffixonly file.suffixesonly = suffixesonly file.suffixes = suffixesonly -file.dirname = pathpart -- obsolete -file.extname = suffixonly -- obsolete +file.dirname = pathpart -- obsolete +file.extname = suffixonly -- obsolete -- actually these are schemes @@ -385,31 +409,90 @@ local deslasher = lpeg.replacer(S("\\/")^1,"/") -- then we still have to deal with urls ... anyhow, multiple // are never a real -- problem but just ugly. -function file.join(...) - local lst = { ... } - local one = lst[1] +-- function file.join(...) +-- local lst = { ... } +-- local one = lst[1] +-- if lpegmatch(isnetwork,one) then +-- local one = lpegmatch(reslasher,one) +-- local two = lpegmatch(deslasher,concat(lst,"/",2)) +-- if lpegmatch(hasroot,two) then +-- return one .. two +-- else +-- return one .. "/" .. two +-- end +-- elseif lpegmatch(isroot,one) then +-- local two = lpegmatch(deslasher,concat(lst,"/",2)) +-- if lpegmatch(hasroot,two) then +-- return two +-- else +-- return "/" .. two +-- end +-- elseif one == "" then +-- return lpegmatch(stripper,concat(lst,"/",2)) +-- else +-- return lpegmatch(deslasher,concat(lst,"/")) +-- end +-- end + +function file.join(one, two, three, ...) + if not two then + return one == "" and one or lpegmatch(stripper,one) + end + if one == "" then + return lpegmatch(stripper,three and concat({ two, three, ... },"/") or two) + end if lpegmatch(isnetwork,one) then local one = lpegmatch(reslasher,one) - local two = lpegmatch(deslasher,concat(lst,"/",2)) + local two = lpegmatch(deslasher,three and concat({ two, three, ... },"/") or two) if lpegmatch(hasroot,two) then return one .. two else return one .. "/" .. two end elseif lpegmatch(isroot,one) then - local two = lpegmatch(deslasher,concat(lst,"/",2)) + local two = lpegmatch(deslasher,three and concat({ two, three, ... },"/") or two) if lpegmatch(hasroot,two) then return two else return "/" .. two end - elseif one == "" then - return lpegmatch(stripper,concat(lst,"/",2)) else - return lpegmatch(deslasher,concat(lst,"/")) + return lpegmatch(deslasher,concat({ one, two, three, ... },"/")) end end +-- or we can use this: +-- +-- function file.join(...) +-- local n = select("#",...) +-- local one = select(1,...) +-- if n == 1 then +-- return one == "" and one or lpegmatch(stripper,one) +-- end +-- if one == "" then +-- return lpegmatch(stripper,n > 2 and concat({ ... },"/",2) or select(2,...)) +-- end +-- if lpegmatch(isnetwork,one) then +-- local one = lpegmatch(reslasher,one) +-- local two = lpegmatch(deslasher,n > 2 and concat({ ... },"/",2) or select(2,...)) +-- if lpegmatch(hasroot,two) then +-- return one .. two +-- else +-- return one .. "/" .. two +-- end +-- elseif lpegmatch(isroot,one) then +-- local two = lpegmatch(deslasher,n > 2 and concat({ ... },"/",2) or select(2,...)) +-- if lpegmatch(hasroot,two) then +-- return two +-- else +-- return "/" .. two +-- end +-- else +-- return lpegmatch(deslasher,concat({ ... },"/")) +-- end +-- end + +-- print(file.join("c:/whatever")) -- print(file.join("c:/whatever","name")) -- print(file.join("//","/y")) -- print(file.join("/","/y")) diff --git a/Master/texmf-dist/tex/context/base/l-io.lua b/Master/texmf-dist/tex/context/base/l-io.lua index 020e811bf09..a91d44d8776 100644 --- a/Master/texmf-dist/tex/context/base/l-io.lua +++ b/Master/texmf-dist/tex/context/base/l-io.lua @@ -339,11 +339,6 @@ function io.readstring(f,n,m) return str end --- - -if not io.i_limiter then function io.i_limiter() end end -- dummy so we can test safely -if not io.o_limiter then function io.o_limiter() end end -- dummy so we can test safely - -- This works quite ok: -- -- function io.piped(command,writer) diff --git a/Master/texmf-dist/tex/context/base/l-lpeg.lua b/Master/texmf-dist/tex/context/base/l-lpeg.lua index 666af210386..4aadadb727c 100644 --- a/Master/texmf-dist/tex/context/base/l-lpeg.lua +++ b/Master/texmf-dist/tex/context/base/l-lpeg.lua @@ -145,6 +145,9 @@ patterns.utfbom_8 = utfbom_8 patterns.utf_16_be_nl = P("\000\r\000\n") + P("\000\r") + P("\000\n") -- P("\000\r") * (P("\000\n") + P(true)) + P("\000\n") patterns.utf_16_le_nl = P("\r\000\n\000") + P("\r\000") + P("\n\000") -- P("\r\000") * (P("\n\000") + P(true)) + P("\n\000") +patterns.utf_32_be_nl = P("\000\000\000\r\000\000\000\n") + P("\000\000\000\r") + P("\000\000\000\n") +patterns.utf_32_le_nl = P("\r\000\000\000\n\000\000\000") + P("\r\000\000\000") + P("\n\000\000\000") + patterns.utf8one = R("\000\127") patterns.utf8two = R("\194\223") * utf8next patterns.utf8three = R("\224\239") * utf8next * utf8next @@ -183,10 +186,26 @@ local fullstripper = whitespace^0 * C((whitespace^0 * nonwhitespace^1)^0) ----- collapser = Cs(spacer^0/"" * ((spacer^1 * endofstring / "") + (spacer^1/" ") + P(1))^0) local collapser = Cs(spacer^0/"" * nonspacer^0 * ((spacer^0/" " * nonspacer^1)^0)) +local b_collapser = Cs( whitespace^0 /"" * (nonwhitespace^1 + whitespace^1/" ")^0) +local e_collapser = Cs((whitespace^1 * P(-1)/"" + nonwhitespace^1 + whitespace^1/" ")^0) +local m_collapser = Cs( (nonwhitespace^1 + whitespace^1/" ")^0) + +local b_stripper = Cs( spacer^0 /"" * (nonspacer^1 + spacer^1/" ")^0) +local e_stripper = Cs((spacer^1 * P(-1)/"" + nonspacer^1 + spacer^1/" ")^0) +local m_stripper = Cs( (nonspacer^1 + spacer^1/" ")^0) + patterns.stripper = stripper patterns.fullstripper = fullstripper patterns.collapser = collapser +patterns.b_collapser = b_collapser +patterns.m_collapser = m_collapser +patterns.e_collapser = e_collapser + +patterns.b_stripper = b_stripper +patterns.m_stripper = m_stripper +patterns.e_stripper = e_stripper + patterns.lowercase = lowercase patterns.uppercase = uppercase patterns.letter = patterns.lowercase + patterns.uppercase @@ -225,9 +244,12 @@ patterns.integer = sign^-1 * digit^1 patterns.unsigned = digit^0 * period * digit^1 patterns.float = sign^-1 * patterns.unsigned patterns.cunsigned = digit^0 * comma * digit^1 +patterns.cpunsigned = digit^0 * (period + comma) * digit^1 patterns.cfloat = sign^-1 * patterns.cunsigned +patterns.cpfloat = sign^-1 * patterns.cpunsigned patterns.number = patterns.float + patterns.integer patterns.cnumber = patterns.cfloat + patterns.integer +patterns.cpnumber = patterns.cpfloat + patterns.integer patterns.oct = zero * octdigit^1 patterns.octal = patterns.oct patterns.HEX = zero * P("X") * (digit+uppercase)^1 @@ -496,7 +518,6 @@ function lpeg.finder(lst,makefunction,isutf) -- beware: slower than find with 'p pattern = P(lst) end if isutf then --- pattern = ((utf8char or 1)-pattern)^0 * pattern pattern = ((utf8char or 1)-pattern)^0 * pattern else pattern = (1-pattern)^0 * pattern @@ -813,23 +834,48 @@ end -- experiment: +local p_false = P(false) +local p_true = P(true) + local function make(t) - local p + local function making(t) + local p = p_false + local keys = sortedkeys(t) +-- local okay = t[""] + for i=1,#keys do + local k = keys[i] + if k ~= "" then + local v = t[k] + if v == true then + p = p + P(k) * p_true + elseif v == false then + -- can't happen +-- elseif okay then +-- p = p + P(k) * (making(v) + p_true) + else + p = p + P(k) * making(v) + end + end + end + if t[""] then + p = p + p_true + end + return p + end + local p = p_false local keys = sortedkeys(t) for i=1,#keys do local k = keys[i] - local v = t[k] - if not p then - if next(v) then - p = P(k) * make(v) + if k ~= "" then + local v = t[k] + if v == true then + p = p + P(k) * p_true + elseif v == false then + -- can't happen +-- elseif v[""] then +-- p = p + P(k) * (making(v) + p_true) else - p = P(k) - end - else - if next(v) then - p = p + P(k) * make(v) - else - p = p + P(k) + p = p + P(k) * making(v) end end end @@ -838,19 +884,109 @@ end function lpeg.utfchartabletopattern(list) -- goes to util-lpg local tree = { } - for i=1,#list do - local t = tree - for c in gmatch(list[i],".") do - if not t[c] then - t[c] = { } + local n = #list + if n == 0 then + for s in next, list do + local t = tree + local p, pk + for c in gmatch(s,".") do + if t == true then + t = { [c] = true, [""] = true } + p[pk] = t + p = t + t = false + elseif t == false then + t = { [c] = false } + p[pk] = t + p = t + t = false + else + local tc = t[c] + if not tc then + tc = false + t[c] = false + end + p = t + t = tc + end + pk = c + end + if t == false then + p[pk] = true + elseif t == true then + -- okay + else + t[""] = true + end + end + else + for i=1,n do + local s = list[i] + local t = tree + local p, pk + for c in gmatch(s,".") do + if t == true then + t = { [c] = true, [""] = true } + p[pk] = t + p = t + t = false + elseif t == false then + t = { [c] = false } + p[pk] = t + p = t + t = false + else + local tc = t[c] + if not tc then + tc = false + t[c] = false + end + p = t + t = tc + end + pk = c + end + if t == false then + p[pk] = true + elseif t == true then + -- okay + else + t[""] = true end - t = t[c] end end +-- inspect(tree) return make(tree) end --- inspect ( lpeg.utfchartabletopattern { +-- local t = { "a", "abc", "ac", "abe", "abxyz", "xy", "bef","aa" } +-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/string.upper + 1)^1) + +-- inspect(lpegmatch(p,"a")) +-- inspect(lpegmatch(p,"aa")) +-- inspect(lpegmatch(p,"aaaa")) +-- inspect(lpegmatch(p,"ac")) +-- inspect(lpegmatch(p,"bc")) +-- inspect(lpegmatch(p,"zzbczz")) +-- inspect(lpegmatch(p,"zzabezz")) +-- inspect(lpegmatch(p,"ab")) +-- inspect(lpegmatch(p,"abc")) +-- inspect(lpegmatch(p,"abe")) +-- inspect(lpegmatch(p,"xa")) +-- inspect(lpegmatch(p,"bx")) +-- inspect(lpegmatch(p,"bax")) +-- inspect(lpegmatch(p,"abxyz")) +-- inspect(lpegmatch(p,"foobarbefcrap")) + +-- local t = { ["^"] = 1, ["^^"] = 2, ["^^^"] = 3, ["^^^^"] = 4 } +-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/t + 1)^1) +-- inspect(lpegmatch(p," ^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^ ")) + +-- local t = { ["^^"] = 2, ["^^^"] = 3, ["^^^^"] = 4 } +-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/t + 1)^1) +-- inspect(lpegmatch(p," ^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^ ")) + +-- lpeg.utfchartabletopattern { -- utfchar(0x00A0), -- nbsp -- utfchar(0x2000), -- enquad -- utfchar(0x2001), -- emquad @@ -866,7 +1002,7 @@ end -- utfchar(0x200B), -- zerowidthspace -- utfchar(0x202F), -- narrownobreakspace -- utfchar(0x205F), -- math thinspace --- } ) +-- } -- a few handy ones: -- @@ -935,3 +1071,75 @@ lpeg.patterns.stripzeros = stripper -- lpegmatch(stripper,str) -- print(#str, os.clock()-ts, lpegmatch(stripper,sample)) +-- for practical reasone we keep this here: + +local byte_to_HEX = { } +local byte_to_hex = { } +local byte_to_dec = { } -- for md5 +local hex_to_byte = { } + +for i=0,255 do + local H = format("%02X",i) + local h = format("%02x",i) + local d = format("%03i",i) + local c = char(i) + byte_to_HEX[c] = H + byte_to_hex[c] = h + byte_to_dec[c] = d + hex_to_byte[h] = c + hex_to_byte[H] = c +end + +local hextobyte = P(2)/hex_to_byte +local bytetoHEX = P(1)/byte_to_HEX +local bytetohex = P(1)/byte_to_hex +local bytetodec = P(1)/byte_to_dec +local hextobytes = Cs(hextobyte^0) +local bytestoHEX = Cs(bytetoHEX^0) +local bytestohex = Cs(bytetohex^0) +local bytestodec = Cs(bytetodec^0) + +patterns.hextobyte = hextobyte +patterns.bytetoHEX = bytetoHEX +patterns.bytetohex = bytetohex +patterns.bytetodec = bytetodec +patterns.hextobytes = hextobytes +patterns.bytestoHEX = bytestoHEX +patterns.bytestohex = bytestohex +patterns.bytestodec = bytestodec + +function string.toHEX(s) + if not s or s == "" then + return s + else + return lpegmatch(bytestoHEX,s) + end +end + +function string.tohex(s) + if not s or s == "" then + return s + else + return lpegmatch(bytestohex,s) + end +end + +function string.todec(s) + if not s or s == "" then + return s + else + return lpegmatch(bytestodec,s) + end +end + +function string.tobytes(s) + if not s or s == "" then + return s + else + return lpegmatch(hextobytes,s) + end +end + +-- local h = "ADFE0345" +-- local b = lpegmatch(patterns.hextobytes,h) +-- print(h,b,string.tohex(b),string.toHEX(b)) diff --git a/Master/texmf-dist/tex/context/base/l-lua.lua b/Master/texmf-dist/tex/context/base/l-lua.lua index 9565f484a2a..1a2a9872364 100644 --- a/Master/texmf-dist/tex/context/base/l-lua.lua +++ b/Master/texmf-dist/tex/context/base/l-lua.lua @@ -165,3 +165,14 @@ end if lua then lua.mask = load([[τεχ = 1]]) and "utf" or "ascii" end + +local flush = io.flush + +if flush then + + local execute = os.execute if execute then function os.execute(...) flush() return execute(...) end end + local exec = os.exec if exec then function os.exec (...) flush() return exec (...) end end + local spawn = os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end + local popen = io.popen if popen then function io.popen (...) flush() return popen (...) end end + +end diff --git a/Master/texmf-dist/tex/context/base/l-math.lua b/Master/texmf-dist/tex/context/base/l-math.lua index 43f60b56bee..ec62919b46a 100644 --- a/Master/texmf-dist/tex/context/base/l-math.lua +++ b/Master/texmf-dist/tex/context/base/l-math.lua @@ -8,6 +8,10 @@ if not modules then modules = { } end modules ['l-math'] = { local floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan +if not math.ceiling then + math.ceiling = math.ceil +end + if not math.round then function math.round(x) return floor(x + 0.5) end end diff --git a/Master/texmf-dist/tex/context/base/l-md5.lua b/Master/texmf-dist/tex/context/base/l-md5.lua index 8ac20a5a5fb..00272c873f1 100644 --- a/Master/texmf-dist/tex/context/base/l-md5.lua +++ b/Master/texmf-dist/tex/context/base/l-md5.lua @@ -19,48 +19,38 @@ if not md5 then end local md5, file = md5, file -local gsub, format, byte = string.gsub, string.format, string.byte -local md5sum = md5.sum +local gsub = string.gsub -local function convert(str,fmt) - return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end)) -end - -if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end -if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end -if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end - --- local P, Cs, lpegmatch = lpeg.P, lpeg.Cs,lpeg.match --- --- if not md5.HEX then --- local function remap(chr) return format("%02X",byte(chr)) end --- function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end --- end +-- local gsub, format, byte = string.gsub, string.format, string.byte -- --- if not md5.hex then --- local function remap(chr) return format("%02x",byte(chr)) end --- function md5.hex(str) return (gsub(md5.sum(str),".",remap)) end +-- local function convert(str,fmt) +-- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end)) -- end -- --- if not md5.dec then --- local function remap(chr) return format("%03i",byte(chr)) end --- function md5.dec(str) return (gsub(md5.sum(str),".",remap)) end --- end +-- if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end +-- if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end +-- if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end --- if not md5.HEX then --- local pattern_HEX = Cs( ( P(1) / function(chr) return format("%02X",byte(chr)) end)^0 ) --- function md5.HEX(str) return lpegmatch(pattern_HEX,md5.sum(str)) end --- end --- --- if not md5.hex then --- local pattern_hex = Cs( ( P(1) / function(chr) return format("%02x",byte(chr)) end)^0 ) --- function md5.hex(str) return lpegmatch(pattern_hex,md5.sum(str)) end --- end --- --- if not md5.dec then --- local pattern_dec = Cs( ( P(1) / function(chr) return format("%02i",byte(chr)) end)^0 ) --- function md5.dec(str) return lpegmatch(pattern_dec,md5.sum(str)) end --- end +do + + local patterns = lpeg and lpeg.patterns + + if patterns then + + local bytestoHEX = patterns.bytestoHEX + local bytestohex = patterns.bytestohex + local bytestodec = patterns.bytestodec + + local lpegmatch = lpeg.match + local md5sum = md5.sum + + if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end + if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end + if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end + + end + +end function file.needsupdating(oldname,newname,threshold) -- size modification access change local oldtime = lfs.attributes(oldname,"modification") diff --git a/Master/texmf-dist/tex/context/base/l-os.lua b/Master/texmf-dist/tex/context/base/l-os.lua index 1dff79cd3f3..f44b31662aa 100644 --- a/Master/texmf-dist/tex/context/base/l-os.lua +++ b/Master/texmf-dist/tex/context/base/l-os.lua @@ -25,8 +25,6 @@ if not modules then modules = { } end modules ['l-os'] = { -- os.sleep() => socket.sleep() -- math.randomseed(tonumber(string.sub(string.reverse(tostring(math.floor(socket.gettime()*10000))),1,6))) --- maybe build io.flush in os.execute - local os = os local date, time = os.date, os.time local find, format, gsub, upper, gmatch = string.find, string.format, string.gsub, string.upper, string.gmatch @@ -118,15 +116,11 @@ end -- end of environment hack -local execute, spawn, exec, iopopen, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.popen, io.flush - -function os.execute(...) ioflush() return execute(...) end -function os.spawn (...) ioflush() return spawn (...) end -function os.exec (...) ioflush() return exec (...) end -function io.popen (...) ioflush() return iopopen(...) end +local execute = os.execute +local iopopen = io.popen function os.resultof(command) - local handle = io.popen(command,"r") + local handle = iopopen(command,"r") -- already has flush if handle then local result = handle:read("*all") or "" handle:close() @@ -160,7 +154,7 @@ local launchers = { } function os.launch(str) - os.execute(format(launchers[os.name] or launchers.unix,str)) + execute(format(launchers[os.name] or launchers.unix,str)) end if not os.times then -- ? diff --git a/Master/texmf-dist/tex/context/base/l-sandbox.lua b/Master/texmf-dist/tex/context/base/l-sandbox.lua new file mode 100644 index 00000000000..f7901379cd7 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/l-sandbox.lua @@ -0,0 +1,271 @@ +if not modules then modules = { } end modules ['l-sandbox'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- We use string instead of function variables, so 'io.open' instead of io.open. That +-- way we can still intercept repetetive overloads. One complication is that when we use +-- sandboxed function sin helpers in the sanbox checkers, we can get a recursion loop +-- so for that vreason we need to keep originals around till we enable the sandbox. + +-- if sandbox then return end + +local global = _G +local next = next +local unpack = unpack or table.unpack +local type = type +local tprint = texio.write_nl or print +local tostring = tostring +local format = string.format -- no formatters yet +local concat = table.concat +local sort = table.sort +local gmatch = string.gmatch + +sandbox = { } +local sandboxed = false +local overloads = { } +local skiploads = { } +local initializers = { } +local finalizers = { } +local originals = { } +local comments = { } +local trace = false +local logger = false + +-- this comes real early, so that we can still alias + +local function report(...) + tprint("sandbox ! " .. format(...)) -- poor mans tracer +end + +sandbox.report = report + +function sandbox.setreporter(r) + report = r + sandbox.report = r +end + +function sandbox.settrace(v) + trace = v +end + +function sandbox.setlogger(l) + logger = type(l) == "function" and l or false +end + +local function register(func,overload,comment) + if type(func) == "function" then + if type(overload) == "string" then + comment = overload + overload = nil + end + local function f(...) + if sandboxed then + local overload = overloads[f] + if overload then + if logger then + local result = { overload(func,...) } + logger { + comment = comments[f] or tostring(f), + arguments = { ... }, + result = result[1] and true or false, + } + return unpack(result) + else + return overload(func,...) + end + else + -- ignored, maybe message + end + else + return func(...) + end + end + if comment then + comments[f] = comment + if trace then + report("registering function: %s",comment) + end + end + overloads[f] = overload or false + originals[f] = func + return f + end +end + +local function redefine(func,comment) + if type(func) == "function" then + skiploads[func] = comment or comments[func] or "unknown" + if overloads[func] == false then + overloads[func] = nil -- not initialized anyway + end + end +end + +sandbox.register = register +sandbox.redefine = redefine + +function sandbox.original(func) + return originals and originals[func] or func +end + +function sandbox.overload(func,overload,comment) + comment = comment or comments[func] or "?" + if type(func) ~= "function" then + if trace then + report("overloading unknown function: %s",comment) + end + elseif type(overload) ~= "function" then + if trace then + report("overloading function with bad overload: %s",comment) + end + elseif overloads[func] == nil then + if trace then + report("function is not registered: %s",comment) + end + elseif skiploads[func] then + if trace then + report("function is not skipped: %s",comment) + end + else + if trace then + report("overloading function: %s",comment) + end + overloads[func] = overload + end + return func +end + +function sandbox.initializer(f) + if not sandboxed then + initializers[#initializers+1] = f + elseif trace then + report("already enabled, discarding initializer") + end +end + +function sandbox.finalizer(f) + if not sandboxed then + finalizers[#finalizers+1] = f + elseif trace then + report("already enabled, discarding finalizer") + end +end + +function sandbox.enable() + if not sandboxed then + for i=1,#initializers do + initializers[i]() + end + for i=1,#finalizers do + finalizers[i]() + end + local nnot = 0 + local nyes = 0 + local cnot = { } + local cyes = { } + local skip = { } + for k, v in next, overloads do + local c = comments[k] + if v then + if c then + cyes[#cyes+1] = c + else -- if not skiploads[k] then + nyes = nyes + 1 + end + else + if c then + cnot[#cnot+1] = c + else -- if not skiploads[k] then + nnot = nnot + 1 + end + end + end + for k, v in next, skiploads do + skip[#skip+1] = v + end + if #cyes > 0 then + sort(cyes) + report(" overloaded known : %s",concat(cyes," | ")) + end + if nyes > 0 then + report(" overloaded unknown : %s",nyes) + end + if #cnot > 0 then + sort(cnot) + report("not overloaded known : %s",concat(cnot," | ")) + end + if nnot > 0 then + report("not overloaded unknown : %s",nnot) + end + if #skip > 0 then + sort(skip) + report("not overloaded redefined : %s",concat(skip," | ")) + end + initializers = nil + finalizers = nil + originals = nil + sandboxed = true + end +end + +-- we sandbox some of the built-in functions now: + +-- todo: require +-- todo: load + +local function supported(library) + local l = _G[library] + -- if l then + -- for k, v in next, l do + -- report("%s.%s",library,k) + -- end + -- end + return l +end + +-- io.tmpfile : we don't know where that one ends up but probably is user temp space +-- os.tmpname : no need to deal with this: outputs rubish anyway (\s9v0. \s9v0.1 \s9v0.2 etc) +-- os.tmpdir : not needed either (luatex.vob000 luatex.vob000 etc) + +-- os.setenv : maybe +-- require : maybe (normally taken from tree) +-- http etc : maybe (all schemes that go outside) + +loadfile = register(loadfile,"loadfile") + +if supported("io") then + io.open = register(io.open, "io.open") + io.popen = register(io.popen, "io.popen") -- needs checking + io.lines = register(io.lines, "io.lines") + io.output = register(io.output, "io.output") + io.input = register(io.input, "io.input") +end + +if supported("os") then + os.execute = register(os.execute, "os.execute") + os.spawn = register(os.spawn, "os.spawn") + os.exec = register(os.exec, "os.exec") + os.rename = register(os.rename, "os.rename") + os.remove = register(os.remove, "os.remove") +end + +if supported("lfs") then + lfs.chdir = register(lfs.chdir, "lfs.chdir") + lfs.mkdir = register(lfs.mkdir, "lfs.mkdir") + lfs.rmdir = register(lfs.rmdir, "lfs.rmdir") + lfs.isfile = register(lfs.isfile, "lfs.isfile") + lfs.isdir = register(lfs.isdir, "lfs.isdir") + lfs.attributes = register(lfs.attributes, "lfs.attributes") + lfs.dir = register(lfs.dir, "lfs.dir") + lfs.lock_dir = register(lfs.lock_dir, "lfs.lock_dir") + lfs.touch = register(lfs.touch, "lfs.touch") + lfs.link = register(lfs.link, "lfs.link") + lfs.setmode = register(lfs.setmode, "lfs.setmode") + lfs.readlink = register(lfs.readlink, "lfs.readlink") + lfs.shortname = register(lfs.shortname, "lfs.shortname") + lfs.symlinkattributes = register(lfs.symlinkattributes,"lfs.symlinkattributes") +end diff --git a/Master/texmf-dist/tex/context/base/l-string.lua b/Master/texmf-dist/tex/context/base/l-string.lua index 3b1a0003ff9..70c66f66169 100644 --- a/Master/texmf-dist/tex/context/base/l-string.lua +++ b/Master/texmf-dist/tex/context/base/l-string.lua @@ -94,7 +94,7 @@ end -- return not find(str,"%S") -- end -local pattern = P(" ")^0 * P(-1) +local pattern = P(" ")^0 * P(-1) -- maybe also newlines -- patterns.onlyspaces = pattern diff --git a/Master/texmf-dist/tex/context/base/l-table.lua b/Master/texmf-dist/tex/context/base/l-table.lua index d231830eddc..97e0441eb09 100644 --- a/Master/texmf-dist/tex/context/base/l-table.lua +++ b/Master/texmf-dist/tex/context/base/l-table.lua @@ -49,12 +49,22 @@ function table.keys(t) end end +-- local function compare(a,b) +-- local ta, tb = type(a), type(b) -- needed, else 11 < 2 +-- if ta == tb then +-- return a < b +-- else +-- return tostring(a) < tostring(b) -- not that efficient +-- end +-- end + local function compare(a,b) - local ta, tb = type(a), type(b) -- needed, else 11 < 2 - if ta == tb then + local ta = type(a) -- needed, else 11 < 2 + local tb = type(b) -- needed, else 11 < 2 + if ta == tb and ta == "number" then return a < b else - return tostring(a) < tostring(b) + return tostring(a) < tostring(b) -- not that efficient end end @@ -164,14 +174,14 @@ local function sortedhash(t,cmp) end local n = 0 local m = #s - local function kv(s) + local function kv() -- (s) if n < m then n = n + 1 local k = s[n] return k, t[k] end end - return kv, s + return kv -- , s else return nothing end @@ -400,7 +410,7 @@ local function simple_table(t) if tv == "number" then nt = nt + 1 if hexify then - tt[nt] = format("0x%04X",v) + tt[nt] = format("0x%X",v) else tt[nt] = tostring(v) -- tostring not needed end @@ -451,7 +461,7 @@ local function do_serialize(root,name,depth,level,indexed) local tn = type(name) if tn == "number" then if hexify then - handle(format("%s[0x%04X]={",depth,name)) + handle(format("%s[0x%X]={",depth,name)) else handle(format("%s[%s]={",depth,name)) end @@ -469,7 +479,7 @@ local function do_serialize(root,name,depth,level,indexed) end end -- we could check for k (index) being number (cardinal) - if root and next(root) then + if root and next(root) ~= nil then -- local first, last = nil, 0 -- #root cannot be trusted here (will be ok in 5.2 when ipairs is gone) -- if compact then -- -- NOT: for k=1,#root do (we need to quit at nil) @@ -502,7 +512,7 @@ local function do_serialize(root,name,depth,level,indexed) if compact and first and tk == "number" and k >= first and k <= last then if tv == "number" then if hexify then - handle(format("%s 0x%04X,",depth,v)) + handle(format("%s 0x%X,",depth,v)) else handle(format("%s %s,",depth,v)) -- %.99g end @@ -513,7 +523,7 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s %q,",depth,v)) end elseif tv == "table" then - if not next(v) then + if next(v) == nil then handle(format("%s {},",depth)) elseif inline then -- and #t > 0 local st = simple_table(v) @@ -543,25 +553,25 @@ local function do_serialize(root,name,depth,level,indexed) elseif tv == "number" then if tk == "number" then if hexify then - handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) + handle(format("%s [0x%X]=0x%X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end elseif tk == "boolean" then if hexify then - handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v)) + handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v)) else handle(format("%s [%s]=%s,",depth,k and "true" or "false",v)) -- %.99g end elseif noquotes and not reserved[k] and lpegmatch(propername,k) then if hexify then - handle(format("%s %s=0x%04X,",depth,k,v)) + handle(format("%s %s=0x%X,",depth,k,v)) else handle(format("%s %s=%s,",depth,k,v)) -- %.99g end else if hexify then - handle(format("%s [%q]=0x%04X,",depth,k,v)) + handle(format("%s [%q]=0x%X,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g end @@ -570,7 +580,7 @@ local function do_serialize(root,name,depth,level,indexed) if reduce and tonumber(v) then if tk == "number" then if hexify then - handle(format("%s [0x%04X]=%s,",depth,k,v)) + handle(format("%s [0x%X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end @@ -584,7 +594,7 @@ local function do_serialize(root,name,depth,level,indexed) else if tk == "number" then if hexify then - handle(format("%s [0x%04X]=%q,",depth,k,v)) + handle(format("%s [0x%X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end @@ -597,10 +607,10 @@ local function do_serialize(root,name,depth,level,indexed) end end elseif tv == "table" then - if not next(v) then + if next(v) == nil then if tk == "number" then if hexify then - handle(format("%s [0x%04X]={},",depth,k)) + handle(format("%s [0x%X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end @@ -616,7 +626,7 @@ local function do_serialize(root,name,depth,level,indexed) if st then if tk == "number" then if hexify then - handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) + handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end @@ -636,7 +646,7 @@ local function do_serialize(root,name,depth,level,indexed) elseif tv == "boolean" then if tk == "number" then if hexify then - handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false")) + handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false")) else handle(format("%s [%s]=%s,",depth,k,v and "true" or "false")) end @@ -653,7 +663,7 @@ local function do_serialize(root,name,depth,level,indexed) -- local f = getinfo(v).what == "C" and dump(function(...) return v(...) end) or dump(v) -- maybe strip if tk == "number" then if hexify then - handle(format("%s [0x%04X]=load(%q),",depth,k,f)) + handle(format("%s [0x%X]=load(%q),",depth,k,f)) else handle(format("%s [%s]=load(%q),",depth,k,f)) end @@ -668,7 +678,7 @@ local function do_serialize(root,name,depth,level,indexed) else if tk == "number" then if hexify then - handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) + handle(format("%s [0x%X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end @@ -683,7 +693,7 @@ local function do_serialize(root,name,depth,level,indexed) --~ end end end - if level > 0 then + if level > 0 then handle(format("%s},",depth)) end end @@ -727,7 +737,7 @@ local function serialize(_handle,root,name,specification) -- handle wins end elseif tname == "number" then if hexify then - handle(format("[0x%04X]={",name)) + handle(format("[0x%X]={",name)) else handle("[" .. name .. "]={") end @@ -748,7 +758,7 @@ local function serialize(_handle,root,name,specification) -- handle wins root._w_h_a_t_e_v_e_r_ = nil end -- Let's forget about empty tables. - if next(root) then + if next(root) ~= nil then do_serialize(root,name,"",0) end end @@ -922,16 +932,27 @@ end table.identical = identical table.are_equal = are_equal --- maybe also make a combined one - -function table.compact(t) -- remove empty tables, assumes subtables - if t then - for k, v in next, t do - if not next(v) then -- no type checking - t[k] = nil +local function sparse(old,nest,keeptables) + local new = { } + for k, v in next, old do + if not (v == "" or v == false) then + if nest and type(v) == "table" then + v = sparse(v,nest) + if keeptables or next(v) ~= nil then + new[k] = v + end + else + new[k] = v end end end + return new +end + +table.sparse = sparse + +function table.compact(t) + return sparse(t,true,true) end function table.contains(t, v) @@ -1055,11 +1076,11 @@ end -- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice) function table.is_empty(t) - return not t or not next(t) + return not t or next(t) == nil end function table.has_one_entry(t) - return t and not next(t,next(t)) + return t and next(t,next(t)) == nil end -- new @@ -1114,3 +1135,49 @@ function table.values(t,s) -- optional sort flag return { } end end + +-- maybe this will move to util-tab.lua + +-- for k, v in table.filtered(t,pattern) do ... end +-- for k, v in table.filtered(t,pattern,true) do ... end +-- for k, v in table.filtered(t,pattern,true,cmp) do ... end + +function table.filtered(t,pattern,sort,cmp) + if t and type(pattern) == "string" then + if sort then + local s + if cmp then + -- it would be nice if the sort function would accept a third argument (or nicer, an optional first) + s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end) + else + s = sortedkeys(t) -- the robust one + end + local n = 0 + local m = #s + local function kv(s) + while n < m do + n = n + 1 + local k = s[n] + if find(k,pattern) then + return k, t[k] + end + end + end + return kv, s + else + local n = next(t) + local function iterator() + while n ~= nil do + local k = n + n = next(t,k) + if find(k,pattern) then + return k, t[k] + end + end + end + return iterator, t + end + else + return nothing + end +end diff --git a/Master/texmf-dist/tex/context/base/l-unicode.lua b/Master/texmf-dist/tex/context/base/l-unicode.lua index be61f3d73cb..02dd1a00304 100644 --- a/Master/texmf-dist/tex/context/base/l-unicode.lua +++ b/Master/texmf-dist/tex/context/base/l-unicode.lua @@ -34,20 +34,23 @@ local type = type local char, byte, format, sub, gmatch = string.char, string.byte, string.format, string.sub, string.gmatch local concat = table.concat local P, C, R, Cs, Ct, Cmt, Cc, Carg, Cp = lpeg.P, lpeg.C, lpeg.R, lpeg.Cs, lpeg.Ct, lpeg.Cmt, lpeg.Cc, lpeg.Carg, lpeg.Cp -local lpegmatch, patterns = lpeg.match, lpeg.patterns -local bytepairs = string.bytepairs +local lpegmatch = lpeg.match +local patterns = lpeg.patterns +local tabletopattern = lpeg.utfchartabletopattern -local finder = lpeg.finder -local replacer = lpeg.replacer +local bytepairs = string.bytepairs -local utfvalues = utf.values -local utfgmatch = utf.gmatch -- not always present +local finder = lpeg.finder +local replacer = lpeg.replacer + +local utfvalues = utf.values +local utfgmatch = utf.gmatch -- not always present local p_utftype = patterns.utftype local p_utfstricttype = patterns.utfstricttype local p_utfoffset = patterns.utfoffset -local p_utf8char = patterns.utf8char +local p_utf8char = patterns.utf8character local p_utf8byte = patterns.utf8byte local p_utfbom = patterns.utfbom local p_newline = patterns.newline @@ -510,22 +513,70 @@ end -- a replacement for simple gsubs: -function utf.remapper(mapping) - local pattern = Cs((p_utf8char/mapping)^0) - return function(str) - if not str or str == "" then - return "" +-- function utf.remapper(mapping) +-- local pattern = Cs((p_utf8char/mapping)^0) +-- return function(str) +-- if not str or str == "" then +-- return "" +-- else +-- return lpegmatch(pattern,str) +-- end +-- end, pattern +-- end + +function utf.remapper(mapping,option) -- static also returns a pattern + local variant = type(mapping) + if variant == "table" then + if option == "dynamic" then + local pattern = false + table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern = false end) + return function(str) + if not str or str == "" then + return "" + else + if not pattern then + pattern = Cs((tabletopattern(mapping)/mapping + p_utf8char)^0) + end + return lpegmatch(pattern,str) + end + end + elseif option == "pattern" then + return Cs((tabletopattern(mapping)/mapping + p_utf8char)^0) + -- elseif option == "static" then else - return lpegmatch(pattern,str) + local pattern = Cs((tabletopattern(mapping)/mapping + p_utf8char)^0) + return function(str) + if not str or str == "" then + return "" + else + return lpegmatch(pattern,str) + end + end, pattern + end + elseif variant == "function" then + if option == "pattern" then + return Cs((p_utf8char/mapping + p_utf8char)^0) + else + local pattern = Cs((p_utf8char/mapping + p_utf8char)^0) + return function(str) + if not str or str == "" then + return "" + else + return lpegmatch(pattern,str) + end + end, pattern + end + else + -- is actually an error + return function(str) + return str or "" end - end, pattern + end end -- local remap = utf.remapper { a = 'd', b = "c", c = "b", d = "a" } -- print(remap("abcd 1234 abcd")) --- - function utf.replacer(t) -- no precheck, always string builder local r = replacer(t,false,false,true) return function(str) @@ -631,285 +682,359 @@ end local utf16_to_utf8_be, utf16_to_utf8_le local utf32_to_utf8_be, utf32_to_utf8_le -local utf_16_be_linesplitter = patterns.utfbom_16_be^-1 * lpeg.tsplitat(patterns.utf_16_be_nl) -local utf_16_le_linesplitter = patterns.utfbom_16_le^-1 * lpeg.tsplitat(patterns.utf_16_le_nl) +local utf_16_be_getbom = patterns.utfbom_16_be^-1 +local utf_16_le_getbom = patterns.utfbom_16_le^-1 +local utf_32_be_getbom = patterns.utfbom_32_be^-1 +local utf_32_le_getbom = patterns.utfbom_32_le^-1 + +local utf_16_be_linesplitter = utf_16_be_getbom * lpeg.tsplitat(patterns.utf_16_be_nl) +local utf_16_le_linesplitter = utf_16_le_getbom * lpeg.tsplitat(patterns.utf_16_le_nl) +local utf_32_be_linesplitter = utf_32_be_getbom * lpeg.tsplitat(patterns.utf_32_be_nl) +local utf_32_le_linesplitter = utf_32_le_getbom * lpeg.tsplitat(patterns.utf_32_le_nl) + +-- we have three possibilities: bytepairs (using tables), gmatch (using tables), gsub and +-- lpeg. Bytepairs are the fastert but as soon as we need to remove bombs and so the gain +-- is less due to more testing. Also, we seldom have to convert utf16 so we don't care to +-- much about a few milliseconds more runtime. The lpeg variant is upto 20% slower but +-- still pretty fast. +-- +-- for historic resone we keep the bytepairs variants around .. beware they don't grab the +-- bom like the lpegs do so they're not dropins in the functions that follow +-- +-- utf16_to_utf8_be = function(s) +-- if not s then +-- return nil +-- elseif s == "" then +-- return "" +-- end +-- local result, r, more = { }, 0, 0 +-- for left, right in bytepairs(s) do +-- if right then +-- local now = 256*left + right +-- if more > 0 then +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- more = 0 +-- r = r + 1 +-- result[r] = utfchar(now) +-- elseif now >= 0xD800 and now <= 0xDBFF then +-- more = now +-- else +-- r = r + 1 +-- result[r] = utfchar(now) +-- end +-- end +-- end +-- return concat(result) +-- end +-- +-- local utf16_to_utf8_be_t = function(t) +-- if not t then +-- return nil +-- elseif type(t) == "string" then +-- t = lpegmatch(utf_16_be_linesplitter,t) +-- end +-- local result = { } -- we reuse result +-- for i=1,#t do +-- local s = t[i] +-- if s ~= "" then +-- local r, more = 0, 0 +-- for left, right in bytepairs(s) do +-- if right then +-- local now = 256*left + right +-- if more > 0 then +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- more = 0 +-- r = r + 1 +-- result[r] = utfchar(now) +-- elseif now >= 0xD800 and now <= 0xDBFF then +-- more = now +-- else +-- r = r + 1 +-- result[r] = utfchar(now) +-- end +-- end +-- end +-- t[i] = concat(result,"",1,r) -- we reused tmp, hence t +-- end +-- end +-- return t +-- end +-- +-- utf16_to_utf8_le = function(s) +-- if not s then +-- return nil +-- elseif s == "" then +-- return "" +-- end +-- local result, r, more = { }, 0, 0 +-- for left, right in bytepairs(s) do +-- if right then +-- local now = 256*right + left +-- if more > 0 then +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- more = 0 +-- r = r + 1 +-- result[r] = utfchar(now) +-- elseif now >= 0xD800 and now <= 0xDBFF then +-- more = now +-- else +-- r = r + 1 +-- result[r] = utfchar(now) +-- end +-- end +-- end +-- return concat(result) +-- end +-- +-- local utf16_to_utf8_le_t = function(t) +-- if not t then +-- return nil +-- elseif type(t) == "string" then +-- t = lpegmatch(utf_16_le_linesplitter,t) +-- end +-- local result = { } -- we reuse result +-- for i=1,#t do +-- local s = t[i] +-- if s ~= "" then +-- local r, more = 0, 0 +-- for left, right in bytepairs(s) do +-- if right then +-- local now = 256*right + left +-- if more > 0 then +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- more = 0 +-- r = r + 1 +-- result[r] = utfchar(now) +-- elseif now >= 0xD800 and now <= 0xDBFF then +-- more = now +-- else +-- r = r + 1 +-- result[r] = utfchar(now) +-- end +-- end +-- end +-- t[i] = concat(result,"",1,r) -- we reused tmp, hence t +-- end +-- end +-- return t +-- end +-- +-- local utf32_to_utf8_be_t = function(t) +-- if not t then +-- return nil +-- elseif type(t) == "string" then +-- t = lpegmatch(utflinesplitter,t) +-- end +-- local result = { } -- we reuse result +-- for i=1,#t do +-- local r, more = 0, -1 +-- for a,b in bytepairs(t[i]) do +-- if a and b then +-- if more < 0 then +-- more = 256*256*256*a + 256*256*b +-- else +-- r = r + 1 +-- result[t] = utfchar(more + 256*a + b) +-- more = -1 +-- end +-- else +-- break +-- end +-- end +-- t[i] = concat(result,"",1,r) +-- end +-- return t +-- end +-- +-- local utf32_to_utf8_le_t = function(t) +-- if not t then +-- return nil +-- elseif type(t) == "string" then +-- t = lpegmatch(utflinesplitter,t) +-- end +-- local result = { } -- we reuse result +-- for i=1,#t do +-- local r, more = 0, -1 +-- for a,b in bytepairs(t[i]) do +-- if a and b then +-- if more < 0 then +-- more = 256*b + a +-- else +-- r = r + 1 +-- result[t] = utfchar(more + 256*256*256*b + 256*256*a) +-- more = -1 +-- end +-- else +-- break +-- end +-- end +-- t[i] = concat(result,"",1,r) +-- end +-- return t +-- end --- we have three possibilities: +local more = 0 + +local p_utf16_to_utf8_be = C(1) * C(1) /function(left,right) + local now = 256*byte(left) + byte(right) + if more > 0 then + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + more = 0 + return utfchar(now) + elseif now >= 0xD800 and now <= 0xDBFF then + more = now + return "" -- else the c's end up in the stream + else + return utfchar(now) + end +end --- bytepairs: 0.048 --- gmatch : 0.069 --- lpeg : 0.089 (match time captures) +local p_utf16_to_utf8_le = C(1) * C(1) /function(right,left) + local now = 256*byte(left) + byte(right) + if more > 0 then + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + more = 0 + return utfchar(now) + elseif now >= 0xD800 and now <= 0xDBFF then + more = now + return "" -- else the c's end up in the stream + else + return utfchar(now) + end +end +local p_utf32_to_utf8_be = C(1) * C(1) * C(1) * C(1) /function(a,b,c,d) + return utfchar(256*256*256*byte(a) + 256*256*byte(b) + 256*byte(c) + byte(d)) +end -if bytepairs then +local p_utf32_to_utf8_le = C(1) * C(1) * C(1) * C(1) /function(a,b,c,d) + return utfchar(256*256*256*byte(d) + 256*256*byte(c) + 256*byte(b) + byte(a)) +end - -- with a little bit more code we could include the linesplitter +p_utf16_to_utf8_be = P(true) / function() more = 0 end * utf_16_be_getbom * Cs(p_utf16_to_utf8_be^0) +p_utf16_to_utf8_le = P(true) / function() more = 0 end * utf_16_le_getbom * Cs(p_utf16_to_utf8_le^0) +p_utf32_to_utf8_be = P(true) / function() more = 0 end * utf_32_be_getbom * Cs(p_utf32_to_utf8_be^0) +p_utf32_to_utf8_le = P(true) / function() more = 0 end * utf_32_le_getbom * Cs(p_utf32_to_utf8_le^0) - utf16_to_utf8_be = function(t) - if type(t) == "string" then - t = lpegmatch(utf_16_be_linesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, 0 - for left, right in bytepairs(t[i]) do - if right then - local now = 256*left + right - if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - more = 0 - r = r + 1 - result[r] = utfchar(now) - elseif now >= 0xD800 and now <= 0xDBFF then - more = now - else - r = r + 1 - result[r] = utfchar(now) - end - end - end - t[i] = concat(result,"",1,r) -- we reused tmp, hence t - end - return t +patterns.utf16_to_utf8_be = p_utf16_to_utf8_be +patterns.utf16_to_utf8_le = p_utf16_to_utf8_le +patterns.utf32_to_utf8_be = p_utf32_to_utf8_be +patterns.utf32_to_utf8_le = p_utf32_to_utf8_le + +utf16_to_utf8_be = function(s) + if s and s ~= "" then + return lpegmatch(p_utf16_to_utf8_be,s) + else + return s end +end - utf16_to_utf8_le = function(t) - if type(t) == "string" then - t = lpegmatch(utf_16_le_linesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, 0 - for left, right in bytepairs(t[i]) do - if right then - local now = 256*right + left - if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - more = 0 - r = r + 1 - result[r] = utfchar(now) - elseif now >= 0xD800 and now <= 0xDBFF then - more = now - else - r = r + 1 - result[r] = utfchar(now) - end - end - end - t[i] = concat(result,"",1,r) -- we reused tmp, hence t +local utf16_to_utf8_be_t = function(t) + if not t then + return nil + elseif type(t) == "string" then + t = lpegmatch(utf_16_be_linesplitter,t) + end + for i=1,#t do + local s = t[i] + if s ~= "" then + t[i] = lpegmatch(p_utf16_to_utf8_be,s) end - return t end + return t +end - utf32_to_utf8_be = function(t) - if type(t) == "string" then - t = lpegmatch(utflinesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, -1 - for a,b in bytepairs(t[i]) do - if a and b then - if more < 0 then - more = 256*256*256*a + 256*256*b - else - r = r + 1 - result[t] = utfchar(more + 256*a + b) - more = -1 - end - else - break - end - end - t[i] = concat(result,"",1,r) - end - return t +utf16_to_utf8_le = function(s) + if s and s ~= "" then + return lpegmatch(p_utf16_to_utf8_le,s) + else + return s end +end - utf32_to_utf8_le = function(t) - if type(t) == "string" then - t = lpegmatch(utflinesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, -1 - for a,b in bytepairs(t[i]) do - if a and b then - if more < 0 then - more = 256*b + a - else - r = r + 1 - result[t] = utfchar(more + 256*256*256*b + 256*256*a) - more = -1 - end - else - break - end - end - t[i] = concat(result,"",1,r) +local utf16_to_utf8_le_t = function(t) + if not t then + return nil + elseif type(t) == "string" then + t = lpegmatch(utf_16_le_linesplitter,t) + end + for i=1,#t do + local s = t[i] + if s ~= "" then + t[i] = lpegmatch(p_utf16_to_utf8_le,s) end - return t end + return t +end -else - - utf16_to_utf8_be = function(t) - if type(t) == "string" then - t = lpegmatch(utf_16_be_linesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, 0 - for left, right in gmatch(t[i],"(.)(.)") do - if left == "\000" then -- experiment - r = r + 1 - result[r] = utfchar(byte(right)) - elseif right then - local now = 256*byte(left) + byte(right) - if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - more = 0 - r = r + 1 - result[r] = utfchar(now) - elseif now >= 0xD800 and now <= 0xDBFF then - more = now - else - r = r + 1 - result[r] = utfchar(now) - end - end - end - t[i] = concat(result,"",1,r) -- we reused tmp, hence t - end - return t +utf32_to_utf8_be = function(s) + if s and s ~= "" then + return lpegmatch(p_utf32_to_utf8_be,s) + else + return s end +end - utf16_to_utf8_le = function(t) - if type(t) == "string" then - t = lpegmatch(utf_16_le_linesplitter,t) - end - local result = { } -- we reuse result - for i=1,#t do - local r, more = 0, 0 - for left, right in gmatch(t[i],"(.)(.)") do - if right == "\000" then - r = r + 1 - result[r] = utfchar(byte(left)) - elseif right then - local now = 256*byte(right) + byte(left) - if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - more = 0 - r = r + 1 - result[r] = utfchar(now) - elseif now >= 0xD800 and now <= 0xDBFF then - more = now - else - r = r + 1 - result[r] = utfchar(now) - end - end - end - t[i] = concat(result,"",1,r) -- we reused tmp, hence t +local utf32_to_utf8_be_t = function(t) + if not t then + return nil + elseif type(t) == "string" then + t = lpegmatch(utf_32_be_linesplitter,t) + end + for i=1,#t do + local s = t[i] + if s ~= "" then + t[i] = lpegmatch(p_utf32_to_utf8_be,s) end - return t end + return t +end - utf32_to_utf8_le = function() return { } end -- never used anyway - utf32_to_utf8_be = function() return { } end -- never used anyway - - -- the next one is slighty slower - - -- local result, lines, r, more = { }, { }, 0, 0 - -- - -- local simple = Cmt( - -- C(1) * C(1), function(str,p,left,right) - -- local now = 256*byte(left) + byte(right) - -- if more > 0 then - -- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - -- more = 0 - -- r = r + 1 - -- result[r] = utfchar(now) - -- elseif now >= 0xD800 and now <= 0xDBFF then - -- more = now - -- else - -- r = r + 1 - -- result[r] = utfchar(now) - -- end - -- return p - -- end - -- ) - -- - -- local complex = Cmt( - -- C(1) * C(1), function(str,p,left,right) - -- local now = 256*byte(left) + byte(right) - -- if more > 0 then - -- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong - -- more = 0 - -- r = r + 1 - -- result[r] = utfchar(now) - -- elseif now >= 0xD800 and now <= 0xDBFF then - -- more = now - -- else - -- r = r + 1 - -- result[r] = utfchar(now) - -- end - -- return p - -- end - -- ) - -- - -- local lineend = Cmt ( - -- patterns.utf_16_be_nl, function(str,p) - -- lines[#lines+1] = concat(result,"",1,r) - -- r, more = 0, 0 - -- return p - -- end - -- ) - -- - -- local be_1 = patterns.utfbom_16_be^-1 * (simple + complex)^0 - -- local be_2 = patterns.utfbom_16_be^-1 * (lineend + simple + complex)^0 - -- - -- utf16_to_utf8_be = function(t) - -- if type(t) == "string" then - -- local s = t - -- lines, r, more = { }, 0, 0 - -- lpegmatch(be_2,s) - -- if r > 0 then - -- lines[#lines+1] = concat(result,"",1,r) - -- end - -- result = { } - -- return lines - -- else - -- for i=1,#t do - -- r, more = 0, 0 - -- lpegmatch(be_1,t[i]) - -- t[i] = concat(result,"",1,r) - -- end - -- result = { } - -- return t - -- end - -- end +utf32_to_utf8_le = function(s) + if s and s ~= "" then + return lpegmatch(p_utf32_to_utf8_le,s) + else + return s + end +end +local utf32_to_utf8_le_t = function(t) + if not t then + return nil + elseif type(t) == "string" then + t = lpegmatch(utf_32_le_linesplitter,t) + end + for i=1,#t do + local s = t[i] + if s ~= "" then + t[i] = lpegmatch(p_utf32_to_utf8_le,s) + end + end + return t end -utf.utf16_to_utf8_le = utf16_to_utf8_le -utf.utf16_to_utf8_be = utf16_to_utf8_be -utf.utf32_to_utf8_le = utf32_to_utf8_le -utf.utf32_to_utf8_be = utf32_to_utf8_be +utf.utf16_to_utf8_le_t = utf16_to_utf8_le_t +utf.utf16_to_utf8_be_t = utf16_to_utf8_be_t +utf.utf32_to_utf8_le_t = utf32_to_utf8_le_t +utf.utf32_to_utf8_be_t = utf32_to_utf8_be_t -function utf.utf8_to_utf8(t) +utf.utf16_to_utf8_le = utf16_to_utf8_le +utf.utf16_to_utf8_be = utf16_to_utf8_be +utf.utf32_to_utf8_le = utf32_to_utf8_le +utf.utf32_to_utf8_be = utf32_to_utf8_be + +function utf.utf8_to_utf8_t(t) return type(t) == "string" and lpegmatch(utflinesplitter,t) or t end -function utf.utf16_to_utf8(t,endian) - return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t +function utf.utf16_to_utf8_t(t,endian) + return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t end -function utf.utf32_to_utf8(t,endian) - return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t +function utf.utf32_to_utf8_t(t,endian) + return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t end -local function little(c) - local b = byte(c) +local function little(b) if b < 0x10000 then return char(b%256,b/256) else @@ -919,8 +1044,7 @@ local function little(c) end end -local function big(c) - local b = byte(c) +local function big(b) if b < 0x10000 then return char(b/256,b%256) else @@ -930,18 +1054,10 @@ local function big(c) end end --- function utf.utf8_to_utf16(str,littleendian) --- if littleendian then --- return char(255,254) .. utfgsub(str,".",little) --- else --- return char(254,255) .. utfgsub(str,".",big) --- end --- end - -local _, l_remap = utf.remapper(little) -local _, b_remap = utf.remapper(big) +local l_remap = Cs((p_utf8byte/little+P(1)/"")^0) +local b_remap = Cs((p_utf8byte/big +P(1)/"")^0) -function utf.utf8_to_utf16_be(str,nobom) +local function utf8_to_utf16_be(str,nobom) if nobom then return lpegmatch(b_remap,str) else @@ -949,7 +1065,7 @@ function utf.utf8_to_utf16_be(str,nobom) end end -function utf.utf8_to_utf16_le(str,nobom) +local function utf8_to_utf16_le(str,nobom) if nobom then return lpegmatch(l_remap,str) else @@ -957,11 +1073,14 @@ function utf.utf8_to_utf16_le(str,nobom) end end +utf.utf8_to_utf16_be = utf8_to_utf16_be +utf.utf8_to_utf16_le = utf8_to_utf16_le + function utf.utf8_to_utf16(str,littleendian,nobom) if littleendian then - return utf.utf8_to_utf16_le(str,nobom) + return utf8_to_utf16_le(str,nobom) else - return utf.utf8_to_utf16_be(str,nobom) + return utf8_to_utf16_be(str,nobom) end end @@ -992,16 +1111,16 @@ function utf.xstring(s) end function utf.toeight(str) - if not str then + if not str or str == "" then return nil end local utftype = lpegmatch(p_utfstricttype,str) if utftype == "utf-8" then - return sub(str,4) - elseif utftype == "utf-16-le" then - return utf16_to_utf8_le(str) + return sub(str,4) -- remove the bom elseif utftype == "utf-16-be" then - return utf16_to_utf8_ne(str) + return utf16_to_utf8_be(str) -- bom gets removed + elseif utftype == "utf-16-le" then + return utf16_to_utf8_le(str) -- bom gets removed else return str end diff --git a/Master/texmf-dist/tex/context/base/l-url.lua b/Master/texmf-dist/tex/context/base/l-url.lua index 7bb73125493..b189ec5bba8 100644 --- a/Master/texmf-dist/tex/context/base/l-url.lua +++ b/Master/texmf-dist/tex/context/base/l-url.lua @@ -145,19 +145,25 @@ local splitquery = Cf ( Ct("") * P { "sequence", -- hasher local function hashed(str) -- not yet ok (/test?test) - if str == "" then + if not str or str == "" then return { scheme = "invalid", original = str, } end - local s = split(str) - local rawscheme = s[1] - local rawquery = s[4] - local somescheme = rawscheme ~= "" - local somequery = rawquery ~= "" + local detailed = split(str) + local rawscheme = "" + local rawquery = "" + local somescheme = false + local somequery = false + if detailed then + rawscheme = detailed[1] + rawquery = detailed[4] + somescheme = rawscheme ~= "" + somequery = rawquery ~= "" + end if not somescheme and not somequery then - s = { + return { scheme = "file", authority = "", path = str, @@ -167,30 +173,33 @@ local function hashed(str) -- not yet ok (/test?test) noscheme = true, filename = str, } - else -- not always a filename but handy anyway - local authority, path, filename = s[2], s[3] - if authority == "" then - filename = path - elseif path == "" then - filename = "" - else - filename = authority .. "/" .. path - end - s = { - scheme = rawscheme, - authority = authority, - path = path, - query = lpegmatch(unescaper,rawquery), -- unescaped, but possible conflict with & and = - queries = lpegmatch(splitquery,rawquery), -- split first and then unescaped - fragment = s[5], - original = str, - noscheme = false, - filename = filename, - } end - return s + -- not always a filename but handy anyway + local authority = detailed[2] + local path = detailed[3] + local filename = nil + if authority == "" then + filename = path + elseif path == "" then + filename = "" + else + filename = authority .. "/" .. path + end + return { + scheme = rawscheme, + authority = authority, + path = path, + query = lpegmatch(unescaper,rawquery), -- unescaped, but possible conflict with & and = + queries = lpegmatch(splitquery,rawquery), -- split first and then unescaped + fragment = detailed[5], + original = str, + noscheme = false, + filename = filename, + } end +-- inspect(hashed()) +-- inspect(hashed("")) -- inspect(hashed("template:///test")) -- inspect(hashed("template:///test++.whatever")) -- inspect(hashed("template:///test%2B%2B.whatever")) @@ -247,7 +256,7 @@ function url.construct(hash) -- dodo: we need to escape ! return lpegmatch(escaper,concat(fullurl)) end -local pattern = Cs(noslash * R("az","AZ") * (S(":|")/":") * noslash * P(1)^0) +local pattern = Cs(slash^-1/"" * R("az","AZ") * ((S(":|")/":") + P(":")) * slash * P(1)^0) function url.filename(filename) local spec = hashed(filename) @@ -257,6 +266,7 @@ end -- print(url.filename("/c|/test")) -- print(url.filename("/c/test")) +-- print(url.filename("file:///t:/sources/cow.svg")) local function escapestring(str) return lpegmatch(escaper,str) diff --git a/Master/texmf-dist/tex/context/base/lang-def.mkiv b/Master/texmf-dist/tex/context/base/lang-def.mkiv index 5c1d6de9cbf..c2fb9640cd6 100644 --- a/Master/texmf-dist/tex/context/base/lang-def.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-def.mkiv @@ -271,37 +271,6 @@ \installlanguage [\s!slovenian] [\s!sl] \installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?) -\def\doconvertsloveniancharacters{\dodoconvertcharacters{25}} - -\def\sloveniancharacters{\doconvertsloveniancharacters\sloveniancharacter} -\def\slovenianCharacters{\doconvertsloveniancharacters\slovenianCharacter} - -%D Define general-purpose macros for Slovenian character enumerations: - -\defineconversion [sloveniancharacter] [\sloveniancharacter] -\defineconversion [slovenianCharacter] [\slovenianCharacter] - -\defineconversion [sloveniancharacters] [\sloveniancharacters] -\defineconversion [slovenianCharacters] [\slovenianCharacters] - -%D Define these as the general character enumeration when -%D language is Slovenian. If you feel uncomfortable with this, -%D mail Mojca, since she promised to to take the heat. - -\defineconversion [\s!sl] [character] [\sloveniancharacter] -\defineconversion [\s!sl] [Character] [\slovenianCharacter] - -\defineconversion [\s!sl] [characters] [\sloveniancharacters] -\defineconversion [\s!sl] [Characters] [\slovenianCharacters] - -\defineconversion [\s!sl] [a] [\sloveniancharacters] -\defineconversion [\s!sl] [A] [\slovenianCharacters] -\defineconversion [\s!sl] [AK] [\smallcapped\sloveniancharacters] -\defineconversion [\s!sl] [KA] [\smallcapped\sloveniancharacters] - -\def\sloveniancharacters#1{\ctxcommand{alphabetic(\number#1,"sl")}} -\def\slovenianCharacters#1{\ctxcommand{Alphabetic(\number#1,"sl")}} - % Cyrillic Languages \installlanguage @@ -510,7 +479,8 @@ \c!rightquote=’, \c!leftquotation=“, \c!rightquotation=”, - \c!date={서기,\v!year,년,\v!month,월,\v!day,일}] + % \c!date={서기,\space,\v!year,\labeltext{\v!year},\space,\v!month,\labeltext{\v!month},\space,\v!day,\labeltext{\v!day}}] + \c!date={\v!year,\labeltext{\v!year},\space,\v!month,\labeltext{\v!month},\space,\v!day,\labeltext{\v!day}}] % Greek diff --git a/Master/texmf-dist/tex/context/base/lang-dis.lua b/Master/texmf-dist/tex/context/base/lang-dis.lua new file mode 100644 index 00000000000..db19a0fc5b8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/lang-dis.lua @@ -0,0 +1,203 @@ +if not modules then modules = { } end modules ['lang-dis'] = { + version = 1.001, + comment = "companion to lang-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local concat = table.concat + +local nodes = nodes + +local tasks = nodes.tasks +local nuts = nodes.nuts +local nodepool = nuts.pool + +local tonode = nuts.tonode +local tonut = nuts.tonut + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getfont = nuts.getfont +local getattr = nuts.getattr +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local copy_node = nuts.copy +local free_node = nuts.free +local remove_node = nuts.remove +local traverse_id = nuts.traverse_id +local traverse_nodes = nuts.traverse + +local nodecodes = nodes.nodecodes +local disccodes = nodes.disccodes + +local disc_code = nodecodes.disc +local glyph_code = nodecodes.glyph +local discretionary_code = disccodes.discretionary + +local a_visualize = attributes.private("visualizediscretionary") +local setattribute = tex.setattribute + +local getlanguagedata = languages.getdata + +local expanders = { + [disccodes.discretionary] = function(d,template) + -- \discretionary + return template + end, + [disccodes.explicit] = function(d,template) + -- \- + local pre = getfield(d,"pre") + if pre and getid(pre) == glyph_code and getchar(pre) <= 0 then + setfield(d,"pre",nil) + end + local post = getfield(d,"post") + if post and getid(post) == glyph_code and getchar(post) <= 0 then + setfield(d,"post",nil) + end +-- setfield(d,"subtype",discretionary_code) -- to be checked + return template + end, + [disccodes.automatic] = function(d,template) + -- following a - : the pre and post chars are already appended and set + -- so we have pre=preex and post=postex .. however, the previous + -- hyphen is already injected ... downside: the font handler sees this + -- so this is another argument for doing a hyphenation pass in context + if getfield(d,"pre") then + -- we have a preex characters and want that one to replace the + -- character in front which is the trigger + if not template then + -- can there be font kerns already? + template = getprev(d) + if template and getid(template) ~= glyph_code then + template = getnext(d) + if template and getid(template) ~= glyph_code then + template = nil + end + end + end + if template then + local pseudohead = getprev(template) + if pseudohead then + while template ~= d do + pseudohead, template, removed = remove_node(pseudohead,template) + setfield(d,"replace",removed) + -- break ? + end + else + -- can't happen + end + setfield(d,"subtype",discretionary_code) + else + -- print("lone regular discretionary ignored") + end + end + return template + end, + [disccodes.regular] = function(d,template) + -- simple + if not template then + -- can there be font kerns already? + template = getprev(d) + if template and getid(template) ~= glyph_code then + template = getnext(d) + if template and getid(template) ~= glyph_code then + template = nil + end + end + end + if template then + local language = template and getfield(template,"lang") + local data = getlanguagedata(language) + local prechar = data.prehyphenchar + local postchar = data.posthyphenchar + if prechar and prechar > 0 then + local c = copy_node(template) + setfield(c,"char",prechar) + setfield(d,"pre",c) + end + if postchar and postchar > 0 then + local c = copy_node(template) + setfield(c,"char",postchar) + setfield(d,"post",c) + end + setfield(d,"subtype",discretionary_code) + else + -- print("lone regular discretionary ignored") + end + return template + end, + [disccodes.first] = function() + -- forget about them + end, + [disccodes.second] = function() + -- forget about them + end, +} + +languages.expanders = expanders + +function languages.expand(d,template,subtype) + if not subtype then + subtype = getsubtype(d) + end + if subtype ~= discretionary_code then + return expanders[subtype](d,template) + end +end + +local setlistcolor = nodes.tracers.colors.setlist + +function languages.visualizediscretionaries(head) + for d in traverse_id(disc_code,tonut(head)) do + if getattr(d,a_visualize) then + local pre = getfield(d,"pre") + local post = getfield(d,"post") + local replace = getfield(d,"replace") + if pre then + setlistcolor(pre,"darkred") + end + if post then + setlistcolor(post,"darkgreen") + end + if replace then + setlistcolor(replace,"darkblue") + end + end + end +end + +local enabled = false + +function languages.showdiscretionaries(v) + if v == false then + setattribute(a_visualize,unsetvalue) + else -- also nil + if not enabled then + nodes.tasks.enableaction("processors","languages.visualizediscretionaries") + enabled = true + end + setattribute(a_visualize,1) + end +end + +interfaces.implement { + name = "showdiscretionaries", + actions = languages.showdiscretionaries +} + +local toutf = nodes.listtoutf + +function languages.serializediscretionary(d) -- will move to tracer + return string.formatters["{%s}{%s}{%s}"]( + toutf(getfield(d,"pre")) or "", + toutf(getfield(d,"post")) or "", + toutf(getfield(d,"replace")) or "" + ) +end + diff --git a/Master/texmf-dist/tex/context/base/lang-hyp.lua b/Master/texmf-dist/tex/context/base/lang-hyp.lua new file mode 100644 index 00000000000..496cfd19b43 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/lang-hyp.lua @@ -0,0 +1,1648 @@ +if not modules then modules = { } end modules ['lang-hyp'] = { + version = 1.001, + comment = "companion to lang-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- todo: hyphenate over range if needed + +-- to be considered: reset dictionary.hyphenated when a pattern is added +-- or maybe an explicit reset of the cache + +-- In an automated workflow hypenation of long titles can be somewhat problematic +-- especially when demands conflict. For that reason I played a bit with a Lua based +-- variant of the traditional hyphenation machinery. This mechanism has been extended +-- several times in projects, of which a good description can be found in TUGboat, +-- Volume 27 (2006), No. 2 — Proceedings of EuroTEX2006: Automatic non-standard +-- hyphenation in OpenOffice.org by László Németh. +-- +-- Being the result of two days experimenting the following implementation is probably +-- not completely okay yet. If there is demand I might add some more features and plugs. +-- The performance is quite okay but can probably improved a bit, although this is not +-- the most critital code. +-- +-- . a l g o r i t h m . +-- 4l1g4 +-- l g o3 +-- 1g o +-- 2i t h +-- 4h1m +-- --------------------- +-- 4 1 4 3 2 0 4 1 +-- a l-g o-r i t h-m + +-- . a s s z o n n y a l . +-- s1s z/sz=sz,1,3 +-- n1n y/ny=ny,1,3 +-- ----------------------- +-- 0 1 0 0 0 1 0 0 0/sz=sz,2,3,ny=ny,6,3 +-- a s-s z o n-n y a l/sz=sz,2,3,ny=ny,6,3 +-- +-- ab1cd/ef=gh,2,2 : acd - efd (pattern/replacement,start,length +-- +-- In the procecess of wrapping up (for the ctx conference proceedings) I cleaned up +-- and extended the code a bit. + +local type, rawset, tonumber, next = type, rawset, tonumber, next + +local P, R, S, Cg, Cf, Ct, Cc, C, Carg, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cf, lpeg.Ct, lpeg.Cc, lpeg.C, lpeg.Carg, lpeg.Cs +local lpegmatch = lpeg.match + +local concat = table.concat +local insert = table.insert +local remove = table.remove +local formatters = string.formatters +local utfchar = utf.char +local utfbyte = utf.byte + +if not characters then + require("char-ini") +end + +local setmetatableindex = table.setmetatableindex + +-- \enabletrackers[hyphenator.steps=silent] will not write to the terminal + +local trace_steps = false trackers.register("hyphenator.steps", function(v) trace_steps = v end) +local trace_visualize = false trackers.register("hyphenator.visualize",function(v) trace_visualize = v end) + +local report = logs.reporter("hyphenator") + +local implement = interfaces and interfaces.implement or function() end + +languages = languages or { } +local hyphenators = languages.hyphenators or { } +languages.hyphenators = hyphenators +local traditional = hyphenators.traditional or { } +hyphenators.traditional = traditional + +local dictionaries = setmetatableindex(function(t,k) + local v = { + patterns = { }, + hyphenated = { }, + specials = { }, + exceptions = { }, + loaded = false, + } + t[k] = v + return v +end) + +hyphenators.dictionaries = dictionaries + +local character = lpeg.patterns.utf8character +local digit = R("09") +local weight = digit/tonumber + Cc(0) +local fence = P(".") +local hyphen = P("-") +local space = P(" ") +local char = character - space +local validcharacter = (character - S("./")) +local keycharacter = character - S("/") +----- basepart = Ct( (Cc(0) * fence)^-1 * (weight * validcharacter)^1 * weight * (fence * Cc(0))^-1) +local specpart = (P("/") * Cf ( Ct("") * + Cg ( Cc("before") * C((1-P("="))^1) * P("=") ) * + Cg ( Cc("after") * C((1-P(","))^1) ) * + ( P(",") * + Cg ( Cc("start") * ((1-P(","))^1/tonumber) * P(",") ) * + Cg ( Cc("length") * ((1-P(-1) )^1/tonumber) ) + )^-1 + , rawset))^-1 + +local make_hashkey_p = Cs((digit/"" + keycharacter)^1) +----- make_pattern_p = basepart * specpart +local make_hashkey_e = Cs((hyphen/"" + keycharacter)^1) +local make_pattern_e = Ct(P(char) * (hyphen * Cc(true) * P(char) + P(char) * Cc(false))^1) -- catch . and char after - + +-- local make_hashkey_c = Cs((digit + keycharacter/"")^1) +-- local make_pattern_c = Ct((P(1)/tonumber)^1) + +-- local cache = setmetatableindex(function(t,k) +-- local n = lpegmatch(make_hashkey_c,k) +-- local v = lpegmatch(make_pattern_c,n) +-- t[k] = v +-- return v +-- end) +-- +-- local weight_n = digit + Cc("0") +-- local basepart_n = Cs( (Cc("0") * fence)^-1 * (weight * validcharacter)^1 * weight * (fence * Cc("0"))^-1) / cache +-- local make_pattern_n = basepart_n * specpart + +local make_pattern_c = Ct((P(1)/tonumber)^1) + +-- us + nl: 17664 entries -> 827 unique (saves some 3M) + +local cache = setmetatableindex(function(t,k) + local v = lpegmatch(make_pattern_c,k) + t[k] = v + return v +end) + +local weight_n = digit + Cc("0") +local fence_n = fence / "0" +local char_n = validcharacter / "" +local basepart_n = Cs(fence_n^-1 * (weight_n * char_n)^1 * weight_n * fence_n^-1) / cache +local make_pattern_n = basepart_n * specpart + +local function register_pattern(patterns,specials,str,specification) + local k = lpegmatch(make_hashkey_p,str) + -- local v1, v2 = lpegmatch(make_pattern_p,str) + local v1, v2 = lpegmatch(make_pattern_n,str) + patterns[k] = v1 -- is this key still ok for complex patterns + if specification then + specials[k] = specification + elseif v2 then + specials[k] = v2 + end +end + +local function unregister_pattern(patterns,specials,str) + local k = lpegmatch(make_hashkey_p,str) + patterns[k] = nil + specials[k] = nil +end + +local p_lower = lpeg.patterns.utf8lower + +local function register_exception(exceptions,str,specification) + local l = lpegmatch(p_lower,str) + local k = lpegmatch(make_hashkey_e,l) + local v = lpegmatch(make_pattern_e,l) + exceptions[k] = v +end + +local p_pattern = ((Carg(1) * Carg(2) * C(char^1)) / register_pattern + 1)^1 +local p_exception = ((Carg(1) * C(char^1)) / register_exception + 1)^1 +local p_split = Ct(C(character)^1) + +function traditional.loadpatterns(language,filename) + local dictionary = dictionaries[language] + if not dictionary.loaded then + if not filename or filename == "" then + filename = "lang-" .. language + end + filename = file.addsuffix(filename,"lua") + local fullname = resolvers.findfile(filename) + if fullname and fullname ~= "" then + local specification = dofile(fullname) + if specification then + local patterns = specification.patterns + if patterns then + local data = patterns.data + if data and data ~= "" then + lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials) + end + end + local exceptions = specification.exceptions + if exceptions then + local data = exceptions.data + if data and data ~= "" then + lpegmatch(p_exception,data,1,dictionary.exceptions) + end + end + end + end + dictionary.loaded = true + end + return dictionary +end + +local lcchars = characters.lcchars +local uccodes = characters.uccodes +local categories = characters.categories +local nofwords = 0 +local nofhashed = 0 + +local steps = nil +local f_show = formatters["%w%s"] + +local function show_log() + if trace_steps == true then + report() + local w = #steps[1][1] + for i=1,#steps do + local s = steps[i] + report("%s%w%S %S",s[1],w - #s[1] + 3,s[2],s[3]) + end + report() + end +end + +local function show_1(wsplit) + local u = concat(wsplit," ") + steps = { { f_show(0,u), f_show(0,u) } } +end + +local function show_2(c,m,wsplit,done,i,spec) + local s = lpegmatch(p_split,c) + local t = { } + local n = #m + local w = #wsplit + for j=1,n do + t[#t+1] = m[j] + t[#t+1] = s[j] + end + local m = 2*i-2 + local l = #t + local s = spec and table.sequenced(spec) or "" + if m == 0 then + steps[#steps+1] = { f_show(m, concat(t,"",2)), f_show(1,concat(done," ",2,#done),s) } + elseif i+1 == w then + steps[#steps+1] = { f_show(m-1,concat(t,"",1,#t-1)), f_show(1,concat(done," ",2,#done),s) } + else + steps[#steps+1] = { f_show(m-1,concat(t)), f_show(1,concat(done," ",2,#done),s) } + end +end + +local function show_3(wsplit,done) + local t = { } + local h = { } + local n = #wsplit + for i=1,n do + local w = wsplit[i] + if i > 1 then + local d = done[i] + t[#t+1] = i > 2 and d % 2 == 1 and "-" or " " + h[#h+1] = d + end + t[#t+1] = w + h[#h+1] = w + end + steps[#steps+1] = { f_show(0,concat(h)), f_show(0,concat(t)) } + show_log() +end + +local function show_4(wsplit,done) + steps = { { concat(wsplit," ") } } + show_log() +end + +function traditional.lasttrace() + return steps +end + +-- We could reuse the w table but as we cache the resolved words +-- there is not much gain in that complication. +-- +-- Beware: word can be a table and when n is passed to we can +-- assume reuse so we need to honor that n then. + +-- todo: a fast variant for tex ... less lookups (we could check is +-- dictionary has changed) ... although due to caching the already +-- done words, we don't do much here + +local function hyphenate(dictionary,word,n) -- odd is okay + nofwords = nofwords + 1 + local hyphenated = dictionary.hyphenated + local isstring = type(word) == "string" + if isstring then + local done = hyphenated[word] + if done ~= nil then + return done + end + elseif n then + local done = hyphenated[concat(word,"",1,n)] + if done ~= nil then + return done + end + else + local done = hyphenated[concat(word)] + if done ~= nil then + return done + end + end + local key + if isstring then + key = word + word = lpegmatch(p_split,word) + if not n then + n = #word + end + else + if not n then + n = #word + end + key = concat(word,"",1,n) + end + local l = 1 + local w = { "." } + for i=1,n do + local c = word[i] + l = l + 1 + w[l] = lcchars[c] or c + end + l = l + 1 + w[l] = "." + local c = concat(w,"",2,l-1) + -- + local done = hyphenated[c] + if done ~= nil then + hyphenated[key] = done + nofhashed = nofhashed + 1 + return done + end + -- + local exceptions = dictionary.exceptions + local exception = exceptions[c] + if exception then + if trace_steps then + show_4(w,exception) + end + hyphenated[key] = exception + nofhashed = nofhashed + 1 + return exception + end + -- + if trace_steps then + show_1(w) + end + -- + local specials = dictionary.specials + local patterns = dictionary.patterns + -- +-- inspect(specials) + local spec + for i=1,l do + for j=i,l do + local c = concat(w,"",i,j) + local m = patterns[c] + if m then + local s = specials[c] + if not done then + done = { } + spec = nil + -- the string that we resolve has explicit fences (.) so + -- done starts at the first fence and runs upto the last + -- one so we need one slot less + for i=1,l do + done[i] = 0 + end + end + -- we run over the pattern that always has a (zero) value for + -- each character plus one more as we look at both sides + for k=1,#m do + local new = m[k] + if not new then + break + elseif new == true then + report("fatal error") + break + elseif new > 0 then + local pos = i + k - 1 + local old = done[pos] + if not old then + -- break ? + elseif new > old then + done[pos] = new + if s then + local b = i + (s.start or 1) - 1 + if b > 0 then + local e = b + (s.length or 2) - 1 + if e > 0 then + if pos >= b and pos <= e then + if spec then + spec[pos] = { s, k - 1 } + else + spec = { [pos] = { s, k - 1 } } + end + end + end + end + end + end + end + end + if trace_steps and done then + show_2(c,m,w,done,i,s) + end + end + end + end + if trace_steps and done then + show_3(w,done) + end + if done then + local okay = false + for i=3,#done do + if done[i] % 2 == 1 then + done[i-2] = spec and spec[i] or true + okay = true + else + done[i-2] = false + end + end + if okay then + done[#done] = nil + done[#done] = nil + else + done = false + end + else + done = false + end + hyphenated[key] = done + nofhashed = nofhashed + 1 + return done +end + +function traditional.gettrace(language,word) + if not word or word == "" then + return + end + local dictionary = dictionaries[language] + if dictionary then + local hyphenated = dictionary.hyphenated + hyphenated[word] = nil + hyphenate(dictionary,word) + return steps + end +end + +local methods = setmetatableindex(function(t,k) local v = hyphenate t[k] = v return v end) + +function traditional.installmethod(name,f) + if rawget(methods,name) then + report("overloading %a is not permitted",name) + else + methods[name] = f + end +end + +local s_detail_1 = "-" +local f_detail_2 = formatters["%s-%s"] +local f_detail_3 = formatters["{%s}{%s}{}"] +local f_detail_4 = formatters["{%s%s}{%s%s}{%s}"] + +function traditional.injecthyphens(dictionary,word,specification) + if not word then + return false + end + if not specification then + return word + end + local hyphens = hyphenate(dictionary,word) + if not hyphens then + return word + end + + -- the following code is similar to code later on but here we have + -- strings while there we have hyphen specs + + local word = lpegmatch(p_split,word) + local size = #word + + local leftmin = specification.leftcharmin or 2 + local rightmin = size - (specification.rightcharmin or leftmin) + local leftchar = specification.leftchar + local rightchar = specification.rightchar + + local result = { } + local rsize = 0 + local position = 1 + + while position <= size do + if position >= leftmin and position <= rightmin then + local hyphen = hyphens[position] + if not hyphen then + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + elseif hyphen == true then + rsize = rsize + 1 + result[rsize] = word[position] + rsize = rsize + 1 + if leftchar and rightchar then + result[rsize] = f_detail_3(rightchar,leftchar) + else + result[rsize] = s_detail_1 + end + position = position + 1 + else + local o, h = hyphen[2] + if o then + h = hyphen[1] + else + h = hyphen + o = 1 + end + local b = position - o + (h.start or 1) + local e = b + (h.length or 2) - 1 + if b > 0 and e >= b then + for i=1,b-position do + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + rsize = rsize + 1 + if leftchar and rightchar then + result[rsize] = f_detail_4(h.before,rightchar,leftchar,h.after,concat(word,"",b,e)) + else + result[rsize] = f_detail_2(h.before,h.after) + end + position = e + 1 + else + -- error + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + end + else + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + end + return concat(result) +end + +do + + local word = C((1-space)^1) + local spaces = space^1 + + local u_pattern = (Carg(1) * Carg(2) * word / unregister_pattern + spaces)^1 + local r_pattern = (Carg(1) * Carg(2) * word * Carg(3) / register_pattern + spaces)^1 + local e_pattern = (Carg(1) * word / register_exception + spaces)^1 + + function traditional.registerpattern(language,str,specification) + local dictionary = dictionaries[language] + if specification == false then + lpegmatch(u_pattern,str,1,dictionary.patterns,dictionary.specials) + -- unregister_pattern(dictionary.patterns,dictionary.specials,str) + else + lpegmatch(r_pattern,str,1,dictionary.patterns,dictionary.specials,type(specification) == "table" and specification or false) + -- register_pattern(dictionary.patterns,dictionary.specials,str,specification) + end + end + + function traditional.registerexception(language,str) + lpegmatch(e_pattern,str,1,dictionaries[language].exceptions) + end + +end + +-- todo: unicodes or utfhash ? + +if context then + + local nodecodes = nodes.nodecodes + local disccodes = nodes.disccodes + + local glyph_code = nodecodes.glyph + local disc_code = nodecodes.disc + local math_code = nodecodes.math + local hlist_code = nodecodes.hlist + + local discretionary_code = disccodes.discretionary + local explicit_code = disccodes.explicit + local regular_code = disccodes.regular + local automatic_code = disccodes.automatic + + local nuts = nodes.nuts + local tonut = nodes.tonut + local tonode = nodes.tonode + local nodepool = nuts.pool + + local new_disc = nodepool.disc + local new_glyph = nodepool.glyph + + local setfield = nuts.setfield + local getfield = nuts.getfield + local getfont = nuts.getfont + local getchar = nuts.getchar + local getid = nuts.getid + local getattr = nuts.getattr + local getnext = nuts.getnext + local getprev = nuts.getprev + local getsubtype = nuts.getsubtype + local getlist = nuts.getlist + local insert_before = nuts.insert_before + local insert_after = nuts.insert_after + local copy_node = nuts.copy + local remove_node = nuts.remove + local end_of_math = nuts.end_of_math + local node_tail = nuts.tail + local traverse_id = nuts.traverse_id + + local setcolor = nodes.tracers.colors.set + + local variables = interfaces.variables + local v_reset = variables.reset + local v_yes = variables.yes + local v_all = variables.all + + local settings_to_array = utilities.parsers.settings_to_array + + local unsetvalue = attributes.unsetvalue + local texsetattribute = tex.setattribute + + local prehyphenchar = lang.prehyphenchar + local posthyphenchar = lang.posthyphenchar + local preexhyphenchar = lang.preexhyphenchar + local postexhyphenchar = lang.postexhyphenchar + + local lccodes = characters.lccodes + + local a_hyphenation = attributes.private("hyphenation") + + function traditional.loadpatterns(language) + return dictionaries[language] + end + + setmetatableindex(dictionaries,function(t,k) -- for the moment we use an independent data structure + if type(k) == "string" then + -- this will force a load if not yet loaded (we need a nicer way) + -- for the moment that will do (nneeded for examples that register + -- a pattern specification + languages.getnumber(k) + end + local specification = languages.getdata(k) + local dictionary = { + patterns = { }, + exceptions = { }, + hyphenated = { }, + specials = { }, + instance = false, + characters = { }, + unicodes = { }, + } + if specification then + local resources = specification.resources + if resources then + local characters = dictionary.characters or { } + local unicodes = dictionary.unicodes or { } + for i=1,#resources do + local r = resources[i] + if not r.in_dictionary then + r.in_dictionary = true + local patterns = r.patterns + if patterns then + local data = patterns.data + if data then + -- regular patterns + lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials) + end + local extra = patterns.extra + if extra then + -- special patterns + lpegmatch(p_pattern,extra,1,dictionary.patterns,dictionary.specials) + end + end + local exceptions = r.exceptions + if exceptions then + local data = exceptions.data + if data and data ~= "" then + lpegmatch(p_exception,data,1,dictionary.exceptions) + end + end + local usedchars = lpegmatch(p_split,patterns.characters) + for i=1,#usedchars do + local char = usedchars[i] + local code = utfbyte(char) + local upper = uccodes[code] + characters[char] = code + unicodes [code] = char + if type(upper) == "table" then + for i=1,#upper do + local u = upper[i] + unicodes[u] = utfchar(u) + end + else + unicodes[upper] = utfchar(upper) + end + end + end + end + dictionary.characters = characters + dictionary.unicodes = unicodes + setmetatableindex(characters,function(t,k) local v = k and utfbyte(k) t[k] = v return v end) + end + t[specification.number] = dictionary + dictionary.instance = specification.instance -- needed for hyphenchars + end + t[k] = dictionary + return dictionary + end) + + -- Beware: left and right min doesn't mean that in a 1 mmm hsize there can be snippets + -- with less characters than either of them! This could be an option but such a narrow + -- hsize doesn't make sense anyway. + + -- We assume that featuresets are defined global ... local definitions + -- (also mid paragraph) make not much sense anyway. For the moment we + -- assume no predefined sets so we don't need to store them. Nor do we + -- need to hash them in order to save space ... no sane user will define + -- many of them. + + local featuresets = hyphenators.featuresets or { } + hyphenators.featuresets = featuresets + + storage.shared.noflanguagesfeaturesets = storage.shared.noflanguagesfeaturesets or 0 + + local noffeaturesets = storage.shared.noflanguagesfeaturesets + + storage.register("languages/hyphenators/featuresets",featuresets,"languages.hyphenators.featuresets") + + ----- hash = table.sequenced(featureset,",") -- no need now + + local function register(name,featureset) + noffeaturesets = noffeaturesets + 1 + featureset.attribute = noffeaturesets + featuresets[noffeaturesets] = featureset -- access by attribute + featuresets[name] = featureset -- access by name + storage.shared.noflanguagesfeaturesets = noffeaturesets + return noffeaturesets + end + + local function makeset(...) -- a bit overkill, supporting variants but who cares + local set = { } + for i=1,select("#",...) do + local list = select(i,...) + local kind = type(list) + local used = nil + if kind == "string" then + if list == v_all then + -- not ok ... now all get ignored + return setmetatableindex(function(t,k) local v = utfchar(k) t[k] = v return v end) + elseif list ~= "" then + used = lpegmatch(p_split,list) + set = set or { } + for i=1,#used do + local char = used[i] + set[utfbyte(char)] = char + end + end + elseif kind == "table" then + if next(list) then + set = set or { } + for byte, char in next, list do + set[byte] = char == true and utfchar(byte) or char + end + elseif #list > 0 then + set = set or { } + for i=1,#list do + local l = list[i] + if type(l) == "number" then + set[l] = utfchar(l) + else + set[utfbyte(l)] = l + end + end + end + end + end + return set + end + + local defaulthyphens = { + [0x2D] = true, -- hyphen + [0xAD] = true, -- soft hyphen + } + + local defaultjoiners = { + [0x200C] = true, -- nzwj + [0x200D] = true, -- zwj + } + + local function somehyphenchar(c) + c = tonumber(c) + return c ~= 0 and c or nil + end + + local function definefeatures(name,featureset) + local extrachars = featureset.characters -- "[]()" + local hyphenchars = featureset.hyphens + local joinerchars = featureset.joiners + local alternative = featureset.alternative + local rightwordmin = tonumber(featureset.rightwordmin) + local charmin = tonumber(featureset.charmin) + local leftcharmin = tonumber(featureset.leftcharmin) + local rightcharmin = tonumber(featureset.rightcharmin) + local rightedge = featureset.rightedge + local leftchar = somehyphenchar(featureset.leftchar) + local rightchar = somehyphenchar(featureset.rightchar) + -- + joinerchars = joinerchars == v_yes and defaultjoiners or joinerchars + hyphenchars = hyphenchars == v_yes and defaulthyphens or hyphenchars + -- not yet ok: extrachars have to be ignored so it cannot be all) + featureset.extrachars = makeset(joinerchars or "",extrachars or "") + featureset.hyphenchars = makeset(hyphenchars or "") + featureset.alternative = alternative or "hyphenate" + featureset.rightwordmin = rightwordmin and rightwordmin > 0 and rightwordmin or nil + featureset.charmin = charmin and charmin > 0 and charmin or nil + featureset.leftcharmin = leftcharmin and leftcharmin > 0 and leftcharmin or nil + featureset.rightcharmin = rightcharmin and rightcharmin > 0 and rightcharmin or nil + featureset.leftchar = leftchar + featureset.rightchar = rightchar + featureset.strict = rightedge == 'tex' + -- + return register(name,featureset) + end + + local function setfeatures(n) + if not n or n == v_reset then + n = false + else + local f = featuresets[n] + if not f and type(n) == "string" then + local t = settings_to_array(n) + local s = { } + for i=1,#t do + local ti = t[i] + local fs = featuresets[ti] + if fs then + for k, v in next, fs do + s[k] = v + end + end + end + n = register(n,s) + else + n = f and f.attribute + end + end + texsetattribute(a_hyphenation,n or unsetvalue) + end + + traditional.definefeatures = definefeatures + traditional.setfeatures = setfeatures + + implement { + name = "definehyphenationfeatures", + actions = definefeatures, + arguments = { + "string", + { + { "characters" }, + { "hyphens" }, + { "joiners" }, + { "rightwordmin", "integer" }, + { "charmin", "integer" }, + { "leftcharmin", "integer" }, + { "rightcharmin", "integer" }, + { "leftchar", "integer" }, + { "rightchar", "integer" }, + { "alternative" }, + { "rightedge" }, + } + } + } + + implement { + name = "sethyphenationfeatures", + actions = setfeatures, + arguments = "string" + } + + implement { + name = "registerhyphenationpattern", + actions = traditional.registerpattern, + arguments = { "string", "string", "boolean" } + } + + implement { + name = "registerhyphenationexception", + actions = traditional.registerexception, + arguments = { "string", "string" } + } + + -- This is a relative large function with local variables and local + -- functions. A previous implementation had the functions outside but + -- this is cleaner and as efficient. The test runs 100 times over + -- tufte.tex, knuth.tex, zapf.tex, ward.tex and darwin.tex in lower + -- and uppercase with a 1mm hsize. + -- + -- language=0 language>0 4 | 3 * slower + -- + -- tex 2.34 | 1.30 2.55 | 1.45 0.21 | 0.15 + -- lua 2.42 | 1.38 3.30 | 1.84 0.88 | 0.46 + -- + -- Of course we have extra overhead (virtual Lua machine) but also we + -- check attributes and support specific local options). The test puts + -- the typeset text in boxes and discards it. If we also flush the + -- runtime is 4.31|2.56 and 4.99|2.94 seconds so the relative difference + -- is (somehow) smaller. The test has 536 pages. There is a little bit + -- of extra overhead because we store the patterns in a different way. + -- + -- As usual I will look for speedups. Some 0.01 seconds could be gained + -- by sharing patterns which is not impressive but it does save some + -- 3M memory on this test. (Some optimizations already brought the 3.30 + -- seconds down to 3.14 but it all depends on aggressive caching.) + + -- As we kick in the hyphenator before fonts get handled, we don't look + -- at implicit (font) kerns or ligatures. + + local starttiming = statistics.starttiming + local stoptiming = statistics.stoptiming + + local strictids = { + [nodecodes.hlist] = true, + [nodecodes.vlist] = true, + [nodecodes.rule] = true, + [nodecodes.disc] = true, + [nodecodes.accent] = true, + [nodecodes.math] = true, + } + + function traditional.hyphenate(head) + + local first = tonut(head) + local tail = nil + local last = nil + local current = first + local dictionary = nil + local instance = nil + local characters = nil + local unicodes = nil + local exhyphenchar = tex.exhyphenchar + local extrachars = nil + local hyphenchars = nil + local language = nil + local start = nil + local stop = nil + local word = { } -- we reuse this table + local size = 0 + local leftchar = false + local rightchar = false -- utfbyte("-") + local leftexchar = false + local rightexchar = false -- utfbyte("-") + local leftmin = 0 + local rightmin = 0 + local charmin = 1 + local leftcharmin = nil + local rightcharmin = nil + ----- leftwordmin = nil + local rightwordmin = nil + local leftchar = nil + local rightchar = nil + local attr = nil + local lastwordlast = nil + local hyphenated = hyphenate + local strict = nil + + -- We cannot use an 'enabled' boolean (false when no characters or extras) because we + -- can have plugins that set a characters metatable and so) ... it doesn't save much + -- anyway. Using (unicodes and unicodes[code]) and a nil table when no characters also + -- doesn't save much. So there not that much to gain for languages that don't hyphenate. + -- + -- enabled = (unicodes and (next(unicodes) or getmetatable(unicodes))) or (extrachars and next(extrachars)) + -- + -- This can be used to not add characters i.e. keep size 0 but then we need to check for + -- attributes that change it, which costs time too. Not much to gain there. + + starttiming(traditional) + + local function synchronizefeatureset(a) + local f = a and featuresets[a] + if f then + hyphenated = methods[f.alternative or "hyphenate"] + extrachars = f.extrachars + hyphenchars = f.hyphenchars + rightwordmin = f.rightwordmin + charmin = f.charmin + leftcharmin = f.leftcharmin + rightcharmin = f.rightcharmin + leftchar = f.leftchar + rightchar = f.rightchar + strict = f.strict and strictids + if rightwordmin and rightwordmin > 0 and lastwordlast ~= rightwordmin then + -- so we can change mid paragraph but it's kind of unpredictable then + if not tail then + tail = node_tail(first) + end + last = tail + local inword = false + while last and rightwordmin > 0 do + local id = getid(last) + if id == glyph_code then + inword = true + if trace_visualize then + setcolor(last,"darkred") + end + elseif inword then + inword = false + rightwordmin = rightwordmin - 1 + end + last = getprev(last) + end + lastwordlast = rightwordmin + end + if not charmin or charmin == 0 then + charmin = 1 + end + else + hyphenated = methods.hyphenate + extrachars = false + hyphenchars = false + rightwordmin = false + charmin = 1 + leftcharmin = false + rightcharmin = false + leftchar = false + rightchar = false + strict = false + end + + return a + end + + local function flush(hyphens) -- todo: no need for result + + local rightmin = size - rightmin + local result = { } + local rsize = 0 + local position = 1 + + -- todo: remember last dics and don't go back to before that (plus + -- message) .. for simplicity we also assume that we don't start + -- with a dics node + -- + -- there can be a conflict: if we backtrack then we can end up in + -- another disc and get out of sync (dup chars and so) + + while position <= size do + if position >= leftmin and position <= rightmin then + local hyphen = hyphens[position] + if not hyphen then + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + elseif hyphen == true then + rsize = rsize + 1 + result[rsize] = word[position] + rsize = rsize + 1 + result[rsize] = true + position = position + 1 + else + local o, h = hyphen[2] + if o then + -- { hyphen, offset) + h = hyphen[1] + else + -- hyphen + h = hyphen + o = 1 + end + local b = position - o + (h.start or 1) + local e = b + (h.length or 2) - 1 + if b > 0 and e >= b then + for i=1,b-position do + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + rsize = rsize + 1 + result[rsize] = { + h.before or "", -- pre + h.after or "", -- post + concat(word,"",b,e), -- replace + h.right, -- optional after pre + h.left, -- optional before post + } + position = e + 1 + else + -- error + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + end + else + rsize = rsize + 1 + result[rsize] = word[position] + position = position + 1 + end + end + + local function serialize(replacement,leftchar,rightchar) + if not replacement then + return + elseif replacement == true then + local glyph = copy_node(stop) + setfield(glyph,"char",leftchar or rightchar) + return glyph + end + local head = nil + local current = nil + if leftchar then + head = copy_node(stop) + current = head + setfield(head,"char",leftchar) + end + local rsize = #replacement + if rsize == 1 then + local glyph = copy_node(stop) + setfield(glyph,"char",characters[replacement]) + if head then + insert_after(current,current,glyph) + else + head = glyph + end + current = glyph + elseif rsize > 0 then + local list = lpegmatch(p_split,replacement) -- this is an utf split (could be cached) + for i=1,#list do + local glyph = copy_node(stop) + setfield(glyph,"char",characters[list[i]]) + if head then + insert_after(current,current,glyph) + else + head = glyph + end + current = glyph + end + end + if rightchar then + local glyph = copy_node(stop) + insert_after(current,current,glyph) + setfield(glyph,"char",rightchar) + end + return head + end + + local current = start + + local attributes = getfield(start,"attr") -- todo: just copy the last disc .. faster + + for i=1,rsize do + local r = result[i] + if r == true then + local disc = new_disc() + if rightchar then + setfield(disc,"pre",serialize(true,rightchar)) + end + if leftchar then + setfield(disc,"post",serialize(true,leftchar)) + end + if attributes then + setfield(disc,"attr",attributes) + end + -- could be a replace as well + insert_before(first,current,disc) + elseif type(r) == "table" then + local disc = new_disc() + local pre = r[1] + local post = r[2] + local replace = r[3] + local right = r[4] ~= false and rightchar + local left = r[5] ~= false and leftchar + if pre and pre ~= "" then + setfield(disc,"pre",serialize(pre,false,right)) + end + if post and post ~= "" then + setfield(disc,"post",serialize(post,left,false)) + end + if replace and replace ~= "" then + setfield(disc,"replace",serialize(replace)) + end + if attributes then + setfield(disc,"attr",attributes) + end + insert_before(first,current,disc) + else + setfield(current,"char",characters[r]) + if i < rsize then + current = getnext(current) + end + end + end + if current and current ~= stop then + local current = getnext(current) + local last = getnext(stop) + while current ~= last do + first, current = remove_node(first,current,true) + end + end + + end + + local function inject(leftchar,rightchar,code,attributes) + if first ~= current then + local disc = new_disc() + first, current, glyph = remove_node(first,current) + first, current = insert_before(first,current,disc) + if trace_visualize then + setcolor(glyph,"darkred") -- these get checked + setcolor(disc,"darkgreen") -- in the colorizer + end + setfield(disc,"replace",glyph) + if not leftchar then + leftchar = code + end + if rightchar then + local glyph = copy_node(glyph) + setfield(glyph,"char",rightchar) + setfield(disc,"pre",glyph) + end + if leftchar then + local glyph = copy_node(glyph) + setfield(glyph,"char",leftchar) + setfield(disc,"post",glyph) + end + if attributes then + setfield(disc,"attr",attributes) + end + end + return current + end + + local a = getattr(first,a_hyphenation) + if a ~= attr then + attr = synchronizefeatureset(a) + end + + -- The first attribute in a word determines the way a word gets hyphenated + -- and if relevant, other properties are also set then. We could optimize for + -- silly one-char cases but it has no priority as the code is still not that + -- much slower than the native hyphenator and this variant also provides room + -- for extensions. + + while current and current ~= last do -- and current + local id = getid(current) + if id == glyph_code then + local code = getchar(current) + local lang = getfield(current,"lang") + if lang ~= language then + if dictionary and size > charmin and leftmin + rightmin <= size then + if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then + -- skip + else + local hyphens = hyphenated(dictionary,word,size) + if hyphens then + flush(hyphens) + end + end + end + language = lang + if language > 0 then + -- + dictionary = dictionaries[language] + instance = dictionary.instance + characters = dictionary.characters + unicodes = dictionary.unicodes + -- + local a = getattr(current,a_hyphenation) + attr = synchronizefeatureset(a) + leftchar = leftchar or (instance and posthyphenchar (instance)) -- we can make this more + rightchar = rightchar or (instance and prehyphenchar (instance)) -- efficient if needed + leftexchar = (instance and preexhyphenchar (instance)) + rightexchar = (instance and postexhyphenchar(instance)) + leftmin = leftcharmin or getfield(current,"left") + rightmin = rightcharmin or getfield(current,"right") + if not leftchar or leftchar < 0 then + leftchar = false + end + if not rightchar or rightchar < 0 then + rightchar = false + end + -- + local char = unicodes[code] or (extrachars and extrachars[code]) + if char then + word[1] = char + size = 1 + start = current + else + size = 0 + end + else + size = 0 + end + elseif language <= 0 then + -- + elseif size > 0 then + local char = unicodes[code] or (extrachars and extrachars[code]) + if char then + size = size + 1 + word[size] = char + elseif dictionary then + if size > charmin and leftmin + rightmin <= size then + if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then + -- skip + else + local hyphens = hyphenated(dictionary,word,size) + if hyphens then + flush(hyphens) + end + end + end + size = 0 + -- maybe also a strict mode here: no hyphenation before hyphenchars and skip + -- the next set (but then, strict is an option) + if code == exhyphenchar then + current = inject(leftexchar,rightexchar,code,getfield(current,"attr")) + elseif hyphenchars and hyphenchars[code] then + current = inject(leftchar,rightchar,code,getfield(current,"attr")) + end + end + else + local a = getattr(current,a_hyphenation) + if a ~= attr then + attr = synchronizefeatureset(a) -- influences extrachars + leftchar = leftchar or (instance and posthyphenchar (instance)) -- we can make this more + rightchar = rightchar or (instance and prehyphenchar (instance)) -- efficient if needed + leftexchar = (instance and preexhyphenchar (instance)) + rightexchar = (instance and postexhyphenchar(instance)) + leftmin = leftcharmin or getfield(current,"left") + rightmin = rightcharmin or getfield(current,"right") + if not leftchar or leftchar < 0 then + leftchar = false + end + if not rightchar or rightchar < 0 then + rightchar = false + end + end + -- + local char = unicodes[code] or (extrachars and extrachars[code]) + if char then + word[1] = char + size = 1 + start = current + end + end + stop = current + current = getnext(current) + else + if id == disc_code then + local subtype = getsubtype(current) + if subtype == discretionary_code then -- \discretionary + size = 0 + current = getnext(current) + elseif subtype == explicit_code then -- \- => only here + size = 0 + current = getnext(current) + while current do + local id = getid(current) + if id == glyph_code or id == disc_code then + current = getnext(current) + else + break + end + end + -- todo: change to discretionary_code + else + -- automatic (-) : the hyphenator turns an exhyphen into glyph+disc + -- first : done by the hyphenator + -- second : done by the hyphenator + -- regular : done by the hyphenator + size = 0 + current = getnext(current) + end + elseif strict and strict[id] then + current = id == math_code and getnext(end_of_math(current)) or getnext(current) + size = 0 + else + current = id == math_code and getnext(end_of_math(current)) or getnext(current) + end + if size > 0 then + if dictionary and size > charmin and leftmin + rightmin <= size then + if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then + -- skip + else + local hyphens = hyphenated(dictionary,word,size) + if hyphens then + flush(hyphens) + end + end + end + size = 0 + end + end + end + -- we can have quit due to last so we need to flush the last seen word, we could move this in + -- the loop and test for current but ... messy + if dictionary and size > charmin and leftmin + rightmin <= size then + if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then + -- skip + else + local hyphens = hyphenated(dictionary,word,size) + if hyphens then + flush(hyphens) + end + end + end + + stoptiming(traditional) + + return head, true + end + + statistics.register("hyphenation",function() + if nofwords > 0 or statistics.elapsed(traditional) > 0 then + return string.format("%s words hyphenated, %s unique, used time %s", + nofwords,nofhashed,statistics.elapsedseconds(traditional) or 0) + end + end) + + local texmethod = "builders.kernel.hyphenation" + local oldmethod = texmethod + local newmethod = texmethod + + -- local newmethod = "languages.hyphenators.traditional.hyphenate" + -- + -- nodes.tasks.prependaction("processors","words",newmethod) + -- nodes.tasks.disableaction("processors",oldmethod) + -- + -- nodes.tasks.replaceaction("processors","words",oldmethod,newmethod) + + -- \enabledirectives[hyphenators.method=traditional] + -- \enabledirectives[hyphenators.method=builtin] + + -- push / pop ? check first attribute + + -- local replaceaction = nodes.tasks.replaceaction -- no longer overload this way (too many local switches) + + local hyphenate = lang.hyphenate + local expanders = languages.expanders + local methods = { } + local usedmethod = false + local stack = { } + + local function original(head) + local done = hyphenate(head) + return head, done + end + + local function expanded(head) + local done = hyphenate(head) + if done then + for d in traverse_id(disc_code,tonut(head)) do + local s = getsubtype(d) + if s ~= discretionary_code then + expanders[s](d,template) + done = true + end + end + end + return head, done + end + + local getcount = tex.getcount + + hyphenators.methods = methods + hyphenators.optimize = false + + function hyphenators.handler(head,groupcode) + if usedmethod then + if groupcode == "hbox" and hyphenators.optimize then + if getcount("hyphenstate") > 0 then + forced = false + return usedmethod(head) + else + return head, false + end + else + return usedmethod(head) + end + else + return head, false + end + end + + methods.tex = original + methods.original = original + methods.expanded = expanded + methods.traditional = languages.hyphenators.traditional.hyphenate + methods.none = false -- function(head) return head, false end + + usedmethod = original + + local function setmethod(method) + usedmethod = type(method) == "string" and methods[method] + if usedmethod == nil then + usedmethod = methods.tex + end + end + local function pushmethod(method) + insert(stack,usedmethod) + usedmethod = type(method) == "string" and methods[method] + if usedmethod == nil then + usedmethod = methods.tex + end + end + local function popmethod() + usedmethod = remove(stack) or methods.tex + end + + hyphenators.setmethod = setmethod + hyphenators.pushmethod = pushmethod + hyphenators.popmethod = popmethod + + directives.register("hyphenators.method",setmethod) + + function hyphenators.setup(specification) + local method = specification.method + if method then + setmethod(method) + end + end + + implement { name = "sethyphenationmethod", actions = setmethod, arguments = "string" } + implement { name = "pushhyphenation", actions = pushmethod, arguments = "string" } + implement { name = "pophyphenation", actions = popmethod } + + -- can become a runtime loaded one: + + local context = context + local ctx_NC = context.NC + local ctx_NR = context.NR + local ctx_verbatim = context.verbatim + + function hyphenators.showhyphenationtrace(language,word) + if not word or word == "" then + return + end + local saved = trace_steps + trace_steps = "silent" + local steps = traditional.gettrace(language,word) + trace_steps = saved + if steps then + local n = #steps + if n > 0 then + context.starttabulate { "|r|l|l|l|" } + for i=1,n do + local s = steps[i] + ctx_NC() if i > 1 and i < n then context(i-1) end + ctx_NC() ctx_verbatim(s[1]) + ctx_NC() ctx_verbatim(s[2]) + ctx_NC() ctx_verbatim(s[3]) + ctx_NC() + ctx_NR() + end + context.stoptabulate() + end + end + end + + implement { + name = "showhyphenationtrace", + actions = hyphenators.showhyphenationtrace, + arguments = { "string", "string" } + } + + function nodes.stripdiscretionaries(head) + local h = tonut(head) + for l in traverse_id(hlist_code,h) do + for d in traverse_id(disc_code,getlist(l)) do + remove_node(h,false,true) + end + end + return tonode(h) + end + + +else + +-- traditional.loadpatterns("nl","lang-nl") +-- traditional.loadpatterns("de","lang-de") +-- traditional.loadpatterns("us","lang-us") + +-- traditional.registerpattern("nl","e1ë", { start = 1, length = 2, before = "e", after = "e" } ) +-- traditional.registerpattern("nl","oo7ë", { start = 2, length = 3, before = "o", after = "e" } ) +-- traditional.registerpattern("de","qqxc9xkqq",{ start = 3, length = 4, before = "ab", after = "cd" } ) + +-- local specification = { +-- leftcharmin = 2, +-- rightcharmin = 2, +-- leftchar = "<", +-- rightchar = ">", +-- } + +-- print("reëel", traditional.injecthyphens(dictionaries.nl,"reëel", specification),"r{e>}{}{}{ 0 then + context.char(c) + end + end +} + +implement { + name = "currentposthyphenchar", + actions = function() + local c = posthyphenchar(tolang()) + if c and c > 0 then + context.char(c) + end + end +} diff --git a/Master/texmf-dist/tex/context/base/lang-ini.mkiv b/Master/texmf-dist/tex/context/base/lang-ini.mkiv index 4ed7839bddc..335d6d1c9d0 100644 --- a/Master/texmf-dist/tex/context/base/lang-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-ini.mkiv @@ -111,6 +111,44 @@ \csname\??language\s!default#2\endcsname \fi\fi\fi} +\def\mainlanguageparameter#1% + {\ifcsname\??language\currentmainlanguage#1\endcsname + \csname\??language\currentmainlanguage#1\endcsname + \else\ifcsname\??language\currentmainlanguage\s!default\endcsname + \expandafter\specificlanguageparameter\csname\??language\currentmainlanguage\s!default\endcsname{#1}% + \else\ifcsname\??language\s!default#1\endcsname + \csname\??language\s!default#1\endcsname + \fi\fi\fi} + +\def\currentusedlanguage{\currentlanguage} + +\let\usedlanguageparameter\languageparameter + +\def\askedlanguageparameter#1% assumes \currentusedlanguage being set + {\ifcsname\??language\currentusedlanguage#1\endcsname + \csname\??language\currentusedlanguage#1\endcsname + \else\ifcsname\??language\currentusedlanguage\s!default\endcsname + \expandafter\specificlanguageparameter\csname\??language\currentusedlanguage\s!default\endcsname{#1}% + \else\ifcsname\??language\s!default#1\endcsname + \csname\??language\s!default#1\endcsname + \fi\fi\fi} + +\unexpanded\def\setlanguageparameter#1% + {\edef\currentusedlanguage{\reallanguagetag{#1\c!language}}% + %\let\setlanguageparameter\gobbleoneargument + \ifx\currentusedlanguage\empty + \let\currentusedlanguage \currentlanguage + \let\usedlanguageparameter\languageparameter + \else\ifx\currentusedlanguage\v!global + \let\currentusedlanguage \currentmainlanguage + \let\usedlanguageparameter\mainlanguageparameter + \else\ifx\currentusedlanguage\v!local + \let\currentusedlanguage \currentlanguage + \let\usedlanguageparameter\languageparameter + \else + \let\usedlanguageparameter\askedlanguageparameter + \fi\fi\fi} + \unexpanded\def\setupcurrentlanguage[#1]% {\setcurrentlanguage\currentmainlanguage{#1}} @@ -162,7 +200,6 @@ %D implementations support run time addition of patterns to a %D preloaded format). - %D \macros %D {preloadlanguages} %D @@ -174,15 +211,17 @@ \newtoks \everysetuplanguage -\def\installedlanguages{\ctxcommand{installedlanguages()}} +\def\installedlanguages{\clf_installedlanguages} -\unexpanded\def\doiflanguageelse#1% +\unexpanded\def\doifelselanguage#1% {\ifcsname\??language#1\c!state\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doiflanguageelse\doifelselanguage + \def\reallanguagetag#1% {\ifcsname\??languagelinked#1\endcsname\csname\??languagelinked#1\endcsname\else#1\fi} @@ -192,17 +231,17 @@ {\dodoubleargument\lang_basics_install} \def\lang_basics_install[#1][#2]% - {\doifassignmentelse{#2} - {\doiflanguageelse{#1} + {\doifelseassignment{#2} + {\doifelselanguage{#1} {\getparameters[\??language#1][#2]} {\setvalue{\??languagelinked#1}{#1}% \lang_basics_install_indeed{#1}{#1}% \getparameters[\??language#1][\c!state=\v!start,#2]}% \edef\currentsetuplanguage{#1}% - \ctxcommand{definelanguage("#1","\specificlanguageparameter{#1}\s!default")}% + \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}% \the\everysetuplanguage} {\setvalue{\??languagelinked#1}{#2}% - \ctxcommand{setlanguagesynonym("#1","#2")}% + \clf_setlanguagesynonym{#1}{#2}% \lang_basics_install_indeed{#1}{#2}}} \def\lang_basics_install_indeed#1#2% @@ -213,7 +252,7 @@ %D used dutch mnemonics in the dutch version, but nowadays %D conform a standard. -\unexpanded\def\doifpatternselse#1% +\unexpanded\def\doifelsepatterns#1% {\begingroup % will change \lang_basics_set_current[#1]% \ifnum\normallanguage>\zerocount @@ -222,6 +261,8 @@ \endgroup\expandafter\secondoftwoarguments \fi} +\let\doifpatternselse\doifelsepatterns + %D \macros %D {setuplanguage} %D @@ -254,7 +295,7 @@ \lang_basics_synchronize} \appendtoks - \ctxcommand{unloadlanguage("\currentsetuplanguage")}% + \clf_unloadlanguage{\currentsetuplanguage}% \to \everysetuplanguage \setuplanguage @@ -354,13 +395,58 @@ \newtoks \everylanguage +% \def\lang_basics_synchronize% assumes that \currentlanguage is set % % % use different name as complex +% {\normallanguage\ctxcommand{languagenumber(% +% "\currentlanguage",% +% "\defaultlanguage\currentlanguage",% +% "\languageparameter\s!patterns"% +% )}\relax +% \the\everylanguage\relax} + +% (some 20%) faster but code jungle (the publication code can have excessive +% switching + +\installcorenamespace{languagenumbers} + +\appendtoks + % we need to reassign the number because new patterns can be defined later on + % so let's hope not that many \setups happen during a run + \global\expandafter\let\csname\??languagenumbers\currentlanguage\endcsname\undefined +\to \everysetuplanguage + +\def\lang_basics_synchronize_yes + {\zerocount % see below + \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname + \clf_languagenumber + {\currentlanguage}% + {\defaultlanguage\currentlanguage}% + {\languageparameter\s!patterns}% + \relax + \normallanguage\csname\??languagenumbers\currentlanguage\endcsname} + +\let\lang_basics_synchronize_nop\zerocount % not loaded anyway + +\letvalue{\??languagenumbers}\lang_basics_synchronize_nop % initime + +\appendtoks + \letvalue{\??languagenumbers}\lang_basics_synchronize_yes % runtime +\to \everydump + \def\lang_basics_synchronize% assumes that \currentlanguage is set % % % use different name as complex - {\normallanguage\ctxcommand{languagenumber(% - "\currentlanguage",% - "\defaultlanguage\currentlanguage",% - "\languageparameter\s!patterns"% - )}\relax - \the\everylanguage\relax} + {\normallanguage\csname\??languagenumbers + \ifcsname\??languagenumbers\currentlanguage\endcsname + \currentlanguage + \fi + \endcsname + \relax + \the\everylanguage + \relax} + +% experimental + +\newcount\hyphenstate + +% so far \newcount\hyphenminoffset @@ -479,7 +565,11 @@ \lang_basics_switch_asked} \unexpanded\def\language - {\doifnextoptionalcselse\lang_basics_set_current\normallanguage} + {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage} + +\let\setlanguage\language % we make these synonyms + +\let\patterns\gobbleoneargument \newcount\mainlanguagenumber @@ -647,7 +737,7 @@ \ifx\askedlanguage\empty \let\askedlanguage\currentlanguage \fi - \ctxcommand{setlanguageexceptions("\askedlanguage",\!!bs#2\!!es)}% + \clf_setlanguageexceptions{\askedlanguage}{#2}% \endgroup} %D For the moment here: @@ -655,4 +745,18 @@ \uchyph 1 % also treat uppercase \exhyphenchar 45 % to permit breaking at explicit hyphens +%D New: + +\unexpanded\def\traceddiscretionary#1#2#3% + {\dontleavehmode + \discretionary{\darkred#1}{\darkgreen#2}{\darkblue#3}} + +\unexpanded\def\samplediscretionary + {\traceddiscretionary + {pre\clf_currentprehyphenchar}% + {\clf_currentposthyphenchar post}% + {replace}} + +% todo: make this configurable + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/lang-lab.lua b/Master/texmf-dist/tex/context/base/lang-lab.lua index 91c258418c9..e90bee017cf 100644 --- a/Master/texmf-dist/tex/context/base/lang-lab.lua +++ b/Master/texmf-dist/tex/context/base/lang-lab.lua @@ -19,6 +19,9 @@ local report_labels = logs.reporter("languages","labels") languages.labels = languages.labels or { } local labels = languages.labels +local context = context +local implement = interfaces.implement + local variables = interfaces.variables local settings_to_array = utilities.parsers.settings_to_array @@ -30,19 +33,27 @@ end labels.split = split -local contextsprint = context.sprint +local contextsprint = context.sprint + +local f_setlabeltextpair = formatters["\\setlabeltextpair{%s}{%s}{%s}{%s}{%s}"] +local f_key_key = formatters["\\v!%s:\\v!%s"] +local f_key_raw = formatters["\\v!%s:%s"] +local f_raw_key = formatters["%s:\\v!%s"] +local f_raw_raw = formatters["%s:%s"] +local f_key = formatters["\\v!%s"] +local f_raw = formatters["%s"] local function definelanguagelabels(data,class,tag,rawtag) for language, text in next, data.labels do if text == "" then -- skip elseif type(text) == "table" then - contextsprint(prtcatcodes,"\\setlabeltextpair{",class,"}{",language,"}{",tag,"}{",text[1],"}{",text[2],"}") + contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text[1],text[2])) if trace_labels then report_labels("language %a, defining label %a as %a and %a",language,rawtag,text[1],text[2]) end else - contextsprint(prtcatcodes,"\\setlabeltextpair{",class,"}{",language,"}{",tag,"}{",text,"}{}") + contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text,"")) if trace_labels then report_labels("language %a, defining label %a as %a",language,rawtag,text) end @@ -55,6 +66,7 @@ function labels.define(class,name,prefixed) if list then report_labels("defining label set %a",name) for tag, data in next, list do + tag = variables[tag] or tag if data.hidden then -- skip elseif prefixed then @@ -62,17 +74,17 @@ function labels.define(class,name,prefixed) if second then if rawget(variables,first) then if rawget(variables,second) then - definelanguagelabels(data,class,formatters["\\v!%s:\\v!%s"](first,second),tag) + definelanguagelabels(data,class,f_key_key(first,second),tag) else - definelanguagelabels(data,class,formatters["\\v!%s:%s"](first,second),tag) + definelanguagelabels(data,class,f_key_raw(first,second),tag) end elseif rawget(variables,second) then - definelanguagelabels(data,class,formatters["%s:\\v!%s"](first,second),tag) + definelanguagelabels(data,class,f_raw_key(first,second),tag) else - definelanguagelabels(data,class,formatters["%s:%s"](first,second),tag) + definelanguagelabels(data,class,f_raw_raw(first,second),tag) end elseif rawget(variables,rawtag) then - definelanguagelabels(data,class,formatters["\\v!%s"](tag),tag) + definelanguagelabels(data,class,f_key(tag),tag) else definelanguagelabels(data,class,tag,tag) end @@ -102,7 +114,11 @@ end -- interface -commands.definelabels = labels.define +interfaces.implement { + name = "definelabels", + actions = labels.define, + arguments = { "string", "string", "boolean" } +} -- function commands.setstrippedtextprefix(str) -- context(string.strip(str)) @@ -115,7 +131,7 @@ commands.definelabels = labels.define -- text : "a,b,c" -- separators : "{, },{ and }" -function commands.concatcommalist(settings) -- it's too easy to forget that this one is there +local function concatcommalist(settings) -- it's too easy to forget that this one is there local list = settings.list or settings_to_array(settings.text or "") local size = #list local command = settings.command and context[settings.command] or context @@ -140,3 +156,16 @@ function commands.concatcommalist(settings) -- it's too easy to forget that this command(list[size]) end end + +implement { + name = "concatcommalist", + actions = concatcommalist, + arguments = { + { + { "text" }, + { "separators" }, + { "first" }, + { "second" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/lang-lab.mkiv b/Master/texmf-dist/tex/context/base/lang-lab.mkiv index 7dcaaecb414..fbe3346dcff 100644 --- a/Master/texmf-dist/tex/context/base/lang-lab.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-lab.mkiv @@ -84,6 +84,7 @@ \unexpanded\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9% {\setuvalue{setup#1text}{\protecttextprefixes#2\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}% \setuvalue{preset#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}% + \setuvalue{copy#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_copy}% \setuvalue{start#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dotripleempty\lang_labels_text_prefix_start[#1]}% \letvalue{stop#1text}\relax \def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}% @@ -180,7 +181,8 @@ \grabuntil{stop#1text}\lang_labels_text_prefix_start_indeed} \def\lang_labels_text_prefix_start_indeed#1% text (not special checking done here yet, only for long texts anyway) - {\expandafter\edef\csname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname{{\ctxcommand{strip(\!!bs#1\!!es)}}\empty}} + {\expandafter\edef\csname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname% + {{\clf_strip{#1}}\empty}} \def\lang_labels_text_prefix_setup[#1][#2]% {\ifsecondargument @@ -236,17 +238,38 @@ {\expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}} \unexpanded\def\setlabeltextpair#1#2#3#4#5% a fast one for usage at the Lua end - {\expandafter\def\csname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right + {%\writestatus{!!!!}{#1:\reallanguagetag{#2}:#3}% + \expandafter\def\csname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right + +\def\lang_labels_text_prefix_copy[#1][#2]% + {\ifsecondargument + \edef\currenttextprefixtag{\reallanguagetag{#1}}% + \processcommalist[#2]\lang_labels_text_prefix_copy_indeed + \else + \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}% + \processcommalist[#1]\lang_labels_text_prefix_copy_indeed + \fi} + +\def\lang_labels_text_prefix_copy_indeed#1% + {\lang_labels_text_prefix_copy_pair[#1]} + +\def\lang_labels_text_prefix_copy_pair[#1=#2]% + {\lang_labels_text_prefix_copy_pair_indeed{#1}[#2,,]} + +\def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]% + {\expandafter\let + \csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\expandafter\endcsname + \csname\??label\currenttextprefixclass:\currenttextprefixtag:#2\endcsname} \definelabelclass [head] [0] % titles \definelabelclass [label] [0] % texts \definelabelclass [mathlabel] [0] % functions \definelabelclass [taglabel] [2] % tags -\ctxcommand{definelabels("head", "titles", true )} -\ctxcommand{definelabels("label", "texts", true )} -\ctxcommand{definelabels("mathlabel", "functions",false)} -\ctxcommand{definelabels("taglabel", "tags", false)} +\clf_definelabels{head}{titles}\s!true\relax +\clf_definelabels{label}{texts}\s!true\relax +\clf_definelabels{mathlabel}{functions}\s!false\relax +\clf_definelabels{taglabel}{tags}\s!false\relax %D \macros %D {translate} @@ -298,7 +321,7 @@ %D \assigntranslation[en=something,nl=iets]\to\command %D \stoptyping -\def\assigntranslation[#1]\to#2% +\unexpanded\def\assigntranslation[#1]\to#2% bad, this \to {\getparameters[\??translation][#1]% \edef#2{\csname\??translation\currentlanguage\endcsname}} @@ -326,12 +349,12 @@ {\dodoubleempty\typo_helpers_concat_comma_list} \def\typo_helpers_concat_comma_list[#1][#2]% - {\ctxcommand{concatcommalist{ - text = \!!bs#1\!!es, - separators = \!!bs#2\!!es, - first = \!!bs\labeltext{and-1}\!!es, - second = \!!bs\labeltext{and-2}\!!es - }}} + {\clf_concatcommalist + text {#1}% + separators {#2}% + first {\detokenize\expandafter{\normalexpanded{\labeltext{and-1}}}}% + second {\detokenize\expandafter{\normalexpanded{\labeltext{and-2}}}}% + \relax} \setuplabeltext [\s!nl] [and-1={{, }}, and-2={{ en }}] % 1, 2 en 3 \setuplabeltext [\s!en] [and-1={{, }}, and-2={{, }}] % 1, 2, 3 diff --git a/Master/texmf-dist/tex/context/base/lang-mis.mkiv b/Master/texmf-dist/tex/context/base/lang-mis.mkiv index 0c4bc3ac48e..2b886b3cec1 100644 --- a/Master/texmf-dist/tex/context/base/lang-mis.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-mis.mkiv @@ -20,35 +20,28 @@ \unprotect -%D One of \TEX's strong points in building paragraphs is the way -%D hyphenations are handled. Although for real good hyphenation -%D of non||english languages some extensions to the program are -%D needed, fairly good results can be reached with the standard -%D mechanisms and an additional macro, at least in Dutch. - -%D \CONTEXT\ originates in the wish to typeset educational -%D materials, especially in a technical environment. In -%D production oriented environments, a lot of compound words -%D are used. Because the Dutch language poses no limits on -%D combining words, we often favor putting dashes between those -%D words, because it facilitates reading, at least for those -%D who are not that accustomed to it. -%D -%D In \TEX\ compound words, separated by a hyphen, are not -%D hyphenated at all. In spite of the multiple pass paragraph -%D typesetting this can lead to parts of words sticking into -%D the margin. The solution lays in saying \type -%D {spoelwater||terugwinunit} instead of \type -%D {spoelwater-terugwinunit}. By using a one character command -%D like \type {|}, delimited by the same character \type {|}, -%D we get ourselves both a decent visualization (in \TEXEDIT\ -%D and colored verbatim we color these commands yellow) and an -%D efficient way of combining words. -%D -%D The sequence \type{||} simply leads to two words connected by -%D a hyphen. Because we want to distinguish such a hyphen from -%D the one inserted when \TEX\ hyphenates a word, we use a bit -%D longer one. +%D One of \TEX's strong points in building paragraphs is the way hyphenations are +%D handled. Although for real good hyphenation of non||english languages some +%D extensions to the program are needed, fairly good results can be reached with the +%D standard mechanisms and an additional macro, at least in Dutch. +%D +%D \CONTEXT\ originates in the wish to typeset educational materials, especially in +%D a technical environment. In production oriented environments, a lot of compound +%D words are used. Because the Dutch language poses no limits on combining words, we +%D often favor putting dashes between those words, because it facilitates reading, +%D at least for those who are not that accustomed to it. +%D +%D In \TEX\ compound words, separated by a hyphen, are not hyphenated at all. In +%D spite of the multiple pass paragraph typesetting this can lead to parts of words +%D sticking into the margin. The solution lays in saying \type +%D {spoelwater||terugwinunit} instead of \type {spoelwater-terugwinunit}. By using a +%D one character command like \type {|}, delimited by the same character \type {|}, +%D we get ourselves both a decent visualization (in \TEXEDIT\ and colored verbatim +%D we color these commands yellow) and an efficient way of combining words. +%D +%D The sequence \type{||} simply leads to two words connected by a hyphen. Because +%D we want to distinguish such a hyphen from the one inserted when \TEX\ hyphenates +%D a word, we use a bit longer one. %D %D \hyphenation {spoel-wa-ter te-rug-win-unit} %D @@ -56,9 +49,8 @@ %D \test {spoelwater||terugwinunit} %D \stoptest %D -%D As we already said, the \type{|} is a command. This commands -%D accepts an optional argument before it's delimiter, which is -%D also a \type{|}. +%D As we already said, the \type{|} is a command. This commands accepts an optional +%D argument before it's delimiter, which is also a \type{|}. %D %D \hyphenation {po-ly-meer che-mie} %D @@ -66,8 +58,8 @@ %D \test {polymeer|*|chemie} %D \stoptest %D -%D Arguments like \type{*} are not interpreted and inserted -%D directly, in contrary to arguments like: +%D Arguments like \type{*} are not interpreted and inserted directly, in contrary to +%D arguments like: %D %D \starttest %D \test {polymeer|~|chemie} @@ -75,22 +67,21 @@ %D \test {polymeer|(|chemie|)| } %D \stoptest %D -%D Although such situations seldom occur |<|we typeset thousands -%D of pages before we encountered one that forced us to enhance -%D this mechanism|>| we also have to take care of comma's. +%D Although such situations seldom occur |<|we typeset thousands of pages before we +%D encountered one that forced us to enhance this mechanism|>| we also have to take +%D care of comma's. %D -%D \hyphenation {uit-stel-len} +%D \hyphenation {uit-stel-len} %D -%D \starttest -%D \test {op||, in|| en uitstellen} -%D \stoptest +%D \starttest +%D \test {op||, in|| en uitstellen} +%D \stoptest %D -%D The next special case (concerning quotes) was brought to my -%D attention by Piet Tutelaers, one of the driving forces -%D behind rebuilding hyphenation patterns for the dutch -%D language.\footnote{In 1996 the spelling of the dutch -%D language has been slightly reformed which made this topic -%D actual again.} We'll also take care of this case. +%D The next special case (concerning quotes) was brought to my attention by Piet +%D Tutelaers, one of the driving forces behind rebuilding hyphenation patterns for +%D the dutch language.\footnote{In 1996 the spelling of the dutch language has been +%D slightly reformed which made this topic actual again.} We'll also take care of +%D this case. %D %D \starttest %D \test {AOW|'|er} @@ -99,8 +90,7 @@ %D \test {rock|-|'n|-|roller} %D \stoptest %D -%D Tobias Burnus pointed out that I should also support -%D something like +%D Tobias Burnus pointed out that I should also support something like %D %D \starttest %D \test {well|_|known} @@ -117,11 +107,10 @@ %D \macros %D {installdiscretionaries} %D -%D The mechanism described here is one of the older inner parts -%D of \CONTEXT. The most recent extensions concerns some -%D special cases as well as the possibility to install other -%D characters as delimiters. The prefered way of specifying -%D compound words is using \type{||}, which is installed by: +%D The mechanism described here is one of the older inner parts of \CONTEXT. The +%D most recent extensions concerns some special cases as well as the possibility to +%D install other characters as delimiters. The prefered way of specifying compound +%D words is using \type{||}, which is installed by: %D %D \starttyping %D \installdiscretionary | - @@ -153,20 +142,18 @@ %D {compoundhyphen, %D beginofsubsentence,endofsubsentence} %D -%D Now let's go to the macros. First we define some variables. -%D In the main \CONTEXT\ modules these can be tuned by a setup -%D command. Watch the (maybe) better looking compound hyphen. +%D Now let's go to the macros. First we define some variables. In the main \CONTEXT\ +%D modules these can be tuned by a setup command. Watch the (maybe) better looking +%D compound hyphen. \ifx\compoundhyphen \undefined \unexpanded\def\compoundhyphen {\hbox{-\kern-.25ex-}} \fi \ifx\beginofsubsentence\undefined \unexpanded\def\beginofsubsentence{\hbox{\emdash}} \fi \ifx\endofsubsentence \undefined \unexpanded\def\endofsubsentence {\hbox{\emdash}} \fi -%D The last two variables are needed for subsentences -%D |<|like this one|>| which we did not yet mention. -%D -%D We want to enable breaking but at the same time don't want -%D compound characters like |-| or || to be separated from the -%D words. \TEX\ hackers will recognise the next two macro's: +%D The last two variables are needed for subsentences |<|like this one|>| which we +%D did not yet mention. We want to enable breaking but at the same time don't want +%D compound characters like |-| or || to be separated from the words. \TEX\ hackers +%D will recognise the next two macro's: \ifx\prewordbreak \undefined \unexpanded\def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi \ifx\postwordbreak\undefined \unexpanded\def\postwordbreak {\penalty\zerocount \hskip\zeropoint\relax} \fi @@ -177,19 +164,17 @@ %D \macros %D {beginofsubsentencespacing,endofsubsentencespacing} %D -%D In the previous macros we provided two hooks which can be -%D used to support nested sub||sentences. In \CONTEXT\ these -%D hooks are used to insert a small space when needed. +%D In the previous macros we provided two hooks which can be used to support nested +%D sub||sentences. In \CONTEXT\ these hooks are used to insert a small space when +%D needed. \ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi \ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi -%D The following piece of code is a torture test compound -%D hndling. The \type {\relax} before the \type {\ifmmode} is -%D needed because of the alignment scanner (in \ETEX\ this -%D problem is not present because there a protected macro is -%D not expanded. Thanks to Tobias Burnus for providing this -%D example. +%D The following piece of code is a torture test compound handling. The \type +%D {\relax} before the \type {\ifmmode} is needed because of the alignment scanner +%D (in \ETEX\ this problem is not present because there a protected macro is not +%D expanded. Thanks to Tobias Burnus for providing this example. %D %D \startformula %D \left|f(x_n)-{1\over2}\right| = @@ -234,10 +219,9 @@ \def\lang_discretionaries_process_none#1% {\detokenize{#1}} -%D The macro \type{\lang_discretionaries_check_before} takes care -%D of loners like \type{||word}, while it counterpart \type -%D {\lang_discretionaries_check_after} is responsible for handling -%D the comma. +%D The macro \type{\lang_discretionaries_check_before} takes care of loners like +%D \type{||word}, while it counterpart \type {\lang_discretionaries_check_after} is +%D responsible for handling the comma. \newsignal\compoundbreakpoint @@ -327,8 +311,8 @@ %D \macros %D {directdiscretionary} %D -%D In those situations where the nature of characters is -%D less predictable, we can use the more direct approach: +%D In those situations where the nature of characters is less predictable, we can +%D use the more direct approach: \unexpanded\def\directdiscretionary {\csname @@ -450,10 +434,9 @@ %D \macros %D {fakecompoundhyphen} %D -%D In headers and footers as well as in active pieces of text -%D we need a dirty hack. Try to imagine what is needed to -%D savely break the next text across a line and at the same -%D time make the words interactive. +%D In headers and footers as well as in active pieces of text we need a dirty hack. +%D Try to imagine what is needed to savely break the next text across a line and at +%D the same time make the words interactive. %D %D \starttyping %D \goto{Some||Long||Word} @@ -471,10 +454,9 @@ %D {midworddiscretionary} %D %D If needed, one can add a discretionary hyphen using \type -%D {\midworddiscretionary}. This macro does the same as -%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented -%D earlier, this one also looks ahead for spaces and grouping -%D tokens. +%D {\midworddiscretionary}. This macro does the same as \PLAIN\ \TEX's \type {\-}, +%D but, like the ones implemented earlier, this one also looks ahead for spaces and +%D grouping tokens. \unexpanded\def\midworddiscretionary {\futurelet\nexttoken\lang_discretionaries_mid_word} @@ -489,15 +471,13 @@ %D \macros %D {installcompoundcharacter} %D -%D When Tobias Burnus started translating the dutch manual of -%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support -%D the \type{german.sty} method of handling compound -%D characters, especially the umlaut. This package is meant for -%D use with \PLAIN\ \TEX\ as well as \LATEX. +%D When Tobias Burnus started translating the dutch manual of \PPCHTEX\ into german, +%D he suggested to let \CONTEXT\ support the \type{german.sty} method of handling +%D compound characters, especially the umlaut. This package is meant for use with +%D \PLAIN\ \TEX\ as well as \LATEX. %D -%D I decided to implement compound character support as -%D versatile as possible. As a result one can define his own -%D compound character support, like: +%D I decided to implement compound character support as versatile as possible. As a +%D result one can define his own compound character support, like: %D %D \starttyping %D \installcompoundcharacter "a {\"a} @@ -515,25 +495,24 @@ %D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}} %D \stoptyping %D -%D The support is not limited to alphabetic characters, so the -%D next definition is also valid. +%D The support is not limited to alphabetic characters, so the next definition is +%D also valid. %D %D \starttyping %D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}} %D \stoptyping %D -%D The implementation looks familiar and uses the same tricks as -%D mentioned earlier in this module. We take care of two -%D arguments, which complicates things a bit. +%D The implementation looks familiar and uses the same tricks as mentioned earlier +%D in this module. We take care of two arguments, which complicates things a bit. \installcorenamespace{compoundnormal} \installcorenamespace{compoundsingle} \installcorenamespace{compoundmultiple} \installcorenamespace{compounddefinition} -%D When we started working on MK IV code, we needed a different -%D approach for defining the active character itself. In MK II as -%D well as in MK IV we now use the catcode vectors. +%D When I started working on \MKIV\ code, we needed a different approach for +%D defining the active character itself. In \MKII\ as well as in \MKIV\ we now use +%D the catcode vectors. \setnewconstant\compoundcharactermode\plusone @@ -551,22 +530,19 @@ \expandafter\letcatcodecommand\expandafter\ctxcatcodes\expandafter\c_lang_compounds_character\csname\??compounddefinition\detokenize{#1}\endcsname \fi} -%D We can also ignore definitions (needed in for instance \XML). Beware, -%D this macro is supposed to be used grouped! +%D We can also ignore definitions (needed in for instance \XML). Beware, this macro +%D is supposed to be used grouped! \def\ignorecompoundcharacter {\compoundcharactermode\zerocount} -%D In handling the compound characters we have to take care of -%D \type{\bgroup} and \type{\egroup} tokens, so we end up with -%D a multi||step interpretation macro. We look ahead for a -%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being -%D no user of this mechanism, the credits for testing them goes -%D to Tobias Burnus, the first german user of \CONTEXT. +%D In handling the compound characters we have to take care of \type {\bgroup} and +%D \type {\egroup} tokens, so we end up with a multi||step interpretation macro. We +%D look ahead for a \type {\bgroup}, \type {\egroup} or \type {\blankspace}. Being +%D no user of this mechanism, the credits for testing them goes to Tobias Burnus, +%D the first german user of \CONTEXT. %D -%D We define these macros as \type{\long} because we can -%D expect \type{\par} tokens. We need to look into the future -%D with \type{\futurelet} to prevent spaces from +%D We need to look into the future with \type{\futurelet} to prevent spaces from %D disappearing. \def\lang_compounds_handle_character#1% @@ -604,12 +580,11 @@ \tripleexpandafter\lang_compounds_handle_character_two \fi\fi\fi} -%D Besides taken care of the grouping and space tokens, we have -%D to deal with three situations. First we look if the next -%D character equals the first one, if so, then we just insert -%D the original. Next we look if indeed a compound character is -%D defined. We either execute the compound character or just -%D insert the first. So we have +%D Besides taken care of the grouping and space tokens, we have to deal with three +%D situations. First we look if the next character equals the first one, if so, then +%D we just insert the original. Next we look if indeed a compound character is +%D defined. We either execute the compound character or just insert the first. So we +%D have %D %D \starttyping %D @@ -639,8 +614,8 @@ \fi\fi\fi \next} -%D For very obscure applications (see for an application \type -%D {lang-sla.tex}) we provide: +%D For very obscure applications (see for an application \type {lang-sla.tex}) we +%D provide: \def\simplifiedcompoundcharacter#1#2% {\ifcsname\??compoundsingle\string#1\string#2\endcsname @@ -652,8 +627,8 @@ %D \macros %D {disablediscretionaries,disablecompoundcharacter} %D -%D Occasionally we need to disable this mechanism. For the -%D moment we assume that \type {|} is used. +%D Occasionally we need to disable this mechanism. For the moment we assume that +%D \type {|} is used. \let\disablediscretionaries \ignorediscretionaries \let\disablecompoundcharacters\ignorecompoundcharacter @@ -668,9 +643,8 @@ %D \macros %D {compound} %D -%D We will overload the already active \type {|} so we have -%D to save its meaning in order to be able to use this handy -%D macro. +%D We will overload the already active \type {|} so we have to save its meaning in +%D order to be able to use this handy macro. %D %D \starttyping %D so test\compound{}test can be used instead of test||test @@ -688,8 +662,7 @@ \egroup -%D Here we hook some code into the clean up mechanism needed -%D for verbatim data. +%D Here we hook some code into the clean up mechanism needed for verbatim data. \appendtoks \disablecompoundcharacters diff --git a/Master/texmf-dist/tex/context/base/lang-rep.lua b/Master/texmf-dist/tex/context/base/lang-rep.lua index 02eb59f487c..95a5e545aac 100644 --- a/Master/texmf-dist/tex/context/base/lang-rep.lua +++ b/Master/texmf-dist/tex/context/base/lang-rep.lua @@ -15,7 +15,7 @@ if not modules then modules = { } end modules ['lang-rep'] = { -- although (given experiences so far) we don't really need that. After all, each problem -- is somewhat unique. -local type = type +local type, tonumber = type, tonumber local utfbyte, utfsplit = utf.byte, utf.split local P, C, U, Cc, Ct, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns.utf8character, lpeg.Cc, lpeg.Ct, lpeg.match local find = string.find @@ -56,6 +56,8 @@ local unsetvalue = attributes.unsetvalue local v_reset = interfaces.variables.reset +local implement = interfaces.implement + local replacements = languages.replacements or { } languages.replacements = replacements @@ -75,6 +77,8 @@ table.setmetatableindex(lists,function(lists,name) return data end) +lists[v_reset].attribute = unsetvalue -- so we discard 0 + -- todo: glue kern local function add(root,word,replacement) @@ -260,7 +264,7 @@ end local enabled = false -function replacements.set(n) -- number or 'reset' +function replacements.set(n) if n == v_reset then n = unsetvalue else @@ -278,5 +282,14 @@ end -- interface -commands.setreplacements = replacements.set -commands.addreplacements = replacements.add +implement { + name = "setreplacements", + actions = replacements.set, + arguments = "string" +} + +implement { + name = "addreplacements", + actions = replacements.add, + arguments = { "string", "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/lang-rep.mkiv b/Master/texmf-dist/tex/context/base/lang-rep.mkiv index b3f21f22a4f..a98d51f6c8b 100644 --- a/Master/texmf-dist/tex/context/base/lang-rep.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-rep.mkiv @@ -51,7 +51,7 @@ %D \stoptyping \unexpanded\def\setreplacements[#1]% - {\ctxcommand{setreplacements("#1")}} + {\clf_setreplacements{#1}} \unexpanded\def\resetreplacements {\attribute\replacementsattribute\attributeunsetvalue} @@ -61,7 +61,7 @@ \unexpanded\def\languages_replacements_replace[#1][#2][#3]% {\ifthirdargument - \ctxcommand{addreplacements("#1",\!!bs#2\!!es,\!!bs#3\!!es)}% + \clf_addreplacements{#1}{#2}{#3}% \fi} \appendtoks diff --git a/Master/texmf-dist/tex/context/base/lang-txt.lua b/Master/texmf-dist/tex/context/base/lang-txt.lua index 4c3a3a9859c..298e05db4be 100644 --- a/Master/texmf-dist/tex/context/base/lang-txt.lua +++ b/Master/texmf-dist/tex/context/base/lang-txt.lua @@ -415,6 +415,27 @@ data.labels={ }, }, texts={ + ["year"]={ + labels={ + en="year", + nl="jaar", + kr="년", + }, + }, + ["month"]={ + labels={ + en="month", + nl="maand", + kr="월", + }, + }, + ["day"]={ + labels={ + en="day", + nl="dag", + kr="일", + }, + }, ["and"]={ labels={ af="", @@ -506,7 +527,7 @@ data.labels={ hu="április", it="aprile", ja="4", - kr="4월", + kr="4", la="Aprilis", lt="balandžio", nb="april", @@ -613,7 +634,7 @@ data.labels={ hu="augusztus", it="agosto", ja="8", - kr="8월", + kr="8", la="Augustus", lt="rugpjūčio", nb="august", @@ -681,7 +702,7 @@ data.labels={ fr="Chapitre ", gr="Κεφάλαιο", hr="Poglavlje ", - hu=",. fejezet:", + hu={""," fejezet"}, it="", ja={"第","章"}, kr={"제","장"}, @@ -756,7 +777,7 @@ data.labels={ hu="december", it="dicembre", ja="12", - kr="12월", + kr="12", la="December", lt="gruodžio", nb="desember", @@ -828,7 +849,7 @@ data.labels={ hu="február", it="febbraio", ja="2", - kr="2월", + kr="2", la="Februarius", lt="vasario", nb="februar", @@ -895,12 +916,12 @@ data.labels={ fr="Figure ", gr="Σχήμα", hr="Slika ", - hu=",. ábra:", + hu={""," ábra"}, it="Fig. ", ja="図", - kr="그림", + kr="그림 ", la="Imago ", - lt=", pav.", + lt={""," pav."}, nb="Figur ", nl="Figuur ", nn="Figur ", @@ -969,7 +990,7 @@ data.labels={ fr="Illustration ", gr="Γραφικό", hr="Slika ", - hu=",. kép:", + hu={""," kép"}, it="Grafico ", ja="イラスト", la="Typus ", @@ -990,6 +1011,18 @@ data.labels={ vi="Đồ thị", }, }, + precedingpage={ + labels={ + en="on a preceding page", + nl="op een voorgaande bladzijde", + }, + }, + followingpage={ + labels={ + en="on a following page", + nl="op een volgende bladzijde", + }, + }, hencefore={ labels={ af="", @@ -1041,6 +1074,7 @@ data.labels={ hr="vidi ispod", hu="lásd lejjebb", it="come mostrato sotto", + kr="이후로", la="", lt="kaip parodyta žemiau", nb="som vist under", @@ -1074,7 +1108,7 @@ data.labels={ fr="Intermède ", gr="Παύση", hr="Intermeco ", - hu=",. intermezzo:", + hu={""," intermezzo"}, it="Intermezzo ", ja="間奏曲", kr="간주곡", @@ -1116,7 +1150,7 @@ data.labels={ hu="január", it="gennaio", ja="1", - kr="1월", + kr="1", la="Ianuarius", lt="sausio", nb="januar", @@ -1189,7 +1223,7 @@ data.labels={ hu="július", it="luglio", ja="7", - kr="7월", + kr="7", la="Iulius", lt="liepos", nb="juli", @@ -1261,7 +1295,7 @@ data.labels={ hu="június", it="giugno", ja="6", - kr="6월", + kr="6", la="Iunius", lt="birželio", nb="juni", @@ -1328,7 +1362,7 @@ data.labels={ fr="ligne ", gr="Γραμμή", hr="redak ", - hu=",. sor:", + hu={""," sor"}, it="riga ", ja="線", kr="행", @@ -1406,7 +1440,7 @@ data.labels={ hu="március", it="marzo", ja="3", - kr="3월", + kr="3", la="Martius", lt="kovo", nb="mars", @@ -1479,7 +1513,7 @@ data.labels={ hu="május", it="maggio", ja="5", - kr="5월", + kr="5", la="Maius", lt="gegužės", nb="mai", @@ -1588,7 +1622,7 @@ data.labels={ hu="november", it="novembre", ja="11", - kr="11월", + kr="11", la="November", lt="lapkričio", nb="november", @@ -1659,7 +1693,7 @@ data.labels={ hu="október", it="ottobre", ja="10", - kr="10월", + kr="10", la="October", lt="spalio", nb="oktober", @@ -1761,12 +1795,12 @@ data.labels={ fr="Partie ", gr="Μέρος", hr="Dio ", - hu=",. rész:", + hu={""," rész"}, it="Parte ", ja={"第","パート"}, kr={"제","부"}, la="Pars ", - lt=", dalis", + lt={""," dalis"}, nb="Del", nl="Deel ", nn="Del", @@ -1913,7 +1947,7 @@ data.labels={ hu="szeptember", it="settembre", ja="9", - kr="9월", + kr="9", la="September", lt="rugsėjo", nb="september", @@ -2128,12 +2162,12 @@ data.labels={ fr="Tableau ", gr="Πίνακας", hr="Tablica ", - hu=",. táblázat:", + hu={""," táblázat"}, it="Tabella ", ja="表", - kr="표", + kr="표 ", la="Tabula ", - lt=", lentelė.", + lt={""," lentelė."}, nb="Tabell ", nl="Tabel ", nn="Tabell ", @@ -2355,7 +2389,7 @@ data.labels={ hu="Ábrák", it="Figure", ja="図", - kr="그림", + kr="그림 ", la="Imagines", lt="Iliustracijos", nb="Figurer", @@ -2392,7 +2426,7 @@ data.labels={ hu="Grafikák", it="Grafici", ja="グラフ", - kr="그래픽", + kr="그래픽 ", la="Typi", lt="Graphics", nb="Bilde", @@ -2429,7 +2463,7 @@ data.labels={ hu="Index", it="Indice", ja="目次", - kr="색인", + kr="찾아보기", la="Indices", lt="Rodyklė", nb="Register", @@ -2537,6 +2571,7 @@ data.labels={ hr="Literatura", hu="Bibliográfia", it="Bibliografia", + kr="참고문헌", la="", lt="Literatūra", nb="", @@ -2573,7 +2608,7 @@ data.labels={ hu="Táblázatok", it="Tabelle", ja="机", - kr="표", + kr="표 ", la="Tabulae", lt="Lentelės", nb="Tabeller", @@ -2630,4 +2665,135 @@ data.labels={ }, }, }, + btx = { + ["mastersthesis"] = { + labels = { + en = "Master's thesis", + fr = "Thèse de master (DEA, DESS, master)", + de = "Masterarbeit", + }, + }, + ["phdthesis"] = { + labels = { + en = "PhD thesis", + fr = "Thèse de doctorat", + de = "Dissertation", + }, + }, + ["technicalreport"] = { + labels = { + en = "Technical report", + fr = "Rapport technique", + de = "Technischer Bericht", + }, + }, + -- + ["editor"] = { + labels = { + en = "editor", + fr = "éditeur", + de = "Herausgeber", + }, + }, + ["editors"] = { + labels = { + en = "editors", + fr = "éditeurs", + de = "Herausgeber", + }, + }, + ["edition"] = { + labels = { + en = "edition", + fr = "édition", + de = "Auflage", + }, + }, + -- + ["volume"] = { + labels = { + en = "volume", + de = "Band", + }, + }, + ["Volume"] = { + labels = { + en = "Volume", + de = "Band", + }, + }, + ["number"] = { + labels = { + en = "number", + fr = "numéro", + de = "Numer", + }, + }, + ["Number"] = { + labels = { + en = "Number", + fr = "Numéro", + de = "Numer", + }, + }, + ["in"] = { + labels = { + en = "in", + fr = "dans", + de = "in", + }, + }, + ["of"] = { + labels = { + en = "of", + fr = "de", + de = "von", + }, + }, + -- + ["In"] = { + labels = { + en = "In", + fr = "Dans", + de = "In", + }, + }, + -- + ["p"] = { + labels = { + en = "p", + de = "S", + }, + }, + ["pp"] = { + labels = { + en = "pp", + de = "S", + }, + }, + ["pages"] = { + labels = { + en = "pages", + de = "Seiten", + }, + }, + -- + ["and"] = { + labels = { + en = "and", + de = "und", + }, + }, + ["others"] = { + labels = { + en = "et al.", + }, + }, + } } + +local functions = data.labels.functions + +functions.asin = functions.arcsin +functions.acos = functions.arccos +functions.atan = functions.arctan diff --git a/Master/texmf-dist/tex/context/base/lang-url.lua b/Master/texmf-dist/tex/context/base/lang-url.lua index fb4147580d2..39418beefa2 100644 --- a/Master/texmf-dist/tex/context/base/lang-url.lua +++ b/Master/texmf-dist/tex/context/base/lang-url.lua @@ -8,10 +8,14 @@ if not modules then modules = { } end modules ['lang-url'] = { local utfcharacters, utfvalues, utfbyte, utfchar = utf.characters, utf.values, utf.byte, utf.char -commands = commands or { } local commands = commands +local context = context -context = context +local implement = interfaces.implement + +local variables = interfaces.variables +local v_before = variables.before +local v_after = variables.after local is_letter = characters.is_letter @@ -26,39 +30,39 @@ commands.hyphenatedurl = commands.hyphenatedurl or { } local hyphenatedurl = commands.hyphenatedurl local characters = utilities.storage.allocate { - ["!"] = 1, - ["\""] = 1, - ["#"] = 1, - ["$"] = 1, - ["%"] = 1, - ["&"] = 1, - ["("] = 1, - ["*"] = 1, - ["+"] = 1, - [","] = 1, - ["-"] = 1, - ["."] = 1, - ["/"] = 1, - [":"] = 1, - [";"] = 1, - ["<"] = 1, - ["="] = 1, - [">"] = 1, - ["?"] = 1, - ["@"] = 1, - ["["] = 1, - ["\\"] = 1, - ["^"] = 1, - ["_"] = 1, - ["`"] = 1, - ["{"] = 1, - ["|"] = 1, - ["~"] = 1, - - ["'"] = 2, - [")"] = 2, - ["]"] = 2, - ["}"] = 2, + ["!"] = "before", + ["\""] = "before", + ["#"] = "before", + ["$"] = "before", + ["%"] = "before", + ["&"] = "before", + ["("] = "before", + ["*"] = "before", + ["+"] = "before", + [","] = "before", + ["-"] = "before", + ["."] = "before", + ["/"] = "before", + [":"] = "before", + [";"] = "before", + ["<"] = "before", + ["="] = "before", + [">"] = "before", + ["?"] = "before", + ["@"] = "before", + ["["] = "before", + ["\\"] = "before", + ["^"] = "before", + ["_"] = "before", + ["`"] = "before", + ["{"] = "before", + ["|"] = "before", + ["~"] = "before", + + ["'"] = "after", + [")"] = "after", + ["]"] = "after", + ["}"] = "after", } local mapping = utilities.storage.allocate { @@ -129,10 +133,10 @@ local function action(hyphenatedurl,str,left,right,disc) ctx_d(utfbyte(s)) else local c = characters[s] - if c == 1 then + if c == v_before then p = false ctx_b(utfbyte(s)) - elseif c == 2 then + elseif c == v_after then p = false ctx_a(utfbyte(s)) else @@ -162,8 +166,21 @@ table.setmetatablecall(hyphenatedurl,action) -- watch out: a caller function hyphenatedurl.setcharacters(str,value) -- 1, 2 == before, after for s in utfcharacters(str) do - characters[s] = value or 1 + characters[s] = value or v_before end end -- .hyphenatedurl.setcharacters("')]}",2) + +implement { + name = "sethyphenatedurlcharacters", + actions = hyphenatedurl.setcharacters, + arguments = { "string", "string" } +} + +implement { + name = "hyphenatedurl", + scope = "private", + actions = function(...) action(hyphenatedurl,...) end, + arguments = { "string", "integer", "integer", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/lang-url.mkiv b/Master/texmf-dist/tex/context/base/lang-url.mkiv index 8990dccd86f..e7d62ba016c 100644 --- a/Master/texmf-dist/tex/context/base/lang-url.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-url.mkiv @@ -44,18 +44,21 @@ \newtoks\everyhyphenatedurl \appendtoks - \let\&\letterampersand - \let\#\letterhash - \let\~\lettertilde - \let\\\letterbackslash - \let\$\letterdollar - \let\^\letterhat - \let\_\letterunderscore - \let\{\letterleftbrace - \let\}\letterrightbrace - \let\|\letterbar - \let~=\lettertilde - \let|=\letterbar + \resetfontfeature + \resetcharacterspacing + % + \let\&\letterampersand + \let\#\letterhash + \let\~\lettertilde + \let\\\letterbackslash + \let\$\letterdollar + \let\^\letterhat + \let\_\letterunderscore + \let\{\letterleftbrace + \let\}\letterrightbrace + \let\|\letterbar + \let~=\lettertilde + \let|=\letterbar \to \everyhyphenatedurl \let\hyphenatedurlseparator \empty % \periodcentered @@ -86,9 +89,9 @@ \let\lang_url_show\relax -\unexpanded\def\sethyphenatedurlnormal#1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,0)}} % Lua names will change -\unexpanded\def\sethyphenatedurlbefore#1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,1)}} % Lua names will change -\unexpanded\def\sethyphenatedurlafter #1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,2)}} % Lua names will change +\unexpanded\def\sethyphenatedurlnormal#1{\clf_sethyphenatedurlcharacters{#1}{\v!normal}} +\unexpanded\def\sethyphenatedurlbefore#1{\clf_sethyphenatedurlcharacters{#1}{\v!before}} +\unexpanded\def\sethyphenatedurlafter #1{\clf_sethyphenatedurlcharacters{#1}{\v!after }} % \sethyphenatedurlafter{ABCDEF} @@ -106,12 +109,12 @@ \let\C\lang_url_C % character_nobreak \scratchskipone\zeropoint\s!plus\dimexpr\emwidth/12\s!minus\dimexpr\emwidth/24\relax % 1.00pt @ 12pt \scratchskiptwo\zeropoint\s!plus\dimexpr\emwidth/48\s!minus\dimexpr\emwidth/96\relax % 0.25pt @ 12pt - \normalexpanded{\noexpand\ctxcommand{hyphenatedurl( - \!!bs\noexpand\detokenize{#1}\!!es, - \number\hyphenatedurllefthyphenmin, - \number\hyphenatedurlrighthyphenmin, - "\hyphenatedurldiscretionary" - )}}% + \normalexpanded{\noexpand\clf_hyphenatedurl + {\noexpand\detokenize{#1}}% + \hyphenatedurllefthyphenmin + \hyphenatedurlrighthyphenmin + {\hyphenatedurldiscretionary}% + }% \endgroup} %D \macros @@ -138,3 +141,31 @@ % \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}} \protect \endinput + +% \setuppapersize[A7] +% +% \unexpanded\def\WhateverA#1% +% {\dontleavehmode +% \begingroup +% \prehyphenchar"B7\relax +% \setbox\scratchbox\hbox{\tttf#1}% +% \prehyphenchar`-\relax +% \unhbox\scratchbox +% \endgroup} +% +% \unexpanded\def\WhateverB#1% +% {\dontleavehmode +% \begingroup +% \tttf +% \prehyphenchar\minusone +% % \localrightbox{\llap{_}}% +% \localrightbox{\llap{\smash{\lower1.5ex\hbox{\char"2192}}}}% +% \setbox\scratchbox\hbox{#1}% +% \prehyphenchar`-\relax +% \unhbox\scratchbox +% \endgroup} +% +% \begingroup \hsize1cm +% \WhateverA{thisisaboringandverylongcommand}\par +% \WhateverB{thisisaboringandverylongcommand}\par +% \endgroup diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.lua b/Master/texmf-dist/tex/context/base/lang-wrd.lua index 5fc23757ef9..b564a02aec9 100644 --- a/Master/texmf-dist/tex/context/base/lang-wrd.lua +++ b/Master/texmf-dist/tex/context/base/lang-wrd.lua @@ -14,7 +14,10 @@ local P, S, Cs = lpeg.P, lpeg.S, lpeg.Cs local report_words = logs.reporter("languages","words") -local nodes, node, languages = nodes, node, languages +local nodes = nodes +local languages = languages + +local implement = interfaces.implement languages.words = languages.words or { } local words = languages.words @@ -361,6 +364,24 @@ end -- interface -commands.enablespellchecking = words.enable -commands.disablespellchecking = words.disable -commands.loadspellchecklist = words.load +implement { + name = "enablespellchecking", + actions = words.enable, + arguments = { + { + { "method" }, + { "list" } + } + } +} + +implement { + name = "disablespellchecking", + actions = words.disable +} + +implement { + name = "loadspellchecklist", + arguments = { "string", "string" }, + actions = words.load +} diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv index 6824899121f..8c544773b3a 100644 --- a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv +++ b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv @@ -40,15 +40,18 @@ \appendtoks \doifelse{\directspellcheckingparameter\c!state}\v!start - {\ctxcommand{enablespellchecking { method = "\directspellcheckingparameter\c!method", list = "\directspellcheckingparameter\c!list" }}} - {\ctxcommand{disablespellchecking()}}% + {\clf_enablespellchecking + method {\directspellcheckingparameter\c!method}% + list {\directspellcheckingparameter\c!list}% + \relax} + {\clf_disablespellchecking}% \to \everysetupspellchecking \unexpanded\def\loadspellchecklist {\dodoubleempty\lang_spellchecking_load_list} \def\lang_spellchecking_load_list[#1][#2]% - {\ctxcommand{loadspellchecklist("#1","#2")}} + {\clf_loadspellchecklist{#1}{#2}} \setupspellchecking [\c!state=\v!stop, diff --git a/Master/texmf-dist/tex/context/base/lpdf-ano.lua b/Master/texmf-dist/tex/context/base/lpdf-ano.lua index ab3a7405369..f5e320a0021 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-ano.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-ano.lua @@ -116,8 +116,8 @@ local pdf_border_style = pdfarray { 0, 0, 0 } -- radius radius linewidth local pdf_border_color = nil local set_border = false -function pdfborder() - border_set = true +local function pdfborder() + set_border = true return pdf_border_style, pdf_border_color end @@ -157,6 +157,9 @@ local pagereferences = allocate() -- annots are cached themselves setmetatableindex(pagedestinations, function(t,k) k = tonumber(k) + if not k or k <= 0 then + return pdfnull() + end local v = rawget(t,k) if v then -- report_reference("page number expected, got %s: %a",type(k),k) @@ -172,6 +175,9 @@ end) setmetatableindex(pagereferences,function(t,k) k = tonumber(k) + if not k or k <= 0 then + return nil + end local v = rawget(t,k) if v then return v @@ -244,7 +250,7 @@ local function pdfnametree(destinations) for j=i,amount do local destination = sorted[j] local pagenumber = destinations[destination] - names[#names+1] = destination + names[#names+1] = tostring(destination) -- tostring is a safeguard names[#names+1] = pdfreference(pagenumber) end local first = sorted[i] @@ -325,7 +331,7 @@ local f_fith = formatters["<< /D [ %i 0 R /FitH %0.3F ] >>"] local f_fitv = formatters["<< /D [ %i 0 R /FitV %0.3F ] >>"] local f_fitbh = formatters["<< /D [ %i 0 R /FitBH %0.3F ] >>"] local f_fitbv = formatters["<< /D [ %i 0 R /FitBV %0.3F ] >>"] -local f_fitr = formatters["<< /D [ %i 0 R /FitR [ %0.3F %0.3F %0.3F %0.3F ] ] >>"] +local f_fitr = formatters["<< /D [ %i 0 R /FitR %0.3F %0.3F %0.3F %0.3F ] >>"] local v_standard = variables.standard local v_frame = variables.frame @@ -338,15 +344,28 @@ local v_tight = variables.tight -- nicer is to create dictionaries and set properties but it's a bit overkill +-- The problem with the following settings is that they are guesses: we never know +-- if a box is part of something larger that needs to be in view, or that we are +-- dealing with a vbox or vtop so the used h/d values cannot be trusted in a tight +-- view. Of course some decent additional offset would be nice so maybe i'll add +-- that some day. I never use anything else than 'fit' anyway as I think that the +-- document should fit the device (and vice versa). In fact, with todays swipe +-- and finger zooming this whole view is rather useless and as with any zooming +-- one looses the overview and keeps zooming. + local destinationactions = { - [v_standard] = function(r,w,h,d) return f_xyz (r,pdfrectangle(w,h,d)) end, -- local left,top with zoom (0 in our case) - [v_frame] = function(r,w,h,d) return f_fitr (r,pdfrectangle(w,h,d)) end, -- fit rectangle in window - [v_width] = function(r,w,h,d) return f_fith (r, gethpos() *factor) end, -- top coordinate, fit width of page in window - [v_minwidth] = function(r,w,h,d) return f_fitbh(r, gethpos() *factor) end, -- top coordinate, fit width of content in window - [v_height] = function(r,w,h,d) return f_fitv (r,(getvpos()+h)*factor) end, -- left coordinate, fit height of page in window - [v_minheight] = function(r,w,h,d) return f_fitbv(r,(getvpos()+h)*factor) end, -- left coordinate, fit height of content in window - [v_fit] = f_fit, -- fit page in window - [v_tight] = f_fitb, -- fit content in window + -- [v_standard] = function(r,w,h,d) return f_xyz (r,pdfrectangle(w,h,d)) end, -- local left,top with zoom (0 in our case) + [v_standard] = function(r,w,h,d) return f_xyz (r,gethpos()*factor,(getvpos()+h)*factor) end, -- local left,top with no zoom + [v_frame] = function(r,w,h,d) return f_fitr (r,pdfrectangle(w,h,d)) end, -- fit rectangle in window + -- [v_width] = function(r,w,h,d) return f_fith (r,gethpos()*factor) end, -- top coordinate, fit width of page in window + [v_width] = function(r,w,h,d) return f_fith (r,(getvpos()+h)*factor) end, -- top coordinate, fit width of page in window + -- [v_minwidth] = function(r,w,h,d) return f_fitbh(r,gethpos()*factor) end, -- top coordinate, fit width of content in window + [v_minwidth] = function(r,w,h,d) return f_fitbh(r,(getvpos()+h)*factor) end, -- top coordinate, fit width of content in window + -- [v_height] = function(r,w,h,d) return f_fitv (r,(getvpos()+h)*factor) end, -- left coordinate, fit height of page in window + [v_height] = function(r,w,h,d) return f_fitv (r,gethpos()*factor) end, -- left coordinate, fit height of page in window + -- [v_minheight] = function(r,w,h,d) return f_fitbv(r,(getvpos()+h)*factor) end, -- left coordinate, fit height of content in window + [v_minheight] = function(r,w,h,d) return f_fitbv(r,gethpos()*factor) end, -- left coordinate, fit height of content in window [v_fit] = f_fit, -- fit page in window + [v_tight] = f_fitb, -- fit content in window } local mapping = { @@ -377,7 +396,7 @@ end) local function flushdestination(width,height,depth,names,view) local r = pdfpagereference(texgetcount("realpageno")) - if view == defaultview then + if view == defaultview or not view or view == "" then r = pagedestinations[r] else local action = view and destinationactions[view] or defaultaction @@ -420,6 +439,9 @@ function nodeinjections.destination(width,height,depth,names,view) usedviews[name] = view names[n] = autoprefix .. name doview = true + else + -- names[n] = autoprefix .. name + names[n] = false end end elseif method == v_page then @@ -540,7 +562,9 @@ local function pdfaction(actions) if what then what = what(a,actions) end - if what then + if action == what then + -- ignore this one, else we get a loop + elseif what then action.Next = what action = what else @@ -1025,53 +1049,109 @@ function specials.action(var) end end -local function build(levels,start,parent,method) - local startlevel = levels[start][1] +local function build(levels,start,parent,method,nested) + local startlevel = levels[start].level local i, n = start, 0 local child, entry, m, prev, first, last, f, l while i and i <= #levels do - local li = levels[i] - local level, title, reference, open = li[1], li[2], li[3], li[4] - if level < startlevel then - pdfflushobject(child,entry) - return i, n, first, last - elseif level == startlevel then - if trace_bookmarks then - report_bookmark("%3i %w%s %s",reference.realpage,(level-1)*2,(open and "+") or "-",title) - end - local prev = child - child = pdfreserveobject() - if entry then - entry.Next = child and pdfreference(child) - pdfflushobject(prev,entry) - end - entry = pdfdictionary { - Title = pdfunicode(title), - Parent = parent, - Prev = prev and pdfreference(prev), - A = somedestination(reference.internal,reference.internal,reference.realpage), - } - -- entry.Dest = somedestination(reference.internal,reference.internal,reference.realpage) - if not first then first, last = child, child end - prev = child - last = prev - n = n + 1 + local current = levels[i] + if current.usedpage == false then + -- safeguard i = i + 1 - elseif i < #levels and level > startlevel then - i, m, f, l = build(levels,i,pdfreference(child),method) - entry.Count = (open and m) or -m - if m > 0 then - entry.First, entry.Last = pdfreference(f), pdfreference(l) - end else - -- missing intermediate level but ok - i, m, f, l = build(levels,i,pdfreference(child),method) - entry.Count = (open and m) or -m - if m > 0 then - entry.First, entry.Last = pdfreference(f), pdfreference(l) + local level = current.level + local title = current.title + local reference = current.reference + local opened = current.opened + local reftype = type(reference) + local variant = "unknown" + if reftype == "table" then + -- we're okay + variant = "list" + elseif reftype == "string" then + local resolved = references.identify("",reference) + local realpage = resolved and structures.references.setreferencerealpage(resolved) or 0 + if realpage > 0 then + variant = "realpage" + realpage = realpage + end + elseif reftype == "number" then + if reference > 0 then + variant = "realpage" + realpage = reference + end + else + -- error + end + if variant == "unknown" then + -- error, ignore + i = i + 1 + elseif level <= startlevel then + if level < startlevel then + if nested then -- could be an option but otherwise we quit too soon + if entry then + pdfflushobject(child,entry) + else + report_bookmark("error 1") + end + return i, n, first, last + else + report_bookmark("confusing level change at level %a around %a",level,title) + end + end + if trace_bookmarks then + report_bookmark("%3i %w%s %s",reference.realpage,(level-1)*2,(opened and "+") or "-",title) + end + local prev = child + child = pdfreserveobject() + if entry then + entry.Next = child and pdfreference(child) + pdfflushobject(prev,entry) + end + local action = nil + if variant == "list" then + action = somedestination(reference.internal,reference.internal,reference.realpage) + elseif variant == "realpage" then + action = pagereferences[realpage] + end + entry = pdfdictionary { + Title = pdfunicode(title), + Parent = parent, + Prev = prev and pdfreference(prev), + A = action, + } + -- entry.Dest = somedestination(reference.internal,reference.internal,reference.realpage) + if not first then first, last = child, child end + prev = child + last = prev + n = n + 1 + i = i + 1 + elseif i < #levels and level > startlevel then + i, m, f, l = build(levels,i,pdfreference(child),method,true) + if entry then + entry.Count = (opened and m) or -m + if m > 0 then + entry.First = pdfreference(f) + entry.Last = pdfreference(l) + end + else + report_bookmark("error 2") + end + else + -- missing intermediate level but ok + i, m, f, l = build(levels,i,pdfreference(child),method,true) + if entry then + entry.Count = (opened and m) or -m + if m > 0 then + entry.First = pdfreference(f) + entry.Last = pdfreference(l) + end + pdfflushobject(child,entry) + else + report_bookmark("error 3") + end + return i, n, first, last end - pdfflushobject(child,entry) - return i, n, first, last end end pdfflushobject(child,entry) @@ -1079,10 +1159,9 @@ local function build(levels,start,parent,method) end function codeinjections.addbookmarks(levels,method) - if #levels > 0 then - structures.bookmarks.flatten(levels) -- dirty trick for lack of structure + if levels and #levels > 0 then local parent = pdfreserveobject() - local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal") + local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal",false) local dict = pdfdictionary { Type = pdfconstant("Outlines"), First = pdfreference(first), diff --git a/Master/texmf-dist/tex/context/base/lpdf-col.lua b/Master/texmf-dist/tex/context/base/lpdf-col.lua index 9e483f9b51f..877c01a1c24 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-col.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-col.lua @@ -48,6 +48,7 @@ local registercolor = colors.register local colorsvalue = colors.value local transparenciesvalue = transparencies.value local forcedmodel = colors.forcedmodel +local getpagecolormodel = colors.getpagecolormodel local c_transparency = pdfconstant("Transparency") @@ -98,11 +99,10 @@ table.setmetatableindex(transparencygroups, function(transparencygroups,colormod end end) -local currentgroupcolormodel - local function addpagegroup() - if currentgroupcolormodel then - local g = transparencygroups[currentgroupcolormodel] + local model = getpagecolormodel() + if model then + local g = transparencygroups[model] if g then addtopageattributes("Group",g) end @@ -111,13 +111,6 @@ end lpdf.registerpagefinalizer(addpagegroup,3,"pagegroup") -local function synchronizecolormodel(model) - currentgroupcolormodel = model -end - -backends.codeinjections.synchronizecolormodel = synchronizecolormodel -commands.synchronizecolormodel = synchronizecolormodel - -- injection code (needs a bit reordering) -- color injection @@ -184,7 +177,7 @@ local f_gray_function = formatters["%s mul"] local documentcolorspaces = pdfdictionary() -local spotcolorhash = { } -- not needed +local spotcolorhash = { } -- not needed local spotcolornames = { } local indexcolorhash = { } local delayedindexcolors = { } @@ -202,7 +195,7 @@ end -- This should become delayed i.e. only flush when used; in that case we need -- need to store the specification and then flush them when accesssomespotcolor -- is called. At this moment we assume that splotcolors that get defined are --- also used which keeps the overhad small anyway. +-- also used which keeps the overhad small anyway. Tricky for mp ... local processcolors @@ -240,6 +233,7 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range, local colorants = pdfdictionary() for n in gmatch(names,"[^,]+") do local name = spotcolornames[n] or n + -- the cmyk names assume that they are indeed these colors if n == "cyan" then name = "Cyan" elseif n == "magenta" then @@ -250,9 +244,15 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range, name = "Black" else local sn = spotcolorhash[name] or spotcolorhash[n] + if not sn then + report_color("defining %a as colorant",name) + colors.definespotcolor("",name,"p=1",true) + sn = spotcolorhash[name] or spotcolorhash[n] + end if sn then colorants[name] = pdfreference(sn) else + -- maybe some day generate colorants (spot colors for multi) automatically report_color("unknown colorant %a, using black instead",name or n) name = "Black" end @@ -484,8 +484,11 @@ function registrations.transparency(n,a,t) end statistics.register("page group warning", function() - if done and not transparencygroups[currentgroupcolormodel] then - return "transparencies are used but no pagecolormodel is set" + if done then + local model = getpagecolormodel() + if model and not transparencygroups[model] then + return "transparencies are used but no pagecolormodel is set" + end end end) @@ -529,6 +532,12 @@ end lpdf.color = lpdfcolor +interfaces.implement { + name = "lpdf_color", + actions = { lpdfcolor, context }, + arguments = "integer" +} + function lpdf.colorspec(model,ca,default) if ca and ca > 0 then local cv = colors.value(ca) @@ -553,7 +562,7 @@ function lpdf.colorspec(model,ca,default) end function lpdf.pdfcolor(attribute) -- bonus, for pgf and friends - context(lpdfcolor(1,attribute)) + return lpdfcolor(1,attribute) end function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode diff --git a/Master/texmf-dist/tex/context/base/lpdf-epa.lua b/Master/texmf-dist/tex/context/base/lpdf-epa.lua index 61d57b8d361..dd5ecc60990 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-epa.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-epa.lua @@ -10,30 +10,43 @@ if not modules then modules = { } end modules ['lpdf-epa'] = { -- change. local type, tonumber = type, tonumber -local format, gsub = string.format, string.gsub +local format, gsub, lower = string.format, string.gsub, string.lower local formatters = string.formatters ----- lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns -local trace_links = false trackers.register("figures.links", function(v) trace_links = v end) -local report_link = logs.reporter("backend","merging") +local trace_links = false trackers.register("figures.links", function(v) trace_links = v end) +local trace_outlines = false trackers.register("figures.outliness", function(v) trace_outlines = v end) +local report_link = logs.reporter("backend","link") +local report_outline = logs.reporter("backend","outline") + +local epdf = epdf local backends = backends local lpdf = lpdf local context = context +local loadpdffile = lpdf.epdf.load + +local nameonly = file.nameonly + local variables = interfaces.variables local codeinjections = backends.pdf.codeinjections ----- urlescaper = lpegpatterns.urlescaper ----- utftohigh = lpegpatterns.utftohigh local escapetex = characters.filters.utf.private.escape +local bookmarks = structures.bookmarks + local layerspec = { -- predefining saves time "epdflinks" } +local f_namespace = formatters["lpdf-epa-%s-"] + local function makenamespace(filename) - return format("lpdf-epa-%s-",file.removesuffix(file.basename(filename))) + filename = gsub(lower(nameonly(filename)),"[^%a%d]+","-") + return f_namespace(filename) end local function add_link(x,y,w,h,destination,what) @@ -71,7 +84,7 @@ local function link_goto(x,y,w,h,document,annotation,pagedata,namespace) if type(destination) == "string" then local destinations = document.destinations local wanted = destinations[destination] - destination = wanted and wanted.D + destination = wanted and wanted.D -- is this ok? isn't it destination already a string? if destination then what = "named" end end local pagedata = destination and destination[1] @@ -94,10 +107,17 @@ local function link_uri(x,y,w,h,document,annotation) end end +-- The rules in PDF on what a 'file specification' is, is in fact quite elaborate +-- (see section 3.10 in the 1.7 reference) so we need to test for string as well +-- as a table. TH/20140916 + local function link_file(x,y,w,h,document,annotation) local a = annotation.A if a then local filename = a.F + if type(filename) == "table" then + filename = filename.F + end if filename then filename = escapetex(filename) local destination = a.D @@ -124,7 +144,7 @@ function codeinjections.mergereferences(specification) end if specification then local fullname = specification.fullname - local document = lpdf.epdf.load(fullname) + local document = loadpdffile(fullname) -- costs time if document then local pagenumber = specification.page or 1 local xscale = specification.yscale or 1 @@ -132,22 +152,31 @@ function codeinjections.mergereferences(specification) local size = specification.size or "crop" -- todo local pagedata = document.pages[pagenumber] local annotations = pagedata and pagedata.Annots + local namespace = makenamespace(fullname) + local reference = namespace .. pagenumber if annotations and annotations.n > 0 then - local namespace = format("lpdf-epa-%s-",file.removesuffix(file.basename(fullname))) - local reference = namespace .. pagenumber - local mediabox = pagedata.MediaBox - local llx, lly, urx, ury = mediabox[1], mediabox[2], mediabox[3], mediabox[4] - local width, height = xscale * (urx - llx), yscale * (ury - lly) -- \\overlaywidth, \\overlayheight + local mediabox = pagedata.MediaBox + local llx = mediabox[1] + local lly = mediabox[2] + local urx = mediabox[3] + local ury = mediabox[4] + local width = xscale * (urx - llx) -- \\overlaywidth, \\overlayheight + local height = yscale * (ury - lly) -- \\overlaywidth, \\overlayheight context.definelayer( { "epdflinks" }, { height = height.."bp" , width = width.."bp" }) for i=1,annotations.n do local annotation = annotations[i] if annotation then - local subtype = annotation.Subtype + local subtype = annotation.Subtype local rectangle = annotation.Rect - local a_llx, a_lly, a_urx, a_ury = rectangle[1], rectangle[2], rectangle[3], rectangle[4] - local x, y = xscale * (a_llx - llx), yscale * (a_lly - lly) - local w, h = xscale * (a_urx - a_llx), yscale * (a_ury - a_lly) - if subtype == "Link" then + local a_llx = rectangle[1] + local a_lly = rectangle[2] + local a_urx = rectangle[3] + local a_ury = rectangle[4] + local x = xscale * (a_llx - llx) + local y = yscale * (a_lly - lly) + local w = xscale * (a_urx - a_llx) + local h = yscale * (a_ury - a_lly) + if subtype == "Link" then local a = annotation.A if a then local linktype = a.S @@ -161,7 +190,7 @@ function codeinjections.mergereferences(specification) report_link("unsupported link annotation %a",linktype) end else - report_link("mising link annotation") + report_link("missing link annotation") end elseif trace_links then report_link("unsupported annotation %a",subtype) @@ -171,21 +200,21 @@ function codeinjections.mergereferences(specification) end end context.flushlayer { "epdflinks" } - -- context("\\gdef\\figurereference{%s}",reference) -- global - context.setgvalue("figurereference",reference) -- global - if trace_links then - report_link("setting figure reference to %a",reference) - end - specification.reference = reference - return namespace end + -- moved outside previous test + context.setgvalue("figurereference",reference) -- global + if trace_links then + report_link("setting figure reference to %a",reference) + end + specification.reference = reference + return namespace end end return ""-- no namespace, empty, not nil end function codeinjections.mergeviewerlayers(specification) - -- todo: parse included page for layers + -- todo: parse included page for layers .. or only for whole document inclusion if true then return end @@ -195,9 +224,9 @@ function codeinjections.mergeviewerlayers(specification) end if specification then local fullname = specification.fullname - local document = lpdf.epdf.load(fullname) + local document = loadpdffile(fullname) if document then - local namespace = format("lpdf:epa:%s:",file.removesuffix(file.basename(fullname))) + local namespace = makenamespace(fullname) local layers = document.layers if layers then for i=1,layers.n do @@ -225,3 +254,160 @@ function codeinjections.mergeviewerlayers(specification) end end +-- new: for taco + +-- Beware, bookmarks can be in pdfdoc encoding or in unicode. However, in mkiv we +-- write out the strings in unicode (hex). When we read them in, we check for a bom +-- and convert to utf. + +function codeinjections.getbookmarks(filename) + + -- The first version built a nested tree and flattened that afterwards ... but I decided + -- to keep it simple and flat. + + local list = bookmarks.extras.get(filename) + + if list then + return list + else + list = { } + end + + local document = nil + + if lfs.isfile(filename) then + document = loadpdffile(filename) + else + report_outline("unknown file %a",filename) + bookmarks.extras.register(filename,list) + return list + end + + local outlines = document.Catalog.Outlines + local pages = document.pages + local nofpages = pages.n -- we need to access once in order to initialize + local destinations = document.destinations + + -- I need to check this destination analyzer with the one in annotations .. best share + -- code (and not it's inconsistent). On the todo list ... + + local function setdestination(current,entry) + local destination = nil + local action = current.A + if action then + local subtype = action.S + if subtype == "GoTo" then + destination = action.D + if type(destination) == "string" then + entry.destination = destination + destination = destinations[destination] + local pagedata = destination and destination[1] + if pagedata then + entry.realpage = pagedata.number + end + else + -- maybe + end + else + -- maybe + end + else + local destination = current.Dest + if destination then + if type(destination) == "string" then + local wanted = destinations[destination] + destination = wanted and wanted.D + if destination then + entry.destination = destination + end + else + local pagedata = destination and destination[1] + if pagedata and pagedata.Type == "Page" then + entry.realpage = pagedata.number + end + end + end + end + end + + local function traverse(current,depth) + while current do + -- local title = current.Title + local title = current("Title") -- can be pdfdoc or unicode + if title then + local entry = { + level = depth, + title = title, + } + list[#list+1] = entry + setdestination(current,entry) + if trace_outlines then + report_outline("%w%s",2*depth,title) + end + end + local first = current.First + if first then + local current = first + while current do + local title = current.Title + if title and trace_outlines then + report_outline("%w%s",2*depth,title) + end + local entry = { + level = depth, + title = title, + } + setdestination(current,entry) + list[#list+1] = entry + traverse(current.First,depth+1) + current = current.Next + end + end + current = current.Next + end + end + + if outlines then + if trace_outlines then + report_outline("outline of %a:",document.filename) + report_outline() + end + traverse(outlines,0) + if trace_outlines then + report_outline() + end + elseif trace_outlines then + report_outline("no outline in %a",document.filename) + end + + bookmarks.extras.register(filename,list) + + return list + +end + +function codeinjections.mergebookmarks(specification) + -- codeinjections.getbookmarks(document) + if not specification then + specification = figures and figures.current() + specification = specification and specification.status + end + if specification then + local fullname = specification.fullname + local bookmarks = backends.codeinjections.getbookmarks(fullname) + local realpage = tonumber(specification.page) or 1 + for i=1,#bookmarks do + local b = bookmarks[i] + if not b.usedpage then + if b.realpage == realpage then + if trace_options then + report_outline("using %a at page %a of file %a",b.title,realpage,fullname) + end + b.usedpage = true + b.section = structures.sections.currentsectionindex() + b.pageindex = specification.pageindex + end + end + end + end +end diff --git a/Master/texmf-dist/tex/context/base/lpdf-epd.lua b/Master/texmf-dist/tex/context/base/lpdf-epd.lua index a7399f6b4e2..1dc20bc267d 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-epd.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-epd.lua @@ -6,124 +6,287 @@ if not modules then modules = { } end modules ['lpdf-epd'] = { license = "see context related readme files" } --- This is an experimental layer around the epdf library. The reason for --- this layer is that I want to be independent of the library (which --- implements a selection of what a file provides) and also because I --- want an interface closer to Lua's table model while the API stays --- close to the original xpdf library. Of course, after prototyping a --- solution, we can optimize it using the low level epdf accessors. - --- It will be handy when we have a __length and __next that can trigger --- the resolve till then we will provide .n as #. - --- As there can be references to the parent we cannot expand a tree. I --- played with some expansion variants but it does to pay off. - --- Maybe we need a close(). --- We cannot access all destinations in one run. - -local setmetatable, rawset, rawget, tostring, tonumber = setmetatable, rawset, rawget, tostring, tonumber -local lower, match, char, find, sub = string.lower, string.match, string.char, string.find, string.sub +-- This is an experimental layer around the epdf library. The reason for this layer is that +-- I want to be independent of the library (which implements a selection of what a file +-- provides) and also because I want an interface closer to Lua's table model while the API +-- stays close to the original xpdf library. Of course, after prototyping a solution, we can +-- optimize it using the low level epdf accessors. However, not all are accessible (this will +-- be fixed). +-- +-- It will be handy when we have a __length and __next that can trigger the resolve till then +-- we will provide .n as #; maybe in Lua 5.3 or later. +-- +-- As there can be references to the parent we cannot expand a tree. I played with some +-- expansion variants but it does not pay off; adding extra checks is nto worth the trouble. +-- +-- The document stays over. In order to free memory one has to explicitly onload the loaded +-- document. +-- +-- We have much more checking then needed in the prepare functions because occasionally +-- we run into bugs in poppler or the epdf interface. It took us a while to realize that +-- there was a long standing gc issue the on long runs with including many pages could +-- crash the analyzer. +-- +-- Normally a value is fetched by key, as in foo.Title but as it can be in pdfdoc encoding +-- a safer bet is foo("Title") which will return a decoded string (or the original if it +-- already was unicode). + +local setmetatable, rawset, rawget, type = setmetatable, rawset, rawget, type +local tostring, tonumber = tostring, tonumber +local lower, match, char, byte, find = string.lower, string.match, string.char, string.byte, string.find +local abs = math.abs local concat = table.concat -local toutf = string.toutf +local toutf, toeight, utfchar = string.toutf, utf.toeight, utf.char + +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns +local P, C, S, R, Ct, Cc, V, Carg, Cs, Cf, Cg = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cc, lpeg.V, lpeg.Carg, lpeg.Cs, lpeg.Cf, lpeg.Cg + +local epdf = epdf + lpdf = lpdf or { } +local lpdf = lpdf +local lpdf_epdf = { } +lpdf.epdf = lpdf_epdf + +local pdf_open = epdf.open + +local report_epdf = logs.reporter("epdf") + +local getDict, getArray, getReal, getNum, getString, getBool, getName, getRef, getRefNum +local getType, getTypeName +local dictGetLength, dictGetVal, dictGetValNF, dictGetKey +local arrayGetLength, arrayGetNF, arrayGet +local streamReset, streamGetDict, streamGetChar + +do + local object = epdf.Object() + -- + getDict = object.getDict + getArray = object.getArray + getReal = object.getReal + getNum = object.getNum + getString = object.getString + getBool = object.getBool + getName = object.getName + getRef = object.getRef + getRefNum = object.getRefNum + -- + getType = object.getType + getTypeName = object.getTypeName + -- + streamReset = object.streamReset + streamGetDict = object.streamGetDict + streamGetChar = object.streamGetChar + -- +end -local report_epdf = logs.reporter("epdf") +local function initialize_methods(xref) + local dictionary = epdf.Dict(xref) + local array = epdf.Array(xref) + -- + dictGetLength = dictionary.getLength + dictGetVal = dictionary.getVal + dictGetValNF = dictionary.getValNF + dictGetKey = dictionary.getKey + -- + arrayGetLength = array.getLength + arrayGetNF = array.getNF + arrayGet = array.get + -- + initialize_methods = function() + -- already done + end +end --- a bit of protection +local typenames = { [0] = + "boolean", + "integer", + "real", + "string", + "name", + "null", + "array", + "dictionary", + "stream", + "ref", + "cmd", + "error", + "eof", + "none", + "integer64", +} -local limited = false +local typenumbers = table.swapped(typenames) -directives.register("system.inputmode", function(v) - if not limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - epdf.open = i_limiter.protect(epdf.open) - limited = true - end - end -end) +local null_code = typenumbers.null +local ref_code = typenumbers.ref --- +local function fatal_error(...) + report_epdf(...) + report_epdf("aborting job in order to avoid crash") + os.exit() +end + +-- epdf is the built-in library function epdf.type(o) local t = lower(match(tostring(o),"[^ :]+")) return t or "?" end -lpdf = lpdf or { } -local lpdf = lpdf +local checked_access + +-- dictionaries (can be optimized: ... resolve and redefine when all locals set) -lpdf.epdf = { } +local frompdfdoc = lpdf.frompdfdoc -local checked_access +local function get_flagged(t,f,k) + local fk = f[k] + if not fk then + return t[k] + elseif fk == "rawtext" then + return frompdfdoc(t[k]) + else -- no other flags yet + return t[k] + end +end -local function prepare(document,d,t,n,k,mt) +local function prepare(document,d,t,n,k,mt,flags) for i=1,n do - local v = d:getVal(i) - local r = d:getValNF(i) - if r:getTypeName() == "ref" then - r = r:getRef().num - local c = document.cache[r] - if c then - -- + local v = dictGetVal(d,i) + if v then + local r = dictGetValNF(d,i) + local kind = getType(v) + if kind == null_code then + -- ignore else - c = checked_access[v:getTypeName()](v,document,r) - if c then - document.cache[r] = c - document.xrefs[c] = r + local key = dictGetKey(d,i) + if kind then + if r and getType(r) == ref_code then + local objnum = getRefNum(r) + local cached = document.__cache__[objnum] + if not cached then + cached = checked_access[kind](v,document,objnum,mt) + if c then + document.__cache__[objnum] = cached + document.__xrefs__[cached] = objnum + end + end + t[key] = cached + else + local v, flag = checked_access[kind](v,document) + t[key] = v + if flag and flags then + flags[key] = flag -- flags + end + end + else + report_epdf("warning: nil value for key %a in dictionary",key) end end - t[d:getKey(i)] = c else - t[d:getKey(i)] = checked_access[v:getTypeName()](v,document) + fatal_error("error: invalid value at index %a in dictionary of %a",i,document.filename) end end - getmetatable(t).__index = nil -- ?? weird -setmetatable(t,mt) + if mt then + setmetatable(t,mt) + else + getmetatable(t).__index = nil + end return t[k] end -local function some_dictionary(d,document,r,mt) - local n = d and d:getLength() or 0 +local function some_dictionary(d,document) + local n = d and dictGetLength(d) or 0 + if n > 0 then + local t = { } + local f = { } + setmetatable(t, { + __index = function(t,k) + return prepare(document,d,t,n,k,_,_,f) + end, + __call = function(t,k) + return get_flagged(t,f,k) + end, + } ) + return t + end +end + +local function get_dictionary(object,document,r,mt) + local d = getDict(object) + local n = d and dictGetLength(d) or 0 if n > 0 then local t = { } - setmetatable(t, { __index = function(t,k) return prepare(document,d,t,n,k,mt) end } ) + local f = { } + setmetatable(t, { + __index = function(t,k) + return prepare(document,d,t,n,k,mt,f) + end, + __call = function(t,k) + return get_flagged(t,f,k) + end, + } ) return t end end -local done = { } +-- arrays (can be optimized: ... resolve and redefine when all locals set) local function prepare(document,a,t,n,k) for i=1,n do - local v = a:get(i) - local r = a:getNF(i) - if v:getTypeName() == "null" then - -- TH: weird, but appears possible - elseif r:getTypeName() == "ref" then - r = r:getRef().num - local c = document.cache[r] - if c then - -- + local v = arrayGet(a,i) + if v then + local kind = getType(v) + if kind == null_code then + -- ignore + elseif kind then + local r = arrayGetNF(a,i) + if r and getType(r) == ref_code then + local objnum = getRefNum(r) + local cached = document.__cache__[objnum] + if not cached then + cached = checked_access[kind](v,document,objnum) + document.__cache__[objnum] = cached + document.__xrefs__[cached] = objnum + end + t[i] = cached + else + t[i] = checked_access[kind](v,document) + end else - c = checked_access[v:getTypeName()](v,document,r) - document.cache[r] = c - document.xrefs[c] = r + report_epdf("warning: nil value for index %a in array",i) end - t[i] = c else - t[i] = checked_access[v:getTypeName()](v,document) + fatal_error("error: invalid value at index %a in array of %a",i,document.filename) end end getmetatable(t).__index = nil return t[k] end -local function some_array(a,document,r) - local n = a and a:getLength() or 0 +local function some_array(a,document) + local n = a and arrayGetLength(a) or 0 if n > 0 then local t = { n = n } - setmetatable(t, { __index = function(t,k) return prepare(document,a,t,n,k) end } ) + setmetatable(t, { + __index = function(t,k) + return prepare(document,a,t,n,k) + end + } ) + return t + end +end + +local function get_array(object,document) + local a = getArray(object) + local n = a and arrayGetLength(a) or 0 + if n > 0 then + local t = { n = n } + setmetatable(t, { + __index = function(t,k) + return prepare(document,a,t,n,k) + end + } ) return t end end @@ -131,9 +294,9 @@ end local function streamaccess(s,_,what) if not what or what == "all" or what == "*all" then local t, n = { }, 0 - s:streamReset() + streamReset(s) while true do - local c = s:streamGetChar() + local c = streamGetChar(s) if c < 0 then break else @@ -145,56 +308,96 @@ local function streamaccess(s,_,what) end end -local function some_stream(d,document,r) +local function get_stream(d,document) if d then - d:streamReset() - local s = some_dictionary(d:streamGetDict(),document,r) + streamReset(d) + local s = some_dictionary(streamGetDict(d),document) getmetatable(s).__call = function(...) return streamaccess(d,...) end return s end end --- we need epdf.boolean(v) in addition to v:getBool() [dictionary, array, stream, real, integer, string, boolean, name, ref, null] - -checked_access = { - dictionary = function(d,document,r) - return some_dictionary(d:getDict(),document,r) - end, - array = function(a,document,r) - return some_array(a:getArray(),document,r) - end, - stream = function(v,document,r) - return some_stream(v,document,r) - end, - real = function(v) - return v:getReal() - end, - integer = function(v) - return v:getNum() - end, - string = function(v) - return toutf(v:getString()) - end, - boolean = function(v) - return v:getBool() - end, - name = function(v) - return v:getName() - end, - ref = function(v) - return v:getRef() - end, - null = function() - return nil - end, -} +-- We need to convert the string from utf16 although there is no way to +-- check if we have a regular string starting with a bom. So, we have +-- na dilemma here: a pdf doc encoded string can be invalid utf. --- checked_access.real = epdf.real --- checked_access.integer = epdf.integer --- checked_access.string = epdf.string --- checked_access.boolean = epdf.boolean --- checked_access.name = epdf.name --- checked_access.ref = epdf.ref +-- : implicit 0 appended if odd +-- (byte encoded) : \( \) \\ escaped +-- +-- : utf16be +-- +-- \r \r \t \b \f \( \) \\ \NNN and \ : append next line +-- +-- the getString function gives back bytes so we don't need to worry about +-- the hex aspect. + +local u_pattern = lpeg.patterns.utfbom_16_be * lpeg.patterns.utf16_to_utf8_be +----- b_pattern = lpeg.patterns.hextobytes + +local function get_string(v) + -- the toutf function only converts a utf16 string and leves the original + -- untouched otherwise; one might want to apply lpdf.frompdfdoc to a + -- non-unicode string + local s = getString(v) + if not s or s == "" then + return "" + end + local u = lpegmatch(u_pattern,s) + if u then + return u -- , "unicode" + end + -- this is too tricky and fails on e.g. reload of url www.pragma-ade.com) + -- local b = lpegmatch(b_pattern,s) + -- if b then + -- return b, "rawtext" + -- end + return s, "rawtext" +end + +local function get_null() + return nil +end + +-- we have dual access: by typenumber and by typename + +local function invalidaccess(k,document) + local fullname = type(document) == "table" and document.fullname + if fullname then + fatal_error("error, asking for key %a in checker of %a",k,fullname) + else + fatal_error("error, asking for key %a in checker",k) + end +end + +checked_access = table.setmetatableindex(function(t,k) + return function(v,document) + invalidaccess(k,document) + end +end) + +checked_access[typenumbers.boolean] = getBool +checked_access[typenumbers.integer] = getNum +checked_access[typenumbers.real] = getReal +checked_access[typenumbers.string] = get_string -- getString +checked_access[typenumbers.name] = getName +checked_access[typenumbers.null] = get_null +checked_access[typenumbers.array] = get_array -- d,document,r +checked_access[typenumbers.dictionary] = get_dictionary -- d,document,r +checked_access[typenumbers.stream] = get_stream +checked_access[typenumbers.ref] = getRef + +for i=0,#typenames do + local checker = checked_access[i] + if not checker then + checker = function() + return function(v,document) + invalidaccess(i,document) + end + end + checked_access[i] = checker + end + checked_access[typenames[i]] = checker +end local function getnames(document,n,target) -- direct if n then @@ -252,7 +455,6 @@ local function getlayers(document) local n = layers.n for i=1,n do local layer = layers[i] ---~ print(document.xrefs[layer]) t[i] = layer.Name end t.n = n @@ -261,52 +463,39 @@ local function getlayers(document) end end +local function getstructure(document) + -- this might become a tree + return document.Catalog.StructTreeRoot +end local function getpages(document,Catalog) - local data = document.data - local xrefs = document.xrefs - local cache = document.cache - local cata = data:getCatalog() - local xref = data:getXRef() - local pages = { } - local nofpages = cata:getNumPages() --- local function getpagestuff(pagenumber,k) --- if k == "MediaBox" then --- local pageobj = cata:getPage(pagenumber) --- local pagebox = pageobj:getMediaBox() --- return { pagebox.x1, pagebox.y1, pagebox.x2, pagebox.y2 } --- elseif k == "CropBox" then --- local pageobj = cata:getPage(pagenumber) --- local pagebox = pageobj:getMediaBox() --- return { pagebox.x1, pagebox.y1, pagebox.x2, pagebox.y2 } --- elseif k == "Resources" then --- print("todo page resources from parent") --- -- local pageobj = cata:getPage(pagenumber) --- -- local resources = pageobj:getResources() --- end --- end --- for pagenumber=1,nofpages do --- local mt = { __index = function(t,k) --- local v = getpagestuff(pagenumber,k) --- if v then --- t[k] = v --- end --- return v --- end } - local mt = { __index = Catalog.Pages } + local __data__ = document.__data__ + local __xrefs__ = document.__xrefs__ + local __cache__ = document.__cache__ + local __xref__ = document.__xref__ + -- + local catalog = __data__:getCatalog() + local pages = { } + local nofpages = catalog:getNumPages() + local metatable = { __index = Catalog.Pages } + -- for pagenumber=1,nofpages do - local pagereference = cata:getPageRef(pagenumber).num - local pagedata = some_dictionary(xref:fetch(pagereference,0):getDict(),document,pagereference,mt) + local pagereference = catalog:getPageRef(pagenumber).num + local pageobject = __xref__:fetch(pagereference,0) + local pagedata = get_dictionary(pageobject,document,pagereference,metatable) if pagedata then - pagedata.number = pagenumber - pages[pagenumber] = pagedata - xrefs[pagedata] = pagereference - cache[pagereference] = pagedata + -- rawset(pagedata,"number",pagenumber) + pagedata.number = pagenumber + pages[pagenumber] = pagedata + __xrefs__[pagedata] = pagereference + __cache__[pagereference] = pagedata else report_epdf("missing pagedata at slot %i",i) end end + -- pages.n = nofpages + -- return pages end @@ -329,23 +518,29 @@ end local loaded = { } -function lpdf.epdf.load(filename) +function lpdf_epdf.load(filename) local document = loaded[filename] if not document then - statistics.starttiming(lpdf.epdf) - local data = epdf.open(filename) -- maybe resolvers.find_file - if data then + statistics.starttiming(lpdf_epdf) + local __data__ = pdf_open(filename) -- maybe resolvers.find_file + if __data__ then + local __xref__ = __data__:getXRef() document = { - filename = filename, - cache = { }, - xrefs = { }, - data = data, + filename = filename, + __cache__ = { }, + __xrefs__ = { }, + __fonts__ = { }, + __data__ = __data__, + __xref__ = __xref__, } - local Catalog = some_dictionary(data:getXRef():getCatalog():getDict(),document) - local Info = some_dictionary(data:getXRef():getDocInfo():getDict(),document) - document.Catalog = Catalog - document.Info = Info - -- document.catalog = Catalog + -- + initialize_methods(__xref__) + -- + local Catalog = some_dictionary(__xref__:getCatalog():getDict(),document) + local Info = some_dictionary(__xref__:getDocInfo():getDict(),document) + -- + document.Catalog = Catalog + document.Info = Info -- a few handy helper tables document.pages = delayed(document,"pages", function() return getpages(document,Catalog) end) document.destinations = delayed(document,"destinations", function() return getnames(document,Catalog.Names and Catalog.Names.Dests) end) @@ -353,28 +548,292 @@ function lpdf.epdf.load(filename) document.widgets = delayed(document,"widgets", function() return getnames(document,Catalog.Names and Catalog.Names.AcroForm) end) document.embeddedfiles = delayed(document,"embeddedfiles",function() return getnames(document,Catalog.Names and Catalog.Names.EmbeddedFiles) end) document.layers = delayed(document,"layers", function() return getlayers(document) end) + document.structure = delayed(document,"structure", function() return getstructure(document) end) else document = false end loaded[filename] = document - statistics.stoptiming(lpdf.epdf) - -- print(statistics.elapsedtime(lpdf.epdf)) + loaded[document] = document + statistics.stoptiming(lpdf_epdf) + -- print(statistics.elapsedtime(lpdf_epdf)) + end + return document or nil +end + +function lpdf_epdf.unload(filename) + local document = loaded[filename] + if document then + loaded[document] = nil + loaded[filename] = nil end - return document end -- for k, v in next, expand(t) do -function lpdf.epdf.expand(t) +local function expand(t) if type(t) == "table" then local dummy = t.dummy end return t end +-- for k, v in expanded(t) do + +local function expanded(t) + if type(t) == "table" then + local dummy = t.dummy + end + return next, t +end + +lpdf_epdf.expand = expand +lpdf_epdf.expanded = expanded + +-- we could resolve the text stream in one pass if we directly handle the +-- font but why should we complicate things + +local hexdigit = R("09","AF") +local numchar = ( P("\\") * ( (R("09")^3/tonumber) + C(1) ) ) + C(1) +local number = lpegpatterns.number / tonumber +local spaces = lpegpatterns.whitespace^1 +local optspaces = lpegpatterns.whitespace^0 +local keyword = P("/") * C(R("AZ","az","09")^1) +local operator = C((R("AZ","az")+P("'")+P('"'))^1) + +local grammar = P { "start", + start = (keyword + number + V("dictionary") + V("unicode") + V("string") + V("unicode")+ V("array") + spaces)^1, + -- keyvalue = (keyword * spaces * V("start") + spaces)^1, + keyvalue = optspaces * Cf(Ct("") * Cg(keyword * optspaces * V("start") * optspaces)^1,rawset), + array = P("[") * Ct(V("start")^1) * P("]"), + dictionary = P("<<") * V("keyvalue") * P(">>"), + unicode = P("<") * Ct(Cc("hex") * C((1-P(">"))^1)) * P(">"), + string = P("(") * Ct(Cc("dec") * C((V("string")+numchar)^1)) * P(")"), -- untested +} + +local operation = Ct(grammar^1 * operator) +local parser = Ct((operation + P(1))^1) + +-- beginbfrange : +-- [ ] +-- beginbfchar : + +local fromsixteen = lpdf.fromsixteen -- maybe inline the lpeg ... but not worth it + +local function f_bfchar(t,a,b) + t[tonumber(a,16)] = fromsixteen(b) +end + +local function f_bfrange_1(t,a,b,c) + print("todo 1",a,b,c) + -- c is string + -- todo t[tonumber(a,16)] = fromsixteen(b) +end + +local function f_bfrange_2(t,a,b,c) + print("todo 2",a,b,c) + -- c is table + -- todo t[tonumber(a,16)] = fromsixteen(b) +end + +local optionals = spaces^0 +local hexstring = optionals * P("<") * C((1-P(">"))^1) * P(">") +local bfchar = Carg(1) * hexstring * hexstring / f_bfchar +local bfrange = Carg(1) * hexstring * hexstring * hexstring / f_bfrange_1 + + Carg(1) * hexstring * hexstring * optionals * P("[") * Ct(hexstring^1) * optionals * P("]") / f_bfrange_2 +local fromunicode = ( + P("beginbfchar" ) * bfchar ^1 * optionals * P("endbfchar" ) + + P("beginbfrange") * bfrange^1 * optionals * P("endbfrange") + + spaces + + P(1) +)^1 * Carg(1) + +local function analyzefonts(document,resources) -- unfinished + local fonts = document.__fonts__ + if resources then + local fontlist = resources.Font + if fontlist then + for id, data in expanded(fontlist) do + if not fonts[id] then + -- a quck hack ... I will look into it more detail if I find a real + -- -application for it + local tounicode = data.ToUnicode() + if tounicode then + tounicode = lpegmatch(fromunicode,tounicode,1,{}) + end + fonts[id] = { + tounicode = type(tounicode) == "table" and tounicode or { } + } + table.setmetatableindex(fonts[id],"self") + end + end + end + end + return fonts +end + +local more = 0 +local unic = nil -- cheaper than passing each time as Carg(1) + +local p_hex_to_utf = C(4) / function(s) -- needs checking ! + local now = tonumber(s,16) + if more > 0 then + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + more = 0 + return unic[now] or utfchar(now) + elseif now >= 0xD800 and now <= 0xDBFF then + more = now + -- return "" + else + return unic[now] or utfchar(now) + end +end + +local p_dec_to_utf = C(1) / function(s) -- needs checking ! + local now = byte(s) + return unic[now] or utfchar(now) +end + +local p_hex_to_utf = P(true) / function() more = 0 end * Cs(p_hex_to_utf^1) +local p_dec_to_utf = P(true) / function() more = 0 end * Cs(p_dec_to_utf^1) + +function lpdf_epdf.getpagecontent(document,pagenumber) + + local page = document.pages[pagenumber] + + if not page then + return + end + + local fonts = analyzefonts(document,page.Resources) + + local content = page.Contents() or "" + local list = lpegmatch(parser,content) + local font = nil + -- local unic = nil + + for i=1,#list do + local entry = list[i] + local size = #entry + local operator = entry[size] + if operator == "Tf" then + font = fonts[entry[1]] + unic = font.tounicode + elseif operator == "TJ" then -- { array, TJ } + local list = entry[1] + for i=1,#list do + local li = list[i] + if type(li) == "table" then + if li[1] == "hex" then + list[i] = lpegmatch(p_hex_to_utf,li[2]) + else + list[i] = lpegmatch(p_dec_to_utf,li[2]) + end + else + -- kern + end + end + elseif operator == "Tj" or operator == "'" or operator == '"' then -- { string, Tj } { string, ' } { n, m, string, " } + local list = entry[size-1] + if list[1] == "hex" then + list[2] = lpegmatch(p_hex_to_utf,li[2]) + else + list[2] = lpegmatch(p_dec_to_utf,li[2]) + end + end + end + + unic = nil -- can be collected + + return list + +end + +-- This is also an experiment. When I really neet it I can improve it, fo rinstance +-- with proper position calculating. It might be usefull for some search or so. + +local softhyphen = utfchar(0xAD) .. "$" +local linefactor = 1.3 + +function lpdf_epdf.contenttotext(document,list) -- maybe signal fonts + local last_y = 0 + local last_f = 0 + local text = { } + local last = 0 + + for i=1,#list do + local entry = list[i] + local size = #entry + local operator = entry[size] + if operator == "Tf" then + last_f = entry[2] + elseif operator == "TJ" then + local list = entry[1] + for i=1,#list do + local li = list[i] + if type(li) == "string" then + last = last + 1 + text[last] = li + elseif li < -50 then + last = last + 1 + text[last] = " " + end + end + line = concat(list) + elseif operator == "Tj" then + last = last + 1 + text[last] = entry[size-1] + elseif operator == "cm" or operator == "Tm" then + local ty = entry[6] + local dy = abs(last_y - ty) + if dy > linefactor*last_f then + if last > 0 then + if find(text[last],softhyphen) then + -- ignore + else + last = last + 1 + text[last] = "\n" + end + end + end + last_y = ty + end + end + + return concat(text) +end + +function lpdf_epdf.getstructure(document,list) -- just a test + local depth = 0 + for i=1,#list do + local entry = list[i] + local size = #entry + local operator = entry[size] + if operator == "BDC" then + report_epdf("%w%s : %s",depth,entry[1] or "?",entry[2].MCID or "?") + depth = depth + 1 + elseif operator == "EMC" then + depth = depth - 1 + elseif operator == "TJ" then + local list = entry[1] + for i=1,#list do + local li = list[i] + if type(li) == "string" then + report_epdf("%w > %s",depth,li) + elseif li < -50 then + report_epdf("%w >",depth,li) + end + end + elseif operator == "Tj" then + report_epdf("%w > %s",depth,entry[size-1]) + end + end +end + +-- document.Catalog.StructTreeRoot.ParentTree.Nums[2][1].A.P[1]) + -- helpers --- function lpdf.epdf.getdestinationpage(document,name) --- local destination = document.data:findDest(name) +-- function lpdf_epdf.getdestinationpage(document,name) +-- local destination = document.__data__:findDest(name) -- return destination and destination.number -- end diff --git a/Master/texmf-dist/tex/context/base/lpdf-fld.lua b/Master/texmf-dist/tex/context/base/lpdf-fld.lua index 414562ad58a..f0aad36237c 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-fld.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-fld.lua @@ -280,10 +280,8 @@ end local pdfdocencodingvector, pdfdocencodingcapsule --- The pdf doc encoding vector is needed in order to --- trigger propper unicode. Interesting is that when --- a glyph is not in the vector, it is still visible --- as it is taken from some other font. Messy. +-- The pdf doc encoding vector is needed in order to trigger propper unicode. Interesting is that when +-- a glyph is not in the vector, it is still visible as it is taken from some other font. Messy. -- To be checked: only when text/line fields. @@ -334,7 +332,7 @@ local function fieldsurrounding(specification) local fontsize = specification.fontsize or "12pt" local fontstyle = specification.fontstyle or "rm" local fontalternative = specification.fontalternative or "tf" - local colorvalue = specification.colorvalue + local colorvalue = tonumber(specification.colorvalue) local s = fontnames[fontstyle] if not s then fontstyle, s = "rm", fontnames.rm diff --git a/Master/texmf-dist/tex/context/base/lpdf-fmt.lua b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua index 568b801b493..862c011b8a0 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-fmt.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua @@ -710,7 +710,9 @@ function codeinjections.setformat(s) end end function codeinjections.setformat(noname) - report_backend("error, format is already set to %a, ignoring %a",formatname,noname.format) + if trace_format then + report_backend("error, format is already set to %a, ignoring %a",formatname,noname.format) + end end else report_backend("error, format %a is not supported",format) @@ -732,9 +734,11 @@ directives.register("backend.format", function(v) -- table ! end end) -function commands.setformat(s) - codeinjections.setformat(s) -end +interfaces.implement { + name = "setformat", + actions = codeinjections.setformat, + arguments = { { "*" } } +} function codeinjections.getformatoption(key) return formatspecification and formatspecification[key] diff --git a/Master/texmf-dist/tex/context/base/lpdf-grp.lua b/Master/texmf-dist/tex/context/base/lpdf-grp.lua index b3cc7ce1f5f..36c3507bed2 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-grp.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-grp.lua @@ -118,7 +118,7 @@ function nodeinjections.injectbitmap(t) height = width * yresolution / xresolution end local image = img.new { - stream = format(template,d(),t.data), + stream = formatters[template](d(),t.data), width = width, height = height, bbox = { 0, 0, urx, ury }, diff --git a/Master/texmf-dist/tex/context/base/lpdf-ini.lua b/Master/texmf-dist/tex/context/base/lpdf-ini.lua index 025f62c4f84..834f845c59a 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-ini.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-ini.lua @@ -6,17 +6,27 @@ if not modules then modules = { } end modules ['lpdf-ini'] = { license = "see context related readme files" } +-- beware of "too many locals" here + local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch -local utfchar, utfvalues = utf.char, utf.values +local utfchar, utfbyte, utfvalues = utf.char, utf.byte, utf.values local sind, cosd, floor, max, min = math.sind, math.cosd, math.floor, math.max, math.min local lpegmatch, P, C, R, S, Cc, Cs = lpeg.match, lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc, lpeg.Cs local formatters = string.formatters +local isboolean = string.is_boolean local report_objects = logs.reporter("backend","objects") local report_finalizing = logs.reporter("backend","finalizing") local report_blocked = logs.reporter("backend","blocked") +local implement = interfaces.implement +local two_strings = interfaces.strings[2] + +-- In ConTeXt MkIV we use utf8 exclusively so all strings get mapped onto a hex +-- encoded utf16 string type between <>. We could probably save some bytes by using +-- strings between () but then we end up with escaped ()\ too. + -- gethpos : used -- getpos : used -- getvpos : used @@ -56,9 +66,9 @@ local pdf = pdf local factor = number.dimenfactors.bp if pdf.setinfo then --- table.setmetatablenewindex(pdf,function(t,k,v) --- report_blocked("'pdf.%s' is not supported",k) --- end) + -- table.setmetatablenewindex(pdf,function(t,k,v) + -- report_blocked("'pdf.%s' is not supported",k) + -- end) -- the getters are harmless end @@ -103,15 +113,27 @@ local pdfimmediateobject = pdf.immediateobj local pdfdeferredobject = pdf.obj local pdfreferenceobject = pdf.refobj -function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc -function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end -function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end -function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end -function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end -function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end -function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end +-- function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc +-- function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end +-- function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end +-- function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end +-- function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end +-- function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end +-- function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end +-- function pdf.registerannot () report_blocked("'pdf.%s' is not supported","registerannot") end + +local function pdfdisablecommand(command) + pdf[command] = function() report_blocked("'pdf.%s' is not supported",command) end +end -function pdf.registerannot() report_blocked("'pdf.%s' is not supported","registerannot") end +pdfdisablecommand("setinfo") +pdfdisablecommand("setcatalog") +pdfdisablecommand("setnames") +pdfdisablecommand("settrailer") +pdfdisablecommand("setpageresources") +pdfdisablecommand("setpageattributes") +pdfdisablecommand("setpagesattributes") +pdfdisablecommand("registerannot") local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end) local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end) @@ -180,67 +202,112 @@ function lpdf.rectangle(width,height,depth) end end --- +-- we could use a hash of predefined unicodes + +-- local function tosixteen(str) -- an lpeg might be faster (no table) +-- if not str or str == "" then +-- return "" -- not () as we want an indication that it's unicode +-- else +-- local r, n = { "")) local function tosixteen(str) -- an lpeg might be faster (no table) if not str or str == "" then return "" -- not () as we want an indication that it's unicode else - local r, n = { " 0 then + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + more = 0 + return utfchar(now) + elseif now >= 0xD800 and now <= 0xDBFF then + more = now + return "" -- else the c's end up in the stream + else + return utfchar(now) + end +end --- lpeg is some 5 times faster than gsub (in test) on escaping +local pattern = P(true) / function() more = 0 end * Cs(pattern^0) --- local escapes = { --- ["\\"] = "\\\\", --- ["/"] = "\\/", ["#"] = "\\#", --- ["<"] = "\\<", [">"] = "\\>", --- ["["] = "\\[", ["]"] = "\\]", --- ["("] = "\\(", [")"] = "\\)", --- } --- --- local escaped = Cs(Cc("(") * (S("\\/#<>[]()")/escapes + P(1))^0 * Cc(")")) --- --- local function toeight(str) --- if not str or str == "" then --- return "()" --- else --- return lpegmatch(escaped,str) --- end --- end --- --- -- no need for escaping .. just use unicode instead +local function fromsixteen(str) + if not str or str == "" then + return "" + else + return lpegmatch(pattern,str) + end +end --- \0 \t \n \r \f ( ) [ ] { } / % +local toregime = regimes.toregime +local fromregime = regimes.fromregime -local function toeight(str) - return "(" .. str .. ")" +local function topdfdoc(str,default) + if not str or str == "" then + return "" + else + return lpegmatch(escaped,toregime("pdfdoc",str,default)) -- could be combined if needed + end end -lpdf.toeight = toeight +local function frompdfdoc(str) + if not str or str == "" then + return "" + else + return fromregime("pdfdoc",str) + end +end --- local escaped = lpeg.Cs((lpeg.S("\0\t\n\r\f ()[]{}/%")/function(s) return format("#%02X",byte(s)) end + lpeg.P(1))^0) --- --- local function cleaned(str) --- return (str and str ~= "" and lpegmatch(escaped,str)) or "" --- end --- --- lpdf.cleaned = cleaned -- not public yet +if not toregime then topdfdoc = function(s) return s end end +if not fromregime then frompdfdoc = function(s) return s end end + +local function toeight(str) + if not str or str == "" then + return "()" + else + return lpegmatch(escaped,str) + end +end + +lpdf.tosixteen = tosixteen +lpdf.toeight = toeight +lpdf.topdfdoc = topdfdoc +lpdf.fromsixteen = fromsixteen +lpdf.frompdfdoc = frompdfdoc local function merge_t(a,b) local t = { } @@ -249,6 +316,7 @@ local function merge_t(a,b) return setmetatable(t,getmetatable(a)) end +local f_key_null = formatters["/%s null"] local f_key_value = formatters["/%s %s"] local f_key_dictionary = formatters["/%s << % t >>"] local f_dictionary = formatters["<< % t >>"] @@ -275,12 +343,17 @@ tostring_d = function(t,contentonly,key) r[rn] = f_key_value(k,toeight(v)) elseif tv == "number" then r[rn] = f_key_number(k,v) - elseif tv == "unicode" then - r[rn] = f_key_value(k,tosixteen(v)) + -- elseif tv == "unicode" then -- can't happen + -- r[rn] = f_key_value(k,tosixteen(v)) elseif tv == "table" then local mv = getmetatable(v) if mv and mv.__lpdftype then - r[rn] = f_key_value(k,tostring(v)) + -- if v == t then + -- report_objects("ignoring circular reference in dirctionary") + -- r[rn] = f_key_null(k) + -- else + r[rn] = f_key_value(k,tostring(v)) + -- end elseif v[1] then r[rn] = f_key_value(k,tostring_a(v)) else @@ -315,13 +388,18 @@ tostring_a = function(t,contentonly,key) r[k] = toeight(v) elseif tv == "number" then r[k] = f_tonumber(v) - elseif tv == "unicode" then - r[k] = tosixteen(v) + -- elseif tv == "unicode" then + -- r[k] = tosixteen(v) elseif tv == "table" then local mv = getmetatable(v) local mt = mv and mv.__lpdftype if mt then - r[k] = tostring(v) + -- if v == t then + -- report_objects("ignoring circular reference in array") + -- r[k] = "null" + -- else + r[k] = tostring(v) + -- end elseif v[1] then r[k] = tostring_a(v) else @@ -345,16 +423,17 @@ tostring_a = function(t,contentonly,key) end end -local tostring_x = function(t) return concat(t," ") end -local tostring_s = function(t) return toeight(t[1]) end -local tostring_u = function(t) return tosixteen(t[1]) end -local tostring_n = function(t) return tostring(t[1]) end -- tostring not needed -local tostring_n = function(t) return f_tonumber(t[1]) end -- tostring not needed -local tostring_c = function(t) return t[1] end -- already prefixed (hashed) -local tostring_z = function() return "null" end -local tostring_t = function() return "true" end -local tostring_f = function() return "false" end -local tostring_r = function(t) local n = t[1] return n and n > 0 and (n .. " 0 R") or "NULL" end +local tostring_x = function(t) return concat(t," ") end +local tostring_s = function(t) return toeight(t[1]) end +local tostring_p = function(t) return topdfdoc(t[1],t[2]) end +local tostring_u = function(t) return tosixteen(t[1]) end +----- tostring_n = function(t) return tostring(t[1]) end -- tostring not needed +local tostring_n = function(t) return f_tonumber(t[1]) end -- tostring not needed +local tostring_c = function(t) return t[1] end -- already prefixed (hashed) +local tostring_z = function() return "null" end +local tostring_t = function() return "true" end +local tostring_f = function() return "false" end +local tostring_r = function(t) local n = t[1] return n and n > 0 and (n .. " 0 R") or "null" end local tostring_v = function(t) local s = t[1] @@ -365,18 +444,19 @@ local tostring_v = function(t) end end -local function value_x(t) return t end -- the call is experimental -local function value_s(t,key) return t[1] end -- the call is experimental -local function value_u(t,key) return t[1] end -- the call is experimental -local function value_n(t,key) return t[1] end -- the call is experimental -local function value_c(t) return sub(t[1],2) end -- the call is experimental -local function value_d(t) return tostring_d(t,true) end -- the call is experimental -local function value_a(t) return tostring_a(t,true) end -- the call is experimental -local function value_z() return nil end -- the call is experimental -local function value_t(t) return t.value or true end -- the call is experimental -local function value_f(t) return t.value or false end -- the call is experimental -local function value_r() return t[1] or 0 end -- the call is experimental -- NULL -local function value_v() return t[1] end -- the call is experimental +local function value_x(t) return t end +local function value_s(t) return t[1] end +local function value_p(t) return t[1] end +local function value_u(t) return t[1] end +local function value_n(t) return t[1] end +local function value_c(t) return sub(t[1],2) end +local function value_d(t) return tostring_d(t,true) end +local function value_a(t) return tostring_a(t,true) end +local function value_z() return nil end +local function value_t(t) return t.value or true end +local function value_f(t) return t.value or false end +local function value_r() return t[1] or 0 end -- null +local function value_v() return t[1] end local function add_x(t,k,v) rawset(t,k,tostring(v)) end @@ -385,6 +465,7 @@ local mt_d = { __lpdftype = "dictionary", __tostring = tostring_d, __call = valu local mt_a = { __lpdftype = "array", __tostring = tostring_a, __call = value_a } local mt_u = { __lpdftype = "unicode", __tostring = tostring_u, __call = value_u } local mt_s = { __lpdftype = "string", __tostring = tostring_s, __call = value_s } +local mt_p = { __lpdftype = "docstring", __tostring = tostring_p, __call = value_p } local mt_n = { __lpdftype = "number", __tostring = tostring_n, __call = value_n } local mt_c = { __lpdftype = "constant", __tostring = tostring_c, __call = value_c } local mt_z = { __lpdftype = "null", __tostring = tostring_z, __call = value_z } @@ -418,8 +499,12 @@ local function pdfstring(str,default) return setmetatable({ str or default or "" },mt_s) end +local function pdfdocstring(str,default,defaultchar) + return setmetatable({ str or default or "", defaultchar or " " },mt_p) +end + local function pdfunicode(str,default) - return setmetatable({ str or default or "" },mt_u) + return setmetatable({ str or default or "" },mt_u) -- could be a string end local cache = { } -- can be weak @@ -503,6 +588,7 @@ end lpdf.stream = pdfstream -- THIS WILL PROBABLY CHANGE lpdf.dictionary = pdfdictionary lpdf.array = pdfarray +lpdf.docstring = pdfdocstring lpdf.string = pdfstring lpdf.unicode = pdfunicode lpdf.number = pdfnumber @@ -532,7 +618,7 @@ end -- lpdf.object = pdfdeferredobject -- lpdf.referenceobject = pdfreferenceobject -local pagereference = pdf.pageref or tex.pdfpageref +local pagereference = pdf.pageref -- tex.pdfpageref is obsolete local nofpages = 0 function lpdf.pagereference(n) @@ -765,108 +851,147 @@ end callbacks.register("finish_pdffile", lpdf.finalizedocument) --- some minimal tracing, handy for checking the order -local function trace_set(what,key) - if trace_resources then - report_finalizing("setting key %a in %a",key,what) - end -end -local function trace_flush(what) - if trace_resources then - report_finalizing("flushing %a",what) - end -end +do -lpdf.protectresources = true + -- some minimal tracing, handy for checking the order -local catalog = pdfdictionary { Type = pdfconstant("Catalog") } -- nicer, but when we assign we nil the Type -local info = pdfdictionary { Type = pdfconstant("Info") } -- nicer, but when we assign we nil the Type ------ names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type + local function trace_set(what,key) + if trace_resources then + report_finalizing("setting key %a in %a",key,what) + end + end -local function flushcatalog() if not environment.initex then trace_flush("catalog") catalog.Type = nil pdfsetcatalog(catalog()) end end -local function flushinfo () if not environment.initex then trace_flush("info") info .Type = nil pdfsetinfo (info ()) end end --------------- flushnames () if not environment.initex then trace_flush("names") names .Type = nil pdfsetnames (names ()) end end + local function trace_flush(what) + if trace_resources then + report_finalizing("flushing %a",what) + end + end -function lpdf.addtocatalog(k,v) if not (lpdf.protectresources and catalog[k]) then trace_set("catalog",k) catalog[k] = v end end -function lpdf.addtoinfo (k,v) if not (lpdf.protectresources and info [k]) then trace_set("info", k) info [k] = v end end --------- lpdf.addtonames (k,v) if not (lpdf.protectresources and names [k]) then trace_set("names", k) names [k] = v end end + lpdf.protectresources = true -local names = pdfdictionary { - -- Type = pdfconstant("Names") -} + local catalog = pdfdictionary { Type = pdfconstant("Catalog") } -- nicer, but when we assign we nil the Type + local info = pdfdictionary { Type = pdfconstant("Info") } -- nicer, but when we assign we nil the Type + ----- names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type -local function flushnames() - if next(names) and not environment.initex then - names.Type = pdfconstant("Names") - trace_flush("names") - lpdf.addtocatalog("Names",pdfreference(pdfimmediateobject(tostring(names)))) + local function flushcatalog() + if not environment.initex then + trace_flush("catalog") + catalog.Type = nil + pdfsetcatalog(catalog()) + end end -end -function lpdf.addtonames(k,v) - if not (lpdf.protectresources and names [k]) then - trace_set("names", k) - names [k] = v + local function flushinfo() + if not environment.initex then + trace_flush("info") + info.Type = nil + pdfsetinfo(info()) + end end -end -local dummy = pdfreserveobject() -- else bug in hvmd due so some internal luatex conflict + -- local function flushnames() + -- if not environment.initex then + -- trace_flush("names") + -- names.Type = nil + -- pdfsetnames(names()) + -- end + -- end + + function lpdf.addtocatalog(k,v) + if not (lpdf.protectresources and catalog[k]) then + trace_set("catalog",k) + catalog[k] = v + end + end --- Some day I will implement a proper minimalized resource management. + function lpdf.addtoinfo(k,v) + if not (lpdf.protectresources and info[k]) then + trace_set("info",k) + info[k] = v + end + end -local r_extgstates, d_extgstates = pdfreserveobject(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates) -local r_colorspaces, d_colorspaces = pdfreserveobject(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces) -local r_patterns, d_patterns = pdfreserveobject(), pdfdictionary() local p_patterns = pdfreference(r_patterns) -local r_shades, d_shades = pdfreserveobject(), pdfdictionary() local p_shades = pdfreference(r_shades) + -- local function lpdf.addtonames(k,v) + -- if not (lpdf.protectresources and names[k]) then + -- trace_set("names",k) + -- names[k] = v + -- end + -- end -local function checkextgstates () if next(d_extgstates ) then addtopageresources("ExtGState", p_extgstates ) end end -local function checkcolorspaces() if next(d_colorspaces) then addtopageresources("ColorSpace",p_colorspaces) end end -local function checkpatterns () if next(d_patterns ) then addtopageresources("Pattern", p_patterns ) end end -local function checkshades () if next(d_shades ) then addtopageresources("Shading", p_shades ) end end + local names = pdfdictionary { + -- Type = pdfconstant("Names") + } -local function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobject(r_extgstates, tostring(d_extgstates )) end end -local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobject(r_colorspaces,tostring(d_colorspaces)) end end -local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobject(r_patterns, tostring(d_patterns )) end end -local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobject(r_shades, tostring(d_shades )) end end + local function flushnames() + if next(names) and not environment.initex then + names.Type = pdfconstant("Names") + trace_flush("names") + lpdf.addtocatalog("Names",pdfreference(pdfimmediateobject(tostring(names)))) + end + end -function lpdf.collectedresources() - local ExtGState = next(d_extgstates ) and p_extgstates - local ColorSpace = next(d_colorspaces) and p_colorspaces - local Pattern = next(d_patterns ) and p_patterns - local Shading = next(d_shades ) and p_shades - if ExtGState or ColorSpace or Pattern or Shading then - local collected = pdfdictionary { - ExtGState = ExtGState, - ColorSpace = ColorSpace, - Pattern = Pattern, - Shading = Shading, - -- ProcSet = pdfarray { pdfconstant("PDF") }, - } - return collected() - else - return "" + function lpdf.addtonames(k,v) + if not (lpdf.protectresources and names[k]) then + trace_set("names", k) + names [k] = v + end + end + + local r_extgstates, d_extgstates = pdfreserveobject(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates) + local r_colorspaces, d_colorspaces = pdfreserveobject(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces) + local r_patterns, d_patterns = pdfreserveobject(), pdfdictionary() local p_patterns = pdfreference(r_patterns) + local r_shades, d_shades = pdfreserveobject(), pdfdictionary() local p_shades = pdfreference(r_shades) + + local function checkextgstates () if next(d_extgstates ) then addtopageresources("ExtGState", p_extgstates ) end end + local function checkcolorspaces() if next(d_colorspaces) then addtopageresources("ColorSpace",p_colorspaces) end end + local function checkpatterns () if next(d_patterns ) then addtopageresources("Pattern", p_patterns ) end end + local function checkshades () if next(d_shades ) then addtopageresources("Shading", p_shades ) end end + + local function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobject(r_extgstates, tostring(d_extgstates )) end end + local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobject(r_colorspaces,tostring(d_colorspaces)) end end + local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobject(r_patterns, tostring(d_patterns )) end end + local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobject(r_shades, tostring(d_shades )) end end + + function lpdf.collectedresources() + local ExtGState = next(d_extgstates ) and p_extgstates + local ColorSpace = next(d_colorspaces) and p_colorspaces + local Pattern = next(d_patterns ) and p_patterns + local Shading = next(d_shades ) and p_shades + if ExtGState or ColorSpace or Pattern or Shading then + local collected = pdfdictionary { + ExtGState = ExtGState, + ColorSpace = ColorSpace, + Pattern = Pattern, + Shading = Shading, + -- ProcSet = pdfarray { pdfconstant("PDF") }, + } + return collected() + else + return "" + end end -end -function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end -function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end -function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end -function lpdf.adddocumentshade (k,v) d_shades [k] = v end + function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end + function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end + function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end + function lpdf.adddocumentshade (k,v) d_shades [k] = v end -registerdocumentfinalizer(flushextgstates,3,"extended graphic states") -registerdocumentfinalizer(flushcolorspaces,3,"color spaces") -registerdocumentfinalizer(flushpatterns,3,"patterns") -registerdocumentfinalizer(flushshades,3,"shades") + registerdocumentfinalizer(flushextgstates,3,"extended graphic states") + registerdocumentfinalizer(flushcolorspaces,3,"color spaces") + registerdocumentfinalizer(flushpatterns,3,"patterns") + registerdocumentfinalizer(flushshades,3,"shades") -registerdocumentfinalizer(flushnames,3,"names") -- before catalog -registerdocumentfinalizer(flushcatalog,3,"catalog") -registerdocumentfinalizer(flushinfo,3,"info") + registerdocumentfinalizer(flushnames,3,"names") -- before catalog + registerdocumentfinalizer(flushcatalog,3,"catalog") + registerdocumentfinalizer(flushinfo,3,"info") -registerpagefinalizer(checkextgstates,3,"extended graphic states") -registerpagefinalizer(checkcolorspaces,3,"color spaces") -registerpagefinalizer(checkpatterns,3,"patterns") -registerpagefinalizer(checkshades,3,"shades") + registerpagefinalizer(checkextgstates,3,"extended graphic states") + registerpagefinalizer(checkcolorspaces,3,"color spaces") + registerpagefinalizer(checkpatterns,3,"patterns") + registerpagefinalizer(checkshades,3,"shades") + +end -- in strc-bkm: lpdf.registerdocumentfinalizer(function() structures.bookmarks.place() end,1) @@ -877,54 +1002,78 @@ end -- ! -> universaltime -local timestamp = os.date("%Y-%m-%dT%X") .. os.timezone(true) +do -function lpdf.timestamp() - return timestamp -end + local timestamp = os.date("%Y-%m-%dT%X") .. os.timezone(true) -function lpdf.pdftimestamp(str) - local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$") - return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm) -end + function lpdf.timestamp() + return timestamp + end + + function lpdf.pdftimestamp(str) + local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$") + return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm) + end + + function lpdf.id() + return format("%s.%s",tex.jobname,timestamp) + end -function lpdf.id() - return format("%s.%s",tex.jobname,timestamp) end +-- return nil is nicer in test prints + function lpdf.checkedkey(t,key,variant) local pn = t and t[key] - if pn then + if pn ~= nil then local tn = type(pn) if tn == variant then if variant == "string" then - return pn ~= "" and pn or nil + if pn ~= "" then + return pn + end elseif variant == "table" then - return next(pn) and pn or nil + if next(pn) then + return pn + end else return pn end - elseif tn == "string" and variant == "number" then - return tonumber(pn) + elseif tn == "string" then + if variant == "number" then + return tonumber(pn) + elseif variant == "boolean" then + return isboolean(pn,nil,true) + end end end + -- return nil end function lpdf.checkedvalue(value,variant) -- code not shared - if value then + if value ~= nil then local tv = type(value) if tv == variant then if variant == "string" then - return value ~= "" and value + if value ~= "" then + return value + end elseif variant == "table" then - return next(value) and value + if next(value) then + return value + end else return value end - elseif tv == "string" and variant == "number" then - return tonumber(value) + elseif tv == "string" then + if variant == "number" then + return tonumber(value) + elseif variant == "boolean" then + return isboolean(value,nil,true) + end end end + -- return nil end function lpdf.limited(n,min,max,default) @@ -944,10 +1093,11 @@ function lpdf.limited(n,min,max,default) end end --- lpdf.addtoinfo("ConTeXt.Version", tex.contextversiontoks) +-- lpdf.addtoinfo("ConTeXt.Version", environment.version) -- lpdf.addtoinfo("ConTeXt.Time", os.date("%Y.%m.%d %H:%M")) -- :%S -- lpdf.addtoinfo("ConTeXt.Jobname", environment.jobname) -- lpdf.addtoinfo("ConTeXt.Url", "www.pragma-ade.com") +-- lpdf.addtoinfo("ConTeXt.Support", "contextgarden.net") -- if not pdfreferenceobject then -- @@ -1002,3 +1152,62 @@ end -- end -- end, -- }) + + +-- The next variant of ActualText is what Taco and I could come up with +-- eventually. As of September 2013 Acrobat copies okay, Sumatra copies a +-- question mark, pdftotext injects an extra space and Okular adds a +-- newline plus space. + +-- return formatters["BT /Span << /ActualText (CONTEXT) >> BDC [] TJ % t EMC ET"](code) + +do + + local f_actual_text_one = formatters["BT /Span << /ActualText >> BDC [] TJ %s EMC ET"] + local f_actual_text_two = formatters["BT /Span << /ActualText >> BDC [] TJ %s EMC ET"] + local f_actual_text = formatters["/Span <> BDC"] + + local context = context + local pdfdirect = nodes.pool.pdfdirect + + function codeinjections.unicodetoactualtext(unicode,pdfcode) + if unicode < 0x10000 then + return f_actual_text_one(unicode,pdfcode) + else + return f_actual_text_two(unicode/1024+0xD800,unicode%1024+0xDC00,pdfcode) + end + end + + implement { + name = "startactualtext", + arguments = "string", + actions = function(str) + context(pdfdirect(f_actual_text(tosixteen(str)))) + end + } + + implement { + name = "stopactualtext", + actions = function() + context(pdfdirect("EMC")) + end + } + +end + +-- interface + +local lpdfverbose = lpdf.verbose + +implement { name = "lpdf_collectedresources", actions = { lpdf.collectedresources, context } } +implement { name = "lpdf_addtocatalog", arguments = two_strings, actions = lpdf.addtocatalog } +implement { name = "lpdf_addtoinfo", arguments = two_strings, actions = lpdf.addtoinfo } +implement { name = "lpdf_addtonames", arguments = two_strings, actions = lpdf.addtonames } +implement { name = "lpdf_addpageattributes", arguments = two_strings, actions = lpdf.addtopageattributes } +implement { name = "lpdf_addpagesattributes", arguments = two_strings, actions = lpdf.addtopagesattributes } +implement { name = "lpdf_addpageresources", arguments = two_strings, actions = lpdf.addtopageresources } +implement { name = "lpdf_adddocumentextgstate", arguments = two_strings, actions = function(a,b) lpdf.adddocumentextgstate (a,lpdfverbose(b)) end } +implement { name = "lpdf_adddocumentcolorspace", arguments = two_strings, actions = function(a,b) lpdf.adddocumentcolorspace(a,lpdfverbose(b)) end } +implement { name = "lpdf_adddocumentpattern", arguments = two_strings, actions = function(a,b) lpdf.adddocumentpattern (a,lpdfverbose(b)) end } +implement { name = "lpdf_adddocumentshade", arguments = two_strings, actions = function(a,b) lpdf.adddocumentshade (a,lpdfverbose(b)) end } + diff --git a/Master/texmf-dist/tex/context/base/lpdf-mis.lua b/Master/texmf-dist/tex/context/base/lpdf-mis.lua index 6efbd38820e..a1b12d8c0bb 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-mis.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-mis.lua @@ -241,67 +241,93 @@ lpdf.registerdocumentfinalizer(flushjavascripts,"javascripts") -- -- -- local pagespecs = { - [variables.max] = { "FullScreen", false, false }, - [variables.bookmark] = { "UseOutlines", false, false }, - [variables.fit] = { "UseNone", false, true }, - [variables.doublesided] = { "UseNone", "TwoColumnRight", true }, - [variables.singlesided] = { "UseNone", false, false }, - [variables.default] = { "UseNone", "auto", false }, - [variables.auto] = { "UseNone", "auto", false }, - [variables.none] = { false, false, false }, + [variables.max] = { mode = "FullScreen", layout = false, fit = false, fixed = false, duplex = false }, + [variables.bookmark] = { mode = "UseOutlines", layout = false, fit = false, fixed = false, duplex = false }, + [variables.fit] = { mode = "UseNone", layout = false, fit = true, fixed = false, duplex = false }, + [variables.doublesided] = { mode = "UseNone", layout = "TwoColumnRight", fit = true, fixed = false, duplex = false }, + [variables.singlesided] = { mode = "UseNone", layout = false, fit = false, fixed = false, duplex = false }, + [variables.default] = { mode = "UseNone", layout = "auto", fit = false, fixed = false, duplex = false }, + [variables.auto] = { mode = "UseNone", layout = "auto", fit = false, fixed = false, duplex = false }, + [variables.none] = { mode = false, layout = false, fit = false, fixed = false, duplex = false }, + -- new + [variables.fixed] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = false }, -- noscale + [variables.landscape] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = "DuplexFlipShortEdge" }, + [variables.portrait] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = "DuplexFlipLongEdge" }, + } local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false +local pdfpaperheight = tex.pdfpageheight +local pdfpaperwidth = tex.pdfpagewidth + function codeinjections.setupcanvas(specification) local paperheight = specification.paperheight local paperwidth = specification.paperwidth local paperdouble = specification.doublesided if paperheight then texset('global','pdfpageheight',paperheight) + pdfpaperheight = paperheight end if paperwidth then texset('global','pdfpagewidth',paperwidth) + pdfpaperwidth = paperwidth end pagespec = specification.mode or pagespec topoffset = specification.topoffset or 0 leftoffset = specification.leftoffset or 0 - height = specification.height or tex.pdfpageheight - width = specification.width or tex.pdfpagewidth + height = specification.height or pdfpaperheight + width = specification.width or pdfpaperwidth if paperdouble ~= nil then doublesided = paperdouble end end local function documentspecification() + if not pagespec or pagespec == "" then + pagespec = variables.default + end + -- local settings = utilities.parsers.settings_to_array(pagespec) + -- local spec = pagespecs[variables.default] + -- for i=1,#settings do + -- local s = pagespecs[settings[i]] + -- if s then + -- for k, v in next, s do + -- spec[k] = v + -- end + -- end + -- end local spec = pagespecs[pagespec] or pagespecs[variables.default] - if spec then - local mode, layout, fit = spec[1], spec[2], spec[3] - if layout == variables.auto then - if doublesided then - spec = pagespecs[variables.doublesided] -- to be checked voor interfaces - if spec then - mode, layout, fit = spec[1], spec[2], spec[3] - end - else - layout = false + if spec.layout == "auto" then + if doublesided then + local s = pagespecs[variables.doublesided] -- to be checked voor interfaces + for k, v in next, s do + spec[k] = v end + else + spec.layout = false end - mode = mode and pdfconstant(mode) - layout = layout and pdfconstant(layout) - fit = fit and pdfdictionary { FitWindow = true } - if layout then - addtocatalog("PageLayout",layout) - end - if mode then - addtocatalog("PageMode",mode) - end - if fit then - addtocatalog("ViewerPreferences",fit) - end - addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP - addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion))) end + local layout = spec.layout + local mode = spec.mode + local fit = spec.fit + local fixed = spec.fixed + local duplex = spec.duplex + if layout then + addtocatalog("PageLayout",pdfconstant(layout)) + end + if mode then + addtocatalog("PageMode",pdfconstant(mode)) + end + if fit or fixed or duplex then + addtocatalog("ViewerPreferences",pdfdictionary { + FitWindow = fit and true or nil, + PrintScaling = fixed and pdfconstant("None") or nil, + Duplex = duplex and pdfconstant(duplex) or nil, + }) + end + addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP + addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion))) end -- temp hack: the mediabox is not under our control and has a precision of 4 digits @@ -313,7 +339,7 @@ local function boxvalue(n) -- we could share them end local function pagespecification() - local pageheight = tex.pdfpageheight + local pageheight = pdfpaperheight local box = pdfarray { -- can be cached boxvalue(leftoffset), boxvalue(pageheight+topoffset-height), diff --git a/Master/texmf-dist/tex/context/base/lpdf-pda.xml b/Master/texmf-dist/tex/context/base/lpdf-pda.xml index 2d8e7b6f59f..3f6b969c01d 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-pda.xml +++ b/Master/texmf-dist/tex/context/base/lpdf-pda.xml @@ -3,15 +3,20 @@ + application/pdf - + - + + + + + diff --git a/Master/texmf-dist/tex/context/base/lpdf-pdx.xml b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml index 42e11650e71..d55e1fdf303 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-pdx.xml +++ b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml @@ -8,10 +8,14 @@ application/pdf - + - + + + + + diff --git a/Master/texmf-dist/tex/context/base/lpdf-ren.lua b/Master/texmf-dist/tex/context/base/lpdf-ren.lua index 37b70642076..61676d5a81a 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-ren.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-ren.lua @@ -54,12 +54,27 @@ local pdf_ocg = pdfconstant("OCG") local pdf_ocmd = pdfconstant("OCMD") local pdf_off = pdfconstant("OFF") local pdf_on = pdfconstant("ON") +local pdf_view = pdfconstant("View") +local pdf_design = pdfconstant("Design") local pdf_toggle = pdfconstant("Toggle") local pdf_setocgstate = pdfconstant("SetOCGState") local copy_node = node.copy -local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdf_off } } +local pdf_print = { + [v_yes] = pdfdictionary { PrintState = pdf_on }, + [v_no ] = pdfdictionary { PrintState = pdf_off }, +} + +local pdf_intent = { + [v_yes] = pdf_view, + [v_no] = pdf_design, +} + +local pdf_export = { + [v_yes] = pdf_on, + [v_no] = pdf_off, +} -- We can have references to layers before they are places, for instance from -- hide and vide actions. This is why we need to be able to force usage of layers @@ -99,10 +114,13 @@ local function useviewerlayer(name) -- move up so that we can use it as local local nn = pdfreserveobject() local nr = pdfreference(nn) local nd = pdfdictionary { - Type = pdf_ocg, - Name = specification.title or "unknown", - Intent = ((specification.editable ~= v_no) and pdf_design) or nil, -- disable layer hiding by user - Usage = ((specification.printable == v_no) and lpdf_usage) or nil, -- printable or not + Type = pdf_ocg, + Name = specification.title or "unknown", + Usage = { + Intent = pdf_intent[specification.editable or v_yes], -- disable layer hiding by user (useless) + Print = pdf_print [specification.printable or v_yes], -- printable or not + Export = pdf_export[specification.export or v_yes], -- export or not + }, } cache[#cache+1] = { nn, nd } pdfln[tag] = nr -- was n @@ -165,6 +183,14 @@ local function flushtextlayers() ON = videlayers, OFF = hidelayers, BaseState = pdf_on, + +AS = pdfarray { + pdfdictionary { + Category = pdfarray { pdfconstant("Print") }, + Event = pdfconstant("Print"), + OCGs = (viewerlayers.hasorder and sortedlayers) or nil, + } +}, }, } addtocatalog("OCProperties",d) diff --git a/Master/texmf-dist/tex/context/base/lpdf-tag.lua b/Master/texmf-dist/tex/context/base/lpdf-tag.lua index 276816e8041..dbe4d3f1ee7 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-tag.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-tag.lua @@ -8,8 +8,10 @@ if not modules then modules = { } end modules ['lpdf-tag'] = { local next = next local format, match, concat = string.format, string.match, table.concat -local lpegmatch = lpeg.match +local lpegmatch, P, S, C = lpeg.match, lpeg.P, lpeg.S, lpeg.C local utfchar = utf.char +local settings_to_hash = utilities.parsers.settings_to_hash +local formatters = string.formatters local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end) @@ -78,13 +80,17 @@ local root = { pref = pdfreference(structure_ref), kids = structu local tree = { } local elements = { } local names = pdfarray() -local taglist = structures.tags.taglist -local usedlabels = structures.tags.labels -local properties = structures.tags.properties + +local structurestags = structures.tags +local taglist = structurestags.taglist +local specifications = structurestags.specifications +local usedlabels = structurestags.labels +local properties = structurestags.properties +local lasttaginchain = structurestags.lastinchain + local usedmapping = { } -local colonsplitter = lpeg.splitat(":") -local dashsplitter = lpeg.splitat("-") +-- local tagsplitter = structurestags.patterns.splitter local add_ids = false -- true @@ -96,13 +102,14 @@ local function finishstructure() if #structure_kids > 0 then local nums, n = pdfarray(), 0 for i=1,#tree do - n = n + 1 ; nums[n] = i-1 + n = n + 1 ; nums[n] = i - 1 n = n + 1 ; nums[n] = pdfreference(pdfflushobject(tree[i])) end local parenttree = pdfdictionary { Nums = nums } -- we need to split names into smaller parts (e.g. alphabetic or so) + -- we already have code for that somewhere if add_ids then local kids = pdfdictionary { Limits = pdfarray { names[1], names[#names-1] }, @@ -150,10 +157,10 @@ local pdf_mcr = pdfconstant("MCR") local pdf_struct_element = pdfconstant("StructElem") local function initializepage() - index = 0 + index = 0 pagenum = texgetcount("realpageno") pageref = pdfreference(pdfpagereference(pagenum)) - list = pdfarray() + list = pdfarray() tree[pagenum] = list -- we can flush after done, todo end @@ -164,20 +171,51 @@ end -- here we can flush and free elements that are finished +local pdf_userproperties = pdfconstant("UserProperties") + +local function makeattribute(t) + if t and next(t) then + local properties = pdfarray() + for k, v in next, t do + properties[#properties+1] = pdfdictionary { + N = pdfunicode(k), + V = pdfunicode(v), + } + end + return pdfdictionary { + O = pdf_userproperties, + P = properties, + } + end +end + local function makeelement(fulltag,parent) - local tag, n = lpegmatch(dashsplitter,fulltag) - local tg, detail = lpegmatch(colonsplitter,tag) - local k, r = pdfarray(), pdfreserveobject() - usedmapping[tg] = true - tg = usedlabels[tg] or tg + local specification = specifications[fulltag] + local tag = specification.tagname + if tag == "ignore" then + return false + elseif tag == "mstackertop" or tag == "mstackerbot" or tag == "mstackermid"then + -- TODO + return true + end + -- + local detail = specification.detail + local userdata = specification.userdata + -- + usedmapping[tag] = true + -- + local k = pdfarray() + local r = pdfreserveobject() + local t = usedlabels[tag] or tag local d = pdfdictionary { Type = pdf_struct_element, - S = pdfconstant(tg), + S = pdfconstant(t), ID = (add_ids and fulltag) or nil, T = detail and detail or nil, P = parent.pref, Pg = pageref, K = pdfreference(r), + A = a and makeattribute(a) or nil, -- Alt = " Who cares ", -- ActualText = " Hi Hans ", } @@ -188,10 +226,14 @@ local function makeelement(fulltag,parent) end local kids = parent.kids kids[#kids+1] = s - elements[fulltag] = { tag = tag, pref = s, kids = k, knum = r, pnum = pagenum } + local e = { tag = t, pref = s, kids = k, knum = r, pnum = pagenum } + elements[fulltag] = e + return e end -local function makecontent(parent,start,stop,slist,id) +local f_BDC = formatters["/%s <> BDC"] + +local function makecontent(parent,id) local tag = parent.tag local kids = parent.kids local last = index @@ -215,116 +257,304 @@ local function makecontent(parent,start,stop,slist,id) kids[#kids+1] = d end -- - local bliteral = pdfliteral(format("/%s <>BDC",tag,last)) - local eliteral = pdfliteral("EMC") - -- use insert instead: - local prev = getprev(start) - if prev then - setfield(prev,"next",bliteral) - setfield(bliteral,"prev",prev) - end - setfield(start,"prev",bliteral) - setfield(bliteral,"next",start) - -- use insert instead: - local next = getnext(stop) - if next then - setfield(next,"prev",eliteral) - setfield(eliteral,"next",next) - end - setfield(stop,"next",eliteral) - setfield(eliteral,"prev",stop) - -- - if slist and getlist(slist) == start then - setfield(slist,"list",bliteral) - elseif not getprev(start) then - report_tags("this can't happen: injection in front of nothing") - end index = index + 1 - list[index] = parent.pref - return bliteral, eliteral + list[index] = parent.pref -- page related list + -- + return f_BDC(tag,last) end --- -- -- - -local level, last, ranges, range = 0, nil, { }, nil - -local function collectranges(head,list) - for n in traverse_nodes(head) do - local id = getid(n) -- 14: image, 8: literal (mp) - if id == glyph_code then - local at = getattr(n,a_tagged) - if not at then - range = nil - elseif last ~= at then - range = { at, "glyph", n, n, list } -- attr id start stop list - ranges[#ranges+1] = range - last = at - elseif range then - range[4] = n -- stop - end - elseif id == hlist_code or id == vlist_code then - local at = getattr(n,a_image) - if at then +-- no need to adapt head, as we always operate on lists + +function nodeinjections.addtags(head) + + local last = nil + local ranges = { } + local range = nil + local head = tonut(head) + + local function collectranges(head,list) + for n in traverse_nodes(head) do + local id = getid(n) -- 14: image, 8: literal (mp) + if id == glyph_code then local at = getattr(n,a_tagged) if not at then range = nil + elseif last ~= at then + range = { at, "glyph", n, n, list } -- attr id start stop list + ranges[#ranges+1] = range + last = at + elseif range then + range[4] = n -- stop + end + elseif id == hlist_code or id == vlist_code then + local at = getattr(n,a_image) + if at then + local at = getattr(n,a_tagged) + if not at then + range = nil + else + ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list + end + last = nil else - ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list + local nl = getlist(n) + -- slide_nodelist(nl) -- temporary hack till math gets slided (tracker item) + collectranges(nl,n) end - last = nil - else - local nl = getlist(n) - slide_nodelist(nl) -- temporary hack till math gets slided (tracker item) - collectranges(nl,n) end end end -end -function nodeinjections.addtags(head) - -- no need to adapt head, as we always operate on lists - level, last, ranges, range = 0, nil, { }, nil initializepage() - head = tonut(head) + collectranges(head) + if trace_tags then for i=1,#ranges do local range = ranges[i] - local attr, id, start, stop = range[1], range[2], range[3], range[4] - local tags = taglist[attr] + local attr = range[1] + local id = range[2] + local start = range[3] + local stop = range[4] + local tags = taglist[attr] if tags then -- not ok ... only first lines - report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags) + report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags.taglist) end end end + + local top = nil + local noftop = 0 + for i=1,#ranges do - local range = ranges[i] - local attr, id, start, stop, list = range[1], range[2], range[3], range[4], range[5] - local tags = taglist[attr] - local prev = root - local noftags, tag = #tags, nil - for j=1,noftags do - local tag = tags[j] - if not elements[tag] then - makeelement(tag,prev) + local range = ranges[i] + local attr = range[1] + local id = range[2] + local start = range[3] + local stop = range[4] + local list = range[5] + local specification = taglist[attr] + local taglist = specification.taglist + local noftags = #taglist + local common = 0 + + if top then + for i=1,noftags >= noftop and noftop or noftags do + if top[i] == taglist[i] then + common = i + else + break + end + end + end + + local prev = common > 0 and elements[taglist[common]] or root + + for j=common+1,noftags do + local tag = taglist[j] + local prv = elements[tag] or makeelement(tag,prev) + if prv == false then + -- ignore this one + prev = false + break + elseif prv == true then + -- skip this one + else + prev = prv end - prev = elements[tag] end - local b, e = makecontent(prev,start,stop,list,id) - if start == head then - report_tags("this can't happen: parent list gets tagged") - head = b + + if prev then + -- use insert instead: + local literal = pdfliteral(makecontent(prev,id)) + local prev = getprev(start) + if prev then + setfield(prev,"next",literal) + setfield(literal,"prev",prev) + end + setfield(start,"prev",literal) + setfield(literal,"next",start) + if list and getlist(list) == start then + setfield(list,"list",literal) + end + -- use insert instead: + local literal = pdfliteral("EMC") + local next = getnext(stop) + if next then + setfield(next,"prev",literal) + setfield(literal,"next",next) + end + setfield(stop,"next",literal) + setfield(literal,"prev",stop) end + top = taglist + noftop = noftags end + finishpage() - -- can be separate feature - -- - -- injectspans(tonut(head)) -- does to work yet - -- + head = tonode(head) return head, true + end +-- variant: more structure but funny collapsing in viewer + +-- function nodeinjections.addtags(head) +-- +-- local last, ranges, range = nil, { }, nil +-- +-- local function collectranges(head,list) +-- for n in traverse_nodes(head) do +-- local id = getid(n) -- 14: image, 8: literal (mp) +-- if id == glyph_code then +-- local at = getattr(n,a_tagged) +-- if not at then +-- range = nil +-- elseif last ~= at then +-- range = { at, "glyph", n, n, list } -- attr id start stop list +-- ranges[#ranges+1] = range +-- last = at +-- elseif range then +-- range[4] = n -- stop +-- end +-- elseif id == hlist_code or id == vlist_code then +-- local at = getattr(n,a_image) +-- if at then +-- local at = getattr(n,a_tagged) +-- if not at then +-- range = nil +-- else +-- ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list +-- end +-- last = nil +-- else +-- local nl = getlist(n) +-- -- slide_nodelist(nl) -- temporary hack till math gets slided (tracker item) +-- collectranges(nl,n) +-- end +-- end +-- end +-- end +-- +-- initializepage() +-- +-- head = tonut(head) +-- collectranges(head) +-- +-- if trace_tags then +-- for i=1,#ranges do +-- local range = ranges[i] +-- local attr = range[1] +-- local id = range[2] +-- local start = range[3] +-- local stop = range[4] +-- local tags = taglist[attr] +-- if tags then -- not ok ... only first lines +-- report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags.taglist) +-- end +-- end +-- end +-- +-- local top = nil +-- local noftop = 0 +-- local last = nil +-- +-- for i=1,#ranges do +-- local range = ranges[i] +-- local attr = range[1] +-- local id = range[2] +-- local start = range[3] +-- local stop = range[4] +-- local list = range[5] +-- local specification = taglist[attr] +-- local taglist = specification.taglist +-- local noftags = #taglist +-- local tag = nil +-- local common = 0 +-- -- local prev = root +-- +-- if top then +-- for i=1,noftags >= noftop and noftop or noftags do +-- if top[i] == taglist[i] then +-- common = i +-- else +-- break +-- end +-- end +-- end +-- +-- local result = { } +-- local r = noftop - common +-- if r > 0 then +-- for i=1,r do +-- result[i] = "EMC" +-- end +-- end +-- +-- local prev = common > 0 and elements[taglist[common]] or root +-- +-- for j=common+1,noftags do +-- local tag = taglist[j] +-- local prv = elements[tag] or makeelement(tag,prev) +-- -- if prv == false then +-- -- -- ignore this one +-- -- prev = false +-- -- break +-- -- elseif prv == true then +-- -- -- skip this one +-- -- else +-- prev = prv +-- r = r + 1 +-- result[r] = makecontent(prev,id) +-- -- end +-- end +-- +-- if r > 0 then +-- local literal = pdfliteral(concat(result,"\n")) +-- -- use insert instead: +-- local literal = pdfliteral(result) +-- local prev = getprev(start) +-- if prev then +-- setfield(prev,"next",literal) +-- setfield(literal,"prev",prev) +-- end +-- setfield(start,"prev",literal) +-- setfield(literal,"next",start) +-- if list and getlist(list) == start then +-- setfield(list,"list",literal) +-- end +-- end +-- +-- top = taglist +-- noftop = noftags +-- last = stop +-- +-- end +-- +-- if last and noftop > 0 then +-- local result = { } +-- for i=1,noftop do +-- result[i] = "EMC" +-- end +-- local literal = pdfliteral(concat(result,"\n")) +-- -- use insert instead: +-- local next = getnext(last) +-- if next then +-- setfield(next,"prev",literal) +-- setfield(literal,"next",next) +-- end +-- setfield(last,"next",literal) +-- setfield(literal,"prev",last) +-- end +-- +-- finishpage() +-- +-- head = tonode(head) +-- return head, true +-- +-- end + -- this belongs elsewhere (export is not pdf related) function codeinjections.enabletags(tg,lb) diff --git a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua index c8b2d236c62..b44c57b42aa 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua @@ -26,7 +26,7 @@ local pdfconstant = lpdf.constant local pdfreference = lpdf.reference local pdfflushstreamobject = lpdf.flushstreamobject --- I wonder why this begin end is empty / w (no time now to look into it) +-- I wonder why this begin end is empty / w (no time now to look into it) / begin can also be "?" local xpacket = [[ @@ -50,7 +50,7 @@ local mapping = { -- Dublin Core schema ["Author"] = "rdf:Description/dc:creator/rdf:Seq/rdf:li", ["Format"] = "rdf:Description/dc:format", -- optional, but nice to have - ["Subject"] = "rdf:Description/dc:description", + ["Subject"] = "rdf:Description/dc:description/rdf:Alt/rdf:li", ["Title"] = "rdf:Description/dc:title/rdf:Alt/rdf:li", -- XMP Basic schema ["CreateDate"] = "rdf:Description/xmp:CreateDate", @@ -91,7 +91,12 @@ local function setxmpfile(name) end codeinjections.setxmpfile = setxmpfile -commands.setxmpfile = setxmpfile + +interfaces.implement { + name = "setxmpfile", + arguments = "string", + actions = setxmpfile +} local function valid_xmp() if not xmp then @@ -105,7 +110,7 @@ local function valid_xmp() if xmpfile ~= "" then report_xmp("using file %a",xmpfile) end - local xmpdata = (xmpfile ~= "" and io.loaddata(xmpfile)) or "" + local xmpdata = xmpfile ~= "" and io.loaddata(xmpfile) or "" xmp = xml.convert(xmpdata) end return xmp @@ -157,8 +162,7 @@ local function flushxmpinfo() local producer = format("LuaTeX-%0.2f.%s",tex.luatexversion/100,tex.luatexrevision) local creator = "LuaTeX + ConTeXt MkIV" local time = lpdf.timestamp() - local fullbanner = tex.pdftexbanner - -- local fullbanner = gsub(tex.pdftexbanner,"kpse.*","") + local fullbanner = status.banner pdfaddxmpinfo("DocumentID", documentid) pdfaddxmpinfo("InstanceID", instanceid) @@ -173,7 +177,7 @@ local function flushxmpinfo() pdfaddtoinfo("Creator", creator) pdfaddtoinfo("CreationDate", time) pdfaddtoinfo("ModDate", time) --- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence + -- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta")) local md = pdfdictionary { diff --git a/Master/texmf-dist/tex/context/base/luat-bas.mkiv b/Master/texmf-dist/tex/context/base/luat-bas.mkiv index a3891271619..cb00d8f55e7 100644 --- a/Master/texmf-dist/tex/context/base/luat-bas.mkiv +++ b/Master/texmf-dist/tex/context/base/luat-bas.mkiv @@ -13,7 +13,8 @@ \writestatus{loading}{ConTeXt Lua Macros / Basic Lua Libraries} -\registerctxluafile{l-lua} {1.001} +\registerctxluafile{l-lua} {1.001} % before sandbox +\registerctxluafile{l-sandbox} {1.001} \registerctxluafile{l-package} {1.001} \registerctxluafile{l-lpeg} {1.001} \registerctxluafile{l-function}{1.001} diff --git a/Master/texmf-dist/tex/context/base/luat-cnf.lua b/Master/texmf-dist/tex/context/base/luat-cnf.lua index fba2b71d1ec..0f6b8598f37 100644 --- a/Master/texmf-dist/tex/context/base/luat-cnf.lua +++ b/Master/texmf-dist/tex/context/base/luat-cnf.lua @@ -7,7 +7,9 @@ if not modules then modules = { } end modules ['luat-cnf'] = { } local type, next, tostring, tonumber = type, next, tostring, tonumber -local format, concat, find = string.format, table.concat, string.find +local format, concat, find, lower, gsub = string.format, table.concat, string.find, string.lower, string.gsub + +local report = logs.reporter("system") local allocate = utilities.storage.allocate @@ -17,8 +19,10 @@ texconfig.shell_escape = 't' luatex = luatex or { } local luatex = luatex -texconfig.error_line = 79 -- 79 -- obsolete -texconfig.half_error_line = 50 -- 50 -- obsolete +texconfig.max_print_line = 100000 -- frozen +texconfig.max_in_open = 127 -- frozen +texconfig.error_line = 79 -- frozen +texconfig.half_error_line = 50 -- frozen texconfig.expand_depth = 10000 -- 10000 texconfig.hash_extra = 100000 -- 0 @@ -28,25 +32,9 @@ texconfig.max_print_line = 10000 -- 79 texconfig.max_strings = 500000 -- 15000 texconfig.param_size = 25000 -- 60 texconfig.save_size = 50000 -- 4000 +texconfig.save_size = 100000 -- 4000 texconfig.stack_size = 10000 -- 300 --- local function initialize() --- local t, variable = allocate(), resolvers.variable --- for name, default in next, variablenames do --- local name = variablenames[i] --- local value = variable(name) --- value = tonumber(value) --- if not value or value == "" or value == 0 then --- value = default --- end --- texconfig[name], t[name] = value, value --- end --- initialize = nil --- return t --- end --- --- luatex.variables = initialize() - local stub = [[ -- checking @@ -76,7 +64,7 @@ function texconfig.init() "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", }, basictex = { -- noad - "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token", + "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token", "newtoken" }, extralua = { "gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "profiler", "unicode", "utf", @@ -87,6 +75,7 @@ function texconfig.init() obsolete = { "fontforge", -- can be filled by luat-log "kpse", + "token", }, functions = { "assert", "pcall", "xpcall", "error", "collectgarbage", @@ -175,26 +164,55 @@ end) ]] local variablenames = { - "error_line", "half_error_line", - "expand_depth", "hash_extra", "nest_size", - "max_in_open", "max_print_line", "max_strings", - "param_size", "save_size", "stack_size", + error_line = false, + half_error_line = false, + max_print_line = false, + max_in_open = false, + expand_depth = true, + hash_extra = true, + nest_size = true, + max_strings = true, + param_size = true, + save_size = true, + stack_size = true, } local function makestub() name = name or (environment.jobname .. ".lui") + report("creating stub file %a using directives:",name) + report() firsttable = firsttable or lua.firstbytecode local t = { "-- this file is generated, don't change it\n", "-- configuration (can be overloaded later)\n" } - for _,v in next, variablenames do + for v, permitted in table.sortedhash(variablenames) do + local d = "luatex." .. gsub(lower(v),"[^%a]","") + local dv = directives.value(d) local tv = texconfig[v] - if tv and tv ~= "" then + if dv then + if not tv then + report(" %s = %s (%s)",d,dv,"configured") + tv = dv + elseif not permitted then + report(" %s = %s (%s)",d,tv,"frozen") + elseif tonumber(dv) >= tonumber(tv) then + report(" %s = %s (%s)",d,dv,"overloaded") + tv = dv + else + report(" %s = %s (%s)",d,tv,"preset kept") + end + elseif tv then + report(" %s = %s (%s)",d,tv,permitted and "preset" or "frozen") + else + report(" %s = ",d) + end + if tv then t[#t+1] = format("texconfig.%s=%s",v,tv) end end io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable))) + logs.newline() end lua.registerfinalizer(makestub,"create stub file") diff --git a/Master/texmf-dist/tex/context/base/luat-cod.lua b/Master/texmf-dist/tex/context/base/luat-cod.lua index c16a3b110ea..c436ee6d7a6 100644 --- a/Master/texmf-dist/tex/context/base/luat-cod.lua +++ b/Master/texmf-dist/tex/context/base/luat-cod.lua @@ -162,7 +162,7 @@ local function target_file(name) return targetpath .. "/" .. name end -local function find_read_file (id,name) +local function find_read_file(id,name) return source_file(name) end diff --git a/Master/texmf-dist/tex/context/base/luat-exe.lua b/Master/texmf-dist/tex/context/base/luat-exe.lua index a57a5a006fb..d8d954a307b 100644 --- a/Master/texmf-dist/tex/context/base/luat-exe.lua +++ b/Master/texmf-dist/tex/context/base/luat-exe.lua @@ -6,121 +6,68 @@ if not modules then modules = { } end modules ['luat-exe'] = { license = "see context related readme files" } --- this module needs checking (very old and never really used, not even enabled) +if not sandbox then require("l-sandbox") require("util-sbx") end -- for testing -local match, find, gmatch = string.match, string.find, string.gmatch -local concat = table.concat -local select = select +local type = type -local report_executers = logs.reporter("system","executers") +local executers = resolvers.executers or { } +resolvers.executers = executers -resolvers.executers = resolvers.executers or { } -local executers = resolvers.executers +local disablerunners = sandbox.disablerunners +local registerbinary = sandbox.registerbinary +local registerroot = sandbox.registerroot -local permitted = { } +local lpegmatch = lpeg.match -local osexecute = os.execute -local osexec = os.exec -local osspawn = os.spawn -local iopopen = io.popen +local sc_splitter = lpeg.tsplitat(";") +local cm_splitter = lpeg.tsplitat(",") -local execute = osexecute -local exec = osexec -local spawn = osspawn -local popen = iopopen - -local function register(...) - for k=1,select("#",...) do - local v = select(k,...) - permitted[#permitted+1] = v == "*" and ".*" or v - end -end +local execution_mode directives.register("system.executionmode", function(v) execution_mode = v end) +local execution_list directives.register("system.executionlist", function(v) execution_list = v end) +local root_list directives.register("system.rootlist", function(v) root_list = v end) -local function prepare(...) - -- todo: make more clever first split - local t = { ... } - local n = #n - local one = t[1] - if n == 1 then - if type(one) == 'table' then - return one, concat(t," ",2,n) - else - local name, arguments = match(one,"^(.-)%s+(.+)$") - if name and arguments then - return name, arguments - else - return one, "" +sandbox.initializer(function() + if execution_mode == "none" then + -- will be done later + elseif execution_mode == "list" then + if type(execution_list) == "string" then + execution_list = lpegmatch(cm_splitter,execution_list) + end + if type(execution_list) == "table" then + for i=1,#execution_list do + registerbinary(execution_list[i]) end end else - return one, concat(t," ",2,n) + -- whatever else we have configured end -end +end) -local function executer(action) - return function(...) - local name, arguments = prepare(...) - for k=1,#permitted do - local v = permitted[k] - if find(name,v) then - return action(name .. " " .. arguments) - else - report_executers("not permitted: %s %s",name,arguments) +sandbox.initializer(function() + if type(root_list) == "string" then + root_list = lpegmatch(sc_splitter,root_list) + end + if type(root_list) == "table" then + for i=1,#root_list do + local entry = root_list[i] + if entry ~= "" then + registerroot(entry) end end - return action("") end -end +end) -local function finalize() -- todo: os.exec, todo: report ipv print - execute = executer(osexecute) - exec = executer(osexec) - spawn = executer(osspawn) - popen = executer(iopopen) - finalize = function() - report_executers("already finalized") - end - register = function() - report_executers("already finalized, no registration permitted") - end - os.execute = execute - os.exec = exec - os.spawn = spawn - io.popen = popen -end - -executers.finalize = function(...) return finalize(...) end -executers.register = function(...) return register(...) end -executers.execute = function(...) return execute (...) end -executers.exec = function(...) return exec (...) end -executers.spawn = function(...) return spawn (...) end -executers.popen = function(...) return popen (...) end - -local execution_mode directives.register("system.executionmode", function(v) execution_mode = v end) -local execution_list directives.register("system.executionlist", function(v) execution_list = v end) - -function executers.check() +sandbox.finalizer(function() if execution_mode == "none" then - finalize() - elseif execution_mode == "list" and execution_list ~= "" then - for s in gmatch("[^%s,]",execution_list) do - register(s) - end - finalize() - else - -- all + disablerunners() end -end - ---~ resolvers.executers.register('.*') ---~ resolvers.executers.register('*') ---~ resolvers.executers.register('dir','ls') ---~ resolvers.executers.register('dir') +end) ---~ resolvers.executers.finalize() ---~ resolvers.executers.execute('dir',"*.tex") ---~ resolvers.executers.execute("dir *.tex") ---~ resolvers.executers.execute("ls *.tex") ---~ os.execute('ls') +-- Let's prevent abuse of these libraries (built-in support still works). ---~ resolvers.executers.check() +sandbox.finalizer(function() + mplib = nil + epdf = nil + zip = nil + fontloader = nil +end) diff --git a/Master/texmf-dist/tex/context/base/luat-fmt.lua b/Master/texmf-dist/tex/context/base/luat-fmt.lua index 20a4a8fcdf7..92c1dd6c45d 100644 --- a/Master/texmf-dist/tex/context/base/luat-fmt.lua +++ b/Master/texmf-dist/tex/context/base/luat-fmt.lua @@ -95,7 +95,7 @@ function environment.make_format(name) -- generate format local command = format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\") report_format("running command: %s\n",command) - os.spawn(command) + os.execute(command) -- remove related mem files local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem" -- report_format("removing related mplib format with pattern %a", pattern) @@ -133,7 +133,7 @@ function environment.run_format(name,data,more) else local command = format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "") report_format("running command: %s",command) - os.spawn(command) + os.execute(command) end end end diff --git a/Master/texmf-dist/tex/context/base/luat-ini.lua b/Master/texmf-dist/tex/context/base/luat-ini.lua index 9303b614a3e..34e83e7bb38 100644 --- a/Master/texmf-dist/tex/context/base/luat-ini.lua +++ b/Master/texmf-dist/tex/context/base/luat-ini.lua @@ -6,14 +6,6 @@ if not modules then modules = { } end modules ['luat-ini'] = { license = "see context related readme files" } --- rather experimental down here ... adapted to lua 5.2 ... but still --- experimental - -local debug = require("debug") - -local string, table, lpeg, math, io, system = string, table, lpeg, math, io, system -local rawset, rawget, next, setmetatable = rawset, rawget, next, setmetatable - --[[ldx--

We cannot load anything yet. However what we will do us reserve a few tables. These can be used for runtime user data or third party modules and will not be @@ -29,180 +21,6 @@ parametersets = parametersets or { } -- experimental for team table.setmetatableindex(moduledata,table.autokey) table.setmetatableindex(thirddata, table.autokey) ---[[ldx-- -

Please create a namespace within these tables before using them!

- - -userdata ['my.name'] = { } -thirddata['tricks' ] = { } - ---ldx]]-- - ---[[ldx-- -

We could cook up a readonly model for global tables but it makes more sense -to invite users to use one of the predefined namespaces. One can redefine the -protector. After all, it's just a lightweight suggestive system, not a -watertight one.

---ldx]]-- - -local global = _G -global.global = global - -local dummy = function() end - ---[[ldx-- -

Another approach is to freeze tables by using a metatable, this will be -implemented stepwise.

---ldx]]-- - --- moduledata : no need for protection (only for developers) --- isolatedata : full protection --- userdata : protected --- thirddata : protected - ---[[ldx-- -

We could have a metatable that automaticaly creates a top level namespace.

---ldx]]-- - -local luanames = lua.name -- luatex itself - -lua.numbers = lua.numbers or { } local numbers = lua.numbers -lua.messages = lua.messages or { } local messages = lua.messages - -storage.register("lua/numbers", numbers, "lua.numbers" ) -storage.register("lua/messages", messages, "lua.messages") - -local f_message = string.formatters["=[instance: %s]"] -- the = controls the lua error / see: lobject.c - -local setfenv = setfenv or debug.setfenv -- < 5.2 - -if setfenv then - - local protected = { - -- global table - global = global, - -- user tables - -- moduledata = moduledata, - userdata = userdata, - thirddata = thirddata, - documentdata = documentdata, - -- reserved - protect = dummy, - unprotect = dummy, - -- luatex - tex = tex, - -- lua - string = string, - table = table, - lpeg = lpeg, - math = math, - io = io, - file = file, - bit32 = bit32, - -- - context = context, - } - - local protect_full = function(name) - local t = { } - for k, v in next, protected do - t[k] = v - end - return t - end - - local protect_part = function(name) -- adds - local t = rawget(global,name) - if not t then - t = { } - for k, v in next, protected do - t[k] = v - end - rawset(global,name,t) - end - return t - end - - protect = function(name) - if name == "isolateddata" then - setfenv(2,protect_full(name)) - else - setfenv(2,protect_part(name or "shareddata")) - end - end - - function lua.registername(name,message) - local lnn = lua.numbers[name] - if not lnn then - lnn = #messages + 1 - messages[lnn] = message - numbers[name] = lnn - end - luanames[lnn] = message - context(lnn) - -- initialize once - if name ~= "isolateddata" then - protect_full(name or "shareddata") - end - end - -elseif libraries then -- assume >= 5.2 - - local shared - - protect = function(name) - if not shared then - -- e.g. context is not yet known - local public = { - global = global, - -- moduledata = moduledata, - userdata = userdata, - thirddata = thirddata, - documentdata = documentdata, - protect = dummy, - unprotect = dummy, - context = context, - } - -- - for k, v in next, libraries.builtin do public[k] = v end - for k, v in next, libraries.functions do public[k] = v end - for k, v in next, libraries.obsolete do public[k] = nil end - -- - shared = { __index = public } - protect = function(name) - local t = global[name] or { } - setmetatable(t,shared) -- set each time - return t - end - end - return protect(name) - end - - function lua.registername(name,message) - local lnn = lua.numbers[name] - if not lnn then - lnn = #messages + 1 - messages[lnn] = message - numbers[name] = lnn - end - luanames[lnn] = f_message(message) - context(lnn) - end - -else - - protect = dummy - - function lua.registername(name,message) - local lnn = lua.numbers[name] - if not lnn then - lnn = #messages + 1 - messages[lnn] = message - numbers[name] = lnn - end - luanames[lnn] = f_message(message) - context(lnn) - end - +if not global then + global = _G end - diff --git a/Master/texmf-dist/tex/context/base/luat-ini.mkiv b/Master/texmf-dist/tex/context/base/luat-ini.mkiv index 7823ebd5a96..b455a415821 100644 --- a/Master/texmf-dist/tex/context/base/luat-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/luat-ini.mkiv @@ -34,7 +34,7 @@ % the \type {\normalexpanded} around \type {\directlua}. Something to discuss % in the team. -\unexpanded\def\startlua % \stoplua +\normalprotected\def\startlua % \stoplua {\begingroup \obeylualines \luat_start_lua_indeed} @@ -42,7 +42,7 @@ \def\luat_start_lua_indeed#1\stoplua {\normalexpanded{\endgroup\noexpand\directlua{#1}}} % \zerocount is default -\unexpanded\def\startluacode % \stopluacode +\normalprotected\def\startluacode % \stopluacode {\begingroup \obeylualines \obeyluatokens @@ -77,7 +77,7 @@ \edef\lua_letter_seven {\string\7} \edef\lua_letter_eight {\string\8} \edef\lua_letter_nine {\string\9} \edef\lua_letter_zero {\string\0} -\appendtoks +\everyluacode {% \appendtoks \let\\\lua_letter_backslash \let\|\lua_letter_bar \let\-\lua_letter_dash \let\(\lua_letter_lparent \let\)\lua_letter_rparent @@ -92,93 +92,15 @@ \let\5\lua_letter_five \let\6\lua_letter_six \let\7\lua_letter_seven \let\8\lua_letter_eight \let\9\lua_letter_nine \let\0\lua_letter_zero -\to \everyluacode +} % \to \everyluacode -\unexpanded\def\obeyluatokens +\normalprotected\def\obeyluatokens {\setcatcodetable\luacatcodes \the\everyluacode} - \edef\luamajorversion{\ctxwrite{_MINORVERSION}} \edef\luaminorversion{\ctxwrite{_MAJORVERSION}} -%D \macros -%D {definenamedlua} -%D -%D We provide an interface for defining instances: - -\def\s!lua{lua} \def\v!code{code} \def\!!name{name} \def\s!data{data} - -%D Beware: because \type {\expanded} is een convert command, the error -%D message will show \type{} as part of the message. - -\installcorenamespace{luacode} - -\unexpanded\def\luat_start_named_lua_code#1% - {\begingroup - \obeylualines - \obeyluatokens - \csname\??luacode#1\endcsname} - -% \unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient) -% {\ifcsname\??luacode#1\endcsname \else -% \scratchcounter\ctxlua{lua.registername("#1","#3")}% -% \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}% -% {\noexpand\normalexpanded{\endgroup\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}}% -% \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}% -% \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}% -% \fi} - -\unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient) - {\ifcsname\??luacode#1\endcsname \else - \expandafter\chardef\csname\??luacode:#1\endcsname\ctxlua{lua.registername("#1","#3")}% - \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}% - {\noexpand\normalexpanded{\endgroup\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}}% - \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}% - \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}% - \fi} - -%D We predefine a few. - -% \definenamedlua[module][module instance] % not needed - -\definenamedlua[user] [private user] -\definenamedlua[third] [third party module] -\definenamedlua[isolated][isolated] - -%D In practice this works out as follows: -%D -%D \startbuffer -%D \startluacode -%D context("LUA") -%D \stopluacode -%D -%D \startusercode -%D global.context("USER 1") -%D context.par() -%D context("USER 2") -%D context.par() -%D if characters then -%D context("ACCESS directly") -%D elseif global.characters then -%D context("ACCESS via global") -%D else -%D context("NO ACCESS at all") -%D end -%D context.par() -%D if bogus then -%D context("ACCESS directly") -%D elseif global.bogus then -%D context("ACCESS via global") -%D else -%D context("NO ACCESS at all") -%D end -%D context.par() -%D \stopusercode -%D \stopbuffer -%D -%D \typebuffer - %D We need a way to pass strings safely to \LUA\ without the %D need for tricky escaping. Compare: %D @@ -196,23 +118,28 @@ %D for it: %D %D \starttyping -%D \long\edef\luaescapestring#1{\!!bs#1\!!es} +%D \edef\luaescapestring#1{\!!bs#1\!!es} %D \stoptyping -\def\setdocumentfilename #1#2{\ctxlua{document.setfilename(#1,"#2")}} -\def\setdocumentargument #1#2{\ctxlua{document.setargument("#1","#2")}} -\def\setdocumentargumentdefault#1#2{\ctxlua{document.setdefaultargument("#1","#2")}} -\def\getdocumentfilename #1{\ctxlua{document.getfilename("#1")}} -\def\getdocumentargument #1{\ctxlua{document.getargument("#1")}} -\def\getdocumentargumentdefault#1#2{\ctxlua{document.getargument("#1","#2")}} -\def\doifdocumentargumentelse #1{\doifsomethingelse{\getdocumentargument{#1}}} -\def\doifdocumentargument #1{\doifsomething {\getdocumentargument{#1}}} -\def\doifnotdocumentargument #1{\doifnothing {\getdocumentargument{#1}}} -\def\doifdocumentfilenameelse #1{\doifsomethingelse{\getdocumentfilename{#1}}} -\def\doifdocumentfilename #1{\doifsomething {\getdocumentfilename{#1}}} -\def\doifnotdocumentfilename #1{\doifnothing {\getdocumentfilename{#1}}} - -\let\doifelsedocumentargument\doifdocumentargumentelse +\def\setdocumentfilename #1#2{\clf_setdocumentfilename\numexpr#1\relax{#2}} +\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}} +\def\setdocumentargumentdefault#1#2{\clf_setdocumentdefaultargument{#1}{#2}} +\def\getdocumentfilename #1{\clf_getdocumentfilename\numexpr#1\relax} +\def\getdocumentargument #1{\clf_getdocumentargument{#1}{}} +\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}} +\def\getdocumentargumentdefault#1#2{\clf_getdocumentargument{#1}{#2}} + +% seldom used so no need for speedy variants: + +\def\doifelsedocumentargument #1{\doifelsesomething{\clf_getdocumentargument{#1}}} +\def\doifdocumentargument #1{\doifsomething {\clf_getdocumentargument{#1}}} +\def\doifnotdocumentargument #1{\doifnothing {\clf_getdocumentargument{#1}}} +\def\doifelsedocumentfilename #1{\doifelsesomething{\clf_getdocumentfilename\numexpr#1\relax}} +\def\doifdocumentfilename #1{\doifsomething {\clf_getdocumentfilename\numexpr#1\relax}} +\def\doifnotdocumentfilename #1{\doifnothing {\clf_getdocumentfilename\numexpr#1\relax}} + +\let\doifdocumentargumentelse\doifelsedocumentargument +\let\doifdocumentfilenameelse\doifelsedocumentfilename %D A handy helper: @@ -220,7 +147,7 @@ %D Experimental: -\unexpanded\def\startluaparameterset[#1]% +\normalprotected\def\startluaparameterset[#1]% {\begingroup \obeylualines \obeyluatokens @@ -259,7 +186,7 @@ %D \ctxluacode{context("%0.5f",1/3)} %D \stoptyping -\unexpanded\def\ctxluacode +\normalprotected\def\ctxluacode {\begingroup \obeylualines \obeyluatokens @@ -288,25 +215,19 @@ % \dorecurse{10000}{\ctxlua{context(" C3 ")}} \page % \stoptext -\installcorenamespace{ctxfunction} +\installsystemnamespace{ctxfunction} \normalprotected\def\startctxfunctiondefinition #1 % {\begingroup \obeylualines \obeyluatokens \luat_start_lua_function_definition_indeed{#1}} -% \def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition -% {\endgroup\expandafter\edef\csname#1\endcsname{\noexpand\luafunction\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax}} - -\installcorenamespace{luafunction} +\installsystemnamespace{luafunction} \def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition {\endgroup \expandafter\chardef\csname\??luafunction#1\endcsname\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax \expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}} -% \unexpanded\def\setctxluafunction#1#2% experiment -% {\expandafter\chardef\csname#1\endcsname#2\relax} - -\unexpanded\def\setctxluafunction#1#2% experiment +\normalprotected\def\setctxluafunction#1#2% experiment {\expandafter\chardef\csname\??luafunction#1\endcsname#2\relax \expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}} @@ -323,4 +244,40 @@ \def\ctxfunction#1% {\csname\??ctxfunction#1\endcsname} +% In theory this is faster due to the call not being wrapped in a function but in +% practice the speedup can't be noticed. The actions called for often have lots of +% lookups so an extra one doesn't matter much. The kind of calls differs a lot per +% document and often there are other ways to optimize a style. For instance we can +% gain a lot when defining a font, but when a frozen definition is used that gain +% gets completely lost. For some calls (take list writers) it can get worse if only +% because readability gets worse and passing is already efficient due to selective +% flushing, while with the token scanners one has to scan all of them. + +% \startctxfunctiondefinition foo commands.foo() \stopctxfunctiondefinition +% +% \installctxfunction\foo{commands.foo} + +% This is a forward definition: + +\def\checkedstrippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx} + {\expandafter\syst_helpers_checked_stripped_csname\string#1} + +\def\syst_helpers_checked_stripped_csname#1% + {\if\noexpand#1\letterbackslash\else#1\fi} + +\normalprotected\def\installctxfunction#1#2% + {\edef\m_syst_name{\checkedstrippedcsname#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% + {\edef\m_syst_name{\checkedstrippedcsname#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\resetctxscanner#1% + {\edef\m_syst_name{\checkedstrippedcsname#1}% + \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\zerocount + \global\expandafter\let\csname\m_syst_name\endcsname\relax} + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/luat-iop.lua b/Master/texmf-dist/tex/context/base/luat-iop.lua index 52f14683e76..e1772af4e90 100644 --- a/Master/texmf-dist/tex/context/base/luat-iop.lua +++ b/Master/texmf-dist/tex/context/base/luat-iop.lua @@ -6,190 +6,19 @@ if not modules then modules = { } end modules ['luat-iop'] = { license = "see context related readme files" } --- this paranoid stuff in web2c ... we cannot hook checks into the --- input functions because one can always change the callback but --- we can feed back specific patterns and paths into the next --- mechanism - --- os.execute os.exec os.spawn io.fopen --- os.remove lfs.chdir lfs.mkdir --- io.open zip.open epdf.open mlib.new - --- cache - -local topattern, find = string.topattern, string.find - -local report_limiter = logs.reporter("system","limiter") - --- the basic methods - -local function match(ruleset,name) - local n = #ruleset - if n > 0 then - for i=1,n do - local r = ruleset[i] - if find(name,r[1]) then - return r[2] - end - end - return false - else - -- nothing defined (or any) - return true - end -end - -local function protect(ruleset,proc) - return function(name,...) - if name == "" then - -- report_limiter("no access permitted: ") -- can happen in mplib code - return nil, "no name given" - elseif match(ruleset,name) then - return proc(name,...) - else - report_limiter("no access permitted for %a",name) - return nil, name .. ": no access permitted" - end - end -end - -function io.limiter(preset) - preset = preset or { } - local ruleset = { } - for i=1,#preset do - local p = preset[i] - local what, spec = p[1] or "", p[2] or "" - if spec == "" then - -- skip 'm - elseif what == "tree" then - resolvers.dowithpath(spec, function(r) - local spec = resolvers.resolve(r) or "" - if spec ~= "" then - ruleset[#ruleset+1] = { topattern(spec,true), true } - end - end) - elseif what == "permit" then - ruleset[#ruleset+1] = { topattern(spec,true), true } - elseif what == "forbid" then - ruleset[#ruleset+1] = { topattern(spec,true), false } - end - end - if #ruleset > 0 then - return { - match = function(name) return match (ruleset,name) end, - protect = function(proc) return protect(ruleset,proc) end, - } - else - return { - match = function(name) return true end, - protect = proc, - } - end -end - --- a few handlers - -io.i_limiters = { } -io.o_limiters = { } - -function io.i_limiter(v) - local i = io.i_limiters[v] - if i then - local i_limiter = io.limiter(i) - function io.i_limiter() - return i_limiter - end - return i_limiter - end -end - -function io.o_limiter(v) - local o = io.o_limiters[v] - if o then - local o_limiter = io.limiter(o) - function io.o_limiter() - return o_limiter - end - return o_limiter - end -end - --- the real thing (somewhat fuzzy as we need to know what gets done) - -local i_opener, i_limited = io.open, false -local o_opener, o_limited = io.open, false - -local function i_register(v) - if not i_limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - local protect = i_limiter.protect - i_opener = protect(i_opener) - i_limited = true - report_limiter("input mode set to %a",v) - end - end -end - -local function o_register(v) - if not o_limited then - local o_limiter = io.o_limiter(v) - if o_limiter then - local protect = o_limiter.protect - o_opener = protect(o_opener) - o_limited = true - report_limiter("output mode set to %a",v) - end - end -end - -function io.open(name,method) - if method and find(method,"[wa]") then - return o_opener(name,method) - else - return i_opener(name,method) - end -end - -directives.register("system.inputmode", i_register) -directives.register("system.outputmode", o_register) - -local i_limited = false -local o_limited = false - -local function i_register(v) - if not i_limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - local protect = i_limiter.protect - lfs.chdir = protect(lfs.chdir) -- needs checking - i_limited = true - end - end -end - -local function o_register(v) - if not o_limited then - local o_limiter = io.o_limiter(v) - if o_limiter then - local protect = o_limiter.protect - os.remove = protect(os.remove) -- rather okay - lfs.chdir = protect(lfs.chdir) -- needs checking - lfs.mkdir = protect(lfs.mkdir) -- needs checking - o_limited = true - end - end -end - -directives.register("system.inputmode", i_register) -directives.register("system.outputmode", o_register) - --- the definitions - -local limiters = resolvers.variable("limiters") - -if limiters then - io.i_limiters = limiters.input or { } - io.o_limiters = limiters.output or { } -end - +local cleanedpathlist = resolvers.cleanedpathlist +local registerroot = sandbox.registerroot + +sandbox.initializer(function() + local function register(str,mode) + local trees = cleanedpathlist(str) + for i=1,#trees do + registerroot(trees[i],mode) + end + end + register("TEXMF","read") + register("TEXINPUTS","read") + register("MPINPUTS","read") + -- register("TEXMFCACHE","write") + registerroot(".","write") +end) diff --git a/Master/texmf-dist/tex/context/base/luat-lib.mkiv b/Master/texmf-dist/tex/context/base/luat-lib.mkiv index 3f72e780e8b..24f9da41513 100644 --- a/Master/texmf-dist/tex/context/base/luat-lib.mkiv +++ b/Master/texmf-dist/tex/context/base/luat-lib.mkiv @@ -36,6 +36,8 @@ \registerctxluafile{util-sta}{1.001} +\registerctxluafile{util-sbx}{1.001} % needs tracker and templates + \registerctxluafile{data-ini}{1.001} \registerctxluafile{data-exp}{1.001} \registerctxluafile{data-env}{1.001} @@ -71,8 +73,8 @@ \registerctxluafile{luat-ini}{1.001} \registerctxluafile{util-env}{1.001} \registerctxluafile{luat-env}{1.001} -\registerctxluafile{luat-exe}{1.001} -\registerctxluafile{luat-iop}{1.001} +\registerctxluafile{luat-exe}{1.001} % simplified +\registerctxluafile{luat-iop}{1.001} % simplified \registerctxluafile{luat-bwc}{1.001} \registerctxluafile{trac-lmx}{1.001} % might become l-lmx or luat-lmx \registerctxluafile{luat-mac}{1.001} diff --git a/Master/texmf-dist/tex/context/base/luat-mac.lua b/Master/texmf-dist/tex/context/base/luat-mac.lua index 282dc8ce3d3..6214e591e5b 100644 --- a/Master/texmf-dist/tex/context/base/luat-mac.lua +++ b/Master/texmf-dist/tex/context/base/luat-mac.lua @@ -92,7 +92,7 @@ local nolong = 1 - longleft - longright local utf8character = P(1) * R("\128\191")^1 -- unchecked but fast local name = (R("AZ","az") + utf8character)^1 -local csname = (R("AZ","az") + S("@?!_") + utf8character)^1 +local csname = (R("AZ","az") + S("@?!_:-*") + utf8character)^1 local longname = (longleft/"") * (nolong^1) * (longright/"") local variable = P("#") * Cs(name + longname) local escapedname = escape * csname @@ -144,7 +144,10 @@ local grammar = { "converter", * V("texbody") * stopcode * poplocal, - texbody = ( V("definition") + texbody = ( +leadingcomment -- new per 2015-03-03 (ugly) ++ + V("definition") + identifier + V("braced") + (1 - stopcode) @@ -201,7 +204,7 @@ end function macros.convertfile(oldname,newname) -- beware, no testing on oldname == newname local data = resolvers.loadtexfile(oldname) - data = interfaces.preprocessed(data) or "" + data = interfaces.preprocessed(data) or "" -- interfaces not yet defined io.savedata(newname,data) end @@ -385,7 +388,7 @@ end -- \normalexpanded -- {\def\yes[#one]#two\csname\e!stop#stoptag\endcsname{\command_yes[#one]{#two}}% -- \def\nop #one\csname\e!stop#stoptag\endcsname{\command_nop {#one}}}% --- \doifnextoptionalelse\yes\nop} +-- \doifelsenextoptional\yes\nop} -- ]])) -- -- print(macros.preprocessed([[ diff --git a/Master/texmf-dist/tex/context/base/luat-run.lua b/Master/texmf-dist/tex/context/base/luat-run.lua index 607c3528ae7..65cf0f33866 100644 --- a/Master/texmf-dist/tex/context/base/luat-run.lua +++ b/Master/texmf-dist/tex/context/base/luat-run.lua @@ -130,31 +130,21 @@ luatex.registerstopactions(luatex.cleanuptempfiles) -- for the moment here -local synctex = false - local report_system = logs.reporter("system") +local synctex = 0 directives.register("system.synctex", function(v) - synctex = v - if v then - report_system("synctex functionality is enabled!") + synctex = tonumber(v) or (toboolean(v,true) and 1) or (v == "zipped" and 1) or (v == "unzipped" and -1) or 0 + if synctex ~= 0 then + report_system("synctex functionality is enabled (%s)!",tostring(synctex)) else report_system("synctex functionality is disabled!") end - synctex = tonumber(synctex) or (toboolean(synctex,true) and 1) or (synctex == "zipped" and 1) or (synctex == "unzipped" and -1) or false - -- currently this is bugged: - tex.synctex = synctex - -- so for the moment we need: - context.normalsynctex() - if synctex then - context.plusone() - else - context.zerocount() - end + tex.normalsynctex = synctex end) statistics.register("synctex tracing",function() - if synctex or tex.synctex ~= 0 then + if synctex ~= 0 then return "synctex has been enabled (extra log file generated)" end end) @@ -230,3 +220,12 @@ directives.register("system.reportfiles", function(v) register("stop_file", report_none) end end) + +-- start_run doesn't work + +-- luatex.registerstartactions(function() +-- if environment.arguments.sandbox then +-- sandbox.enable() +-- end +-- end) + diff --git a/Master/texmf-dist/tex/context/base/luat-usr.lua b/Master/texmf-dist/tex/context/base/luat-usr.lua new file mode 100644 index 00000000000..071e3bf5bb9 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/luat-usr.lua @@ -0,0 +1,192 @@ +if not modules then modules = { } end modules ['luat-usr'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local global = global + +local moduledata = moduledata +local thirddata = thirddata +local userdata = userdata +local documentdata = documentdata + +local context = context +local tostring = tostring +local tonumber = tonumber +local print = print + +local string = string +local table = table +local lpeg = lpeg +local math = math +local io = io +local os = os +local lpeg = lpeg + +local luanames = lua.name -- luatex itself + +local setmetatableindex = table.setmetatableindex +local load = load +local xpcall = xpcall +local instance_banner = string.formatters["=[instance: %s]"] -- the = controls the lua error / see: lobject.c +local tex_errormessage = context.errmessage + +local implement = interfaces.implement +local reporter = logs.reporter + +local report_instance = reporter("lua instance") +local report_script = reporter("lua script") +local report_thread = reporter("lua thread") +local newline = logs.newline + +lua.numbers = lua.numbers or { } +lua.messages = lua.messages or { } + +local numbers = lua.numbers +local messages = lua.messages + +storage.register("lua/numbers", numbers, "lua.numbers" ) +storage.register("lua/messages", messages, "lua.messages") + +-- First we implement a pure lua version of directlua and a persistent +-- variant of it: + +local function runscript(code) + local done, message = loadstring(code) + if done then + done() + else + newline() + report_script("error : %s",message or "unknown") + report_script() + report_script("code : %s",code) + newline() + end +end + +local threads = setmetatableindex(function(t,k) + local v = setmetatableindex({},global) + t[k] = v + return v +end) + +local function runthread(name,code) + if not code or code == "" then + threads[name] = nil + else + local thread = threads[name] + local done, message = loadstring(code,nil,nil,thread) + if done then + done() + else + newline() + report_thread("thread: %s",name) + report_thread("error : %s",message or "unknown") + report_thread() + report_thread("code : %s",code) + newline() + end + end +end + +interfaces.implement { + name = "luascript", + actions = runscript, + arguments = "string" +} + +interfaces.implement { + name = "luathread", + actions = runthread, + arguments = { "string", "string" } +} + +-- local scanners = interfaces.scanners +-- +-- local function ctxscanner(name) +-- local scanner = scanners[name] +-- if scanner then +-- scanner() +-- else +-- report("unknown scanner: %s",name) +-- end +-- end +-- +-- interfaces.implement { +-- name = "clfscanner", +-- actions = ctxscanner, +-- arguments = "string", +-- } + +local function registername(name,message) + if not name or name == "" then + report_instance("no valid name given") + return + end + if not message or message == "" then + message = name + end + local lnn = numbers[name] + if not lnn then + lnn = #messages + 1 + messages[lnn] = message + numbers[name] = lnn + end + luanames[lnn] = instance_banner(message) + local report = reporter("lua instance",message) + local proxy = { + -- we can access all via: + global = global, -- or maybe just a metatable + -- some protected data + moduledata = setmetatableindex(moduledata), + thirddata = setmetatableindex(thirddata), + -- less protected data + userdata = userdata, + documentdata = documentdata, + -- always there fast + context = context, + tostring = tostring, + tonumber = tonumber, + -- standard lua modules + string = string, + table = table, + lpeg = lpeg, + math = math, + io = io, + os = os, + lpeg = lpeg, + -- + print = print, + report = report, + } + return function(code) + local code, message = load(code,nil,nil,proxy) + if not code then + report_instance("error: %s",message or code) + elseif not xpcall(code,report) then + tex_errormessage("hit return to continue or quit this run") + end + end +end + +lua.registername = registername + +implement { + name = "registernamedlua", + arguments = { "string", "string", "string" }, + actions = function(name,message,csname) + if csname and csname ~= "" then + implement { + name = csname, + arguments = "string", + actions = registername(name,message) or report, + scope = "private", + } + else + report_instance("unvalid csname for %a",message or name or "?") + end + end +} diff --git a/Master/texmf-dist/tex/context/base/luat-usr.mkiv b/Master/texmf-dist/tex/context/base/luat-usr.mkiv new file mode 100644 index 00000000000..92d40010c0f --- /dev/null +++ b/Master/texmf-dist/tex/context/base/luat-usr.mkiv @@ -0,0 +1,126 @@ +%D \module +%D [ file=luat-usr, +%D version=2005.08.11,% moved from luat-ini +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Initialization, +%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. + +\writestatus{loading}{ConTeXt Lua Macros / Userspace} + +\unprotect + +\registerctxluafile{luat-usr}{1.001} + +%D A few goodies: +%D +%D \startbuffer +%D \luascript { context("foo 1:") context(i) } +%D \luathread {test} { i = 10 context("bar 1:") context(i) } +%D \luathread {test} { context("bar 2:") context(i) } +%D \luathread {test} {} +%D \luathread {test} { context("bar 3:") context(i) } +%D \luascript { context("foo 2:") context(i) } +%D \stopbuffer +%D +%D \typebuffer \startlines \getbuffer \stoplines + +\let\luascript \clf_luascript +\let\luathread \clf_luathread +%let\clfscanner\clf_clfscanner +%def\clfscanner#1{\csname clf_#1\endcsname} + +%D \macros +%D {definenamedlua} +%D +%D We provide an interface for defining instances: + +\def\s!lua {lua} +\def\s!code {code} +\def\s!data {data} +%def\s!start{start} +%def\s!stop {stop} + +%D Beware: because \type {\expanded} is een convert command, the error +%D message will show \type{} as part of the message. + +\installsystemnamespace{luacode} + +\unexpanded\def\definenamedlua + {\bgroup + \dodoubleempty\syst_definenamedlua} + +\unexpanded\def\syst_definenamedlua[#1][#2]% no optional arg handling here yet / we could use numbers instead (more efficient) + {\iffirstargument + \ifcsname\??luacode#1\endcsname \else + % + \edef\fullname{lua_code_#1}% + % + \clf_registernamedlua{#1}{#2}{\fullname}% + % + \unexpanded\expandafter\xdef\csname\s!start#1\s!code\endcsname + {\begingroup + \obeylualines + \obeyluatokens + \csname\??luacode#1\endcsname}% + % + \global\expandafter\let\csname\s!stop#1\s!code\endcsname\relax + % + \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\s!stop#1\s!code\endcsname}% + {\noexpand\expandafter\endgroup + \noexpand\expandafter + \expandafter\noexpand\csname clf_\fullname\endcsname + \noexpand\expandafter{\noexpand\normalexpanded{##1}}}% + % + \global\expandafter\let\csname#1\s!code\expandafter\endcsname\csname clf_\fullname\endcsname + \fi + \fi + \egroup} + +%D We predefine a few. + +% \definenamedlua[module][module instance] % not needed + +\definenamedlua[user] [private user] +\definenamedlua[third] [third party module] +\definenamedlua[isolated][isolated] + +%D In practice this works out as follows: +%D +%D \startbuffer +%D \startluacode +%D context("LUA") +%D \stopluacode +%D +%D \startusercode +%D global.context("USER 1") +%D context.par() +%D context("USER 2") +%D context.par() +%D if characters then +%D context("ACCESS directly") +%D elseif global.characters then +%D context("ACCESS via global") +%D else +%D context("NO ACCESS at all") +%D end +%D context.par() +%D if bogus then +%D context("ACCESS directly") +%D elseif global.bogus then +%D context("ACCESS via global") +%D else +%D context("NO ACCESS at all") +%D end +%D context.par() +%D \stopusercode +%D \stopbuffer +%D +%D \typebuffer + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/lxml-aux.lua b/Master/texmf-dist/tex/context/base/lxml-aux.lua index 0fffe261a00..f6816ccb6b0 100644 --- a/Master/texmf-dist/tex/context/base/lxml-aux.lua +++ b/Master/texmf-dist/tex/context/base/lxml-aux.lua @@ -10,20 +10,23 @@ if not modules then modules = { } end modules ['lxml-aux'] = { -- compatibility reasons local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end) +local trace_inclusions = false trackers.register("lxml.inclusions", function(v) trace_inclusions = v end) local report_xml = logs.reporter("xml") local xml = xml -local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name +local xmlcopy, xmlname = xml.copy, xml.name local xmlinheritedconvert = xml.inheritedconvert local xmlapplylpath = xml.applylpath local xmlfilter = xml.filter -local type, setmetatable, getmetatable = type, setmetatable, getmetatable +local type, next, setmetatable, getmetatable = type, next, setmetatable, getmetatable local insert, remove, fastcopy, concat = table.insert, table.remove, table.fastcopy, table.concat local gmatch, gsub, format, find, strip = string.gmatch, string.gsub, string.format, string.find, string.strip local utfbyte = utf.byte +local lpegmatch = lpeg.match +local striplinepatterns = utilities.strings.striplinepatterns local function report(what,pattern,c,e) report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern) @@ -83,13 +86,15 @@ end function xml.each(root,pattern,handle,reverse) local collected = xmlapplylpath(root,pattern) if collected then - if reverse then - for c=#collected,1,-1 do - handle(collected[c]) - end - else - for c=1,#collected do - handle(collected[c]) + if handle then + if reverse then + for c=#collected,1,-1 do + handle(collected[c]) + end + else + for c=1,#collected do + handle(collected[c]) + end end end return collected @@ -162,6 +167,8 @@ local function redo_ni(d) end end +xml.reindex = redo_ni + local function xmltoelement(whatever,root) if not whatever then return nil @@ -221,8 +228,18 @@ function xml.delete(root,pattern) report('deleting',pattern,c,e) end local d = p.dt - remove(d,e.ni) - redo_ni(d) -- can be made faster and inlined + local ni = e.ni + if ni <= #d then + if false then + p.dt[ni] = "" + else + -- what if multiple deleted in one set + remove(d,ni) + redo_ni(d) -- can be made faster and inlined + end + else + -- disturbing + end end end end @@ -353,46 +370,63 @@ xml.insertbefore = function(r,p,e) insert_element(r,p,e,true) end xml.injectafter = inject_element xml.injectbefore = function(r,p,e) inject_element(r,p,e,true) end -local function include(xmldata,pattern,attribute,recursive,loaddata) - -- parse="text" (default: xml), encoding="" (todo) - -- attribute = attribute or 'href' - pattern = pattern or 'include' - loaddata = loaddata or io.loaddata +local function include(xmldata,pattern,attribute,recursive,loaddata,level) + -- attribute = attribute or 'href' + pattern = pattern or 'include' + loaddata = loaddata or io.loaddata local collected = xmlapplylpath(xmldata,pattern) if collected then + if not level then + level = 1 + end for c=1,#collected do local ek = collected[c] local name = nil local ekdt = ek.dt local ekat = ek.at - local epdt = ek.__p__.dt + local ekrt = ek.__p__ + local epdt = ekrt.dt if not attribute or attribute == "" then name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- check, probably always tab or str end if not name then for a in gmatch(attribute or "href","([^|]+)") do name = ekat[a] - if name then break end + if name then + break + end + end + end + local data = nil + if name and name ~= "" then + data = loaddata(name) or "" + if trace_inclusions then + report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end end - local data = (name and name ~= "" and loaddata(name)) or "" - if data == "" then + if not data or data == "" then epdt[ek.ni] = "" -- xml.empty(d,k) elseif ekat["parse"] == "text" then -- for the moment hard coded epdt[ek.ni] = xml.escaped(data) -- d[k] = xml.escaped(data) else ---~ local settings = xmldata.settings ---~ settings.parent_root = xmldata -- to be tested ---~ local xi = xmlconvert(data,settings) local xi = xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni] = "" -- xml.empty(d,k) else if recursive then - include(xi,pattern,attribute,recursive,loaddata) + include(xi,pattern,attribute,recursive,loaddata,level+1) + end + local child = xml.body(xi) -- xml.assign(d,k,xi) + child.__p__ = ekrt + child.__f__ = name -- handy for tracing + epdt[ek.ni] = child + local inclusions = xmldata.settings.inclusions + if inclusions then + inclusions[#inclusions+1] = name + else + xmldata.settings.inclusions = { name } end - epdt[ek.ni] = xml.body(xi) -- xml.assign(d,k,xi) end end end @@ -401,68 +435,100 @@ end xml.include = include +function xml.inclusion(e,default) + while e do + local f = e.__f__ + if f then + return f + else + e = e.__p__ + end + end + return default +end + +function xml.inclusions(e,sorted) + while e do + local settings = e.settings + if settings then + local inclusions = settings.inclusions + if inclusions then + inclusions = table.unique(inclusions) -- a copy + if sorted then + table.sort(inclusions) -- so we sort the copy + end + return inclusions -- and return the copy + else + e = e.__p__ + end + else + e = e.__p__ + end + end +end + +local b_collapser = lpeg.patterns.b_collapser +local m_collapser = lpeg.patterns.m_collapser +local e_collapser = lpeg.patterns.e_collapser + +local b_stripper = lpeg.patterns.b_stripper +local m_stripper = lpeg.patterns.m_stripper +local e_stripper = lpeg.patterns.e_stripper + +local lpegmatch = lpeg.match + local function stripelement(e,nolines,anywhere) local edt = e.dt if edt then - if anywhere then - local t, n = { }, 0 - for e=1,#edt do + local n = #edt + if n == 0 then + return e -- convenient + elseif anywhere then + local t = { } + local m = 0 + for e=1,n do local str = edt[e] if type(str) ~= "string" then - n = n + 1 - t[n] = str + m = m + 1 + t[m] = str elseif str ~= "" then - -- todo: lpeg for each case if nolines then - str = gsub(str,"%s+"," ") + str = lpegmatch((n == 1 and b_collapser) or (n == m and e_collapser) or m_collapser,str) + else + str = lpegmatch((n == 1 and b_stripper) or (n == m and e_stripper) or m_stripper,str) end - str = gsub(str,"^%s*(.-)%s*$","%1") if str ~= "" then - n = n + 1 - t[n] = str + m = m + 1 + t[m] = str end end end e.dt = t else - -- we can assume a regular sparse xml table with no successive strings - -- otherwise we should use a while loop - if #edt > 0 then - -- strip front - local str = edt[1] - if type(str) ~= "string" then - -- nothing - elseif str == "" then + local str = edt[1] + if type(str) == "string" then + if str ~= "" then + str = lpegmatch(nolines and b_collapser or b_stripper,str) + end + if str == "" then remove(edt,1) + n = n - 1 else - if nolines then - str = gsub(str,"%s+"," ") - end - str = gsub(str,"^%s+","") - if str == "" then - remove(edt,1) - else - edt[1] = str - end + edt[1] = str end end - local nedt = #edt - if nedt > 0 then - -- strip end - local str = edt[nedt] - if type(str) ~= "string" then - -- nothing - elseif str == "" then - remove(edt) - else - if nolines then - str = gsub(str,"%s+"," ") - end - str = gsub(str,"%s+$","") + if n > 0 then + str = edt[n] + if type(str) == "string" then if str == "" then remove(edt) else - edt[nedt] = str + str = lpegmatch(nolines and e_collapser or e_stripper,str) + if str == "" then + remove(edt) + else + edt[n] = str + end end end end @@ -702,8 +768,8 @@ function xml.finalizers.xml.cdata(collected) return "" end -function xml.insertcomment(e,str,n) -- also insertcdata - table.insert(e.dt,n or 1,{ +function xml.insertcomment(e,str,n) + insert(e.dt,n or 1,{ tg = "@cm@", ns = "", special = true, @@ -712,7 +778,27 @@ function xml.insertcomment(e,str,n) -- also insertcdata }) end -function xml.setcdata(e,str) -- also setcomment +function xml.insertcdata(e,str,n) + insert(e.dt,n or 1,{ + tg = "@cd@", + ns = "", + special = true, + at = { }, + dt = { str }, + }) +end + +function xml.setcomment(e,str,n) + e.dt = { { + tg = "@cm@", + ns = "", + special = true, + at = { }, + dt = { str }, + } } +end + +function xml.setcdata(e,str) e.dt = { { tg = "@cd@", ns = "", @@ -790,7 +876,7 @@ local function recurse(e,action) for i=1,#edt do local str = edt[i] if type(str) ~= "string" then - recurse(str,action,recursive) + recurse(str,action) -- ,recursive elseif str ~= "" then edt[i] = action(str) end @@ -809,3 +895,91 @@ function helpers.recursetext(collected,action,recursive) end end end + +-- on request ... undocumented ... +-- +-- _tag : element name +-- _type : node type (_element can be an option) +-- _namespace : only if given +-- +-- [1..n] : text or table +-- key : value or attribite 'key' +-- +-- local str = [[ +-- +-- +-- +-- +-- +-- c > d +-- +-- +-- ]] +-- +-- inspect(xml.totable(xml.convert(str))) +-- inspect(xml.totable(xml.convert(str),true)) +-- inspect(xml.totable(xml.convert(str),true,true)) + +local specials = { + ["@rt@"] = "root", + ["@pi@"] = "instruction", + ["@cm@"] = "comment", + ["@dt@"] = "declaration", + ["@cd@"] = "cdata", +} + +local function convert(x,strip,flat) + local ns = x.ns + local tg = x.tg + local at = x.at + local dt = x.dt + local node = flat and { + [0] = (not x.special and (ns ~= "" and ns .. ":" .. tg or tg)) or nil, + } or { + _namespace = ns ~= "" and ns or nil, + _tag = not x.special and tg or nil, + _type = specials[tg] or "_element", + } + if at then + for k, v in next, at do + node[k] = v + end + end + local n = 0 + for i=1,#dt do + local di = dt[i] + if type(di) == "table" then + if flat and di.special then + -- ignore + else + di = convert(di,strip,flat) + if di then + n = n + 1 + node[n] = di + end + end + elseif strip then + di = lpegmatch(strip,di) + if di ~= "" then + n = n + 1 + node[n] = di + end + else + n = n + 1 + node[n] = di + end + end + if next(node) then + return node + end +end + +function xml.totable(x,strip,flat) + if type(x) == "table" then + if strip then + strip = striplinepatterns[strip] + end + return convert(x,strip,flat) + end +end + diff --git a/Master/texmf-dist/tex/context/base/lxml-css.lua b/Master/texmf-dist/tex/context/base/lxml-css.lua index 0deaea4d391..fa921b24f48 100644 --- a/Master/texmf-dist/tex/context/base/lxml-css.lua +++ b/Master/texmf-dist/tex/context/base/lxml-css.lua @@ -146,7 +146,19 @@ local pattern = Cf( Ct("") * ( + (C("sansserif") + C("sans")) / "sans-serif" -- match before serif + C("serif") ) - ) + P(1) + ) +--+ P("\\") * ( +-- P("bf") * ( Cg ( Cc("weight") * Cc("bold") ) ) +-- + P("bi") * ( Cg ( Cc("weight") * Cc("bold") ) +-- * Cg ( Cc("style") * Cc("italic") ) ) +-- + P("bs") * ( Cg ( Cc("weight") * Cc("bold") ) +-- * Cg ( Cc("style") * Cc("oblique") ) ) +-- + P("it") * ( Cg ( Cc("style") * Cc("italic") ) ) +-- + P("sl") * ( Cg ( Cc("style") * Cc("oblique") ) ) +-- + P("sc") * ( Cg ( Cc("variant") * Cc("small-caps") ) ) +-- + P("tt") * ( Cg ( Cc("family") * Cc("monospace") ) ) +--) + + P(1) )^0 , rawset) function css.fontspecification(str) diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.lua b/Master/texmf-dist/tex/context/base/lxml-ini.lua new file mode 100644 index 00000000000..64e78eb42c8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/lxml-ini.lua @@ -0,0 +1,136 @@ +if not modules then modules = { } end modules ['lxml-ini'] = { + version = 1.001, + comment = "this module is the basis for the lxml-* ones", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local xml = xml +local lxml = lxml + +-- this defines an extra scanner lxmlid: + +local scanners = tokens.scanners +local scanstring = scanners.string +local getid = lxml.id + +scanners.lxmlid = function() return getid(scanstring()) end + +local implement = interfaces.implement + +-- lxml.id + +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 = "xmldoifselfempty", actions = lxml.doifempty, arguments = "string" } +implement { name = "xmldoifnotselfempty", actions = lxml.doifnotempty, arguments = "string" } +implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arguments = "string" } + +--------- { 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 = "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 = "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 = "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 = "xmlflush", actions = lxml.flush, arguments = "string" } +implement { name = "xmlflushcontext", actions = lxml.context, arguments = "string" } +implement { name = "xmlflushlinewise", actions = lxml.flushlinewise, arguments = "string" } +implement { name = "xmlflushspacewise", actions = lxml.flushspacewise, arguments = "string" } +implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = { "string", "string" } } +implement { name = "xmlinclude", actions = lxml.include, arguments = { "string", "string", "string", true } } +implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" } +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 = "xmlinfo", actions = lxml.info, arguments = "string" } +implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" } +implement { name = "xmllast", actions = lxml.last, arguments = "string" } +implement { name = "xmlload", actions = lxml.load, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloaddirectives", actions = lxml.directives.load, arguments = "string" } +implement { name = "xmlloadregistered", actions = lxml.loadregistered, arguments = { "string", "string", "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 = "xmlpos", actions = lxml.pos, arguments = "string" } +implement { name = "xmlraw", actions = lxml.raw, arguments = { "string", "string" } } +implement { name = "xmlregisterns", actions = xml.registerns, arguments = { "string", "string" } } +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 = "xmlsetfunction", actions = lxml.setaction, arguments = { "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 = "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 = "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 = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true } } +implement { name = "xmltofile", actions = lxml.tofile, arguments = { "string", "string", "string" } } +implement { name = "xmltoparameters", actions = lxml.toparameters, arguments = "string" } +implement { name = "xmlverbatim", actions = lxml.verbatim, arguments = "string" } + +implement { name = "xmlstartraw", actions = lxml.startraw } +implement { name = "xmlstopraw", actions = lxml.stopraw } + +implement { name = "xmlprependsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } } -- 2:* +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 = "xmlprependdocumentsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } } +implement { name = "xmlappenddocumentsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } } +implement { name = "xmlbeforedocumentsetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } } +implement { name = "xmlafterdocumentsetup", actions = lxml.installsetup, arguments = { 4, "string", "string" } } +implement { name = "xmlremovesetup", actions = lxml.removesetup, arguments = { "string", "string" } } -- 1:* +implement { name = "xmlremovedocumentsetup", actions = lxml.removesetup, arguments = { "string", "string" } } +implement { name = "xmlflushdocumentsetups", actions = lxml.flushsetups, arguments = { "string", "string", "string" } } -- 2:* +implement { name = "xmlresetdocumentsetups", 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 = "xmlsetentity", actions = xml.registerentity, arguments = { "string", "string" } } +implement { name = "xmltexentity", actions = lxml.registerentity, arguments = { "string", "string" } } + +implement { name = "xmlsetcommandtotext", actions = lxml.setcommandtotext, arguments = "string" } +implement { name = "xmlsetcommandtonone", actions = lxml.setcommandtonone, arguments = "string" } + +implement { name = "xmlstarttiming", actions = function() statistics.starttiming(lxml) end } +implement { name = "xmlstoptiming", actions = function() statistics.stoptiming (lxml) end } diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv index 752e315da5e..1141288992e 100644 --- a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv @@ -12,6 +12,7 @@ %C details. %D Todo: auto apply setups (manage at lua end) +%D Todo: manuak: \xmlinclusion \xmlinclusions \writestatus{loading}{ConTeXt XML Support / Initialization} @@ -20,102 +21,195 @@ %registerctxluafile{lxml-xml}{1.001} % xml finalizers %registerctxluafile{lxml-aux}{1.001} % extras using parser %registerctxluafile{lxml-mis}{1.001} % extras independent of parser -\registerctxluafile{char-ent}{1.001} \registerctxluafile{lxml-ent}{1.001} % entity hacks \registerctxluafile{lxml-tex}{1.001} % tex finalizers \registerctxluafile{lxml-dir}{1.001} % ctx hacks +\registerctxluafile{lxml-ini}{1.001} % interface \unprotect % todo \!!bs \!!es where handy (slower) +% todo: { } mandate +% avoid # + \def\ctxlxml #1{\ctxlua{lxml.#1}} -\def\xmlmain #1{\ctxlxml{main("#1")}} -\def\xmlmatch #1{\ctxlxml{match("#1")}} -\def\xmlall #1#2{\ctxlxml{all("#1","#2")}} -\def\xmlatt #1#2{\ctxlxml{att("#1","#2")}} -\def\xmlattdef #1#2#3{\ctxlxml{att("#1","#2","#3")}} -\def\xmlchainatt #1#2{\ctxlxml{chainattribute("#1","/","#2")}} -\def\xmlchainattdef #1#2#3{\ctxlxml{chainattribute("#1","/","#2","#3")}} -\def\xmlattribute #1#2#3{\ctxlxml{attribute("#1","#2","#3")}} -\def\xmlattributedef #1#2#3#4{\ctxlxml{attribute("#1","#2","#3","#4")}} -\def\xmlcommand #1#2#3{\ctxlxml{command("#1","#2","#3")}} -\def\xmlconcat #1#2#3{\ctxlxml{concat("#1","#2",[[\detokenize{#3}]])}} -\def\xmlconcatrange #1#2#3#4#5{\ctxlxml{concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}} -\def\xmlcount #1#2{\ctxlxml{count("#1","#2")}} -\def\xmldelete #1#2{\ctxlxml{delete("#1","#2")}} -\def\xmldirectives #1{\ctxlxml{directives.setup("#1")}} -\def\xmldirectivesbefore #1{\ctxlxml{directives.before("#1")}} -\def\xmldirectivesafter #1{\ctxlxml{directives.after("#1")}} -\def\xmlfilter #1#2{\ctxlxml{filter("#1",\!!bs#2\!!es)}} -\def\xmlfilterlist #1#2{\ctxlxml{filterlist("#1",\!!bs#2\!!es)}} -\def\xmlfunction #1#2{\ctxlxml{applyfunction("#1",\!!bs#2\!!es)}} -\def\xmlfirst #1#2{\ctxlxml{first("#1","#2")}} -\def\xmlflush #1{\ctxlxml{flush("#1")}} -\def\xmlflushlinewise #1{\ctxlxml{flushlinewise("#1")}} -\def\xmlflushspacewise #1{\ctxlxml{flushspacewise("#1")}} -%def\xmlcontent #1{\ctxlxml{content("#1")}} -%def\xmlflushstripped #1{\ctxlxml{strip("#1",true)}} -\def\xmldirect #1{\ctxlxml{direct("#1")}} % in loops, not dt but root -\def\xmlidx #1#2#3{\ctxlxml{idx("#1","#2",\number#3)}} -\def\xmlinclude #1#2#3{\ctxlxml{include("#1","#2","#3",true)}} -\def\xmlincludeoptions#1#2#3#4{\ctxlxml{include("#1","#2","#3","#4")}} -\def\xmlsave #1#2{\ctxlxml{save("#1","#2")}} -\def\xmlindex #1#2#3{\ctxlxml{index("#1","#2",\number#3)}} -\def\xmlinfo #1{\hbox{\ttxx[\ctxlxml{info("#1")}]}} +%def\xmlall #1#2{\clf_xmlall {#1}{#2}} +%def\xmlatt #1#2{\clf_xmlatt {#1}{#2}} +%def\xmlattdef #1#2#3{\clf_xmlattdef {#1}{#2}{#3}} +%def\xmlattribute #1#2#3{\clf_xmlattribute {#1}{#2}{#3}} +%def\xmlattributedef #1#2#3#4{\clf_xmlattributedef {#1}{#2}{#3}{#4}} +%def\xmlchainatt #1#2{\clf_xmlchainatt {#1}{#2}} +%def\xmlchainattdef #1#2#3{\clf_xmlchainattdef {#1}{#2}{#3}} +%def\xmlchecknamespace #1#2#3{\clf_xmlchecknamespace {#1}{#2}{#3}} % element +%def\xmlcommand #1#2#3{\clf_xmlcommand {#1}{#2}{#3}} +\def\xmlconcat #1#2#3{\clf_xmlconcat {#1}{#2}{\detokenize{#3}}} +\def\xmlconcatrange #1#2#3#4#5{\clf_xmlconcatrange {#1}{#2}{#3}{#4}{\detokenize{#5}}} +%def\xmlcontext #1#2{\clf_xmlcontext {#1}{#2}} +%def\xmlcount #1#2{\clf_xmlcount {#1}{#2}} +%def\xmldelete #1#2{\clf_xmldelete {#1}{#2}} +%def\xmldirect #1{\clf_xmldirect {#1}} % in loops, not dt but root +%def\xmldirectives #1{\clf_xmldirectives {#1}} +%def\xmldirectivesafter #1{\clf_xmldirectivesafter {#1}} +%def\xmldirectivesbefore #1{\clf_xmldirectivesbefore {#1}} +%def\xmldisplayverbatim #1{\clf_xmldisplayverbatim {#1}} +%def\xmlelement #1#2{\clf_xmlelement {#1}{#2}} +%def\xmlfilter #1#2{\clf_xmlfilter {#1}{#2}} +%def\xmlfilterlist #1#2{\clf_xmlfilterlist {#1}{#2}} +%def\xmlfirst #1#2{\clf_xmlfirst {#1}{#2}} +%def\xmlflush #1{\clf_xmlflush {#1}} +%def\xmlflushcontext #1{\clf_xmlflushcontext {#1}} +%def\xmlflushlinewise #1{\clf_xmlflushlinewise {#1}} +%def\xmlflushspacewise #1{\clf_xmlflushspacewise {#1}} +%def\xmlfunction #1#2{\clf_xmlfunction {#1}{#2}} +%def\xmlinclude #1#2#3{\clf_xmlinclude {#1}{#2}{#3}} +%def\xmlincludeoptions#1#2#3#4{\clf_xmlincludeoptions {#1}{#2}{#3}{#4}} +%def\xmlinclusion #1{\clf_xmlinclusion {#1}} +%def\xmlinclusions #1{\clf_xmlinclusions {#1}} +%def\xmlindex #1#2#3{\clf_xmlindex {#1}{#2}{#3}} +%let\xmlposition \xmlindex +%def\xmlinlineverbatim #1{\clf_xmlinlineverbatim {#1}} +%def\xmllast #1#2{\clf_xmllast {#1}{#2}} +\def\xmlload #1#2{\clf_xmlload {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}} +\def\xmlloadbuffer #1#2{\clf_xmlloadbuffer {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}} +\def\xmlloaddata #1#2{\clf_xmlloaddata {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}} +%def\xmlloaddirectives #1{\clf_xmlloaddirectives {#1}} +\def\xmlloadregistered #1#2{\clf_xmlloadregistered {#1}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}} +%def\xmlmain #1{\clf_xmlmain {#1}} +%def\xmlmatch #1{\clf_xmlmatch {#1}} +%def\xmlname #1{\clf_xmlname {#1}} +%def\xmlnamespace #1{\clf_xmlnamespace {#1}} +%def\xmlnonspace #1#2{\clf_xmlnonspace {#1}{#2}} +%def\xmlpos #1{\clf_xmlpos {#1}} +%def\xmlraw #1#2{\clf_xmlraw {#1}{#2}} +%def\xmlregisterns #1#2{\clf_xmlregisterns {#1}{#2}} % document +%def\xmlremapname #1#2#3#4{\clf_xmlremapname {#1}{#2}{#3}{#4}} % element +%def\xmlremapnamespace #1#2#3{\clf_xmlremapnamespace {#1}{#2}{#3}} % document +%def\xmlsave #1#2{\clf_xmlsave {#1}{#2}} +%def\xmlsetfunction #1#2#3{\clf_xmlsetfunction {#1}{#2}{#3}} +%def\xmlsetsetup #1#2#3{\clf_xmlsetsetup {#1}{#2}{#3}} +%def\xmlsnippet #1#2{\clf_xmlsnippet {#1}{#2}} +%def\xmlstrip #1#2{\clf_xmlstrip {#1}{#2}} +%def\xmlstripanywhere #1#2{\clf_xmlstripanywhere {#1}{#2}} +%def\xmlstripnolines #1#2{\clf_xmlstripnolines {#1}{#2}} +%def\xmlstripped #1#2{\clf_xmlstripped {#1}{#2}} +%def\xmlstrippednolines #1#2{\clf_xmlstrippednolines {#1}{#2}} +%def\xmltag #1{\clf_xmltag {#1}} +%def\xmltext #1#2{\clf_xmltext {#1}{#2}} +%def\xmltobuffer #1#2#3{\clf_xmltobuffer {#1}{#2}{#3}} % id pattern name +%def\xmltobufferverbose #1#2#3{\clf_xmltobufferverbose {#1}{#2}{#3}} % id pattern name +%def\xmltofile #1#2#3{\clf_xmltofile {#1}{#2}{#3}} % id pattern filename +%def\xmltoparameters #1{\clf_xmltoparameters {#1}} +%def\xmlverbatim #1{\clf_xmlverbatim {#1}} + +% experiment: +\let\xmlall \clf_xmlall +\let\xmlatt \clf_xmlatt +\let\xmlattdef \clf_xmlattdef +\let\xmlattribute \clf_xmlattribute +\let\xmlattributedef \clf_xmlattributedef +\let\xmlchainatt \clf_xmlchainatt +\let\xmlchainattdef \clf_xmlchainattdef +\let\xmlchecknamespace \clf_xmlchecknamespace +\let\xmlcommand \clf_xmlcommand +% \xmlconcat +% \xmlconcatrange +\let\xmlcontext \clf_xmlcontext +\let\xmlcount \clf_xmlcount +\let\xmldelete \clf_xmldelete +\let\xmldirect \clf_xmldirect % in loops, not dt but root +\let\xmldirectives \clf_xmldirectives +\let\xmldirectivesafter \clf_xmldirectivesafter +\let\xmldirectivesbefore \clf_xmldirectivesbefore +\let\xmldisplayverbatim \clf_xmldisplayverbatim +\let\xmlelement \clf_xmlelement +\let\xmlfilter \clf_xmlfilter +\let\xmlfilterlist \clf_xmlfilterlist +\let\xmlfirst \clf_xmlfirst +\let\xmlflush \clf_xmlflush +\let\xmlflushcontext \clf_xmlflushcontext +\let\xmlflushlinewise \clf_xmlflushlinewise +\let\xmlflushspacewise \clf_xmlflushspacewise +\let\xmlfunction \clf_xmlfunction +\let\xmlinclude \clf_xmlinclude +\let\xmlincludeoptions \clf_xmlincludeoptions +\let\xmlinclusion \clf_xmlinclusion +\let\xmlinclusions \clf_xmlinclusions +\let\xmlindex \clf_xmlindex +\let\xmlposition \clf_xmlindex +\let\xmlinlineverbatim \clf_xmlinlineverbatim +\let\xmllast \clf_xmllast +% \xmlload +% \xmlloadbuffer +% \xmlloaddata +\let\xmlloaddirectives \clf_xmlloaddirectives +% \xmlloadregistered +\let\xmlmain \clf_xmlmain +\let\xmlmatch \clf_xmlmatch +\let\xmlname \clf_xmlname +\let\xmlnamespace \clf_xmlnamespace +\let\xmlnonspace \clf_xmlnonspace +\let\xmlpos \clf_xmlpos +\let\xmlraw \clf_xmlraw +\let\xmlregisterns \clf_xmlregisterns % document +\let\xmlremapname \clf_xmlremapname % element +\let\xmlremapnamespace \clf_xmlremapnamespace % document +\let\xmlsave \clf_xmlsave +\let\xmlsetfunction \clf_xmlsetfunction +\let\xmlsetsetup \clf_xmlsetsetup +\let\xmlsnippet \clf_xmlsnippet +\let\xmlstrip \clf_xmlstrip +\let\xmlstripanywhere \clf_xmlstripanywhere +\let\xmlstripnolines \clf_xmlstripnolines +\let\xmlstripped \clf_xmlstripped +\let\xmlstrippednolines \clf_xmlstrippednolines +\let\xmltag \clf_xmltag +\let\xmltext \clf_xmltext +\let\xmltobuffer \clf_xmltobuffer % id pattern name +\let\xmltobufferverbose \clf_xmltobufferverbose % id pattern name +\let\xmltofile \clf_xmltofile % id pattern filename +\let\xmltoparameters \clf_xmltoparameters +\let\xmlverbatim \clf_xmlverbatim + +\def\xmlinfo #1{\hbox{\ttxx[\clf_xmlinfo{#1}]}} \def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked} -\def\xmllast #1#2{\ctxlxml{last("#1","#2")}} -\def\xmlname #1{\ctxlxml{name("#1")}} -\def\xmlnamespace #1{\ctxlxml{namespace("#1")}} -\def\xmlnonspace #1#2{\ctxlxml{nonspace("#1","#2")}} -\def\xmlraw #1#2{\ctxlxml{raw("#1","#2")}} -\def\xmlcontext #1#2{\ctxlxml{context("#1","#2")}} -\def\xmlflushcontext #1{\ctxlxml{context("#1")}} -\def\xmlsnippet #1#2{\ctxlxml{snippet("#1",#2)}} -\def\xmlelement #1#2{\ctxlxml{element("#1",#2)}} -\def\xmlregisterns #1#2{\ctxlua{xml.registerns("#1","#2")}} % document -\def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element -\def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document -\def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element -\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1",\!!bs#2\!!es,#3)}} -\def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1",\!!bs#2\!!es,"#3")}} -\def\xmlstrip #1#2{\ctxlxml{strip("#1","#2")}} -\def\xmlstripnolines #1#2{\ctxlxml{strip("#1","#2",true)}} -\def\xmlstripanywhere #1#2{\ctxlxml{strip("#1","#2",true,true)}} -\def\xmlstripped #1#2{\ctxlxml{stripped("#1","#2")}} -\def\xmlstrippednolines #1#2{\ctxlxml{stripped("#1","#2",true)}} -\def\xmltag #1{\ctxlxml{tag("#1")}} -\def\xmltext #1#2{\ctxlxml{text("#1","#2")}} -\def\xmlverbatim #1{\ctxlxml{verbatim("#1")}} -\def\xmldisplayverbatim #1{\ctxlxml{displayverbatim("#1")}} -\def\xmlinlineverbatim #1{\ctxlxml{inlineverbatim("#1")}} - -\def\xmlload #1#2{\ctxlxml{load("#1","#2","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}} -\def\xmlloadbuffer #1#2{\ctxlxml{loadbuffer("#1","#2","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}} -\def\xmlloaddata #1#2{\ctxlxml{loaddata("#1",\!!bs#2\!!es,"\directxmlparameter\c!entities","\directxmlparameter\c!compress")}} -\def\xmlloadregistered #1#2{\ctxlxml{loadregistered("#1","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}} -\def\xmlloaddirectives #1{\ctxlxml{directives.load("any:///#1")}} -\def\xmlpos #1{\ctxlxml{pos("#1")}} - -\def\xmltoparameters #1{\ctxlxml{toparameters("#1")}} - -\def\xmltofile #1#2#3{\ctxlxml{tofile("#1","#2","#3")}} % id pattern filename + +% goodie: + +\unexpanded\def\xmlprettyprint#1#2% + {\xmltobufferverbose{#1}{.}{xml-temp}% + \ifdefined\scitebuffer + \scitebuffer[#2][xml-temp]% + \else + \typebuffer[xml-temp][\c!option=#2]% + \fi} % kind of special: -\def\xmlstartraw{\ctxlxml{startraw()}} -\def\xmlstopraw {\ctxlxml{stopraw()}} +%def\xmlstartraw{\clf_xmlstartraw} +%def\xmlstopraw {\clf_xmlstopraw} + +\let\xmlstartraw\clf_xmlstartraw +\let\xmlstopraw \clf_xmlstopraw -% todo: \xmldoifelseattribute +% these are expandable! todo: \xmldoifelseattribute -\def\xmldoif #1#2{\ctxlxml{doif (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable -\def\xmldoifnot #1#2{\ctxlxml{doifnot (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable -\def\xmldoifelse #1#2{\ctxlxml{doifelse (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable -\def\xmldoiftext #1#2{\ctxlxml{doiftext (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable -\def\xmldoifnottext #1#2{\ctxlxml{doifnottext (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable -\def\xmldoifelsetext #1#2{\ctxlxml{doifelsetext(\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable +\let\xmldoif \clf_xmldoif +\let\xmldoifnot \clf_xmldoifnot +\let\xmldoifelse \clf_xmldoifelse +\let\xmldoiftext \clf_xmldoiftext +\let\xmldoifnottext \clf_xmldoifnottext +\let\xmldoifelsetext \clf_xmldoifelsetext -%def\xmldoifelseempty #1#2{\ctxlxml{doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented -%def\xmldoifelseselfempty #1{\ctxlxml{doifelseempty("#1")}} +\let\xmldoifempty \clf_xmldoifempty +\let\xmldoifnotempty \clf_xmldoifnotempty +\let\xmldoifelseempty \clf_xmldoifelseempty +\let\xmldoifselfempty \clf_xmldoifselfempty +\let\xmldoifnotselfempty \clf_xmldoifnotselfempty +\let\xmldoifelseselfempty \clf_xmldoifelseselfempty + +\let\xmldoiftextelse \xmldoifelsetext +\let\xmldoifemptyelse \xmldoifelseempty +\let\xmldoifselfemptyelse \xmldoifelseselfempty % \startxmlsetups xml:include % \xmlinclude{main}{include}{filename|href} @@ -129,28 +223,28 @@ %\ef\xmlsetup#1#2{\setupwithargument{#2}{#1}} \let\xmlsetup\setupwithargumentswapped -\let\xmls\setupwithargumentswapped -\let\xmlw\setupwithargument +\let\xmls\setupwithargumentswapped % hardly any faster +\let\xmlw\setupwithargument % hardly any faster \newtoks \registeredxmlsetups % todo: 1:xml:whatever always before 3:xml:something -\unexpanded\def\xmlprependsetup #1{\ctxlxml{installsetup(1,"*","#1")}} -\unexpanded\def\xmlappendsetup #1{\ctxlxml{installsetup(2,"*","#1")}} -\unexpanded\def\xmlbeforesetup #1#2{\ctxlxml{installsetup(3,"*","#1","#2")}} -\unexpanded\def\xmlaftersetup #1#2{\ctxlxml{installsetup(4,"*","#1","#2")}} +\unexpanded\def\xmlprependsetup #1{\clf_xmlprependsetup {*}{#1}} +\unexpanded\def\xmlappendsetup #1{\clf_xmlappendsetup {*}{#1}} +\unexpanded\def\xmlbeforesetup #1#2{\clf_xmlbeforesetup {*}{#1}{#2}} +\unexpanded\def\xmlaftersetup #1#2{\clf_xmlaftersetup {*}{#1}{#2}} -\unexpanded\def\xmlprependdocumentsetup #1#2{\ctxlxml{installsetup(1,"#1","#2")}} -\unexpanded\def\xmlappenddocumentsetup #1#2{\ctxlxml{installsetup(2,"#1","#2")}} -\unexpanded\def\xmlbeforedocumentsetup#1#2#3{\ctxlxml{installsetup(3,"#1","#2","#3")}} -\unexpanded\def\xmlafterdocumentsetup #1#2#3{\ctxlxml{installsetup(4,"#1","#2","#3")}} +\unexpanded\def\xmlprependdocumentsetup #1#2{\clf_xmlprependdocumentsetup{#1}{#2}} +\unexpanded\def\xmlappenddocumentsetup #1#2{\clf_xmlappenddocumentsetup {#1}{#2}} +\unexpanded\def\xmlbeforedocumentsetup #1#2#3{\clf_xmlbeforedocumentsetup {#1}{#2}{#3}} +\unexpanded\def\xmlafterdocumentsetup #1#2#3{\clf_xmlafterdocumentsetup {#1}{#2}{#3}} -\unexpanded\def\xmlremovesetup #1{\ctxlxml{removesetup("*","#1")}} -\unexpanded\def\xmlremovedocumentsetup #1#2{\ctxlxml{removesetup("#1","#2")}} +\unexpanded\def\xmlremovesetup #1{\clf_xmlremovesetup {*}{#1}} +\unexpanded\def\xmlremovedocumentsetup #1#2{\clf_xmlremovedocumentsetup {#1}{#2}} -\unexpanded\def\xmlflushdocumentsetups #1#2{\ctxlxml{flushsetups("#1","*","#2")}} % #1 == id where to apply * and #2 -\unexpanded\def\xmlresetdocumentsetups #1{\ctxlxml{resetsetups("#1")}} +\unexpanded\def\xmlflushdocumentsetups #1#2{\clf_xmlflushdocumentsetups {#1}{*}{#2}} % #1 == id where to apply * and #2 +\unexpanded\def\xmlresetdocumentsetups #1{\clf_xmlresetdocumentsetups {#1}} \let\xmlregistersetup \xmlappendsetup \let\xmlregisterdocumentsetup\xmlappenddocumentsetup @@ -170,8 +264,8 @@ \xmldefaulttotext{#1}% after include \xmlstoptiming} -\unexpanded\def\xmlstarttiming{\ctxlua{statistics.starttiming(lxml)}} -\unexpanded\def\xmlstoptiming {\ctxlua{statistics.stoptiming (lxml)}} +\unexpanded\def\xmlstarttiming{\clf_xmlstarttiming} +\unexpanded\def\xmlstoptiming {\clf_xmlstoptiming} \def\lxml_process#1#2#3#4#5% flag \loader id name what initializersetup {\begingroup @@ -229,11 +323,6 @@ % \xmlsetfunction{main}{verbatim}{lxml.displayverbatim} % \xmlsetfunction{main}{verb} {lxml.inlineverbatim} -% \unexpanded\def\startxmldisplayverbatim[#1]{} -% \unexpanded\def\stopxmldisplayverbatim {} -% \unexpanded\def\startxmlinlineverbatim [#1]{} -% \unexpanded\def\stopxmlinlineverbatim {} - % we use an xml: namespace so one has to define a suitable verbatim, say % % \definetyping[xml:verbatim][typing] @@ -252,7 +341,7 @@ \unexpanded\def\startxmlinlineverbatim[#1]% {\begingroup \edef\currenttype{xml:#1}% - \let\stopxmldisplayverbatim\endgroup + \let\stopxmlinlineverbatim\endgroup \doinitializeverbatim} % will move but is developed for xml @@ -271,14 +360,13 @@ \def\inlinemessage #1{\dontleavehmode{\tttf#1}} \def\displaymessage#1{\blank\inlinemessage{#1}\blank} -% \def\xmltraceentities % settextcleanup is not defined -% {\ctxlua{xml.settextcleanup(lxml.trace_text_entities)}% -% \appendtoks\ctxlxml{showtextentities()}\to\everygoodbye} - % processing instructions -\def\xmlcontextdirective#1% kind class key value - {\executeifdefined{xml#1directive}\gobblethreearguments} +\unexpanded\def\xmlinstalldirective#1#2% + {\clf_xmlinstalldirective{#1}{\checkedstrippedcsname#2}} + +% \def\xmlcontextdirective#1% kind class key value +% {\executeifdefined{xml#1directive}\gobblethreearguments} % setting up xml: % @@ -301,15 +389,15 @@ \letvalue{\??xmldefaults\v!text }\plusone \letvalue{\??xmldefaults\v!hidden}\plustwo -\unexpanded\def\xmldefaulttotext#1% +\unexpanded\def\xmldefaulttotext {\ifcase\xmlprocessingmode - % unset + \expandafter\gobbleoneargument % unset \or - \ctxlxml{setcommandtotext("#1")}% 1 + \expandafter\clf_xmlsetcommandtotext % 1 \or - \ctxlxml{setcommandtonone("#1")}% 2 + \expandafter\clf_xmlsetcommandtonone % 2 \else - % unset + \expandafter\gobbleoneargument % unset \fi} \appendtoks @@ -326,22 +414,23 @@ %def\xmlvalue #1#2{\ifcsname\??xmlmapvalue#1:#2\endcsname\csname\??xmlmapvalue#1:#2\expandafter\expandafter\gobbleoneargument\expandafter\endcsname\else\expandafter\firstofoneargument\fi} \def\xmldoifelsevalue #1#2{\ifcsname\??xmlmapvalue#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} +\let\xmldoifvalueelse\xmldoifelsevalue + \let\xmlmapval\xmlmapvalue \let\xmlval \xmlvalue %D Experimental: -\def\xmlgetindex #1{\ctxlxml{getindex("\xmldocument","#1")}} -\def\xmlrawindex #1{\ctxlxml{rawindex("#1")}} -\def\xmlwithindex #1#2{\ctxlxml{withindex("\xmldocument","#1","#2")}} +\def\xmlgetindex #1{\clf_xmlgetindex {\xmldocument}{#1}} +\def\xmlwithindex #1#2{\clf_xmlwithindex{\xmldocument}{#1}{#2}} \def\xmlreference #1#2{\string\xmlwithindex{#1}{#2}} %D Entities (might change): \setnewconstant\xmlautoentities\plusone % 0=off, 1=upper, 2=upper,lower -\def\xmlsetentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}} -\def\xmltexentity#1#2{\ctxlua{lxml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}} +\unexpanded\def\xmlsetentity#1#2{\clf_xmlsetentity{#1}{\detokenize{#2}}} +\unexpanded\def\xmltexentity#1#2{\clf_xmltexentity{#1}{\detokenize{#2}}} % \xmlsetentity{tex}{\TEX{}} % {} needed @@ -393,6 +482,16 @@ \let\processxmlfile \processXMLfile \let\xmldata \XMLdata +\unexpanded\def\xmlsetinjectors[#1]% + {\clf_xmlsetinjectors{#1}} + +\unexpanded\def\xmlresetinjectors + {\clf_xmlresetinjectors{}} + +\def\xmlinjector#1{\executeifdefined{#1}\donothing} + +\let\xmlapplyselectors\clf_xmlapplyselectors + \protect \endinput % \newcount\charactersactiveoffset \charactersactiveoffset="10000 diff --git a/Master/texmf-dist/tex/context/base/lxml-lpt.lua b/Master/texmf-dist/tex/context/base/lxml-lpt.lua index 8567f26234a..decb6567bf5 100644 --- a/Master/texmf-dist/tex/context/base/lxml-lpt.lua +++ b/Master/texmf-dist/tex/context/base/lxml-lpt.lua @@ -505,6 +505,9 @@ local function apply_expression(list,expression,order) return collected end +-- this one can be made faster but there are not that many conversions so it doesn't +-- really pay of + local P, V, C, Cs, Cc, Ct, R, S, Cg, Cb = lpeg.P, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cb local spaces = S(" \n\r\t\f")^0 @@ -541,12 +544,11 @@ local lp_builtin = P ( local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])") --- lp_fastpos_p = (P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end --- lp_fastpos_n = (P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end - -lp_fastpos_p = P("+")^0 * R("09")^1 * P(-1) / "l==%0" -lp_fastpos_n = P("-") * R("09")^1 * P(-1) / "(%0<0 and (#list+%0==l))" +----- lp_fastpos_p = (P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end +----- lp_fastpos_n = (P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end +local lp_fastpos_p = P("+")^0 * R("09")^1 * P(-1) / "l==%0" +local lp_fastpos_n = P("-") * R("09")^1 * P(-1) / "(%0<0 and (#list+%0==l))" local lp_fastpos = lp_fastpos_n + lp_fastpos_p local lp_reserved = C("and") + C("or") + C("not") + C("div") + C("mod") + C("true") + C("false") @@ -806,7 +808,7 @@ local function nodesettostring(set,nodetest) if not ns or ns == "" then ns = "*" end if not tg or tg == "" then tg = "*" end tg = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg) - t[i] = (directive and tg) or format("not(%s)",tg) + t[#t+1] = (directive and tg) or format("not(%s)",tg) end if nodetest == false then return format("not(%s)",concat(t,"|")) @@ -1132,7 +1134,6 @@ expressions.print = function(...) return true end -expressions.contains = find expressions.find = find expressions.upper = upper expressions.lower = lower @@ -1156,6 +1157,10 @@ function expressions.contains(str,pattern) return false end +function xml.expressions.idstring(str) + return type(str) == "string" and gsub(str,"^#","") or "" +end + -- user interface local function traverse(root,pattern,handle) diff --git a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv index 0ee1f16f3e2..0d8eb6ba174 100644 --- a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv +++ b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv @@ -19,10 +19,13 @@ \unprotect +% the flusher is unexpandable so that it can be used in tables (noalign +% interferences) + \unexpanded\def\xmlresetsorter #1{\ctxlxml{sorters.reset("#1")}} \unexpanded\def\xmladdsortentry#1#2#3{\ctxlxml{sorters.add("#1","#2",\!!bs#3\!!es)}} \unexpanded\def\xmlshowsorter #1{\ctxlxml{sorters.show("#1")}} -\unexpanded\def\xmlflushsorter #1#2{\ctxlxml{sorters.flush("#1","#2")}} + \def\xmlflushsorter #1#2{\ctxlxml{sorters.flush("#1","#2")}} \unexpanded\def\xmlsortentries #1{\ctxlxml{sorters.sort("#1")}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/lxml-tab.lua b/Master/texmf-dist/tex/context/base/lxml-tab.lua index 8b34a96a3c3..0a72640d086 100644 --- a/Master/texmf-dist/tex/context/base/lxml-tab.lua +++ b/Master/texmf-dist/tex/context/base/lxml-tab.lua @@ -42,10 +42,10 @@ local xml = xml --~ local xml = xml local concat, remove, insert = table.concat, table.remove, table.insert -local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatable, getmetatable, tonumber +local type, next, setmetatable, getmetatable, tonumber, rawset = type, next, setmetatable, getmetatable, tonumber, rawset local lower, find, match, gsub = string.lower, string.find, string.match, string.gsub local utfchar = utf.char -local lpegmatch = lpeg.match +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs local formatters = string.formatters @@ -325,12 +325,13 @@ end -- one level expansion (simple case), no checking done -local rest = (1-P(";"))^0 -local many = P(1)^0 +local p_rest = (1-P(";"))^0 +local p_many = P(1)^0 +local p_char = lpegpatterns.utf8character local parsedentity = - P("&") * (P("#x")*(rest/fromhex) + P("#")*(rest/fromdec)) * P(";") * P(-1) + - (P("#x")*(many/fromhex) + P("#")*(many/fromdec)) + P("&") * (P("#x")*(p_rest/fromhex) + P("#")*(p_rest/fromdec)) * P(";") * P(-1) + + (P("#x")*(p_many/fromhex) + P("#")*(p_many/fromdec)) -- parsing in the xml file @@ -367,7 +368,41 @@ local privates_n = { -- keeps track of defined ones } -local escaped = utf.remapper(privates_u) +-- -- local escaped = utf.remapper(privates_u) -- can't be used as it freezes +-- -- local unprivatized = utf.remapper(privates_p) -- can't be used as it freezes +-- +-- local p_privates_u = false +-- local p_privates_p = false +-- +-- table.setmetatablenewindex(privates_u,function(t,k,v) rawset(t,k,v) p_privates_u = false end) +-- table.setmetatablenewindex(privates_p,function(t,k,v) rawset(t,k,v) p_privates_p = false end) +-- +-- local function escaped(str) +-- if not str or str == "" then +-- return "" +-- else +-- if not p_privates_u then +-- p_privates_u = Cs((lpeg.utfchartabletopattern(privates_u)/privates_u + p_char)^0) +-- end +-- return lpegmatch(p_privates_u,str) +-- end +-- end +-- +-- local function unprivatized(str) +-- if not str or str == "" then +-- return "" +-- else +-- if not p_privates_p then +-- p_privates_p = Cs((lpeg.utfchartabletopattern(privates_p)/privates_p + p_char)^0) +-- end +-- return lpegmatch(p_privates_p,str) +-- end +-- end + +local escaped = utf.remapper(privates_u,"dynamic") +local unprivatized = utf.remapper(privates_p,"dynamic") + +xml.unprivatized = unprivatized local function unescaped(s) local p = privates_n[s] @@ -382,10 +417,7 @@ local function unescaped(s) return p end -local unprivatized = utf.remapper(privates_p) - xml.privatetoken = unescaped -xml.unprivatized = unprivatized xml.privatecodes = privates_n local function handle_hex_entity(str) @@ -546,7 +578,7 @@ local valid = R('az', 'AZ', '09') + S('_-.') local name_yes = C(valid^1) * colon * C(valid^1) local name_nop = C(P(true)) * C(valid^1) local name = name_yes + name_nop -local utfbom = lpeg.patterns.utfbom -- no capture +local utfbom = lpegpatterns.utfbom -- no capture local spacing = C(space^0) ----- entitycontent = (1-open-semicolon)^0 @@ -768,7 +800,7 @@ end -- Because we can have a crash (stack issues) with faulty xml, we wrap this one -- in a protector: -function xmlconvert(data,settings) +local function xmlconvert(data,settings) local ok, result = pcall(function() return _xmlconvert_(data,settings) end) if ok then return result @@ -919,14 +951,18 @@ and then handle the lot.

-- new experimental reorganized serialize -local function verbose_element(e,handlers) -- options +local f_attribute = formatters['%s=%q'] + +local function verbose_element(e,handlers,escape) -- options local handle = handlers.handle local serialize = handlers.serialize local ens, etg, eat, edt, ern = e.ns, e.tg, e.at, e.dt, e.rn local ats = eat and next(eat) and { } if ats then + local n = 0 for k,v in next, eat do - ats[#ats+1] = formatters['%s=%q'](k,escaped(v)) + n = n + 1 + ats[n] = f_attribute(k,escaped(v)) end end if ern and trace_entities and ern ~= ens then diff --git a/Master/texmf-dist/tex/context/base/lxml-tex.lua b/Master/texmf-dist/tex/context/base/lxml-tex.lua index 0c58a47cc9f..adb849347e1 100644 --- a/Master/texmf-dist/tex/context/base/lxml-tex.lua +++ b/Master/texmf-dist/tex/context/base/lxml-tex.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['lxml-tex'] = { -- be an cldf-xml helper library. local utfchar = utf.char -local concat, insert, remove = table.concat, table.insert, table.remove +local concat, insert, remove, sortedkeys = table.concat, table.insert, table.remove, table.sortedkeys local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match local type, next, tonumber, tostring, select = type, next, tonumber, tostring, select local lpegmatch = lpeg.match @@ -19,43 +19,65 @@ local P, S, C, Cc = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc local tex, xml = tex, xml local lowerchars, upperchars, lettered = characters.lower, characters.upper, characters.lettered +local basename, dirname, joinfile = file.basename, file.dirname, file.join lxml = lxml or { } local lxml = lxml -local catcodenumbers = catcodes.numbers -local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method -local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method - -local commands = commands -local context = context -local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing) - -local xmlelements, xmlcollected, xmlsetproperty = xml.elements, xml.collected, xml.setproperty -local xmlwithelements = xml.withelements -local xmlserialize, xmlcollect, xmltext, xmltostring = xml.serialize, xml.collect, xml.text, xml.tostring -local xmlapplylpath = xml.applylpath -local xmlunprivatized, xmlprivatetoken, xmlprivatecodes = xml.unprivatized, xml.privatetoken, xml.privatecodes -local xmlstripelement = xml.stripelement - -local variables = interfaces and interfaces.variables or { } +local catcodenumbers = catcodes.numbers +local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method +local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method + +local commands = commands +local context = context +local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing) + +local implement = interfaces.implement + +local xmlelements = xml.elements +local xmlcollected = xml.collected +local xmlsetproperty = xml.setproperty +local xmlwithelements = xml.withelements +local xmlserialize = xml.serialize +local xmlcollect = xml.collect +local xmltext = xml.text +local xmltostring = xml.tostring +local xmlapplylpath = xml.applylpath +local xmlunprivatized = xml.unprivatized +local xmlprivatetoken = xml.privatetoken +local xmlprivatecodes = xml.privatecodes +local xmlstripelement = xml.stripelement +local xmlinclusion = xml.inclusion +local xmlinclusions = xml.inclusions +local xmlcontent = xml.content + +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 insertbeforevalue = utilities.tables.insertbeforevalue local insertaftervalue = utilities.tables.insertaftervalue -local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming +local resolveprefix = resolvers.resolve + +local starttiming = statistics.starttiming +local stoptiming = statistics.stoptiming -local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end) -local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end) -local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end) -local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end) -local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end) +local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end) +local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end) +local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end) +local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end) +local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end) +local trace_selectors = false trackers.register("lxml.selectors",function(v) trace_selectors = v end) -local report_lxml = logs.reporter("xml","tex") -local report_xml = logs.reporter("xml","tex") +local report_lxml = logs.reporter("lxml","tex") +local report_xml = logs.reporter("xml","tex") -local forceraw, rawroot = false, nil +local forceraw = false +local forceraw = nil -- tex entities -- @@ -65,7 +87,7 @@ lxml.entities = lxml.entities or { } storage.register("lxml/entities",lxml.entities,"lxml.entities") ---~ xml.placeholders.unknown_any_entity = nil -- has to be per xml +-- xml.placeholders.unknown_any_entity = nil -- has to be per xml local xmlentities = xml.entities local texentities = lxml.entities @@ -417,7 +439,7 @@ function lxml.convert(id,data,entities,compress,currentresource) end function lxml.load(id,filename,compress,entities) - filename = commands.preparedfile(filename) -- not commands! + filename = ctxrunner.preparedfile(filename) if trace_loading then report_lxml("loading file %a as %a",filename,id) end @@ -436,37 +458,6 @@ function lxml.register(id,xmltable,filename) return xmltable end --- function lxml.include(id,pattern,attribute,recurse,resolve) --- starttiming(xml) --- local root = getid(id) --- xml.include(root,pattern,attribute,recurse,function(filename) --- if filename then --- -- preprocessing --- filename = commands.preparedfile(filename) --- -- some protection --- if file.dirname(filename) == "" and root.filename then --- local dn = file.dirname(root.filename) --- if dn ~= "" then --- filename = file.join(dn,filename) --- end --- end --- if trace_loading then --- report_lxml("including file %a",filename) --- end --- -- handy if we have a flattened structure --- if resolve then --- filename = resolvers.resolve(filename) or filename --- end --- -- todo: check variants and provide --- noffiles, nofconverted = noffiles + 1, nofconverted + 1 --- return resolvers.loadtexfile(filename) or "" --- else --- return "" --- end --- end) --- stoptiming(xml) --- end - -- recurse prepare rootpath resolve basename local options_true = { "recurse", "prepare", "rootpath" } @@ -492,17 +483,17 @@ function lxml.include(id,pattern,attribute,options) end -- handy if we have a flattened structure if options.basename then - filename = file.basename(filename) + filename = basename(filename) end if options.resolve then - filename = resolvers.resolve(filename) or filename + filename = resolveprefix(filename) or filename end -- some protection if options.rootpath then - if file.dirname(filename) == "" and root.filename then - local dn = file.dirname(root.filename) + if dirname(filename) == "" and root.filename then + local dn = dirname(root.filename) if dn ~= "" then - filename = file.join(dn,filename) + filename = joinfile(dn,filename) end end end @@ -518,6 +509,20 @@ function lxml.include(id,pattern,attribute,options) stoptiming(xml) end +function lxml.inclusion(id,default) + local inclusion = xmlinclusion(getid(id),default) + if inclusion then + context(inclusion) + end +end + +function lxml.inclusions(id,sorted) + local inclusions = xmlinclusions(getid(id),sorted) + if inclusions then + context(table.concat(inclusions,",")) + end +end + function lxml.save(id,name) xml.save(getid(id),name) end @@ -603,30 +608,49 @@ local function tex_element(e,handlers) end end +-- +-- + local pihandlers = { } xml.pihandlers = pihandlers -local category = P("context-") * C((1-P("-"))^1) * P("-directive") local space = S(" \n\r") local spaces = space^0 local class = C((1-space)^0) local key = class +local rest = C(P(1)^0) local value = C(P(1-(space * -1))^0) - -local parser = category * spaces * class * spaces * key * spaces * value - -pihandlers[#pihandlers+1] = function(str) - if str then - local a, b, c, d = lpegmatch(parser,str) - if d then - contextsprint(ctxcatcodes,"\\xmlcontextdirective{",a,"}{",b,"}{",c,"}{",d,"}") +local category = P("context-") * ( + C((1-P("-"))^1) * P("-directive") + + P("directive") * spaces * key + ) + +local c_parser = category * spaces * value -- rest +local k_parser = class * spaces * key * spaces * rest --value + +implement { + name = "xmlinstalldirective", + arguments = { "string", "string" }, + actions = function(name,csname) + if csname then + local keyvalueparser = k_parser / context[csname] + local keyvaluechecker = function(category,rest,e) + lpegmatch(keyvalueparser,rest) + end + pihandlers[name] = keyvaluechecker end end -end +} local function tex_pi(e,handlers) local str = e.dt[1] - for i=1,#pihandlers do - pihandlers[i](str) + if str and str ~= "" then + local category, rest = lpegmatch(c_parser,str) + if category and rest and #rest > 0 then + local handler = pihandlers[category] + if handler then + handler(category,rest,e) + end + end end end @@ -1500,7 +1524,7 @@ end lxml.content = text function lxml.position(id,pattern,n) - position(xmlapplylpath(getid(id),pattern),n) + position(xmlapplylpath(getid(id),pattern),tonumber(n)) end function lxml.chainattribute(id,pattern,a,default) @@ -1516,7 +1540,7 @@ function lxml.concat(id,pattern,separator,lastseparator,textonly) end function lxml.element(id,n) - position(xmlapplylpath(getid(id),"/*"),n) + position(xmlapplylpath(getid(id),"/*"),tonumber(n)) -- tonumber handy end lxml.index = lxml.position @@ -1554,6 +1578,8 @@ function lxml.att(id,a,default) end elseif str ~= "" then contextsprint(notcatcodes,str) + else + -- explicit empty is valid end elseif default and default ~= "" then contextsprint(notcatcodes,default) @@ -1679,7 +1705,20 @@ function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) e -- special case: "*" and "" -> self else lpath lookup ---~ function lxml.doifelseempty(id,pattern) doifelse(isempty(getid(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern +local function checkedempty(id,pattern) + local e = getid(id) + if not pattern or pattern == "" then + local dt = e.dt + local nt = #dt + return (nt == 0) or (nt == 1 and dt[1] == "") + else + return isempty(getid(id),pattern) + end +end + +function lxml.doifempty (id,pattern) doif (checkedempty(id,pattern)) end +function lxml.doifnotempty (id,pattern) doifnot (checkedempty(id,pattern)) end +function lxml.doifelseempty(id,pattern) doifelse(checkedempty(id,pattern)) end -- status info @@ -1807,3 +1846,213 @@ end texfinalizers.upperall = xmlfinalizers.upperall texfinalizers.lowerall = xmlfinalizers.lowerall + +function lxml.tobuffer(id,pattern,name,unescaped) + local collected = xmlapplylpath(getid(id),pattern) + if collected then + if unescaped then + collected = xmlcontent(collected[1]) -- expanded entities ! + else + collected = tostring(collected[1]) + end + buffers.assign(name,collected) + else + buffers.erase(name) + end +end + +-- relatively new: + +local permitted = nil +local ctx_xmlinjector = context.xmlinjector + +xml.pihandlers["injector"] = function(category,rest,e) + local options = options_to_array(rest) + local action = options[1] + if not action then + return + end + local n = #options + if n > 1 then + local category = options[2] + if category == "*" then + ctx_xmlinjector(action) + elseif permitted then + if n == 2 then + if permitted[category] then + ctx_xmlinjector(action) + end + else + for i=2,n do + local category = options[i] + if category == "*" or permitted[category] then + ctx_xmlinjector(action) + return + end + end + end + end + else + ctx_xmlinjector(action) + end +end + +local pattern = P("context-") * C((1-lpeg.patterns.whitespace)^1) * C(P(1)^1) + +function lxml.applyselectors(id) + local root = getid(id) + local function filter(e) + local dt = e.dt + local ndt = #dt + local done = false + local i = 1 + while i <= ndt do + local dti = dt[i] + if type(dti) == "table" then + if dti.tg == "@pi@" then + local text = dti.dt[1] + local what, rest = lpegmatch(pattern,text) + if what == "select" then + local categories = options_to_hash(rest) + if categories["begin"] then + local okay = false + for k, v in next, permitted do + if categories[k] then + okay = k + break + end + end + if not trace_selectors then + -- skip + elseif okay then + report_lxml("accepting selector: %s",okay) + else + categories.begin = false + report_lxml("rejecting selector: % t",sortedkeys(categories)) + end + for j=i,ndt do + local dtj = dt[j] + if type(dtj) == "table" then + local tg = dtj.tg + if tg == "@pi@" then + local text = dtj.dt[1] + local what, rest = lpegmatch(pattern,text) + if what == "select" then + local categories = options_to_hash(rest) + if categories["end"] then + i = j + break + else + -- error + end + end + elseif not okay then + dtj.tg = "@cm@" + end + else +-- dt[j] = "" -- okay ? + end + end + end + elseif what == "include" then + local categories = options_to_hash(rest) + if categories["begin"] then + local okay = false + for k, v in next, permitted do + if categories[k] then + okay = k + break + end + end + if not trace_selectors then + -- skip + elseif okay then + report_lxml("accepting include: %s",okay) + else + categories.begin = false + report_lxml("rejecting include: % t",sortedkeys(categories)) + end + if okay then + for j=i,ndt do + local dtj = dt[j] + if type(dtj) == "table" then + local tg = dtj.tg + if tg == "@cm@" then + local content = dtj.dt[1] + local element = root and xml.toelement(content,root) + dt[j] = element + element.__p__ = dt -- needs checking + done = true + elseif tg == "@pi@" then + local text = dtj.dt[1] + local what, rest = lpegmatch(pattern,text) + if what == "include" then + local categories = options_to_hash(rest) + if categories["end"] then + i = j + break + else + -- error + end + end + end + end + end + end + end + else + filter(dti) + end + end + if done then + -- probably not needed + xml.reindex(dt) + end + end + i = i + 1 + end + end + xmlwithelements(root,filter) +end + +function xml.setinjectors(set) + local s = settings_to_set(set) + if permitted then + for k, v in next, s do + permitted[k] = true + end + else + permitted = s + end +end + +function xml.resetinjectors(set) + if permitted and set and set ~= "" then + local s = settings_to_set(set) + for k, v in next, s do + if v then + permitted[k] = nil + end + end + else + permitted = nil + end +end + +implement { + name = "xmlsetinjectors", + actions = xml.setinjectors, + arguments = "string" +} + +implement { + name = "xmlresetinjectors", + actions = xml.resetinjectors, + arguments = "string" +} + +implement { + name = "xmlapplyselectors", + actions = lxml.applyselectors, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/m-chart.lua b/Master/texmf-dist/tex/context/base/m-chart.lua index 2b9869379f1..f1e7f4cb937 100644 --- a/Master/texmf-dist/tex/context/base/m-chart.lua +++ b/Master/texmf-dist/tex/context/base/m-chart.lua @@ -19,8 +19,6 @@ local P, S, C, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.match local report_chart = logs.reporter("chart") -local points = number.points -- we can use %p instead - local variables = interfaces.variables local v_yes = variables.yes @@ -229,6 +227,8 @@ function commands.flow_start_cell(settings) settings = settings, x = 1, y = 1, + realx = 1, + realy = 1, name = "", } end @@ -325,9 +325,13 @@ local function inject(includedata,data,hash) if si.include then inject(si,data,hash) else + local x = si.x + xoffset + local y = si.y + yoffset local t = { - x = si.x + xoffset, - y = si.y + yoffset, + x = x, + y = y, + realx = x, + realy = y, settings = settings, } setmetatableindex(t,si) @@ -451,10 +455,12 @@ function commands.flow_set_location(x,y) else y = tonumber(y) end - temp.x = x or 1 - temp.y = y or 1 - last_x = x or last_x - last_y = y or last_y + temp.x = x or 1 + temp.y = y or 1 + temp.realx = x or 1 + temp.realy = y or 1 + last_x = x or last_x + last_y = y or last_y end function commands.flow_set_connection(location,displacement,name) @@ -499,17 +505,17 @@ local function process_cells(chart,xoffset,yoffset) local linesettings = settings.line context("flow_shape_line_color := \\MPcolor{%s} ;", linesettings.color) context("flow_shape_fill_color := \\MPcolor{%s} ;", linesettings.backgroundcolor) - context("flow_shape_line_width := %s ; ", points(linesettings.rulethickness)) + context("flow_shape_line_width := %p ; ", linesettings.rulethickness) elseif focus[cell.focus] or focus[cell.name] then local focussettings = settings.focus context("flow_shape_line_color := \\MPcolor{%s} ;", focussettings.framecolor) context("flow_shape_fill_color := \\MPcolor{%s} ;", focussettings.backgroundcolor) - context("flow_shape_line_width := %s ; ", points(focussettings.rulethickness)) + context("flow_shape_line_width := %p ; ", focussettings.rulethickness) else local shapesettings = settings.shape context("flow_shape_line_color := \\MPcolor{%s} ;", shapesettings.framecolor) context("flow_shape_fill_color := \\MPcolor{%s} ;", shapesettings.backgroundcolor) - context("flow_shape_line_width := %s ; " , points(shapesettings.rulethickness)) + context("flow_shape_line_width := %p ; " , shapesettings.rulethickness) end context("flow_peepshape := false ;") -- todo context("flow_new_shape(%s,%s,%s) ;",cell.x+xoffset,cell.y+yoffset,shapedata.number) @@ -580,7 +586,7 @@ local function process_connections(chart,xoffset,yoffset) context("flow_touchshape := %s ;", linesettings.offset == v_none and "true" or "false") context("flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0) context("flow_connection_line_color := \\MPcolor{%s} ;",linesettings.color) - context("flow_connection_line_width := %s ;",points(linesettings.rulethickness)) + context("flow_connection_line_width := %p ;",linesettings.rulethickness) context("flow_connect_%s_%s (%s) (%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,j,cellx,celly,what_cell,otherx,othery,what_other) context("flow_dsp_x := 0 ; flow_dsp_y := 0 ;") end @@ -686,6 +692,7 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny) print("no such chart",chartname) return end +-- chart = table.copy(chart) chart = expanded(chart,settings) local chartsettings = chart.settings.chart local autofocus = chart.settings.chart.autofocus @@ -746,8 +753,8 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny) -- relocate cells for i=1,#data do local cell = data[i] - cell.x = cell.x - minx + 1 - cell.y = cell.y - miny + 1 + cell.x = cell.realx - minx + 1 + cell.y = cell.realy - miny + 1 end chart.from_x = 1 chart.from_y = 1 @@ -756,7 +763,9 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny) chart.nx = nx chart.ny = ny -- - -- inspect(chart) + chart.shift_x = minx + 1 + chart.shift_y = miny + 1 + -- return chart end @@ -792,14 +801,14 @@ local function makechart(chart) local labeloffset = chartsettings.labeloffset local exitoffset = chartsettings.exitoffset local commentoffset = chartsettings.commentoffset - context("flow_grid_width := %s ;", points(gridwidth)) - context("flow_grid_height := %s ;", points(gridheight)) - context("flow_shape_width := %s ;", points(shapewidth)) - context("flow_shape_height := %s ;", points(shapeheight)) - context("flow_chart_offset := %s ;", points(chartoffset)) - context("flow_label_offset := %s ;", points(labeloffset)) - context("flow_exit_offset := %s ;", points(exitoffset)) - context("flow_comment_offset := %s ;", points(commentoffset)) + context("flow_grid_width := %p ;", gridwidth) + context("flow_grid_height := %p ;", gridheight) + context("flow_shape_width := %p ;", shapewidth) + context("flow_shape_height := %p ;", shapeheight) + context("flow_chart_offset := %p ;", chartoffset) + context("flow_label_offset := %p ;", labeloffset) + context("flow_exit_offset := %p ;", exitoffset) + context("flow_comment_offset := %p ;", commentoffset) -- local radius = settings.line.radius local rulethickness = settings.line.rulethickness @@ -814,10 +823,10 @@ local function makechart(chart) radius = dy end end - context("flow_connection_line_width := %s ;", points(rulethickness)) - context("flow_connection_smooth_size := %s ;", points(radius)) - context("flow_connection_arrow_size := %s ;", points(radius)) - context("flow_connection_dash_size := %s ;", points(radius)) + context("flow_connection_line_width := %p ;", rulethickness) + context("flow_connection_smooth_size := %p ;", radius) + context("flow_connection_arrow_size := %p ;", radius) + context("flow_connection_dash_size := %p ;", radius) -- local offset = chartsettings.offset -- todo: pass string if offset == v_none or offset == v_overlay or offset == "" then @@ -825,7 +834,7 @@ local function makechart(chart) elseif offset == v_standard then offset = radius -- or rulethickness? end - context("flow_chart_offset := %s ;",points(offset)) + context("flow_chart_offset := %p ;",offset) -- context("flow_reverse_y := true ;") process_cells(chart,0,0) @@ -854,7 +863,7 @@ local function splitchart(chart) local delta_x = splitsettings.dx or 0 local delta_y = splitsettings.dy or 0 -- - report_chart("spliting %a from (%s,%s) upto (%s,%s) into (%s,%s) with overlap (%s,%s)", + report_chart("spliting %a from (%s,%s) upto (%s,%s) with steps (%s,%s) and overlap (%s,%s)", name,from_x,from_y,to_x,to_y,step_x,step_y,delta_x,delta_y) -- local part_x = 0 @@ -866,6 +875,9 @@ local function splitchart(chart) if done then last_x = to_x end +-- if first_x >= to_x then +-- break +-- end local part_y = 0 local first_y = from_y while true do @@ -875,14 +887,31 @@ local function splitchart(chart) if done then last_y = to_y end +-- if first_y >= to_y then +-- break +-- end -- +local data = chart.data +for i=1,#data do + local cell = data[i] +-- inspect(cell) + local cx, cy = cell.x, cell.y + if cx >= first_x and cx <= last_x then + if cy >= first_y and cy <= last_y then report_chart("part (%s,%s) of %a is split from (%s,%s) -> (%s,%s)",part_x,part_y,name,first_x,first_y,last_x,last_y) - local x, y, nx, ny = first_x, first_y, last_x - first_x + 1,last_y - first_y + 1 + local x = first_x + local y = first_y + local nx = last_x - first_x + 1 + local ny = last_y - first_y + 1 context.beforeFLOWsplit() context.handleFLOWsplit(function() makechart(getchart(settings,x,y,nx,ny)) -- we need to pass frozen settings ! end) context.afterFLOWsplit() + break + end + end +end -- if done then break diff --git a/Master/texmf-dist/tex/context/base/m-chart.mkvi b/Master/texmf-dist/tex/context/base/m-chart.mkvi index 2b1a7447ccd..a0c8b2244a9 100644 --- a/Master/texmf-dist/tex/context/base/m-chart.mkvi +++ b/Master/texmf-dist/tex/context/base/m-chart.mkvi @@ -97,7 +97,6 @@ [\c!framecolor=FLOWfocuscolor, \c!background=\FLOWshapeparameter\c!background, \c!backgroundcolor=\FLOWshapeparameter\c!backgroundcolor, - \c!backgroundscreen=\FLOWshapeparameter\c!backgroundscreen, \c!rulethickness=\FLOWshapeparameter\c!rulethickness, \c!offset=\FLOWshapeparameter\c!offset] @@ -177,7 +176,7 @@ corner = "\FLOWlineparameter\c!corner", dash = "\FLOWlineparameter\c!dash", arrow = "\FLOWlineparameter\c!arrow", - offset = "\FLOWlineparameter\c!offset", + offset = \number\dimexpr\FLOWlineparameter\c!offset, }, } }% \endgroup} @@ -193,7 +192,7 @@ \insidefloattrue \dontcomplain \setupFLOWchart[#settings]% - \setupbodyfont[\FLOWchartparameter\c!bodyfont]% + \usebodyfontparameter\FLOWchartparameter \ctxcommand{flow_make_chart { chart = { name = "#name", @@ -259,8 +258,9 @@ \def\FLOW_charts[#name][#settings] {\begingroup - \setupFLOWsplit[\c!state=\v!start,#settings]% - \FLOW_chart[#name][]% + \setupFLOWchart[\c!split=\v!yes]% + \setupFLOWsplit[#settings]% + \module_charts_process[#name][]% \FLOWchart... \endgroup} \appendtoks diff --git a/Master/texmf-dist/tex/context/base/m-hemistich.mkiv b/Master/texmf-dist/tex/context/base/m-hemistich.mkiv index 55fde7b9283..7a849d415be 100644 --- a/Master/texmf-dist/tex/context/base/m-hemistich.mkiv +++ b/Master/texmf-dist/tex/context/base/m-hemistich.mkiv @@ -33,7 +33,7 @@ \unexpanded\def\dodohemistiches#1[#2]#3#4% {\dontleavehmode \begingroup - \doifassignmentelse{#2} + \doifelseassignment{#2} {\edef\currenthemistich{#1}% \setupcurrenthemistich[#2]} {\def\currenthemistich{#2}}% @@ -41,21 +41,29 @@ {\scratchwidth\availablehsize} {\scratchwidth\hemistichparameter\c!width\relax}% \spaceskip\zeropoint\s!plus\plusone\s!fill\relax + \dostarttagged\t!division\currenthemistich \hbox to \scratchwidth\bgroup \scratchwidth.5\dimexpr\scratchwidth-\hemistichparameter\c!distance\relax \hbox to \scratchwidth\bgroup + \dostarttagged\t!construct\c!lefttext \usehemistichstyleandcolor\c!leftstyle\c!leftcolor#3% + \dostoptagged \egroup \hss \begingroup + \dostarttagged\t!construct\c!separator \usehemistichstyleandcolor\c!separatorstyle\c!separatorcolor \hemistichparameter\c!separator + \dostoptagged \endgroup \hss \hbox to \scratchwidth\bgroup + \dostarttagged\t!construct\c!righttext \usehemistichstyleandcolor\c!rightstyle\c!rightcolor#4% + \dostoptagged \egroup \egroup + \dostoptagged \endgroup} \unexpanded\def\hemistichescaesura#1#2#3% diff --git a/Master/texmf-dist/tex/context/base/m-matrix.mkiv b/Master/texmf-dist/tex/context/base/m-matrix.mkiv new file mode 100644 index 00000000000..ccb376e39c7 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/m-matrix.mkiv @@ -0,0 +1,495 @@ +%D \module +%D [ file=m-matrix, +%D version=2014.11.04, % already a year older +%D title=\CONTEXT\ Extra Modules, +%D subtitle=Matrices, +%D author={Jeong Dalyoung \& Hans Hagen}, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This code is based on a post by Dalyoung on the context list. After that +%D we turned it into a module and improved the code a bit. Feel free to ask +%D us for more. Once we're satisfied, a more general helper l-matrix could +%D be made. Dalyoung does the clever bits, and Hans only cleanes up and +%D optimizes a bit. + +% \registerctxluafile{l-matrix}{1.001} % not yet + +\startmodule[matrix] + +\startluacode + +local settings_to_hash = utilities.parsers.settings_to_hash +local formatters = string.formatters +local copy = table.copy +local insert = table.insert +local remove = table.remove + +local matrix = { } +moduledata.matrix = matrix + +local f_matrix_slot = formatters["%s_{%s%s}"] + +function matrix.symbolic(sym, x, y, nx ,ny) -- symMatrix("a", "m", "n") + local nx = nx or 2 + local ny = ny or nx + local function filled(i,y) + local mrow = { } + for j=1,nx do + mrow[#mrow+1] = f_matrix_slot(sym,i,j) + end + mrow[#mrow+1] = "\\cdots" + mrow[#mrow+1] = f_matrix_slot(sym,i,y) + return mrow + end + local function dummy() + local mrow = { } + for j=1,nx do + mrow[#mrow+1] = "\\vdots" + end + mrow[#mrow+1] = "\\ddots" + mrow[#mrow+1] = "\\vdots" + return mrow + end + -- + local mm = { } + for i=1,ny do + mm[i] = filled(i,y) + end + mm[#mm+1] = dummy() + mm[#mm+1] = filled(x,y) + return mm +end + +-- todo: define a matrix at the tex end so that we have more control + +local fences_p = { + left = "\\left(\\,", + right = "\\,\\right)", +} + +local fences_b = { + left = "\\left[\\,", + right = "\\,\\right]", +} + +function matrix.typeset(m,options) + local options = settings_to_hash(options or "") + context.startmatrix(options.determinant and fences_b or fences_p) + for i=1, #m do + local mi = m[i] + for j=1,#mi do + context.NC(mi[j]) + end + context.NR() + end + context.stopmatrix() +end + +-- interchange two rows (i-th, j-th) + +function matrix.swap(t,i,j) + t[i], t[j] = t[j], t[i] +end + +-- replace i-th row with factor * (i-th row) + +function matrix.multiply(m,i,factor) + local mi = m[i] + for k=1,#mi do + mi[k] = factor * mi[k] + end + return m +end + +-- scalar product "factor * m" + +function matrix.scalar(m, factor) + for i=1,#m do + local mi = m[i] + for j=1,#mi do + mi[j] = factor * mi[j] + end + end + return m +end + +-- replace i-th row with i-th row + factor * (j-th row) + +function matrix.sumrow(m,i,j,factor) + local mi = m[i] + local mj = m[j] + for k=1,#mi do + mi[k] = mi[k] + factor * mj[k] + end +end + +-- transpose of a matrix + +function matrix.transpose(m) + local t = { } + for j=1,#m[1] do + local r = { } + for i=1,#m do + r[i] = m[i][j] + end + t[j] = r + end + return t +end + +-- inner product of two vectors + +function matrix.inner(u,v) + local nu = #u + if nu == 0 then + return 0 + end + local nv = #v + if nv ~= nu then + return 0 + end + local result = 0 + for i=1,nu do + result = result + u[i] * v[i] + end + return result +end + +-- product of two matrices + +function matrix.product(m1,m2) + local product = { } + if #m1[1] == #m2 then + for i=1,#m1 do + local m1i = m1[i] + local mrow = { } + for j=1,#m2[1] do + local temp = 0 + for k=1,#m1[1] do + temp = temp + m1i[k] * m2[k][j] + end + mrow[j] = temp + end + product[i] = mrow + end + end + return product +end + +local function uppertri(m,sign) + local temp = copy(m) + for i=1,#temp-1 do + local pivot = temp[i][i] + if pivot == 0 then + local pRow = i +1 + while temp[pRow][i] == 0 do + pRow = pRow + 1 + if pRow > #temp then -- if there is no nonzero number + return temp + end + end + temp[i], temp[pRow] = temp[pRow], temp[i] + if sign then + sign = -sign + end + end + local mi = temp[i] + for k=i+1, #temp do + local factor = -temp[k][i]/mi[i] + local mk = temp[k] + for l=i,#mk do + mk[l] = mk[l] + factor * mi[l] + end + end + end + if sign then + return temp, sign + else + return temp + end +end + +matrix.uppertri = uppertri + +function matrix.determinant(m) + if #m == #m[1] then + local d = 1 + local t, s = uppertri(m,1) + for i=1,#t do + d = d * t[i][i] + end + return s*d + else + return 0 + end +end + +local function rowechelon(m,r) + local temp = copy(m) + local pRow = 1 + local pCol = 1 + while pRow <= #temp do + local pivot = temp[pRow][pCol] + if pivot == 0 then + local i = pRow + local n = #temp + while temp[i][pCol] == 0 do + i = i + 1 + if i > n then + -- no nonzero number in a column + pCol = pCol + 1 + if pCol > #temp[pRow] then + -- there is no nonzero number in a row + return temp + end + i = pRow + end + end + temp[pRow], temp[i] = temp[i], temp[pRow] + end + local row = temp[pRow] + pivot = row[pCol] + for l=pCol,#row do + row[l] = row[l]/pivot + end + + if r == 1 then + -- make the "reduced row echelon form" + local row = temp[pRow] + for k=1,pRow-1 do + local current = temp[k] + local factor = -current[pCol] + local mk = current + for l=pCol,#mk do + mk[l] = mk[l] + factor * row[l] + end + end + end + -- just make the row echelon form + local row = temp[pRow] + for k=pRow+1, #temp do + local current = temp[k] + local factor = -current[pCol] + local mk = current + for l=pCol,#mk do + mk[l] = mk[l] + factor * row[l] + end + end + pRow = pRow + 1 + pCol = pCol + 1 + + if pRow > #temp or pCol > #temp[1] then + pRow = #temp + 1 + end + end + return temp +end + +matrix.rowechelon = rowechelon +matrix.rowEchelon = rowechelon + +-- solve the linear equation m X = c + +local function solve(m,c) + local n = #m + if n ~= #c then + return copy(m) + end + local newm = copy(m) + local temp = copy(c) + for i=1,n do + insert(newm[i],temp[i]) + end + return rowechelon(newm,1) +end + +matrix.solve = solve + +-- find the inverse matrix of m + +local function inverse(m) + local n = #m + local temp = copy(m) + if n ~= #m[1] then + return temp + end + for i=1,n do + for j=1,n do + insert(temp[i],j == i and 1 or 0) + end + end + temp = rowechelon(temp,1) + for i=1,n do + for j=1,n do + remove(temp[i], 1) + end + end + return temp +end + +matrix.inverse = inverse + +\stopluacode + +\stopmodule + +\unexpanded\def\ctxmodulematrix#1{\ctxlua{moduledata.matrix.#1}} + +\continueifinputfile{m-matrix.mkiv} + +\starttext + +\startluacode +document.DemoMatrixA = { + { 0, 2, 4, -4, 1 }, + { 0, 0, 2, 3, 4 }, + { 2, 2, -6, 2, 4 }, + { 2, 0, -6, 9, 7 }, + { 2, 3, 4, 5, 6 }, + { 6, 6, -6, 6, 6 }, +} + +document.DemoMatrixB = { + { 0, 2, 4, -4, 1 }, + { 0, 0, 2, 3, 4 }, + { 2, 2, -6, 2, 4 }, + { 2, 0, -6, 9, 7 }, + { 2, 2, -6, 2, 4 }, + { 2, 2, -6, 2, 4 }, +} +\stopluacode + +\startsubject[title={A symbolic matrix}] + +\ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n"))} +\ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n", 4, 8))} + +\stopsubject + +\startsubject[title={Swap two rows (2 and 4)}] + +\startluacode +moduledata.matrix.typeset(document.DemoMatrixA) +context.blank() +moduledata.matrix.swap(document.DemoMatrixA, 2, 4) +context.blank() +moduledata.matrix.typeset(document.DemoMatrixA) +\stopluacode + +\stopsubject + +\startsubject[title={Multiply $3 \times r_2$}] + +\startluacode +moduledata.matrix.typeset(document.DemoMatrixA) +context.blank() +moduledata.matrix.typeset(moduledata.matrix.multiply(document.DemoMatrixA, 2, 3)) +\stopluacode + +\stopsubject + +\startsubject[title={Row 2 + $3 \times r_4$}] + +\startluacode +moduledata.matrix.typeset(document.DemoMatrixA) +context.blank() +moduledata.matrix.sumrow(document.DemoMatrixA, 2, 3, 4) +context.blank() +moduledata.matrix.typeset(document.DemoMatrixA) +\stopluacode + +\stopsubject + +\startsubject[title={Transpose a matrix}] + +\startluacode +moduledata.matrix.typeset(document.DemoMatrixA) +context.blank() +moduledata.matrix.typeset(moduledata.matrix.transpose(document.DemoMatrixA)) +\stopluacode + +\stopsubject + +\startsubject[title={The inner product of two vectors}] + +\startluacode +context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2 })) +context.blank() +context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2, 4 })) +\stopluacode + +\startsubject[title={The product of two matrices}] + +\startluacode +moduledata.matrix.typeset(document.DemoMatrixA) +context.blank() +moduledata.matrix.typeset(moduledata.matrix.product(document.DemoMatrixA,document.DemoMatrixA)) +\stopluacode + +\stopsubject + +\startsubject[title={An Upper Triangular Matrix}] + +\ctxmodulematrix{typeset(moduledata.matrix.uppertri(document.DemoMatrixB))} + +\startsubject[title={A determinant}] + +\startluacode +local m = { + { 1, 2, 4 }, + { 0, 0, 2 }, + { 2, 2, -6 }, +} +context(moduledata.matrix.determinant(m)) +\stopluacode + +\stopsubject + +\startsubject[title={Row echelon form}] + +\startluacode +local m = { + { 1, 3, -2, 0, 2, 0, 0 }, + { 2, 6, -5, -2, 4, -3, -1 }, + { 0, 0, 5, 10, 0, 15, 5 }, + { 2, 6, 0, 8, 4, 18, 6 }, +} + +moduledata.matrix.typeset(m) +moduledata.matrix.typeset(moduledata.matrix.rowechelon(m,1)) +\stopluacode + +\stopsubject + +\startsubject[title={Solving linear equation}] + +\startluacode +local m = { + { 1, 3, -2, 0 }, + { 2, 0, 1, 2 }, + { 6, -5, -2, 4 }, + { -3, -1, 5, 10 }, +} + +local c = { 5, 2, 6, 8 } + +moduledata.matrix.typeset(moduledata.matrix.solve(m,c)) +\stopluacode + +\stopsubject + +\startsubject[title={Inverse matrix}] + +\startcombination[2*1] + {\ctxlua{moduledata.matrix.typeset { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } }}} {} + {\ctxlua{moduledata.matrix.typeset(moduledata.matrix.inverse { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } })}} {} +\stopcombination + +\stopsubject + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/m-morse.mkvi b/Master/texmf-dist/tex/context/base/m-morse.mkvi deleted file mode 100644 index a2c20dff745..00000000000 --- a/Master/texmf-dist/tex/context/base/m-morse.mkvi +++ /dev/null @@ -1,273 +0,0 @@ -%D \module -%D [ file=m-morse, -%D version=2010.12.10, -%D title=\CONTEXT\ Extra Modules, -%D subtitle=Morse, -%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. - -% todo: act upon the node list -% make it a buffer operation -% nice in cld manual - -\startluacode - -moduledata.morse = moduledata.morse or { } -local morse = moduledata.morse - -local utfcharacters, gsub = string.utfcharacters, string.gsub -local ucchars, shchars = characters.ucchars, characters.shchars - -local codes = { - - ["A"] = "·—", - ["B"] = "—···", - ["C"] = "—·—·", - ["D"] = "—··", - ["E"] = "·", - ["F"] = "··—·", - ["G"] = "——·", - ["H"] = "····", - ["I"] = "··", - ["J"] = "·———", - ["K"] = "—·—", - ["L"] = "·—··", - ["M"] = "——", - ["N"] = "—·", - ["O"] = "———", - ["P"] = "·——·", - ["Q"] = "——·—", - ["R"] = "·—·", - ["S"] = "···", - ["T"] = "—", - ["U"] = "··—", - ["V"] = "···—", - ["W"] = "·——", - ["X"] = "—··—", - ["Y"] = "—·——", - ["Z"] = "——··", - - ["0"] = "—————", - ["1"] = "·————", - ["2"] = "··———", - ["3"] = "···——", - ["4"] = "····—", - ["5"] = "·····", - ["6"] = "—····", - ["7"] = "——···", - ["8"] = "———··", - ["9"] = "————·", - - ["."] = "·—·—·—", - [","] = "——··——", - [":"] = "———···", - [";"] = "—·—·—", - - ["?"] = "··——··", - ["!"] = "—·—·——", - - ["-"] = "—····—", - ["/"] = "—··—· ", - - ["("] = "—·——·", - [")"] = "—·——·—", - - ["="] = "—···—", - ["@"] = "·——·—·", - - ["'"] = "·————·", - ['"'] = "·—··—·", - - ["À"] = "·——·—", - ["Å"] = "·——·—", - ["Ä"] = "·—·—", - ["Æ"] = "·—·—", - ["Ç"] = "—·—··", - ["É"] = "··—··", - ["È"] = "·—··—", - ["Ñ"] = "——·——", - ["Ö"] = "———·", - ["Ø"] = "———·", - ["Ü"] = "··——", - ["ß"] = "··· ···", - -} - -morse.codes = codes - -local fallbackself = false - -local function codefallback(t,k) - if k then - local u = ucchars[k] - local v = rawget(t,u) or rawget(t,shchars[u]) or false - t[k] = v - return v - elseif fallbackself then - return k - else - return false - end -end - -table.setmetatableindex(codes,codefallback) - -local MorseBetweenWords = context.MorseBetweenWords -local MorseBetweenCharacters = context.MorseBetweenCharacters -local MorseLong = context.MorseLong -local MorseShort = context.MorseShort -local MorseSpace = context.MorseSpace -local MorseUnknown = context.MorseUnknown - -local function toverbose(str) - str = gsub(str,"%s*+%s*","+") - str = gsub(str,"%s+"," ") - local done = false - for m in utfcharacters(str) do - if done then - MorseBetweenCharacters() - end - if m == "·" or m == "." then - MorseShort() - done = true - elseif m == "—" or m == "-" then - MorseLong() - done = true - elseif m == " " then - if done then - MorseBetweenCharacters() - end - done = false - elseif m == "+" then - MorseBetweenWords() - done = false - else - MorseUnknown(m) - end - end -end - -local function toregular(str) - local inmorse = false - for s in utfcharacters(str) do - local m = codes[s] - if m then - if inmorse then - MorseBetweenWords() - else - inmorse = true - end - local done = false - for m in utfcharacters(m) do - if done then - MorseBetweenCharacters() - else - done = true - end - if m == "·" then - MorseShort() - elseif m == "—" then - MorseLong() - elseif m == " " then - MorseBetweenCharacters() - end - end - inmorse = true - elseif s == "\n" or s == " " then - MorseSpace() - inmorse = false - else - if inmorse then - MorseBetweenWords() - else - inmorse = true - end - MorseUnknown(s) - end - end -end - -local function tomorse(str,verbose) - if verbose then - toverbose(str) - else - toregular(str) - end -end - -morse.tomorse = tomorse - -function morse.filetomorse(name,verbose) - tomorse(resolvers.loadtexfile(name),verbose) -end - -function morse.showtable() - context.starttabulate { "|l|l|" } -- { "|l|l|l|" } - for k, v in table.sortedpairs(codes) do - context.NC() context(k) - -- context.NC() context(v) - context.NC() tomorse(v,true) - context.NC() context.NR() - end - context.stoptabulate() -end - -\stopluacode - -\unprotect - -% todo: \setupmorse, but probably it's not worth the trouble. - -\def\MorseWidth {0.4em} -\def\MorseHeight {0.2em} -%def\MorseShort {\dontleavehmode\blackrule[\c!height=\MorseHeight,\c!width=\dimexpr\MorseWidth]} -%def\MorseLong {\dontleavehmode\blackrule[\c!height=\MorseHeight,\c!width=3\dimexpr\MorseWidth]} -\def\MorseShort {\dontleavehmode\vrule\!!width \dimexpr\MorseWidth\!!height\MorseHeight\!!depth\zeropoint\relax} -\def\MorseLong {\dontleavehmode\vrule\!!width3\dimexpr\MorseWidth\!!height\MorseHeight\!!depth\zeropoint\relax} -\def\MorseBetweenCharacters {\kern\MorseWidth} -\def\MorseBetweenWords {\hskip3\dimexpr\MorseWidth\relax} -\def\MorseSpace {\hskip7\dimexpr\MorseWidth\relax} -\def\MorseUnknown #text{[\detokenize{#text}]} - -\unexpanded\def\MorseCode #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es,true)}} -\unexpanded\def\MorseString #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es)}} -\unexpanded\def\MorseFile #text{\ctxlua{moduledata.morse.filetomorse("#text")}} -\unexpanded\def\MorseTable {\ctxlua{moduledata.morse.showtable()}} - -\let\Morse \MorseString - -%def\MorseShort {·} -%def\MorseLong {—} - -\protect - -\continueifinputfile{m-morse.mkvi} - -\starttext - -\MorseTable - -\startlines -\MorseCode{—·—· ——— —· — · —··— —+—— —·— ·· ···—} -\MorseCode{—·—· ——— —· — · —··— — + —— —·— ·· ···—} -\Morse{ÀÁÂÃÄÅàáâãäå} -\Morse{ÆÇæç} -\Morse{ÈÉÊËèéêë} -\Morse{ÌÍÎÏìíîï} -\Morse{Ññ} -\Morse{ÒÓÔÕÖòóôõö} -\Morse{Øø} -\Morse{ÙÚÛÜùúû} -\Morse{Ýýÿ} -\Morse{ß} -\Morse{Ţţ} -\stoplines - -\Morse{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} - -\stoptext diff --git a/Master/texmf-dist/tex/context/base/m-oldfun.mkiv b/Master/texmf-dist/tex/context/base/m-oldfun.mkiv index 1c5a1d29d41..3f2ec0263ed 100644 --- a/Master/texmf-dist/tex/context/base/m-oldfun.mkiv +++ b/Master/texmf-dist/tex/context/base/m-oldfun.mkiv @@ -131,7 +131,7 @@ \unexpanded\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars {\defconvertedargument\asciia{#7}% \defconvertedcommand \asciib{\DroppedString}% - \doifinstringelse\asciia\asciib + \doifelseinstring\asciia\asciib {\noindentation \dontleavehmode \checkindentation % redo this one diff --git a/Master/texmf-dist/tex/context/base/m-oldnum.mkiv b/Master/texmf-dist/tex/context/base/m-oldnum.mkiv index efc0af4721f..382c56eb674 100644 --- a/Master/texmf-dist/tex/context/base/m-oldnum.mkiv +++ b/Master/texmf-dist/tex/context/base/m-oldnum.mkiv @@ -73,8 +73,8 @@ \chardef\digitoutputmode=1 % 0..6 \chardef\digitsignmode =0 % 0..3 -\def\setdigitmode{\chardef\digitoutputmode} -\def\setdigitsign{\chardef\digitsignmode} +\unexpanded\def\setdigitmode{\chardef\digitoutputmode} +\unexpanded\def\setdigitsign{\chardef\digitsignmode} %D The digit modes are: %D @@ -100,7 +100,7 @@ \unexpanded\def\digits {\bgroup \let~@% - \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}} + \doifelsenextbgroup\dodigits{\doifelsenextchar\normalmathshift\domathdigits\grabdigit}} \def\dodigits#1% {\grabdigit#1\relax} @@ -118,7 +118,7 @@ \ifx\normalmathshift\undefined \let\normalmathshift=$ \fi -\def\scandigit +\unexpanded\def\scandigit {\ifx\next\blankspace \let\next\handledigits \else\ifx\next\nextobeyedline % the indirect one @@ -139,10 +139,10 @@ %D typeset it in superscript. The space placeholders are %D replaced by a \type {@}. -\def\savedigit#1#2% +\unexpanded\def\savedigit#1#2% {\edef#1{#1\saveddigits#2}\let\saveddigits\empty} -\long\def\collectdigit#1% +\unexpanded\def\collectdigit#1% {\ifx#1~% \savedigit\collecteddigits @% \else\if#1_% tricky as can be several catcodes ... will become lua code anyway @@ -158,13 +158,13 @@ \chardef\powerdigits\plusone \else \savedigit\collecteddigits#1% - %\doifnumberelse{#1} + %\doifelsenumber{#1} % {\savedigit\collecteddigits#1} % {\def\saveddigits{#1}}% \fi\fi\fi \else \savedigit\savedpowerdigits#1% - %\doifnumberelse{#1} + %\doifelsenumber{#1} % {\savedigit\savedpowerdigits#1} % {\def\saveddigits{#1}}% \fi\fi\fi\fi @@ -173,7 +173,7 @@ \let\handlemathdigits\firstofoneargument \let\handletextdigits\mathematics -\def\handledigits +\unexpanded\def\handledigits {%\ifcase\powerdigits % \edef\collecteddigits{\collecteddigits\saveddigits}% %\else @@ -235,7 +235,7 @@ % 0,- is invalid, should be = % 0,-- is invalid, should be == -\def\digitzeroamount +\unexpanded\def\digitzeroamount {\digitsgn\zeroamount \def\digitzeroamount {\hphantom @@ -243,7 +243,7 @@ \hskip-\wd\scratchbox}% \let\digitzeroamount\empty}} -\def\scandigits#1% +\unexpanded\def\scandigits#1% {\if#1.\digitsep1\else \if#1,\digitsep2\else \if#1@\digitnop \else @@ -261,7 +261,7 @@ \newbox\digitsepbox \chardef\autodigitmode=1 -\def\digitsep#1% +\unexpanded\def\digitsep#1% {\ifcase\autodigitmode \doscandigit#1% \else @@ -277,7 +277,7 @@ % % while this works -\def\digitnop +\unexpanded\def\digitnop {\hbox{\hphantom{\box\digitsepbox}}% \hphantom{0}\chardef\skipdigit1\relax} @@ -287,7 +287,7 @@ % {\hphantom{\box\digitsepbox0}% % \chardef\skipdigit1\relax} -\def\digitsgn#1% +\unexpanded\def\digitsgn#1% {\ifcase\digitsignmode#1\else \hbox {\setbox\scratchbox\hbox{0}% @@ -404,11 +404,11 @@ %D \digittemplate 12.000.000,00 % \digittemplate ., %D \stoptyping -\def\digittemplate #1 % +\unexpanded\def\digittemplate #1 % {\chardef\digitinputmode\zerocount \handletokens#1\with\scandigittemplate} -\def\scandigittemplate#1% +\unexpanded\def\scandigittemplate#1% {\if #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period \else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma \fi\fi} diff --git a/Master/texmf-dist/tex/context/base/m-scite.mkiv b/Master/texmf-dist/tex/context/base/m-scite.mkiv index aed2c26315d..7a8e8b06e6f 100644 --- a/Master/texmf-dist/tex/context/base/m-scite.mkiv +++ b/Master/texmf-dist/tex/context/base/m-scite.mkiv @@ -66,6 +66,8 @@ local f_mapping = [[ \let\string\slxR\string\letterrightbrace \let\string\slxM\string\letterdollar \let\string\slxV\string\letterbar +\let\string\slxU\string\letterhat +\let\string\slxD\string\letterunderscore \let\string\slxH\string\letterhash \let\string\slxB\string\letterbackslash \let\string\slxP\string\letterpercent @@ -76,6 +78,8 @@ local replacer = lpeg.replacer { ["{"] = "\\slxL ", ["}"] = "\\slxR ", ["$"] = "\\slxM ", + ["^"] = "\\slxU ", + ["_"] = "\\slxD ", ["|"] = "\\slxV ", ["#"] = "\\slxH ", ["\\"] = "\\slxB ", @@ -195,6 +199,7 @@ end \installscitecommands \tt \dontcomplain + \setcatcodetable\ctxcatcodes % needed in xml \startscite \getbuffer[lex]% \stopscite @@ -213,6 +218,7 @@ end \installscitecommands \tt \dontcomplain + \setcatcodetable\ctxcatcodes % needed in xml \startscite \getbuffer[lex]% \stopscite diff --git a/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv index 5e0499184bb..914a2b57a9e 100644 --- a/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv +++ b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv @@ -88,6 +88,8 @@ \unexpanded\def\doifelsespreadsheetcell {\dosingleempty\module_spreadsheet_doifelse_cell} +\let\doifspreadsheetcellelse\doifelsespreadsheetcell + \unexpanded\def\module_spreadsheet_doifelse_cell[#1]#2#3% {\ctxlua{moduledata.spreadsheets.doifelsecell("#1",\number#2,\number#3)}} @@ -118,7 +120,7 @@ \let\stoprow \module_spreadsheet_row_stop \let\startcell\module_spreadsheet_cell_start \let\stopcell \module_spreadsheet_cell_stop - \doifassignmentelse{#1} + \doifelseassignment{#1} {\module_spreadsheet_start \directsetup{spreadsheet:before:\currentspreadsheet}% \bTABLE[\c!align=\v!flushright,#1]} @@ -136,7 +138,7 @@ \unexpanded\def\module_spreadsheet_row_stop {\eTR} \unexpanded\def\module_spreadsheet_cell_start - {\doifnextoptionalelse\module_spreadsheet_cell_start_yes\module_spreadsheet_cell_start_nop} + {\doifelsenextoptional\module_spreadsheet_cell_start_yes\module_spreadsheet_cell_start_nop} \unexpanded\def\module_spreadsheet_cell_start_yes[#1]#2\stopcell {\bTD[#1]\getspr{#2}\eTD} diff --git a/Master/texmf-dist/tex/context/base/m-steps.lua b/Master/texmf-dist/tex/context/base/m-steps.lua index 97759b79917..8eb4815506e 100644 --- a/Master/texmf-dist/tex/context/base/m-steps.lua +++ b/Master/texmf-dist/tex/context/base/m-steps.lua @@ -10,7 +10,6 @@ if not modules then modules = { } end modules ['x-flow'] = { moduledata.steps = moduledata.steps or { } -local points = number.points -- number.pt local variables = interfaces.variables local trace_charts = false @@ -100,22 +99,22 @@ function commands.step_make_chart(settings) end -- context("text_line_color := \\MPcolor{%s} ;", textsettings.framecolor) - context("text_line_width := %s ;", points(textsettings.rulethickness)) + context("text_line_width := %p ;", textsettings.rulethickness) context("text_fill_color := \\MPcolor{%s} ;", textsettings.backgroundcolor) - context("text_offset := %s ;", points(textsettings.offset)) - context("text_distance_set := %s ;", points(textsettings.distance)) + context("text_offset := %p ;", textsettings.offset) + context("text_distance_set := %p ;", textsettings.distance) -- context("cell_line_color := \\MPcolor{%s} ;", cellsettings.framecolor) - context("cell_line_width := %s ;", points(cellsettings.rulethickness)) + context("cell_line_width := %p ;", cellsettings.rulethickness) context("cell_fill_color := \\MPcolor{%s} ;", cellsettings.backgroundcolor) - context("cell_offset := %s ;", points(cellsettings.offset)) - context("cell_distance_x := %s ;", points(cellsettings.dx)) - context("cell_distance_y := %s ;", points(cellsettings.dy)) + context("cell_offset := %p ;", cellsettings.offset) + context("cell_distance_x := %p ;", cellsettings.dx) + context("cell_distance_y := %p ;", cellsettings.dy) -- context("line_line_color := \\MPcolor{%s} ;", linesettings.color) - context("line_line_width := %s ;", points(linesettings.rulethickness)) - context("line_distance := %s ;", points(linesettings.distance)) - context("line_offset := %s ;", points(linesettings.offset)) + context("line_line_width := %p ;", linesettings.rulethickness) + context("line_distance := %p ;", linesettings.distance) + context("line_offset := %p ;", linesettings.offset) -- for i=1,#steps do local step = steps[i] diff --git a/Master/texmf-dist/tex/context/base/m-steps.mkvi b/Master/texmf-dist/tex/context/base/m-steps.mkvi index a07ece3ae8d..c9c5a063620 100644 --- a/Master/texmf-dist/tex/context/base/m-steps.mkvi +++ b/Master/texmf-dist/tex/context/base/m-steps.mkvi @@ -98,7 +98,7 @@ \def\module_steps_start_chart[#name][#settings]% {\startnointerference \iffirstargument - \doifassignmentelse{#name} + \doifelseassignment{#name} {\let\currentSTEPchart\empty \xdef\module_steps_flush_chart{\module_steps_chart[][#name]}} {\edef\currentSTEPchart{#name}% diff --git a/Master/texmf-dist/tex/context/base/m-translate.mkiv b/Master/texmf-dist/tex/context/base/m-translate.mkiv index f36f9a9fba2..2e6cbe95088 100644 --- a/Master/texmf-dist/tex/context/base/m-translate.mkiv +++ b/Master/texmf-dist/tex/context/base/m-translate.mkiv @@ -22,12 +22,34 @@ local compiled, list = nil, nil + -- function translators.register(from,to) + -- local l = lpeg.P(from)/to + -- if not list then + -- list = l + -- else + -- list = list + l + -- end + -- compiled = nil + -- end + -- + -- function translators.translate(s) + -- if list then + -- if not compiled then + -- compiled = lpeg.Cs((list + lpeg.P(1))^0) + -- end + -- return compiled:match(s) + -- else + -- return s + -- end + -- end + + -- local function prepare() + function translators.register(from,to) - local l = lpeg.P(from)/to if not list then - list = l + list = { [from] = to } else - list = list + l + list[from] = to end compiled = nil end @@ -35,7 +57,8 @@ function translators.translate(s) if list then if not compiled then - compiled = lpeg.Cs((list + lpeg.P(1))^0) + local tree = lpeg.utfchartabletopattern(list) + compiled = lpeg.Cs((tree/list + lpeg.patterns.utf8character)^0 * lpeg.P(-1)) -- the P(1) is needed in order to accept non utf end return compiled:match(s) else diff --git a/Master/texmf-dist/tex/context/base/m-visual.mkiv b/Master/texmf-dist/tex/context/base/m-visual.mkiv index 504c0d0c5f2..3c57691ec64 100644 --- a/Master/texmf-dist/tex/context/base/m-visual.mkiv +++ b/Master/texmf-dist/tex/context/base/m-visual.mkiv @@ -161,7 +161,7 @@ {\freezerandomseed \let\endstrut\relax \let\begstrut\relax - \doifinsetelse{#1}{\v!left,\v!right} + \doifelseinset{#1}{\v!left,\v!right} {\fakewords{2}{4}} {\fakewords{4}{10}}}% {\doifinset{#1}{\v!left,\v!right} @@ -762,7 +762,7 @@ \startoverlay {\copy\scratchbox} {\dodotagbox{#1}\scratchbox{\framed - [\c!background=\v!screen,\c!backgroundscreen=1]{#2}}} + [\c!background=\v!color,\c!backgroundcolor=\v!gray]{#2}}} \stopoverlay \egroup \nextboxwd\the\wd\scratchbox diff --git a/Master/texmf-dist/tex/context/base/math-act.lua b/Master/texmf-dist/tex/context/base/math-act.lua index 879480dce59..d0ea789909c 100644 --- a/Master/texmf-dist/tex/context/base/math-act.lua +++ b/Master/texmf-dist/tex/context/base/math-act.lua @@ -90,6 +90,8 @@ end sequencers.appendaction("mathparameters","system","mathematics.scaleparameters") +-- AccentBaseHeight vs FlattenedAccentBaseHeight + function mathematics.checkaccentbaseheight(target,original) local mathparameters = target.mathparameters if mathparameters and mathparameters.AccentBaseHeight == 0 then @@ -103,15 +105,23 @@ function mathematics.checkprivateparameters(target,original) local mathparameters = target.mathparameters if mathparameters then local parameters = target.parameters + local properties = target.properties if parameters then - if not mathparameters.FractionDelimiterSize then - mathparameters.FractionDelimiterSize = 1.01 * parameters.size - end - if not mathparameters.FractionDelimiterDisplayStyleSize then - mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * parameters.size + local size = parameters.size + if size then + if not mathparameters.FractionDelimiterSize then + mathparameters.FractionDelimiterSize = 1.01 * size + end + if not mathparameters.FractionDelimiterDisplayStyleSize then + mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * size + end + elseif properties then + report_math("invalid parameters in font %a",properties.fullname or "?") + else + report_math("invalid parameters in font") end - elseif target.properties then - report_math("no parameters in font %a",target.properties.fullname or "?") + elseif properties then + report_math("no parameters in font %a",properties.fullname or "?") else report_math("no parameters and properties in font") end @@ -465,21 +475,17 @@ setmetatableindex(extensibles,function(extensibles,font) return codes end) -function mathematics.extensiblecode(family,unicode) +local function extensiblecode(family,unicode) return extensibles[family_font(family or 0)][unicode][1] end -function commands.extensiblecode(family,unicode) - context(extensibles[family_font(family or 0)][unicode][1]) -end - -- left : [head] ... -- right : ... [head] -- horizontal : [head] ... [head] -- -- abs(right["start"] - right["end"]) | right.advance | characters[right.glyph].width -function commands.horizontalcode(family,unicode) +local function horizontalcode(family,unicode) local font = family_font(family or 0) local data = extensibles[font][unicode] local kind = data[1] @@ -503,13 +509,30 @@ function commands.horizontalcode(family,unicode) loffset = abs((left ["start"] or 0) - (left ["end"] or 0)) roffset = abs((right["start"] or 0) - (right["end"] or 0)) end - else end - texsetdimen("scratchleftoffset",loffset) - texsetdimen("scratchrightoffset",roffset) - context(kind) + return kind, loffset, roffset end +mathematics.extensiblecode = extensiblecode +mathematics.horizontalcode = horizontalcode + +interfaces.implement { + name = "extensiblecode", + arguments = { "integer", "integer" }, + actions = { extensiblecode, context } +} + +interfaces.implement { + name = "horizontalcode", + arguments = { "integer", "integer" }, + actions = function(family,unicode) + local kind, loffset, roffset = horizontalcode(family,unicode) + texsetdimen("scratchleftoffset", loffset) + texsetdimen("scratchrightoffset",roffset) + context(kind) + end +} + -- experiment -- check: when true, only set when present in font @@ -517,85 +540,6 @@ end local blocks = characters.blocks -- this will move to char-ini -blocks["uppercasenormal"] = { first = 0x00041, last = 0x0005A } -blocks["uppercasebold"] = { first = 0x1D400, last = 0x1D419 } -blocks["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D } -blocks["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481 } -blocks["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5 } -blocks["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9 } -blocks["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D } -blocks["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551 } -blocks["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585 } -blocks["uppercasesansserifnormal"] = { first = 0x1D5A0, last = 0x1D5B9 } -blocks["uppercasesansserifbold"] = { first = 0x1D5D4, last = 0x1D5ED } -blocks["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621 } -blocks["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655 } -blocks["uppercasemonospace"] = { first = 0x1D670, last = 0x1D689 } -blocks["uppercasegreeknormal"] = { first = 0x00391, last = 0x003AA } -blocks["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1 } -blocks["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB } -blocks["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735 } -blocks["uppercasegreeksansserifbold"] = { first = 0x1D756, last = 0x1D76F } -blocks["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9 } - -blocks["lowercasenormal"] = { first = 0x00061, last = 0x0007A } -blocks["lowercasebold"] = { first = 0x1D41A, last = 0x1D433 } -blocks["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467 } -blocks["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B } -blocks["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF } -blocks["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503 } -blocks["lowercasefraktur"] = { first = 0x1D51E, last = 0x1D537 } -blocks["lowercasedoublestruck"] = { first = 0x1D552, last = 0x1D56B } -blocks["lowercaseboldfraktur"] = { first = 0x1D586, last = 0x1D59F } -blocks["lowercasesansserifnormal"] = { first = 0x1D5BA, last = 0x1D5D3 } -blocks["lowercasesansserifbold"] = { first = 0x1D5EE, last = 0x1D607 } -blocks["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B } -blocks["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F } -blocks["lowercasemonospace"] = { first = 0x1D68A, last = 0x1D6A3 } -blocks["lowercasegreeknormal"] = { first = 0x003B1, last = 0x003CA } -blocks["lowercasegreekbold"] = { first = 0x1D6C2, last = 0x1D6DB } -blocks["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715 } -blocks["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F } -blocks["lowercasegreeksansserifbold"] = { first = 0x1D770, last = 0x1D789 } -blocks["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3 } - -blocks["digitsnormal"] = { first = 0x00030, last = 0x00039 } -blocks["digitsbold"] = { first = 0x1D7CE, last = 0x1D7D8 } -blocks["digitsdoublestruck"] = { first = 0x1D7D8, last = 0x1D7E2 } -blocks["digitssansserifnormal"] = { first = 0x1D7E2, last = 0x1D7EC } -blocks["digitssansserifbold"] = { first = 0x1D7EC, last = 0x1D805 } -blocks["digitsmonospace"] = { first = 0x1D7F6, last = 0x1D80F } - -blocks["mathematicaloperators"] = { first = 0x02200, last = 0x022FF } -blocks["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF } -blocks["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF } -blocks["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF } -blocks["letterlikesymbols"] = { first = 0x02100, last = 0x0214F } -blocks["miscellaneoustechnical"] = { first = 0x02308, last = 0x0230B } -blocks["geometricshapes"] = { first = 0x025A0, last = 0x025FF } -blocks["miscellaneoussymbolsandarrows"] = { first = 0x02B30, last = 0x02B4C } -blocks["mathematicalalphanumericsymbols"] = { first = 0x00400, last = 0x1D7FF } - -blocks["digitslatin"] = { first = 0x00030, last = 0x00039 } -blocks["digitsarabicindic"] = { first = 0x00660, last = 0x00669 } -blocks["digitsextendedarabicindic"] = { first = 0x006F0, last = 0x006F9 } -------["digitsdevanagari"] = { first = 0x00966, last = 0x0096F } -------["digitsbengali"] = { first = 0x009E6, last = 0x009EF } -------["digitsgurmukhi"] = { first = 0x00A66, last = 0x00A6F } -------["digitsgujarati"] = { first = 0x00AE6, last = 0x00AEF } -------["digitsoriya"] = { first = 0x00B66, last = 0x00B6F } -------["digitstamil"] = { first = 0x00030, last = 0x00039 } -- no zero -------["digitstelugu"] = { first = 0x00C66, last = 0x00C6F } -------["digitskannada"] = { first = 0x00CE6, last = 0x00CEF } -------["digitsmalayalam"] = { first = 0x00D66, last = 0x00D6F } -------["digitsthai"] = { first = 0x00E50, last = 0x00E59 } -------["digitslao"] = { first = 0x00ED0, last = 0x00ED9 } -------["digitstibetan"] = { first = 0x00F20, last = 0x00F29 } -------["digitsmyanmar"] = { first = 0x01040, last = 0x01049 } -------["digitsethiopic"] = { first = 0x01369, last = 0x01371 } -------["digitskhmer"] = { first = 0x017E0, last = 0x017E9 } -------["digitsmongolian"] = { first = 0x01810, last = 0x01809 } - -- operators : 0x02200 -- symbolsa : 0x02701 -- symbolsb : 0x02901 diff --git a/Master/texmf-dist/tex/context/base/math-ali.mkiv b/Master/texmf-dist/tex/context/base/math-ali.mkiv index 6bfde57b6f3..bba55ba72c4 100644 --- a/Master/texmf-dist/tex/context/base/math-ali.mkiv +++ b/Master/texmf-dist/tex/context/base/math-ali.mkiv @@ -31,6 +31,8 @@ \newtoks\c_math_align_b \newtoks\c_math_align_c +\def\displayopenupvalue{.25\bodyfontsize} + \def\math_build_eqalign {\scratchtoks\emptytoks \dorecurse{\mathalignmentparameter\c!m}\math_build_eqalign_step @@ -38,19 +40,25 @@ \def\math_build_eqalign_step {\ifnum\recurselevel>\plusone - %\appendtoks - % \tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint - %\to\scratchtoks \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint}% \fi \normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_a}}% \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax} {\normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_b}}}} -\def\math_math_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks\displaystyle{{}#1{}}$} -\def\math_text_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks#1$} +\def\math_math_in_eqalign#1% + {\startforceddisplaymath + \tabskip\zeropoint + \everycr\emptytoks + {{}#1{}}% + \stopforceddisplaymath} -\def\displayopenupvalue{.25\bodyfontsize} +\def\math_text_in_eqalign#1% + {\startimath + \tabskip\zeropoint + \everycr\emptytoks + #1% + \stopimath} \def\eqalign#1% why no halign here, probably because of displaywidth {\emptyhbox @@ -58,7 +66,15 @@ \vcenter {\math_openup\displayopenupvalue % was: \openup\jot \mathsurround\zeropoint - \ialign{\strut\hfil$\displaystyle{\alignmark\alignmark}$\aligntab$\displaystyle{{}\alignmark\alignmark{}}$\hfil\crcr#1\crcr}}% + \ialign{% + \strut + \hfil + \startforceddisplaymath{\alignmark\alignmark}\stopforceddisplaymath + \aligntab + \startforceddisplaymath{{}\alignmark\alignmark{}}\stopforceddisplaymath + \hfil\crcr + #1\crcr}% + }% \mskip\thinmuskip} % preamble is scanned for tabskips so we need the span to prevent an error message @@ -257,7 +273,7 @@ % -\def\numberedeqalign +\unexpanded\def\numberedeqalign {\doifelse{\formulaparameter\c!location}\v!left \math_handle_eqalign_no_l_aligned \math_handle_eqalign_no_r_aligned} @@ -605,16 +621,27 @@ {\iffirstargument \setupcurrentmathmatrix[#1]% \fi - \emptyhbox + % \emptyhbox % noted at 25-05-2014: what was that one doing here? it messed up spacing \math_matrix_align_method_analyze \mathmatrixleft + % new per 13-10-2014 + \edef\p_strut{\mathmatrixparameter\c!strut}% + \ifx\p_strut\v!no + \let\m_matrix_strut\relax + \else + \let\m_matrix_strut\strut + \ifx\p_strut\v!yes\else + \spacing\p_strut + \fi + \fi + % \mathmatrixbox\bgroup \pushmacro\math_matrix_NC \let\endmath\relax \def\NC{\math_matrix_NC}% \def\MC{\math_matrix_NC\ifmmode\else\startimath\let\endmath\stopimath\fi}% \global\let\math_matrix_NC\math_matrix_NC_indeed - \def\NR{\endmath\global\let\math_matrix_NC\math_matrix_NC_indeed\crcr}% + \def\NR{\endmath\global\let\math_matrix_NC\math_matrix_NC_indeed\m_matrix_strut \crcr}% \normalbaselines \mathsurround\zeropoint \everycr\emptytoks @@ -700,7 +727,7 @@ %D %D \typebuffer \getbuffer %D -%D \definemathmatrix[bmatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]}] +%D \definemathmatrix[bmatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]},strut=1.25] %D %D \startbuffer %D \placeformula \startformula[-] \startbmatrix @@ -1024,8 +1051,7 @@ \strc_formulas_place_number \setbox\scratchbox\math_hbox to \displaywidth\bgroup \mathinnerstrut - $% - \displaystyle + \startforceddisplaymath \ifcase\mathraggedstatus\or\hfill\or\hfill\fi} \def\math_box_llapped_math_no @@ -1047,7 +1073,7 @@ \fi} \unexpanded\def\stopmathbox - {$% + {\stopforceddisplaymath \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi \egroup \setbox0\hbox{\unhcopy\scratchbox}% diff --git a/Master/texmf-dist/tex/context/base/math-arr.mkiv b/Master/texmf-dist/tex/context/base/math-arr.mkiv index 6824c362e67..0e3a53f3219 100644 --- a/Master/texmf-dist/tex/context/base/math-arr.mkiv +++ b/Master/texmf-dist/tex/context/base/math-arr.mkiv @@ -63,7 +63,7 @@ \setvalue{\??matharrowsettings\v!big }{\def\m_math_arrows_extra{20}} \setvalue{\??matharrowsettings\v!normal }{} \setvalue{\??matharrowsettings }{} -\setvalue{\??matharrowsettings\s!unknown}{\doifnumberelse\p_math_spacing{\let\m_math_arrows_extra\p_math_spacing}\donothing} +\setvalue{\??matharrowsettings\s!unknown}{\doifelsenumber\p_math_spacing{\let\m_math_arrows_extra\p_math_spacing}\donothing} \def\math_arrows_construct#1#2#3#4#5% hm, looks like we do a double mathrel (a bit cleaned up .. needs checking) {\begingroup diff --git a/Master/texmf-dist/tex/context/base/math-def.mkiv b/Master/texmf-dist/tex/context/base/math-def.mkiv index 25098695902..0888081f065 100644 --- a/Master/texmf-dist/tex/context/base/math-def.mkiv +++ b/Master/texmf-dist/tex/context/base/math-def.mkiv @@ -30,6 +30,9 @@ \definemathcommand [arccos] [nolop] {\mfunctionlabeltext{arccos}} \definemathcommand [arcsin] [nolop] {\mfunctionlabeltext{arcsin}} \definemathcommand [arctan] [nolop] {\mfunctionlabeltext{arctan}} +\definemathcommand [acos] [nolop] {\mfunctionlabeltext{acos}} +\definemathcommand [asin] [nolop] {\mfunctionlabeltext{asin}} +\definemathcommand [atan] [nolop] {\mfunctionlabeltext{atan}} \definemathcommand [arg] [nolop] {\mfunctionlabeltext{arg}} \definemathcommand [cosh] [nolop] {\mfunctionlabeltext{cosh}} \definemathcommand [cos] [nolop] {\mfunctionlabeltext{cos}} diff --git a/Master/texmf-dist/tex/context/base/math-dir.lua b/Master/texmf-dist/tex/context/base/math-dir.lua index bcc5461e976..0f871beede2 100644 --- a/Master/texmf-dist/tex/context/base/math-dir.lua +++ b/Master/texmf-dist/tex/context/base/math-dir.lua @@ -33,7 +33,6 @@ local getid = nuts.getid local getlist = nuts.getlist local setfield = nuts.setfield local getattr = nuts.getattr -local setattr = nuts.setattr local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after @@ -163,4 +162,8 @@ function directions.setmath(n) end end -commands.setmathdirection = directions.setmath +interfaces.implement { + name = "setmathdirection", + actions = directions.setmath, + arguments = "integer" +} diff --git a/Master/texmf-dist/tex/context/base/math-fbk.lua b/Master/texmf-dist/tex/context/base/math-fbk.lua index 70a8ae8d61c..76dd1ad9b1a 100644 --- a/Master/texmf-dist/tex/context/base/math-fbk.lua +++ b/Master/texmf-dist/tex/context/base/math-fbk.lua @@ -20,7 +20,6 @@ local virtualcharacters = { } local identifiers = fonts.hashes.identifiers local lastmathids = fonts.hashes.lastmathids -local tounicode16 = fonts.mappings.tounicode16 -- we need a trick (todo): if we define scriptscript, script and text in -- that order we could use their id's .. i.e. we could always add a font @@ -190,12 +189,12 @@ virtualcharacters[0x207B] = function(data) end virtualcharacters[0x208A] = function(data) - data.replacement = 0x2212 + data.replacement = 0x002B return raised(data,true) end virtualcharacters[0x208B] = function(data) - data.replacement = 0x002B + data.replacement = 0x2212 return raised(data,true) end @@ -330,7 +329,7 @@ end -- we could move the defs from math-act here -local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset) +local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset,unicode) local characters = target.characters local olddata = characters[oldchr] -- brrr ... pagella has only next @@ -350,6 +349,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s width = olddata.width, height = height, depth = depth, + unicode = unicode, } local glyphdata = newdata local nextglyph = olddata.next @@ -415,7 +415,7 @@ virtualcharacters[0x203E] = function(data) -- could be FE33E instead height = target.parameters.xheight/4 depth = height end - return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth) + return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth,nil,nil,0x203E) end virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient @@ -426,37 +426,37 @@ local function smashed(data,unicode,swap,private) local original = data.original local chardata = target.characters[unicode] if chardata and chardata.height > target.parameters.xheight then - return accent_to_extensible(target,private,original,unicode,0,0,swap) + return accent_to_extensible(target,private,original,unicode,0,0,swap,nil,unicode) else return original.characters[unicode] end end -addextra(0xFE3DE, { description="EXTENSIBLE OF 0x03DE", unicodeslot=0xFE3DE, mathextensible = "r", mathstretch = "h" } ) -addextra(0xFE3DC, { description="EXTENSIBLE OF 0x03DC", unicodeslot=0xFE3DC, mathextensible = "r", mathstretch = "h" } ) -addextra(0xFE3B4, { description="EXTENSIBLE OF 0x03B4", unicodeslot=0xFE3B4, mathextensible = "r", mathstretch = "h" } ) +addextra(0xFE3DE, { description="EXTENSIBLE OF 0x03DE", unicodeslot=0xFE3DE, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) +addextra(0xFE3DC, { description="EXTENSIBLE OF 0x03DC", unicodeslot=0xFE3DC, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) +addextra(0xFE3B4, { description="EXTENSIBLE OF 0x03B4", unicodeslot=0xFE3B4, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) virtualcharacters[0xFE3DE] = function(data) return smashed(data,0x23DE,0x23DF,0xFE3DE) end virtualcharacters[0xFE3DC] = function(data) return smashed(data,0x23DC,0x23DD,0xFE3DC) end virtualcharacters[0xFE3B4] = function(data) return smashed(data,0x23B4,0x23B5,0xFE3B4) end -addextra(0xFE3DF, { description="EXTENSIBLE OF 0x03DF", unicodeslot=0xFE3DF, mathextensible = "r", mathstretch = "h" } ) -addextra(0xFE3DD, { description="EXTENSIBLE OF 0x03DD", unicodeslot=0xFE3DD, mathextensible = "r", mathstretch = "h" } ) -addextra(0xFE3B5, { description="EXTENSIBLE OF 0x03B5", unicodeslot=0xFE3B5, mathextensible = "r", mathstretch = "h" } ) +addextra(0xFE3DF, { description="EXTENSIBLE OF 0x03DF", unicodeslot=0xFE3DF, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) +addextra(0xFE3DD, { description="EXTENSIBLE OF 0x03DD", unicodeslot=0xFE3DD, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) +addextra(0xFE3B5, { description="EXTENSIBLE OF 0x03B5", unicodeslot=0xFE3B5, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) -virtualcharacters[0xFE3DF] = function(data) return data.target.characters[0x23DF] end -virtualcharacters[0xFE3DD] = function(data) return data.target.characters[0x23DD] end -virtualcharacters[0xFE3B5] = function(data) return data.target.characters[0x23B5] end +virtualcharacters[0xFE3DF] = function(data) local c = data.target.characters[0x23DF] if c then c.unicode = 0x23DF return c end end +virtualcharacters[0xFE3DD] = function(data) local c = data.target.characters[0x23DD] if c then c.unicode = 0x23DD return c end end +virtualcharacters[0xFE3B5] = function(data) local c = data.target.characters[0x23B5] if c then c.unicode = 0x23B5 return c end end -- todo: add some more .. numbers might change -addextra(0xFE302, { description="EXTENSIBLE OF 0x0302", unicodeslot=0xFE302, mathstretch = "h" } ) -addextra(0xFE303, { description="EXTENSIBLE OF 0x0303", unicodeslot=0xFE303, mathstretch = "h" } ) +addextra(0xFE302, { description="EXTENSIBLE OF 0x0302", unicodeslot=0xFE302, mathstretch = "h", mathclass = "topaccent" } ) +addextra(0xFE303, { description="EXTENSIBLE OF 0x0303", unicodeslot=0xFE303, mathstretch = "h", mathclass = "topaccent" } ) local function smashed(data,unicode,private) local target = data.target local height = target.parameters.xheight / 2 - local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height) + local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height,unicode) if done then c.top_accent = nil -- or maybe also all the others end @@ -467,15 +467,21 @@ virtualcharacters[0xFE302] = function(data) return smashed(data,0x0302,0xFE302) virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) end -- another crazy hack .. doesn't work as we define scrscr first .. we now have smaller --- primes so we have smaller primes for the moment, big ones will become an option +-- primes so we have smaller primes for the moment, big ones will become an option .. +-- these primes in fonts are a real mess .. kind of a dead end, so don't wonder about +-- the values below + +-- todo: check tounicodes local function smashed(data,unicode,optional) local oldchar = data.characters[unicode] if oldchar then - local height = 1.2 * data.target.parameters.xheight + local xheight = data.target.parameters.xheight + local height = 1.2 * xheight + local shift = oldchar.height - height local newchar = { commands = { - { "down", oldchar.height - height }, + { "down", shift }, { "char", unicode }, }, height = height, @@ -487,6 +493,30 @@ local function smashed(data,unicode,optional) end end +-- -- relocate all but less flexible so not used .. instead some noad hackery plus +-- -- the above +-- +-- local function smashed(data,unicode,optional) +-- local oldchar = data.characters[unicode] +-- if oldchar then +-- local xheight = data.target.parameters.xheight +-- local height = oldchar.height +-- local shift = oldchar.height < 1.5*xheight and -(1.8*xheight-height) or 0 +-- local newchar = { +-- commands = { +-- { "down", shift }, +-- { "char", unicode }, +-- }, +-- unicode = unicode, +-- height = height, +-- width = oldchar.width, +-- } +-- return newchar +-- elseif not optional then +-- report_fallbacks("missing %U prime in font %a",unicode,data.target.properties.fullname) +-- end +-- end + addextra(0xFE932, { description="SMASHED PRIME 0x02032", unicodeslot=0xFE932 } ) addextra(0xFE933, { description="SMASHED PRIME 0x02033", unicodeslot=0xFE933 } ) addextra(0xFE934, { description="SMASHED PRIME 0x02034", unicodeslot=0xFE934 } ) @@ -520,7 +550,7 @@ local function actuarian(data) -- todo: add alttext -- compromise: lm has large hooks e.g. \actuarial{a} width = basewidth + 4 * linewidth, - tounicode = tounicode16(0x20E7), + unicode = 0x20E7, commands = { { "right", 2 * linewidth }, { "down", - baseheight - 3 * linewidth }, diff --git a/Master/texmf-dist/tex/context/base/math-frc.lua b/Master/texmf-dist/tex/context/base/math-frc.lua index 4f531a5307a..639edc94ba3 100644 --- a/Master/texmf-dist/tex/context/base/math-frc.lua +++ b/Master/texmf-dist/tex/context/base/math-frc.lua @@ -25,13 +25,13 @@ table.setmetatableindex(resolved, function(t,k) return v end) -local normalatop = context.normalatop -local normalover = context.normalover +local ctx_normalatop = context.normalatop +local ctx_normalover = context.normalover -function commands.math_frac(how,left,right,width) - if how == v_no then +local function mathfraction(how,left,right,width) -- of course we could use the scanners directly here which + if how == v_no then -- is faster but also less abstract ... maybe some day if left == 0x002E and right == 0x002E then - normalatop() + ctx_normalatop() else context("\\atopwithdelims%s%s",resolved[left],resolved[right]) end @@ -43,9 +43,15 @@ function commands.math_frac(how,left,right,width) end else -- v_auto if left == 0x002E and right == 0x002E then - normalover() + ctx_normalover() else context("\\overwithdelims%s%s",resolved[left],resolved[right]) end end end + +interfaces.implement { + name = "mathfraction", + actions = mathfraction, + arguments = { "string", "number", "number", "dimen" } +} diff --git a/Master/texmf-dist/tex/context/base/math-frc.mkiv b/Master/texmf-dist/tex/context/base/math-frc.mkiv index 7032c665b08..cbe342b6608 100644 --- a/Master/texmf-dist/tex/context/base/math-frc.mkiv +++ b/Master/texmf-dist/tex/context/base/math-frc.mkiv @@ -15,7 +15,14 @@ \unprotect -%D todo: struts ... depends on demand +%D I need to check it all again as there was a bug in luatex with dimensions that could +%D resulted in side effects that made me mess with spacing. + +\unexpanded\def\topstrut{\vrule\s!width\zeropoint\s!height\strutht\s!depth\zeropoint\relax} +\unexpanded\def\botstrut{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\strutdp\relax} + +\unexpanded\def\mathtopstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\ht\scratchbox\s!depth\zeropoint\relax} +\unexpanded\def\mathbotstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\dp\scratchbox\relax} %D This module is reimplemented in \MKIV\ style. @@ -106,6 +113,7 @@ \c!rulethickness=.25\exheight, \c!left=0x2E, \c!right=0x2E, + \c!strut=\v!yes, \c!topdistance=, \c!bottomdistance=, \c!rule=\v!auto] @@ -122,6 +130,8 @@ \math_fraction_set_distance \to \everymathematics +% why only displaystyle .. a bit weak + \unexpanded\def\math_fraction_set_distance_top {\Umathfractionnumup \displaystyle\m_math_fraction_distance_top \relax} @@ -157,13 +167,43 @@ % So far for control. +\installcorenamespace{mathfractionstrut} + +\setvalue{\??mathfractionstrut\v!yes}% + {\let\m_fractions_strut_top\mathstrut + \let\m_fractions_strut_bot\mathstrut} + +\setvalue{\??mathfractionstrut\v!math}% + {\let\m_fractions_strut_top\mathstrut + \let\m_fractions_strut_bot\mathstrut} + +\setvalue{\??mathfractionstrut\v!no}% + {\let\m_fractions_strut_top\relax + \let\m_fractions_strut_bot\relax} + +\setvalue{\??mathfractionstrut\v!tight}% + {\let\m_fractions_strut_top\mathbotstrut % indeed swapped name + \let\m_fractions_strut_bot\mathtopstrut} % indeed swapped name + +\let\m_fractions_strut_top\relax +\let\m_fractions_strut_bot\relax + \newdimen\d_math_fraction_margin \unexpanded\def\math_frac#1% {\begingroup \edef\currentmathfraction{#1}% + % \d_math_fraction_margin\mathfractionparameter\c!margin + % \edef\p_math_fractions_color{\mathfractionparameter\c!color}% + % + \edef\p_math_fractions_strut{\mathfractionparameter\c!strut}% + \csname + \??mathfractionstrut + \ifcsname\??mathfractionstrut\p_math_fractions_strut\endcsname\p_math_fractions_strut\else\v!no\fi + \endcsname + % \ifx\p_math_fractions_color\empty \expandafter\math_frac_normal \else @@ -181,18 +221,17 @@ % we use utfchar anyway so we can as well do all at the lua end \def\math_frac_command - {\ctxcommand{math_frac(% - "\mathfractionparameter\c!rule",% - \number\mathfractionparameter\c!left,% - \number\mathfractionparameter\c!right,% - \number\dimexpr\mathfractionparameter\c!rulethickness% - )}} - -% Having a \withmarginornot{#1}{#2} makes not much sense nor do -% 4 tests or 4 redundant kerns (longer node lists plus possible -% interference). A split in normal and margin also makes testing -% easier. When left and right margins are needed we might merge -% the variants again. After all, these are not real installers. + {\clf_mathfraction + {\mathfractionparameter\c!rule}% + \mathfractionparameter\c!left\space + \mathfractionparameter\c!right\space + \dimexpr\mathfractionparameter\c!rulethickness\relax + \relax} + +% Having a \withmarginornot{#1}{#2} makes not much sense nor do 4 tests or 4 redundant +% kerns (longer node lists plus possible interference). A split in normal and margin +% also makes testing easier. When left and right margins are needed we might merge the +% variants again. After all, these are not real installers. \setvalue{\??mathfractionalternative\v!inner}% {\ifcase\d_math_fraction_margin @@ -201,24 +240,6 @@ \expandafter\math_fraction_inner_margin \fi} -\def\math_fraction_inner_normal#1#2% - {\Ustack{% - {\usemathstyleparameter\mathfractionparameter{#1}}% we should store this one - \math_frac_command - {\usemathstyleparameter\mathfractionparameter{#2}}% and reuse it here - }\endgroup} - -\def\math_fraction_inner_margin#1#2% - {\Ustack{% - {\kern\d_math_fraction_margin - \usemathstyleparameter\mathfractionparameter{#1}% we should store this one - \kern\d_math_fraction_margin}% - \math_frac_command - {\kern\d_math_fraction_margin - \usemathstyleparameter\mathfractionparameter{#2}% and reuse it here - \kern\d_math_fraction_margin}% - }\endgroup} - \setvalue{\??mathfractionalternative\v!outer}% {\ifcase\d_math_fraction_margin \expandafter\math_fraction_outer_normal @@ -226,21 +247,84 @@ \expandafter\math_fraction_outer_margin \fi} +\setvalue{\??mathfractionalternative\v!both}% + {\ifcase\d_math_fraction_margin + \expandafter\math_fraction_both_normal + \else + \expandafter\math_fraction_both_margin + \fi} + +% todo: store first state and reuse second time + +\def\math_fraction_inner_normal#1#2% + {\Ustack{% + {% + {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}}% + \math_frac_command + {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}}% + }% + }\endgroup} + \def\math_fraction_outer_normal#1#2% {\Ustack{% \usemathstyleparameter\mathfractionparameter - {{#1}\math_frac_command{#2}}% + {% + {\m_fractions_strut_top#1}% + \math_frac_command + {\m_fractions_strut_bot#2}% + }% + }\endgroup} + +\def\math_fraction_both_normal#1#2% + {\Ustack{% + \usemathstyleparameter\mathfractionparameter + {% + {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1}% + \math_frac_command + {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2}% + }% + }\endgroup} + +\def\math_fraction_inner_margin#1#2% + {\Ustack{% + {% + {\kern\d_math_fraction_margin + \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}% + \kern\d_math_fraction_margin}% + \math_frac_command + {\kern\d_math_fraction_margin + \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}% + \kern\d_math_fraction_margin}% + }% }\endgroup} \def\math_fraction_outer_margin#1#2% {\Ustack{% \usemathstyleparameter\mathfractionparameter - {{\kern\d_math_fraction_margin#1\kern\d_math_fraction_margin}% - \math_frac_command - {\kern\d_math_fraction_margin#2\kern\d_math_fraction_margin}}% + {% + {\kern\d_math_fraction_margin + \m_fractions_strut_top#1% + \kern\d_math_fraction_margin}% + \math_frac_command + {\kern\d_math_fraction_margin + \m_fractions_strut_bot#2% + \kern\d_math_fraction_margin}% + }% }\endgroup} -\definemathfraction[frac][\c!mathstyle=] +\def\math_fraction_both_margin#1#2% + {\Ustack{% + \usemathstyleparameter\mathfractionparameter + {% + {\kern\d_math_fraction_margin + \usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1% + \kern\d_math_fraction_margin}% + \math_frac_command + {\kern\d_math_fraction_margin + \usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2% + \kern\d_math_fraction_margin}% + }% + }\endgroup} \unexpanded\def\xfrac {\begingroup\let\xfrac\xxfrac\math_frac_alternative\scriptstyle} \unexpanded\def\xxfrac{\begingroup \math_frac_alternative\scriptscriptstyle} @@ -251,6 +335,40 @@ {\begingroup \math_frac_alternative\scriptscriptstyle{#1}{\raise.25\exheight\hbox{$\scriptscriptstyle#2$}}} +%D Spacing: + +\unexpanded\def\nomathfractiongaps {\normalexpanded{\math_no_fraction_gaps \triggermathstyle\mathstyle}} % maybe collect settings +\unexpanded\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\triggermathstyle\mathstyle}} % maybe collect settings + +\unexpanded\def\math_no_fraction_gaps#1% + {\Umathfractionnumup #1\zeropoint + \Umathfractiondenomdown#1\zeropoint} + +\unexpanded\def\math_overlay_fraction_gaps#1% + {\Umathfractionnumup #1\zeropoint + \Umathfractionnumvgap #1\zeropoint + %Umathfractionrule #1\zeropoint + \Umathfractiondenomvgap#1\zeropoint + \Umathfractiondenomdown#1\zeropoint} + +\installcorenamespace{mathfractiondistance} + +\letvalue{\??mathfractiondistance\v!none }\nomathfractiongaps +\letvalue{\??mathfractiondistance\v!no }\nomathfractiongaps +\letvalue{\??mathfractiondistance\v!overlay}\overlaymathfractiongaps + +\setupmathfractions + [\c!distance=\v!none] + +\appendtoks + \edef\p_distance{\rootmathfractionparameter\c!distance}% + \ifx\p_distance\empty\else + \ifcsname\??mathfractiondistance\p_distance\endcsname + \csname\??mathfractiondistance\p_distance\endcsname + \fi + \fi +\to \everymathematics + %D \macros %D {dfrac, tfrac, frac, dbinom, tbinom, binom} %D @@ -277,9 +395,36 @@ % \unexpanded\def\dfrac #1#2{{\displaystyle {{#1}\normalover {#2}}}} % \unexpanded\def\tfrac #1#2{{\textstyle {{#1}\normalover {#2}}}} -\definemathfraction[dfrac][\c!alternative=\v!outer,\c!mathstyle=\s!display] -\definemathfraction[tfrac][\c!alternative=\v!outer,\c!mathstyle=\s!text] -\definemathfraction[sfrac][\c!alternative=\v!outer,\c!mathstyle=\s!script] +\definemathfraction[i:frac] [\c!alternative=\v!inner,\c!mathstyle=] % was script and then small but nothing needed +\definemathfraction[i:tfrac][\c!alternative=\v!inner,\c!mathstyle=\s!text] % was script (before luatex fix) +\definemathfraction[i:sfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript] +\definemathfraction[i:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display] + +\definemathfraction[d:frac] [\c!alternative=\v!inner,\c!mathstyle=\s!cramped] % was cramped,text +\definemathfraction[d:tfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!text}] % was cramped,script (before luatex fix) +\definemathfraction[d:sfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!scriptscript}] +\definemathfraction[d:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display] + +%D \unexpanded\def\ShowMathFractions#1#2% +%D {\dontleavehmode +%D \begingroup +%D \showmathstruts +%D \mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}% +%D \endgroup} +%D +%D The default \type {tfrac}, \type {frac} and \type \sfrac} look like this: +%D +%D \blank +%D \ShowMathFractions{a}{a}\par +%D \ShowMathFractions{1}{x}\par +%D \ShowMathFractions{a}{b}\par +%D \ShowMathFractions{1}{b}\par +%D \blank + +\unexpanded\def\frac {\csname\inlineordisplaymath id:frac\endcsname} +\unexpanded\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname} +\unexpanded\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname} +\unexpanded\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname} % \definemathfraction[ddfrac][\c!mathstyle=\s!display] % \definemathfraction[ttfrac][\c!mathstyle=\s!text] @@ -319,7 +464,7 @@ %D \getbuffer \unexpanded\def\cfrac - {\doifnextoptionalcselse\math_cfrac_yes\math_cfrac_nop} + {\doifelsenextoptionalcs\math_cfrac_yes\math_cfrac_nop} \def\math_cfrac_nop {\math_cfrac_indeed[cc]} \def\math_cfrac_yes[#1]{\math_cfrac_indeed[#1cc]} @@ -364,6 +509,11 @@ \unexpanded\def\splitdfrac#1#2% {{\displaystyle{{ #1\quad\hfill}\normalabove\zeropoint{ \hfill\quad\mathstrut#2}}}} +%D For testing: + +% \unexpanded\def\ShowMathFractions#1#2% +% {\mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}} + \protect \endinput % I have no clue what \mthfrac and \mthsqrt are supposed to do but diff --git a/Master/texmf-dist/tex/context/base/math-ini.lua b/Master/texmf-dist/tex/context/base/math-ini.lua index 9772ce5389d..88159e10746 100644 --- a/Master/texmf-dist/tex/context/base/math-ini.lua +++ b/Master/texmf-dist/tex/context/base/math-ini.lua @@ -18,30 +18,33 @@ if not modules then modules = { } end modules ['math-ini'] = { local formatters, find = string.formatters, string.find local utfchar, utfbyte, utflength = utf.char, utf.byte, utf.length local floor = math.floor +local toboolean = toboolean -local context = context -local commands = commands +local context = context +local commands = commands +local implement = interfaces.implement -local context_sprint = context.sprint ------ context_fprint = context.fprint -- a bit inefficient +local context_sprint = context.sprint +----- context_fprint = context.fprint -- a bit inefficient +local ctx_doifelsesomething = commands.doifelsesomething -local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) +local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) -local report_math = logs.reporter("mathematics","initializing") +local report_math = logs.reporter("mathematics","initializing") -mathematics = mathematics or { } -local mathematics = mathematics +mathematics = mathematics or { } +local mathematics = mathematics -mathematics.extrabase = 0xFE000 -- here we push some virtuals -mathematics.privatebase = 0xFF000 -- here we push the ex +mathematics.extrabase = 0xFE000 -- here we push some virtuals +mathematics.privatebase = 0xFF000 -- here we push the ex -local unsetvalue = attributes.unsetvalue -local allocate = utilities.storage.allocate -local chardata = characters.data +local unsetvalue = attributes.unsetvalue +local allocate = utilities.storage.allocate +local chardata = characters.data -local texsetattribute = tex.setattribute -local setmathcode = tex.setmathcode -local setdelcode = tex.setdelcode +local texsetattribute = tex.setattribute +local setmathcode = tex.setmathcode +local setdelcode = tex.setdelcode local families = allocate { mr = 0, @@ -464,7 +467,7 @@ end local function utfmathfiller(chr, default) local cd = somechar[chr] - local cmd = cd and (cd.mathfiller or cd.mathname) + local cmd = cd and cd.mathfiller -- or cd.mathname return cmd or default or "" end @@ -476,20 +479,72 @@ mathematics.utfmathaccent = utfmathaccent -- interfaced -function commands.utfmathclass (...) context(utfmathclass (...)) end -function commands.utfmathstretch(...) context(utfmathstretch(...)) end -function commands.utfmathcommand(...) context(utfmathcommand(...)) end -function commands.utfmathfiller (...) context(utfmathfiller (...)) end +implement { + name = "utfmathclass", + actions = { utfmathclass, context }, + arguments = "string" +} -function commands.doifelseutfmathaccent(chr,asked) - commands.doifelse(utfmathaccent(chr,nil,asked)) -end +implement { + name = "utfmathstretch", + actions = { utfmathstretch, context }, + arguments = "string" +} + +implement { + name = "utfmathcommand", + actions = { utfmathcommand, context }, + arguments = "string" +} + +implement { + name = "utfmathfiller", + actions = { utfmathfiller, context }, + arguments = "string" +} -function commands.utfmathcommandabove(asked) context(utfmathcommand(asked,nil,"topaccent","over" )) end -function commands.utfmathcommandbelow(asked) context(utfmathcommand(asked,nil,"botaccent","under")) end +implement { + name = "utfmathcommandabove", + actions = { utfmathcommand, context }, + arguments = { "string", false, "'topaccent'","'over'" } +} -function commands.doifelseutfmathabove(chr) commands.doifelse(utfmathaccent(chr,nil,"topaccent","over" )) end -function commands.doifelseutfmathbelow(chr) commands.doifelse(utfmathaccent(chr,nil,"botaccent","under")) end +implement { + name = "utfmathcommandbelow", + actions = { utfmathcommand, context }, + arguments = { "string", false, "'botaccent'","'under'" } +} +implement { + name = "utfmathcommandfiller", + actions = { utfmathfiller, context }, + arguments = "string" +} + +-- todo: make this a helper: + +implement { + name = "doifelseutfmathabove", + actions = { utfmathaccent, ctx_doifelsesomething }, + arguments = { "string", false, "'topaccent'", "'over'" } +} + +implement { + name = "doifelseutfmathbelow", + actions = { utfmathaccent, ctx_doifelsesomething }, + arguments = { "string", false, "'botaccent'", "'under'" } +} + +implement { + name = "doifelseutfmathaccent", + actions = { utfmathaccent, ctx_doifelsesomething }, + arguments = "string", +} + +implement { + name = "doifelseutfmathfiller", + actions = { utfmathfiller, ctx_doifelsesomething }, + arguments = "string", +} -- helpers -- @@ -599,30 +654,34 @@ local noffunctions = 1000 -- offset categories.functions = functions -function commands.taggedmathfunction(tag,label,apply) - local delta = apply and 1000 or 0 - if label then - local n = functions[tag] - if not n then - noffunctions = noffunctions + 1 - functions[noffunctions] = tag - functions[tag] = noffunctions - texsetattribute(a_mathcategory,noffunctions + delta) +implement { + name = "taggedmathfunction", + arguments = { "string", "string", "string" }, + actions = function(tag,label,apply) + local delta = toboolean(apply) and 1000 or 0 + if toboolean(label) then + local n = functions[tag] + if not n then + noffunctions = noffunctions + 1 + functions[noffunctions] = tag + functions[tag] = noffunctions + texsetattribute(a_mathcategory,noffunctions + delta) + else + texsetattribute(a_mathcategory,n + delta) + end + context.mathlabeltext(tag) else - texsetattribute(a_mathcategory,n + delta) + texsetattribute(a_mathcategory,1000 + delta) + context(tag) end - context.mathlabeltext(tag) - else - texsetattribute(a_mathcategory,1000 + delta) - context(tag) end -end +} -- local list -function commands.resetmathattributes() +function mathematics.resetattributes() if not list then list = { } for k, v in next, attributes.numbers do @@ -635,3 +694,16 @@ function commands.resetmathattributes() texsetattribute(list[i],unsetvalue) end end + +implement { + name = "resetmathattributes", + actions = mathematics.resetattributes +} + +-- weird to do this here but it's a side affect of math anyway + +interfaces.implement { + name = "enableasciimode", + onlyonce = true, + actions = resolvers.macros.enablecomment, +} diff --git a/Master/texmf-dist/tex/context/base/math-ini.mkiv b/Master/texmf-dist/tex/context/base/math-ini.mkiv index adf252d9526..2d6090c03b9 100644 --- a/Master/texmf-dist/tex/context/base/math-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/math-ini.mkiv @@ -13,6 +13,18 @@ \writestatus{loading}{ConTeXt Math Macros / Initializations} +% Todo in luatex maincontrol.w: also accept a number here: +% +% case set_math_param_cmd: +% p = cur_chr; +% get_token(); +% if (cur_cmd != math_style_cmd) { +% +% plus two new math styles: larger/smaller +% +% \unexpanded\def\Umathshow#1% +% {\hbox{\infofont(\string#1:\the#1\textstyle,\the#1\scriptstyle,\the#1\scriptscriptstyle)}} + %D This module provides namespaces for math fonts, thereby permitting mixed usage of %D math fonts. Although not strictly needed, we also provide a family name mapping %D mechanism as used in the (original) AMS math definition files, but here these @@ -26,6 +38,15 @@ %D restore a changed mathstyle so best avoid that one. However, there are cases where %D we really need to use such grouping. +% Weird, these fail, maybe amp is solved in a later state from char noads (needs a +% fix in luatex): +% +% $\char"26$ +% $\a$ +% $\string&$ + +% mathop applied to characters centers it vertically + \unprotect %D We move these definitions into the format: @@ -80,7 +101,35 @@ \setnewconstant\defaultmathfamily \zerocount % 255 -\unexpanded\def\resetmathattributes{\ctxcommand{resetmathattributes()}} +\unexpanded\def\resetmathattributes{\clf_resetmathattributes} + +% handy + +\newconditional\indisplaymath + +\appendtoks + \setfalse\indisplaymath +\to \everymath + +\appendtoks + \settrue\indisplaymath +\to \everydisplay + +\def\inlineordisplaymath{\ifconditional\indisplaymath\expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments\fi} + +\unexpanded\def\forcedisplaymath + {\ifmmode + \displaystyle + \settrue\indisplaymath + \fi} + +\unexpanded\def\startforceddisplaymath + {\startimath + \displaystyle + \settrue\indisplaymath} + +\unexpanded\def\stopforceddisplaymath + {\stopimath} % \unexpanded\def\rawmathcharacter#1% slow but only for tracing % {\begingroup @@ -94,9 +143,9 @@ \unexpanded\def\rawmathematics#1% slow but only for tracing {\begingroup \ifmmode - \resetmathattributes#1% + \clf_resetmathattributes#1% \else - \startimath\resetmathattributes#1\stopimath + \startimath\clf_resetmathattributes#1\stopimath \fi \endgroup} @@ -117,7 +166,7 @@ \installswitchcommandhandler \??mathematics {mathematics} \??mathematics \unexpanded\def\startmathematics % no grouping, if ever then also an optional second - {\doifnextoptionalcselse\math_mathematics_start_yes\math_mathematics_start_nop} + {\doifelsenextoptionalcs\math_mathematics_start_yes\math_mathematics_start_nop} \unexpanded\def\math_mathematics_start_yes[#1]% {\pushmacro\currentmathematics @@ -143,14 +192,14 @@ % these commands are semi-public but should not be used directly (lua names wil change) -\unexpanded\def\math_set_attribute #1#2{\ifmmode\ctxcommand{setmathattribute("#1","#2")}\fi} -\unexpanded\def\math_set_alphabet #1{\ifmmode\ctxcommand{setmathalphabet("#1")}\fi} -\unexpanded\def\math_set_font_style #1{\ifmmode\ctxcommand{setmathstyle("#1")}\fi} -\unexpanded\def\math_set_font_alternate#1{\ifmmode\ctxcommand{setmathalternate(\number\defaultmathfamily,"#1")}\fi} +\unexpanded\def\math_set_attribute #1#2{\ifmmode\clf_setmathattribute{#1}{#2}\fi} +\unexpanded\def\math_set_alphabet #1{\ifmmode\clf_setmathalphabet{#1}\fi} +\unexpanded\def\math_set_font_style #1{\ifmmode\clf_setmathstyle{#1}\fi} +\unexpanded\def\math_set_font_alternate#1{\ifmmode\clf_setmathalternate\defaultmathfamily{#1}\fi} \installcorenamespace{mathstylealternate} % might become a setuphandler -\unexpanded\def\math_set_font_style_alterternate#1% +\unexpanded\def\math_set_font_style_alternate#1% {\ifcsname\??mathstylealternate\fontclass:#1\endcsname \expandafter\math_set_font_alternate\csname\??mathstylealternate\fontclass:#1\endcsname \else\ifcsname\??mathstylealternate#1\endcsname @@ -169,31 +218,31 @@ \unexpanded\def\mathaltcal{\math_set_font_alternate{cal}\cal} % ss01 in xits -\let\setmathattribute \math_set_attribute -\let\setmathalphabet \math_set_alphabet -\let\setmathfontstyle \math_set_font_style -\let\setmathfontalternate \math_set_font_alternate -\let\setmathfontstylealterternate\math_set_font_style_alterternate +\let\setmathattribute \math_set_attribute +\let\setmathalphabet \math_set_alphabet +\let\setmathfontstyle \math_set_font_style +\let\setmathfontalternate \math_set_font_alternate +\let\setmathfontstylealternate\math_set_font_style_alternate -\let\mathalternate \math_set_font_alternate % obsolete +\let\mathalternate \math_set_font_alternate % obsolete -\unexpanded\def\mathupright {\math_set_attribute\s!regular\s!tf\math_set_font_style_alterternate\s!tf} -\unexpanded\def\mathdefault {\math_set_attribute\s!regular\s!it\math_set_font_style_alterternate\s!it} -\unexpanded\def\mathscript {\math_set_alphabet \s!script \math_set_font_style_alterternate\s!script} -\unexpanded\def\mathfraktur {\math_set_alphabet \s!fraktur \math_set_font_style_alterternate\s!fraktur} -\unexpanded\def\mathblackboard{\math_set_alphabet \s!blackboard \math_set_font_style_alterternate\s!blackboard} +\unexpanded\def\mathupright {\math_set_attribute\s!regular\s!tf\math_set_font_style_alternate\s!tf} +\unexpanded\def\mathdefault {\math_set_attribute\s!regular\s!it\math_set_font_style_alternate\s!it} +\unexpanded\def\mathscript {\math_set_alphabet \s!script \math_set_font_style_alternate\s!script} +\unexpanded\def\mathfraktur {\math_set_alphabet \s!fraktur \math_set_font_style_alternate\s!fraktur} +\unexpanded\def\mathblackboard{\math_set_alphabet \s!blackboard \math_set_font_style_alternate\s!blackboard} -\unexpanded\def\mathrm {\math_set_attribute\s!rm\s!tf \math_set_font_style_alterternate\s!tf} -\unexpanded\def\mathss {\math_set_attribute\s!ss\s!tf \math_set_font_style_alterternate\s!tf} -\unexpanded\def\mathtt {\math_set_attribute\s!tt\s!tf \math_set_font_style_alterternate\s!tf} +\unexpanded\def\mathrm {\math_set_attribute\s!rm\s!tf \math_set_font_style_alternate\s!tf} +\unexpanded\def\mathss {\math_set_attribute\s!ss\s!tf \math_set_font_style_alternate\s!tf} +\unexpanded\def\mathtt {\math_set_attribute\s!tt\s!tf \math_set_font_style_alternate\s!tf} -\unexpanded\def\mathtf {\math_set_font_style\s!tf \math_set_font_style_alterternate\s!tf} -\unexpanded\def\mathsl {\math_set_font_style\s!it \math_set_font_style_alterternate\s!it} % no sl -\unexpanded\def\mathit {\math_set_font_style\s!it \math_set_font_style_alterternate\s!it} +\unexpanded\def\mathtf {\math_set_font_style\s!tf \math_set_font_style_alternate\s!tf} +\unexpanded\def\mathsl {\math_set_font_style\s!it \math_set_font_style_alternate\s!it} % no sl +\unexpanded\def\mathit {\math_set_font_style\s!it \math_set_font_style_alternate\s!it} -\unexpanded\def\mathbf {\math_set_font_style\s!bf \math_set_font_style_alterternate\s!bf} -\unexpanded\def\mathbs {\math_set_font_style\s!bi \math_set_font_style_alterternate\s!bi} % no sl -\unexpanded\def\mathbi {\math_set_font_style\s!bi \math_set_font_style_alterternate\s!bi} +\unexpanded\def\mathbf {\math_set_font_style\s!bf \math_set_font_style_alternate\s!bf} +\unexpanded\def\mathbs {\math_set_font_style\s!bi \math_set_font_style_alternate\s!bi} % no sl +\unexpanded\def\mathbi {\math_set_font_style\s!bi \math_set_font_style_alternate\s!bi} \let\tfmath\mathtf % maybe a grouped command \let\slmath\mathsl @@ -216,12 +265,12 @@ \unexpanded\def\mathfrak#1{{\mathfraktur #1}} % for AMS compatibility \unexpanded\def\mathbb #1{{\mathblackboard#1}} % for AMS compatibility -\let\normaltf\tf \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi} -\let\normalbf\bf \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi} -\let\normalit\it \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi} -\let\normalsl\sl \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi} -\let\normalbi\bi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi} -\let\normalbs\bs \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi} +\ifdefined\normaltf\else\let\normaltf\tf\fi \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi} +\ifdefined\normalbf\else\let\normalbf\bf\fi \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi} +\ifdefined\normalit\else\let\normalit\it\fi \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi} +\ifdefined\normalsl\else\let\normalsl\sl\fi \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi} +\ifdefined\normalbi\else\let\normalbi\bi\fi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi} +\ifdefined\normalbs\else\let\normalbs\bs\fi \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi} \let\normalrm\rm \unexpanded\def\rm{\ifmmode\mathrm\else\normalrm\fi} \let\normalss\ss \unexpanded\def\ss{\ifmmode\mathss\else\normalss\fi} @@ -231,9 +280,9 @@ \ifdefined\mb \else \let\mb\relax \fi % 1: $\setmathattribute{ss}{bf}3$ -% 2: $\setmathattribute{ss}{bf}\setmathfontstylealterternate{bf}3$ +% 2: $\setmathattribute{ss}{bf}\setmathfontstylealternate{bf}3$ % 3: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}3$ -% 4: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}\setmathfontstylealterternate{bf}3$ +% 4: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}\setmathfontstylealternate{bf}3$ % 5: $e=mc^2 \quad \mb e=mc^2$ \prependtoks @@ -260,7 +309,7 @@ \newcount\c_math_renderings_attribute \appendtoks - \c_math_renderings_attribute\ctxcommand{mathrenderset("\mathematicsparameter\c!symbolset")}\relax + \c_math_renderings_attribute\clf_mathrenderset{\mathematicsparameter\c!symbolset}\relax \to \everysetupmathematics % only in mathematics \appendtoks @@ -282,24 +331,26 @@ \unexpanded\def\boldsymbol {\mathortext\mathboldsymbol\bold} -%D Helpers: +%D Helpers -\def\utfmathclass #1{\ctxcommand{utfmathclass (\!!bs#1\!!es)}} -\def\utfmathstretch#1{\ctxcommand{utfmathstretch(\!!bs#1\!!es)}} -\def\utfmathcommand#1{\ctxcommand{utfmathcommand(\!!bs#1\!!es)}} -\def\utfmathfiller #1{\ctxcommand{utfmathfiller (\!!bs#1\!!es)}} +\def\utfmathclass #1{\clf_utfmathclass {#1}} +\def\utfmathstretch#1{\clf_utfmathstretch{#1}} +\def\utfmathcommand#1{\clf_utfmathcommand{#1}} +\def\utfmathfiller #1{\clf_utfmathfiller {#1}} -\def\utfmathclassfiltered #1#2{\ctxcommand{utfmathclass (\!!bs#1\!!es,nil,"#2")}} -\def\utfmathcommandfiltered#1#2{\ctxcommand{utfmathcommand(\!!bs#1\!!es,nil,"#2")}} +\def\utfmathcommandabove #1{\clf_utfmathcommandabove {#1}} +\def\utfmathcommandbelow #1{\clf_utfmathcommandbelow {#1}} +\def\utfmathcommandfiller#1{\clf_utfmathcommandfiller{#1}} -\def\utfmathcommandabove#1{\ctxcommand{utfmathcommandabove(\!!bs#1\!!es)}} -\def\utfmathcommandbelow#1{\ctxcommand{utfmathcommandbelow(\!!bs#1\!!es)}} +\unexpanded\def\doifelseutfmathaccent#1{\clf_doifelseutfmathaccent{#1}} +\unexpanded\def\doifelseutfmathabove #1{\clf_doifelseutfmathabove {#1}} +\unexpanded\def\doifelseutfmathbelow #1{\clf_doifelseutfmathbelow {#1}} +\unexpanded\def\doifelseutfmathfiller#1{\clf_doifelseutfmathfiller{#1}} -\unexpanded\def\doifelseutfmathaccent #1{\ctxcommand{doifelseutfmathaccent(\!!bs#1\!!es)}} -\unexpanded\def\doifelseutfmathaccentfiltered#1#2{\ctxcommand{doifelseutfmathaccent(\!!bs#1\!!es,"#2")}} - -\unexpanded\def\doifelseutfmathabove #1{\ctxcommand{doifelseutfmathabove(\!!bs#1\!!es)}} -\unexpanded\def\doifelseutfmathbelow #1{\ctxcommand{doifelseutfmathbelow(\!!bs#1\!!es)}} +\let\doifutfmathaccentelse \doifelseutfmathaccent +\let\doifutfmathaboveelse \doifelseutfmathabove +\let\doifutfmathbelowelse \doifelseutfmathbelow +\let\doifutfmathfillerelse \doifelseutfmathfiller %D Not used that much: @@ -396,7 +447,7 @@ \relax \hskip-.01\emwidth} -\unexpanded\def\showmathstruts % let's not overload \nath_strut_normal +\unexpanded\def\showmathstruts % let's not overload \math_strut_normal {\let\math_strut\math_strut_visual} \let\math_strut\math_strut_normal @@ -456,7 +507,7 @@ \startimath#1\stopimath \egroup \ht\scratchbox\strutht - \dp\scratchbox\strutht + \dp\scratchbox\strutdp \box\scratchbox \endgroup} @@ -479,8 +530,8 @@ % Once this is stable we can store the number at the tex end which is % faster. Functions getnumbers >= 1000. -\expanded\def\math_tags_mathfunction_indeed #1{\ctxcommand{taggedmathfunction("#1",false,\ifconditional\c_apply_function true\else false\fi)}} -\expanded\def\math_tags_mathfunctionlabeltext_indeed#1{\ctxcommand{taggedmathfunction("#1",true ,\ifconditional\c_apply_function true\else false\fi)}} +\expanded\def\math_tags_mathfunction_indeed #1{\clf_taggedmathfunction{#1}{false}{\ifconditional\c_apply_function true\else false\fi}} +\expanded\def\math_tags_mathfunctionlabeltext_indeed#1{\clf_taggedmathfunction{#1} {true}{\ifconditional\c_apply_function true\else false\fi}} \expanded\def\math_tags_mo_indeed#1{\begingroup \attribute\mathcategoryattribute\plusone #1\endgroup} \expanded\def\math_tags_mi_indeed#1{\begingroup \attribute\mathcategoryattribute\plustwo #1\endgroup} @@ -823,17 +874,16 @@ % \ifconditional\knuthmode\else\donknuthmode\fi} \unexpanded\def\enableasciimode - {\ctxlua{resolvers.macros.enablecomment()}% - \glet\enableasciimode\relax} + {\clf_enableasciimode} % relaxes itself \unexpanded\def\asciimode {\catcodetable\txtcatcodes - \enableasciimode} + \clf_enableasciimode} \unexpanded\def\startasciimode {\pushcatcodetable \catcodetable\txtcatcodes - \enableasciimode} + \clf_enableasciimode} \unexpanded\def\stopasciimode {\popcatcodetable} @@ -851,7 +901,7 @@ \to \everysetupmathematics \setupmathematics - [\c!compact=no] + [\c!compact=\v!no] % \enabletrackers[typesetters.directions.math] @@ -902,8 +952,8 @@ \newcount\c_math_bidi -\setvalue{\??mathbidi\v!no }{\ctxcommand{setmathdirection(0)}\c_math_bidi\attributeunsetvalue} -\setvalue{\??mathbidi\v!yes}{\ctxcommand{setmathdirection(1)}\c_math_bidi\plusone} +\setvalue{\??mathbidi\v!no }{\clf_setmathdirection\zerocount\relax\c_math_bidi\attributeunsetvalue} +\setvalue{\??mathbidi\v!yes}{\clf_setmathdirection\plusone \relax\c_math_bidi\plusone} \appendtoks \edef\p_bidi{\mathematicsparameter\c!bidi}% @@ -985,7 +1035,7 @@ \def\math_italics_initialize {\ifnum\c_math_italics_attribute=\attributeunsetvalue \else - \ctxcommand{setmathitalics()}% one time + \clf_setmathitalics % one time \global\let\math_italics_initialize\relax \fi} @@ -1491,6 +1541,16 @@ \crampedscriptstyle \or \fi} +\newcount\c_math_saved_style + +\unexpanded\def\pushmathstyle % assumes begingroup .. endgroup + {\c_math_saved_style\mathstyle} + +\unexpanded\def\popmathstyle + {\ifnum\mathstyle=\c_math_saved_style\else + \triggermathstyle\c_math_saved_style + \fi} + \installcorenamespace{mathstylecommand} \installcorenamespace{mathstylecache} @@ -1826,7 +1886,14 @@ \ifdefined\text\else \let\text\hbox \fi -\unexpanded\def\mathoptext#1{\mathop{\text{#1}}} +% \unexpanded\def\mathoptext#1{\mathop{\text{#1}}} + +\unexpanded\def\mathoptext + {\normalizebodyfontsize\m_math_text_choice_face{\mathstyleface\normalmathstyle}% + %\showmathstyle + \dowithnextbox + {\mathop{\box\nextbox}}% + \hbox\bgroup\font_basics_switchtobodyfont\m_math_text_choice_face\let\next} % new: @@ -1851,11 +1918,140 @@ % this should be a primitive: -% \def\mathextensiblecode#1#2% -% {\cldcontext{mathematics.extensiblecode(\number#1,\number#2)}} +\def\mathextensiblecode#1#2{\clf_extensiblecode\numexpr#1\relax\numexpr#2\relax} +\def\mathhorizontalcode#1#2{\clf_horizontalcode\numexpr#1\relax\numexpr#2\relax} -\def\mathextensiblecode#1#2{\ctxcommand{extensiblecode(\number#1,\number#2)}} -\def\mathhorizontalcode#1#2{\ctxcommand{horizontalcode(\number#1,\number#2)}} +% experimental: + +%D \starttyping +%D \enabletrackers[math.openedup] +%D +%D \dorecurse{10}{\dorecurse{#1}{whatever }} +%D +%D \startitemize[packed] +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \stopitemize +%D \startitemize[packed,columns] +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \stopitemize +%D +%D \dorecurse{5}{\dorecurse{#1}{whatever }\openedupimath{\frac{1}{2}} } +%D +%D \startitemize[packed,columns] +%D \startitem whatever \openedupimath{1+2} whatever +%D \startitem whatever \openedupimath{1+2} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{1+2} whatever +%D \startitem whatever \openedupimath{1+2} whatever +%D \stopitemize +%D +%D \dorecurse{5}{\dorecurse{#1}{whatever }\openedupimath{1+2} } +%D +%D \startitemize[packed] +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \startitem whatever \openedupimath{\frac{1}{2}} whatever +%D \stopitemize +%D +%D \dorecurse{10}{whatever } +%D \dorecurse {5}{\dorecurse{#1}{whatever }\openedupimath{\frac{1}{2}} } +%D \dorecurse{10}{whatever } +%D \stoptyping + +\def\m_math_inline_openup_ht{\dimexpr\ifinsidecolumns\strutdp\else\lineheight\fi/\plusfour\relax} +\def\m_math_inline_openup_dp{\dimexpr\ifinsidecolumns\strutdp\else\lineheight\fi/\plusfour\relax} + +% \def\m_math_inline_openup_ht{\dimexpr\lineheight/\ifinsidecolumns\pluseight\else\plusfour\fi\relax} +% \def\m_math_inline_openup_dp{\dimexpr\lineheight/\ifinsidecolumns\pluseight\else\plusfour\fi\relax} + +\installtextracker + {math.openedup} + {\let\math_inline_openup_start_yes\math_inline_openup_traced_start} + {\let\math_inline_openup_start_yes\math_inline_openup_normal_start} + +\unexpanded\def\math_inline_openup_normal_start + {\scratchheight\dimexpr\ht\scratchbox+\m_math_inline_openup_ht\relax + \scratchdepth \dimexpr\dp\scratchbox+\m_math_inline_openup_dp\relax + \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax + \begingroup + \let\math_inline_openup_stop\math_inline_openup_normal_stop} + +\unexpanded\def\math_inline_openup_normal_stop + {\endgroup + \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax} + +\unexpanded\def\math_inline_openup_traced_start + {\scratchtopoffset \ht\scratchbox + \scratchbottomoffset\dp\scratchbox + \scratchheight \dimexpr\scratchtopoffset +\m_math_inline_openup_ht\relax + \scratchdepth \dimexpr\scratchbottomoffset+\m_math_inline_openup_dp\relax + \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax + \begingroup + \dofastcoloractivation{darkred}% + \vrule\s!width\emwidth\s!height\scratchheight\s!depth-\scratchtopoffset\relax + \endgroup + \kern-\emwidth + \begingroup + \let\math_inline_openup_stop\math_inline_openup_traced_stop} + +\unexpanded\def\math_inline_openup_traced_stop + {\endgroup + \kern-\emwidth + \begingroup + \dofastcoloractivation{darkblue}% + \vrule\s!width\emwidth\s!height-\scratchbottomoffset\s!depth\scratchdepth\relax + \endgroup + \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax} + +\let\math_inline_openup_start_yes\math_inline_openup_normal_start +\let\math_inline_openup_stop \relax + +\def\math_inline_openup_start_nop + {\let\math_inline_openup_stop\relax} + +\unexpanded\def\openedupimath + {\dontleavehmode + \begingroup + \ifmmode + \expandafter\openedupimath_math + \else + \expandafter\openedupimath_text + \fi} + +\unexpanded\def\openedupimath_math#1% + {\setbox\scratchbox\mathstylehbox{#1}% + \ifdim\ht\scratchbox>\strutht + \math_inline_openup_start_yes + \else\ifdim\dp\scratchbox>\strutdp + \math_inline_openup_start_yes + \else + \math_inline_openup_start_nop + \fi\fi + #1% + \math_inline_openup_stop + \endgroup} + +\unexpanded\def\openedupimath_text#1% + {\setbox\scratchbox\hbox{\startimath#1\stopimath}% + \ifdim\ht\scratchbox>\strutht + \math_inline_openup_start_yes + \else\ifdim\dp\scratchbox>\strutdp + \math_inline_openup_start_yes + \else + \math_inline_openup_start_nop + \fi\fi + \startimath + #1% + \stopimath + \math_inline_openup_stop + \endgroup} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/math-int.mkiv b/Master/texmf-dist/tex/context/base/math-int.mkiv index 6b480961b6a..6b65738ff2e 100644 --- a/Master/texmf-dist/tex/context/base/math-int.mkiv +++ b/Master/texmf-dist/tex/context/base/math-int.mkiv @@ -13,6 +13,8 @@ \writestatus{loading}{ConTeXt Math Macros / Integrals} +% todo: int and sum etc can be stackers + \unprotect %D \startbuffer diff --git a/Master/texmf-dist/tex/context/base/math-map.lua b/Master/texmf-dist/tex/context/base/math-map.lua index f2a588fc7de..add6afa4c1c 100644 --- a/Master/texmf-dist/tex/context/base/math-map.lua +++ b/Master/texmf-dist/tex/context/base/math-map.lua @@ -53,6 +53,8 @@ local report_remapping = logs.reporter("mathematics","remapping") mathematics = mathematics or { } local mathematics = mathematics +local implement = interfaces.implement + -- Unfortunately some alphabets have gaps (thereby troubling all applications that -- need to deal with math). Somewhat strange considering all those weird symbols that -- were added afterwards. The following trickery (and data) is only to be used for @@ -184,7 +186,7 @@ local regular_tf = { }, symbols = { [0x2202]=0x2202, [0x2207]=0x2207, - [0x0027]=0x2032, -- prime + [0x0027]=0x2032, -- prime }, } @@ -617,6 +619,39 @@ function mathematics.syncname(alphabet) texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet]) end +implement { + name = "setmathattribute", + arguments = { "string", "string" }, + actions = function(alphabet,style) + local data = alphabets[alphabet] or regular + data = data[style] or data.tf + texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet]) + end +} + +implement { + name = "setmathstyle", + arguments = "string", + actions = function(style) + local r = mathremap[texgetattribute(mathalphabet)] + local alphabet = r and r.alphabet or "regular" + local data = alphabets[alphabet][style] + texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet]) + end +} + +implement { + name = "setmathalphabet", + arguments = "string", + actions = function(alphabet) + -- local r = mathremap[mathalphabet] + local r = mathremap[texgetattribute(mathalphabet)] + local style = r and r.style or "tf" + local data = alphabets[alphabet][style] + texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet]) + end +} + local islcgreek = regular_tf.lcgreek local isucgreek = regular_tf.ucgreek local issygreek = regular_tf.symbols @@ -742,9 +777,3 @@ function mathematics.addfallbacks(main) checkedcopy(characters,regular.bi.ucgreek,regular.it.ucgreek) checkedcopy(characters,regular.bi.lcgreek,regular.it.lcgreek) end - --- interface - -commands.setmathattribute = mathematics.syncboth -commands.setmathalphabet = mathematics.syncname -commands.setmathstyle = mathematics.syncstyle diff --git a/Master/texmf-dist/tex/context/base/math-noa.lua b/Master/texmf-dist/tex/context/base/math-noa.lua index 3a0af01cc9e..893ee6f48d3 100644 --- a/Master/texmf-dist/tex/context/base/math-noa.lua +++ b/Master/texmf-dist/tex/context/base/math-noa.lua @@ -28,31 +28,38 @@ local otf = fonts.handlers.otf local otffeatures = fonts.constructors.newfeatures("otf") local registerotffeature = otffeatures.register -local trace_remapping = false trackers.register("math.remapping", function(v) trace_remapping = v end) -local trace_processing = false trackers.register("math.processing", function(v) trace_processing = v end) -local trace_analyzing = false trackers.register("math.analyzing", function(v) trace_analyzing = v end) -local trace_normalizing = false trackers.register("math.normalizing", function(v) trace_normalizing = v end) -local trace_collapsing = false trackers.register("math.collapsing", function(v) trace_collapsing = v end) -local trace_goodies = false trackers.register("math.goodies", function(v) trace_goodies = v end) -local trace_variants = false trackers.register("math.variants", function(v) trace_variants = v end) -local trace_alternates = false trackers.register("math.alternates", function(v) trace_alternates = v end) -local trace_italics = false trackers.register("math.italics", function(v) trace_italics = v end) -local trace_families = false trackers.register("math.families", function(v) trace_families = v end) - -local check_coverage = true directives.register("math.checkcoverage", function(v) check_coverage = v end) - -local report_processing = logs.reporter("mathematics","processing") -local report_remapping = logs.reporter("mathematics","remapping") -local report_normalizing = logs.reporter("mathematics","normalizing") -local report_collapsing = logs.reporter("mathematics","collapsing") -local report_goodies = logs.reporter("mathematics","goodies") -local report_variants = logs.reporter("mathematics","variants") -local report_alternates = logs.reporter("mathematics","alternates") -local report_italics = logs.reporter("mathematics","italics") -local report_families = logs.reporter("mathematics","families") - -local a_mathrendering = attributes.private("mathrendering") -local a_exportstatus = attributes.private("exportstatus") +local privateattribute = attributes.private +local registertracker = trackers.register +local registerdirective = directives.register +local logreporter = logs.reporter + +local trace_remapping = false registertracker("math.remapping", function(v) trace_remapping = v end) +local trace_processing = false registertracker("math.processing", function(v) trace_processing = v end) +local trace_analyzing = false registertracker("math.analyzing", function(v) trace_analyzing = v end) +local trace_normalizing = false registertracker("math.normalizing", function(v) trace_normalizing = v end) +local trace_collapsing = false registertracker("math.collapsing", function(v) trace_collapsing = v end) +local trace_patching = false registertracker("math.patching", function(v) trace_patching = v end) +local trace_goodies = false registertracker("math.goodies", function(v) trace_goodies = v end) +local trace_variants = false registertracker("math.variants", function(v) trace_variants = v end) +local trace_alternates = false registertracker("math.alternates", function(v) trace_alternates = v end) +local trace_italics = false registertracker("math.italics", function(v) trace_italics = v end) +local trace_families = false registertracker("math.families", function(v) trace_families = v end) + +local check_coverage = true registerdirective("math.checkcoverage", function(v) check_coverage = v end) + +local report_processing = logreporter("mathematics","processing") +local report_remapping = logreporter("mathematics","remapping") +local report_normalizing = logreporter("mathematics","normalizing") +local report_collapsing = logreporter("mathematics","collapsing") +local report_patching = logreporter("mathematics","patching") +local report_goodies = logreporter("mathematics","goodies") +local report_variants = logreporter("mathematics","variants") +local report_alternates = logreporter("mathematics","alternates") +local report_italics = logreporter("mathematics","italics") +local report_families = logreporter("mathematics","families") + +local a_mathrendering = privateattribute("mathrendering") +local a_exportstatus = privateattribute("exportstatus") local nuts = nodes.nuts local nodepool = nuts.pool @@ -83,8 +90,6 @@ local font_of_family = node.family_font local new_kern = nodepool.kern local new_rule = nodepool.rule -local topoints = number.points - local fonthashes = fonts.hashes local fontdata = fonthashes.identifiers local fontcharacters = fonthashes.characters @@ -236,7 +241,7 @@ noads.process = processnoads -- might as well do this local families = { } -local a_mathfamily = attributes.private("mathfamily") +local a_mathfamily = privateattribute("mathfamily") local boldmap = mathematics.boldmap local familymap = { [0] = @@ -336,8 +341,8 @@ end -- character remapping -local a_mathalphabet = attributes.private("mathalphabet") -local a_mathgreek = attributes.private("mathgreek") +local a_mathalphabet = privateattribute("mathalphabet") +local a_mathgreek = privateattribute("mathgreek") processors.relocate = { } @@ -488,7 +493,7 @@ end -- todo: just replace the character by an ord noad -- and remove the right delimiter as well -local mathsize = attributes.private("mathsize") +local mathsize = privateattribute("mathsize") local resize = { } processors.resize = resize @@ -517,137 +522,17 @@ function handlers.resize(head,style,penalties) return true end -local collapse = { } processors.collapse = collapse - -local mathpairs = characters.mathpairs - -mathpairs[0x2032] = { [0x2032] = 0x2033, [0x2033] = 0x2034, [0x2034] = 0x2057 } -- (prime,prime) (prime,doubleprime) (prime,tripleprime) -mathpairs[0x2033] = { [0x2032] = 0x2034, [0x2033] = 0x2057 } -- (doubleprime,prime) (doubleprime,doubleprime) -mathpairs[0x2034] = { [0x2032] = 0x2057 } -- (tripleprime,prime) - -mathpairs[0x2035] = { [0x2035] = 0x2036, [0x2036] = 0x2037 } -- (reversedprime,reversedprime) (reversedprime,doublereversedprime) -mathpairs[0x2036] = { [0x2035] = 0x2037 } -- (doublereversedprime,reversedprime) - -mathpairs[0x222B] = { [0x222B] = 0x222C, [0x222C] = 0x222D } -mathpairs[0x222C] = { [0x222B] = 0x222D } - -mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple -mathpairs[0x2016] = { [0x007C] = 0x2980 } -- double+bar=triple - -local movesub = { - -- primes - [0x2032] = 0xFE932, - [0x2033] = 0xFE933, - [0x2034] = 0xFE934, - [0x2057] = 0xFE957, - -- reverse primes - [0x2035] = 0xFE935, - [0x2036] = 0xFE936, - [0x2037] = 0xFE937, -} - -local validpair = { - [noad_rel] = true, - [noad_ord] = true, - [noad_opdisplaylimits] = true, - [noad_oplimits] = true, - [noad_opnolimits] = true, -} - -local function movesubscript(parent,current_nucleus,current_char) - local prev = getfield(parent,"prev") - if prev and getid(prev) == math_noad then - if not getfield(prev,"sup") and not getfield(prev,"sub") then - setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)]) - -- {f} {'}_n => f_n^' - local nucleus = getfield(parent,"nucleus") - local sub = getfield(parent,"sub") - local sup = getfield(parent,"sup") - setfield(prev,"sup",nucleus) - setfield(prev,"sub",sub) - local dummy = copy_node(nucleus) - setfield(dummy,"char",0) - setfield(parent,"nucleus",dummy) - setfield(parent,"sub",nil) - if trace_collapsing then - report_collapsing("fixing subscript") - end - end - end -end - -local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to turn in on and off - if parent then - if validpair[getsubtype(parent)] then - local current_nucleus = getfield(parent,"nucleus") - if getid(current_nucleus) == math_char then - local current_char = getchar(current_nucleus) - if not getfield(parent,"sub") and not getfield(parent,"sup") then - local mathpair = mathpairs[current_char] - if mathpair then - local next_noad = getnext(parent) - if next_noad and getid(next_noad) == math_noad then - if validpair[getsubtype(next_noad)] then - local next_nucleus = getfield(next_noad,"nucleus") - if getid(next_nucleus) == math_char then - local next_char = getchar(next_nucleus) - local newchar = mathpair[next_char] - if newchar then - local fam = getfield(current_nucleus,"fam") - local id = font_of_family(fam) - local characters = fontcharacters[id] - if characters and characters[newchar] then - if trace_collapsing then - report_collapsing("%U + %U => %U",current_char,next_char,newchar) - end - setfield(current_nucleus,"char",newchar) - local next_next_noad = getnext(next_noad) - if next_next_noad then - setfield(parent,"next",next_next_noad) - setfield(next_next_noad,"prev",parent) - else - setfield(parent,"next",nil) - end - setfield(parent,"sup",getfield(next_noad,"sup")) - setfield(parent,"sub",getfield(next_noad,"sub")) - setfield(next_noad,"sup",nil) - setfield(next_noad,"sub",nil) - free_node(next_noad) - collapsepair(pointer,what,n,parent,true) - if not nested and movesub[current_char] then - movesubscript(parent,current_nucleus) - end - end - end - end - end - end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) - end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) - end - end - end - end -end - -collapse[math_char] = collapsepair - -function noads.handlers.collapse(head,style,penalties) - processnoads(head,collapse,"collapse") - return true -end - -- normalize scripts local unscript = { } noads.processors.unscript = unscript +local checkers = { } noads.processors.checkers = checkers local superscripts = characters.superscripts local subscripts = characters.subscripts +local fractions = characters.fractions local replaced = { } +local unknowns = { } local function replace(pointer,what,n,parent) pointer = parent -- we're following the parent list (chars trigger this) @@ -726,22 +611,83 @@ local function replace(pointer,what,n,parent) -- we could return stop end +local tracked = false trackers.register("fonts.missing", function(v) tracked = v end) +local checked = { } -- simple case +local cached = table.setmetatableindex("table") -- complex case + +local function check(pointer,what,n,parent) + if tracked then + -- slower as we check each font too and we always replace as math has + -- more demands than text + local char = getchar(pointer) + local font = font_of_family(getfield(pointer,"fam")) + local fake = cached[font][char] + if fake then + unknowns[char] = unknowns[char] + 1 + setfield(pointer,"char",fake) + else + local chars = fontcharacters[font] + if not chars[char] then + unknowns[char] = 1 + local kind, fake = fonts.checkers.placeholder(font,char) + if kind == "char" then + cached[font][char] = fake + setfield(pointer,"char",fake) + else + cached[font][char] = 0x3F + end + end + end + else + -- only simple checking, report at the end so one should take + -- action anyway ... we can miss a few checks but that is ok + -- as there is at least one reported + local char = getchar(pointer) + local done = unknowns[char] + if done then + unknowns[char] = done + 1 + setfield(pointer,"char",0x3F) + elseif not checked[char] then + local font = font_of_family(getfield(pointer,"fam")) + local chars = fontcharacters[font] + if not chars[char] then + unknowns[char] = 1 + setfield(pointer,"char",0x3F) + if trace_normalizing then + report_normalizing("character %C is not available",char) + end + end + end + checked[char] = true + end +end + unscript[math_char] = replace -- not noads as we need to recurse +checkers[math_char] = check -- not noads as we need to recurse function handlers.unscript(head,style,penalties) processnoads(head,unscript,"unscript") + processnoads(head,checkers,"checkers") return true end -statistics.register("math script replacements", function() - if next(replaced) then +local function collected(list) + if list and next(list) then local n, t = 0, { } - for k, v in table.sortedpairs(replaced) do + for k, v in table.sortedpairs(list) do n = n + v t[#t+1] = formatters["%C"](k) end return formatters["% t (n=%s)"](t,n) end +end + +statistics.register("math script replacements", function() + return collected(replaced) +end) + +statistics.register("unknown math characters", function() + return collected(unknowns) end) -- math alternates: (in xits lgf: $ABC$ $\cal ABC$ $\mathalternate{cal}\cal ABC$) @@ -787,7 +733,7 @@ registerotffeature { local getalternate = otf.getalternate -local a_mathalternate = attributes.private("mathalternate") +local a_mathalternate = privateattribute("mathalternate") local alternate = { } -- processors.alternate = alternate @@ -831,7 +777,12 @@ end -- = we check for correction first because accessing nodes is slower -- = the actual glyph is not that important (we can control it with numbers) -local a_mathitalics = attributes.private("mathitalics") +-- Italic correction in luatex math is a mess. There are all kind of assumptions based on +-- old fonts and new font. Eventually there should be a flag that can signal to ignore all +-- those heuristics. We want to deal with it ourselves also in the perspective of mxed math +-- and text. + +local a_mathitalics = privateattribute("mathitalics") local italics = { } local default_factor = 1/20 @@ -899,6 +850,12 @@ local function getcorrection(method,font,char) -- -- or character.italic -- (thi end +local setcolor = nodes.tracers.colors.set +local resetcolor = nodes.tracers.colors.reset +local italic_kern = new_kern +local c_positive_d = "trace:db" +local c_negative_d = "trace:dr" + local function insert_kern(current,kern) local sub = new_node(math_sub) -- todo: pool local noad = new_node(math_noad) -- todo: pool @@ -908,13 +865,7 @@ local function insert_kern(current,kern) return sub end -local setcolor = nodes.tracers.colors.set -local resetcolor = nodes.tracers.colors.reset -local italic_kern = new_kern -local c_positive_d = "trace:db" -local c_negative_d = "trace:dr" - -trackers.register("math.italics", function(v) +registertracker("math.italics.visualize", function(v) if v then italic_kern = function(k,font) local ex = 1.5 * fontexheights[font] @@ -959,12 +910,14 @@ italics[math_char] = function(pointer,what,n,parent) report_italics("method %a, adding %p italic correction for lower limit of %C",method,correction,char) end end - else - if sup then + elseif sup then + if pointer ~= sub then setfield(parent,"sup",insert_kern(sup,italic_kern(correction,font))) if trace_italics then report_italics("method %a, adding %p italic correction before superscript after %C",method,correction,char) end + else + -- otherwise we inject twice end end else @@ -1044,6 +997,147 @@ function mathematics.resetitalics() texsetattribute(a_mathitalics,unsetvalue) end +-- primes and such + +local collapse = { } processors.collapse = collapse + +local mathpairs = characters.mathpairs + +mathpairs[0x2032] = { [0x2032] = 0x2033, [0x2033] = 0x2034, [0x2034] = 0x2057 } -- (prime,prime) (prime,doubleprime) (prime,tripleprime) +mathpairs[0x2033] = { [0x2032] = 0x2034, [0x2033] = 0x2057 } -- (doubleprime,prime) (doubleprime,doubleprime) +mathpairs[0x2034] = { [0x2032] = 0x2057 } -- (tripleprime,prime) + +mathpairs[0x2035] = { [0x2035] = 0x2036, [0x2036] = 0x2037 } -- (reversedprime,reversedprime) (reversedprime,doublereversedprime) +mathpairs[0x2036] = { [0x2035] = 0x2037 } -- (doublereversedprime,reversedprime) + +mathpairs[0x222B] = { [0x222B] = 0x222C, [0x222C] = 0x222D } +mathpairs[0x222C] = { [0x222B] = 0x222D } + +mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple +mathpairs[0x2016] = { [0x007C] = 0x2980 } -- double+bar=triple + +local movesub = { + -- primes + [0x2032] = 0xFE932, + [0x2033] = 0xFE933, + [0x2034] = 0xFE934, + [0x2057] = 0xFE957, + -- reverse primes + [0x2035] = 0xFE935, + [0x2036] = 0xFE936, + [0x2037] = 0xFE937, +} + +local validpair = { + [noad_rel] = true, + [noad_ord] = true, + [noad_opdisplaylimits] = true, + [noad_oplimits] = true, + [noad_opnolimits] = true, +} + +local function movesubscript(parent,current_nucleus,current_char) + local prev = getfield(parent,"prev") + if prev and getid(prev) == math_noad then + if not getfield(prev,"sup") and not getfield(prev,"sub") then + -- {f} {'}_n => f_n^' + setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)]) + local nucleus = getfield(parent,"nucleus") + local sub = getfield(parent,"sub") + local sup = getfield(parent,"sup") + setfield(prev,"sup",nucleus) + setfield(prev,"sub",sub) + local dummy = copy_node(nucleus) + setfield(dummy,"char",0) + setfield(parent,"nucleus",dummy) + setfield(parent,"sub",nil) + if trace_collapsing then + report_collapsing("fixing subscript") + end + elseif not getfield(prev,"sup") then + -- {f} {'}_n => f_n^' + setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)]) + local nucleus = getfield(parent,"nucleus") + local sup = getfield(parent,"sup") + setfield(prev,"sup",nucleus) + local dummy = copy_node(nucleus) + setfield(dummy,"char",0) + setfield(parent,"nucleus",dummy) + if trace_collapsing then + report_collapsing("fixing subscript") + end + end + end +end + +local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to turn in on and off + if parent then + if validpair[getsubtype(parent)] then + local current_nucleus = getfield(parent,"nucleus") + if getid(current_nucleus) == math_char then + local current_char = getchar(current_nucleus) + if not getfield(parent,"sub") and not getfield(parent,"sup") then + local mathpair = mathpairs[current_char] + if mathpair then + local next_noad = getnext(parent) + if next_noad and getid(next_noad) == math_noad then + if validpair[getsubtype(next_noad)] then + local next_nucleus = getfield(next_noad,"nucleus") + local next_char = getchar(next_nucleus) + if getid(next_nucleus) == math_char then + local newchar = mathpair[next_char] + if newchar then + local fam = getfield(current_nucleus,"fam") + local id = font_of_family(fam) + local characters = fontcharacters[id] + if characters and characters[newchar] then + if trace_collapsing then + report_collapsing("%U + %U => %U",current_char,next_char,newchar) + end + setfield(current_nucleus,"char",newchar) + local next_next_noad = getnext(next_noad) + if next_next_noad then + setfield(parent,"next",next_next_noad) + setfield(next_next_noad,"prev",parent) + else + setfield(parent,"next",nil) + end + setfield(parent,"sup",getfield(next_noad,"sup")) + setfield(parent,"sub",getfield(next_noad,"sub")) + setfield(next_noad,"sup",nil) + setfield(next_noad,"sub",nil) + free_node(next_noad) + collapsepair(pointer,what,n,parent,true) + -- if not nested and movesub[current_char] then + -- movesubscript(parent,current_nucleus,current_char) + -- end + end + elseif not nested and movesub[current_char] then + movesubscript(parent,current_nucleus,current_char) + end + end + end + elseif not nested and movesub[current_char] then + movesubscript(parent,current_nucleus,current_char) + end + elseif not nested and movesub[current_char] then + movesubscript(parent,current_nucleus,current_char) + end + elseif not nested and movesub[current_char] then + movesubscript(parent,current_nucleus,current_char) + end + end + end + end +end + +collapse[math_char] = collapsepair + +function noads.handlers.collapse(head,style,penalties) + processnoads(head,collapse,"collapse") + return true +end + -- variants local variants = { } @@ -1139,7 +1233,7 @@ function handlers.classes(head,style,penalties) return true end -trackers.register("math.classes",function(v) tasks.setaction("math","noads.handlers.classes",v) end) +registertracker("math.classes",function(v) tasks.setaction("math","noads.handlers.classes",v) end) -- just for me @@ -1147,7 +1241,7 @@ function handlers.showtree(head,style,penalties) inspect(nodes.totree(head)) end -trackers.register("math.showtree",function(v) tasks.setaction("math","noads.handlers.showtree",v) end) +registertracker("math.showtree",function(v) tasks.setaction("math","noads.handlers.showtree",v) end) -- the normal builder @@ -1202,6 +1296,20 @@ end) -- interface -commands.setmathalternate = mathematics.setalternate -commands.setmathitalics = mathematics.setitalics -commands.resetmathitalics = mathematics.resetitalics +local implement = interfaces.implement + +implement { + name = "setmathalternate", + actions = mathematics.setalternate, + arguments = { "integer", "string" } +} + +implement { + name = "setmathitalics", + actions = mathematics.setitalics +} + +implement { + name = "resetmathitalics", + actions = mathematics.resetitalics +} diff --git a/Master/texmf-dist/tex/context/base/math-rad.mkvi b/Master/texmf-dist/tex/context/base/math-rad.mkvi index 027b5c27d50..23e056c1fd2 100644 --- a/Master/texmf-dist/tex/context/base/math-rad.mkvi +++ b/Master/texmf-dist/tex/context/base/math-rad.mkvi @@ -28,13 +28,13 @@ \def\root#1\of{\rootradical{#1}} % #2 -\unexpanded\def\sqrt{\doifnextoptionalcselse\rootwithdegree\rootwithoutdegree} +\unexpanded\def\sqrt{\doifelsenextoptionalcs\rootwithdegree\rootwithoutdegree} -\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird +\unexpanded\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird {\normalexpanded{\rootradical{\normalunexpanded{#1}}{\noexpand\triggermathstyle{\normalmathstyle}\normalunexpanded{#2}}}} -\def\rootwithdegree[#1]{\rootradical{#1}} -\def\rootwithoutdegree {\rootradical {}} +\unexpanded\def\rootwithdegree[#1]{\rootradical{#1}} +\unexpanded\def\rootwithoutdegree {\rootradical {}} %D Even older stuff: @@ -62,7 +62,7 @@ \unexpanded\def\math_radical_handle#tag% {\begingroup \edef\currentmathradical{#tag}% - \doifnextoptionalcselse\math_radical_degree_yes\math_radical_degree_nop} + \doifelsenextoptionalcs\math_radical_degree_yes\math_radical_degree_nop} \def\math_radical_alternative{\csname\??mathradicalalternative\mathradicalparameter\c!alternative\endcsname} @@ -173,11 +173,11 @@ \setbox\nextbox\mathstylehbox{#body}% % we use the \overlay variables as these are passes anyway and % it's more efficient than using parameters - \edef\overlaywidth {\the\wd\nextbox}% - \edef\overlayheight {\the\ht\nextbox}% - \edef\overlaydepth {\the\dp\nextbox}% - \edef\overlayoffset {\the\scratchoffset}% - \edef\overlaylinewidth{\the\linewidth}% + \d_overlay_width \wd\nextbox + \d_overlay_height \ht\nextbox + \d_overlay_depth \dp\nextbox + \d_overlay_offset \scratchoffset + \d_overlay_linewidth\linewidth \edef\overlaylinecolor{\mathradicalparameter\c!color}% % \edef\p_mp{\mathradicalparameter\c!mp}% @@ -233,11 +233,11 @@ {\begingroup \scratchoffset\mathornamentparameter\c!mpoffset \setbox\nextbox\mathstylehbox{#body}% - \edef\overlaywidth {\the\wd\nextbox}% - \edef\overlayheight {\the\ht\nextbox}% - \edef\overlaydepth {\the\dp\nextbox}% - \edef\overlayoffset {\the\scratchoffset}% - \edef\overlaylinewidth{\the\linewidth}% + \d_overlay_width \wd\nextbox + \d_overlay_height \ht\nextbox + \d_overlay_depth \dp\nextbox + \d_overlay_offset \scratchoffset + \d_overlay_linewidth\linewidth \edef\overlaylinecolor{\mathornamentparameter\c!color}% \edef\p_mp{\mathornamentparameter\c!mp}% % thw width of the graphic determines the width of the final result diff --git a/Master/texmf-dist/tex/context/base/math-ren.lua b/Master/texmf-dist/tex/context/base/math-ren.lua index 5c4c1336944..4628ffe5587 100644 --- a/Master/texmf-dist/tex/context/base/math-ren.lua +++ b/Master/texmf-dist/tex/context/base/math-ren.lua @@ -60,6 +60,8 @@ end mathematics.renderset = renderset -function commands.mathrenderset(list) - context(renderset(list)) -end +interfaces.implement { + name = "mathrenderset", + actions = { renderset, context }, + arguments = "string", +} diff --git a/Master/texmf-dist/tex/context/base/math-stc.mkvi b/Master/texmf-dist/tex/context/base/math-stc.mkvi index 76a07db5c68..a879d157f27 100644 --- a/Master/texmf-dist/tex/context/base/math-stc.mkvi +++ b/Master/texmf-dist/tex/context/base/math-stc.mkvi @@ -16,6 +16,12 @@ \unprotect +%D WARNING: If the code here changes, the export needs to be checked! Stackers are rather +%D special because the order in mathml matters, so we flush in [base under over] order. We +%D also do some analysis at the \TEX\ end (passing the right variant). It's easy in the +%D export to deal with it but in the pdf stream less trivial as we don't actually analyze +%D there. + %D At some point the \MKII\ arrow mechanism has been converted to \MKIV, but we kept %D most of the logic. We now have a more generic variant dealing with extensibles. %D There are a few demands than we need to meet: @@ -78,7 +84,7 @@ {\mathstylehbox{\usemathstackerscolorparameter\c!color \Umathaccent\fam\zerocount\scratchunicode{\hskip\hsize}}} -% these delimiters are a unuseable as theu don't center for small arguments: +% these delimiters are a unuseable as they don't center for small arguments: % % $\Umathaccent 0 0 "2190{x}$ \par $\Umathaccent 0 0 "27F8{x}$\par % $\Udelimiterunder 0 "2190{x}$ \par $\Udelimiterunder 0 "27F8{x}$\par @@ -121,6 +127,18 @@ \def\math_stackers_skip_indeed#amount% {\filledhboxk{\unsetteststrut\strut\hskip#amount}} % \dontshowstruts +\let\math_stackers_start_tagged_mid\relax +\let\math_stackers_start_tagged_top\relax +\let\math_stackers_start_tagged_bot\relax +\let\math_stackers_stop_tagged \relax + +\appendtoks + \def\math_stackers_start_tagged_mid{\dostarttagged\t!mathstackermid\empty\hbox\bgroup}% + \def\math_stackers_start_tagged_top{\dostarttagged\t!mathstackertop\empty\hbox\bgroup}% + \def\math_stackers_start_tagged_bot{\dostarttagged\t!mathstackerbot\empty\hbox\bgroup}% + \def\math_stackers_stop_tagged {\egroup\dostoptagged}% +\to \everysetuptagging + %D We define a full featured command handler. \installcorenamespace {mathstackers} @@ -139,9 +157,10 @@ \c!mpoffset=.25\exheight, \c!voffset=.25\exheight, \c!hoffset=.5\emwidth, + \c!distance=\mathstackersparameter\c!voffset, % distance between symbol and base (can be different from voffset) \c!minheight=\exheight, \c!mindepth=\zeropoint, - \c!minwidth=\emwidth, + \c!minwidth=.5\emwidth, \c!order=\v!normal, \c!strut=, \c!color=, % todo: when I need it @@ -203,11 +222,11 @@ \setvalue{\??mathstackersalternative\v!mp}% {\hbox\bgroup % todo: add code key + tag - \edef\overlaywidth {\the\scratchwidth}% - \edef\overlayheight {\the\dimexpr\mathstackersparameter\c!mpheight}% - \edef\overlaydepth {\the\dimexpr\mathstackersparameter\c!mpdepth}% - \edef\overlayoffset {\the\dimexpr\mathstackersparameter\c!mpoffset}% - \edef\overlaylinewidth{\the\linewidth}% + \d_overlay_width \scratchwidth + \d_overlay_height \dimexpr\mathstackersparameter\c!mpheight + \d_overlay_depth \dimexpr\mathstackersparameter\c!mpdepth + \d_overlay_offset \dimexpr\mathstackersparameter\c!mpoffset + \d_overlay_linewidth\linewidth \edef\overlaylinecolor{\mathstackersparameter\c!color}% \edef\p_mp{\mathstackersparameter\c!mp}% \uniqueMPgraphic{\p_mp}% @@ -261,9 +280,11 @@ \fi} \unexpanded\def\math_stackers_triplet#method#category#codepoint#toptext#bottomtext% + %{\math_stackers_start_group{#category}% {\begingroup \edef\currentmathstackers{#category}% \mathstackersparameter\c!left\relax + \dostarttagged\t!mathstacker\currentmathstackers \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi {\edef\p_offset {\mathstackersparameter\c!offset}% \edef\p_location {\mathstackersparameter\c!location}% @@ -311,7 +332,11 @@ \fi \scratchwidth\wd \ifdim\wd\scratchboxone>\wd\scratchboxtwo - \scratchboxone + \ifdim\wd\scratchboxone>\wd\scratchboxthree + \scratchboxone + \else + \scratchboxthree + \fi \else\ifdim\wd\scratchboxtwo>\wd\scratchboxthree \scratchboxtwo \else @@ -327,7 +352,9 @@ \advance\scratchwidth2\scratchhoffset % \ifcase#method\relax + \dostarttagged\t!mathstackermid\empty \setbox\scratchboxthree\csname\??mathstackersalternative\p_alternative\endcsname + \dostoptagged \fi % \ifdim\wd\scratchboxone<\scratchwidth @@ -370,30 +397,54 @@ \fi % \math_stackers_normalize_three - % - \math_stackers_middle\bgroup - \box\scratchboxthree - \egroup - % - \ifdim\htdp\scratchboxone>\zeropoint - \scratchoffset\dimexpr\scratchvoffset - \kern-\scratchwidth - \math_stackers_top\bgroup - \raise\dimexpr\dp\scratchboxone+\scratchheight+\scratchoffset+\scratchtopoffset\relax - \box\scratchboxone + % analysis + \ifdim\htdp\scratchboxtwo>\zeropoint + \ifdim\htdp\scratchboxone>\zeropoint + \dosettagproperty\s!subtype\t!munderover + \else + \dosettagproperty\s!subtype\t!munder + \fi + \else + \ifdim\htdp\scratchboxone>\zeropoint + \dosettagproperty\s!subtype\t!mover + \else + % brrr + \fi + \fi + % base + \math_stackers_start_tagged_mid + \math_stackers_middle\bgroup + \box\scratchboxthree \egroup + \math_stackers_stop_tagged + % under + \ifdim\htdp\scratchboxtwo>\zeropoint + \math_stackers_start_tagged_bot + \scratchoffset\scratchvoffset + \kern-\scratchwidth + \math_stackers_bottom\bgroup + \lower\dimexpr\ht\scratchboxtwo+\scratchdepth+\scratchoffset+\scratchbottomoffset\relax + \box\scratchboxtwo + \egroup + \math_stackers_stop_tagged + \fi + % over + \ifdim\htdp\scratchboxone>\zeropoint + \math_stackers_start_tagged_top + \scratchoffset\scratchvoffset + \kern-\scratchwidth + \math_stackers_top\bgroup + \raise\dimexpr\dp\scratchboxone+\scratchheight+\scratchoffset+\scratchtopoffset\relax + \box\scratchboxone + \egroup + \math_stackers_stop_tagged \fi % - \ifdim\htdp\scratchboxtwo>\zeropoint - \scratchoffset\dimexpr\scratchvoffset - \kern-\scratchwidth - \math_stackers_bottom\bgroup - \lower\dimexpr\ht\scratchboxtwo+\scratchdepth+\scratchoffset+\scratchbottomoffset\relax - \box\scratchboxtwo - \egroup - \fi}% + }% + \dostoptagged \mathstackersparameter\c!right\relax \endgroup} + %\math_stackers_start_group} \unexpanded\def\definemathextensible {\dotripleempty\math_stackers_define_normal} @@ -449,13 +500,25 @@ \def\math_class_by_parameter_indeed#1% {\csname\??mathclasses\ifcsname\??mathclasses#1\endcsname#1\fi\endcsname} -\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#text% +% 1 0 name n 0 | 0 1 name n 0 | 1 1 name n n + +\unexpanded\def\math_stackers_start_group#category% {\begingroup \edef\currentmathstackers{#category}% + \edef\p_limits{\mathstackersparameter\c!mathlimits}% + \ifx\p_limits\v!yes + \def\math_stackers_stop_group{\egroup\endgroup\limits}% + \mathop\bgroup + \else + \let\math_stackers_stop_group\endgroup + \fi} + +\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#text% + {\math_stackers_start_group{#category}% \mathstackersparameter\c!left\relax + \dostarttagged\t!mathstacker\currentmathstackers \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi - {\edef\currentmathstackers{#category}% - \edef\m_math_stackers_text_middle {#text}% + {\edef\m_math_stackers_text_middle {#text}% % \edef\p_offset {\mathstackersparameter\c!offset}% \edef\p_location {\mathstackersparameter\c!location}% @@ -467,7 +530,7 @@ % \math_stackers_check_unicode{#codepoint}% % - \ifx\currentmathtext\empty + \ifx\math_stackers_middle\empty \setbox\scratchboxthree\emptyhbox \else \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}% @@ -480,44 +543,74 @@ \fi \advance\scratchwidth2\scratchhoffset % - \setbox\scratchboxtwo \csname\??mathstackersalternative\p_alternative\endcsname + \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname \setbox\scratchboxthree\hbox to \scratchwidth{\hss\box\scratchboxthree\hss}% % - \math_stackers_normalize_three + \scratchunicode#codeextra\relax + \ifcase\scratchunicode\else + \setbox\scratchboxone\csname\??mathstackersalternative\p_alternative\endcsname + \fi % - \math_stackers_middle\bgroup - \box\scratchboxthree - \egroup + \math_stackers_normalize_three + % analysis + \ifcase#bottom\relax + \ifcase#top\relax + \dosettagproperty\s!subtype\t!munderover + \else + \dosettagproperty\s!subtype\t!mover + \fi + \else + \ifcase#top\relax + \dosettagproperty\s!subtype\t!munder + \else + % brrr + \fi + \fi + % base + \math_stackers_start_tagged_mid + \math_stackers_middle\bgroup + \box\scratchboxthree + \egroup + \math_stackers_stop_tagged % \ifdim\htdp\scratchboxtwo>\zeropoint - \kern-\scratchwidth - \ifcase#top\else - \math_stackers_top\bgroup - % \raise\dimexpr\scratchheight+\scratchtopoffset\relax - \raise\dimexpr\scratchheight+\mathstackersparameter\c!voffset\relax - \box\scratchboxtwo - \egroup - \fi - \scratchunicode#codeextra\relax - \ifcase\scratchunicode\else + \ifcase#bottom\else \kern-\scratchwidth - \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname + % under + \math_stackers_start_tagged_bot + \math_stackers_bottom\bgroup + \lower\dimexpr + \scratchdepth + +\ht\scratchboxtwo + +\mathstackersparameter\c!distance % was \c!voffset + \relax + \ifcase#top\relax + \box\scratchboxtwo + \else + \box\scratchboxone + \fi + \egroup + \math_stackers_stop_tagged \fi - \ifcase#bottom\else - \math_stackers_bottom\bgroup - % \lower\dimexpr\scratchdepth+\ht\scratchboxtwo+\scratchbottomoffset\relax - \lower\dimexpr\scratchdepth+\ht\scratchboxtwo+\mathstackersparameter\c!voffset\relax - \box\scratchboxtwo - \egroup + \ifcase#top\else + \kern-\scratchwidth + % over + \math_stackers_start_tagged_top + \math_stackers_top\bgroup + \raise\dimexpr + \scratchheight + +\dp\scratchboxtwo % new + +\mathstackersparameter\c!distance % was \c!voffset + \relax + \box\scratchboxtwo + \egroup + \math_stackers_stop_tagged \fi + % \fi}% + \dostoptagged \mathstackersparameter\c!right\relax - \edef\p_limits{\mathstackersparameter\c!mathlimits}% - \ifx\p_limits\v!yes - \expandafter\endgroup\expandafter\limits - \else - \expandafter\endgroup - \fi} + \math_stackers_stop_group} \unexpanded\def\definemathoverextensible {\dotripleempty \math_extensibles_define_over } \unexpanded\def\definemathunderextensible {\dotripleempty \math_extensibles_define_under} @@ -551,14 +644,173 @@ \def\math_stackers_handle_over[#category]% {\math_stackers_direct_double\plusone\zerocount{\iffirstargument#category\else\v!top \fi}} % will be defined later on -\def\math_stackers_handle_under[#category]#codepoint#bottomtext% +\def\math_stackers_handle_under[#category]% {\math_stackers_direct_double\zerocount\plusone{\iffirstargument#category\else\v!bottom\fi}} % will be defined later on -\def\math_stackers_handle_double[#category]#codepoint#bottomtext% +\def\math_stackers_handle_double[#category]% {\math_stackers_direct_double\plusone\plusone {\iffirstargument#category\else\v!bottom\fi}} % will be defined later on \def\math_stackers_direct_double#top#bottom#category#codepoint#text% - {\math_stackers_make_double#top#bottom{#category}{#codepoint}{#text}% + {\math_stackers_make_double#top#bottom{#category}{#codepoint}{0}{#text}% + \endgroup} + +%D A relative new one is a combination of accents and text (as needed in mathml): + +\unexpanded\def\math_stackers_make_double_text#where#category#codepoint#text#extra% + {\math_stackers_start_group{#category}% + \mathstackersparameter\c!left\relax + \dostarttagged\t!mathstacker\currentmathstackers + \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi + {\edef\currentmathstackers{#category}% + % + \edef\p_offset {\mathstackersparameter\c!offset}% + \edef\p_location {\mathstackersparameter\c!location}% + \edef\p_strut {\mathstackersparameter\c!strut}% + \edef\p_alternative{\mathstackersparameter\c!alternative}% + % + \scratchleftoffset \zeropoint + \scratchrightoffset\zeropoint + % + \edef\m_math_stackers_text_middle{#text}% + \math_stackers_check_unicode{#codepoint}% + \scratchunicode#codepoint\relax + % + \ifx\math_stackers_middle\empty + \setbox\scratchboxthree\emptyhbox + \else + \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}% + \fi + % + \ifcase#where\relax + \edef\m_math_stackers_text_top{#extra}% + \ifx\math_stackers_top\empty + \setbox\scratchboxone\emptyhbox + \else + \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_toptext}% + \fi + \else + \edef\m_math_stackers_text_bottom{#extra}% + \ifx\math_stackers_bottom\empty + \setbox\scratchboxone\emptyhbox + \else + \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_bottomtext}% + \fi + \fi + % + \scratchwidth\wd + \ifdim\wd\scratchboxone>\wd\scratchboxthree + \scratchboxone + \else + \scratchboxthree + \fi + \relax + \scratchdimen\mathstackersparameter\c!minwidth\relax + \ifdim\scratchwidth<\scratchdimen + \scratchwidth\scratchdimen + \fi + \advance\scratchwidth2\scratchhoffset + % + \ifdim\wd\scratchboxone<\scratchwidth + \setbox\scratchboxone\hbox to \scratchwidth{\hss\unhbox\scratchboxone\hss}% + \fi + \ifdim\wd\scratchboxthree<\scratchwidth + \setbox\scratchboxthree\hbox to \scratchwidth{\hss\unhbox\scratchboxthree\hss}% + \fi + % + \math_stackers_normalize_three + % analysis + \dosettagproperty\s!subtype\t!munderover + % base + \math_stackers_start_tagged_mid + \math_stackers_middle\bgroup + \box\scratchboxthree + \egroup + \math_stackers_stop_tagged + % + \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname + \kern-\scratchwidth + \ifcase#where\relax + % under + \math_stackers_start_tagged_bot + \math_stackers_bottom\bgroup + \lower\dimexpr + \scratchdepth + +\ht\scratchboxtwo + +\mathstackersparameter\c!distance + \relax + \box\scratchboxtwo % accent + \egroup + \math_stackers_stop_tagged + \kern-\scratchwidth + % over + \math_stackers_start_tagged_top + \math_stackers_top\bgroup + \raise\dimexpr + \scratchheight + +\dp\scratchboxone + +\mathstackersparameter\c!voffset + \relax + \box\scratchboxone % toptext + \egroup + \math_stackers_stop_tagged + \else + % under + \math_stackers_start_tagged_bot + \math_stackers_bottom\bgroup + \lower\dimexpr + \scratchdepth + +\ht\scratchboxone + +\mathstackersparameter\c!voffset + \relax + \box\scratchboxone % bottext + \egroup + \math_stackers_stop_tagged + \kern-\scratchwidth + % over + \math_stackers_start_tagged_top + \math_stackers_top\bgroup + \raise\dimexpr + \scratchheight + +\dp\scratchboxtwo % new + +\mathstackersparameter\c!distance + \relax + \box\scratchboxtwo % accent + \egroup + \math_stackers_stop_tagged + \fi + }% + \dostoptagged + \mathstackersparameter\c!right\relax + \math_stackers_stop_group} + +\unexpanded\def\definemathovertextextensible {\dotripleempty\math_extensibles_define_over_text } +\unexpanded\def\definemathundertextextensible{\dotripleempty\math_extensibles_define_under_text} + +\def\math_extensibles_define_over_text[#1][#2][#3]% + {\ifthirdargument + \setuevalue{#2}{\math_stackers_make_double_text\plusone {#1}{\number#3}}% + \else + \setuevalue{#1}{\math_stackers_make_double_text\plusone \noexpand\currentmathstackers{\number#2}}% + \fi} + +\def\math_extensibles_define_under_text[#1][#2][#3]% + {\ifthirdargument + \setuevalue{#2}{\math_stackers_make_double_text\zerocount{#1}{\number#3}}% + \else + \setuevalue{#1}{\math_stackers_make_double_text\zerocount\noexpand\currentmathstackers{\number#2}}% + \fi} + +\unexpanded\def\mathovertext {\begingroup\dosingleempty\math_stackers_handle_over_text } +\unexpanded\def\mathundertext{\begingroup\dosingleempty\math_stackers_handle_under_text } + +\def\math_stackers_handle_over_text[#category]% + {\math_stackers_direct_double_text\plusone {\iffirstargument#category\else\v!top \fi}} % will be defined later on + +\def\math_stackers_handle_under_text[#category]% + {\math_stackers_direct_double_text\zerocount{\iffirstargument#category\else\v!bottom\fi}} % will be defined later on + +\def\math_stackers_direct_double_text#where#category#codepoint#text#extra%% + {\math_stackers_make_double_text#where{#category}{#codepoint}{#text}{#extra}% \endgroup} %D Here is a bonus macro that takes three texts. It can be used to get consistent @@ -654,11 +906,23 @@ [\v!both] \definemathstackers - [vfenced] + [\v!vfenced] [\v!both] [\c!mathclass=\s!ord, \c!mathlimits=\v!yes] +% these are needed for mathml: + +% \setupmathstackers +% [\v!both] +% [\c!hoffset=1pt, +% \c!voffset=1pt] + +\definemathstackers + [\v!bothtext] + [\v!both] + [\c!strut=\v!yes] + % These are compatibity definitions, math only. % todo: top= bottom= middle= is nicer (compare math-fen) @@ -761,6 +1025,24 @@ \definemathextensible [\v!mathematics] [mrightleftharpoons] ["21CC] \definemathextensible [\v!mathematics] [mtriplerel] ["2261] +\definemathextensible [\v!mathematics] [eleftarrowfill] ["2190] % ["27F5] +\definemathextensible [\v!mathematics] [erightarrowfill] ["2192] % ["27F6] +\definemathextensible [\v!mathematics] [eleftrightarrowfill] ["27F7] +\definemathextensible [\v!mathematics] [etwoheadrightarrowfill] ["27F9] +\definemathextensible [\v!mathematics] [eleftharpoondownfill] ["21BD] +\definemathextensible [\v!mathematics] [eleftharpoonupfill] ["21BC] +\definemathextensible [\v!mathematics] [erightharpoondownfill] ["21C1] +\definemathextensible [\v!mathematics] [erightharpoonupfill] ["21C0] + +\definemathextensible [\v!mathematics] [eoverbarfill] ["FE33E] +\definemathextensible [\v!mathematics] [eunderbarfill] ["FE33F] +\definemathextensible [\v!mathematics] [eoverbracefill] ["FE3DE] +\definemathextensible [\v!mathematics] [eunderbracefill] ["FE3DF] +\definemathextensible [\v!mathematics] [eoverparentfill] ["FE3DC] +\definemathextensible [\v!mathematics] [eunderparentfill] ["FE3DD] +\definemathextensible [\v!mathematics] [eoverbracketfill] ["FE3B4] +\definemathextensible [\v!mathematics] [eunderbracketfill] ["FE3B5] + \definemathextensible [\v!text] [trel] ["002D] \definemathextensible [\v!text] [tequal] ["003D] \definemathextensible [\v!text] [tmapsto] ["21A6] @@ -819,23 +1101,39 @@ % alternatively we can move the original to FE* \definemathoverextensible [vfenced] [overbar] ["FE33E] % ["203E] -\definemathunderextensible [vfenced] [underbar] ["FE33F] % ["203E] +\definemathunderextensible [vfenced] [underbar] ["FE33F] % ["203E] \definemathdoubleextensible [vfenced] [doublebar] ["FE33E] ["FE33F] \definemathoverextensible [vfenced] [overbrace] ["FE3DE] % ["023DE] -\definemathunderextensible [vfenced] [underbrace] ["FE3DF] % ["023DF] +\definemathunderextensible [vfenced] [underbrace] ["FE3DF] % ["023DF] \definemathdoubleextensible [vfenced] [doublebrace] ["FE3DE] ["FE3DF] \definemathoverextensible [vfenced] [overparent] ["FE3DC] % ["023DC] -\definemathunderextensible [vfenced] [underparent] ["FE3DD] % ["023DD] +\definemathunderextensible [vfenced] [underparent] ["FE3DD] % ["023DD] \definemathdoubleextensible [vfenced] [doubleparent] ["FE3DC] ["FE3DD] \definemathoverextensible [vfenced] [overbracket] ["FE3B4] % ["023B4] -\definemathunderextensible [vfenced] [underbracket] ["FE3B5] % ["023B5] +\definemathunderextensible [vfenced] [underbracket] ["FE3B5] % ["023B5] \definemathdoubleextensible [vfenced] [doublebracket] ["FE3B4] ["FE3B5] % \unexpanded\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits} +%D For mathml: + +\definemathdoubleextensible [both] [overbarunderbar] ["FE33E] ["FE33F] +\definemathdoubleextensible [both] [overbraceunderbrace] ["FE3DE] ["FE3DF] +\definemathdoubleextensible [both] [overparentunderparent] ["FE3DC] ["FE3DD] +\definemathdoubleextensible [both] [overbracketunderbracket] ["FE3B4] ["FE3B5] + +\definemathovertextextensible [bothtext] [overbartext] ["FE33E] +\definemathundertextextensible [bothtext] [underbartext] ["FE33F] +\definemathovertextextensible [bothtext] [overbracetext] ["FE3DE] +\definemathundertextextensible [bothtext] [underbracetext] ["FE3DF] +\definemathovertextextensible [bothtext] [overparenttext] ["FE3DC] +\definemathundertextextensible [bothtext] [underparenttext] ["FE3DD] +\definemathovertextextensible [bothtext] [overbrackettext] ["FE3B4] +\definemathundertextextensible [bothtext] [underbrackettext] ["FE3B5] + %D Some bonus ones (for the moment here): \definemathstackers @@ -927,6 +1225,15 @@ \defineextensiblefiller [Leftrightarrowfill] ["27FA] \defineextensiblefiller [Leftrightarrowfill] ["27FA] +%defineextensiblefiller [overbarfill] ["FE33E] % untested +%defineextensiblefiller [underbarfill] ["FE33F] % untested +\defineextensiblefiller [overbracefill] ["FE3DE] % untested +\defineextensiblefiller [underbracefill] ["FE3DF] % untested +\defineextensiblefiller [overparentfill] ["FE3DC] % untested +\defineextensiblefiller [underparentfill] ["FE3DD] % untested +\defineextensiblefiller [overbracketfill] ["FE3B4] % untested +\defineextensiblefiller [underbracketfill] ["FE3B5] % untested + %D Extra: \unexpanded\edef\singlebond{\mathematics{\mathsurround\zeropoint\char\number"002D}} diff --git a/Master/texmf-dist/tex/context/base/math-tag.lua b/Master/texmf-dist/tex/context/base/math-tag.lua index 3cd4cae16eb..61d28edde61 100644 --- a/Master/texmf-dist/tex/context/base/math-tag.lua +++ b/Master/texmf-dist/tex/context/base/math-tag.lua @@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['math-tag'] = { license = "see context related readme files" } +-- todo: have a local list with local tags that then get appended + -- use lpeg matchers local find, match = string.find, string.match -local insert, remove = table.insert, table.remove +local insert, remove, concat = table.insert, table.remove, table.concat local attributes = attributes local nodes = nodes @@ -22,6 +24,7 @@ local getid = nuts.getid local getchar = nuts.getchar local getlist = nuts.getlist local getfield = nuts.getfield +local getsubtype = nuts.getsubtype local getattr = nuts.getattr local setattr = nuts.setattr @@ -43,15 +46,32 @@ local math_style_code = nodecodes.style -- attr style local math_choice_code = nodecodes.choice -- attr display text script scriptscript local math_fence_code = nodecodes.fence -- attr subtype +local accentcodes = nodes.accentcodes + +local math_fixed_top = accentcodes.fixedtop +local math_fixed_bottom = accentcodes.fixedbottom +local math_fixed_both = accentcodes.fixedboth + +local kerncodes = nodes.kerncodes + +local fontkern_code = kerncodes.fontkern + local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc local glue_code = nodecodes.glue +local kern_code = nodecodes.kern +local math_code = nodecodes.math + +local processnoads = noads.process local a_tagged = attributes.private('tagged') +local a_taggedpar = attributes.private('taggedpar') local a_exportstatus = attributes.private('exportstatus') local a_mathcategory = attributes.private('mathcategory') local a_mathmode = attributes.private('mathmode') +local a_fontkern = attributes.private('fontkern') local tags = structures.tags @@ -67,33 +87,53 @@ local mathcodes = mathematics.codes local ordinary_code = mathcodes.ordinary local variable_code = mathcodes.variable +local fromunicode16 = fonts.mappings.fromunicode16 +local font_of_family = node.family_font +local fontcharacters = fonts.hashes.characters + +local report_tags = logs.reporter("structure","tags") + local process local function processsubsup(start) -- At some point we might need to add an attribute signaling the -- super- and subscripts because TeX and MathML use a different - -- order. + -- order. The mrows are needed to keep mn's separated. local nucleus = getfield(start,"nucleus") local sup = getfield(start,"sup") local sub = getfield(start,"sub") if sub then if sup then setattr(start,a_tagged,start_tagged("msubsup")) + -- start_tagged("mrow") process(nucleus) + -- stop_tagged() + start_tagged("mrow") process(sub) + stop_tagged() + start_tagged("mrow") process(sup) stop_tagged() + stop_tagged() else setattr(start,a_tagged,start_tagged("msub")) + -- start_tagged("mrow") process(nucleus) + -- stop_tagged() + start_tagged("mrow") process(sub) stop_tagged() + stop_tagged() end elseif sup then setattr(start,a_tagged,start_tagged("msup")) + -- start_tagged("mrow") process(nucleus) + -- stop_tagged() + start_tagged("mrow") process(sup) stop_tagged() + stop_tagged() else process(nucleus) end @@ -104,263 +144,407 @@ end -- todo: variants -> original local actionstack = { } +local fencesstack = { } + +-- glyph nodes and such can happen in under and over stuff + +local function getunicode(n) -- instead of getchar + local char = getchar(n) + local font = font_of_family(getfield(n,"fam")) -- font_of_family + local data = fontcharacters[font][char] + return data.unicode or char +end + +------------------- + +local content = { } +local found = false + +content[math_char_code] = function() found = true end + +local function hascontent(head) + found = false + processnoads(head,content,"content") + return found +end + +-------------------- + +local function showtag(n,id) + local attr = getattr(n,a_tagged) + report_tags("%s = %s",nodecodes[id or getid(n)],attr and taglist[attr].tagname or "?") +end process = function(start) -- we cannot use the processor as we have no finalizers (yet) + local mtexttag = nil while start do local id = getid(start) - if id == math_char_code then - local char = getchar(start) - -- check for code - local a = getattr(start,a_mathcategory) - if a then - a = { detail = a } + +-- showtag(start,id) + + if id == glyph_code or id == disc_code then + if not mtexttag then + mtexttag = start_tagged("mtext") end - local code = getmathcode(char) - if code then - code = code[1] + setattr(start,a_tagged,mtexttag) + elseif mtexttag and id == kern_code and (getsubtype(start) == fontkern_code or getattr(start,a_fontkern)) then + setattr(start,a_tagged,mtexttag) + else + if mtexttag then + stop_tagged() + mtexttag = nil end - local tag - if code == ordinary_code or code == variable_code then - local ch = chardata[char] - local mc = ch and ch.mathclass - if mc == "number" then - tag = "mn" - elseif mc == "variable" or not mc then -- variable is default - tag = "mi" + if id == math_char_code then + local char = getchar(start) + local code = getmathcode(char) + if code then + code = code[1] + end + local tag + if code == ordinary_code or code == variable_code then + local ch = chardata[char] + local mc = ch and ch.mathclass + if mc == "number" then + tag = "mn" + elseif mc == "variable" or not mc then -- variable is default + tag = "mi" + else + tag = "mo" + end else tag = "mo" end - else - tag = "mo" - end - setattr(start,a_tagged,start_tagged(tag,a)) - stop_tagged() - break -- okay? - elseif id == math_textchar_code then - -- check for code - local a = getattr(start,a_mathcategory) - if a then - setattr(start,a_tagged,start_tagged("ms",{ detail = a })) - else - setattr(start,a_tagged,start_tagged("ms")) - end - stop_tagged() - break - elseif id == math_delim_code then - -- check for code - setattr(start,a_tagged,start_tagged("mo")) - stop_tagged() - break - elseif id == math_style_code then - -- has a next - elseif id == math_noad_code then - processsubsup(start) - elseif id == math_box_code or id == hlist_code or id == vlist_code then - -- keep an eye on math_box_code and see what ends up in there - local attr = getattr(start,a_tagged) - local last = attr and taglist[attr] - if last and find(last[#last],"formulacaption[:%-]") then - -- leave alone, will nicely move to the outer level - else - local text = start_tagged("mtext") - setattr(start,a_tagged,text) - local list = getfield(start,"list") - if not list then - -- empty list - elseif not attr then - -- box comes from strange place - set_attributes(list,a_tagged,text) + local a = getattr(start,a_mathcategory) + if a then + setattr(start,a_tagged,start_tagged(tag,{ mathcategory = a })) else - -- Beware, the first node in list is the actual list so we definitely - -- need to nest. This approach is a hack, maybe I'll make a proper - -- nesting feature to deal with this at another level. Here we just - -- fake structure by enforcing the inner one. - local tagdata = taglist[attr] - local common = #tagdata + 1 - local function runner(list) -- quite inefficient - local cache = { } -- we can have nested unboxed mess so best local to runner - for n in traverse_nodes(list) do - local id = getid(n) - local aa = getattr(n,a_tagged) - if aa then - local ac = cache[aa] - if not ac then - local tagdata = taglist[aa] - local extra = #tagdata - if common <= extra then - for i=common,extra do - ac = restart_tagged(tagdata[i]) -- can be made faster - end - for i=common,extra do - stop_tagged() -- can be made faster + setattr(start,a_tagged,start_tagged(tag)) -- todo: a_mathcategory + end + stop_tagged() + break -- okay? + elseif id == math_textchar_code then -- or id == glyph_code + -- check for code + local a = getattr(start,a_mathcategory) + if a then + setattr(start,a_tagged,start_tagged("ms",{ mathcategory = a })) -- mtext + else + setattr(start,a_tagged,start_tagged("ms")) -- mtext + end + stop_tagged() + break + elseif id == math_delim_code then + -- check for code + setattr(start,a_tagged,start_tagged("mo")) + stop_tagged() + break + elseif id == math_style_code then + -- has a next + elseif id == math_noad_code then + processsubsup(start) + elseif id == math_box_code or id == hlist_code or id == vlist_code then + -- keep an eye on math_box_code and see what ends up in there + local attr = getattr(start,a_tagged) + local specification = taglist[attr] + local tag = specification.tagname + if tag == "formulacaption" then + -- skip + elseif tag == "mstacker" then + local list = getfield(start,"list") + if list then + process(list) + end + else + if tag ~= "mstackertop" and tag ~= "mstackermid" and tag ~= "mstackerbot" then + tag = "mtext" + end + local text = start_tagged(tag) + setattr(start,a_tagged,text) + local list = getfield(start,"list") + if not list then + -- empty list + elseif not attr then + -- box comes from strange place + set_attributes(list,a_tagged,text) -- only the first node ? + else + -- Beware, the first node in list is the actual list so we definitely + -- need to nest. This approach is a hack, maybe I'll make a proper + -- nesting feature to deal with this at another level. Here we just + -- fake structure by enforcing the inner one. + -- + -- todo: have a local list with local tags that then get appended + -- + local tagdata = specification.taglist + local common = #tagdata + 1 + local function runner(list,depth) -- quite inefficient + local cache = { } -- we can have nested unboxed mess so best local to runner + local keep = nil + -- local keep = { } -- win case we might need to move keep outside + for n in traverse_nodes(list) do + local id = getid(n) + local mth = id == math_code and getsubtype(n) + if mth == 0 then + -- insert(keep,text) + keep = text + text = start_tagged("mrow") + common = common + 1 + end + local aa = getattr(n,a_tagged) + if aa then + local ac = cache[aa] + if not ac then + local tagdata = taglist[aa].taglist + local extra = #tagdata + if common <= extra then + for i=common,extra do + ac = restart_tagged(tagdata[i]) -- can be made faster + end + for i=common,extra do + stop_tagged() -- can be made faster + end + else + ac = text end - else - ac = text + cache[aa] = ac end - cache[aa] = ac + setattr(n,a_tagged,ac) + else + setattr(n,a_tagged,text) + end + + if id == hlist_code or id == vlist_code then + runner(getlist(n),depth+1) + elseif id == glyph_code then + runner(getfield(n,"components"),depth+1) -- this should not be needed + elseif id == disc_node then + runner(getfield(n,"pre"),depth+1) -- idem + runner(getfield(n,"post"),depth+1) -- idem + runner(getfield(n,"replace"),depth+1) -- idem + end + if mth == 1 then + stop_tagged() + -- text = remove(keep) + text = keep + common = common - 1 end - setattr(n,a_tagged,ac) - else - setattr(n,a_tagged,text) - end - if id == hlist_code or id == vlist_code then - runner(getlist(n)) end end + runner(list,0) end - runner(list) + stop_tagged() end - stop_tagged() - end - elseif id == math_sub_code then - local list = getfield(start,"list") - if list then - local attr = getattr(start,a_tagged) - local last = attr and taglist[attr] - local action = last and match(last[#last],"maction:(.-)%-") - if action and action ~= "" then - if actionstack[#actionstack] == action then + elseif id == math_sub_code then -- normally a hbox + local list = getfield(start,"list") + if list then + local attr = getattr(start,a_tagged) + local last = attr and taglist[attr] + if last then + local tag = last.tagname + local detail = last.detail + if tag == "maction" then + if detail == "" then + setattr(start,a_tagged,start_tagged("mrow")) + process(list) + stop_tagged() + elseif actionstack[#actionstack] == action then + setattr(start,a_tagged,start_tagged("mrow")) + process(list) + stop_tagged() + else + insert(actionstack,action) + setattr(start,a_tagged,start_tagged("mrow",{ detail = action })) + process(list) + stop_tagged() + remove(actionstack) + end + elseif tag == "mstacker" then -- or tag == "mstackertop" or tag == "mstackermid" or tag == "mstackerbot" then + -- looks like it gets processed twice +-- do we still end up here ? + setattr(start,a_tagged,restart_tagged(attr)) -- so we just reuse the attribute + process(list) + stop_tagged() + else + setattr(start,a_tagged,start_tagged("mrow")) + process(list) + stop_tagged() + end + else -- never happens, we're always document setattr(start,a_tagged,start_tagged("mrow")) process(list) stop_tagged() - else - insert(actionstack,action) - setattr(start,a_tagged,start_tagged("mrow",{ detail = action })) - process(list) - stop_tagged() - remove(actionstack) end - else - setattr(start,a_tagged,start_tagged("mrow")) - process(list) - stop_tagged() end - end - elseif id == math_fraction_code then - local num = getfield(start,"num") - local denom = getfield(start,"denom") - local left = getfield(start,"left") - local right = getfield(start,"right") - if left then - setattr(left,a_tagged,start_tagged("mo")) - process(left) - stop_tagged() - end - setattr(start,a_tagged,start_tagged("mfrac")) - process(num) - process(denom) - stop_tagged() - if right then - setattr(right,a_tagged,start_tagged("mo")) - process(right) + elseif id == math_fraction_code then + local num = getfield(start,"num") + local denom = getfield(start,"denom") + local left = getfield(start,"left") + local right = getfield(start,"right") + if left then + setattr(left,a_tagged,start_tagged("mo")) + process(left) + stop_tagged() + end + setattr(start,a_tagged,start_tagged("mfrac")) + process(num) + process(denom) stop_tagged() - end - elseif id == math_choice_code then - local display = getfield(start,"display") - local text = getfield(start,"text") - local script = getfield(start,"script") - local scriptscript = getfield(start,"scriptscript") - if display then - process(display) - end - if text then - process(text) - end - if script then - process(script) - end - if scriptscript then - process(scriptscript) - end - elseif id == math_fence_code then - local delim = getfield(start,"delim") - local subtype = getfield(start,"subtype") - -- setattr(start,a_tagged,start_tagged("mfenced")) -- needs checking - if subtype == 1 then - -- left - if delim then - setattr(start,a_tagged,start_tagged("mleft")) - process(delim) + if right then + setattr(right,a_tagged,start_tagged("mo")) + process(right) stop_tagged() end - elseif subtype == 2 then - -- middle - if delim then - setattr(start,a_tagged,start_tagged("mmiddle")) - process(delim) + elseif id == math_choice_code then + local display = getfield(start,"display") + local text = getfield(start,"text") + local script = getfield(start,"script") + local scriptscript = getfield(start,"scriptscript") + if display then + process(display) + end + if text then + process(text) + end + if script then + process(script) + end + if scriptscript then + process(scriptscript) + end + elseif id == math_fence_code then + local delim = getfield(start,"delim") + local subtype = getfield(start,"subtype") + if subtype == 1 then + -- left + local properties = { } + insert(fencesstack,properties) + setattr(start,a_tagged,start_tagged("mfenced",{ properties = properties })) -- needs checking + if delim then + start_tagged("ignore") + local chr = getfield(delim,"small_char") + if chr ~= 0 then + properties.left = chr + end + process(delim) + stop_tagged() + end + start_tagged("mrow") -- begin of subsequence + elseif subtype == 2 then + -- middle + if delim then + start_tagged("ignore") + local top = fencesstack[#fencesstack] + local chr = getfield(delim,"small_char") + if chr ~= 0 then + local mid = top.middle + if mid then + mid[#mid+1] = chr + else + top.middle = { chr } + end + end + process(delim) + stop_tagged() + end + stop_tagged() -- end of subsequence + start_tagged("mrow") -- begin of subsequence + elseif subtype == 3 then + local properties = remove(fencesstack) + if not properties then + report_tags("missing right fence") + properties = { } + end + if delim then + start_tagged("ignore") + local chr = getfield(delim,"small_char") + if chr ~= 0 then + properties.right = chr + end + process(delim) + stop_tagged() + end + stop_tagged() -- end of subsequence stop_tagged() + else + -- can't happen end - elseif subtype == 3 then - if delim then - setattr(start,a_tagged,start_tagged("mright")) - process(delim) + elseif id == math_radical_code then + local left = getfield(start,"left") + local degree = getfield(start,"degree") + if left then + start_tagged("ignore") + process(left) -- root symbol, ignored stop_tagged() end - else - -- can't happen - end - -- stop_tagged() - elseif id == math_radical_code then - local left = getfield(start,"left") - local degree = getfield(start,"degree") - if left then - start_tagged("") - process(left) -- root symbol, ignored - stop_tagged() - end - if degree then -- not good enough, can be empty mlist - setattr(start,a_tagged,start_tagged("mroot")) - processsubsup(start) - process(degree) - stop_tagged() - else - setattr(start,a_tagged,start_tagged("msqrt")) - processsubsup(start) - stop_tagged() - end - elseif id == math_accent_code then - local accent = getfield(start,"accent") - local bot_accent = getfield(start,"bot_accent") - if bot_accent then - if accent then - setattr(start,a_tagged,start_tagged("munderover",{ detail = "accent" })) + if degree and hascontent(degree) then + setattr(start,a_tagged,start_tagged("mroot")) processsubsup(start) - process(bot_accent) - process(accent) + process(degree) stop_tagged() else - setattr(start,a_tagged,start_tagged("munder",{ detail = "accent" })) + setattr(start,a_tagged,start_tagged("msqrt")) processsubsup(start) - process(bot_accent) stop_tagged() end - elseif accent then - setattr(start,a_tagged,start_tagged("mover",{ detail = "accent" })) - processsubsup(start) - process(accent) + elseif id == math_accent_code then + local accent = getfield(start,"accent") + local bot_accent = getfield(start,"bot_accent") + local subtype = getsubtype(start) + if bot_accent then + if accent then + setattr(start,a_tagged,start_tagged("munderover", { + accent = true, + top = getunicode(accent), + bottom = getunicode(bot_accent), + topfixed = subtype == math_fixed_top or subtype == math_fixed_both, + bottomfixed = subtype == math_fixed_bottom or subtype == math_fixed_both, + })) + processsubsup(start) + process(bot_accent) + process(accent) + stop_tagged() + else + setattr(start,a_tagged,start_tagged("munder", { + accent = true, + bottom = getunicode(bot_accent), + bottomfixed = subtype == math_fixed_bottom or subtype == math_fixed_both, + })) + processsubsup(start) + process(bot_accent) + stop_tagged() + end + elseif accent then + setattr(start,a_tagged,start_tagged("mover", { + accent = true, + top = getunicode(accent), + topfixed = subtype == math_fixed_top or subtype == math_fixed_both, + })) + processsubsup(start) + process(accent) + stop_tagged() + else + processsubsup(start) + end + elseif id == glue_code then + -- local spec = getfield(start,"spec") + -- setattr(start,a_tagged,start_tagged("mspace",{ width = getfield(spec,"width") })) + setattr(start,a_tagged,start_tagged("mspace")) stop_tagged() else - processsubsup(start) + setattr(start,a_tagged,start_tagged("merror", { detail = nodecodes[i] })) + stop_tagged() end - elseif id == glue_code then - setattr(start,a_tagged,start_tagged("mspace")) - stop_tagged() - else - setattr(start,a_tagged,start_tagged("merror", { detail = nodecodes[i] })) - stop_tagged() end start = getnext(start) end + if mtexttag then + stop_tagged() + end end function noads.handlers.tags(head,style,penalties) head = tonut(head) - local v_math = start_tagged("math") - local v_mrow = start_tagged("mrow") local v_mode = getattr(head,a_mathmode) - -- setattr(head,a_tagged,v_math) - setattr(head,a_tagged,v_mrow) - tags.setattributehash(v_math,"mode",v_mode == 1 and "display" or "inline") + local v_math = start_tagged("math", { mode = v_mode == 1 and "display" or "inline" }) + setattr(head,a_tagged,start_tagged("mrow")) process(head) stop_tagged() stop_tagged() diff --git a/Master/texmf-dist/tex/context/base/math-vfu.lua b/Master/texmf-dist/tex/context/base/math-vfu.lua index 6d9a9f903bc..a683e02cfdc 100644 --- a/Master/texmf-dist/tex/context/base/math-vfu.lua +++ b/Master/texmf-dist/tex/context/base/math-vfu.lua @@ -41,6 +41,8 @@ local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex local formatters = string.formatters +local chardata = characters.data + local mathencodings = allocate() fonts.encodings.math = mathencodings -- better is then: fonts.encodings.vectors local vfmath = allocate() @@ -432,6 +434,14 @@ local function repeated(main,characters,id,size,unicode,u,n,private,fraction) -- end end +local function cloned(main,characters,id,size,source,target) + local data = characters[source] + if data then + characters[target] = data + return true + end +end + -- we use the fact that context defines the smallest sizes first .. a real dirty and ugly hack local data_of_smaller = nil @@ -451,10 +461,11 @@ function vfmath.addmissing(main,id,size) -- here id is the index in fonts (normally 14 or so) and that slot points to self - local characters = main.characters - local shared = main.shared - local variables = main.goodies.mathematics and main.goodies.mathematics.variables or { } + local characters = main.characters + local shared = main.shared + local variables = main.goodies.mathematics and main.goodies.mathematics.variables or { } local joinrelfactor = variables.joinrelfactor or 3 + for i=0x7A,0x7D do make(main,characters,id,size,i,1) end @@ -536,23 +547,24 @@ function vfmath.addmissing(main,id,size) -- 21CB leftrightharpoon -- 21CC rightleftharpoon - stack (main,characters,id,size,0x2259,0x0003D,3,0x02227) -- \buildrel\wedge\over= - jointwo (main,characters,id,size,0x22C8,0x022B3,joinrelfactor,0x022B2) -- \mathrel\triangleright\joinrel\mathrel\triangleleft (4 looks better than 3) - jointwo (main,characters,id,size,0x22A7,0x0007C,joinrelfactor,0x0003D) -- \mathrel|\joinrel= - jointwo (main,characters,id,size,0x2260,0x00338,0,0x0003D) -- \not\equal - jointwo (main,characters,id,size,0x2284,0x00338,0,0x02282) -- \not\subset - jointwo (main,characters,id,size,0x2285,0x00338,0,0x02283) -- \not\supset - jointwo (main,characters,id,size,0x2209,0x00338,0,0x02208) -- \not\in - jointwo (main,characters,id,size,0x2254,0x03A,0,0x03D) -- := (≔) + stack(main,characters,id,size,0x2259,0x0003D,3,0x02227) -- \buildrel\wedge\over= + + jointwo(main,characters,id,size,0x22C8,0x022B3,joinrelfactor,0x022B2) -- \mathrel\triangleright\joinrel\mathrel\triangleleft (4 looks better than 3) + jointwo(main,characters,id,size,0x22A7,0x0007C,joinrelfactor,0x0003D) -- \mathrel|\joinrel= + jointwo(main,characters,id,size,0x2260,0x00338,0,0x0003D) -- \not\equal + jointwo(main,characters,id,size,0x2284,0x00338,0,0x02282) -- \not\subset + jointwo(main,characters,id,size,0x2285,0x00338,0,0x02283) -- \not\supset + jointwo(main,characters,id,size,0x2209,0x00338,0,0x02208) -- \not\in + jointwo(main,characters,id,size,0x2254,0x03A,0,0x03D) -- := (≔) repeated(main,characters,id,size,0x222C,0x222B,2,0xFF800,1/3) repeated(main,characters,id,size,0x222D,0x222B,3,0xFF810,1/3) - characters[0xFE325] = fastcopy(characters[0x2032]) - - raise (main,characters,id,size,0x02032,0xFE325,1,id_of_smaller) -- prime - raise (main,characters,id,size,0x02033,0xFE325,2,id_of_smaller) -- double prime - raise (main,characters,id,size,0x02034,0xFE325,3,id_of_smaller) -- triple prime + if cloned(main,characters,id,size,0x2032,0xFE325) then + raise(main,characters,id,size,0x2032,0xFE325,1,id_of_smaller) -- prime + raise(main,characters,id,size,0x2033,0xFE325,2,id_of_smaller) -- double prime + raise(main,characters,id,size,0x2034,0xFE325,3,id_of_smaller) -- triple prime + end -- there are more (needs discussion first): @@ -882,7 +894,7 @@ function vfmath.define(specification,set,goodies) local ru = rv[unicode] if not ru then if trace_virtual then - report_virtual("unicode slot %U has no index %H in vector %a for font %a",unicode,index,vectorname,fontname) + report_virtual("unicode slot %U has no index %H in vector %a for font %a (%S)",unicode,index,vectorname,fontname,chardata[unicode].description) elseif not already_reported then report_virtual("the mapping is incomplete for %a at %p",name,size) already_reported = true diff --git a/Master/texmf-dist/tex/context/base/meta-fig.mkiv b/Master/texmf-dist/tex/context/base/meta-fig.mkiv index 46dc4cffc81..bf37aa7bfa7 100644 --- a/Master/texmf-dist/tex/context/base/meta-fig.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-fig.mkiv @@ -47,6 +47,9 @@ \c!command=\meta_process_graphic_instance{\fittingpageparameter\c!instance}, \c!instance=] +\unexpanded\def\setupMPpage + {\setupfittingpage[MPpage]} + %D \macros %D {MPfigure} %D @@ -56,7 +59,7 @@ {\bgroup \getfiguredimensions[#1]% [\c!object=\v!no] already set \startMPcode - externalfigure "#1" + draw externalfigure "#1" xscaled \the\dimexpr\figurewidth \relax\space % must be points yscaled \the\dimexpr\figureheight\relax\space % must be points #2 ; diff --git a/Master/texmf-dist/tex/context/base/meta-fnt.lua b/Master/texmf-dist/tex/context/base/meta-fnt.lua index 596d0f45669..95bdfa6d966 100644 --- a/Master/texmf-dist/tex/context/base/meta-fnt.lua +++ b/Master/texmf-dist/tex/context/base/meta-fnt.lua @@ -21,32 +21,18 @@ mpfonts.version = mpfonts.version or 1.20 mpfonts.inline = true mpfonts.cache = containers.define("fonts", "mp", mpfonts.version, true) -metapost.fonts = metapost.fonts or { } +metapost.fonts = metapost.fonts or { } + +local function unicodetoactualtext(...) + unicodetoactualtext = backends.codeinjections.unicodetoactualtext + return unicodetoactualtext(...) +end -- a few glocals local characters, descriptions = { }, { } local factor, code, slot, width, height, depth, total, variants, bbox, llx, lly, urx, ury = 100, { }, 0, 0, 0, 0, 0, 0, true, 0, 0, 0, 0 --- The next variant of ActualText is what Taco and I could come up with --- eventually. As of September 2013 Acrobat copies okay, Sumatra copies a --- question mark, pdftotext injects an extra space and Okular adds a --- newline plus space. - --- return formatters["BT /Span << /ActualText (CONTEXT) >> BDC [] TJ % t EMC ET"](code) - -local function topdf(n,code) - if n < 0x10000 then - return formatters["BT /Span << /ActualText >> BDC [] TJ % t EMC ET"](n,code) - else - return formatters["BT /Span << /ActualText >> BDC [] TJ % t EMC ET"](n/1024+0xD800,n%1024+0xDC00,code) - end -end - --- local function topdf(n,code) --- return formatters["/Span << /ActualText (CTX) >> BDC % t EMC"](code) --- end - local flusher = { startfigure = function(_chr_,_llx_,_lly_,_urx_,_ury_) code = { } @@ -68,6 +54,7 @@ local flusher = { end, stopfigure = function() local cd = chardata[n] + local code = unicodetoactualtext(slot,concat(code," ")) or "" descriptions[slot] = { -- unicode = slot, name = cd and cd.adobename, @@ -79,7 +66,7 @@ local flusher = { if inline then characters[slot] = { commands = { - { "special", "pdf:" .. topdf(slot,code) }, + { "special", "pdf:" .. code }, } } else @@ -88,13 +75,14 @@ local flusher = { { "image", { - stream = topdf(slot,code), + stream = code, bbox = { 0, -depth * 65536, width * 65536, height * 65536 } }, }, } } end + code = nil -- no need to keep that end } @@ -261,7 +249,16 @@ function metapost.fonts.define(specification) } ) end -commands.definemetafont = metapost.fonts.define +interfaces.implement { + name = "definemetafont", + actions = metapost.fonts.define, + arguments = { + { + { "fontname" }, + { "filename" }, + } + } +} -- metapost.fonts.define { -- fontname = "bidi", diff --git a/Master/texmf-dist/tex/context/base/meta-fnt.mkiv b/Master/texmf-dist/tex/context/base/meta-fnt.mkiv index 603fcf14d51..e54c0be0a4f 100644 --- a/Master/texmf-dist/tex/context/base/meta-fnt.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-fnt.mkiv @@ -21,11 +21,11 @@ {\dotripleempty\meta_font_define} \def\meta_font_define[#1][#2][#3]% - {\ctxcommand{definemetafont { - fontname = "#1", - filename = "#2" + {\clf_definemetafont + fontname {#1}% + filename {#2}% % no #3 settings yet (compose, instances) - }}} + \relax} % \startluacode % metapost.fonts.define { fontname = "bidi-symbols", filename = "bidi-symbols.mp" } diff --git a/Master/texmf-dist/tex/context/base/meta-fun.lua b/Master/texmf-dist/tex/context/base/meta-fun.lua index 78ee25bafe4..7aaaf2818ec 100644 --- a/Master/texmf-dist/tex/context/base/meta-fun.lua +++ b/Master/texmf-dist/tex/context/base/meta-fun.lua @@ -26,7 +26,7 @@ function metafun.topath(t,connector) if type(ti) == "string" then context(ti) else - context("(%s,%s)",ti.x or ti[1] or 0,ti.y or ti[2] or 0) + context("(%F,%F)",ti.x or ti[1] or 0,ti.y or ti[2] or 0) end end else @@ -47,7 +47,7 @@ function metafun.interpolate(f,b,e,s,c) else done = true end - context("(%s,%s)",i,d(i)) + context("(%F,%F)",i,d(i)) end end if not done then diff --git a/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv index 1daff57ac8c..e6ccc234c6d 100644 --- a/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv @@ -60,6 +60,8 @@ % \stopuseMPgraphic \startuseMPgraphic{figure:placeholder}{width,height,reduction,color} + begingroup ; + save w, h, d, r, p, c, b ; numeric w, h, d, r ; path p ; if cmykcolor \MPvar{color} : cmykcolor c, b ; b := (0,0,0,0) @@ -80,6 +82,7 @@ withcolor r[c randomized(.3,.9),b] ; endfor ; clip currentpicture to p ; + endgroup ; \stopuseMPgraphic \defineoverlay diff --git a/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv new file mode 100644 index 00000000000..a4affbea458 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv @@ -0,0 +1,73 @@ +%D \module +%D [ file=meta-tab, +%D version=2003.03.21, % very old but now with splitter +%D title=\METAPOST\ Graphics, +%D subtitle=Dummy (External) Graphics, +%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. + +\startuseMPgraphic{TallyBar} + height := (10/12) * LineHeight ; + span := ( 4/10) * LineHeight ; + drift := ( 1/10) * LineHeight ; + def d = (uniformdeviate drift) enddef ; + for i := 1 upto \MPvar{n} : + draw + if (i mod 5)=0 : + ((-d-4.5span,d)--(+d-0.5span,height-d)) + else : + ((-d,+d)--(+d,height-d)) + fi + shifted (span*i,d-drift) withpen pencircle ; + endfor ; + currentpicture := currentpicture scaled .75 ; +\stopuseMPgraphic + +\setupMPvariables + [TallyBar] + [n=0] + +\unexpanded\def\tallynumeral#1% + {\dontleavehmode + \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=#1}}} + +\unexpanded\def\tallynumerals#1% + {\dontleavehmode + \begingroup + \scratchcounter#1\relax + \doloop + {\ifnum\scratchcounter>\plusfive + \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=5}}% + \advance\scratchcounter-\plusfive + \space + \else + \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=\the\scratchcounter}}% + \exitloop + \fi}% + \endgroup} + +\let\FunnyBar\tallynumeral + +\defineconversion[tally][\tallynumerals] + +\continueifinputfile{meta-imp-tab.mkiv} + +\starttext + + \starttabulate[|pr|c|] + \NC \tallynumerals {24} \NC \NR + \NC \tallynumerals {12} \NC \times \NR + \HL + \NC \tallynumerals{288} \NC = \NR + \stoptabulate + + \tallynumerals{"FFFF} + +\stoptext + +\endinput diff --git a/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv index bcfc5513fbe..7069d21a4ea 100644 --- a/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv @@ -104,7 +104,7 @@ \unexpanded\def\getshapecharacteristics {\doglobal\increment\currentshapetext - \doifdefinedelse{parlines:\currentshapetext} + \doifelsedefined{parlines:\currentshapetext} {\global\parlines \getvalue{parlines:\currentshapetext}% \global\chardef\parfirst \getvalue{parfirst:\currentshapetext}% \global\parvoffset \getvalue{parvoffset:\currentshapetext}% @@ -152,7 +152,7 @@ %%%%%%% rotfont nog definieren -\doifundefined{RotFont}{\definefont[RotFont][RegularBold]} +\doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]} \unexpanded\def\processfollowingtoken#1% strut toegevoegd {\appendtoks#1\to\MPtoks @@ -174,9 +174,7 @@ {\vbox\bgroup \forgetall \dontcomplain - \startMPenvironment - \doifundefined{RotFont}{\definefont[RotFont][RegularBold]}% - \stopMPenvironment + \doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]}% \MPtoks\emptytoks \resetMPdrawing \startMPdrawing @@ -225,6 +223,7 @@ withpen pencircle scaled .50pt withcolor green ; fi ; endfor ; +% fill boundingbox currentpicture ; \stopMPdrawing \MPdrawingdonetrue \getMPdrawing diff --git a/Master/texmf-dist/tex/context/base/meta-ini.lua b/Master/texmf-dist/tex/context/base/meta-ini.lua index 713ba3d5d01..8f713126323 100644 --- a/Master/texmf-dist/tex/context/base/meta-ini.lua +++ b/Master/texmf-dist/tex/context/base/meta-ini.lua @@ -15,34 +15,6 @@ local context = context metapost = metapost or { } --- for the moment downward compatible - -local report_metapost = logs.reporter ("metapost") -local status_metapost = logs.messenger("metapost") - -local patterns = { "meta-imp-%s.mkiv", "meta-imp-%s.tex", "meta-%s.mkiv", "meta-%s.tex" } -- we are compatible - -local function action(name,foundname) - status_metapost("library %a is loaded",name) - context.startreadingfile() - context.input(foundname) - context.stopreadingfile() -end - -local function failure(name) - report_metapost("library %a is unknown or invalid",name) -end - -function commands.useMPlibrary(name) - commands.uselibrary { - name = name, - patterns = patterns, - action = action, - failure = failure, - onlyonce = true, - } -end - -- experimental local colorhash = attributes.list[attributes.private('color')] diff --git a/Master/texmf-dist/tex/context/base/meta-ini.mkiv b/Master/texmf-dist/tex/context/base/meta-ini.mkiv index 555deca2cbf..c3b94f899cd 100644 --- a/Master/texmf-dist/tex/context/base/meta-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-ini.mkiv @@ -106,7 +106,7 @@ {\dosinglegroupempty\meta_start_extensions} \def\meta_start_extensions#1#2\stopMPextensions % we could use buffers instead - {\ctxlua{metapost.setextensions("#1",\!!bs#2\!!es)}} + {\clf_setmpextensions{#1}{#2}} \let\stopMPextensions\relax @@ -155,12 +155,12 @@ \global\t_meta_inclusions\expandafter{\the\t_meta_inclusions#2}% \let\currentMPinstance\m_meta_saved_instance} -\def\meta_preset_definitions - {\edef\overlaywidth {\overlaywidth \space}% - \edef\overlayheight {\overlayheight \space}% - \edef\overlaylinewidth{\overlaylinewidth\space}% - \edef\currentwidth {\the\hsize \space}% - \edef\currentheight {\the\vsize \space}} +% \def\meta_preset_definitions +% {\edef\overlaywidth {\overlaywidth \space}% +% \edef\overlayheight {\overlayheight \space}% +% \edef\overlaylinewidth{\overlaylinewidth\space}} + +\let\meta_preset_definitions\relax \installcommandhandler \??mpinstance {MPinstance} \??mpinstance @@ -217,14 +217,22 @@ \def\currentMPinstance {\defaultMPinstance} \def\currentMPformat {\currentMPinstance} -\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] -\defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] -\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double] -\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary] -\defineMPinstance[decimalfun][\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal] -\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] -\defineMPinstance[metapost] [\s!format=mpost] -\defineMPinstance[nofun] [\s!format=mpost] +\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] +\defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] +\defineMPinstance[lessfun] [\s!format=metafun] +\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double] +\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary] +\defineMPinstance[decimalfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal] + +\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes] + +\defineMPinstance[metapost] [\s!format=mpost] +\defineMPinstance[nofun] [\s!format=mpost] +\defineMPinstance[doublepost] [\s!format=mpost,\c!method=\s!double] +\defineMPinstance[binarypost] [\s!format=mpost,\c!method=\s!binary] +\defineMPinstance[decimalpost][\s!format=mpost,\c!method=\s!decimal] + +%defineMPinstance[megapost] [\s!format=mpost,\c!method=\s!decimal] \newconditional\c_meta_include_initializations @@ -295,20 +303,19 @@ \forgetall \edef\p_extensions{\MPinstanceparameter\s!extensions}% \meta_process_graphic_start - \normalexpanded{\noexpand\ctxlua{metapost.graphic { - instance = "\currentMPinstance", - format = "\currentMPformat", - data = \!!bs#1;\!!es, - initializations = \!!bs\meta_flush_current_initializations\!!es, -% useextensions = "\MPinstanceparameter\s!extensions", -\ifx\p_extensions\v!yes - extensions = \!!bs\ctxcommand{getmpextensions("\currentMPinstance")}\!!es, -\fi - inclusions = \!!bs\meta_flush_current_inclusions\!!es, - definitions = \!!bs\meta_flush_current_definitions\!!es, - figure = "\MPaskedfigure", - method = "\MPinstanceparameter\c!method", - }}}% + \normalexpanded{\noexpand\clf_mpgraphic + instance {\currentMPinstance}% + format {\currentMPformat}% + data {#1;}% + initializations {\meta_flush_current_initializations}% + \ifx\p_extensions\v!yes + extensions {\clf_getmpextensions{\currentMPinstance}}% goes through tex again + \fi + inclusions {\meta_flush_current_inclusions}% + definitions {\meta_flush_current_definitions}% + figure {\MPaskedfigure}% + method {\MPinstanceparameter\c!method}% + \relax}% \meta_process_graphic_stop \meta_stop_current_graphic} @@ -338,14 +345,32 @@ %D Calling up previously defined graphics. +% \def\includeMPgraphic#1% gets expanded ! +% {\ifcsname\??mpgraphic#1\endcsname +% \csname\??mpgraphic#1\endcsname ; % ; is safeguard +% \fi} +% +% \unexpanded\def\meta_enable_include % public +% {\let\meta_handle_use_graphic \thirdofthreearguments +% \let\meta_handle_reusable_graphic\thirdofthreearguments} +% +% but ... we want this too: +% +% \startuseMPgraphic{x} +% draw textext("\externalfigure[foo.pdf]") ; +% \stopuseMPgraphic +% +% \useMPgraphic{x} +% +% so we cannot overload unless we let back to the original meanings +% each graphic ... a better solution is: + \def\includeMPgraphic#1% gets expanded ! {\ifcsname\??mpgraphic#1\endcsname - \csname\??mpgraphic#1\endcsname ; % ; is safeguard + \doubleexpandafter\fourthoffourarguments\csname\??mpgraphic#1\endcsname ; % ; is safeguard \fi} -\unexpanded\def\meta_enable_include % public - {\let\meta_handle_use_graphic \thirdofthreearguments - \let\meta_handle_reusable_graphic\thirdofthreearguments} +\let\meta_enable_include\relax %D Drawings (stepwise built): @@ -401,20 +426,13 @@ \unexpanded\def\meta_grab_clip_path#1#2#3#4% #4 is alternative (called in backend code) {\begingroup - \edef\width {#2\space}\let\overlaywidth \width - \edef\height{#3\space}\let\overlayheight\height - \ifcsname\??mpclip#1\endcsname - \meta_start_current_graphic - \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath { - instance = "\currentMPinstance", - format = "\currentMPformat", - data = \!!bs\getvalue{\??mpclip#1}\!!es, - initializations = \!!bs\meta_flush_current_initializations\!!es, - useextensions = "\MPinstanceparameter\s!extensions", - inclusions = \!!bs\meta_flush_current_inclusions\!!es, - method = "\MPinstanceparameter\c!method", - }}}}% - \meta_stop_current_graphic + \edef\width {#2}% \let\overlaywidth \width + \edef\height{#3}% \let\overlayheight\height + \d_overlay_width #2\onebasepoint + \d_overlay_height#3\onebasepoint + \edef\currentMPclip{#1}% + \ifcsname\??mpclip\currentMPclip\endcsname + \meta_grab_clip_path_indeed \ifx\MPclippath\empty \xdef\MPclippath{#4}% \fi @@ -423,6 +441,19 @@ \fi \endgroup} +\def\meta_grab_clip_path_indeed + {\meta_start_current_graphic + \normalexpanded{\noexpand\clf_mpsetclippath + instance {\currentMPinstance}% + format {\currentMPformat}% + data {\csname\??mpclip\currentMPclip\endcsname}% + initializations {\meta_flush_current_initializations}% + useextensions {\MPinstanceparameter\s!extensions}% + inclusions {\meta_flush_current_inclusions}% + method {\MPinstanceparameter\c!method}% + \relax}% + \meta_stop_current_graphic} + %D Since we want lables to follow the document settings, we %D also set the font related variables. @@ -430,7 +461,7 @@ {\dontleavehmode \begingroup \definedfont[#1]% - \hskip\cldcontext{fonts.hashes.parameters[font.current()].designsize}sp\relax + \hskip\clf_currentdesignsize\scaledpoint\relax \endgroup} \definefontsynonym[MetafunDefault][Regular*default] @@ -438,7 +469,7 @@ \startMPinitializations % scale is not yet ok defaultfont:="\truefontname{MetafunDefault}"; % defaultscale:=\the\bodyfontsize/10pt; % only when hard coded 10pt - defaultscale:=1; + % defaultscale:=1; \stopMPinitializations % watch out, this is a type1 font because mp can only handle 8 bit fonts @@ -571,7 +602,7 @@ \def\meta_prepare_variable_yes {\defconvertedcommand\ascii\m_meta_current_variable % otherwise problems - \doifcolorelse \ascii % with 2\bodyfontsize + \doifelsecolor \ascii % with 2\bodyfontsize {\meta_prepare_variable_color} {\begingroup \setbox\b_meta_variable_box\hbox{\scratchdimen\m_meta_current_variable sp}% @@ -600,7 +631,13 @@ %D \stoptyping \def\overlaystamp % watch the \MPcolor, since colors can be redefined - {\overlaywidth:\overlayheight:\overlaydepth:\overlayoffset:\overlaylinewidth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor} + {\the\d_overlay_width :% + \the\d_overlay_height :% + \the\d_overlay_depth :% + \the\d_overlay_offset :% + \the\d_overlay_linewidth:% + \MPcolor\overlaycolor :% % todo, expand once \m_overlaycolor + \MPcolor\overlaylinecolor} % todo, expand once \m_overlaylinecolor %D A better approach is to let additional variables play a role %D in determining the uniqueness. In the next macro, the @@ -783,19 +820,25 @@ \let\reuseMPgraphic \useMPgraphic % we can save a setup here if needed \let\reusableMPgraphic\reuseMPgraphic % we can save a setup here if needed -\unexpanded\def\meta_enable_include - {\let\meta_handle_use_graphic \thirdofthreearguments - \let\meta_handle_reusable_graphic\thirdofthreearguments} - %D \macros %D {startuniqueMPpagegraphic,uniqueMPpagegraphic} %D %D Experimental. -\def\m_meta_page_prefix{\doifoddpageelse oe} +\def\m_meta_page_prefix{\doifelseoddpage oe} + +% \def\overlaypagestamp +% {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor} \def\overlaypagestamp - {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor} + {\m_meta_page_prefix :% + \the\d_overlay_width :% + \the\d_overlay_height :% + \the\d_overlay_depth :% + \the\d_overlay_offset :% + \the\d_overlay_linewidth:% + \MPcolor\overlaycolor :% + \MPcolor\overlaylinecolor} \unexpanded\def\startuniqueMPpagegraphic {\dodoublegroupempty\meta_start_unique_page_graphic} @@ -859,12 +902,21 @@ % makempy.registerfile(filename) -\startMPinitializations - boolean collapse_data; collapse_data:=true; - def data_mpd_file = "\MPdataMPDfile" enddef ; - def data_mpo_file = "\MPdataMPOfile" enddef ; - def data_mpy_file = "\MPdataMPYfile" enddef ; -\stopMPinitializations +% % hm. extensions get expanded so the wrong names then end up in format +% +% \startMPinitializations +% boolean collapse_data; collapse_data:=true ; % will be obsolete +% def data_mpd_file = "\MPdataMPDfile" enddef ; % will go via lua +% def data_mpo_file = "\MPdataMPOfile" enddef ; +% def data_mpy_file = "\MPdataMPYfile" enddef ; +% \stopMPinitializations + +\startMPextensions + boolean collapse_data; collapse_data:=true ; % will be obsolete + def data_mpd_file = "\noexpand\MPdataMPDfile" enddef ; % will go via lua + def data_mpo_file = "\noexpand\MPdataMPOfile" enddef ; + def data_mpy_file = "\noexpand\MPdataMPYfile" enddef ; +\stopMPextensions \unexpanded\def\getMPdata {\let\MPdata\secondoftwoarguments @@ -884,7 +936,7 @@ \def\meta_process_buffer[#1]% {\meta_begin_graphic_group{#1}% - \meta_process_graphic{\ctxcommand{feedback("\currentMPgraphicname")}}% + \meta_process_graphic{\clf_feedback{\currentMPgraphicname}}% \meta_end_graphic_group} \unexpanded\def\runMPbuffer @@ -928,15 +980,15 @@ \else\ifx\m_meta_option\!!plustoken #2% % use in main doc too \fi\fi\fi - \ctxlua{metapost.tex.set(\!!bs\detokenize{#2}\!!es)}} + \clf_mptexset{\detokenize{#2}}} \let\stopMPenvironment\relax \unexpanded\def\resetMPenvironment - {\ctxlua{metapost.tex.reset()}} + {\clf_mptexreset} \unexpanded\def\useMPenvironmentbuffer[#1]% - {\ctxlua{metapost.tex.set(buffers.content("#1"))}} + {\clf_mpsetfrombuffer{#1}} %D This command takes \type {[reset]} as optional %D argument. @@ -1058,7 +1110,7 @@ %D Loading specific \METAPOST\ related definitions is %D accomplished by: -\unexpanded\def\useMPlibrary[#1]{\ctxcommand{useMPlibrary(\!!bs#1\!!es)}} +\unexpanded\def\useMPlibrary[#1]{\clf_useMPlibrary{#1}} %D \macros %D {setMPtext, MPtext, MPstring, MPbetex} @@ -1088,46 +1140,62 @@ % \setupcolors[state=stop,conversion=never] % quite tricky ... type mismatch -% A dirty trick, ** in colo-ini.lua (mpcolor). +% \startMPextensions +% color OverlayColor,OverlayLineColor; +% \stopMPextensions -\def\m_meta_colo_initializations{% no vardef, goes wrong with spot colors - def OverlayLineColor=\MPcolor{\overlaylinecolor} enddef; - def OverlayColor=\MPcolor{\overlaycolor} enddef; -} +\startMPinitializations + CurrentLayout:="\currentlayout"; +\stopMPinitializations -\startMPextensions - color OverlayColor,OverlayLineColor; -\stopMPextensions +% \startMPinitializations +% OverlayWidth:=\overlaywidth; +% OverlayHeight:=\overlayheight; +% OverlayDepth:=\overlaydepth; +% OverlayLineWidth:=\overlaylinewidth; +% OverlayOffset:=\overlayoffset; +% \stopMPinitializations + +% A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because +% that fails with spot colors. \startMPinitializations - CurrentLayout:="\currentlayout"; - OverlayWidth:=\overlaywidth; - OverlayHeight:=\overlayheight; - OverlayDepth:=\overlaydepth; - OverlayLineWidth:=\overlaylinewidth; - OverlayOffset:=\overlayoffset; - % - \m_meta_colo_initializations - % - BaseLineSkip:=\the\baselineskip; - LineHeight:=\the\baselineskip; - BodyFontSize:=\the\bodyfontsize; - % - TopSkip:=\the\topskip; - StrutHeight:=\strutheight; - StrutDepth:=\strutdepth; - % - CurrentWidth:=\the\hsize; - CurrentHeight:=\the\vsize; - % - EmWidth:=\the\emwidth; - ExHeight:=\the\exheight; - % - PageNumber:=\the\pageno; - RealPageNumber:=\the\realpageno; - LastPageNumber:= \lastpage; + def OverlayLineColor=\ifx\overlaylinecolor\empty black \else\MPcolor{\overlaylinecolor} \fi enddef; + def OverlayColor =\ifx\overlaycolor \empty black \else\MPcolor{\overlaycolor} \fi enddef; \stopMPinitializations +% \newcount\c_overlay_colormodel +% \newcount\c_overlay_color +% \newcount\c_overlay_transparency +% \newcount\c_overlay_linecolor +% \newcount\c_overlay_linetransparency + +% \appendtoks +% \c_overlay_colormodel \attribute\colormodelattribute +% \c_overlay_color \colo_helpers_inherited_current_ca\overlaycolor +% \c_overlay_transparency \colo_helpers_inherited_current_ta\overlaycolor +% \c_overlay_linecolor \colo_helpers_inherited_current_ca\overlaylinecolor +% \c_overlay_linetransparency\colo_helpers_inherited_current_ta\overlaylinecolor +% \to \everyMPgraphic + +% \startMPinitializations +% BaseLineSkip:=\the\baselineskip; +% LineHeight:=\the\baselineskip; +% BodyFontSize:=\the\bodyfontsize; +% % +% TopSkip:=\the\topskip; +% StrutHeight:=\strutheight; +% StrutDepth:=\strutdepth; +% % +% CurrentWidth:=\the\hsize; +% CurrentHeight:=\the\vsize; +% HSize:=\the\hsize ; +% VSize:=\the\vsize ; +% % +% EmWidth:=\the\emwidth; +% ExHeight:=\the\exheight; +% \stopMPinitializations + \appendtoks \disablediscretionaries \disablecompoundcharacters @@ -1157,11 +1225,6 @@ \let \} \letterclosebrace \to \everyMPgraphic -\startMPinitializations - prologues:=0; - mpprocset:=1; -\stopMPinitializations - %D \macros %D {PDFMPformoffset} %D @@ -1188,21 +1251,36 @@ enddef; \stopMPextensions -\startMPinitializations - HSize:=\the\hsize ; - VSize:=\the\vsize ; -\stopMPinitializations - \startMPextensions vardef ForegroundBox = unitsquare xysized(HSize,VSize) enddef ; - PageFraction := 1 ; \stopMPextensions -\startMPinitializations - PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ; -\stopMPinitializations +% \startMPextensions +% PageFraction := 1 ; +% \stopMPextensions + +% \startMPinitializations +% PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ; +% \stopMPinitializations + +\startMPdefinitions {metapost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {binarypost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {decimalpost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {doublepost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions + +% \startMPdefinitions {nofun} +% if unknown context_bare : input mp-bare.mpiv ; fi ; +% \stopMPdefinitions %D And some more. These are not really needed since we %D don't use the normal figure inclusion macros any longer. @@ -1363,12 +1441,16 @@ \newconstant\MPcolormethod \appendtoks - \ctxlua{metapost.setoutercolor(\number\MPcolormethod,\number\attribute\colormodelattribute,\number\attribute\colorattribute,\number\dogetattribute{transparency})}% + \clf_mpsetoutercolor + \MPcolormethod\space + \attribute\colormodelattribute\space + \attribute\colorattribute\space + \dogetattribute{transparency}\relax \to \everyMPgraphic -\startMPinitializations - defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi; -\stopMPinitializations +% \startMPinitializations +% defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi; +% \stopMPinitializations %D macros %D {mprunvar,mpruntab,mprunset} @@ -1394,9 +1476,9 @@ %D $(x,y) = (\MPrunset{point}{,})$ %D \stoptyping -\def\MPrunvar #1{\ctxcommand{mprunvar("#1")}} \let\mprunvar\MPrunvar -\def\MPruntab#1#2{\ctxcommand{mprunvar("#1",\number#2)}} \let\mpruntab\MPruntab -\def\MPrunset#1#2{\ctxcommand{mprunvar("#1","#2")}} \let\mprunset\MPrunset +\def\MPrunvar #1{\clf_mprunvar{#1}} \let\mprunvar\MPrunvar +\def\MPruntab#1#2{\clf_mpruntab{#1}#2\relax} \let\mpruntab\MPruntab % #2 is number +\def\MPrunset#1#2{\clf_mprunset{#1}{#2}} \let\mprunset\MPrunset %D We also provide an outputless run: @@ -1465,7 +1547,7 @@ \edef\p_mpy{\directMPgraphicsparameter{mpy}}% \ifx\p_mpy\empty \else \let\MPdataMPYfile\p_mpy - \ctxlua{metapost.makempy.registerfile("\p_mpy")}% + \clf_registermpyfile{\p_mpy}% \fi \to \everysetupMPgraphics diff --git a/Master/texmf-dist/tex/context/base/meta-pag.mkiv b/Master/texmf-dist/tex/context/base/meta-pag.mkiv index a25353b188e..6b6abd21135 100644 --- a/Master/texmf-dist/tex/context/base/meta-pag.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-pag.mkiv @@ -23,82 +23,76 @@ %D pagebody looks. \startMPextensions - boolean PageStateAvailable,OnRightPage,InPageBody; + boolean PageStateAvailable; PageStateAvailable:=true; \stopMPextensions -\startMPinitializations - OnRightPage:=true; - InPageBody:=\ifinpagebody true \else false \fi; -\stopMPinitializations - -\startMPinitializations - CurrentColumn:=\number\mofcolumns; - NOfColumns:=\number\nofcolumns; - % todo: ColumnDistance -\stopMPinitializations - % maybe always set as frozen anyway -\startMPinitializations - % def LoadPageState = - OnRightPage:=\MPonrightpage; - OnOddPage:=\MPonoddpage; - RealPageNumber:=\the\realpageno; - PageNumber:=\the\pageno; - NOfPages:=\lastpage; - PaperHeight:=\the\paperheight; - PaperWidth:=\the\paperwidth; - PrintPaperHeight:=\the\printpaperheight; - PrintPaperWidth:=\the\printpaperwidth; - TopSpace:=\the\topspace; - BottomSpace:=\the\bottomspace; - BackSpace:=\the\backspace; - CutSpace:=\the\cutspace; - MakeupHeight:=\the\makeupheight; - MakeupWidth:=\the\makeupwidth; - TopHeight:=\the\topheight; - TopDistance:=\the\topdistance; - HeaderHeight:=\the\headerheight; - HeaderDistance:=\the\headerdistance; - TextHeight:=\the\textheight; - FooterDistance:=\the\footerdistance; - FooterHeight:=\the\footerheight; - BottomDistance:=\the\bottomdistance; - BottomHeight:=\the\bottomheight; - LeftEdgeWidth:=\the\leftedgewidth; - LeftEdgeDistance:=\the\leftedgedistance; - LeftMarginWidth:=\the\leftmarginwidth; - LeftMarginDistance:=\the\leftmargindistance; - TextWidth:=\the\textwidth ; - RightMarginDistance:=\the\rightmargindistance; - RightMarginWidth:=\the\rightmarginwidth; - RightEdgeDistance:=\the\rightedgedistance; - RightEdgeWidth:=\the\rightedgewidth; - InnerMarginDistance:=\the\innermargindistance; - InnerMarginWidth:=\the\innermarginwidth; - OuterMarginDistance:=\the\outermargindistance; - OuterMarginWidth:=\the\outermarginwidth; - InnerEdgeDistance:=\the\inneredgedistance; - InnerEdgeWidth:=\the\inneredgewidth; - OuterEdgeDistance:=\the\outeredgedistance; - OuterEdgeWidth:=\the\outeredgewidth; - PageOffset:=\the\pagebackgroundoffset; - PageDepth:=\the\pagebackgrounddepth; - LayoutColumns:=\the\layoutcolumns; - LayoutColumnDistance:=\the\layoutcolumndistance; - LayoutColumnWidth:=\the\layoutcolumnwidth; - def LoadPageState = - % now always set .. this dummy can move to the mp code - enddef; -\stopMPinitializations +% \startMPinitializations +% PaperHeight:=\the\paperheight; +% PaperWidth:=\the\paperwidth; +% PrintPaperHeight:=\the\printpaperheight; +% PrintPaperWidth:=\the\printpaperwidth; +% TopSpace:=\the\topspace; +% BottomSpace:=\the\bottomspace; +% BackSpace:=\the\backspace; +% CutSpace:=\the\cutspace; +% MakeupHeight:=\the\makeupheight; +% MakeupWidth:=\the\makeupwidth; +% TopHeight:=\the\topheight; +% TopDistance:=\the\topdistance; +% HeaderHeight:=\the\headerheight; +% HeaderDistance:=\the\headerdistance; +% TextHeight:=\the\textheight; +% FooterDistance:=\the\footerdistance; +% FooterHeight:=\the\footerheight; +% BottomDistance:=\the\bottomdistance; +% BottomHeight:=\the\bottomheight; +% LeftEdgeWidth:=\the\leftedgewidth; +% LeftEdgeDistance:=\the\leftedgedistance; +% LeftMarginWidth:=\the\leftmarginwidth; +% LeftMarginDistance:=\the\leftmargindistance; +% TextWidth:=\the\textwidth; +% RightMarginDistance:=\the\rightmargindistance; +% RightMarginWidth:=\the\rightmarginwidth; +% RightEdgeDistance:=\the\rightedgedistance; +% RightEdgeWidth:=\the\rightedgewidth; +% InnerMarginDistance:=\the\innermargindistance; +% InnerMarginWidth:=\the\innermarginwidth; +% OuterMarginDistance:=\the\outermargindistance; +% OuterMarginWidth:=\the\outermarginwidth; +% InnerEdgeDistance:=\the\inneredgedistance; +% InnerEdgeWidth:=\the\inneredgewidth; +% OuterEdgeDistance:=\the\outeredgedistance; +% OuterEdgeWidth:=\the\outeredgewidth; +% PageOffset:=\the\pagebackgroundoffset; +% PageDepth:=\the\pagebackgrounddepth; +% LayoutColumns:=\the\layoutcolumns; +% LayoutColumnDistance:=\the\layoutcolumndistance; +% LayoutColumnWidth:=\the\layoutcolumnwidth; +% % +% boolean OnRightPage,OnOddPage,InPageBody; +% % +% OnRightPage:=\MPonrightpage; +% OnOddPage:=\MPonoddpage; +% InPageBody:=\ifinpagebody true \else false \fi; +% % +% RealPageNumber:=\the\realpageno; +% PageNumber:=\the\pageno; +% NOfPages:=\lastpage; +% LastPageNumber:=\lastpage; +% % +% CurrentColumn:=\number\mofcolumns; +% NOfColumns:=\number\nofcolumns; +% \stopMPinitializations \def\MPonrightpage{true} \def\MPonoddpage {true} \def\freezeMPpagelayout {\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}% - \edef\MPonoddpage {\doifoddpageelse {tru}{fals}e}} + \edef\MPonoddpage {\doifelseoddpage {tru}{fals}e}} %D We need to freeze the pagelayout before the backgrounds %D are build, because the overlay will temporarily become @@ -121,7 +115,7 @@ % \to \everyMPgraphic \prependtoks - \calculatereducedvsizes % this is really needed + \calculatereducedvsizes % bah, this is really needed \to \everyMPgraphic \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.lua b/Master/texmf-dist/tex/context/base/meta-pdf.lua index 512384450a8..3cbff63b168 100644 --- a/Master/texmf-dist/tex/context/base/meta-pdf.lua +++ b/Master/texmf-dist/tex/context/base/meta-pdf.lua @@ -329,7 +329,7 @@ handlers[50] = function() report_mptopdf("skipping special %s",50) end --end of not supported function mps.setrgbcolor(r,g,b) -- extra check - r, g = tonumber(r), tonumber(g) -- needed when we use lpeg + r, g, b = tonumber(r), tonumber(g), tonumber(b) -- needed when we use lpeg if r == 0.0123 and g < 0.1 then g, b = round(g*10000), round(b*10000) local s = specials[b] @@ -411,7 +411,8 @@ function mps.fshow(str,font,scale) -- lpeg parser mps.textext(font,scale,lpegmatch(package,str)) end -local cnumber = lpegC(number) +----- cnumber = lpegC(number) +local cnumber = number/tonumber -- we now expect numbers (feeds into %F) local cstring = lpegC(nonspace) local specials = (lpegP("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mps.specials @@ -572,3 +573,11 @@ statistics.register("mps conversion time",function() return nil end end) + +-- interface + +interfaces.implement { + name = "convertmpstopdf", + arguments = "string", + actions = mptopdf.convertmpstopdf +} diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv index 3469419d468..50eb1dd720a 100644 --- a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv @@ -46,7 +46,7 @@ \forgetall \offinterlineskip \setbox\MPbox\vbox\bgroup - \ctxlua{metapost.mptopdf.convertmpstopdf("\MPfilename")}% + \clf_convertmpstopdf{\MPfilename}% \removeunwantedspaces % not that needed \egroup \finalizeMPbox diff --git a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv index b65fe6ac697..f3db5b38866 100644 --- a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv @@ -374,17 +374,17 @@ %D %D \startbuffer %D \startuniqueMPgraphic{CircularShade} -%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ; %D circular_shade(p,0,.2red,.9red) ; %D \stopuniqueMPgraphic %D %D \startuniqueMPgraphic{LinearShade} -%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ; %D linear_shade(p,0,.2blue,.9blue) ; %D \stopuniqueMPgraphic %D %D \startuniqueMPgraphic{DuotoneShade} -%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ; %D linear_shade(p,2,.5green,.5red) ; %D \stopuniqueMPgraphic %D \stopbuffer @@ -429,8 +429,8 @@ %D %D \def\SomeShade#1#2#3#4#5% %D {\startuniqueMPgraphic{Shade-#1} -%D width := \overlaywidth ; -%D height := \overlayheight ; +%D width := OverlayWidth ; +%D height := OverlayHeight ; %D path p ; p := unitsquare xscaled width yscaled height ; %D #2_shade(p,#3,#4,#5) ; %D \stopuniqueMPgraphic diff --git a/Master/texmf-dist/tex/context/base/meta-tex.lua b/Master/texmf-dist/tex/context/base/meta-tex.lua index 7a4123abbb3..1008e45c05e 100644 --- a/Master/texmf-dist/tex/context/base/meta-tex.lua +++ b/Master/texmf-dist/tex/context/base/meta-tex.lua @@ -6,12 +6,15 @@ if not modules then modules = { } end modules ['meta-tex'] = { license = "see context related readme files" } +local tostring = tostring local format, gsub, find, match = string.format, string.gsub, string.find, string.match local formatters = string.formatters local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match metapost = metapost or { } +local implement = interfaces.implement + -- local left = P("[") -- local right = P("]") -- local space = P(" ") @@ -39,6 +42,12 @@ function metapost.escaped(str) context(lpegmatch(pattern,str)) end +implement { + name = "metapostescaped", + actions = metapost.escaped, + arguments = "string" +} + local simplify = true -- local function strip(n,e) @@ -108,10 +117,6 @@ local enumber = number * S("eE") * number local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0) -function format_n(fmt,...) - return -end - context = context or { exponent = function(...) print(...) end } function metapost.format_string(fmt,...) @@ -142,6 +147,9 @@ function metapost.nvformat(fmt,str) metapost.format_number(fmt,metapost.untagvariable(str,false)) end +implement { name = "metapostformatted", actions = metapost.svformat, arguments = { "string", "string" } } +implement { name = "metapostgraphformat", actions = metapost.nvformat, arguments = { "string", "string" } } + -- local function test(fmt,n) -- logs.report("mp format test","fmt: %s, n: %s, result: %s, \\exponent{%s}{%s}",fmt,n, -- formatters[lpegmatch(cleaner,fmt)](n), @@ -167,3 +175,34 @@ end -- test("@j","1.2e+102") -- test("@j","1.23e+102") -- test("@j","1.234e+102") + +local f_textext = formatters[ [[textext("%s")]] ] +local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ] +local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ] + +local mpprint = mp.print + +function mp.format(fmt,str) + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false)))) +end + +function mp.formatted(fmt,num) -- svformat + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](tonumber(num) or num))) +end + +function mp.graphformat(fmt,num) -- nvformat + fmt = lpegmatch(cleaner,fmt) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,number) + if base and exponent then + mpprint(f_exptext(base,exponent)) + else + mpprint(f_mthtext(num)) + end + else + mpprint(f_textext(tostring(num))) + end +end diff --git a/Master/texmf-dist/tex/context/base/meta-tex.mkiv b/Master/texmf-dist/tex/context/base/meta-tex.mkiv index e7ed5972787..0f5a27ff862 100644 --- a/Master/texmf-dist/tex/context/base/meta-tex.mkiv +++ b/Master/texmf-dist/tex/context/base/meta-tex.mkiv @@ -68,7 +68,7 @@ \unexpanded\def\definetextext[#1]% {\def\currenttextext{#1}% - \doifnextoptionalcselse\meta_textext_define_one\meta_textext_define_zero} + \doifelsenextoptionalcs\meta_textext_define_one\meta_textext_define_zero} \def\meta_textext_define_one {\setvalue{\??graphictexarguments1:\currenttextext}} \def\meta_textext_define_zero{\setvalue{\??graphictexarguments0:\currenttextext}} @@ -76,10 +76,10 @@ \def\sometxt#1#{\meta_some_txt{#1}} \def\meta_some_txt#1#2% we need to capture embedded quotes (a bit messy as later on textext is filtered - {textext.drt("\mpsometxt#1{\ctxlua{metapost.escaped(\!!bs#2\!!es)}}")} + {textext.drt("\mpsometxt#1{\clf_metapostescaped{#2}}")} \unexpanded\def\mpsometxt % no _ catcode - {\doifnextoptionalcselse\meta_some_txt_indeed_yes\meta_some_txt_indeed_nop} + {\doifelsenextoptionalcs\meta_some_txt_indeed_yes\meta_some_txt_indeed_nop} \def\meta_some_txt_indeed_yes[#1]% {\def\currenttextext{#1}% @@ -116,8 +116,8 @@ % % \unexpanded\def\definetextext[#1]#2{\setvalue{@@st@@#1}{#2}} % -% \long\def\sometxt #1#{\dosometxt{#1}} % grab optional [args] -% \long\def\dosometxt #1#2{\ctxlua{metapost.sometxt(\!!bs#1\!!es,\!!bs#2\!!es)}} +% \def\sometxt #1#{\dosometxt{#1}} % grab optional [args] +% \def\dosometxt #1#2{\ctxlua{metapost.sometxt(\!!bs#1\!!es,\!!bs#2\!!es)}} % % \def\sometxta #1{textext.drt("#1")} % \def\sometxtb #1#2{textext.drt("\getvalue{@@st@@#1}{#2}")} @@ -139,7 +139,7 @@ % {\showstruts\useMPgraphic{testgraphic}} \unexpanded\def\MPexponent #1#2{\mathematics{#1\times10^{#2}}} -\unexpanded\def\MPformatted #1#2{\ctxlua{metapost.svformat("#1","#2")}} -\unexpanded\def\MPgraphformat#1#2{\ctxlua{metapost.nvformat("#1","#2")}} +\unexpanded\def\MPformatted #1#2{\clf_metapostformatted{#1}{#2}} +\unexpanded\def\MPgraphformat#1#2{\clf_metapostgraphformat{#1}{#2}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/mlib-ctx.lua b/Master/texmf-dist/tex/context/base/mlib-ctx.lua index fe52187719e..b437e1212c7 100644 --- a/Master/texmf-dist/tex/context/base/mlib-ctx.lua +++ b/Master/texmf-dist/tex/context/base/mlib-ctx.lua @@ -6,21 +6,28 @@ if not modules then modules = { } end modules ['mlib-ctx'] = { license = "see context related readme files", } --- todo +-- for the moment we have the scanners here but they migh tbe moved to +-- the other modules +local type, tostring = type, tostring local format, concat = string.format, table.concat local settings_to_hash = utilities.parsers.settings_to_hash local report_metapost = logs.reporter("metapost") -local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming +local starttiming = statistics.starttiming +local stoptiming = statistics.stoptiming -local mplib = mplib +local mplib = mplib -metapost = metapost or {} -local metapost = metapost +metapost = metapost or {} +local metapost = metapost -local v_no = interfaces.variables.no +local setters = tokens.setters +local setmacro = setters.macro +local implement = interfaces.implement + +local v_no = interfaces.variables.no metapost.defaultformat = "metafun" metapost.defaultinstance = "metafun" @@ -78,15 +85,155 @@ function metapost.getextensions(instance,state) end end -function commands.getmpextensions(instance,state) - context(metapost.getextensions(instance,state)) +-- function commands.getmpextensions(instance,state) +-- context(metapost.getextensions(instance,state)) +-- end + +implement { + name = "setmpextensions", + actions = metapost.setextensions, + arguments = { "string", "string" } +} + +implement { + name = "getmpextensions", + actions = { metapost.getextensions, context } , + arguments = "string" +} + +local report_metapost = logs.reporter ("metapost") +local status_metapost = logs.messenger("metapost") + +local patterns = { + "meta-imp-%s.mkiv", + "meta-imp-%s.tex", + -- obsolete: + "meta-%s.mkiv", + "meta-%s.tex" +} + +local function action(name,foundname) + status_metapost("library %a is loaded",name) + context.startreadingfile() + context.input(foundname) + context.stopreadingfile() +end + +local function failure(name) + report_metapost("library %a is unknown or invalid",name) end +implement { + name = "useMPlibrary", + arguments = "string", + actions = function(name) + resolvers.uselibrary { + name = name, + patterns = patterns, + action = action, + failure = failure, + onlyonce = true, + } + end +} + +-- metapost.variables = { } -- to be stacked + +implement { + name = "mprunvar", + arguments = "string", + actions = function(name) + local value = metapost.variables[name] + if value ~= nil then + local tvalue = type(value) + if tvalue == "table" then + context(concat(value," ")) + elseif tvalue == "number" or tvalue == "boolean" then + context(tostring(value)) + elseif tvalue == "string" then + context(value) + end + end + end +} + +implement { + name = "mpruntab", + arguments = { "string", "integer" }, + actions = function(name,n) + local value = metapost.variables[name] + if value ~= nil then + local tvalue = type(value) + if tvalue == "table" then + context(value[n]) + elseif tvalue == "number" or tvalue == "boolean" then + context(tostring(value)) + elseif tvalue == "string" then + context(value) + end + end + end +} + +implement { + name = "mprunset", + actions = function(name,connector) + local value = metapost.variables[name] + if value ~= nil then + local tvalue = type(value) + if tvalue == "table" then + context(concat(value,connector)) + elseif tvalue == "number" or tvalue == "boolean" then + context(tostring(value)) + elseif tvalue == "string" then + context(value) + end + end + end +} + +-- we need to move more from pps to here as pps is the plugin .. the order is a mess +-- or just move the scanners to pps + function metapost.graphic(specification) - setmpsformat(specification) - metapost.graphic_base_pass(specification) + metapost.graphic_base_pass(setmpsformat(specification)) end +implement { + name = "mpgraphic", + actions = metapost.graphic, + arguments = { + { + { "instance" }, + { "format" }, + { "data" }, + { "initializations" }, + { "extensions" }, + { "inclusions" }, + { "definitions" }, + { "figure" }, + { "method" }, + } + } +} + +implement { + name = "mpsetoutercolor", + actions = function(...) metapost.setoutercolor(...) end, -- not yet implemented + arguments = { "integer", "integer", "integer", "integer" } +} + +implement { + name = "mpflushreset", + actions = function() metapost.flushreset() end -- not yet implemented +} + +implement { + name = "mpflushliteral", + actions = function(str) metapost.flushliteral(str) end, -- not yet implemented + arguments = "string", +} + function metapost.getclippath(specification) -- why not a special instance for this setmpsformat(specification) local mpx = specification.mpx @@ -135,11 +282,31 @@ end function metapost.theclippath(...) local result = metapost.getclippath(...) if result then -- we could just print the table - result = concat(metapost.flushnormalpath(result),"\n") - context(result) +-- return concat(metapost.flushnormalpath(result),"\n") + return concat(metapost.flushnormalpath(result)," ") + else + return "" end end +implement { + name = "mpsetclippath", + actions = function(specification) + setmacro("MPclippath",metapost.theclippath(specification),"global") + end, + arguments = { + { + { "instance" }, + { "format" }, + { "data" }, + { "initializations" }, + { "useextensions" }, + { "inclusions" }, + { "method" }, + }, + } +} + statistics.register("metapost processing time", function() local n = metapost.n if n and n > 0 then @@ -165,17 +332,44 @@ end) -- only used in graphictexts metapost.tex = metapost.tex or { } +local mptex = metapost.tex local environments = { } -function metapost.tex.set(str) +function mptex.set(str) environments[#environments+1] = str end -function metapost.tex.reset() - environments = { } +function mptex.setfrombuffer(name) + environments[#environments+1] = buffers.content(name) end -function metapost.tex.get() +function mptex.get() return concat(environments,"\n") end + +function mptex.reset() + environments = { } +end + +implement { + name = "mptexset", + arguments = "string", + actions = mptex.set +} + +implement { + name = "mptexsetfrombuffer", + arguments = "string", + actions = mptex.setfrombuffer +} + +implement { + name = "mptexget", + actions = { mptex.get, context } +} + +implement { + name = "mptexreset", + actions = mptex.reset +} diff --git a/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv b/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv index e4c1cb6fe3e..a7bb612c854 100644 --- a/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv +++ b/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv @@ -19,6 +19,7 @@ \registerctxluafile{mlib-run}{1.001} \registerctxluafile{mlib-ctx}{1.001} \registerctxluafile{mlib-lua}{1.001} +\registerctxluafile{mlib-int}{1.001} % here ? \unprotect diff --git a/Master/texmf-dist/tex/context/base/mlib-int.lua b/Master/texmf-dist/tex/context/base/mlib-int.lua new file mode 100644 index 00000000000..43bf14d3831 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mlib-int.lua @@ -0,0 +1,149 @@ +if not modules then modules = { } end modules ['mlib-int'] = { + version = 1.001, + comment = "companion to mlib-ctx.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", +} + +local factor = number.dimenfactors.bp +local mpprint = mp.print +local mpboolean = mp.boolean +local mpquoted = mp.quoted +local getdimen = tex.getdimen +local getcount = tex.getcount +local get = tex.get +local mpcolor = attributes.colors.mpcolor +local emwidths = fonts.hashes.emwidths +local exheights = fonts.hashes.exheights + +function mp.PaperHeight () mpprint(getdimen("paperheight") *factor) end +function mp.PaperWidth () mpprint(getdimen("paperwidth") *factor) end +function mp.PrintPaperHeight () mpprint(getdimen("printpaperheight") *factor) end +function mp.PrintPaperWidth () mpprint(getdimen("printpaperwidth") *factor) end +function mp.TopSpace () mpprint(getdimen("topspace") *factor) end +function mp.BottomSpace () mpprint(getdimen("bottomspace") *factor) end +function mp.BackSpace () mpprint(getdimen("backspace") *factor) end +function mp.CutSpace () mpprint(getdimen("cutspace") *factor) end +function mp.MakeupHeight () mpprint(getdimen("makeupheight") *factor) end +function mp.MakeupWidth () mpprint(getdimen("makeupwidth") *factor) end +function mp.TopHeight () mpprint(getdimen("topheight") *factor) end +function mp.TopDistance () mpprint(getdimen("topdistance") *factor) end +function mp.HeaderHeight () mpprint(getdimen("headerheight") *factor) end +function mp.HeaderDistance () mpprint(getdimen("headerdistance") *factor) end +function mp.TextHeight () mpprint(getdimen("textheight") *factor) end +function mp.FooterDistance () mpprint(getdimen("footerdistance") *factor) end +function mp.FooterHeight () mpprint(getdimen("footerheight") *factor) end +function mp.BottomDistance () mpprint(getdimen("bottomdistance") *factor) end +function mp.BottomHeight () mpprint(getdimen("bottomheight") *factor) end +function mp.LeftEdgeWidth () mpprint(getdimen("leftedgewidth") *factor) end +function mp.LeftEdgeDistance () mpprint(getdimen("leftedgedistance") *factor) end +function mp.LeftMarginWidth () mpprint(getdimen("leftmarginwidth") *factor) end +function mp.LeftMarginDistance () mpprint(getdimen("leftmargindistance") *factor) end +function mp.TextWidth () mpprint(getdimen("textwidth") *factor) end +function mp.RightMarginDistance () mpprint(getdimen("rightmargindistance") *factor) end +function mp.RightMarginWidth () mpprint(getdimen("rightmarginwidth") *factor) end +function mp.RightEdgeDistance () mpprint(getdimen("rightedgedistance") *factor) end +function mp.RightEdgeWidth () mpprint(getdimen("rightedgewidth") *factor) end +function mp.InnerMarginDistance () mpprint(getdimen("innermargindistance") *factor) end +function mp.InnerMarginWidth () mpprint(getdimen("innermarginwidth") *factor) end +function mp.OuterMarginDistance () mpprint(getdimen("outermargindistance") *factor) end +function mp.OuterMarginWidth () mpprint(getdimen("outermarginwidth") *factor) end +function mp.InnerEdgeDistance () mpprint(getdimen("inneredgedistance") *factor) end +function mp.InnerEdgeWidth () mpprint(getdimen("inneredgewidth") *factor) end +function mp.OuterEdgeDistance () mpprint(getdimen("outeredgedistance") *factor) end +function mp.OuterEdgeWidth () mpprint(getdimen("outeredgewidth") *factor) end +function mp.PageOffset () mpprint(getdimen("pagebackgroundoffset")*factor) end +function mp.PageDepth () mpprint(getdimen("pagebackgrounddepth") *factor) end +function mp.LayoutColumns () mpprint(getcount("layoutcolumns")) end +function mp.LayoutColumnDistance() mpprint(getdimen("layoutcolumndistance")*factor) end +function mp.LayoutColumnWidth () mpprint(getdimen("layoutcolumnwidth") *factor) end +function mp.SpineWidth () mpprint(getdimen("spinewidth") *factor) end +function mp.PaperBleed () mpprint(getdimen("paperbleed") *factor) end + +function mp.PageNumber () mpprint(getcount("pageno")) end +function mp.RealPageNumber () mpprint(getcount("realpageno")) end +function mp.NOfPages () mpprint(getcount("lastpageno")) end + +function mp.CurrentColumn () mpprint(getcount("mofcolumns")) end +function mp.NOfColumns () mpprint(getcount("nofcolumns")) end + +function mp.BaseLineSkip () mpprint(getdimen("baselineskip") *factor) end +function mp.LineHeight () mpprint(getdimen("lineheight") *factor) end +function mp.BodyFontSize () mpprint(getdimen("bodyfontsize") *factor) end + +function mp.TopSkip () mpprint(getdimen("topskip") *factor) end +function mp.StrutHeight () mpprint(getdimen("strutht") *factor) end +function mp.StrutDepth () mpprint(getdimen("strutdp") *factor) end + +function mp.PageNumber () mpprint(getcount("pageno")) end +function mp.RealPageNumber () mpprint(getcount("realpageno")) end +function mp.NOfPages () mpprint(getcount("lastpageno")) end + +function mp.CurrentWidth () mpprint(get("hsize") *factor) end +function mp.CurrentHeight () mpprint(get("vsize") *factor) end + +function mp.EmWidth () mpprint(emwidths [false]*factor) end +function mp.ExHeight () mpprint(exheights[false]*factor) end + +mp.HSize = mp.CurrentWidth +mp.VSize = mp.CurrentHeight +mp.LastPageNumber = mp.NOfPages + +function mp.PageFraction () + local lastpage = getcount("lastpageno") + if lastpage > 1 then + mpprint((getcount("realpageno")-1)/(lastpage-1)) + else + mpprint(1) + end +end + +-- locals + +mp.OnRightPage = function() mpprint(structures.pages.on_right()) end -- needs checking +mp.OnOddPage = function() mpprint(structures.pages.is_odd ()) end -- needs checking +mp.InPageBody = function() mpprint(structures.pages.in_body ()) end -- needs checking + +-- mp.CurrentLayout : \currentlayout + +function mp.OverlayWidth () mpprint(getdimen("d_overlay_width") *factor) end +function mp.OverlayHeight () mpprint(getdimen("d_overlay_height") *factor) end +function mp.OverlayDepth () mpprint(getdimen("d_overlay_depth") *factor) end +function mp.OverlayLineWidth () mpprint(getdimen("d_overlay_linewidth")*factor) end +function mp.OverlayOffset () mpprint(getdimen("d_overlay_offset") *factor) end + +function mp.defaultcolormodel() + local colormethod = getcount("MPcolormethod") + -- if colormethod == 0 then + -- return 1 + -- elseif colormethod == 1 then + -- return 1 + -- elseif colormethod == 2 then + -- return 3 + -- else + -- return 3 + -- end + return (colormethod == 0 or colormethod == 1) and 1 or 3 +end + +-- not much difference (10000 calls in a graphic neither as expansion seems to win +-- over defining the macro etc) so let's not waste counters then + +-- function mp.OverlayColor() +-- local c = mpcolor( +-- getcount("c_overlay_colormodel"), +-- getcount("c_overlay_color"), +-- getcount("c_overlay_transparency") +-- ) +-- mpquoted(c) +-- end +-- +-- function mp.OverlayLineColor() +-- local c = mpcolor( +-- getcount("c_overlay_colormodel"), +-- getcount("c_overlay_linecolor"), +-- getcount("c_overlay_linetransparency") +-- ) +-- mpquoted(c) +-- end diff --git a/Master/texmf-dist/tex/context/base/mlib-lua.lua b/Master/texmf-dist/tex/context/base/mlib-lua.lua index e3a3ba5d8db..7e05684630d 100644 --- a/Master/texmf-dist/tex/context/base/mlib-lua.lua +++ b/Master/texmf-dist/tex/context/base/mlib-lua.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['mlib-pdf'] = { +if not modules then modules = { } end modules ['mlib-lua'] = { version = 1.001, comment = "companion to mlib-ctx.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -11,16 +11,21 @@ if not modules then modules = { } end modules ['mlib-pdf'] = { -- maybe we need mplib.model, but how with instances local type, tostring, select, loadstring = type, tostring, select, loadstring -local formatters = string.formatters local find, gsub = string.find, string.gsub -local concat = table.concat -local lpegmatch = lpeg.match + +local formatters = string.formatters +local concat = table.concat +local lpegmatch = lpeg.match + +local P, S, Ct = lpeg.P, lpeg.S, lpeg.Ct local report_luarun = logs.reporter("metapost","lua") local trace_luarun = false trackers.register("metapost.lua",function(v) trace_luarun = v end) local trace_enabled = true +local be_tolerant = true directives.register("metapost.lua.tolerant",function(v) be_tolerant = v end) + mp = mp or { } -- system namespace MP = MP or { } -- user namespace @@ -53,6 +58,8 @@ function mp._f_() end end +local f_code = formatters["%s return mp._f_()"] + local f_numeric = formatters["%.16f"] local f_pair = formatters["(%.16f,%.16f)"] local f_triplet = formatters["(%.16f,%.16f,%.16f)"] @@ -61,20 +68,32 @@ local f_quadruple = formatters["(%.16f,%.16f,%.16f,%.16f)"] function mp.print(...) for i=1,select("#",...) do local value = select(i,...) - if value then + if value ~= nil then n = n + 1 local t = type(value) if t == "number" then buffer[n] = f_numeric(value) elseif t == "string" then buffer[n] = value - else + elseif t == "table" then + buffer[n] = "(" .. concat(value,",") .. ")" + else -- boolean or whatever buffer[n] = tostring(value) end end end end +function mp.boolean(n) + n = n + 1 + buffer[n] = n and "true" or "false" +end + +function mp.numeric(n) + n = n + 1 + buffer[n] = n and f_numeric(n) or "0" +end + function mp.pair(x,y) n = n + 1 if type(x) == "table" then @@ -102,6 +121,55 @@ function mp.quadruple(w,x,y,z) end end +function mp.path(t,connector,cycle) + if type(t) == "table" then + local tn = #t + if tn > 0 then + if connector == true then + connector = "--" + cycle = true + elseif not connector then + connector = "--" + end + local ti = t[1] + n = n + 1 ; buffer[n] = f_pair(ti[1],ti[2]) + for i=2,tn do + local ti = t[i] + n = n + 1 ; buffer[n] = connector + n = n + 1 ; buffer[n] = f_pair(ti[1],ti[2]) + end + if cycle then + n = n + 1 ; buffer[n] = connector + n = n + 1 ; buffer[n] = "cycle" + end + end + end +end + +function mp.size(t) + n = n + 1 + buffer[n] = type(t) == "table" and f_numeric(#t) or "0" +end + +-- experiment: names can change + +local datasets = { } +mp.datasets = datasets + +function datasets.load(tag,filename) + if not filename then + tag, filename = file.basename(tag), tag + end + local data = mp.dataset(io.loaddata(filename) or "") + datasets[tag] = { + Data = data, + Line = function(n) mp.path(data[n or 1]) end, + Size = function() mp.size(data) end, + } +end + +-- + local replacer = lpeg.replacer("@","%%") function mp.format(fmt,...) @@ -124,7 +192,53 @@ function mp.quoted(fmt,s,...) end end -local f_code = formatters["%s return mp._f_()"] +function mp.n(t) + return type(t) == "table" and #t or 0 +end + +local whitespace = lpeg.patterns.whitespace +local newline = lpeg.patterns.newline +local setsep = newline^2 +local comment = (S("#%") + P("--")) * (1-newline)^0 * (whitespace - setsep)^0 +local value = (1-whitespace)^1 / tonumber +local entry = Ct( value * whitespace * value) +local set = Ct((entry * (whitespace-setsep)^0 * comment^0)^1) +local series = Ct((set * whitespace^0)^1) + +local pattern = whitespace^0 * series + +function mp.dataset(str) + return lpegmatch(pattern,str) +end + +-- \startluacode +-- local str = [[ +-- 10 20 20 20 +-- 30 40 40 60 +-- 50 10 +-- +-- 10 10 20 30 +-- 30 50 40 50 +-- 50 20 -- the last one +-- +-- 10 20 % comment +-- 20 10 +-- 30 40 # comment +-- 40 20 +-- 50 10 +-- ]] +-- +-- MP.myset = mp.dataset(str) +-- +-- inspect(MP.myset) +-- \stopluacode +-- +-- \startMPpage +-- color c[] ; c[1] := red ; c[2] := green ; c[3] := blue ; +-- for i=1 upto lua("mp.print(mp.n(MP.myset))") : +-- draw lua("mp.path(MP.myset[" & decimal i & "])") withcolor c[i] ; +-- endfor ; +-- \stopMPpage -- function metapost.runscript(code) -- local f = loadstring(f_code(code)) @@ -147,13 +261,17 @@ local f_code = formatters["%s return mp._f_()"] local cache, n = { }, 0 -- todo: when > n then reset cache or make weak function metapost.runscript(code) - if trace_enabled and trace_luarun then + local trace = trace_enabled and trace_luarun + if trace then report_luarun("code: %s",code) end local f if n > 100 then cache = nil -- forget about caching f = loadstring(f_code(code)) + if not f and be_tolerant then + f = loadstring(code) + end else f = cache[code] if not f then @@ -161,6 +279,12 @@ function metapost.runscript(code) if f then n = n + 1 cache[code] = f + elseif be_tolerant then + f = loadstring(code) + if f then + n = n + 1 + cache[code] = f + end end end end @@ -169,13 +293,21 @@ function metapost.runscript(code) if result then local t = type(result) if t == "number" then - return f_numeric(result) + t = f_numeric(result) elseif t == "string" then - return result + t = result else - return tostring(result) + t = tostring(result) end + if trace then + report_luarun("result: %s",code) + end + return t + elseif trace then + report_luarun("no result") end + else + report_luarun("no result, invalid code") end return "" end @@ -201,12 +333,51 @@ local get_number = get_numeric local currentmpx = nil -mp.numeric = function(s) return get_numeric(currentmpx,s) end -mp.string = function(s) return get_string (currentmpx,s) end -mp.boolean = function(s) return get_boolean(currentmpx,s) end -mp.number = mp.numeric +local get = { } +mp.get = get + +get.numeric = function(s) return get_numeric(currentmpx,s) end +get.string = function(s) return get_string (currentmpx,s) end +get.boolean = function(s) return get_boolean(currentmpx,s) end +get.number = mp.numeric function metapost.initializescriptrunner(mpx,trialrun) currentmpx = mpx - trace_enabled = not trialrun + if trace_luarun then + report_luarun("type of run: %s", trialrun and "trial" or "final") + end + -- trace_enabled = not trialrun blocks too much +end + +-- texts: + +local factor = 65536*(7227/7200) +local textexts = nil +local mptriplet = mp.triplet + +function mp.tt_initialize(tt) + textexts = tt +end + +-- function mp.tt_wd(n) +-- local box = textexts and textexts[n] +-- mpprint(box and box.width/factor or 0) +-- end +-- function mp.tt_ht(n) +-- local box = textexts and textexts[n] +-- mpprint(box and box.height/factor or 0) +-- end +-- function mp.tt_dp(n) +-- local box = textexts and textexts[n] +-- mpprint(box and box.depth/factor or 0) +-- end + +function mp.tt_dimensions(n) + local box = textexts[n] + if box then + -- could be made faster with nuts but not critical + mptriplet(box.width/factor,box.height/factor,box.depth/factor) + else + mptriplet(0,0,0) + end end diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.lua b/Master/texmf-dist/tex/context/base/mlib-pdf.lua index d25dde88469..8de09f42a60 100644 --- a/Master/texmf-dist/tex/context/base/mlib-pdf.lua +++ b/Master/texmf-dist/tex/context/base/mlib-pdf.lua @@ -19,13 +19,19 @@ local report_metapost = logs.reporter("metapost") local trace_variables = false trackers.register("metapost.variables",function(v) trace_variables = v end) -local mplib, context = mplib, context +local mplib = mplib +local context = context local allocate = utilities.storage.allocate local copy_node = node.copy local write_node = node.write +local pen_info = mplib.pen_info +local object_fields = mplib.fields + +local save_table = false + metapost = metapost or { } local metapost = metapost @@ -33,7 +39,6 @@ metapost.flushers = metapost.flushers or { } local pdfflusher = { } metapost.flushers.pdf = pdfflusher -metapost.multipass = false -- to be stacked metapost.n = 0 metapost.optimize = true -- false @@ -53,9 +58,19 @@ local f_J = formatters["%i J"] local f_d = formatters["[%s] %F d"] local f_w = formatters["%F w"] -local pdfliteral = function(s) +directives.register("metapost.savetable",function(v) + if type(v) == "string" then + save_table = file.addsuffix(v,"mpl") + elseif v then + save_table = file.addsuffix(environment.jobname .. "-graphic","mpl") + else + save_table = false + end +end) + +local pdfliteral = function(pdfcode) local literal = copy_node(mpsliteral) - literal.data = s + literal.data = pdfcode return literal end @@ -64,18 +79,19 @@ end -- get a new result table and the stored objects are forgotten. Otherwise they -- are reused. -local function getobjects(result,figure,f) +local function getobjects(result,figure,index) if metapost.optimize then - local objects = result.objects - if not objects then - result.objects = { } + local robjects = result.objects + if not robjects then + robjects = { } + result.objects = robjects end - objects = result.objects[f] - if not objects then - objects = figure:objects() - result.objects[f] = objects + local fobjects = robjects[index or 1] + if not fobjects then + fobjects = figure:objects() + robjects[index] = fobjects end - return objects + return fobjects else return figure:objects() end @@ -83,15 +99,20 @@ end function metapost.convert(result, trialrun, flusher, multipass, askedfig) if trialrun then - metapost.multipass = false - metapost.parse(result, askedfig) - if multipass and not metapost.multipass and metapost.optimize then - metapost.flush(result, flusher, askedfig) -- saves a run + local multipassindeed = metapost.parse(result,askedfig) + if multipass and not multipassindeed and metapost.optimize then + if save_table then + table.save(save_table,metapost.totable(result,1)) -- direct + end + metapost.flush(result,flusher,askedfig) -- saves a run else return false end else - metapost.flush(result, flusher, askedfig) + if save_table then + table.save(save_table,metapost.totable(result,1)) -- direct + end + metapost.flush(result,flusher,askedfig) end return true -- done end @@ -168,8 +189,6 @@ local bend_tolerance = 131/65536 local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1 -local pen_info = mplib.pen_info - local function pen_characteristics(object) local t = pen_info(object) rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty @@ -323,32 +342,8 @@ local variable = local pattern_lst = (variable * newline^0)^0 -metapost.variables = { } -- to be stacked -metapost.llx = 0 -- to be stacked -metapost.lly = 0 -- to be stacked -metapost.urx = 0 -- to be stacked -metapost.ury = 0 -- to be stacked - -function commands.mprunvar(key,n) -- should be defined in another lib - local value = metapost.variables[key] - if value ~= nil then - local tvalue = type(value) - if tvalue == "table" then - local ntype = type(n) - if ntype == "number" then - context(value[n]) - elseif ntype == "string" then - context(concat(value,n)) - else - context(concat(value," ")) - end - elseif tvalue == "number" or tvalue == "boolean" then - context(tostring(value)) - elseif tvalue == "string" then - context(value) - end - end -end +metapost.variables = { } -- to be stacked +metapost.properties = { } -- to be stacked function metapost.untagvariable(str,variables) -- will be redone if variables == false then @@ -374,6 +369,30 @@ function metapost.processspecial(str) end end +local function setproperties(figure) + local boundingbox = figure:boundingbox() + local properties = { + llx = boundingbox[1], + lly = boundingbox[2], + urx = boundingbox[3], + ury = boundingbox[4], + slot = figure:charcode(), + width = figure:width(), + height = figure:height(), + depth = figure:depth(), + italic = figure:italcorr(), + number = figure:charcode() or 0, + } + metapost.properties = properties + return properties +end + +local function setvariables(figure) + local variables = { } + metapost.variables = variables + return variables +end + function metapost.flush(result,flusher,askedfig) if result then local figures = result.fig @@ -388,42 +407,27 @@ function metapost.flush(result,flusher,askedfig) local flushfigure = flusher.flushfigure local textfigure = flusher.textfigure local processspecial = flusher.processspecial or metapost.processspecial - for f=1,#figures do - local figure = figures[f] - local objects = getobjects(result,figure,f) - local fignum = figure:charcode() or 0 - if askedfig == "direct" or askedfig == "all" or askedfig == fignum then - local t = { } + local variables = setvariables(figure) -- also resets then in case of not found + for index=1,#figures do + local figure = figures[index] + local properties = setproperties(figure) + if askedfig == "direct" or askedfig == "all" or askedfig == properties.number then + local objects = getobjects(result,figure,index) + local result = { } local miterlimit, linecap, linejoin, dashed = -1, -1, -1, false - local bbox = figure:boundingbox() - local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] - local variables = { } - metapost.variables = variables - metapost.properties = { - llx = llx, - lly = lly, - urx = urx, - ury = ury, - slot = figure:charcode(), - width = figure:width(), - height = figure:height(), - depth = figure:depth(), - italic = figure:italcorr(), - } - -- replaced by the above - metapost.llx = llx - metapost.lly = lly - metapost.urx = urx - metapost.ury = ury + local llx = properties.llx + local lly = properties.lly + local urx = properties.urx + local ury = properties.ury if urx < llx then -- invalid - startfigure(fignum,0,0,0,0,"invalid",figure) + startfigure(properties.number,0,0,0,0,"invalid",figure) stopfigure() else - startfigure(fignum,llx,lly,urx,ury,"begin",figure) - t[#t+1] = "q" + startfigure(properties.number,llx,lly,urx,ury,"begin",figure) + result[#result+1] = "q" if objects then - resetplugins(t) -- we should move the colorinitializer here + resetplugins(result) -- we should move the colorinitializer here for o=1,#objects do local object = objects[o] local objecttype = object.type @@ -434,20 +438,21 @@ function metapost.flush(result,flusher,askedfig) processspecial(object.prescript) end elseif objecttype == "start_clip" then - t[#t+1] = "q" - flushnormalpath(object.path,t,false) - t[#t+1] = "W n" + local evenodd = not object.istext and object.postscript == "evenodd" + result[#result+1] = "q" + flushnormalpath(object.path,result,false) + result[#result+1] = evenodd and "W* n" or "W n" elseif objecttype == "stop_clip" then - t[#t+1] = "Q" - miterlimit, linecap, linejoin, dashed = -1, -1, -1, false + result[#result+1] = "Q" + miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false elseif objecttype == "text" then - t[#t+1] = "q" + result[#result+1] = "q" local ot = object.transform -- 3,4,5,6,1,2 - t[#t+1] = f_cm(ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: formatters["%F %F m %F %F %F %F 0 0 cm"](unpack(ot)) - flushfigure(t) -- flush accumulated literals - t = { } + result[#result+1] = f_cm(ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: formatters["%F %F m %F %F %F %F 0 0 cm"](unpack(ot)) + flushfigure(result) -- flush accumulated literals + result = { } textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth) - t[#t+1] = "Q" + result[#result+1] = "Q" else -- we use an indirect table as we want to overload -- entries but this is not possible in userdata @@ -463,32 +468,32 @@ function metapost.flush(result,flusher,askedfig) local before, after = processplugins(object) local objecttype = object.type -- can have changed if before then - t = pluginactions(before,t,flushfigure) + result = pluginactions(before,result,flushfigure) end local ml = object.miterlimit if ml and ml ~= miterlimit then miterlimit = ml - t[#t+1] = f_M(ml) + result[#result+1] = f_M(ml) end local lj = object.linejoin if lj and lj ~= linejoin then linejoin = lj - t[#t+1] = f_j(lj) + result[#result+1] = f_j(lj) end local lc = object.linecap if lc and lc ~= linecap then linecap = lc - t[#t+1] = f_J(lc) + result[#result+1] = f_J(lc) end local dl = object.dash if dl then local d = f_d(concat(dl.dashes or {}," "),dl.offset) if d ~= dashed then dashed = d - t[#t+1] = dashed + result[#result+1] = d end - elseif dashed then - t[#t+1] = "[] 0 d" + elseif dashed ~= false then -- was just dashed test + result[#result+1] = "[] 0 d" dashed = false end local path = object.path -- newpath @@ -498,7 +503,7 @@ function metapost.flush(result,flusher,askedfig) if pen then if pen.type == 'elliptical' then transformed, penwidth = pen_characteristics(original) -- boolean, value - t[#t+1] = f_w(penwidth) -- todo: only if changed + result[#result+1] = f_w(penwidth) -- todo: only if changed if objecttype == 'fill' then objecttype = 'both' end @@ -507,58 +512,59 @@ function metapost.flush(result,flusher,askedfig) end end if transformed then - t[#t+1] = "q" + result[#result+1] = "q" end + local evenodd = not object.istext and object.postscript == "evenodd" if path then if transformed then - flushconcatpath(path,t,open) + flushconcatpath(path,result,open) else - flushnormalpath(path,t,open) + flushnormalpath(path,result,open) end if objecttype == "fill" then - t[#t+1] = "h f" + result[#result+1] = evenodd and "h f*" or "h f" -- f* = eo elseif objecttype == "outline" then - t[#t+1] = open and "S" or "h S" + result[#result+1] = open and "S" or "h S" elseif objecttype == "both" then - t[#t+1] = "h B" + result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath end end if transformed then - t[#t+1] = "Q" + result[#result+1] = "Q" end local path = object.htap if path then if transformed then - t[#t+1] = "q" + result[#result+1] = "q" end if transformed then - flushconcatpath(path,t,open) + flushconcatpath(path,result,open) else - flushnormalpath(path,t,open) + flushnormalpath(path,result,open) end if objecttype == "fill" then - t[#t+1] = "h f" + result[#result+1] = evenodd and "h f*" or "h f" -- f* = eo elseif objecttype == "outline" then - t[#t+1] = open and "S" or "h S" + result[#result+1] = open and "S" or "h S" elseif objecttype == "both" then - t[#t+1] = "h B" + result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath end if transformed then - t[#t+1] = "Q" + result[#result+1] = "Q" end end if after then - t = pluginactions(after,t,flushfigure) + result = pluginactions(after,result,flushfigure) end if object.grouped then -- can be qQ'd so changes can end up in groups - miterlimit, linecap, linejoin, dashed = -1, -1, -1, false + miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false end end end end - t[#t+1] = "Q" - flushfigure(t) + result[#result+1] = "Q" + flushfigure(result) stopfigure("end") end if askedfig ~= "all" then @@ -574,20 +580,18 @@ function metapost.parse(result,askedfig) if result then local figures = result.fig if figures then + local multipass = false local analyzeplugins = metapost.analyzeplugins -- each object - for f=1,#figures do - local figure = figures[f] - local fignum = figure:charcode() or 0 - if askedfig == "direct" or askedfig == "all" or askedfig == fignum then - local bbox = figure:boundingbox() - metapost.llx = bbox[1] - metapost.lly = bbox[2] - metapost.urx = bbox[3] - metapost.ury = bbox[4] - local objects = getobjects(result,figure,f) + for index=1,#figures do + local figure = figures[index] + local properties = setproperties(figure) + if askedfig == "direct" or askedfig == "all" or askedfig == properties.number then + local objects = getobjects(result,figure,index) if objects then for o=1,#objects do - analyzeplugins(objects[o]) + if analyzeplugins(objects[o]) then + multipass = true + end end end if askedfig ~= "all" then @@ -595,24 +599,24 @@ function metapost.parse(result,askedfig) end end end + return multipass end end end -- tracing: -local t = { } +local result = { } local flusher = { startfigure = function() - t = { } + result = { } context.startnointerference() end, flushfigure = function(literals) - local n = #t - for i=1, #literals do - n = n + 1 - t[n] = literals[i] + local n = #result + for i=1,#literals do + result[n+i] = literals[i] end end, stopfigure = function() @@ -622,30 +626,35 @@ local flusher = { function metapost.pdfliterals(result) metapost.flush(result,flusher) - return t + return result end --- so far - -function metapost.totable(result) - local figure = result and result.fig and result.fig[1] +function metapost.totable(result,askedfig) + local askedfig = askedfig or 1 + local figure = result and result.fig and result.fig[1] if figure then - local t = { } - local objects = figure:objects() + local results = { } + -- local objects = figure:objects() + local objects = getobjects(result,figure,askedfig) for o=1,#objects do local object = objects[o] - local tt = { } - local fields = mplib.fields(object) + local result = { } + local fields = object_fields(object) -- hm, is this the whole list, if so, we can get it once for f=1,#fields do local field = fields[f] - tt[field] = object[field] + result[field] = object[field] end - t[o] = tt + results[o] = result end - local b = figure:boundingbox() + local boundingbox = figure:boundingbox() return { - boundingbox = { llx = b[1], lly = b[2], urx = b[3], ury = b[4] }, - objects = t + boundingbox = { + llx = boundingbox[1], + lly = boundingbox[2], + urx = boundingbox[3], + ury = boundingbox[4], + }, + objects = results } else return nil diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv index 0913b3699ae..92bf86ea9f1 100644 --- a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv +++ b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv @@ -88,7 +88,7 @@ % MPLIB specific: -\def\MPLIBtoPDF#1{\ctxlua{metapost.flushliteral(#1)}} +\def\MPLIBtoPDF{\clf_mpflushliteral} \def\startMPLIBtoPDF#1#2#3#4% {\meta_process_graphic_figure_start @@ -109,7 +109,7 @@ \meta_process_graphic_figure_stop} \def\MPLIBflushreset % This can (will) move to the Lua end. - {\ctxlua{metapost.flushreset()}} + {\clf_mpflushreset} %D Kind of special: % @@ -134,27 +134,50 @@ \unexpanded\def\directMPgraphic {\dodoublegroupempty\mlib_direct_graphic} +% \def\mlib_direct_graphic#1#2% makes pages (todo: make boxes) +% {\meta_begin_graphic_group{#1}% +% \let\startMPLIBtoPDF\directstartMPLIBtoPDF +% \let\stopMPLIBtoPDF \directstopMPLIBtoPDF +% \meta_start_current_graphic +% \forgetall +% \edef\p_extensions{\MPinstanceparameter\s!extensions}% +% \normalexpanded{\noexpand\ctxlua{metapost.graphic { +% instance = "\currentMPinstance", +% format = "\currentMPformat", +% data = \!!bs#2;\!!es, +% initializations = \!!bs\meta_flush_current_initializations\!!es, +% % useextensions = "\MPinstanceparameter\s!extensions", +% \ifx\p_extensions\v!yes +% extensions = \!!bs\clf_getmpextensions{\currentMPinstance}\!!es, +% \fi +% inclusions = \!!bs\meta_flush_current_inclusions\!!es, +% definitions = \!!bs\meta_flush_current_definitions\!!es, +% figure = "all", +% method = "\MPinstanceparameter\c!method", +% }}}% +% \meta_stop_current_graphic +% \meta_end_graphic_group} + \def\mlib_direct_graphic#1#2% makes pages (todo: make boxes) {\meta_begin_graphic_group{#1}% \let\startMPLIBtoPDF\directstartMPLIBtoPDF \let\stopMPLIBtoPDF \directstopMPLIBtoPDF \meta_start_current_graphic - \forgetall - \edef\p_extensions{\MPinstanceparameter\s!extensions}% - \normalexpanded{\noexpand\ctxlua{metapost.graphic { - instance = "\currentMPinstance", - format = "\currentMPformat", - data = \!!bs#2;\!!es, - initializations = \!!bs\meta_flush_current_initializations\!!es, -% useextensions = "\MPinstanceparameter\s!extensions", -\ifx\p_extensions\v!yes - extensions = \!!bs\ctxcommand{getmpextensions("\currentMPinstance")}\!!es, -\fi - inclusions = \!!bs\meta_flush_current_inclusions\!!es, - definitions = \!!bs\meta_flush_current_definitions\!!es, - figure = "all", - method = "\MPinstanceparameter\c!method", - }}}% + \forgetall + \edef\p_extensions{\MPinstanceparameter\s!extensions}% + \normalexpanded{\noexpand\clf_mpgraphic + instance {\currentMPinstance}% + format {\currentMPformat}% + data {#2;}% + initializations {\meta_flush_current_initializations}% + \ifx\p_extensions\v!yes + extensions {\clf_getmpextensions{\currentMPinstance}}% + \fi + inclusions {\meta_flush_current_inclusions}% + definitions {\meta_flush_current_definitions}% + figure {all}% + method {\MPinstanceparameter\c!method}% + \relax}% \meta_stop_current_graphic \meta_end_graphic_group} diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.lua b/Master/texmf-dist/tex/context/base/mlib-pps.lua index ce95d5ca734..ab56699b9f9 100644 --- a/Master/texmf-dist/tex/context/base/mlib-pps.lua +++ b/Master/texmf-dist/tex/context/base/mlib-pps.lua @@ -6,10 +6,8 @@ if not modules then modules = { } end modules ['mlib-pps'] = { license = "see context related readme files", } --- todo: pass multipass nicer - local format, gmatch, match, split = string.format, string.gmatch, string.match, string.split -local tonumber, type = tonumber, type +local tonumber, type, unpack = tonumber, type, unpack local round = math.round local insert, remove, concat = table.insert, table.remove, table.concat local Cs, Cf, C, Cg, Ct, P, S, V, Carg = lpeg.Cs, lpeg.Cf, lpeg.C, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.S, lpeg.V, lpeg.Carg @@ -21,8 +19,12 @@ local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context local context = context local context_setvalue = context.setvalue +local implement = interfaces.implement +local setmacro = interfaces.setmacro + local texgetbox = tex.getbox local texsetbox = tex.setbox +local textakebox = tex.takebox local copy_list = node.copy_list local free_list = node.flush_list local setmetatableindex = table.setmetatableindex @@ -40,11 +42,19 @@ local report_textexts = logs.reporter("metapost","textexts") local report_scripts = logs.reporter("metapost","scripts") local colors = attributes.colors +local defineprocesscolor = colors.defineprocesscolor +local definespotcolor = colors.definespotcolor +local definemultitonecolor = colors.definemultitonecolor +local colorvalue = colors.value + +local transparencies = attributes.transparencies +local registertransparency = transparencies.register +local transparencyvalue = transparencies.value -local rgbtocmyk = colors.rgbtocmyk or function() return 0,0,0,1 end -local cmyktorgb = colors.cmyktorgb or function() return 0,0,0 end -local rgbtogray = colors.rgbtogray or function() return 0 end -local cmyktogray = colors.cmyktogray or function() return 0 end +local rgbtocmyk = colors.rgbtocmyk -- or function() return 0,0,0,1 end +local cmyktorgb = colors.cmyktorgb -- or function() return 0,0,0 end +local rgbtogray = colors.rgbtogray -- or function() return 0 end +local cmyktogray = colors.cmyktogray -- or function() return 0 end metapost.makempy = metapost.makempy or { nofconverted = 0 } local makempy = metapost.makempy @@ -59,11 +69,6 @@ local innertransparency = nooutertransparency local pdfcolor = lpdf.color local pdftransparency = lpdf.transparency -local registercolor = colors.register -local registerspotcolor = colors.registerspotcolor - -local transparencies = attributes.transparencies -local registertransparency = transparencies.register function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattribute) -- has always to be called before conversion @@ -85,6 +90,8 @@ function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattri innertransparency = outertransparency -- not yet used end +-- todo: get this from the lpdf module + local f_f = formatters["%F"] local f_f3 = formatters["%.3F"] @@ -94,6 +101,8 @@ local f_cmyk = formatters["%.3F %.3F %.3F %.3F k %.3F %.3F %.3F %.3F K"] local f_cm = formatters["q %F %F %F %F %F %F cm"] local f_shade = formatters["MpSh%s"] +local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"] + local function checked_color_pair(color,...) if not color then return innercolor, outercolor @@ -143,15 +152,6 @@ local function normalize(ca,cb) end end --- todo: check for the same colorspace (actually a backend issue), now we can --- have several similar resources --- --- normalize(ca,cb) fails for spotcolors - -local function spotcolorconverter(parent, n, d, p) - registerspotcolor(parent) - return pdfcolor(colors.model,registercolor(nil,'spot',parent,n,d,p)), outercolor -end local commasplitter = tsplitat(",") @@ -217,21 +217,34 @@ local function checkandconvert(ca,cb) end end +-- We keep textexts in a shared list (as it's easier that way and we also had that in +-- the beginning). Each graphic gets its own (1 based) subtable so that we can also +-- handle multiple conversions in one go which is needed when we process mp files +-- directly. + local stack = { } -- quick hack, we will pass topofstack around local top = nil local nofruns = 0 -- askedfig: "all", "first", number -local function startjob(texmode) - top = { - textexts = { }, -- all boxes, optionally with a different color - texslots = { }, -- references to textexts in order or usage - texorder = { }, -- references to textexts by mp index +local function preset(t,k) + -- references to textexts by mp index + local v = { textrial = 0, texfinal = 0, - -- used by tx plugin + texslots = { }, + texorder = { }, texhash = { }, + } + t[k] = v + return v +end + +local function startjob(plugmode) + top = { + textexts = { }, -- all boxes, optionally with a different color texlast = 0, - texmode = texmode, -- some day we can then skip all pre/postscripts + texdata = setmetatableindex({},preset), -- references to textexts in order or usage + plugmode = plugmode, -- some day we can then skip all pre/postscripts } insert(stack,top) if trace_runs then @@ -245,7 +258,7 @@ local function stopjob() for n, tn in next, top.textexts do free_list(tn) if trace_textexts then - report_textexts("freeing box %s",n) + report_textexts("freeing text %s",n) end end if trace_runs then @@ -257,27 +270,41 @@ local function stopjob() end end -function metapost.settextexts () end -- obsolete -function metapost.resettextexts() end -- obsolete +function metapost.getjobdata() + return top +end -- end of new -function metapost.settext(box,slot) - top.textexts[slot] = copy_list(texgetbox(box)) - texsetbox(box,nil) - -- this will become - -- top.textexts[slot] = texgetbox(box) - -- unsetbox(box) +local function settext(box,slot) + if top then + top.textexts[slot] = copy_list(texgetbox(box)) + texsetbox(box,nil) + -- this can become + -- top.textexts[slot] = textakebox(box) + else + -- weird error + end end -function metapost.gettext(box,slot) - texsetbox(box,copy_list(top.textexts[slot])) - if trace_textexts then - report_textexts("putting text %s in box %s",slot,box) +local function gettext(box,slot) + if top then + texsetbox(box,copy_list(top.textexts[slot])) + if trace_textexts then + report_textexts("putting text %s in box %s",slot,box) + end + -- top.textexts[slot] = nil -- no, pictures can be placed several times + else + -- weird error end - -- top.textexts[slot] = nil -- no, pictures can be placed several times end +metapost.settext = settext +metapost.gettext = gettext + +implement { name = "mpsettext", actions = settext, arguments = { "integer", "integer" } } -- box slot +implement { name = "mpgettext", actions = gettext, arguments = { "integer", "integer" } } -- box slot + -- rather generic pdf, so use this elsewhere too it no longer pays -- off to distinguish between outline and fill (we now have both -- too, e.g. in arrows) @@ -467,7 +494,7 @@ end -- currently a a one-liner produces less code -- textext.*(".*") can have "'s but tricky parsing as we can have concatenated strings --- so this is something for a boring plain or train trip and we might assume proper mp +-- so this is something for a boring plane or train trip and we might assume proper mp -- input anyway local parser = Cs(( @@ -477,57 +504,95 @@ local parser = Cs(( + 1 )^0) +local checking_enabled = true directives.register("metapost.checktexts",function(v) checking_enabled = v end) + local function checktexts(str) - found, forced = false, false - return lpegmatch(parser,str), found, forced + if checking_enabled then + found, forced = false, false + return lpegmatch(parser,str), found, forced + else + return str + end end metapost.checktexts = checktexts local factor = 65536*(7227/7200) -function metapost.edefsxsy(wd,ht,dp) -- helper for figure - local hd = ht + dp - context_setvalue("sx",wd ~= 0 and factor/wd or 0) - context_setvalue("sy",hd ~= 0 and factor/hd or 0) -end +-- function metapost.edefsxsy(wd,ht,dp) -- helper for figure +-- local hd = ht + dp +-- context_setvalue("sx",wd ~= 0 and factor/wd or 0) +-- context_setvalue("sy",hd ~= 0 and factor/hd or 0) +-- end + +implement { + name = "mpsetsxsy", + arguments = { "dimen", "dimen", "dimen" }, + actions = function(wd,ht,dp) + local hd = ht + dp + setmacro("sx",wd ~= 0 and factor/wd or 0) + setmacro("sy",hd ~= 0 and factor/hd or 0) + end +} local function sxsy(wd,ht,dp) -- helper for text local hd = ht + dp return (wd ~= 0 and factor/wd) or 0, (hd ~= 0 and factor/hd) or 0 end -local no_first_run = "mfun_first_run := false ;" -local do_first_run = "mfun_first_run := true ;" -local no_trial_run = "mfun_trial_run := false ;" -local do_trial_run = "mfun_trial_run := true ;" +-- for stock mp we need to declare the booleans first + +local no_first_run = "boolean mfun_first_run ; mfun_first_run := false ;" +local do_first_run = "boolean mfun_first_run ; mfun_first_run := true ;" +local no_trial_run = "boolean mfun_trial_run ; mfun_trial_run := false ;" +local do_trial_run = "boolean mfun_trial_run ; mfun_trial_run := true ;" local do_begin_fig = "; beginfig(1) ; " local do_end_fig = "; endfig ;" local do_safeguard = ";" -local f_text_data = formatters["mfun_tt_w[%i] := %f ; mfun_tt_h[%i] := %f ; mfun_tt_d[%i] := %f ;"] +-- local f_text_data = formatters["mfun_tt_w[%i] := %f ; mfun_tt_h[%i] := %f ; mfun_tt_d[%i] := %f ;"] +-- +-- function metapost.textextsdata() +-- local textexts = top.textexts +-- local collected = { } +-- local nofcollected = 0 +-- for k, data in sortedhash(top.texdata) do -- sort is nicer in trace +-- local texorder = data.texorder +-- for n=1,#texorder do +-- local box = textexts[texorder[n]] +-- if box then +-- local wd, ht, dp = box.width/factor, box.height/factor, box.depth/factor +-- if trace_textexts then +-- report_textexts("passed data item %s:%s > (%p,%p,%p)",k,n,wd,ht,dp) +-- end +-- nofcollected = nofcollected + 1 +-- collected[nofcollected] = f_text_data(n,wd,n,ht,n,dp) +-- else +-- break +-- end +-- end +-- end +-- return collected +-- end function metapost.textextsdata() - local texorder = top.texorder - local textexts = top.textexts - local collected = { } - local nofcollected = 0 - for n=1,#texorder do - local box = textexts[texorder[n]] - if box then - local wd, ht, dp = box.width/factor, box.height/factor, box.depth/factor - if trace_textexts then - report_textexts("passed data item %s: (%p,%p,%p)",n,wd,ht,dp) + local textexts = top.textexts + local collected = { } + for k, data in sortedhash(top.texdata) do -- sort is nicer in trace + local texorder = data.texorder + for n=1,#texorder do + local box = textexts[texorder[n]] + if box then + collected[n] = box + else + break end - nofcollected = nofcollected + 1 - collected[nofcollected] = f_text_data(n,wd,n,ht,n,dp) - else - break end end - return collected + mp.tt_initialize(collected) end + metapost.intermediate = metapost.intermediate or { } metapost.intermediate.actions = metapost.intermediate.actions or { } @@ -558,16 +623,16 @@ local function extrapass() if trace_runs then report_metapost("second run of job %s, asked figure %a",top.nofruns,top.askedfig) end + local textexts = metapost.textextsdata() processmetapost(top.mpx, { top.wrappit and do_begin_fig or "", no_trial_run, - concat(metapost.textextsdata()," ;\n"), + textexts and concat(textexts," ;\n") or "", top.initializations, do_safeguard, top.data, top.wrappit and do_end_fig or "", }, false, nil, false, true, top.askedfig) - -- context.MPLIBresettexts() -- must happen afterwards end function metapost.graphic_base_pass(specification) -- name will change (see mlib-ctx.lua) @@ -591,17 +656,18 @@ function metapost.graphic_base_pass(specification) -- name will change (see mlib top.nofruns = nofruns -- local done_1, done_2, done_3, forced_1, forced_2, forced_3 - data, done_1, forced_1 = checktexts(data) - -- we had preamble = extensions + inclusions - if extensions == "" then - extensions, done_2, forced_2 = "", false, false - else - extensions, done_2, forced_2 = checktexts(extensions) - end - if inclusions == "" then - inclusions, done_3, forced_3 = "", false, false - else - inclusions, done_3, forced_3 = checktexts(inclusions) + if checking_enabled then + data, done_1, forced_1 = checktexts(data) + if extensions == "" then + extensions, done_2, forced_2 = "", false, false + else + extensions, done_2, forced_2 = checktexts(extensions) + end + if inclusions == "" then + inclusions, done_3, forced_3 = "", false, false + else + inclusions, done_3, forced_3 = checktexts(inclusions) + end end top.intermediate = false top.multipass = false -- no needed here @@ -686,6 +752,12 @@ function makempy.registerfile(filename) mpyfilename = filename end +implement { + name = "registermpyfile", + actions = makempy.registerfile, + arguments = "string" +} + function makempy.processgraphics(graphics) if #graphics == 0 then return @@ -726,13 +798,13 @@ end -- -- the new plugin handler -- -- -local sequencers = utilities.sequencers -local appendgroup = sequencers.appendgroup -local appendaction = sequencers.appendaction +local sequencers = utilities.sequencers +local appendgroup = sequencers.appendgroup +local appendaction = sequencers.appendaction -local resetter = nil -local analyzer = nil -local processor = nil +local resetter = nil +local analyzer = nil +local processor = nil local resetteractions = sequencers.new { arguments = "t" } local analyzeractions = sequencers.new { arguments = "object,prescript" } @@ -779,7 +851,7 @@ end -- end function metapost.pluginactions(what,t,flushfigure) -- before/after object, depending on what - if top.texmode then + if top.plugmode then -- hm, what about other features for i=1,#what do local wi = what[i] if type(wi) == "function" then @@ -796,7 +868,7 @@ function metapost.pluginactions(what,t,flushfigure) -- before/after object, depe end function metapost.resetplugins(t) -- intialize plugins, before figure - if top.texmode then + if top.plugmode then -- plugins can have been added resetter = resetteractions.runner analyzer = analyzeractions.runner @@ -807,16 +879,18 @@ function metapost.resetplugins(t) -- intialize plugins, before figure end function metapost.analyzeplugins(object) -- each object (first pass) - if top.texmode then + if top.plugmode then local prescript = object.prescript -- specifications if prescript and #prescript > 0 then - return analyzer(object,splitprescript(prescript)) + analyzer(object,splitprescript(prescript)) + return top.multipass end end + return false end function metapost.processplugins(object) -- each object (second pass) - if top.texmode then + if top.plugmode then local prescript = object.prescript -- specifications if prescript and #prescript > 0 then local before = { } @@ -860,6 +934,7 @@ end local function tx_reset() if top then + -- why ? top.texhash = { } top.texlast = 0 end @@ -869,14 +944,23 @@ local fmt = formatters["%s %s %s % t"] ----- pat = tsplitat(":") local pat = lpeg.tsplitter(":",tonumber) -- so that %F can do its work +local f_gray_yes = formatters["s=%F,a=%F,t=%F"] +local f_gray_nop = formatters["s=%F"] +local f_rgb_yes = formatters["r=%F,g=%F,b=%F,a=%F,t=%F"] +local f_rgb_nop = formatters["r=%F,g=%F,b=%F"] +local f_cmyk_yes = formatters["c=%F,m=%F,y=%F,k=%F,a=%F,t=%F"] +local f_cmyk_nop = formatters["c=%F,m=%F,y=%F,k=%F"] + local ctx_MPLIBsetNtext = context.MPLIBsetNtext local ctx_MPLIBsetCtext = context.MPLIBsetCtext +local ctx_MPLIBsettext = context.MPLIBsettext local function tx_analyze(object,prescript) -- todo: hash content and reuse them + local data = top.texdata[metapost.properties.number] local tx_stage = prescript.tx_stage if tx_stage == "trial" then - local tx_trial = top.textrial + 1 - top.textrial = tx_trial + local tx_trial = data.textrial + 1 + data.textrial = tx_trial local tx_number = tonumber(prescript.tx_number) local s = object.postscript or "" local c = object.color -- only simple ones, no transparency @@ -886,80 +970,80 @@ local function tx_analyze(object,prescript) -- todo: hash content and reuse them c = lpegmatch(pat,txc) end end - local a = prescript.tr_alternative - local t = prescript.tr_transparency + local a = tonumber(prescript.tr_alternative) + local t = tonumber(prescript.tr_transparency) local h = fmt(tx_number,a or "-",t or "-",c or "-") - local n = top.texhash[h] -- todo: hashed variant with s (nicer for similar labels) + local n = data.texhash[h] -- todo: hashed variant with s (nicer for similar labels) if not n then local tx_last = top.texlast + 1 top.texlast = tx_last + -- report_textexts("tex string: %s",s) if not c then ctx_MPLIBsetNtext(tx_last,s) elseif #c == 1 then if a and t then - ctx_MPLIBsetCtext(tx_last,formatters["s=%F,a=%F,t=%F"](c[1],a,t),s) + ctx_MPLIBsetCtext(tx_last,f_gray_yes(c[1],a,t),s) else - ctx_MPLIBsetCtext(tx_last,formatters["s=%F"](c[1]),s) + ctx_MPLIBsetCtext(tx_last,f_gray_nop(c[1]),s) end elseif #c == 3 then if a and t then - ctx_MPLIBsetCtext(tx_last,formatters["r=%F,g=%F,b=%F,a=%F,t=%F"](c[1],c[2],c[3],a,t),s) + ctx_MPLIBsetCtext(tx_last,f_rgb_nop(c[1],c[2],c[3],a,t),s) else - ctx_MPLIBsetCtext(tx_last,formatters["r=%F,g=%F,b=%F"](c[1],c[2],c[3]),s) + ctx_MPLIBsetCtext(tx_last,f_rgb_nop(c[1],c[2],c[3]),s) end elseif #c == 4 then if a and t then - ctx_MPLIBsetCtext(tx_last,formatters["c=%F,m=%F,y=%F,k=%F,a=%F,t=%F"](c[1],c[2],c[3],c[4],a,t),s) + ctx_MPLIBsetCtext(tx_last,f_cmyk_yes(c[1],c[2],c[3],c[4],a,t),s) else - ctx_MPLIBsetCtext(tx_last,formatters["c=%F,m=%F,y=%F,k=%F"](c[1],c[2],c[3],c[4]),s) + ctx_MPLIBsetCtext(tx_last,f_cmyk_nop(c[1],c[2],c[3],c[4]),s) end else ctx_MPLIBsetNtext(tx_last,s) end top.multipass = true - metapost.multipass = true -- ugly - top.texhash[h] = tx_last - top.texslots[tx_trial] = tx_last - top.texorder[tx_number] = tx_last + data.texhash [h] = tx_last + data.texslots[tx_trial] = tx_last + data.texorder[tx_number] = tx_last if trace_textexts then - report_textexts("stage %a, usage %a, number %a, new %a, hash %a",tx_stage,tx_trial,tx_number,tx_last,h) + report_textexts("stage %a, usage %a, number %a, new %a, hash %a, text %a",tx_stage,tx_trial,tx_number,tx_last,h,s) end else - top.texslots[tx_trial] = n + data.texslots[tx_trial] = n if trace_textexts then - report_textexts("stage %a, usage %a, number %a, new %a, hash %a",tx_stage,tx_trial,tx_number,n,h) + report_textexts("stage %a, usage %a, number %a, old %a, hash %a, text %a",tx_stage,tx_trial,tx_number,n,h,s) end end elseif tx_stage == "extra" then - local tx_trial = top.textrial + 1 - top.textrial = tx_trial + local tx_trial = data.textrial + 1 + data.textrial = tx_trial local tx_number = tonumber(prescript.tx_number) - if not top.texorder[tx_number] then + if not data.texorder[tx_number] then local s = object.postscript or "" local tx_last = top.texlast + 1 top.texlast = tx_last - context.MPLIBsettext(tx_last,s) + ctx_MPLIBsettext(tx_last,s) top.multipass = true - metapost.multipass = true -- ugly - top.texslots[tx_trial] = tx_last - top.texorder[tx_number] = tx_last + data.texslots[tx_trial] = tx_last + data.texorder[tx_number] = tx_last if trace_textexts then - report_textexts("stage %a, usage %a, number %a, extra %a",tx_stage,tx_trial,tx_number,tx_last) + report_textexts("stage %a, usage %a, number %a, extra %a, text %a",tx_stage,tx_trial,tx_number,tx_last,s) end end end end local function tx_process(object,prescript,before,after) - local tx_number = prescript.tx_number + local data = top.texdata[metapost.properties.number] + local tx_number = tonumber(prescript.tx_number) if tx_number then - tx_number = tonumber(tx_number) local tx_stage = prescript.tx_stage if tx_stage == "final" then - top.texfinal = top.texfinal + 1 - local n = top.texslots[top.texfinal] + local tx_final = data.texfinal + 1 + data.texfinal = tx_final + local n = data.texslots[tx_final] if trace_textexts then - report_textexts("stage %a, usage %a, number %a, use %a",tx_stage,top.texfinal,tx_number,n) + report_textexts("stage %a, usage %a, number %a, use %a",tx_stage,tx_final,tx_number,n) end local sx, rx, ry, sy, tx, ty = cm(object) -- needs to be frozen outside the function local box = top.textexts[n] @@ -983,8 +1067,9 @@ local function tx_process(object,prescript,before,after) if not trace_textexts then object.path = false -- else: keep it end - object.color = false + object.color = false object.grouped = true + object.istext = true end end end @@ -1007,7 +1092,6 @@ local function gt_analyze(object,prescript) graphics[gt_index] = formatters["\\MPLIBgraphictext{%s}"](object.postscript or "") top.intermediate = true top.multipass = true - metapost.multipass = true -- ugly end end @@ -1023,9 +1107,9 @@ local function sh_process(object,prescript,before,after) local sh_type = prescript.sh_type if sh_type then nofshades = nofshades + 1 - local domain = lpegmatch(domainsplitter,prescript.sh_domain) - local centera = lpegmatch(centersplitter,prescript.sh_center_a) - local centerb = lpegmatch(centersplitter,prescript.sh_center_b) + local domain = lpegmatch(domainsplitter,prescript.sh_domain or "0 1") + local centera = lpegmatch(centersplitter,prescript.sh_center_a or "0 0") + local centerb = lpegmatch(centersplitter,prescript.sh_center_b or "0 0") -- local sh_color_a = prescript.sh_color_a or "1" local sh_color_b = prescript.sh_color_b or "1" @@ -1074,8 +1158,9 @@ local function sh_process(object,prescript,before,after) local coordinates = { centera[1], centera[2], centerb[1], centerb[2] } lpdf.linearshade(name,domain,ca,cb,1,colorspace,coordinates,separation) -- backend specific (will be renamed) elseif sh_type == "circular" then - local radiusa = tonumber(prescript.sh_radius_a) - local radiusb = tonumber(prescript.sh_radius_b) + local factor = tonumber(prescript.sh_factor) or 1 + local radiusa = factor * tonumber(prescript.sh_radius_a) + local radiusb = factor * tonumber(prescript.sh_radius_b) local coordinates = { centera[1], centera[2], radiusa, centerb[1], centerb[2], radiusb } lpdf.circularshade(name,domain,ca,cb,1,colorspace,coordinates,separation) -- backend specific (will be renamed) else @@ -1120,8 +1205,9 @@ local function ps_process(object,prescript,before,after) local first, third = op[1], op[3] local x, y = first.x_coord, first.y_coord local w, h = third.x_coord - x, third.y_coord - y - x = x - metapost.llx - y = metapost.ury - y + local properties = metapost.properties + x = x - properties.llx + y = properties.ury - y before[#before+1] = function() context.MPLIBpositionwhd(ps_label,x,y,w,h) end @@ -1156,6 +1242,12 @@ local value = Cs ( ( local t_list = attributes.list[attributes.private('transparency')] local c_list = attributes.list[attributes.private('color')] +local remappers = { + [1] = formatters["s=%s"], + [3] = formatters["r=%s,g=%s,b=%s"], + [4] = formatters["c=%s,m=%s,y=%s,k=%s"], +} + local function tr_process(object,prescript,before,after) -- before can be shortcut to t local tr_alternative = prescript.tr_alternative @@ -1171,56 +1263,83 @@ local function tr_process(object,prescript,before,after) local sp_type = prescript.sp_type if not sp_type then c_b, c_a = colorconverter(cs) - elseif sp_type == "spot" or sp_type == "multitone" then - local sp_name = prescript.sp_name or "black" - local sp_fractions = prescript.sp_fractions or 1 - local sp_components = prescript.sp_components or "" - local sp_value = prescript.sp_value or "1" - local cf = cs[1] - if cf ~= 1 then - -- beware, we do scale the spotcolors but not the alternative representation - sp_value = lpegmatch(value,sp_value,1,cf) or sp_value - end - c_b, c_a = spotcolorconverter(sp_name,sp_fractions,sp_components,sp_value) - elseif sp_type == "named" then - -- we might move this to another namespace .. also, named can be a spotcolor - -- so we need to check for that too ... also we need to resolve indirect - -- colors so we might need the second pass for this (draw dots with \MPcolor) + else local sp_name = prescript.sp_name or "black" - if not tr_alternative then - -- todo: sp_name is not yet registered at this time - local t = t_list[sp_name] -- string or attribute - local v = t and attributes.transparencies.value(t) - if v then - before[#before+1] = formatters["/Tr%s gs"](registertransparency(nil,v[1],v[2],true)) - after[#after+1] = "/Tr0 gs" -- outertransparency + if sp_type == "spot" then + local sp_value = prescript.sp_value or "s:1" + local sp_temp = formatters["mp:%s"](sp_value) + local s = split(sp_value,":") + local r = remappers[#s] + defineprocesscolor(sp_temp,r and r(unpack(s)) or "s=0",true,true) + definespotcolor(sp_name,sp_temp,"p=1",true) + sp_type = "named" + elseif sp_type == "multitone" then + local sp_value = prescript.sp_value or "s:1" + local sp_spec = { } + local sp_list = split(sp_value," ") + for i=1,#sp_list do + local v = sp_list[i] + local t = formatters["mp:%s"](v) + local s = split(v,":") + local r = remappers[#s] + defineprocesscolor(t,r and r(unpack(s)) or "s=0",true,true) + local tt = formatters["ms:%s"](v) + definespotcolor(tt,t,"p=1",true) + sp_spec[#sp_spec+1] = formatters["%s=1"](t) end + sp_spec = concat(sp_spec,",") + definemultitonecolor(sp_name,sp_spec,"","",true) + sp_type = "named" end - local c = c_list[sp_name] -- string or attribute - local v = c and attributes.colors.value(c) - if v then - -- all=1 gray=2 rgb=3 cmyk=4 - local colorspace = v[1] - local f = cs[1] - if colorspace == 2 then - local s = f*v[2] - c_b, c_a = checked_color_pair(f_gray,s,s) - elseif colorspace == 3 then - local r, g, b = f*v[3], f*v[4], f*v[5] - c_b, c_a = checked_color_pair(f_rgb,r,g,b,r,g,b) - elseif colorspace == 4 or colorspace == 1 then - local c, m, y, k = f*v[6], f*v[7], f*v[8], f*v[9] - c_b, c_a = checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k) - else - local s = f*v[2] - c_b, c_a = checked_color_pair(f_gray,s,s) + if sp_type == "named" then + -- we might move this to another namespace .. also, named can be a spotcolor + -- so we need to check for that too ... also we need to resolve indirect + -- colors so we might need the second pass for this (draw dots with \MPcolor) + if not tr_alternative then + -- todo: sp_name is not yet registered at this time + local t = t_list[sp_name] -- string or attribute + local v = t and transparencyvalue(t) + if v then + before[#before+1] = formatters["/Tr%s gs"](registertransparency(nil,v[1],v[2],true)) + after[#after+1] = "/Tr0 gs" -- outertransparency + end + end + local c = c_list[sp_name] -- string or attribute + local v = c and colorvalue(c) + if v then + -- all=1 gray=2 rgb=3 cmyk=4 + local colorspace = v[1] + local f = cs[1] + if colorspace == 2 then + local s = f*v[2] + c_b, c_a = checked_color_pair(f_gray,s,s) + elseif colorspace == 3 then + local r, g, b = f*v[3], f*v[4], f*v[5] + c_b, c_a = checked_color_pair(f_rgb,r,g,b,r,g,b) + elseif colorspace == 4 or colorspace == 1 then + local c, m, y, k = f*v[6], f*v[7], f*v[8], f*v[9] + c_b, c_a = checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k) + elseif colorspace == 5 then + -- not all viewers show the fractions ok + local name = v[10] + local value = split(v[13],",") + if f ~= 1 then + for i=1,#value do + value[i] = f * (tonumber(value[i]) or 1) + end + end + value = concat(value," ") + c_b, c_a = checked_color_pair(f_spot,name,name,value,value) + else + local s = f*v[2] + c_b, c_a = checked_color_pair(f_gray,s,s) + end end end - -- end if c_a and c_b then before[#before+1] = c_b - after[#after+1] = c_a + after [#after +1] = c_a end end end diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv index 207d9730c8a..07ac84b8d32 100644 --- a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv +++ b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv @@ -33,43 +33,23 @@ \newbox \MPtextbox \newtoks\everyMPLIBsettext % not used -% \def\MPLIBsettext#1% #2% -% {\dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox} -% -% \def\MPLIBresettexts -% {\ctxlua{metapost.resettextexts()}} -% -% \newconditional\MPLIBtextgetdone -% -% \def\MPLIBsettext#1% #2% -% {\ifconditional\MPLIBtextgetdone -% \else -% \cldcontext{metapost.tex.get()}% MPenvironments are depricated -% \settrue\MPLIBtextgetdone % no \global needed -% \fi -% \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox} -% -% \def\MPLIBresettexts -% {\ctxlua{metapost.resettextexts()}% -% \setfalse\MPLIBtextgetdone} - \def\doMPLIBflushenvironment {%\writestatus\m!metapost{flushing environment}% - \cldcontext{metapost.tex.get()}% + \clf_mptexget \let\MPLIBflushenvironment\relax}% MPenvironments are depricated} \let\MPLIBflushenvironment\doMPLIBflushenvironment \unexpanded\def\MPLIBsetNtext#1% #2% box text {\MPLIBflushenvironment - \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox\bgroup + \dowithnextbox{\clf_mpsettext\nextbox #1}\hbox\bgroup \meta_set_current_color \let\MPLIBflushenvironment\doMPLIBflushenvironment \let\next} % gobble open brace \unexpanded\def\MPLIBsetCtext#1#2% #3% box colorspec text {\MPLIBflushenvironment - \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox\bgroup + \dowithnextbox{\clf_mpsettext\nextbox #1}\hbox\bgroup \directcolored[#2]% \meta_set_current_color % so, textcolor wins ! \let\MPLIBflushenvironment\doMPLIBflushenvironment @@ -77,22 +57,19 @@ \let\MPLIBsettext\MPLIBsetNtext -\unexpanded\def\MPLIBresettexts - {\ctxlua{metapost.resettextexts()}} - \unexpanded\def\MPLIBgettextscaled#1#2#3% why a copy .. can be used more often - {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}% + {\clf_mpgettext\MPtextbox #1% \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=#2,\c!sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\forcecolorhack\hss}}} \unexpanded\def\MPLIBfigure#1#2% {\setbox\scratchbox\hbox{\externalfigure[#1][\c!mask=#2]}% - \ctxlua{metapost.edefsxsy(\number\wd\scratchbox,\number\ht\scratchbox,0)}% + \clf_mpsetsxsy\wd\scratchbox\ht\scratchbox\zeropoint \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=\sx,\c!sy=\sy]{\box\scratchbox}\hss}}} % horrible (we could inline scale and matrix code): \unexpanded\def\MPLIBgettextscaledcm#1#2#3#4#5#6#7#8#9% 2-7: sx,rx,ry,sy,tx,ty - {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}% + {\clf_mpgettext\MPtextbox #1% \setbox\MPbox\hbox\bgroup \dotransformnextbox{#2}{#3}{#4}{#5}{#6}{#7}% does push pop ... will be changed to proper lua call (avoid small numbers) \vbox to \zeropoint\bgroup diff --git a/Master/texmf-dist/tex/context/base/mlib-run.lua b/Master/texmf-dist/tex/context/base/mlib-run.lua index 2a34f44d5c8..121c32ae95a 100644 --- a/Master/texmf-dist/tex/context/base/mlib-run.lua +++ b/Master/texmf-dist/tex/context/base/mlib-run.lua @@ -44,12 +44,12 @@ local texerrormessage = logs.texerrormessage local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming +local formatters = string.formatters + local mplib = mplib metapost = metapost or { } local metapost = metapost -local mplibone = tonumber(mplib.version()) <= 1.50 - metapost.showlog = false metapost.lastlog = "" metapost.collapse = true -- currently mplib cannot deal with begingroup/endgroup mismatch in stepwise processing @@ -84,77 +84,74 @@ local mpbasepath = lpeg.instringchecker(P("/metapost/") * (P("context") + P("bas -- mplib has no real io interface so we have a different mechanism than -- tex (as soon as we have more control, we will use the normal code) - -local finders = { } -mplib.finders = finders - +-- -- for some reason mp sometimes calls this function twice which is inefficient -- but we cannot catch this -local function preprocessed(name) - if not mpbasepath(name) then - -- we could use the via file but we don't have a complete io interface yet - local data, found, forced = metapost.checktexts(io.loaddata(name) or "") - if found then - local temp = luatex.registertempfile(name,true) - io.savedata(temp,data) - return temp +do + + local finders = { } + mplib.finders = finders -- also used in meta-lua.lua + + local new_instance = mplib.new + local resolved_file = resolvers.findfile + + local function preprocessed(name) + if not mpbasepath(name) then + -- we could use the via file but we don't have a complete io interface yet + local data, found, forced = metapost.checktexts(io.loaddata(name) or "") + if found then + local temp = luatex.registertempfile(name,true) + io.savedata(temp,data) + return temp + end end + return name end - return name -end -mplib.preprocessed = preprocessed -- helper + mplib.preprocessed = preprocessed -- helper -finders.file = function(specification,name,mode,ftype) - return preprocessed(resolvers.findfile(name,ftype)) -end + local function validftype(ftype) + if ftype == "" then + -- whatever + elseif ftype == 0 then + -- mplib bug + else + return ftype + end + end -local function i_finder(name,mode,ftype) -- fake message for mpost.map and metafun.mpvi - local specification = url.hashed(name) - local finder = finders[specification.scheme] or finders.file - return finder(specification,name,mode,ftype) -end + finders.file = function(specification,name,mode,ftype) + return preprocessed(resolvers.findfile(name,validftype(ftype))) + end -local function o_finder(name,mode,ftype) - -- report_metapost("output file %a, mode %a, ftype %a",name,mode,ftype) - return name -end + local function i_finder(name,mode,ftype) -- fake message for mpost.map and metafun.mpvi + local specification = url.hashed(name) + local finder = finders[specification.scheme] or finders.file + return finder(specification,name,mode,validftype(ftype)) + end -local function finder(name,mode,ftype) - if mode == "w" then - return o_finder(name,mode,ftype) - else - return i_finder(name,mode,ftype) + local function o_finder(name,mode,ftype) + return name end -end -local i_limited = false -local o_limited = false + o_finder = sandbox.register(o_finder,sandbox.filehandlerone,"mplib output finder") -directives.register("system.inputmode", function(v) - if not i_limited then - local i_limiter = io.i_limiter(v) - if i_limiter then - i_finder = i_limiter.protect(i_finder) - i_limited = true - end + local function finder(name,mode,ftype) + return (mode == "w" and o_finder or i_finder)(name,mode,validftype(ftype)) end -end) - -directives.register("system.outputmode", function(v) - if not o_limited then - local o_limiter = io.o_limiter(v) - if o_limiter then - o_finder = o_limiter.protect(o_finder) - o_limited = true - end + + function mplib.new(specification) + specification.find_file = finder -- so we block an overload + return new_instance(specification) end -end) --- -- -- + mplib.finder = finder + +end -metapost.finder = finder +local new_instance = mplib.new +local find_file = mplib.finder function metapost.reporterror(result) if not result then @@ -182,184 +179,93 @@ function metapost.reporterror(result) return true end -if mplibone then - - report_metapost("fatal error: mplib is too old") - - os.exit() - - -- local preamble = [[ - -- boolean mplib ; mplib := true ; - -- string mp_parent_version ; mp_parent_version := "%s" ; - -- input "%s" ; dump ; - -- ]] - -- - -- metapost.parameters = { - -- hash_size = 100000, - -- main_memory = 4000000, - -- max_in_open = 50, - -- param_size = 100000, - -- } - -- - -- function metapost.make(name, target, version) - -- starttiming(mplib) - -- target = file.replacesuffix(target or name, "mem") -- redundant - -- local mpx = mplib.new ( table.merged ( - -- metapost.parameters, - -- { - -- ini_version = true, - -- find_file = finder, - -- job_name = file.removesuffix(target), - -- } - -- ) ) - -- if mpx then - -- starttiming(metapost.exectime) - -- local result = mpx:execute(format(preamble,version or "unknown",name)) - -- stoptiming(metapost.exectime) - -- mpx:finish() - -- end - -- stoptiming(mplib) - -- end - -- - -- function metapost.load(name) - -- starttiming(mplib) - -- local mpx = mplib.new ( table.merged ( - -- metapost.parameters, - -- { - -- ini_version = false, - -- mem_name = file.replacesuffix(name,"mem"), - -- find_file = finder, - -- -- job_name = "mplib", - -- } - -- ) ) - -- local result - -- if not mpx then - -- result = { status = 99, error = "out of memory"} - -- end - -- stoptiming(mplib) - -- return mpx, result - -- end - -- - -- function metapost.checkformat(mpsinput) - -- local mpsversion = environment.version or "unset version" - -- local mpsinput = file.addsuffix(mpsinput or "metafun", "mp") - -- local mpsformat = file.removesuffix(file.basename(texconfig.formatname or (tex and tex.formatname) or mpsinput)) - -- local mpsbase = file.removesuffix(file.basename(mpsinput)) - -- if mpsbase ~= mpsformat then - -- mpsformat = mpsformat .. "-" .. mpsbase - -- end - -- mpsformat = file.addsuffix(mpsformat, "mem") - -- local mpsformatfullname = caches.getfirstreadablefile(mpsformat,"formats","metapost") or "" - -- if mpsformatfullname ~= "" then - -- report_metapost("loading %a from %a", mpsinput, mpsformatfullname) - -- local mpx, result = metapost.load(mpsformatfullname) - -- if mpx then - -- local result = mpx:execute("show mp_parent_version ;") - -- if not result.log then - -- metapost.reporterror(result) - -- else - -- local version = match(result.log,">> *(.-)[\n\r]") or "unknown" - -- version = gsub(version,"[\'\"]","") - -- if version ~= mpsversion then - -- report_metapost("version mismatch: %s <> %s", version or "unknown", mpsversion) - -- else - -- return mpx - -- end - -- end - -- else - -- report_metapost("error in loading %a from %a", mpsinput, mpsformatfullname) - -- metapost.reporterror(result) - -- end - -- end - -- local mpsformatfullname = caches.setfirstwritablefile(mpsformat,"formats") - -- report_metapost("making %a into %a", mpsinput, mpsformatfullname) - -- metapost.make(mpsinput,mpsformatfullname,mpsversion) -- somehow return ... fails here - -- if lfs.isfile(mpsformatfullname) then - -- report_metapost("loading %a from %a", mpsinput, mpsformatfullname) - -- return metapost.load(mpsformatfullname) - -- else - -- report_metapost("problems with %a from %a", mpsinput, mpsformatfullname) - -- end - -- end - -else - - -- let end = relax ; - - local preamble = [[ - boolean mplib ; mplib := true ; - let dump = endinput ; - input "%s" ; - ]] - - local methods = { - double = "double", - scaled = "scaled", - binary = "binary", - decimal = "decimal", - default = "scaled", - } +local f_preamble = formatters [ [[ + boolean mplib ; mplib := true ; + let dump = endinput ; + input "%s" ; +]] ] + +local methods = { + double = "double", + scaled = "scaled", + binary = "binary", + decimal = "decimal", + default = "scaled", +} - function metapost.runscript(code) - return code - end +function metapost.runscript(code) + return code +end - function metapost.scripterror(str) - report_metapost("script error: %s",str) +function metapost.scripterror(str) + report_metapost("script error: %s",str) +end + +-- todo: random_seed + +local f_textext = formatters[ [[rawtextext("%s")]] ] + +function metapost.maketext(s,mode) + if mode and mode == 1 then + -- report_metapost("ignoring verbatimtex: %s",s) + else + -- report_metapost("handling btex ... etex: %s",s) + s = gsub(s,'"','"&ditto&"') + return f_textext(s) end +end - function metapost.load(name,method) - starttiming(mplib) - method = method and methods[method] or "scaled" - local mpx = mplib.new { - ini_version = true, - find_file = finder, - math_mode = method, - run_script = metapost.runscript, - script_error = metapost.scripterror, - } - report_metapost("initializing number mode %a",method) - local result - if not mpx then - result = { status = 99, error = "out of memory"} - else - result = mpx:execute(format(preamble, file.addsuffix(name,"mp"))) -- addsuffix is redundant - end - stoptiming(mplib) - metapost.reporterror(result) - return mpx, result +function metapost.load(name,method) + starttiming(mplib) + method = method and methods[method] or "scaled" + local mpx = new_instance { + ini_version = true, + math_mode = method, + run_script = metapost.runscript, + script_error = metapost.scripterror, + make_text = metapost.maketext, + extensions = 1, + } + report_metapost("initializing number mode %a",method) + local result + if not mpx then + result = { status = 99, error = "out of memory"} + else + result = mpx:execute(f_preamble(file.addsuffix(name,"mp"))) -- addsuffix is redundant end + stoptiming(mplib) + metapost.reporterror(result) + return mpx, result +end - function metapost.checkformat(mpsinput,method) - local mpsversion = environment.version or "unset version" - local mpsinput = mpsinput or "metafun" - local foundfile = "" - if file.suffix(mpsinput) ~= "" then - foundfile = finder(mpsinput) or "" - end - if foundfile == "" then - foundfile = finder(file.replacesuffix(mpsinput,"mpvi")) or "" - end - if foundfile == "" then - foundfile = finder(file.replacesuffix(mpsinput,"mpiv")) or "" - end - if foundfile == "" then - foundfile = finder(file.replacesuffix(mpsinput,"mp")) or "" - end - if foundfile == "" then - report_metapost("loading %a fails, format not found",mpsinput) +function metapost.checkformat(mpsinput,method) + local mpsversion = environment.version or "unset version" + local mpsinput = mpsinput or "metafun" + local foundfile = "" + if file.suffix(mpsinput) ~= "" then + foundfile = find_file(mpsinput) or "" + end + if foundfile == "" then + foundfile = find_file(file.replacesuffix(mpsinput,"mpvi")) or "" + end + if foundfile == "" then + foundfile = find_file(file.replacesuffix(mpsinput,"mpiv")) or "" + end + if foundfile == "" then + foundfile = find_file(file.replacesuffix(mpsinput,"mp")) or "" + end + if foundfile == "" then + report_metapost("loading %a fails, format not found",mpsinput) + else + report_metapost("loading %a as %a using method %a",mpsinput,foundfile,method or "default") + local mpx, result = metapost.load(foundfile,method) + if mpx then + return mpx else - report_metapost("loading %a as %a using method %a",mpsinput,foundfile,method or "default") - local mpx, result = metapost.load(foundfile,method) - if mpx then - return mpx - else - report_metapost("error in loading %a",mpsinput) - metapost.reporterror(result) - end + report_metapost("error in loading %a",mpsinput) + metapost.reporterror(result) end end - end function metapost.unload(mpx) @@ -409,7 +315,8 @@ function metapost.reset(mpx) end end -local mp_inp, mp_log, mp_tag = { }, { }, 0 +local mp_tra = { } +local mp_tag = 0 -- key/values @@ -423,18 +330,24 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, mpx = metapost.format(mpx) -- goody end if mpx and data then + local tra = nil starttiming(metapost) metapost.initializescriptrunner(mpx,trialrun) if trace_graphics then - if not mp_inp[mpx] then + tra = mp_tra[mpx] + if not tra then mp_tag = mp_tag + 1 local jobname = tex.jobname - mp_inp[mpx] = io.open(format("%s-mplib-run-%03i.mp", jobname,mp_tag),"w") - mp_log[mpx] = io.open(format("%s-mplib-run-%03i.log",jobname,mp_tag),"w") + tra = { + inp = io.open(formatters["%s-mplib-run-%03i.mp"] (jobname,mp_tag),"w"), + log = io.open(formatters["%s-mplib-run-%03i.log"](jobname,mp_tag),"w"), + } + mp_tra[mpx] = tra end - local banner = format("%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n", metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass)) - mp_inp[mpx]:write(banner) - mp_log[mpx]:write(banner) + local banner = formatters["%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n"]( + metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass)) + tra.inp:write(banner) + tra.log:write(banner) end if type(data) == "table" then -- this hack is needed because the library currently barks on \n\n @@ -471,17 +384,17 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, -- d = string.gsub(d,"\r","") if d then if trace_graphics then - mp_inp[mpx]:write(format("\n%% begin snippet %s\n",i)) - mp_inp[mpx]:write(d) - mp_inp[mpx]:write(format("\n%% end snippet %s\n",i)) + tra.inp:write(formatters["\n%% begin snippet %s\n"](i)) + tra.inp:write(d) + tra.inp:write(formatters["\n%% end snippet %s\n"](i)) end starttiming(metapost.exectime) - result = mpx:execute(d) + result = mpx:execute(d) -- some day we wil use a coroutine with textexts stoptiming(metapost.exectime) if trace_graphics and result then local str = result.log or result.error if str and str ~= "" then - mp_log[mpx]:write(str) + tra.log:write(str) end end if not metapost.reporterror(result) then @@ -505,7 +418,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, data = "tracingall;" .. data end if trace_graphics then - mp_inp[mpx]:write(data) + tra.inp:write(data) end starttiming(metapost.exectime) result = mpx:execute(data) @@ -513,7 +426,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, if trace_graphics and result then local str = result.log or result.error if str and str ~= "" then - mp_log[mpx]:write(str) + tra.log:write(str) end end -- todo: error message @@ -533,8 +446,8 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, end if trace_graphics then local banner = "\n% end graphic\n\n" - mp_inp[mpx]:write(banner) - mp_log[mpx]:write(banner) + tra.inp:write(banner) + tra.log:write(banner) end stoptiming(metapost) end @@ -596,7 +509,7 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata) else output = figures[v]:svg() -- (3) for prologues end - local outname = format("%s-%s.%s",basename,v,outputformat) + local outname = formatters["%s-%s.%s"](basename,v,outputformat) report_metapost("saving %s bytes in %a",#output,outname) io.savedata(outname,output) end @@ -629,7 +542,7 @@ function metapost.quickanddirty(mpxformat,data) stopfigure = function() end } - local data = format("; beginfig(1) ;\n %s\n ; endfig ;",data) + local data = formatters["; beginfig(1) ;\n %s\n ; endfig ;"](data) metapost.process(mpxformat, { data }, false, flusher, false, false, "all") if code then return { diff --git a/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex b/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex index 49920293fe6..fb53406d800 100644 --- a/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex +++ b/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex @@ -27,10 +27,11 @@ % --printformat : 2UP, etc % --paperformat=spec : paper*print or paperxprint % -% example: context --extra=arrange --printformat=2UP --paperformat=A4,A3,landscape myfile +% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile % % end help + \input mtx-context-common.tex \doifdocumentargument {paperoffset} { @@ -46,6 +47,7 @@ \setdocumentargument{sided}{singlesided} } + \setuppapersize [\getdocumentargument{paperformat_paper}] [\getdocumentargument{paperformat_print}] @@ -95,16 +97,17 @@ \starttext \startluacode - local format = string.format - local fprint = function(...) tex.sprint(tex.ctxcatcodes,format(...)) end - - if #document.files > 0 then - if document.arguments.sort then - table.sort(document.files) + local arguments = document.arguments + local files = document.files + local noffiles = #files + if noffiles > 0 then + if arguments.sort then + table.sort(files) end - local emptypages = document.arguments.addempty or "" - local textwidth = document.arguments.textwidth or "0cm" - for _, filename in ipairs(document.files) do + local emptypages = arguments.addempty or "" + local textwidth = arguments.textwidth or "0cm" + for i=1,noffiles do + local filename = files[i] if not string.find(filename,"^mtx%-context%-") then context.insertpages ( { filename }, @@ -114,7 +117,7 @@ end end else - fprint("no files given") + context("no files given") end \stopluacode diff --git a/Master/texmf-dist/tex/context/base/mtx-context-listing.tex b/Master/texmf-dist/tex/context/base/mtx-context-listing.tex index 2a333c78923..a38fc60a9df 100644 --- a/Master/texmf-dist/tex/context/base/mtx-context-listing.tex +++ b/Master/texmf-dist/tex/context/base/mtx-context-listing.tex @@ -24,13 +24,20 @@ % --scite : pretty print comform suffix using scite lexer % --bodyfont=list : additional bodyfont settings % --paperformat=spec : paper*print or paperxprint +% --compact : small margins, small font % % end help \input mtx-context-common.tex +\doifdocumentargument {compact} { + \setdocumentargument{topspace} {5mm} + \setdocumentargument{backspace}{5mm} + \setdocumentargument{bodyfont} {8pt} +} + \setupbodyfont - [11pt,tt,\getdocumentargument{bodyfont}] + [dejavu,11pt,tt,\getdocumentargument{bodyfont}] % dejavu is more complete \setuptyping [lines=yes] diff --git a/Master/texmf-dist/tex/context/base/mtx-context-precache.tex b/Master/texmf-dist/tex/context/base/mtx-context-precache.tex new file mode 100644 index 00000000000..9cbb46cf2c5 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mtx-context-precache.tex @@ -0,0 +1,161 @@ +%D \module +%D [ file=mtx-context-precache, +%D version=2014.12.24, +%D title=\CONTEXT\ Extra Trickry, +%D subtitle=Precaching Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin help +% +% usage: context --extra=precache [no options yet] +% +% example: context --extra=precache +% +% end help + +\startluacode + +local lower = string.lower +local filesuffix = file.suffix +local findfile = resolvers.find_file + +local report = logs.reporter("fonts","precache") + +function fonts.names.precache() + local handlers = fonts.handlers + if not handlers then + report("no handlers available") + return + end + local otfloader = handlers.otf and handlers.otf.load + local afmloader = handlers.afm and handlers.afm.load + if not (otfloader or afmloader) then + report("no otf or afm handler available") + return + end + fonts.names.load() + local data = fonts.names.data + if not data then + report("no font data available") + return + end + local specifications = data.specifications + if not specifications then + report("no font specifications available") + return + end + local n = 0 + for i=1,#specifications do + local specification = specifications[i] + local filename = specification.filename + local cleanfilename = specification.cleanfilename + local foundfile = findfile(filename) + if foundfile and foundfile ~= "" then + local suffix = lower(filesuffix(foundfile)) + if suffix == "otf" or suffix == "ttf" then + if otfloader then + report("caching otf file: %s",foundfile) + otfloader(foundfile) -- todo: ttc/sub + n = n + 1 + end + elseif suffix == "afm" then + if afmloader then + report("caching afm file: %s",foundfile) + afmloader(foundfile) + n = n + 1 + end + end + end + end + report("%s files out of %s cached",n,#specifications) +end + +\stopluacode + +\starttext + +\setuppapersize + [A4,landscape] + +\setuplayout + [width=middle, + height=middle, + footer=0pt, + header=1cm, + headerdistance=0cm, + backspace=5mm, + topspace=5mm] + +\setupbodyfont + [dejavu,6pt,tt] + +\startmode[*first] + \startluacode + fonts.names.precache() + \stopluacode +\stopmode + +\startluacode + fonts.names.load() + + local specifications = fonts.names.data.specifications + + local sorted = { } + local hashed = { } + + for i=1,#specifications do + local filename = specifications[i].cleanfilename + sorted[i] = filename + hashed[filename] = i + end + + table.sort(sorted) + + local context = context + local basename = file.basename + + local NC = context.NC + local NR = context.NR + local HL = context.HL + local bold = context.bold + + context.starttabulate { "||||||||||" } + HL() + NC() bold("format") + NC() bold("cleanfilename") + NC() bold("filename") + -- NC() bold("familyname") + -- NC() bold("fontname") + NC() bold("fullname") + NC() bold("rawname") + NC() bold("style") + NC() bold("variant") + NC() bold("weight") + NC() bold("width") + NC() NR() + HL() + for i=1,#sorted do + local specification = specifications[hashed[sorted[i]]] + NC() context(specification.format) + NC() context(specification.cleanfilename) + NC() context(basename(specification.filename)) + -- NC() context(specification.familyname) + -- NC() context(specification.fontname) + NC() context(specification.fullname) + NC() context(specification.rawname) + NC() context(specification.style) + NC() context(specification.variant) + NC() context(specification.weight) + NC() context(specification.width) + NC() NR() + end + context.stoptabulate() +\stopluacode + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/mult-aux.lua b/Master/texmf-dist/tex/context/base/mult-aux.lua index 5a103213cde..353b5e69c3a 100644 --- a/Master/texmf-dist/tex/context/base/mult-aux.lua +++ b/Master/texmf-dist/tex/context/base/mult-aux.lua @@ -154,3 +154,15 @@ function namespaces.list() local keys = { "type", "name", "comment", "version", "parent", "definition", "setup", "style" } utilities.formatters.list(data,"namespace",keys) end + + +interfaces.implement { + name = "definenamespace", + arguments = { "string", "string" }, + actions = namespaces.define +} + +interfaces.implement { + name = "listnamespaces", + actions = namespaces.list +} diff --git a/Master/texmf-dist/tex/context/base/mult-aux.mkiv b/Master/texmf-dist/tex/context/base/mult-aux.mkiv index bfac58261d3..b69d7f37068 100644 --- a/Master/texmf-dist/tex/context/base/mult-aux.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-aux.mkiv @@ -223,14 +223,30 @@ \def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}% \def#9##1{\csname#1#2:##1\endcsname}} +% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for +% saving some memory +% +% \unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) +% {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing +% %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% +% \edef#3##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1\noexpand#2:\s!parent\endcsname{##1}\noexpand\fi\endcsname}% +% \edef#4##1##2{\noexpand\ifcsname##1:##2\endcsname##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname##1:\s!parent\endcsname{##2}\noexpand\fi}% +% \def #5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? +% \edef#6##1##2{\noexpand\csname\noexpand\ifcsname#1##1:##2\endcsname#1##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1##1:\s!parent\endcsname{##2}\noexpand\fi\endcsname}% +% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack +% % \def#7##1{\mult_interfaces_detokenize{\csname#4{#1#2}{##1}\endcsname}}% compact version +% % \def#7##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}% +% \edef#8##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\s!empty\noexpand\fi\endcsname}% +% \edef#9##1{\noexpand\csname#1#2:##1\endcsname}} + \unexpanded\def\installparameterhandler#1#2% {\normalexpanded {\mult_interfaces_install_parameter_handler {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname #2parameter\endcsname - \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter_hash - \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter_hash + \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter + \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter \expandafter\noexpand\csname named#2parameter\endcsname \expandafter\noexpand\csname detokenized#2parameter\endcsname \expandafter\noexpand\csname strict#2parameter\endcsname % checked @@ -339,6 +355,11 @@ \expandafter\edef\csname#1#4:\s!parent\endcsname{#2}% \fi \fi} +\def\mult_interfaces_chain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\space\fi} +\def\getparentchain #1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi} +\def\getcurrentparentchain#1#2{\csname#1#2:\s!chain\endcsname} % for the moment test: +\def\getcurrentparentchain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi} + \unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones {\ifx#4\relax\let#4\empty\fi % see \defineregister \unexpanded\def#2{\dotripleempty#5}% @@ -351,6 +372,7 @@ \the#6% predefine \edef#8{##2}% \mult_check_for_parent{#1}{#3}#4#8% + \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}% \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}% \mult_interfaces_get_parameters{#1#4:}[##3]% \else\ifsecondargument @@ -358,16 +380,19 @@ \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=@@\_end_ \ifassignment \let#8\empty + \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}% \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}% \mult_interfaces_get_parameters{#1#4:}[##2]% \else \edef#8{##2}% \mult_check_for_parent{#1}{#3}#4#8% + \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}% \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}% \fi \else \the#6% predefine \let#8\empty + \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}% \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}% \fi\fi \the#7% @@ -696,7 +721,7 @@ \edef#2{##1}% #3[##2]% \else\iffirstargument - \doifassignmentelse{##1} + \doifelseassignment{##1} {\let#2\empty #3[##1]}% {\edef#2{##1}}% @@ -758,11 +783,11 @@ \else \global\advance\c_mult_interfaces_n_of_namespaces\plusone \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template}% - \ctxcommand{registernamespace(\number\c_mult_interfaces_n_of_namespaces,"#1")}% + \clf_registernamespace\c_mult_interfaces_n_of_namespaces{#1}% \fi} \def\mult_interfaces_get_parameters_error_indeed#1#2% - {\ctxcommand{showassignerror("#1","#2",\the\inputlineno)}} % no longer \waitonfatalerror + {\clf_showassignerror{#1}{#2}\inputlineno} % no longer \waitonfatalerror % We install two core namespaces here, as we want nice error messages. Maybe % we will reserve the first 9. @@ -844,10 +869,10 @@ {\dodoubleargument\mult_interfaces_define_name_space} \def\mult_interfaces_define_name_space[#1][#2]% namespace settings - {\ctxlua{interfaces.namespaces.define(\!!bs#1\!!es,\!!bs#2\!!es)}} + {\clf_definenamespace{#1}{#2}} \def\listnamespaces - {\ctxlua{interfaces.namespaces.list()}} + {\clf_listnamespaces} %D Helper: %D @@ -873,6 +898,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doifcommandhandlerelse\doifelsecommandhandler + \unexpanded\def\doifcommandhandler#1#2% namespace name {\ifcsname#1#2:\s!parent\endcsname \expandafter\firstofoneargument @@ -891,10 +918,10 @@ % another set of (fast) helpers (grep for usage): -\def\expandnamespaceparameter#1#2#3% \??xx \getp \c!xx \c!yy +\def\expandnamespaceparameter#1#2#3% \??xx \getp \c!xx \v!yy {\csname#1\ifcsname#1\expandafter\expandafter\expandafter\mult_aux_expand_namespace_parameter#2#3} -\def\mult_aux_expand_namespace_parameter#1#2% \cs \c!yy +\def\mult_aux_expand_namespace_parameter#1#2% \cs \v!yy {#1\endcsname#1\else#2\fi\endcsname} \def\expandnamespacemacro#1#2#3% \??xx \some_edefed_cs \c!yy @@ -933,13 +960,13 @@ \unexpanded\def\syst_helpers_double_empty#1#2#3% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_double_empty_one_yes_mult#2#3}% {\syst_helpers_double_empty_one_nop_mult#1}} \def\syst_helpers_double_empty_one_yes_mult#1#2[#3]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\secondargumenttrue#2[{#3}]}% {\syst_helpers_double_empty_two_nop_mult#1{#3}}} @@ -1006,19 +1033,19 @@ \unexpanded\def\syst_helpers_triple_empty#1#2#3#4% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_triple_empty_one_yes_mult#2#3#4}% {\syst_helpers_triple_empty_one_nop_mult#1}} \def\syst_helpers_triple_empty_one_yes_mult#1#2#3[#4]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_triple_empty_two_yes_mult#2#3{#4}}% {\syst_helpers_triple_empty_two_nop_mult#1{#4}}} \def\syst_helpers_triple_empty_two_yes_mult#1#2#3[#4]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\thirdargumenttrue#2[{#3}][{#4}]}% {\syst_helpers_triple_empty_three_nop_mult#1{#3}{#4}}} @@ -1102,8 +1129,8 @@ \expandafter\noexpand\csname saved_setup_current#2\endcsname \expandafter\noexpand\csname nested_setup_current#2\endcsname}} -% okay, we can also get rid of the #9, but thiS code looks pretty bad, while the previous is -% still okay given that we can also use #6 as setup1 (so in fact we can save some cs again and +% okay, we can also get rid of the #9, but this code looks pretty bad, while the previous is +% still okay given that we can also use #6 as setup (so in fact we can save some cs again and % only use one extra) % % \global\advance\commalevel \plusone @@ -1116,4 +1143,108 @@ % % \syst_helpers_do_do_process_comma_item##1,]\relax % \global\advance\commalevel \minusone +% The next one is experimental (and used in publications): + +\let\c_mult_set\relax + +\unexpanded\def\mult_interfaces_install_definition_set#1#2#3#4#5#6#7% + {\newcount#3% + \let#6\empty + \unexpanded\def#2% + {\expandafter\let\expandafter\c_mult_set\csname #1_t_#6\endcsname + \ifx\c_mult_set\relax + \expandafter\newtoks\c_mult_set + \expandafter\let\csname #1_t_#6\endcsname\c_mult_set + \fi} + \unexpanded\def#4##1% + {\pushmacro#6% + \advance#3\plusone + \edef#6{##1}% + \unprotect}% + \unexpanded\def#5% + {\protect + \advance#3\minusone + \popmacro#6}% + \unexpanded\def#7##1% + {\edef#6{##1}% + #2% + \the\c_mult_set\relax}} + +\unexpanded\def\installdefinitionset#1#2% + {\normalexpanded + {\mult_interfaces_install_definition_set + {\noexpand#1}% \??aa + \expandafter\noexpand\csname set_#2_toks\endcsname + \expandafter\noexpand\csname #2_nesting_depth\endcsname + \expandafter\noexpand\csname push#2\endcsname + \expandafter\noexpand\csname pop#2\endcsname + \expandafter\noexpand\csname current#2\endcsname + \expandafter\noexpand\csname use#2\endcsname}} + +\unexpanded\def\mult_interfaces_install_definition_set_member#1#2#3#4#5#6#7#8#9% no everysetups etc + {\let#5#2% + \unexpanded\def#2% + {\ifcase#4\relax\expandafter#5\else\expandafter#6\fi}% + \unexpanded\def#6% + {\dodoubleempty#7}% + \unexpanded\def#7[##1][##2]% + {\ifsecondargument + #3\c_mult_set\expandafter{\the\c_mult_set#9[##1][##2]}% + \else\iffirstargument + #3\c_mult_set\expandafter{\the\c_mult_set#8[##1]}% + \fi\fi}} + +\unexpanded\def\installdefinitionsetmember#1#2#3#4% + {\normalexpanded + {\mult_interfaces_install_definition_set_member + {\noexpand#3}% \??aa + \expandafter\noexpand\csname setup#4\endcsname + \expandafter\noexpand\csname set_#2_toks\endcsname + \expandafter\noexpand\csname #2_nesting_depth\endcsname + \expandafter\noexpand\csname normal_setup_#4\endcsname + \expandafter\noexpand\csname delayed_setup_#4\endcsname + \expandafter\noexpand\csname do_delayed_setup_#4\endcsname + \expandafter\noexpand\csname setup#4_\s!single\endcsname + \expandafter\noexpand\csname setup#4_\s!double\endcsname}} + +%D Another experiment: + +\unexpanded\def\mult_interfaces_install_parent_injector#1#2#3#4% + {\unexpanded\def#4##1% + {\ifx#3\empty + \expandafter\def\csname#1#2:\s!parent\endcsname{#1##1}% + \fi}} + +\unexpanded\def\installparentinjector#1#2% + {\normalexpanded{\mult_interfaces_install_parent_injector + {\noexpand#1}% + \expandafter\noexpand\csname current#2\endcsname + \expandafter\noexpand\csname current#2parent\endcsname + \expandafter\noexpand\csname inject#2parent\endcsname}} + \protect + +%\unprotect +% \installcorenamespace {test} \installcommandhandler \??test {test} \??test +% \unexpanded\def\TestMeA[#1]% +% {\edef\currenttest{#1} +% \edef\p_before{\testparameter\c!before}% +% \ifx\p_before\empty \relax \else \relax \fi} +% \unexpanded\def\TestMeB[#1]% +% {\edef\currenttest{#1} +% \doifelsenothing{\testparameter\c!before}\relax\relax} +% \unexpanded\def\TestMeC[#1]% +% {\edef\currenttest{#1} +% \expandafter\expandafter\expandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi} +% \unexpanded\def\TestMeD[#1]% +% {\edef\currenttest{#1} +% \doubleexpandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi} +% \protect +% +% \starttext +% \definetest[foo] \definetest[bar][foo] \setuptest[bar][before=indeed] +% \resettimer \dorecurse{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502 +% \resettimer \dorecurse{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530 +% \resettimer \dorecurse{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487 +% \resettimer \dorecurse{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493 +% \stoptext diff --git a/Master/texmf-dist/tex/context/base/mult-chk.lua b/Master/texmf-dist/tex/context/base/mult-chk.lua index 2a2dfcd4bd9..44a9f739f9e 100644 --- a/Master/texmf-dist/tex/context/base/mult-chk.lua +++ b/Master/texmf-dist/tex/context/base/mult-chk.lua @@ -16,7 +16,8 @@ local allocate = utilities.storage.allocate local report_interface = logs.reporter("interface","checking") -interfaces = interfaces or { } +local interfaces = interfaces +local implement = interfaces.implement interfaces.syntax = allocate { test = { keys = table.tohash { "a","b","c","d","e","f","g" } } @@ -48,6 +49,18 @@ function interfaces.addvalidkeys(category,list) end end +implement { + name = "setvalidinterfacekeys", + actions = interfaces.setvalidkeys, + arguments = { "string", "string" } +} + +implement { + name = "addvalidinterfacekeys", + actions = interfaces.addvalidkeys, + arguments = { "string", "string" } +} + -- weird code, looks incomplete ... probably an experiment local prefix, category, keys @@ -73,4 +86,8 @@ function interfaces.getcheckedparameters(k,p,s) end end --- _igcp_ = interfaces.getcheckedparameters +implement { + name = "getcheckedinterfaceparameters", + actions = interfaces.getcheckedparameters, + arguments = { "string", "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/mult-chk.mkiv b/Master/texmf-dist/tex/context/base/mult-chk.mkiv index 1d02f166d1b..9208a73e1e5 100644 --- a/Master/texmf-dist/tex/context/base/mult-chk.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-chk.mkiv @@ -38,8 +38,8 @@ \unexpanded\def\setvalidparameterkeys{\dodoubleargument\mult_checkers_set_valid_parameter_keys} \unexpanded\def\addvalidparameterkeys{\dodoubleargument\mult_checkers_add_valid_parameter_keys} -\def\mult_checkers_set_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.setvalidkeys("#1",\!!bs#2\!!es)}} -\def\mult_checkers_add_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.addvalidkeys("#1",\!!bs#2\!!es)}} +\def\mult_checkers_set_valid_parameter_keys[#1][#2]{\clf_setvalidinterfacekeys{#1}{#2}} +\def\mult_checkers_add_valid_parameter_keys[#1][#2]{\clf_addvalidinterfacekeys{#1}{#2}} \def\mult_checkers_get_checked_parameters_yes[#1]#2[#3]#4[#5% {\if\noexpand#5]% @@ -50,8 +50,7 @@ \fi{#1}{#3}#5} \def\mult_checkers_get_checked_parameters_yes_indeed#1#2#3]% - %{\ctxlua{_igcp_("#1","#2",\!!bs\detokenize{#3}\!!es)}} - {\ctxlua{interfaces.getcheckedparameters("#1","#2",\!!bs\detokenize{#3}\!!es)}} + {\clf_getcheckedinterfaceparameters{#1}{#2}{\detokenize{#3}}} \def\mult_checkers_get_checked_parameters_nop[#1]#2[#3]#4[#5% {\if\noexpand#5]% diff --git a/Master/texmf-dist/tex/context/base/mult-de.mkii b/Master/texmf-dist/tex/context/base/mult-de.mkii index 9e7ecd93071..90aae390e0d 100644 --- a/Master/texmf-dist/tex/context/base/mult-de.mkii +++ b/Master/texmf-dist/tex/context/base/mult-de.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{flushleft} \setinterfacevariable{flushouter}{flushouter} \setinterfacevariable{flushright}{flushright} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{fusszeile} \setinterfacevariable{footnote}{fussnote} \setinterfacevariable{force}{zwinge} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{gespiegelt} \setinterfacevariable{monday}{montag} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monofett} \setinterfacevariable{month}{monat} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positiv} \setinterfacevariable{postponing}{verschieben} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{einstellung} \setinterfacevariable{preview}{vorschau} \setinterfacevariable{previous}{vorig} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{september} \setinterfacevariable{serif}{serif} \setinterfacevariable{serried}{kleinerabstand} -\setinterfacevariable{setups}{impostazioni} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{sheet} \setinterfacevariable{short}{kurz} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{verknuepfung} \setinterfaceconstant{couplingway}{verkopplungsart} \setinterfaceconstant{criterium}{kriterium} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{aktuell} \setinterfaceconstant{cutspace}{cutspace} \setinterfaceconstant{dash}{strich} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{geraderand} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{expansion} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{einziehen} \setinterfaceconstant{indentnext}{ziehefolgendeein} \setinterfaceconstant{indicator}{indikator} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{innen} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{nrechts} \setinterfaceconstant{ntop}{noben} \setinterfaceconstant{number}{nummer} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{nummernfarbe} \setinterfaceconstant{numbercommand}{nummerbefehl} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definieretabellenvorlage} \setinterfacecommand{definetabulate}{definieretabulator} \setinterfacecommand{definetext}{definieretext} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{definetextposition} \setinterfacecommand{definetextvariable}{definetextvariable} \setinterfacecommand{definetype}{definetype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{papierhoehe} \setinterfacecommand{paperwidth}{papierbreite} \setinterfacecommand{periods}{punkt} -\setinterfacecommand{plaatsruwelijst}{placerawlist} \setinterfacecommand{placebookmarks}{platzierebookmarks} \setinterfacecommand{placecombinedlist}{platzierezusammengestellteliste} \setinterfacecommand{placefloat}{placefloat} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{placeheadtext} \setinterfacecommand{placelegend}{platzierelegende} \setinterfacecommand{placelist}{platziereliste} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{platzierelokalefussnoten} \setinterfacecommand{placelogos}{platzierelogo} \setinterfacecommand{placeongrid}{amgitterausrichten} \setinterfacecommand{placeontopofeachother}{platziereuntereinander} \setinterfacecommand{placepagenumber}{placepagenumber} +\setinterfacecommand{placerawlist}{placerawlist} \setinterfacecommand{placereferencelist}{placereferencelist} \setinterfacecommand{placeregister}{platziereregister} \setinterfacecommand{placerule}{placerule} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{stelleregisterein} \setinterfacecommand{setuprotate}{stelledrehenein} \setinterfacecommand{setuprule}{setuprule} -\setinterfacecommand{setups}{einstellungen} \setinterfacecommand{setupscreens}{stellerasterein} \setinterfacecommand{setupsection}{stelleabschnittein} \setinterfacecommand{setupsectionblock}{stelleabschnittsblockein} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{stelletabellenein} \setinterfacecommand{setuptabulate}{stelletabulatorein} \setinterfacecommand{setuptext}{stelletextein} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{setuptextposition} \setinterfacecommand{setuptextrules}{stelletextumrissein} \setinterfacecommand{setuptexttexts}{stelletexttexteein} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{startdokument} \setinterfacecommand{startenvironment}{startumgebung} \setinterfacecommand{startfigure}{startabbildung} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{startglobal} \setinterfacecommand{startline}{startzeile} \setinterfacecommand{startlinecorrection}{startzeilenkorrektur} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{starttabelle} \setinterfacecommand{starttables}{starttabellen} \setinterfacecommand{starttext}{starttext} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{starttextlinie} \setinterfacecommand{startunpacked}{startgrosserdurchschuss} \setinterfacecommand{startversion}{startversion} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{stopkomponente} \setinterfacecommand{stopdocument}{stopdokument} \setinterfacecommand{stopenvironment}{stopumgebung} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{stopglobal} \setinterfacecommand{stopline}{stopzeile} \setinterfacecommand{stoplinecorrection}{stopzeilenkorrektur} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{stoptabelle} \setinterfacecommand{stoptables}{stoptabellen} \setinterfacecommand{stoptext}{stoptext} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{stoptextlinie} \setinterfacecommand{stopunpacked}{stopgrosserdurchschuss} \setinterfacecommand{stopversion}{stopversion} diff --git a/Master/texmf-dist/tex/context/base/mult-def.lua b/Master/texmf-dist/tex/context/base/mult-def.lua index bd8b361851e..c0831de2d95 100644 --- a/Master/texmf-dist/tex/context/base/mult-def.lua +++ b/Master/texmf-dist/tex/context/base/mult-def.lua @@ -1275,6 +1275,10 @@ return { ["pe"]="تعریف‌مترادفها", ["ro"]="definestesinonim", }, + ["placelistofsynonyms"]={ + ["en"]="placelistofsynonyms", + ["nl"]="plaatslijstmetsynoniemen", + }, ["definetabletemplate"]={ ["cs"]="definujsablonutabulky", ["de"]="definieretabellenvorlage", @@ -2905,7 +2909,7 @@ return { ["pe"]="نقطه‌ها", ["ro"]="puncte", }, - ["plaatsruwelijst"]={ + ["placerawlist"]={ ["cs"]="placerawlist", ["de"]="placerawlist", ["en"]="placerawlist", @@ -4509,16 +4513,6 @@ return { ["pe"]="بارگذاری‌خط", ["ro"]="seteazarigla", }, - ["setups"]={ - ["cs"]="nastaveni", - ["de"]="einstellungen", - ["en"]="setups", - ["fr"]="reglages", - ["it"]="impostazioni", - ["nl"]="instellingen", - ["pe"]="بارگذاریها", - ["ro"]="setari", - }, ["setupscreens"]={ ["cs"]="nastavrastr", ["de"]="stellerasterein", @@ -5039,6 +5033,30 @@ return { ["pe"]="شروع‌تنظیم", ["ro"]="startaliniere", }, + ["starttextbackground"]={ + ["en"]="starttextbackground", + ["nl"]="starttekstachtergrond", + }, + ["stoptextbackground"]={ + ["en"]="stoptextbackground", + ["nl"]="stoptekstachtergrond", + }, + ["setuptextbackground"]={ + ["en"]="setuptextbackground", + ["nl"]="steltekstachtergrondin", + }, + ["definetextbackground"]={ + ["en"]="definetextbackground", + ["nl"]="definieertekstachtergrond", + }, + ["startframed"]={ + ["en"]="startframed", + ["nl"]="startomlijnd", + }, + ["stopframed"]={ + ["en"]="stopframed", + ["nl"]="stopomlijnd", + }, ["startbackground"]={ ["cs"]="startpozadi", ["de"]="starthintergrund", @@ -6454,6 +6472,10 @@ return { }, }, ["constants"]={ + ["setups"]={ + ["comment"]="no translations", + ["en"]="setups", + }, -- select/simplefonts ["regularfont"] ={ ["en"]="regularfont" }, ["boldfont"] ={ ["en"]="boldfont" }, @@ -6508,8 +6530,8 @@ return { ["export"] = { ["en"]="export", }, - ["css"] = { - ["en"]="css", + ["cssfile"] = { + ["en"]="cssfile", }, ["xhtml"] = { ["en"]="xhtml", @@ -6522,7 +6544,7 @@ return { ["en"]="labeloffset", }, ["exitoffset"]={ - ["en"]="labeloffset", + ["en"]="exitoffset", }, ["commentoffset"]={ ["en"]="commentoffset", @@ -6558,6 +6580,10 @@ return { ["en"]="headalign", ["nl"]="kopuitlijnen", }, + ["numberalign"]={ + ["en"]="numberalign", + ["nl"]="nummeruitlijnen", + }, ["alignsymbol"]={ ["en"]="alignsymbol", }, @@ -6625,6 +6651,9 @@ return { ["surnamesep"]={ ["en"]="surnamesep", }, + ["initialsep"]={ + ["en"]="initialsep", + }, ["surnameinitialsep"]={ ["en"]="surnameinitialsep", }, @@ -8944,7 +8973,7 @@ return { ["de"]="mindepth", ["en"]="mindepth", ["fr"]="profondeurmin", - ["it"]="mindeoth", + ["it"]="mindepth", ["nl"]="mindiepte", ["pe"]="کمترین‌عمق", ["ro"]="mindepth", @@ -10133,16 +10162,6 @@ return { ["pe"]="قراربده", ["ro"]="set", }, - ["setups"]={ - ["cs"]="setups", - ["de"]="setups", - ["en"]="setups", - ["fr"]="reglages", - ["it"]="setups", - ["nl"]="setups", - ["pe"]="بارگذاریها", - ["ro"]="setups", - }, ["shrink"]={ ["en"]="shrink", ["nl"]="krimp", @@ -11402,6 +11421,18 @@ return { }, }, ["variables"]={ + ["setups"]={ + ["comment"]="no translations", + ["en"]="setups", + }, + ["followingpage"]={ + ["en"]="followingpage", + ["nl"]="opvolgendepagina", + }, + ["precedingpage"]={ + ["en"]="followingpage", + ["nl"]="voorafgaandepagina", + }, ["math"]={ ["en"]="math", }, @@ -11518,21 +11549,27 @@ return { }, ["maxheight"]={ ["en"]="maxheight", + ["nl"]="maxhoogte", }, ["maxdepth"]={ ["en"]="maxdepth", + ["nl"]="maxdiepte", }, ["maxwidth"]={ ["en"]="maxwidth", + ["nl"]="maxbreedte", }, ["minheight"]={ ["en"]="minheight", + ["nl"]="minhoogte", }, ["mindepth"]={ ["en"]="mindepth", + ["nl"]="mindiepte", }, ["minwidth"]={ ["en"]="minwidth", + ["nl"]="minbreedte", }, ["short"]={ ["nl"]="kort", @@ -14387,6 +14424,16 @@ return { ["pe"]="مونو", ["ro"]="mono", }, + ["monobold"]={ + ["cs"]="monotucne", + ["de"]="monofett", + ["en"]="monobold", + ["fr"]="monogras", + ["it"]="monograssetto", + ["nl"]="monovet", + ["pe"]="monobold", + ["ro"]="monoaldin", + }, ["month"]={ ["cs"]="mesic", ["de"]="monat", @@ -15484,16 +15531,6 @@ return { ["pe"]="تنگ‌هم", ["ro"]="serried", }, - ["setups"]={ - ["cs"]="einstellungen", - ["de"]="impostazioni", - ["en"]="setups", - ["fr"]="reglages", - ["it"]="nastaveni", - ["nl"]="instellingen", - ["pe"]="بارگذاریها", - ["ro"]="setari", - }, ["sheet"]={ ["cs"]="sheet", ["de"]="sheet", diff --git a/Master/texmf-dist/tex/context/base/mult-def.mkiv b/Master/texmf-dist/tex/context/base/mult-def.mkiv index 321f06154a8..6efeb30694c 100644 --- a/Master/texmf-dist/tex/context/base/mult-def.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-def.mkiv @@ -30,85 +30,114 @@ % \input mult-\userinterfacetag \relax % \input mult-m\userresponsestag \relax -\ctxlua{interfaces.setuserinterface("\userinterfacetag","\userresponsestag")} - -% start todo: - -\def\c!fences {fences} -\def\c!keeptogether {keeptogether} -\def\c!viewerprefix {viewerprefix} - -\def\c!dataset {dataset} -\def\c!sectionblock {sectionblock} -\def\c!language {language} -\def\c!compressseparator{compressseparator} -\def\c!renderingsetup {renderingsetup} -\def\c!filler {filler} -\def\c!resources {resources} -\def\c!first {first} -\def\c!last {last} -\def\c!quotechar {quotechar} -\def\c!commentchar {commentchar} -\def\c!symbolcommand {symbolcommand} -\def\c!xmlsetup {xmlsetup} -\def\c!comma {comma} -\def\c!period {period} -\def\c!monthconversion {monthconversion} -\def\c!authorconversion {authorconversion} -\def\c!comment {comment} -\def\c!textalign {textalign} -\def\c!up {up} -\def\c!down {down} -\def\c!instance {instance} -\def\c!database {database} -\def\c!group {group} -\def\c!groupsuffix {groupsuffix} - -\def\c!referencemethod {referencemethod} % forward both - -\def\v!dataset {dataset} -\def\v!compressseparator{compressseparator} -\def\v!notation {notation} -\def\v!endnote {endnote} -\def\v!interactive {interactive} -\def\v!autopunctuation {autopunctuation} -\def\v!integral {integral} -\def\v!shiftup {shiftup} -\def\v!shiftdown {shiftdown} -\def\v!construction {construction} -\def\v!unframed {unframed} -\def\v!chemical {chemical} -\def\v!chemicals {chemicals} -\def\v!words {words} -\def\v!combination {combination} -\def\v!norepeat {norepeat} -\def\v!mixed {mixed} -\def\v!centerlast {centerlast} - -\def\s!lcgreek {lcgreek} -\def\s!ucgreek {ucgreek} -\def\s!sygreek {sygreek} -\def\s!italics {italics} -\def\s!integral {integral} -\def\s!insert {insert} % maybe insertclass -\def\s!marker {marker} - -\def\s!mixedcolumn {mixedcolumn} - -\def\s!double {double} -\def\s!decimal {decimal} -\def\s!binary {binary} - -\def\s!internal {internal} - -\def\s!current {current} - -\def\s!rel {rel} -\def\s!ord {ord} - -\def\c!HL {HL} -\def\c!VL {VL} -\def\c!NL {NL} +\clf_setuserinterface{\userinterfacetag}{\userresponsestag} + +% start todo in mult-def.lua: + +\def\v!alphabetic {alphabetic} +\def\v!Alphabetic {Alphabetic} + +\def\c!svgstyle {svgstyle} + +\def\c!translate {translate} + +\def\c!nextleft {nextleft} +\def\c!nextright {nextright} +\def\c!nextleftquotation {nextleftquotation} +\def\c!nextrightquotation{nextrightquotation} + +\def\c!fences {fences} +\def\c!words {words} +\def\c!characters {characters} +\def\c!hyphens {hyphens} +\def\c!joiners {joiners} +\def\c!leftwords {leftwords} +\def\c!rightwords {rightwords} +\def\c!keeptogether {keeptogether} +\def\c!viewerprefix {viewerprefix} + +\def\v!display {display} +\def\v!inline {inline} + +\def\v!camel {camel} + +\def\c!dataset {dataset} +\def\c!sectionblock {sectionblock} +\def\c!language {language} +\def\c!compressseparator {compressseparator} +\def\c!renderingsetup {renderingsetup} +\def\c!filler {filler} +\def\c!resources {resources} +\def\c!first {first} +\def\c!last {last} +\def\c!quotechar {quotechar} +\def\c!commentchar {commentchar} +\def\c!symbolcommand {symbolcommand} +\def\c!xmlsetup {xmlsetup} +\def\c!comma {comma} +\def\c!period {period} +\def\c!monthconversion {monthconversion} +\def\c!authorconversion {authorconversion} +\def\c!comment {comment} +\def\c!textalign {textalign} +\def\c!up {up} +\def\c!down {down} +\def\c!instance {instance} +\def\c!database {database} +\def\c!group {group} +\def\c!groupsuffix {groupsuffix} +\def\c!properties {properties} +\def\c!journalconversion {journalconversion} +\def\c!register {register} +\def\c!note {note} +\def\c!field {field} +\def\c!ignore {ignore} +\def\c!specification {specification} + +\def\c!pageleft {pageleft} +\def\c!pageright {pageright} +\def\c!pagesep {pagesep} +\def\c!lastpagesep {lastpagesep} +\def\c!finalpagesep {finalpagesep} +\def\c!pageconnector {pageconnector} + +\def\c!referencemethod {referencemethod} % forward both + +\def\v!dataset {dataset} +\def\v!compressseparator {compressseparator} +\def\v!notation {notation} +\def\v!endnote {endnote} +\def\v!interactive {interactive} +\def\v!autopunctuation {autopunctuation} +\def\v!integral {integral} +\def\v!shiftup {shiftup} +\def\v!shiftdown {shiftdown} +\def\v!construction {construction} +\def\v!unframed {unframed} +\def\v!chemical {chemical} +\def\v!chemicals {chemicals} +\def\v!words {words} +\def\v!combination {combination} +\def\v!norepeat {norepeat} +\def\v!mixed {mixed} +\def\v!centerlast {centerlast} +\def\v!long {long} +\def\v!box {box} + +\def\v!noline {noline} +\def\v!noheight {noheight} +\def\v!nodepth {nodepth} + +\def\v!bookmark {bookmark} + +\def\v!vfenced {vfenced} +\def\v!bothtext {bothtext} + +\def\s!traditional {traditional} + +\def\c!HL {HL} +\def\c!VL {VL} +\def\c!NL {NL} \ifdefined\v!kerncharacters\else \def\v!kerncharacters{kerncharacters} \fi % no time now for translations should be a e! actually \ifdefined\v!letterspacing \else \def\v!letterspacing {letterspacing} \fi % no time now for translations should be a e! actually diff --git a/Master/texmf-dist/tex/context/base/mult-en.mkii b/Master/texmf-dist/tex/context/base/mult-en.mkii index bf72af384c7..b08070ba044 100644 --- a/Master/texmf-dist/tex/context/base/mult-en.mkii +++ b/Master/texmf-dist/tex/context/base/mult-en.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{flushleft} \setinterfacevariable{flushouter}{flushouter} \setinterfacevariable{flushright}{flushright} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{footer} \setinterfacevariable{footnote}{footnote} \setinterfacevariable{force}{force} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{mirrored} \setinterfacevariable{monday}{monday} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monobold} \setinterfacevariable{month}{month} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positive} \setinterfacevariable{postponing}{postponing} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{preference} \setinterfacevariable{preview}{preview} \setinterfacevariable{previous}{previous} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{coupling} \setinterfaceconstant{couplingway}{couplingway} \setinterfaceconstant{criterium}{criterium} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{current} \setinterfaceconstant{cutspace}{cutspace} \setinterfaceconstant{dash}{dash} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{evenmargin} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{expansion} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{indenting} \setinterfaceconstant{indentnext}{indentnext} \setinterfaceconstant{indicator}{indicator} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{inner} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{nright} \setinterfaceconstant{ntop}{ntop} \setinterfaceconstant{number}{number} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{numbercolor} \setinterfaceconstant{numbercommand}{numbercommand} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definetabletemplate} \setinterfacecommand{definetabulate}{definetabulate} \setinterfacecommand{definetext}{definetext} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{definetextposition} \setinterfacecommand{definetextvariable}{definetextvariable} \setinterfacecommand{definetype}{definetype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{paperheight} \setinterfacecommand{paperwidth}{paperwidth} \setinterfacecommand{periods}{periods} -\setinterfacecommand{plaatsruwelijst}{placerawlist} \setinterfacecommand{placebookmarks}{placebookmarks} \setinterfacecommand{placecombinedlist}{placecombinedlist} \setinterfacecommand{placefloat}{placefloat} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{placeheadtext} \setinterfacecommand{placelegend}{placelegend} \setinterfacecommand{placelist}{placelist} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{placelocalfootnotes} \setinterfacecommand{placelogos}{placelogos} \setinterfacecommand{placeongrid}{placeongrid} \setinterfacecommand{placeontopofeachother}{placeontopofeachother} \setinterfacecommand{placepagenumber}{placepagenumber} +\setinterfacecommand{placerawlist}{placerawlist} \setinterfacecommand{placereferencelist}{placereferencelist} \setinterfacecommand{placeregister}{placeregister} \setinterfacecommand{placerule}{placerule} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{setupregister} \setinterfacecommand{setuprotate}{setuprotate} \setinterfacecommand{setuprule}{setuprule} -\setinterfacecommand{setups}{setups} \setinterfacecommand{setupscreens}{setupscreens} \setinterfacecommand{setupsection}{setupsection} \setinterfacecommand{setupsectionblock}{setupsectionblock} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{setuptables} \setinterfacecommand{setuptabulate}{setuptabulate} \setinterfacecommand{setuptext}{setuptext} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{setuptextposition} \setinterfacecommand{setuptextrules}{setuptextrules} \setinterfacecommand{setuptexttexts}{setuptexttexts} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{startdocument} \setinterfacecommand{startenvironment}{startenvironment} \setinterfacecommand{startfigure}{startfigure} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{startglobal} \setinterfacecommand{startline}{startline} \setinterfacecommand{startlinecorrection}{startlinecorrection} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{starttable} \setinterfacecommand{starttables}{starttables} \setinterfacecommand{starttext}{starttext} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{starttextrule} \setinterfacecommand{startunpacked}{startunpacked} \setinterfacecommand{startversion}{startversion} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{stopcomponent} \setinterfacecommand{stopdocument}{stopdocument} \setinterfacecommand{stopenvironment}{stopenvironment} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{stopglobal} \setinterfacecommand{stopline}{stopline} \setinterfacecommand{stoplinecorrection}{stoplinecorrection} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{stoptable} \setinterfacecommand{stoptables}{stoptables} \setinterfacecommand{stoptext}{stoptext} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{stoptextrule} \setinterfacecommand{stopunpacked}{stopunpacked} \setinterfacecommand{stopversion}{stopversion} diff --git a/Master/texmf-dist/tex/context/base/mult-fr.mkii b/Master/texmf-dist/tex/context/base/mult-fr.mkii index e1129848fec..d76da18d9e0 100644 --- a/Master/texmf-dist/tex/context/base/mult-fr.mkii +++ b/Master/texmf-dist/tex/context/base/mult-fr.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{flushleft} \setinterfacevariable{flushouter}{flushouter} \setinterfacevariable{flushright}{flushright} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{pdp} \setinterfacevariable{footnote}{notepdp} \setinterfacevariable{force}{force} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{reflete} \setinterfacevariable{monday}{lundi} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monogras} \setinterfacevariable{month}{mois} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positif} \setinterfacevariable{postponing}{postponing} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{preference} \setinterfacevariable{preview}{previsualisation} \setinterfacevariable{previous}{precedent} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{septembre} \setinterfacevariable{serif}{serif} \setinterfacevariable{serried}{serried} -\setinterfacevariable{setups}{reglages} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{sheet} \setinterfacevariable{short}{short} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{couplage} \setinterfaceconstant{couplingway}{modecouplage} \setinterfaceconstant{criterium}{critere} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{courant} \setinterfaceconstant{cutspace}{cutspace} \setinterfaceconstant{dash}{pointille} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{margepaire} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{expansion} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{composeenalinea} \setinterfaceconstant{indentnext}{indentesuivant} \setinterfaceconstant{indicator}{indicateur} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{interieur} \setinterfaceconstant{innermargin}{margeinterieure} \setinterfaceconstant{inputfile}{fichierentree} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{ndroite} \setinterfaceconstant{ntop}{nsup} \setinterfaceconstant{number}{numero} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{couleurnumero} \setinterfaceconstant{numbercommand}{commandenumero} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1002,7 +1007,7 @@ \setinterfaceconstant{separatorcolor}{separatorcolor} \setinterfaceconstant{separatorstyle}{separatorstyle} \setinterfaceconstant{set}{set} -\setinterfaceconstant{setups}{reglages} +\setinterfaceconstant{setups}{setups} \setinterfaceconstant{shrink}{shrink} \setinterfaceconstant{side}{cote} \setinterfaceconstant{sidealign}{sidealign} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definittrametableau} \setinterfacecommand{definetabulate}{definittabulation} \setinterfacecommand{definetext}{definittexte} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{definitpositiontexte} \setinterfacecommand{definetextvariable}{definitvariabletexte} \setinterfacecommand{definetype}{definittype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{hauteurpapier} \setinterfacecommand{paperwidth}{largeurpapier} \setinterfacecommand{periods}{periodes} -\setinterfacecommand{plaatsruwelijst}{placerawlist} \setinterfacecommand{placebookmarks}{placemarquespages} \setinterfacecommand{placecombinedlist}{placelisteinmbriquee} \setinterfacecommand{placefloat}{placeflottant} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{placetextetete} \setinterfacecommand{placelegend}{placelegende} \setinterfacecommand{placelist}{placeliste} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{placenotespdplocales} \setinterfacecommand{placelogos}{placelogos} \setinterfacecommand{placeongrid}{placesurgrille} \setinterfacecommand{placeontopofeachother}{placelesunsaudessusdesautres} \setinterfacecommand{placepagenumber}{placenumeropage} +\setinterfacecommand{placerawlist}{placerawlist} \setinterfacecommand{placereferencelist}{placelistereference} \setinterfacecommand{placeregister}{placeregistre} \setinterfacecommand{placerule}{placeregle} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{regleregistre} \setinterfacecommand{setuprotate}{regleoriente} \setinterfacecommand{setuprule}{regleregle} -\setinterfacecommand{setups}{reglages} \setinterfacecommand{setupscreens}{regleecrans} \setinterfacecommand{setupsection}{reglesection} \setinterfacecommand{setupsectionblock}{regleblocsection} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{regletableaux} \setinterfacecommand{setuptabulate}{regletabulation} \setinterfacecommand{setuptext}{regletexte} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{reglepositiontexte} \setinterfacecommand{setuptextrules}{reglelignesreglestexte} \setinterfacecommand{setuptexttexts}{regletextestexte} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{demarredocument} \setinterfacecommand{startenvironment}{demarreenvironement} \setinterfacecommand{startfigure}{demarrefigure} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{demarreglobal} \setinterfacecommand{startline}{demarreligne} \setinterfacecommand{startlinecorrection}{demarrecorrectionligne} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{demarretableau} \setinterfacecommand{starttables}{demarretableaux} \setinterfacecommand{starttext}{demarretexte} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{demarreligneregleetexte} \setinterfacecommand{startunpacked}{demarredegroupe} \setinterfacecommand{startversion}{demarreversion} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{stoppecomposant} \setinterfacecommand{stopdocument}{stoppedocument} \setinterfacecommand{stopenvironment}{stoppeenvironement} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{stoppeglobal} \setinterfacecommand{stopline}{stoppeligne} \setinterfacecommand{stoplinecorrection}{stoppecorrectionligne} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{stoppetableau} \setinterfacecommand{stoptables}{stoppetableaux} \setinterfacecommand{stoptext}{stoppetexte} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{stoppeligneregleetexte} \setinterfacecommand{stopunpacked}{stoppedegroupe} \setinterfacecommand{stopversion}{stoppeversion} diff --git a/Master/texmf-dist/tex/context/base/mult-fun.lua b/Master/texmf-dist/tex/context/base/mult-fun.lua index 846a50ddf3d..27aa3205510 100644 --- a/Master/texmf-dist/tex/context/base/mult-fun.lua +++ b/Master/texmf-dist/tex/context/base/mult-fun.lua @@ -4,20 +4,23 @@ return { "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", - "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", - "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", - "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", --- "originlength", "tickstep ", "ticklength", --- "autoarrows", "ahfactor", --- "angleoffset", anglelength", anglemethod", + "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", + "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", + "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", + "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", + -- "originlength", "tickstep ", "ticklength", + -- "autoarrows", "ahfactor", + -- "angleoffset", anglelength", anglemethod", "metapostversion", "maxdimensions", }, commands = { + "transparency", -- "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", + "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", -- "halfcircle", "quartercircle", @@ -37,24 +40,32 @@ return { "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", - "withshade", "withlinearshading", "withcircularshading", "withfromshadecolor", "withtoshadecolor", "withshading", "shadedinto", - "withcircularshade", "withlinearshade", + "withshade", "withcircularshade", "withlinearshade", -- old but kept + "defineshade", "shaded", + -- "withshading", "withlinearshading", "withcircularshading", "withfromshadecolor", "withtoshadecolor", + "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", - "graphictext", "loadfigure", "externalfigure", "withmask", "figure", "register", "bitmapimage", + "graphictext", "loadfigure", "externalfigure", "figure", "register", + "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", - "textext", "thetextext", "rawtextext", "textextoffset", "verbatim", "thelabel", "label", "autoalign", + "textext", "thetextext", "rawtextext", "textextoffset", + "verbatim", + "thelabel", "label", + "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", - "infont", -- redefined usign textext - -- "property", "withproperties", "properties", -- not yet - "set_linear_vector", "linear_shade", "define_linear_shade", "define_circular_linear_shade", "define_sampled_linear_shade", - "set_circular_vector", "circular_shade", "define_circular_shade", "define_circular_linear_shade", "define_sampled_circular_shade", - "space", "CRLF", + "infont", -- redefined using textext + -- "set_linear_vector", "set_circular_vector", + -- "linear_shade", "circular_shade", + -- "define_linear_shade", "define_circular_shade", + -- "define_circular_linear_shade", "define_circular_linear_shade", + -- "define_sampled_linear_shade", "define_sampled_circular_shade", + "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "readfile", @@ -64,10 +75,12 @@ return { "break", "xstretched", "ystretched", "snapped", -- - "pathconnectors", "function", "constructedpath", "constructedpairs", - "punkedfunction", "curvedfunction", "tightfunction", - "punkedpath", "curvedpath", "tightpath", - "punkedpairs", "curvedpairs", "tightpairs", + "pathconnectors", "function", + "constructedfunction", "constructedpath", "constructedpairs", + -- "punkedfunction", "punkedpath", "punkedpairs", + "straightfunction", "straightpath", "straightpairs", + "curvedfunction", "curvedpath", "curvedpairs", + -- "tightfunction", "tightpath", "tightpairs", -- "evenly", "oddly", -- @@ -76,26 +89,31 @@ return { "pushcurrentpicture", "popcurrentpicture", -- "arrowpath", --- "colorlike", "dowithpath", "rangepath", "straightpath", "addbackground", --- "cleanstring", "asciistring", "setunstringed", "getunstringed", "unstringed", --- "showgrid", --- "phantom", --- "xshifted", "yshifted", --- "drawarrowpath", "midarrowhead", "arrowheadonpath", --- "drawxticks", "drawyticks", "drawticks", --- "pointarrow", --- "thefreelabel", "freelabel", "freedotlabel", --- "anglebetween", "colorcircle", --- "remapcolors", "normalcolors", "resetcolormap", "remapcolor", "remappedcolor", --- "recolor", "refill", "redraw", "retext", "untext", "restroke", "reprocess", "repathed", + -- "colorlike", "dowithpath", "rangepath", "straightpath", "addbackground", + -- "cleanstring", "asciistring", "setunstringed", "getunstringed", "unstringed", + -- "showgrid", + -- "phantom", + -- "xshifted", "yshifted", + -- "drawarrowpath", "midarrowhead", "arrowheadonpath", + -- "drawxticks", "drawyticks", "drawticks", + -- "pointarrow", + -- "thefreelabel", "freelabel", "freedotlabel", + -- "anglebetween", "colorcircle", + -- "remapcolors", "normalcolors", "resetcolormap", "remapcolor", "remappedcolor", + -- "recolor", "refill", "redraw", "retext", "untext", "restroke", "reprocess", "repathed", "tensecircle", "roundedsquare", - "colortype", "whitecolor", "blackcolor", + "colortype", "whitecolor", "blackcolor", "basiccolors", -- --- "swappointlabels", + -- "swappointlabels", "normalfill", "normaldraw", "visualizepaths", "naturalizepaths", - "drawboundary", "drawwholepath", "visualizeddraw", "visualizedfill", "draworigin", "drawboundingbox", - "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", - "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", + "drawboundary", "drawwholepath", + "visualizeddraw", "visualizedfill", + "draworigin", "drawboundingbox", + "drawpath", + "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", + "drawpointlabels", + "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", + "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", -- "undashed", -- @@ -103,5 +121,8 @@ return { -- "passvariable", "passarrayvariable", "tostring", "format", "formatted", "startpassingvariable", "stoppassingvariable", + -- + "eofill", "eoclip", + "area", }, } diff --git a/Master/texmf-dist/tex/context/base/mult-ini.lua b/Master/texmf-dist/tex/context/base/mult-ini.lua index 62e983abca7..bd3b1d38b37 100644 --- a/Master/texmf-dist/tex/context/base/mult-ini.lua +++ b/Master/texmf-dist/tex/context/base/mult-ini.lua @@ -12,6 +12,7 @@ local serialize = table.serialize local context = context local commands = commands +local implement = interfaces.implement local allocate = utilities.storage.allocate local mark = utilities.storage.mark @@ -240,9 +241,17 @@ function interfaces.setuserinterface(interface,response) end report_interface("definitions: %a constants, %a variables, %a elements, %a commands, %a formats, %a translations", nofconstants,nofvariables,nofelements,nofcommands,nofformats,noftranslations) + else + report_interface("the language(s) can only be set when making the format") end end +interfaces.implement { + name = "setuserinterface", + actions = interfaces.setuserinterface, + arguments = { "string", "string" } +} + interfaces.cachedsetups = interfaces.cachedsetups or { } interfaces.hashedsetups = interfaces.hashedsetups or { } @@ -282,34 +291,43 @@ end -- interface -function commands.writestatus(category,message,...) - local r = reporters[category] - if r then - r(message,...) - end +function interfaces.writestatus(category,message) + reporters[category](message) -- could also be a setmetatablecall end -commands.registernamespace = interfaces.registernamespace -commands.setinterfaceconstant = interfaces.setconstant -commands.setinterfacevariable = interfaces.setvariable -commands.setinterfaceelement = interfaces.setelement -commands.setinterfacemessage = interfaces.setmessage -commands.setinterfacemessages = interfaces.setmessages -commands.showmessage = interfaces.showmessage +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 = "doifelsemessage", + actions = { interfaces.doifelsemessage, commands.doifelse }, + arguments = { "string", "string" }, +} -function commands.doifelsemessage(category,tag) - commands.doifelse(interfaces.doifelsemessage(category,tag)) -end +implement { + name = "getmessage", + actions = { interfaces.getmessage, context }, + arguments = { "string", "string", "string" }, +} -function commands.getmessage(category,tag,default) - context(interfaces.getmessage(category,tag,default)) -end +implement { + name = "writestatus", + overload = true, + actions = interfaces.writestatus, + arguments = { "string", "string" }, +} -function commands.showassignerror(namespace,key,line) +local function showassignerror(namespace,key,line) local ns, instance = match(namespace,"^(%d+)[^%a]+(%a*)") if ns then namespace = corenamespaces[tonumber(ns)] or ns end + -- injected in the stream for timing: if instance and instance ~= "" then context.writestatus("setup",formatters["error in line %a, namespace %a, instance %a, key %a"](line,namespace,instance,key)) else @@ -317,6 +335,12 @@ function commands.showassignerror(namespace,key,line) end end +implement { + name = "showassignerror", + actions = showassignerror, + arguments = { "string", "string", "integer" }, +} + -- a simple helper local settings_to_hash = utilities.parsers.settings_to_hash diff --git a/Master/texmf-dist/tex/context/base/mult-ini.mkiv b/Master/texmf-dist/tex/context/base/mult-ini.mkiv index 09fc5daf0ae..1dd5a696a94 100644 --- a/Master/texmf-dist/tex/context/base/mult-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-ini.mkiv @@ -365,10 +365,10 @@ {\bgroup \ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi \catcode\endoflineasciicode\activecatcode - \doifinsetelse{#1}{\currentresponses,all}\mult_messages_start_yes\mult_messages_start_nop{#2}} + \doifelseinset{#1}{\currentresponses,all}\mult_messages_start_yes\mult_messages_start_nop{#2}} \def\mult_messages_start_yes#1#2\stopmessages - {\ctxcommand{setinterfacemessages("#1",\!!bs#2\!!es)}% + {\clf_setinterfacemessages{#1}{#2}% \egroup} \def\mult_messages_start_nop#1#2\stopmessages @@ -378,13 +378,15 @@ \unexpanded\def\setinterfacemessage#1#2#3% {\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi - \ctxcommand{setinterfacemessage("#1","#2",\!!bs#3\!!es)}} + \clf_setinterfacemessage{#1}{#2}{#3}} -\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\ctxcommand{getmessage("#1","#2")}}} -\unexpanded\def\getmessage #1#2{\ctxcommand{getmessage("#1","#2")}} -\unexpanded\def\doifelsemessage #1#2{\ctxcommand{doifelsemessage("#1","#2")}} -\unexpanded\def\showmessage #1#2#3{\ctxcommand{showmessage("#1","#2",\!!bs#3\!!es)}} -\unexpanded\def\writestatus #1#2{\ctxcommand{writestatus("#1",\!!bs#2\!!es)}} +\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\clf_getmessage{#1}{#2}}} +\unexpanded\def\getmessage #1#2{\clf_getmessage{#1}{#2}} +\unexpanded\def\doifelsemessage #1#2{\clf_doifelsemessage{#1}{#2}} +\unexpanded\def\showmessage #1#2#3{\clf_showmessage{#1}{#2}{#3}} +\unexpanded\def\writestatus #1#2{\clf_writestatus{#1}{#2}} + +\let\doifmessageelse\doifelsemessage %D \macros %D {ifshowwarnings, ifshowmessages} @@ -730,11 +732,11 @@ % temporary mkiv hack (we can best just store the whole table in memory) \unexpanded\def\setinterfaceconstant#1#2% - {\ctxcommand{setinterfaceconstant("#1","#2")}% + {\clf_setinterfaceconstant{#1}{#2}% \expandafter\def\csname\c!prefix!#1\endcsname{#1}} \unexpanded\def\setinterfacevariable#1#2% - {\ctxcommand{setinterfacevariable("#1","#2")}% + {\clf_setinterfacevariable{#1}{#2}% \expandafter\def\csname\v!prefix!#1\endcsname{#2}} %D \macros @@ -763,7 +765,7 @@ %D part is needed, we use a \type{-}: \unexpanded\def\setinterfaceelement#1#2% - {\ctxcommand{setinterfaceelement("#1","#2")}% + {\clf_setinterfaceelement{#1}{#2}% \ifcsname\e!prefix!#1\endcsname \doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}% \else diff --git a/Master/texmf-dist/tex/context/base/mult-it.mkii b/Master/texmf-dist/tex/context/base/mult-it.mkii index 5646a212e21..6474d93c4c3 100644 --- a/Master/texmf-dist/tex/context/base/mult-it.mkii +++ b/Master/texmf-dist/tex/context/base/mult-it.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{flushleft} \setinterfacevariable{flushouter}{flushouter} \setinterfacevariable{flushright}{flushright} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{piedipagina} \setinterfacevariable{footnote}{notapdp} \setinterfacevariable{force}{forza} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{riflesso} \setinterfacevariable{monday}{lunedi} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monograssetto} \setinterfacevariable{month}{mese} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positivo} \setinterfacevariable{postponing}{posporre} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{preferenza} \setinterfacevariable{preview}{anteprima} \setinterfacevariable{previous}{precedente} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{settembre} \setinterfacevariable{serif}{serif} \setinterfacevariable{serried}{vicino} -\setinterfacevariable{setups}{nastaveni} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{sheet} \setinterfacevariable{short}{short} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{accoppiamento} \setinterfaceconstant{couplingway}{modoaccoppiamento} \setinterfaceconstant{criterium}{criterio} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{corrente} \setinterfaceconstant{cutspace}{cutspace} \setinterfaceconstant{dash}{dash} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{marginepari} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{espansione} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{rientro} \setinterfaceconstant{indentnext}{rientrasuccessivo} \setinterfaceconstant{indicator}{indicatore} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{interno} \setinterfaceconstant{innermargin}{margineinterno} \setinterfaceconstant{inputfile}{inputfile} @@ -834,7 +838,7 @@ \setinterfaceconstant{middletext}{testocentro} \setinterfaceconstant{midsentence}{midsentence} \setinterfaceconstant{min}{min} -\setinterfaceconstant{mindepth}{mindeoth} +\setinterfaceconstant{mindepth}{mindepth} \setinterfaceconstant{minheight}{altezzamin} \setinterfaceconstant{minwidth}{ampiezzamin} \setinterfaceconstant{moffset}{moffset} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{ndestra} \setinterfaceconstant{ntop}{ncima} \setinterfaceconstant{number}{numero} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{colorenumero} \setinterfaceconstant{numbercommand}{comandonumero} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definiscimodellotabella} \setinterfacecommand{definetabulate}{definiscitabulato} \setinterfacecommand{definetext}{definiscitesto} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{definisciposizionetesto} \setinterfacecommand{definetextvariable}{definiscivariabiletesto} \setinterfacecommand{definetype}{definiscitype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{altezzacarta} \setinterfacecommand{paperwidth}{ampiezzacarta} \setinterfacecommand{periods}{punti} -\setinterfacecommand{plaatsruwelijst}{placerawlist} \setinterfacecommand{placebookmarks}{mettisegnalibro} \setinterfacecommand{placecombinedlist}{mettielencocombinato} \setinterfacecommand{placefloat}{placefloat} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{posizionatestotesta} \setinterfacecommand{placelegend}{mettilegenda} \setinterfacecommand{placelist}{mettielenco} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{mettinotepdplocali} \setinterfacecommand{placelogos}{mettiloghi} \setinterfacecommand{placeongrid}{mettiingriglia} \setinterfacecommand{placeontopofeachother}{mettiunosullaltro} \setinterfacecommand{placepagenumber}{mettinumeropagina} +\setinterfacecommand{placerawlist}{placerawlist} \setinterfacecommand{placereferencelist}{placereferencelist} \setinterfacecommand{placeregister}{mettiregistro} \setinterfacecommand{placerule}{mettilinea} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{impostaregistro} \setinterfacecommand{setuprotate}{impostarotazione} \setinterfacecommand{setuprule}{impostalinea} -\setinterfacecommand{setups}{impostazioni} \setinterfacecommand{setupscreens}{impostaschermi} \setinterfacecommand{setupsection}{impostasezione} \setinterfacecommand{setupsectionblock}{impostabloccosezione} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{impostatabelle} \setinterfacecommand{setuptabulate}{impostatabulato} \setinterfacecommand{setuptext}{impostatesto} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{impostaposizionetesto} \setinterfacecommand{setuptextrules}{impostalineetesto} \setinterfacecommand{setuptexttexts}{impostatestotesti} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{iniziadocumento} \setinterfacecommand{startenvironment}{iniziaambiente} \setinterfacecommand{startfigure}{iniziafigura} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{iniziaglobale} \setinterfacecommand{startline}{iniziariga} \setinterfacecommand{startlinecorrection}{iniziacorrezioneriga} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{iniziatabella} \setinterfacecommand{starttables}{iniziatabelle} \setinterfacecommand{starttext}{iniziatesto} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{inizialineatesto} \setinterfacecommand{startunpacked}{iniziaunpacked} \setinterfacecommand{startversion}{iniziaversione} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{terminacomponente} \setinterfacecommand{stopdocument}{terminadocumento} \setinterfacecommand{stopenvironment}{terminaambiente} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{terminaglobale} \setinterfacecommand{stopline}{terminariga} \setinterfacecommand{stoplinecorrection}{terminacorrezioneriga} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{terminatabella} \setinterfacecommand{stoptables}{terminatabelle} \setinterfacecommand{stoptext}{terminatesto} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{terminalineatesto} \setinterfacecommand{stopunpacked}{terminaunpacked} \setinterfacecommand{stopversion}{terminaversioni} diff --git a/Master/texmf-dist/tex/context/base/mult-low.lua b/Master/texmf-dist/tex/context/base/mult-low.lua index dda4e5aadb4..1ad0f9ebbda 100644 --- a/Master/texmf-dist/tex/context/base/mult-low.lua +++ b/Master/texmf-dist/tex/context/base/mult-low.lua @@ -13,7 +13,7 @@ return { -- "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", - "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", + "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", @@ -31,7 +31,9 @@ return { -- "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", - "etexversion", "pdftexversion", "xetexversion", "xetexrevision", + -- "etexversion", + -- "pdftexversion", "pdftexrevision", + -- "xetexversion", "xetexrevision", -- "activecatcode", -- @@ -60,7 +62,7 @@ return { "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", - "primeasciicode", + "primeasciicode", "hyphenasciicode", -- "activemathcharcode", -- @@ -85,13 +87,15 @@ return { "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", + "muquad", -- -- maybe a different class -- "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", - "doifmode", "doifmodeelse", "doifnotmode", + "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset","stopmodeset", - "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifallmodeselse", "doifnotallmodes", + "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", + "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", @@ -103,7 +107,7 @@ return { "startTEXpage", "stopTEXpage", -- "startMPpage", "stopMPpage", -- already catched by nested lexer -- - "enablemode", "disablemode", "preventmode", + "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", -- @@ -121,12 +125,12 @@ return { -- "lefttorightmark", "righttoleftmark", -- - "breakablethinspace", "nobreakspace", "narrownobreakspace", "zerowidthnobreakspace", + "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", - "optionalspace", + "optionalspace", "asciispacechar", }, ["helpers"] = { -- @@ -140,9 +144,10 @@ return { "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", + "texdefinition", -- - "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", - "doifelsecommandhandler","doifnotcommandhandler","doifcommandhandler", + "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", + "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", -- "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", @@ -154,7 +159,7 @@ return { "then", "begcsname", -- - "strippedcsname", + "strippedcsname","checkedstrippedcsname", -- "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", @@ -169,6 +174,8 @@ return { -- "donetrue", "donefalse", -- + "inlineordisplaymath","indisplaymath","forcedisplaymath","startforceddisplaymath","stopforceddisplaymath","reqno", + -- "htdp", "unvoidbox", "hfilll", "vfilll", @@ -200,7 +207,7 @@ return { -- "normalbaselineskip", "normallineskip", "normallineskiplimit", -- - "availablehsize", "localhsize", "setlocalhsize", + "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", -- "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", -- @@ -222,25 +229,36 @@ return { "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", -- "doif", "doifnot", "doifelse", - "doifinset", "doifnotinset", "doifinsetelse", - "doifnextcharelse", "doifnextoptionalelse", "doifnextoptionalcselse", "doiffastoptionalcheckelse", - "doifnextbgroupelse", "doifnextbgroupcselse", - "doifnextparenthesiselse", - "doifundefinedelse", "doifdefinedelse", "doifundefined", "doifdefined", + "doifinset", "doifnotinset", + "doifelseinset", "doifinsetelse", + "doifelsenextchar", "doifnextcharelse", + "doifelsenextoptional", "doifnextoptionalelse", + "doifelsenextoptionalcs", "doifnextoptionalcselse", + "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", + "doifelsenextbgroup", "doifnextbgroupelse", + "doifelsenextbgroupcs", "doifnextbgroupcselse", + "doifelsenextparenthesis", "doifnextparenthesiselse", + "doifelseundefined", "doifundefinedelse", + "doifelsedefined", "doifdefinedelse", + "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", - "doifnothing", "doifsomething", "doifelsenothing", "doifsomethingelse", - "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", - "doifdimensionelse", "doifnumberelse", "doifnumber", "doifnotnumber", - "doifcommonelse", "doifcommon", "doifnotcommon", - "doifinstring", "doifnotinstring", "doifinstringelse", - "doifassignmentelse", "docheckassignment", + "doifnothing", "doifsomething", + "doifelsenothing", "doifnothingelse", + "doifelsesomething", "doifsomethingelse", + "doifvaluenothing", "doifvaluesomething", + "doifelsevaluenothing", "doifvaluenothingelse", + "doifelsedimension", "doifdimensionelse", + "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", + "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", + "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", + "doifelseassignment", "doifassignmentelse", "docheckassignment", -- "tracingall", "tracingnone", "loggingall", -- "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", -- - "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", - "obeyspaces", "obeylines", "obeyedspace", "obeyedline", + "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "nbsp", + "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", -- "executeifdefined", @@ -279,6 +297,8 @@ return { "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", -- "firstofoneunexpanded", + "firstoftwounexpanded", "secondoftwounexpanded", + "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", -- "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", @@ -300,7 +320,7 @@ return { -- "modulonumber", "dividenumber", -- - "getfirstcharacter", "doiffirstcharelse", + "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", -- "startnointerference", "stopnointerference", -- @@ -310,7 +330,7 @@ return { -- "offinterlineskip", "oninterlineskip", "nointerlineskip", -- - "strut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", + "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", -- "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", @@ -344,13 +364,17 @@ return { "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", + "pushmathstyle", "popmathstyle", -- "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", -- - "luaexpr", "expdoifelse", "expdoif", "expdoifnot", "expdoifcommonelse", "expdoifinsetelse", + "luaexpr", + "expelsedoif", "expdoif", "expdoifnot", + "expdoifelsecommon", "expdoifcommonelse", + "expdoifelseinset", "expdoifinsetelse", -- "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", @@ -362,7 +386,7 @@ return { "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction","stopctxfunction","ctxfunction", - "startctxfunctiondefinition","stopctxfunctiondefinition", + "startctxfunctiondefinition","stopctxfunctiondefinition", "installctxfunction", -- "carryoverpar", -- @@ -379,5 +403,6 @@ return { -- "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", -- + "nobreak", "allowbreak", "goodbreak", } } diff --git a/Master/texmf-dist/tex/context/base/mult-mes.lua b/Master/texmf-dist/tex/context/base/mult-mes.lua index 0affb43d6d8..64184f8b0f0 100644 --- a/Master/texmf-dist/tex/context/base/mult-mes.lua +++ b/Master/texmf-dist/tex/context/base/mult-mes.lua @@ -1002,6 +1002,15 @@ return { ["publications:11"] = { en = "unknown command %a", }, + ["publications:12"] = { + en = "missing setup: %s", + }, + ["publications:13"] = { + en = "no field %a for tag %a in dataset %a", + }, + ["publications:14"] = { + en = "unknown rendering alternative %a", + }, ["pushing level: %a"] = { nl = "niveau omhoog: %a", }, diff --git a/Master/texmf-dist/tex/context/base/mult-mps.lua b/Master/texmf-dist/tex/context/base/mult-mps.lua index 717536fbf91..a6bebc26613 100644 --- a/Master/texmf-dist/tex/context/base/mult-mps.lua +++ b/Master/texmf-dist/tex/context/base/mult-mps.lua @@ -3,7 +3,7 @@ return { "btex", "etex", "verbatimtex", }, shortcuts = { - "..", "...", "--", "---", "&", + "..", "...", "--", "---", "&", "\\", }, primitives = { -- to be checked "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", @@ -31,8 +31,10 @@ return { "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", - "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", - "forsuffixes", "downto", "upto", "step", "until", + "withcolor", "withcmykcolor", "withpen", + "dashed", + "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", + "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", @@ -50,29 +52,34 @@ return { "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", -- - "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "greypart", + "redpart", "greenpart", "bluepart", + "cyanpart", "magentapart", "yellowpart", + "blackpart", "prescriptpart", "postscriptpart", - "rgbcolor", "cmykcolor", "greycolor", "graycolor", - "colormodel", "graypart", + "rgbcolor", "cmykcolor", -- "greycolor", "graycolor", + "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", -- "colorpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", - "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", + "minute", "hour", + "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", -- - "runscript", + "runscript", "maketext", }, commands = { + "upto", "downto", "beginfig", "endfig", - "beginglyph", "endglyph", "charscale", + "beginglyph", "endglyph", -- actually a mult-fun one "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "ditto", "EOF", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", - "origin", "pensquare", "quartercircle", "right", + "pensquare", "penrazor", "penspec", + "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", @@ -99,14 +106,13 @@ return { "counterclockwise", "tensepath", "takepower", "direction", "softjoin", -- "magstep", "makelabel", -- "laboff", - "rotatedabout", "flex", "superellipse", "erase", "image", + "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", -- "clear_pen_memory", - "range", "numtok", "thru", + "range", "thru", "z", "laboff", "bye", -- "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", - "graypart", "graycolor", -- "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", -- @@ -116,8 +122,41 @@ return { -- "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", - "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", + "bboxmargin", + "ahlength", "ahangle", + "labeloffset", "dotlabeldiam", + "defaultpen", "defaultscale", + "join_radius", + "charscale", -- actually a mult-fun one -- "pen_lft", "pen_rt", "pen_top", "pen_bot", -- "pen_count_", }, + metafont = { + -- :: =: =:| =:|> |=: |=:> |=:| |=:|> |=:|>> ||: + "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def", + "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists", + "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit", + "currenttransform", "currentwindow", "define_blacker_pixels", + "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", + "define_horizontal_corrected_pixels", "define_pixels", + "define_whole_blacker_pixels", "define_whole_pixels", + "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", + "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar", + "extra_endchar", "extra_setup", "fillin", "font_coding_scheme", + "font_extra_space", "font_identifier", "font_normal_shrink", + "font_normal_space", "font_normal_stretch", "font_quad", "font_size", + "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners", + "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules", + "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox", + "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays", + "notransforms", "numspecial", "o_correction", "openit", "openwindow", + "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness", + "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows", + "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight", + "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround", + "xoffset", "yoffset", + }, + disabled = { + "verbatimtex", "troffmode" + } } diff --git a/Master/texmf-dist/tex/context/base/mult-nl.mkii b/Master/texmf-dist/tex/context/base/mult-nl.mkii index aa376c39a1e..22350dc50c3 100644 --- a/Master/texmf-dist/tex/context/base/mult-nl.mkii +++ b/Master/texmf-dist/tex/context/base/mult-nl.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{lijnlinks} \setinterfacevariable{flushouter}{lijnbuiten} \setinterfacevariable{flushright}{lijnrechts} +\setinterfacevariable{followingpage}{opvolgendepagina} \setinterfacevariable{footer}{voet} \setinterfacevariable{footnote}{voetnoot} \setinterfacevariable{force}{forceer} @@ -287,20 +288,21 @@ \setinterfacevariable{mathematics}{wiskunde} \setinterfacevariable{mathmatrix}{wiskundematrix} \setinterfacevariable{max}{max} -\setinterfacevariable{maxdepth}{maxdepth} -\setinterfacevariable{maxheight}{maxheight} -\setinterfacevariable{maxwidth}{maxwidth} +\setinterfacevariable{maxdepth}{maxdiepte} +\setinterfacevariable{maxheight}{maxhoogte} +\setinterfacevariable{maxwidth}{maxbreedte} \setinterfacevariable{may}{mei} \setinterfacevariable{mediaeval}{mediaeval} \setinterfacevariable{medium}{middel} \setinterfacevariable{middle}{midden} \setinterfacevariable{min}{min} -\setinterfacevariable{mindepth}{mindepth} +\setinterfacevariable{mindepth}{mindiepte} \setinterfacevariable{minheight}{minhoogte} \setinterfacevariable{minwidth}{minbreedte} \setinterfacevariable{mirrored}{gespiegeld} \setinterfacevariable{monday}{maandag} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monovet} \setinterfacevariable{month}{maand} \setinterfacevariable{more}{meer} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positief} \setinterfacevariable{postponing}{uitstellen} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{voorafgaandepagina} \setinterfacevariable{preference}{voorkeur} \setinterfacevariable{preview}{preview} \setinterfacevariable{previous}{vorige} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{september} \setinterfacevariable{serif}{serif} \setinterfacevariable{serried}{aanelkaar} -\setinterfacevariable{setups}{instellingen} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{sheet} \setinterfacevariable{short}{kort} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{koppeling} \setinterfaceconstant{couplingway}{koppelwijze} \setinterfaceconstant{criterium}{criterium} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{huidige} \setinterfaceconstant{cutspace}{snijwit} \setinterfaceconstant{dash}{streep} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{evenmarge} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{expansie} \setinterfaceconstant{export}{exporteer} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{inspringen} \setinterfaceconstant{indentnext}{springvolgendein} \setinterfaceconstant{indicator}{aanduiding} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{binnen} \setinterfaceconstant{innermargin}{binnenmarge} \setinterfaceconstant{inputfile}{inputfile} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{nrechts} \setinterfaceconstant{ntop}{nboven} \setinterfaceconstant{number}{nummer} +\setinterfaceconstant{numberalign}{nummeruitlijnen} \setinterfaceconstant{numbercolor}{nummerkleur} \setinterfaceconstant{numbercommand}{nummercommando} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definieertabelvorm} \setinterfacecommand{definetabulate}{definieertabulatie} \setinterfacecommand{definetext}{definieertekst} +\setinterfacecommand{definetextbackground}{definieertekstachtergrond} \setinterfacecommand{definetextposition}{definieertekstpositie} \setinterfacecommand{definetextvariable}{definieertekstvariabele} \setinterfacecommand{definetype}{definieertype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{papierhoogte} \setinterfacecommand{paperwidth}{papierbreedte} \setinterfacecommand{periods}{punten} -\setinterfacecommand{plaatsruwelijst}{plaatsruwelijst} \setinterfacecommand{placebookmarks}{plaatsbookmarks} \setinterfacecommand{placecombinedlist}{plaatssamengesteldelijst} \setinterfacecommand{placefloat}{plaatsplaatsblok} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{plaatskoptekst} \setinterfacecommand{placelegend}{plaatslegenda} \setinterfacecommand{placelist}{plaatslijst} +\setinterfacecommand{placelistofsynonyms}{plaatslijstmetsynoniemen} \setinterfacecommand{placelocalfootnotes}{plaatslokalevoetnoten} \setinterfacecommand{placelogos}{plaatsbeeldmerken} \setinterfacecommand{placeongrid}{plaatsopgrid} \setinterfacecommand{placeontopofeachother}{plaatsonderelkaar} \setinterfacecommand{placepagenumber}{plaatspaginanummer} +\setinterfacecommand{placerawlist}{plaatsruwelijst} \setinterfacecommand{placereferencelist}{plaatsreferentielijst} \setinterfacecommand{placeregister}{plaatsregister} \setinterfacecommand{placerule}{plaatslijn} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{stelregisterin} \setinterfacecommand{setuprotate}{stelroterenin} \setinterfacecommand{setuprule}{stellijnin} -\setinterfacecommand{setups}{instellingen} \setinterfacecommand{setupscreens}{stelrastersin} \setinterfacecommand{setupsection}{stelsectiein} \setinterfacecommand{setupsectionblock}{stelsectieblokin} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{steltabellenin} \setinterfacecommand{setuptabulate}{steltabulatiein} \setinterfacecommand{setuptext}{steltekstin} +\setinterfacecommand{setuptextbackground}{steltekstachtergrondin} \setinterfacecommand{setuptextposition}{steltekstpositiein} \setinterfacecommand{setuptextrules}{steltekstlijnenin} \setinterfacecommand{setuptexttexts}{stelteksttekstenin} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{startdocument} \setinterfacecommand{startenvironment}{startomgeving} \setinterfacecommand{startfigure}{startfiguur} +\setinterfacecommand{startframed}{startomlijnd} \setinterfacecommand{startglobal}{startglobaal} \setinterfacecommand{startline}{startregel} \setinterfacecommand{startlinecorrection}{startregelcorrectie} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{starttabel} \setinterfacecommand{starttables}{starttabellen} \setinterfacecommand{starttext}{starttekst} +\setinterfacecommand{starttextbackground}{starttekstachtergrond} \setinterfacecommand{starttextrule}{starttekstlijn} \setinterfacecommand{startunpacked}{startvanelkaar} \setinterfacecommand{startversion}{startversie} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{stoponderdeel} \setinterfacecommand{stopdocument}{stopdocument} \setinterfacecommand{stopenvironment}{stopomgeving} +\setinterfacecommand{stopframed}{stopomlijnd} \setinterfacecommand{stopglobal}{stopglobaal} \setinterfacecommand{stopline}{stopregel} \setinterfacecommand{stoplinecorrection}{stopregelcorrectie} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{stoptabel} \setinterfacecommand{stoptables}{stoptabellen} \setinterfacecommand{stoptext}{stoptekst} +\setinterfacecommand{stoptextbackground}{stoptekstachtergrond} \setinterfacecommand{stoptextrule}{stoptekstlijn} \setinterfacecommand{stopunpacked}{stopvanelkaar} \setinterfacecommand{stopversion}{stopversie} diff --git a/Master/texmf-dist/tex/context/base/mult-pe.mkii b/Master/texmf-dist/tex/context/base/mult-pe.mkii index 16871bb6260..32cf32db1c3 100644 --- a/Master/texmf-dist/tex/context/base/mult-pe.mkii +++ b/Master/texmf-dist/tex/context/base/mult-pe.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{پمپ‌چپ} \setinterfacevariable{flushouter}{پمپ‌خارجی} \setinterfacevariable{flushright}{پمپ‌راست} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{ته‌برگ} \setinterfacevariable{footnote}{پانوشت} \setinterfacevariable{force}{اجبار} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{منعکس} \setinterfacevariable{monday}{دوشنبه} \setinterfacevariable{mono}{مونو} +\setinterfacevariable{monobold}{monobold} \setinterfacevariable{month}{ماه} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{شکست‌کلمات‌بیشتر} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{مثبت} \setinterfacevariable{postponing}{تاخیر} \setinterfacevariable{postscript}{پست‌اسکریپت} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{ترجیح} \setinterfacevariable{preview}{پیش‌دید} \setinterfacevariable{previous}{قبلی} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{سپتامبر} \setinterfacevariable{serif}{سریف} \setinterfacevariable{serried}{تنگ‌هم} -\setinterfacevariable{setups}{بارگذاریها} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{ورقه} \setinterfacevariable{short}{short} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{تزویج} \setinterfaceconstant{couplingway}{روش‌تزویج} \setinterfaceconstant{criterium}{criterium} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{جاری} \setinterfaceconstant{cutspace}{فضای‌برش} \setinterfaceconstant{dash}{دش} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{عرض‌یکسان} \setinterfaceconstant{escape}{فرار} \setinterfaceconstant{evenmargin}{حاشیه‌زوج} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{گسترش} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{تورفتگی} \setinterfaceconstant{indentnext}{متن‌تورفته} \setinterfaceconstant{indicator}{اندیکاتور} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{داخلی} \setinterfaceconstant{innermargin}{حاشیه‌داخلی} \setinterfaceconstant{inputfile}{پرونده‌ورودی} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{nright} \setinterfaceconstant{ntop}{ntop} \setinterfaceconstant{number}{شماره} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{رنگ‌شماره} \setinterfaceconstant{numbercommand}{فرمان‌شماره} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1002,7 +1007,7 @@ \setinterfaceconstant{separatorcolor}{separatorcolor} \setinterfaceconstant{separatorstyle}{separatorstyle} \setinterfaceconstant{set}{قراربده} -\setinterfaceconstant{setups}{بارگذاریها} +\setinterfaceconstant{setups}{setups} \setinterfaceconstant{shrink}{shrink} \setinterfaceconstant{side}{کنار} \setinterfaceconstant{sidealign}{تنظیم‌کنار} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{تعریف‌الگوی‌جدول} \setinterfacecommand{definetabulate}{تعریف‌جدول‌بندی} \setinterfacecommand{definetext}{تعریف‌متن} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{تعریف‌مکان‌متن} \setinterfacecommand{definetextvariable}{تعریف‌متغیرمتن} \setinterfacecommand{definetype}{تعریف‌تایپ} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{ارتفاع‌برگ} \setinterfacecommand{paperwidth}{عرض‌برگ} \setinterfacecommand{periods}{نقطه‌ها} -\setinterfacecommand{plaatsruwelijst}{درج‌لیست‌خام} \setinterfacecommand{placebookmarks}{درج‌چوب‌خط} \setinterfacecommand{placecombinedlist}{درج‌لیست‌مختلط} \setinterfacecommand{placefloat}{درج‌شناور} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{درج‌متن‌سر} \setinterfacecommand{placelegend}{درج‌راهنما} \setinterfacecommand{placelist}{درج‌لیست} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{درج‌پانوشتهای‌موضعی} \setinterfacecommand{placelogos}{درج‌آرمها} \setinterfacecommand{placeongrid}{درج‌در‌توری} \setinterfacecommand{placeontopofeachother}{درج‌در‌بالای‌یکدیگر} \setinterfacecommand{placepagenumber}{درج‌شماره‌صفحه} +\setinterfacecommand{placerawlist}{درج‌لیست‌خام} \setinterfacecommand{placereferencelist}{درج‌لیست‌مرجع} \setinterfacecommand{placeregister}{درج‌ثبت} \setinterfacecommand{placerule}{درج‌خط} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{بارگذاری‌ثبت} \setinterfacecommand{setuprotate}{بارگذاری‌دوران} \setinterfacecommand{setuprule}{بارگذاری‌خط} -\setinterfacecommand{setups}{بارگذاریها} \setinterfacecommand{setupscreens}{بارگذاری‌پرده‌ها} \setinterfacecommand{setupsection}{بارگذاری‌بخش} \setinterfacecommand{setupsectionblock}{بارگذاری‌بلوک‌بخش} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{بارگذاری‌جدولها} \setinterfacecommand{setuptabulate}{بارگذاری‌جدول‌بندی} \setinterfacecommand{setuptext}{بارگذاری‌متن} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{بارگذاری‌مکان‌متن} \setinterfacecommand{setuptextrules}{بارگذاری‌خطهای‌متن} \setinterfacecommand{setuptexttexts}{بارگذاری‌متن‌متنها} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{شروع‌نوشتار} \setinterfacecommand{startenvironment}{شروع‌محیط} \setinterfacecommand{startfigure}{شروع‌شکل} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{شروع‌سراسری} \setinterfacecommand{startline}{شروع‌خط} \setinterfacecommand{startlinecorrection}{شروع‌تصحیح‌خط} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{شروع‌جدول} \setinterfacecommand{starttables}{شروع‌جدولها} \setinterfacecommand{starttext}{شروع‌متن} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{شروع‌خط‌متن} \setinterfacecommand{startunpacked}{شروع‌غیر‌فشرده} \setinterfacecommand{startversion}{شروع‌نسخه} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{پایان‌مولفه} \setinterfacecommand{stopdocument}{پایان‌نوشتار} \setinterfacecommand{stopenvironment}{پایان‌محیط} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{پایان‌سراسری} \setinterfacecommand{stopline}{پایان‌خط} \setinterfacecommand{stoplinecorrection}{پایان‌تصحیح‌خط} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{پایان‌جدول} \setinterfacecommand{stoptables}{پایان‌جدولها} \setinterfacecommand{stoptext}{پایان‌متن} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{پایان‌خط‌متن} \setinterfacecommand{stopunpacked}{پایان‌غیرفشرده} \setinterfacecommand{stopversion}{پایان‌نسخه} diff --git a/Master/texmf-dist/tex/context/base/mult-prm.lua b/Master/texmf-dist/tex/context/base/mult-prm.lua index f0b850a5c26..3b4d8435668 100644 --- a/Master/texmf-dist/tex/context/base/mult-prm.lua +++ b/Master/texmf-dist/tex/context/base/mult-prm.lua @@ -232,7 +232,7 @@ return { "latelua", "luaescapestring", "luastartup", - "luatexdatestamp", + "luatexbanner", "luatexrevision", "luatexversion", "luafunction", @@ -253,6 +253,7 @@ return { "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", + "suppressmathparerror", "synctex", }, ["omega"]={ @@ -773,7 +774,7 @@ return { "lpcode", "luaescapestring", "luastartup", - "luatexdatestamp", + "luatexbanner", "luatexrevision", "luatexversion", "mag", diff --git a/Master/texmf-dist/tex/context/base/mult-ro.mkii b/Master/texmf-dist/tex/context/base/mult-ro.mkii index d01822944da..a5d90033f03 100644 --- a/Master/texmf-dist/tex/context/base/mult-ro.mkii +++ b/Master/texmf-dist/tex/context/base/mult-ro.mkii @@ -180,6 +180,7 @@ \setinterfacevariable{flushleft}{flushleft} \setinterfacevariable{flushouter}{flushouter} \setinterfacevariable{flushright}{flushright} +\setinterfacevariable{followingpage}{followingpage} \setinterfacevariable{footer}{subsol} \setinterfacevariable{footnote}{notasubsol} \setinterfacevariable{force}{fortat} @@ -301,6 +302,7 @@ \setinterfacevariable{mirrored}{oglindit} \setinterfacevariable{monday}{luni} \setinterfacevariable{mono}{mono} +\setinterfacevariable{monobold}{monoaldin} \setinterfacevariable{month}{luna} \setinterfacevariable{more}{more} \setinterfacevariable{morehyphenation}{morehyphenation} @@ -360,6 +362,7 @@ \setinterfacevariable{positive}{positiv} \setinterfacevariable{postponing}{postponing} \setinterfacevariable{postscript}{postscript} +\setinterfacevariable{precedingpage}{followingpage} \setinterfacevariable{preference}{preferinta} \setinterfacevariable{preview}{previzualizare} \setinterfacevariable{previous}{precedent} @@ -419,7 +422,7 @@ \setinterfacevariable{september}{septembrie} \setinterfacevariable{serif}{serif} \setinterfacevariable{serried}{serried} -\setinterfacevariable{setups}{setari} +\setinterfacevariable{setups}{setups} \setinterfacevariable{sheet}{sheet} \setinterfacevariable{short}{short} \setinterfacevariable{simplefonts}{simplefonts} @@ -651,7 +654,7 @@ \setinterfaceconstant{coupling}{cuplare} \setinterfaceconstant{couplingway}{modcuplare} \setinterfaceconstant{criterium}{criteriu} -\setinterfaceconstant{css}{css} +\setinterfaceconstant{cssfile}{cssfile} \setinterfaceconstant{current}{curent} \setinterfaceconstant{cutspace}{cutspace} \setinterfaceconstant{dash}{dash} @@ -686,7 +689,7 @@ \setinterfaceconstant{equalwidth}{equalwidth} \setinterfaceconstant{escape}{escape} \setinterfaceconstant{evenmargin}{marginepara} -\setinterfaceconstant{exitoffset}{labeloffset} +\setinterfaceconstant{exitoffset}{exitoffset} \setinterfaceconstant{expansion}{expansiune} \setinterfaceconstant{export}{export} \setinterfaceconstant{extras}{extras} @@ -753,6 +756,7 @@ \setinterfaceconstant{indenting}{aliniat} \setinterfaceconstant{indentnext}{aliniaturmator} \setinterfaceconstant{indicator}{indicator} +\setinterfaceconstant{initialsep}{initialsep} \setinterfaceconstant{inner}{intern} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -858,6 +862,7 @@ \setinterfaceconstant{nright}{ndreapta} \setinterfaceconstant{ntop}{nsus} \setinterfaceconstant{number}{numar} +\setinterfaceconstant{numberalign}{numberalign} \setinterfaceconstant{numbercolor}{culoarenumar} \setinterfaceconstant{numbercommand}{comandanumar} \setinterfaceconstant{numberconversion}{numberconversion} @@ -1281,6 +1286,7 @@ \setinterfacecommand{definetabletemplate}{definestesablontabel} \setinterfacecommand{definetabulate}{definestetabulatori} \setinterfacecommand{definetext}{definestetext} +\setinterfacecommand{definetextbackground}{definetextbackground} \setinterfacecommand{definetextposition}{definestepozitietext} \setinterfacecommand{definetextvariable}{definestevariabilatext} \setinterfacecommand{definetype}{definetype} @@ -1441,7 +1447,6 @@ \setinterfacecommand{paperheight}{inaltimehartie} \setinterfacecommand{paperwidth}{latimehartie} \setinterfacecommand{periods}{puncte} -\setinterfacecommand{plaatsruwelijst}{placerawlist} \setinterfacecommand{placebookmarks}{plaseazasemnecarte} \setinterfacecommand{placecombinedlist}{punelistacombinata} \setinterfacecommand{placefloat}{placefloat} @@ -1451,11 +1456,13 @@ \setinterfacecommand{placeheadtext}{placeheadtext} \setinterfacecommand{placelegend}{punelegenda} \setinterfacecommand{placelist}{punelista} +\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms} \setinterfacecommand{placelocalfootnotes}{punenotesubsollocale} \setinterfacecommand{placelogos}{punelogouri} \setinterfacecommand{placeongrid}{plaseazapegrid} \setinterfacecommand{placeontopofeachother}{punedeasuprafiecareia} \setinterfacecommand{placepagenumber}{punenumarpagina} +\setinterfacecommand{placerawlist}{placerawlist} \setinterfacecommand{placereferencelist}{placereferencelist} \setinterfacecommand{placeregister}{puneregistru} \setinterfacecommand{placerule}{punerigla} @@ -1602,7 +1609,6 @@ \setinterfacecommand{setupregister}{seteazaregistru} \setinterfacecommand{setuprotate}{seteazarotare} \setinterfacecommand{setuprule}{seteazarigla} -\setinterfacecommand{setups}{setari} \setinterfacecommand{setupscreens}{seteazaecrane} \setinterfacecommand{setupsection}{seteazasectiune} \setinterfacecommand{setupsectionblock}{seteazablocsectiune} @@ -1620,6 +1626,7 @@ \setinterfacecommand{setuptables}{seteazatabele} \setinterfacecommand{setuptabulate}{seteazatabulatori} \setinterfacecommand{setuptext}{seteazatext} +\setinterfacecommand{setuptextbackground}{setuptextbackground} \setinterfacecommand{setuptextposition}{seteazapozitietext} \setinterfacecommand{setuptextrules}{seteazarigletext} \setinterfacecommand{setuptexttexts}{seteazatextetext} @@ -1666,6 +1673,7 @@ \setinterfacecommand{startdocument}{startdocument} \setinterfacecommand{startenvironment}{startmediu} \setinterfacecommand{startfigure}{startfigura} +\setinterfacecommand{startframed}{startframed} \setinterfacecommand{startglobal}{startglobal} \setinterfacecommand{startline}{startlinie} \setinterfacecommand{startlinecorrection}{startcorectielinie} @@ -1692,6 +1700,7 @@ \setinterfacecommand{starttable}{starttabel} \setinterfacecommand{starttables}{starttabele} \setinterfacecommand{starttext}{starttext} +\setinterfacecommand{starttextbackground}{starttextbackground} \setinterfacecommand{starttextrule}{startriglatext} \setinterfacecommand{startunpacked}{startneimpachetat} \setinterfacecommand{startversion}{startversiune} @@ -1706,6 +1715,7 @@ \setinterfacecommand{stopcomponent}{stopcomponenta} \setinterfacecommand{stopdocument}{stopdocument} \setinterfacecommand{stopenvironment}{stopmediu} +\setinterfacecommand{stopframed}{stopframed} \setinterfacecommand{stopglobal}{stopblobal} \setinterfacecommand{stopline}{stoplinie} \setinterfacecommand{stoplinecorrection}{stopcorectielinie} @@ -1731,6 +1741,7 @@ \setinterfacecommand{stoptable}{stoptabel} \setinterfacecommand{stoptables}{stoptabele} \setinterfacecommand{stoptext}{stoptext} +\setinterfacecommand{stoptextbackground}{stoptextbackground} \setinterfacecommand{stoptextrule}{stopriglatext} \setinterfacecommand{stopunpacked}{stopneimpachetat} \setinterfacecommand{stopversion}{stopversiune} diff --git a/Master/texmf-dist/tex/context/base/mult-sys.mkiv b/Master/texmf-dist/tex/context/base/mult-sys.mkiv index 8c1bff2bc40..63a89492a7f 100644 --- a/Master/texmf-dist/tex/context/base/mult-sys.mkiv +++ b/Master/texmf-dist/tex/context/base/mult-sys.mkiv @@ -124,7 +124,7 @@ \definesystemconstant {SansSlanted} \definesystemconstant {SansBoldSlanted} \definesystemconstant {SansCaps} -% \definesystemconstant {SansCapsSlanted} +%definesystemconstant {SansCapsSlanted} \definesystemconstant {Mono} \definesystemconstant {MonoBold} @@ -133,8 +133,8 @@ \definesystemconstant {MonoSlanted} \definesystemconstant {MonoBoldSlanted} \definesystemconstant {MonoCaps} -% \definesystemconstant {MonoCapsSlanted} -% \definesystemconstant {MonoVariable} +%definesystemconstant {MonoCapsSlanted} +%definesystemconstant {MonoVariable} \definesystemconstant {DefaultFont} @@ -261,6 +261,19 @@ \definesystemconstant {single} \definesystemconstant {multi} \definesystemconstant {indeed} +\definesystemconstant {internal} +\definesystemconstant {current} +\definesystemconstant {chain} + +% translating setups is asking for a mess so we keep them as-is: + +\definesystemconstant {setups} + +\definesystemconstant {cite} +\definesystemconstant {nocite} +\definesystemconstant {list} +\definesystemconstant {register} +\definesystemconstant {author} % \def\s!parent{->} % 1% faster / => does not work in assignments % \def\s!child {<-} % 1% faster / <= does not work in assignments @@ -279,12 +292,16 @@ \definesystemconstant {bold} \definesystemconstant {italic} \definesystemconstant {slanted} - -\definesystemconstant {default} \definesystemconstant {smallcaps} +\definesystemconstant {lcgreek} +\definesystemconstant {ucgreek} +\definesystemconstant {sygreek} +\definesystemconstant {italics} \definesystemconstant {run} +\definesystemconstant {default} + \definesystemconstant {mode} \definesystemconstant {setup} \definesystemconstant {environment} @@ -298,11 +315,22 @@ \definesystemconstant {uncramped} \definesystemconstant {cramped} +\definesystemconstant {hyphenmin} \definesystemconstant {lefthyphenmin} \definesystemconstant {righthyphenmin} \definesystemconstant {lefthyphenchar} \definesystemconstant {righthyphenchar} +\definesystemconstant {head} +\definesystemconstant {symbol} +\definesystemconstant {sub} +\definesystemconstant {margin} +\definesystemconstant {edge} + +\definesystemconstant {double} +\definesystemconstant {decimal} +\definesystemconstant {binary} + %definesystemconstant {skewchar} %definesystemconstant {hyphenchar} \definesystemconstant {catcodes} @@ -322,6 +350,12 @@ \definesystemconstant {designsize} %definesystemconstant {background} %definesystemconstant {ucmap} +\definesystemconstant {level} +\definesystemconstant {integral} +\definesystemconstant {insert} % maybe insertclass +\definesystemconstant {marker} + +\definesystemconstant {mixedcolumn} %definesystemconstant {property} %definesystemconstant {overprint} @@ -382,8 +416,13 @@ \definesystemconstant {size} \definesystemconstant {depth} +\definesystemconstant {height} +\definesystemconstant {noheight} \definesystemconstant {nodepth} +\definesystemconstant {rel} +\definesystemconstant {ord} + %D Just to be complete we define the standard \TEX\ units. \definesystemconstant {cm} @@ -538,6 +577,13 @@ \defineinterfacevariable {c} {c} \defineinterfacevariable {d} {d} +%D For tagging: + +\definesystemconstant {subtype} +\definesystemconstant {top} +\definesystemconstant {bottom} +\definesystemconstant {both} + %D Special purpose variables: \def\v!oddeven#1{\ifodd#1\v!odd\else\v!even\fi} diff --git a/Master/texmf-dist/tex/context/base/node-aux.lua b/Master/texmf-dist/tex/context/base/node-aux.lua index 49911625822..12da8ea8ab3 100644 --- a/Master/texmf-dist/tex/context/base/node-aux.lua +++ b/Master/texmf-dist/tex/context/base/node-aux.lua @@ -314,13 +314,17 @@ nuts .firstcharinbox = firstcharinbox nodes.firstcharinbox = firstcharinbox nodes.firstcharacter = vianuts(firstcharacter) -function commands.buildtextaccent(n) - local char = firstcharinbox(n) - if char > 0 then - -- context.accent(false,char) - context([[\accent%s\relax]],char) +interfaces.implement { + name = "buildtextaccent", + arguments = "integer", + actions = function(n) -- Is this crap really used? Or was it an experiment? + local char = firstcharinbox(n) + if char > 0 then + -- context.accent(false,char) + context([[\accent%s\relax]],char) + end end -end +} -- this depends on fonts, so we have a funny dependency ... will be -- sorted out .. we could make tonodes a plugin into this @@ -352,7 +356,8 @@ local function tonodes(str,fnt,attr) -- (str,template_glyph) -- moved from blob- n = new_glyph(fnt,s) end if attr then -- normally false when template - setfield(n,"attr",copy_node_list(attr)) + -- setfield(n,"attr",copy_node_list(attr)) + setfield(n,"attr",attr) end if head then insert_node_after(head,tail,n) diff --git a/Master/texmf-dist/tex/context/base/node-bck.lua b/Master/texmf-dist/tex/context/base/node-bck.lua index 4b7b4a0643d..99992de0903 100644 --- a/Master/texmf-dist/tex/context/base/node-bck.lua +++ b/Master/texmf-dist/tex/context/base/node-bck.lua @@ -178,5 +178,19 @@ nodes.handlers.alignbackgrounds = function(head) local head, done = add_alignbac -- elsewhere: needs checking -tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds") -tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds") +-- tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds") +-- tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds") + +interfaces.implement { + name = "enablebackgroundboxes", + onlyonce = true, + actions = nodes.tasks.enableaction, + arguments = { "'shipouts'", "'nodes.handlers.backgrounds'" } +} + +interfaces.implement { + name = "enablebackgroundalign", + onlyonce = true, + actions = nodes.tasks.enableaction, + arguments = { "'shipouts'", "'nodes.handlers.alignbackgrounds'" } +} diff --git a/Master/texmf-dist/tex/context/base/node-bck.mkiv b/Master/texmf-dist/tex/context/base/node-bck.mkiv index 25739c56042..ff0de6a5d0c 100644 --- a/Master/texmf-dist/tex/context/base/node-bck.mkiv +++ b/Master/texmf-dist/tex/context/base/node-bck.mkiv @@ -21,14 +21,6 @@ \registerctxluafile{node-bck}{1.001} -\def\node_backgrounds_boxes_initialize % will move to lua - {\ctxlua{nodes.tasks.enableaction("shipouts","nodes.handlers.backgrounds")}% - \glet\node_backgrounds_boxes_initialize\donothing} - -\def\node_backgrounds_align_initialize % will move to lua - {\ctxlua{nodes.tasks.enableaction("shipouts","nodes.handlers.alignbackgrounds")}% - \glet\node_backgrounds_align_initialize\donothing} - % \backgroundvbox[green] {\input tufte } \par % \backgroundvbox[blue] {\input ward } \par % \backgroundvbox[red] {\input knuth } \par @@ -71,7 +63,7 @@ % \def\node_backgrounds_boxes_add#1[#2]% % {\begingroup -% \node_backgrounds_boxes_initialize +% \clf_enablebackgroundboxes % \dousecolorparameter{#2}% % \normalexpanded{\endgroup#1 % attr \backgroundattribute \plusone @@ -82,13 +74,13 @@ % more efficient: \def\node_backgrounds_boxes_add#1[#2]% - {\node_backgrounds_boxes_initialize + {\clf_enablebackgroundboxes #1\backgroundcolorattr{#2}} % less argument carry over: % % \def\node_backgrounds_boxes_add#1[#2]% -% {\node_backgrounds_boxes_initialize#1% +% {\clf_enablebackgroundboxes#1% % \ifcsname\??colorattribute\currentcolorprefix#2\endcsname % \thebackgroundcolorattr{\currentcolorprefix#2}% % \else\ifcsname\??colorattribute#2\endcsname diff --git a/Master/texmf-dist/tex/context/base/node-fin.lua b/Master/texmf-dist/tex/context/base/node-fin.lua index 250035f3958..84c5b9a2f93 100644 --- a/Master/texmf-dist/tex/context/base/node-fin.lua +++ b/Master/texmf-dist/tex/context/base/node-fin.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['node-fin'] = { -- this module is being reconstructed -- local functions, only slightly slower -- --- leaders are also triggers +-- leaders are also triggers ... see colo-ext for an example (negate a box) local next, type, format = next, type, string.format @@ -27,7 +27,6 @@ local getid = nuts.getid local getlist = nuts.getlist local getleader = nuts.getleader local getattr = nuts.getattr -local setattr = nuts.setattr local copy_node = nuts.copy local insert_node_before = nuts.insert_before @@ -51,6 +50,8 @@ local numbers = attributes.numbers local a_trigger = attributes.private('trigger') local triggering = false +local implement = interfaces.implement + local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming local loadstripped = utilities.lua.loadstripped @@ -61,6 +62,9 @@ local unsetvalue = attributes.unsetvalue function states.enabletriggering () triggering = true end function states.disabletriggering() triggering = false end +implement { name = "enablestatetriggering", actions = states.enabletriggering } +implement { name = "disablestatetriggering", actions = states.disabletriggering } + nodes.plugindata = nil -- inheritance: -0x7FFFFFFF -- we can best use nil and skip ! @@ -129,7 +133,7 @@ end local nsdata, nsnone, nslistwise, nsforced, nsselector, nstrigger local current, current_selector, done = 0, 0, false -- nb, stack has a local current ! -local nsbegin, nsend +local nsbegin, nsend, nsreset function states.initialize(namespace,attribute,head) nsdata = namespace.data @@ -143,6 +147,7 @@ function states.initialize(namespace,attribute,head) done = false -- todo: done cleanup nsstep = namespace.resolve_step if nsstep then + nsreset = namespace.resolve_reset nsbegin = namespace.resolve_begin nsend = namespace.resolve_end nspush = namespace.push @@ -168,7 +173,6 @@ function states.finalize(namespace,attribute,head) -- is this one ok? return head, false, false end --- disc nodes can be ignored -- we need to deal with literals too (reset as well as oval) -- if id == glyph_code or (id == whatsit_code and getsubtype(stack) == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then @@ -181,6 +185,8 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr local id = getid(stack) if id == glyph_code then check = true + -- elseif id == disc_code then + -- check = true -- no longer needed as we flatten replace elseif id == glue_code then leader = getleader(stack) if leader then @@ -294,6 +300,8 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at local id = getid(stack) if id == glyph_code then check = true + -- elseif id == disc_code then + -- check = true -- no longer needed as we flatten replace elseif id == glue_code then leader = getleader(stack) if leader then @@ -364,7 +372,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at done = done or ok end -- end nested - leader = false + leader = false end elseif default and inheritance then if current ~= default then @@ -484,14 +492,17 @@ end -- experimental local function stacker(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise - nsbegin() + +-- nsbegin() + local stacked = false + local current = head local previous = head local done = false - local okay = false local attrib = default or unsetvalue local check = false local leader = false + while current do local id = getid(current) if id == glyph_code then @@ -530,13 +541,15 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in if check then local a = getattr(current,attribute) or unsetvalue if a ~= attrib then + if not stacked then + stacked = true + nsbegin() + end local n = nsstep(a) if n then - -- !!!! TEST CODE !!!! - -- head = insert_node_before(head,current,copied(nsdata[tonumber(n)])) -- a head = insert_node_before(head,current,tonut(n)) -- a end - attrib, done, okay = a, true, true + attrib, done = a, true if leader then -- tricky as a leader has to be a list so we cannot inject before local list, ok = stacker(namespace,attribute,leader,attrib) @@ -550,19 +563,23 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in previous = current current = getnext(current) end - if okay then - local n = nsend() - if n then - -- !!!! TEST CODE !!!! - -- head = insert_node_after(head,previous,copied(nsdata[tostring(n)])) - head = insert_node_after(head,previous,tonut(n)) - end + +if stacked then + + local n = nsend() + while n do + head = insert_node_after(head,previous,tonut(n)) + n = nsend() end + +end + return head, done end states.stacker = function(namespace,attribute,head,default) local head, done = stacker(namespace,attribute,tonut(head),default) + nsreset() return tonode(head), done end diff --git a/Master/texmf-dist/tex/context/base/node-fin.mkiv b/Master/texmf-dist/tex/context/base/node-fin.mkiv index 2eb033fc16a..7c95699dd12 100644 --- a/Master/texmf-dist/tex/context/base/node-fin.mkiv +++ b/Master/texmf-dist/tex/context/base/node-fin.mkiv @@ -23,12 +23,12 @@ % we might have two variants at some point (efficiency) -\unexpanded\def\finalizeobjectbox #1{\ctxcommand{finalizebox(\number#1)}} -\unexpanded\def\finalizeshipoutbox#1{\ctxcommand{finalizebox(\number#1)}} +\unexpanded\def\finalizeobjectbox #1{\clf_finalizebox#1\relax} +\unexpanded\def\finalizeshipoutbox#1{\clf_finalizebox#1\relax} % Experimental (for Aditya): -\unexpanded\def\cleanupbox#1{\ctxcommand{cleanupbox(\number#1)}} +\unexpanded\def\cleanupbox#1{\clf_cleanupbox#1\relax} % Tricky stuff: this might become obsolete. @@ -61,12 +61,12 @@ \stopinheritattributes} \def\enableattributeinheritance - {\ctxlua{attributes.states.enabletriggering()}% + {\clf_enablestatetriggering \let\attributedcopy\doattributedcopy \let\attributedbox \doattributedbox} \def\disableattributeinheritance - {\ctxlua{attributes.states.disabletriggering()}% + {\clf_disablestatetriggering \let\attributedcopy\copy \let\attributedbox \box} diff --git a/Master/texmf-dist/tex/context/base/node-fnt.lua b/Master/texmf-dist/tex/context/base/node-fnt.lua index 7000c4fd7ac..774a687186a 100644 --- a/Master/texmf-dist/tex/context/base/node-fnt.lua +++ b/Master/texmf-dist/tex/context/base/node-fnt.lua @@ -13,8 +13,11 @@ local concat, keys = table.concat, table.keys local nodes, node, fonts = nodes, node, fonts -local trace_characters = false trackers.register("nodes.characters", function(v) trace_characters = v end) -local trace_fontrun = false trackers.register("nodes.fontrun", function(v) trace_fontrun = v end) +local trace_characters = false trackers .register("nodes.characters", function(v) trace_characters = v end) +local trace_fontrun = false trackers .register("nodes.fontrun", function(v) trace_fontrun = v end) + +local force_discrun = true directives.register("nodes.discrun", function(v) force_discrun = v end) +local force_basepass = true directives.register("nodes.basepass", function(v) force_basepass = v end) local report_fonts = logs.reporter("fonts","processing") @@ -31,6 +34,7 @@ local handlers = nodes.handlers local nuts = nodes.nuts local tonut = nuts.tonut +local tonode = nuts.tonode local getattr = nuts.getattr local getid = nuts.getid @@ -38,6 +42,8 @@ local getfont = nuts.getfont local getsubtype = nuts.getsubtype local getchar = nuts.getchar local getnext = nuts.getnext +local getprev = nuts.getprev +local getfield = nuts.getfield local traverse_id = nuts.traverse_id @@ -111,11 +117,25 @@ fonts.hashes.processes = fontprocesses -- inside a run which means that we need to keep track of this which in turn complicates matters -- in a way i don't like +-- we need to deal with the basemode fonts here and can only run over ranges as we +-- otherwise get luatex craches due to all kind of asserts in the disc/lig builder + +local ligaturing = node.ligaturing +local kerning = node.kerning + function handlers.characters(head) -- either next or not, but definitely no already processed list starttiming(nodes) - local usedfonts, attrfonts = { }, { } - local a, u, prevfont, prevattr, done = 0, 0, nil, 0, false + + local usedfonts = { } + local attrfonts = { } + local basefonts = { } + local a, u, b = 0, 0, 0 + local basefont = nil + local prevfont = nil + local prevattr = 0 + local done = false + if trace_fontrun then run = run + 1 report_fonts() @@ -136,43 +156,114 @@ function handlers.characters(head) n = getnext(n) end end - for n in traverse_id(glyph_code,tonut(head)) do - -- if getsubtype(n) <256 then -- all are 1 - local font = getfont(n) - local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context - if font ~= prevfont or attr ~= prevattr then - if attr > 0 then - local used = attrfonts[font] - if not used then - used = { } - attrfonts[font] = used + + local nuthead = tonut(head) + + for n in traverse_id(glyph_code,nuthead) do + if getsubtype(n) < 256 then -- all are 1 + local font = getfont(n) + local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context + if font ~= prevfont or attr ~= prevattr then + if basefont then + basefont[2] = tonode(getprev(n)) -- todo, save p end - if not used[attr] then - local fd = setfontdynamics[font] - if fd then - used[attr] = fd[attr] - a = a + 1 + if attr > 0 then + local used = attrfonts[font] + if not used then + used = { } + attrfonts[font] = used + end + if not used[attr] then + local fd = setfontdynamics[font] + if fd then + used[attr] = fd[attr] + a = a + 1 + elseif force_basepass then + b = b + 1 + basefont = { tonode(n), nil } + basefonts[b] = basefont + end + end + else + local used = usedfonts[font] + if not used then + local fp = fontprocesses[font] + if fp then + usedfonts[font] = fp + u = u + 1 + elseif force_basepass then + b = b + 1 + basefont = { tonode(n), nil } + basefonts[b] = basefont + end end end - else - local used = usedfonts[font] - if not used then - local fp = fontprocesses[font] - if fp then - usedfonts[font] = fp - u = u + 1 - end + prevfont = font + prevattr = attr + end + end + end + + -- could be an optional pass : seldom needed, only for documentation as a discretionary + -- with pre/post/replace will normally not occur on it's own + + if force_discrun then + + -- basefont is not supported in disc only runs ... it would mean a lot of + -- ranges .. we could try to run basemode as a separate processor run but + -- not for now (we can consider it when the new node code is tested + + -- local prevfont = nil + -- local prevattr = 0 + + for d in traverse_id(disc_code,nuthead) do + -- we could use first_glyph + local r = getfield(n,"replace") -- good enough + if r then + for n in traverse_id(glyph_code,r) do + if getsubtype(n) < 256 then -- all are 1 + local font = getfont(n) + local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context + if font ~= prevfont or attr ~= prevattr then + if attr > 0 then + local used = attrfonts[font] + if not used then + used = { } + attrfonts[font] = used + end + if not used[attr] then + local fd = setfontdynamics[font] + if fd then + used[attr] = fd[attr] + a = a + 1 + end + end + else + local used = usedfonts[font] + if not used then + local fp = fontprocesses[font] + if fp then + usedfonts[font] = fp + u = u + 1 + end + end + end + prevfont = font + prevattr = attr + end + end + break end end - prevfont = font - prevattr = attr end - -- end + end + if trace_fontrun then report_fonts() - report_fonts("statics : %s",(u > 0 and concat(keys(usedfonts)," ")) or "none") - report_fonts("dynamics: %s",(a > 0 and concat(keys(attrfonts)," ")) or "none") + report_fonts("statics : %s",u > 0 and concat(keys(usedfonts)," ") or "none") + report_fonts("dynamics: %s",a > 0 and concat(keys(attrfonts)," ") or "none") + report_fonts("built-in: %s",b > 0 and b or "none") report_fonts() end -- in context we always have at least 2 processors @@ -224,6 +315,49 @@ function handlers.characters(head) end end end + if b == 0 then + -- skip + elseif b == 1 then + -- only one font + local front = head == start + local range = basefonts[1] + local start = range[1] + local stop = range[2] + if stop then + start, stop = ligaturing(start,stop) + start, stop = kerning(start,stop) + elseif start then -- safeguard + start = ligaturing(start) + start = kerning(start) + else + -- something bad happened + end + if front then + -- shouldn't happen + head = start + end + else + -- multiple fonts + local front = head == start + for i=1,b do + local range = basefonts[i] + local start = range[1] + local stop = range[2] + if stop then + start, stop = ligaturing(start,stop) + start, stop = kerning(start,stop) + elseif start then -- safeguard + start = ligaturing(start) + start = kerning(start) + else + -- something bad happened + end + end + if front then + -- shouldn't happen + head = start + end + end stoptiming(nodes) if trace_characters then nodes.report(head,done) @@ -292,7 +426,9 @@ end -- return false -- end -- end) - +-- +-- -- TODO: basepasses! +-- -- function handlers.characters(head) -- -- either next or not, but definitely no already processed list -- starttiming(nodes) @@ -408,3 +544,13 @@ local d_unprotect_glyphs = nuts.unprotect_glyphs handlers.protectglyphs = function(n) return d_protect_glyphs (tonut(n)) end handlers.unprotectglyphs = function(n) return d_unprotect_glyphs(tonut(n)) end + +-- function handlers.protectglyphs(h) +-- local h = tonut(h) +-- for n in traverse_id(disc_code,h) do +-- local d = getfield(n,"pre") if d then d_protect_glyphs(d) end +-- local d = getfield(n,"post") if d then d_protect_glyphs(d) end +-- local d = getfield(n,"replace") if d then d_protect_glyphs(d) end +-- end +-- return d_protect_glyphs(h) +-- end diff --git a/Master/texmf-dist/tex/context/base/node-ini.lua b/Master/texmf-dist/tex/context/base/node-ini.lua index a9ef305c03f..02d4c7a3fb8 100644 --- a/Master/texmf-dist/tex/context/base/node-ini.lua +++ b/Master/texmf-dist/tex/context/base/node-ini.lua @@ -154,9 +154,9 @@ local disccodes = allocate { [0] = "discretionary", -- \discretionary [1] = "explicit", -- \- [2] = "automatic", -- following a - - [3] = "regular", -- simple - [4] = "first", -- hard first item - [5] = "second", -- hard second item + [3] = "regular", -- by hyphenator: simple + [4] = "first", -- by hyphenator: hard first item + [5] = "second", -- by hyphenator: hard second item } local accentcodes = allocate { @@ -206,7 +206,7 @@ nodes.whatcodes = whatcodes nodes.whatsitcodes = whatcodes -- more offici nodes.listcodes = listcodes nodes.glyphcodes = glyphcodes nodes.kerncodes = kerncodes -nodes.penaltycodes = kerncodes +nodes.penaltycodes = penaltycodes nodes.mathcodes = mathcodes nodes.fillcodes = fillcodes nodes.margincodes = margincodes diff --git a/Master/texmf-dist/tex/context/base/node-ini.mkiv b/Master/texmf-dist/tex/context/base/node-ini.mkiv index 5fc519069db..d04e647de42 100644 --- a/Master/texmf-dist/tex/context/base/node-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/node-ini.mkiv @@ -35,7 +35,7 @@ \registerctxluafile{node-acc}{1.001} % experimental %registerctxluafile{node-prp}{1.001} % makes no sense (yet) -\doiffileelse{node-ppt.lua}{\registerctxluafile{node-ppt}{1.001}}{} +\doifelsefile{node-ppt.lua}{\registerctxluafile{node-ppt}{1.001}}{} \newcount\c_node_tracers_show_box % box number diff --git a/Master/texmf-dist/tex/context/base/node-inj.lua b/Master/texmf-dist/tex/context/base/node-inj.lua index b91646ffc1a..402403529c6 100644 --- a/Master/texmf-dist/tex/context/base/node-inj.lua +++ b/Master/texmf-dist/tex/context/base/node-inj.lua @@ -56,7 +56,7 @@ local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local a_kernpair = attributes.private('kernpair') ------ a_ligacomp = attributes.private('ligacomp') +local a_ligacomp = attributes.private('ligacomp') local a_markbase = attributes.private('markbase') local a_markmark = attributes.private('markmark') local a_markdone = attributes.private('markdone') @@ -64,6 +64,8 @@ local a_cursbase = attributes.private('cursbase') local a_curscurs = attributes.private('curscurs') local a_cursdone = attributes.private('cursdone') +local unsetvalue = attributes.unsetvalue + -- This injector has been tested by Idris Samawi Hamid (several arabic fonts as well as -- the rather demanding Husayni font), Khaled Hosny (latin and arabic) and Kaj Eigner -- (arabic, hebrew and thai) and myself (whatever font I come across). I'm pretty sure @@ -84,6 +86,33 @@ local kerns = { } -- For the moment we pass the r2l key ... volt/arabtype tests .. idris: this needs -- checking with husayni (volt and fontforge). +function injections.reset(n) +-- if getattr(n,a_kernpair) then +-- setattr(n,a_kernpair,unsetvalue) +-- end +-- if getattr(n,a_markdone) then +-- setattr(n,a_markbase,unsetvalue) +-- setattr(n,a_markmark,unsetvalue) +-- setattr(n,a_markdone,unsetvalue) +-- end +-- if getattr(n,a_cursdone) then +-- setattr(n,a_cursbase,unsetvalue) +-- setattr(n,a_curscurs,unsetvalue) +-- setattr(n,a_cursdone,unsetvalue) +-- end +-- if getattr(n,a_ligacomp) then +-- setattr(n,a_ligacomp,unsetvalue) +-- end +end + +function injections.setligaindex(n,index) + setattr(n,a_ligacomp,index) +end + +function injections.getligaindex(n,default) + return getattr(n,a_ligacomp) or default +end + function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2]) local ws, wn = tfmstart.width, tfmnext.width @@ -343,7 +372,7 @@ function injections.handler(head,where,keep) for i=maxt,1,-1 do ny = ny + d[i] local ti = t[i] - setfield(ti,"yoffset",ny) + setfield(ti,"yoffset",ny) -- maybe add to current yoffset end maxt = 0 end diff --git a/Master/texmf-dist/tex/context/base/node-ltp.lua b/Master/texmf-dist/tex/context/base/node-ltp.lua index 6ad5de140b9..9529213fc37 100644 --- a/Master/texmf-dist/tex/context/base/node-ltp.lua +++ b/Master/texmf-dist/tex/context/base/node-ltp.lua @@ -406,13 +406,13 @@ end -- resolvers -- -local whatsiters = { +local whatsitters = { get_width = { }, get_dimensions = { }, } -local get_whatsit_width = whatsiters.get_width -local get_whatsit_dimensions = whatsiters.get_dimensions +local get_whatsit_width = whatsitters.get_width +local get_whatsit_dimensions = whatsitters.get_dimensions local function get_width (n,dir) return getfield(n,"width") end local function get_dimensions(n,dir) return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth") end @@ -423,6 +423,8 @@ get_whatsit_width[pdfrefxform_code ] = get_width get_whatsit_dimensions[pdfrefximage_code] = get_dimensions get_whatsit_dimensions[pdfrefxform_code ] = get_dimensions +nodes.whatsitters = whatsitters + -- expansion etc -- local function calculate_fraction(x,n,d,max_answer) @@ -1243,6 +1245,7 @@ local function post_line_break(par) setfield(prevlast,"post",nil) end elseif subtype == first_disc_code then + -- what is v ... next probably if not (getid(v) == disc_code and getsubtype(v) == second_disc_code) then report_parbuilders('unsupported disc at location %a',4) end @@ -2547,10 +2550,10 @@ function diagnostics.feasible_break(par, current, r, b, pi, d, artificial_demeri par.font_in_short_display = short_display("log",getnext(printed_node),par.font_in_short_display) else local save_link = getnext(current) - setfield(cur_p,"next",nil) + setfield(current,"next",nil) write_nl("log","") par.font_in_short_display = short_display("log",getnext(printed_node),par.font_in_short_display) - setfield(cur_p,"next",save_link) + setfield(current,"next",save_link) end par.printed_node = current end @@ -3145,7 +3148,7 @@ local function hpack(head,width,method,direction,firstline,line) -- fast version end diagnostics.overfull_hbox(hlist,line,-delta) end - elseif order == 0 and hlist.list and last_badness > tex.hbadness then + elseif order == 0 and getlist(hlist) and last_badness > tex.hbadness then diagnostics.bad_hbox(hlist,line,last_badness) end end @@ -3154,6 +3157,8 @@ end xpack_nodes = hpack -- comment this for old fashioned expansion (we need to fix float mess) +constructors.methods.hpack = hpack + local function common_message(hlist,line,str) write_nl("") if status.output_active then -- unset diff --git a/Master/texmf-dist/tex/context/base/node-nut.lua b/Master/texmf-dist/tex/context/base/node-nut.lua index 2b4e9968c6e..32f2d57ec32 100644 --- a/Master/texmf-dist/tex/context/base/node-nut.lua +++ b/Master/texmf-dist/tex/context/base/node-nut.lua @@ -86,10 +86,14 @@ if not modules then modules = { } end modules ['node-met'] = { -- luatex 3.9 sec / 54 pps -- luajittex 2.3 sec / 93 pps +local type, rawget = type, rawget + local nodes = nodes local gonuts = nodes.gonuts local direct = node.direct +local fastcopy = table.fastcopy + if type(direct) ~= "table" then return elseif gonuts then @@ -136,6 +140,20 @@ nuts.getsubtype = direct.getsubtype nuts.getlist = direct.getlist -- only hlist and vlist ! nuts.getleader = direct.getleader +-- local function track(name) +-- local n = 0 +-- local f = nuts[name] +-- function nuts[name](...) +-- n = n + 1 +-- if n % 1000 == 0 then +-- print(name,n) +-- end +-- return f(...) +-- end +-- end + +-- track("getsubtype") + -- local dgf = direct.getfield function nuts.getlist(n) return dgf(n,"list") end -- setters @@ -662,8 +680,14 @@ if propertydata then data = propertydata, } - direct.set_properties_mode(true,false) - -- direct.set_properties_mode(true,true) + -- direct.set_properties_mode(true,false) -- shallow copy ... problem: in fonts we then affect the originals too + direct.set_properties_mode(true,true) -- create metatable, slower but needed for font-inj.lua (unless we use an intermediate table) + + -- todo: + -- + -- function direct.set_properties_mode() + -- -- we really need the set modes + -- end -- experimental code with respect to copying attributes has been removed -- as it doesn't pay of (most attributes are only accessed once anyway) @@ -700,3 +724,31 @@ else nodes.getprop = setattr end + +function nuts.copy_properties(source,target,what) + local newprops = propertydata[source] + if not newprops then + -- nothing to copy + return + end + if what then + -- copy one category + newprops = rawget(source,what) + if newprops then + newprops = fastcopy(newprops) + local p = rawget(propertydata,target) + if p then + p[what] = newprops + else + propertydata[target] = { + [what] = newprops, + } + end + end + else + -- copy all properties + newprops = fastcopy(newprops) + propertydata[target] = newprops + end + return newprops -- for checking +end diff --git a/Master/texmf-dist/tex/context/base/node-pro.lua b/Master/texmf-dist/tex/context/base/node-pro.lua index 2cc00601c77..27e349893b6 100644 --- a/Master/texmf-dist/tex/context/base/node-pro.lua +++ b/Master/texmf-dist/tex/context/base/node-pro.lua @@ -55,7 +55,7 @@ do return concat(t) end - local function tracer(what,state,head,groupcode,before,after,show) + function processors.tracer(what,state,head,groupcode,before,after,show) if not groupcode then groupcode = "unknown" elseif groupcode == "" then @@ -69,10 +69,10 @@ do end end - processors.tracer = tracer - end +local tracer = processors.tracer + processors.enabled = true -- this will become a proper state (like trackers) function processors.pre_linebreak_filter(head,groupcode) -- ,size,packtype,direction diff --git a/Master/texmf-dist/tex/context/base/node-ref.lua b/Master/texmf-dist/tex/context/base/node-ref.lua index 78ef409bca5..9703cc184a9 100644 --- a/Master/texmf-dist/tex/context/base/node-ref.lua +++ b/Master/texmf-dist/tex/context/base/node-ref.lua @@ -16,6 +16,8 @@ if not modules then modules = { } end modules ['node-ref'] = { -- is grouplevel still used? +local concat = table.concat + local attributes, nodes, node = attributes, nodes, node local allocate = utilities.storage.allocate, utilities.storage.mark @@ -32,9 +34,11 @@ local colors = attributes.colors local references = structures.references local tasks = nodes.tasks -local trace_backend = false trackers.register("nodes.backend", function(v) trace_backend = v end) -local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end) -local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end) +local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end) +local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end) +local trace_areas = false trackers.register("nodes.areas", function(v) trace_areas = v end) +local show_references = false trackers.register("nodes.references.show", function(v) show_references = tonumber(v) or (v and 2.25 or false) end) +local show_destinations = false trackers.register("nodes.destinations.show", function(v) show_destinations = tonumber(v) or (v and 2.00 or false) end) local report_reference = logs.reporter("backend","references") local report_destination = logs.reporter("backend","destinations") @@ -57,6 +61,7 @@ local setattr = nuts.setattr local getsubtype = nuts.getsubtype local hpack_list = nuts.hpack +local vpack_list = nuts.vpack local list_dimensions = nuts.dimensions local traverse = nuts.traverse local find_node_tail = nuts.tail @@ -69,6 +74,8 @@ local listcodes = nodes.listcodes local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local glue_code = nodecodes.glue +local glyph_code = nodecodes.glyph +local rule_code = nodecodes.rule local whatsit_code = nodecodes.whatsit local leftskip_code = skipcodes.leftskip @@ -83,68 +90,147 @@ local line_code = listcodes.line local new_rule = nodepool.rule local new_kern = nodepool.kern +local free_node = nuts.free + local tosequence = nodes.tosequence --- local function dimensions(parent,start,stop) --- stop = stop and getnext(stop) --- if parent then --- if stop then --- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop) --- else --- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign",getfield(parent,"glue_order"),start) --- end --- else --- if stop then --- return list_dimensions(start,stop) --- else --- return list_dimensions(start) --- end --- end --- end --- --- -- more compact +local implement = interfaces.implement + +-- Normally a (destination) area is a box or a simple stretch if nodes but when it is +-- a paragraph we hav ea problem: we cannot calculate the height well. This happens +-- with footnotes or content broken across a page. + +local function vlist_dimensions(start,stop) + local temp + if stop then + temp = getnext(stop) + setfield(stop,"next",nil) + end + local v = vpack_list(start) + local w = getfield(v,"width") + local h = getfield(v,"height") + local d = getfield(v,"depth") + setfield(v,"list",nil) + free_node(v) + if temp then + setfield(stop,"next",temp) + end + return w, h, d +end -local function dimensions(parent,start,stop) +local function hlist_dimensions(start,stop,parent) + local last = stop and getnext(stop) + if parent then + return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,last) + else + return list_dimensions(start,last) + end +end + +local function dimensions(parent,start,stop) -- in principle we could move some to the caller + local id = getid(start) + if start == stop then + if id == hlist_code or id == vlist_code or id == glyph_code or id == rule_code then -- or image + if trace_areas then + report_area("dimensions taken of %a",nodecodes[id]) + end + return getfield(start,"width"), getfield(parent,"height"), getfield(parent,"depth") + else + if trace_areas then + report_area("dimensions calculated of %a",nodecodes[id]) + end + return hlist_dimensions(start,stop) -- one node only so simple + end + end + local last = stop and getnext(stop) if parent then - return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop and getnext(stop)) + -- todo: if no prev and no next and parent + -- todo: we need a a list_dimensions for a vlist + if getid(parent) == vlist_code then + local l = getlist(parent) + local c = l + local ok = false + while c do + if c == start then + ok = true + end + if ok and getid(c) == hlist_code then + break + else + c = getnext(c) + end + end + if ok and c then + if trace_areas then + report_area("dimensions taken of first line in vlist") + end + return getfield(c,"width"), getfield(c,"height"), getfield(c,"depth"), c + else + if trace_areas then + report_area("dimensions taken of vlist (probably wrong)") + end + return hlist_dimensions(start,stop,parent) + end + else + if trace_areas then + report_area("dimensions taken of range starting with %a using parent",nodecodes[id]) + end + return hlist_dimensions(start,stop,parent) + end else - return list_dimensions(start,stop and getnext(stop)) + if trace_areas then + report_area("dimensions taken of range starting with %a",nodecodes[id]) + end + return hlist_dimensions(start,stop) end end -- is pardir important at all? local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir) - local width, height, depth = dimensions(parent,first,last) + local width, height, depth, line = dimensions(parent,first,last) if txtdir == "+TRT" or (txtdir == "===" and pardir == "TRT") then -- KH: textdir == "===" test added width = - width end local result, resolved = make(width,height,depth,reference) if result and resolved then - if head == first then - if trace_backend then - report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head", - reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + if line then + -- special case, we only treat the first line in a vlist + local l = getlist(line) + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","line", + reference,pardir or "---",txtdir or "---",tosequence(l,nil,true),width,height,depth,resolved) end - setfield(result,"next",first) - setfield(first,"prev",result) - return result, last + setfield(line,"list",result) + setfield(result,"next",l) + setfield(l,"prev",result) + return head, last else - if trace_backend then - report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle", - reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) - end - local prev = getprev(first) - if prev then - setfield(prev,"next",result) - setfield(result,"prev",prev) + if head == first then + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head", + reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + end + setfield(result,"next",first) + setfield(first,"prev",result) + return result, last + else + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle", + reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + end + local prev = getprev(first) + if prev then + setfield(prev,"next",result) + setfield(result,"prev",prev) + end + setfield(result,"next",first) + setfield(first,"prev",result) + -- if first == getnext(head) then + -- setfield(head,"next",result) -- hm, weird + -- end + return head, last end - setfield(result,"next",first) - setfield(first,"prev",result) --- if first == getnext(head) then --- setfield(head,"next",result) -- hm, weird --- end - return head, last end else return head, last @@ -152,9 +238,12 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t end local function inject_list(id,current,reference,make,stack,pardir,txtdir) - local width, height, depth, correction = getfield(current,"width"), getfield(current,"height"), getfield(current,"depth"), 0 - local moveright = false - local first = getlist(current) + local width = getfield(current,"width") + local height = getfield(current,"height") + local depth = getfield(current,"depth") + local correction = 0 + local moveright = false + local first = getlist(current) if id == hlist_code then -- box_code line_code -- can be either an explicit hbox or a line and there is no way -- to recognize this; anyway only if ht/dp (then inline) @@ -193,7 +282,7 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir) local result, resolved = make(width,height,depth,reference) -- todo: only when width is ok if result and resolved then - if trace_backend then + if trace_areas then report_area("%s: %04i %s %s %s: w=%p, h=%p, d=%p, c=%S","box", reference,pardir or "---",txtdir or "----","[]",width,height,depth,resolved) end @@ -227,6 +316,10 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx while current do local id = getid(current) if id == hlist_code or id == vlist_code then + + -- see dimensions: this is tricky with split off boxes like inserts + -- where we can end up with a first and last spanning lines + local r = getattr(current,attribute) -- test \goto{test}[page(2)] test \gotobox{test}[page(2)] -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)] @@ -330,7 +423,7 @@ local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir) return head, true end --- tracing +-- tracing: todo: use predefined colors local register_color = colors.register @@ -341,7 +434,33 @@ local u_transparency = nil local u_colors = { } local force_gray = true -local function colorize(width,height,depth,n,reference,what) +local function addstring(what,str,shift) --todo make a pluggable helper (in font-ctx) + if str then + local typesetters = nuts.typesetters + if typesetters then + local hashes = fonts.hashes + local infofont = fonts.infofont() + local emwidth = hashes.emwidths [infofont] + local exheight = hashes.exheights[infofont] + if what == "reference" then + str = str .. " " + shift = - (shift or 2.25) * exheight + else + str = str .. " " + shift = (shift or 2) * exheight + end + local text = typesetters.fast_hpack(str,infofont) + local rule = new_rule(emwidth/5,4*exheight,3*exheight) + local list = getlist(text) + setfield(text,"shift",shift) + return nuts.fasthpack(nuts.linked(text,rule)) + -- local text = typesetters.fast_hpack(str,fonts.infofont()) + -- return text + end + end +end + +local function colorize(width,height,depth,n,reference,what,sr,offset) if force_gray then n = 0 end u_transparency = u_transparency or transparencies.register(nil,2,.65) local ucolor = u_colors[n] @@ -379,10 +498,37 @@ local function colorize(width,height,depth,n,reference,what) setfield(rule,"prev",kern) return kern else + +if sr and sr ~= "" then + local text = addstring(what,sr,shift) + if text then + local kern = new_kern(-getfield(text,"width")) + setfield(kern,"next",text) + setfield(text,"prev",kern) + setfield(text,"next",rule) + setfield(rule,"prev",text) + return kern + end +end + return rule end end +local function justadd(what,sr,shift) + if sr and sr ~= "" then + local text = addstring(what,sr,shift) + if text then + local kern = new_kern(-getfield(text,"width")) + setfield(kern,"next",text) + setfield(text,"prev",kern) + setfield(text,"next",rule) + setfield(rule,"prev",text) + return kern + end + end +end + -- references: local texsetattribute = tex.setattribute @@ -423,23 +569,45 @@ local function makereference(width,height,depth,reference) -- height and depth a report_reference("resolving attribute %a",reference) end local resolved, ht, dp, set, n = sr[1], sr[2], sr[3], sr[4], sr[5] --- logs.report("temp","child: ht=%p dp=%p, parent: ht=%p dp=%p",ht,dp,height,depth) + -- logs.report("temp","child: ht=%p dp=%p, parent: ht=%p dp=%p",ht,dp,height,depth) if ht then if height < ht then height = ht end if depth < dp then depth = dp end end --- logs.report("temp","used: ht=%p dp=%p",height,depth) --- step = 0 + -- logs.report("temp","used: ht=%p dp=%p",height,depth) local annot = nodeinjections.reference(width,height,depth,set) if annot then -annot = tonut(annot) + annot = tonut(annot) -- todo nofreferences = nofreferences + 1 - local result, current + local result, current, texts + if show_references then + local d = sr[1] + if d then + local r = d.reference + local p = d.prefix + if r then + if p then + texts = p .. "|" .. r + else + texts = r + end + else + -- t[#t+1] = d.internal or "?" + end + end + end if trace_references then local step = 65536 - result = hpack_list(colorize(width,height-step,depth-step,2,reference,"reference")) -- step subtracted so that we can see seperate links + result = hpack_list(colorize(width,height-step,depth-step,2,reference,"reference",texts,show_references)) -- step subtracted so that we can see seperate links setfield(result,"width",0) current = result + elseif texts then + texts = justadd("reference",texts,show_references) + if texts then + result = hpack_list(texts) + setfield(result,"width",0) + current = result + end end if current then setfield(current,"next",annot) @@ -506,19 +674,49 @@ local function makedestination(width,height,depth,reference) if trace_destinations then report_destination("resolving attribute %a",reference) end - local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5] + local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5] -- sr[4] will change to just internal if ht then if height < ht then height = ht end if depth < dp then depth = dp end end - local result, current + local result, current, texts + if show_destinations then + if name and #name > 0 then + local t = { } + for i=1,#name do + local s = name[i] + if type(s) == "number" then + local d = references.internals[s] + if d then + d = d.references + local r = d.reference + local p = d.usedprefix + if r then + if p then + t[#t+1] = p .. "|" .. r + else + t[#t+1] = r + end + else + -- t[#t+1] = d.internal or "?" + end + end + else + -- in fact we have a prefix:name here + end + end + if #t > 0 then + texts = concat(t," & ") + end + end + end if trace_destinations then local step = 0 if width == 0 then step = 4*65536 width, height, depth = 5*step, 5*step, 0 end - local rule = hpack_list(colorize(width,height,depth,3,reference,"destination")) + local rule = hpack_list(colorize(width,height,depth,3,reference,"destination",texts,show_destinations)) setfield(rule,"width",0) if not result then result, current = rule, rule @@ -528,6 +726,15 @@ local function makedestination(width,height,depth,reference) current = rule end width, height = width - step, height - step + elseif texts then + texts = justadd("destination",texts,show_destinations) + if texts then + result = hpack_list(texts) + if result then + setfield(result,"width",0) + current = result + end + end end nofdestinations = nofdestinations + 1 local annot = nodeinjections.destination(width,height,depth,name,view) @@ -580,14 +787,17 @@ function references.mark(reference,h,d,view) return setdestination(tex.currentgrouplevel,h,d,reference,view) end -function references.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible +function references.inject(prefix,reference,specification) -- todo: use currentreference is possible +-- print(prefix,reference,h,d,highlight,newwindow,layer) local set, bug = references.identify(prefix,reference) if bug or #set == 0 then -- unknown ref, just don't set it and issue an error else -- check - set.highlight, set.newwindow, set.layer = highlight, newwindow, layer - setreference(h,d,set) -- sets attribute / todo: for set[*].error + set.highlight = specification.highlight + set.newwindow = specification.newwindow + set.layer = specification.layer + setreference(specification.height,specification.depth,set) -- sets attribute / todo: for set[*].error end end @@ -598,8 +808,32 @@ function references.injectcurrentset(h,d) -- used inside doifelse end end -commands.injectreference = references.inject -commands.injectcurrentreference = references.injectcurrentset +implement { + name = "injectreference", + actions = references.inject, + arguments = { + "string", + "string", + { + { "highlight", "boolean" }, + { "newwindow", "boolean" }, + { "layer" }, + { "height", "dimen" }, + { "depth", "dimen" }, + } + } +} + +implement { + name = "injectcurrentreference", + actions = references.injectcurrentset, +} + +implement { + name = "injectcurrentreferencehtdp", + actions = references.injectcurrentset, + arguments = { "dimen", "dimen" }, +} -- @@ -628,4 +862,11 @@ end) function references.enableinteraction() tasks.enableaction("shipouts","nodes.references.handler") tasks.enableaction("shipouts","nodes.destinations.handler") + function references.enableinteraction() end end + +implement { + name = "enableinteraction", + actions = references.enableinteraction, + onlyonce = true +} diff --git a/Master/texmf-dist/tex/context/base/node-res.lua b/Master/texmf-dist/tex/context/base/node-res.lua index 1a9d6f02e2e..43dd3895ed6 100644 --- a/Master/texmf-dist/tex/context/base/node-res.lua +++ b/Master/texmf-dist/tex/context/base/node-res.lua @@ -146,6 +146,7 @@ local user_n = register_nut(new_nut("whatsit",whatsitcodes.userdefine local user_l = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_l,"type",110) -- 44 local user_s = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_s,"type",115) -- 44 local user_t = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_t,"type",116) -- 44 +----- user_c = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_c,"type",108) -- 44 local left_margin_kern = register_nut(new_nut("margin_kern",0)) local right_margin_kern = register_nut(new_nut("margin_kern",1)) local lineskip = register_nut(new_nut("glue",skipcodes.lineskip)) @@ -504,6 +505,17 @@ function nutpool.usertokens(id,tokens) return n end +-- function nutpool.usercode(id,code) +-- local n = copy_nut(user_c) +-- if code then +-- setfield(n,"user_id",id) +-- setfield(n,"value",code) +-- else +-- setfield(n,"value",id) +-- end +-- return n +-- end + function nutpool.special(str) local n = copy_nut(special) setfield(n,"data",str) diff --git a/Master/texmf-dist/tex/context/base/node-rul.lua b/Master/texmf-dist/tex/context/base/node-rul.lua index 6f3bc9df9e6..36d56a16c1a 100644 --- a/Master/texmf-dist/tex/context/base/node-rul.lua +++ b/Master/texmf-dist/tex/context/base/node-rul.lua @@ -424,3 +424,52 @@ nodes.shifts.handler = function(head) return process(a_shifted,data,flush_shifte function nodes.shifts.enable() tasks.enableaction("shipouts","nodes.shifts.handler") end + +-- interface + +local implement = interfaces.implement + +implement { + name = "definerule", + actions = { nodes.rules.define, context }, + arguments = { + { + { "continue" }, + { "unit" }, + { "order" }, + { "method", "integer" }, + { "offset", "number" }, + { "rulethickness", "string" }, + { "dy", "number" }, + { "max", "number" }, + { "ma", "integer" }, + { "ca", "integer" }, + { "ta", "integer" }, + } + } +} + +implement { + name = "enablerules", + onlyonce = true, + actions = nodes.rules.enable +} + +implement { + name = "defineshift", + actions = { nodes.shifts.define, context }, + arguments = { + { + { "continue" }, + { "unit" }, + { "method", "integer" }, + { "dy", "number" }, + } + } +} + +implement { + name = "enableshifts", + onlyonce = true, + actions = nodes.shifts.enable +} diff --git a/Master/texmf-dist/tex/context/base/node-rul.mkiv b/Master/texmf-dist/tex/context/base/node-rul.mkiv index 2d2e61134ef..7fa0473a5ff 100644 --- a/Master/texmf-dist/tex/context/base/node-rul.mkiv +++ b/Master/texmf-dist/tex/context/base/node-rul.mkiv @@ -112,19 +112,20 @@ \unexpanded\def\node_rules_define {\edef\p_node_rules_color{\barparameter\c!color}% - \setevalue{\??barattribute\currentbar}{\number\ctxlua{nodes.rules.define { - method = \barparameter\c!method, - offset = \barparameter\c!offset, - continue = "\barparameter\c!continue", - dy = \barparameter\c!dy, - rulethickness = "\barparameter\c!rulethickness", - unit = "\barparameter\c!unit", - order = "\barparameter\c!order", - max = \barparameter\c!max, - ma = \thecolormodelattribute, - ca = \thecolorattribute\p_node_rules_color, - ta = \thetransparencyattribute\p_node_rules_color - }}}} + \setevalue{\??barattribute\currentbar}{\number + \clf_definerule + continue {\barparameter\c!continue}% + unit {\barparameter\c!unit}% + order {\barparameter\c!order}% + rulethickness {\barparameter\c!rulethickness}% + method \barparameter\c!method + ma \thecolormodelattribute + ca \thecolorattribute\p_node_rules_color + ta \thetransparencyattribute\p_node_rules_color + offset \barparameter\c!offset\space % number + dy \barparameter\c!dy\space % number + max \barparameter\c!max + \relax}} \unexpanded\def\node_rules_redefine#1% {\def\currentbar{#1}\node_rules_define} @@ -132,13 +133,16 @@ \unexpanded\def\node_rules_direct#1% {\groupedcommand{\node_rules_set{#1}}\relax} -\def\node_rules_set - {\ctxlua{nodes.rules.enable()}% will be moved to lua - \glet\node_rules_set\node_rules_set_indeed - \node_rules_set} +% \unexpanded\def\node_rules_set +% {\clf_enablerules % will be moved to lua +% \glet\node_rules_set\node_rules_set_indeed +% \node_rules_set} +% +%\unexpanded\def\node_rules_set_indeed#1% maybe reverse the 1000 (also maybe use more attributes instead of settings) -\def\node_rules_set_indeed#1% maybe reverse the 1000 (also maybe use more attributes instead of settings) - {\edef\currentbar{#1}% +\unexpanded\def\node_rules_set#1% maybe reverse the 1000 (also maybe use more attributes instead of settings) + {\clf_enablerules % will be relaxed + \edef\currentbar{#1}% \expandafter\let\expandafter\c_node_rules_index\csname\??barindex#1\endcsname \advance\c_node_rules_index\plusone \usebarstyleandcolor\c!foregroundstyle\c!foregroundcolor @@ -157,6 +161,8 @@ \unexpanded\def\setbar[#1]% {\node_rules_set{#1}} +\let\directsetbar\node_rules_set + % ungrouped \newcount\c_node_rules_nesting % todo: same as colors @@ -279,31 +285,27 @@ \to \everydefineshift \unexpanded\def\node_shifts_define - {\setevalue{\??shiftattribute\currentshift}{\number\ctxlua{nodes.shifts.define { - method = \shiftparameter\c!method, - continue = "\shiftparameter\c!continue", - dy = \shiftparameter\c!dy, - unit = "\shiftparameter\c!unit", - }}}} + {\setevalue{\??shiftattribute\currentshift}{\number + \clf_defineshift + continue {\shiftparameter\c!continue}% + unit {\shiftparameter\c!unit}% + method \shiftparameter\c!method + dy \shiftparameter\c!dy % number + \relax}} \unexpanded\def\node_shifts_redefine#1% {\def\currentshift{#1}\node_shifts_define} -\unexpanded\def\node_shifts_set - {\ctxlua{nodes.shifts.enable()}% - \glet\node_shifts_set\node_shifts_set_indeed - \node_shifts_set} - -% \unexpanded\def\node_shifts_direct#1% -% {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing} - -\unexpanded\def\node_shifts_direct#1% - {\groupedcommand - {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}} - {\endgroup\dostopisolation\endgroup}} +% \unexpanded\def\node_shifts_set +% {\clf_enableshifts +% \glet\node_shifts_set\node_shifts_set_indeed +% \node_shifts_set} +% +% \def\node_shifts_set_indeed#1% todo: check parent ! -\def\node_shifts_set_indeed#1% todo: check parent ! - {\def\currentshift{#1}% +\unexpanded\def\node_shifts_set#1% todo: check parent ! + {\clf_enableshifts + \def\currentshift{#1}% \expandafter\let\expandafter\c_node_shifts_index\csname\??shiftindex#1\endcsname \advance\c_node_shifts_index\plusone \attribute\shiftedattribute\numexpr @@ -320,6 +322,14 @@ \unexpanded\def\stopshift {\endgroup} +% \unexpanded\def\node_shifts_direct#1% +% {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing} + +\unexpanded\def\node_shifts_direct#1% + {\groupedcommand + {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}} + {\endgroup\dostopisolation\endgroup}} + \setupshifts [\c!method=0, \c!continue=\v!no, diff --git a/Master/texmf-dist/tex/context/base/node-shp.lua b/Master/texmf-dist/tex/context/base/node-shp.lua index 6ebfd767fb4..42cc83b8f34 100644 --- a/Master/texmf-dist/tex/context/base/node-shp.lua +++ b/Master/texmf-dist/tex/context/base/node-shp.lua @@ -15,6 +15,8 @@ local setmetatableindex = table.setmetatableindex local nodecodes = nodes.nodecodes local whatsitcodes = nodes.whatsitcodes +local disccodes = nodes.disccodes + local tasks = nodes.tasks local handlers = nodes.handlers @@ -26,11 +28,27 @@ local kern_code = nodecodes.kern local glue_code = nodecodes.glue local whatsit_code = nodecodes.whatsit +local fulldisc_code = disccodes.discretionary + local texgetbox = tex.getbox -local free_node = node.free -local remove_node = node.remove -local traverse_nodes = node.traverse +local implement = interfaces.implement + +local nuts = nodes.nuts +local tonut = nuts.tonut +local tonode = nuts.tonode +local free_node = nuts.free +local remove_node = nuts.remove +local traverse_nodes = nuts.traverse +local find_tail = nuts.tail + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getid = nuts.getid +local getnext = nuts.getnext +local getprev = nuts.getprev +local getlist = nuts.getlist +local getsubtype = nuts.getsubtype local removables = { [whatsitcodes.open] = true, @@ -41,38 +59,63 @@ local removables = { [whatsitcodes.latelua] = true, } -local function cleanup_redundant(head) +-- About 10% of the nodes make no sense for the backend. By (at least) +-- removing the replace disc nodes, we can omit extensive checking in +-- the finalizer code (e.g. colors in disc nodes). Removing more nodes +-- (like marks) is not saving much and removing empty boxes is even +-- dangerous because we can rely on dimensions (e.g. in references). + +local wipedisc = false -- we can use them in the export ... can be option + +local function cleanup_redundant(head) -- better name is: flatten_page local start = head while start do - local id = start.id + local id = getid(start) if id == disc_code then - head, start = remove_node(head,start,true) - -- elseif id == glue_code then - -- if start.writable then - -- start = start.next - -- elseif some_complex_check_on_glue_spec then - -- head, start = remove_node(head,start,true) - -- else - -- start = start.next - -- end - elseif id == kern_code then - if start.kern == 0 then - head, start = remove_node(head,start,true) + if getsubtype(start) == fulldisc_code then + local replace = getfield(start,"replace") + if replace then + local prev = getprev(start) + local next = getnext(start) + local tail = find_tail(replace) + setfield(start,"replace",nil) + if start == head then + remove_node(head,start,true) + head = replace + else + remove_node(head,start,true) + end + if next then + setfield(tail,"next",next) + setfield(next,"prev",tail) + end + if prev then + setfield(prev,"next",replace) + setfield(replace,"prev",prev) + else + setfield(replace,"prev",nil) -- to be sure + end + start = next + elseif wipedisc then + -- pre and post can have values + head, start = remove_node(head,start,true) + else + start = getnext(start) + end else - start = start.next + start = getnext(start) end - elseif id == mark_code then - head, start = remove_node(head,start,true) elseif id == hlist_code or id == vlist_code then - local sl = start.list + local sl = getlist(start) if sl then - start.list = cleanup_redundant(sl) - start = start.next - else - head, start = remove_node(head,start,true) + local rl = cleanup_redundant(sl) + if rl ~= sl then + setfield(start,"list",rl) + end end + start = getnext(start) else - start = start.next + start = getnext(start) end end return head @@ -81,54 +124,49 @@ end local function cleanup_flushed(head) -- rough local start = head while start do - local id = start.id - if id == whatsit_code and removables[start.subtype] then - head, start = remove_node(head,start,true) + local id = getid(start) + if id == whatsit_code then + if removables[getsubtype(start)] then + head, start = remove_node(head,start,true) + else + start = getnext(start) + end elseif id == hlist_code or id == vlist_code then - local sl = start.list + local sl = getlist(start) if sl then - start.list = cleanup_flushed(sl) - start = start.next - else - head, start = remove_node(head,start,true) + local rl = cleanup_flushed(sl) + if rl ~= sl then + setfield(start,"list",rl) + end end + start = getnext(start) else - start = start.next + start = getnext(start) end end return head end function handlers.cleanuppage(head) - -- about 10% of the nodes make no sense for the backend - return cleanup_redundant(head), true + return tonode(cleanup_redundant(tonut(head))), true end function handlers.cleanupbox(head) - return cleanup_flushed(head), true + return tonode(cleanup_flushed(tonut(head))), true end -directives.register("backend.cleanup", function() - tasks.enableaction("shipouts","nodes.handlers.cleanuppage") -end) - local actions = tasks.actions("shipouts") -- no extra arguments function handlers.finalize(head) -- problem, attr loaded before node, todo ... return actions(head) end -function commands.cleanupbox(n) - cleanup_flushed(texgetbox(n)) -end - -- handlers.finalize = actions -- interface -function commands.finalizebox(n) - actions(texgetbox(n)) -end +implement { name = "cleanupbox", actions = { texgetbox, cleanup_flushed }, arguments = "integer" } +implement { name = "finalizebox", actions = { texgetbox, actions }, arguments = "integer" } -- just in case we want to optimize lookups: @@ -158,12 +196,12 @@ local function count(head,data,subcategory) -- no components, pre, post, replace .. can maybe an option .. but -- we use this for optimization so it makes sense to look the the -- main node only - for n in traverse_nodes(head) do - local id = n.id - local dn = data[nodecodes[n.id]] + for n in traverse_nodes(tonut(head)) do + local id = getid(n) + local dn = data[nodecodes[id]] -- we could use id and then later convert to nodecodes dn[subcategory] = dn[subcategory] + 1 if id == hlist_code or id == vlist_code then - count(n.list,data,subcategory) + count(getfield(n,"list"),data,subcategory) end end end diff --git a/Master/texmf-dist/tex/context/base/node-tex.lua b/Master/texmf-dist/tex/context/base/node-tex.lua index 2170e0603fd..c9d3091df23 100644 --- a/Master/texmf-dist/tex/context/base/node-tex.lua +++ b/Master/texmf-dist/tex/context/base/node-tex.lua @@ -6,33 +6,32 @@ if not modules then modules = { } end modules ['node-tex'] = { license = "see context related readme files" } -local format = string.format +builders = builders or { } +local kernel = builders.kernel or { } +builders.kernel = kernel -builders = builders or { } -builders.kernel = builders.kernel or { } -local kernel = builders.kernel +local hyphenate = lang.hyphenate +local ligaturing = node.ligaturing +local kerning = node.kerning -local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming -local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning +kernel.originals = { + hyphenate = hyphenate, + ligaturing = ligaturing, + kerning = kerning, +} function kernel.hyphenation(head) - -- starttiming(kernel) local done = hyphenate(head) - -- stoptiming(kernel) return head, done end function kernel.ligaturing(head) - -- starttiming(kernel) - local head, tail, done = ligaturing(head) -- todo: check what is returned - -- stoptiming(kernel) + local head, tail, done = ligaturing(head) -- we return 3 values indeed return head, done end function kernel.kerning(head) - -- starttiming(kernel) - local head, tail, done = kerning(head) -- todo: check what is returned - -- stoptiming(kernel) + local head, tail, done = kerning(head) -- we return 3 values indeed return head, done end diff --git a/Master/texmf-dist/tex/context/base/node-tra.lua b/Master/texmf-dist/tex/context/base/node-tra.lua index 08110727705..a7ab7f77f72 100644 --- a/Master/texmf-dist/tex/context/base/node-tra.lua +++ b/Master/texmf-dist/tex/context/base/node-tra.lua @@ -78,6 +78,7 @@ local localpar_code = whatcodes.localpar local dir_code = whatcodes.dir local dimenfactors = number.dimenfactors +local fillorders = nodes.fillcodes local formatters = string.formatters -- this will be reorganized: @@ -171,6 +172,7 @@ local function tosequence(start,stop,compact) end nodes.tosequence = tosequence +nuts .tosequence = tosequence function nodes.report(t,done) report_nodes("output %a, %changed %a, %s nodes",status.output_active,done,count_nodes(tonut(t))) @@ -318,8 +320,12 @@ local function listtoutf(h,joiner,textonly,last) end function nodes.listtoutf(h,joiner,textonly,last) - local joiner = joiner == true and utfchar(0x200C) or joiner -- zwnj - return listtoutf(tonut(h),joiner,textonly,last and tonut(last)) + if h then + local joiner = joiner == true and utfchar(0x200C) or joiner -- zwnj + return listtoutf(tonut(h),joiner,textonly,last and tonut(last)) + else + return "" + end end local what = { [0] = "unknown", "line", "box", "indent", "row", "cell" } @@ -353,82 +359,175 @@ local stripper = lpeg.patterns.stripzeros -- -- redefined: -local dimenfactors = number.dimenfactors +-- local function nodetodimen(d,unit,fmt,strip) +-- d = tonut(d) -- tricky: direct nuts are an issue +-- if unit == true then +-- unit = "pt" +-- fmt = "%0.5f%s" +-- else +-- unit = unit or 'pt' +-- if not fmt then +-- fmt = "%s%s" +-- elseif fmt == true then +-- fmt = "%0.5f%s" +-- end +-- end +-- local id = getid(d) +-- if id == kern_code then +-- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit) +-- return strip and lpegmatch(stripper,str) or str +-- end +-- if id == glue_code then +-- d = getfield(d,"spec") +-- end +-- if not d or not getid(d) == gluespec_code then +-- local str = formatters[fmt](0,unit) +-- return strip and lpegmatch(stripper,str) or str +-- end +-- local width = getfield(d,"width") +-- local plus = getfield(d,"stretch_order") +-- local minus = getfield(d,"shrink_order") +-- local stretch = getfield(d,"stretch") +-- local shrink = getfield(d,"shrink") +-- if plus ~= 0 then +-- plus = " plus " .. stretch/65536 .. fillcodes[plus] +-- elseif stretch ~= 0 then +-- plus = formatters[fmt](stretch*dimenfactors[unit],unit) +-- plus = " plus " .. (strip and lpegmatch(stripper,plus) or plus) +-- else +-- plus = "" +-- end +-- if minus ~= 0 then +-- minus = " minus " .. shrink/65536 .. fillcodes[minus] +-- elseif shrink ~= 0 then +-- minus = formatters[fmt](shrink*dimenfactors[unit],unit) +-- minus = " minus " .. (strip and lpegmatch(stripper,minus) or minus) +-- else +-- minus = "" +-- end +-- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit) +-- return (strip and lpegmatch(stripper,str) or str) .. plus .. minus +-- end +-- +-- local function numbertodimen(d,unit,fmt,strip) +-- if not d then +-- local str = formatters[fmt](0,unit) +-- return strip and lpegmatch(stripper,str) or str +-- end +-- local t = type(d) +-- if t == 'string' then +-- return d +-- elseif t == "number" then +-- if unit == true then +-- unit = "pt" +-- fmt = "%0.5f%s" +-- else +-- unit = unit or 'pt' +-- if not fmt then +-- fmt = "%s%s" +-- elseif fmt == true then +-- fmt = "%0.5f%s" +-- end +-- end +-- local str = formatters[fmt](d*dimenfactors[unit],unit) +-- return strip and lpegmatch(stripper,str) or str +-- else +-- return nodetodimen(d,unit,fmt,strip) -- real node +-- end +-- end -local function nodetodimen(d,unit,fmt,strip) - d = tonut(d) -- tricky: direct nuts are an issue - if unit == true then - unit = "pt" - fmt = "%0.5f%s" - else - unit = unit or 'pt' - if not fmt then - fmt = "%s%s" - elseif fmt == true then - fmt = "%0.5f%s" - end - end - local id = getid(d) +local f_f_f = formatters["%0.5Fpt plus %0.5F%s minus %0.5F%s"] +local f_f_m = formatters["%0.5Fpt plus %0.5F%s minus %0.5Fpt"] +local f_p_f = formatters["%0.5Fpt plus %0.5Fpt minus %0.5F%s"] +local f_p_m = formatters["%0.5Fpt plus %0.5Fpt minus %0.5Fpt"] +local f_f_z = formatters["%0.5Fpt plus %0.5F%s"] +local f_p_z = formatters["%0.5Fpt plus %0.5Fpt"] +local f_z_f = formatters["%0.5Fpt minus %0.5F%s"] +local f_z_m = formatters["%0.5Fpt minus %0.5Fpt"] +local f_z_z = formatters["%0.5Fpt"] + +local tonut = nodes.tonut +local getfield = nodes.nuts.getfield + +local function nodetodimen(n) + n = tonut(n) + local id = getid(n) if id == kern_code then - local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit) - return strip and lpegmatch(stripper,str) or str + local width = getfield(n,"width") + if width == 0 then + return "0pt" + else + return f_z_z(width) + end end if id == glue_code then - d = getfield(d,"spec") + n = getfield(n,"spec") end - if not d or not getid(d) == gluespec_code then - local str = formatters[fmt](0,unit) - return strip and lpegmatch(stripper,str) or str + if not n or not getid(n) == gluespec_code then + return "0pt" end - local width = getfield(d,"width") - local plus = getfield(d,"stretch_order") - local minus = getfield(d,"shrink_order") - local stretch = getfield(d,"stretch") - local shrink = getfield(d,"shrink") - if plus ~= 0 then - plus = " plus " .. stretch/65536 .. fillcodes[plus] + local stretch_order = getfield(n,"stretch_order") + local shrink_order = getfield(n,"shrink_order") + local stretch = getfield(n,"stretch") / 65536 + local shrink = getfield(n,"shrink") / 65536 + local width = getfield(n,"width") / 65536 + if stretch_order ~= 0 then + if shrink_order ~= 0 then + return f_f_f(width,stretch,fillorders[stretch_order],shrink,fillorders[shrink_order]) + elseif shrink ~= 0 then + return f_f_m(width,stretch,fillorders[stretch_order],shrink) + else + return f_f_z(width,stretch,fillorders[stretch_order]) + end + elseif shrink_order ~= 0 then + if stretch ~= 0 then + return f_p_f(width,stretch,shrink,fillorders[shrink_order]) + else + return f_z_f(width,shrink,fillorders[shrink_order]) + end elseif stretch ~= 0 then - plus = formatters[fmt](stretch*dimenfactors[unit],unit) - plus = " plus " .. (strip and lpegmatch(stripper,plus) or plus) - else - plus = "" - end - if minus ~= 0 then - minus = " minus " .. shrink/65536 .. fillcodes[minus] + if shrink ~= 0 then + return f_p_m(width,stretch,shrink) + else + return f_p_z(width,stretch) + end elseif shrink ~= 0 then - minus = formatters[fmt](shrink*dimenfactors[unit],unit) - minus = " minus " .. (strip and lpegmatch(stripper,minus) or minus) + return f_z_m(width,shrink) + elseif width == 0 then + return "0pt" else - minus = "" + return f_z_z(width) end - local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit) - return (strip and lpegmatch(stripper,str) or str) .. plus .. minus end -local function numbertodimen(d,unit,fmt,strip) - if not d then - local str = formatters[fmt](0,unit) - return strip and lpegmatch(stripper,str) or str - end - local t = type(d) - if t == 'string' then - return d - elseif t == "number" then - if unit == true then - unit = "pt" - fmt = "%0.5f%s" + +-- number.todimen(123) +-- number.todimen(123,"cm") +-- number.todimen(123,false,"%F)) + +local f_pt = formatters["%p"] +local f_un = formatters["%F%s"] + +dimenfactors[""] = dimenfactors.pt + +local function numbertodimen(d,unit,fmt) + if not d or d == 0 then + if not unit or unit == "pt" then + return "0pt" + elseif fmt then + return formatters[fmt](0,unit) else - unit = unit or 'pt' - if not fmt then - fmt = "%s%s" - elseif fmt == true then - fmt = "%0.5f%s" - end + return 0 .. unit + end + elseif fmt then + if not unit then + unit = "pt" end - local str = formatters[fmt](d*dimenfactors[unit],unit) - return strip and lpegmatch(stripper,str) or str + return formatters[fmt](d*dimenfactors[unit],unit) + elseif not unit or unit == "pt" then + return f_pt(d) else - return nodetodimen(d,unit,fmt,strip) -- real node + return f_un(d*dimenfactors[unit],unit) end end @@ -469,7 +568,7 @@ local points = function(n) elseif type(n) == "number" then return lpegmatch(stripper,format("%.5fpt",n*ptfactor)) -- faster than formatter else - return numbertodimen(n,"pt",true,true) -- also deals with nodes + return numbertodimen(n,"pt") -- also deals with nodes end end @@ -479,7 +578,7 @@ local basepoints = function(n) elseif type(n) == "number" then return lpegmatch(stripper,format("%.5fbp",n*bpfactor)) -- faster than formatter else - return numbertodimen(n,"bp",true,true) -- also deals with nodes + return numbertodimen(n,"bp") -- also deals with nodes end end @@ -489,7 +588,7 @@ local pts = function(n) elseif type(n) == "number" then return format("%.5fpt",n*ptfactor) -- faster than formatter else - return numbertodimen(n,"pt",true) -- also deals with nodes + return numbertodimen(n,"pt") -- also deals with nodes end end @@ -506,10 +605,10 @@ number.basepoints = basepoints number.pts = pts number.nopts = nopts -nodes.points = function(n) return numbertodimen(n,"pt",true,true) end -nodes.basepoints = function(n) return numbertodimen(n,"bp",true,true) end -nodes.pts = function(n) return numbertodimen(n,"pt",true) end -nodes.nopts = function(n) return format("%.5f",n*ptfactor) end +nodes.points = function(n) return numbertodimen(n,"pt") end +nodes.basepoints = function(n) return numbertodimen(n,"bp") end +nodes.pts = function(n) return numbertodimen(n,"pt") end +nodes.nopts = function(n) return format("%.5f",n*ptfactor) end local colors = { } tracers.colors = colors diff --git a/Master/texmf-dist/tex/context/base/node-tsk.lua b/Master/texmf-dist/tex/context/base/node-tsk.lua index dfa570b2479..56a4b18ef24 100644 --- a/Master/texmf-dist/tex/context/base/node-tsk.lua +++ b/Master/texmf-dist/tex/context/base/node-tsk.lua @@ -117,6 +117,14 @@ function tasks.disableaction(name,action) end end +function tasks.replaceaction(name,group,oldaction,newaction) + local data = valid(name) + if data then + sequencers.replaceaction(data.list,group,oldaction,newaction) + data.runner = false + end +end + function tasks.setaction(name,action,value) if value then tasks.enableaction(name,action) diff --git a/Master/texmf-dist/tex/context/base/pack-bck.mkvi b/Master/texmf-dist/tex/context/base/pack-bck.mkvi index 72eafd282ee..bb4b72252a2 100644 --- a/Master/texmf-dist/tex/context/base/pack-bck.mkvi +++ b/Master/texmf-dist/tex/context/base/pack-bck.mkvi @@ -32,7 +32,7 @@ %D \starttyping %D \setupbackground %D [backgroundoffset=4pt, -%D background=screen, +%D background=color, %D frame=on, %D framecolor=red, %D leftoffset=2pt] @@ -206,14 +206,9 @@ \c!corner=\v!rectangular, \c!frame=\v!off, \c!depth=\zeropoint, -% \c!color=, -% \c!background=\v!screen, -% \c!backgroundcolor=\backgroundparameter\c!color, -% \c!screen=\defaultbackgroundscreen, -% + % \c!color=, \c!background=\v!color, \c!backgroundcolor=lightgray, -% \c!before=, \c!after=] diff --git a/Master/texmf-dist/tex/context/base/pack-box.mkiv b/Master/texmf-dist/tex/context/base/pack-box.mkiv index f8b36691c75..6e3bab6f498 100644 --- a/Master/texmf-dist/tex/context/base/pack-box.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-box.mkiv @@ -24,10 +24,10 @@ %D which in itself is ok, but can lead to loops due to rounding errors (happened %D in demo-obv). -\definelayer[\v!text-2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] -\definelayer[\v!text-1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] -\definelayer[\v!text+1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] -\definelayer[\v!text+2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight] +\definelayer[\v!text-2][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height] +\definelayer[\v!text-1][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height] +\definelayer[\v!text+1][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height] +\definelayer[\v!text+2][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height] \unexpanded\def\internaltextoverlay#1% will become more generic and installable {\startoverlay % i.e. probably an overlay by itself @@ -436,7 +436,7 @@ \def\pack_ornament_text[#1][#2]% {\bgroup - \doifassignmentelse{#1} + \doifelseassignment{#1} {\letdummyparameter\c!alternative\v!a \getdummyparameters[#1]% \doifelse{\directdummyparameter\c!alternative}\v!a @@ -552,7 +552,7 @@ % \doifelse{\bleedingparameter\c!stretch}\v!yes\donetrue\donefalse % - \xdef\bleedwidth{\dimexpr + \xdef\bleedwidth{\the\dimexpr \ifdone \ifconditional\c_pack_boxes_l \scratchwidth+\MPx\currentbgposition-\MPx\currentpageposition @@ -563,8 +563,9 @@ \fi\fi \else \scratchwidth - \fi+\scratchhoffset}% - \xdef\bleedheight{\dimexpr + \fi+\scratchhoffset + \relax}% + \xdef\bleedheight{\the\dimexpr \ifdone \ifconditional\c_pack_boxes_t \paperheight -\MPy\currentbgposition+\MPy\currentpageposition % not checked @@ -575,7 +576,8 @@ \fi\fi \else \scratchheight - \fi+\scratchvoffset}% + \fi+\scratchvoffset + \relax}% \dowithnextboxcontentcs\pack_boxes_bleed_settings\pack_boxes_bleed_finish\hbox} \def\pack_boxes_bleed_settings @@ -678,7 +680,7 @@ \dowithnextboxcontent {\forgetall \hsize\directdummyparameter\c!width - \normalexpanded{\setupalign[\directdummyparameter\c!align]}% + \usealignparameter\directdummyparameter \dousestyleparameter{\directdummyparameter\c!style}} {\setlayer[#1][#2]{\strut\dousecolorparameter{\directdummyparameter\c!color}\flushnextbox}% maybe expand the color \egroup}% @@ -977,22 +979,43 @@ \box\scratchbox \egroup} -% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]} +% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]} + +% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} + +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}} +% +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[mill]}} +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[mill]}} +% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[mill]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[mill]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[mill]}} +% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[mill]}} \unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize {\bgroup \forgetall - \dowithnextbox{\pack_boxes_background_image{#1}{#2}{#3}}\hbox} + \scratchcounter#1\relax + \scratchwidth #2\relax + \scratchheight #3\relax + \dowithnextboxcs\pack_boxes_background_image\hbox} -\def\pack_boxes_background_image#1#2#3% +\def\pack_boxes_background_image {\offinterlineskip - \ifcase#1\relax + \ifcase\scratchcounter % just one \else - \scratchdimen#2\divide\scratchdimen\wd\nextbox\scratchnx\scratchdimen\advance\scratchnx\plusone\relax - \scratchdimen#3\divide\scratchdimen\ht\nextbox\scratchny\scratchdimen\advance\scratchny\plusone\relax + \scratchdimen\scratchwidth \divide\scratchdimen\wd\nextbox\scratchnx\scratchdimen\advance\scratchnx\plusone\relax + \scratchdimen\scratchheight\divide\scratchdimen\ht\nextbox\scratchny\scratchdimen\advance\scratchny\plusone\relax % to be considered: methods - \ifcase#1% + \ifcase\scratchcounter \or % x and y \setbox\nextbox\hbox{\dorecurse\scratchnx{\copy\nextbox}}% \setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}% @@ -1002,13 +1025,59 @@ \setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}% \fi \fi - \ifdim\wd\nextbox>#2\relax - \setbox\nextbox\hbox to #2{\hss\box\nextbox\hss}% - \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=#2,\c!height=\the\ht\nextbox]{\box\nextbox}}}% + \ifdim\wd\nextbox>\scratchwidth + \setbox\nextbox\hbox to \scratchwidth{\hss\box\nextbox\hss}% + \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\scratchwidth,\c!height=\the\ht\nextbox]{\box\nextbox}}}% + \fi + \ifdim\ht\nextbox>\scratchheight + \setbox\nextbox\vbox to \scratchheight{\vss\box\nextbox\vss}% + \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=\the\scratchheight]{\box\nextbox}}}% + \fi + \box\nextbox + \egroup} + +\unexpanded\def\backgroundimagefill#1#2#3% repeat hsize vsize + {\bgroup + \forgetall + \scratchcounter#1\relax + \scratchwidth #2\relax + \scratchheight #3\relax + \dowithnextboxcs\pack_boxes_background_image_fill\hbox} + +\def\pack_boxes_background_image_fill + {\offinterlineskip + \setbox\nextbox\hbox\bgroup + \ifdim\scratchwidth>\scratchheight + \scale[\c!width=\the\scratchwidth]{\box\nextbox}% + \else + \scale[\c!height=\the\scratchheight]{\box\nextbox}% + \fi + \egroup + \ifdim\wd\nextbox>\scratchwidth + \setbox\nextbox\hbox to \scratchwidth + {\ifcase\scratchcounter + \hss\box\nextbox\hss + \or + \box\nextbox\hss + \or + \hss\box\nextbox + \else + \hss\box\nextbox\hss + \fi}% + \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\scratchwidth,\c!height=\the\ht\nextbox]{\box\nextbox}}}% \fi - \ifdim\ht\nextbox>#3\relax - \setbox\nextbox\vbox to #3{\vss\box\nextbox\vss}% - \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=#3]{\box\nextbox}}}% + \ifdim\ht\nextbox>\scratchheight + \setbox\nextbox\vbox to \scratchheight + {\ifcase\scratchcounter + \vss\box\nextbox\vss + \or + \box\nextbox\vss + \or + \vss\box\nextbox + \else + \vss\box\nextbox\vss + \fi}% + \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=\the\scratchheight]{\box\nextbox}}}% \fi \box\nextbox \egroup} diff --git a/Master/texmf-dist/tex/context/base/pack-com.mkiv b/Master/texmf-dist/tex/context/base/pack-com.mkiv index 4ca77af1c45..b734d602858 100644 --- a/Master/texmf-dist/tex/context/base/pack-com.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-com.mkiv @@ -178,7 +178,7 @@ \unexpanded\def\pack_common_caption_stop {\removeunwantedspaces\egroup} \unexpanded\def\stopcombination - {\bgroup\normalexpanded{\egroup{}\ctxcommand{ntimes("{}{}",\number\c_pack_combinations_n)}}% brr + {\bgroup\normalexpanded{\egroup{}\ntimes{{}{}}\c_pack_combinations_n}% brr \dostoptagged \egroup \egroup} @@ -191,19 +191,19 @@ \edef\currentcombination{#1}% \edef\currentcombinationspec{#2}% \ifx\currentcombinationspec\empty - \doifassignmentelse{#1}% + \doifelseassignment{#1}% {\let\currentcombination\empty \setupcurrentcombination[#1]% \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}} - {\doifinstringelse{*}\currentcombination + {\doifelseinstring{*}\currentcombination {\edef\currentcombinationspec{\currentcombination*\plusone*}% \let\currentcombination\empty} - {\doifnumberelse\currentcombination + {\doifelsenumber\currentcombination {\edef\currentcombinationspec{\currentcombination*\plusone*}% \let\currentcombination\empty} {\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}}}% \else - \doifassignmentelse{#2}% + \doifelseassignment{#2}% {\setupcurrentcombination[#2]% \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}} {\edef\currentcombinationspec{\currentcombinationspec*\plusone*}}% @@ -221,13 +221,12 @@ \edef\p_height {\combinationparameter\c!height}% \edef\p_width {\combinationparameter\c!width}% \edef\p_location{\combinationparameter\c!location}% - \edef\p_align {\combinationparameter\c!align}% \edef\p_distance{\combinationparameter\c!distance}% % \pack_combinations_location_reset \rawprocesscommacommand[\p_location]\pack_combinations_location_step % - \dostarttagged\t!combination\currentcombination + \dostarttaggedchained\t!combination\currentcombination\??combination \vbox \ifx\p_height\v!fit\else to \p_height \fi \bgroup \let\combination\empty % permits \combination{}{} handy for cld \normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}} @@ -295,7 +294,7 @@ \def\pack_combinations_alternative_label_indeed {\dowithnextboxcs\pack_combinations_pickup_caption\vtop\bgroup \hsize\wd\b_pack_combinations_content - \ifx\p_align\empty\else\setupalign[\p_align]\fi + \usealignparameter\combinationparameter \usecombinationstyleandcolor\c!style\c!color \begstrut \normalexpanded{\strc_labels_command{\v!combination\ifx\currentcombination\empty\else:\currentcombination\fi}}% @@ -324,15 +323,18 @@ \def\pack_combinations_caption_second {\ifx\nexttoken\egroup % the caption is empty + \else\ifx\nexttoken\stopcaption + % the caption is empty (new per 2014-05-24) \else + % todo: \p_pack_combinations_alternative\v!none: no style, strut etc \hsize\wd\b_pack_combinations_content - \ifx\p_align\empty\else\setupalign[\p_align]\fi + \usealignparameter\combinationparameter \usecombinationstyleandcolor\c!style\c!color \bgroup \aftergroup\endstrut \aftergroup\egroup \begstrut - \fi} + \fi\fi} \def\pack_combinations_pickup_package_pair % we need to store the caption row {\vbox @@ -626,12 +628,12 @@ \unexpanded\def\placepairedbox[#1]% {\bgroup \edef\currentpairedbox{#1}% - \doifnextoptionalcselse\pack_pairedboxes_place\pack_pairedboxes_place_indeed} + \doifelsenextoptionalcs\pack_pairedboxes_place\pack_pairedboxes_place_indeed} \unexpanded\def\startplacepairedbox[#1]% {\bgroup \edef\currentpairedbox{#1}% - \doifnextoptionalcselse\pack_pairedboxes_place\pack_pairedboxes_place_indeed} + \doifelsenextoptionalcs\pack_pairedboxes_place\pack_pairedboxes_place_indeed} \unexpanded\def\stopplacepairedbox {} @@ -780,7 +782,7 @@ \fi} \def\pack_pairedboxes_between - {\switchtobodyfont[\pairedboxparameter\c!bodyfont]% split under same regime + {\usebodyfontparameter\pairedboxparameter \setbox\b_pack_pairedboxes_first\box\nextbox \ifconditional\c_pack_pairedboxes_horizontal \pack_pairedboxes_between_horizontal diff --git a/Master/texmf-dist/tex/context/base/pack-fen.mkiv b/Master/texmf-dist/tex/context/base/pack-fen.mkiv index 4253eeaa76c..04a36fa462c 100644 --- a/Master/texmf-dist/tex/context/base/pack-fen.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-fen.mkiv @@ -50,12 +50,12 @@ \else \def\setinstalledframedimensions - {\edef\overlaywidth {\the\frameddimenwd\space}% - \edef\overlayheight {\the\dimexpr\frameddimenht+\frameddimendp\relax\space}% - \edef\overlaydepth {\the\frameddimendp\space}% + {\d_overlay_width \frameddimenwd + \d_overlay_height \dimexpr\frameddimenht+\frameddimendp\relax + \d_overlay_depth \frameddimendp + \d_overlay_linewidth \ruledlinewidth \edef\overlaycolor {\framedparameter\c!backgroundcolor}% - \edef\overlaylinecolor{\framedparameter\c!framecolor}% - \edef\overlaylinewidth{\the\ruledlinewidth}} + \edef\overlaylinecolor{\framedparameter\c!framecolor}} \fi @@ -63,7 +63,7 @@ \def\whateverleftframe#1% {\setinstalledframedimensions - \setbox\b_framed_rendered\vbox to \overlayheight{\vss#1\vss}% + \setbox\b_framed_rendered\vbox to \d_overlay_height{\vss#1\vss}% \setbox\b_framed_rendered\hbox to \zeropoint{\box\b_framed_rendered\hss}% \ht\b_framed_rendered\zeropoint \dp\b_framed_rendered\zeropoint @@ -71,7 +71,7 @@ \def\whateverrightframe#1% {\setinstalledframedimensions - \setbox\b_framed_rendered\vbox to \overlayheight{\vss#1\vss}% + \setbox\b_framed_rendered\vbox to \d_overlay_height{\vss#1\vss}% \setbox\b_framed_rendered\hbox to \zeropoint{\hss\box\b_framed_rendered}% \ht\b_framed_rendered\zeropoint \dp\b_framed_rendered\zeropoint @@ -79,7 +79,7 @@ \def\whatevertopframe#1% {\setinstalledframedimensions - \setbox\b_framed_rendered\hbox to \overlaywidth{\hss#1\hss}% + \setbox\b_framed_rendered\hbox to \d_overlay_width{\hss#1\hss}% \setbox\b_framed_rendered\vbox to \zeropoint{\box\b_framed_rendered\vss}% \ht\b_framed_rendered\zeropoint \dp\b_framed_rendered\zeropoint @@ -88,7 +88,7 @@ \def\whateverbottomframe#1% {\setinstalledframedimensions - \setbox\b_framed_rendered\hbox to \overlaywidth{\hss#1\hss}% + \setbox\b_framed_rendered\hbox to \d_overlay_width{\hss#1\hss}% \setbox\b_framed_rendered\vbox to \zeropoint{\vss\box\b_framed_rendered}% \ht\b_framed_rendered\zeropoint \dp\b_framed_rendered\zeropoint diff --git a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv index a891c998d4a..a847dec67be 100644 --- a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv @@ -101,9 +101,6 @@ \def\layeranchor{\currentlayer:\the\realpageno} -\unexpanded\def\anch_mark_anchor_box#1% - {\ctxcommand{markregionbox(\number#1,"\layeranchor")}} % needs an hbox - \let\p_pack_layers_doublesided\empty \let\p_pack_layers_state \empty \let\p_pack_layers_option \empty @@ -229,7 +226,7 @@ \else\ifthirdargument \pack_layers_set_indeed[#1][#2][#3]% \else - \doifassignmentelse{#2} + \doifelseassignment{#2} {\pack_layers_set_indeed[#1][][#2]}% {\pack_layers_set_indeed[#1][#2][]}% \fi\fi} @@ -323,7 +320,7 @@ {\dodoubleargument\pack_layers_define_preset} \def\pack_layers_define_preset[#1][#2]% - {\doifassignmentelse{#2} + {\doifelseassignment{#2} {\setvalue{\??layerpreset#1}{\setupcurrentlayer[#2]}} {\setvalue{\??layerpreset#1}{\csname\??layerpreset#2\endcsname}}} @@ -510,6 +507,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doiflayerdataelse\doifelselayerdata + %D \macros %D {flushlayer} %D @@ -610,7 +609,7 @@ % {\setlayoutcomponentattribute{\v!layer:#2}}% % \resetlayoutcomponentattribute % \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \overlayheight \fi \layoutcomponentboxattribute -% {\hbox \ifx\p_pack_layers_method\v!overlay to \overlaywidth \fi +% {\hbox \ifx\p_pack_layers_method\v!overlay to \d_overlay_width \fi % {\edef\currentlayer{#2\the\realpageno}% local % \edef\p_pack_layers_position{\layerparameter\c!position}% local % \ifx\p_pack_layers_position\v!yes @@ -669,15 +668,15 @@ \pack_layers_positioned_box_nop \fi % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset) - \doifoverlayelse{#2}% + \doifelseoverlay{#2}% {\setlayoutcomponentattribute{\v!layer:#2}}% \resetlayoutcomponentattribute % we have conflicting demands: some mechanisms want ll anchoring .. I need to figure this out % an dmaybe we will have 'origin=bottom' or so \setbox\nextbox - \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \overlayheight \fi \layoutcomponentboxattribute + \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \d_overlay_height \fi \layoutcomponentboxattribute {\pack_layers_top_fill - \hbox \ifx\p_pack_layers_method\v!overlay to \overlaywidth \fi + \hbox \ifx\p_pack_layers_method\v!overlay to \d_overlay_width \fi {\box\nextbox \hss}% \pack_layers_bottom_fill}% @@ -687,7 +686,7 @@ \ifx\p_pack_layers_position\v!yes \edef\p_pack_layers_region{\layerparameter\c!region}% \ifx\p_pack_layers_region\empty \else - \anch_mark_anchor_box\nextbox + \anch_mark_tagged_box\nextbox\layeranchor \fi \fi \box\nextbox @@ -724,12 +723,20 @@ \unexpanded\def\composedlayer#1{\flushlayer[#1]} +% \unexpanded\def\tightlayer[#1]% +% {\hbox +% {\def\currentlayer{#1}% todo: left/right +% \setbox\nextbox\emptybox +% \hsize\layerparameter\c!width +% \vsize\layerparameter\c!height +% \composedlayer{#1}}} + \unexpanded\def\tightlayer[#1]% {\hbox {\def\currentlayer{#1}% todo: left/right - \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox - \hsize\layerparameter\c!width % \overlaywidth = \hsize - \vsize\layerparameter\c!height % \overlaywheight = \vsize + \setbox\nextbox\emptybox + \d_overlay_width \layerparameter\c!width + \d_overlay_height\layerparameter\c!height \composedlayer{#1}}} \let\placelayer\flushlayer diff --git a/Master/texmf-dist/tex/context/base/pack-mis.mkvi b/Master/texmf-dist/tex/context/base/pack-mis.mkvi index 38fcc18e419..420f9440a2f 100644 --- a/Master/texmf-dist/tex/context/base/pack-mis.mkvi +++ b/Master/texmf-dist/tex/context/base/pack-mis.mkvi @@ -46,7 +46,7 @@ \unexpanded\def\pack_placement#tag% {\bgroup \edef\currentplacement{#tag}% - \doifnextoptionalcselse\pack_placement_yes\pack_placement_nop} + \doifelsenextoptionalcs\pack_placement_yes\pack_placement_nop} \def\pack_placement_yes[#settings]% {\setupcurrentplacement[#settings]% @@ -67,6 +67,7 @@ %\ifinsidefloat \else % \page_backgrounds_add_local_to_box\nextbox %\fi +\flushnotes % new per 2014-05-29 : todo: move them up in the mvl \ifgridsnapping \pack_placement_flush_grid_yes \else diff --git a/Master/texmf-dist/tex/context/base/pack-mrl.mkiv b/Master/texmf-dist/tex/context/base/pack-mrl.mkiv index c0097cb5fa5..a97c9e6f8c8 100644 --- a/Master/texmf-dist/tex/context/base/pack-mrl.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-mrl.mkiv @@ -40,7 +40,7 @@ \unexpanded\def\blackrule {\hbox\bgroup - \doifnextoptionalcselse\pack_black_rule_pickup\pack_black_rule_indeed} + \doifelsenextoptionalcs\pack_black_rule_pickup\pack_black_rule_indeed} \def\pack_black_rule_pickup[#1]% {\setupcurrentblackrules[#1]% @@ -96,7 +96,7 @@ \unexpanded\def\blackrules % probably never used {\hbox\bgroup - \doifnextoptionalcselse\pack_black_rules_pickup\pack_black_rules_indeed} + \doifelsenextoptionalcs\pack_black_rules_pickup\pack_black_rules_indeed} \def\pack_black_rules_pickup[#1]% {\setupcurrentblackrules[#1]% @@ -145,7 +145,8 @@ %D \showsetup{hl} \unexpanded\def\pack_rule_vl_indeed#1#2#3% - {\bgroup + {\dontleavehmode + \begingroup \setbox\scratchbox\hbox {\vrule \s!width #1\linewidth @@ -154,13 +155,14 @@ \dp\scratchbox\strutdp \ht\scratchbox\strutht \box\scratchbox - \egroup} + \endgroup} \def\pack_rule_vl[#1]% {\pack_rule_vl_indeed{#1}{#1}{#1}} \def\pack_rule_hl[#1]% - {\hbox + {\dontleavehmode + \hbox {\vrule \s!width #1\emwidth \s!height\linewidth @@ -629,7 +631,7 @@ \def\pack_textrule_nop_indeed{\csname\??textrulealternatives\v!middle\endcsname}% \csname\??textrulealternatives\v!top\endcsname{#1}% \bgroup - \doifsomething{\directtextrulesparameter\c!bodyfont}{\switchtobodyfont[\directtextrulesparameter\c!bodyfont]}} + \usebodyfontparameter\directtextrulesparameter} \unexpanded\def\stoptextrule {\par diff --git a/Master/texmf-dist/tex/context/base/pack-obj.lua b/Master/texmf-dist/tex/context/base/pack-obj.lua index 70876a34688..d1cc5bafc67 100644 --- a/Master/texmf-dist/tex/context/base/pack-obj.lua +++ b/Master/texmf-dist/tex/context/base/pack-obj.lua @@ -11,19 +11,21 @@ if not modules then modules = { } end modules ['pack-obj'] = { reusable components.

--ldx]]-- -local commands, context = commands, context +local context = context -local allocate = utilities.storage.allocate +local implement = interfaces.implement -local collected = allocate() -local tobesaved = allocate() +local allocate = utilities.storage.allocate -local jobobjects = { +local collected = allocate() +local tobesaved = allocate() + +local jobobjects = { collected = collected, tobesaved = tobesaved, } -job.objects = jobobjects +job.objects = jobobjects local function initializer() collected = jobobjects.collected @@ -32,45 +34,60 @@ end job.register('job.objects.collected', tobesaved, initializer, nil) -function jobobjects.save(tag,number,page) +local function saveobject(tag,number,page) local t = { number, page } tobesaved[tag], collected[tag] = t, t end -function jobobjects.set(tag,number,page) +local function setobject(tag,number,page) collected[tag] = { number, page } end -function jobobjects.get(tag) +local function getobject(tag) return collected[tag] or tobesaved[tag] end -function jobobjects.number(tag,default) +local function getobjectnumber(tag,default) local o = collected[tag] or tobesaved[tag] return o and o[1] or default end -function jobobjects.page(tag,default) +local function getobjectpage(tag,default) local o = collected[tag] or tobesaved[tag] return o and o[2] or default end --- interface +jobobjects.save = saveobject +jobobjects.set = setobject +jobobjects.get = getobject +jobobjects.number = getobjectnumber +jobobjects.page = getobjectpage -commands.saveobject = jobobjects.save -commands.setobject = jobobjects.set +implement { + name = "saveobject", + actions = saveobject +} -function commands.objectnumber(tag,default) - local o = collected[tag] or tobesaved[tag] - context(o and o[1] or default) -end +implement { + name = "setobject", + actions = setobject, + arguments = { "string", "integer", "integer" } +} -function commands.objectpage(tag,default) - local o = collected[tag] or tobesaved[tag] - context(o and o[2] or default) -end +implement { + name = "objectnumber", + actions = { getobjectnumber, context }, + arguments = { "string", "string" }, +} -function commands.doifobjectreferencefoundelse(tag) - commands.doifelse(collected[tag] or tobesaved[tag]) -end +implement { + name = "objectpage", + actions = { getobjectpage, context }, + arguments = { "string", "string" }, +} +implement { + name = "doifelseobjectreferencefound", + actions = { jobobjects.get, commands.doifelse }, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/pack-obj.mkiv b/Master/texmf-dist/tex/context/base/pack-obj.mkiv index 356a0b7ebf8..605dd3b9e5a 100644 --- a/Master/texmf-dist/tex/context/base/pack-obj.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-obj.mkiv @@ -366,7 +366,7 @@ % no undefined test ! ! ! ! (pdftex fails on undefined objects) \unexpanded\def\pack_objects_register_reference#1#2#3{\normalexpanded{\noexpand\ctxlatecommand{saveobject("#1::#2",#3,\noexpand\the\realpageno)}}} -\unexpanded\def\pack_objects_overload_reference#1#2#3{\ctxcommand{setobject("#1::#2",#3,\the\realpageno)}} +\unexpanded\def\pack_objects_overload_reference#1#2#3{\clf_setobject{#1::#2}#3 \realpageno\relax} \unexpanded\def\dosetobjectreference {\ifcase\crossreferenceobject @@ -382,8 +382,8 @@ \def\defaultobjectreference#1#2{0} % driver dependent \def\defaultobjectpage #1#2{\realfolio} -\unexpanded\def\dogetobjectreference #1#2#3{\xdef#3{\ctxcommand{objectnumber("#1::#2","\defaultobjectreference{#1}{#2}")}}} -\unexpanded\def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxcommand{objectpage("#1::#2","\defaultobjectpage{#1}{#2}")}}} +\unexpanded\def\dogetobjectreference #1#2#3{\xdef#3{\clf_objectnumber{#1::#2}{\defaultobjectreference{#1}{#2}}}} +\unexpanded\def\dogetobjectreferencepage#1#2#3{\xdef#3{\clf_objectpage {#1::#2}{\defaultobjectpage {#1}{#2}}}} \unexpanded\def\setobject {\driverreferenced\pack_objects_set1} \unexpanded\def\settightobject{\driverreferenced\pack_objects_set0} @@ -399,14 +399,17 @@ %D \doifobjectreferencefoundelse{class}{object}{do then}{do else} %D \stoptyping -\unexpanded\def\doifobjectfoundelse#1#2% +\unexpanded\def\doifelseobjectfound#1#2% {\ifcsname\??objects#1::#2\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} -\unexpanded\def\doifobjectreferencefoundelse#1#2% - {\ctxcommand{doifobjectreferencefoundelse("#1::#2")}} +\unexpanded\def\doifelseobjectreferencefound#1#2% + {\clf_doifelseobjectreferencefound{#1::#2}} + +\let\doifobjectfoundelse \doifelseobjectfound +\let\doifobjectreferencefoundelse\doifelseobjectreferencefound \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/pack-pos.mkiv b/Master/texmf-dist/tex/context/base/pack-pos.mkiv index f92ceb78ab2..c52c01ca4b9 100644 --- a/Master/texmf-dist/tex/context/base/pack-pos.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-pos.mkiv @@ -62,7 +62,7 @@ \edef\currentpositioning{#1}% \setupcurrentpositioning[#2]% \else\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\let\currentpositioning\empty \setupcurrentpositioning[#1]}% {\edef\currentpositioning{#1}}% diff --git a/Master/texmf-dist/tex/context/base/pack-rul.lua b/Master/texmf-dist/tex/context/base/pack-rul.lua index 0c29eb5f1dd..151642c3a1b 100644 --- a/Master/texmf-dist/tex/context/base/pack-rul.lua +++ b/Master/texmf-dist/tex/context/base/pack-rul.lua @@ -14,6 +14,12 @@ if not modules then modules = { } end modules ['pack-rul'] = { -- challenge: adapt glue_set -- setfield(h,"glue_set", getfield(h,"glue_set") * getfield(h,"width")/maxwidth -- interesting ... doesn't matter much +-- \framed[align={lohi,middle}]{$x$} +-- \framed[align={lohi,middle}]{$ $} +-- \framed[align={lohi,middle}]{\hbox{ }} +-- \framed[align={lohi,middle}]{\hbox{}} +-- \framed[align={lohi,middle}]{$\hskip2pt$} + local type = type local hlist_code = nodes.nodecodes.hlist @@ -24,6 +30,8 @@ local line_code = nodes.listcodes.line local texsetdimen = tex.setdimen local texsetcount = tex.setcount +local implement = interfaces.implement + local nuts = nodes.nuts local getfield = nuts.getfield @@ -39,7 +47,7 @@ local hpack = nuts.hpack local traverse_id = nuts.traverse_id local node_dimensions = nuts.dimensions -function commands.doreshapeframedbox(n) +local function doreshapeframedbox(n) local box = getbox(n) local noflines = 0 local firstheight = nil @@ -91,7 +99,7 @@ function commands.doreshapeframedbox(n) -- vdone = true end if not firstheight then - -- done + -- done) elseif maxwidth ~= 0 then if hdone then for h in traverse_id(hlist_code,list) do @@ -117,6 +125,8 @@ function commands.doreshapeframedbox(n) -- end setfield(box,"width",maxwidth) averagewidth = noflines > 0 and totalwidth/noflines or 0 + else -- e.g. empty math {$ $} or \hbox{} or ... +setfield(box,"width",0) end end end @@ -128,7 +138,7 @@ function commands.doreshapeframedbox(n) texsetdimen("global","framedaveragewidth",averagewidth) end -function commands.doanalyzeframedbox(n) +local function doanalyzeframedbox(n) local box = getbox(n) local noflines = 0 local firstheight = nil @@ -156,6 +166,8 @@ function commands.doanalyzeframedbox(n) texsetdimen("global","framedlastdepth",lastdepth or 0) end +implement { name = "doreshapeframedbox", actions = doreshapeframedbox, arguments = "integer" } +implement { name = "doanalyzeframedbox", actions = doanalyzeframedbox, arguments = "integer" } function nodes.maxboxwidth(box) local boxwidth = getfield(box,"width") diff --git a/Master/texmf-dist/tex/context/base/pack-rul.mkiv b/Master/texmf-dist/tex/context/base/pack-rul.mkiv index 8fcf8f548d2..141d741cf8d 100644 --- a/Master/texmf-dist/tex/context/base/pack-rul.mkiv +++ b/Master/texmf-dist/tex/context/base/pack-rul.mkiv @@ -43,23 +43,23 @@ \def\pack_framed_setup_line_width[#1]% {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}} -%D \macros -%D {setupscreens} -%D -%D Sort of obsolete: -%D -%D \showsetup{setupscreens} - -\installcorenamespace{screens} - -\installsetuponlycommandhandler \??screens {screens} - -\appendtoks - \edef\defaultbackgroundscreen{\directscreensparameter\c!screen} -\to \everysetupscreens - -\setupscreens - [\c!screen=.90] % was .95 but that's hardly visible +% %D \macros +% %D {setupscreens} +% %D +% %D Sort of obsolete: +% %D +% %D \showsetup{setupscreens} +% +% \installcorenamespace{screens} +% +% \installsetuponlycommandhandler \??screens {screens} +% +% \appendtoks +% \edef\defaultbackgroundscreen{\directscreensparameter\c!screen} +% \to \everysetupscreens +% +% \setupscreens +% [\c!screen=.90] % was .95 but that's hardly visible %D The parameter handler: @@ -155,8 +155,6 @@ %\c!foregroundcolor=, %\c!foregroundstyle=, %\c!background=, - %\c!backgroundscreen=, - \c!backgroundscreen=\defaultbackgroundscreen, %\c!backgroundcolor=, \c!backgroundoffset=\zeropoint, %\c!framecolor=, @@ -238,7 +236,6 @@ \let\p_framed_lines \empty \let\p_framed_empty \empty \let\p_framed_backgroundcolor \empty -\let\p_framed_backgroundscreen\empty \let\p_framed_framecolor \empty \let\p_framed_component \empty \let\p_framed_region \empty @@ -352,14 +349,14 @@ %D The oval box is drawn using a special macro, depending on %D the driver in use. -\def\pack_framed_background_box_gray % avoid black rules when no gray - {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}% - \ifx\p_framed_backgroundscreen\empty \else - \pack_framed_background_box_gray_indeed - \fi} - -\def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility - {\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}} +% \def\pack_framed_background_box_gray % avoid black rules when no gray +% {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}% +% \ifx\p_framed_backgroundscreen\empty \else +% \pack_framed_background_box_gray_indeed +% \fi} +% +% \def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility +% {\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}} %D It won't be a surprise that we not only provide gray boxes, but also colored %D ones. Here it is: @@ -429,14 +426,36 @@ %D %D The resulting box is lowered to the right depth. -\def\overlaywidth {\the\hsize\space} % We preset the variables -\def\overlayheight {\the\vsize\space} % to some reasonable default -\def\overlaydepth {0pt } % values. The attributes -\let\overlayoffset \overlaydepth % of the frame can be (are) -\let\overlaylinewidth \overlaydepth % set somewhere else. +%def\overlaywidth {\the\hsize\space} % We preset the variables +%def\overlayheight {\the\vsize\space} % to some reasonable default +%def\overlaydepth {0pt } % values. The attributes +%let\overlayoffset \overlaydepth % of the frame can be (are) +%let\overlaylinewidth \overlaydepth % set somewhere else. \let\overlaycolor \empty \let\overlaylinecolor \empty +\newdimen\d_overlay_width +\newdimen\d_overlay_height +\newdimen\d_overlay_depth +\newdimen\d_overlay_offset +\newdimen\d_overlay_linewidth + +% expandable ... in a future version the space will go (in my one can use Overlay*) + +\def\overlaywidth {\the\d_overlay_width \space} % We preset the variables +\def\overlayheight {\the\d_overlay_height \space} % to some reasonable default +\def\overlaydepth {\the\d_overlay_depth \space} % values. +\def\overlayoffset {\the\d_overlay_offset \space} % of the frame can be (are) +\def\overlaylinewidth {\the\d_overlay_linewidth\space} % set somewhere else. + +% public but kind of protected + +\def\usedoverlaywidth {\dimexpr\d_overlay_width \relax} +\def\usedoverlayheight {\dimexpr\d_overlay_height \relax} +\def\usedoverlaydepth {\dimexpr\d_overlay_depth \relax} +\def\usedoverlayoffset {\dimexpr\d_overlay_offset \relax} +\def\usedoverlaylinewidth{\dimexpr\d_overlay_linewidth\relax} + %D The next register is used to initialize overlays. \newtoks\everyoverlay @@ -452,8 +471,8 @@ \to \everyoverlay \prependtoks - \hsize\overlaywidth - \vsize\overlayheight + \hsize\d_overlay_width + \vsize\d_overlay_height \to \everyoverlay \unexpanded\def\defineoverlay @@ -475,8 +494,8 @@ \egroup \setlayoutcomponentattribute{\v!overlay:#1}% \setbox\scratchbox\hbox \layoutcomponentboxattribute - {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \overlaywidth - \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \overlayheight ! + {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \d_overlay_width + \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \d_overlay_height ! \box\scratchbox}% \wd\scratchbox\d_framed_target_wd \ht\scratchbox\d_framed_target_ht @@ -490,19 +509,21 @@ \unexpanded\def\overlayfakebox {\hbox {\setbox\scratchbox\emptyhbox - \wd\scratchbox\overlaywidth - \ht\scratchbox\overlayheight + \wd\scratchbox\d_overlay_width + \ht\scratchbox\d_overlay_height \box\scratchbox}} %D For testing we provide: -\def\doifoverlayelse#1% only tests external overlays +\def\doifelseoverlay#1% only tests external overlays {\ifcsname\??overlay#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifoverlayelse\doifelseoverlay + %D The content of the box will be (temporary) saved in a box. We also have an %D extra box for backgrounds. @@ -599,16 +620,28 @@ \hss \egroup}} +% \def\pack_framed_overlay_initialize_indeed +% {\edef\overlaywidth {\the\d_framed_target_wd\space}% +% \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}% +% \edef\overlaydepth {\the\d_framed_target_dp\space}% +% \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ? +% \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers +% \edef\overlaylinewidth{\the\d_framed_linewidth\space}% +% %\edef\overlaycorner {\framedparameter\c!backgroundcorner}% +% %\edef\overlayradius {\framedparameter\c!backgroundradius}% +% \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one +% \let\pack_framed_overlay_initialize\relax} + \def\pack_framed_overlay_initialize_indeed - {\edef\overlaywidth {\the\d_framed_target_wd\space}% - \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}% - \edef\overlaydepth {\the\d_framed_target_dp\space}% + {\d_overlay_width \d_framed_target_wd + \d_overlay_height \dimexpr\d_framed_target_ht+\d_framed_target_dp\relax + \d_overlay_depth \d_framed_target_dp + \d_overlay_linewidth \d_framed_linewidth + \d_overlay_offset \framedbackgroundoffset\relax \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ? \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers - \edef\overlaylinewidth{\the\d_framed_linewidth\space}% %\edef\overlaycorner {\framedparameter\c!backgroundcorner}% %\edef\overlayradius {\framedparameter\c!backgroundradius}% - \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one \let\pack_framed_overlay_initialize\relax} %D One can explictly insert the foreground box. For that purpose we introduce the @@ -778,6 +811,35 @@ \newcount\c_pack_framed_nesting +% to be tested (slightly more efficient): +% +% \unexpanded\def\pack_frame_common % #1 #2 +% {\bgroup +% \advance\c_pack_framed_nesting\plusone +% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed +% \edef\currentframed{>\the\c_pack_framed_nesting}% +% \pack_framed_initialize +% \bgroup +% \doifnextoptionalcselse} % #1 #2 +% +% \unexpanded\def\framed {\pack_frame_common\pack_framed_process_framed_pickup\pack_framed_process_indeed} +% \unexpanded\def\startframed{\pack_frame_common\pack_framed_start_framed_pickup \pack_framed_start_indeed } +% +% \def\pack_framed_process_framed_pickup[#1]% +% {\setupcurrentframed[#1]% +% \pack_framed_process_indeed} +% +% \def\pack_framed_start_framed_pickup[#1]% +% {\setupcurrentframed[#1]% here ! +% \secondargumenttrue % dirty trick +% \pack_framed_start_framed_indeed} +% +% \def\pack_framed_start_framed_indeed +% {\pack_framed_process_indeed +% \bgroup} +% +% no longer .. we also accept \startframed[tag] + \unexpanded\def\pack_framed_process_framed[#1]% {\bgroup \iffirstargument % faster @@ -793,20 +855,63 @@ \pack_framed_initialize \dosingleempty\pack_framed_process_framed} +% \unexpanded\def\startframed +% {\dosingleempty\pack_framed_start_framed} +% +% \def\pack_framed_start_framed[#1]% +% {\bgroup +% \advance\c_pack_framed_nesting\plusone +% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed +% \edef\currentframed{>\the\c_pack_framed_nesting}% +% \pack_framed_initialize +% \bgroup +% \iffirstargument +% \secondargumenttrue % dirty trick +% \setupcurrentframed[#1]% here ! +% \fi +% \pack_framed_process_indeed +% \bgroup +% \ignorespaces} + \unexpanded\def\startframed {\dosingleempty\pack_framed_start_framed} \def\pack_framed_start_framed[#1]% {\bgroup - \advance\c_pack_framed_nesting\plusone + \doifelseassignment{#1}\pack_framed_start_framed_yes\pack_framed_start_framed_nop{#1}} + +\def\pack_framed_start_framed_yes#1% + {\advance\c_pack_framed_nesting\plusone \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed \iffirstargument\secondargumenttrue\fi % dirty trick \edef\currentframed{>\the\c_pack_framed_nesting}% \pack_framed_initialize - \pack_framed_process_framed[#1]% can be inlined - \bgroup} + \bgroup + \iffirstargument + \secondargumenttrue % dirty trick + \setupcurrentframed[#1]% here ! + \fi + \pack_framed_process_indeed + \bgroup + \ignorespaces} + +\def\pack_framed_start_framed_nop#1% + {\edef\currentframed{#1}% + \dosingleempty\pack_framed_start_framed_nop_indeed} + +\def\pack_framed_start_framed_nop_indeed[#1]% + {\pack_framed_initialize + \bgroup + \setupcurrentframed[#1]% here ! + \pack_framed_process_indeed + \bgroup + \ignorespaces} + +% till here -\let\stopframed\egroup +\unexpanded\def\stopframed + {\removeunwantedspaces + \egroup} \unexpanded\def\normalframedwithsettings[#1]% {\bgroup @@ -1304,10 +1409,19 @@ \def\pack_framed_restart {\aftergroup\pack_framed_finish} -\def\pack_framed_do_top {\raggedtopcommand\framedparameter\c!top} -\def\pack_framed_do_bottom{\framedparameter\c!bottom\raggedbottomcommand} +\def\pack_framed_do_top + {\raggedtopcommand + \framedparameter\c!top + \edef\p_blank{\framedparameter\c!blank}% + \ifx\p_blank\v!yes\else % auto or no + \doinhibitblank + \fi} + +\def\pack_framed_do_bottom + {\framedparameter\c!bottom + \raggedbottomcommand} -%D Carefull analysis of this macro will learn us that not all branches in the last +%D Careful analysis of this macro will learn us that not all branches in the last %D conditionals can be encountered, that is, some assignments to \type{\next} will %D never occur. Nevertheless we implement the whole scheme, if not for future %D extensions. @@ -1385,7 +1499,7 @@ \fi} \unexpanded\def\pack_framed_finish - {\pack_framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape) + {%\pack_framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape) .. moved down \pack_framed_locator_before\p_framed_location \ifconditional\c_framed_has_format \ifx\p_framed_autowidth\v!force @@ -1417,6 +1531,7 @@ \ifx\p_framed_empty\v!yes \pack_framed_fake_box \fi + \pack_framed_stop_orientation % moved here at 2014-05-25 \iftrialtypesetting \else \edef\p_framed_region{\framedparameter\c!region}% \ifx\p_framed_region\v!yes % maybe later named @@ -1910,10 +2025,10 @@ %D \stoplinecorrection %D %D \startbuffer -%D \framed[strut=nee,offset=.5cm] {rule based learning} -%D \framed[strut=nee,offset=0cm] {rule based learning} -%D \framed[strut=nee,offset=none] {rule based learning} -%D \framed[strut=nee,offset=overlay]{rule based learning} +%D \framed[strut=no,offset=.5cm] {rule based learning} +%D \framed[strut=no,offset=0cm] {rule based learning} +%D \framed[strut=no,offset=none] {rule based learning} +%D \framed[strut=no,offset=overlay]{rule based learning} %D \stopbuffer %D %D \typebuffer @@ -1923,9 +2038,9 @@ %D \stoplinecorrection %D %D \startbuffer -%D \framed[width=3cm,align=left] {rule\\based\\learning} -%D \framed[width=3cm,align=middle] {rule\\based\\learning} -%D \framed[width=3cm,align=right] {rule\\based\\learning} +%D \framed[width=3cm,align=left] {rule\\based\\learning} +%D \framed[width=3cm,align=middle] {rule\\based\\learning} +%D \framed[width=3cm,align=right] {rule\\based\\learning} %D \framed[width=fit,align=middle] {rule\\based\\learning} %D \stopbuffer %D @@ -1992,7 +2107,6 @@ % \vbox{\hbox{x}} % \stopTEXpage - % \def\pack_framed_forgetall{\forgetall} \def\pack_framed_set_foregroundcolor @@ -2008,7 +2122,7 @@ {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi @@ -2019,7 +2133,7 @@ \raggedcommand \pack_framed_do_top \bgroup -\synchronizeinlinedirection + \synchronizeinlinedirection \localbegstrut \aftergroup\localendstrut \aftergroup\pack_framed_do_bottom @@ -2030,7 +2144,7 @@ {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi @@ -2041,7 +2155,7 @@ \raggedcenter \vss \bgroup -\synchronizeinlinedirection + \synchronizeinlinedirection \localbegstrut \aftergroup\localendstrut \aftergroup\vss @@ -2052,7 +2166,7 @@ {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi @@ -2064,7 +2178,7 @@ \aftergroup\localendstrut \aftergroup\vss \aftergroup\egroup -\synchronizeinlinedirection + \synchronizeinlinedirection \localbegstrut \doformatonelinerbox} @@ -2072,7 +2186,7 @@ {\vbox \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi @@ -2082,7 +2196,7 @@ \raggedcommand \pack_framed_do_top \bgroup -\synchronizeinlinedirection + \synchronizeinlinedirection \localbegstrut \aftergroup\localendstrut \aftergroup\pack_framed_do_bottom @@ -2093,7 +2207,7 @@ {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi @@ -2106,7 +2220,7 @@ \hbox \bgroup \aftergroup\egroup -\synchronizeinlinedirection + \synchronizeinlinedirection \localstrut \doformatonelinerbox} @@ -2114,13 +2228,13 @@ {\hbox to \d_framed_width \bgroup \let\postprocessframebox\relax -% \pack_framed_forgetall + % \pack_framed_forgetall \iftrialtypesetting \else \pack_framed_set_foregroundcolor \fi \pack_framed_do_setups \hss -\synchronizeinlinedirection + \synchronizeinlinedirection \localstrut \bgroup \aftergroup\hss @@ -2135,7 +2249,7 @@ \fi \let\postprocessframebox\relax \pack_framed_do_setups -\synchronizeinlinedirection + \synchronizeinlinedirection \localstrut \doformatonelinerbox} @@ -2215,8 +2329,8 @@ \framedmaxwidth \zeropoint \framedaveragewidth\zeropoint} -\def\pack_framed_reshape_process{\ifvbox\b_framed_normal\ctxcommand{doreshapeframedbox(\number\b_framed_normal)}\fi} -\def\pack_framed_reshape_analyze{\ifvbox\b_framed_normal\ctxcommand{doanalyzeframedbox(\number\b_framed_normal)}\fi} +\def\pack_framed_reshape_process{\ifvbox\b_framed_normal\clf_doreshapeframedbox\b_framed_normal\relax\fi} +\def\pack_framed_reshape_analyze{\ifvbox\b_framed_normal\clf_doanalyzeframedbox\b_framed_normal\relax\fi} % torture test / strange case (much depth) / method 2 needed % @@ -2514,7 +2628,6 @@ %\c!foregroundstyle=, %\c!background=, %\c!backgroundcolor=, - \c!backgroundscreen=\defaultbackgroundscreen, \c!linecorrection=\v!on, \c!depthcorrection=\v!on, \c!margin=\v!standard] @@ -2544,7 +2657,7 @@ \dodoubleempty\pack_framed_text_start_indeed} \def\pack_framed_text_start_indeed[#1][#2]% - {\doifassignmentelse{#1} + {\doifelseassignment{#1} {\pack_framed_text_start_continue\empty{#1}} {\pack_framed_text_start_continue{#1}{#2}}} @@ -2559,7 +2672,7 @@ \startboxedcontent \hsize\localhsize % \insidefloattrue % ? better - \normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}% + \usebodyfontparameter\framedtextparameter \letframedtextparameter\c!strut\v!no \inheritedframedtextframed\bgroup \let\\=\endgraf @@ -2570,9 +2683,9 @@ \else \bgroup \fi -\vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1 + \vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1 \doinhibitblank - \setupindenting[\framedtextparameter\c!indenting]% + \useindentingparameter\framedtextparameter \useframedtextstyleandcolor\c!style\c!color \ignorespaces} @@ -2675,7 +2788,7 @@ \dosingleempty\pack_framed_text_start_direct} \def\pack_framed_text_start_direct[#1]% - {\normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}% + {\usebodyfontparameter\framedtextparameter \letframedtextparameter\c!strut\v!no \iffirstargument \setupcurrentframedtext[#1]% diff --git a/Master/texmf-dist/tex/context/base/page-app.mkiv b/Master/texmf-dist/tex/context/base/page-app.mkiv index e4858d48ffb..2e81f75371f 100644 --- a/Master/texmf-dist/tex/context/base/page-app.mkiv +++ b/Master/texmf-dist/tex/context/base/page-app.mkiv @@ -139,6 +139,9 @@ [TEXpage] [\c!align=\v!normal] % needed, else problems ! +\unexpanded\def\setupTEXpage + {\setupfittingpage[TEXpage]} + %D For Mojca: %D %D \starttyping diff --git a/Master/texmf-dist/tex/context/base/page-bck.mkiv b/Master/texmf-dist/tex/context/base/page-bck.mkiv index 0246e8eb61b..01de48e8cda 100644 --- a/Master/texmf-dist/tex/context/base/page-bck.mkiv +++ b/Master/texmf-dist/tex/context/base/page-bck.mkiv @@ -55,7 +55,7 @@ %D This is the only spot where we hav ea low level dependency on the way %D parent chains are defined but we want the speed. -\def\page_backgrounds_check_background +\unexpanded\def\page_backgrounds_check_background {\ifcsname\??framed\currentotrbackground:\c!background\endcsname \edef\page_background_temp{\csname\??framed\currentotrbackground:\c!background\endcsname}% \ifx\page_background_temp\empty @@ -140,13 +140,15 @@ {\edef\currentotrbackground{\??layoutbackgrounds#1}% \page_backgrounds_check_background} -\def\doifsomebackgroundelse#1% +\def\doifelsesomebackground#1% {\ifcsname\??layoutbackgrounds#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifsomebackgroundelse\doifelsesomebackground + \def\doifsomebackground#1% {\ifcsname\??layoutbackgrounds#1\endcsname \expandafter\firstofoneargument @@ -277,7 +279,7 @@ \page_backgrounds_set_boxes \setbox#1\vbox {\offinterlineskip - \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}% + \doifelsemarginswap{\copy\leftbackground}{\copy\rightbackground}% \box#1}% \fi} @@ -343,7 +345,7 @@ {\dontcomplain \swapmargins \ifconditional\swapbackgroundmargins - \doifmarginswapelse \donothing + \doifelsemarginswap \donothing {\swapmacros\v!rightmargin\v!leftmargin \swapmacros\v!rightedge \v!leftedge}% \fi @@ -501,7 +503,7 @@ \unexpanded\def\page_backgrounds_setup_double[#1][#2][#3]% if needed we can speed this up {\global\settrue\c_page_backgrounds_some \def\page_backgrounds_setup_step##1% - {\doifinsetelse{##1}\v_page_backgrounds_double_set + {\doifelseinset{##1}\v_page_backgrounds_double_set {\page_backgrounds_setup_and_check{##1}{#3}} {\def\page_backgrounds_setup_step_nested####1{\page_backgrounds_setup_and_check{##1####1}{#3}}% \processcommacommand[#2]\page_backgrounds_setup_step_nested}}% @@ -510,7 +512,7 @@ \unexpanded\def\page_backgrounds_setup_single[#1][#2][#3]% {\global\settrue\c_page_backgrounds_some - \doifcommonelse{#1}\v_page_backgrounds_single_set + \doifelsecommon{#1}\v_page_backgrounds_single_set {\def\page_backgrounds_setup_step##1{\page_backgrounds_setup_and_check{##1}{#2}}% \processcommacommand[#1]\page_backgrounds_setup_step \the\everybackgroundssetup}% @@ -607,6 +609,48 @@ \setfalse\c_page_backgrounds_some +%D Sometimes you have a document wide (page) background but need to overload it +%D locally. In such case (at least in my experience) the only values that get set +%D are the background and backgroundcolor (if set at all). A full inheritance chain +%D would complicate things because then we need to use named backgrounds which in +%D turn will make this mechanism slower. I considered independent local backgrounds +%D but that also complicates the code (not that much) but isolation means that we +%D need to set more parameters each time. The following simple approach proabbly +%D suits most usage. +%D +%D \starttyping +%D \starttext +%D \setupbackgrounds[page][background=color,backgroundcolor=red] +%D \input tufte \page +%D \setupbackgrounds[page][background=,backgroundcolor=] +%D \input tufte \page +%D \setupbackgrounds[page][background=color,backgroundcolor=red] +%D \input tufte \page +%D \pushbackground[page] +%D \setupbackgrounds[page][background=color,backgroundcolor=green] +%D \input tufte \page +%D \popbackground +%D \input tufte \page +%D \stoptext +%D \stoptyping + +\unexpanded\def\pushbackground[#1]% + {\pushmacro\popbackground + \edef\currentotrbackground{\??layoutbackgrounds#1}% + \unexpanded\edef\popbackground + {\setupframed + [\currentotrbackground] + [\c!background=\namedframedparameter{\currentotrbackground}\c!background, + \c!backgroundcolor=\namedframedparameter{\currentotrbackground}\c!backgroundcolor]% + \page_backgrounds_check_background + \popmacro\popbackground}% + \setupframed + [\currentotrbackground] + [\c!background=,\c!backgroundcolor=]% + \page_backgrounds_check_background} + +\let\popbackground\relax + \protect \endinput % %D The next series is used in local (for instance floating) backgrounds. diff --git a/Master/texmf-dist/tex/context/base/page-brk.mkiv b/Master/texmf-dist/tex/context/base/page-brk.mkiv index 11dc04bfda5..f9c93305293 100644 --- a/Master/texmf-dist/tex/context/base/page-brk.mkiv +++ b/Master/texmf-dist/tex/context/base/page-brk.mkiv @@ -112,13 +112,13 @@ \endgroup \fi} -\def\resetpagebreak % used elsewhere too +\unexpanded\def\resetpagebreak % used elsewhere too {\global\settrue\c_page_breaks_enabled} -\def\simplifypagebreak % to be used grouped ! +\unexpanded\def\simplifypagebreak % to be used grouped ! {\def\page_breaks_process[##1]{\goodbreak}} -\def\disablepagebreaks % to be used grouped ! +\unexpanded\def\disablepagebreaks % to be used grouped ! {\def\page_breaks_process[##1]{}} \installpagebreakmethod \s!dummy @@ -134,11 +134,11 @@ \endgroup} \installpagebreakmethod \s!unknown - {\doifinstringelse{+}\page_breaks_current_option + {\doifelseinstring{+}\page_breaks_current_option {\page_otr_flush_all_floats \page_otr_command_next_page \dorecurse\page_breaks_current_option\page_otr_insert_dummy_page} - {\doifnumberelse\page_breaks_current_option + {\doifelsenumber\page_breaks_current_option {\page_otr_flush_all_floats \page_otr_command_next_page \doloop @@ -178,6 +178,8 @@ \global\pageornamentstate\plusone \fi} +% also needed: \page \doifoddpageelse\relax{\page[\v!blank,\v!right] + \installpagebreakmethod \v!no {\ifconditional\c_page_breaks_enabled \dosomebreak\nobreak @@ -220,11 +222,11 @@ \installpagebreakmethod \v!even {\page - \doifoddpageelse\page_reset_marks_and_insert_dummy\donothing} + \doifelseoddpage\page_reset_marks_and_insert_dummy\donothing} \installpagebreakmethod \v!odd {\page - \doifoddpageelse\donothing\page_reset_marks_and_insert_dummy} + \doifelseoddpage\donothing\page_reset_marks_and_insert_dummy} \installpagebreakmethod \v!quadruple % not yet ok inside columnsets {\ifdoublesided diff --git a/Master/texmf-dist/tex/context/base/page-flt.lua b/Master/texmf-dist/tex/context/base/page-flt.lua index 7b1afc55cf3..e91285d0a64 100644 --- a/Master/texmf-dist/tex/context/base/page-flt.lua +++ b/Master/texmf-dist/tex/context/base/page-flt.lua @@ -242,10 +242,14 @@ function floats.checkedpagefloat(packed) end end -function floats.nofstacked() +function floats.nofstacked(which) return #stacks[which or default] or 0 end +function floats.hasstacked(which) + return (#stacks[which or default] or 0) > 0 +end + -- todo: check for digits ! local method = C((1-S(", :"))^1) @@ -273,27 +277,101 @@ end -- interface -local context = context -local context_setvalue = context.setvalue - -commands.flushfloat = floats.flush -commands.savefloat = floats.save -commands.resavefloat = floats.resave -commands.pushfloat = floats.push -commands.popfloat = floats.pop -commands.consultfloat = floats.consult -commands.collectfloat = floats.collect - -function commands.getfloatvariable (...) local v = floats.getvariable(...) if v then context(v) end end -function commands.checkedpagefloat (...) local v = floats.checkedpagefloat(...) if v then context(v) end end - -function commands.nofstackedfloats (...) context(floats.nofstacked(...)) end -function commands.doifelsesavedfloat(...) commands.doifelse(floats.nofstacked(...)>0) end - -function commands.analysefloatmethod(str) -- currently only one method - local method, label, row, column = floats.analysemethod(str) - context_setvalue("floatmethod",method or "") - context_setvalue("floatlabel", label or "") - context_setvalue("floatrow", row or "") - context_setvalue("floatcolumn",column or "") -end +local context = context +local commands = commands +local implement = interfaces.implement +local setmacro = interfaces.setmacro + +implement { + name = "flushfloat", + actions = floats.flush, + arguments = { "string", "integer" }, +} + +implement { + name = "flushlabeledfloat", + actions = floats.flush, + arguments = { "string", "string", true }, +} + +implement { + name = "savefloat", + actions = floats.save, + arguments = "string" +} + +implement { + name = "savespecificfloat", + actions = floats.save, + arguments = { + "string", + { + { "specification" }, + { "label" }, + } + } +} + +implement { + name = "resavefloat", + actions = floats.resave, + arguments = "string" +} + +implement { + name = "pushfloat", + actions = floats.push +} + +implement { + name = "popfloat", + actions = floats.pop +} + +implement { + name = "consultfloat", + actions = floats.consult, + arguments = "string", +} + +implement { + name = "collectfloat", + actions = floats.collect, + arguments = { "string", "dimen", "dimen" } +} + +implement { + name = "getfloatvariable", + actions = { floats.getvariable, context }, + arguments = "string" +} + +implement { + name = "checkedpagefloat", + actions = { floats.checkedpagefloat, context }, + arguments = "string" +} + +implement { + name = "nofstackedfloats", + actions = { floats.nofstacked, context }, + arguments = "string" +} + +implement { + name = "doifelsestackedfloats", + actions = { floats.hasstacked, commands.doifelse }, + arguments = "string" +} + +implement { + name = "analysefloatmethod", + actions = function(str) + local method, label, row, column = floats.analysemethod(str) + setmacro("floatmethod",method or "") + setmacro("floatlabel", label or "") + setmacro("floatrow", row or "") + setmacro("floatcolumn",column or "") + end, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/page-flt.mkiv b/Master/texmf-dist/tex/context/base/page-flt.mkiv index d641e1c7d94..16c42713970 100644 --- a/Master/texmf-dist/tex/context/base/page-flt.mkiv +++ b/Master/texmf-dist/tex/context/base/page-flt.mkiv @@ -83,49 +83,49 @@ \to \everyfloatscheck \unexpanded\def\page_floats_flush#1#2% - {\ctxcommand{flushfloat("#1",\number#2)}% + {\clf_flushfloat{#1}#2\relax \the\everyfloatscheck} \unexpanded\def\page_floats_flush_by_label#1#2% - {\ctxcommand{flushfloat("#1","#2",true)}% + {\clf_flushlabeledfloat{#1}{#2}\relax \the\everyfloatscheck} \unexpanded\def\page_floats_save#1% - {\ctxcommand{savefloat("#1")}% + {\clf_savefloat{#1}\relax \the\everyfloatscheck} \unexpanded\def\page_floats_resave#1% - {\ctxcommand{resavefloat("#1")}% + {\clf_resavefloat{#1}\relax \the\everyfloatscheck} \unexpanded\def\page_floats_push_saved - {\ctxcommand{pushfloat()}% + {\clf_pushfloat \the\everyfloatscheck} \unexpanded\def\page_floats_pop_saved - {\ctxcommand{popfloat()}% + {\clf_popfloat \the\everyfloatscheck} \unexpanded\def\page_floats_get_info#1% - {\ctxcommand{consultfloat("#1")}} + {\clf_consultfloat{#1}} \unexpanded\def\page_floats_if_else#1% - {\ctxcommand{doifelsesavedfloat("#1")}} + {\clf_doifelsestackedfloats{#1}} \unexpanded\def\page_floats_collect#1#2#3% - {\ctxcommand{collectfloat("#1",\number\dimexpr#2,\number\dimexpr#3)}} + {\clf_collectfloat{#1}\dimexpr#2\relax\dimexpr#3\relax} -\unexpanded\def\nofstackedfloatincategory#1% - {\ctxcommand{nofstackedfloats("#1")}} +\def\nofstackedfloatincategory#1% + {\clf_nofstackedfloats{#1}} \let\page_floats_column_push_saved\page_floats_push_saved % overloaded in page-mul \let\page_floats_column_pop_saved \page_floats_pop_saved % overloaded in page-mul \unexpanded\def\page_floats_save_page_float#1#2% - {\ctxcommand{savefloat("#1", { specification = "#2" })}} + {\clf_savespecificfloat{#1}{specification{#2}}\relax} \unexpanded\def\page_floats_save_somewhere_float#1#2% #1=method - {\ctxcommand{savefloat("#1", { specification = "#2", label = "\floatlabel" })}} + {\clf_savespecificfloat{#1}{specification{#2}label{\floatlabel}}\relax} %D This is an experimental new feature (for Alan Braslau), a prelude to more: %D @@ -256,7 +256,7 @@ \def\page_floats_flush_page_floats_indeed#1% future releases can do more clever things {\page_floats_flush{#1}\plusone - \edef\floatspecification{\ctxcommand{getfloatvariable("specification")}}% Is this okay? + \edef\floatspecification{\clf_getfloatvariable{specification}}% Is this okay? \the\everybeforeflushedpagefloat \vbox to \textheight {\doifnotinset\v!high\floatspecification\vfill @@ -265,7 +265,7 @@ \page_otr_fill_and_eject_page} \unexpanded\def\page_floats_flush_page_floats % used in postpone - {\edef\m_page_otf_checked_page_float{\ctxcommand{checkedpagefloat()}}% (true) for packed + {\edef\m_page_otf_checked_page_float{\clf_checkedpagefloat}% \ifx\m_page_otf_checked_page_float\empty % nothing \else\ifx\m_page_otf_checked_page_float\v!empty diff --git a/Master/texmf-dist/tex/context/base/page-flw.mkiv b/Master/texmf-dist/tex/context/base/page-flw.mkiv index ec1fa636df7..56fe32e5b9e 100644 --- a/Master/texmf-dist/tex/context/base/page-flw.mkiv +++ b/Master/texmf-dist/tex/context/base/page-flw.mkiv @@ -80,14 +80,14 @@ \def\textflowcollector#1% {\csname\??textflowbox#1\endcsname} -\unexpanded\def\doiftextflowcollectorelse#1% +\unexpanded\def\doifelsetextflowcollector#1% {\ifcsname\??textflowbox#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} -\unexpanded\def\doiftextflowelse#1% +\unexpanded\def\doifelsetextflow#1% {\ifcsname\??textflowbox#1\endcsname \ifvoid\csname\??textflowbox#1\endcsname \doubleexpandafter\secondoftwoarguments @@ -98,6 +98,9 @@ \expandafter\secondoftwoarguments \fi} +\let\doiftextflowcollectorelse\doifelsetextflowcollector +\let\doiftextflowelse \doifelsetextflow + % \unexpanded\def\doiftextflow#1% % {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument} diff --git a/Master/texmf-dist/tex/context/base/page-imp.mkiv b/Master/texmf-dist/tex/context/base/page-imp.mkiv index 230ede570ed..198a982298c 100644 --- a/Master/texmf-dist/tex/context/base/page-imp.mkiv +++ b/Master/texmf-dist/tex/context/base/page-imp.mkiv @@ -163,7 +163,7 @@ \donetrue \fi \else % testen, aangepast / expanded nodig ? - \normalexpanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}\donetrue\donefalse + \normalexpanded{\doifelseinset{\the\shippedoutpages}{\pagestoshipout}}\donetrue\donefalse \fi \ifdone \setbox\shipoutscratchbox\hbox{#1}% @@ -288,7 +288,7 @@ \fi \setuppapersize \ifarrangingpages - \ctxlua{job.disablesave()}% + \clf_disablejobsave %\disabledirective[job.save]% \fi \fi} @@ -355,14 +355,14 @@ {\dosetuparrangement{2}{2}{4}{3}{3}% \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax} -\installpagearrangement 2*2*4 % onother one of Willy Egger +\installpagearrangement 2*2*4 % another one of Willy Egger {\dosetuparrangement{2}{1}{8}{3}{2}% \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax} \installpagearrangement 2TOPSIDE {\dosetuparrangement{1}{2}{4}{2}{3}% \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP} - + \def\filluparrangedpages % beware: \realpageno is 1 ahead {\ifarrangingpages \scratchcounter\numexpr\realpageno-\plusone\relax @@ -748,7 +748,7 @@ \poparrangedpages \fi} -%D Might be used if a printer is printing from a rol or creating mini-books from A4: +%D Might be used if a printer is printing from a roll or creating mini-books from A4: %D This section has 16 pages. The folding scheme is first a Z-fold and at the end %D a final fold in the spine. %D Coding: [2*8*Z] @@ -1045,7 +1045,7 @@ %D There should be arrangements for sections made of heavy and thick paper. i.e. the heavier the paper %D the fewer pages per section: -%D Section with 8 pages put on to sheets of paper. Each sheet carries recto 2 and verso 2 pages. +%D Section with 8 pages put on two sheets of paper. Each sheet carries recto 2 and verso 2 pages. %D Coding: [2*2*2] \installpagearrangement 2*2*2 @@ -1351,7 +1351,7 @@ \doifelse{#1}\v!page {\let\page_boxes_apply_shift_print\page_boxes_apply_shift}{\let\page_boxes_apply_shift_print\gobbleoneargument}% \doifelse{#1}\v!paper{\let\page_boxes_apply_shift_paper\page_boxes_apply_shift}{\let\page_boxes_apply_shift_paper\gobbleoneargument}% \else\ifsecondargument - \doifinsetelse{#1}{\v!page,\v!paper} + \doifelseinset{#1}{\v!page,\v!paper} {\setuppageshift[#1][#2][#2]} {\setuppageshift[\v!page][#1][#2]}% \else\iffirstargument diff --git a/Master/texmf-dist/tex/context/base/page-ini.mkiv b/Master/texmf-dist/tex/context/base/page-ini.mkiv index fdffa552d5d..15783a99bc3 100644 --- a/Master/texmf-dist/tex/context/base/page-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/page-ini.mkiv @@ -102,6 +102,7 @@ \page_otr_check_for_pending_inserts % but does not hurt either (we're still in the otr!) \inpagebodytrue % needed for enabling \blank ! brrr + \pagebodymode\plusone % todo: \plustwo when spread \page_otr_command_flush_saved_floats \page_otr_command_set_vsize % this is needed for interacting components, like floats and multicolumns \strc_pagenumbers_increment_counters % should hook into an every @@ -143,9 +144,15 @@ \newconstant\pageornamentstate % 0=on 1=one-off 2=always-off +% \appendtoks +% \ifcase\pageornamentstate \or +% \pageornamentstate\zerocount +% \fi +% \to \everyaftershipout + \appendtoks \ifcase\pageornamentstate \or - \pageornamentstate\zerocount + \global\pageornamentstate\zerocount \fi \to \everyaftershipout @@ -229,7 +236,7 @@ \the\everyafterpagebody \egroup} -\def\doiftopofpageelse +\def\doifelsetopofpage {\ifdim\pagegoal=\maxdimen \expandafter\firstoftwoarguments \else\ifdim\pagegoal=\vsize @@ -238,6 +245,8 @@ \doubleexpandafter\secondoftwoarguments \fi\fi} +\let\doiftopofpageelse\doifelsetopofpage + % %D Idea: % % \newinsert\thispageinsert % <- installinsertion diff --git a/Master/texmf-dist/tex/context/base/page-inj.lua b/Master/texmf-dist/tex/context/base/page-inj.lua index 56e5a234e8b..fd66ead08d1 100644 --- a/Master/texmf-dist/tex/context/base/page-inj.lua +++ b/Master/texmf-dist/tex/context/base/page-inj.lua @@ -16,10 +16,9 @@ pagebuilders.injections = injections local report = logs.reporter("pagebuilder","injections") local trace = false trackers.register("pagebuilder.injections",function(v) trace = v end) -local variables = interfaces.variables - local context = context -local commands = commands +local implement = interfaces.implement +local variables = interfaces.variables local texsetcount = tex.setcount @@ -103,6 +102,24 @@ function injections.flushafter() -- maybe not public, just commands.* end end -commands.page_injections_save = injections.save -commands.page_injections_flush_after = injections.flushafter -commands.page_injections_flush_before = injections.flushbefore +implement { + name = "savepageinjections", + actions = injections.save, + arguments = { + { + { "name" }, + { "state" }, + { "userdata" } + } + } +} + +implement { + name = "flushpageinjectionsbefore", + actions = injections.flushbefore +} + +implement { + name = "flushpageinjectionsafter", + actions = injections.flushafter +} diff --git a/Master/texmf-dist/tex/context/base/page-inj.mkvi b/Master/texmf-dist/tex/context/base/page-inj.mkvi index bee56468346..03472fe5593 100644 --- a/Master/texmf-dist/tex/context/base/page-inj.mkvi +++ b/Master/texmf-dist/tex/context/base/page-inj.mkvi @@ -29,8 +29,8 @@ \installframedcommandhandler \??pageinjection {pageinjection} \??pageinjection \installcommandhandler \??pageinjectionalternative {pageinjectionalternative} \??pageinjectionalternative -\def\page_boxes_flush_before{\ctxcommand{page_injections_flush_before()}} -\def\page_boxes_flush_after {\ctxcommand{page_injections_flush_after ()}} +\let\page_boxes_flush_before\clf_flushpageinjectionsbefore +\let\page_boxes_flush_after \clf_flushpageinjectionsafter \def\page_injections_flush_saved#name#parameters% {\begingroup @@ -47,11 +47,11 @@ \dodoubleempty\page_injections_direct} \def\page_injections_direct[#1][#2]% name parameters | settings parameters | name | parameters - {\doifassignmentelse{#1} - {\doifassignmentelse{#2} + {\doifelseassignment{#1} + {\doifelseassignment{#2} {\page_injections_direct_settings_parameters{#1}{#2}} {\page_injections_direct_parameters {#1}}} - {\doifassignmentelse{#2} + {\doifelseassignment{#2} {\page_injections_direct_name_parameters {#1}{#2}} {\page_injections_direct_name {#1}}}} @@ -87,11 +87,11 @@ \fi} \def\page_injections_direct_indeed_yes#parameters% - {\ctxcommand{page_injections_save{ - name = "\currentpageinjection", - state = "\p_page_injections_state", - userdata = \!!bs\normalunexpanded{#parameters}\!!es - }}% + {\clf_savepageinjections + name {\currentpageinjection}% + state {\p_page_injections_state}% + userdata {\normalunexpanded{#parameters}}% + \relax \endgroup} \def\page_injections_direct_indeed_nop#parameters% diff --git a/Master/texmf-dist/tex/context/base/page-ins.lua b/Master/texmf-dist/tex/context/base/page-ins.lua index 7f870735d27..235f586c689 100644 --- a/Master/texmf-dist/tex/context/base/page-ins.lua +++ b/Master/texmf-dist/tex/context/base/page-ins.lua @@ -4,19 +4,9 @@ if not modules then modules = { } end modules ['page-ins'] = { author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", - -- public = { - -- functions = { - -- "inserts.define", - -- "inserts.getdata", - -- }, - -- commands = { - -- "defineinsertion", - -- "inserttionnumber", - -- } - -- } } --- Maybe we should only register in lua and forget about the tex end. +local next = next structures = structures or { } structures.inserts = structures.inserts or { } @@ -36,6 +26,9 @@ local v_firstcolumn = variables.firstcolumn local v_lastcolumn = variables.lastcolumn local v_text = variables.text +local context = context +local implement = interfaces.implement + storage.register("structures/inserts/stored", inserts.stored, "structures.inserts.stored") local data = inserts.data @@ -49,7 +42,7 @@ end function inserts.define(name,specification) specification.name= name local number = specification.number or 0 - data[name] = specification + data[name] = specification data[number] = specification -- only needed at runtime as this get stored in a bytecode register stored[name] = specification @@ -90,8 +83,37 @@ end -- interface -commands.defineinsertion = inserts.define -commands.setupinsertion = inserts.setup -commands.setinsertionlocation = inserts.setlocation -commands.insertionnumber = function(name) context(data[name].number or 0) end +implement { + name = "defineinsertion", + actions = inserts.define, + arguments = { + "string", + { + { "number", "integer" } + } + } +} + +implement { + name = "setupinsertion", + actions = inserts.setup, + arguments = { + "string", + { + { "location" } + } + } +} + +implement { + name = "setinsertionlocation", + actions = inserts.setlocation, + arguments = { "string", "string" } +} + +implement { + name = "insertionnumber", + actions = function(name) context(data[name].number or 0) end, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/page-ins.mkiv b/Master/texmf-dist/tex/context/base/page-ins.mkiv index a63de0b26f2..c91073a143d 100644 --- a/Master/texmf-dist/tex/context/base/page-ins.mkiv +++ b/Master/texmf-dist/tex/context/base/page-ins.mkiv @@ -82,13 +82,15 @@ \insert#1{\unvbox#1}% \fi} -\unexpanded\def\doifinsertionelse#1% +\unexpanded\def\doifelseinsertion#1% {\ifcsname\??insertionnumber#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifinsertionelse\doifelseinsertion + % \unexpanded\def\startinsertion[#1]% % {\insert\csname\??insertionnumber#1\endcsname\bgroup} % @@ -108,7 +110,12 @@ \else \expandafter\newinsert\csname\??insertionnumber\currentinsertion\endcsname \page_inserts_synchronize_registers - \ctxcommand{defineinsertion("\currentinsertion",{ number = \number\currentinsertionnumber })}% + \clf_defineinsertion + {\currentinsertion}% + {% + number \currentinsertionnumber + }% + \relax \t_page_inserts_list\expandafter\expandafter\expandafter {\expandafter\the\expandafter\t_page_inserts_list \expandafter\page_inserts_process\csname\??insertionnumber\currentinsertion\endcsname}% @@ -123,13 +130,16 @@ \to \everydefineinsertion \appendtoks - \ctxcommand{setupinsertion("\currentinsertion",{ - location = "\insertionparameter\c!location", - })}% + \clf_setupinsertion + {\currentinsertion} + {% + location {\insertionparameter\c!location}% + }% + \relax \to \everysetupinsertion \unexpanded\def\page_inserts_set_location#1#2% fast one - {\ctxcommand{setinsertionlocation("#1","#2")}} + {\clf_setinsertionlocation{#1}{#2}} %D Auxiliary macros: diff --git a/Master/texmf-dist/tex/context/base/page-lay.mkiv b/Master/texmf-dist/tex/context/base/page-lay.mkiv index 19f23724247..d1328bb6ba0 100644 --- a/Master/texmf-dist/tex/context/base/page-lay.mkiv +++ b/Master/texmf-dist/tex/context/base/page-lay.mkiv @@ -30,6 +30,8 @@ \newdimen\paperheight \paperheight = 297mm \newdimen\paperwidth \paperwidth = 210mm \newdimen\paperoffset \paperoffset = \zeropoint +\newdimen\paperbleed \paperbleed = \zeropoint +\newdimen\spinewidth \spinewidth = \zeropoint \newdimen\printpaperheight \printpaperheight = \paperheight \newdimen\printpaperwidth \printpaperwidth = \paperwidth @@ -154,13 +156,15 @@ \fi \to \everysetuplayout -\def\doiflayoutdefinedelse#1% +\def\doifelselayoutdefined#1% {\ifcsname\namedlayouthash{#1}\c!state\endcsname % maybe a helper \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doiflayoutdefinedelse\doifelselayoutdefined + \def\layoutdistance#1#2{\ifdim\zeropoint<#1#2\else\zeropoint\fi} \def\page_layouts_set_dimensions @@ -365,7 +369,7 @@ \ifx\currentlayouttarget\empty % invalid target \else - \doifassignmentelse{#2} + \doifelseassignment{#2} {\definelayouttarget[#1][#2]} {\setevalue{\??layoutpaper#1}{#2}% \setevalue{\??layoutprint#1}{#3}}% @@ -390,9 +394,9 @@ \unexpanded\def\page_paper_setup_size[#1][#2]% {\iffirstargument - \doifassignmentelse{#1} + \doifelseassignment{#1} {\page_paper_setup_size_settings[#1]} - {\doifassignmentelse{#2} + {\doifelseassignment{#2} {\page_paper_setup_size_settings_by_name[#1][#2]} {\page_paper_setup_size_change_size[#1][#2]}}% \else @@ -1027,7 +1031,7 @@ \unexpanded\def\startlayout[#1]% {\page \globalpushmacro\currentlayout - \doiflayoutdefinedelse{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}} + \doifelselayoutdefined{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}} \unexpanded\def\stoplayout {\page @@ -1121,13 +1125,15 @@ % #single #left #right -\def\doifoddpageelse +\def\doifelseoddpage {\ifodd\pagenoshift \expandafter\page_layouts_if_odd_else_yes \else \expandafter\page_layouts_if_odd_else_nop \fi} +\let\doifoddpageelse\doifelseoddpage + \def\page_layouts_if_odd_else_yes {\ifodd\realpageno \expandafter\secondoftwoarguments @@ -1142,9 +1148,7 @@ \expandafter\secondoftwoarguments \fi} -\let\doifonevenpaginaelse\doifoddpageelse - -\def\page_layouts_if_odd_else_again#1{\doifoddpageelse} +\def\page_layouts_if_odd_else_again#1{\doifelseoddpage} \def\doifbothsidesoverruled {\ifdoublesided @@ -1171,7 +1175,7 @@ \def\settexthoffset % name will change {\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}} - + % The next hack is too tricky as we may shipout more pages: % % \def\freezepagestatechecks @@ -1199,11 +1203,13 @@ \def\goleftonpage % name will change (we could cache) {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax} -\def\doifmarginswapelse#1#2% +\def\doifelsemarginswap#1#2% {\doifbothsides{#1}{#1}{#2}} +\let\doifmarginswapelse\doifelsemarginswap + \def\swapmargins % name will change - {\doifmarginswapelse\relax\doswapmargins} + {\doifelsemarginswap\relax\doswapmargins} \def\doswapmargins % name will change {\let\swapmargins \relax % to prevent local swapping @@ -1221,7 +1227,7 @@ {\ifsinglesided \expandafter\firstoftwoarguments \else - \expandafter\doifoddpageelse + \expandafter\doifelseoddpage \fi} \def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth } @@ -1377,6 +1383,9 @@ \definepapersize [A9] [\c!width=37mm,\c!height=52mm] \definepapersize [A10] [\c!width=26mm,\c!height=37mm] +\definepapersize [A4/2][\c!width=\dimexpr297mm/2\relax,\c!height=210mm] % 148.5mm +%definepapersize [2A5] [\c!width=296mm,\c!height=210mm] % doublewide + \definepapersize [B0] [\c!width=1000mm,\c!height=1414mm] \definepapersize [B1] [\c!width=707mm,\c!height=1000mm] \definepapersize [B2] [\c!width=500mm,\c!height=707mm] @@ -1424,6 +1433,7 @@ \definepapersize [SW] [\c!width=800pt,\c!height=450pt] % wide \definepapersize [HD] [\c!width=1920pt,\c!height=1080pt] \definepapersize [HD+] [\c!width=1920pt,\c!height=1200pt] +\definepapersize [HD-] [\c!width=960pt,\c!height=540pt] %D These are handy too: @@ -1491,6 +1501,11 @@ \definepapersize [A3plus] [\c!width=329mm,\c!height=483mm] +%D For Alan: + +\definepapersize [business] [\c!width=85mm,\c!height=55mm] +\definepapersize [businessUS] [\c!width=3.5in,\c!height=2in] + %D We can now default to a reasonable size. We match the print %D paper size with the typeset paper size. This setting should %D come after the first layout specification (already done). @@ -1505,15 +1520,18 @@ % [ \c!width=\paperwidth, % \c!height=\paperheight] +\setuppapersize + [\c!distance=1.5cm] % offset is already taken + \definepapersize [oversized] - [ \c!width=\dimexpr\paperwidth +1.5cm\relax, - \c!height=\dimexpr\paperheight+1.5cm\relax] + [ \c!width=\dimexpr\paperwidth +\layouttargetparameter\c!distance\relax, + \c!height=\dimexpr\paperheight+\layouttargetparameter\c!distance\relax] \definepapersize [undersized] - [ \c!width=\dimexpr\paperwidth -1.5cm\relax, - \c!height=\dimexpr\paperheight-1.5cm\relax] + [ \c!width=\dimexpr\paperwidth -\layouttargetparameter\c!distance\relax, + \c!height=\dimexpr\paperheight-\layouttargetparameter\c!distance\relax] \definepapersize [doublesized] @@ -1522,8 +1540,13 @@ \definepapersize [doubleoversized] - [ \c!width=\dimexpr \paperheight+1.5cm\relax, - \c!height=\dimexpr2\paperwidth +1.5cm\relax] + [ \c!width=\dimexpr \paperheight+\layouttargetparameter\c!distance\relax, + \c!height=\dimexpr2\paperwidth +\layouttargetparameter\c!distance\relax] + +\definepapersize + [doublewide] + [ \c!width=\dimexpr2\paperwidth \relax, + \c!height=\dimexpr \paperheight\relax] % \setuppapersize % [A4][A4] diff --git a/Master/texmf-dist/tex/context/base/page-lin.lua b/Master/texmf-dist/tex/context/base/page-lin.lua index 0b241240c02..5a447c45840 100644 --- a/Master/texmf-dist/tex/context/base/page-lin.lua +++ b/Master/texmf-dist/tex/context/base/page-lin.lua @@ -21,6 +21,8 @@ local attributes = attributes local nodes = nodes local context = context +local implement = interfaces.implement + nodes.lines = nodes.lines or { } local lines = nodes.lines @@ -163,9 +165,19 @@ function boxed.register(configuration) return last end -function commands.registerlinenumbering(configuration) - context(boxed.register(configuration)) -end +implement { + name = "registerlinenumbering", + actions = { boxed.register, context }, + arguments = { + { + { "continue" }, + { "start", "integer" }, + { "step", "integer" }, + { "method" }, + { "tag" }, + } + } +} function boxed.setup(n,configuration) local d = data[n] @@ -185,7 +197,20 @@ function boxed.setup(n,configuration) return n end -commands.setuplinenumbering = boxed.setup +implement { + name = "setuplinenumbering", + actions = boxed.setup, + arguments = { + "integer", + { + { "continue" }, + { "start", "integer" }, + { "step", "integer" }, + { "method" }, + { "tag" }, + } + } +} local function check_number(n,a,skip,sameline) local d = data[a] @@ -394,5 +419,14 @@ function boxed.stage_two(n,m) end end -commands.linenumbersstageone = boxed.stage_one -commands.linenumbersstagetwo = boxed.stage_two +implement { + name = "linenumbersstageone", + actions = boxed.stage_one, + arguments = { "integer", "boolean" } +} + +implement { + name = "linenumbersstagetwo", + actions = boxed.stage_two, + arguments = { "integer", "integer" } +} diff --git a/Master/texmf-dist/tex/context/base/page-lin.mkvi b/Master/texmf-dist/tex/context/base/page-lin.mkvi index e3b6284876e..dd13a98c38e 100644 --- a/Master/texmf-dist/tex/context/base/page-lin.mkvi +++ b/Master/texmf-dist/tex/context/base/page-lin.mkvi @@ -73,38 +73,48 @@ \unexpanded\def\page_postprocessors_linenumbers_deepbox#tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \plusone } \unexpanded\def\page_postprocessors_linenumbers_column #tag{\page_lines_add_numbers_to_box{#tag}\currentcolumn\nofcolumns\zerocount} -\def\page_lines_parameters_regular - {continue = "\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi", - start = \number\linenumberingparameter\c!start, - step = \number\linenumberingparameter\c!step, - method = "\linenumberingparameter\c!method", - tag = "\currentlinenumbering"} - -\def\page_lines_parameters_update - {continue = "\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi"} - \def\page_lines_start_define - {\setxvalue{\??linenumberinginstance\currentlinenumbering}{\ctxcommand{registerlinenumbering({\page_lines_parameters_regular})}}} + {\setxvalue{\??linenumberinginstance\currentlinenumbering}% + {\clf_registerlinenumbering + continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}% + start \linenumberingparameter\c!start + step \linenumberingparameter\c!step + method {\linenumberingparameter\c!method}% + tag {\currentlinenumbering}% + }} \def\page_lines_start_update - {\ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_update})}} + {\clf_setuplinenumbering + \csname\??linenumberinginstance\currentlinenumbering\endcsname + {% + continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}% + }% + \relax} \def\page_lines_setup {\ifcsname \??linenumberinginstance\currentlinenumbering\endcsname - \ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_regular})}% + \clf_setuplinenumbering + \csname\??linenumberinginstance\currentlinenumbering\endcsname + {% + continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}% + start \linenumberingparameter\c!start + step \linenumberingparameter\c!step + method {\linenumberingparameter\c!method}% + tag {\currentlinenumbering}% + }% + \relax \fi} % we could make this a bit more efficient by putting the end reference % in the same table as the start one but why make things complex ... -\let\dofinishlinereference\dofinishfullreference % at lua end - \unexpanded\def\page_lines_some_reference#1#2#3% {\dontleavehmode\begingroup \global\advance\c_page_lines_reference\plusone \attribute\linereferenceattribute\c_page_lines_reference - #3% + #3% todo: #3{#1} as there is no need to pass #1 as part of #3 % for the moment we use a simple system i.e. no prefixes etc .. todo: store as number + \c_strc_references_bind_state\zerocount % we don't want the prewordbreak and manage it here \normalexpanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberingparameter\c!conversion}{\the\c_page_lines_reference}}% kind labels userdata text \endgroup} @@ -195,10 +205,10 @@ \ifx\m_argument\v!empty \let\currentlinenumbering\empty \else - \doifassignmentelse{#1} + \doifelseassignment{#1} {\let\currentlinenumbering\empty \setupcurrentlinenumbering[#1]} - {\doifnumberelse\m_argument + {\doifelsenumber\m_argument {\let\currentlinenumbering\empty \letlinenumberingparameter\c!start\m_argument} {\let\currentlinenumbering\m_argument}}% @@ -218,7 +228,7 @@ \else \c_page_lines_mode\plusone \ifx\m_argument\v!empty \else - \doifassignmentelse{#2} + \doifelseassignment{#2} {\setupcurrentlinenumbering[#2]} {\doifnumber\m_argument {\letlinenumberingparameter\c!start\m_argument}}% @@ -301,8 +311,14 @@ \setbox\b_page_lines_scratch\vbox {\forgetall \offinterlineskip - \ctxcommand{linenumbersstageone(\number\b_page_lines_number,\ifcase\c_page_lines_nesting false\else true\fi)}}% - \ctxcommand{linenumbersstagetwo(\number\b_page_lines_number,\number\b_page_lines_scratch)}% can move to lua code + \clf_linenumbersstageone + \b_page_lines_number + \ifcase\c_page_lines_nesting false\else true\fi + \relax}% + \clf_linenumbersstagetwo + \b_page_lines_number + \b_page_lines_scratch + \fi \egroup} \let\page_lines_make_number_indeed\relax @@ -321,8 +337,14 @@ \setbox\b_page_lines_scratch\vbox {\forgetall \offinterlineskip - \ctxcommand{linenumbersstageone(\number\b_page_lines_number,\ifcase\c_page_lines_nesting false\else true\fi)}}% - \ctxcommand{linenumbersstagetwo(\number\b_page_lines_number,\number\b_page_lines_scratch)}% can move to lua code + \clf_linenumbersstageone + \b_page_lines_number + \ifcase\c_page_lines_nesting false\else true\fi + \relax}% + \clf_linenumbersstagetwo + \b_page_lines_number + \b_page_lines_scratch + \relax \egroup} \def\page_lines_make_number#tag#mode#linenumber#shift#width#leftskip#dir% beware, one needs so compensate for this in the \hsize @@ -534,21 +556,23 @@ % eventually we will do this in lua -\def\currentreferencelinenumber{\ctxcommand{filterreference("linenumber")}} +\def\currentreferencelinenumber{\clf_filterreference{linenumber}} \let\m_page_lines_from\empty \let\m_page_lines_to \empty \unexpanded\def\doifelsesamelinereference#1#2#3% - {\doifreferencefoundelse{lr:b:#1} + {\doifelsereferencefound{lr:b:#1} {\edef\m_page_lines_from{\currentreferencelinenumber}% - \doifreferencefoundelse{lr:e:#1} + \doifelsereferencefound{lr:e:#1} {\edef\m_page_lines_to{\currentreferencelinenumber}% %[\m_page_lines_from,\m_page_lines_to] \ifx\m_page_lines_from\m_page_lines_to#2\else#3\fi} {#2}} {#2}} +\let\doifsamelinereferenceelse\doifelsesamelinereference + \unexpanded\def\inline#1[#2]% {\doifelsenothing{#1} {\doifelsesamelinereference{#2} diff --git a/Master/texmf-dist/tex/context/base/page-mak.mkvi b/Master/texmf-dist/tex/context/base/page-mak.mkvi index c910f281d23..ee144f20a34 100644 --- a/Master/texmf-dist/tex/context/base/page-mak.mkvi +++ b/Master/texmf-dist/tex/context/base/page-mak.mkvi @@ -45,7 +45,7 @@ \appendtoks \setuevalue{\e!start\currentmakeup\e!makeup}{\startmakeup[\currentmakeup]}% \setuevalue{\e!stop \currentmakeup\e!makeup}{\stopmakeup}% - \doiflayoutdefinedelse\currentmakeup\donothing{\definelayout[\currentmakeup]}% new + \doifelselayoutdefined\currentmakeup\donothing{\definelayout[\currentmakeup]}% new \to \everydefinemakeup %D The \type{\start}||\type{\stop} macros are used for both @@ -126,8 +126,7 @@ % nothing \endgroup \else - \endgroup - \page[\p_page]% + \normalexpanded{\endgroup\page[\p_page]}% \fi\fi % some dirty trickery (sorry) for determining if we have % - a layout definition at all diff --git a/Master/texmf-dist/tex/context/base/page-mbk.mkvi b/Master/texmf-dist/tex/context/base/page-mbk.mkvi index 9e3e57193bd..8038771d9c7 100644 --- a/Master/texmf-dist/tex/context/base/page-mbk.mkvi +++ b/Master/texmf-dist/tex/context/base/page-mbk.mkvi @@ -98,7 +98,7 @@ \unvbox\b_page_margin_blocks \marginblockparameter\c!inbetween \fi - \setupalign[\marginblockparameter\c!align]% + \usealignparameter\marginblockparameter \usemarginblockstyleandcolor\c!style\c!color \begstrut \ignorespaces} diff --git a/Master/texmf-dist/tex/context/base/page-mix.lua b/Master/texmf-dist/tex/context/base/page-mix.lua index 0fbaa4e30b4..2bf89f73778 100644 --- a/Master/texmf-dist/tex/context/base/page-mix.lua +++ b/Master/texmf-dist/tex/context/base/page-mix.lua @@ -13,7 +13,9 @@ if not modules then modules = { } end modules ["page-mix"] = { -- local trackers, logs, storage = trackers, logs, storage -- local number, table = number, table +local next, type = next, type local concat = table.concat +local ceil, floor = math.ceil, math.floor local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end) local trace_detail = false trackers.register("mixedcolumns.detail", function(v) trace_detail = v end) @@ -81,6 +83,10 @@ local v_auto = variables.auto local v_none = variables.none local v_more = variables.more local v_less = variables.less +local v_halfline = variables.halfline + +local context = context +local implement = interfaces.implement pagebuilders = pagebuilders or { } pagebuilders.mixedcolumns = pagebuilders.mixedcolumns or { } @@ -222,7 +228,7 @@ local function stripbottomglue(results,discarded) return height end -local function setsplit(specification) -- a rather large function +local function preparesplit(specification) -- a rather large function local box = specification.box if not box then report_state("fatal error, no box") @@ -239,16 +245,16 @@ local function setsplit(specification) -- a rather large function return end slidenodes(head) -- we can have set prev's to nil to prevent backtracking - local discarded = { } - local originalhead = head - local originalwidth = specification.originalwidth or getfield(list,"width") + local discarded = { } + local originalhead = head + local originalwidth = specification.originalwidth or getfield(list,"width") local originalheight = specification.originalheight or getfield(list,"height") - local current = head - local skipped = 0 - local height = 0 - local depth = 0 - local skip = 0 - local splitmethod = specification.splitmethod or false + local current = head + local skipped = 0 + local height = 0 + local depth = 0 + local skip = 0 + local splitmethod = specification.splitmethod or false if splitmethod == v_none then splitmethod = false end @@ -428,6 +434,7 @@ local function setsplit(specification) -- a rather large function local function checked(advance,where,locked) local total = skip + height + depth + advance local delta = total - target +-- - 65536*3 local state = "same" local okay = false local skipped = 0 @@ -716,10 +723,12 @@ local kept = head return specification end -function mixedcolumns.finalize(result) +local function finalize(result) if result then - local results = result.results - for i=1,result.nofcolumns do + local results = result.results + local columns = result.nofcolumns + local maxtotal = 0 + for i=1,columns do local r = results[i] local h = r.head if h then @@ -747,6 +756,16 @@ function mixedcolumns.finalize(result) r.inserts[c] = t end end + local total = r.height + r.depth + if total > maxtotal then + maxtotal = total + end + r.total = total + end + result.maxtotal = maxtotal + for i=1,columns do + local r = results[i] + r.extra = maxtotal - r.total end end end @@ -761,12 +780,12 @@ local function report_deltas(result,str) report_state("%s, cycles %s, deltas % | t",str,result.cycle or 1,t) end -function mixedcolumns.setsplit(specification) +local function setsplit(specification) splitruns = splitruns + 1 if trace_state then report_state("split run %s",splitruns) end - local result = setsplit(specification) + local result = preparesplit(specification) if result then if result.overflow then if trace_state then @@ -779,7 +798,7 @@ function mixedcolumns.setsplit(specification) local cycles = specification.cycles or 100 while result.rest and cycle <= cycles do specification.extra = cycle * step - result = setsplit(specification) or result + result = preparesplit(specification) or result if trace_state then report_state("cycle: %s.%s, original height %p, total height %p", splitruns,cycle,result.originalheight,result.nofcolumns*result.targetheight) @@ -801,7 +820,7 @@ function mixedcolumns.setsplit(specification) end end -function mixedcolumns.getsplit(result,n) +local function getsplit(result,n) if not result then report_state("flush, column %s, no result",n) return @@ -819,13 +838,14 @@ function mixedcolumns.getsplit(result,n) local strutht = result.strutht local strutdp = result.strutdp local lineheight = strutht + strutdp + local isglobal = result.alternative == v_global local v = new_vlist() setfield(v,"list",h) -- local v = vpack(h,"exactly",height) - if result.alternative == v_global then -- option + if isglobal then -- option result.height = result.maxheight end @@ -833,11 +853,56 @@ function mixedcolumns.getsplit(result,n) local dp = 0 local wd = result.originalwidth - local grid = result.grid + local grid = result.grid + local internalgrid = result.internalgrid + local httolerance = .25 + local dptolerance = .50 + local lineheight = internalgrid == v_halfline and lineheight/2 or lineheight + + local function amount(r,s,t) + local l = ceil((r-t)/lineheight) + local a = lineheight * l + if a > s then + return a - s + else + return s + end + end if grid then - ht = lineheight * math.ceil(result.height/lineheight) - strutdp - dp = strutdp + -- print(n,result.maxtotal,r.total,r.extra) + if isglobal then + local rh = r.height + -- ht = (lineheight * ceil(result.height/lineheight) - strutdp + ht = amount(rh,strutdp,0) + dp = strutdp + else + -- natural dimensions + local rh = r.height + local rd = r.depth + if rh > ht then + ht = amount(rh,strutdp,httolerance*strutht) + end + if rd > dp then + dp = amount(rd,strutht,dptolerance*strutdp) + end + -- forced dimensions + local rh = result.height or 0 + local rd = result.depth or 0 + if rh > ht then + ht = amount(rh,strutdp,httolerance*strutht) + end + if rd > dp then + dp = amount(rd,strutht,dptolerance*strutdp) + end + -- always one line at least + if ht < strutht then + ht = strutht + end + if dp < strutdp then + dp = strutdp + end + end else ht = result.height dp = result.depth @@ -867,19 +932,19 @@ function mixedcolumns.getsplit(result,n) return v end -function mixedcolumns.getrest(result) +local function getrest(result) local rest = result and result.rest result.rest = nil -- to be sure return rest end -function mixedcolumns.getlist(result) +local function getlist(result) local originalhead = result and result.originalhead result.originalhead = nil -- to be sure return originalhead end -function mixedcolumns.cleanup(result) +local function cleanup(result) local discarded = result.discarded for i=1,#discarded do freenode(discarded[i]) @@ -887,52 +952,100 @@ function mixedcolumns.cleanup(result) result.discarded = { } end +mixedcolumns.setsplit = setsplit +mixedcolumns.getsplit = getsplit +mixedcolumns.finalize = finalize +mixedcolumns.getrest = getrest +mixedcolumns.getlist = getlist +mixedcolumns.cleanup = cleanup + -- interface -- local result -function commands.mixsetsplit(specification) - if result then - for k, v in next, specification do - result[k] = v +implement { + name = "mixsetsplit", + actions = function(specification) + if result then + for k, v in next, specification do + result[k] = v + end + result = setsplit(result) + else + result = setsplit(specification) end - result = mixedcolumns.setsplit(result) - else - result = mixedcolumns.setsplit(specification) - end -end + end, + arguments = { + { + { "box", "integer" }, + { "nofcolumns", "integer" }, + { "maxheight", "dimen" }, + { "step", "dimen" }, + { "cycles", "integer" }, + { "preheight", "dimen" }, + { "prebox", "integer" }, + { "strutht", "dimen" }, + { "strutdp", "dimen" }, + { "threshold", "dimen" }, + { "splitmethod" }, + { "balance" }, + { "alternative" }, + { "internalgrid" }, + { "grid", "boolean" }, + } + } +} -function commands.mixgetsplit(n) - if result then - context(tonode(mixedcolumns.getsplit(result,n))) - end -end +implement { + name = "mixgetsplit", + arguments = "integer", + actions = function(n) + if result then + context(tonode(getsplit(result,n))) + end + end, +} -function commands.mixfinalize() - if result then - mixedcolumns.finalize(result) +implement { + name = "mixfinalize", + actions = function() + if result then + finalize(result) + end end -end +} -function commands.mixflushrest() - if result then - context(tonode(mixedcolumns.getrest(result))) +implement { + name = "mixflushrest", + actions = function() + if result then + context(tonode(getrest(result))) + end end -end +} -function commands.mixflushlist() - if result then - context(tonode(mixedcolumns.getlist(result))) +implement { + name = "mixflushlist", + actions = function() + if result then + context(tonode(getlist(result))) + end end -end +} -function commands.mixstate() - context(result and result.rest and 1 or 0) -end +implement { + name = "mixstate", + actions = function() + context(result and result.rest and 1 or 0) + end +} -function commands.mixcleanup() - if result then - mixedcolumns.cleanup(result) - result = nil +implement { + name = "mixcleanup", + actions = function() + if result then + cleanup(result) + result = nil + end end -end +} diff --git a/Master/texmf-dist/tex/context/base/page-mix.mkiv b/Master/texmf-dist/tex/context/base/page-mix.mkiv index 57de14b88b4..b545e8f4c97 100644 --- a/Master/texmf-dist/tex/context/base/page-mix.mkiv +++ b/Master/texmf-dist/tex/context/base/page-mix.mkiv @@ -69,6 +69,7 @@ \c!maxheight=\textheight, \c!maxwidth=\makeupwidth, \c!grid=\v!tolerant, + \c!internalgrid=\v!line, \c!step=.25\lineheight, % needs some experimenting %\c!splitmethod=\v!fixed, % will be default \c!method=\ifinner\s!box\else\s!otr\fi] % automatic as suggested by WS @@ -167,6 +168,8 @@ [\c!n=\itemgroupparameter\c!n, \c!separator=\v!none, \c!splitmethod=\v!none, + \c!grid=\v!tolerant, + \c!internalgrid=\v!halfline, % new, we may still revert to \v!line \c!balance=\v!yes] \unexpanded\def\strc_itemgroups_start_columns @@ -289,18 +292,32 @@ \installcorenamespace{mixedcolumnsseparator} -\setvalue{\??mixedcolumnsseparator\v!rule}% - {\starttextproperties - \usemixedcolumnscolorparameter\c!rulecolor - \vrule\s!width\mixedcolumnsparameter\c!rulethickness - \stoptextproperties} +\unexpanded\def\installmixedcolumnseparator#1#2% + {\setvalue{\??mixedcolumnsseparator#1}{#2}} + +\installmixedcolumnseparator\v!rule + {\vrule + \s!width \mixedcolumnsparameter\c!rulethickness + \s!height\mixedcolumnseparatorheight + \s!depth \mixedcolumnseparatordepth + \relax} \unexpanded\def\page_mix_command_inject_separator - {\bgroup + {\begingroup + \setbox\scratchbox\hbox to \zeropoint \bgroup + \hss + \starttextproperties + \usemixedcolumnscolorparameter\c!rulecolor + \csname\??mixedcolumnsseparator\p_separator\endcsname % was \c!rule + \stoptextproperties + \hss + \egroup + \ht\scratchbox\zeropoint + \dp\scratchbox\zeropoint \hss - \csname\??mixedcolumnsseparator\mixedcolumnsparameter\c!separator\endcsname % was \c!rule + \box\scratchbox \hss - \egroup} + \endgroup} %D We've now arrived at the real code. The start command mostly sets up the %D environment and variables that are used in the splitter. One of the last @@ -348,13 +365,13 @@ \csname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname} \def\page_mix_start_columns_b[#1][#2]% - {\doifassignmentelse{#1}% + {\doifelseassignment{#1}% {\let\currentmixedcolumns\empty \page_mix_error_b} {\edef\currentmixedcolumns{#1}% \firstargumentfalse}% \edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}% - \mixedcolumnsparameter\c!before\relax % so, it doesn't list to local settings ! + \mixedcolumnsparameter\c!before\relax % so, it doesn't listen to local settings ! \csname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax \begingroup \iffirstargument @@ -452,6 +469,8 @@ % \usemixedcolumnscolorparameter\c!color % + \insidecolumnstrue % new + % \nofcolumns\c_page_mix_n_of_columns} % public %D The otr method related hooks are defined next: @@ -505,6 +524,10 @@ {\c_page_mix_routine\c_page_mix_routine_balance}% {\penalty-\plustenthousand}% weird hack, we need to trigger the otr sometimes (new per 20140306, see balancing-001.tex) \page_otr_trigger_output_routine + \ifvoid\b_page_mix_preceding \else + % empty columns so we need to make sure pending content is flushed + \unvbox\b_page_mix_preceding % new per 2014.10.25 + \fi \fi} \setvalue{\??mixedcolumnsafter\s!otr}% @@ -521,26 +544,52 @@ \unexpanded\def\page_mix_routine_construct#1% {\d_page_mix_max_height\mixedcolumnsparameter\c!maxheight % can have changed due to header=high - \ctxcommand{mixsetsplit { - box = \number\b_page_mix_collected, - nofcolumns = \number\c_page_mix_n_of_columns, - maxheight = \number\d_page_mix_max_height, - step = \number\d_page_mix_balance_step, - cycles = \number\c_page_mix_balance_cycles, - preheight = \number\d_page_mix_preceding_height, - prebox = \number\b_page_mix_preceding, - strutht = \number\strutht, - strutdp = \number\strutdp, - threshold = \number\d_page_mix_threshold, - splitmethod = "\mixedcolumnsparameter\c!splitmethod", - balance = "#1", - alternative = "\mixedcolumnsparameter\c!alternative", - grid = \ifgridsnapping true\else false\fi, - }}% + \clf_mixsetsplit + box \b_page_mix_collected + nofcolumns \c_page_mix_n_of_columns + maxheight \d_page_mix_max_height + step \d_page_mix_balance_step + cycles \c_page_mix_balance_cycles + preheight \d_page_mix_preceding_height + prebox \b_page_mix_preceding + strutht \strutht + strutdp \strutdp + threshold \d_page_mix_threshold + splitmethod {\mixedcolumnsparameter\c!splitmethod}% + balance {#1}% + alternative {\mixedcolumnsparameter\c!alternative}% + internalgrid {\mixedcolumnsparameter\c!internalgrid}% + grid \ifgridsnapping true\else false\fi + \relax \deadcycles\zerocount} +\newdimen\mixedcolumnseparatorheight +\newdimen\mixedcolumnseparatordepth +\newdimen\mixedcolumnseparatorwidth + +\def\page_mix_routine_package_step + {% needs packaging anyway + \setbox\scratchbox\page_mix_command_package_column + \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox + % backgrounds + \anch_mark_column_box\scratchbox + % for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner + \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone + % the framed needs a reset of strut, align, setups etc + \mixedcolumnseparatorheight\ht\scratchbox + \mixedcolumnseparatordepth \dp\scratchbox + \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox + % optional + \ifnum\recurselevel<\c_page_mix_n_of_columns + \ifcsname\??mixedcolumnsseparator\p_separator\endcsname + \page_mix_command_inject_separator + \else + \hss + \fi + \fi} + \unexpanded\def\page_mix_routine_package - {\ctxcommand{mixfinalize()}% + {\clf_mixfinalize \setbox\b_page_mix_collected\vbox \bgroup \ifvoid\b_page_mix_preceding \else \page_postprocessors_linenumbers_deepbox\b_page_mix_preceding @@ -550,26 +599,16 @@ \fi \hskip\d_page_mix_leftskip \page_mix_hbox to \d_page_mix_max_width \bgroup - \dorecurse\c_page_mix_n_of_columns{% - % needs packaging anyway - \setbox\scratchbox\page_mix_command_package_column - \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox - % for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner - \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone - % the framed needs a reset of strut, align, setups etc - \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox - % optional - \ifnum\recurselevel<\c_page_mix_n_of_columns - \page_mix_command_inject_separator - \fi - }% + \edef\p_separator{\mixedcolumnsparameter\c!separator}% + \mixedcolumnseparatorwidth\d_page_mix_distance % \mixedcolumnsparameter\c!rulethickness\relax + \dorecurse\c_page_mix_n_of_columns\page_mix_routine_package_step \egroup \egroup} \unexpanded\def\page_mix_command_package_column {\page_mix_hbox to \d_page_mix_column_width \bgroup % maybe intercept empty - \ctxcommand{mixgetsplit(\recurselevel)}% + \clf_mixgetsplit\recurselevel\relax \hskip-\d_page_mix_column_width \page_mix_hbox to \d_page_mix_column_width \bgroup \placenoteinserts @@ -585,8 +624,8 @@ \page_mix_routine_construct\v!no \page_mix_routine_package \page_otr_construct_and_shipout\box\b_page_mix_collected - \ctxcommand{mixflushrest()}% - \ctxcommand{mixcleanup()}% + \clf_mixflushrest + \clf_mixcleanup \egroup} \unexpanded\def\page_mix_routine_balance @@ -597,9 +636,9 @@ \doloop {%writestatus\m!columns{construct continue (\the\htdp\b_page_mix_collected)}% \page_mix_routine_construct\v!no - \ifcase\ctxcommand{mixstate()}\relax + \ifcase\clf_mixstate\relax % 0 = okay, we can balance - \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushlist()}}% we could avoid this + \setbox\b_page_mix_collected\vbox{\clf_mixflushlist}% we could avoid this %writestatus\m!columns{construct balance}% \page_mix_routine_construct\v!yes \page_mix_routine_package @@ -614,16 +653,16 @@ \par \nointerlineskip \prevdepth\strutdp - \ctxcommand{mixflushrest()}% rubish - \ctxcommand{mixcleanup()}% rubish + \clf_mixflushrest% rubish + \clf_mixcleanup % rubish \exitloop \or % 1 = we have stuff left, so flush and rebalance %writestatus\m!columns{flush continue}% \page_mix_routine_package \page_otr_construct_and_shipout\box\b_page_mix_collected - \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushrest()}}% we could avoid this - \ctxcommand{mixcleanup()}% + \setbox\b_page_mix_collected\vbox{\clf_mixflushrest}% we could avoid this + \clf_mixcleanup \ifdim\ht\b_page_mix_collected=\zeropoint \exitloop \fi @@ -718,8 +757,8 @@ \page_mix_routine_construct\v!yes \page_mix_routine_package \dontleavehmode\box\b_page_mix_collected - \ctxcommand{mixflushrest()}% - \ctxcommand{mixcleanup()}% + \clf_mixflushrest + \clf_mixcleanup \egroup} %D As usual, floats complicates matters and this is where experimental code @@ -760,11 +799,11 @@ % \unexpanded\def\page_mix_command_flush_top_insertions % {\page_one_command_flush_top_insertions} -% \unexpanded\def\page_mix_place_float_top -% {\showmessage\m!columns4\empty\page_one_place_float_here} +\unexpanded\def\page_mix_place_float_top + {\showmessage\m!columns4\empty\page_one_place_float_here} -% \unexpanded\def\page_mix_place_float_bottom -% {\showmessage\m!columns5\empty\page_one_place_float_here} +\unexpanded\def\page_mix_place_float_bottom + {\showmessage\m!columns5\empty\page_one_place_float_here} \unexpanded\def\page_mix_place_float_here {\page_one_place_float_here} diff --git a/Master/texmf-dist/tex/context/base/page-mul.mkiv b/Master/texmf-dist/tex/context/base/page-mul.mkiv index 0063b3311c5..8db5a47732b 100644 --- a/Master/texmf-dist/tex/context/base/page-mul.mkiv +++ b/Master/texmf-dist/tex/context/base/page-mul.mkiv @@ -1430,7 +1430,7 @@ % \stopcolumns % \def\backgroundfinishcolumnbox - % {\doifinsetelse\@@kloffset{\v!none,\v!overlay} + % {\doifelseinset\@@kloffset{\v!none,\v!overlay} % {\let\@@kloffset\!!zeropoint} % {\scratchdimen\@@kloffset % \advance\scratchdimen -\@@klrulethickness diff --git a/Master/texmf-dist/tex/context/base/page-one.mkiv b/Master/texmf-dist/tex/context/base/page-one.mkiv index 3f9dcd7c617..4cf59da2dec 100644 --- a/Master/texmf-dist/tex/context/base/page-one.mkiv +++ b/Master/texmf-dist/tex/context/base/page-one.mkiv @@ -454,10 +454,13 @@ \fi\fi \fi} + \def\page_one_place_float_here_indeed - {%\ifgridsnapping \else - \baselinecorrection - %\fi + {\ifgridsnapping + % otherwise real bad outcome + \else + \baselinecorrection % this has to be done better (and definitely not in column mode) + \fi \doplacefloatbox \page_floats_report_total \dohandlenextfloatindent} @@ -496,12 +499,12 @@ \def\page_one_place_float_bottom {\page_one_place_float_otherwise} \def\page_one_place_float_otherwise - {\doifinsetelse\v!here\floatlocationmethod + {\doifelseinset\v!here\floatlocationmethod \page_one_place_float_otherwise_here \page_one_place_float_otherwise_else} \def\page_one_place_float_otherwise_here - {\doifinsetelse\v!always\floatlocationmethod + {\doifelseinset\v!always\floatlocationmethod {\page[\v!preference]% \page_otr_command_check_if_float_fits \ifconditional\c_page_floats_room @@ -525,7 +528,7 @@ \fi}} \def\page_one_place_float_otherwise_else - {\doifinsetelse\v!always\floatlocationmethod + {\doifelseinset\v!always\floatlocationmethod {\page_otr_command_check_if_float_fits \ifconditional\c_page_floats_room \page_one_place_float_auto_top_bottom diff --git a/Master/texmf-dist/tex/context/base/page-pst.lua b/Master/texmf-dist/tex/context/base/page-pst.lua index 50580ae3316..472bdbabed5 100644 --- a/Master/texmf-dist/tex/context/base/page-pst.lua +++ b/Master/texmf-dist/tex/context/base/page-pst.lua @@ -8,16 +8,18 @@ if not modules then modules = { } end modules ['page-pst'] = { -- todo: adapt message -local tonumber, next = tonumber, next -local format, validstring = string.format, string.valid -local sortedkeys = table.sortedkeys +local tonumber, next, type = tonumber, next, type +local find, validstring = string.find, string.valid -local context = context -local commands = commands +local context = context +local implement = interfaces.implement local texgetcount = tex.getcount local texsetcount = tex.setcount +local sortedkeys = table.sortedkeys +local formatters = string.formatters + local cache = { } local function flush(page) @@ -25,7 +27,7 @@ local function flush(page) if c then for i=1,#c do -- characters.showstring(c[i]) - context.viafile(c[i],format("page.%s",validstring(page,"nopage"))) + context.viafile(c[i],formatters["page.%s"](validstring(page,"nopage"))) end cache[page] = nil end @@ -43,11 +45,11 @@ local function setnextpage() texsetcount("global","c_page_postponed_blocks_next_page",n) end -function commands.flushpostponedblocks(page) +local function flushpostponedblocks(specification) -- we need to flush previously pending pages as well and the zero -- slot is the generic one so that one is always flushed local t = sortedkeys(cache) - local p = tonumber(page) or texgetcount("realpageno") or 0 + local p = tonumber(specification.page) or texgetcount("realpageno") or 0 for i=1,#t do local ti = t[i] if ti <= p then @@ -59,9 +61,19 @@ function commands.flushpostponedblocks(page) setnextpage() end -function commands.registerpostponedblock(page) +implement { + name = "flushpostponedblocks", + actions = flushpostponedblocks, + arguments = { + { + { "page" } + } + } +} + +local function registerpostponedblock(page) if type(page) == "string" then - if string.find(page,"^+") then + if find(page,"^+") then page = texgetcount("realpageno") + (tonumber(page) or 1) -- future delta page else page = tonumber(page) or 0 -- preferred page or otherwise first possible occasion @@ -80,7 +92,14 @@ function commands.registerpostponedblock(page) if page == 0 then interfaces.showmessage("layouts",3,#c) else - interfaces.showmessage("layouts",3,string.format("%s (realpage: %s)",#c,page)) + interfaces.showmessage("layouts",3,formatters["%s (realpage: %s)"](#c,page)) end setnextpage() end + +implement { + name = "registerpostponedblock", + actions = registerpostponedblock, + arguments = "string" +} + diff --git a/Master/texmf-dist/tex/context/base/page-pst.mkiv b/Master/texmf-dist/tex/context/base/page-pst.mkiv index 704289246a3..f12663f6665 100644 --- a/Master/texmf-dist/tex/context/base/page-pst.mkiv +++ b/Master/texmf-dist/tex/context/base/page-pst.mkiv @@ -57,10 +57,10 @@ \unexpanded\setvalue{\e!start\v!postponing}% {\bgroup \obeylines - \doifnextoptionalelse{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}} + \doifelsenextoptional{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}} \unexpanded\setvalue{\e!stop\v!postponing}% - {\ctxcommand{registerpostponedblock("\currentpostponedpage")}\relax} + {\clf_registerpostponedblock{\currentpostponedpage}\relax} \def\page_postponed_blocks_start[#1]% {\edef\currentpostponedpage{#1}% @@ -80,7 +80,8 @@ \setnormalcatcodes % postponing in verbatim \uncatcodespacetokens % postponing in startlines \restoreglobalbodyfont % otherwise problems inside split verbatim - \ctxcommand{flushpostponedblocks()}% + \clf_flushpostponedblocks + % page {123} \relax \page_otr_command_flush_floats % new but potential dangerous, maybe we need a classification \endgroup} % of blocks: with and without flush diff --git a/Master/texmf-dist/tex/context/base/page-run.mkiv b/Master/texmf-dist/tex/context/base/page-run.mkiv index 1f2551ebc17..9adcb23c7b3 100644 --- a/Master/texmf-dist/tex/context/base/page-run.mkiv +++ b/Master/texmf-dist/tex/context/base/page-run.mkiv @@ -74,9 +74,11 @@ \startluacode local format, concat = string.format, table.concat +local todimen = number.todimen +local texdimen = tex.dimen -local function todimen(name,unit,fmt) - return number.todimen(tex.dimen[name],unit,fmt) +local function asdimen(name,unit) + return todimen(texdimen[name],unit,"%0.4f") -- 4 is more than enough, even 3 would be okay end local function checkedoptions(options) @@ -122,7 +124,7 @@ function commands.showlayoutvariables(options) for i=1,#dimensions do local d = dimensions[i] if options[d] then - context("%s%s",todimen(name,d,"%0.4f"),d) + context("%s%s",asdimen(name,d),d) context.NC() end end @@ -143,7 +145,7 @@ function commands.showlayoutvariables(options) for i=1,#dimensions do local d = dimensions[i] if options[d] then - result[#result+1] = format("%12s%s",todimen(name,d,"%0.4f"),d) + result[#result+1] = format("%12s%s",asdimen(name,d),d) end end commands.writestatus("layout",format("%-24s %s",interfaces.interfacedcommand(name),concat(result," "))) @@ -297,8 +299,8 @@ end \unexpanded\gdef\showmargins {\starttabulate - \NC asynchrone \NC \doifoddpageelse {odd} {even} \NC \NR - \NC synchrone \NC \doifrightpageelse {right} {left} \NC \NR + \NC asynchrone \NC \doifelseoddpage {odd} {even} \NC \NR + \NC synchrone \NC \doifelserightpage {right} {left} \NC \NR \NC right margin \NC \the\rightmarginwidth \NC \NR \NC left margin \NC \the\leftmarginwidth \NC \NR \NC outer margin \NC \the\outermarginwidth \NC \NR diff --git a/Master/texmf-dist/tex/context/base/page-sel.mkvi b/Master/texmf-dist/tex/context/base/page-sel.mkvi index cb9bcb509eb..ee25a37db4a 100644 --- a/Master/texmf-dist/tex/context/base/page-sel.mkvi +++ b/Master/texmf-dist/tex/context/base/page-sel.mkvi @@ -56,7 +56,7 @@ {\dotripleempty\page_selectors_insert} \def\page_selectors_insert[#filename][#emptylist][#settings]% - {\doifassignmentelse{#emptylist} + {\doifelseassignment{#emptylist} {\page_selectors_insert_indeed[#filename][][#emptylist]} {\page_selectors_insert_indeed[#filename][#emptylist][#settings]}} diff --git a/Master/texmf-dist/tex/context/base/page-set.mkiv b/Master/texmf-dist/tex/context/base/page-set.mkiv index 9c232f5358b..8f63dd74e22 100644 --- a/Master/texmf-dist/tex/context/base/page-set.mkiv +++ b/Master/texmf-dist/tex/context/base/page-set.mkiv @@ -387,7 +387,7 @@ {\advance\scratchcounter\plusone}}% \popmacro\columnmaxcells} -\long\def\OTRSETrecurseRL#1% +\def\OTRSETrecurseRL#1% {\dostepwiserecurse\nofcolumns\plusone\minusone {#1\hskip\namedcolumnsetparameter{\currentcolumnset:\recurselevel}\c!distance}} @@ -2184,11 +2184,11 @@ \def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig ! {\ifthirdargument - \doifinsetelse{#2}{\v!both,\v!fixed} + \doifelseinset{#2}{\v!both,\v!fixed} {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]% \definecolumntextarea[#1][\v!right][\c!type=#2,#3]} {\doifelse{#2}\v!next - {\doifoddpageelse + {\doifelseoddpage {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]} {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}} {\presetlocalframed @@ -2214,7 +2214,7 @@ {\setupcolumntextarea[#1][\v!left ][#3]% \setupcolumntextarea[#1][\v!right][#3]} {\doifelse{#2}\v!next - {\doifoddpageelse + {\doifelseoddpage {\setupcolumntextarea[#1][\v!right][#3]} {\setupcolumntextarea[#1][\v!left][#3]}} {\getparameters[\??mt#1#2][#3]}}% @@ -2379,13 +2379,13 @@ \unexpanded\def\setupcolumntextareatext {\dotripleempty\dosetupcolumntextareatext} -\long\def\dosetupcolumntextareatext[#1][#2][#3]% +\def\dosetupcolumntextareatext[#1][#2][#3]% {\ifthirdargument \doifelse{#2}\v!both {\setvalue{\??mt#1\v!left }{#3}% \setvalue{\??mt#1\v!right}{#3}} {\doifelse{#2}\v!next - {\doifoddpageelse + {\doifelseoddpage {\setvalue{\??mt#1\v!right}{#3}}% {\setvalue{\??mt#1\v!left }{#3}}}% {\setvalue{\??mt#1#2}{#3}}}% diff --git a/Master/texmf-dist/tex/context/base/page-sid.mkiv b/Master/texmf-dist/tex/context/base/page-sid.mkiv index f7a2357bf34..cbdb95fc371 100644 --- a/Master/texmf-dist/tex/context/base/page-sid.mkiv +++ b/Master/texmf-dist/tex/context/base/page-sid.mkiv @@ -15,21 +15,18 @@ \unprotect -% These macro deal with side floats. We started with Daniel -% Comenetz macros as published in TUGBoat Volume 14 (1993), -% No.\ 1: Anchored Figures at Either Margin. I extended and -% patched the macros to suite our needs which results in a -% messy module. Therefore, this module badly needs an update -% because it's now a mixture of old and new macros. +% These macro deal with side floats. We started with Daniel Comenetz macros as published +% in TUGBoat Volume 14 (1993), No.\ 1: Anchored Figures at Either Margin. I extended and +% patched the macros to suite our needs which results in a messy module. Therefore, this +% module badly needs an update because it's now a mixture of old and new macros. % Interesting cases where it goes wrong: % % \placefigure[left]{}{} \dorecurse{3}{\input ward } {\par} \input ward % -% Here we get an unwanted carried over hangindent and parindent. A -% solution is to associate it with the local par node instead. This -% is something to discuss with Taco as it could be a new luatex -% feature: explicitly set par properties. +% Here we get an unwanted carried over hangindent and parindent. A solution is to associate +% it with the local par node instead. This is something to discuss with Taco as it could be +% a new luatex/mkiv feature: explicitly set par properties. % Maybe I should just rewrite the lot. @@ -202,17 +199,72 @@ \global\setfalse\c_page_sides_short \global\setfalse\c_page_sides_flag} +\unexpanded\def\doifelsesidefloat + {\par + \ifnum\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments + \fi} + +\let\doifsidefloatelse\doifelsesidefloat + +% \def\page_sides_flush_floats_indeed +% {\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip +% \begingroup +% \let\page_sides_flush_floats\relax +% \forgetall +% \doloop +% {\strut +% \iftracesidefloats +% \color[darkgray]{\ruledhbox{\strut\kern\d_page_sides_width}}% +% \fi +% \par +% % \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint +% \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint +% \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles +% \exitloop +% \fi +% \else +% \exitloop +% \fi}% +% \endgroup +% \ifdim\parskip>\zeropoint % why this test ? +% \ifdim\d_page_sides_bottomskip>\parskip +% % \nowhitespace +% % \vskip\d_page_sides_bottomskip +% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip] +% \fi +% \else +% \blank[\the\d_page_sides_bottomskip]% new, so needs checking +% \fi} + +\installcorenamespace{sidefloatsteps} + +\setvalue{\??sidefloatsteps\v!line }{\strut} +\setvalue{\??sidefloatsteps\v!big }{\strut} +\setvalue{\??sidefloatsteps\v!medium}{\halfstrut} +\setvalue{\??sidefloatsteps\v!small }{\quarterstrut} +\setvalue{\??sidefloatsteps\v!depth }{\depthstrut} + +% we don't officially know what kind of float we flush + \def\page_sides_flush_floats_indeed {\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip \begingroup \let\page_sides_flush_floats\relax + \edef\m_pages_strut{\executeifdefined{\??sidefloatsteps\rootfloatparameter\c!step}\strut}% \forgetall \doloop - {\strut - \iftracesidefloats - \color[darkgray]{\ruledhbox{\strut\kern\d_page_sides_width}}% + {\iftracesidefloats + \dontleavehmode + \ruledhbox{\m_pages_strut\kern\d_page_sides_width}% + \else + \m_pages_strut \fi \par + \nointerlineskip + % \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles \exitloop @@ -223,11 +275,28 @@ \endgroup \ifdim\parskip>\zeropoint % why this test ? \ifdim\d_page_sides_bottomskip>\parskip - \nowhitespace - \vskip\d_page_sides_bottomskip + % \nowhitespace + % \vskip\d_page_sides_bottomskip +% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip] + \blank[\v!nowhite,\rootfloatparameter\c!sidespaceafter] \fi + \else +% \blank[\the\d_page_sides_bottomskip]% new, so needs checking + \blank[\rootfloatparameter\c!sidespaceafter]% new, so needs checking \fi} +% alternative method (unsnapped) +% +% \def\page_sides_flush_floats_indeed +% {\scratchdimen\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax +% \ifdim\parskip>\zeropoint % why this test ? +% \ifdim\scratchdimen>\parskip +% \blank[\v!nowhite,\the\scratchdimen] % better in stages +% \fi +% \else +% \blank[\the\scratchdimen] +% \fi} + \def\page_sides_check_floats_after_par {\page_sides_check_floats_indeed \ifdim\oldpagetotal=\pagetotal \else @@ -764,7 +833,7 @@ \def\checksidefloat {\page_sides_check_floats} \def\flushsidefloats {\page_sides_flush_floats} \def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par} -%def\forgetsidefloats {\page_sides_forget_floats} +\def\forgetsidefloats {\page_sides_forget_floats} %def\synchronizesidefloats {\page_sides_synchronize_floats} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/page-str.lua b/Master/texmf-dist/tex/context/base/page-str.lua index f2ac27cd9c1..56c6167aa56 100644 --- a/Master/texmf-dist/tex/context/base/page-str.lua +++ b/Master/texmf-dist/tex/context/base/page-str.lua @@ -17,6 +17,8 @@ local nodes, node = nodes, node local nodepool = nodes.pool local tasks = nodes.tasks +local implement = interfaces.implement + local new_kern = nodepool.kern local new_glyph = nodepool.glyph @@ -235,6 +237,60 @@ tasks.disableaction("mvlbuilders", "streams.collect") function streams.initialize() tasks.enableaction ("mvlbuilders", "streams.collect") + function streams.initialize() end end -- todo: remove empty last { }'s +-- todo: better names, enable etc + +implement { + name = "initializestream", + actions = streams.initialize, + onlyonce = true, +} + +implement { + name = "enablestream", + actions = streams.enable, + arguments = "string" +} + +implement { + name = "disablestream", + actions = streams.disable +} + +implement { + name = "startstream", + actions = streams.start, + arguments = "string" +} + +implement { + name = "stopstream", + actions = streams.stop +} + +implement { + name = "flushstream", + actions = streams.flush, + arguments = "string" +} + +implement { + name = "flushstreamcopy", + actions = streams.flush, + arguments = { "string", true } +} + +implement { + name = "synchronizestream", + actions = streams.synchronize, + arguments = "string" +} + +implement { + name = "pushstream", + actions = streams.push, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/page-str.mkiv b/Master/texmf-dist/tex/context/base/page-str.mkiv index a8fab9c6cbb..e4b2fa22980 100644 --- a/Master/texmf-dist/tex/context/base/page-str.mkiv +++ b/Master/texmf-dist/tex/context/base/page-str.mkiv @@ -34,7 +34,7 @@ \unprotect \let \currentoutputstream \empty -\newif \ifinoutputstream % will becoem a conditional or mode +\newif \ifinoutputstream % will become a conditional or mode \newtoks \everyenableoutputstream \appendtoks @@ -42,7 +42,7 @@ \to \everyenableoutputstream \unexpanded\def\initializeoutputstreams - {\ctxlua{streams.initialize()}% + {\clf_initializestream \glet\initializeoutputstreams\relax} \unexpanded\def\enableoutputstream[#1]% could be \startoutputsubstream @@ -50,12 +50,12 @@ \the\everyenableoutputstream \inoutputstreamtrue \xdef\currentoutputstream{#1}% - \ctxlua{streams.enable("#1")}} + \clf_enablestream{#1}} \unexpanded\def\disableoutputstream {\inoutputstreamfalse \global\let\currentoutputstream\s!default - \ctxlua{streams.disable()}} + \clf_disablestream} \unexpanded\def\startoutputstream[#1]% {\begingroup @@ -63,10 +63,10 @@ \the\everyenableoutputstream \inoutputstreamtrue \xdef\currentoutputstream{#1}% - \ctxlua{streams.start("#1")}} + \clf_startstream{#1}} \unexpanded\def\stopoutputstream - {\ctxlua{streams.stop()}% + {\clf_stopstream \endgroup} \unexpanded\def\startoutputsubstream[#1]% just push/pop instead @@ -77,13 +77,13 @@ {\globalpopmacro\currentoutputstream \enableoutputstream[\currentoutputstream]} -\def\flushoutputstream [#1]{\ctxlua{streams.flush("#1")}} -\def\outputstreamcopy [#1]{\vbox{\ctxlua{streams.flush("#1",true)}}} -\def\outputstreambox [#1]{\vbox{\ctxlua{streams.flush("#1")}}} -\def\outputstreamunvcopy[#1]{\ctxlua{streams.flush("#1",true)}} -\def\outputstreamunvbox [#1]{\ctxlua{streams.flush("#1")}} -\def\synchronizestreams [#1]{\ctxlua{streams.synchronize("#1")}} -\def\dopushoutputstream [#1]{\ctxlua{streams.push("#1")}} +\def\flushoutputstream [#1]{\clf_flushstream{#1}} +\def\outputstreambox [#1]{\vbox{\clf_flushstream{#1}}} +\def\outputstreamcopy [#1]{\vbox{\clf_flushstreamcopy{#1}}} +\def\outputstreamunvbox [#1]{\clf_flushstream{#1}} +\def\outputstreamunvcopy[#1]{\clf_flushstreamcopy{#1}} +\def\synchronizestreams [#1]{\clf_synchronizestream{#1}} +\def\dopushoutputstream [#1]{\clf_pushstream{#1}} \unexpanded\def\pushoutputstream {\dosingleempty\dopushoutputstream} diff --git a/Master/texmf-dist/tex/context/base/page-txt.mkvi b/Master/texmf-dist/tex/context/base/page-txt.mkvi index 6d8d50028d9..76143a01859 100644 --- a/Master/texmf-dist/tex/context/base/page-txt.mkvi +++ b/Master/texmf-dist/tex/context/base/page-txt.mkvi @@ -142,11 +142,11 @@ %D \showsetup{noheaderandfooterlines} %D \showsetup{notopandbottomlines} -\def\noheaderandfooterlines +\unexpanded\def\noheaderandfooterlines {\setuplayoutelement[\v!header][\c!state=\v!empty]% \setuplayoutelement[\v!footer][\c!state=\v!empty]} -\def\notopandbottomlines +\unexpanded\def\notopandbottomlines {\setuplayoutelement[\v!top ][\c!state=\v!empty]% \setuplayoutelement[\v!bottom][\c!state=\v!empty]} @@ -253,7 +253,7 @@ %D only when double sided typesetting is enabled. \unexpanded\def\page_layouts_process_element_double - {\doifoddpageelse + {\doifelseoddpage \page_layouts_process_element_double_odd \page_layouts_process_element_double_even} @@ -378,6 +378,9 @@ \doubleexpandafter\firstoftwoarguments \fi\fi} +\let\doiflayouttextlineelse\doifelselayouttextline +\let\doiflayoutsomelineelse\doifelselayoutsomeline + \newconditional\resyncaftertextline \setvalue{\??layouttextsline\v!normal}{\page_layouts_place_text_line_indeed} @@ -418,7 +421,7 @@ %D The following macro has to be called after a page %D is flushed. -\def\resetlayouttextlines % public +\unexpanded\def\resetlayouttextlines % public {\csname\??layouttextsreset\v!top \endcsname \csname\??layouttextsreset\v!header\endcsname \csname\??layouttextsreset\v!text \endcsname @@ -435,7 +438,7 @@ % \settext[header][text][middle][xxx][yyy] -\def\settextcontent +\unexpanded\def\settextcontent {\doquintupleempty\page_layouts_set_text_content} \def\page_layouts_set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text @@ -456,7 +459,7 @@ \c!rightstyle\c!rightcolor\c!rightwidth{#one}}% \fi\fi\fi} -\def\resettextcontent +\unexpanded\def\resettextcontent {\dotripleempty\page_layouts_reset_text_content} \def\page_layouts_reset_text_content[#vertical][#horizontal][#tag]% header text middle @@ -756,10 +759,12 @@ \page_layouts_reset_page_number_location \ifx\p_strc_pagenumbers_location\empty % set otherwise + \else\ifx\p_strc_pagenumbers_location\v!none + % set otherwise \else \page_layouts_identify_page_number_location \page_layouts_set_page_number_location - \fi + \fi\fi \fi} \def\page_layouts_place_page_number_left % historic diff --git a/Master/texmf-dist/tex/context/base/phys-dim.lua b/Master/texmf-dist/tex/context/base/phys-dim.lua index 870cbd29b0e..7430b62d773 100644 --- a/Master/texmf-dist/tex/context/base/phys-dim.lua +++ b/Master/texmf-dist/tex/context/base/phys-dim.lua @@ -50,12 +50,11 @@ local utfchar = utf.char physics = physics or { } physics.units = physics.units or { } -local variables = interfaces.variables -local v_reverse = variables.reverse local allocate = utilities.storage.allocate local context = context local commands = commands +local implement = interfaces.implement local trace_units = false local report_units = logs.reporter("units") @@ -173,8 +172,8 @@ local p_c = (ddigitspace^1 * dskipperiod)^0 -- ___. local p_c_dparser = math_one + math_two + dleader * p_c * dtrailer * dfinal local c_p_dparser = math_one + math_two + dleader * c_p * dtrailer * dfinal -function commands.digits(str,p_c) - if p_c == v_reverse then +local function makedigits(str,reverse) + if reverse then matchlpeg(p_c_dparser,str) else matchlpeg(c_p_dparser,str) @@ -287,18 +286,29 @@ local long_units = { -- synonyms - ["Metric Ton"] = "tonne", + MetricTon = "tonne", Litre = "liter", + ["Metric Ton"] = "tonne", + -- non-SI units whose values must be obtained experimentally (Table 7) - ["Electron Volt"] = "electronvolt", + AtomicMassUnit = "atomicmassunit", + AstronomicalUnit = "astronomicalunit", + ElectronVolt = "electronvolt", Dalton = "dalton", + ["Atomic Mass Unit"] = "atomicmassunit", ["Astronomical Unit"] = "astronomicalunit", + ["Electron Volt"] = "electronvolt", -- special cases (catch doubles, okay, a bit over the top) + DegreesCelsius = "celsius", + DegreesFahrenheit = "fahrenheit", + DegreeCelsius = "celsius", + DegreeFahrenheit = "fahrenheit", + ["Degrees Celsius"] = "celsius", ["Degrees Fahrenheit"] = "fahrenheit", ["Degree Celsius"] = "celsius", @@ -323,12 +333,14 @@ local long_units = { Hg = "mercury", -- ["Millimetre Of Mercury"] = [[mmHg]], Angstrom = "angstrom", -- strictly Ångström - ["Nautical Mile"] = "nauticalmile", + NauticalMile = "nauticalmile", Barn = "barn", Knot = "knot", Neper = "neper", Bel = "bel", -- in practice only decibel used + ["Nautical Mile"] = "nauticalmile", + -- other non-SI units from CGS system (Table 9) Erg = "erg", @@ -601,7 +613,7 @@ labels.units = allocate { electronvolt = { labels = { en = [[eV]] } }, dalton = { labels = { en = [[Da]] } }, atomicmassunit = { labels = { en = [[u]] } }, - astronomicalunit = { labels = { en = [[ua]] } }, + astronomicalunit = { labels = { en = [[au]] } }, bar = { labels = { en = [[bar]] } }, angstrom = { labels = { en = [[Å]] } }, -- strictly Ångström nauticalmile = { labels = { en = [[M]] } }, @@ -799,6 +811,18 @@ local function update_parsers() -- todo: don't remap utf sequences + V("nothing") * V("shortunit") + V("longprefix") * V("shortunit") -- centi m + V("shortprefix") * V("longunit"), -- c meter + +-- combination = ( V("longprefix") -- centi meter +-- + V("nothing") +-- ) * V("longunit") +-- + ( V("shortprefix") -- c m +-- + V("nothing") +-- + V("longprefix") +-- ) * V("shortunit") -- centi m +-- + ( V("shortprefix") -- c meter +-- ) * V("longunit"), + + dimension = V("somespace") * ( V("packaged") / dimpre @@ -812,9 +836,7 @@ local function update_parsers() -- todo: don't remap utf sequences * V("somespace"), snippet = V("dimension") + V("somesymbol"), - unit = ( - V("snippet") - * (V("operator") * V("snippet"))^0 + unit = ( V("snippet") * (V("operator") * V("snippet"))^0 + V("somepackaged") )^1, } @@ -854,7 +876,7 @@ local p_c_parser = nil local c_p_parser = nil local dirty = true -function commands.unit(str,p_c) +local function makeunit(str,reverse) if dirty then if trace_units then report_units("initializing parser") @@ -863,7 +885,7 @@ function commands.unit(str,p_c) dirty = false end local ok - if p_c == v_reverse then + if reverse then ok = matchlpeg(p_c_parser,str) else ok = matchlpeg(c_p_parser,str) @@ -909,7 +931,7 @@ local mapping = { packaged = "packaged", } -function commands.registerunit(category,list) +local function registerunit(category,list) if not list or list == "" then list = category category = "unit" @@ -922,3 +944,11 @@ function commands.registerunit(category,list) end -- inspect(tables) end + +physics.units.registerunit = registerunit + +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" } } diff --git a/Master/texmf-dist/tex/context/base/phys-dim.mkiv b/Master/texmf-dist/tex/context/base/phys-dim.mkiv index 3de6b23449d..232edc2fc5e 100644 --- a/Master/texmf-dist/tex/context/base/phys-dim.mkiv +++ b/Master/texmf-dist/tex/context/base/phys-dim.mkiv @@ -246,12 +246,12 @@ \unexpanded\def\phys_digits_indeed#1% {\dontleavehmode \begingroup - \ctxcommand{digits(\!!bs\detokenize{#1}\!!es,"\ifcase\c_phys_digits_order \v!normal\else\v!reverse\fi")}% + \ifcase\c_phys_digits_order\expandafter\clf_digits_normal\else\expandafter\clf_digits_reverse\fi{\detokenize{#1}}% \endgroup \settrue\c_phys_units_dospace} \unexpanded\def\digits - {\doifnextbgroupelse\phys_digits_argument\phys_digits_spaced} + {\doifelsenextbgroup\phys_digits_argument\phys_digits_spaced} \def\phys_digits_argument#1% {\phys_digits_indeed{#1}} @@ -500,7 +500,8 @@ \to \everyunits \unexpanded\def\phys_units_indeed#1% - {\ctxcommand{unit(\!!bs\detokenize{#1}\!!es,"\unitparameter\c!order")}} + {\edef\p_order{\unitparameter\c!order}% + \ifx\p_order\v!reverse\expandafter\clf_unit_reverse\else\expandafter\clf_unit_normal\fi{\detokenize{#1}}} \unexpanded\def\unitsPUS#1#2#3{\phys_units_next\prefixtext{#1}\unittext{#2}\unitsraise{\suffixtext{#3}}\c_phys_units_state\plusone} % suffix \unexpanded\def\unitsPU #1#2{\phys_units_next\prefixtext{#1}\unittext{#2}\c_phys_units_state\plusthree} % unit @@ -578,7 +579,7 @@ \let\unitsNstartindeed\unitsNstart \unexpanded\def\unitsNstart - {\doifnextcharelse\unitsNstop\gobbleoneargument\unitsNstartindeed} + {\doifelsenextchar\unitsNstop\gobbleoneargument\unitsNstartindeed} % End of hack. @@ -682,10 +683,10 @@ \definelabelclass [prefix] [2] \definelabelclass [suffix] [2] % This is only a label because we want to show them in a table. -\ctxcommand{definelabels("prefix", "prefixes" )} -\ctxcommand{definelabels("unit", "units" )} -\ctxcommand{definelabels("operator","operators")} -\ctxcommand{definelabels("suffix", "suffixes" )} +\clf_definelabels{prefix}{prefixes}\s!false\relax +\clf_definelabels{unit}{units}\s!false\relax +\clf_definelabels{operator}{operators}\s!false\relax +\clf_definelabels{suffix}{suffixes}\s!false\relax %D You can define additional units: %D @@ -716,7 +717,7 @@ {\dodoubleempty\phys_units_register} \def\phys_units_register[#1][#2]% - {\ctxcommand{registerunit(\!!bs#1\!!es,\!!bs#2\!!es)}} + {\clf_registerunit{#1}{#2}} %D You can generate a list as follows: %D diff --git a/Master/texmf-dist/tex/context/base/ppchtex.mkiv b/Master/texmf-dist/tex/context/base/ppchtex.mkiv index 0f42f91ce9b..d1167d4143a 100644 --- a/Master/texmf-dist/tex/context/base/ppchtex.mkiv +++ b/Master/texmf-dist/tex/context/base/ppchtex.mkiv @@ -100,11 +100,11 @@ \newconstant\chemicaldrawingmode -\doifdefinedelse{beginpicture} % PiCTeX - {\doifdefinedelse{startMPdrawing} +\doifelsedefined{beginpicture} % PiCTeX + {\doifelsedefined{startMPdrawing} {\chemicaldrawingmode\plustwo } % MetaPost {\chemicaldrawingmode\zerocount}} % raw - {\doifdefinedelse{psaxes} + {\doifelsedefined{psaxes} {\chemicaldrawingmode\plusone } % PSTricks {\chemicaldrawingmode\plusthree}} % unknown @@ -387,7 +387,7 @@ {\def\maxchemical{#1}} \def\doifchemicalnumber#1#2#3% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\ifnum#1>\maxchemical\relax \writestatus{ppchtex}{number #1 is skipped}% \else @@ -682,7 +682,7 @@ \edef\@@chemicaltop {\the\!!countc}% \edef\@@chemicalbottom{\the\!!countd}% % - \doifinsetelse\v!on{\@@chemicalframe,\@@chemicalaxis} + \doifelseinset\v!on{\@@chemicalframe,\@@chemicalaxis} {\def\@@chemicalborder{\chemicalframe}} {\def\@@chemicalborder{\normalchemicalframe}}% % @@ -867,14 +867,14 @@ \def\chemicalrepeat {1} \def\redoprocesschemical[#1#2]% - {\doifinstringelse{#1}{0123456789.} + {\doifelseinstring{#1}{0123456789.} {\edef\chemicalrepeat{\chemicalrepeat#1}% \redoprocesschemical[#2]} {\processchemical[#1#2]% \def\chemicalrepeat{1}}} \def\doprocesschemical[#1#2]#3% - {\doifinstringelse{#1}{0123456789.} + {\doifelseinstring{#1}{0123456789.} {\def\chemicalrepeat{#1}% \redoprocesschemical[#2]} {#3}} @@ -891,9 +891,9 @@ \divide\dimen0 by \@@localchemicalscale \!!counta=\dimen0 \def\doprocess[##1##2]% - {\doifinstringelse{##1}{128} + {\doifelseinstring{##1}{128} {\edef\chemicaloffset{\the\!!counta}} - {\doifinstringelse{##1}{456} + {\doifelseinstring{##1}{456} {\edef\chemicaloffset{-\the\!!counta}} {\doifelse{##1}{0} {\edef\chemicaloffset{0}} @@ -917,9 +917,9 @@ \dimen0=.25\wd0 \divide\dimen0 by \@@localchemicalscale \!!counta=\dimen0 - \doifinstringelse{#1}{128} + \doifelseinstring{#1}{128} {\edef\chemicaloffset{\the\!!counta}} - {\doifinstringelse{#1}{456} + {\doifelseinstring{#1}{456} {\edef\chemicaloffset{-\the\!!counta}} {\doifelse{#1}{0} {\edef\chemicaloffset{0}} @@ -959,7 +959,7 @@ \setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}} \def\chemicalrotate[#1]% - {\doifdefinedelse{\s!mirror#1} + {\doifelsedefined{\s!mirror#1} {\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}% \getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}} {\getvalue{\s!rotate\chemicalrotation.#1}% @@ -984,7 +984,7 @@ \def\processchemicalrotation#1% {\def\doprocess[##1##2]% - {\doifnumberelse{##1} + {\doifelsenumber{##1} {\def\chemicalrotation{##1}} {\unknownchemical{ROT#1}}}% \doprocess[#1]} @@ -1067,9 +1067,11 @@ \def\dodoifsinglelocation#1#2\\#3% {\ifx#2\relax#3\fi} -\def\doifsinglelocationelse#1% +\def\doifelsesinglelocation#1% {\expandafter\dodoifsinglelocationelse#1\relax\\} +\let\doifsinglelocationelse\doifelsesinglelocation + \def\putchemicaltext#1#2% {\enablechemicalspecials \ifchemicalpicture @@ -1706,7 +1708,7 @@ \newif\ifinnerchemical \def\dosimplechemical#1#2#3% - {\doifdefinedelse{\??chemical\c!location} + {\doifelsedefined{\??chemical\c!location} {\writestatus{ppchtex}{the {}{}-alternative is not permitted here}} {\ifinnerchemical \let\chemicalsign = \chemicalinnersign @@ -2065,7 +2067,7 @@ HIGH=>\sethighsubscripts, LOW=>\setlowsubscripts, \s!default=>, - \s!unknown=>\doifdefinedelse{\s!executechemical#1} + \s!unknown=>\doifelsedefined{\s!executechemical#1} {\def\chemicalrotation{1}% \def\chemicaloffset{0}% \doifdefined{\s!executechemical#1} @@ -2260,9 +2262,9 @@ {\dosingleargument\dodefinechemical} \def\getpredefinedchemical#1% - {\doifdefinedelse{\??chemical#1} + {\doifelsedefined{\??chemical#1} {\getvalue{\??chemical#1}} - {\doifdefinedelse{#1} + {\doifelsedefined{#1} {\getvalue{#1}} {\writestatus{ppchtex}{unknown chemical definition #1}}}} diff --git a/Master/texmf-dist/tex/context/base/publ-aut.lua b/Master/texmf-dist/tex/context/base/publ-aut.lua index ba492a93bd6..820ac78ff3b 100644 --- a/Master/texmf-dist/tex/context/base/publ-aut.lua +++ b/Master/texmf-dist/tex/context/base/publ-aut.lua @@ -11,23 +11,32 @@ if not characters then dofile(resolvers.findfile("char-ini.lua")) end -local context = context -local chardata = characters.data +local lpeg = lpeg -local tostring = tostring +local type, next, tostring = type, next, tostring local concat = table.concat -local lpeg = lpeg local utfchar = utf.char +local formatters = string.formatters + +local P, C, V, Cs, Ct, Cg, Cf, Cc = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.Cg, lpeg.Cf, lpeg.Cc +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns + +local context = context +----- commands = commands -local publications = publications or { } +local implement = interfaces.implement +local ctx_setmacro = interfaces.setmacro -local datasets = publications.datasets or { } -publications.datasets = datasets +local publications = publications -publications.authors = publications.authors or { } -local authors = publications.authors +local datasets = publications.datasets +local getcasted = publications.getcasted -local P, C, V, Cs, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.match, lpeg.patterns +local allocate = utilities.storage.allocate + +local chardata = characters.data + +local report = logs.reporter("publications","authors") -- local function makesplitter(separator) -- return Ct { "start", @@ -38,17 +47,26 @@ local P, C, V, Cs, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs -- } -- end -local space = P(" ") +-- authorlist = { authorspec and authorspec and authorspec } +-- authorspec = composedname +-- authorspec = surnames, firstnames +-- authorspec = von, surnames, firstnames +-- authorspec = von, surnames, jr, firstnames +-- authorspec = von, surnames, jr, firstnames, initials + +local space = lpegpatterns.whitespace local comma = P(",") +local period = P(".") +local dash = P("-") local firstcharacter = lpegpatterns.utf8byte +local utf8character = lpegpatterns.utf8character +local p_and = space^1 * (P("and") + P("&&") + P("++")) * space^1 +local p_comma = space^0 * comma * space^0 +local p_space = space^1 +local p_shortone = C((utf8character -dash-period)^1) +local p_longone = C( utf8character) * (1-dash-period)^0 --- local andsplitter = lpeg.tsplitat(space^1 * "and" * space^1) --- local commasplitter = lpeg.tsplitat(space^0 * comma * space^0) --- local spacesplitter = lpeg.tsplitat(space^1) - -local p_and = space^1 * "and" * space^1 -local p_comma = space^0 * comma * space^0 -local p_space = space^1 +local p_empty = P("{}")/"" * #(p_space^0 * (P(-1) + P(","))) local andsplitter = Ct { "start", start = (Cs((V("inner") + (1-p_and))^1) + p_and)^1, @@ -56,7 +74,7 @@ local andsplitter = Ct { "start", } local commasplitter = Ct { "start", - start = Cs(V("outer")) + (Cs((V("inner") + (1-p_comma))^1) + p_comma)^1, + start = Cs(V("outer")) + (p_empty + Cs((V("inner") + (1-p_comma))^1) + p_comma)^1, outer = (P("{")/"") * ((V("inner") + P(1-P("}")))^1) * (P("}")/""), inner = P("{") * ((V("inner") + P(1-P("}")))^1) * P("}"), } @@ -67,18 +85,40 @@ local spacesplitter = Ct { "start", inner = P("{") * ((V("inner") + P(1-P("}")))^1) * P("}"), } +local p_initial = p_shortone * period * dash^0 + + p_longone * (period + dash + P(-1)) +local initialsplitter = p_initial * P(-1) + Ct((p_initial)^1) + +local optionsplitter = Cf(Ct("") * Cg(C((1-space)^1) * space^0 * Cc(true))^1,rawset) + local function is_upper(str) local first = lpegmatch(firstcharacter,str) local okay = chardata[first] return okay and okay.category == "lu" end +-- local cleaner = Cs( ( P("{}")/"" + P(1) )^1 ) + local cache = { } -- 33% reuse on tugboat.bib local nofhits = 0 local nofused = 0 +publications.authorcache = cache + +local function makeinitials(firstnames) + if firstnames and #firstnames > 0 then + local initials = { } + for i=1,#firstnames do + initials[i] = lpegmatch(initialsplitter,firstnames[i]) + end + return initials + end +end + local function splitauthorstring(str) - if not str then + if str then + -- str = lpegmatch(cleaner,str) + else return end nofused = nofused + 1 @@ -97,12 +137,15 @@ local function splitauthorstring(str) -- print("hit 2",author,nofhits,nofused,math.round(100*nofhits/nofused)) end if not detail then - local firstnames, vons, surnames, initials, juniors + local firstnames, vons, surnames, initials, juniors, options local split = lpegmatch(commasplitter,author) --- inspect(split) local n = #split + detail = { + original = author, + snippets = n, + } if n == 1 then - -- First von Last + -- {First Middle von Last} local words = lpegmatch(spacesplitter,author) firstnames, vons, surnames = { }, { }, { } local i, n = 1, #words @@ -132,14 +175,17 @@ local function splitauthorstring(str) else -- mess end - -- safeguard if #surnames == 0 then + -- safeguard firstnames = { } vons = { } surnames = { author } + else + initials = makeinitials(firstnames) end elseif n == 2 then - -- von Last, First + -- {Last, First} + -- {von Last, First} firstnames, vons, surnames = { }, { }, { } local words = lpegmatch(spacesplitter,split[1]) local i, n = 1, #words @@ -168,33 +214,44 @@ local function splitauthorstring(str) while i <= n do vons[#vons+1], i = words[i], i + 1 end - else - -- von Last, Jr ,First - firstnames = lpegmatch(spacesplitter,split[1]) - juniors = lpegmatch(spacesplitter,split[2]) - surnames = lpegmatch(spacesplitter,split[3]) - if n > 3 then - -- error + if surnames and firstnames and #surnames == 0 then + -- safeguard + surnames[1] = firstnames[#firstnames] + firstnames[#firstnames] = nil end - end - if #surnames == 0 then - surnames[1] = firstnames[#firstnames] - firstnames[#firstnames] = nil - end - if firstnames then - initials = { } - for i=1,#firstnames do - initials[i] = utfchar(lpegmatch(firstcharacter,firstnames[i])) + initials = makeinitials(firstnames) + elseif n == 3 then + -- {von Last, First, Jr} + surnames = lpegmatch(spacesplitter,split[1]) + juniors = lpegmatch(spacesplitter,split[2]) + firstnames = lpegmatch(spacesplitter,split[3]) + initials = makeinitials(firstnames) + elseif n == 4 then + -- {Von, Last, First, Jr} + vons = lpegmatch(spacesplitter,split[1]) + surnames = lpegmatch(spacesplitter,split[2]) + juniors = lpegmatch(spacesplitter,split[3]) + firstnames = lpegmatch(spacesplitter,split[4]) + initials = makeinitials(firstnames) + elseif n >= 5 then + -- {Von, Last, First, Jr, F.} + -- {Von, Last, First, Jr, Fr., options} + vons = lpegmatch(spacesplitter,split[1]) + surnames = lpegmatch(spacesplitter,split[2]) + juniors = lpegmatch(spacesplitter,split[3]) + firstnames = lpegmatch(spacesplitter,split[4]) + initials = lpegmatch(spacesplitter,split[5]) + options = split[6] + if options then + options = lpegmatch(optionsplitter,options) end end - detail = { - original = author, - firstnames = firstnames, - vons = vons, - surnames = surnames, - initials = initials, - juniors = juniors, - } + if firstnames and #firstnames > 0 then detail.firstnames = firstnames end + if vons and #vons > 0 then detail.vons = vons end + if surnames and #surnames > 0 then detail.surnames = surnames end + if initials and #initials > 0 then detail.initials = initials end + if juniors and #juniors > 0 then detail.juniors = juniors end + if options and next(options) then detail.options = options end cache[author] = detail nofhits = nofhits + 1 end @@ -203,348 +260,326 @@ local function splitauthorstring(str) return authors end --- local function splitauthors(dataset,tag,field) --- local entries = datasets[dataset] --- local luadata = entries.luadata --- if not luadata then --- return { } --- end --- local entry = luadata[tag] --- if not entry then --- return { } --- end --- return splitauthorstring(entry[field]) --- end - -local function the_initials(initials,symbol) - local t, symbol = { }, symbol or "." +local function the_initials(initials,symbol,connector) + if not symbol then + symbol = "." + end + if not connector then + connector = "-" + end + local result, r = { }, 0 for i=1,#initials do - t[i] = initials[i] .. symbol + local initial = initials[i] + if type(initial) == "table" then + local set, s = { }, 0 + for i=1,#initial do + if i > 1 then + s = s + 1 ; set[s] = connector + end + s = s + 1 ; set[s] = initial[i] + s = s + 1 ; set[s] = symbol + end + r = r + 1 ; result[r] = concat(set) + else + r = r + 1 ; result[r] = initial .. symbol + end end - return t + return result end --- authors - -local settings = { } - --- local defaultsettings = { --- firstnamesep = " ", --- vonsep = " ", --- surnamesep = " ", --- juniorsep = " ", --- surnamejuniorsep = ", ", --- juniorjuniorsep = ", ", --- surnamefirstnamesep = ", ", --- surnameinitialsep = ", ", --- namesep = ", ", --- lastnamesep = " and ", --- finalnamesep = " and ", --- etallimit = 1000, --- etaldisplay = 1000, --- etaltext = "", --- } - -local defaultsettings = { - firstnamesep = [[\btxlistvariantparameter{firstnamesep}]], - vonsep = [[\btxlistvariantparameter{vonsep}]], - surnamesep = [[\btxlistvariantparameter{surnamesep}]], - juniorsep = [[\btxlistvariantparameter{juniorsep}]], - surnamejuniorsep = [[\btxlistvariantparameter{surnamejuniorsep}]], - juniorjuniorsep = [[\btxlistvariantparameter{juniorjuniorsep}]], - surnamefirstnamesep = [[\btxlistvariantparameter{surnamefirstnamesep}]], - surnameinitialsep = [[\btxlistvariantparameter{surnameinitialsep}]], - namesep = [[\btxlistvariantparameter{namesep}]], - lastnamesep = [[\btxlistvariantparameter{lastnamesep}]], - finalnamesep = [[\btxlistvariantparameter{finalnamesep}]], - -- - etaltext = [[\btxlistvariantparameter{etaltext}]], - -- - etallimit = 1000, - etaldisplay = 1000, -} - -function authors.setsettings(s) +local ctx_btxsetconcat = context.btxsetconcat +local ctx_btxsetoverflow = context.btxsetoverflow +local ctx_btxsetinitials = context.btxsetinitials +local ctx_btxsetfirstnames = context.btxsetfirstnames +local ctx_btxsetvons = context.btxsetvons +local ctx_btxsetsurnames = context.btxsetsurnames +local ctx_btxsetjuniors = context.btxsetjuniors +local ctx_btxciteauthorsetup = context.btxciteauthorsetup +local ctx_btxlistauthorsetup = context.btxlistauthorsetup +local ctx_btxsetauthorvariant = context.btxsetauthorvariant +local ctx_btxstartauthor = context.btxstartauthor +local ctx_btxstopauthor = context.btxstopauthor + +local concatstate = publications.concatstate +local f_invalid = formatters[""] + +local currentauthordata = nil +local currentauthorsymbol = nil + +local manipulators = typesetters.manipulators +local splitmanipulation = manipulators.splitspecification +local applymanipulation = manipulators.applyspecification +local manipulatormethods = manipulators.methods + +local function value(i,field) + if currentauthordata then + local entry = currentauthordata[i] + if entry then + local value = entry[field] + if value and #value > 0 then + return value + end + end + end end -authors.splitstring = splitauthorstring - --- [firstnames] [firstnamesep] [vons] [vonsep] [surnames] [juniors] [surnamesep] (Taco, von Hoekwater, jr) - -function authors.normal(author,settings) - local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors - local result, settings = { }, settings or defaultsettings - if firstnames and #firstnames > 0 then - result[#result+1] = concat(firstnames," ") - result[#result+1] = settings.firstnamesep or defaultsettings.firstnamesep - end - if vons and #vons > 0 then - result[#result+1] = concat(vons," ") - result[#result+1] = settings.vonsep or defaultsettings.vonsep - end - if surnames and #surnames > 0 then - result[#result+1] = concat(surnames," ") - if juniors and #juniors > 0 then - result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep - result[#result+1] = concat(juniors," ") +implement { name = "btxcurrentfirstnames", arguments = "integer", actions = function(i) local v = value(i,"initials") if v then context(concat(the_initials(v,currentauthorsymbol))) end end } +implement { name = "btxcurrentinitials", arguments = "integer", actions = function(i) local v = value(i,"firstnames") if v then context(concat(v," ")) end end } +implement { name = "btxcurrentjuniors", arguments = "integer", actions = function(i) local v = value(i,"juniors") if v then context(concat(v," ")) end end } +implement { name = "btxcurrentsurnames", arguments = "integer", actions = function(i) local v = value(i,"surnames") if v then context(concat(v," ")) end end } +implement { name = "btxcurrentvons", arguments = "integer", actions = function(i) local v = value(i,"vons") if v then context(concat(v," ")) end end } + +local function btxauthorfield(i,field) + if currentauthordata then + local entry = currentauthordata[i] + if entry then + local manipulator, field = splitmanipulation(field) + local value = entry[field] + if not value or #value == 0 then + -- value, no need for message + elseif manipulator then + for i=1,#value do + if i > 1 then + context(" ") + end + context(applymanipulation(manipulator,value) or value) + end + elseif field == "initials" then + context(concat(the_initials(value,currentauthorsymbol))) + else + context(concat(value," ")) + end end - elseif juniors and #juniors > 0 then - result[#result+1] = concat(juniors," ") end - return concat(result) end --- [initials] [initialsep] [vons] [vonsep] [surnames] [juniors] [surnamesep] (T, von Hoekwater, jr) +-- This is somewhat tricky: an author is not always an author but +-- can also be a title or key, depending on the (optional) set it's +-- in. Also, authors can be combined with years and so and they +-- might be called upon mixed with other calls. + +local function btxauthor(dataset,tag,field,settings) + local split, usedfield, kind = getcasted(dataset,tag,field) + if kind == "author" then + local max = split and #split or 0 + if max == 0 then + return + -- error + end + local etallimit = tonumber(settings.etallimit) or 1000 + local etaldisplay = tonumber(settings.etaldisplay) or etallimit + local combiner = settings.combiner + local symbol = settings.symbol + local index = settings.index + if not combiner or combiner == "" then + combiner = "normal" + end + if not symbol then + symbol = "." + end + local ctx_btxsetup = settings.kind == "cite" and ctx_btxciteauthorsetup or ctx_btxlistauthorsetup + if max > etallimit and etaldisplay < max then + max = etaldisplay + end + currentauthordata = split + currentauthorsymbol = symbol -function authors.normalshort(author,settings) - local initials, vons, surnames, juniors = author.initials, author.vons, author.surnames, author.juniors - local result, settings = { }, settings or defaultsettings - if initials and #initials > 0 then - result[#result+1] = concat(initials," ") - result[#result+1] = settings.initialsep or defaultsettings.initialsep - end - if vons and #vons > 0 then - result[#result+1] = concat(vons," ") - result[#result+1] = settings.vonsep or defaultsettings.vonsep - end - if surnames and #surnames > 0 then - result[#result+1] = concat(surnames," ") - if juniors and #juniors > 0 then - result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep - result[#result+1] = concat(juniors," ") + local function oneauthor(i) + local author = split[i] + if index then + ctx_btxstartauthor(i,1,0) + else + local state = author.state or 0 + ctx_btxstartauthor(i,max,state) + ctx_btxsetconcat(concatstate(i,max)) + ctx_btxsetauthorvariant(combiner) + end + local initials = author.initials + if initials and #initials > 0 then + ctx_btxsetinitials() -- (concat(the_initials(initials,symbol)," ")) + end + local firstnames = author.firstnames + if firstnames and #firstnames > 0 then + ctx_btxsetfirstnames() -- (concat(firstnames," ")) + end + local vons = author.vons + if vons and #vons > 0 then + ctx_btxsetvons() -- (concat(vons," ")) + end + local surnames = author.surnames + if surnames and #surnames > 0 then + ctx_btxsetsurnames() -- (concat(surnames," ")) + end + local juniors = author.juniors + if juniors and #juniors > 0 then + ctx_btxsetjuniors() -- (concat(juniors," ")) + end + if not index and i == max then + local overflow = #split - max + if overflow > 0 then + ctx_btxsetoverflow(overflow) + end + end + ctx_btxsetup(combiner) + ctx_btxstopauthor() + end + if index then + oneauthor(index) + else + for i=1,max do + oneauthor(i) + end end - elseif juniors and #juniors > 0 then - result[#result+1] = concat(juniors," ") + else + report("ignored field %a of tag %a, used field %a is no author",field,tag,usedfield) end - return concat(result) end --- vons surnames juniors, firstnames +implement { + name = "btxauthorfield", + actions = btxauthorfield, + arguments = { "integer", "string" } +} --- [vons] [vonsep] [surnames] [surnamejuniorsep] [juniors] [surnamefirstnamesep] [firstnames] (von Hoekwater jr, Taco) +implement { + name = "btxauthor", + actions = btxauthor, + arguments = { + "string", + "string", + "string", + { + { "combiner" }, + { "kind" }, + { "etallimit" }, + { "etaldisplay" }, + { "symbol" }, + } + } +} -function authors.inverted(author,settings) - local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors - local result, settings = { }, settings or defaultsettings - if vons and #vons > 0 then - result[#result+1] = concat(vons," ") - result[#result+1] = settings.vonsep or defaultsettings.vonsep - end - if surnames and #surnames > 0 then - result[#result+1] = concat(surnames," ") - if juniors and #juniors > 0 then - result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep - result[#result+1] = concat(juniors," ") - end - elseif juniors and #juniors > 0 then - result[#result+1] = concat(juniors," ") - end - if firstnames and #firstnames > 0 then - result[#result+1] = settings.surnamefirstnamesep or defaultsettings.surnamefirstnamesep - result[#result+1] = concat(firstnames," ") - end - return concat(result) +local function components(snippet,short) + local vons = snippet.vons + local surnames = snippet.surnames + local initials = snippet.initials + local firstnames = not short and snippet.firstnames + local juniors = snippet.juniors + return + vons and #vons > 0 and concat(vons," ") or "", + surnames and #surnames > 0 and concat(surnames," ") or "", + initials and #initials > 0 and concat(the_initials(initials)," ") or "", + firstnames and #firstnames > 0 and concat(firstnames," ") or "", + juniors and #juniors > 0 and concat(juniors, " ") or "" end --- [vons] [vonsep] [surnames] [surnamejuniorsep] [juniors] [surnamefirstnamesep] [initials] (von Hoekwater jr, T) +local collapsers = allocate { } -function authors.invertedshort(author,settings) - local vons, surnames, initials, juniors = author.vons, author.surnames, author.initials, author.juniors - local result, settings = { }, settings or defaultsettings +publications.authorcollapsers = collapsers + +local function default(author) + local vons = author.vons + local surnames = author.surnames + local initials = author.initials + local firstnames = author.firstnames + local juniors = author.juniors + local result = { } + local nofresult = 0 if vons and #vons > 0 then - result[#result+1] = concat(vons," ") - result[#result+1] = settings.vonsep or defaultsettings.vonsep + nofresult = nofresult + 1 ; result[nofresult] = concat(vons," ") end if surnames and #surnames > 0 then - result[#result+1] = concat(surnames," ") - if juniors and #juniors > 0 then - result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep - result[#result+1] = concat(juniors," ") - end - elseif juniors and #juniors > 0 then - result[#result+1] = concat(juniors," ") + nofresult = nofresult + 1 ; result[nofresult] = concat(surnames," ") end if initials and #initials > 0 then - result[#result+1] = settings.surnameinitialsep or defaultsettings.surnameinitialsep - result[#result+1] = concat(the_initials(initials)," ") + nofresult = nofresult + 1 ; result[nofresult] = concat(the_initials(initials)," ") end - return concat(result) -end - -local lastconcatsize = 1 - -local function concatnames(t,settings) - local namesep = settings.namesep - local lastnamesep = settings.lastnamesep - local finalnamesep = settings.finalnamesep - local lastconcatsize = #t - if lastconcatsize > 2 then - local s = { } - for i=1,lastconcatsize-2 do - s[i] = t[i] .. namesep - end - s[lastconcatsize-1], s[lastconcatsize] = t[lastconcatsize-1] .. finalnamesep, t[lastconcatsize] - return concat(s) - elseif lastconcatsize > 1 then - return concat(t,lastnamesep) - elseif lastconcatsize > 0 then - return t[1] - else - return "" + if firstnames and #firstnames > 0 then + nofresult = nofresult + 1 ; result[nofresult] = concat(firstnames," ") end + if juniors and #juniors > 0 then + nofresult = nofresult + 1 ; result[nofresult] = concat(juniors," ") + end + return concat(result," ") end -function authors.concat(dataset,tag,field,settings) - table.setmetatableindex(settings,defaultsettings) - local combiner = settings.combiner - if not combiner or type(combiner) == "string" then - combiner = authors[combiner or "normal"] or authors.normal - end - local split = datasets[dataset].details[tag][field] - local etallimit = settings.etallimit or 1000 - local etaldisplay = settings.etaldisplay or etallimit - local max = split and #split or 0 - if max == 0 then - -- error - end - if max > etallimit and etaldisplay < max then - max = etaldisplay +collapsers.default = default + +local function writer(key,snippets) + if not key then + return "" end - local combined = { } - for i=1,max do - combined[i] = combiner(split[i],settings) + if type(key) == "string" then + return key end - local result = concatnames(combined,settings) - if #combined <= max then - return result + local n = #key + if n == 0 then + return "" + elseif n == 1 then + local author = key[1] + local options = author.options + if options then + for option in next, options do + local collapse = collapsers[option] + if collapse then + return collapse(author) + end + end + end + return default(author) else - return result .. settings.etaltext - end -end - -function commands.btxauthor(...) - context(authors.concat(...)) -end - -function authors.short(author,year) - -- todo --- local result = { } --- if author then --- local authors = splitauthors(author) --- for a=1,#authors do --- local aa = authors[a] --- local initials = aa.initials --- for i=1,#initials do --- result[#result+1] = initials[i] --- end --- local surnames = aa.surnames --- for s=1,#surnames do --- result[#result+1] = utfchar(lpegmatch(firstcharacter,surnames[s])) --- end --- end --- end --- if year then --- result[#result+1] = year --- end --- return concat(result) -end - --- We can consider creating a hashtable key -> entry but I wonder if --- pays off. - -local compare = sorters.comparers.basic -- (a,b) -local strip = sorters.strip -local splitter = sorters.splitters.utf - -function authors.preparedsort(dataset,list,sorttype_a,sorttype_b,sorttype_c) - local luadata = datasets[dataset].luadata - local details = datasets[dataset].details - local valid = { } - local splitted = { } - table.setmetatableindex(splitted,function(t,k) -- could be done in the sorter but seldom that many shared - local v = splitter(k,true) -- in other cases - t[k] = v - return v - end) - local snippets = { } - for i=1,#list do - -- either { tag, tag, ... } or { { tag, index }, { tag, index } } - local li = list[i] - local tag = type(li) == "string" and li or li[1] - local entry = luadata[tag] - local detail = details[tag] - local suffix = tostring(i) - local year = nil - local assembled = nil - if entry and detail then - local key = detail[sorttype_a] or detail[sorttype_b] or detail[sorttype_c] - if key then - -- maybe an option is to also sort the authors first - local n = #key - local s = 0 - for i=1,n do - local k = key[i] - local vons = k.vons - local surnames = k.surnames - local initials = k.initials - if vons and #vons > 0 then - s = s + 1 ; snippets[s] = concat(vons," ") - end - if surnames and #surnames > 0 then - s = s + 1 ; snippets[s] = concat(surnames," ") - end - if initials and #initials > 0 then - s = s + 1 ; snippets[s] = concat(initials," ") + local t = { } + local s = 0 + for i=1,n do + local author = key[i] + local options = author.options + s = s + 1 + if options then + local done = false + for option in next, options do + local collapse = collapsers[option] + if collapse then + t[s] = collapse(author) + done = true end end - assembled = concat(snippets," ",1,s) + if not done then + t[s] = default(author) + end else - assembled = "" + t[s] = default(author) end - year = entry.year or "9998" - else - assembled = "" - year = "9999" end - valid[i] = { - index = i, - split = { - splitted[strip(assembled)], - splitted[year], - splitted[suffix], - }, --- names = assembled, --- year = year, --- suffix = suffix, - } + return concat(t," & ") end - return valid end -function authors.sorted(dataset,list,sorttype) -- experimental - local valid = authors.preparedsort(dataset,list,sorttype) - if #valid == 0 or #valid ~= #list then - return list - else - sorters.sort(valid,compare) - for i=1,#valid do - valid[i] = valid[i].index - end - return valid - end -end +publications.writers .author = writer +publications.casters .author = splitauthorstring +publications.components.author = components --- local dataset = publications.datasets.test --- --- local function add(str) --- dataset.details[str] = { author = publications.authors.splitstring(str) } --- end --- --- add("Hagen, Hans and Hoekwater, Taco Whoever T. Ex. and Henkel Hut, Hartmut Harald von der") --- add("Hans Hagen and Taco Whoever T. Ex. Hoekwater and Hartmut Harald von der Henkel Hut") --- add("de Gennes, P. and Gennes, P. de") --- add("van't Hoff, J. H. and {van't Hoff}, J. H.") +-- sharedmethods.author = { +-- { field = "key", default = "", unknown = "" }, +-- { field = "author", default = "", unknown = "" }, +-- { field = "title", default = "", unknown = "" }, +-- } + +-- Analysis of the APA by Alan: -- --- local list = table.keys(dataset.details) --- local sort = publications.authors.sorted("test",list,"author") --- local test = { } for i=1,#sort do test[i] = dataset.details[list[sort[i]]] end +-- first : key author editor publisher title journal volume number pages +-- second: year suffix title month day journal volume number + +publications.sortmethods.authoryear = { + sequence = { + { field = "key", default = "", unknown = "" }, + { field = "author", default = "", unknown = "" }, + { field = "year", default = "9998", unknown = "9999" }, + { field = "suffix", default = " ", unknown = " " }, + { field = "month", default = "13", unknown = "14" }, + { field = "day", default = "32", unknown = "33" }, + { field = "journal", default = "", unknown = "" }, + { field = "volume", default = "", unknown = "" }, + { field = "number", default = "", unknown = "" }, + { field = "title", default = "", unknown = "" }, + { field = "pages", default = "", unknown = "" }, + }, +} diff --git a/Master/texmf-dist/tex/context/base/publ-dat.lua b/Master/texmf-dist/tex/context/base/publ-dat.lua index 6062d0d4cf7..957322f7c2c 100644 --- a/Master/texmf-dist/tex/context/base/publ-dat.lua +++ b/Master/texmf-dist/tex/context/base/publ-dat.lua @@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['publ-dat'] = { -- todo: strip the @ in the lpeg instead of on do_definition and do_shortcut -- todo: store bibroot and bibrootdt +-- todo: dataset = datasets[dataset] => current = datasets[dataset] +-- todo: maybe split this file --[[ldx--

This is a prelude to integrated bibliography support. This file just loads @@ -16,32 +18,42 @@ in a convenient way. Actually handling the data takes place elsewhere.

--ldx]]-- if not characters then - dofile(resolvers.findfile("char-def.lua")) - dofile(resolvers.findfile("char-ini.lua")) + dofile(resolvers.findfile("char-utf.lua")) dofile(resolvers.findfile("char-tex.lua")) end local chardata = characters.data local lowercase = characters.lower -local lower, gsub, find = string.lower, string.gsub, string.find -local concat = table.concat +local lower, find, sub = string.lower, string.find, string.sub +local concat, copy, tohash = table.concat, table.copy, table.tohash local next, type, rawget = next, type, rawget local utfchar = utf.char local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local textoutf = characters and characters.tex.toutf local settings_to_hash, settings_to_array = utilities.parsers.settings_to_hash, utilities.parsers.settings_to_array local formatters = string.formatters -local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash -local xmlcollected, xmltext, xmlconvert = xml.collected, xml.text, xmlconvert +local sortedkeys, sortedhash, keys = table.sortedkeys, table.sortedhash, table.keys +local xmlcollected, xmltext, xmlconvert = xml.collected, xml.text, xml.convert local setmetatableindex = table.setmetatableindex -- todo: more allocate -local P, R, S, V, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg +local P, R, S, V, C, Cc, Cs, Ct, Carg, Cmt, Cp = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg, lpeg.Cmt, lpeg.Cp + +local p_whitespace = lpegpatterns.whitespace +local p_utf8character = lpegpatterns.utf8character + +local trace = false trackers.register("publications", function(v) trace = v end) +local trace_duplicates = true trackers.register("publications.duplicates", function(v) trace = v end) -local trace = false trackers.register("publications", function(v) trace = v end) local report = logs.reporter("publications") +local report_duplicates = logs.reporter("publications","duplicates") + +local allocate = utilities.storage.allocate + +local commands = commands +local implement = interfaces.implement publications = publications or { } local publications = publications @@ -49,17 +61,120 @@ local publications = publications local datasets = publications.datasets or { } publications.datasets = datasets +local writers = publications.writers or { } +publications.writers = writers + +local tables = publications.tables or { } +publications.tables = tables + publications.statistics = publications.statistics or { } local publicationsstats = publications.statistics +local loaders = publications.loaders or { } +publications.loaders = loaders + +local casters = { } +publications.casters = casters + +-- local sorters = { } +-- publications.sorters = sorters +-- +-- local indexers = { } +-- publications.indexers = indexers + +local components = { } +publications.components = components -- register components + +local enhancers = publications.enhancers or { } +publications.enhancers = enhancers + +local enhancer = publications.enhancer or utilities.sequencers.new { arguments = "dataset" } +publications.enhancer = enhancer + +utilities.sequencers.appendgroup(enhancer,"system") -- private + publicationsstats.nofbytes = 0 publicationsstats.nofdefinitions = 0 publicationsstats.nofshortcuts = 0 publicationsstats.nofdatasets = 0 +local privates = allocate { + category = true, + tag = true, + index = true, + suffix = true, + specification = true, +} + +local specials = allocate { + key = true, + crossref = true, + keywords = true, + language = true, + comment = true, +} + +local implicits = allocate { + category = "implicit", + tag = "implicit", + key = "implicit", + keywords = "implicit", + language = "implicit", + crossref = "implicit", +} + +local origins = allocate { + "optional", + "extra", + "required", + "virtual", +} + +local virtuals = allocate { + "authoryear", + "authoryears", + "authornum", + "num", + "suffix", +} + +local defaulttypes = allocate { + author = "author", + editor = "author", + publisher = "author", + page = "pagenumber", + pages = "pagenumber", + keywords = "keyword", + doi = "url", + url = "url", +} + +local defaultsets = allocate { + page = { "page", "pages" }, +} + +tables.implicits = implicits +tables.origins = origins +tables.virtuals = virtuals +tables.types = defaulttypes +tables.sets = defaultsets +tables.privates = privates +tables.specials = specials + +local variables = interfaces and interfaces.variables or setmetatableindex("self") + +local v_all = variables.all +local v_default = variables.default + +if not publications.usedentries then + function publications.usedentries() + return { } + end +end + local xmlplaceholder = "\n" -local defaultshortcuts = { +local defaultshortcuts = allocate { jan = "1", feb = "2", mar = "3", @@ -74,16 +189,144 @@ local defaultshortcuts = { dec = "12", } -local space = lpeg.patterns.whitespace^0 +local space = p_whitespace^0 local separator = space * "+" * space local l_splitter = lpeg.tsplitat(separator) local d_splitter = lpeg.splitat (separator) +local unknownfield = function(t,k) + local v = "extra" + t[k] = v + return v +end + +local unknowncategory = function(t,k) + local v = { + required = false, + optional = false, + virtual = false, + fields = setmetatableindex(unknownfield), -- this will remember them + types = unknowntypes, + sets = setmetatableindex(defaultsets), -- new, but rather small + } + t[k] = v + return v +end + +local unknowntype = function(t,k) + local v = "string" + t[k] = v + return v +end + +local default = { + name = name, + version = "1.00", + comment = "unknown specification.", + author = "anonymous", + copyright = "no one", + categories = setmetatableindex(unknowncategory), + types = setmetatableindex(defaulttypes,unknowntype), +} + +-- maybe at some point we can have a handlers table with per field +-- a found, fetch, ... method + +local function checkfield(specification,category,data) + local list = setmetatableindex({},implicits) + data.fields = list + data.category = category + local sets = data.sets or { } + for i=1,#origins do + local t = origins[i] + local d = data[t] + if d then + for i=1,#d do + local di = d[i] + di = sets[di] or di + if type(di) == "table" then + for i=1,#di do + list[di[i]] = t + end + else + list[di] = t + end + end + else + data[t] = { } + end + end + return data +end + +local specifications = setmetatableindex(function(t,name) + if not name then + return default -- initializer + end + local filename = formatters["publ-imp-%s.lua"](name) + local fullname = resolvers.findfile(filename) or "" + if fullname == "" then + report("no data definition file %a for %a",filename,name) + return default + end + local specification = table.load(fullname) + if not specification then + report("invalid data definition file %a for %a",fullname,name) + return default + end + -- + local categories = specification.categories + if not categories then + categories = { } + specification.categories = categories + end + setmetatableindex(categories,unknowncategory) + -- + local types = specification.types + if not types then + types = defaulttypes + specification.types = types + end + setmetatableindex(types,unknowntype) + -- + local fields = setmetatableindex(unknownfield) + specification.fields = fields + -- + local virtual = specification.virtual + if virtual == nil then -- so false is valid + virtual = { } + elseif virtual == false then + virtual = { } + elseif type(virtual) ~= table then + virtual = virtuals + end + specification.virtual = virtual + specification.virtualfields = tohash(virtual) + -- + for category, data in next, categories do + categories[category] = checkfield(specification,category,copy(data)) -- we make sure we have no clones + end + -- + t[name] = specification + -- + return specification +end) + +publications.specifications = specifications + +function publications.setcategory(target,category,data) + local specification = specifications[target] + specification.categories[category] = checkfield(specification,category,data) +end + function publications.parenttag(dataset,tag) - if find(tag,"%+") then + if not dataset or not tag then + report("error in specification, dataset %a, tag %a",dataset,tag) + elseif find(tag,"%+") then local tags = lpegmatch(l_splitter,tag) local parent = tags[1] - local luadata = datasets[dataset].luadata + local current = datasets[dataset] + local luadata = current.luadata local first = luadata[parent] if first then local combined = first.combined @@ -109,7 +352,7 @@ function publications.parenttag(dataset,tag) return parent end end - return tag + return tag or "" end function publications.new(name) @@ -121,7 +364,8 @@ function publications.new(name) luadata = { }, suffixes = { }, xmldata = xmlconvert(xmlplaceholder), - -- details = { }, + details = { }, + ordered = { }, nofbytes = 0, entries = nil, -- empty == all sources = { }, @@ -134,29 +378,16 @@ function publications.new(name) resources = false, userdata = false, }, + specifications = { + -- used specifications + }, } -- we delay details till we need it (maybe we just delay the -- individual fields but that is tricky as there can be some -- depedencies) - setmetatableindex(dataset,function(t,k) - -- will become a plugin - if k == "details" and publications.enhance then - dataset.details = { } - publications.enhance(dataset.name) - return dataset.details - end - end) return dataset end -function publications.markasupdated(name) - if name == "string" then - datasets[name].details = nil - else - datasets.details = nil - end -end - setmetatableindex(datasets,function(t,k) if type(k) == "table" then return k -- so we can use this accessor as checker @@ -167,40 +398,6 @@ setmetatableindex(datasets,function(t,k) end end) --- we apply some normalization - -local space = S(" \t\n\r\f") -- / " " - ------ command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}") ------ command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) -local command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) -local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math -local any = P(1) -local done = P(-1) -local one_l = P("{") / "" -local one_r = P("}") / "" -local two_l = P("{{") / "" -local two_r = P("}}") / "" -local special = P("#") / "\\letterhash" - -local filter_0 = S('\\{}') -local filter_1 = (1-filter_0)^0 * filter_0 -local filter_2 = Cs( --- {{...}} ... {{...}} --- two_l * (command + special + any - two_r - done)^0 * two_r * done + --- one_l * (command + special + any - one_r - done)^0 * one_r * done + - (somemath + command + special + any )^0 -) - --- Currently we expand shortcuts and for large ones (like the acknowledgements --- in tugboat.bib) this is not that efficient. However, eventually strings get --- hashed again. - -local function do_shortcut(key,value,dataset) - publicationsstats.nofshortcuts = publicationsstats.nofshortcuts + 1 - dataset.shortcuts[key] = value -end - local function getindex(dataset,luadata,tag) local found = luadata[tag] if found then @@ -214,357 +411,769 @@ end publications.getindex = getindex --- todo: categories : metatable that lowers and also counts --- todo: fields : metatable that lowers - -local function do_definition(category,tag,tab,dataset) - publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1 - local fields = dataset.fields - local luadata = dataset.luadata - local found = luadata[tag] - local index = getindex(dataset,luadata,tag) - local entries = { - category = lower(category), - tag = tag, - index = index, - } - for i=1,#tab,2 do - local original = tab[i] - local normalized = fields[original] - if not normalized then - normalized = lower(original) -- we assume ascii fields - fields[original] = normalized - end - local value = tab[i+1] - value = textoutf(value) - if lpegmatch(filter_1,value) then - value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { } - end - if normalized == "crossref" then - local parent = luadata[value] - if parent then - setmetatableindex(entries,parent) +do + + -- we apply some normalization + + local space = S(" \t\n\r\f") -- / " " + local collapsed = space^1/" " + ----- csletter = R("az","AZ") + local csletter = lpegpatterns.csletter + + ----- command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}") + ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + local command = P("\\") * (Carg(1) * C(csletter^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + local whatever = P("\\") * P(" ")^1 / " " + + P("\\") * ( P("hbox") + P("raise") ) -- bah + local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math + ----- character = lpegpatterns.utf8character + local any = P(1) + local done = P(-1) + -- local one_l = P("{") / "" + -- local one_r = P("}") / "" + -- local two_l = P("{{") / "" + -- local two_r = P("}}") / "" + local zero_l_r = P("{}") / "" * #P(1) + local special = P("#") / "\\letterhash " + + local filter_0 = S('\\{}#') + local filter_1 = (1-filter_0)^0 * filter_0 + local filter_2 = Cs( + -- {{...}} ... {{...}} + -- two_l * (command + special + any - two_r - done)^0 * two_r * done + + -- one_l * (command + special + any - one_r - done)^0 * one_r * done + + ( + somemath + + whatever + + command + + special + + collapsed + + zero_l_r + + any + )^0 + ) + + -- Currently we expand shortcuts and for large ones (like the acknowledgements + -- in tugboat.bib) this is not that efficient. However, eventually strings get + -- hashed again. + + local function do_shortcut(key,value,dataset) + publicationsstats.nofshortcuts = publicationsstats.nofshortcuts + 1 + dataset.shortcuts[key] = value + end + + -- todo: categories : metatable that lowers and also counts + -- todo: fields : metatable that lowers + + local tags = table.setmetatableindex("table") + + local function do_definition(category,tag,tab,dataset) + publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1 + if tag == "" then + tag = "no-tag-set" + end + local fields = dataset.fields + local luadata = dataset.luadata + local hashtag = tag + if luadata[tag] then + local t = tags[tag] + local d = dataset.name + local n = (t[d] or 0) + 1 + t[d] = n + hashtag = tag .. "-" .. n + if trace_duplicates then + local p = { } + for k, v in sortedhash(t) do + p[#p+1] = formatters["%s:%s"](k,v) + end + report_duplicates("tag %a is present multiple times: % t, assigning hashtag %a",tag,p,hashtag) + end + end + local index = getindex(dataset,luadata,hashtag) + local entries = { + category = lower(category), + tag = tag, + index = index, + } + for i=1,#tab,2 do + local original = tab[i] + local normalized = fields[original] + if not normalized then + normalized = lower(original) -- we assume ascii fields + fields[original] = normalized + end + -- if entries[normalized] then + if rawget(entries,normalized) then + if trace_duplicates then + report_duplicates("redundant field %a is ignored for tag %a in dataset %a",normalized,tag,dataset.name) + end else - -- warning + local value = tab[i+1] + value = textoutf(value) + if lpegmatch(filter_1,value) then + value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { } + end + if normalized == "crossref" then + local parent = luadata[value] + if parent then + setmetatableindex(entries,parent) + else + -- warning + end + end + entries[normalized] = value end end - entries[normalized] = value + luadata[hashtag] = entries end - luadata[tag] = entries -end -local function resolve(s,dataset) - return dataset.shortcuts[s] or defaultshortcuts[s] or s -- can be number -end + local function resolve(s,dataset) + return dataset.shortcuts[s] or defaultshortcuts[s] or s -- can be number + end -local percent = P("%") -local start = P("@") -local comma = P(",") -local hash = P("#") -local escape = P("\\") -local single = P("'") -local double = P('"') -local left = P('{') -local right = P('}') -local both = left + right -local lineending = S("\n\r") -local space = S(" \t\n\r\f") -- / " " -local spacing = space^0 -local equal = P("=") ------ collapsed = (space^1)/ " " -local collapsed = (lpegpatterns.whitespace^1)/ " " - ------ balanced = lpegpatterns.balanced -local balanced = P { - [1] = ((escape * (left+right)) + (collapsed + 1 - (left+right)) + V(2))^0, - [2] = left * V(1) * right -} + local pattern = p_whitespace^0 + * C(P("message") + P("warning") + P("error") + P("comment")) * p_whitespace^0 * P(":") + * p_whitespace^0 + * C(P(1)^1) -local keyword = C((R("az","AZ","09") + S("@_:-"))^1) -local key = C((1-space-equal)^1) -local tag = C((1-space-comma)^1) -local reference = keyword -local category = P("@") * C((1-space-left)^1) -local s_quoted = ((escape*single) + collapsed + (1-single))^0 -local d_quoted = ((escape*double) + collapsed + (1-double))^0 - -local b_value = (left /"") * balanced * (right /"") -local s_value = (single/"") * (b_value + s_quoted) * (single/"") -local d_value = (double/"") * (b_value + d_quoted) * (double/"") -local r_value = reference * Carg(1) /resolve - -local somevalue = s_value + d_value + b_value + r_value -local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0)) - -local assignment = spacing * key * spacing * equal * spacing * value * spacing -local shortcut = P("@") * (P("string") + P("STRING")) * spacing * left * ((assignment * Carg(1))/do_shortcut * comma^0)^0 * spacing * right -local definition = category * spacing * left * spacing * tag * spacing * comma * Ct((assignment * comma^0)^0) * spacing * right * Carg(1) / do_definition -local comment = keyword * spacing * left * (1-right)^0 * spacing * right -local forget = percent^1 * (1-lineending)^0 - --- todo \% - -local bibtotable = (space + forget + shortcut + definition + comment + 1)^0 - --- loadbibdata -> dataset.luadata --- loadtexdata -> dataset.luadata --- loadluadata -> dataset.luadata - --- converttoxml -> dataset.xmldata from dataset.luadata - -function publications.loadbibdata(dataset,content,source,kind) - dataset = datasets[dataset] - statistics.starttiming(publications) - publicationsstats.nofbytes = publicationsstats.nofbytes + #content - dataset.nofbytes = dataset.nofbytes + #content - if source then - table.insert(dataset.sources, { filename = source, checksum = md5.HEX(content) }) - dataset.loaded[source] = kind or true - end - dataset.newtags = #dataset.luadata > 0 and { } or dataset.newtags - publications.markasupdated(dataset) - lpegmatch(bibtotable,content or "",1,dataset) - statistics.stoptiming(publications) -end + local function do_comment(s,dataset) + local how, what = lpegmatch(pattern,s) + if how and what then + local t = string.splitlines(utilities.strings.striplines(what)) + local b = file.basename(dataset.fullname or dataset.name or "unset") + for i=1,#t do + report("%s > %s : %s",b,how,t[i]) + end + end + end + + local percent = P("%") + local start = P("@") + local comma = P(",") + local hash = P("#") + local escape = P("\\") + local single = P("'") + local double = P('"') + local left = P('{') + local right = P('}') + local both = left + right + local lineending = S("\n\r") + local space = S(" \t\n\r\f") -- / " " + local spacing = space^0 + local equal = P("=") + ----- collapsed = (space^1)/ " " + local collapsed = p_whitespace^1/" " + local nospaces = p_whitespace^1/"" + + local p_left = (p_whitespace^0 * left) / "" + local p_right = (right * p_whitespace^0) / "" + + local balanced = P { + [1] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(2))^0, + [2] = left * V(1) * right, + } + + -- local unbalanced = P { + -- [1] = left * V(2) * right, + -- [2] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(1))^0, + -- } + + local unbalanced = (left/"") * balanced * (right/"") * P(-1) + + local keyword = C((R("az","AZ","09") + S("@_:-"))^1) + local key = C((1-space-equal)^1) + local tag = C((1-space-comma)^0) + local reference = keyword + local category = C((1-space-left)^1) + local s_quoted = ((escape*single) + collapsed + (1-single))^0 + local d_quoted = ((escape*double) + collapsed + (1-double))^0 + + local b_value = p_left * balanced * p_right + -- local u_value = p_left * unbalanced * p_right -- get rid of outer { } + -- local s_value = (single/"") * (u_value + s_quoted) * (single/"") + -- local d_value = (double/"") * (u_value + d_quoted) * (double/"") + local s_value = (single/"") * (unbalanced + s_quoted) * (single/"") + local d_value = (double/"") * (unbalanced + d_quoted) * (double/"") + local r_value = reference * Carg(1) /resolve + + local somevalue = d_value + b_value + s_value + r_value + local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0)) + + value = value / function(s) return lpegmatch(lpegpatterns.stripper,s) end + + local forget = percent^1 * (1-lineending)^0 + local spacing = spacing * forget^0 * spacing + local assignment = spacing * key * spacing * equal * spacing * value * spacing + local definition = category * spacing * left * spacing * tag * spacing * comma * Ct((assignment * comma^0)^0) * spacing * right * Carg(1) / do_definition + + local crapword = C((1-space-left)^1) + local shortcut = Cmt(crapword,function(_,p,s) return lower(s) == "string" and p end) * spacing * left * ((assignment * Carg(1))/do_shortcut * comma^0)^0 * spacing * right + local comment = Cmt(crapword,function(_,p,s) return lower(s) == "comment" and p end) * spacing * lpegpatterns.argument * Carg(1) / do_comment + + local casecrap = #S("sScC") * (shortcut + comment) + + local bibtotable = (space + forget + P("@") * (casecrap + definition) + 1)^0 --- we could use xmlescape again + -- todo \% -local cleaner_0 = S('<>&') -local cleaner_1 = (1-cleaner_0)^0 * cleaner_0 -local cleaner_2 = Cs ( ( - P("<") / "<" + - P(">") / ">" + - P("&") / "&" + - P(1) -)^0) + -- loadbibdata -> dataset.luadata + -- loadtexdata -> dataset.luadata + -- loadluadata -> dataset.luadata -local compact = false -- can be a directive but then we also need to deal with newlines ... not now + -- converttoxml -> dataset.xmldata from dataset.luadata -function publications.converttoxml(dataset,nice) -- we have fields ! - dataset = datasets[dataset] - local luadata = dataset and dataset.luadata - if luadata then + function publications.loadbibdata(dataset,content,source,kind) + if not source then + report("invalid source for dataset %a",dataset) + return + end + local current = datasets[dataset] + local size = #content + if size == 0 then + report("empty source %a for dataset %a",source,current.name) + else + report("adding bib data to set %a from source %a",current.name,source) + end statistics.starttiming(publications) - statistics.starttiming(xml) - -- - local result, r = { }, 0 - -- - r = r + 1 ; result[r] = "" - r = r + 1 ; result[r] = "" - -- - if nice then - local f_entry_start = formatters[" "] - local f_entry_stop = " " - local f_field = formatters[" %s"] - for tag, entry in sortedhash(luadata) do - r = r + 1 ; result[r] = f_entry_start(tag,entry.category,entry.index) - for key, value in sortedhash(entry) do - if key ~= "tag" and key ~= "category" and key ~= "index" then - if lpegmatch(cleaner_1,value) then - value = lpegmatch(cleaner_2,value) + publicationsstats.nofbytes = publicationsstats.nofbytes + size + current.nofbytes = current.nofbytes + size + if source then + table.insert(current.sources, { filename = source, checksum = md5.HEX(content) }) + current.loaded[source] = kind or true + end + current.newtags = #current.luadata > 0 and { } or current.newtags + lpegmatch(bibtotable,content or "",1,current) + statistics.stoptiming(publications) + end + +end + +do + + -- we could use xmlescape again + + local cleaner_0 = S('<>&') + local cleaner_1 = (1-cleaner_0)^0 * cleaner_0 + local cleaner_2 = Cs ( ( + P("<") / "<" + + P(">") / ">" + + P("&") / "&" + + P(1) + )^0) + + local compact = false -- can be a directive but then we also need to deal with newlines ... not now + + function publications.converttoxml(dataset,nice,dontstore,usedonly,subset) -- we have fields ! + local current = datasets[dataset] + local luadata = subset or (current and current.luadata) + if luadata then + statistics.starttiming(publications) + -- + local result, r, n = { }, 0, 0 + local usedonly = usedonly and publications.usedentries() + -- + r = r + 1 ; result[r] = "" + r = r + 1 ; result[r] = "" + -- + if nice then + local f_entry_start = formatters[" "] + local s_entry_stop = " " + local f_field = formatters[" %s"] + for tag, entry in sortedhash(luadata) do + if not usedonly or usedonly[tag] then + r = r + 1 ; result[r] = f_entry_start(tag,entry.category,entry.index) + for key, value in sortedhash(entry) do + if key ~= "tag" and key ~= "category" and key ~= "index" then + if lpegmatch(cleaner_1,value) then + value = lpegmatch(cleaner_2,value) + end + if value ~= "" then + r = r + 1 ; result[r] = f_field(key,value) + end + end end - if value ~= "" then - r = r + 1 ; result[r] = f_field(key,value) + r = r + 1 ; result[r] = s_entry_stop + n = n + 1 + end + end + else + local f_entry_start = formatters[""] + local s_entry_stop = "" + local f_field = formatters["%s"] + for tag, entry in next, luadata do + if not usedonly or usedonly[tag] then + r = r + 1 ; result[r] = f_entry_start(entry.tag,entry.category,entry.index) + for key, value in next, entry do + if key ~= "tag" and key ~= "category" and key ~= "index" then + if lpegmatch(cleaner_1,value) then + value = lpegmatch(cleaner_2,value) + end + if value ~= "" then + r = r + 1 ; result[r] = f_field(key,value) + end + end end + r = r + 1 ; result[r] = s_entry_stop + n = n + 1 end end - r = r + 1 ; result[r] = f_entry_stop end + -- + r = r + 1 ; result[r] = "" + -- + result = concat(result,nice and "\n" or nil) + -- + if dontstore then + -- indeed + else + statistics.starttiming(xml) + current.xmldata = xmlconvert(result, { + resolve_entities = true, + resolve_predefined_entities = true, -- in case we have escaped entities + -- unify_predefined_entities = true, -- & -> & + utfize_entities = true, + } ) + statistics.stoptiming(xml) + if lxml then + lxml.register(formatters["btx:%s"](current.name),current.xmldata) + end + end + statistics.stoptiming(publications) + return result, n + end + end + +end + +do + + local function resolvedname(dataset,filename) + local current = datasets[dataset] + if type(filename) ~= "string" then + report("invalid filename %a",tostring(filename)) + end + local fullname = resolvers.findfile(filename,"bib") + if fullname == "" then + fullname = resolvers.findfile(filename) -- let's not be too picky + end + if not fullname or fullname == "" then + report("no file %a",filename) + current.fullname = filename + return current, false else - local f_entry_start = formatters[""] - local f_entry_stop = "" - local f_field = formatters["%s"] - for tag, entry in next, luadata do - r = r + 1 ; result[r] = f_entry_start(entry.tag,entry.category,entry.index) - for key, value in next, entry do - if key ~= "tag" and key ~= "category" and key ~= "index" then - if lpegmatch(cleaner_1,value) then - value = lpegmatch(cleaner_2,value) - end - if value ~= "" then - r = r + 1 ; result[r] = f_field(key,value) - end - end + current.fullname = fullname + return current, fullname + end + end + + publications.resolvedname = resolvedname + + local cleaner = false + local cleaned = false + + function loaders.registercleaner(what,fullname) + if not fullname or fullname == "" then + report("no %s file %a",what,fullname) + return + end + local list = table.load(fullname) + if not list then + report("invalid %s file %a",what,fullname) + return + end + list = list.replacements + if not list then + report("no replacement table in %a",fullname) + return + end + if cleaned then + report("adding replacements from %a",fullname) + for k, v in next, list do + cleaned[k] = v + end + else + report("using replacements from %a",fullname) + cleaned = list + end + cleaner = true + end + + function loaders.bib(dataset,filename,kind) + local dataset, fullname = resolvedname(dataset,filename) + if not fullname then + return + end + local data = io.loaddata(filename) or "" + if data == "" then + report("empty file %a, nothing loaded",fullname) + return + end + if cleaner == true then + cleaner = Cs((lpeg.utfchartabletopattern(keys(cleaned)) / cleaned + p_utf8character)^1) + end + if cleaner ~= false then + data = lpegmatch(cleaner,data) + end + if trace then + report("loading file %a",fullname) + end + publications.loadbibdata(dataset,data,fullname,kind) + end + + function loaders.lua(dataset,filename) -- if filename is a table we load that one + local current, data, fullname + if type(filename) == "table" then + current = datasets[dataset] + data = filename + else + dataset, fullname = resolvedname(dataset,filename) + if not fullname then + return + end + current = datasets[dataset] + data = table.load(filename) + end + if data then + local luadata = current.luadata + for tag, entry in next, data do + if type(entry) == "table" then + entry.index = getindex(current,luadata,tag) + entry.tag = tag + luadata[tag] = entry -- no cleaning yet end - r = r + 1 ; result[r] = f_entry_stop end end - -- - r = r + 1 ; result[r] = "" - -- - result = concat(result,nice and "\n" or nil) - -- - dataset.xmldata = xmlconvert(result, { - resolve_entities = true, - resolve_predefined_entities = true, -- in case we have escaped entities - -- unify_predefined_entities = true, -- & -> & - utfize_entities = true, - } ) - -- - statistics.stoptiming(xml) - statistics.stoptiming(publications) - if lxml then - lxml.register(formatters["btx:%s"](dataset.name),dataset.xmldata) + end + + function loaders.buffer(dataset,name) -- if filename is a table we load that one + local current = datasets[dataset] + local barename = file.removesuffix(name) + local data = buffers.getcontent(barename) or "" + if data == "" then + report("empty buffer %a, nothing loaded",barename) + return + end + if trace then + report("loading buffer",barename) + end + publications.loadbibdata(current,data,barename,"bib") + end + + function loaders.xml(dataset,filename) + local dataset, fullname = resolvedname(dataset,filename) + if not fullname then + return + end + local current = datasets[dataset] + local luadata = current.luadata + local root = xml.load(filename) + for bibentry in xmlcollected(root,"/bibtex/entry") do + local attributes = bibentry.at + local tag = attributes.tag + local entry = { + category = attributes.category, + tag = tag, -- afterwards also set, to prevent overload + index = 0, -- prelocated + } + for field in xmlcollected(bibentry,"/field") do + entry[field.at.name] = field.dt[1] -- no cleaning yet | xmltext(field) + end + entry.index = getindex(current,luadata,tag) + entry.tag = tag + luadata[tag] = entry end end -end -local loaders = publications.loaders or { } -publications.loaders = loaders + setmetatableindex(loaders,function(t,filetype) + local v = function(dataset,filename) + report("no loader for file %a with filetype %a",filename,filetype) + end + t[filetype] = v + return v + end) -function loaders.bib(dataset,filename,kind) - dataset = datasets[dataset] - local data = io.loaddata(filename) or "" - if data == "" then - report("empty file %a, nothing loaded",filename) - elseif trace then - report("loading file",filename) + function publications.load(specification) + local current = datasets[specification.dataset or v_default] + local files = settings_to_array(specification.filename) + local kind = specification.kind + local dataspec = specification.specification + statistics.starttiming(publications) + for i=1,#files do + local filetype, filename = string.splitup(files[i],"::") + if not filename then + filename = filetype + filetype = file.suffix(filename) + end + if filename then + if not filetype or filetype == "" then + filetype = "bib" + end + if file.suffix(filename) == "" then + file.addsuffix(filename,filetype) + end + loaders[filetype](current,filename) + if kind then + current.loaded[current.fullname or filename] = kind + end + if dataspec then + current.specifications[dataspec] = true + end + end + end + local runner = enhancer.runner + if runner then + runner(current) + end + statistics.stoptiming(publications) + return current end - publications.loadbibdata(dataset,data,filename,kind) + end -function loaders.lua(dataset,filename) -- if filename is a table we load that one - dataset = datasets[dataset] - inspect(filename) - local data = type(filename) == "table" and filename or table.load(filename) - if data then +do + + function enhancers.order(dataset) + local luadata = dataset.luadata + local ordered = sortedkeys(luadata) + local total = #ordered + for i=1,total do + ordered[i] = luadata[ordered[i]] + end + dataset.ordered = ordered + end + + function enhancers.details(dataset) local luadata = dataset.luadata - for tag, entry in next, data do - if type(entry) == "table" then - entry.index = getindex(dataset,luadata,tag) - luadata[tag] = entry -- no cleaning yet + local details = dataset.details + for tag, entry in next, luadata do + if not details[tag] then + details[tag] = { } end end end + + utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.order") + utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.details") + end -function loaders.xml(dataset,filename) - dataset = datasets[dataset] - local luadata = dataset.luadata - local root = xml.load(filename) - for bibentry in xmlcollected(root,"/bibtex/entry") do - local attributes = bibentry.at - local tag = attributes.tag - local entry = { - category = attributes.category +do + + local checked = function(s,d) d[s] = (d[s] or 0) + 1 end + local checktex = ( (1-P("\\"))^1 + P("\\") * ((C(R("az","AZ")^1) * Carg(1))/checked))^0 + + function publications.analyze(dataset) + local current = datasets[dataset] + local data = current.luadata + local categories = { } + local fields = { } + local commands = { } + for k, v in next, data do + categories[v.category] = (categories[v.category] or 0) + 1 + for k, v in next, v do + fields[k] = (fields[k] or 0) + 1 + lpegmatch(checktex,v,1,commands) + end + end + current.analysis = { + categories = categories, + fields = fields, + commands = commands, } - for field in xmlcollected(bibentry,"/field") do - -- entry[field.at.name] = xmltext(field) - entry[field.at.name] = field.dt[1] -- no cleaning yet - end - -- local edt = entry.dt - -- for i=1,#edt do - -- local e = edt[i] - -- local a = e.at - -- if a and a.name then - -- t[a.name] = e.dt[1] -- no cleaning yet - -- end - -- end - entry.index = getindex(dataset,luadata,tag) - luadata[tag] = entry end + end -setmetatableindex(loaders,function(t,filetype) - local v = function(dataset,filename) - report("no loader for file %a with filetype %a",filename,filetype) +function publications.tags(dataset) + return sortedkeys(datasets[dataset].luadata) +end + +function publications.sortedentries(dataset) + return sortedhash(datasets[dataset].luadata) +end + +-- a helper: + +function publications.concatstate(i,n) + if i == 0 then + return 0 + elseif i == 1 then + return 1 + elseif i == 2 and n == 2 then + return 4 + elseif i == n then + return 3 + else + return 2 end - t[k] = v - return v -end) +end + +-- savers + +do + + local savers = { } + + local s_preamble = [[ +% this is an export from context mkiv -function publications.load(dataset,filename,kind) - dataset = datasets[dataset] - statistics.starttiming(publications) - local files = settings_to_array(filename) - for i=1,#files do - local filetype, filename = string.splitup(files[i],"::") - if not filename then - filename = filetype +@preamble{ + \ifdefined\btxcmd + % we're probably in context + \else + \def\btxcmd#1{\csname#1\endcsname} + \fi +} + +]] + + function savers.bib(dataset,filename,tobesaved) + local f_start = formatters["@%s{%s,\n"] + local f_field = formatters[" %s = {%s},\n"] + local s_stop = "}\n\n" + local result = { s_preamble } + local n, r = 0, 1 + for tag, data in sortedhash(tobesaved) do + r = r + 1 ; result[r] = f_start(data.category or "article",tag) + for key, value in sortedhash(data) do + if not privates[key] then + r = r + 1 ; result[r] = f_field(key,value) + end + end + r = r + 1 ; result[r] = s_stop + n = n + 1 + end + report("%s entries from dataset %a saved in %a",n,dataset,filename) + io.savedata(filename,concat(result)) + end + + function savers.lua(dataset,filename,tobesaved) + local list = { } + local n = 0 + for tag, data in next, tobesaved do + local t = { } + for key, value in next, data do + if not privates[key] then + d[key] = value + end + end + list[tag] = t + n = n + 1 + end + report("%s entries from dataset %a saved in %a",n,dataset,filename) + table.save(filename,list) + end + + function savers.xml(dataset,filename,tobesaved) + local result, n = publications.converttoxml(dataset,true,true,false,tobesaved) + report("%s entries from dataset %a saved in %a",n,dataset,filename) + io.savedata(filename,result) + end + + function publications.save(specification) + local dataset = specification.dataset + local filename = specification.filename + local filetype = specification.filetype + local criterium = specification.criterium + statistics.starttiming(publications) + if not filename or filename == "" then + report("no filename for saving given") + return + end + if not filetype or filetype == "" then filetype = file.suffix(filename) end - local fullname = resolvers.findfile(filename,"bib") - if dataset.loaded[fullname] then -- will become better - -- skip - elseif fullname == "" then - report("no file %a",filename) - else - loaders[filetype](dataset,fullname) + if not criterium or criterium == "" then + criterium = v_all end - if kind then - dataset.loaded[fullname] = kind + local saver = savers[filetype] + if saver then + local current = datasets[dataset] + local luadata = current.luadata or { } + local tobesaved = { } + local result = structures.lists.filter({criterium = criterium, names = "btx"}) or { } + for i=1,#result do + local userdata = result[i].userdata + if userdata then + local set = userdata.btxset or v_default + if set == dataset then + local tag = userdata.btxref + if tag then + tobesaved[tag] = luadata[tag] + end + end + end + end + saver(dataset,filename,tobesaved) + else + report("unknown format %a for saving %a",filetype,dataset) end + statistics.stoptiming(publications) + return dataset end - statistics.stoptiming(publications) - return dataset -end -local checked = function(s,d) d[s] = (d[s] or 0) + 1 end -local checktex = ( (1-P("\\"))^1 + P("\\") * ((C(R("az","AZ")^1) * Carg(1))/checked))^0 - -function publications.analyze(dataset) - dataset = datasets[dataset] - local data = dataset.luadata - local categories = { } - local fields = { } - local commands = { } - for k, v in next, data do - categories[v.category] = (categories[v.category] or 0) + 1 - for k, v in next, v do - fields[k] = (fields[k] or 0) + 1 - lpegmatch(checktex,v,1,commands) - end - end - dataset.analysis = { - categories = categories, - fields = fields, - commands = commands, + implement { + name = "btxsavedataset", + actions = publications.save, + arguments = { + { + { "dataset" }, + { "filename" }, + { "filetype" }, + { "criterium" }, + } + } } + end --- str = [[ --- @COMMENT { CRAP } --- @STRING{ hans = "h a n s" } --- @STRING{ taco = "t a c o" } --- @SOMETHING{ key1, abc = "t a c o" , def = "h a n s" } --- @SOMETHING{ key2, abc = hans # taco } --- @SOMETHING{ key3, abc = "hans" # taco } --- @SOMETHING{ key4, abc = hans # "taco" } --- @SOMETHING{ key5, abc = hans # taco # "hans" # "taco"} --- @SOMETHING{ key6, abc = {oeps {oeps} oeps} } --- ]] - --- local dataset = publications.new() --- publications.tolua(dataset,str) --- publications.toxml(dataset) --- publications.toxml(dataset) --- print(dataset.xmldata) --- inspect(dataset.luadata) --- inspect(dataset.xmldata) --- inspect(dataset.shortcuts) --- print(dataset.nofbytes,statistics.elapsedtime(publications)) - --- local dataset = publications.new() --- publications.load(dataset,"IEEEabrv.bib") --- publications.load(dataset,"IEEEfull.bib") --- publications.load(dataset,"IEEEexample.bib") --- publications.toxml(dataset) --- print(dataset.nofbytes,statistics.elapsedtime(publications)) - --- local dataset = publications.new() --- publications.load(dataset,"gut.bib") --- publications.load(dataset,"komoedie.bib") --- publications.load(dataset,"texbook1.bib") --- publications.load(dataset,"texbook2.bib") --- publications.load(dataset,"texbook3.bib") --- publications.load(dataset,"texgraph.bib") --- publications.load(dataset,"texjourn.bib") --- publications.load(dataset,"texnique.bib") --- publications.load(dataset,"tugboat.bib") --- publications.toxml(dataset) --- print(dataset.nofbytes,statistics.elapsedtime(publications)) - --- print(table.serialize(dataset.luadata)) --- print(table.serialize(dataset.xmldata)) --- print(table.serialize(dataset.shortcuts)) --- print(xml.serialize(dataset.xmldata)) +-- casters + +do + + publications.detailed = setmetatableindex(function(detailed,kind) + local values = setmetatableindex(function(values,value) + local caster = casters[kind] + local cast = caster and caster(value) or value + values[value] = cast + return cast + end) + detailed[kind] = values + return values + end) + + local keywordsplitter = utilities.parsers.groupedsplitat(";,") + + casters.keyword = function(str) + return lpegmatch(keywordsplitter,str) + end + + + writers.keyword = function(k) + if type(k) == "table" then + return concat(p,";") + else + return k + end + end + + local pagessplitter = lpeg.splitat(P("-")^1) + + casters.range = function(str) + local first, last = lpegmatch(pagessplitter,str) + return first and last and { first, last } or str + end + + writers.range = function(p) + if type(p) == "table" then + return concat(p,"-") + else + return p + end + end + + casters.pagenumber = casters.range + writers.pagenumber = writers.range + +end diff --git a/Master/texmf-dist/tex/context/base/publ-fnd.lua b/Master/texmf-dist/tex/context/base/publ-fnd.lua index 383bcac73ca..909b102dba2 100644 --- a/Master/texmf-dist/tex/context/base/publ-fnd.lua +++ b/Master/texmf-dist/tex/context/base/publ-fnd.lua @@ -6,167 +6,380 @@ if not modules then modules = { } end modules ['publ-fnd'] = { license = "see context related readme files" } -local tonumber, next = tonumber, next -local P, R, C, Cs, Cp, Carg = lpeg.P, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Carg -local lpegmatch = lpeg.match +if not characters then + dofile(resolvers.findfile("char-def.lua")) + dofile(resolvers.findfile("char-utf.lua")) +end + +-- this tracker is only for real debugging and not for the average user + +local trace_match = false trackers.register("publications.match", function(v) trace_match = v end) + +local publications = publications + +local tonumber, next, type = tonumber, next, type +local find = string.find +local P, R, S, C, Cs, Cp, Cc, Carg, Ct, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Carg, lpeg.Ct, lpeg.V +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local concat = table.concat local formatters = string.formatters local lowercase = characters.lower +local topattern = string.topattern + +publications = publications or { } -- for testing + +local report = logs.reporter("publications","match") local colon = P(":") local dash = P("-") local lparent = P("(") local rparent = P(")") -local space = lpeg.patterns.whitespace +local space = lpegpatterns.whitespace +local utf8char = lpegpatterns.utf8character local valid = 1 - colon - space - lparent - rparent ----- key = C(valid^1) local key = C(R("az","AZ")^1) -local word = Cs(lpeg.patterns.unquoted + valid^1) +local wildcard = C("*") +local word = Cs(lpegpatterns.unquoted + lpegpatterns.argument + valid^1) +local simple = C(valid^1) local number = C(valid^1) ------ f_string_key = formatters[" local s_%s = entry[%q]"] -local f_string_key = formatters[" local s_%s = entry[%q] if s_%s then s_%s = lower(s_%s) end "] -local f_number_key = formatters[" local n_%s = tonumber(entry[%q]) or 0"] -local f_field_key = formatters[" local f_%s = entry[%q] or ''"] +----- f_string_key = formatters[" local s_%s = entry[%q] if s_%s then s_%s = lower(s_%s) end "] +----- f_number_key = formatters[" local n_%s = tonumber(entry[%q]) or 0"] +----- f_field_key = formatters[" local f_%s = entry[%q] or ''"] ------ f_string_match = formatters["(s_%s and find(lower(s_%s),%q))"] -local f_string_match = formatters["(s_%s and find(s_%s,%q))"] -local f_number_match = formatters["(n_%s and n_%s >= %s and n_%s <= %s)"] -local f_field_match = formatters["f_%s"] +-- getfuzzy(entry,%q,categories) -local match = key * (colon/"") * word * Carg(1) / function(key,_,word,keys) - -- keys[key] = f_string_key(key,key) - keys[key] = f_string_key(key,key,key,key,key) - return f_string_match(key,key,lowercase(word)) -end +-- local f_string_key = formatters[" local s_%s = get(entry,%q)\n if s_%s then s_%s = lower(s_%s) end"] +-- local f_field_key = formatters[" local f_%s = get(entry,%q) or ''"] +-- local f_field_key_c = formatters[" local c_%s = get(entry,%q,categories) or ''"] +-- local f_number_key = formatters[" local n_%s = tonumber(get(entry,%q)) or 0"] +-- +-- local f_string_match = formatters["(s_%s and find(s_%s,%q))"] +-- local f_number_match = formatters["(n_%s and n_%s >= %s and n_%s <= %s)"] +-- local f_field_match = formatters["f_%s"] +-- local f_field_match_c = formatters["c_%s"] +-- +-- local f_all_match = formatters["anywhere(entry,%q)"] -local range = key * (colon/"") * number * (dash/"") * number * Carg(1) / function(key,_,first,_,last,keys) - keys[key] = f_number_key(key,key) - return f_number_match(key,key,tonumber(first) or 0,key,tonumber(last) or 0) -end +-- topattern(lowercase(word)) : utflowercase + only *? -local field = (P("field:")/"") * key * Carg(1) / function(_,key,keys) - keys[key] = f_field_key(key,key) - return f_field_match(key) -end +-- local match = ( (key + wildcard) * (colon/"") ) * word * Carg(1) / function(key,_,word,keys) +-- if key == "*" or key == "any" then +-- keys.anywhere = true +-- if word == "" or word == "*" then +-- return "true" +-- else +-- return f_all_match(topattern(lowercase(word))) +-- end +-- else +-- keys[key] = f_string_key(key,key,key,key,key) +-- return f_string_match(key,key,topattern(lowercase(word))) +-- end +-- end +-- +-- local default = simple * Carg(1) / function(word,keys) +-- keys.anywhere = true +-- if word == "" or word == "*" then +-- return "true" +-- else +-- return f_all_match(topattern(lowercase(word))) +-- end +-- end +-- +-- local range = key * (colon/"") * number * (dash/"") * number * Carg(1) / function(key,_,first,_,last,keys) +-- keys[key] = f_number_key(key,key) +-- return f_number_match(key,key,tonumber(first) or 0,key,tonumber(last) or 0) +-- end +-- +-- local field = (P("field:")/"") * key * Carg(1) / function(_,key,keys) +-- keys[key] = f_field_key(key,key) +-- return f_field_match(key) +-- end +-- +-- local cast = (P("cast:")/"") * key * Carg(1) / function(_,key,keys) +-- keys[key] = f_field_key_c(key,key) +-- return f_field_match_c(key) +-- end +-- +-- local compare = C("==") + P("=")/"==" + P("!=")/"~=" + P("<>")/"~=" +-- +-- local b_match = lparent +-- local e_match = rparent * space^0 * (#P(-1) + P(",")/" or ") -- maybe also + -> and +-- local f_match = ((field + cast + range + match + space + compare + P(1))-e_match)^1 +-- local p_match = b_match * default * e_match +-- + b_match * f_match * e_match +-- +-- local pattern = Cs(Cc("(") * (P("match")/"" * space^0 * p_match)^1 * Cc(")")) ------ pattern = Cs((field + range + match + P(1))^1) ------ b_match = P("match")/"" * lparent -local b_match = lparent -local e_match = rparent * space^0 * P(-1) -local pattern = Cs(b_match * ((field + range + match + space + P(1))-e_match)^1 * e_match) +-- field contains fieldname:nonspaces|"whatever"|'whatever'|{whatever} +-- field exact fieldname=nonspaces|"whatever"|'whatever'|{whatever} +-- set contains [fieldname]:nonspaces|"whatever"|'whatever'|{whatever} +-- set exact [fieldname]=nonspaces|"whatever"|'whatever'|{whatever} +-- +-- with * : any sequence +-- ? : one character +-- +-- and match(),match() ... equivalent to () and () +-- +-- <123 444> : range +-- +-- unquoted = field +-- [..] = set +-- +-- () and or not +-- +-- spaces are mandate (at least for now) --- -- -- -- -- -- -- -- -- -- -- -- -- --- -- -- -- -- -- -- -- -- -- -- -- -- +local key = C(R("az","AZ")^1) +local contains = S(":~") +local exact = P("=") +local valid = (1 - space - lparent -rparent)^1 +local wildcard = P("*") / ".*" +local single = P("?") / "." +local dash = P("-") / "%." +local percent = P("-") / "%%" +local word = Cs(lpegpatterns.unquoted + lpegpatterns.argument + valid) +local range = P("<") * space^0 * C((1-space)^1) * space^1 * C((1-space- P(">"))^1) * space^0 * P(">") -local tolower = lpeg.patterns.tolower -local lower = string.lower +local f_key_fld = formatters[" local kf_%s = get(entry,%q) \n if kf_%s then kf_%s = lower(kf_%s) end"] +local f_key_set = formatters[" local ks_%s = get(entry,%q,categories)\n if ks_%s then ks_%s = lower(ks_%s) end"] +local f_number_fld = formatters[" local nf_%s = tonumber(get(entry,%q))"] +local f_number_set = formatters[" local ns_%s = tonumber(get(entry,%q,categories))"] -local allascii = R("\000\127")^1 * P(-1) +local f_fld_exact = formatters["(kf_%s == %q)"] +local f_set_exact = formatters["(ks_%s == %q)"] +local f_fld_contains = formatters["(kf_%s and find(kf_%s,%q))"] +local f_set_contains = formatters["(ks_%s and find(ks_%s,%q))"] +local f_fld_between = formatters["(nf_%s and nf_%s >= %s and nf_%s <= %s)"] +local f_set_between = formatters["(ns_%s and ns_%s >= %s and ns_%s <= %s)"] -function characters.checkedlower(str) - return lpegmatch(allascii,str) and lower(str) or lpegmatch(tolower,str) or str +local f_all_match = formatters["anywhere(entry,%q)"] + +local function test_key_value(keys,where,key,first,last) + if not key or key == "" then + return "(false)" + elseif key == "*" then + last = "^.*" .. topattern(lowercase(last)) .. ".*$" -- todo: make an lpeg + return f_all_match(last) + elseif first == false then + -- exact + last = lowercase(last) + if where == "set" then + keys[key] = f_key_set(key,key,key,key,key) + return f_set_exact(key,last) + else + keys[key] = f_key_fld(key,key,key,key,key) + return f_fld_exact(key,last) + end + elseif first == true then + -- contains + last = "^.*" .. topattern(lowercase(last)) .. ".*$" + if where == "set" then + keys[key] = f_key_set(key,key,key,key,key) + return f_set_contains(key,key,last) + else + keys[key] = f_key_fld(key,key,key,key,key) + return f_fld_contains(key,key,last) + end + else + -- range + if where == "set" then + keys[key] = f_number_set(key,key) + return f_set_between(key,key,tonumber(first),key,tonumber(last)) + else + keys[key] = f_number_fld(key,key) + return f_fld_between(key,key,tonumber(first),key,tonumber(last)) + end + end end +local p_compare = P { "all", + all = (V("one") + V("operator") + V("nested") + C(" "))^1, + nested = C("(") * V("all") * C(")"), -- C really needed? + operator = C("and") + + C("or") + + C("not"), + one = Carg(1) + * V("where") + * V("key") + * (V("how") * V("word") + V("range")) + / test_key_value, + key = key + + C("*"), + where = C("set") * P(":") + + Cc(""), + how = contains * Cc(true) + + exact * Cc(false), + word = word, + range = range, +} + +-- local p_combine = space^0 * (P(",")/" or ") * space^0 + +-- local pattern = Cs((P("match")/"" * space^0 * p_compare + p_combine)^1) + +local comma = P(",") +local p_spaces = space^0 +local p_combine = p_spaces * comma * p_spaces / " or " +local p_expression = P("match")/"" * Cs(p_compare) + + Carg(1) + * Cc("") + * Cc("tag") + * Cc(false) + * ( + P("tag") * p_spaces * P("(") * Cs((1-S(")")-space)^1) * p_spaces * P(")") + + p_spaces * Cs((1-space-comma)^1) * p_spaces + ) / test_key_value + +local pattern = Cs { + [1] = V(2) * (p_combine * V(2))^0, + [2] = p_expression, +} + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -local f_template = string.formatters[ [[ +function publications.anywhere(entry,str) -- helpers + for k, v in next, entry do + if find(lowercase(v),str) then + return true + end + end +end + +-- todo: use an environment instead of + +-- table={ +-- { "match", "((kf_editor and find(kf_editor,\"^.*braslau.*$\")))" }, +-- { "hash", "foo1234" }, +-- { "tag", "bar5678" }, +-- } + +local f_template = formatters[ [[ local find = string.find -local lower = characters.checkedlower +local lower = characters.lower +local anywhere = publications.anywhere +local get = publications.getfuzzy +local specification = publications.currentspecification +local categories = specification and specification.categories return function(entry) %s -return %s and true or false + return %s and true or false end ]] ] -local function compile(expr,start) +local function compile(dataset,expr) local keys = { } - local expression = lpegmatch(pattern,expr,start,keys) - -- print("!!!!",expression) + -- local expression = lpegmatch(pattern,expr,start,keys) + local expression = lpegmatch(pattern,expr,1,keys) + if trace_match then + report("compiling expression: %s",expr) + end local definitions = { } for k, v in next, keys do definitions[#definitions+1] = v end + if #definitions == 0 then + report("invalid expression: %s",expr) + elseif trace_match then + for i=1,#definitions do + report("% 3i : %s",i,definitions[i]) + end + end definitions = concat(definitions,"\n") local code = f_template(definitions,expression) - -- print(code) - code = loadstring(code) - if type(code) == "function" then - code = code() - if type(code) == "function" then - return code + if trace_match then + report("generated code: %s",code) + end + local finder = loadstring(code) -- use an environment + if type(finder) == "function" then + finder = finder() + if type(finder) == "function" then + return finder, code end end - print("no valid expression",expression) + report("invalid expression: %s",expr) return false end -local cache = { } -- todo: make weak, or just remember the last one (trial typesetting) +-- local function test(str) +-- local keys = { } +-- local definitions = { } +-- local expression = lpegmatch(pattern,str,1,keys) +-- for k, v in next, keys do +-- definitions[#definitions+1] = v +-- end +-- definitions = concat(definitions,"\n") +-- print(f_template(definitions,expression)) +-- end -local check = P("match") * space^0 * Cp() +-- test("match(foo:bar and (foo:bar or foo:bar))") +-- test("match(foo=bar and (foo=bar or foo=bar))") +-- test("match(set:foo:bar),match(set:foo:bar)") +-- test("match(set:foo=bar)") +-- test("match(foo:{bar bar})") +-- test("match(foo={bar bar})") +-- test("match(set:foo:'bar bar')") +-- test("match(set:foo='bar bar')") +-- test("match(set:foo<1000 2000>)") +-- test("match(set:foo<1000 2000>)") +-- test("match(*:foo)") +-- test("match(*:*)") -local function finder(expression) - local found = cache[expression] - if found == nil then - local e = lpegmatch(check,expression) - found = e and compile(expression,e) or false - cache[expression] = found +local trigger = (P("match") + P("tag")) * p_spaces * P("(") +local check = (1-trigger)^0 * trigger + +local function finder(dataset,expression) + local found = lpegmatch(check,expression) and compile(dataset,expression) or false + if found then + local okay, message = pcall(found,{}) + if not okay then + found = false + report("error in match: %s",message) + end end return found end +-- finder("match(author:foo)") +-- finder("match(author:foo and author:bar)") +-- finder("match(author:foo or (author:bar and page:123))") +-- finder("match(author:foo),match(author:foo)") + publications.finder = finder function publications.search(dataset,expression) - local find = finder(expression) - local source = dataset.luadata + local find = finder(dataset,expression) if find then - local target = { } - for k, v in next, source do - if find(v) then - target[k] = v + local ordered = dataset.ordered + local target = { } + for i=1,#ordered do + local entry = ordered[i] + if find(entry) then + local tag = entry.tag + if not target[tag] then + -- we always take the first + target[tag] = entry + end end end return target else - return { source[expression] } + return { } -- { dataset.luadata[expression] } -- ? end end - --- local dataset = publications.new() --- publications.load(dataset,"t:/manuals/hybrid/tugboat.bib") --- --- local n = 500 +-- local d = publications.datasets.default -- --- local function test(dataset,str) --- local found --- local start = os.clock() --- for i=1,n do --- found = search(dataset,str) --- end --- local elapsed = os.clock() - start --- print(elapsed,elapsed/500,#table.keys(dataset.luadata),str) --- print(table.concat(table.sortedkeys(found)," ")) --- return found --- end +-- local d = publications.load { +-- dataset = "default", +-- filename = "t:/manuals/mkiv/hybrid/tugboat.bib" +-- } -- --- local found = test(dataset,[[match(author:hagen)]]) --- local found = test(dataset,[[match(author:hagen and author:hoekwater and year:1990-2010)]]) --- local found = test(dataset,[[match(author:"Bogusław Jackowski")]]) --- local found = test(dataset,[[match(author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000)]]) --- local found = test(dataset,[[Hagen:TB19-3-304]]) - --- 1.328 0.002656 2710 author:hagen --- Berdnikov:TB21-2-129 Guenther:TB5-1-24 Hagen:TB17-1-54 Hagen:TB19-3-304 Hagen:TB19-3-311 Hagen:TB19-3-317 Hagen:TB22-1-58 Hagen:TB22-3-118 Hagen:TB22-3-136 Hagen:TB22-3-160 Hagen:TB23-1-49 Hagen:TB25-1-108 Hagen:TB25-1-48 Hagen:TB26-2-152 - --- 1.812 0.003624 2710 author:hagen and author:hoekwater and year:1990-2010 --- Berdnikov:TB21-2-129 - --- 1.344 0.002688 2710 author:"Bogusław Jackowski" --- Berdnikov:TB21-2-129 Jackowski:TB16-4-388 Jackowski:TB19-3-267 Jackowski:TB19-3-272 Jackowski:TB20-2-104 Jackowski:TB24-1-64 Jackowski:TB24-3-575 Nowacki:TB19-3-242 Rycko:TB14-3-171 - --- 1.391 0.002782 2710 author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000 --- Jackowski:TB24-1-64 Jackowski:TB24-3-575 +-- inspect(publications.search(d,[[match(author:hagen)]])) +-- inspect(publications.search(d,[[match(author:hagen and author:hoekwater and year:1990-2010)]])) +-- inspect(publications.search(d,[[match(author:"Bogusław Jackowski")]])) +-- inspect(publications.search(d,[[match(author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000)]])) +-- inspect(publications.search(d,[[Hagen:TB19-3-304]])) diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.lua b/Master/texmf-dist/tex/context/base/publ-imp-apa.lua new file mode 100644 index 00000000000..c5d2512fd50 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-apa.lua @@ -0,0 +1,521 @@ +local specification = { + -- + -- metadata + -- + name = "apa", + version = "1.00", + comment = "APA specification", + author = "Alan Braslau and Hans Hagen", + copyright = "ConTeXt development team", + -- + -- derived (combinations of) fields (all share the same default set) + -- + virtual = { + "authoryear", + "authoryears", + "authornum", + "num", + "suffix", + }, + -- + -- special datatypes + -- + types = { + -- + -- list of fields that are interpreted as names: "NAME [and NAME]" where + -- NAME is one of the following: + -- + -- First vons Last + -- vons Last, First + -- vons Last, Jrs, First + -- Vons, Last, Jrs, First + -- + author = "author", -- interpreted as name(s) + editor = "author", + artist = "author", + composer = "author", + producer = "author", + director = "author", + doi = "url", -- an external link + url = "url", + page = "pagenumber", -- number or range: f--t + pages = "pagenumber", + volume = "range", + number = "range", + keywords = "keyword", -- comma|-|separated list + year = "number", + }, + -- + -- categories with their specific fields + -- + categories = { + -- + -- categories are added below + -- + }, +} + +local generic = { + -- + -- A set returns the first field (in order of position below) that is found + -- present in an entry. A set having the same name as a field conditionally + -- allows the substitution of an alternate field. + -- + -- note that anything can get assigned a doi or be available online. + doi = { "doi", "url" }, + editionset = { "edition", "volume", "number", "pages" }, +} + +-- Definition of recognized categories and the fields that they contain. +-- Required fields should be present; optional fields may also be rendered; +-- all other fields will be ignored. + +-- Sets contain either/or in order of precedence. +-- +-- For a category *not* defined here yet present in the dataset, *all* fields +-- are taken as optional. This allows for flexibility in the addition of new +-- categories. + +local categories = specification.categories + +-- an article from a journal + +categories.article = { + sets = { + author = { "author", "editor", "title" }, + doi = generic.doi, + }, + required = { + "author" + }, + optional = { + "year", + "subtitle", "type", "file", + "journal", "volume", "number", "pages", + "doi", "note", + }, +} + +-- an article from a magazine + +categories.magazine = { + sets = categories.article.sets, + required = { + "author", + "year", + "journal", + }, + optional = { + "subtitle", "type", "file", + "number", + "month", "day", + "doi", "note", + }, +} + +categories.newspaper = categories.magazine + +-- (from jabref) to be identified and setup ... + +categories.periodical = { + sets = { + author = { "editor", "publisher" }, + doi = generic.doi, + }, + required = { + "title", + "year", + }, + optional = { + "author", + "subtitle", "file", + "series", "volume", "number", "month", + "organization", + "doi", "note", + }, +} + +-- (from jabref) to be identified and setup ... + +categories.standard = { + sets = { + author = { "author", "institution", "organization" }, + doi = generic.doi, + }, + required = { + "author", + "year", + "title", "subtitle", + "doi", "note", + }, + optional = { + }, +} + +-- a book with an explicit publisher. + +categories.book = { + sets = { + author = { "author", "editor", "publisher", "title" }, + editionset = generic.editionset, + doi = generic.doi, + }, + required = { "author" }, + optional = { + "year", "month", "day", + "subtitle", "type", "file", + "editionset", "series", + "address", + "doi", "note", + }, +} + +-- a part of a book, which may be a chapter (or section or whatever) and/or a range of pages. + +categories.inbook = { + sets = { + author = { "author", "editor", "publisher", "title", }, + editionset = generic.editionset, + doi = generic.doi, + }, + required = { + "author", + "year" , + }, + optional = { + "subtitle", "type", "file", + "booktitle", + -- APA ignores this: "chapter", + "editionset", "series", + "month", + "address", + "doi", "note", + }, +} + +-- a book having its own title as part of a collection. +-- (like inbook, but we here make booktitle required) + +categories.incollection = { + sets = { + author = { "author", "editor", "publisher", "title", }, + editionset = generic.editionset, + doi = generic.doi, + }, + required = { + "author", + "booktitle", + "year", + }, + optional = { + "subtitle", "type", "file", + "editionset", "series", + -- APA ignores this: "chapter", + "month", + "address", + "doi", "note", + }, +} + +-- a work that is printed and bound, but without a named publisher or sponsoring institution. + +categories.booklet = { + sets = { + author = { "author", "title", }, + publisher = { "howpublished" }, -- no "publisher"! + doi = generic.doi, + }, + required = { + "author" + }, + optional = { + "publisher", + "year", "month", + "subtitle", "type", "file", + "address", + "doi", "note", + }, +} + +-- the proceedings of a conference. + +categories.proceedings = { + sets = { + author = { "editor", "organization", "publisher", "title" }, -- no "author"! + publisher = { "publisher", "organization" }, + editionset = generic.editionset, + doi = generic.doi, + }, + required = { + "author", + "year" + }, + optional = { + "publisher", + "subtitle", "file", + "editionset", "series", + "month", + "address", + "doi", "note", + }, +} + +-- an article in a conference proceedings. + +categories.inproceedings = { + sets = categories.incollection.sets, + required = categories.incollection.required, + optional = { + "subtitle", "type", "file", + "month", + "edition", "series", + "address", "organization", + "doi", "note", + }, +} + +categories.conference = categories.inproceedings + +-- a thesis (of course). + +categories.thesis = { + sets = { + doi = generic.doi, + }, + required = { + "author", + "title", + "school", + "year", + "type" + }, + optional = { + "subtitle", "file", + "month", + "address", + "doi", "note", + }, +} + +categories.mastersthesis = { + sets = categories.thesis.sets, + required = { + "author", + "title", + "school", + "year" + }, + optional = { + "type", + "subtitle", "file", + "month", + "address", + "doi", "note", + }, +} +categories.phdthesis = categories.mastersthesis + +-- a report published by a school or other institution, usually numbered within a series. + +categories.techreport = { + sets = { + author = { "author", "institution", "publisher", "title" }, + publisher = { "publisher", "institution", }, + editionset = { "type", "volume", "number", "pages" }, -- no "edition"! + doi = generic.doi, + }, + required = { + "author", + "title", + "institution", + "year" + }, + optional = { + "publisher", + "address", + "subtitle", "file", + "editionset", + "month", + "doi", "note", + }, +} + +-- technical documentation. + +categories.manual = { + sets = { + author = { "author", "organization", "publisher", "title" }, + publisher = { "publisher", "organization", }, + editionset = generic.editionset, + doi = generic.doi, + }, + required = { + "title" + }, + optional = { + "author", "publisher", + "address", + "subtitle", "file", + "editionset", "month", "year", + "doi", "note", +-- "abstract", + }, +} + +-- a patent (of course). + +categories.patent = { + sets = { + author = { "author", "assignee", }, + publisher = { "publisher", "assignee", }, + year = { "year", "yearfiled", }, + month = { "month", "monthfiled", }, + day = { "day", "dayfiled", }, + doi = generic.doi, + }, + required = { + "nationality", + "number", + "year", + }, + optional = { + "type", + --check this: "language", + "author", "publisher", + "title", "subtitle", "file", + "address", + "day", "month", + "doi", "note" + }, +} + +-- a document having an author and title, but not formally published. + +categories.unpublished = { + sets = { + doi = generic.doi, + }, + required = { + "author", + "title", + "note" + }, + optional = { + "subtitle", "file", + "year", "month", + "doi" + }, +} + +-- like misc below but includes organization. + +categories.electronic = { + sets = { + doi = generic.doi, + }, + required = { + "title" + }, + optional = { + "subtitle", "type", "file", + "year", "month", + "author", + "address", + "organization", + "howpublished", + "doi", "note" + }, +} + +-- not bibtex categories... + +categories.film = { + sets = { + doi = generic.doi, + }, + required = { + "producer", "director", + "title", "year", + "address", "publisher", -- aka studio + }, + optional = { + "type", + "note", + "doi", + }, +} + +categories.music = { + sets = { + doi = generic.doi, + author = { "composer", "artist", "title", "album" }, + title = { "title", "album", }, + }, + required = { + "author", + "title", + "year", + "address", "publisher", -- aka label + }, + optional = { + "type", + "note", + "doi", + }, +} + +-- use this type when nothing else fits. + +categories.misc = { + sets = { + doi = generic.doi, + }, + required = { + -- nothing is really important here + }, + optional = { + "author", + "title", "subtitle", "file", + "year", "month", + "howpublished", + "doi", "note", + }, +} + +-- other (whatever jabref does not know!) + +categories.other = { + sets = { + doi = generic.doi, + }, + required = { + "author", + "title", + "year" + }, + optional = { + "subtitle", "file", + "doi", "note", + }, +} + +-- if all else fails to match: + +categories.literal = { + sets = { + author = { "key" }, + doi = generic.doi, + }, + required = { + "author", + "text" + }, + optional = { + "doi", "note" + }, + virtual = false, +} + +-- done + +return specification diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv deleted file mode 100644 index 3f7b119af67..00000000000 --- a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv +++ /dev/null @@ -1,547 +0,0 @@ -%D \module -%D [ file=publ-imp-apa, -%D version=2013.12.12, % based on bibl-apa.tex and later xml variant -%D title=APA bibliography style, -%D subtitle=Publications, -%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 therefore copyrighted -%D by \PRAGMA. See mreadme.pdf for details. - -% common - -% \loadbtxdefinitionfile[def] - -\startsetups btx:apa:common:wherefrom - \btxdoifelse {address} { - \getvariable{btx:temp}{left} - \btxdoifelse {country} { - \btxdoifelse {\getvariable{btx:temp}{label}} { - \btxflush{address}\btxcomma\btxflush{country}: \btxflush{\getvariable{btx:temp}{label}} - } { - \btxflush{address}\btxcomma\btxflush{country} - } - } { - \btxdoifelse {\getvariable{btx:temp}{label}} { - \btxflush{address}\btxcomma\btxflush{\getvariable{btx:temp}{label}} - } { - \btxflush{address} - } - } - \getvariable{btx:temp}{right} - } { - \btxdoifelse {country} { - \getvariable{btx:temp}{left} - \btxdoifelse {\getvariable{btx:temp}{label}} { - \btxflush{country}: \btxflush{\getvariable{btx:temp}{label}} - } { - \btxflush{country} - } - \getvariable{btx:temp}{right} - } { - \btxdoifelse {\getvariable{btx:temp}{label}} { - \getvariable{btx:temp}{left} - \btxflush{\getvariable{btx:temp}{label}} - \getvariable{btx:temp}{right} - } { - \getvariable{btx:temp}{otherwise} - } - } - } -\stopsetups - -% \setvariables[btx:temp][label=,left=,right=,otherwise=] - -\startsetups btx:apa:common:publisher - \begingroup - \setvariables[btx:temp][label=publisher]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:organization - \begingroup - \setvariables[btx:temp][label=organization]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:school - \begingroup - \setvariables[btx:temp][label=school]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:institution - \begingroup - \setvariables[btx:temp][label=institution]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:school:subsentence - \begingroup - \setvariables[btx:temp][label=school,left=\btxcomma,right=\btxperiod,otherwise=\btxperiod]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:institution:subsentence - \begingroup - \setvariables[btx:temp][label=institution,left=\btxcomma,right=\btxperiod,otherwise=\btxperiod]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:publisher:sentence - \begingroup - \setvariables[btx:temp][label=publisher,left=\btxspace,right=\btxperiod]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:organization:sentence - \begingroup - \setvariables[btx:temp][label=organization,left=\btxspace,right=\btxperiod]\relax - \btxsetup{btx:apa:common:wherefrom} - \endgroup -\stopsetups - -\startsetups btx:apa:common:title-and-series - \btxdoif {title} { - \btxflush{title} - \btxdoif {series} { - \btxlparent\btxflush{series}\btxrparent - } - \btxperiod - } -\stopsetups - -\startsetups btx:apa:common:title-it-and-series - \btxdoif {title} { - \bgroup\it\btxflush{title}\/\egroup - \btxdoif {series} { - \btxlparent\btxflush{series}\btxrparent - } - \btxperiod - } -\stopsetups - -\disablemode[btx:apa:edited-book] - -\startsetups btx:apa:common:author-and-year - \btxdoif {author} { - \btxflushauthor{author} - } - \btxdoif {year} { - \btxlparent\btxflush{year}\btxrparent - } - \btxperiod -\stopsetups - -\startsetups btx:apa:common:author-or-key-and-year - \btxdoifelse {author} { - \btxflushauthor{author} - } { - \btxdoif {key} { - \btxlbracket\btxsetup{btx:format:key}\btxrbracket - } - } - \btxdoif {year} { - \btxlparent\btxflush{year}\btxrparent - } - \btxperiod -\stopsetups - -\startsetups btx:apa:common:author-editors-crossref-year - \btxdoif {author} { - \btxflushauthor{author} - } { - \btxdoifelse {editor} { - \enablemode[btx:apa:edited-book] - \btxflushauthor{editor} - \btxcomma\btxsingularplural{editor}{editor}{editors} - } { - % weird period - \btxdoif {crossref} { - \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket\btxperiod - } - } - } - \btxdoif {year} { - \btxlparent\btxflush{year}\btxrparent - } - \btxperiod -\stopsetups - -\startsetups btx:apa:common:editor-or-key-and-year - \btxdoifelse {editor} { - \enablemode[btx:apa:edited-book] - \btxflushauthor{editor} - \btxcomma\btxsingularplural{editor}{editor}{editors} - } { - \btxdoif {key} { - \btxlbracket\btxsetup{btx:format:key}\btxrbracket - } - } - \btxspace - \btxdoif {year} { - \btxlparent\btxflush{year}\btxrparent - } - \btxperiod -\stopsetups - -\startsetups btx:apa:common:note - \btxdoif {note} { - \btxspace\btxflush{note}\btxperiod - } -\stopsetups - -\startsetups btx:apa:common:comment - \btxdoif {comment} { - \btxspace\btxflush{comment}\btxperiod - } -\stopsetups - -\startsetups btx:apa:common:pages:p - \btxdoif {pages} { - \btxspace\btxflush{pages}\btxspace p\btxperiod - } -\stopsetups - -\startsetups btx:apa:common:pages:pp - \btxdoif {pages} { - \btxspace\btxflush{pages}\btxspace pp\btxperiod - } -\stopsetups - -\startsetups btx:apa:common:pages:pages - \btxdoif {pages} { - \btxcomma pages~\btxflush{pages} - } -\stopsetups - -\startsetups btx:apa:common:edition:sentense - \btxdoif {edition} { - \btxspace\btxflush{edition}\btxspace edition\btxperiod - } -\stopsetups - -% check when the next is used (no period) - -% \startsetups btx:apa:common:edition -% \btxdoif {edition} { -% \btxspace\btxflush{edition}\btxspace edition -% } -% \stopsetups - -% we can share more, todo - -% specific - -\startsetups btx:apa:article - \btxsetup{btx:apa:common:author-or-key-and-year} - \btxdoif {title} { - \btxflush{title}\btxperiod - } - \btxdoifelse {journal} { - \bgroup\it\btxflush{journal}\/\egroup - } { - \btxdoif {crossref} { - In\btxspace\btxflush{crossref} - } - } - \btxdoifelse {volume} { - \btxcomma\bgroup\it\btxflush{volume}\/\egroup - \btxdoif {issue} { - \btxlparent\btxflush{issue}\btxrparent - } - \btxdoif {pages} { - \btxcomma\btxflush{pages} - } - \btxperiod - } { - \btxsetup{btx:apa:common:pages:pp} - } - \btxsetup{btx:apa:common:note} - \btxsetup{btx:apa:common:comment} -\stopsetups - -\startsetups btx:apa:book - \btxsetup{btx:apa:common:author-editors-crossref-year} - \btxdoif {title} { - \bgroup\it\btxflush{title}\/\egroup - \doifmodeelse {btx:apa:edited-book} { - \btxdoifelse {volume} { - \btxspace Number\nonbreakablespace\btxflush{volume} - \btxdoifelse {series} { - \btxspace in\nonbreakablespace\btxflush{series}\btxperiod - } { - \btxdoifelse {crossref} { - \btxspace in\btxlbracket\btxsetup{btx:format:crossref}\btxrbracket - } { - \btxperiod - } - } - } { - \btxdoif {series} { - \btxspace\btxflush{series} - } - \btxperiod - } - } { - \btxdoifelse {crossref} { - \btxdoif {chapter} { - \btxcomma\btxflush{chapter} - } - \btxsetup{btx:apa:common:pages:pages} - \btxperiod - \btxdoif {volume} { - Volume\nonbreakablespace\btxflush{volume}\btxspace of\nonbreakablespace - } - } { - \btxdoif {volume} { - \btxcomma volume\nonbreakablespace\btxflush{volume} - \btxdoif {series} { - \btxspace of\nonbreakablespace\bgroup\it\btxflush{series}\/\egroup - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter} - } - \btxsetup{btx:apa:common:pages:pages} - } - \btxperiod - } - } - } - \btxsetup{btx:apa:common:edition:sentence} - \btxsetup{btx:apa:common:publisher:sentence} - \btxsetup{btx:apa:common:pages:p}% twice? - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:inbook - \btxsetup{btx:apa:common:author-editors-crossref-year} - \btxdoifelse {title} { - \bgroup\it\btxflush{title}\/\egroup - } { - \doifmodeelse {btx:apa:edited-book} { - \btxdoifelse {volume} { - \btxspace number\nonbreakablespace\btxflush{volume} - \btxdoifelse {series} { - \btxspace in\nonbreakablespace\btxflush{series}\btxperiod - } { - \btxdoifelse {crossref} { - \btxspace in\btxlbracket\btxsetup{btx:format:crossref}\btxrbracket - } { - \btxperiod - } - } - } { - \btxdoif {series} { - \btxspace\btxflush{series}\btxperiod - } - } - } { - \btxdoifelse {crossref} { - \btxdoif {chapter} { - \btxcomma\btxflush{chapter} - } - \btxsetup{btx:apa:common:pages:pages} - \btxdoif {volume} { - Volume\nonbreakablespace\btxflush{volume}\btxspace of\nonbreakablespace - } - \btxdoif {crossref} { - \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket - } - } { - \btxdoif {volume} { - \btxcomma volume\nonbreakablespace\btxflush{volume} - \btxdoif {series} { - \btxspace of\nonbreakablespace\bgroup\it\btxflush{series}\/\egroup - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter} - } - \btxsetup{btx:apa:common:pages:pages} - \btxperiod - } - } - } - } - \btxspace - \btxsetup{btx:apa:common:edition:sentence} - \btxsetup{btx:apa:common:publisher} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:booklet - \btxsetup{btx:apa:common:author-or-key-and-year} - \btxsetup{btx:apa:common:title-it-and-series} - \btxsetup{btx:apa:common:edition:sentence} - \btxsetup{btx:apa:common:publication:sentence} - \btxsetup{btx:apa:common:pages:p} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:manual - \btxsetup{btx:apa:common:author-or-key-and-year} - \btxsetup{btx:apa:common:title-it-and-series} - \btxsetup{btx:apa:common:edition:sentence} - \btxsetup{btx:apa:common:organization:sentence} - \btxsetup{btx:apa:common:pages:p} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:incollection - \btxsetup{btx:apa:common:author-and-year} - \btxdoif {arttitle} { - \btxflush{arttitle}\btxperiod - } - In\btxspace - \btxdoifelse {title} { - \btxflushauthor{editor}\btxcomma - \bgroup\it\btxflush{title}\/\egroup - \btxdoif {series} { - \btxdoif {volume} { - \btxcomma number\btxspace\btxflush{volume}\btxspace in - } - \btxspace\btxflush{series} - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter}\btxspace - } - \btxsetup{btx:apa:common:pages:pages} - \btxdoif {edition} { - \btxspace\btxflush{edition}\btxspace edition - } - \btxsetup{btx:apa:common:publisher:sentence} - } { - \btxdoif {crossref} { - \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter} - } - \btxspace - \btxsetup{btx:apa:common:pages:pages} - } - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:inproceedings - \btxsetup{btx:apa:common:author-and-year} - \btxdoif {arttitle} { - \btxflush{arttitle}\btxperiod - } - In\btxspace - \btxdoifelse {title} { - \btxdoif {editor} { - \btxflush{btx:apa:format:editors} - \btxcomma\btxsingularplural{editor}{editor}{editors}\btxcomma - } - \bgroup\it\btxflush{title}\/\egroup - \btxdoif {series} { - \btxdoif {volume} { - \btxcomma number~\btxflush{volume} in - } - \btxspace - \btxflush{series} - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter}\btxspace - } - \btxsetup{btx:apa:common:pages:pages} - \btxperiod - \btxsetup{btx:apa:common:organization:sentence} - } { - \btxdoif {crossref} { - \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter}\btxspace - } - \btxsetup{btx:apa:common:pages:pages} - \btxperiod - } - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:proceedings - \btxsetup{btx:apa:common:editor-or-key-and-year} - \btxdoif {title} { - \bgroup\it\btxflush{title}\/\egroup - \btxdoif {volume} { - \btxcomma number\btxspace\btxflush{volume}\btxspace in\btxspace - } - \btxdoif {chapter} { - \btxcomma\btxflush{chapter}\btxspace - } - \btxsetup{btx:apa:common:pages:pages} - \btxperiod - \btxsetup{btx:apa:common:organization:sentence} - } - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:common:thesis - \btxsetup{btx:apa:common:author-and-year} - \btxsetup{btx:apa:common:title-it-and-series} - \btxdoifelse {type} { - \btxflush{type} - } { - \getvariable{btx:temp}{label} - } - \btxsetup{btx:apa:common:school:subsentence} - \btxsetup{btx:apa:common:pages:p} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:mastersthesis - \setvariables[btx:temp][label=Master's thesis] - \btxsetup{btx:apa:common:thesis} -\stopsetups - -\startsetups btx:apa:phdthesis - \setvariables[btx:temp][label=PhD thesis] - \btxsetup{btx:apa:common:thesis} -\stopsetups - -\startsetups btx:apa:techreport - \btxsetup{btx:apa:common:author-and-year} - \btxsetup{btx:apa:common:title-and-series} - \btxdoifelse {type} { - \btxflush{type} - \btxdoif {volume} { - \btxspace\btxflush{volume} - } - } { - \btxspace Technical Report - } - \btxsetup{btx:apa:common:institution:subsentence} - \btxsetup{btx:apa:common:pages:p} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:misc - \btxsetup{btx:apa:common:author-and-year} - \btxsetup{btx:apa:common:title-and-series} - \btxsetup{btx:apa:common:publisher:sentence} - \btxsetup{btx:apa:common:pages:p} - \btxsetup{btx:apa:common:note} -\stopsetups - -\startsetups btx:apa:unpublished - \btxsetup{btx:apa:common:author-and-year} - \btxsetup{btx:apa:common:title-and-series} - \btxsetup{btx:apa:common:pages:p} - \btxdoif {type} { - \btxlparent\btxflush{type}\btxrparent - } - \btxsetup{btx:apa:common:note} -\stopsetups - -\endinput diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi new file mode 100644 index 00000000000..a1814b0a48b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi @@ -0,0 +1,1473 @@ +%D \module +%D [ file=publ-imp-apa, +%D version=2013.12.12, +%D title=APA bibliography style, +%D subtitle=Publications, +%D author=Alan Braslau and 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 therefore copyrighted +%D by \PRAGMA. See mreadme.pdf for details. + +\startbtxrenderingdefinitions[apa] + +\ifdefined\c!translate \else \def\c!translate{translate} \fi + +%D Reference: +%D \startTEX +%D @Book{APA2010, +%D title ={Publication Manual of the American Psychological Association}, +%D year ={2010}, +%D edition ={Sixth}, +%D address ={Washington, DC}, +%D publisher={American Psychological Association}, +%D pages ={291}, +%D url ={http://www.apa.org/books/}, +%D } +%D \stopTEX + +% set ALL specific APA compliant values + +\definebtx + [apa] + [\c!default=default, + \c!specification=apa, + \c!otherstext={\space\btxlabeltext{apa:others}}, + %c!journalconversion=\v!normal, + \c!monthconversion=\v!month] + +% First, define list and rendering parameters + +% The APA style sorts the unnumbered rendered list by authoryear + +\definebtxrendering + [apa] + [\c!specification=apa, + \c!sorttype=authoryear, + \c!numbering=\v!no] + +\setupbtxlist + [apa] + [\c!alternative=\v!paragraph, + \c!width=\v!fit, + \c!distance=.5\emwidth, + \c!margin=3\emwidth] + +\definebtx + [apa:list] + [apa] + [\c!otherstext={,\nobreakspace\textellipsis\space}, + \c!etallimit=7, + \c!etaldisplay=6, + \c!authorconversion=invertedshort, + \c!separator:names:2={,\space}, % aka namesep - in this namespace + \c!separator:names:3={,\nobreakspace\textampersand\space}, % comma separated list + \c!separator:names:4={\nobreakspace\textampersand\space}] % last of two, no comma! + +% First, we define a namespace for a few special fields + +\definebtx + [apa:list:author] + [apa:list] + +\definebtx + [apa:list:editor] + [apa:list:author] + +\definebtx + [apa:list:suffix] + [apa:list] + +\definebtx + [apa:list:url] + [apa:list] + +\definebtx + [apa:list:doi] + [apa:list] + +\definebtx + [apa:list:invertedshort] + [apa:list] + +\definebtx + [apa:list:short] + [apa:list] + +% Next, we define a namespace for each category + +%D In order to be able to get journals expanded (or normalized or abbreviated) you need +%D to load a list: +%D +%D \starttyping +%D \btxloadjournallist[journals.txt] % the jabref list +%D \stoptyping + + +\definebtx + [apa:list:journal] + [\c!style=\v!italic] + %command=\btxexpandedjournal] % btxabbreviatedjournal + +\definebtx + [apa:list:title] + [\c!style=\v!italic, + \c!command=\Word, + \c!translate=\v!yes] + +\definebtx + [apa:list:title:article] + [apa:list:title] + [\c!style=] % journal is set in italics + +\definebtx + [apa:list:title:magazine] + [apa:list:title] + +\definebtx + [apa:list:title:newspaper] + [apa:list:title] + +\definebtx + [apa:list:title:periodical] + [apa:list:title] + +\definebtx + [apa:list:title:standard] + [apa:list:title] + +\definebtx + [apa:list:title:book] + [apa:list:title] + +\definebtx + [apa:list:title:inbook] + [apa:list:title] + +\definebtx + [apa:list:title:incollection] + [apa:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [apa:list:title:proceedings] + [apa:list:title] + +\definebtx + [apa:list:title:inproceedings] + [apa:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [apa:list:title:conference] + [apa:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [apa:list:title:thesis] + [apa:list:title] + +\definebtx + [apa:list:title:phdthesis] + [apa:list:title] + +\definebtx + [apa:list:title:mastersthesis] + [apa:list:title] + +\definebtx + [apa:list:title:booklet] + [apa:list:title] + +\definebtx + [apa:list:title:manual] + [apa:list:title] + +\definebtx + [apa:list:title:techreport] + [apa:list:title] + +\definebtx + [apa:list:title:unpublished] + [apa:list:title] + +\definebtx + [apa:list:title:patent] + [apa:list:title] + +\definebtx + [apa:list:title:electronic] + [apa:list:title] + +\definebtx + [apa:list:title:music] + [apa:list:title] + +\definebtx + [apa:list:title:film] + [apa:list:title] + +\definebtx + [apa:list:title:other] + [apa:list:title] + +\definebtx + [apa:list:title:misc] + [apa:list:title] + +\definebtx + [apa:list:title:literal] + [apa:list:title] + +\definebtx + [apa:list:type] + [\c!command=\Word] + +% We define [page] settings in the apa namespace, inheriting the root +% settings, in order to eventually allow for modifications without touching +% root. + +\definebtx + [apa:page] + [\s!page] + +\definebtx + [apa:page:list] + [apa:page] + [\c!command={\wordright}] + +% Then define and set cite parameters. + +\definebtx + [apa:cite] + [apa] + [\c!alternative=authoryear, + \c!otherstext={,\space\btxlabeltext{apa:others}}, + \c!etallimit=5, + \c!etaldisplay=1, % TODO: when 2-4, show all first time, etaldisplay subsequently... + \c!authorconversion=\v!name, + \c!sorttype=authoryear, + \c!separator:names:2={,\space}, + \c!separator:names:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:names:4={\space\btxlabeltext{apa:and}\space}] % not \textampersand + +\definebtx + [apa:cite:author] + [apa:cite] + +\definebtx + [apa:cite:authoryear] + [apa:cite:author] + [\c!left={\removeunwantedspaces\pushpunctuation\btxspace(}, + \c!right={)\poppunctuation}, + \c!inbetween={,\space}, + \c!compress=\v!yes] + +\definebtx + [apa:cite:default] + [apa:cite:authoryear] + +\definebtx + [apa:cite:authoryears] + [apa:cite:authoryear] + [\c!left=, + \c!right=, + \c!inbetween={\space}] + +\definebtx + [apa:cite:authornum] + [apa:cite:author] + [\c!left={\removeunwantedspaces\pushpunctuation\btxspace(}, + \c!right={)\poppunctuation}, + \c!sorttype=authornum] + +\definebtx + [apa:cite:authorref] + [apa:cite:authornum] + +\definebtx + [apa:cite:author:num] % todo + [apa:cite:authornum] + [\c!left={\removeunwantedspaces\pushpunctuation\btxspace[}, + \c!right={]\poppunctuation}] + +\definebtx + [apa:cite:author:year] % todo + [apa:cite] + +\definebtx + [apa:cite:author:years] % todo + [apa:cite:authoryears] + [\c!inbetween=, + \c!left=(, + \c!right=)] + +\definebtx + [apa:cite:year] + [apa:cite] + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4={\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!compress=\v!yes, + \c!sorttype=\v!default] + +\definebtx + [apa:cite:title] + [apa:cite] + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4={\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!command={\language[\currentbtxlanguage]}, % BAH + \c!style=\v!italic] + +\definebtx + [apa:cite:booktitle] + [apa:cite:title] + +\definebtx + [apa:cite:tag] + [apa:cite] + [\c!left={\removeunwantedspaces\pushpunctuation\btxspace[}, + \c!right={]\poppunctuation}] + +\definebtx + [apa:cite:key] + [apa:cite:tag] + +\definebtx + [apa:cite:serial] + [apa:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [apa:cite:page] + [apa:cite] + [\c!left=, + \c!right=, + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4={\space\btxlabeltext{apa:and}\space}] % not \textampersand + +\definebtx + [apa:cite:pages] + [apa:cite:page] + +\definebtx + [apa:cite:keywords] + [apa:cite] + [\c!left={(}, + \c!right={)}] + +\definebtx + [apa:cite:invertedshort] + [apa:cite] + +\definebtx + [apa:cite:short] + [apa:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [apa:cite:category] + [apa:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [apa:cite:type] + [apa:cite:category] + +\definebtx + [apa:cite:url] + [apa:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [apa:cite:doi] + [apa:cite:url] + +\definebtx + [apa:cite:num] + [apa:cite] + [\c!compress=\v!yes, + \c!left={[}, + \c!right={]}, + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +\definebtx + [apa:cite:textnum] + [apa:cite:num] + [\c!left={Ref.\nbsp}, + \c!right=, + \c!separator:2={,\space}, + \c!separator:3={\space\btxlabeltext{apa:and}\space}, + \c!separator:4={\space\btxlabeltext{apa:and}\space}] + +\definebtx + [apa:cite:entry] + [apa:cite] + [\c!left=, + \c!right=, + \c!inbetween={\space}, + \c!separator:2={;\space}, + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +% Now we setup for the details of the renderings + +%D Sometimes we have verbose injections in an entry and these can be language +%D dependent, so we use labels. +%D +%D Because we want to mix rendering (in the manual) we need a namespace in label +%D texts: + +\setupbtxlabeltext + [en] + [apa:and=and, + apa:number={no.}, + apa:edition={ed.}, + apa:Editor={Ed.}, + apa:Editors={Eds.}, + apa:Volume={Vol.}, + apa:Volumes={Vols.}, + apa:others={et al.}, + apa:page={p.}, + apa:pages={pp.}, + apa:nd={n.d.}, % no date + apa:mastersthesis={Master's thesis}, + apa:phdthesis={Doctoral dissertation}, + apa:technicalreport={Tech. Rep.}, % Technical report + apa:supplement={Suppl.}, % Supplement (not used?) + apa:patent=Patent, + apa:MotionPicture={Motion picture}, + apa:Producer=Producer, + apa:Producers=Producers, + apa:Director=Director, + apa:Directors=Directors, + apa:Recordedby={Recorded by}, + apa:Author=Author, + apa:Translator={Trans.}, % Translator(s) (not used?) + apa:Advanced={Advanced online publication}, + apa:Retrieved={Available from}, % {Retrieved from}, + apa:In=In] + +\setupbtxlabeltext + [nl] + [apa:and=en, + apa:number={nr.}, + apa:edition={ed.}, % editie + apa:Editor=Editor, % Ed./Eds. + apa:Editors=Editors, + apa:Volume={Vol.}, + apa:Volumes={Vols.}, + apa:others={et al.}, + apa:page={p.}, + apa:pages={pp.}, + apa:nd={g.d.} % geen datum + apa:mastersthesis=Masterproef, + apa:phdthesis=Proefschrift, + apa:technicalreport={Technisch rapport}, % Technical report + apa:supplement=Supplement, + apa:patent=Octrooi, + apa:MotionPicture=Film, % ? + apa:Producer=Producent, % ? + apa:Producers=Producents, % ? + apa:Director=Directeur, + apa:Directors=Directeurs, + apa:Recordedby={Opgenomen door}, % ? + apa:Author=Auteur, + apa:Translator=Vertaler, + apa:Advanced={Geavanceerde online publicatie}, + apa:Retrieved={Beschikbaar vanaf}, % {Ontvangen van}, + apa:In=In] + +\setupbtxlabeltext + [fr] + [apa:and=et, + apa:others={et al.}, + apa:number={n\high{o}}, + apa:edition={édition}, + apa:Editor=Éditeur, + apa:Editors=Éditeurs, + apa:Volume=Volume, + apa:Volumes=Volumes, + apa:others={et al.}, + apa:page={p.}, + apa:pages={pp.}, + apa:nd={s.d.} % sans date + apa:mastersthesis={Thèse de master (DEA, DESS, master)}, + apa:phdthesis={Thèse de doctorat}, + apa:technicalreport={Rapport technique}, + apa:supplement=Supplément, + apa:patent=Brevet, + apa:MotionPicture={Film cinématographique}, + apa:Producer=Producteur, + apa:Producers=Producteurs, + apa:Director=Réalisateur, + apa:Directors=Réalisateurs, + apa:Recordedby={Enregistré par}, + apa:Author=Auteur, + apa:Translator=Traducteur, + apa:Advanced={Publication en ligne anticipée}, + apa:Retrieved={Disponible à}, % {Téléchargé de}, + apa:In=Dans] + +\setupbtxlabeltext + [de] + [apa:and=und, + apa:number={nr.}, + apa:edition=Auf\/lage, + apa:Editor=Herausgeber, % Hrsg./Hg. + apa:Editors=Herausgeber, + apa:Volume=Band, % Bd. + apa:Volumes={Bände}, + apa:others={et al.}, + apa:page={S.}, + apa:pages={S.}, + apa:nd={o.D.}, % ohne Datum (mostly: o.J. / ohne Jahr) + apa:mastersthesis={Masterarbeit}, + apa:phdthesis={Dissertation}, + apa:technicalreport={Technischer Bericht}, + apa:supplement={Beilage}, % Supplement + apa:patent=Patent, + apa:MotionPicture=Kinofilm, % ? + apa:Producer=Producer, % ? + apa:Producers=Produzenten, % ? + apa:Director=Director, % ? + apa:Directors=Directors, % ? + apa:Recordedby={per Einschreiben}, % ? + apa:Author=Autor, + apa:Translator={Übersetzer}, % Übers. + apa:Advanced={Erweiterte Online-Publikation}, + apa:Retrieved={heruntergeladen von}, + apa:In=In] + +% thanks: Andrea Valle + +\setupbtxlabeltext + [it] + [apa:and=e, + apa:number={nº}, + apa:edition={ed.}, % edizione + apa:Editor={A cura di}, + apa:Editors={A cura di}, + apa:Volume={Vol.}, % Volume + apa:Volumes={Vol.}, % Volumi + apa:others={et al.}, + apa:page={p.}, + apa:pages={pp.}, + apa:nd={s.d.}, % senza data + apa:mastersthesis={Tesi di laurea}, + apa:phdthesis={Tesi di dottorato}, + apa:technicalreport={Relazione tecnica}, + apa:supplement={Supplemento}, + apa:patent=Brevetto, + apa:MotionPicture=Film, % ? + apa:Producer=Produttore, + apa:Producers=Produttori, + apa:Director=Direttore, + apa:Directors=Direttori, + apa:Recordedby={Registrato da}, + apa:Author=Autore, + apa:Translator={Trad.}, % Translator(s) + apa:Advanced={Pre-pubblicazione on line}, + apa:Retrieved={Accessible online}, + apa:In=In] + +\setupbtxlabeltext + [es] + [apa:and=y, + apa:number={nº}, + apa:edition={ed.}, % edición + apa:Editor=Editor, % Ed./Eds. + apa:Editors=Editores, + apa:Volume={Vol.}, % Volumen + apa:Volumes={Vols.}, % Volúmenes + apa:others={et al.}, + apa:page={p.}, + apa:pages={pp.}, + apa:nd={s.f.}, % sin fecha + apa:mastersthesis={Tesis de maestría}, + apa:phdthesis={Tesis doctoral}, + apa:technicalreport={Informe técnico}, + apa:supplement=Suplemento, + apa:patent=Patente, + apa:MotionPicture=Cinematográfica, + apa:Producer=Productor, + apa:Producers=Productores, + apa:Director=Director, + apa:Directors=Directores, + apa:Recordedby={Grabada por}, + apa:Author=Autor, + apa:Translator=Traductor, + apa:Advanced={Publicación en línea avanzada}, + apa:Retrieved={Disponible desde}, % {Obtenido de}, + apa:In=En] + +% cite setups + +% The following differs from the default returning n.d. if year is empty + +\startsetups btx:apa:cite:author:year + \texdefinition{\s!btx:\s!cite:concat} + \btxparameter\c!left + \ifx\currentbtxfirst\empty + \btxlabeltext{apa:nd} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \currentbtxfirst + } + \ifx\currentbtxsecond\empty \else + \btxparameter\v!inbetween + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxsecond + } + \fi + \ifx\currentbtxthird\empty \else + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxthird + } + \fi + \fi + \btxparameter\c!right +\stopsetups + +\startsetups btx:apa:cite:author:years + \fastsetup{btx:apa:cite:author:year} +\stopsetups + +% The following differs from the default by including the labels p. and pp. + +\startsetups btx:apa:page:list + \fastsetup{\s!btx:\s!page:concat} + \ifx\currentbtxlastpage\empty + \btxlabeltext{apa:page} + \else + \btxlabeltext{apa:pages} + \fi + \btxnbsp + \ifconditional\btxinteractive + \goto { + \currentbtxfirstpage + } [ + internal(\currentbtxfirstinternal) + ] + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \goto { + \currentbtxlastpage + } [ + internal(\currentbtxlastinternal) + ] + \fi + \else + \currentbtxfirstpage + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \currentbtxlastpage + \fi + \fi +\stopsetups + +% The sameauthor feature may not be APA compliant +% (there is nothing in the manual cited above). +% It can be removed using the command: +% \resetsetups [apa:list:sameauthor] + +% :rule, :empty or :ditto ... + +\startsetups apa:list:sameauthor + \fastsetup{apa:list:sameauthor:rule} +\stopsetups + +\startsetups apa:list:sameauthor:rule + \blackrule + [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, + \c!height=1.5\linewidth]% \linewidth is just too thin with respect to font strokes... +\stopsetups + + +\startsetups [apa:list:sameauthor:\v!empty] + \kern\dimexpr\listparameter\c!margin-\interwordspace\relax +\stopsetups + +% horrible ! + +\startsetups apa:list:sameauthor:ditto + \inframed + [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, + \c!frame=\v!off, + \c!align=\v!middle] + {\doubleprime} +\stopsetups + +%D Instead of texdefinitions without arguments, we could have used setups but in my +%D editor (hh, scite) the commands stand out better. It also saves an additional +%D component in the name (e.g. common:) because commands and setups have a different +%D namespace, so similar calls don't clash. Performance of definitions is somewhat +%D better. + +%D We use "texdefinitions" (with eventual arguments) for helpers that are used +%D in the rendering "setups" defined for each category below. + +%D Note that \btxdoif... and \btxflush rely on the definitions in +%D publ-imp-apa.lua: fields that are not listed as required nor optional are +%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists +%D of alternative fields to be used in hierarchal order. For example: +%D author = { "author", "editor", "publisher", "title" }, will return the +%D author field if it exists; if not, the editor field will be returned, if it +%D exists; if not, the publisher field will be returned, if it exists; if not, +%D the title field will be returned, it it exists; if not, nothing will be +%D returned. In lua syntax, it can be understood as +%D author or editor or publisher or title or "" + +% #title can be title or booktitle + +\starttexdefinition btx:apa:translated-title #title + \ifx\currentbtxlanguage\empty + % no need for an extra + \else\ifx\mainbtxlanguage\currentbtxlanguage + % no need for an extra + \else + \btxdoif {#title:\mainbtxlanguage} { + \begingroup + \language[\mainbtxlanguage] + \btxleftbracket + \btxusecommand[apa:list:title:\currentbtxcategory] { + \btxflush{#title:\mainbtxlanguage} + } + \btxrightbracket + \endgroup + } + \fi\fi +\stoptexdefinition + +\starttexdefinition btx:apa:composed-title #title + \begingroup + \language[\currentbtxlanguage] + \btxusecommand[apa:list:title:\currentbtxcategory] { + \btxflush{#title} + \btxdoif {sub#title} { + \btxcolon + \btxflush{sub#title} + } + } + \endgroup + \doif{\btxparameter{translate}}\v!yes { + \texdefinition{btx:apa:translated-title}{#title} + } +\stoptexdefinition + +\starttexdefinition btx:apa:title + \setmode{btx:apa:title-placed} + % we make the title active, opening "file" + \btxdoifelse {file} { + \texdefinition{btx:format:inject} + {url(file:\btxflush{file})} + { + \btxstartstyleandcolor [apa:list:title:\currentbtxcategory] + \texdefinition{btx:apa:composed-title}{title} + \btxstopstyleandcolor + } + } { + \btxstartstyleandcolor [apa:list:title:\currentbtxcategory] + \texdefinition{btx:apa:composed-title}{title} + \btxstopstyleandcolor + } + \btxdoif {title} { + \btxperiod + % TODO: this period may NOT be wanted, as in: Title (2nd ed.). + } +\stoptexdefinition + +\starttexdefinition btx:apa:title-if-not-placed + \doifelsemode {btx:apa:title-placed} { + \resetmode{btx:apa:title-placed} + } { + \btxdoif {title} { + \btxspace + \texdefinition {btx:apa:title} + } + } +\stoptexdefinition + +\starttexdefinition btx:apa:suffixedyear + \btxdoifelse {year} { + \btxflush{year} + \btxflush{suffix} + %or \btxflush{suffixedyear} + } { + \btxlabeltext{apa:nd} + } +\stoptexdefinition + +% #author may be author(set) or editor + +\starttexdefinition btx:apa:author-or-editor #author + \btxdoif {#author} { + \btxflush{#author} + \doif {\btxfoundname{#author}} {editor} { + \btxleftparenthesis + \btxsingularorplural {editor} { + \btxlabeltext{apa:Editor} + } { + \btxlabeltext{apa:Editors} + } + \btxrightparenthesisperiod + } + } +\stoptexdefinition + +\starttexdefinition btx:apa:authoryear + % we make the authoryear active, pointing to the citation + \texdefinition{btx:format:inject} + {internal(\currentbtxinternal)} + { + \doifelsesetups{apa:list:sameauthor} { + \btxdoifelsesameasprevious {author} { + \fastsetup{apa:list:sameauthor} + } { + \texdefinition{btx:apa:author-or-editor} {author} + } + } { + \texdefinition{btx:apa:author-or-editor} {author} + } + \btxleftparenthesis + \texdefinition{btx:apa:suffixedyear} + \btxrightparenthesis + } + % outside of interaction + \btxperiod + \doif {\btxfoundname{author}} {title} { + \setmode{btx:apa:title-placed} + } +\stoptexdefinition + +\starttexdefinition btx:apa:editor-in + \btxdoif {booktitle} { + \btxlabeltext{apa:In} + \doifnot {\btxfoundname{author}} {editor} { + \btxspace + \texdefinition{btx:apa:author-or-editor} {editor} + } + \btxspace + \btxstartstyleandcolor[apa:list:title] + \texdefinition{btx:apa:composed-title} {booktitle} + \btxstopstyleandcolor + \btxperiod + } +\stoptexdefinition + +% TODO: The title is terminated with period. However, +% we probably don't want this before the parenthesis. + +\starttexdefinition btx:apa:leftparenthesis-or-comma + \doifelsemode {btx:apa:editionset-is-empty} { + \btxleftparenthesis + \resetmode{btx:apa:editionset-is-empty} + } { + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:apa:editionset + \setmode{btx:apa:editionset-is-empty} + \doif {\currentbtxcategory} {techreport} { + \texdefinition{btx:apa:leftparenthesis-or-comma} + \btxdoifelse {type} { + \btxusecommand[apa:list:type] { + \btxflush{type} + } + } { + \btxlabeltext{apa:technicalreport} + } + } + \btxdoif {volume} { + \texdefinition{btx:apa:leftparenthesis-or-comma} + \btxoneorrange {volume} { + \btxlabeltext{apa:Volume} + } { + \btxlabeltext{apa:Volumes} + } + \btxspace + \btxflush{volume} + } + \btxdoif {number} { + \texdefinition{btx:apa:leftparenthesis-or-comma} + \btxlabeltext{apa:number} + \btxspace + \btxflush{number} + } + \btxdoif {edition} { + \texdefinition{btx:apa:leftparenthesis-or-comma} + \btxflush{edition} + \btxspace + \btxlabeltext{apa:edition} + } + \btxdoif {pages} { + \texdefinition{btx:apa:leftparenthesis-or-comma} + \btxoneorrange {pages} { + \btxlabeltext{apa:page} + } { + \btxlabeltext{apa:pages} + } + \btxnbsp + \btxflush{pages} + } + \doifnotmode {btx:apa:editionset-is-empty} { + \btxrightparenthesisperiod + } +\stoptexdefinition + + % this could be simplified! + +\starttexdefinition btx:apa:journal-volume-number-pages + \btxdoif {journal} { + \btxspace + \btxstartstyleandcolor[apa:list:journal] + \btxusecommand[apa:list:journal] { + \btxflush{journal} + } + \btxdoifelse {volume} { + \btxcomma + \btxflush{volume} + \btxstopstyleandcolor + \btxdoif {number} { + %\btxleftparenthesis + (\btxflush{number} + \btxrightparenthesis + } + } { + \btxstopstyleandcolor + \btxdoif {number} { + \btxcomma + \btxleftparenthesis + \btxflush{number} + \btxrightparenthesis + } + } + \btxdoif {pages} { + \btxcomma + \doif {\currentbtxcategory} {newspaper} { + \btxoneorrange {pages} { + \btxlabeltext{apa:page} + } { + \btxlabeltext{apa:pages} + } + \btxnbsp + } + \btxflush{pages} + } + \btxperiod + \doifnot {\currentbtxcategory} {newspaper} { + \btxdoifnot {volume} { + \btxdoifnot {number} { + \btxdoifnot {pages} { + \btxdoif {doi} {%set: doi or url + \btxspace + \btxlabeltext{apa:Advanced} + \btxperiod + } + } + } + } + } + } +\stoptexdefinition + +\starttexdefinition btx:apa:wherefrom-publisher + \btxdoifelse {address} { + \btxflush{address} + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + \btxcolon + } { + \btxdoif {country} { + \btxflush{country} + \btxcolon + } + } + \doifelse {\btxfoundname{author}} {\btxfoundname{publisher}} { + \btxlabeltext{apa:Author} + } { + \btxdoifelse {publisher} { + \btxflush{publisher} + } { + \btxlabeltext{apa:Author} + } + } + \btxperiod +\stoptexdefinition + +\definebreakpoints[doi] +\definebreakpoint [doi][:][nleft=3,type=1] +\definebreakpoint [doi][/][nleft=3,type=1] +\definebreakpoint [doi][-][nleft=3,type=1] +\definebreakpoint [doi][.][nleft=3,type=1] + +% use \btxentry here? + +\starttexdefinition btx:apa:url + \btxspace + \btxlabeltext{apa:Retrieved} + \btxspace + \begingroup + \setbreakpoints[doi] + \ifconditional\btxinteractive + \goto { + \hyphenatedurl{\btxflush{url}} + } [ + url(\btxflush{url}) + ] + \else + \hyphenatedurl{\btxflush{url}} + \fi + \endgroup +\stoptexdefinition + +% use \btxentry here? + +\starttexdefinition btx:apa:doi + \btxspace + \begingroup + \setbreakpoints[doi] + \ifconditional\btxinteractive + \goto { + \hyphenatedurl{doi:\btxflush{doi}} + } [ + url(http://dx.doi.org/\btxflush{doi}) + ] + \else + \hyphenatedurl{doi:\btxflush{doi}} + \fi + \endgroup +\stoptexdefinition + +\starttexdefinition btx:apa:note + \btxdoif {note} { + \btxleftparenthesis + \btxflush{note} + \btxrightparenthesis + } +\stoptexdefinition + +\starttexdefinition btx:apa:url-doi-note + \doif {\btxfoundname{doi}} {url} { + \texdefinition{btx:apa:url} + } + \doif {\btxfoundname{doi}} {doi} { + \texdefinition{btx:apa:doi} + } + \texdefinition{btx:apa:note} + \removeunwantedspaces +\stoptexdefinition + +% Then setups, by category + +% An article from a journal +% Required fields: author or editor or title, journal, (year). +% Optional fields: volume, number, pages, type, doi, url, note. +% Note that bibtex (and tools) do not include editor (e.g. special issue or section) + +\startsetups btx:apa:list:article + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:journal-volume-number-pages} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% An article from a magazine. +% Required fields: author or title, journal, (year). +% Optional fields: number, pages, type, month, day, doi, url, note. + +\startsetups btx:apa:list:magazine + \fastsetup{btx:apa:list:article} +\stopsetups + +% An article from a newspaper. +% Required fields: author or title, journal, (year). +% Optional fields: volume, number, pages, type, month, day, doi, url, note. + +\startsetups btx:apa:list:newspaper + \fastsetup{btx:apa:list:article} +\stopsetups + +% A complete issue of a periodical, such as a special issue of a journal. +% Required fields: title, year +% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note + +% needs to be tuned... + +\startsetups btx:apa:list:periodical + \fastsetup{btx:apa:list:article} +\stopsetups + +% National and international standards issued by a standards body +% Required fields: author, institution, or organization, year, title +% Optional fields: subtitle, doi, url, note + +\startsetups btx:apa:list:standard + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% A book with an explicit publisher. +% Required fields: author or editor or publisher, title, (year). +% Optional fields: volume or number, series, address, edition, month, day, note. +% APA ignores: month, day + +% todo: series? + +\startsetups btx:apa:list:book + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:editionset} + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% There is some debate about how inbook should differ from incollection + +% A part of a book, which may be a chapter (or section or whatever) and/or a range of pages. +% (note that inbook is handled differently by bibtex and biblatex) +% Required fields: author or editor, title, chapter and/or pages, publisher, year. +% Optional fields: volume or number, series, type, address, edition, month, note. +% We add optional: booktitle. +% APA ignores: chapter, month + +\startsetups btx:apa:list:inbook + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:editor-in} + \texdefinition{btx:apa:editionset} + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% A part of a book having its own title. +% Required fields: author, title, booktitle, publisher, year. +% Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note. +% APA ignores: chapter, month + +\startsetups btx:apa:list:incollection + \fastsetup{btx:apa:list:inbook} +\stopsetups + +% The proceedings of a conference. +% Required fields: title, year. +% Optional fields: editor, volume or number, series, address, month, organization, publisher, note. +% todo: series? + +\startsetups btx:apa:list:proceedings + \fastsetup{btx:apa:list:book} +\stopsetups + +% An article in a conference proceedings. +% Required fields: author, title, booktitle, year. +% Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note. + +\startsetups btx:apa:list:inproceedings + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:editor-in} + \texdefinition{btx:apa:editionset} + \btxdoif {organization} { + \btxspace + \btxflush{organization} + \btxcomma + } + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +\startsetups btx:apa:list:conference + \fastsetup{btx:apa:list:inproceedings} +\stopsetups + +% A thesis. +% Required fields: author, title, school, year. +% Optional fields: type, address, month, note. + +\startsetups btx:apa:list:thesis + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \btxleftparenthesis + \btxdoifelse {type} { + \btxusecommand[apa:list:type] { + \btxflush{type} + } + } { + \btxlabeltext{apa:\currentbtxcategory} + } + \btxrightparenthesis + \btxdoif {school} { + \btxperiod + \btxflush{school} + } + \btxdoif {address} { + \btxdoifelse {school} { + \btxcomma + } { + \btxperiod + } + \btxflush{address} + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + } + \btxperiod + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +\startsetups btx:apa:list:phdthesis + \fastsetup{btx:apa:list:thesis} +\stopsetups + +\startsetups btx:apa:list:mastersthesis + \fastsetup{btx:apa:list:thesis} +\stopsetups + +% A work that is printed and bound, but without a named publisher or sponsoring institution. +% Required field: title. +% Optional fields: author, howpublished, address, month, year, note. + +\startsetups btx:apa:list:booklet + \fastsetup{btx:apa:list:book} +\stopsetups + +% Technical documentation. +% Required field: title. +% Optional fields: author, organization, address, edition, month, year, note. + +\startsetups btx:apa:list:manual + \fastsetup{btx:apa:list:book} +\stopsetups + +% A report published by a school or other institution, usually numbered within a series. +% Required fields: author, title, institution, year. +% Optional fields: type, number, address, month, note. + +\startsetups btx:apa:list:techreport + \fastsetup{btx:apa:list:book} +\stopsetups + +% A document having an author and title, but not formally published. +% Required fields: author, title, note. +% Optional fields: month, year. + +\startsetups btx:apa:list:unpublished + \fastsetup{btx:apa:list:book} +\stopsetups + +% A patent. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: nationality, number, year, yearfiled +% Optional fields: author, title, assignee, address, type, number, day, dayfiled, month, monthfiled, note, url +% Also optional: publisher + +% todo: yearfiled, monthfiled, dayfiled + +\startsetups btx:apa:list:patent + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \begingroup + \it + \btxdoif {nationality} { + \btxspace + \btxflush{nationality} + } + \btxspace + \btxlabeltext{apa:patent} + \btxdoif {number} { + \btxspace + \btxlabeltext{apa:number} + \btxspace + \btxflush{number} + } + \btxperiod + \italiccorrection + \endgroup + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url} + \texdefinition{btx:apa:note} +\stopsetups + +% Electronic. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: title +% Optional fields: address, author, howpublished, month, note, organization, url, year, doi +% Also optional: type + +% Like Misc below but includes organization. + +\startsetups btx:apa:list:electronic + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \btxdoif {organization} { + \btxspace + \btxflush{organization} + \btxperiod + } + \btxdoif {howpublished} { + \btxspace + \btxflush{howpublished} + \btxperiod + } + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% Film. Note that this category was not defined with BIBTEX. +% Required fields: producer, director, title, year, address, publisher +% Optional fields: subtitle, type, note, url, doi + +\startsetups btx:apa:list:film + \btxdoif {producer} { + \btxflush{producer} + \btxleftparenthesis + \btxsingularorplural {producer} { + \btxlabeltext{apa:Producer} + } { + \btxlabeltext{apa:Producers} + } + \btxrightparenthesis + \btxdoifelse {director} { + \removeunwantedspaces + \btxparameter{\c!separator:names:3} + } { + \btxperiod + } + } + \btxdoif {director} { + \btxflush{director} + \btxleftparenthesis + \btxsingularorplural {director} { + \btxlabeltext{apa:Director} + } { + \btxlabeltext{apa:Directors} + } + \btxrightparenthesisperiod + } + \btxleftparenthesis + \texdefinition{btx:apa:suffixedyear} + \btxrightparenthesisperiod + \texdefinition {btx:apa:title} + \btxleftbracket + \btxdoifelse {type} { + \btxflush{type} + } { + \btxlabeltext{apa:MotionPicture} + } + \btxrightbracketperiod + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% Music. Note that this category was not defined with BIBTEX. +% Required fields: composer, artist, title, album, year, address, publisher +% Optional fields: subtitle, type, note, url, doi + +\startsetups btx:apa:list:music + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \doifnot {\btxfoundname{author}} {artist} { + \btxdoif {artist} { + \btxleftbracket + \btxlabeltext{apa:Recordedby} + \btxspace + \btxflush{artist} + \btxrightbracketperiod + } + } + \doifnot {\btxfoundname{title}} {album} { + \btxdoif {album} { + \btxlabeltext{apa:In} + \btxspace + \btxflush{album} + \btxperiod + } + } + \btxdoif {type} { + \btxleftbracket + \btxflush{type} + \btxrightbracketperiod + } + \texdefinition{btx:apa:wherefrom-publisher} + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% Other. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: author or title, year +% Optional fields: note, doi, url + +\startsetups btx:apa:list:other + \fastsetup{btx:apa:list:book} +\stopsetups + +% Use this type when nothing else fits. +% Required fields: none. +% Optional fields: author, title, howpublished, month, year, note. + +\startsetups btx:apa:list:misc + \texdefinition{btx:apa:authoryear} + \texdefinition{btx:apa:title-if-not-placed} + \btxdoif {howpublished} { + \btxspace + \btxflush{howpublished} + \btxperiod + } + \texdefinition{btx:apa:url-doi-note} +\stopsetups + +% If all else fails to match: + +\startsetups btx:apa:list:literal + %\btxleftparenthesis + \removeunwantedspaces( + \btxflush{key} + \btxrightparenthesis + \btxdoif {text} { + \btxflush{text} + } +\stopsetups + +% HH: an example of setting up translations using a sub rendering. Keep it here +% till we find another spot as otherwise I forget about it and I don't want to +% waste hours reinventing a wheel when something like this is needed. +% +% \definebtx +% [apa:cite:title:translated] +% [apa:cite:title] +% [left=\btxleftbracket, +% right=\btxrightbracket, +% style=\v!bolditalic] +% +% \startsetups btx:apa:cite:title +% % need to add concat, etc. +% \btxcitereference +% \currentbtxfirst +% \doifmode {btx:apa:translatedtitles} { +% \ifx\currentbtxlanguage\empty +% % no need for an extra +% \else\ifx\mainbtxlanguage\currentbtxlanguage +% % no need for an extra +% \else +% \btxdoif {title:\mainbtxlanguage} { +% \btxstartciterendering[title:translated] +% \language[\mainbtxlanguage] +% \btxflush{title:\mainbtxlanguage} +% \btxstopciterendering +% } +% \fi\fi +% } +% \stopsetups + +\stopbtxrenderingdefinitions diff --git a/Master/texmf-dist/tex/context/base/publ-imp-aps.lua b/Master/texmf-dist/tex/context/base/publ-imp-aps.lua new file mode 100644 index 00000000000..1ec75d7d1df --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-aps.lua @@ -0,0 +1,479 @@ +local specification = { + -- + -- metadata + -- + name = "aps", + version = "1.00", + comment = "APS specification", + author = "Alan Braslau and Hans Hagen", + copyright = "ConTeXt development team", + -- + -- derived (combinations of) fields (all share the same default set) + -- + virtual = { + "authoryear", + "authoryears", + "authornum", + "num", + "suffix", + }, + -- + -- special datatypes + -- + types = { + -- + -- list of fields that are interpreted as names: "NAME [and NAME]" where + -- NAME is one of the following: + -- + -- First vons Last + -- vons Last, First + -- vons Last, Jrs, First + -- Vons, Last, Jrs, First + -- + author = "author", -- interpreted as name(s) + editor = "author", + doi = "url", -- an external link + url = "url", + page = "pagenumber", -- number or range: f--t + pages = "pagenumber", + volume = "range", + number = "range", + keywords = "keyword", -- comma|-|separated list + year = "number", + }, + -- + -- categories with their specific fields + -- + categories = { + -- + -- categories are added below + -- + }, +} + +local generic = { + -- + -- A set returns the first field (in order of position below) that is found + -- present in an entry. A set having the same name as a field conditionally + -- allows the substitution of an alternate field. + -- + -- note that anything can get assigned a doi or be available online. + editionset = { "edition", "volume", "number", "pages" }, +} + +-- Note that the APS specification allows an additional field "collaboration" +-- to be rendered following the author list (if the collaboration name appears +-- in the byline of the cited article). + +-- Definition of recognized categories and the fields that they contain. +-- Required fields should be present; optional fields may also be rendered; +-- all other fields will be ignored. + +-- Sets contain either/or in order of precedence. +-- +-- For a category *not* defined here yet present in the dataset, *all* fields +-- are taken as optional. This allows for flexibility in the addition of new +-- categories. + +local categories = specification.categories + +-- an article from a journal + +categories.article = { + sets = { + author = { "author", "editor" }, + }, + required = { + "author", + }, + optional = { + "collaboration", + "year", + "title", "subtitle", "type", "file", + "journal", "volume", "number", "pages", + "doi", "url", "note", + }, +} + +-- an article from a magazine + +categories.magazine = { + sets = categories.article.sets, + required = { + "author", + "year", + "journal", + }, + optional = { + "collaboration", + "title", "subtitle", "type", "file", + "number", "pages", + "month", "day", + "doi", "url", "note", + }, +} + +categories.newspaper = categories.magazine + +-- (from jabref) to be identified and setup ... + +categories.periodical = { + sets = { + author = { "editor", "publisher" }, + }, + required = { + "title", + "year", + }, + optional = { + "author", + "collaboration", + "subtitle", "file", + "series", "volume", "number", "month", + "organization", + "doi", "url", "note", + }, +} + +-- (from jabref) to be identified and setup ... + +categories.standard = { + sets = { + author = { "author", "institution", "organization" }, + }, + required = { + "author", + "year", + "title", "subtitle", + "doi", "note", + }, + optional = { + "collaboration", + "url", + }, +} + +-- a book with an explicit publisher. + +categories.book = { + sets = { + author = { "author", "editor", "publisher" }, + editionset = generic.editionset, + }, + required = { + "author", + "title", + }, + optional = { + "collaboration", + "year", "month", "day", + "title", "subtitle", "type", "file", + "editionset", "series", + "address", + "doi", "url", "note", + }, +} + +-- a part of a book, which may be a chapter (or section or whatever) and/or a range of pages. + +categories.inbook = { + sets = { + author = { "author", "editor", "publisher", }, + editionset = generic.editionset, + }, + required = { + "author", + "year" , + "title", + }, + optional = { + "collaboration", + "subtitle", "type", "file", + "booktitle", + -- "chapter", + "editionset", "series", + "month", + "address", + "doi", "url", "note", + }, +} + +-- a book having its own title as part of a collection. +-- (like inbook, but we here make booktitle required) + +categories.incollection = { + sets = { + author = { "author", "editor", "publisher" }, + editionset = generic.editionset, + }, + required = { + "author", + "booktitle", + "year", + }, + optional = { + "collaboration", + "title", "subtitle", "type", "file", + "editionset", "series", + "chapter", + "month", + "address", + "doi", "url", "note", + }, +} + +-- a work that is printed and bound, but without a named publisher or sponsoring institution. + +categories.booklet = { + sets = { + publisher = { "howpublished" }, -- no "publisher"! + }, + required = { + "author", + "title", + }, + optional = { + "publisher", + "collaboration", + "year", "month", + "subtitle", "type", "file", + "address", + "doi", "url", "note", + }, +} + +-- the proceedings of a conference. + +categories.proceedings = { + sets = { + author = { "editor", "organization", "publisher" }, -- no "author"! + publisher = { "publisher", "organization" }, + editionset = generic.editionset, + }, + required = { + "author", + "year" + }, + optional = { + "collaboration", + "publisher", + "title", "subtitle", "file", + "editionset", "series", + "month", + "address", + "doi", "url", "note", + }, +} + +-- an article in a conference proceedings. + +categories.inproceedings = { + sets = categories.incollection.sets, + required = categories.incollection.required, + optional = { + "collaboration", + "title", "subtitle", "type", "file", + "month", + "edition", "series", + "address", "organization", + "doi", "url", "note", + }, +} + +categories.conference = categories.inproceedings + +-- a thesis (of course). + +categories.thesis = { + required = { + "author", + "title", + "school", + "year", + "type" + }, + optional = { + "collaboration", + "subtitle", "file", + "month", + "address", + "doi", "url", "note", + }, +} + +categories.mastersthesis = { + sets = categories.thesis.sets, + required = { + "author", + "title", + "school", + "year" + }, + optional = { + "collaboration", + "type", + "subtitle", "file", + "month", + "address", + "doi", "url", "note", + }, +} +categories.phdthesis = categories.mastersthesis + +-- a report published by a school or other institution, usually numbered within a series. + +categories.techreport = { + sets = { + author = { "author", "institution", "publisher" }, + publisher = { "publisher", "institution", }, + editionset = { "type", "volume", "number", "pages" }, -- no "edition"! + }, + required = { + "author", + "title", + "institution", + "year" + }, + optional = { + "collaboration", + "publisher", + "address", + "subtitle", "file", + "editionset", + "month", + "doi", "url", "note", + }, +} + +-- technical documentation. + +categories.manual = { + sets = { + author = { "author", "organization", "publisher" }, + publisher = { "publisher", "organization", }, + editionset = generic.editionset, + }, + required = { + "title" + }, + optional = { + "author", "publisher", + "collaboration", + "address", + "subtitle", "file", + "editionset", "month", "year", + "doi", "url", "note", + }, +} + +-- a patent (of course). + +categories.patent = { + sets = { + author = { "author", "assignee", }, + publisher = { "publisher", "assignee", }, + year = { "year", "yearfiled", }, + month = { "month", "monthfiled", }, + day = { "day", "dayfiled", }, + }, + required = { + "nationality", + "number", + "year", + }, + optional = { + "type", + --check this: "language", + "author", "publisher", + "collaboration", + "title", "subtitle", "file", + "address", + "day", "month", + "doi", "url", "note", + }, +} + +-- a document having an author and title, but not formally published. + +categories.unpublished = { + required = { + "author", + "title", + "note" + }, + optional = { + "collaboration", + "subtitle", "file", + "year", "month", + "doi", "url", + }, +} + +-- like misc below but includes organization. + +categories.electronic = { + required = { + "title" + }, + optional = { + "subtitle", "type", "file", + "year", "month", + "author", + "collaboration", + "address", + "organization", + "howpublished", + "doi", "url", "note", + }, +} + +-- use this type when nothing else fits. + +categories.misc = { + required = { + -- nothing is really important here + }, + optional = { + "author", + "collaboration", + "title", "subtitle", "file", + "year", "month", + "howpublished", + "doi", "url", "note", + }, +} + +-- other (whatever jabref does not know!) + +categories.other = { + required = { + "author", + "title", + "year" + }, + optional = { + "collaboration", + "subtitle", "file", + "doi", "url", "note", + }, +} + +-- if all else fails to match: + +categories.literal = { + sets = { + author = { "key" }, -- need to check this! + }, + required = { + "text" + }, + optional = { + "author", + "doi", "url", "note" + }, + virtual = false, +} + +-- done + +return specification diff --git a/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi new file mode 100644 index 00000000000..3bc2a1d2184 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi @@ -0,0 +1,1156 @@ +%D \module +%D [ file=publ-imp-aps, +%D version=2015.03.22, +%D title=APS bibliography style, +%D subtitle=Publications, +%D author=Alan Braslau and 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 therefore copyrighted +%D by \PRAGMA. See mreadme.pdf for details. + +\startbtxrenderingdefinitions[aps] + +%D Reference: +%D \startTEX +%D @Book{APS2011, +%D title ={Physical Review Style and Notation Guide} +%D year ={2011}, +%D month ={June} +%D edition ={Revised}, +%D editor ={Waldron, A and Judd, P. and Miller, V.}, +%D address ={Ridge, NY}, +%D publisher={American Physical Society}, +%D pages ={26}, +%D url ={http://journals.aps.org/files/styleguide-pr.pdf} +%D } +%D \stopTEX + +% set ALL specific APS compliant values + +\definebtx + [aps] + [\c!default=default, + \c!specification=aps, + \c!otherstext={\space\btxlabeltext{aps:others}}, + \c!etallimit=10, + \c!etaldisplay=\btxparameter\c!etallimit, + %c!journalconversion=\v!normal, + \c!monthconversion=\v!month, + optionaltitle=\v!yes, + \c!separator:names:2={,\space}, + \c!separator:names:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand + \c!separator:names:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand + +% First, define and set list and rendering parameters + +\definebtxrendering + [aps] + [\c!specification=aps] + +\definebtx + [aps:list] + [aps] + [\c!authorconversion=normalshort] + +\definebtx + [aps:list:author] + [aps:list] + +\definebtx + [aps:list:editor] + [aps:list:author] + +\definebtx + [aps:list:suffix] + [aps:list] + +\definebtx + [aps:list:url] + [aps:list] + +\definebtx + [aps:list:doi] + [aps:list] + +\definebtx + [aps:list:invertedshort] + [aps:list] + +% This is for numbering=num + +\definebtx + [aps:list:num] + [aps:list] + [left={[}, + right={]}] + +% This is for numbering=yes + +\definebtx + [aps:list:yes] + [aps:list:num] + +% This is for numbering=short + +\definebtx + [aps:list:short] + [aps:list:num] + +% This is for numbering=bib + +\definebtx + [aps:list:bib] + [aps:list:num] + +%D In order to be able to get journals expanded (or normalized or abbreviated) you need +%D to load a list: +%D +%D \starttyping +%D \btxloadjournallist[journals.txt] % the jabref list +%D \stoptyping + +% TODO + +\definebtx + [aps:list:journal] + [\c!style=\v!italic] + %command=\btxexpandedjournal] % btxabbreviatedjournal + +\definebtx + [aps:list:volume] + [\c!style=\v!bold] + +\definebtx + [aps:list:title] + [\c!style=\v!italic, + \c!command=\Word] + +\definebtx + [aps:list:title:article] + [aps:list:title] + [\c!style=] % journal is set in italics + +\definebtx + [aps:list:title:magazine] + [aps:list:title] + +\definebtx + [aps:list:title:newspaper] + [aps:list:title] + +\definebtx + [aps:list:title:periodical] + [aps:list:title] + +\definebtx + [aps:list:title:standard] + [aps:list:title] + +\definebtx + [aps:list:title:book] + [aps:list:title] + +\definebtx + [aps:list:title:inbook] + [aps:list:title] + +\definebtx + [aps:list:title:incollection] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:proceedings] + [aps:list:title] + +\definebtx + [aps:list:title:inproceedings] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:conference] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:thesis] + [aps:list:title] + +\definebtx + [aps:list:title:phdthesis] + [aps:list:title] + +\definebtx + [aps:list:title:mastersthesis] + [aps:list:title] + +\definebtx + [aps:list:title:booklet] + [aps:list:title] + +\definebtx + [aps:list:title:manual] + [aps:list:title] + +\definebtx + [aps:list:title:techreport] + [aps:list:title] + +\definebtx + [aps:list:title:unpublished] + [aps:list:title] + +\definebtx + [aps:list:title:patent] + [aps:list:title] + +\definebtx + [aps:list:title:electronic] + [aps:list:title] + +\definebtx + [aps:list:title:other] + [aps:list:title] + +\definebtx + [aps:list:title:misc] + [aps:list:title] + +\definebtx + [aps:list:title:literal] + [aps:list:title] + +\definebtx + [aps:list:type] + [\c!command=\Word] + +% We define [page] settings in the aps namespace, inheriting the root +% settings, in order to eventually allow for modifications without touching +% root. + +\definebtx + [aps:page] + [\s!page] + +\definebtx + [aps:page:list] + [aps:page] + [\c!command={\wordright}] + +% Then define and set all cite parameters + +\definebtx + [aps:cite] + [aps] + [\c!authorconversion=\v!name] + +\definebtx + [aps:cite:author] + [aps:cite] + +\definebtx + [aps:cite:authoryear] + [aps:cite:author] + [\c!left={(}, + \c!right={)}, + \c!inbetween={,\space}] + +\definebtx + [aps:cite:authoryears] + [aps:cite:authoryear] + [\c!left=, + \c!right=, + \c!inbetween={\space}] + +\definebtx + [aps:cite:authornum] + [aps:cite:author] + [\c!left={(}, + \c!right={)}, + \c!sorttype=authornum] + +\definebtx + [aps:cite:authorref] + [aps:cite:authornum] + +\definebtx + [aps:cite:author:num] % todo + [aps:cite:authornum] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:author:year] % todo + [aps:cite:authoryear] + [\c!left=, + \c!right=] + +\definebtx + [aps:cite:author:years] % todo + [aps:cite:authoryears] + [\c!inbetween=, + \c!left=(, + \c!right=)] + +\definebtx + [aps:cite:year] + [aps:cite] + [\c!compress=\v!yes, + \c!sorttype=year] + +\definebtx + [aps:cite:title] + [aps:cite] + [\c!command={\language[\currentbtxlanguage]}, % BAH + \c!style=\v!italic] + +\definebtx + [aps:cite:booktitle] + [aps:cite:title] + +\definebtx + [aps:cite:tag] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:key] + [aps:cite:tag] + +\definebtx + [aps:cite:serial] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:page] + [aps:cite] + [\c!left=, + \c!right=, + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand + \c!separator:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand + +\definebtx + [aps:cite:pages] + [aps:cite:page] + +\definebtx + [aps:cite:keywords] + [aps:cite] + [\c!left={(}, + \c!right={)}] + +\definebtx + [aps:cite:invertedshort] + [aps:cite] + +\definebtx + [aps:cite:short] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:category] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:type] + [aps:cite:category] + +\definebtx + [aps:cite:url] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:doi] + [aps:cite:url] + +\definebtx + [aps:cite:num] + [aps:cite] + [\c!compress=\v!yes, + \c!left={[}, + \c!right={]}, + %\c!left=, % TODO: PRB uses superscript references... + %\c!right=, % and after punctuation, PRA, C, D, E, and L are before! + %\c!command={\high}, + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +\definebtx + [aps:cite:default] + [aps:cite:num] + +\definebtx + [aps:cite:textnum] + [aps:cite:num] + [\c!left={Ref.\nbsp}, + \c!command=, + \c!separator:2={,\space}, + \c!separator:3={\space\btxlabeltext{aps:and}\space}, + \c!separator:4={\space\btxlabeltext{aps:and}\space}] + +\definebtx + [aps:cite:entry] + [aps:cite] + [\c!left=, + \c!right=, + \c!inbetween={\space}, + \c!separator:2={;\space}, + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +%D Sometimes we have verbose injections in an entry and these can be language +%D dependent, so we use labels. +%D +%D Because we want to mix rendering (in the manual) we need a namespace in label +%D texts: + +\setupbtxlabeltext + [en] + [aps:and=and, + aps:number={no.}, + aps:edition={ed.}, + aps:Editor={Ed.}, + aps:Editors={Eds.}, + aps:Volume={Vol.}, + aps:Volumes={Vols.}, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Master's thesis}, + aps:phdthesis={Doctoral dissertation}, + aps:technicalreport={Tech. Rep.}, % Technical report + aps:supplement={Suppl.}, % Supplement (not used?) + aps:patent=Patent, + aps:inpress={in press}, + aps:tobe={to be published}, + aps:unpublished={unpublished}, + aps:In=In] + +% Check this (google translate!!): + +\setupbtxlabeltext + [nl] + [aps:and=en, + aps:number={nr.}, + aps:edition={ed.}, % editie + aps:Editor=Editor, % Ed./Eds. + aps:Editors=Editors, + aps:Volume={Vol.}, + aps:Volumes={Vols.}, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis=Masterproef, + aps:phdthesis=Proefschrift, + aps:technicalreport={Technisch rapport}, % Technical report + aps:supplement=Supplement, + aps:patent=Octrooi, + aps:inpress={in press}, % CHECK THESE! + aps:tobe={worden gepubliceerd}, + aps:unpublished={onuitgegeven}, + aps:In=In] + +\setupbtxlabeltext + [fr] + [aps:and=et, + aps:others={et al.}, + aps:number={n\high{o}}, + aps:edition={édition}, + aps:Editor=Éditeur, + aps:Editors=Éditeurs, + aps:Volume=Volume, + aps:Volumes=Volumes, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Thèse de master (DEA, DESS, master)}, + aps:phdthesis={Thèse de doctorat}, + aps:technicalreport={Rapport technique}, + aps:supplement=Supplément, + aps:patent=Brevet, + aps:inpress={sous impression}, + aps:tobe={à paraître}, + aps:unpublished={inédit}, % pour un livre + aps:In=Dans] + +\setupbtxlabeltext + [de] + [aps:and=und, + aps:number={nr.}, + aps:edition=Auf\/lage, + aps:Editor=Herausgeber, % Hrsg./Hg. + aps:Editors=Herausgeber, + aps:Volume=Band, % Bd. + aps:Volumes={Bände}, + aps:others={et al.}, + aps:page={S.}, + aps:pages={S.}, + aps:mastersthesis={Masterarbeit}, + aps:phdthesis={Dissertation}, + aps:technicalreport={Technischer Bericht}, + aps:supplement={Beilage}, % Supplement + aps:patent=Patent, + aps:inpress={in der Presse}, % CHECK THESE! + aps:tobe={veröffentlicht werden}, + aps:unpublished={unveröffentlicht}, + aps:In=In] + +% thanks: Andrea Valle + +\setupbtxlabeltext + [it] + [aps:and=e, + aps:number={nº}, + aps:edition={ed.}, % edizione + aps:Editor={A cura di}, + aps:Editors={A cura di}, + aps:Volume={Vol.}, % Volume + aps:Volumes={Vol.}, % Volumi + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Tesi di laurea}, + aps:phdthesis={Tesi di dottorato}, + aps:technicalreport={Relazione tecnica}, + aps:supplement={Supplemento}, + aps:patent=Brevetto, + aps:inpress={in press}, % CHECK THESE! + aps:tobe={da pubblicare}, + aps:unpublished={inedito}, + aps:In=In] + +\setupbtxlabeltext + [es] + [aps:and=y, + aps:number={nº}, + aps:edition={ed.}, % edición + aps:Editor=Editor, % Ed./Eds. + aps:Editors=Editores, + aps:Volume={Vol.}, % Volumen + aps:Volumes={Vols.}, % Volúmenes + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Tesis de maestría}, + aps:phdthesis={Tesis doctoral}, + aps:technicalreport={Informe técnico}, + aps:supplement=Suplemento, + aps:patent=Patente, + aps:inpress={en prensa}, % CHECK THESE! + aps:tobe={que se publicará}, + aps:unpublished={inédito}, + aps:In=En] + +% cite setups + +\startsetups btx:aps:nd + \doifelse {\currentbtxcategory} {article} { + \btxlabeltext{aps:tobe} + } { + \doifelse {\currentbtxcategory} {book} { + \btxlabeltext{aps:inpress} + } { + \btxlabeltext{aps:unpublished} + } + } +\stopsetups + +\startsetups btx:aps:cite:author:year + \texdefinition{\s!btx:\s!cite:concat} + \ifx\currentbtxfirst\empty + \fastsetup{btx:aps:nd} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \currentbtxfirst + } + \ifx\currentbtxsecond\empty \else + \btxparameter\v!inbetween + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxsecond + } + \fi + \ifx\currentbtxthird\empty \else + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxthird + } + \fi + \fi +\stopsetups + +\startsetups btx:aps:cite:author:years + \fastsetup{btx:aps:cite:author:year} +\stopsetups + +\startsetups [btx:aps:page:list] + \fastsetup{\s!btx:\s!page:concat} + \ifx\currentbtxlastpage\empty + \btxlabeltext{aps:page} + \else + \btxlabeltext{aps:pages} + \fi + \btxnbsp + \ifconditional\btxinteractive + \goto { + \currentbtxfirstpage + } [ + internal(\currentbtxfirstinternal) + ] + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \goto { + \currentbtxlastpage + } [ + internal(\currentbtxlastinternal) + ] + \fi + \else + \currentbtxfirstpage + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \currentbtxlastpage + \fi + \fi +\stopsetups + +%D Instead of texdefinitions without arguments, we could have used setups but in my +%D editor (hh, scite) the commands stand out better. It also saves an additional +%D component in the name (e.g. common:) because commands and setups have a different +%D namespace, so similar calls don't clash. Performance of definitions is somewhat +%D better. + +%D We use "texdefinitions" (with eventual arguments) for helpers that are used +%D in the rendering "setups" defined for each category below. + +%D Note that \btxdoif... and \btxflush rely on the definitions in +%D publ-imp-aps.lua: fields that are not listed as required nor optional are +%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists +%D of alternative fields to be used in hierarchal order. For example: +%D author = { "author", "editor", "publisher", "title" }, will return the +%D author field if it exists; if not, the editor field will be returned, if it +%D exists; if not, the publisher field will be returned, if it exists; if not, +%D the title field will be returned, it it exists; if not, nothing will be +%D returned. In lua syntax, it can be understood as +%D author or editor or publisher or title or "" + +\starttexdefinition btx:aps:composed-title #title + \begingroup + \language[\currentbtxlanguage] + \btxusecommand[aps:list:title:\currentbtxcategory] { + \btxflush{#title} + \btxdoif {sub#title} { + \btxcolon + \btxflush{sub#title} + } + } + \endgroup +\stoptexdefinition + +\starttexdefinition btx:aps:title + \btxdoif {title} { + % we make the title active, opening file + \btxdoifelse {file} { + \texdefinition{btx:format:inject} + {url(file:\btxflush{file})} + { + \btxstartstyleandcolor [aps:list:title:\currentbtxcategory] + \texdefinition{btx:aps:composed-title}{title} + \btxstopstyleandcolor + } + } { + \btxstartstyleandcolor [aps:list:title:\currentbtxcategory] + \texdefinition{btx:aps:composed-title}{title} + \btxstopstyleandcolor + } + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:aps:optional-title + \doif{\btxparameter{optionaltitle}}\v!yes { + \texdefinition {btx:aps:title} + } +\stoptexdefinition + +\starttexdefinition btx:aps:year + \btxdoifelse {year} { + \btxflush{year} + } { + \fastsetup{btx:aps:nd} + } +\stoptexdefinition + +% #author may be author(set) or editor + +\starttexdefinition btx:aps:author-or-editor #author + \btxdoif {#author} { + \btxflush{#author} + \doifelse {\btxfoundname{#author}} {editor} { + \btxleftparenthesis + \btxsingularorplural {editor} { + \btxlabeltext{aps:Editor} + } { + \btxlabeltext{aps:Editors} + } + \btxrightparenthesis + } { + \btxdoif {collaboration} { + \btxleftparenthesis + \btxflush{collaboration} + \btxrightparenthesis + } + } + } +\stoptexdefinition + +\starttexdefinition btx:aps:author + \btxflush{author} + \btxcomma +\stoptexdefinition + +\starttexdefinition btx:aps:editor-in + \btxdoif {booktitle} { + \btxlabeltext{aps:In} + \doifnot {\btxfoundname{author}} {editor} { + \btxspace + \texdefinition{btx:aps:author-or-editor} {editor} + } + \btxspace + \btxstartstyleandcolor[aps:list:title] + \texdefinition{btx:aps:composed-title} {booktitle} + \btxstopstyleandcolor + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:aps:editionset + \doif {\currentbtxcategory} {techreport} { + \btxdoifelse {type} { + \btxusecommand[\currentbtx:type] { + \btxflush{type} + } + } { + \btxlabeltext{aps:technicalreport} + } + \btxcomma + } + \btxdoif {volume} { + \btxoneorrange {volume} { + \btxlabeltext{aps:Volume} + } { + \btxlabeltext{aps:Volumes} + } + \btxspace + \btxflush{volume} + \btxcomma + } + \btxdoif {number} { + \btxlabeltext{aps:number} + \btxspace + \btxflush{number} + \btxcomma + } + \btxdoif {edition} { + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition} + \btxcomma + } + \btxdoif {pages} { + \btxoneorrange {pages} { + \btxlabeltext{aps:page} + } { + \btxlabeltext{aps:pages} + } + \btxnbsp + \btxflush{pages} + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:aps:journal-volume-year + \btxdoif {journal} { + % expandedjournal abbreviatedjournal + \btxflush{expandedjournal -> journal} + \btxdoifelse {volume} { + \btxspace + \btxstartstyleandcolor [aps:list:volume] + \btxflush{volume} + \btxstopstyleandcolor + \btxdoif {number} { + \removeunwantedspaces( + \btxflush{number} + \btxrightparenthesiscomma + } + } { + \btxdoif {number} { + \btxspace + \btxflush{number} + \btxcomma + } + } + \btxdoif {pages} { + \btxspace + \btxflush{pages} + } + \btxleftparenthesis + \texdefinition{btx:aps:year} + \btxrightparenthesis + } +\stoptexdefinition + +\starttexdefinition btx:aps:publisher-wherefrom-year + \removeunwantedspaces + \removepunctuation + \btxleftparenthesis + \btxflush{publisher} + \btxdoifelse {address} { + \btxdoif {publisher} { + \btxcomma + } + \btxflush{address} + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + \btxcomma + } { + \btxdoif {publisher} { + \btxcomma + } + } + \texdefinition{btx:aps:year} + \btxrightparenthesis +\stoptexdefinition + +\starttexdefinition btx:aps:note + \btxperiod + \btxdoif {note} { + \btxleftparenthesis + \btxflush{note} + \btxrightparenthesis + } +\stoptexdefinition + +\starttexdefinition btx:aps:doi-url #text + \ifconditional\btxinteractive + \btxdoifelse {doi} { + \goto {#text} [url(http://dx.doi.org/\btxflush{doi})] + } { + \btxdoifelse {url} { + \goto {#text} [url(\btxflush{url})] + } { + #text + } + } + \else + #text + \fi + +\stoptexdefinition + +% Then setups, by category + +% An article from a journal +% Required fields: author or editor or title, journal, (year). +% Optional fields: volume, number, pages, type, doi, url, note. +% Note that bibtex (and tools) do not include editor (e.g. special issue or section) + +\startsetups btx:aps:list:article + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:optional-title} + \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:journal-volume-year}} + \texdefinition{btx:aps:note} +\stopsetups + +% An article from a magazine. +% Required fields: author or title, journal, (year). +% Optional fields: number, pages, type, month, day, doi, url, note. + +\startsetups btx:aps:list:magazine + \fastsetup{btx:aps:list:article} +\stopsetups + +% An article from a newspaper. +% Required fields: author or title, journal, (year). +% Optional fields: number, pages, type, month, day, doi, url, note. + +\startsetups btx:aps:list:newspaper + \fastsetup{btx:aps:list:article} +\stopsetups + +% A complete issue of a periodical, such as a special issue of a journal. +% Required fields: title, year +% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note + +% needs to be tuned... +\startsetups btx:aps:list:periodical + \fastsetup{btx:aps:list:article} +\stopsetups + +% National and international standards issued by a standards body +% Required fields: author, institution, or organization, year, title +% Optional fields: subtitle, doi, url, note + +\startsetups btx:aps:list:standard + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \texdefinition{btx:aps:note} +\stopsetups +% year? + +% A book with an explicit publisher. +% Required fields: author or editor or publisher, title, (year). +% Optional fields: volume or number, series, address, edition, month, day, note. +% APS? ignores: month, day + +% todo: series? + +\startsetups btx:aps:list:book + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \texdefinition{btx:aps:editionset} + \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}} + \texdefinition{btx:aps:note} +\stopsetups + +% There is some debate about how inbook should differ from incollection + +% A part of a book, which may be a chapter (or section or whatever) and/or a range of pages. +% (note that inbook is handled differently by bibtex and biblatex) +% Required fields: author or editor, title, chapter and/or pages, publisher, year. +% Optional fields: volume or number, series, type, address, edition, month, note. +% We add optional: booktitle. +% APS? ignores: chapter, month + +\startsetups btx:aps:list:inbook + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \texdefinition{btx:aps:editor-in} + \texdefinition{btx:aps:editionset} + \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}} + \texdefinition{btx:aps:note} +\stopsetups +% chapter? + +% A part of a book having its own title. +% Required fields: author, title, booktitle, publisher, year. +% Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note. +% APS? ignores: chapter, month + +\startsetups btx:aps:list:incollection + \fastsetup{btx:aps:list:inbook} +\stopsetups + +% The proceedings of a conference. +% Required fields: title, year. +% Optional fields: editor, volume or number, series, address, month, organization, publisher, note. +% todo: series? + +\startsetups btx:aps:list:proceedings + \fastsetup{btx:aps:list:book} +\stopsetups + +% An article in a conference proceedings. +% Required fields: author, title, booktitle, year. +% Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note. + +\startsetups btx:aps:list:inproceedings + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \texdefinition{btx:aps:editor-in} + \texdefinition{btx:aps:editionset} + \btxdoif {organization} { + \btxspace + \btxflush{organization} + \btxcomma + } + \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}} + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:list:conference + \fastsetup{btx:aps:list:inproceedings} +\stopsetups + +% A thesis. +% Required fields: author, title, school, year. +% Optional fields: type, address, month, note. + +\startsetups btx:aps:list:thesis + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \btxleftparenthesis + \btxdoifelse {type} { + \btxusecommand[aps:list:type] { + \btxflush{type} + } + } { + \btxlabeltext{aps:\currentbtxcategory} + } + \btxrightparenthesis + \btxdoif {school} { + \btxperiod + \btxflush{school} + } + \btxdoif {address} { + \btxdoifelse {school} { + \btxcomma + } { + \btxperiod + } + \btxflush{address} + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + } + \btxperiod + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:list:phdthesis + \fastsetup{btx:aps:list:thesis} +\stopsetups + +\startsetups btx:aps:list:mastersthesis + \fastsetup{btx:aps:list:thesis} +\stopsetups + +% A work that is printed and bound, but without a named publisher or sponsoring institution. +% Required field: title. +% Optional fields: author, howpublished, address, month, year, note. + +\startsetups btx:aps:list:booklet + \fastsetup{btx:aps:list:book} +\stopsetups + +% Technical documentation. +% Required field: title. +% Optional fields: author, organization, address, edition, month, year, note. + +\startsetups btx:aps:list:manual + \fastsetup{btx:aps:list:book} +\stopsetups + +% A report published by a school or other institution, usually numbered within a series. +% Required fields: author, title, institution, year. +% Optional fields: type, number, address, month, note. + +\startsetups btx:aps:list:techreport + \fastsetup{btx:aps:list:book} +\stopsetups + +% A document having an author and title, but not formally published. +% Required fields: author, title, note. +% Optional fields: month, year. + +\startsetups btx:aps:list:unpublished + \fastsetup{btx:aps:list:book} +\stopsetups + +% A patent. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: nationality, number, year, yearfiled +% Optional fields: author, title, assignee, address, type, number, day, dayfiled, month, monthfiled, note, url +% Also optional: publisher + +% todo: yearfiled, monthfiled, dayfiled + +\startsetups btx:aps:list:patent + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \begingroup + \it + \btxdoif {nationality} { + \btxspace + \btxflush{nationality} + } + \btxspace + \btxlabeltext{aps:patent} + \btxdoif {number} { + \btxspace + \btxlabeltext{aps:number} + \btxspace + \btxflush{number} + } + \btxperiod + \italiccorrection + \endgroup + \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}} + \texdefinition{btx:aps:url} + \texdefinition{btx:aps:note} +\stopsetups + +% Electronic. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: title +% Optional fields: address, author, howpublished, month, note, organization, url, year, doi +% Also optional: type + +% Like Misc below but includes organization. + +\startsetups btx:aps:list:electronic + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \btxdoif {organization} { + \btxspace + \btxflush{organization} + \btxperiod + } + \btxdoif {howpublished} { + \btxspace + \btxflush{howpublished} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +% Other. Note that this category was not defined with BIBTEX. Below from JabRef: +% Required fields: author or title, year +% Optional fields: note, doi, url + +\startsetups btx:aps:list:other + \fastsetup{btx:aps:list:book} +\stopsetups + +% Use this type when nothing else fits. +% Required fields: none. +% Optional fields: author, title, howpublished, month, year, note. + +\startsetups btx:aps:list:misc + \texdefinition{btx:aps:author} + \texdefinition{btx:aps:title} + \btxdoif {howpublished} { + \btxspace + \btxflush{howpublished} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +% If all else fails to match: + +\startsetups btx:aps:list:literal + %\btxleftparenthesis + \removeunwantedspaces( + \btxflush{key} + \btxrightparenthesis + \btxdoif {text} { + \btxflush{text} + } +\stopsetups + +\stopbtxrenderingdefinitions diff --git a/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi new file mode 100644 index 00000000000..534d8ce0b29 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi @@ -0,0 +1,303 @@ +% TODO: MAKE default + +%D \module +%D [ file=publ-imp-author, +%D version=2014.06.23, +%D title=\CONTEXT\ Publication Support, +%D subtitle=Authors, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +% these can be used instead of the macros and they accept manipulator prefixes +% +% \currentbtxinitials : \btxauthorfield{initials} +% \currentbtxfirstnames : \btxauthorfield{firstnames} +% \currentbtxvons : \btxauthorfield{vons} +% \currentbtxsurnames : \btxauthorfield{surnames} +% \currentbtxjuniors : \btxauthorfield{juniors} + +\starttexdefinition \s!btx:\s!cite:\s!author:\s!de + \ifx\currentbtxlanguage\s!de + \setmode{\s!btx:\s!de} + \fi +\stoptexdefinition + +\startsetups \s!btx:\s!cite:\s!author:concat + \ifcase\currentbtxoverflow + \btxparameter{\c!separator:names:\number\currentbtxconcat} + \else + %\btxparameter{\c!separator:names:2} + \fi +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:others + \ifcase\currentbtxoverflow \else + \btxparameter\c!otherstext + \fi +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:normal + \fastsetup{\s!btx:\s!cite:\s!author:concat} + \ifx\currentbtxfirstnames\empty \else + \currentbtxfirstnames + \btxparameter{\c!separator:firstnames} + \fi + \ifx\currentbtxvons\empty \else + \currentbtxvons + \ifx\currentbtxsurnames\empty \else + \btxparameter{\c!separator:vons} + \fi + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \fastsetup{\s!btx:\s!cite:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:normalshort + \fastsetup{\s!btx:\s!cite:\s!author:concat} + \ifx\currentbtxinitials\empty \else + \currentbtxinitials + \btxparameter{\c!separator:initials} + \fi + \ifx\currentbtxvons\empty \else + \currentbtxvons + \ifx\currentbtxsurnames\empty \else + \btxparameter{\c!separator:vons} + \fi + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \fastsetup{\s!btx:\s!cite:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:inverted + \fastsetup{\s!btx:\s!cite:\s!author:concat} + \ifx\currentbtxvons\empty \else + \texdefinition{\s!btx:\s!cite:\s!author:\s!de} + \doifmode {\s!btx:\s!de} { + \currentbtxvons + \btxparameter{\c!separator:vons} + } + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \ifx\currentbtxfirstnames\empty + % firstnames are optional + \else + \btxparameter{\c!separator:invertedfirstnames} + \currentbtxfirstnames + \fi + \ifx\currentbtxvons\empty \else + \doifnotmode {\s!btx:\s!de} { + \btxparameter{\c!separator:vons} + \currentbtxvons + } + \fi + \fastsetup{\s!btx:\s!cite:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:invertedshort + \fastsetup{\s!btx:\s!cite:\s!author:concat} + \ifx\currentbtxvons\empty \else + \texdefinition{\s!btx:\s!cite:\s!author:\s!de} + \doifnotmode {\s!btx:\s!de} { + \currentbtxvons + \btxparameter{\c!separator:vons} + } + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \ifx\currentbtxinitials\empty + % initials are optional + \else + \btxparameter{\c!separator:invertedinitials} + \currentbtxinitials + \fi + \ifx\currentbtxvons\empty \else + \doifmode {\s!btx:\s!de} { + \btxparameter{\c!separator:vons} + \currentbtxvons + } + \fi + \fastsetup{\s!btx:\s!cite:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!cite:\s!author:name + \fastsetup{\s!btx:\s!cite:\s!author:concat} + % is this treated differently in german? + \ifx\currentbtxvons\empty \else + \currentbtxvons + \btxparameter{\c!separator:vons} + \fi + \currentbtxsurnames + \ifcase\currentbtxauthorstate \else + % potential clash of names so we force initials + \ifx\currentbtxinitials\empty \else + \btxparameter{\c!separator:invertedinitials} + \currentbtxinitials + \fi + \fi + \fastsetup{\s!btx:\s!cite:\s!author:others} +\stopsetups + +% list (mostly the same) + +\startsetups \s!btx:\s!list:\s!author:concat + \ifcase\currentbtxoverflow + \btxparameter{\c!separator:names:\number\currentbtxconcat} + \else + \btxparameter{\c!separator:names:2} + \fi +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:others + \ifcase\currentbtxoverflow \else + \btxparameter\c!otherstext + \fi +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:normal + \fastsetup{\s!btx:\s!list:\s!author:concat} + \ifx\currentbtxfirstnames\empty \else + \currentbtxfirstnames + \btxparameter{\c!separator:firstnames} + \fi + \ifx\currentbtxvons\empty \else + \currentbtxvons + \ifx\currentbtxsurnames\empty \else + \btxparameter{\c!separator:vons} + \fi + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \fastsetup{\s!btx:\s!list:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:normalshort + \fastsetup{\s!btx:\s!list:\s!author:concat} + \ifx\currentbtxinitials\empty \else + \currentbtxinitials + \btxparameter{\c!separator:initials} + \fi + \ifx\currentbtxvons\empty \else + \currentbtxvons + \ifx\currentbtxsurnames\empty \else + \btxparameter{\c!separator:vons} + \fi + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \fastsetup{\s!btx:\s!list:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:inverted + \fastsetup{\s!btx:\s!list:\s!author:concat} + \ifx\currentbtxvons\empty \else + \texdefinition{\s!btx:\s!cite:\s!author:\s!de} + \doifnotmode {\s!btx:\s!de} { + \currentbtxvons + \btxparameter{\c!separator:vons} + } + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \ifx\currentbtxfirstnames\empty + % firstnames are optional + \else + \btxparameter{\c!separator:invertedfirstnames} + \currentbtxfirstnames + \fi + \ifx\currentbtxvons\empty \else + \doifmode {\s!btx:\s!de} { + \btxparameter{\c!separator:vons} + \currentbtxvons + } + \fi + \fastsetup{\s!btx:\s!list:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:invertedshort + \fastsetup{\s!btx:\s!list:\s!author:concat} + \ifx\currentbtxvons\empty \else + \texdefinition{\s!btx:\s!cite:\s!author:\s!de} + \doifnotmode {\s!btx:\s!de} { + \currentbtxvons + \btxparameter{\c!separator:vons} + } + \fi + \ifx\currentbtxsurnames\empty \else + \currentbtxsurnames + \ifx\currentbtxjuniors\empty \else + \btxparameter{\c!separator:juniors} + \currentbtxjuniors + \fi + \fi + \ifx\currentbtxinitials\empty + % initials are optional + \else + \btxparameter{\c!separator:invertedinitials} + \currentbtxinitials + \fi + \ifx\currentbtxvons\empty \else + \doifmode {\s!btx:\s!de} { + \btxparameter{\c!separator:vons} + \currentbtxvons + } + \fi + \fastsetup{\s!btx:\s!list:\s!author:others} +\stopsetups + +\startsetups \s!btx:\s!list:\s!author:name + \fastsetup{\s!btx:\s!list:\s!author:concat} + % is this treated differently in german? + \ifx\currentbtxvons\empty \else + \currentbtxvons + \btxparameter{\c!separator:vons} + \fi + \currentbtxsurnames + \fastsetup{\s!btx:\s!list:\s!author:others} +\stopsetups + +\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv deleted file mode 100644 index 1b3157b4b98..00000000000 --- a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv +++ /dev/null @@ -1,256 +0,0 @@ -%D \module -%D [ file=publ-imp-cite, -%D version=2013.12.24, -%D title=\CONTEXT\ Publication Support, -%D subtitle=XML, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\unprotect - -% The null case: - -\startsetups \s!btx:\s!cite:none - % dummy -\stopsetups - -% This saves keying: - -\startsetups \s!btx:\s!cite:common:normal - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\v!inbetween - \currentbtxsecond - \fi -\stopsetups - -\startsetups \s!btx:\s!cite:common:range - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\c!range - \currentbtxsecond - \fi -\stopsetups - -\startsetups \s!btx:\s!cite:concat - \ifcase\currentbtxconcat \or \or - \btxcitevariantparameter\c!pubsep - \or - \btxcitevariantparameter\c!finalpubsep - \or - \btxcitevariantparameter\c!lastpubsep - \fi -\stopsetups - -% \startsetups \s!btx:\s!cite:render:normal -% \directsetup{\s!btx:\s!cite:concat} -% \ifconditional\btxinteractive -% \goto { -% \btxcitereference -% \directsetup{\s!btx:\s!cite:common:normal} -% } [ -% \s!internal(\currentbtxinternal) -% ] -% \else -% \directsetup{\s!btx:\s!cite:common:normal} -% \fi -% \stopsetups -% -% more efficient (less tokens, less expansion): - -\startsetups \s!btx:\s!cite:render:normal - \directsetup{\s!btx:\s!cite:concat} - \ifconditional\btxinteractive - \goto { - \btxcitereference - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\v!inbetween - \currentbtxsecond - \fi - } [ - \s!internal(\currentbtxinternal) - ] - \else - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\v!inbetween - \currentbtxsecond - \fi - \fi -\stopsetups - -% \startsetups \s!btx:\s!cite:render:range -% \directsetup{\s!btx:\s!cite:concat} -% \ifconditional\btxinteractive -% \goto { -% \btxcitereference -% \directsetup{\s!btx:\s!cite:common:range} -% } [ -% \s!internal(\currentbtxinternal) -% ] -% \else -% \directsetup{\s!btx:\s!cite:common:range} -% \fi -% \stopsetups -% -% more efficient (less tokens, less expansion): - -\startsetups \s!btx:\s!cite:render:range - \directsetup{\s!btx:\s!cite:concat} - \ifconditional\btxinteractive - \goto { - \btxcitereference - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\c!range - \currentbtxsecond - \fi - } [ - \s!internal(\currentbtxinternal) - ] - \else - \ifx\currentbtxsecond\empty - \currentbtxfirst - \else - \currentbtxfirst - \btxcitevariantparameter\c!range - \currentbtxsecond - \fi - \fi -\stopsetups - -\startsetups \s!btx:\s!cite:render:variant - \directsetup{\s!btx:\s!cite:concat} - \ifconditional\btxinteractive - \goto { - \btxcitereference - \directsetup{\s!btx:\s!cite:render:\currentbtxcitevariant} - } [ - \s!internal(\currentbtxinternal) - ] - \else - \directsetup{\s!btx:\s!cite:render:\currentbtxcitevariant} - \fi -\stopsetups - -% author lists: can be less - -\startsetups \s!btx:\s!cite:common:author - \ifx\currentbtxcitevariant\v!normal - \currentbtxfirst - \else - \currentbtxciteauthor - \fi - \ifx\currentbtxsecond\empty \else - \btxcitevariantparameter\v!inbetween - \currentbtxsecond - \fi -\stopsetups - -\startsetups \s!btx:\s!cite:render:author - \directsetup{\s!btx:\s!cite:common:author} -\stopsetups -\startsetups \s!btx:\s!cite:render:authoryear - \directsetup{\s!btx:\s!cite:common:author} -\stopsetups -\startsetups \s!btx:\s!cite:render:authoryears - \directsetup{\s!btx:\s!cite:common:author} -\stopsetups -\startsetups \s!btx:\s!cite:render:authornum - \directsetup{\s!btx:\s!cite:common:author} -\stopsetups - -\startsetups \s!btx:\s!cite:author:num - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups -\startsetups \s!btx:\s!cite:author:year - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups -\startsetups \s!btx:\s!cite:author:years - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups - -\startsetups \s!btx:\s!cite:author - \directsetup{\s!btx:\s!cite:render:variant} -\stopsetups -\startsetups \s!btx:\s!cite:authoryear - \directsetup{\s!btx:\s!cite:render:variant} -\stopsetups -\startsetups \s!btx:\s!cite:authoryears - \directsetup{\s!btx:\s!cite:render:variant} -\stopsetups -\startsetups \s!btx:\s!cite:authornum - \directsetup{\s!btx:\s!cite:render:variant} -\stopsetups - -\startsetups \s!btx:\s!cite:year - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups -\startsetups \s!btx:\s!cite:short - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups -\startsetups \s!btx:\s!cite:serial - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups -\startsetups \s!btx:\s!cite:tag - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups -\startsetups \s!btx:\s!cite:key - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups -%startsetups \s!btx:\s!cite:doi -% \directsetup{\s!btx:\s!cite:render:normal} -%stopsetups -%startsetups \s!btx:\s!cite:url -% \directsetup{\s!btx:\s!cite:render:normal} -%stopsetups -\startsetups \s!btx:\s!cite:category - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups -\startsetups \s!btx:\s!cite:type - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups -\startsetups \s!btx:\s!cite:num - \directsetup{\s!btx:\s!cite:render:range} -\stopsetups -\startsetups \s!btx:\s!cite:page - \directsetup{\s!btx:\s!cite:render:normal} -\stopsetups - -\startsetups \s!btx:\s!cite:doi - \directsetup{\s!btx:\s!cite:render:variant} -\stopsetups -\startsetups \s!btx:\s!cite:render:doi - \hyphenatedurl{\currentbtxfirst} -\stopsetups - -\startsetups \s!btx:\s!cite:url - \ifconditional\btxinteractive - \goto { - \btxcitereference - \hyphenatedurl{\currentbtxfirst} - } [ - url(\currentbtxfirst) - ] - \else - \hyphenatedurl{\currentbtxfirst} - \fi -\stopsetups - -\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi new file mode 100644 index 00000000000..dfc16c795ee --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi @@ -0,0 +1,314 @@ +%D \module +%D [ file=publ-imp-cite, +%D version=2013.12.24, +%D title=\CONTEXT\ Publication Support, +%D subtitle=Citations, +%D author=Alan Braslau and Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\starttexdefinition btx:cite:inject #content + \ifconditional\btxinteractive + \ifx\currentbtxinternal\empty + #content + \else + \goto { + #content + } [ + \s!internal(\currentbtxinternal) + ] + \fi + \else + #content + \fi +\stoptexdefinition + +\starttexdefinition btx:cite:checkconcat + \ifnum\currentbtxcount>\zerocount + \let\currentbtxinternal\empty + \let\currentbtxbacklink\empty + \fi +\stoptexdefinition + +% The null case: + +\startsetups btx:cite:none + \btxcitereference + % dummy +\stopsetups + +\startsetups btx:cite:nocite + \dontleavehmode + \btxcitereference +\stopsetups + +\startsetups btx:cite:unknown + \begingroup + \btxcitereference + unknown: \currentbtxfirst + \endgroup +\stopsetups + +\startsetups btx:cite:empty + \btxcitereference + +\stopsetups + +\startsetups btx:cite:invalid + \btxcitereference + {\tt <\currentbtxreference>} +\stopsetups + +% \startsetups btx:cite:normal +% \ifx\currentbtxfirst\empty +% \fastsetup{\s!btx:\s!cite:\s!empty} +% \else\ifx\currentbtxsecond\empty +% \btxcitereference +% \currentbtxfirst +% \ifx\currentbtxthird\empty \else +% \currentbtxthird +% \fi +% \else +% \btxcitereference +% \currentbtxfirst +% \btxparameter\v!inbetween +% \currentbtxsecond +% \ifx\currentbtxthird\empty \else +% \currentbtxthird +% \fi +% \fi\fi +% \stopsetups + +%\startsetups btx:cite:range +% \ifx\currentbtxfirst\empty +% \fastsetup{\s!btx:\s!cite:\s!empty} +% \else\ifx\currentbtxsecond\empty +% \btxcitereference +% \currentbtxfirst +% \ifx\currentbtxthird\empty \else +% \currentbtxthird +% \fi +% \else +% \btxcitereference +% \currentbtxfirst +% \btxparameter\c!range +% \currentbtxsecond +% \ifx\currentbtxthird\empty \else +% \currentbtxthird +% \fi +% \fi\fi +%\stopsetups + +\starttexdefinition btx:cite:concat + \btxparameter{\c!separator:\number\currentbtxconcat} +\stoptexdefinition + +\startsetups btx:cite:normal + \texdefinition{\s!btx:\s!cite:concat} + \currentbtxlefttext + \ifx\currentbtxfirst\empty + \fastsetup{\s!btx:\s!cite:\s!empty} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { + \currentbtxfirst + } + } + \ifx\currentbtxsecond\empty \else + \btxparameter\v!inbetween + \texdefinition {\s!btx:\s!cite:inject} { + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { + \currentbtxsecond + } + } + \fi + \ifx\currentbtxthird\empty \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { + \currentbtxthird + } + } + \fi + \fi + \currentbtxrighttext +\stopsetups + +\startsetups btx:cite:author + \texdefinition{\s!btx:\s!cite:concat} + \btxparameter\c!left + \currentbtxlefttext + \ifx\currentbtxfirst\empty + \fastsetup{\s!btx:\s!cite:\s!empty} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \currentbtxfirst + } + \fi + \ifx\currentbtxsecond\empty \else + \relax % keeps a following space + \btxparameter\v!inbetween + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxsecond + } + \fi + \ifx\currentbtxthird\empty \else + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxthird + } + \fi + \currentbtxrighttext + \btxparameter\c!right +\stopsetups + +\startsetups btx:cite:range + \texdefinition{\s!btx:\s!cite:concat} + \currentbtxlefttext + \ifx\currentbtxfirst\empty + \fastsetup{\s!btx:\s!cite:\s!empty} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { + \currentbtxfirst + \ifx\currentbtxsecond\empty \else + \btxparameter\c!range + \currentbtxsecond + \fi + \ifx\currentbtxthird\empty \else + \currentbtxthird + \fi + } + } + \fi + \currentbtxrighttext +\stopsetups + +\startsetups btx:cite:listelement + \texdefinition{\s!btx:\s!cite:concat} + \currentbtxlefttext + \ifx\currentbtxfirst\empty + \fastsetup{\s!btx:\s!cite:\s!empty} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \currentbtxfirst + } + \fi + \currentbtxrighttext +\stopsetups + +\startsetups \s!btx:\s!cite:entry + \texdefinition{\s!btx:\s!cite:concat} + \currentbtxlefttext + \btxhandleciteentry + \currentbtxrighttext +\stopsetups + +% these three are goodies to get something but are not set up as it makes no +% sense to have something root for combinations like this (esp not because one +% gets default anyway + +% AB: not so sure about that. Why define them in default rather than here? + +\startsetups \s!btx:\s!cite:authoryear + \fastsetup{\s!btx:\s!cite:author} +\stopsetups +\startsetups \s!btx:\s!cite:authoryears + \fastsetup{\s!btx:\s!cite:authoryear} +\stopsetups +\startsetups \s!btx:\s!cite:authornum + \fastsetup{\s!btx:\s!cite:authoryear} +\stopsetups +\startsetups \s!btx:\s!cite:authorref + \ifx{\\s!btxparameter\c!alternative}{authoryear} + \fastsetup{\s!btx:\s!cite:authoryears} + \else\ifx{\btxparameter\c!alternative}{num} + \fastsetup{\s!btx:\s!cite:authornum} + \else + \fastsetup{\s!btx:\s!cite:author} + \fi\fi +\stopsetups +\startsetups \s!btx:\s!cite:num + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:default + \fastsetup{\s!btx:\s!cite:num} +\stopsetups +\startsetups \s!btx:\s!cite:textnum + \fastsetup{\s!btx:\s!cite:num} +\stopsetups +\startsetups \s!btx:\s!cite:year + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:short + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:author:num + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:author:year + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:author:years + \fastsetup{\s!btx:\s!cite:concat}%?? in range already? + \fastsetup{\s!btx:\s!cite:range} +\stopsetups + +\startsetups \s!btx:\s!cite:serial + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:tag + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups +\startsetups \s!btx:\s!cite:key + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups +\startsetups \s!btx:\s!cite:category + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups + +% the following correspond to fields, but can be used in many renderings + +\startsetups \s!btx:\s!cite:keywords + \fastsetup{\s!btx:\s!cite:list} +\stopsetups +\startsetups \s!btx:\s!cite:type + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups +\startsetups \s!btx:\s!cite:title + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups +\startsetups \s!btx:\s!cite:pages + \fastsetup{\s!btx:\s!cite:range} +\stopsetups +\startsetups \s!btx:\s!cite:page + \fastsetup{\s!btx:\s!cite:normal} +\stopsetups + +% the following is kind of specific, but can be used in many renderings + +\startsetups btx:cite:url + \ifx\currentbtxfirst\empty + \fastsetup{\s!btx:\s!cite:\s!empty} + \else\ifconditional\btxinteractive + \goto { + \btxcitereference + \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst} + } [ + url(\doif{\currentbtxcitealternative}{doi}{http://dx.doi.org/}\currentbtxfirst) + ] + \else + \btxcitereference + \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst} + \fi\fi +\stopsetups + +\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv deleted file mode 100644 index 14e2dbae12d..00000000000 --- a/Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv +++ /dev/null @@ -1,15 +0,0 @@ -\unprotect - -% for tugboat - -\definebtxcommand\hbox {\hbox} -\definebtxcommand\vbox {\vbox} -\definebtxcommand\llap {\llap} -\definebtxcommand\rlap {\rlap} -\definebtxcommand\url #1{\hyphenatedurl{#1}} -\definebtxcommand\acro #1{\dontleavehmode{\smallcaps#1}} - -\let\<< -\let\<> - -\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi new file mode 100644 index 00000000000..14e2dbae12d --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi @@ -0,0 +1,15 @@ +\unprotect + +% for tugboat + +\definebtxcommand\hbox {\hbox} +\definebtxcommand\vbox {\vbox} +\definebtxcommand\llap {\llap} +\definebtxcommand\rlap {\rlap} +\definebtxcommand\url #1{\hyphenatedurl{#1}} +\definebtxcommand\acro #1{\dontleavehmode{\smallcaps#1}} + +\let\<< +\let\<> + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/publ-imp-default.lua b/Master/texmf-dist/tex/context/base/publ-imp-default.lua new file mode 100644 index 00000000000..61b08f30cef --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-default.lua @@ -0,0 +1,124 @@ +-- For the moment I put this here as example. When writing the publication modules we +-- explored several approached: pure tex, pure lua, a mix with xml, etc. In the end +-- each has advantages and drawbacks so we ended up with readable tex plus helpers in +-- lua. Anyway here is a lua variant of a setup ... it doesn't look nicer. An alternative +-- can be to build a table with characters but then we need to pass left, right and +-- other separators so again no real gain. + +-- function publications.maybe.default.journal(currentdataset,currenttag) +-- if publications.okay(currentdataset,currenttag,"journal") then +-- context.btxspace() +-- context.startbtxstyle("italic") +-- commands.btxflush(currentdataset,currenttag,"expandedjournal -> journal") +-- context.stopbtxstyle() +-- if publications.okay(currentdataset,currenttag,"volume") then +-- context.btxspace() +-- commands.btxflush(currentdataset,currenttag,"volume") +-- if publications.okay(currentdataset,currenttag,"number") then +-- context.ignorespaces() +-- context.btxleftparenthesis() +-- commands.btxflush(currentdataset,currenttag,"number") +-- context.btxrightparenthesis() +-- end +-- elseif publications.okay(currentdataset,currenttag,"number") then +-- context.btxlabeltext("default:number") +-- context.btxspace() +-- commands.btxflush(currentdataset,currenttag,"number") +-- end +-- if publications.okay(currentdataset,currenttag,"pages") then +-- context.btxcomma() +-- commands.btxflush(currentdataset,currenttag,"pages") +-- end +-- context.btxcomma() +-- end +-- end + +return { + -- + -- metadata + -- + name = "default", + version = "1.00", + comment = "DEFAULT specification", + author = "Alan Braslau and Hans Hagen", + copyright = "ConTeXt development team", + -- + -- derived (combinations of) fields (all share the same default set) + -- + virtual = { + "authoryear", + "authoryears", + "authornum", + "num", + "suffix", + }, + -- + -- special datatypes + -- + types = { + author = "author", -- interpreted as name(s) + editor = "author", -- interpreted as name(s) + page = "pagenumber", -- number or range: f--t -- maybe just range + pages = "pagenumber", -- number or range: f--t -- maybe just range + volume = "range", -- number or range: f--t + number = "range", -- number or range: f--t + keywords = "keyword", -- comma|-|separated list + }, + -- + -- categories with their specific fields + -- + categories = { + -- + -- the following fields are for documentation and testing purposes + -- + ["demo-a"] = { + sets = { + author = { "author", "institution", "organization" }, + }, + required = { "author", "title", "year" }, + optional = { "subtitle" }, + }, + ["demo-b"] = { + sets = { + authors = { "author", "institution", "organization" }, + }, + required = { "authors", "title", "year" }, + optional = { "subtitle" }, + }, + -- + -- we only provide article and book (maybe a few more later) and we keep it + -- real simple. See the apa and aps definitions for more extensive examples + -- + article = { + sets = { + author = { "author", "editor" }, + }, + required = { + "author", -- a set + "year", + }, + optional = { + "title", + "keywords", + "journal", "volume", "number", "pages", + }, + }, + book = { + sets = { + author = { "author", "editor", }, + editionset = { "edition", "volume", "number" }, + }, + required = { + "author", -- a set + "title", + "year", + }, + optional = { + "subtitle", + "keywords", + "publisher", "address", + "editionset", + }, + }, + }, +} diff --git a/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi new file mode 100644 index 00000000000..49a0b9eae85 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi @@ -0,0 +1,594 @@ +%D \module +%D [ file=publ-imp-default, +%D version=2014.02.06, +%D title=Default bibliography style, +%D subtitle=Publications, +%D author=Alan Braslau and 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 therefore copyrighted +%D by \PRAGMA. See mreadme.pdf for details. + +%D This default style defines only a few categories: book and article. +%D If you want more, you need to load a more complete style such as \type {apa}, +%D \type {aps}, etc. The default style is used in the manuals that ship with +%D \CONTEXT. This file is always loaded. + +\startbtxrenderingdefinitions[\s!default] + +% \definebtx [\s!default:\s!page ] [\s!page] +% \definebtx [\s!default:\s!cite ] [\s!cite] +% \definebtx [\s!default:\s!list ] [\s!list] +% \definebtx [\s!default:\s!author] [\s!author] + +\definebtxrendering + [\s!default] + [\c!specification=\s!default] + +\definebtx + [\s!default] + [\c!default=, % we do not want to fall|-|back on ourself. + \c!otherstext={\space\btxlabeltext{default:others}}, + %c!journalconversion=\v!normal, + \c!monthconversion=\v!number, + \c!separator:names:2={,\space}, + \c!separator:names:3={\space\btxlabeltext{default:and}\space}, + \c!separator:names:4={\space\btxlabeltext{default:and}\space}] + +\definebtx + [\s!default:\s!list] + [\s!default] + [\c!authorconversion=normalshort] + +\definebtx + [\s!default:\s!cite] + [\s!default] + [\c!alternative=num, + \c!authorconversion=\v!name] + +% We define [page] settings in the default namespace, inheriting the root +% settings, in order to eventually allow for modifications without touching +% root. + +\definebtx + [\s!default:\s!page] + [\s!page] + +\definebtx + [\s!default:\s!page:list] + [\s!default:\s!page] + +% List variants, some having specific settings: + +\definebtx + [\s!default:\s!list:author] + [\s!default:\s!list] + +\definebtx + [\s!default:\s!list:editor] + [\s!default:\s!list:author] + +\definebtx + [\s!default:\s!list:url] + [\s!default:\s!list] + +\definebtx + [\s!default:\s!list:doi] + [\s!default:\s!list] + +\definebtx + [\s!default:\s!list:invertedshort] + [\s!default:\s!list] + +% normalshort? + +\definebtx + [\s!default:\s!list:short] + [\s!default:\s!list] + +\definebtx + [\s!default:\s!list:journal] + [\s!default:\s!list] + [\c!style=\v!italic] + +\definebtx + [\s!default:\s!list:title] + [\s!default:\s!list] + [\c!style=\v!italic, + \c!command=\Word] + +\definebtx + [\s!default:\s!list:title:article] + [\s!default:\s!list:title] + [\c!style=, % journal is set in italics + \c!command={\quotation\Word}] + +\definebtx + [\s!default:\s!list:title:book] + [\s!default:\s!list:title] + +% Citation variants, some having specific settings : + +\definebtx + [\s!default:\s!cite:author] + [\s!default:\s!cite] + +\definebtx + [\s!default:\s!cite:authornum] + [\s!default:\s!cite:author] + [\c!left={(}, + \c!right={)}] + +\definebtx + [\s!default:\s!cite:authoryear] + [\s!default:\s!cite:author] + [\c!left={(}, + \c!right={)}, + \c!inbetween={,\space}] + +\definebtx + [\s!default:\s!cite:authorref] + [\s!default:\s!cite:authornum] + +\definebtx + [\s!default:\s!cite:authoryears] + [\s!default:\s!cite:author] + +\definebtx + [\s!default:\s!cite:author:num] % todo + [\s!default:\s!cite:authornum] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:author:year] % todo + [\s!default:\s!cite:authoryear] + [\c!left=, + \c!right=] + +\definebtx + [\s!default:\s!cite:author:years] % todo + [\s!default:\s!cite:authoryears] + [\c!inbetween=, + \c!left=(, + \c!right=)] + +\definebtx + [\s!default:\s!cite:year] + [\s!default:\s!cite] + [\c!compress=\v!yes, + \c!sorttype=year] + +\definebtx + [\s!default:\s!cite:title] + [\s!default:\s!cite] + [command={\language[\currentbtxlanguage]}, % BAH + \c!style=\v!italic] + +\definebtx + [\s!default:\s!cite:tag] + [\s!default:\s!cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:key] + [\s!default:\s!cite:tag] + +\definebtx + [\s!default:\s!cite:serial] + [\s!default:\s!cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:page] + [\s!default:\s!cite] + [\c!left=, + \c!right=] + +\definebtx + [\s!default:\s!cite:pages] + [\s!default:\s!cite:page] + +\definebtx + [\s!default:\s!cite:keywords] + [\s!default:\s!cite] + [\c!left={(}, + \c!right={)}] + +\definebtx + [\s!default:\s!cite:invertedshort] + [\s!default:\s!cite] + +\definebtx + [\s!default:\s!cite:short] + [\s!default:\s!cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:category] + [\s!default:\s!cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:type] + [\s!default:\s!cite:category] + +\definebtx + [\s!default:\s!cite:url] + [\s!default:\s!cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [\s!default:\s!cite:doi] + [\s!default:\s!cite:url] + +\definebtx + [\s!default:\s!cite:num] + [\s!default:\s!cite] + [\c!compress=\v!yes, + \c!left={[}, + \c!right={]}, + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +\definebtx + [\s!default:\s!cite:default] + [\s!default:\s!cite:num] + +\definebtx + [\s!default:\s!cite:textnum] + [\s!default:\s!cite:num] + [\c!left=, % in apa: {Ref.\nbsp} or so + \c!right=, + \c!separator:2={,\space}, + \c!separator:3={,\space\btxlabeltext{default:and}\space}, + \c!separator:4= {\space\btxlabeltext{default:and}\space}] + +\definebtx + [\s!default:\s!cite:entry] + [\s!default:\s!cite] + [\c!left={(}, + \c!right={)}] + +% Multilingual text strings + +\setupbtxlabeltext + [en] + [\s!default:and=and, + \s!default:number={no.}, + \s!default:edition={ed.}, + \s!default:Editor=Editor, % Ed./Eds. + \s!default:Editors=Editors, + \s!default:Volume={Vol.}, + \s!default:Volumes={Vols.}, + \s!default:others={et al.}] + +\setupbtxlabeltext + [nl] + [\s!default:and=en, + \s!default:number={nr.}, + \s!default:edition={ed.}, % editie + \s!default:Editor=Editor, % Ed./Eds. + \s!default:Editors=Editors, + \s!default:Volume={Vol.}, + \s!default:Volumes={Vols.}, + \s!default:others={et al.}] + +\setupbtxlabeltext + [fr] + [\s!default:and=et, + \s!default:others={et al.}, + \s!default:number={n\high{o}}, + \s!default:edition={édition}, + \s!default:Editor=Éditeur, + \s!default:Editors=Éditeurs, + \s!default:Volume=Volume, + \s!default:Volumes=Volumes, + \s!default:others={et al.}] + +\setupbtxlabeltext + [de] + [\s!default:and=und, + \s!default:number={nr.}, + \s!default:edition=Auf\/lage, + \s!default:Editor=Herausgeber, % Hrsg./Hg. + \s!default:Editors=Herausgeber, + \s!default:Volume=Band, % Bd. + \s!default:Volumes={Bände}, + \s!default:others={et al.}] + +\setupbtxlabeltext + [it] + [\s!default:and=e, + \s!default:number={nº}, + \s!default:edition={ed.}, % edizione + \s!default:Editor={A cura di}, + \s!default:Editors={A cura di}, + \s!default:Volume={Vol.}, % Volume + \s!default:Volumes={Vol.}, % Volumi + \s!default:others={et al.}] + +\setupbtxlabeltext + [es] + [\s!default:and=y, + \s!default:number={nº}, + \s!default:edition={ed.}, % edición + \s!default:Editor=Editor, % Ed./Eds. + \s!default:Editors=Editores, + \s!default:Volume={Vol.}, % Volumen + \s!default:Volumes={Vols.}, % Volúmenes + \s!default:others={et al.}] + +% First some helpers: + +\starttexdefinition btx:default:composed-title + \begingroup + \language[\currentbtxlanguage] + \btxflush{title} + \btxdoif {subtitle} { + \btxcolon + \btxflush{subtitle} + } + \endgroup +\stoptexdefinition + +\starttexdefinition btx:default:title + \btxdoif {title} { + \btxspace + \btxstartstyleandcolor [default:list:title:\currentbtxcategory] + \btxusecommand[default:list:title:\currentbtxcategory] { + \texdefinition{btx:default:composed-title} + } + \btxstopstyleandcolor + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:default:author + \btxdoif {author} { + \btxflush{author} + \doif {\btxfoundname{author}} {editor} { + \btxcomma + \btxsingularorplural {editor} { + \btxlabeltext{default:Editor} + } { + \btxlabeltext{default:Editors} + } + } + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:default:year + \btxflush{year} + \btxflush{suffix} +\stoptexdefinition + +\starttexdefinition btx:default:journal + \btxdoif {journal} { + \btxspace + \btxstartstyleandcolor [default:list:journal] + \btxusecommand[default:list:journal] { + \btxflush{journal} + } + \btxstopstyleandcolor + \btxdoifelse {volume} { + \btxspace + \btxflush{volume} + \btxdoif {number} { + \ignorespaces % brrr + \btxleftparenthesis + \btxflush{number} + \btxrightparenthesis + } + + } { + \btxdoif {number} { + \btxlabeltext{default:number} + \btxspace + \btxflush{number} + } + } + \btxdoif {pages} { + \btxcomma + \btxflush{pages} + } + \btxcomma + } +\stoptexdefinition + +\starttexdefinition btx:default:editionset + \btxdoif {editionset} { + \removeunwantedspaces + \removepunctuation + \btxleftparenthesis + \doif {\btxfoundname{editionset}} {edition} { + \btxflush{edition} + \btxspace + \btxlabeltext{default:edition} + \btxcomma + } + \btxdoif {volume} { + \btxoneorrange {volume} { + \btxlabeltext{default:Volume} + } { + \btxlabeltext{default:Volumes} + } + \btxspace + \btxflush{volume} + \btxcomma + } + \btxdoifelse {number} { + \btxlabeltext{default:number} + \btxspace + \btxflush{number} + } { + \removeunwantedspaces + \removepunctuation + } + \btxrightparenthesiscomma + } +\stoptexdefinition + +\starttexdefinition btx:default:publisher + \btxdoif {publisher} { + \btxflush{publisher} + \btxcomma + } + \btxdoif {address} { + \btxflush{address} + \btxcomma + } +\stoptexdefinition + +% Then a minimal number of setups: + +\startsetups btx:default:list:article + \texdefinition{btx:default:author} + \texdefinition{btx:default:title} + \texdefinition{btx:default:journal} + \texdefinition{btx:default:year} + \removeunwantedspaces + \removepunctuation + \btxperiod +\stopsetups + +\startsetups btx:default:list:book + \texdefinition{btx:default:author} + \texdefinition{btx:default:title} + \texdefinition{btx:default:editionset} + \texdefinition{btx:default:publisher} + \texdefinition{btx:default:year} + \removeunwantedspaces + \removepunctuation + \btxperiod +\stopsetups + +\startsetups btx:default:list:unknown + \currentbtxcategory\btxcolon + \btxshowentryinline +\stopsetups + +%D Experiment: + +\startsetups btx:default:lefttext + \currentbtxlefttext +\stopsetups + +\startsetups btx:default:righttext + \currentbtxrighttext +\stopsetups + +%D Citations: + +% \startsetups \s!btx:\s!default:\s!cite:author +% \fastsetup{\s!btx:\s!cite:author} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:authoryear +% \fastsetup{\s!btx:\s!cite:author} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:authoryears +% \fastsetup{\s!btx:\s!cite:author} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:authornum +% \fastsetup{\s!btx:\s!cite:author} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:authorref +% \fastsetup{\s!btx:\s!cite:authorref} +% \stopsetups +% +% \startsetups \s!btx:\s!default:\s!cite:author:num +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:author:year +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:author:years +% \fastsetup{\s!btx:\s!cite:concat} +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% +% \startsetups \s!btx:\s!default:\s!cite:keywords +% \fastsetup{\s!btx:\s!cite:list} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:year +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:short +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:serial +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:tag +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:key +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:category +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:type +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:num +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:default +% \fastsetup{\s!btx:\s!default:\s!cite:num} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:textnum +% \fastsetup{\s!btx:\s!default:\s!cite:num} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:title +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:pages +% \fastsetup{\s!btx:\s!cite:range} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:page +% \fastsetup{\s!btx:\s!cite:normal} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:doi +% \fastsetup{\s!btx:\s!cite:url} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:url +% \fastsetup{\s!btx:\s!cite:url} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:nocite +% \fastsetup{\s!btx:\s!cite:nocite}% defined nowhere : +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:entry +% \fastsetup{\s!btx:\s!cite:entry} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!cite:none +% \fastsetup{\s!btx:\s!cite:none} +% \stopsetups + +% List + +% \startsetups \s!btx:\s!default:\s!list:page +% \fastsetup{\s!btx:\s!list:page} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!list:yes +% \fastsetup{\s!btx:\s!list:yes} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!list:num +% \fastsetup{\s!btx:\s!list:num} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!list:bib +% \fastsetup{\s!btx:\s!list:bib} +% \stopsetups +% \startsetups \s!btx:\s!default:\s!list:short +% \fastsetup{\s!btx:\s!list:short} +% \stopsetups + +\stopbtxrenderingdefinitions diff --git a/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv deleted file mode 100644 index 2cf2e3e8efe..00000000000 --- a/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv +++ /dev/null @@ -1,68 +0,0 @@ -%D \module -%D [ file=publ-imp-def, -%D version=2013.12.24, -%D title=\CONTEXT\ Publication Support, -%D subtitle=Definitions, -%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 Here we collect some helper setups. We assume that checking of a field -%D happens in the calling setup, if only because that is the place where -%D fences are also dealt with. - -\unprotect - -\startxmlsetups btx:format:crossref - \cite[\btxfield{crossref}] -\stopxmlsetups - -\startxmlsetups btx:format:key - \btxfield{short} -\stopxmlsetups - -\startxmlsetups btx:format:doi - \edef\currentbtxfielddoi{\btxfield{doi}} - \ifx\currentbtxfielddoi\empty - {\tttf no-doi} - \else\ifconditional\btxinteractive - \goto{\hyphenatedurl{\currentbtxfielddoi}}[url(http://dx.doi.org/\currentbtxfielddoi)] - \else - \hyphenatedurl{\currentbtxfielddoi} - \fi\fi -\stopxmlsetups - -\startxmlsetups btx:format:url - \edef\currentbtxfieldurl{\btxfield{url}} - \ifx\currentbtxfieldurl\empty - {\tttf no-url} - \else\ifconditional\btxinteractive - \goto{\hyphenatedurl{\currentbtxfieldurl}}[url(\currentbtxfieldurl)] - \else - \hyphenatedurl{\currentbtxfieldurl} - \fi\fi -\stopxmlsetups - -\startxmlsetups btx:format:month - \edef\currentbtxfieldmonth{\btxfield{month}} - \ifx\currentbtxfieldmonth\empty - {\tttf no-month} - \else - \edef\p_monthconversion{\btxlistvariantparameter\c!monthconversion} - \ifx\p_monthconversion\empty % month month:mnem - \currentbtxfieldmonth - \else - \doifnumberelse \currentbtxfieldmonth { - \convertnumber\p_monthconversion\currentbtxfieldmonth - } { - \currentbtxfieldmonth - } - \fi - \fi -\stopxmlsetups - -\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi new file mode 100644 index 00000000000..8dfa931b37a --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi @@ -0,0 +1,123 @@ +%D \module +%D [ file=publ-imp-def, +%D version=2013.12.24, +%D title=\CONTEXT\ Publication Support, +%D subtitle=Definitions, +%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 Here we collect some helper setups. We assume that checking of a field +%D happens in the calling setup, if only because that is the place where +%D fences are also dealt with. + +% These will become texdefinitions + +\unprotect + +\startxmlsetups btx:format:crossref + \cite[\btxfield{crossref}] +\stopxmlsetups + +\startxmlsetups btx:format:key + \btxfield{short} +\stopxmlsetups + +\starttexdefinition btx:format:inject #link #content + \ifx\currentbtxinternal\empty + #content + \else\ifconditional\btxinteractive + \goto {#content} [#link] + \else + #content + \fi\fi +\stoptexdefinition + +\startxmlsetups btx:format:doi + \edef\currentbtxfielddoi{\btxfield{doi}} + \ifx\currentbtxfielddoi\empty + {\tttf no-doi} + \else\ifconditional\btxinteractive + \goto{\hyphenatedurl{\currentbtxfielddoi}}[url(http://dx.doi.org/\currentbtxfielddoi)] + \else + \hyphenatedurl{\currentbtxfielddoi} + \fi\fi +\stopxmlsetups + +\startxmlsetups btx:format:url + \edef\currentbtxfieldurl{\btxfield{url}} + \ifx\currentbtxfieldurl\empty + {\tttf no-url} + \else\ifconditional\btxinteractive + \goto{\hyphenatedurl{\currentbtxfieldurl}}[url(\currentbtxfieldurl)] + \else + \hyphenatedurl{\currentbtxfieldurl} + \fi\fi +\stopxmlsetups + +\startxmlsetups btx:format:year + \edef\currentbtxfieldyear{\btxfield{year}} + \ifx\currentbtxfieldyear\empty + \btxlabeltext{\currentbtxspecification:nd} + \fi +\stopxmlsetups + +\startxmlsetups btx:format:month + \edef\currentbtxfieldmonth{\btxfield{month}} + \ifx\currentbtxfieldmonth\empty + {\tttf no-month} + \else + \edef\p_monthconversion{\btxparameter\c!monthconversion} + \ifx\p_monthconversion\empty % month month:mnem + \currentbtxfieldmonth + \else + \doifelsenumber \currentbtxfieldmonth { + \convertnumber\p_monthconversion\currentbtxfieldmonth + } { + \currentbtxfieldmonth + } + \fi + \fi +\stopxmlsetups + +% macros: + +\starttexdefinition btx:style:italic #content + \dontleavehmode + \begingroup + \it + #content + \italiccorrection + \endgroup +\stoptexdefinition + +\starttexdefinition btx:style:bold #content + \dontleavehmode + \begingroup + \bf + #content + \endgroup +\stoptexdefinition + +\starttexdefinition btx:style:quote #content + \dontleavehmode + \startquote + #content + \stopquote +\stoptexdefinition + +\starttexdefinition btx:style #style #content + \doifelsedefined {btx:style:#style} { + \texdefinition{btx:style:#style} { + #content + } + } { + #content + } +\stoptexdefinition + +\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi new file mode 100644 index 00000000000..e13294f6f5b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi @@ -0,0 +1,90 @@ +%D \module +%D [ file=publ-imp-list, +%D version=2014.06.16, +%D title=\CONTEXT\ Publication Support, +%D subtitle=Lists, +%D author=Alan Braslau and Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\starttexdefinition btx:list:inject #content + \ifconditional\btxinteractive + \ifx\currentbtxinternal\empty + #content + \else + \goto { + #content + } [ + \s!internal(\currentbtxinternal) + ] + \fi + \else + #content + \fi +\stoptexdefinition + +\starttexdefinition btx:list:helpers:concat + % \ifcase\currentbtxconcat \or \or + % \btxparameter\c!pubsep + % \or + % \btxparameter\c!finalpubsep + % \or + % \btxparameter\c!lastpubsep + % \fi + \space +\stoptexdefinition + +\startsetups \s!btx:\s!list:page + \texdefinition{\s!btx:\s!list:concat} + \texdefinition{\s!btx:\s!list:inject} { + % real pagenumber: todo, userpage + \currentbtxfirst + % order + \high{\currentbtxsecond} + } +\stopsetups + +\startsetups \s!btx:\s!list:numbering + \btxparameter\c!left + \texdefinition {\s!btx:\s!list:inject} { + \currentbtxfirst + \btxparameter\c!stopper + } + \btxparameter\c!right +\stopsetups + +\startsetups \s!btx:\s!list:num + \btxstartstyleandcolor [\currentbtxspecification:list:num] + \btxusecommand[\currentbtxspecification:list:num] { + \fastsetup{\s!btx:\s!list:numbering} + } + \btxstopstyleandcolor +\stopsetups + +\startsetups \s!btx:\s!list:yes + \fastsetup{\s!btx:\s!list:num} +\stopsetups + +\startsetups \s!btx:\s!list:short + \btxstartstyleandcolor [\currentbtxspecification:list:short] + \btxusecommand[\currentbtxspecification:list:short] { + \fastsetup{\s!btx:\s!list:numbering} + } + \btxstopstyleandcolor +\stopsetups + +\startsetups \s!btx:\s!list:bib + \btxstartstyleandcolor [\currentbtxspecification:list:bib] + \btxusecommand[\currentbtxspecification:list:bib] { + \fastsetup{\s!btx:\s!list:numbering} + } + \btxstopstyleandcolor +\stopsetups + +\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi new file mode 100644 index 00000000000..19673c829d8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi @@ -0,0 +1,78 @@ +%D \module +%D [ file=publ-imp-page, +%D version=2014.11.05, +%D title=\CONTEXT\ Publication Support, +%D subtitle=Page numbers, +%D author=Alan Braslau and Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\definebtx + [\s!page] % or just outer level + [\c!pagestate=\v!stop, + \c!pageleft=\btxleftparenthesis, % see below!! + \c!pageright=\btxrightparenthesis, + \c!pagesep={,\space}, + \c!lastpagesep={,\space\btxlabeltext{\currentbtxspecification:and}\space}, + \c!finalpagesep={\space\btxlabeltext{\currentbtxspecification:and}\space}, + \c!pageconnector=\endash] + +\definebtx + [\s!page:\s!list] + [\s!page] + [\c!command={\wordright}] + +\startsetups \s!btx:\s!page:concat + \ifcase\currentbtxoverflow + \ifcase\currentbtxconcat + \or % first + \or % second + \btxparameter\c!pagesep + \or % second of two + \btxparameter\c!lastpagesep + \or % last + \btxparameter\c!finalpagesep + \fi + \fi +\stopsetups + +% for the moment we have only one variant + +\startsetups [\s!btx:\s!page:\s!list] + \fastsetup{\s!btx:\s!page:concat} + % \ifx\currentbtxlastpage\empty + % p. + % \else + % pp. + % \fi + % \btxnbsp + \ifconditional\btxinteractive + \goto { + \currentbtxfirstpage + } [ + internal(\currentbtxfirstinternal) + ] + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \goto { + \currentbtxlastpage + } [ + internal(\currentbtxlastinternal) + ] + \fi + \else + \currentbtxfirstpage + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \currentbtxlastpage + \fi + \fi +\stopsetups + +\protect diff --git a/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua b/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua new file mode 100644 index 00000000000..b15b17e30f8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua @@ -0,0 +1,13 @@ +return { + name = "replacements", + version = "1.00", + comment = "Good riddance", + author = "Alan Braslau and Hans Hagen", + copyright = "ConTeXt development team", + replacements = { + [ [[Th\^e\llap{\raise0.5ex\hbox{\'{\relax}}}]] ] = "Thánh", + [ [[Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}}]] ] = "Thánh", + [ [[Th{\^e}\llap{\raise0.5ex\hbox{\'{\relax}}}]] ] = "Thánh", + [ [[Th{\^e}\llap{\raise 0.5ex\hbox{\'{\relax}}}]] ] = "Thánh", + }, +} diff --git a/Master/texmf-dist/tex/context/base/publ-imp-test.bib b/Master/texmf-dist/tex/context/base/publ-imp-test.bib new file mode 100644 index 00000000000..0d81b49ff08 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-imp-test.bib @@ -0,0 +1,294 @@ +% This is a test bibliography for developing publ-impl-XXX files. Although +% meant for testing apa styles, it can also be used for other styles. +% +% All publication categories have an example entry here. Most have an entry +% with a "-min" key, containing only the minimal set of fields. +% +% Maintained by: Alan Braslau, Hans Hagen, Robin Kirkham + +@article {test-article-min, + author = "An Author", + title = "Title-article", + journal = "Journal", + year = "Year" +} + +@article {test-article, + author = "An Author", + title = "Title-article", + journal = "Journal", + year = "Year", + volume = "Volume", + number = "Number", + pages = "Pages", + month = "Month", + note = "Note" +} + +% author, editor, or both + +@book {test-book-min, + author = "An Author", + title = "Title-book", + publisher = "Publisher", + year = "Year" +} + +% author, editor, or both +% volume, number, or both + +@book {test-book, + author = "An Author", + editor = "An Editor", + title = "Title-book", + publisher = "Publisher", + year = "Year", + volume = "Volume", + number = "Number", + series = "Series", + address = "Address", + edition = "Edition", + month = "Month", + note = "Note" +} + +% no author + +@book {test-book-edited, + editor = "An Editor", + title = "Title-book-edited", + publisher = "Publisher", + year = "Year" +} + +@booklet {test-booklet-min, + title = "Title-booklet" +} + +@booklet {test-booklet, + title = "Title-booklet", + author = "An Author", + howpublished = "How-published", + address = "Address", + month = "Month", + year = "Year", + note = "Note" +} + +% author, editor, or both +% chapter, pages, or both + +@inbook {test-inbook-min, + author = "An Author", + editor = "An Editor", + title = "Title-inbook", + chapter = "Chapter", + pages = "Pages", + publisher = "Publisher", + year = "Year" +} + +% author, editor, or both +% chapter, pages, or both +% volume, number, or both + +@inbook {test-inbook, + author = "An Author", + editor = "An Editor", + title = "Title-inbook", + chapter = "Chapter", + pages = "Pages", + publisher = "Publisher", + year = "Year", + volume = "Volume", + number = "Number", + series = "Series", + type = "Type", + address = "Address", + edition = "Edition", + month = "Month", + note = "Note" +} + +@incollection {test-incollection-min, + author = "An Author", + title = "Title-incollection", + booktitle = "Booktitle", + publisher = "Publisher", + year = "Year" +} + +% volume, number, or both + +@incollection {test-incollection, + author = "An Author", + title = "Title-incollection", + booktitle = "Booktitle", + publisher = "Publisher", + year = "Year", + editor = "An Editor", + volume = "Volume", + number = "Number", + series = "Series", + type = "Type", + chapter = "Chapter", + pages = "Pages", + address = "Address", + edition = "Edition", + month = "Month", + note = "Note" +} + +@inproceedings {test-inproceedings-min, + author = "An Author", + title = "Title-inproceedings", + booktitle = "Booktitle", + year = "Year" +} + +% volume, number, or both + +@inproceedings {test-inproceedings, + author = "An Author", + title = "Title-inproceedings", + booktitle = "Booktitle", + year = "Year", + editor = "An Editor", + volume = "Volume", + number = "Number", + series = "Series", + pages = "Pages", + address = "Address", + month = "Month", + organization = "Organization", + publisher = "Publisher", + note = "Note" +} + +@manual {test-manual-min, + title = "Title-manual" +} + +@manual {test-manual, + title = "Title-manual", + author = "An Author", + organization = "Organization", + address = "Address", + edition = "Edition", + month = "Month", + year = "Year" + note = "Note" +} + + +@mastersthesis {test-mastersthesis-min, + author = "An Author", + title = "Title-mastersthesis", + school = "School", + year = "Year", +} + +@mastersthesis {test-mastersthesis, + author = "An Author", + title = "Title-mastersthesis", + school = "School", + year = "Year", + type = "Type", + address = "Address", + month = "Month", + note = "Note" +} + +@proceedings {test-proceedings-min, + title = "Title-proceedings", + year = "Year", +} + +% volume, number, or both + +@proceedings {test-proceedings, + title = "Title-proceedings", + year = "Year", + editor = "An Editor", + volume = "Volume", + number = "Number", + series = "Series", + address = "Address", + month = "Month", + organization = "Organization", + publisher = "Publisher", + note = "Note" +} + +@phdthesis {test-phdthesis-min, + author = "An Author", + title = "Title-phdthesis", + school = "School", + year = "Year", +} + +@phdthesis {test-phdthesis, + author = "An Author", + title = "Title-phdthesis", + school = "School", + year = "Year", + type = "Type", + address = "Address", + month = "Month", + note = "Note" +} + +@techreport {test-techreport-min, + author = "An Author", + title = "Title-techreport", + institution = "Institution", + year = "Year", +} + +@techreport {test-techreport, + author = "An Author", + title = "Title-techreport", + institution = "Institution", + year = "Year", + type = "Type", + number = "Number", + address = "Address", + month = "Month", + note = "Note" +} + +@misc {test-misc, + author = "An Author", + title = "Title-misc", + howpublished = "How-published", + month = "Month", + year = "Year", + note = "Note" +} + +@unpublished {test-unpublished-min, + author = "An Author", + title = "Title-unpublished", + note = "Note" +} + +@unpublished {test-unpublished, + author = "An Author", + title = "Title-unpublished", + note = "Note", + month = "Month", + year = "Year" +} + +% some other test entries + +@misc {test-manyauthor, + author = "A Author and B Author and C Author and D Author and + E Author and F Author and G Author and H Author and + I Author and J Author and K Author and L Author and + M Author and N Author and O Author and P Author and + Q Author and R Author and S Author and T Author and + U Author and V Author and W Author and X Author and + Y Author and Z Author", + title = "Title-Many Authors" +} diff --git a/Master/texmf-dist/tex/context/base/publ-ini.lua b/Master/texmf-dist/tex/context/base/publ-ini.lua index 102b2210453..25397727bff 100644 --- a/Master/texmf-dist/tex/context/base/publ-ini.lua +++ b/Master/texmf-dist/tex/context/base/publ-ini.lua @@ -6,138 +6,192 @@ if not modules then modules = { } end modules ['publ-ini'] = { license = "see context related readme files" } --- we could store the destinations in the user list entries +-- bah .. this 200 locals limit again ... so we need to split it as adding more +-- do ... ends makes it messier --- will move: +-- plug the list sorted in the list mechanism (specification.sortorder) -local lpegmatch = lpeg.match -local P, R, C, Ct, Cs = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs +-- If we define two datasets with the same bib file we can consider +-- sharing the data but that means that we need to have a parent which +-- in turn makes things messy if we start manipulating entries in +-- different ways (future) .. not worth the trouble as we will seldom +-- load big bib files many times and even then ... fonts are larger. -local lpegmatch = lpeg.match -local pattern = Cs((1 - P(1) * P(-1))^0 * (P(".")/"" + P(1))) - -local manipulators = { - stripperiod = function(str) return lpegmatch(pattern,str) end, - uppercase = characters.upper, - lowercase = characters.lower, -} - -local manipulation = C((1-P("->"))^1) * P("->") * C(P(1)^0) - -local pattern = manipulation / function(operation,str) - local manipulator = manipulators[operation] - return manipulator and manipulator(str) or str -end - -local function manipulated(str) - return lpegmatch(pattern,str) or str -end - -utilities.parsers.manipulation = manipulation -utilities.parsers.manipulators = manipulators -utilities.parsers.manipulated = manipulated - -function commands.manipulated(str) - context(manipulated(str)) -end - --- use: for rest in gmatch(reference,"[^, ]+") do +-- A potential optimization is to work with current_dataset, current_tag when +-- fetching fields but the code become real messy that way (many currents). The +-- gain is not that large anyway because not much publication stuff is flushed. local next, rawget, type, tostring, tonumber = next, rawget, type, tostring, tonumber -local match, gmatch, format, gsub = string.match, string.gmatch, string.format, string.gsub +local match, find = string.match, string.find local concat, sort, tohash = table.concat, table.sort, table.tohash local utfsub = utf.sub +local mod = math.mod local formatters = string.formatters local allocate = utilities.storage.allocate local settings_to_array, settings_to_set = utilities.parsers.settings_to_array, utilities.parsers.settings_to_set local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash local setmetatableindex = table.setmetatableindex local lpegmatch = lpeg.match -local P, C, Ct = lpeg.P, lpeg.C, lpeg.Ct - -local report = logs.reporter("publications") -local report_cite = logs.reporter("publications","cite") -local report_reference = logs.reporter("publications","reference") - -local trace = false trackers.register("publications", function(v) trace = v end) -local trace_cite = false trackers.register("publications.cite", function(v) trace_cite = v end) -local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end) -local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end) - -local datasets = publications.datasets - -local variables = interfaces.variables - -local v_local = variables["local"] -local v_global = variables["global"] - -local v_force = variables.force -local v_standard = variables.standard -local v_start = variables.start -local v_none = variables.none -local v_left = variables.left -local v_right = variables.right -local v_middle = variables.middle -local v_inbetween = variables.inbetween -local v_yes = variables.yes -local v_short = variables.short -local v_cite = variables.cite -local v_default = variables.default -local v_reference = variables.reference -local v_dataset = variables.dataset -local v_author = variables.author or "author" -local v_editor = variables.editor or "editor" - -local numbertochar = converters.characters - -local logsnewline = logs.newline -local logspushtarget = logs.pushtarget -local logspoptarget = logs.poptarget -local csname_id = token.csname_id - -local basicsorter = sorters.basicsorter -- (a,b) -local sortcomparer = sorters.comparers.basic -- (a,b) -local sortstripper = sorters.strip -local sortsplitter = sorters.splitters.utf - -local settings_to_array = utilities.parsers.settings_to_array +local P, S, C, Ct, R, Carg = lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.R, lpeg.Carg +local upper = utf.upper + +local report = logs.reporter("publications") +local report_cite = logs.reporter("publications","cite") +local report_list = logs.reporter("publications","list") +local report_reference = logs.reporter("publications","reference") +local report_shorts = logs.reporter("publications","shorts") + +local trace = false trackers.register("publications", function(v) trace = v end) +local trace_cite = false trackers.register("publications.cite", function(v) trace_cite = v end) +local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end) +local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end) +local trace_detail = false trackers.register("publications.detail", function(v) trace_detail = v end) +local trace_shorts = false trackers.register("publications.shorts", function(v) trace_shorts = v end) + +publications = publications or { } +local datasets = publications.datasets +local writers = publications.writers +local casters = publications.casters +local detailed = publications.detailed +local enhancer = publications.enhancer +local enhancers = publications.enhancers + +local tracers = publications.tracers or { } +publications.tracers = tracers + +local variables = interfaces.variables + +local v_local = variables["local"] +local v_global = variables["global"] + +local v_force = variables.force +local v_none = variables.none +local v_yes = variables.yes +local v_all = variables.all +local v_always = variables.always +local v_doublesided = variables.doublesided +local v_default = variables.default +local v_dataset = variables.dataset + +local conditionals = tex.conditionals + +local numbertochar = converters.characters + +local logsnewline = logs.newline +local logspushtarget = logs.pushtarget +local logspoptarget = logs.poptarget + +local isdefined = tex.isdefined + +----- basicsorter = sorters.basicsorter -- (a,b) +----- sortstripper = sorters.strip +----- sortsplitter = sorters.splitters.utf + +local manipulators = typesetters.manipulators +local splitmanipulation = manipulators.splitspecification +local applymanipulation = manipulators.applyspecification +local manipulatormethods = manipulators.methods + +-- this might move elsewhere + +manipulatormethods.Word = converters.Word +manipulatormethods.WORD = converters.WORD +manipulatormethods.Words = converters.Words +manipulatormethods.WORDS = converters.WORDS local context = context +local commands = commands +local implement = interfaces.implement +local ctx_setmacro = interfaces.setmacro + +local ctx_doifelse = commands.doifelse +local ctx_doif = commands.doif +local ctx_doifnot = commands.doifnot +local ctx_gobbletwoarguments = context.gobbletwoarguments -local ctx_setvalue = context.setvalue -local ctx_firstoftwoarguments = context.firstoftwoarguments -local ctx_secondoftwoarguments = context.secondoftwoarguments -local ctx_firstofoneargument = context.firstofoneargument -local ctx_gobbleoneargument = context.gobbleoneargument ------ ctx_directsetup = context.directsetup - -local ctx_btxlistparameter = context.btxlistparameter -local ctx_btxcitevariantparameter = context.btxcitevariantparameter -local ctx_btxlistvariantparameter = context.btxlistvariantparameter -local ctx_btxdomarkcitation = context.btxdomarkcitation local ctx_btxdirectlink = context.btxdirectlink local ctx_btxhandlelistentry = context.btxhandlelistentry +local ctx_btxhandlelisttextentry = context.btxhandlelisttextentry local ctx_btxchecklistentry = context.btxchecklistentry local ctx_btxchecklistcombi = context.btxchecklistcombi -local ctx_btxsetcitereference = context.btxsetcitereference -local ctx_btxsetlistreference = context.btxsetlistreference -local ctx_btxmissing = context.btxmissing +local ctx_btxsetdataset = context.btxsetdataset local ctx_btxsettag = context.btxsettag +local ctx_btxsetnumber = context.btxsetnumber +local ctx_btxsetlanguage = context.btxsetlanguage +local ctx_btxsetcombis = context.btxsetcombis +local ctx_btxsetcategory = context.btxsetcategory local ctx_btxcitesetup = context.btxcitesetup +local ctx_btxsubcitesetup = context.btxsubcitesetup +local ctx_btxpagesetup = context.btxpagesetup local ctx_btxsetfirst = context.btxsetfirst local ctx_btxsetsecond = context.btxsetsecond +local ctx_btxsetthird = context.btxsetthird local ctx_btxsetinternal = context.btxsetinternal +local ctx_btxsetlefttext = context.btxsetlefttext +local ctx_btxsetrighttext = context.btxsetrighttext +local ctx_btxsetbefore = context.btxsetbefore +local ctx_btxsetafter = context.btxsetafter +local ctx_btxsetbacklink = context.btxsetbacklink +local ctx_btxsetbacktrace = context.btxsetbacktrace +local ctx_btxsetcount = context.btxsetcount local ctx_btxsetconcat = context.btxsetconcat +local ctx_btxsetoveflow = context.btxsetoverflow +local ctx_btxsetfirstpage = context.btxsetfirstpage +local ctx_btxsetlastpage = context.btxsetlastpage +local ctx_btxsetfirstinternal = context.btxsetfirstinternal +local ctx_btxsetlastinternal = context.btxsetlastinternal +local ctx_btxstartcite = context.btxstartcite +local ctx_btxstopcite = context.btxstopcite +local ctx_btxstartciteauthor = context.btxstartciteauthor +local ctx_btxstopciteauthor = context.btxstopciteauthor local ctx_btxstartsubcite = context.btxstartsubcite local ctx_btxstopsubcite = context.btxstopsubcite +local ctx_btxstartlistentry = context.btxstartlistentry +local ctx_btxstoplistentry = context.btxstoplistentry +local ctx_btxlistsetup = context.btxlistsetup +local ctx_btxflushauthor = context.btxflushauthor +local ctx_btxsetnoflistentries = context.btxsetnoflistentries +local ctx_btxsetcurrentlistentry = context.btxsetcurrentlistentry +local ctx_btxsetcurrentlistindex = context.btxsetcurrentlistindex + +languages.data = languages.data or { } +local data = languages.data + +local specifications = publications.specifications +local currentspecification = specifications[false] +local ignoredfields = { } +publications.currentspecification = currentspecification + +local function setspecification(name) + currentspecification = specifications[name] + if trace then + report("setting specification %a",type(name) == "string" and name or "anything") + end + publications.currentspecification = currentspecification +end + +publications.setspecification = setspecification + +implement { + name = "btxsetspecification", + actions = setspecification, + arguments = "string", +} + +local optionalspace = lpeg.patterns.whitespace^0 +local prefixsplitter = optionalspace * lpeg.splitat(optionalspace * P("::") * optionalspace) statistics.register("publications load time", function() local publicationsstats = publications.statistics local nofbytes = publicationsstats.nofbytes if nofbytes > 0 then return string.format("%s seconds, %s bytes, %s definitions, %s shortcuts", - statistics.elapsedtime(publications),nofbytes,publicationsstats.nofdefinitions,publicationsstats.nofshortcuts) + statistics.elapsedtime(publications), + nofbytes, + publicationsstats.nofdefinitions or 0, + publicationsstats.nofshortcuts or 0 + ) else return nil end @@ -145,7 +199,6 @@ end) luatex.registerstopactions(function() local done = false - local undefined = csname_id("undefined*crap") for name, dataset in sortedhash(datasets) do for command, n in sortedhash(dataset.commands) do if not done then @@ -155,16 +208,12 @@ luatex.registerstopactions(function() logsnewline() done = true end - local c = csname_id(command) - if c and c ~= undefined then + if isdefined[command] then report("%-20s %-20s % 5i %s",name,command,n,"known") + elseif isdefined[upper(command)] then + report("%-20s %-20s % 5i %s",name,command,n,"KNOWN") else - local u = csname_id(utf.upper(command)) - if u and u ~= undefined then - report("%-20s %-20s % 5i %s",name,command,n,"KNOWN") - else - report("%-20s %-20s % 5i %s",name,command,n,"unknown") - end + report("%-20s %-20s % 5i %s",name,command,n,"unknown") end end end @@ -182,638 +231,1244 @@ end) local collected = allocate() local tobesaved = allocate() --- we use a a dedicated (and efficient as it know what it deals with) serializer, --- also because we need to ignore the 'details' field - -local function serialize(t) - local f_key_table = formatters[" [%q] = {"] - local f_key_string = formatters[" %s = %q,"] - local r = { "return {" } - local m = 1 - for tag, entry in sortedhash(t) do - m = m + 1 - r[m] = f_key_table(tag) - local s = sortedkeys(entry) - for i=1,#s do - local k = s[i] - -- if k ~= "details" then +do + + local function serialize(t) + local f_key_table = formatters[" [%q] = {"] + local f_key_string = formatters[" %s = %q,"] + local r = { "return {" } + local m = 1 + for tag, entry in sortedhash(t) do + m = m + 1 + r[m] = f_key_table(tag) + local s = sortedkeys(entry) + for i=1,#s do + local k = s[i] m = m + 1 r[m] = f_key_string(k,entry[k]) - -- end + end + m = m + 1 + r[m] = " }," end - m = m + 1 - r[m] = " }," - end - r[m] = "}" - return concat(r,"\n") -end - -local function finalizer() - local prefix = tex.jobname -- or environment.jobname - local setnames = sortedkeys(datasets) - for i=1,#setnames do - local name = setnames[i] - local dataset = datasets[name] - local userdata = dataset.userdata - local checksum = nil - local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua") - if userdata and next(userdata) then - if job.passes.first then - local newdata = serialize(userdata) - checksum = md5.HEX(newdata) - io.savedata(username,newdata) + r[m] = "}" + return concat(r,"\n") + end + + local function finalizer() + local prefix = tex.jobname -- or environment.jobname + local setnames = sortedkeys(datasets) + for i=1,#setnames do + local name = setnames[i] + local dataset = datasets[name] + local userdata = dataset.userdata + local checksum = nil + local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua") + if userdata and next(userdata) then + if job.passes.first then + local newdata = serialize(userdata) + checksum = md5.HEX(newdata) + io.savedata(username,newdata) + end + else + os.remove(username) + username = nil end - else - os.remove(username) - username = nil - end - local loaded = dataset.loaded - local sources = dataset.sources - local used = { } - for i=1,#sources do - local source = sources[i] - if loaded[source.filename] ~= "previous" then -- or loaded[source.filename] == "current" - used[#used+1] = source - end - end - tobesaved[name] = { - usersource = { - filename = username, - checksum = checksum, - }, - datasources = used, - } + local loaded = dataset.loaded + local sources = dataset.sources + local used = { } + for i=1,#sources do + local source = sources[i] + -- if loaded[source.filename] ~= "previous" then -- needs checking + if loaded[source.filename] ~= "previous" or loaded[source.filename] == "current" then + used[#used+1] = source + end + end + tobesaved[name] = { + usersource = { + filename = username, + checksum = checksum, + }, + datasources = used, + } + end end -end -local function initializer() - statistics.starttiming(publications) -collected = publications.collected or collected -- for the moment as we load runtime - for name, state in next, collected do - local dataset = datasets[name] - local datasources = state.datasources - local usersource = state.usersource - if datasources then - for i=1,#datasources do - local filename = datasources[i].filename - publications.load(dataset,filename,"previous") + local function initializer() + statistics.starttiming(publications) + for name, state in next, collected do + local dataset = datasets[name] + local datasources = state.datasources + local usersource = state.usersource + if datasources then + for i=1,#datasources do + local filename = datasources[i].filename + publications.load { + dataset = dataset, + filename = filename, + kind = "previous" + } + end + end + if usersource then + dataset.userdata = table.load(usersource.filename) or { } end end - if usersource then - dataset.userdata = table.load(usersource.filename) or { } - end + statistics.stoptiming(publications) + function initializer() end -- will go, for now, runtime loaded end - statistics.stoptiming(publications) - function initializer() end -- will go, for now, runtime loaded -end -job.register('publications.collected',tobesaved,initializer,finalizer) + job.register('publications.collected',tobesaved,initializer,finalizer) -if not publications.authors then - initializer() -- for now, runtime loaded end -local usedentries = { } -local initialized = false - --- { --- ["metadata"]=1, --- ["references"]={ --- ["block"]="bodypart", --- ["internal"]=2, --- ["realpage"]=1, --- ["section"]=0, --- }, --- ["userdata"]={ --- ["btxref"]="Cleveland1985", --- ["btxset"]="standard", --- }, --- }, - -setmetatableindex(usedentries,function(t,k) - if not initialized then - usedentries = { } +-- we want to minimize references as there can be many (at least +-- when testing) + +local nofcitations = 0 +local usedentries = nil +local citetolist = nil +local listtocite = nil +local listtolist = nil + +do + + local initialize = nil + + initialize = function(t) + usedentries = allocate { } + citetolist = allocate { } + listtocite = allocate { } + listtolist = allocate { } + local names = { } local internals = structures.references.internals + local p_collect = (C(R("09")^1) * Carg(1) / function(s,entry) listtocite[tonumber(s)] = entry end + P(1))^0 + local nofunique = 0 + local nofreused = 0 for i=1,#internals do local entry = internals[i] - local metadata = entry.metadata - if metadata.kind == "full" then - local userdata = entry.userdata - if userdata then - local set = userdata.btxset - if set then - local tag = userdata.btxref - local s = usedentries[set] - if s then - local u = s[tag] - if u then - u[#u+1] = entry - else - u = { entry } - s[tag] = u + if entry then + local metadata = entry.metadata + if metadata then + local kind = metadata.kind + if kind == "full" then + -- reference (in list) + local userdata = entry.userdata + if userdata then + local tag = userdata.btxref + if tag then + local set = userdata.btxset or v_default + local s = usedentries[set] + if s then + local u = s[tag] + if u then + u[#u+1] = entry + else + s[tag] = { entry } + end + nofreused = nofreused + 1 + else + usedentries[set] = { [tag] = { entry } } + nofunique = nofunique + 1 + end + -- alternative: collect prev in group + local bck = userdata.btxbck + if bck then + lpegmatch(p_collect,bck,1,entry) -- for s in string.gmatch(bck,"[^ ]+") do listtocite[tonumber(s)] = entry end + local lst = tonumber(userdata.btxlst) + if lst then + listtolist[lst] = entry + end + else + local int = tonumber(userdata.btxint) + if int then + listtocite[int] = entry + end + end + local detail = datasets[set].details[tag] +-- todo: these have to be pluggable + if detail then + local author = detail.author + if author then + for i=1,#author do + local a = author[i] + local s = a.surnames + if s then + local c = concat(s,"+") + local n = names[c] + if n then + n[#n+1] = a + break + else + names[c] = { a } + end + end + end + end + end end - else - usedentries[set] = { [tag] = { entry } } end + elseif kind == "btx" or kind == "userdata" then -- will go: kind == "userdata" + -- list entry (each cite) + local userdata = entry.userdata + if userdata then + local int = tonumber(userdata.btxint) + if int then + citetolist[int] = entry + end + end + end + end + else + -- weird + end + end + for k, v in next, names do + local n = #v + if n > 1 then + local original = v[1].original + for i=2,n do + if original ~= v[i].original then + report("potential clash in name %a",k) + for i=1,n do + v[i].state = 1 + end + break end end end end - return usedentries[k] + if trace_detail then + report("%s unique bibentries: %s reused entries",nofunique,nofreused) + end + initialize = nil end -end) --- local subsets = nil --- local block = tex.count.btxblock --- local collected = references.collected --- local prefix = nil -- todo: dataset ? --- if prefix and prefix ~= "" then --- subsets = { collected[prefix] or collected[""] } --- else --- local components = references.productdata.components --- local subset = collected[""] --- if subset then --- subsets = { subset } --- else --- subsets = { } --- end --- for i=1,#components do --- local subset = collected[components[i]] --- if subset then --- subsets[#subsets+1] = subset --- end --- end --- end --- if #subsets == 0 then --- subsets = { collected[""] } --- end --- local list = type(reference) == "string" and settings_to_array(reference) or reference --- local todo = table.tohash(list) --- if #subsets > 0 then --- local result, nofresult, done = { }, 0, { } --- for i=1,#subsets do --- local subset = subsets[i] --- for i=1,#list do --- local rest = list[i] --- local blk, tag, found = block, nil, nil --- if block then --- tag = f_destination(dataset,blk,rest) --- found = subset[tag] --- if not found then --- for i=block-1,1,-1 do --- tag = f_destination(dataset,i,rest) --- found = subset[tag] --- if found then --- blk = i --- break --- end --- end --- end --- end --- if not found then --- blk = "*" --- tag = f_destination(dataset,blk,rest) --- found = subset[tag] --- end --- if found then --- local entries = found.entries --- if entries then --- local current = tonumber(entries.text) -- todo: no ranges when no tonumber --- if current and not done[current] then --- nofresult = nofresult + 1 --- result[nofresult] = { blk, rest, current, found.references.internal } --- done[current] = true --- end --- end --- end --- end --- end - -local reported = { } -local finder = publications.finder - -local function findallused(dataset,reference,block,section) -local finder = publications.finder - local find = finder and finder(reference) - local tags = not find and settings_to_array(reference) - local todo = { } - local okay = { } -- only if mark - local set = usedentries[dataset] - local valid = datasets[dataset].luadata - if set then - local function register(tag) - local entry = set[tag] - if entry then - -- only once in a list - if #entry == 1 then - entry = entry[1] + usedentries = setmetatableindex(function(_,k) if initialize then initialize() end return usedentries[k] end) + citetolist = setmetatableindex(function(_,k) if initialize then initialize() end return citetolist [k] end) + listtocite = setmetatableindex(function(_,k) if initialize then initialize() end return listtocite [k] end) + listtolist = setmetatableindex(function(_,k) if initialize then initialize() end return listtolist [k] end) + + function publications.usedentries() + if initialize then + initialize() + end + return usedentries + end + +end + +-- match: +-- +-- [current|previous|following] section +-- [current|previous|following] block +-- [current|previous|following] component +-- +-- by prefix +-- by dataset + +local findallused do + + local reported = { } + local finder = publications.finder + + findallused = function(dataset,reference,internal) + local current = datasets[dataset] + local finder = publications.finder -- for the moment, not yet in all betas + local find = finder and finder(current,reference) + local tags = not find and settings_to_array(reference) + local todo = { } + local okay = { } -- only if mark + local set = usedentries[dataset] + local valid = current.luadata + local ordered = current.ordered + if set then + local registered = { } + local function register(tag) + if registered[tag] then + return else - -- find best match (todo) - entry = entry[1] -- for now + registered[tag] = true + end + local entry = set[tag] + if entry then + -- only once in a list but at some point we can have more (if we + -- decide to duplicate) + if #entry == 1 then + entry = entry[1] + else + -- same block and section + local done = false + if internal and internal > 0 then + -- first following in list + for i=1,#entry do + local e = entry[i] + if e.references.internal > internal then + done = e + break + end + end + if not done then + -- last preceding in list + for i=1,#entry do + local e = entry[i] + if e.references.internal < internal then + done = e + else + break + end + end + end + end + if done then + entry = done + else + entry = entry[1] + end + end + okay[#okay+1] = entry end - okay[#okay+1] = entry + todo[tag] = true end - todo[tag] = true - end - if find then - tags = { } - for tag, entry in next, valid do - local found = find(entry) - if found then + if reference == "*" then + tags = { } + for i=1,#ordered do + local tag = ordered[i].tag register(tag) tags[#tags+1] = tag end - end - else - for i=1,#tags do - local tag = tags[i] - if valid[tag] then - register(tag) - elseif not reported[tag] then - reported[tag] = true - report_cite("non-existent entry %a in %a",tag,dataset) + elseif find then +-- print("case 1.1") + tags = { } + for i=1,#ordered do + local entry = ordered[i] + if find(entry) then + local tag = entry.tag + register(tag) + tags[#tags+1] = tag + end end - end - end - else - if find then - tags = { } - for tag, entry in next, valid do - local found = find(entry) - if found then - todo[tag] = true - tags[#tags+1] = tag + if #tags == 0 and not reported[reference] then + tags[1] = reference + reported[reference] = true + end + else +-- print("case 1.2") + for i=1,#tags do + local tag = tags[i] + if valid[tag] then + register(tag) + elseif not reported[tag] then + reported[tag] = true + report_cite("non-existent entry %a in %a",tag,dataset) + end end end else - for i=1,#tags do - local tag = tags[i] - if valid[tag] then - todo[tag] = true - elseif not reported[tag] then - reported[tag] = true - report_cite("non-existent entry %a in %a",tag,dataset) + if find then +-- print("case 2.1") + tags = { } + for i=1,#ordered do + local entry = ordered[i] + if find(entry) then + local tag = entry.tag + tags[#tags+1] = tag + todo[tag] = true + end + end + if #tags == 0 and not reported[reference] then + tags[1] = reference + reported[reference] = true + end + else +-- print("case 2.2") + for i=1,#tags do + local tag = tags[i] + if valid[tag] then + todo[tag] = true + elseif not reported[tag] then + reported[tag] = true + report_cite("non-existent entry %a in %a",tag,dataset) + end end end end + return okay, todo, tags end - return okay, todo, tags + end -local function flushcollected(flush,nofcollected) - if nofcollected > 0 then - flush(1,1) - if nofcollected > 2 then - for i=2,nofcollected-1 do - flush(i,2) - end - flush(nofcollected,3) - elseif nofcollected > 1 then - flush(nofcollected,4) - end +local function unknowncite(reference) + ctx_btxsettag(reference) + if trace_detail then + report("expanding %a cite setup %a","unknown","unknown") + end + ctx_btxcitesetup("unknown") +end + +local concatstate = publications.concatstate + +local tobemarked = nil + +local function marknocite(dataset,tag,nofcitations,setup) + ctx_btxstartcite() + ctx_btxsetdataset(dataset) + ctx_btxsettag(tag) + ctx_btxsetbacklink(nofcitations) + if trace_detail then + report("expanding cite setup %a",setup) end + ctx_btxcitesetup(setup) + ctx_btxstopcite() end -local function markcite(dataset,tag) - if trace_cite then - report_cite("mark, dataset: %s, tag: %s",dataset,tag) +local function markcite(dataset,tag,flush) + if not tobemarked then + return 0 + end + local citation = tobemarked[tag] + if not citation then + return 0 + end + if citation == true then + nofcitations = nofcitations + 1 + if trace_cite then + report_cite("mark, dataset: %s, tag: %s, number: %s, state: %s",dataset,tag,nofcitations,"cited") + end + if flush then + marknocite(dataset,tag,nofcitations,"nocite") + end + tobemarked[tag] = nofcitations + return nofcitations + else + return citation end - ctx_btxdomarkcitation(dataset,tag) end +local marked_dataset = nil +local marked_list = nil + local function flushmarked(dataset,list,todo) - if todo then - for i=1,#list do - local tag = list[i] - if todo[tag] then - markcite(dataset,tag) + marked_dataset = dataset + marked_list = list +end + +local function btxflushmarked() + if marked_list and tobemarked then + for i=1,#marked_list do + -- keep order + local tag = marked_list[i] + local tbm = tobemarked[tag] + if tbm == true or not tbm then + nofcitations = nofcitations + 1 + marknocite(marked_dataset,tag,nofcitations,tbm and "nocite" or "invalid") + if trace_cite then + report_cite("mark, dataset: %s, tag: %s, number: %s, state: %s",marked_dataset,tag,nofcitations,tbm and "unset" or "invalid") + end end end end + tobemarked = nil + marked_dataset = nil + marked_list = nil end +implement { name = "btxflushmarked", actions = btxflushmarked } + -- basic access -local function getfield(dataset,tag,name) +local function getfield(dataset,tag,name) -- for the moment quick and dirty local d = datasets[dataset].luadata[tag] return d and d[name] end -local function getdetail(dataset,tag,name) +local function getdetail(dataset,tag,name) -- for the moment quick and dirty local d = datasets[dataset].details[tag] return d and d[name] end -function commands.btxsingularorplural(dataset,tag,name) -- todo: make field dependent - local d = datasets[dataset].details[tag] - if d then - d = d[name] - end - if d then - d = #d <= 1 - end - commands.doifelse(d) -end - --- basic loading - -function commands.usebtxdataset(name,filename) - publications.load(datasets[name],filename,"current") -end - -function commands.convertbtxdatasettoxml(name,nice) - publications.converttoxml(datasets[name],nice) -end - --- enhancing - -local splitauthorstring = publications.authors.splitstring - -local pagessplitter = lpeg.splitat(P("-")^1) - --- maybe not redo when already done - -function publications.enhance(dataset) -- for the moment split runs (maybe publications.enhancers) - statistics.starttiming(publications) - if type(dataset) == "string" then - dataset = datasets[dataset] - end - local luadata = dataset.luadata - local details = dataset.details - -- author, editor - for tag, entry in next, luadata do - local author = entry.author - local editor = entry.editor - details[tag] = { - author = author and splitauthorstring(author), - editor = editor and splitauthorstring(editor), - } - end - -- short - local shorts = { } - for tag, entry in next, luadata do - local author = details[tag].author - if author then - -- number depends on sort order - local t = { } - if #author == 0 then - -- what - else - local n = #author == 1 and 3 or 1 - for i=1,#author do - local surnames = author[i].surnames - if not surnames or #surnames == 0 then - -- error - else - t[#t+1] = utfsub(surnames[1],1,n) +local function getcasted(dataset,tag,field,specification) + local current = datasets[dataset] + if current then + local data = current.luadata[tag] + if data then + local category = data.category + if not specification then + specification = currentspecification + end + local catspec = specification.categories[category] + if not catspec then + return false + end + local fields = catspec.fields + if fields then + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + for i=1,#set do + local field = set[i] + local value = fields[field] and data[field] -- redundant check + if value then + local kind = specification.types[field] + return detailed[kind][value], field, kind + end + end end end + local value = fields[field] and data[field] -- redundant check + if value then + local kind = specification.types[field] + return detailed[kind][value], field, kind + end end - local year = tonumber(entry.year) or 0 - local short = formatters["%t%02i"](t,math.mod(year,100)) - local s = shorts[short] - if not s then - shorts[short] = tag - elseif type(s) == "string" then - shorts[short] = { s, tag } - else - s[#s+1] = tag + local data = current.details[tag] + if data then + local kind = specification.types[field] + return data[field], field, kind -- no check end - else - -- end end - for short, tags in next, shorts do - if type(tags) == "table" then - sort(tags) - for i=1,#tags do - -- details[tags[i]].short = short .. numbertochar(i) - local detail = details[tags[i]] - detail.short = short - detail.suffix = numbertochar(i) +end + +local function getfaster(current,data,details,field,categories,types) + local category = data.category + local catspec = categories[category] + if not catspec then + return false + end + local fields = catspec.fields + if fields then + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + for i=1,#set do + local field = set[i] + local value = fields[field] and data[field] -- redundant check + if value then + local kind = types[field] + return detailed[kind][value], field, kind + end + end end - else - details[tags].short = short end - end - -- pages - for tag, entry in next, luadata do - local pages = entry.pages - if pages then - local first, last = lpegmatch(pagessplitter,pages) - details[tag].pages = first and last and { first, last } or pages + local value = fields[field] and data[field] -- redundant check + if value then + local kind = types[field] + return detailed[kind][value] end end - -- keywords - for tag, entry in next, luadata do - local keyword = entry.keyword - if keyword then - details[tag].keyword = settings_to_set(keyword) - end + if details then + local kind = types[field] + return details[field] end - statistics.stoptiming(publications) end -function commands.addbtxentry(name,settings,content) - local dataset = datasets[name] - if dataset then - publications.addtexentry(dataset,settings,content) +local function getdirect(dataset,data,field,catspec) -- no field check, no dataset check + local catspec = (catspec or currentspecification).categories[data.category] + if not catspec then + return false end -end - -function commands.setbtxdataset(name) - local dataset = rawget(datasets,name) - if dataset then - context(name) - else - report("unknown dataset %a",name) + local fields = catspec.fields + if fields then + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + for i=1,#set do + local field = set[i] + local value = fields[field] and data[field] -- redundant check + if value then + return value + end + end + end + end + return fields[field] and data[field] or nil -- redundant check end end -function commands.setbtxentry(name,tag) - local dataset = rawget(datasets,name) - if dataset then - if dataset.luadata[tag] then - context(tag) - else - report("unknown tag %a in dataset %a",tag,name) +local function getfuzzy(data,field,categories) -- no field check, no dataset check + local catspec + if categories then + local category = data.category + if category then + catspec = categories[data.category] end - else - report("unknown dataset %a",name) + end + if not field then + return + elseif not catspec then + return data[field] + end + local fields = catspec.fields + if fields then + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + for i=1,#set do + local field = set[i] + local value = fields[field] and data[field] -- redundant check + if value then + return value + end + end + end + end + return fields[field] and data[field] or nil -- redundant check end end --- rendering of fields (maybe multiple manipulators) +publications.getfield = getfield +publications.getdetail = getdetail +publications.getcasted = getcasted +publications.getfaster = getfaster +publications.getdirect = getdirect +publications.getfuzzy = getfuzzy --- local manipulation = utilities.parsers.manipulation --- local manipulators = utilities.parsers.manipulators --- --- local function checked(field) --- local m, f = lpegmatch(manipulation,field) --- if m then --- return manipulators[m], f or field +-- this needs to be checked: a specific type should have a checker + +-- author pagenumber keyword url + +-- function commands.btxsingularorplural(dataset,tag,name) +-- local d = getcasted(dataset,tag,name) +-- if type(d) == "table" then +-- d = #d <= 1 -- else --- return nil, field +-- d = true -- end +-- ctx_doifelse(d) -- end -local manipulation = Ct((C((1-P("->"))^1) * P("->"))^1) * C(P(1)^0) -local manipulators = utilities.parsers.manipulators +-- function commands.oneorrange(dataset,tag,name) +-- local d = datasets[dataset].luadata[tag] -- details ? +-- if d then +-- d = d[name] +-- end +-- if type(d) == "string" then +-- d = find(d,"%-") +-- else +-- d = false +-- end +-- ctx_doifelse(not d) -- so singular is default +-- end -local function checked(field) - local m, f = lpegmatch(manipulation,field) - if m then - return m, f or field - else - return nil, field - end +-- function commands.firstofrange(dataset,tag,name) +-- local d = datasets[dataset].luadata[tag] -- details ? +-- if d then +-- d = d[name] +-- end +-- if type(d) == "string" then +-- context(match(d,"([^%-]+)")) +-- end +-- end + +local inspectors = allocate() +local nofmultiple = allocate() +local firstandlast = allocate() + +publications.inspectors = inspectors +inspectors.nofmultiple = nofmultiple +inspectors.firstandlast = firstandlast + +function nofmultiple.author(d) + return type(d) == "table" and #d or 0 end -local function manipulated(actions,str) - for i=1,#actions do - local action = manipulators[actions[i]] - if action then - str = action(str) or str +function publications.singularorplural(dataset,tag,name) + local data, field, kind = getcasted(dataset,tag,name) + if data then + local test = nofmultiple[kind] + if test then + local n = test(data) + return not n or n < 2 end end - return str + return true end -function commands.btxflush(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local fields = dataset.luadata[tag] - if fields then - local manipulator, field = checked(field) - local value = fields[field] - if type(value) == "string" then - local suffixes = dataset.suffixes[tag] - if suffixes then - local suffix = suffixes[field] - if suffix then - value = value .. converters.characters(suffix) - end - end - context(manipulator and manipulated(manipulator,value) or value) - return - end - local details = dataset.details[tag] - if details then - local value = details[field] - if type(value) == "string" then - local suffixes = dataset.suffixes[tag] - if suffixes then - local suffix = suffixes[field] - if suffix then - value = value .. converters.characters(suffix) - end - end - context(manipulator and manipulated(manipulator,value) or value) - return - end - end - report("unknown field %a of tag %a in dataset %a",field,tag,name) - else - report("unknown tag %a in dataset %a",tag,name) - end - else - report("unknown dataset %a",name) +function firstandlast.range(d) + if type(d) == "table" then + return d[1], d[2] end end -function commands.btxdetail(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local details = dataset.details[tag] - if details then - local manipulator, field = checked(field) - local value = details[field] - if type(value) == "string" then - local suffixes = dataset.suffixes[tag] - if suffixes then - local suffix = suffixes[field] - if suffix then - value = value .. converters.characters(suffix) - end - end - context(manipulator and manipulated(manipulator,value) or value) - else - report("unknown detail %a of tag %a in dataset %a",field,tag,name) - end - else - report("unknown tag %a in dataset %a",tag,name) +firstandlast.pagenumber = firstandlast.range + +function publications.oneorrange(dataset,tag,name) + local data, field, kind = getcasted(dataset,tag,name) + if data then + local test = firstandlast[kind] + if test then + local first, last = test(data) + return not (first and last) end - else - report("unknown dataset %a",name) end + return nil -- nothing at all end -function commands.btxfield(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local fields = dataset.luadata[tag] - if fields then - local manipulator, field = checked(field) - local value = fields[field] - if type(value) == "string" then - local suffixes = dataset.suffixes[tag] - if suffixes then - local suffix = suffixes[field] - if suffix then - value = value .. converters.characters(suffix) - end - end - context(manipulator and manipulated(manipulator,value) or value) - else - report("unknown field %a of tag %a in dataset %a",field,tag,name) +function publications.firstofrange(dataset,tag,name) + local data, field, kind = getcasted(dataset,tag,name) + if data then + local test = firstandlast[kind] + if test then + local first = test(data) + if first then + return first end - else - report("unknown tag %a in dataset %a",tag,name) end - else - report("unknown dataset %a",name) end end --- testing: to be speed up with testcase - -function commands.btxdoifelse(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local data = dataset.luadata[tag] - local value = data and data[field] - if value and value ~= "" then - ctx_firstoftwoarguments() - return +function publications.lastofrange(dataset,tag,name) + local data, field, kind = getcasted(dataset,tag,name) + if data then + local test = firstandlast[kind] + if test then + local first, last = test(data) + if last then + return last + end end end - ctx_secondoftwoarguments() end -function commands.btxdoif(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local data = dataset.luadata[tag] - local value = data and data[field] - if value and value ~= "" then - ctx_firstofoneargument() - return - end - end - ctx_gobbleoneargument() -end +local three_strings = { "string", "string", "string" } -function commands.btxdoifnot(name,tag,field) - local dataset = rawget(datasets,name) - if dataset then - local data = dataset.luadata[tag] - local value = data and data[field] - if value and value ~= "" then - ctx_gobbleoneargument() - return +implement { + name = "btxsingularorplural", + actions = { publications.singularorplural, ctx_doifelse }, + arguments = three_strings +} + +implement { + name = "btxoneorrange", + actions = { publications.oneorrange, function(b) if b == nil then ctx_gobbletwoarguments() else ctx_doifelse(b) end end }, + arguments = three_strings +} + +implement { + name = "btxfirstofrange", + actions = { publications.firstofrange, context }, + arguments = three_strings +} + +implement { + name = "btxlastofrange", + actions = { publications.lastofrange, context }, + arguments = three_strings +} + +-- basic loading + +function publications.usedataset(specification) + specification.kind = "current" + publications.load(specification) +end + +implement { + name = "btxusedataset", + actions = publications.usedataset, + arguments = { + { + { "specification" }, + { "dataset" }, + { "filename" }, + } + } +} + +implement { + name = "convertbtxdatasettoxml", + arguments = { "string", true }, + actions = publications.converttoxml +} + +-- enhancing + +do + + -- maybe not redo when already done + + local function shortsorter(a,b) + local ay, by = a[2], b[2] + if ay ~= by then + return ay < by + end + local ay, by = a[3], b[3] + if ay ~= by then + -- bah, bah, bah + local an, bn = tonumber(ay), tonumber(by) + if an and bn then + return an < bn + else + return ay < by + end + end + return a[4] < b[4] + end + + -- We could avoid loops by combining enhancers but that makes it only + -- more messy and for documents that use publications the few extra milli + -- seconds are irrelevant (there is for sure more to gain by proper coding + -- of the source and or style). + + local f_short = formatters["%t%02i"] + + function publications.enhancers.suffixes(dataset) + if not dataset then + return -- bad news + else + report("analyzing previous publication run for %a",dataset.name) + end + local used = usedentries[dataset.name] + if not used then + return -- probably a first run + end + local luadata = dataset.luadata + local details = dataset.details + local ordered = dataset.ordered + if not luadata or not details or not ordered then + report("nothing to be analyzed in %a",dataset.name) + return -- also bad news + end + local field = "author" -- currently only author + local shorts = { } + for i=1,#ordered do + local entry = ordered[i] + if entry then + local tag = entry.tag + if tag then + local use = used[tag] + if use then + -- use is a table of used list entries (so there can be more) and we just look at + -- the first one for btx properties + local listentry = use[1] + local userdata = listentry.userdata + local btxspc = userdata and userdata.btxspc + if btxspc then + -- this will become a specification entry + local author = getcasted(dataset,tag,field,specifications[btxspc]) + if type(author) == "table" then + -- number depends on sort order + local t = { } + if #author > 0 then + local n = #author == 1 and 3 or 1 + for i=1,#author do + local surnames = author[i].surnames + if not surnames or #surnames == 0 then + -- error + else + t[#t+1] = utfsub(surnames[1],1,n) + end + end + end + local year = tonumber(entry.year) or 0 + local short = f_short(t,mod(year,100)) + local s = shorts[short] + -- we could also sort on reference i.e. entries.text + if u then + u = listentry.entries.text -- hm + else + u = "0" + end + if not s then + shorts[short] = { { tag, year, u, i } } + else + s[#s+1] = { tag, year, u, i } + end + else + report("author typecast expected for field %a",field) + end + else + --- no spec so let's forget about it + end + end + end + end + end + -- for short, tags in next, shorts do -- ordered ? + for short, tags in sortedhash(shorts) do -- ordered ? + local n = #tags + if n == 0 then + -- skip + elseif n == 1 then + local tagdata = tags[1] + local tag = tagdata[1] + local detail = details[tag] + local entry = luadata[tag] + local year = entry.year + detail.short = short + if year then + detail.suffixedyear = year + end + if trace_shorts then + report_shorts("year %a, suffix %a, short %a, tag %a",year or "-","-",short,tag) + end + elseif n > 1 then + sort(tags,shortsorter) + for i=1,n do + local tagdata = tags[i] + local tag = tagdata[1] + local detail = details[tag] + local suffix = numbertochar(i) + local entry = luadata[tag] + local year = entry.year + detail.short = short + detail.suffix = suffix + if year then + detail.suffixedyear = year .. suffix + end + if trace_shorts then + report_shorts("year %a, suffix %a, short %a, tag %a",year or "-",suffix or "-",short,tag) + end + end + end + end + end + + utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.suffixes") + +end + +implement { + name = "btxaddentry", + 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) + local dataset = rawget(datasets,name) + if dataset then + return name + elseif default and default ~= "" then + return default + else + report("unknown dataset %a, forcing %a",name,v_default) + return v_default + end +end + +implement { + name = "btxsetdataset", + actions = { publications.checkeddataset, context }, + arguments = { "string", "string"} +} + +implement { + name = "btxsetentry", + actions = function(name,tag) + local dataset = rawget(datasets,name) + if dataset then + if dataset.luadata[tag] then + context(tag) + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end, + arguments = { "string", "string" }, +} + +-- rendering of fields + +do + + local typesetters = { } + publications.typesetters = typesetters + + local function defaulttypesetter(field,value,manipulator) + if value and value ~= "" then + value = tostring(value) + context(manipulator and applymanipulation(manipulator,value) or value) + end + end + + setmetatableindex(typesetters,function(t,k) + local v = defaulttypesetter + t[k] = v + return v + end) + + function typesetters.string(field,value,manipulator) + if value and value ~= "" then + context(manipulator and applymanipulation(manipulator,value) or value) + end + end + + function typesetters.author(field,value,manipulator) + ctx_btxflushauthor(field) + end + + -- function typesetters.url(field,value,manipulator) + -- .... + -- end + + -- if there is no specification then we're in trouble but there is + -- always a default anyway + -- + -- there's also always a fields table but it can be empty due to + -- lack of specifications + -- + -- then there can be cases where we have no specification for instance + -- when we have a special kind of database + + local splitter = lpeg.splitat(":") + + local function permitted(category,field) + local catspec = currentspecification.categories[category] + if not catspec then + report("invalid category %a, %s",category,"no specification") -- can't happen + return false + end + local fields = catspec.fields + if not fields then + report("invalid category %a, %s",category,"no fields") -- can't happen + return false + end + if ignoredfields and ignoredfields[field] then + return false + end + local virtualfields = currentspecification.virtualfields + if virtualfields and virtualfields[field] then + return true + end + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + return set + end + end + if fields[field] then + return true + end + local f, l = lpegmatch(splitter,field) + if f and l and fields[f] then + return true -- language specific one + end + end + + local function found(dataset,tag,field,valid,fields) + if valid == true then + -- local fields = dataset.luadata[tag] + local okay = fields[field] + if okay then + return field, okay + end + local details = dataset.details[tag] + local value = details[field] + if value then + return field, value + end + elseif valid then + -- local fields = dataset.luadata[tag] + for i=1,#valid do + local field = valid[i] + local value = fields[field] + if value then + return field, value + end + end + local details = dataset.details[tag] + for i=1,#valid do + local value = details[field] + if value then + return field, value + end + end + end + end + + local function get(dataset,tag,field,what,check,catspec) -- somewhat more extensive + local current = rawget(datasets,dataset) + if current then + local data = current.luadata[tag] + if data then + local category = data.category + local catspec = (catspec or currentspecification).categories[category] + if not catspec then + return false + end + local fields = catspec.fields + if fields then + local sets = catspec.sets + if sets then + local set = sets[field] + if set then + if check then + for i=1,#set do + local field = set[i] + local kind = (not check or data[field]) and fields[field] + if kind then + return what and kind or field + end + end + elseif what then + local t = { } + for i=1,#set do + t[i] = fields[set[i]] or "unknown" + end + return concat(t,",") + else + return concat(set,",") + end + end + end + local kind = (not check or data[field]) and fields[field] + if kind then + return what and kind or field + end + end + end + end + return "" + end + + publications.permitted = permitted + publications.found = found + publications.get = get + + local function btxflush(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local manipulator, field = splitmanipulation(field) + local category = fields.category + local valid = permitted(category,field) + if valid then + local name, value = found(dataset,tag,field,valid,fields) + if value then + typesetters[currentspecification.types[name]](field,value,manipulator) + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","unknown","entry",field,category,tag,name) + end + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","invalid","entry",field,category,tag,name) + end + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end + + local function btxfield(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local category = fields.category + local manipulator, field = splitmanipulation(field) + if permitted(category,field) then + local value = fields[field] + if value then + typesetters[currentspecification.types[field]](field,value,manipulator) + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","unknown","field",field,category,tag,name) + end + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","invalid","field",field,category,tag,name) + end + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end + + local function btxdetail(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local details = dataset.details[tag] + if details then + local category = fields.category + local manipulator, field = splitmanipulation(field) + if permitted(category,field) then + local value = details[field] + if value then + typesetters[currentspecification.types[field]](field,value,manipulator) + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","unknown","detail",field,category,tag,name) + end + elseif trace_detail then + report("%s %s %a in category %a for tag %a in dataset %a","invalid","detail",field,category,tag,name) + end + else + report("no details for tag %a in dataset %a",tag,name) + end + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end + + local function btxdirect(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local manipulator, field = splitmanipulation(field) + local value = fields[field] + if value then + context(typesetters.default(field,value,manipulator)) + elseif trace_detail then + report("field %a of tag %a in dataset %a has no value",field,tag,name) + end + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end + + local function okay(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local category = fields.category + local valid = permitted(category,field) + if valid then + local value, field = found(dataset,tag,field,valid,fields) + return value and value ~= "" + end + end end end - ctx_firstofoneargument() + + 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 = "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" } } + end -- -- alternative approach: keep data at the tex end @@ -826,1124 +1481,1616 @@ function publications.singularorplural(singular,plural) end end -local patterns = { "publ-imp-%s.mkiv", "publ-imp-%s.tex" } +-- loading -local function failure(name) - report("unknown library %a",name) -end +do -local function action(name,foundname) - context.input(foundname) -end + local patterns = { + "publ-imp-%s.mkvi", + "publ-imp-%s.mkiv", + "publ-imp-%s.tex", + } + + local function failure(name) + report("unknown library %a",name) + end -function commands.loadbtxdefinitionfile(name) -- a more specific name - commands.uselibrary { - name = gsub(name,"^publ%-",""), - patterns = patterns, - action = action, - failure = failure, - onlyonce = false, + local function action(name,foundname) + context.input(foundname) + end + + function publications.loaddefinitionfile(name) -- a more specific name + resolvers.uselibrary { + name = string.gsub(name,"^publ%-",""), + patterns = patterns, + action = action, + failure = failure, + onlyonce = true, + } + end + + local patterns = { + "publ-imp-%s.lua", } -end --- lists: + function publications.loadreplacementfile(name) -- a more specific name + resolvers.uselibrary { + name = string.gsub(name,"^publ%-",""), + patterns = patterns, + action = publications.loaders.registercleaner, + failure = failure, + onlyonce = true, + } + end + + implement { name = "btxloaddefinitionfile", actions = publications.loaddefinitionfile, arguments = "string" } + implement { name = "btxloadreplacementfile", actions = publications.loadreplacementfile, arguments = "string" } -publications.lists = publications.lists or { } -local lists = publications.lists +end -local context = context -local structures = structures +-- lists -local references = structures.references -local sections = structures.sections +do --- per rendering + publications.lists = publications.lists or { } + local lists = publications.lists -local renderings = { } --- per dataset + local context = context + local structures = structures -setmetatableindex(renderings,function(t,k) - local v = { - list = { }, - done = { }, - alldone = { }, - used = { }, - registered = { }, - ordered = { }, - shorts = { }, - method = v_none, - currentindex = 0, - } - t[k] = v - return v -end) + local references = structures.references + local sections = structures.sections --- why shorts vs tags: only for sorting + -- per rendering -function lists.register(dataset,tag,short) -- needs checking now that we split - local r = renderings[dataset] - if not short or short == "" then - short = tag - end - if trace then - report("registering publication entry %a with shortcut %a",tag,short) - end - local top = #r.registered + 1 - -- do we really need these - r.registered[top] = tag - r.ordered [tag] = top - r.shorts [tag] = short -end + local renderings = { } --- per dataset -function lists.nofregistered(dataset) - return #renderings[dataset].registered -end + setmetatableindex(renderings,function(t,k) + local v = { + list = { }, + done = { }, + alldone = { }, + used = { }, + registered = { }, + ordered = { }, + shorts = { }, + method = v_none, + texts = setmetatableindex("table"), + currentindex = 0, + } + t[k] = v + return v + end) -function lists.setmethod(dataset,method) - local r = renderings[dataset] - r.method = method or v_none - r.list = { } - r.done = { } -end + -- helper -local function validkeyword(dataset,tag,keyword) - local ds = datasets[dataset] - if not ds then - report("unknown dataset %a",dataset) - return + function lists.register(dataset,tag,short) -- needs checking now that we split + local r = renderings[dataset] + if not short or short == "" then + short = tag + end + if trace then + report("registering publication entry %a with shortcut %a",tag,short) + end + local top = #r.registered + 1 + -- do we really need these + r.registered[top] = tag + r.ordered [tag] = top + r.shorts [tag] = short end - local dt = ds.details[tag] - if not dt then - report("no details for tag %a",tag) - return + + function lists.nofregistered(dataset) + return #renderings[dataset].registered end - local kw = dt.keyword - if kw then - for k in next, keyword do - if kw[k] then - return true + + local function validkeyword(dataset,tag,keyword,specification) -- todo: pass specification + local kw = getcasted(dataset,tag,"keywords",specification) + if kw then + for i=1,#kw do + if keyword[kw[i]] then + return true + end end end end -end -function lists.collectentries(specification) - local dataset = specification.btxdataset - if not dataset then - return + local function registerpage(pages,tag,result,listindex) + local p = pages[tag] + local r = result[listindex].references + if p then + local last = p[#p][2] + local real = last.realpage + if real ~= r.realpage then + p[#p+1] = { listindex, r } + end + else + pages[tag] = { { listindex, r } } + end end - local rendering = renderings[dataset] - local method = rendering.method - if method == v_none then - return + + local methods = { } + lists.methods = methods + + methods[v_dataset] = function(dataset,rendering,keyword) + -- why only once unless criterium=all? + local current = datasets[dataset] + local luadata = current.luadata + local list = rendering.list + for tag, data in sortedhash(luadata) do + if not keyword or validkeyword(dataset,tag,keyword) then + list[#list+1] = { tag, false, 0, false, false, data.index or 0} + end + end end - local result = structures.lists.filter(specification) - -- - local keyword = specification.keyword - if keyword and keyword ~= "" then - keyword = settings_to_set(keyword) - else - keyword = nil - end - lists.result = result - local section = sections.currentid() - local list = rendering.list - local done = rendering.done - local alldone = rendering.alldone - if method == v_local then + + -- todo: names = { "btx" } + + methods[v_force] = function (dataset,rendering,keyword) + -- only for checking, can have duplicates, todo: collapse page numbers, although + -- we then also needs deferred writes + local result = structures.lists.filter(rendering.specifications) or { } + local list = rendering.list + local current = datasets[dataset] + local luadata = current.luadata for listindex=1,#result do local r = result[listindex] - local u = r.userdata - if u and u.btxset == dataset then - local tag = u.btxref - if tag and done[tag] ~= section then - if not keyword or validkeyword(dataset,tag,keyword) then - done[tag] = section - alldone[tag] = true - list[#list+1] = { tag, listindex } + local u = r.userdata -- better check on metadata.kind == "btx" + if u then + local set = u.btxset or v_default + if set == dataset then + local tag = u.btxref + if tag and (not keyword or validkeyword(dataset,tag,keyword)) then + local data = luadata[tag] + list[#list+1] = { tag, listindex, 0, u, u.btxint, data and data.index or 0 } end end end end - elseif method == v_global then + lists.result = result + end + + -- local : if tag and done[tag] ~= section then ... + -- global : if tag and not alldone[tag] and done[tag] ~= section then ... + + methods[v_local] = function(dataset,rendering,keyword) + local result = structures.lists.filter(rendering.specifications) or { } + local section = sections.currentid() + local list = rendering.list + local repeated = rendering.repeated == v_yes + local r_done = rendering.done + local r_alldone = rendering.alldone + local done = repeated and { } or r_done + local alldone = repeated and { } or r_alldone + local doglobal = rendering.method == v_global + local traced = { } -- todo: only if interactive (backlinks) or when tracing + local pages = { } + local current = datasets[dataset] + local luadata = current.luadata + -- handy for tracing : + rendering.result = result + -- for listindex=1,#result do local r = result[listindex] local u = r.userdata - if u and u.btxset == dataset then - local tag = u.btxref - if tag and not alldone[tag] and done[tag] ~= section then - if not keyword or validkeyword(dataset,tag,keyword) then - done[tag] = section - alldone[tag] = true - list[#list+1] = { tag, listindex } + if u then -- better check on metadata.kind == "btx" + local set = u.btxset or v_default + if set == dataset then + local tag = u.btxref + if not tag then + -- problem + elseif done[tag] == section then -- a bit messy for global and all and so + -- skip + elseif doglobal and alldone[tag] then + -- skip + elseif not keyword or validkeyword(dataset,tag,keyword) then + if traced then + local l = traced[tag] + if l then + l[#l+1] = u.btxint + else + local data = luadata[tag] + local l = { tag, listindex, 0, u, u.btxint, data and data.index or 0 } + list[#list+1] = l + traced[tag] = l + end + else + done[tag] = section + alldone[tag] = true + local data = luadata[tag] + list[#list+1] = { tag, listindex, 0, u, u.btxint, data and data.index or 0 } + end + end + if tag then + registerpage(pages,tag,result,listindex) end end end end - elseif method == v_force then - -- only for checking, can have duplicates, todo: collapse page numbers, although - -- we then also needs deferred writes - for listindex=1,#result do - local r = result[listindex] - local u = r.userdata - if u and u.btxset == dataset then - local tag = u.btxref - if tag then - if not keyword or validkeyword(dataset,tag,keyword) then - list[#list+1] = { tag, listindex } + if traced then + for tag in next, traced do + done[tag] = section + alldone[tag] = true + end + end + lists.result = result + structures.lists.result = result + rendering.pages = pages -- or list.pages + end + + methods[v_global] = methods[v_local] + + function lists.collectentries(specification) + local dataset = specification.dataset + if not dataset then + return + end + local rendering = renderings[dataset] + if not rendering then + return + end + local method = specification.method or v_none + local ignored = specification.ignored or "" + rendering.method = method + rendering.ignored = ignored ~= "" and settings_to_set(ignored) or nil + rendering.list = { } + rendering.done = { } + rendering.sorttype = specification.sorttype or v_default + rendering.criterium = specification.criterium or v_none + rendering.repeated = specification.repeated or v_no + rendering.group = specification.group or "" + rendering.specifications = specification + local filtermethod = methods[method] + if not filtermethod then + report_list("invalid method %a",method or "") + return + end + lists.result = { } -- kind of reset + local keyword = specification.keyword + if keyword and keyword ~= "" then + keyword = settings_to_set(keyword) + else + keyword = nil + end + filtermethod(dataset,rendering,keyword) + local list = rendering.list + ctx_btxsetnoflistentries(list and #list or 0) + end + + -- for determining width + + local groups = setmetatableindex("number") + + function lists.prepareentries(dataset) + local rendering = renderings[dataset] + local list = rendering.list + local used = rendering.used + local forceall = rendering.criterium == v_all + local repeated = rendering.repeated == v_yes + local sorttype = rendering.sorttype or v_default + local group = rendering.group or "" + local sorter = lists.sorters[sorttype] + local current = datasets[dataset] + local luadata = current.luadata + local details = current.details + local newlist = { } + local lastreferencenumber = groups[group] -- current.lastreferencenumber or 0 + for i=1,#list do + local li = list[i] + local tag = li[1] + local entry = luadata[tag] + if entry then + if forceall or repeated or not used[tag] then + newlist[#newlist+1] = li + -- already here: + if not repeated then + used[tag] = true -- beware we keep the old state (one can always use criterium=all) + end + local detail = details[tag] + if detail then + local referencenumber = detail.referencenumber + if not referencenumber then + lastreferencenumber = lastreferencenumber + 1 + referencenumber = lastreferencenumber + detail.referencenumber = lastreferencenumber + end + li[3] = referencenumber + else + report("missing details for tag %a in dataset %a (enhanced: %s)",tag,dataset,current.enhanced and "yes" or "no") + -- weird, this shouldn't happen .. all have a detail + lastreferencenumber = lastreferencenumber + 1 + details[tag] = { referencenumber = lastreferencenumber } + li[3] = lastreferencenumber end end end end - elseif method == v_dataset then - local luadata = datasets[dataset].luadata - for tag, data in table.sortedhash(luadata) do - if not keyword or validkeyword(dataset,tag,keyword) then - list[#list+1] = { tag } + groups[group] = lastreferencenumber + if type(sorter) == "function" then + rendering.list = sorter(dataset,rendering,newlist,sorttype) or newlist + else + rendering.list = newlist + end + end + + function lists.fetchentries(dataset) + local rendering = renderings[dataset] + local list = rendering.list + if list then + for i=1,#list do + local li = list[i] + ctx_btxsettag(li[1]) + ctx_btxsetnumber(li[3]) + ctx_btxchecklistentry() end end end -end -lists.sorters = { - [v_short] = function(dataset,rendering,list) - local shorts = rendering.shorts - local function compare(a,b) - local aa, bb = a and a[1], b and b[1] - if aa and bb then - aa, bb = shorts[aa], shorts[bb] - return aa and bb and aa < bb + -- for rendering + + -- setspecification + + local function btxflushpages(dataset,tag) + -- todo: interaction + local rendering = renderings[dataset] + local pages = rendering.pages + if not pages then + return + else + pages = pages[tag] + end + if not pages then + return + end + local nofpages = #pages + if nofpages == 0 then + return + end + local first_p = nil + local first_r = nil + local last_p = nil + local last_r = nil + local ranges = { } + local nofdone = 0 + local function flush() + if last_r and first_r ~= last_r then + ranges[#ranges+1] = { first_p, last_p } + else + ranges[#ranges+1] = { first_p } end - return false end - sort(list,compare) - end, - [v_reference] = function(dataset,rendering,list) - local function compare(a,b) - local aa, bb = a and a[1], b and b[1] - if aa and bb then - return aa and bb and aa < bb + for i=1,nofpages do + local next_p = pages[i] + local next_r = next_p[2].realpage + if not first_r then + first_p = next_p + first_r = next_r + elseif last_r + 1 == next_r then + -- continue + elseif first_r then + flush() + first_p = next_p + first_r = next_r end - return false + last_p = next_p + last_r = next_r end - sort(list,compare) - end, - [v_dataset] = function(dataset,rendering,list) - local function compare(a,b) - local aa, bb = a and a[1], b and b[1] - if aa and bb then - aa, bb = list[aa].index or 0, list[bb].index or 0 - return aa and bb and aa < bb + if first_r then + flush() + end + local nofranges = #ranges + for i=1,nofranges do + local r = ranges[i] + ctx_btxsetconcat(concatstate(i,nofranges)) + local first, last = r[1], r[2] + ctx_btxsetfirstinternal(first[2].internal) + ctx_btxsetfirstpage(first[1]) + if last then + ctx_btxsetlastinternal(last[2].internal) + ctx_btxsetlastpage(last[1]) end - return false + if trace_detail then + report("expanding page setup") + end + ctx_btxpagesetup() end - sort(list,compare) - end, - -- [v_default] = function(dataset,rendering,list) -- not really needed - -- local ordered = rendering.ordered - -- local function compare(a,b) - -- local aa, bb = a and a[1], b and b[1] - -- if aa and bb then - -- aa, bb = ordered[aa], ordered[bb] - -- return aa and bb and aa < bb - -- end - -- return false - -- end - -- sort(list,compare) - -- end, - [v_author] = function(dataset,rendering,list) - local valid = publications.authors.preparedsort(dataset,list,v_author,v_editor) - if #valid == 0 or #valid ~= #list then - -- nothing to sort - else - -- if needed we can wrap compare and use the list directly but this is cleaner - sorters.sort(valid,sortcomparer) - for i=1,#valid do - local v = valid[i] - valid[i] = list[v.index] + end + + implement { + name = "btxflushpages", + actions = btxflushpages, + arguments = { "string", "string" } + } + + function lists.sameasprevious(dataset,i,name,order,method) + local rendering = renderings[dataset] + local list = rendering.list + local n = tonumber(i) + if n and n > 1 and n <= #list then + local luadata = datasets[dataset].luadata + local current = getdirect(dataset,luadata[list[n ][1]],name) + local previous = getdirect(dataset,luadata[list[n-1][1]],name) + -- if not order then + -- order = gettexcounter("c_btx_list_reference") + -- end + if order and order > 0 and (method == v_always or method == v_doublesided) then + local clist = listtolist[order] + local plist = listtolist[order-1] + if clist and plist then + local crealpage = clist.references.realpage + local prealpage = plist.references.realpage + if crealpage ~= prealpage then + if method == v_always or not conditionals.layoutisdoublesided then + if trace_detail then + report("previous %a, current %a, different page",previous,current) + end + return false + elseif crealpage % 2 == 0 then + if trace_detail then + report("previous %a, current %a, different page",previous,current) + end + return false + end + end + end end - return valid + local sameentry = current and current == previous + if trace_detail then + if sameentry then + report("previous %a, current %a, same entry",previous,current) + else + report("previous %a, current %a, different entry",previous,current) + end + end + return sameentry + else + return false end - end, -} + end -function lists.flushentries(dataset,sortvariant) - local rendering = renderings[dataset] - local list = rendering.list - local sort = lists.sorters[sortvariant] or lists.sorters[v_default] - if type(sort) == "function" then - list = sort(dataset,rendering,list) or list - end - for i=1,#list do - -- we can pass i here too ... more efficient to avoid the setvalue - local tag = list[i][1] - local entry = datasets[dataset].luadata[tag] - if entry then - ctx_setvalue("currentbtxindex",i) -- todo: helper + function lists.flushentry(dataset,i,textmode) + local rendering = renderings[dataset] + local list = rendering.list + local luadata = datasets[dataset].luadata + local li = list[i] + if li then + local tag = li[1] + local listindex = li[2] + local n = li[3] + local entry = luadata[tag] + -- + ctx_btxstartlistentry() + ctx_btxsetcurrentlistentry(i) -- redundant + ctx_btxsetcurrentlistindex(listindex or 0) local combined = entry.combined + local language = entry.language if combined then - ctx_setvalue("currentbtxcombis",concat(combined,",")) + ctx_btxsetcombis(concat(combined,",")) + end + ctx_btxsetcategory(entry.category or "unknown") + ctx_btxsettag(tag) + ctx_btxsetnumber(n) + if language then + ctx_btxsetlanguage(language) + end + local bl = li[5] + if bl and bl ~= "" then + ctx_btxsetbacklink(bl) + ctx_btxsetbacktrace(concat(li," ",5)) + local uc = citetolist[tonumber(bl)] + if uc then + ctx_btxsetinternal(uc.references.internal or "") + end else - ctx_setvalue("currentbtxcombis","") + -- nothing end - ctx_btxhandlelistentry(tag) -- pas i instead - end - end -end - -function lists.fetchentries(dataset) - local list = renderings[dataset].list - for i=1,#list do - local tag = list[i][1] - local entry = datasets[dataset].luadata[tag] - if entry then - ctx_btxchecklistentry(tag) -- integrate doifalreadyplaced here + local userdata = li[4] + if userdata then + local b = userdata.btxbtx + local a = userdata.btxatx + if b then + ctx_btxsetbefore(b) + end + if a then + ctx_btxsetafter(a) + end + end + rendering.userdata = userdata + if textmode then + ctx_btxhandlelisttextentry() + else + ctx_btxhandlelistentry() + end + ctx_btxstoplistentry() + -- + -- context(function() + -- -- wrapup + -- rendering.ignoredfields = nil + -- end) end end -end -function lists.filterall(dataset) - local r = renderings[dataset] - local list = r.list - local registered = r.registered - for i=1,#registered do - list[i] = { registered[i], i } + local function getuserdata(dataset,key) + local rendering = renderings[dataset] + if rendering then + local userdata = rendering.userdata + if userdata then + local value = userdata[key] + if value and value ~= "" then + return value + end + end + end end -end -function lists.registerplaced(dataset,tag) - renderings[dataset].used[tag] = true -end - -function lists.doifalreadyplaced(dataset,tag) - commands.doifelse(renderings[dataset].used[tag]) -end + lists.uservariable = getuserdata --- we ask for :tag but when we can't find it we go back --- to look for previous definitions, and when not found again --- we look forward + function lists.filterall(dataset) + local r = renderings[dataset] + local list = r.list + local registered = r.registered + for i=1,#registered do + list[i] = { registered[i], i, 0, false, false } + end + end -local function compare(a,b) - local aa, bb = a and a[3], b and b[3] - return aa and bb and aa < bb -end + implement { + name = "btxuservariable", + actions = { getuserdata, context }, + arguments = { "string", "string" } + } --- rendering ? + implement { + name = "btxdoifelseuservariable", + actions = { getuserdata, ctx_doifelse }, + arguments = { "string", "string" } + } --- todo: nicer refs + -- implement { + -- name = "btxresolvelistreference", + -- actions = lists.resolve, + -- arguments = { "string", "string" } + -- } + + implement { + name = "btxcollectlistentries", + actions = lists.collectentries, + arguments = { + { + { "names" }, + { "criterium" }, + { "reference" }, + { "method" }, + { "dataset" }, + { "keyword" }, + { "sorttype" }, + { "repeated" }, + { "ignored" }, + { "group" }, + } + } + } --- local f_citereference = formatters["btx:%s:%s"] -- dataset, instance (block), tag, order --- local f_listreference = formatters["btx:%s:%s:%s:%s"] -- dataset, instance (block), tag, order --- --- -- local done = { } --- local last = 0 --- --- function commands.btxcitereference(internal) --- last = last + 1 --- local ref = f_citereference(internal,last) -- we just need a unique key --- -- local don = done[ref] --- -- if don == nil then --- if trace_references then --- report_reference("cite: %s",ref) --- end --- -- done[ref] = true --- ctx_btxsetcitereference(ref,internal) --- -- elseif don then --- -- report_reference("duplicate cite: %s, skipped",ref) --- -- done[ref] = false --- -- -- else --- -- -- no more messages --- -- end --- end --- --- -- we just need a unique key, so we could also use btx: but this --- -- way we have a bit of a check for duplicates --- --- -- local done = { } --- local last = 0 --- --- function commands.btxlistreference(dataset,block,tag,data) --- last = last + 1 --- local ref = f_listreference(dataset,block,tag,last) --- -- local don = done[ref] --- -- if don == nil then --- if trace_references then --- report_reference("list: %s",ref) --- end --- -- done[ref] = true --- ctx_btxsetlistreference(dataset,tag,ref,data) --- -- elseif don then --- -- report_reference("duplicate link: %s, skipped",ref) --- -- done[ref] = false --- -- -- else --- -- -- no more messages --- -- end --- end + implement { + name = "btxpreparelistentries", + actions = lists.prepareentries, + arguments = { "string" }, + } + implement { + name = "btxfetchlistentries", + actions = lists.fetchentries, + arguments = { "string" }, + } -local f_citereference = formatters["btx:cite:%s"] -local f_listreference = formatters["btx:list:%s"] + implement { + name = "btxflushlistentry", + actions = lists.flushentry, + arguments = { "string", "integer" } + } -local nofcite = 0 -local noflist = 0 + implement { + name = "btxdoifelsesameasprevious", + actions = { lists.sameasprevious, ctx_doifelse }, + arguments = { "string", "integer", "string", "integer", "string" } + } -function commands.btxcitereference(internal) - nofcite = nofcite + 1 - local ref = f_citereference(nofcite) - if trace_references then - report_reference("cite: %s",ref) - end - ctx_btxsetcitereference(ref,internal) end -function commands.btxlistreference(dataset,block,tag,data) - noflist = noflist + 1 - local ref = f_listreference(noflist) - if trace_references then - report_reference("list: %s",ref) - end - ctx_btxsetlistreference(dataset,tag,ref,data) -end +do + local citevariants = { } + publications.citevariants = citevariants -commands.btxsetlistmethod = lists.setmethod -commands.btxresolvelistreference = lists.resolve -commands.btxregisterlistentry = lists.registerplaced -commands.btxaddtolist = lists.addentry -commands.btxcollectlistentries = lists.collectentries -commands.btxfetchlistentries = lists.fetchentries -commands.btxflushlistentries = lists.flushentries -commands.btxdoifelselistentryplaced = lists.doifalreadyplaced - -local citevariants = { } -publications.citevariants = citevariants - --- helper - -local function sortedtags(dataset,list,sorttype) - local luadata = datasets[dataset].luadata - local valid = { } - for i=1,#list do - local tag = list[i] - local entry = luadata[tag] - if entry then - local key = entry[sorttype] - if key then - valid[#valid+1] = { - tag = tag, - split = sortsplitter(sortstripper(key)) - } - else - end + local function btxhandlecite(specification) + local dataset = specification.dataset or v_default + local reference = specification.reference + local variant = specification.variant + if not variant or variant == "" then + variant = "default" end - end - if #valid == 0 or #valid ~= #list then - return list - else - sorters.sort(valid,basicsorter) - for i=1,#valid do - valid[i] = valid[i].tag + if not reference or reference == "" then + return end - return valid - end -end - --- if sorttype and sorttype ~= "" then --- tags = sortedtags(dataset,tags,sorttype) --- end - -local optionalspace = lpeg.patterns.whitespace^0 -local prefixsplitter = optionalspace * lpeg.splitat(optionalspace * P("::") * optionalspace) - -function commands.btxhandlecite(specification) - local tag = specification.reference - if not tag or tag == "" then - return - end - -- - local dataset = specification.dataset or "" - local mark = specification.markentry ~= false - local variant = specification.variant or "num" - local sorttype = specification.sorttype - local compress = specification.compress == v_yes - -- - local prefix, rest = lpegmatch(prefixsplitter,tag) - if rest then - dataset = prefix - else - rest = tag - end - local action = citevariants[variant] -- there is always fallback on default - if trace_cite then - report_cite("inject, dataset: %s, tag: %s, variant: %s, compressed",dataset or "-",rest,variant) + -- + specification.variant = variant + specification.compress = specification.compress == v_yes + specification.markentry = specification.markentry ~= false + -- + local prefix, rest = lpegmatch(prefixsplitter,reference) + if prefix and rest then + dataset = prefix + specification.dataset = prefix + specification.reference = rest + end + -- + if trace_cite then + report_cite("inject, dataset: %s, tag: %s, variant: %s, compressed", + specification.dataset or "-", + specification.reference, + specification.variant + ) + end + -- + ctx_btxsetdataset(dataset) + -- + citevariants[variant](specification) -- we always fall back on default end - ctx_setvalue("currentbtxdataset",dataset) - action(dataset,rest,mark,compress,variant) -end -function commands.btxhandlenocite(specification) - local mark = specification.markentry ~= false - if not mark then - return - end - local tag = specification.reference - if not tag or tag == "" then - return - end - local dataset = specification.dataset or "" - local prefix, rest = lpegmatch(prefixsplitter,tag) - if rest then - dataset = prefix - else - rest = tag - end - ctx_setvalue("currentbtxdataset",dataset) - local tags = settings_to_array(rest) - if trace_cite then - report_cite("mark, dataset: %s, tags: % | t",dataset or "-",tags) - end - for i=1,#tags do - markcite(dataset,tags[i]) + local function btxhandlenocite(specification) + local dataset = specification.dataset or v_default + local reference = specification.reference + if not reference or reference == "" then + return + end + -- + local markentry = specification.markentry ~= false + local internal = specification.internal or "" + -- + local prefix, rest = lpegmatch(prefixsplitter,reference) + if rest then + dataset = prefix + reference = rest + end + -- + if trace_cite then + report_cite("mark, dataset: %s, tags: %s",dataset or "-",reference) + end + -- + local reference = publications.parenttag(dataset,reference) + -- + local found, todo, list = findallused(dataset,reference,internal) + -- + tobemarked = markentry and todo + if found and tobemarked then + flushmarked(dataset,list) + btxflushmarked() -- here (could also be done in caller) + end end -end --- function commands.btxcitevariant(dataset,block,tags,variant) -- uses? specification ? --- local action = citevariants[variant] --- if action then --- action(dataset,tags,variant) --- end --- end + implement { + name = "btxhandlecite", + actions = btxhandlecite, + arguments = { + { + { "dataset" }, + { "reference" }, + { "markentry", "boolean" }, + { "variant" }, + { "sorttype" }, + { "compress" }, + { "author" }, + { "lefttext" }, + { "righttext" }, + { "before" }, + { "after" }, + } + } + } --- sorter + implement { + name = "btxhandlenocite", + actions = btxhandlenocite, + arguments = { + { + { "dataset" }, + { "reference" }, + { "markentry", "boolean" }, + } + } + } -local keysorter = function(a,b) return a.sortkey < b.sortkey end + -- sorter -local function compresslist(source) - for i=1,#source do - if type(source[i].sortkey) ~= "number" then - return source + local keysorter = function(a,b) + local ak = a.sortkey + local bk = b.sortkey + if ak == bk then + local as = a.suffix -- alphabetic + local bs = b.suffix -- alphabetic + if as and bs then + return (as or "") < (bs or "") + else + return false + end + else + return ak < bk end end - local first, last, firstr, lastr - local target, noftarget, tags = { }, 0, { } - sort(source,keysorter) - -- suffixes - local oldvalue = nil - local suffix = 0 - local function setsuffix(entry,suffix,sortfld) - entry.suffix = suffix - local dataset = datasets[entry.dataset] - if dataset then - local suffixes = dataset.suffixes[entry.tag] - if suffixes then - suffixes[sortfld] = suffix + + local function compresslist(source) + for i=1,#source do + local t = type(source[i].sortkey) + if t == "number" then + -- okay + -- elseif t == "string" then + -- -- okay else - dataset.suffixes[entry.tag] = { [sortfld] = suffix } + return source end end - end - for i=1,#source do - local entry = source[i] - local sortfld = entry.sortfld - if sortfld then - local value = entry.sortkey - if value == oldvalue then - if suffix == 0 then - suffix = 1 - local entry = source[i-1] - setsuffix(entry,suffix,sortfld) - end - suffix = suffix + 1 - setsuffix(entry,suffix,sortfld) + local first, last, firstr, lastr + local target, noftarget, tags = { }, 0, { } + sort(source,keysorter) + local oldvalue = nil + local function flushrange() + noftarget = noftarget + 1 + if last > first + 1 then + target[noftarget] = { + first = firstr, + last = lastr, + tags = tags, + } else - oldvalue = value - suffix = 0 + target[noftarget] = firstr + if last > first then + noftarget = noftarget + 1 + target[noftarget] = lastr + end end - else - break + tags = { } end - end - -- - local function flushrange() - noftarget = noftarget + 1 - if last > first + 1 then - target[noftarget] = { - first = firstr, - last = lastr, - tags = tags, - } - else - target[noftarget] = firstr - if last > first then - noftarget = noftarget + 1 - target[noftarget] = lastr + for i=1,#source do + local entry = source[i] + local current = entry.sortkey + local suffix = entry.suffix -- todo but what + if not first then + first, last, firstr, lastr = current, current, entry, entry + elseif current == last + 1 then + last, lastr = current, entry + else + flushrange() + first, last, firstr, lastr = current, current, entry, entry end + tags[#tags+1] = entry.tag end - tags = { } - end - for i=1,#source do - local entry = source[i] - local current = entry.sortkey - if not first then - first, last, firstr, lastr = current, current, entry, entry - elseif current == last + 1 then - last, lastr = current, entry - else + if first and last then flushrange() - first, last, firstr, lastr = current, current, entry, entry end - tags[#tags+1] = entry.tag - end - if first and last then - flushrange() + return target end - return target -end --- local source = { --- { tag = "one", internal = 1, value = "foo", page = 1 }, --- { tag = "two", internal = 2, value = "bar", page = 2 }, --- { tag = "three", internal = 3, value = "gnu", page = 3 }, --- } --- --- local target = compresslist(source) - -local numberonly = R("09")^1 / tonumber + P(1)^0 -local f_missing = formatters["<%s>"] - --- maybe also sparse (e.g. pages) - -local function processcite(dataset,reference,mark,compress,setup,getter,setter,compressor) - reference = publications.parenttag(dataset,reference) - local found, todo, list = findallused(dataset,reference) - if found and setup then - local source = { } - local badkey = false - for i=1,#found do - local entry = found[i] - local tag = entry.userdata.btxref - local internal = entry.references.internal - local data = getter(dataset,tag,entry,internal) - if compress and not compressor then - local sortkey = data.sortkey - if sortkey then - local key = lpegmatch(numberonly,sortkey) - if key then - data.sortkey = key + -- local source = { + -- { tag = "one", internal = 1, value = "foo", page = 1 }, + -- { tag = "two", internal = 2, value = "bar", page = 2 }, + -- { tag = "three", internal = 3, value = "gnu", page = 3 }, + -- } + -- + -- local target = compresslist(source) + + local numberonly = R("09")^1 / tonumber + P(1)^0 + local f_missing = formatters["<%s>"] + + -- maybe also sparse (e.g. pages) + + -- a bit redundant access to datasets + + local function processcite(presets,specification) + -- + if specification then + setmetatableindex(specification,presets) + else + specification = presets + end + -- + local dataset = specification.dataset + local reference = specification.reference + local internal = specification.internal + local setup = specification.variant + local compress = specification.compress + local getter = specification.getter + local setter = specification.setter + local compressor = specification.compressor + -- + local reference = publications.parenttag(dataset,reference) + -- + local found, todo, list = findallused(dataset,reference,internal) + tobemarked = specification.markentry and todo + -- + if not found or #found == 0 then + report("nothing found for %a",reference) + elseif not setup then + report("invalid reference for %a",reference) + else + if trace_cite then + report("processing reference %a",reference) + end + local source = { } + local badkey = false + local luadata = datasets[dataset].luadata + for i=1,#found do + local entry = found[i] + local tag = entry.userdata.btxref + local ldata = luadata[tag] + local data = { + internal = entry.references.internal, + language = ldata.language, + dataset = dataset, + tag = tag, + -- luadata = ldata, + } + setter(data,dataset,tag,entry) + if compress and not compressor then + local sortkey = data.sortkey + if sortkey then + local key = lpegmatch(numberonly,sortkey) + if key then + data.sortkey = key + else + badkey = true + end else badkey = true end + end + if type(data) == "table" then + source[#source+1] = data else - badkey = true + report("error in cite rendering %a",setup or "?") end end - source[i] = data - end - if compress and not badkey then - local target = (compressor or compresslist)(source) - local function flush(i,state) - local entry = target[i] - local first = entry.first - if first then - local tags = entry.tags - if mark then - for i=1,#tags do - local tag = tags[i] - markcite(dataset,tag) - todo[tag] = false - end - end - ctx_btxsettag(tags[1]) - local internal = first.internal - if internal then - ctx_btxsetinternal(internal) - end - if not setter(first,entry.last) then - ctx_btxsetfirst(f_missing(first.tag)) - end + + local lefttext = specification.lefttext + local righttext = specification.righttext + local before = specification.before + local after = specification.after + + if lefttext and lefttext ~= "" then lefttext = settings_to_array(lefttext) end + if righttext and righttext ~= "" then righttext = settings_to_array(righttext) end + if before and before ~= "" then before = settings_to_array(before) end + if after and after ~= "" then after = settings_to_array(after) end + + -- local oneleft = lefttext and #lefttext == 1 and lefttext [1] + -- local oneright = righttext and #righttext == 1 and righttext[1] + -- + -- if not oneleft or not oneright then + -- compress = false -- very hard coded, or should we have compreess == auto? + -- end + + local function flush(i,n,entry,last) + local tag = entry.tag + local currentcitation = markcite(dataset,tag) + -- + ctx_btxstartcite() + ctx_btxsettag(tag) + ctx_btxsetcategory(entry.category or "unknown") + -- + -- if oneleft then + -- if i == 1 then + -- ctx_btxsetlefttext(oneleft) + -- end + -- elseif lefttext then + -- ctx_btxsetlefttext(lefttext[i] or "") + -- end + -- if oneright then + -- if i == n then + -- ctx_btxsetrighttext(oneright) + -- end + -- elseif righttext then + -- ctx_btxsetrighttext(righttext[i] or "") + -- end + -- if before then + -- ctx_btxsetbefore(before[i] or (#before == 1 and before[1]) or "") + -- end + -- if after then + -- ctx_btxsetafter(after[i] or (#after == 1 and after[1]) or "") + -- end + -- + if lefttext then local text = lefttext [i] ; if text and text ~= "" then ctx_btxsetlefttext (text) end end + if righttext then local text = righttext[i] ; if text and text ~= "" then ctx_btxsetrighttext(text) end end + if before then local text = before [i] ; if text and text ~= "" then ctx_btxsetbefore (text) end end + if after then local text = after [i] ; if text and text ~= "" then ctx_btxsetafter (text) end end + -- + ctx_btxsetbacklink(currentcitation) + local bl = listtocite[currentcitation] + if bl then + -- we refer to a coming list entry + ctx_btxsetinternal(bl.references.internal or "") else - local tag = entry.tag - if mark then - markcite(dataset,tag) - todo[tag] = false - end - ctx_btxsettag(tag) - local internal = entry.internal - if internal then - ctx_btxsetinternal(internal) - end - if not setter(entry) then - ctx_btxsetfirst(f_missing(tag)) - end + -- we refer to a previous list entry + ctx_btxsetinternal(entry.internal or "") end - ctx_btxsetconcat(state) - ctx_btxcitesetup(setup) - end - flushcollected(flush,#target) - else - local function flush(i,state) - local entry = source[i] - local tag = entry.tag - if mark then - markcite(dataset,tag) - todo[tag] = false + local language = entry.language + if language then + ctx_btxsetlanguage(language) end - ctx_btxsettag(tag) - local internal = entry.internal - if internal then - ctx_btxsetinternal(internal) + if not getter(entry,last) then + ctx_btxsetfirst("") -- (f_missing(tag)) end - ctx_btxsetconcat(state) - if not setter(entry) then - ctx_btxsetfirst(f_missing(entry.tag)) + ctx_btxsetconcat(concatstate(i,n)) + if trace_detail then + report("expanding cite setup %a",setup) end ctx_btxcitesetup(setup) + ctx_btxstopcite() + end + + if compress and not badkey then + local target = (compressor or compresslist)(source) + local nofcollected = #target + if nofcollected == 0 then + report("nothing found for %a",reference) + unknowncite(reference) + else + for i=1,nofcollected do + local entry = target[i] + local first = entry.first + if first then + flush(i,nofcollected,first,entry.last) + else + flush(i,nofcollected,entry) + end + end + end + else + local nofcollected = #source + if nofcollected == 0 then + unknowncite(reference) + else + for i=1,nofcollected do + flush(i,nofcollected,source[i]) + end + end end - flushcollected(flush,#source) + end + if tobemarked then + flushmarked(dataset,list) + btxflushmarked() -- here (could also be done in caller) end end - if mark then - flushmarked(dataset,list,todo) - end -end -local function simplegetter(first,last,field) - local value = first[field] - if value then - ctx_btxsetfirst(value) - if last then - ctx_btxsetsecond(last[field]) + -- + + local function simplegetter(first,last,field) + local value = first[field] + if value then + ctx_btxsetfirst(value) + if last then + ctx_btxsetsecond(last[field]) + end + return true end - return true end -end -local setters = setmetatableindex({},function(t,k) - local v = function(dataset,tag,entry,internal) - local value = getfield(dataset,tag,k) - return { - tag = tag, - internal = internal, - [k] = value, - sortkey = value, - sortfld = k, - } + local setters = setmetatableindex({},function(t,k) + local v = function(data,dataset,tag,entry) + local value = getcasted(dataset,tag,k) + data.value = value -- not really needed + data[k] = value + data.sortkey = value + data.sortfld = k + end + t[k] = v + return v + end) + + local getters = setmetatableindex({},function(t,k) + local v = function(first,last) + return simplegetter(first,last,k) + end + t[k] = v + return v + end) + + setmetatableindex(citevariants,function(t,k) + local p = defaultvariant or "default" + local v = rawget(t,p) + report_cite("variant %a falls back on %a setter and getter with setup %a",k,p,k) + t[k] = v + return v + end) + + function citevariants.default(presets) + local variant = presets.variant + processcite(presets,{ + setup = variant, + setter = setters[variant], + getter = getters[variant], + }) end - t[k] = v - return v -end) -local getters = setmetatableindex({},function(t,k) - local v = function(first,last) - return simplegetter(first,last,k) + -- category | type + + do + + local function setter(data,dataset,tag,entry) + data.category = getfield(dataset,tag,"category") + end + + local function getter(first,last) + return simplegetter(first,last,"category") + end + + function citevariants.category(presets) + processcite(presets,{ + -- variant = presets.variant or "serial", + setter = setter, + getter = getter, + }) + end + + function citevariants.type(presets) + processcite(presets,{ + -- variant = presets.variant or "type", + setter = setter, + getter = getter, + }) + end + end - t[k] = v - return v -end) --- default -setmetatableindex(citevariants,function(t,k) - local v = t.default - t[k] = v - return v -end) + -- entry (we could provide a generic one) -function citevariants.default(dataset,reference,mark,compress,variant,setup) - processcite(dataset,reference,mark,compress,setup or variant,setters[variant],getters[variant]) -end + do --- short + local function setter(data,dataset,tag,entry) + -- nothing + end -local function setter(dataset,tag,entry,internal) - return { - tag = tag, - internal = internal, - short = getfield(dataset,tag,"short"), - suffix = getfield(dataset,tag,"suffix"), - } -end + local function getter(first,last) -- last not used + ctx_btxsetfirst(first.tag) + end -local function getter(first,last) -- last not used - local short = first.short - if short then - local suffix = first.suffix - if suffix then - ctx_btxsetfirst(short .. suffix) - else - ctx_btxsetfirst(short) + function citevariants.entry(presets) + processcite(presets,{ + compress = false, + -- variant = presets.variant or "entry", + setter = setter, + getter = getter, + }) end - return true + end -end -function citevariants.short(dataset,reference,mark,compress) - processcite(dataset,reference,mark,false,"short",setter,getter) -end + -- short --- pages (no compress) + do -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - pages = getdetail(dataset,tag,"pages"), - } -end + local function setter(data,dataset,tag,entry) + data.short = getdetail(dataset,tag,"short") + data.suffix = getdetail(dataset,tag,"suffix") + end -local function getter(first,last) - local pages = first.pages - if pages then - if type(pages) == "table" then - ctx_btxsetfirst(pages[1]) - ctx_btxsetsecond(pages[2]) - else - ctx_btxsetfirst(pages) + local function getter(first,last) -- last not used + local short = first.short + if short then + local suffix = first.suffix + if suffix then + ctx_btxsetfirst(short .. suffix) + else + ctx_btxsetfirst(short) + end + return true + end + end + + function citevariants.short(presets) + processcite(presets,{ + compress = false, + -- variant = presets.variant or "short", + setter = setter, + getter = getter, + }) end - return true + end -end -function citevariants.page(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"page",setter,getter) -end + -- pages (no compress) --- num + do -local function setter(dataset,tag,entry,internal) - local text = entry.entries.text - return { - dataset = dataset, - tag = tag, - internal = internal, - num = text, - sortkey = text, - } -end + local function setter(data,dataset,tag,entry) + data.pages = getcasted(dataset,tag,"pages") + end -local function getter(first,last) - return simplegetter(first,last,"num") -end + local function getter(first,last) + local pages = first.pages + if pages then + if type(pages) == "table" then + ctx_btxsetfirst(pages[1]) + ctx_btxsetsecond(pages[2]) + else + ctx_btxsetfirst(pages) + end + return true + end + end -function citevariants.num(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"num",setter,getter) -end + function citevariants.page(presets) + processcite(presets,{ + -- variant = presets.variant or "page", + setter = setter, + getter = getter, + }) + end --- year - -local function setter(dataset,tag,entry,internal) - local year = getfield(dataset,tag,"year") - return { - dataset = dataset, - tag = tag, - internal = internal, - year = year, - sortkey = year, - sortfld = "year", - } -end + end -local function getter(first,last) - return simplegetter(first,last,"year") -end + -- num -function citevariants.year(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"year",setter,getter) -end + do --- index | serial + local function setter(data,dataset,tag,entry) + local entries = entry.entries + local text = entries and entries.text or "?" + data.num = text + data.sortkey = text + end -local function setter(dataset,tag,entry,internal) - local index = getfield(dataset,tag,"index") - return { - dataset = dataset, - tag = tag, - internal = internal, - index = index, - sortkey = index, - } -end + local function getter(first,last) + return simplegetter(first,last,"num") + end -local function getter(first,last) - return simplegetter(first,last,"index") -end + function citevariants.num(presets) + processcite(presets,{ + -- variant = presets.variant or "num", + setter = setter, + getter = getter, + }) + end -function citevariants.index(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"index",setter,getter) -end + end -function citevariants.serial(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"serial",setter,getter) -end + -- year --- category | type + do -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - category = getfield(dataset,tag,"category"), - } -end + local function setter(data,dataset,tag,entry) + local year = getfield (dataset,tag,"year") + local suffix = getdetail(dataset,tag,"suffix") + data.year = year + data.suffix = suffix + data.sortkey = tonumber(year) or 9999 + end -local function getter(first,last) - return simplegetter(first,last,"category") -end + local function getter(first,last) + return simplegetter(first,last,"year") + end -function citevariants.category(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"category",setter,getter) -end + function citevariants.year(presets) + processcite(presets,{ + -- variant = presets.variant or "year", + setter = setter, + getter = getter, + }) + end -function citevariants.type(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"type",setter,getter) -end + end --- key | tag + -- index | serial -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - } -end + do -local function getter(first,last) - ctx_btxsetfirst(first.tag) - return true -end + local function setter(data,dataset,tag,entry) + local index = getfield(dataset,tag,"index") + data.index = index + data.sortkey = index + end -function citevariants.key(dataset,reference,mark,compress) return - processcite(dataset,reference,mark,compress,"key",setter,getter) -end + local function getter(first,last) + return simplegetter(first,last,"index") + end -function citevariants.tag(dataset,reference,mark,compress) return - processcite(dataset,reference,mark,compress,"tag",setter,getter) -end + function citevariants.index(presets) + processcite(presets,{ + -- variant = presets.variant or "index", + setter = setter, + getter = getter, + }) + end --- author + function citevariants.serial(presets) + processcite(presets,{ + -- variant = presets.variant or "serial", + setter = setter, + getter = getter, + }) + end -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - } -end + end -local function getter(first,last) - ctx_btxsetfirst(first.author) -- todo: formatted - return true -end + -- key | tag -function citevariants.author(dataset,reference,mark,compress) - processcite(dataset,reference,mark,false,"author",setter,getter) -end + do --- todo : sort --- todo : choose between publications or commands namespace --- todo : use details.author --- todo : sort details.author --- (name, name and name) .. how names? how sorted? --- todo: we loop at the tex end .. why not here --- \cite[{hh,afo},kvm] - --- common - -local function authorcompressor(found,key) - local result = { } - local entries = { } - for i=1,#found do - local entry = found[i] - local author = entry.author - local aentries = entries[author] - if aentries then - aentries[#aentries+1] = entry - else - entries[author] = { entry } + local function setter(data,dataset,tag,entry) + -- nothing + end + + local function getter(first,last) + ctx_btxsetfirst(first.tag) + return true + end + + function citevariants.key(presets) + return processcite(presets,{ + variant = "key", + setter = setter, + getter = getter, + }) + end + + function citevariants.tag(presets) + return processcite(presets,{ + variant = "tag", + setter = setter, + getter = getter, + }) end + end - for i=1,#found do - local entry = found[i] - local author = entry.author - local aentries = entries[author] - if not aentries then - result[#result+1] = entry - elseif aentries == true then - -- already done - else - result[#result+1] = entry - entry.entries = aentries - entries[author] = true + + -- keyword + + do + + local function listof(list) + local size = type(list) == "table" and #list or 0 + if size > 0 then + return function() + for i=1,size do + ctx_btxsetfirst(list[i]) + ctx_btxsetconcat(concatstate(i,size)) + ctx_btxcitesetup("listelement") + end + return true + end + else + return "?" -- unknown + end + end + + local function setter(data,dataset,tag,entry) + data.keywords = getcasted(dataset,tag,"keywords") + end + + local function getter(first,last) + context(listof(first.keywords)) end + + function citevariants.keywords(presets) + return processcite(presets,{ + variant = "keywords", + setter = setter, + getter = getter, + }) + end + end - -- todo: add letters (should we then tag all?) - return result -end -local function authorconcat(target,key,setup) - local function flush(i,state) - local entry = target[i] - local first = entry.first - if first then - local internal = first.internal - if internal then - ctx_btxsetinternal(internal) - end - ctx_btxsetfirst(first[key] or f_missing(first.tag)) - local suffix = entry.suffix - local value = entry.last[key] + -- authors + + do + + local currentbtxciteauthor = function() + context.currentbtxciteauthor() + return true -- needed? + end + + local function authorcompressor(found) + local result = { } + local entries = { } + for i=1,#found do + local entry = found[i] + local author = entry.author + if author then + local aentries = entries[author] + if aentries then + aentries[#aentries+1] = entry + else + entries[author] = { entry } + end + end + end + -- beware: we usetables as hash so we get a cycle when inspecting (unless we start + -- hashing with strings) + for i=1,#found do + local entry = found[i] + local author = entry.author + if author then + local aentries = entries[author] + if not aentries then + result[#result+1] = entry + elseif aentries == true then + -- already done + else + result[#result+1] = entry + entry.entries = aentries + entries[author] = true + end + end + end + -- todo: add letters (should we then tag all?) + return result + end + + local function authorconcat(target,key,setup) + ctx_btxstartsubcite(setup) + local nofcollected = #target + if nofcollected == 0 then + unknowncite(tag) + else + for i=1,nofcollected do + local entry = target[i] + local first = entry.first + local tag = entry.tag + local currentcitation = markcite(entry.dataset,tag) + ctx_btxstartciteauthor() + ctx_btxsettag(tag) + ctx_btxsetbacklink(currentcitation) + local bl = listtocite[currentcitation] + ctx_btxsetinternal(bl and bl.references.internal or "") + if first then + ctx_btxsetfirst(first[key] or "") -- f_missing(first.tag)) + local suffix = entry.suffix + local value = entry.last[key] + if value then + ctx_btxsetsecond(value) + end + if suffix then + ctx_btxsetthird(suffix) + end + else + local suffix = entry.suffix + local value = entry[key] or "" -- f_missing(tag) + ctx_btxsetfirst(value) + if suffix then + ctx_btxsetthird(suffix) + end + end + ctx_btxsetconcat(concatstate(i,nofcollected)) + if trace_detail then + report("expanding %a cite setup %a","multiple author",setup) + end + ctx_btxsubcitesetup(setup) + ctx_btxstopciteauthor() + end + end + ctx_btxstopsubcite() + end + + local function authorsingle(entry,key,setup) + ctx_btxstartsubcite(setup) + ctx_btxstartciteauthor() + local tag = entry.tag + ctx_btxsettag(tag) + -- local currentcitation = markcite(entry.dataset,tag) + -- ctx_btxsetbacklink(currentcitation) + -- local bl = listtocite[currentcitation] + -- ctx_btxsetinternal(bl and bl.references.internal or "") + ctx_btxsetfirst(entry[key] or "") -- f_missing(tag) if suffix then - ctx_btxsetsecond(value .. converters.characters(suffix)) + ctx_btxsetthird(entry.suffix) + end + if trace_detail then + report("expanding %a cite setup %a","single author",setup) + end + ctx_btxcitesetup(setup) + ctx_btxstopciteauthor() + ctx_btxstopsubcite() + end + + local partialinteractive = false + + local function authorgetter(first,last,key,setup) -- only first + -- ctx_btxsetfirst(first.author) -- unformatted + -- ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) + if first.type == "author" then + ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) else - ctx_btxsetsecond(value) + ctx_btxsetfirst(first.author) -- unformatted end - else - local internal = entry.internal - if internal then - ctx_btxsetinternal(internal) + local entries = first.entries + -- alternatively we can use a concat with one ... so that we can only make the + -- year interactive, as with the concat + if partialinteractive and not entries then + entries = { first } end - local suffix = entry.suffix - local value = entry[key] or f_missing(entry.tag) - if suffix then - ctx_btxsetfirst(value .. converters.characters(suffix)) + if entries then + -- happens with year + local c = compresslist(entries) + local f = function() authorconcat(c,key,setup) return true end -- indeed return true? + ctx_btxsetcount(#c) + ctx_btxsetsecond(f) + elseif first then + -- happens with num + local f = function() authorsingle(first,key,setup) return true end -- indeed return true? + ctx_btxsetcount(0) + ctx_btxsetsecond(f) + end + return true + end + + -- author + + local function setter(data,dataset,tag,entry) + data.author, data.field, data.type = getcasted(dataset,tag,"author") + end + + local function getter(first,last,_,setup) + if first.type == "author" then + ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) else - ctx_btxsetfirst(value) + ctx_btxsetfirst(first.author) -- unformatted end + return true end - ctx_btxsetconcat(state) - ctx_btxcitesetup(setup) - end - ctx_btxstartsubcite(setup) - flushcollected(flush,#target) - ctx_btxstopsubcite() -end -local function authorsingle(entry,key,setup) - ctx_btxstartsubcite(setup) - local internal = entry.internal - if internal then - ctx_btxsetinternal(internal) - end - ctx_btxsetfirst(entry[key] or f_missing(entry.tag)) - ctx_btxcitesetup(setup) -- ?? - ctx_btxstopsubcite() -end + function citevariants.author(presets) + processcite(presets,{ + compress = false, + variant = "author", + setter = setter, + getter = getter, + }) + end -local function authorgetter(first,last,key,setup) -- only first - ctx_btxsetfirst(first.author) -- todo: reformat - local entries = first.entries - if entries then - local c = compresslist(entries) - ctx_btxsetsecond(function() authorconcat(c,key,setup) end) - else - ctx_btxsetsecond(function() authorsingle(first,key,setup) end) - end - return true -end + -- authornum --- authornum - -local function setter(dataset,tag,entry,internal) - local text = entry.entries.text - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - num = text, - sortkey = text and lpegmatch(numberonly,text) - } -end + local function setter(data,dataset,tag,entry) + local entries = entry.entries + local text = entries and entries.text or "?" + data.author, data.field, data.type = getcasted(dataset,tag,"author") + data.num = text + data.sortkey = text and lpegmatch(numberonly,text) + end -local function getter(first,last) - authorgetter(first,last,"num","author:num") - return true -end + local function getter(first,last) + authorgetter(first,last,"num","author:num") + return true + end -local function compressor(found) - return authorcompressor(found,"num") -end + function citevariants.authornum(presets) + processcite(presets,{ + variant = "authornum", + setter = setter, + getter = getter, + compressor = authorcompressor, + }) + end -function citevariants.authornum(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"authornum",setter,getter,compressor) -end + -- authoryear | authoryears --- authoryear | authoryears - -local function setter(dataset,tag,entry,internal) - local year = getfield(dataset,tag,"year") - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - year = year, - sortkey = year and lpegmatch(numberonly,year), - sortfld = "year", - } -end + local function setter(data,dataset,tag,entry) + data.author, data.field, data.type = getcasted(dataset,tag,"author") + local year = getfield (dataset,tag,"year") + local suffix = getdetail(dataset,tag,"suffix") + data.year = year + data.suffix = suffix + data.sortkey = tonumber(year) or 9999 + end -local function getter(first,last) - authorgetter(first,last,"year","author:year") - return true -end + local function getter(first,last) + authorgetter(first,last,"year","author:year") + return true + end -local function compressor(found) - return authorcompressor(found,"year") -end + function citevariants.authoryear(presets) + processcite(presets,{ + variant = "authoryear", + setter = setter, + getter = getter, + compressor = authorcompressor, + }) + end -function citevariants.authoryear(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"authoryear",setter,getter,compressor) -end + local function getter(first,last) + authorgetter(first,last,"year","author:years") + return true + end -local function getter(first,last) - authorgetter(first,last,"year","author:years") - return true -end + function citevariants.authoryears(presets) + processcite(presets,{ + variant = "authoryears", + setter = setter, + getter = getter, + compressor = authorcompressor, + }) + end + + end -function citevariants.authoryears(dataset,reference,mark,compress) - processcite(dataset,reference,mark,compress,"authoryears",setter,getter,compressor) end -- List variants -local listvariants = { } -publications.listvariants = listvariants +do -function commands.btxlistvariant(dataset,block,tag,variant,listindex) - local action = listvariants[variant] or listvariants.default - if action then - action(dataset,block,tag,variant,tonumber(listindex) or 0) + local listvariants = { } + publications.listvariants = listvariants + + local function btxlistvariant(dataset,block,tag,variant,listindex) + local action = listvariants[variant] or listvariants.default + if action then + action(dataset,block,tag,variant,tonumber(listindex) or 0) + end end -end -function listvariants.default(dataset,block,tag,variant) - context("?") -end + implement { + name = "btxlistvariant", + actions = btxlistvariant, + arguments = { "string", "string", "string", "string", "string" } -- not integer here + } --- function listvariants.num(dataset,block,tag,variant,listindex) --- local lst = f_listentry(dataset,block,tag) --- local ref = f_reference(dataset,block,tag) --- if trace_references then --- report_reference("list: %s",lst) --- end --- -- todo --- ctx_btxdirectlink(ref,listindex) -- a goto --- end + function listvariants.default(dataset,block,tag,variant) + ctx_btxsetfirst("?") + if trace_detail then + report("expanding %a list setup %a","default",variant) + end + ctx_btxlistsetup("default") + end -function listvariants.num(dataset,block,tag,variant,listindex) - context(listindex) -- a goto -end + function listvariants.num(dataset,block,tag,variant,listindex) + ctx_btxsetfirst(listindex) + if trace_detail then + report("expanding %a list setup %a","num",variant) + end + ctx_btxlistsetup(variant) + end + + listvariants[v_yes] = listvariants.num + listvariants.bib = listvariants.num -function listvariants.short(dataset,block,tag,variant,listindex) - local short = getdetail(dataset,tag,"short","short") - local suffix = getdetail(dataset,tag,"suffix","suffix") - if suffix then - context(short .. suffix) - elseif short then - context(short) + function listvariants.short(dataset,block,tag,variant,listindex) + local short = getdetail(dataset,tag,"short","short") + local suffix = getdetail(dataset,tag,"suffix","suffix") + if short then + ctx_btxsetfirst(short) + end + if suffix then + ctx_btxsetthird(suffix) + end + if trace_detail then + report("expanding %a list setup %a","short",variant) + end + ctx_btxlistsetup(variant) + end + + function listvariants.page(dataset,block,tag,variant,listindex) + local rendering = renderings[dataset] + local specification = rendering.list[listindex] + for i=3,#specification do + local backlink = tonumber(specification[i]) + if backlink then + local citation = citetolist[backlink] + if citation then + local references = citation.references + if references then + local internal = references.internal + local realpage = references.realpage + if internal and realpage then + ctx_btxsetconcat(i-2) + ctx_btxsetfirst(realpage) + ctx_btxsetsecond(backlink) + if trace_detail then + report("expanding %a list setup %a","page",variant) + end + ctx_btxlistsetup(variant) + end + end + end + end + end end + end diff --git a/Master/texmf-dist/tex/context/base/publ-ini.mkiv b/Master/texmf-dist/tex/context/base/publ-ini.mkiv index fb0d00d03c0..a4452e45193 100644 --- a/Master/texmf-dist/tex/context/base/publ-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/publ-ini.mkiv @@ -11,6 +11,11 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. + +% TODO: s! vs v! for default and neutral key/values +% todo: too many refs in list + +% todo: tagging % todo: we cannot use 'default' as this wipes metadata names (maybe no longer do that) % todo: \v!cite => \s!cite % todo: interface with (ml)bibtex (export -> call -> import) @@ -38,171 +43,229 @@ \writestatus{loading}{ConTeXt Publication Support / Initialization} \registerctxluafile{publ-dat}{1.001} +\registerctxluafile{publ-ini}{1.001} +\registerctxluafile{publ-sor}{1.001} \registerctxluafile{publ-aut}{1.001} \registerctxluafile{publ-usr}{1.001} -\registerctxluafile{publ-ini}{1.001} \registerctxluafile{publ-oth}{1.001} % this could become an option - -\doiffileelse{publ-fnd.lua} - {\registerctxluafile{publ-fnd}{1.001}} % new method (for the moment only local) - {} +\registerctxluafile{publ-fnd}{1.001} % new method (for the moment only local) +\registerctxluafile{publ-jrn}{1.001} +\registerctxluafile{publ-reg}{1.001} \unprotect \startcontextdefinitioncode -\def\s!btx {btx} -\def\s!cite {cite} -\def\s!list {list} -\def\v!btxcite{btxcite} -\def\v!btxlist{btxlist} - -% a dedicated construction mechanism - -\installcorenamespace {btxlist} +\def\s!btx {btx} + +\def\v!btxcite {btxcite} +\def\v!btxlist {btxlist} +\def\v!btxrendering {btxrendering} + +\def\s!btxset {btxset} +\def\s!btxref {btxref} +\def\s!btxint {btxint} +\def\s!btxbck {btxbck} +\def\s!btxltx {btxltx} +\def\s!btxrtx {btxrtx} +\def\s!btxatx {btxatx} +\def\s!btxbtx {btxbtx} +\def\s!btxspc {btxspc} +\def\s!btxlst {btxlst} + +\definelabelclass[btxlabel][2] + +% It is not that trivial to come up with a proper organization of setup +% and control commands for publications. This is because we have complex +% inline as well as extensive list rendering. The rules are partially +% driven by somewhat archaic bibtex specifications and evolving journal +% (or field) specific demands. The logic in the standards is often so +% complex that it looks like manual rendering is assumed. But, we want to +% automate the process as much as possible. +% +% Another complication is that in manuals we want to demonstrate different +% properties of the implementation and therefore we need a way to handle +% independent standards, databases, etc. This has resulted in the following +% organization: +% +% - general setup (rather minimal) +% - list setup (rendering) +% - cite setup +% - dataset setup +% +% The rendering is mostly driven by setups. In there we can call for fields +% in the database but also for virtual fields or combinations. -\installcommandhandler \??btxlist {btxlist} \??btxlist +% The main rendering style (standard driven). -\unexpanded\setvalue{\??constructioninitializer\v!btxlist}% - {\let\currentbtxlist \currentconstruction - \let\constructionparameter \btxlistparameter - \let\detokenizedconstructionparameter\detokenizedbtxlistparameter - \let\letconstructionparameter \letbtxlistparameter - \let\useconstructionstyleandcolor \usebtxliststyleandcolor - \let\setupcurrentconstruction \setupcurrentbtxlist} +%D We assume that a specification is global or used grouped. It doesn't make much sense +%D to split between cite and list here as it only complicates matters (timing) and is +%D not clear either. -\expandafter\let\csname\??constructionmainhandler \v!btxlist\expandafter\endcsname\csname\??constructionmainhandler \v!construction\endcsname -\expandafter\let\csname\??constructioncommandhandler\v!btxlist\expandafter\endcsname\csname\??constructioncommandhandler\v!construction\endcsname -\expandafter\let\csname\??constructiontexthandler \v!btxlist\expandafter\endcsname\csname\??constructiontexthandler \v!construction\endcsname +\let\currentbtxspecification\empty -\unexpanded\setvalue{\??constructioncommandhandler\v!btxlist}% - {\csname\??constructionstarthandler\v!construction\endcsname - \csname\??constructionstophandler \v!construction\endcsname - \endgroup} +\unexpanded\def\startbtxrenderingdefinitions[#1]% + {\unprotect + \pushmacro\currentbtxspecification + \edef\currentbtxspecification{#1}} -\unexpanded\setvalue{\??constructionstarthandler\v!btxlist}% - {\csname\??constructionstarthandler\v!construction\endcsname} +\unexpanded\def\stopbtxrenderingdefinitions + {\popmacro\currentbtxspecification + \protect} -\unexpanded\setvalue{\??constructionstophandler\v!btxlist}% - {\csname\??constructionstophandler\v!construction\endcsname - \endgroup} +\unexpanded\def\loadbtxdefinitionfile [#1]{\clf_btxloaddefinitionfile {#1}} +\unexpanded\def\loadbtxreplacementfile[#1]{\clf_btxloadreplacementfile{#1}} -\unexpanded\def\startbtxlistentry#1% - {\begingroup - \strc_constructions_initialize{#1}% - \csname\??constructionstarthandler\currentconstructionhandler\endcsname} +\unexpanded\def\publ_specification_push#1% + {\pushmacro\currentbtxspecification + \pushmacro\currentbtxspecificationfallback + \edef\currentbtxspecification{#1}% + \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}% + \ifx\currentbtxspecificationfallback\currentbtxspecification + \let\currentbtxspecificationfallback\empty + \fi + \clf_btxsetspecification{\currentbtxspecification}} + +\unexpanded\def\publ_specification_pop + {\popmacro\currentbtxspecificationfallback + \popmacro\currentbtxspecification + \clf_btxsetspecification{\currentbtxspecification}} + +\unexpanded\def\publ_specification_set#1% beware: is global + {\edef\currentbtxspecification{#1}% + \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}% + \ifx\currentbtxspecificationfallback\currentbtxspecification + \let\currentbtxspecificationfallback\empty + \fi + % has to be done explicitly: \loadbtxdefinitionfile[\currentbtxspecification]% + \ifx\currentbtxspecification\empty + % we set default at the end + \else + \clf_btxsetspecification{\currentbtxspecification}% + \fi}% todo: ,true == also load -\unexpanded\def\stopbtxlistentry - {\csname\??constructionstophandler\currentconstructionhandler\endcsname} +\installcorenamespace {btx} -\unexpanded\setvalue{\??constructiontexthandler\v!btxlist}% - {\begingroup - \useconstructionstyleandcolor\c!headstyle\c!headcolor % move to \currentconstructiontext - \the\everyconstruction - \goto - {\strut\constructionparameter\c!text\btx_list_reference_inject}% -% [\s!btx:list:\the\numexpr\locationcount+\plusone]% \nextinternalreference - [internal(\the\numexpr\locationcount+\plusone)]% \nextinternalreference - \endgroup} +\installswitchcommandhandler \??btx {btx} \??btx -\unexpanded\def\strc_constructions_initialize#1% class instance - {\edef\currentconstruction{#1}% - \let\currentconstructionlistentry\!!zerocount - \expandafter\let\expandafter\currentconstructionmain \csname\??constructionmain \currentconstruction\endcsname - \expandafter\let\expandafter\currentconstructionlevel \csname\??constructionlevel\currentconstruction\endcsname - \expandafter\let\expandafter\currentconstructionhandler\csname\??constructionclass\currentconstruction\endcsname - \csname\??constructioninitializer\currentconstructionhandler\endcsname} +\appendtoks + \ifnum\btxsetupmode=\doingrootsetuproot + \publ_specification_set{\btxparameter\c!specification}% + \else\ifnum\btxsetupmode=\doingrootsetupnamed + \publ_specification_set{\btxparameter\c!specification}% + \fi\fi +\to \everysetupbtx \appendtoks - % \ifx\currentbtxlistparent\empty - % \defineconstruction[\currentbtxlist][\currentbtxlistparent][\s!handler=\v!btxlist,\c!level=1]% - % \else - % \defineconstruction[\currentbtxlist][\s!handler=\v!btxlist,\c!level=1]% - % \fi - \ifx\currentbtxlistparent\empty - \letvalue{\??constructionmain\currentbtxlist}\currentbtxlist - \else - \letvalue{\??constructionmain\currentbtxlist}\currentbtxlistparent + \ifnum\btxsetupmode=\doingrootsetuproot + \edef\currentbtxdataset{\clf_btxsetdataset{\btxparameter\c!dataset}{\currentbtxdataset}}% \fi - \setevalue{\??constructionlevel\currentbtxlist}{\number\btxlistparameter\c!level}% - \setevalue{\??constructionclass\currentbtxlist}{\btxlistparameter\s!handler}% -\to \everydefinebtxlist - -\setupbtxlist - [\s!handler=\v!btxlist, - \c!level=1] - -\setupbtxlist - [\c!alternative=\v!left, - \c!headstyle=, - \c!titlestyle=, - %\c!style=, - %\c!color=, - %\c!headcolor=, - %\c!titlecolor=, - \c!width=4\emwidth, - \c!distance=\emwidth, - %\c!titledistance=.5\emwidth, - %\c!hang=, - %\c!sample=, - %\c!align=, - %\c!headalign=, - \c!margin=\v!no, - \c!before=\blank, - \c!inbetween=\blank, - \c!after=\blank, - %\c!indentnext=\v!yes, - %\c!indenting=\v!never, - %\c!titleleft=(, - %\c!titleright=), - %\c!closesymbol=, - %\c!closecommand=\wordright, - \c!display=\v!yes, - \c!command=, - %\c!titlecommand=, - %\c!expansion=\v!no, - %\c!xmlsetup=, - %\s!catcodes=, - %\c!title=\v!yes, - %\c!text=, - ] +\to \everysetupbtx + +\appendtoks + \publ_specification_set{\btxparameter\c!specification}% +\to \everyjob + +\unexpanded\def\startusingbtxspecification[#1]% + {\publ_specification_push{#1}} + +\let\stopusingbtxspecification\publ_specification_pop + +% \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth] +% \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth,margin=2em] % useless +% \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth] +% \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth,margin=2em] % here starts the bib stuff \installcorenamespace {btxdataset} -\installcorenamespace {btxlistvariant} -\installcorenamespace {btxcitevariant} \installcorenamespace {btxrendering} +\installcorenamespace {btxregister} \installcorenamespace {btxcommand} -\installcorenamespace {btxnumbering} - -\installcommandhandler \??btxdataset {btxdataset} \??btxdataset -\installcommandhandler \??btxlistvariant {btxlistvariant} \??btxlistvariant -\installcommandhandler \??btxcitevariant {btxcitevariant} \??btxcitevariant -\installcommandhandler \??btxrendering {btxrendering} \??btxrendering +\installcorenamespace {btxrenderingdefinition} + +\installcommandhandler \??btxdataset {btxdataset} \??btxdataset +\installcommandhandler \??btxregister {btxregister} \??btxregister +\installcommandhandler \??btxrendering {btxrendering} \??btxrendering + +\let\currentbtxcitealternative\empty + +\let\currentbtxspecificationfallback\empty + +\unexpanded\def\setbtxparameterset#1#2% + {\edef\currentbtx + {\ifcsname\??btx\currentbtxspecification:#1:#2:\s!parent\endcsname + \currentbtxspecification:% + \else\ifx\currentbtxspecificationfallback\empty + \else\ifcsname\??btx\currentbtxspecificationfallback:#1:#2:\s!parent\endcsname + \currentbtxspecificationfallback:% + \fi\fi\fi#1:#2}} + +\unexpanded\def\setbtxparametersetroot#1% + {\edef\currentbtx + {\ifcsname\??btx\currentbtxspecification:#1:\s!parent\endcsname + \currentbtxspecification:#1% + \else\ifx\currentbtxspecificationfallback\empty + \else\ifcsname\??btx\currentbtxspecificationfallback:#1:\s!parent\endcsname + \currentbtxspecificationfallback:#1% + \fi\fi\fi}} + +\unexpanded\def\setbtxrendering + {\edef\currentbtxrendering + {\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname + \currentbtxspecification + \else\ifx\currentbtxspecificationfallback\empty + \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname + \currentbtxspecificationfallback + \fi\fi\fi}} + +\unexpanded\def\setbtxlist % maybe simplify this one, always list=rendering? + {\edef\currentbtxlist + {\ifcsname\??btx\currentbtxrendering:\s!parent\endcsname + \currentbtxrendering + \else\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname + \currentbtxspecification + \else\ifx\currentbtxspecificationfallback\empty + \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname + \currentbtxspecificationfallback + \fi\fi\fi\fi}% + \edef\currentlist{\s!btx:\currentbtxlist}} \unexpanded\def\usebtxdataset - {\dodoubleargument\publ_use_dataset} + {\begingroup + \dotripleempty\publ_use_dataset} -\def\publ_use_dataset[#1][#2]% - {\ifsecondargument - \ctxcommand{usebtxdataset("#1","#2")}% - \else - \ctxcommand{usebtxdataset("\v!standard","#1")}% - \fi} +\def\publ_use_dataset[#1][#2][#3]% + {\getdummyparameters[\c!specification=\currentbtxspecification,#3]% + \ifsecondargument + \clf_btxusedataset + specification {\dummyparameter\c!specification}% + dataset {#1}% + filename {#2}% + \relax + \else\iffirstargument + \clf_btxusedataset + specification {\dummyparameter\c!specification}% + dataset {\v!default}% + filename {#1}% + \relax + \fi\fi + \endgroup} \definebtxdataset - [\v!standard] + [\v!default] +% [\c!language=] % nothing set so use current % \usebtxdataset -% [standard] +% [default] % [mybibs.bib] +\let\startpublication\relax +\let\stoppublication \relax + \unexpanded\def\startpublication {\dodoubleempty\publ_set_publication} -\let\stoppublication\relax - \def\publ_set_publication[#1][#2]% {\begingroup \catcode\commentasciicode\othercatcode @@ -215,15 +278,15 @@ \fi\fi{#1}{#2}} \def\publ_set_publication_default#1#2% - {\publ_set_publication_indeed\v!standard{#1}} + {\publ_set_publication_indeed\v!default{#1}} \def\publ_set_publication_checked#1#2% - {\doifassignmentelse{#1} - {\publ_set_publication_indeed\v!standard{#1}} + {\doifelseassignment{#1} + {\publ_set_publication_indeed\v!default{#1}} {\publ_set_publication_indeed{#1}{}}} \def\publ_set_publication_indeed#1#2#3\stoppublication - {\ctxcommand{addbtxentry("#1",\!!bs#2\!!es,\!!bs\detokenize{#3}\!!es)}% + {\clf_btxaddentry{#1}{#2}{\detokenize{#3}}% \endgroup \ignorespaces} @@ -259,29 +322,45 @@ \unexpanded\def\definebtxcommand#1% {body} #1..#n{body} {\setuvalue{\??btxcommand\strippedcsname#1}}% +% tracing + +\installtextracker + {publications.crosslinks} + {\let\btx_trace_list_cross\strc_references_tracer} + {\let\btx_trace_list_cross\gobbletwoarguments} + +\let\btx_trace_list_cross\gobbletwoarguments + % access \let\currentbtxtag \empty -\let\currentbtxdataset\v!standard +\let\currentbtxdataset\v!default -\unexpanded\def\setbtxdataset[#1]% - {\edef\currentbtxdataset{\ctxcommand{setbtxdataset("#1")}}} - -\unexpanded\def\setbtxentry[#1]% - {\edef\currentbtxtag{\ctxcommand{setbtxentry("\currentbtxdataset","#1")}}} +\unexpanded\def\setbtxentry[#1]% or maybe btxsetentry + {\edef\currentbtxtag{\clf_btxsetentry{\currentbtxdataset}{#1}}} % \let\btxsetdataset\setbtxdataset % \let\btxsetentry \setbtxentry -\def\btxfield #1{\ctxcommand{btxfield("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdetail #1{\ctxcommand{btxdetail("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxflush #1{\ctxcommand{btxflush("\currentbtxdataset","\currentbtxtag","#1")}} -%def\btxrendering#1{\ctxcommand{btxrendering("\currentbtxdataset","\currentbtxtag","#1","\btxrenderingparameter\c!interaction")}} -\def\btxdoifelse #1{\ctxcommand{btxdoifelse("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdoif #1{\ctxcommand{btxdoif("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdoifnot #1{\ctxcommand{btxdoifnot("\currentbtxdataset","\currentbtxtag","#1")}} - -\let\btxsetup \directsetup +% todo: no need for the currents as we can keep them at the lua end so we will have +% +% \btxfield : current +% \btxspecificfield : dataset,tag,key + +\def\btxfield #1{\clf_btxfield {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxdetail #1{\clf_btxdetail {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxflush #1{\clf_btxflush {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxdirect #1{\clf_btxdirect {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxfieldname #1{\clf_btxfieldname {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxfieldtype #1{\clf_btxfieldtype {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxfoundname #1{\clf_btxfoundname {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxfoundtype #1{\clf_btxfoundtype {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxauthorfield#1{\clf_btxauthorfield \currentbtxauthorindex{#1}} +\def\btxdoifelse #1{\clf_btxdoifelse {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxdoif #1{\clf_btxdoif {\currentbtxdataset}{\currentbtxtag}{#1}} +\def\btxdoifnot #1{\clf_btxdoifnot {\currentbtxdataset}{\currentbtxtag}{#1}} + +\let\btxsetup\fastsetup %D How complex will we go? Can we assume that e.g. an apa style will not be mixed %D with another one? I think this assumption is okay. For manuals we might want to @@ -289,93 +368,280 @@ %D Rendering. -\unexpanded\def\btxspace {\removeunwantedspaces\space} -\unexpanded\def\btxperiod {\removeunwantedspaces.\space} -\unexpanded\def\btxcomma {\removeunwantedspaces,\space} -\unexpanded\def\btxlparent {\removeunwantedspaces\space(} -\unexpanded\def\btxrparent {\removeunwantedspaces)\space} -\unexpanded\def\btxlbracket{\removeunwantedspaces\space[} -\unexpanded\def\btxrbracket{\removeunwantedspaces]\space} +\unexpanded\def\btxspace {\removeunwantedspaces\space} +\unexpanded\def\btxnobreakspace {\removeunwantedspaces\nobreakspace} % these two are +\unexpanded\def\btxnbsp {\removeunwantedspaces\nbsp} % the same anyway +\unexpanded\def\btxperiod {\removeunwantedspaces.\space} +\unexpanded\def\btxcomma {\removeunwantedspaces,\space} +\unexpanded\def\btxcolon {\removeunwantedspaces:\space} +\unexpanded\def\btxsemicolon {\removeunwantedspaces;\space} +\unexpanded\def\btxlparent {\removeunwantedspaces\space(} % obsolete +\unexpanded\def\btxrparent {\removeunwantedspaces)\space} % obsolete +\unexpanded\def\btxleftparenthesis {\removeunwantedspaces\space(} +\unexpanded\def\btxrightparenthesis {\removeunwantedspaces)\space} +\unexpanded\def\btxrightparenthesisperiod{\removeunwantedspaces).\space} +\unexpanded\def\btxrightparenthesiscomma {\removeunwantedspaces),\space} +\unexpanded\def\btxleftbracket {\removeunwantedspaces\space[} +\unexpanded\def\btxrightbracket {\removeunwantedspaces]\space} +\unexpanded\def\btxrightbracketperiod {\removeunwantedspaces].\space} +\unexpanded\def\btxrightbracketcomma {\removeunwantedspaces],\space} + +%D Variables: + +\let\currentbtxbacklink \empty \unexpanded\def\btxsetbacklink {\def\currentbtxbacklink} +\let\currentbtxbacktrace \empty \unexpanded\def\btxsetbacktrace {\def\currentbtxbacktrace} +\let\currentbtxcategory \empty \unexpanded\def\btxsetcategory {\def\currentbtxcategory} +\let\currentbtxcombis \empty \unexpanded\def\btxsetcombis {\def\currentbtxcombis} +\let\currentbtxdataset \empty \unexpanded\def\btxsetdataset {\def\currentbtxdataset} +\let\currentbtxfirst \empty \unexpanded\def\btxsetfirst {\def\currentbtxfirst} +\let\currentbtxsecond \empty \unexpanded\def\btxsetsecond {\def\currentbtxsecond} +\let\currentbtxthird \empty \unexpanded\def\btxsetthird {\def\currentbtxthird} +\let\currentbtxinternal \empty \unexpanded\def\btxsetinternal {\def\currentbtxinternal} +\let\currentbtxlefttext \empty \unexpanded\def\btxsetlefttext {\def\currentbtxlefttext} +\let\currentbtxrighttext \empty \unexpanded\def\btxsetrighttext {\def\currentbtxrighttext} +\let\currentbtxbefore \empty \unexpanded\def\btxsetbefore {\def\currentbtxbefore} +\let\currentbtxafter \empty \unexpanded\def\btxsetafter {\def\currentbtxafter} +\let\currentbtxlanguage \empty \unexpanded\def\btxsetlanguage {\def\currentbtxlanguage} +\let\currentbtxtag \empty \unexpanded\def\btxsettag {\def\currentbtxtag} +\let\currentbtxnumber \empty \unexpanded\def\btxsetnumber {\def\currentbtxnumber} +\let\currentbtxauthorvariant\v!normal \unexpanded\def\btxsetauthorvariant{\def\currentbtxauthorvariant} + +\let\currentbtxfirstnames \empty \unexpanded\def\btxsetfirstnames{\let\currentbtxfirstnames\currentbtxfirstnames_indeed} +\let\currentbtxinitials \empty \unexpanded\def\btxsetinitials {\let\currentbtxinitials \currentbtxinitials_indeed } +\let\currentbtxjuniors \empty \unexpanded\def\btxsetjuniors {\let\currentbtxjuniors \currentbtxjuniors_indeed } +\let\currentbtxsurnames \empty \unexpanded\def\btxsetsurnames {\let\currentbtxsurnames \currentbtxsurnames_indeed } +\let\currentbtxvons \empty \unexpanded\def\btxsetvons {\let\currentbtxvons \currentbtxvons_indeed } + +\newconstant\currentbtxoverflow \unexpanded\def\btxsetoverflow #1{\currentbtxoverflow #1\relax} +\newconstant\currentbtxconcat \unexpanded\def\btxsetconcat #1{\currentbtxconcat #1\relax} +\newconstant\currentbtxcount \unexpanded\def\btxsetcount #1{\currentbtxcount #1\relax} +\newconstant\currentbtxauthorindex %unexpanded\def\btxsetauthorindex#1{\currentbtxauthorindex#1\relax} % passed directly +\newconstant\currentbtxauthorcount %unexpanded\def\btxsetauthorcount#1{\currentbtxauthorcount#1\relax} % passed directly +\newconstant\currentbtxauthorstate \unexpanded\def\btxsetauthorstate#1{\currentbtxauthorstate#1\relax} + +\unexpanded\def\currentbtxfirstnames_indeed{\clf_btxcurrentfirstnames\numexpr\currentbtxauthorindex\relax} +\unexpanded\def\currentbtxinitials_indeed {\clf_btxcurrentinitials \numexpr\currentbtxauthorindex\relax} +\unexpanded\def\currentbtxjuniors_indeed {\clf_btxcurrentjuniors \numexpr\currentbtxauthorindex\relax} +\unexpanded\def\currentbtxsurnames_indeed {\clf_btxcurrentsurnames \numexpr\currentbtxauthorindex\relax} +\unexpanded\def\currentbtxvons_indeed {\clf_btxcurrentvons \numexpr\currentbtxauthorindex\relax} + +\def\currentbtxauthorvariant{normal} + +\unexpanded\def\btxlistreset + {\let\currentbtxcombis \empty + \let\currentbtxcategory \empty + \let\currentbtxinternal \empty + \let\currentbtxlefttext \empty + \let\currentbtxrighttext\empty + \let\currentbtxbefore \empty + \let\currentbtxafter \empty + \let\currentbtxbacklink \empty + \let\currentbtxbacktrace\empty + \let\currentbtxlanguage \empty + \let\currentbtxtag \empty + \let\currentbtxnumber \empty + \let\currentbtxdataset \empty} + +\unexpanded\def\btxcitereset % check for less .. not all resets needed + {\let \currentbtxfirst \empty + \let \currentbtxsecond \empty + \let \currentbtxinternal \empty + \let \currentbtxlefttext \empty + \let \currentbtxrighttext \empty + \let \currentbtxbefore \empty + \let \currentbtxafter \empty + \let \currentbtxbacklink \empty + \let \currentbtxbacktrace \empty % not used here + \let \currentbtxlanguage \empty + \let \currentbtxdataset \empty + \let \currentbtxtag \empty + \let \currentbtxnumber \empty + \setconstant\currentbtxoverflow \zerocount + \setconstant\currentbtxconcat \zerocount + \setconstant\currentbtxcount \zerocount} + +%D Language: + +\def\mainbtxlanguage{\currentmainlanguage} + +\unexpanded\def\btx_check_language + {\let\mainbtxlanguage\currentlanguage + \ifx\currentbtxlanguage\empty + \let\currentbtxlanguage\currentlanguage + \else + \btx_check_language_indeed + \fi} -%D Rendering lists and citations. +\unexpanded\def\btx_check_language_indeed + {\edef\currentbtxlanguage{\reallanguagetag\currentbtxlanguage}% + \ifx\currentbtxlanguage\empty + \let\currentbtxlanguage\currentlanguage + \else\ifx\currentbtxlanguage\currentlanguage\else + \setcurrentlanguage\currentmainlanguage\currentbtxlanguage + \fi\fi} + +%D Tracing -\newconditional\c_btx_trace +\newconditional\c_btx_trace % not used yet \installtextracker {btxrendering} {\settrue \c_btx_trace} {\setfalse\c_btx_trace} -\unexpanded\def\startbtxrendering - {\begingroup - \dosingleempty\btx_start_rendering} - -\def\btx_start_rendering[#1]% - {\edef\currentbtxrendering{#1}} - -\unexpanded\def\stopbtxrendering - {\endgroup} +%D Rendering lists and citations. \unexpanded\def\btxtodo#1% {[#1]} -%D Specific rendering definitions (like apa): - -\unexpanded\def\loadbtxdefinitionfile[#1]% - {\ctxcommand{loadbtxdefinitionfile("#1")}} - %D Lists: \newdimen\d_publ_number_width %newdimen\d_publ_number_distance \ifdefined\btxblock \else \newcount\btxblock \fi \btxblock\plusone -\ifdefined\btxlistcounter \else \newcount\btxlistcounter \fi -\ifdefined\btxcitecounter \else \newcount\btxcitecounter \fi +\ifdefined\btxcitecounter \else \newcount\btxcitecounter \fi % maybe pass this to lua \newtoks \everysetupbtxlistplacement % name will change \newtoks \everysetupbtxciteplacement % name will change -% \def\publ_list_processor % bibref -> btx (old method, keep as reference) -% {\ctxcommand{btxaddtolist("\currentbtxrendering",\currentlistindex,"btxref")}} - \definelist % only used for selecting [\s!btx] \setuplist - [\s!btx]% - [\c!state=\v!start]% + [\s!btx] + [\c!prefixstopper=:, + \c!state=\v!start, + \c!alternative=\v!paragraph, + \c!before=\blank, + \c!after=\blank, + \c!width=\v!auto, + \c!distance=\emwidth] + +\unexpanded\def\setupbtxlist + {\dodoubleempty\publ_setup_list} + +\unexpanded\def\publ_setup_list[#1][#2]% + {\ifsecondargument + \setuplist[\s!btx:#1][#2]% + \else\iffirstargument + \setuplist[\s!btx][#1]% + \fi\fi} \appendtoks \ifx\currentbtxrenderingparent\empty - \definebtxlist - [\currentbtxrendering]% + \definelist + [\s!btx:\currentbtxrendering]% + [\s!btx]% + \else\ifx\currentbtxrenderingparent\s!btx + \definelist + [\s!btx:\currentbtxrendering]% + [\s!btx]% \else - \definebtxlist - [\currentbtxrendering]% - [\currentbtxrenderingparent]% - \fi + \definelist + [\s!btx:\currentbtxrendering]% + [\s!btx:\currentbtxrenderingparent]% + \fi\fi \to \everydefinebtxrendering -\let\currentbtxcombis\empty % goes into the setups +\newconditional\c_btx_list_texts + +\appendtoks + \doifelse{\btxrenderingparameter\c!textstate}\v!start + \settrue\setfalse\c_btx_list_texts +\to \everysetupbtxlistplacement + +% page stuff (for thomas) + +\let\currentbtxfirstpage \empty \unexpanded\def\btxsetfirstpage #1{\def\currentbtxfirstpage{\btx_page_number{#1}}} +\let\currentbtxlastpage \empty \unexpanded\def\btxsetlastpage #1{\def\currentbtxlastpage {\btx_page_number{#1}}} +\let\currentbtxfirstinternal\empty \unexpanded\def\btxsetfirstinternal {\def\currentbtxfirstinternal} +\let\currentbtxlastinternal \empty \unexpanded\def\btxsetlastinternal {\def\currentbtxlastinternal} + +\unexpanded\def\btx_page_number#1% + {\def\currentlistindex{#1}% + \structurelistpagenumber} + +\unexpanded\def\btxpagereset + {\let \currentbtxfirstpage \empty + \let \currentbtxlastpage \empty + \let \currentbtxfirstinternal\empty + \let \currentbtxlastinternal \empty + \setconstant\currentbtxoverflow \zerocount + \setconstant\currentbtxconcat \zerocount + \setconstant\currentbtxcount \zerocount} + +\newconditional\c_btx_list_pages + +\appendtoks + \doifelse{\btxrenderingparameter\c!pagestate}\v!start + \settrue\setfalse\c_btx_list_pages +\to \everysetupbtxlistplacement + +\unexpanded\def\btx_entry_inject_pages % for the moment only normal + {\dontleavehmode + \begingroup + \setbtxlist % probably already set + \btxpagereset + \setbtxparameterset\s!page\s!list + \btxparameter\c!command + {\usebtxstyleandcolor\c!style\c!color + \btxparameter\c!pageleft + \clf_btxflushpages{\currentbtxdataset}{\currentbtxtag}% + \btxparameter\c!pageright}% + \endgroup} + +\unexpanded\def\btxpagesetup + {\btxsetuptype\plusfour + \fastbtxsetup\s!page\s!list + \btxpagereset} + +% end of page stuff \unexpanded\def\btx_entry_inject {\begingroup \edef\currentbtxcategory{\btxfield{category}}% \ignorespaces - \directsetup{\s!btx:\currentbtxalternative:\currentbtxcategory}% + \ifconditional\c_btx_list_texts + \currentbtxbefore + \fi + \begingroup + \usebtxstyleandcolor\c!style\c!color + \ignorespaces + \btxsetuptype\plusthree + \fastbtxsetup\s!list\currentbtxcategory \removeunwantedspaces + \endgroup + \ifconditional\c_btx_list_pages + \btx_entry_inject_pages + \fi \ifx\currentbtxcombis\empty \else \btxrenderingparameter\c!separator \processcommacommand[\currentbtxcombis]\btx_entry_inject_combi \fi + \ifconditional\c_btx_list_texts + \currentbtxafter + \fi \endgroup} +\unexpanded\def\btxshowentryinline + {\dodoubleempty\btx_entry_show_inline} + +\unexpanded\def\btx_entry_show_inline[#1][#2]% + {\ifsecondargument + \ctxcommand{showbtxentry("#1","#2")} + \else\iffirstargument + \ctxcommand{showbtxentry("\currentbtxdataset","#1")} + \else + \ctxcommand{showbtxentry("\currentbtxdataset","\currentbtxtag")} + \fi\fi} + \def\btx_entry_inject_combi#1% {\begingroup \def\currentbtxtag{#1}% \ignorespaces - \directsetup{\s!btx:\currentbtxalternative:\currentbtxcategory}% + \btxsetuptype\plusthree + \fastbtxsetup\s!list\currentbtxcategory \removeunwantedspaces \endgroup} @@ -385,183 +651,329 @@ \let\completelistofpublications\completebtxrendering \let\placelistofpublications \placebtxrendering -\def\publ_place_list_check_criterium - {\edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}% \v!cite will become \s!cite - \ifx\currentbtxcriterium\empty - \let\currentbtxcriterium\v!previous - \else\ifx\currentbtxcriterium\v!cite - \let\currentbtxcriterium\v!here - \fi\fi} +\newtoks\everybtxlistrendering -\def\publ_place_list_complete[#1][#2]% title might become obsolete, just headtext - {\begingroup - \edef\currentbtxrendering{#1}% - \setupcurrentbtxrendering[#2]% - \let\currentlist\s!btx - \let\currentbtxlist\currentbtxrendering - \publ_place_list_check_criterium - \edef\currentbtxrenderingtitle{\btxrenderingparameter\c!title}% - \ifx\currentbtxrenderingtitle\empty - \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\headtext{\currentbtxrendering}}]}% - \else - \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\currentbtxrenderingtitle}]}% - \fi - \publ_place_list_indeed - \stopnamedsection - \endgroup} +\appendtoks + \setbtxlist + % + \edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}% \v!cite will become \s!cite + \ifx\currentbtxcriterium\empty + \let\currentbtxcriterium\v!previous + \else\ifx\currentbtxcriterium\v!cite + \let\currentbtxcriterium\v!here + \fi\fi + % + \iflocation + \letinteractionparameter\c!style\empty + \fi +\to \everybtxlistrendering -\def\publ_place_list_standard[#1][#2]% - {\begingroup - \edef\currentbtxrendering{#1}% - \setupcurrentbtxrendering[#2]% - \let\currentlist\s!btx - \let\currentbtxlist\currentbtxrendering - \publ_place_list_check_criterium - \publ_place_list_indeed - \endgroup} +\def\nofbtxlistentries {0} +\def\currentbtxlistentry{0} +\def\currentbtxlistindex{0} % only for internal use (points back to big list) -\newconditional\c_publ_place_all -\newconditional\c_publ_place_register % to be interfaced -\newconditional\c_publ_place_check % to be interfaced +\newconditional\c_publ_prefixed -\appendtoks - \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway - \settrue\c_publ_place_all +\unexpanded\def\btxsetnoflistentries #1{\edef\nofbtxlistentries {#1}} +\unexpanded\def\btxsetcurrentlistentry#1{\edef\currentbtxlistentry{#1}} +\unexpanded\def\btxsetcurrentlistindex#1{\edef\currentbtxlistindex{#1}} + +\unexpanded\def\btxdoifelsesameaspreviouschecked#1#2% #1 == always | doublesided + {\clf_btxdoifelsesameasprevious + {\currentbtxdataset}% + \currentbtxlistentry% + {#2}% + \c_btx_list_reference + {#1}} + +\unexpanded\def\btxdoifelsesameasprevious + {\btxdoifelsesameaspreviouschecked\v!doublesided} + +\let\btxdoifsameaspreviouscheckedelse\btxdoifelsesameaspreviouschecked +\let\btxdoifsameaspreviouselse \btxdoifelsesameasprevious + +\def\publ_place_list_indeed#1[#2][#3]% + {\begingroup + \ifsecondargument + % [rendering] [settings] + \edef\currentbtxrendering{#2}% + \setupcurrentbtxrendering[#3]% + \edef\p_specification{\btxrenderingparameter\c!specification}% + \ifx\p_specification\empty\else + \let\currentbtxspecification\p_specification + \fi + \else\iffirstargument + \doifelseassignment{#2} + {% [settings] + \let\currentbtxrendering\currentbtxspecification + \setupcurrentbtxrendering[#2]% + \edef\p_specification{\btxrenderingparameter\c!specification}% + \ifx\p_specification\empty\else + \let\currentbtxspecification\p_specification + \let\currentbtxrendering\currentbtxspecification % tricky + \fi} + {\edef\currentbtxrendering{#2}% + \edef\p_specification{\btxrenderingparameter\c!specification}% + \ifx\p_specification\empty\else + \let\currentbtxspecification\p_specification + \fi}% \else - \setfalse\c_publ_place_all + \let\currentbtxrendering\currentbtxspecification + \fi\fi + \setbtxparameterset\currentbtxspecification\s!list + \the\everybtxlistrendering + \ifconditional#1\relax + \edef\currentbtxrenderingtitle{\btxrenderingparameter\c!title}% + \ifx\currentbtxrenderingtitle\empty + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\headtext{\currentbtxrendering}}]}% + \else + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\currentbtxrenderingtitle}]}% + \fi \fi -\to \everysetupbtxlistplacement - -\def\publ_place_list_indeed - {\startbtxrendering[\currentbtxrendering]% - \directsetup{\btxrenderingparameter\c!setups}% - % \determinelistcharacteristics[\currentbtxrendering]% - \edef\currentbtxalternative{\btxrenderingparameter\c!alternative}% - \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}% - \let\currentlist\s!btx - \let\currentbtxlist\currentbtxrendering - \the\everysetupbtxlistplacement - \forgetall - \ctxcommand{btxsetlistmethod("\currentbtxdataset","\btxrenderingparameter\c!method")}% + \ifx\currentbtxrendering\empty + \setbtxrendering % hm + \fi + \btxrenderingparameter\c!before + \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}% + \uselanguageparameter\btxdatasetparameter % new + \setbtxlist + \the\everystructurelist + \the\everysetupbtxlistplacement + \forgetall + % why not pass this with collect .. todo + % here we just collect items + \clf_btxcollectlistentries + names {\s!btx}% + criterium {\currentbtxcriterium}% + reference {\btxrenderingparameter\c!reference}% + method {\btxrenderingparameter\c!method}% + dataset {\currentbtxdataset}% + keyword {\btxrenderingparameter\c!keyword}% + sorttype {\btxrenderingparameter\c!sorttype}% + repeated {\btxrenderingparameter\c!repeat}% + ignored {\btxrenderingparameter\c!ignore}% + group {\btxrenderingparameter\c!group}% + \relax + \ifnum\nofbtxlistentries>\zerocount \startpacked[\v!blank]% - % here we just collect items - \ctxcommand{btxcollectlistentries { - names = "btx", - criterium = "\currentbtxcriterium", - number = "\btxrenderingparameter\c!number", - btxdataset = "\currentbtxdataset", - keyword = "\btxrenderingparameter\c!keyword", - }}% - % next we analyze the width - \ifx\btx_list_reference_inject_indeed\relax - \else - \edef\p_width{\btxrenderingparameter\c!width}% - \ifx\p_width\v!auto - \scratchcounter\btxlistcounter - \setbox\scratchbox\vbox{\settrialtypesetting\ctxcommand{btxfetchlistentries("\currentbtxdataset")}}% - \d_publ_number_width\wd\scratchbox - \global\btxlistcounter\scratchcounter - \letbtxlistparameter\c!width\d_publ_number_width - \fi + % sorting and so + \clf_btxpreparelistentries{\currentbtxdataset}% could be put in collect + % next we analyze the width + \ifx\currentbtxnumbering\empty \else + \edef\p_width{\listparameter\c!width}% + \ifx\p_width\v!auto + \setbox\scratchbox\vbox \bgroup + \settrialtypesetting + \clf_btxfetchlistentries{\currentbtxdataset}% + \egroup + \d_publ_number_width\wd\scratchbox + \letlistparameter\c!width\d_publ_number_width \fi - % this actually typesets them - \ctxcommand{btxflushlistentries("\currentbtxdataset","\btxrenderingparameter\c!sorttype")}% + \fi + \doifelse{\listparameter\c!prefix}\v!yes\settrue\setfalse\c_publ_prefixed + % this actually typesets them, we loop here as otherwise the whole + % bunch gets flushed at once + \dorecurse\nofbtxlistentries + {\let\currentbtxlistentry\recurselevel + \clf_btxflushlistentry{\currentbtxdataset}\currentbtxlistentry\relax}% \stoppacked - \stopbtxrendering - \global\advance\btxblock\plusone} + \fi + \btxrenderingparameter\c!after + \global\advance\btxblock\plusone + \ifconditional#1\relax + \stopnamedsection + \fi + \endgroup} -\def\currentbtxblock{\number\btxblock} +\def\publ_place_list_complete{\publ_place_list_indeed\conditionaltrue} +\def\publ_place_list_standard{\publ_place_list_indeed\conditionalfalse} -\def\publ_place_list_entry_checked - {\ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_place_list_entry} +\def\currentbtxblock{\number\btxblock} -\def\publ_place_list_entry_register - {\ctxcommand{btxregisterlistentry("\currentbtxdataset","\currentbtxtag")}} +% called at the lua end, for determining the width -\unexpanded\def\btxhandlelistentry#1% called at the lua end +\unexpanded\def\btxchecklistentry {\begingroup - \edef\currentbtxtag{#1}% - \ifconditional\c_publ_place_all - \publ_place_list_entry - \else\ifconditional\c_publ_place_check - \publ_place_list_entry_checked - \else - \publ_place_list_entry - \fi\fi + % todo, switch to font + \hbox{\btx_reference_checked}% + \par \endgroup} -\unexpanded\def\publ_place_list_entry - {\global\advance\btxlistcounter\plusone - \ifconditional\c_publ_place_register - \publ_place_list_entry_register - \fi - \let\currentlist\s!btx - \startbtxlistentry\currentbtxrendering - \btx_entry_inject - \stopbtxlistentry} +% called at the lua end, the real rendering + +% we could have a yes and no where o nils the btx_reference_indeed ... saves a check there + +\installstructurelistprocessor{\s!btx} + {\let\currentlistentrynumber \btx_reference_indeed + \let\currentlistentrytitle \btx_entry_indeed + \let\currentlistentrypagenumber\btx_page_indeed + \strc_lists_apply_renderingsetup} + +\def\btx_entry_indeed + {\btx_list_reference_inject + \btx_entry_inject} -\unexpanded\def\btxchecklistentry#1% called at the lua end +\def\btx_page_indeed + {} + +\unexpanded\def\btxhandlelistentry + {\strc_lists_entry_process} + +\unexpanded\def\btxstartlistentry % maybe pass i {\begingroup - \edef\currentbtxtag{#1}% - \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway - \publ_check_list_entry - \else - \ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_check_list_entry + \global\advance\c_btx_list_reference\plusone} + +\unexpanded\def\btxstoplistentry + {\iftrialtypesetting + \global\advance\c_btx_list_reference\minusone \fi \endgroup} -\unexpanded\def\publ_check_list_entry - {\global\advance\btxlistcounter\plusone - % todo, switch to font - \hbox{\btx_reference_checked}% - \par} +\newtoks\everybtxlistentry -\unexpanded\def\btx_list_reference_inject % we can use a faster \reference - {\dontleavehmode\begingroup % no box - \iftrialtypesetting\else - \ctxcommand{btxlistreference("\currentbtxdataset","\currentbtxblock","\currentbtxtag","\number\btxlistcounter")}% - \fi - \btx_list_reference_inject_indeed +\unexpanded\def\btxlistsetup#1% used for the reference in the list + {\the\everybtxlistentry + \everybtxlistentry\emptytoks % so only once per entry to be sure + \btxsetuptype\plusthree + \fastbtxsetup\s!list{#1}} + +\appendtoks + \btx_check_language +\to \everybtxlistentry + +\unexpanded\def\btx_reference_indeed + {\begingroup + %let\currentbtxlistvariant\currentbtxnumbering + \setbtxparameterset\c!list\currentbtxnumbering + \ifx\currentbtxnumbering\empty + % nothing + \else\ifx\currentbtxnumbering\v!no + % nothing + \else + \usebtxstyleandcolor\c!style\c!color % new, needed? + % \btxparameter\c!left + \ifconditional\c_publ_prefixed\btxlistprefixednumber\fi + \clf_btxlistvariant % some can go + {\currentbtxdataset}% + {\currentbtxblock}% + {\currentbtxtag}% + {\currentbtxnumbering}% + {\currentbtxnumber}% + \relax + % \btxparameter\c!right + \fi\fi \endgroup} +\unexpanded\def\btxlistprefixednumber % hack but alan needs it + {\clf_listprefixednumber + {\currentlist}% + \currentbtxlistindex + {% + prefix {\listparameter\c!prefix}% + separatorset {\listparameter\c!prefixseparatorset}% + conversionset {\listparameter\c!prefixconversionset}% + starter {\listparameter\c!prefixstarter}% + stopper {\listparameter\c!prefixstopper}% + set {\listparameter\c!prefixset}% + segments {\listparameter\c!prefixsegments}% + connector {\listparameter\c!prefixconnector}% + }% + \relax} + \unexpanded\def\btx_reference_checked {\dontleavehmode\hbox\bgroup - \btx_list_reference_inject_indeed + \btx_reference_indeed \egroup} -\unexpanded\def\btx_cite_reference_inject % todo: wrap whole content? +\newcount\c_btx_list_reference + +\unexpanded\def\btx_list_reference_inject {\dontleavehmode\begingroup % no box \iftrialtypesetting\else -% \ifx\currentbtxinternal\empty\else - % \global\advance\btxcitecounter\plusone - \ctxcommand{btxcitereference(\number\currentbtxinternal)}% -% \fi + \btx_list_reference_inject_now \fi - % \btx_list_reference_inject_indeed + % \btx_reference_indeed % else double entry in list \endgroup} +\def\btx_list_reference_inject_now + {\btx_trace_list_cross\empty\currentbtxbacktrace + \strc_references_direct_full_user + {\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% + \s!btxref=\currentbtxtag,% + \s!btxspc=\currentbtxspecification,% + \s!btxlst=\number\c_btx_list_reference,% check if needed + \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% + \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% + \ifx\currentbtxbacklink\currentbtxbacktrace\s!btxint=\currentbtxbacklink\else\s!btxbck=\currentbtxbacktrace\fi}% + {\s!btx::\v!list::\number\c_btx_list_reference}% + {\currentbtxnumber}} + +\newconditional\c_btx_cite_reference_injected + +\unexpanded\def\btx_cite_reference_inject + {\ifconditional\c_btx_cite_reference_injected + \else + \dontleavehmode + \iftrialtypesetting \else + \ifx\currentbtxbacklink\empty + % can be made empty when combining author / year + \else + \btx_cite_reference_inject_indeed + \settrue\c_btx_cite_reference_injected + \fi + \fi + \fi} + +\newtoks\t_btx_reference_inject + +% \def\btx_cite_reference_inject_indeed +% {\btx_trace_list_cross\currentbtxbacklink\empty +% \the\t_btx_reference_inject +% \normalexpanded{\writedatatolist % can be done faster .. just merge code here (not much) / also type btx +% [\s!btx]% +% [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% +% \s!btxref=\currentbtxtag,% +% \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi% +% \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi% +% \s!btxint=\number\currentbtxbacklink +% \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]}} + +\def\btx_cite_reference_inject_indeed + {\btx_trace_list_cross\currentbtxbacklink\empty + \the\t_btx_reference_inject + \strc_lists_inject_direct % todo: make like \btx_list_reference_inject_now with { } + [\s!btx]% + [\c!type=\s!btx]% \c!location=\v!none + [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% + \s!btxref=\currentbtxtag,% + \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi% + \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi% + \s!btxint=\number\currentbtxbacklink + \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]} + +\def\currentbtxuservariable #1{\clf_btxuservariable {\currentbtxdataset}{#1}} +\def\btxdoifelseuservariable#1{\clf_btxdoifelseuservariable{\currentbtxdataset}{#1}} + +\let\btxdoifuservariableelse\btxdoifelseuservariable + \let\btxcitereference\btx_cite_reference_inject -\setuvalue{\??btxnumbering\v!short }{\btxlistvariant{short}} % these will be setups -\setuvalue{\??btxnumbering\v!bib }{\btxlistvariant{num}} % these will be setups -\setuvalue{\??btxnumbering\s!unknown}{\btxlistvariant{num}} % these will be setups -\setuvalue{\??btxnumbering\v!yes }{\btxlistvariant{num}} % these will be setups +\let\currentbtxnumbering\empty \appendtoks - \edef\p_btx_numbering{\btxrenderingparameter\c!numbering}% - \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed - \ifx\p_btx_numbering\v!no - \letlistparameter\c!textcommand\outdented % needed? we can use titlealign - \letlistparameter\c!symbol \v!none - \letlistparameter\c!aligntitle \v!yes - \let\btx_list_reference_inject_indeed\relax - \else - \ifcsname\??btxnumbering\p_btx_numbering\endcsname \else - \let\p_btx_numbering\s!unknown - \fi - \letlistparameter\c!headnumber\v!always - \expandafter\let\expandafter\btx_list_reference_inject_indeed\csname\??btxnumbering\p_btx_numbering\endcsname - \fi + \edef\currentbtxnumbering{\btxrenderingparameter\c!numbering}% + \edef\p_numbering{\btxrenderingparameter\c!numbering}% link to headnumber + \ifx\p_numbering\v!no + \letlistparameter\c!headnumber\v!no + \let\currentbtxnumbering\empty + % \letlistparameter\c!textcommand\outdented % needed? we can use titlealign + \letlistparameter\c!symbol \v!none + \letlistparameter\c!aligntitle \v!yes + \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed + \else + \letlistparameter\c!headnumber\v!always + \fi + \let\currentlistmethod\s!btx \to \everysetupbtxlistplacement % \appendtoks @@ -569,135 +981,139 @@ % \to \everysetupbtxlistplacement \unexpanded\def\btxflushauthor - {\doifnextoptionalcselse\btx_flush_author_yes\btx_flush_author_nop} + {\doifelsenextoptionalcs\btx_flush_author_yes\btx_flush_author_nop} \def\btx_flush_author_yes[#1]{\btx_flush_author{#1}} -\def\btx_flush_author_nop {\btx_flush_author{\btxlistvariantparameter\c!author}} +\def\btx_flush_author_nop {\btx_flush_author{\btxparameter\c!authorconversion}} \unexpanded\def\btx_flush_author#1#2% - {\edef\currentbtxfield{#2}% - \let\currentbtxlistvariant\currentbtxfield - \ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","\currentbtxfield",{ - combiner = "#1", - etallimit = \number\btxlistvariantparameter\c!etallimit, - etaldisplay = \number\btxlistvariantparameter\c!etaldisplay, - })}} + {\begingroup + \edef\currentbtxfield{#2}% + \setbtxparameterset\s!list\currentbtxfield + %let\currentbtxlistvariant\currentbtxfield + \clf_btxauthor + {\currentbtxdataset}% + {\currentbtxtag}% + {\currentbtxfield}% + {% + combiner {#1}% + kind {list}% + etallimit {\btxparameter\c!etallimit}% + etaldisplay {\btxparameter\c!etaldisplay}% + symbol {\btxparameter{\c!stopper:initials}}% + }% + \relax + \endgroup} + +% yes or no: maybe just \flushauthor{...}{...} +\unexpanded\def\btxflushauthorname {\btx_flush_author{name}} % #1 \unexpanded\def\btxflushauthornormal {\btx_flush_author{normal}} % #1 \unexpanded\def\btxflushauthornormalshort {\btx_flush_author{normalshort}} % #1 \unexpanded\def\btxflushauthorinverted {\btx_flush_author{inverted}} % #1 \unexpanded\def\btxflushauthorinvertedshort{\btx_flush_author{invertedshort}} % #1 \unexpanded\def\currentbtxciteauthor % always author - {\ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","author",{ - combiner = "\btxcitevariantparameter\c!author", - etallimit = \number\btxcitevariantparameter\c!etallimit, - etaldisplay = \number\btxcitevariantparameter\c!etaldisplay, - })}} + {\begingroup + \setbtxparameterset\s!cite\s!author + \clf_btxauthor + {\currentbtxdataset}% + {\currentbtxtag}% + {\s!author}% + {% + combiner {\btxparameter\c!authorconversion}% + kind {cite}% + etallimit {\btxparameter\c!etallimit}% + etaldisplay {\btxparameter\c!etaldisplay}% + symbol {\btxparameter{\c!stopper:initials}}% + }% + \relax + \endgroup} + +\unexpanded\def\btxstartauthor#1#2#3% a state > 0 signals that some authors can clash + {\begingroup + \currentbtxauthorindex#1\relax + \currentbtxauthorcount#2\relax + \currentbtxauthorstate#3\relax} + +\unexpanded\def\btxstopauthor + {\endgroup} + +\unexpanded\def\btxciteauthorsetup#1{\fastsetup{\s!btx:\s!cite:\s!author:#1}} +\unexpanded\def\btxlistauthorsetup#1{\fastsetup{\s!btx:\s!list:\s!author:#1}} % \btxflushauthor{author} -% \btxflushauthor{artauthor} % \btxflushauthor{editor} % +% \btxflushauthor[name]{author} % \btxflushauthor[normal]{author} % \btxflushauthor[normalshort]{author} % \btxflushauthor[inverted]{author} % \btxflushauthor[invertedshort]{author} -% Interaction: only list +% \btxflushauthor{author} +% \btxflushauthor{editor} +% +% \btxflushauthor[name]{author} +% \btxflushauthor[normal]{author} +% \btxflushauthor[normalshort]{author} +% \btxflushauthor[inverted]{author} +% \btxflushauthor[invertedshort]{author} + +% Interaction \newconditional\btxinteractive +\newconditional\btx_interactive -\unexpanded\def\btxdoifelseinteraction{\secondoftwoarguments} +% of maybe modes? \appendtoks \iflocation - \edef\p_interaction{\btxlistvariantparameter\c!interaction}% + \edef\p_interaction{\btxparameter\c!interaction}% \ifx\p_interaction\v!stop - \let\btxdoifelseinteraction\secondoftwoarguments \setfalse\btxinteractive \else - \let\btxdoifelseinteraction\firstoftwoarguments \settrue\btxinteractive + \ifx\p_interaction\v!all + \settrue\btx_interactive + \else + \setfalse\btx_interactive + \fi \fi \else - \let\btxdoifelseinteraction\secondoftwoarguments \setfalse\btxinteractive + \setfalse\btx_interactive \fi \to \everysetupbtxlistplacement \appendtoks \iflocation - \edef\p_interaction{\btxcitevariantparameter\c!interaction}% + \edef\p_interaction{\btxparameter\c!interaction}% \ifx\p_interaction\v!stop - \let\btxdoifelseinteraction\secondoftwoarguments \setfalse\btxinteractive \else - \let\btxdoifelseinteraction\firstoftwoarguments \settrue\btxinteractive \fi \else - \let\btxdoifelseinteraction\secondoftwoarguments \setfalse\btxinteractive \fi \to \everysetupbtxciteplacement -% bib -> btx +% till here -\unexpanded\def\btxgotolink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}} -\unexpanded\def\btxatlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}} -\unexpanded\def\btxinlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}} - -\unexpanded\def\btxdirectlink#1#2{\goto{#2 {\tttf[#1]}}[#1]} -\unexpanded\def\btxdirectlink#1#2{\goto{#2}[#1]} - -\let\gotobiblink\btxgotolink -\let\atbiblink \btxatlink -\let\inbiblink \btxinlink - -\unexpanded\def\btxnumberedreference[#1]% \bibtexnumref (replaced by \cite[num]) - {\dontleavehmode - \begingroup - \btxcitevariantparameter\v!left - \penalty\plustenthousand % todo - \ctxcommand{btxresolvelistreference("\currentbtxdataset","#1")}% todo: split dataset from #1, so another call - \btxcitevariantparameter\v!right - \endgroup} - -\appendtoks - % for old times sake, for a while at least - \let\maybeyear\gobbleoneargument - \let\noopsort \gobbleoneargument -\to \everysetupbtxlistplacement - -\appendtoks - % for old times sake, for a while at least - \let\maybeyear\gobbleoneargument - \let\noopsort \gobbleoneargument -\to \everysetupbtxciteplacement - -\appendtoks - \doifnot{\btxrenderingparameter\c!continue}\v!yes - {\global\btxlistcounter\zerocount}% -\to \everysetupbtxlistplacement +% \unexpanded\def\btxnumberedreference[#1]% \bibtexnumref (replaced by \cite[num]) +% {\dontleavehmode +% \begingroup +% \btxparameter\v!left +% \penalty\plustenthousand % todo +% \clf_btxresolvelistreference{\currentbtxdataset}{#1}% todo: split dataset from #1, so another call +% \btxparameter\v!right +% \endgroup} %D When a publication is cited, we need to signal that somehow. This is done with the %D following (not user) command. We could tag without injecting a node but this way %D we also store the location, which makes it possible to ask local lists. -\newconditional\c_publ_cite_write - -\unexpanded\def\btxdomarkcitation % called from lua end - {\iftrialtypesetting - \expandafter\gobbletwoarguments - \else - \expandafter\publ_cite_mark_citation - \fi} - -\def\publ_cite_mark_citation#1#2% called from lua end - {\dontleavehmode - \writedatatolist[btx][btxset=#1,btxref=#2]} % \c!location=\v!here - %D \macros{cite,nocite,citation,nocitation,usecitation} %D %D The inline \type {\cite} command creates a (often) short reference to a publication @@ -716,98 +1132,120 @@ % [base::tags] % [settings|variant][base::tags] -\unexpanded\def\btxcite +% these need to be sort of protected: + +\let\p_publ_cite_before \empty +\let\p_publ_cite_after \empty +\let\p_publ_cite_lefttext \empty +\let\p_publ_cite_righttext\empty + +\let\currentbtxciteuservariables\empty + +\unexpanded\def\btxhybridcite % so one can alias the old {\dontleavehmode \begingroup - \strictdoifnextoptionalelse\publ_cite_tags_options\publ_cite_tags_indeed} + \strictdoifelsenextoptional\publ_cite_tags_options\publ_cite_tags_indeed} + +\unexpanded\def\publ_cite_tags_options[#1]% + {\strictdoifelsenextoptional{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}} \unexpanded\def\publ_cite_tags_indeed#1% {\letinteractionparameter\c!style\empty - \edef\currentbtxcitevariant{\btxcitevariantparameter\c!alternative}% + \setbtxparametersetroot\s!cite % we need to get the default + \edef\currentbtxcitealternative{\btxparameter\c!alternative}% + \setbtxparameterset\s!cite\currentbtxcitealternative \edef\currentbtxcitetag{#1}% \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} -\let\publ_citation_tags_indeed\publ_cite_tags_indeed +\unexpanded\def\publ_cite_tags_options_indeed#1% + {\doifelseassignment{#1}\publ_cite_tags_settings_indeed\publ_cite_tags_variants_indeed{#1}} -\unexpanded\def\publ_cite_tags_options[#1]% - {\strictdoifnextoptionalelse{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}} - -\unexpanded\def\publ_cite_tags_options_indeed#1[#2]% - {\edef\currentbtxcitetag{#2}% - \doifassignmentelse{#1}\publ_cite_tags_settings_indeed\publ_cite_tags_variants_indeed{#1}} - -\def\publ_cite_tags_settings_indeed#1% +\def\publ_cite_tags_settings_indeed#1[#2]% {\letinteractionparameter\c!style\empty %\letinteractionparameter\c!color\empty + \letdummyparameter\c!reference \empty + \letdummyparameter\c!alternative\empty \letdummyparameter\c!before \empty \letdummyparameter\c!after \empty - \letdummyparameter\c!extras \empty - \letdummyparameter\c!alternative\empty + \letdummyparameter\c!lefttext \empty + \letdummyparameter\c!righttext \empty \getdummyparameters[#1]% + \edef\p_reference{\dummyparameter\c!reference}% + \ifx\p_reference\empty + \edef\currentbtxcitetag{#2}% + \else + \let\currentbtxcitetag\p_reference + \edef\currentbtxciteuservariables{#2}% + \fi \edef\p_alternative{\dummyparameter\c!alternative}% \ifx\p_alternative\empty - \edef\currentbtxcitevariant{\btxcitevariantparameter\c!alternative}% + \setbtxparametersetroot\s!cite + \edef\currentbtxcitealternative{\btxparameter\c!alternative}% \else - \let\currentbtxcitevariant\p_alternative + \let\currentbtxcitealternative\p_alternative \fi - \setupcurrentbtxcitevariant[#1]% - \edef\p_extras{\dummyparameter\c!extras}% - \ifx\p_extras\empty \else - \edef\p_right{\btxcitevariantparameter\c!right}% - \ifx\p_right\empty \else - \setexpandedbtxcitevariantparameter\p_right{\p_extras\p_right}% - \fi - \fi - \edef\p_before{\dummyparameter\c!before}% - \edef\p_after {\dummyparameter\c!after}% + \setbtxparameterset\s!cite\currentbtxcitealternative + \setupcurrentbtx[#1]% + % + \edef\p_publ_cite_before {\dummyparameter\c!before}% + \edef\p_publ_cite_after {\dummyparameter\c!after}% + \edef\p_publ_cite_lefttext {\dummyparameter\c!lefttext}% + \edef\p_publ_cite_righttext{\dummyparameter\c!righttext}% + % \the\everysetupbtxciteplacement - \ifx\p_before\empty \else - \p_before - \space - \fi \publ_cite_variant - \ifx\p_after\empty \else - \optionalspace - \p_after - \fi \endgroup} -\def\publ_cite_tags_variants_indeed#1% +\def\publ_cite_tags_variants_indeed#1[#2]% {\letinteractionparameter\c!style\empty - \edef\currentbtxcitevariant{#1}% + \edef\currentbtxcitealternative{#1}% + \edef\currentbtxcitetag{#2}% + \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} \newconditional\btxcitecompress +\let\currentbtxreference\empty + \def\publ_cite_variant {\begingroup - \settrue\c_publ_cite_write \publ_cite_handle_variant_indeed[\currentbtxcitetag]} \unexpanded\def\publ_cite_handle_variant#1% {\begingroup - \edef\currentbtxcitevariant{#1}% + \edef\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \dosingleargument\publ_cite_handle_variant_indeed} +\unexpanded\def\publ_cite_handle_variant_blob + {%\btxparameter\v!left\relax + \clf_btxhandlecite + dataset {\currentbtxdataset}% + reference {\currentbtxreference}% + markentry \iftrialtypesetting\s!false\else\s!true\fi\space + variant {\currentbtxcitealternative}% + sorttype {\btxparameter\c!sorttype}% + compress {\btxparameter\c!compress}% + author {\btxparameter\c!author}% + lefttext {\p_publ_cite_lefttext}% + righttext {\p_publ_cite_righttext}% + before {\p_publ_cite_before}% + after {\p_publ_cite_after}% + \relax + \clf_btxflushmarked % maybe: \iftrialtypesetting\else ... \fi + }%\btxparameter\v!right\relax} + \def\publ_cite_handle_variant_indeed[#1]% - {\usebtxcitevariantstyleandcolor\c!style\c!color - \letbtxcitevariantparameter\c!alternative\currentbtxcitevariant - \btxcitevariantparameter\v!left - \ctxcommand{btxhandlecite{% - dataset = "\currentbtxdataset",% - reference = "#1",% - markentry = \iftrialtypesetting false\else true\fi,% - variant = "\currentbtxcitevariant",% - sorttype = "\btxcitevariantparameter\c!sorttype",% - compress = "\btxcitevariantparameter\c!compress",% - author = "\btxcitevariantparameter\c!author",% - }}% - \btxcitevariantparameter\v!right + {\letbtxparameter\c!alternative\currentbtxcitealternative + \edef\currentbtxreference{#1}% + \usebtxstyleandcolor\c!style\c!color + \uselanguageparameter\btxdatasetparameter % new + \btxparameter\c!command{\publ_cite_handle_variant_blob}% \endgroup} \unexpanded\def\btxcitation @@ -822,281 +1260,460 @@ \publ_cite_tags_indeed{#1}% \fi} -\unexpanded\def\btxnocite +\unexpanded\def\btxnocitation {\dosingleempty\publ_cite_no} \unexpanded\def\publ_cite_no[#1]% {\iftrialtypesetting \else - \ctxcommand{btxhandlecite{% - dataset = "\currentbtxdataset",% - reference = "#1",% - markentry = \iftrialtypesetting false\else true\fi,% - }}% + \begingroup + \edef\currentbtxreference{#1}% + \clf_btxhandlenocite + dataset {\currentbtxdataset}% + reference {\currentbtxreference}% + markentry true% + \relax + % \clf_btxflushmarked + \endgroup \fi} \unexpanded\def\btxmissing#1% - {{\tttf<#1>}} + {\dontleavehmode{\tttf<#1>}} %D Compatibility: -\let\cite \btxcite +\let\cite \btxcitation \let\citation \btxcitation -\let\nocite \btxnocite -\let\nocitation \btxnocite -\let\usepublication\btxnocite +\let\nocite \btxnocitation +\let\nocitation \btxnocitation +%let\usepublication\btxnocitation + +%D Setup helpers, beware, we need to wrap this .. now we need to know +%D how setups are implemented. + +\setvalue{\??setup:\s!btx:\s!unknown}#1{\inframed{\tttf#1}} + +\def\fastbtxsetup_yes#1#2% + {\csname\??setup:\s!btx:% + \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname + \currentbtxspecification:#1:#2% + \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:#2\endcsname + \currentbtxspecificationfallback:#1:#2% + \else\ifcsname\??setup:\s!btx:#1:#2\endcsname + #1:#2% + \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname + \currentbtxspecification:#1:\s!unknown + \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname + \currentbtxspecificationfallback:#1:\s!unknown + \else + #1:\s!unknown + \fi\fi\fi\fi\fi + \endcsname{#2}} + +\def\fastbtxsetup_nop#1#2% + {\csname\??setup:\s!btx:% + \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname + \currentbtxspecification:#1:#2% + \else\ifcsname\??setup:\s!btx:#1:#2\endcsname + #1:#2% + \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname + \currentbtxspecification:#1:\s!unknown + \else + #1:\s!unknown + \fi\fi\fi + \endcsname{#2}} + +\def\fastbtxsetup + {\ifx\currentbtxspecificationfallback\empty + \expandafter\fastbtxsetup_nop + \else + \expandafter\fastbtxsetup_yes + \fi} -%D Cite helpers: +\let\publ_fastbtxsetup_normal\fastbtxsetup + +\newconstant\btxsetuptype + +% 0 = unknown darkred +% 1 = cite darkblue +% 2 = subcite darkgreen +% 3 = list darkcyan +% 4 = page darkmagenta +% 5 = unknown darkred + +\unexpanded\def\publ_fastbtxsetup_chain_inbetween + {\allowbreak->\allowbreak} + +\unexpanded\def\publ_fastbtxsetup_chain_yes#1#2% + {\dontleavehmode\begingroup + \infofont + \ifcase\btxsetuptype\darkred\or\darkblue\or\darkgreen\or\darkcyan\or\darkmagenta\else\darkred\fi + [% + \currentbtxspecification :#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:#2\endcsname\else + \publ_fastbtxsetup_chain_inbetween + \currentbtxspecificationfallback:#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback :#1:#2\endcsname\else + \publ_fastbtxsetup_chain_inbetween + #1:#2\ifcsname\??setup:\s!btx :#1:#2\endcsname\else + \publ_fastbtxsetup_chain_inbetween + \currentbtxspecification :#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:\s!unknown\endcsname\else + \publ_fastbtxsetup_chain_inbetween + \currentbtxspecificationfallback:#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname\else + \publ_fastbtxsetup_chain_inbetween + unset\fi\fi\fi\fi\fi + ]% + \endgroup} -\newconstant\currentbtxconcat +\unexpanded\def\publ_fastbtxsetup_chain_nop#1#2% + {\dontleavehmode\begingroup + \infofont + \darkred + [% + \currentbtxspecification :#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:#2\endcsname\else + \publ_fastbtxsetup_chain_inbetween + #1:#2\ifcsname\??setup:\s!btx :#1:#2\endcsname\else + \publ_fastbtxsetup_chain_inbetween + \currentbtxspecification :#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:\s!unknown\endcsname\else + \publ_fastbtxsetup_chain_inbetween + unset\fi\fi\fi + ]% + \endgroup} -\unexpanded\def\btxcitereset - {\let\currentbtxfirst \empty - \let\currentbtxsecond \empty - \let\currentbtxinternal\empty - \let\currentbtxtag \empty - \setconstant\currentbtxconcat\zerocount} +\unexpanded\def\publ_fastbtxsetup_chain + {\ifx\currentbtxspecificationfallback\empty + \expandafter\publ_fastbtxsetup_chain_nop + \else + \expandafter\publ_fastbtxsetup_chain_yes + \fi} -\btxcitereset +\unexpanded\def\publ_fastbtxsetup_visual#1#2% + {\publ_fastbtxsetup_chain{#1}{#2}% + \publ_fastbtxsetup_normal{#1}{#2}} -\unexpanded\def\btxcitesetup#1% - {\directsetup{btx:cite:#1}% - \btxcitereset} +\installtextracker + {publications.setups} + {\let\fastbtxsetup\publ_fastbtxsetup_visual} + {\let\fastbtxsetup\publ_fastbtxsetup_normal} -\unexpanded\def\btxsetfirst {\def\currentbtxfirst} -\unexpanded\def\btxsetsecond {\def\currentbtxsecond} -\unexpanded\def\btxsettag {\def\currentbtxtag} -\unexpanded\def\btxsetinternal{\def\currentbtxinternal} -\unexpanded\def\btxsetconcat#1{\setconstant\currentbtxconcat#1\relax} +%D Cite helpers: -\unexpanded\def\btxsetlistreference#1#2% #3#4% - {\strc_references_direct_full_user{btxset="#1",btxref="#2"}} +\newtoks\everybtxciteentry -\unexpanded\def\btxsetcitereference#1#2% - {\ifx\currentbtxinternal\empty \else - \strc_references_direct_full_user{btxint=#2}{#1}\empty - \fi} +\prependtoks + \setfalse\c_btx_cite_reference_injected +\to \everybtxciteentry -\unexpanded\def\btxstartsubcite#1% - {\bgroup - \btxcitereset - \def\currentbtxcitevariant{#1}% - \btxcitevariantparameter\c!left} +\unexpanded\def\btxcitesetup#1% + {\the\everybtxciteentry + \btxsetuptype\plusone + \everybtxciteentry\emptytoks % tricky maybe not when subcites + \fastbtxsetup\s!cite{#1}} % no \btxcitereset as we loose dataset and such -\unexpanded\def\btxstopsubcite - {\btxcitevariantparameter\c!right - \egroup} +\unexpanded\def\btxsubcitesetup#1% + {\the\everybtxciteentry + \btxsetuptype\plustwo + \everybtxciteentry\emptytoks % tricky maybe not when subcites + \fastbtxsetup\s!cite{#1}} % no \btxcitereset as we loose dataset and such -%D List helpers: +\appendtoks + \btx_check_language +\to \everybtxciteentry -\def\currentbtxindex{0} +\unexpanded\def\btxstartsubcite#1% + {\begingroup + \btxcitereset % todo: limited set + \def\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative + \usebtxstyleandcolor\c!style\c!color + % \btxparameter\c!left + \relax} + +\unexpanded\def\btxstopsubcite + {%\relax + % \btxparameter\c!right + \endgroup} -\unexpanded\def\btxlistvariant#1% was \currentbtxindex +\unexpanded\def\btxstartciterendering[#1]% {\begingroup - \edef\currentbtxlistvariant{#1}% - \btxlistvariantparameter\c!left - \ctxcommand{btxlistvariant("\currentbtxdataset","\currentbtxblock","\currentbtxtag","#1","\number\btxlistcounter")}% some can go - \btxlistvariantparameter\c!right + \edef\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative + \usebtxstyleandcolor\c!style\c!color + % \btxparameter\c!left + }%\relax} + +\unexpanded\def\btxstopciterendering + {\relax + % \btxparameter\c!right \endgroup} +\let\btxstartcite \begingroup +\let\btxstopcite \endgroup +\let\btxstartciteauthor\begingroup +\let\btxstopciteauthor \endgroup + %D Whatever helpers: -\unexpanded\def\btxsingularplural#1% - {\ctxcommand{btxsingularorplural("\currentbtxdataset","\currentbtxtag","#1")}} +\unexpanded\def\btxsingularplural#1{\clf_btxsingularorplural{\currentbtxdataset}{\currentbtxtag}{#1}} +\unexpanded\def\btxoneorrange #1{\clf_btxoneorrange {\currentbtxdataset}{\currentbtxtag}{#1}} +\unexpanded\def\btxfirstofrange #1{\clf_btxfirstofrange {\currentbtxdataset}{\currentbtxtag}{#1}} \let\btxsingularorplural\btxsingularplural -%D Loading variants: +\stopcontextdefinitioncode + +%D Journals + +\unexpanded\def\btxloadjournallist [#1]{\clf_btxloadjournallist{#1}} +\unexpanded\def\btxsavejournallist [#1]{\clf_btxsavejournallist{#1}} +\unexpanded\def\btxaddjournal [#1][#2]{\clf_btxaddjournal{#1}{#2}} + \def\btxexpandedjournal #1{\clf_btxexpandedjournal{#1}} % \unexpanded ? + \def\btxabbreviatedjournal#1{\clf_btxabbreviatedjournal{#1}} % \unexpanded ? + +% \installcorenamespace{btxjournal} +% +% \letvalue{\s!btxjournal\v!long }\btxexpandedjournal +% \letvalue{\s!btxjournal\v!short }\btxabbreviatedjournal +% \letvalue{\s!btxjournal\v!normal}\firstofoneargument +% +% \unexpanded\def\btxcheckedjournal +% {\expandnamespaceparameter\s!btxjournal\btxrenderingparameter\c!journalconversion} + +% \btxloadjournallist[list.txt] % Foo Journal of Bars = FBJ \n .... +% +% \btxexpandedjournal[fbj] +% \btxabbreviatedjournal[foo journal of bars] + +%D Saving data: + +\unexpanded\def\savebtxdataset + {\dotripleargument\publ_save_dataset} + +\unexpanded\def\publ_save_dataset[#1][#2][#3]% + {\ifthirdargument + \publ_save_dataset_indeed[#1][#2][#3]% + \else\ifsecondargument + \doifelseassignment{#2}% + {\publ_save_dataset_indeed[\s!default][#1][#2]}% + {\publ_save_dataset_indeed[#1][#2][]}% + \else\iffirstargument + \doifelseassignment{#1}% + {\publ_save_dataset_indeed[\s!default][\jobname-saved.bib][#1]}% + {\publ_save_dataset_indeed[\s!default][#1][]}% + % \else + % % bad news + \fi\fi\fi} + +\unexpanded\def\publ_save_dataset_indeed[#1][#2][#3]% + {\begingroup + \getdummyparameters + [\c!criterium=\v!all,% + \c!type=,% + \c!dataset=#1,% + \c!file=#2,% + #3]% % all or used + \clf_btxsavedataset + dataset {\dummyparameter\c!dataset}% + filename {\dummyparameter\c!file}% + filetype {\dummyparameter\c!type}% + criterium {\dummyparameter\c!criterium}% + \relax + \endgroup} + +% \savebtxdataset[default][e:/tmp/foo.bib] +% \savebtxdataset[default][e:/tmp/foo.lua] +% \savebtxdataset[default][e:/tmp/foo.xml] + +%D In-text entries: + +\unexpanded\def\placecitation{\citation[entry]} % [#1] + +\unexpanded\def\btxhandleciteentry + {\dontleavehmode + \begingroup + \def\currentbtxcitealternative{entry}% + \setbtxparameterset\s!cite\currentbtxcitealternative % needs checking + \btxcitereference + \btx_entry_inject + \endgroup} + +%D Registers + +% \setupbtxregister +% [\c!state=\v!start, +% \c!dataset=\v!all, +% \c!method=\v!always] + +\unexpanded\def\publ_registers_set + {\ifx\currentbtxregister\empty \else + \clf_btxsetregister + specification {\currentbtxspecification}% + name {\currentbtxregister}% + state {\btxregisterparameter\c!state}% + dataset {\btxregisterparameter\c!dataset}% + field {\btxregisterparameter\c!field}% + register {\btxregisterparameter\c!register}% + method {\btxregisterparameter\c!method}% + alternative {\btxregisterparameter\c!alternative}% + \relax + \fi} \appendtoks - \loadbtxdefinitionfile[\btxrenderingparameter\c!alternative] -\to \everysetupbtxrendering + \publ_registers_set +\to \everydefinebtxregister -\stopcontextdefinitioncode +\appendtoks + \publ_registers_set +\to \everysetupbtxregister + +\appendtoks + \normalexpanded{% + \defineprocessor + [\s!btx:r:\currentbtxregister]% + [\c!style=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!style, + \c!color=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!color]}% +\to \everydefinebtxregister + +\appendtoks + \clf_btxtoregister{\currentbtxdataset}{\currentbtxtag}% +\to \t_btx_reference_inject + +\unexpanded\def\btxindexedauthor#1#2#3#4#5#6% alternative von last first junior + {\begingroup + \def\currentbtxcitealternative{#1}% + \ifx\currentbtxcitealternative\empty + \edef\currentbtxcitealternative{invertedshort}% maybe we need some default here too? + \fi + %let\currentbtxlistvariant\currentbtxcitealternative % we inherit + \the\everysetupbtxciteplacement + \def\currentbtxvons {#2}% + \def\currentbtxsurnames {#3}% + \def\currentbtxinitials {#4}% + \def\currentbtxfirstnames {#5}% + \def\currentbtxjuniors {#6}% + \setbtxparameterset\s!cite\currentbtxcitealternative + \fastsetup{\s!btx:\s!cite:\s!author:\currentbtxcitealternative}% + \endgroup} + +%D We hook some setters in the definition sets: + +% \installdefinitionsetmember \??btx {btxspecification} \??btxcitevariant {btxcitevariant} +% \installdefinitionsetmember \??btx {btxspecification} \??btxlistvariant {btxlistvariant} +% \installdefinitionsetmember \??btx {btxspecification} \??btxlist {btxlist} +% \installdefinitionsetmember \??btx {btxspecification} \??btxrendering {btxrendering} +% \installdefinitionsetmember \??btx {btxspecification} \??btx {btx} + +%D And more helpers ... a never ending story these publications: + +% \definebtx +% [btx:apa:list:article:title] +% [style=bolditalic, +% command=\WORD] +% +% \btxstartstyle[btx:apa:list:article:title] +% \btxusecommand[btx:apa:list:article:title]{foo} +% \btxstopstyle + +\let\savedcurrentbtx\empty + +\unexpanded\def\btxstartstyle[#1]% + {\begingroup + \let\savedcurrentbtx\currentbtx + \def\currentbtx{#1}% + \usebtxstyle\c!style + \let\currentbtx\savedcurrentbtx} + +\unexpanded\def\btxstartcolor[#1]% + {\begingroup + \let\savedcurrentbtx\currentbtx + \def\currentbtx{#1}% + \usebtxcolor\c!color + \let\currentbtx\savedcurrentbtx} + +\unexpanded\def\btxstartstyleandcolor[#1]% + {\begingroup + \let\savedcurrentbtx\currentbtx + \def\currentbtx{#1}% + \usebtxstyleandcolor\c!style\c!color + \let\currentbtx\savedcurrentbtx} + +\let\btxstopstyle \endgroup +\let\btxstopcolor \endgroup +\let\btxstopstyleandcolor\endgroup + +\unexpanded\def\btxusecommand[#1]% + {\namedbtxparameter{#1}\c!command} %D Defaults: \setupbtxrendering - [\c!dataset=\v!standard, + [\c!interaction=\v!start, % \v!all + \c!specification=\btxparameter\c!specification, + \c!dataset=\v!default, + \c!repeat=\v!no, + \c!continue=\v!no, \c!method=\v!global, - \c!setups=btx:rendering:\btxrenderingparameter\c!alternative, - \c!alternative=apa, - \c!sorttype=, - \c!criterium=, + % \c!setups=btx:\btxrenderingparameter\c!alternative:initialize, % not the same usage as cite ! + % \c!sorttype=authoryear, + \c!criterium=\v!text, \c!refcommand=authoryears, % todo \c!numbering=\v!yes, -% \c!autohang=\v!no, + %\c!saveinlist=\v!no, % maybe for before/after + \c!textstate=\v!start, \c!width=\v!auto, - \c!separator={; }, + %\c!pageright=, + %\c!pageleft=, + \c!separator={;\space}, \c!distance=1.5\emwidth] -\definebtxrendering - [\v!standard] +% Quite some interpunction and labels are the same of at least consistent within +% a standard when citations and list entries are involved. We assume that each +% standard defines its own set but it can fall back on these defaults. -\setupbtxcitevariant +\setupbtx [\c!interaction=\v!start, - \c!setups=btx:cite:\btxcitevariantparameter\c!alternative, - \c!alternative=num, - \c!andtext={ and }, - \c!otherstext={ et al.}, - \c!pubsep={, }, - \c!lastpubsep={ and }, - \c!finalpubsep={ and }, + \c!alternative=num, % default cite form + \c!inbetween=\space, + \c!range=\endash, % separator:range? \c!compress=\v!no, - \c!inbetween={ }, - \c!range=\endash, - \c!left=, - \c!middle=, - \c!right=] - -\definebtxcitevariant - [author] - [%c!sorttype=, - \c!left={(}, - \c!middle={, }, - \c!right={)}] - -\definebtxcitevariant - [authornum] - [author] - [\c!inbetween={ }] - -\definebtxcitevariant - [authoryear] - [\c!compress=\v!yes, - \c!inbetween={, }, - \c!left={(}, - \c!middle={, }, - \c!right={)}] - -\definebtxcitevariant - [authoryears] - [authoryear] - -\definebtxcitevariant - [author:num] - [authornum] - [\c!left={[}, - \c!right={]}] - -\definebtxcitevariant - [author:year] - [authoryear] - [\c!left={(}, - \c!right={)}] - -\definebtxcitevariant - [author:years] - [authoryears] - [\c!left=, - \c!right=] - -\definebtxcitevariant - [year] - [\c!left={(}, - \c!middle={, }, % is middle used? - \c!right={)}] - -\definebtxcitevariant - [tag] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [key] - [tag] - -\definebtxcitevariant - [serial] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [page] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [short] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [category] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [type] - [category] - -\definebtxcitevariant - [doi] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [url] - [\c!left={[}, - \c!middle={, }, - \c!right={]}] - -\definebtxcitevariant - [page] - [\c!left=, - \c!middle={, }, - \c!right=] - -\definebtxcitevariant - [num] - [\c!compress=\v!yes, - \c!left={[}, - \c!middle={, }, - \c!right={]}] - -\setupbtxlistvariant - [\c!namesep={, }, - \c!lastnamesep={ and }, - \c!finalnamesep={ and }, - \c!firstnamesep={ }, - \c!juniorsep={ }, - \c!vonsep={ }, - \c!surnamesep={, }, - \c!surnameinitialsep={, }, - \c!surnamefirstnamesep={, }, - \c!etallimit=5, - \c!etaldisplay=5, - \c!etaltext={ et al.}, - \c!monthconversion=\v!number, - \c!authorconversion=\v!normal] - -\definebtxlistvariant - [author] - [author=invertedshort] % we could also do this in the apa style itself - -\definebtxlistvariant - [editor] - [author] - -\definebtxlistvariant - [artauthor] - [author] - -\setupbtxcitevariant - [\c!author =\btxlistvariantparameter\c!author, - \c!etallimit =\btxlistvariantparameter\c!etallimit, - \c!etaldisplay =\btxlistvariantparameter\c!etaldisplay] + \c!etallimit=3, + \c!etaldisplay=\btxparameter\c!etallimit, + \c!otherstext={\space et al.}, + \c!separator:firstnames={\space}, + \c!separator:juniors={\space}, + \c!separator:vons={\space}, + \c!separator:initials={\space}, + \c!stopper:initials={.}, + %\c!surnamesep={,\space}, % is this used anywhere? + \c!separator:invertedinitials={,\space}, + \c!separator:invertedfirstnames={,\space}, + \c!separator:names:2={,\space}, % separates multiple names + \c!separator:names:3=\btxparameter{\c!separator:2}, % before last name in a list + \c!separator:names:4=\btxparameter{\c!separator:2}, % between only two names + \c!separator:2={;\space}, % aka pubsep - separates multiple objects + \c!separator:3=\btxparameter{separator:2}, % before last object in a list + \c!separator:4=\btxparameter{separator:2}] % between only two objects % Do we want these in the format? Loading them delayed is somewhat messy. -\loadbtxdefinitionfile[apa] -\loadbtxdefinitionfile[cite] \loadbtxdefinitionfile[commands] \loadbtxdefinitionfile[definitions] +\loadbtxdefinitionfile[cite] +\loadbtxdefinitionfile[list] +\loadbtxdefinitionfile[page] +\loadbtxdefinitionfile[author] + +% we assume that the users sets up the right specification and if not ... well, +% hope for the best that something shows up and consult the manual otherwise + +\unexpanded\def\usebtxdefinitions[#1]% + {\loadbtxdefinitionfile[#1]% % for hh + \setupbtx[\c!specification=#1]} % for ab + +\setupbtx + [\c!specification=\s!default, + \c!dataset=\v!default, + \c!default=\v!default] + +\loadbtxdefinitionfile + [\s!default] + \protect diff --git a/Master/texmf-dist/tex/context/base/publ-jrn.lua b/Master/texmf-dist/tex/context/base/publ-jrn.lua new file mode 100644 index 00000000000..2e040841798 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-jrn.lua @@ -0,0 +1,188 @@ +if not modules then modules = { } end modules ['publ-jrn'] = { + version = 1.001, + comment = "this module part of publication support", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- http://jabref.sourceforge.net/journals/journal_abbreviations_general.txt +-- +-- = [;shortest unique abbreviation[;frequency]]. + +-- require("char-utf") + +-- Abhandlungen aus dem Westfälischen Museum für Naturkunde = Abh. Westfäl. Mus. Nat.kd. +-- Abhandlungen der Naturforschenden Gesellschaft in Zürich = Abh. Nat.forsch. Ges. Zür. +-- Abhandlungen des Naturwissenschaftlichen Vereins zu Bremen = Abh. Nat.wiss. Ver. Bremen + +local context = context +local commands = commands + +local find = string.find +local P, C, S, Cs, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.S, lpeg.Cs, lpeg.match, lpeg.patterns + +local report_journals = logs.reporter("publications","journals") + +local publications = publications +local journals = { } +publications.journals = journals + +local lowercase = characters.lower + +local expansions = { } +local abbreviations = { } +local nofexpansions = 0 +local nofabbreviations = 0 + +local valid = 1 - S([[ ."':;,-]]) +local pattern = Cs((valid^1 + P(1)/"")^1) + +local function simplify(name) + -- we have utf but it doesn't matter much if we lower the bytes + return name and lowercase(lpegmatch(pattern,name)) or name +end + +local function add(expansion,abbreviation) + if expansion and abbreviation then + local se = simplify(expansion) + local sa = simplify(abbreviation) + if not expansions[sa] then + expansions[sa] = expansion + nofexpansions = nofexpansions + 1 + end + if not abbreviations[se] then + abbreviations[se] = abbreviation + nofabbreviations = nofabbreviations + 1 + end + end +end + +-- [#%-] comment +-- meaning = abbreviations [;.....] + +local whitespace = lpegpatterns.whitespace^0 +local assignment = whitespace * P("=") * whitespace +local separator = P(";") +local newline = lpegpatterns.newline +local endofline = lpegpatterns.space^0 * (newline + P(-1) + separator) +local restofline = (1-newline)^0 +local splitter = whitespace * C((1-assignment)^1) * assignment * C((1-endofline)^1) * restofline +local comment = S("#-%") * restofline +local pattern = (comment + splitter / add)^0 + +function journals.load(filename) + if not filename then + return + end-- error + if file.suffix(filename,"txt") then + local data = io.loaddata(filename) + if type(data) ~= "string" then + return + elseif find(data,"=") then + -- expansion = abbreviation + lpegmatch(pattern,data) + end + elseif file.suffix(filename,"lua") then + local data = table.load(filename) + if type(data) ~= "table" then + return + else + local de = data.expansions + local da = data.abbreviations + if de and da then + -- { expansions = { a = e }, abbreviations = { e = a } } + if next(expansions) then + table.merge(expansions,de) + else + expansions = de + end + if next(abbreviations) then + table.merge(abbreviations,da) + else + abbreviations = da + end + elseif #data > 0 then + -- { expansion, abbreviation }, ... } + for i=1,#data do + local d = d[i] + add(d[1],d[2]) + end + else + -- { expansion = abbreviation, ... } + for expansion, abbreviation in data do + add(expansion,abbreviation) + end + end + end + end + report_journals("file %a loaded, %s expansions, %s abbreviations",filename,nofexpansions,nofabbreviations) +end + +function journals.save(filename) + table.save(filename,{ expansions = expansions, abbreviations = abbreviations }) +end + +function journals.add(expansion,abbreviation) + add(expansion,abbreviation) +end + +function journals.expanded(name) + local s = simplify(name) + return expansions[s] or expansions[simplify(abbreviations[s])] or name +end + +function journals.abbreviated(name) + local s = simplify(name) + return abbreviations[s] or abbreviations[simplify(expansions[s])] or name +end + +local implement = interfaces and interfaces.implement + +if implement then + + implement { + name = "btxloadjournallist", + arguments = "string", + actions = journals.load + } + + implement { + name = "btxsavejournallist", + arguments = "string", + actions = journals.save + } + + implement { + name = "btxaddjournal", + arguments = { "string", "string" }, + actions = { journals.add, context } + } + + implement { + name = "btxexpandedjournal", + arguments = "string", + actions = { journals.expanded, context }, + } + + implement { + name = "btxabbreviatedjournal", + arguments = "string", + actions = { journals.abbreviated, context }, + } + +end + +-- journals.load("e:/tmp/journals.txt") +-- journals.save("e:/tmp/journals.lua") + +-- inspect(journals.expanded ("Z. Ökol. Nat.schutz")) +-- inspect(journals.abbreviated("Z. Ökol. Nat. schutz")) + +if typesetters then + typesetters.manipulators.methods.expandedjournal = journals.expanded + typesetters.manipulators.methods.abbreviatedjournal = journals.abbreviated +end + +-- journals.load("t:/manuals/publications-mkiv/journals.txt") +-- journals.save("t:/manuals/publications-mkiv/journals.lua") diff --git a/Master/texmf-dist/tex/context/base/publ-oth.lua b/Master/texmf-dist/tex/context/base/publ-oth.lua index 14da19f9cb4..55c62c31eba 100644 --- a/Master/texmf-dist/tex/context/base/publ-oth.lua +++ b/Master/texmf-dist/tex/context/base/publ-oth.lua @@ -11,8 +11,10 @@ local lpegmatch = lpeg.match local p_endofline = lpeg.patterns.newline -local loaders = publications.loaders -local getindex = publications.getindex +local publications = publications + +local loaders = publications.loaders +local getindex = publications.getindex local function addfield(t,k,v,fields) k = fields[k] @@ -66,7 +68,10 @@ end function loaders.endnote(dataset,filename) -- we could combine the next into checkfield but let's not create too messy code - loaders.lua(dataset,publications.endnotes_to_btx(io.loaddata(filename) or "")) + local dataset, fullname = publications.resolvedname(dataset,filename) + if fullname then + loaders.lua(dataset,publications.endnotes_to_btx(io.loaddata(fullname) or "")) + end end -- refman -- @@ -97,7 +102,10 @@ end function loaders.refman(dataset,filename) -- we could combine the next into checkfield but let's not create too messy code - loaders.lua(dataset,publications.refman_to_btx(io.loaddata(filename) or "")) + local dataset, fullname = publications.resolvedname(dataset,filename) + if fullname then + loaders.lua(dataset,publications.refman_to_btx(io.loaddata(fullname) or "")) + end end -- test -- diff --git a/Master/texmf-dist/tex/context/base/publ-reg.lua b/Master/texmf-dist/tex/context/base/publ-reg.lua new file mode 100644 index 00000000000..39469e510db --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-reg.lua @@ -0,0 +1,177 @@ +if not modules then modules = { } end modules ['publ-reg'] = { + version = 1.001, + comment = "this module part of publication support", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local formatters = string.formatters +local concat = table.concat +local sortedhash = table.sortedhash +local lpegmatch = lpeg.match + +local context = context + +local implement = interfaces.implement +local variables = interfaces.variables + +local v_once = variables.once +local v_stop = variables.stop +local v_all = variables.all + +local publications = publications +local datasets = publications.datasets +local specifications = publications.specifications +local writers = publications.writers +local getcasted = publications.getcasted + +local registrations = { } +local sequence = { } +local flushers = table.setmetatableindex(function(t,k) local v = t.default t[k] = v return v end) + +local function btxsetregister(specification) + local name = specification.name + local register = specification.register + local dataset = specification.dataset + local field = specification.field + if not field or field == "" or not register or register == "" then + return + end + if not dataset or dataset == "" then + dataset = v_all + end + -- could be metatable magic + local s = registrations[register] + if not s then + s = { } + registrations[register] = s + end + local processors = name ~= register and name or "" + if processor == "" then + processor = nil + elseif processor then + processor = "btx:r:" .. processor + end + local datasets = utilities.parsers.settings_to_array(dataset) + for i=1,#datasets do + local dataset = datasets[i] + local d = s[dataset] + if not d then + d = { } + s[dataset] = d + end + -- + -- check all + -- + d.active = specification.state ~= v_stop + d.once = specification.method == v_once or false + d.field = field + d.processor = processor + d.alternative = d.alternative or specification.alternative + d.register = register + d.dataset = dataset + d.done = d.done or { } + end + -- + sequence = { } + for register, s in sortedhash(registrations) do + for dataset, d in sortedhash(s) do + if d.active then + sequence[#sequence+1] = d + end + end + end +end + +local function btxtoregister(dataset,tag) + local current = datasets[dataset] + for i=1,#sequence do + local step = sequence[i] + local dset = step.dataset + if dset == v_all or dset == dataset then + local done = step.done + if not done[tag] then + local value, field, kind = getcasted(current,tag,step.field,specifications[step.specification]) + if value then + flushers[kind](step,field,value) + end + done[tag] = true + end + end + end +end + +implement { + name = "btxsetregister", + actions = btxsetregister, + arguments = { + { + { "specification" }, + { "name" }, + { "state" }, + { "dataset" }, + { "field" }, + { "register" }, + { "method" }, + { "alternative" }, + } + } +} + +implement { + name = "btxtoregister", + actions = btxtoregister, + arguments = { "string", "string" } +} + +-- context.setregisterentry ( +-- { register }, +-- { +-- ["entries:1"] = value, +-- ["keys:1"] = value, +-- } +-- ) + +local ctx_dosetfastregisterentry = context.dosetfastregisterentry -- register entry key + +----- p_keywords = lpeg.tsplitat(lpeg.patterns.whitespace^0 * lpeg.P(";") * lpeg.patterns.whitespace^0) +local components = publications.components.author +local f_author = formatters[ [[\btxindexedauthor{%s}{%s}{%s}{%s}{%s}{%s}]] ] + +function flushers.string(step,field,value) + if type(value) == "string" and value ~= "" then + ctx_dosetfastregisterentry(step.register,value or "","",step.processor or "","") + end +end + +flushers.default = flushers.string + +local shorts = { + normalshort = "normalshort", + invertedshort = "invertedshort", +} + +function flushers.author(step,field,value) + if type(value) == "table" and #value > 0 then + local register = step.register + local processor = step.processor + local alternative = shorts[step.alternative or "invertedshort"] or "invertedshort" + for i=1,#value do + local a = value[i] + local k = writers[field] { a } + local e = f_author(alternative,components(a,short)) + ctx_dosetfastregisterentry(register,e,k,processor or "","") + end + end +end + +function flushers.keyword(step,field,value) + if type(value) == "table" and #value > 0 then + local register = step.register + local processor = step.processor + for i=1,#value do + ctx_dosetfastregisterentry(register,value[i],"",processor or "","") + end + end +end diff --git a/Master/texmf-dist/tex/context/base/publ-sor.lua b/Master/texmf-dist/tex/context/base/publ-sor.lua new file mode 100644 index 00000000000..c3fcdb0eed1 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/publ-sor.lua @@ -0,0 +1,276 @@ +if not modules then modules = { } end modules ['publ-sor'] = { + version = 1.001, + comment = "this module part of publication support", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- if needed we can optimize this one: chekc if it's detail or something else +-- and use direct access, but in practice it's fast enough + +local type = type +local concat = table.concat +local formatters = string.formatters +local compare = sorters.comparers.basic -- (a,b) +local sort = table.sort + +local toarray = utilities.parsers.settings_to_array +local utfchar = utf.char + +local publications = publications +local writers = publications.writers + +local variables = interfaces.variables +local v_short = variables.short +local v_default = variables.default +local v_reference = variables.reference +local v_dataset = variables.dataset + +local report = logs.reporter("publications","sorters") + +local trace_sorters trackers.register("publications.sorters",function(v) trace_sorters = v end) + +-- authors(s) | year | journal | title | pages + +local template = [[ +local type, tostring = type, tostring + +local writers = publications.writers +local datasets = publications.datasets +local getter = publications.getfaster -- (current,data,details,field,categories,types) +local strip = sorters.strip +local splitter = sorters.splitters.utf + +local function newsplitter(splitter) + return table.setmetatableindex({},function(t,k) -- could be done in the sorter but seldom that many shared + local v = splitter(k,true) -- in other cases + t[k] = v + return v + end) +end + +return function(dataset,list,method) -- indexer + local current = datasets[dataset] + local luadata = current.luadata + local details = current.details + local specification = publications.currentspecification + local categories = specification.categories + local types = specification.types + local splitted = newsplitter(splitter) -- saves mem + local snippets = { } -- saves mem + local result = { } + +%helpers% + + for i=1,#list do + -- either { tag, tag, ... } or { { tag, index }, { tag, index } } + local li = list[i] + local tag = type(li) == "string" and li or li[1] + local index = tostring(i) + local entry = luadata[tag] + if entry then + local detail = details[tag] + result[i] = { + index = i, + split = { + +%getters% + + }, + } + else + result[i] = { + index = i, + split = { + +%unknowns% + + }, + } + end + end + return result +end +]] + +local f_getter = formatters["splitted[strip(getter(current,entry,detail,%q,categories,types) or %q)], -- %s"] +local f_writer = formatters["splitted[strip(writer_%s(getter(current,entry,detail,%q,categories,types) or %q,snippets))], -- %s"] +local f_helper = formatters["local writer_%s = writers[%q] -- %s: %s"] +local f_value = formatters["splitted[%q], -- %s"] +local s_index = "splitted[index], -- the order in the list, always added" + +-- there is no need to cache this in specification + +local sharedmethods = { } +publications.sortmethods = sharedmethods + +local function sortsequence(dataset,list,sorttype) + + if not list or #list == 0 then + return + end + + local specification = publications.currentspecification + local types = specification.types + local sortmethods = specification.sortmethods + local method = sortmethods and sortmethods[sorttype] or sharedmethods[sorttype] + local sequence = method and method.sequence + + local s_default = "" + local s_unknown = "" + + local c_default = utfchar(0xFFFE) + local c_unknown = utfchar(0xFFFF) + + if not sequence and type(sorttype) == "string" then + local list = toarray(sorttype) + if #list > 0 then + sequence = { } + for i=1,#list do + local entry = toarray(list[i]) + local field = entry[1] + local default = entry[2] + local unknown = entry[3] or default + sequence[i] = { + field = field, + default = default == s_default and c_default or default or c_default, + unknown = unknown == s_unknown and c_unknown or unknown or c_unknown, + } + end + end + if trace_sorters then + report("creating sequence from method %a",sorttype) + end + end + + if sequence then + + local getters = { } + local unknowns = { } + local helpers = { } + + if trace_sorters then + report("initializing method %a",sorttype) + end + + for i=1,#sequence do + local step = sequence[i] + local field = step.field or "?" + local default = step.default or c_default + local unknown = step.unknown or c_unknown + local fldtype = types[field] + local writer = fldtype and writers[fldtype] + + if trace_sorters then + report("% 3i : field %a, type %a, default %a, unknown %a",i,field,fldtype, + default == c_default and s_default or default, + unknown == c_unknown and s_unknown or unknown + ) + end + + if writer then + local h = #helpers + 1 + getters[i] = f_writer(h,field,default,field) + helpers[h] = f_helper(h,fldtype,field,fldtype) + else + getters[i] = f_getter(field,default,field) + end + unknowns[i] = f_value(unknown,field) + end + + unknowns[#unknowns+1] = s_index + getters [#getters +1] = s_index + + local code = utilities.templates.replace(template, { + helpers = concat(helpers, "\n"), + getters = concat(getters, "\n"), + unknowns = concat(unknowns,"\n"), + }) + + -- print(code) + + local action, error = loadstring(code) + if type(action) == "function" then + action = action() + else + report("error when compiling sort method %a: %s",sorttype,error or "unknown") + end + if type(action) == "function" then + local valid = action(dataset,list,method) + if valid and #valid > 0 then + sorters.sort(valid,compare) + return valid + else + report("error when applying sort method %a",sorttype) + end + else + report("error in sort method %a",sorttype) + end + else + report("invalid sort method %a",sorttype) + end + +end + +local sorters = { + [v_short] = function(dataset,rendering,list) + local shorts = rendering.shorts + local function compare(a,b) + local aa, bb = a and a[1], b and b[1] + if aa and bb then + aa, bb = shorts[aa], shorts[bb] + return aa and bb and aa < bb + end + return false + end + sort(list,compare) + end, + [v_reference] = function(dataset,rendering,list) + local function compare(a,b) + local aa, bb = a and a[1], b and b[1] + if aa and bb then + return aa and bb and aa < bb + end + return false + end + sort(list,compare) + end, + [v_dataset] = function(dataset,rendering,list) + local function compare(a,b) +-- inspect(a,b) + local aa, bb = a and a[6], b and b[6] + if aa and bb then + -- aa, bb = list[aa].index or 0, list[bb].index or 0 + return aa and bb and aa < bb + end + return false + end + sort(list,compare) + end, + [v_default] = function(dataset,rendering,list,sorttype) -- experimental + if sorttype == "" or sorttype == v_default then + local function compare(a,b) + local aa, bb = a and a[3], b and b[3] + if aa and bb then + return aa and bb and aa < bb + end + return false + end + sort(list,compare) + else + local valid = sortsequence(dataset,list,sorttype) + if valid and #valid > 0 then + for i=1,#valid do + local v = valid[i] + valid[i] = list[v.index] + end + return valid + end + end + end +} + +table.setmetatableindex(sorters,function(t,k) return t[v_default] end) + +publications.lists.sorters = sorters diff --git a/Master/texmf-dist/tex/context/base/publ-tra.lua b/Master/texmf-dist/tex/context/base/publ-tra.lua index 98c81d800dd..65e9b7ff486 100644 --- a/Master/texmf-dist/tex/context/base/publ-tra.lua +++ b/Master/texmf-dist/tex/context/base/publ-tra.lua @@ -6,291 +6,475 @@ if not modules then modules = { } end modules ['publ-tra'] = { license = "see context related readme files" } -local sortedhash = table.sortedhash - -local tracers = { } -publications.tracers = tracers -local datasets = publications.datasets - -local context = context -local NC, NR = context.NC, context.NR -local bold = context.bold -local darkgreen, darkred, darkblue = context.darkgreen, context.darkred, context.darkblue - -local fields = table.sorted { - "abstract", - "address", - "annotate", - "author", - "booktitle", - "chapter", - "comment", - "country", - "doi", - "edition", - "editor", - "eprint", - "howpublished", - "institution", - "isbn", - "issn", - "journal", - "key", - "keyword", - "keywords", - "language", - "lastchecked", - "month", - "names", - "note", - "notes", - "number", - "organization", - "pages", - "publisher", - "school", - "series", - "size", - "title", - "type", - "url", - "volume", - "year", - "nationality", - "assignee", - "bibnumber", - "day", - "dayfiled", - "monthfiled", - "yearfiled", - "revision", -} +-- todo: use context.tt .. more efficient, less code -local citevariants = table.sorted { - "author", - "authoryear", - "authoryears", - "authornum", - "year", - "short", - "serial", - "key", - "doi", - "url", - "type", - "page", - "none", - "num", -} +local next, type = next, type -local listvariants = table.sorted { - "author", - "editor", - "artauthor", -} +local sortedhash = table.sortedhash +local sortedkeys = table.sortedkeys +local settings_to_array = utilities.parsers.settings_to_array +local formatters = string.formatters +local concat = table.concat --- local categories = table.sorted { --- "article", --- "book", --- "booklet", --- "conference", --- "inbook", --- "incollection", --- "inproceedings", --- "manual", --- "mastersthesis", --- "misc", --- "phdthesis", --- "proceedings", --- "techreport", --- "unpublished", --- } - -local categories = { - article = { - required = { "author", "title", "journal", "year" }, - optional = { "volume", "number", "pages", "month", "note" }, - }, - book = { - required = { { "author", "editor" }, "title", "publisher", "year" }, - optional = { { "volume", "number" }, "series", "address", "edition", "month","note" }, - }, - booklet = { - required = { "title" }, - optional = { "author", "howpublished", "address", "month", "year", "note" }, - }, - inbook = { - required = { { "author", "editor" }, "title", { "chapter", "pages" }, "publisher","year" }, - optional = { { "volume", "number" }, "series", "type", "address", "edition", "month", "note" }, - }, - incollection = { - required = { "author", "title", "booktitle", "publisher", "year" }, - optional = { "editor", { "volume", "number" }, "series", "type", "chapter", "pages", "address", "edition", "month", "note" }, - }, - inproceedings = { - required = { "author", "title", "booktitle", "year" }, - optional = { "editor", { "volume", "number" }, "series", "pages", "address", "month","organization", "publisher", "note" }, - }, - manual = { - required = { "title" }, - optional = { "author", "organization", "address", "edition", "month", "year", "note" }, - }, - mastersthesis = { - required = { "author", "title", "school", "year" }, - optional = { "type", "address", "month", "note" }, - }, - misc = { - required = { "author", "title", "howpublished", "month", "year", "note" }, - optional = { "author", "title", "howpublished", "month", "year", "note" }, - }, - phdthesis = { - required = { "author", "title", "school", "year" }, - optional = { "type", "address", "month", "note" }, - }, - proceedings = { - required = { "title", "year" }, - optional = { "editor", { "volume", "number" }, "series", "address", "month", "organization", "publisher", "note" }, - }, - techreport = { - required = { "author", "title", "institution", "year" }, - optional = { "type", "number", "address", "month", "note" }, - }, - unpublished = { - required = { "author", "title", "note" }, - optional = { "month", "year" }, - }, -} +local context = context +local commands = commands + +local v_default = interfaces.variables.default + +local publications = publications +local tracers = publications.tracers +local tables = publications.tables +local datasets = publications.datasets +local specifications = publications.specifications +local citevariants = publications.citevariants +local getfield = publications.getfield +local getcasted = publications.getcasted -publications.tracers.fields = fields -publications.tracers.categories = categories -publications.tracers.citevariants = citevariants -publications.tracers.listvariants = listvariants --- -- -- +local ctx_NC, ctx_NR, ctx_HL, ctx_FL, ctx_ML, ctx_LL, ctx_EQ = context.NC, context.NR, context.HL, context.FL, context.ML, context.LL, context.EQ -function tracers.showdatasetfields(dataset) - local luadata = datasets[dataset].luadata +local ctx_starttabulate = context.starttabulate +local ctx_stoptabulate = context.stoptabulate + +local ctx_formatted = context.formatted +local ctx_bold = ctx_formatted.monobold +local ctx_monobold = ctx_formatted.monobold +local ctx_verbatim = ctx_formatted.verbatim + +local ctx_rotate = context.rotate +local ctx_llap = context.llap +local ctx_rlap = context.rlap +local ctx_page = context.page + +local privates = tables.privates +local specials = tables.specials + +local report = logs.reporter("publications","tracers") + +function tracers.showdatasetfields(settings) + local dataset = settings.dataset + local current = datasets[dataset] + local luadata = current.luadata + local specification = settings.specification + local fielddata = specification and specifications[specification] or specifications.apa + local categories = fielddata.categories if next(luadata) then - context.starttabulate { "|lT|lT|pT|" } - NC() bold("tag") - NC() bold("category") - NC() bold("fields") - NC() NR() context.FL() -- HL() - for k, v in sortedhash(luadata) do - NC() context(k) - NC() context(v.category) - NC() - for k, v in sortedhash(v) do - if k ~= "details" and k ~= "tag" and k ~= "category" then - context("%s ",k) + ctx_starttabulate { "|lT|lT|pTl|" } + ctx_NC() ctx_bold("tag") + ctx_NC() ctx_bold("category") + ctx_NC() ctx_bold("fields") + ctx_NC() ctx_NR() + ctx_FL() + for tag, entry in sortedhash(luadata) do + local category = entry.category + local catedata = categories[category] + local fields = catedata and catedata.fields or { } + ctx_NC() context(tag) + ctx_NC() context(category) + ctx_NC() -- grouping around colors needed + for key, value in sortedhash(entry) do + if privates[key] then + -- skip + elseif specials[key] then + context("{\\darkblue %s} ",key) + else + local kind = fields[key] + if kind == "required" then + context("{\\darkgreen %s} ",key) + elseif kind == "optional" then + context("%s ",key) + else + context("{\\darkyellow %s} ",key) + end end end - NC() NR() + ctx_NC() ctx_NR() end - context.stoptabulate() + ctx_stoptabulate() end end -function tracers.showdatasetcompleteness(dataset) +function tracers.showdatasetcompleteness(settings) + local dataset = settings.dataset + local current = datasets[dataset] + local luadata = current.luadata + local specification = settings.specification + local fielddata = specification and specifications[specification] or specifications.apa + local categories = fielddata.categories - dataset = datasets[dataset] + -- local lpegmatch = lpeg.match + -- local texescape = lpeg.patterns.texescape - local preamble = { "|lBTw(10em)|p|" } + local preamble = { "|lTBw(5em)|lBTp(10em)|plT|" } - local function required(key,value,indirect) - NC() darkgreen(key) - NC() if indirect then - darkblue(value) - elseif value then - context(value) + local function identified(tag,category,crossref) + ctx_NC() + ctx_NC() ctx_monobold(category) + ctx_NC() if crossref then + ctx_monobold("%s\\hfill\\darkblue => %s",tag,crossref) else - darkred("\\tttf [missing]") + ctx_monobold(tag) end - NC() NR() + ctx_NC() ctx_NR() end - local function optional(key,value,indirect) - NC() context(key) - NC() if indirect then - darkblue(value) - elseif value then - context(value) - end - NC() NR() + local function required(done,foundfields,key,value,indirect) + ctx_NC() if not done then ctx_monobold("required") end + ctx_NC() context(key) + ctx_NC() + if indirect then + if value then + context("\\darkblue") + ctx_verbatim(value) + else + context("\\darkred\\tttf [missing crossref]") + end + elseif value then + ctx_verbatim(value) + else + context("\\darkred\\tttf [missing value]") + end + ctx_NC() ctx_NR() + foundfields[key] = nil + return done or true end - local function identified(tag,crossref) - NC() context("tag") - NC() if crossref then - context("\\tttf %s\\hfill\\darkblue => %s",tag,crossref) - else - context("\\tttf %s",tag) - end - NC() NR() + local function optional(done,foundfields,key,value,indirect) + ctx_NC() if not done then ctx_monobold("optional") end + ctx_NC() context(key) + ctx_NC() + if indirect then + context("\\darkblue") + ctx_verbatim(value) + elseif value then + ctx_verbatim(value) + end + ctx_NC() ctx_NR() + foundfields[key] = nil + return done or true end - local luadata = datasets[dataset].luadata + local function special(done,key,value) + ctx_NC() if not done then ctx_monobold("special") end + ctx_NC() context(key) + ctx_NC() ctx_verbatim(value) + ctx_NC() ctx_NR() + return done or true + end + + local function extra(done,key,value) + ctx_NC() if not done then ctx_monobold("extra") end + ctx_NC() context(key) + ctx_NC() ctx_verbatim(value) + ctx_NC() ctx_NR() + return done or true + end if next(luadata) then - for tag, entry in table.sortedhash(luadata) do - local category = entry.category - local fields = categories[category] + for tag, entry in sortedhash(luadata) do + local category = entry.category + local fields = categories[category] + local foundfields = { } + for k, v in next, entry do + foundfields[k] = true + end + ctx_starttabulate(preamble) + identified(tag,category,entry.crossref) + ctx_FL() if fields then - context.starttabulate(preamble) - identified(tag,entry.crossref) - context.HL() local requiredfields = fields.required - local optionalfields = fields.optional - for i=1,#requiredfields do - local r = requiredfields[i] - if type(r) == "table" then - local okay = true - for i=1,#r do - local ri = r[i] - if rawget(entry,ri) then - required(ri,entry[ri]) - okay = true - elseif entry[ri] then - required(ri,entry[ri],true) - okay = true + local sets = fields.sets or { } + local done = false + if requiredfields then + for i=1,#requiredfields do + local r = requiredfields[i] + local r = sets[r] or r + if type(r) == "table" then + local okay = false + for i=1,#r do + local ri = r[i] + if rawget(entry,ri) then + done = required(done,foundfields,ri,entry[ri]) + okay = true + elseif entry[ri] then + done = required(done,foundfields,ri,entry[ri],true) + okay = true + end end + if not okay then + done = required(done,foundfields,table.concat(r," {\\letterbar} ")) + end + elseif rawget(entry,r) then + done = required(done,foundfields,r,entry[r]) + elseif entry[r] then + done = required(done,foundfields,r,entry[r],true) + else + done = required(done,foundfields,r) end - if not okay then - required(table.concat(r,"\\letterbar ")) - end - elseif rawget(entry,r) then - required(r,entry[r]) - elseif entry[r] then - required(r,entry[r],true) - else - required(r) end end - for i=1,#optionalfields do - local o = optionalfields[i] - if type(o) == "table" then - for i=1,#o do - local oi = o[i] - if rawget(entry,oi) then - optional(oi,entry[oi]) - elseif entry[oi] then - optional(oi,entry[oi],true) + local optionalfields = fields.optional + local done = false + if optionalfields then + for i=1,#optionalfields do + local o = optionalfields[i] + local o = sets[o] or o + if type(o) == "table" then + for i=1,#o do + local oi = o[i] + if rawget(entry,oi) then + done = optional(done,foundfields,oi,entry[oi]) + elseif entry[oi] then + done = optional(done,foundfields,oi,entry[oi],true) + end end + elseif rawget(entry,o) then + done = optional(done,foundfields,o,entry[o]) + elseif entry[o] then + done = optional(done,foundfields,o,entry[o],true) end - elseif rawget(entry,o) then - optional(o,entry[o]) - elseif entry[o] then - optional(o,entry[o],true) end end - context.stoptabulate() + end + local done = false + for k, v in sortedhash(foundfields) do + if privates[k] then + -- skip + elseif specials[k] then + done = special(done,k,entry[k]) + end + end + local done = false + for k, v in sortedhash(foundfields) do + if privates[k] then + -- skip + elseif not specials[k] then + done = extra(done,k,entry[k]) + end + end + ctx_stoptabulate() + end + end + +end + +function tracers.showfields(settings) + local rotation = settings.rotation + local specification = settings.specification + local fielddata = specification and specifications[specification] or specifications.apa + local categories = fielddata.categories + local validfields = { } + for category, data in next, categories do + local sets = data.sets + local fields = data.fields + for name, list in next, fields do + validfields[name] = true + end + end + local s_categories = sortedkeys(categories) + local s_fields = sortedkeys(validfields) + ctx_starttabulate { "|l" .. string.rep("|c",#s_categories) .. "|" } + ctx_FL() + ctx_NC() + if rotation then + rotation = { rotation = rotation } + end + for i=1,#s_categories do + ctx_NC() + local txt = formatters["\\bf %s"](s_categories[i]) + if rotation then + ctx_rotate(rotation,txt) + else + context(txt) + end + end + ctx_NC() ctx_NR() + ctx_FL() + for i=1,#s_fields do + local field = s_fields[i] + ctx_NC() + ctx_bold(field) + for j=1,#s_categories do + ctx_NC() + local kind = categories[s_categories[j]].fields[field] + if kind == "required" then + context("\\darkgreen*") + elseif kind == "optional" then + context("*") + end + end + ctx_NC() ctx_NR() + end + ctx_LL() + ctx_stoptabulate() +end + +function tracers.showtables(settings) + for name, list in sortedhash(tables) do + ctx_starttabulate { "|Tl|Tl|" } + ctx_FL() + ctx_NC() + ctx_rlap(function() ctx_bold(name) end) + ctx_NC() + ctx_NC() + ctx_NR() + ctx_FL() + for k, v in sortedhash(list) do + ctx_NC() + context(k) + ctx_NC() + if type(v) == "table" then + context("% t",v) else - -- error + context(tostring(v)) + end + ctx_NC() + ctx_NR() + end + ctx_LL() + ctx_stoptabulate() + end +end + +function tracers.showdatasetauthors(settings) + + local dataset = settings.dataset + local field = settings.field + + local sortkey = publications.writers.author + + if not dataset or dataset == "" then dataset = v_default end + if not field or field == "" then field = "author" end + + local function row(i,k,v) + ctx_NC() + if i then + ctx_verbatim(i) + end + ctx_NC() + ctx_verbatim(k) + ctx_EQ() + if type(v) == "table" then + local t = { } + for i=1,#v do + local vi = v[i] + if type(vi) == "table" then + t[i] = concat(vi,"-") + else + t[i] = vi + end + end + ctx_verbatim(concat(t, " | ")) + else + ctx_verbatim(v) + end + ctx_NC() + ctx_NR() + end + + local function authorrow(ai,k,i) + local v = ai[k] + if v then + row(i,k,v) + end + end + + local function commonrow(key,value) + ctx_NC() ctx_rlap(function() ctx_verbatim(key) end) + ctx_NC() + ctx_EQ() ctx_verbatim(value) + ctx_NC() ctx_NR() + end + + local d = datasets[dataset].luadata + + local trialtypesetting = context.trialtypesetting() + + for tag, entry in sortedhash(d) do + + local a, f, k = getcasted(dataset,tag,field) + + if type(a) == "table" and #a > 0 and k == "author" then + context.start() + context.tt() + ctx_starttabulate { "|B|Bl|p|" } + ctx_FL() + local original = getfield(dataset,tag,field) + commonrow("tag",tag) + commonrow("field",field) + commonrow("original",original) + commonrow("sortkey",sortkey(a)) + for i=1,#a do + ctx_ML() + local ai = a[i] + if ai then + authorrow(ai,"original",i) + authorrow(ai,"snippets") + authorrow(ai,"initials") + authorrow(ai,"firstnames") + authorrow(ai,"vons") + authorrow(ai,"surnames") + authorrow(ai,"juniors") + local options = ai.options + if options then + row(false,"options",sortedkeys(options)) + end + elseif not trialtypesetting then + report("bad author name: %s",original or "?") + end + end + ctx_LL() + ctx_stoptabulate() + context.stop() + end + + end + +end + +function tracers.showentry(dataset,tag) + local dataset = datasets[dataset] + if dataset then + local entry = dataset.luadata[tag] + local done = false + for k, v in sortedhash(entry) do + if not privates[k] then + ctx_verbatim("%w[%s: %s]",done and 1 or 0,k,v) + done = true end end end +end + +local skipped = { index = true, default = true } +function tracers.showvariants(dataset,pages) + local variants = sortedkeys(citevariants) + for tag in publications.sortedentries(dataset or v_default) do + if pages then + ctx_page() + end + ctx_starttabulate { "|T||" } + for i=1,#variants do + local variant = variants[i] + if not skipped[variant] then + ctx_NC() context(variant) + -- ctx_EQ() citevariants[variant] { dataset = v_default, reference = tag, variant = variant } + ctx_EQ() context.cite({variant},{dataset .. "::" .. tag}) + ctx_NC() ctx_NR() + end + end + ctx_stoptabulate() + if pages then + ctx_page() + end + end end commands.showbtxdatasetfields = tracers.showdatasetfields commands.showbtxdatasetcompleteness = tracers.showdatasetcompleteness +commands.showbtxfields = tracers.showfields +commands.showbtxtables = tracers.showtables +commands.showbtxdatasetauthors = tracers.showdatasetauthors +commands.showbtxentry = tracers.showentry +commands.showbtxvariants = tracers.showvariants diff --git a/Master/texmf-dist/tex/context/base/publ-tra.mkiv b/Master/texmf-dist/tex/context/base/publ-tra.mkiv index 49fb6d96275..41550519851 100644 --- a/Master/texmf-dist/tex/context/base/publ-tra.mkiv +++ b/Master/texmf-dist/tex/context/base/publ-tra.mkiv @@ -20,16 +20,68 @@ \unprotect -\unexpanded\def\showbtxdatasetfields - {\dosingleempty\publ_dataset_show_fields} +\unexpanded\def\showbtxdatasetfields {\dosingleempty\publ_show_dataset_fields} +\unexpanded\def\showbtxdatasetcompleteness{\dosingleempty\publ_show_dataset_completeness} +\unexpanded\def\showbtxdatasetauthors {\dosingleempty\publ_show_dataset_authors} +\unexpanded\def\showbtxfields {\dosingleempty\publ_show_fields} +\unexpanded\def\showbtxtables {\dosingleempty\publ_show_tables} -\def\publ_dataset_show_fields[#1]% - {\ctxcommand{showbtxdatasetfields("\iffirstargument#1\else\currentbtxdataset\fi")}} +\def\publ_show_dataset_whatever#1[#2]% + {\begingroup + \letdummyparameter\c!specification\currentbtxspecification + \setdummyparameter\c!dataset {\currentbtxdataset}% + \letdummyparameter\c!field \empty + \iffirstargument + \doifelseassignment{#2} + {\getdummyparameters[#2]}% + {\setdummyparameter\c!dataset{#2}}% + \else + \getdummyparameters[#2]% + \fi + % \publ_specification_push{"\dummyparameter\c!specification}% + \ctxcommand{#1{ + dataset = "\dummyparameter\c!dataset", + specification = "\dummyparameter\c!specification", + field = "\dummyparameter\c!field", + }}% + % \publ_specification_pop + \endgroup} -\unexpanded\def\showbtxdatasetcompleteness - {\dosingleempty\publ_dataset_show_completeness} +\def\publ_show_dataset_fields {\publ_show_dataset_whatever{showbtxdatasetfields}} +\def\publ_show_dataset_completeness{\publ_show_dataset_whatever{showbtxdatasetcompleteness}} +\def\publ_show_dataset_authors {\publ_show_dataset_whatever{showbtxdatasetauthors}} -\def\publ_dataset_show_completeness[#1]% - {\ctxcommand{showbtxdatasetcompleteness("\iffirstargument#1\else\currentbtxdataset\fi")}} +\def\publ_show_fields[#1]% + {\begingroup + \setdummyparameter\c!rotation{90}% + \doifelseassignment{#1}% + {\letdummyparameter\c!specification\currentbtxspecification + \getdummyparameters[#1]}% + {\doifelsenothing{#1}% + {\letdummyparameter\c!specification\currentbtxspecification}% + {\setdummyparameter\c!specification{#1}}}% + % \publ_specification_push{"\dummyparameter\c!specification}% + \ctxcommand{showbtxfields{ + rotation = "\dummyparameter\c!rotation", + specification = "\dummyparameter\c!specification" + }}% + % \publ_specification_pop + \endgroup} -\protect \endinput +\def\publ_show_tables[#1]% + {\begingroup + \ctxcommand{showbtxtables{}}% + \endgroup} + +\protect + +\continueifinputfile{publ-tra.mkiv} + +\starttext + + \showbtxfields[rotation=85] \page + \showbtxfields[rotation=90] \page + + \showbtxtables \page + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/publ-usr.lua b/Master/texmf-dist/tex/context/base/publ-usr.lua index 6bb93ebeef5..f0111227916 100644 --- a/Master/texmf-dist/tex/context/base/publ-usr.lua +++ b/Master/texmf-dist/tex/context/base/publ-usr.lua @@ -6,7 +6,15 @@ if not modules then modules = { } end modules ['publ-usr'] = { license = "see context related readme files" } --- local chardata = characters.data +local P, Cs, R, Cc, C, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.C, lpeg.Carg +local lpegmatch = lpeg.match +local settings_to_hash = utilities.parsers.settings_to_hash + +local publications = publications +local datasets = publications.datasets + +local report = logs.reporter("publications") +local trace = false trackers.register("publications",function(v) trace = v end) -- local str = [[ -- \startpublication[k=Berdnikov:TB21-2-129,t=article,a={{Berdnikov},{}},y=2000,n=2257,s=BHHJ00] @@ -25,67 +33,94 @@ if not modules then modules = { } end modules ['publ-usr'] = { -- \stoppublication -- ]] -local remapped = { - artauthor = "author", - arttitle = "title", +local lists = { + author = true, + editor = true, + -- artauthor = true, + -- arteditor = true, } -local P, Cs, R, Cc, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.Carg - -local function register(target,key,a,b,c,d,e) - key = remapped[key] or key - if b and d and e then - local s = nil - if b ~= "" and b then - s = s and s .. " " .. b or b - end - if d ~= "" and d then - s = s and s .. " " .. d or d - end - if e ~= "" and e then - s = s and s .. " " .. e or e - end - if a ~= "" and a then - s = s and s .. " " .. a or a - end - local value = target[key] - if s then - if value then - target[key] = value .. " and " .. s - else - target[key] = s - end - else - if not value then - target[key] = s - end - end - else - target[key] = b - end +local function registervalue(target,key,value) + target[key] = value +end + +-- Instead of being generic we just hardcode the old stuff: + +local function registerauthor(target,key,juniors,firstnames,initials,vons,surnames) + local value = target[key] + target[key]= ((value and value .. " and {") or "{") .. + vons .. "},{" .. + surnames .. "},{" .. + juniors .. "},{" .. + firstnames .. "},{" .. + initials .. "}" end local leftbrace = P("{") local rightbrace = P("}") local leftbracket = P("[") local rightbracket = P("]") +local backslash = P("\\") +local letter = R("az","AZ") + +local skipspaces = lpeg.patterns.whitespace^0 +local key = Cs(letter^1) +local value = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace +local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket + +local authorkey = (P("artauthor") + P("author")) / "author" + + (P("arteditor") + P("editor")) / "editor" +local authorvalue = (optional + Cc("{}")) * skipspaces -- [juniors] + * (value + Cc("{}")) * skipspaces -- {firstnames} + * (optional + Cc("{}")) * skipspaces -- [initials] + * (value + Cc("{}")) * skipspaces -- {vons} + * (value + Cc("{}")) * skipspaces -- {surnames} -local key = P("\\") * Cs(R("az","AZ")^1) * lpeg.patterns.space^0 -local mandate = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace + Cc(false) -local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket + Cc(false) -local value = optional^-1 * mandate^-1 * optional^-1 * mandate^-2 +local keyvalue = Carg(1) * authorkey * skipspaces * authorvalue / registerauthor + + Carg(1) * key * skipspaces * value / registervalue -local pattern = ((Carg(1) * key * value) / register + P(1))^0 +local pattern = (backslash * keyvalue + P(1))^0 -function publications.addtexentry(dataset,settings,content) - settings = utilities.parsers.settings_to_hash(settings) +local function addtexentry(dataset,settings,content) + local current = datasets[dataset] + local settings = settings_to_hash(settings) local data = { tag = settings.tag or settings.k or "no tag", category = settings.category or settings.t or "article", } - lpeg.match(pattern,content,1,data) -- can set tag too - dataset.userdata[data.tag] = data - dataset.luadata[data.tag] = data - publications.markasupdated(dataset) + lpegmatch(pattern,content,1,data) -- can set tag too + local tag = data.tag + current.userdata[tag] = data + current.luadata[tag] = data + current.details[tag] = nil return data end + +local pattern = ( Carg(1) + * P("\\startpublication") + * skipspaces + * optional + * C((1 - P("\\stoppublication"))^1) + * P("\\stoppublication") / addtexentry + + P("%") * (1-lpeg.patterns.newline)^0 + + P(1) +)^0 + +function publications.loaders.bbl(dataset,filename) + local dataset, fullname = publications.resolvedname(dataset,filename) + if not fullname then + return + end + local data = io.loaddata(filename) or "" + if data == "" then + report("empty file %a, nothing loaded",fullname) + return + end + if trace then + report("loading file %a",fullname) + end + lpegmatch(pattern,data,1,dataset) +end + +publications.addtexentry = addtexentry +commands.addbtxentry = addtexentry diff --git a/Master/texmf-dist/tex/context/base/publ-xml.mkiv b/Master/texmf-dist/tex/context/base/publ-xml.mkiv index 007f9bb27d2..96375b9cc61 100644 --- a/Master/texmf-dist/tex/context/base/publ-xml.mkiv +++ b/Master/texmf-dist/tex/context/base/publ-xml.mkiv @@ -19,7 +19,7 @@ {\dosingleempty\publ_convert_to_xml} \def\publ_convert_to_xml[#1]% - {\ctxcommand{convertbtxdatasettoxml("\iffirstargument#1\else\v!standard\fi",true)}} % or current when not empty + {\clf_convertbtxdatasettoxml{\iffirstargument#1\else\s!default\fi}} % or current when not empty % \startxmlsetups btx:initialize % \xmlregistereddocumentsetups{#1}{} diff --git a/Master/texmf-dist/tex/context/base/regi-ini.lua b/Master/texmf-dist/tex/context/base/regi-ini.lua index d5d278b1649..37a88fd5f96 100644 --- a/Master/texmf-dist/tex/context/base/regi-ini.lua +++ b/Master/texmf-dist/tex/context/base/regi-ini.lua @@ -15,7 +15,7 @@ runtime.

local commands, context = commands, context local utfchar = utf.char -local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match +local P, Cs, Cc, lpegmatch = lpeg.P, lpeg.Cs, lpeg.Cc, lpeg.match local char, gsub, format, gmatch, byte, match = string.char, string.gsub, string.format, string.gmatch, string.byte, string.match local next = next local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy @@ -27,6 +27,9 @@ local sequencers = utilities.sequencers local textlineactions = resolvers.openers.helpers.textlineactions local setmetatableindex = table.setmetatableindex +local implement = interfaces.implement +local setmacro = interfaces.setmacro + --[[ldx--

We will hook regime handling code into the input methods.

--ldx]]-- @@ -99,6 +102,8 @@ local synonyms = { -- backward compatibility list ["windows"] = "cp1252", + ["pdf"] = "pdfdoc", + } local currentregime = "utf" @@ -132,7 +137,7 @@ end setmetatableindex(mapping, loadregime) setmetatableindex(backmapping,loadreverse) -local function translate(line,regime) +local function fromregime(regime,line) if line and #line > 0 then local map = mapping[regime and synonyms[regime] or regime or currentregime] if map then @@ -178,12 +183,15 @@ local function toregime(vector,str,default) -- toregime('8859-1',"abcde Ä","?") local r = c[d] if not r then local t = fastcopy(backmapping[vector]) - setmetatableindex(t, function(t,k) - local v = d - t[k] = v - return v - end) - r = utf.remapper(t) + -- r = utf.remapper(t) -- not good for defaults here + local pattern = Cs((lpeg.utfchartabletopattern(t)/t + lpeg.patterns.utf8character/d + P(1)/d)^0) + r = function(str) + if not str or str == "" then + return "" + else + return lpegmatch(pattern,str) + end + end c[d] = r end return r(str) @@ -192,6 +200,7 @@ end local function disable() currentregime = "utf" sequencers.disableaction(textlineactions,"regimes.process") + return currentregime end local function enable(regime) @@ -202,12 +211,14 @@ local function enable(regime) currentregime = regime sequencers.enableaction(textlineactions,"regimes.process") end + return currentregime end -regimes.toregime = toregime -regimes.translate = translate -regimes.enable = enable -regimes.disable = disable +regimes.toregime = toregime +regimes.fromregime = fromregime +regimes.translate = function(str,regime) return fromregime(regime,str) end +regimes.enable = enable +regimes.disable = disable -- The following function can be used when we want to make sure that -- utf gets passed unharmed. This is needed for modules. @@ -216,7 +227,7 @@ local level = 0 function regimes.process(str,filename,currentline,noflines,coding) if level == 0 and coding ~= "utf-8" then - str = translate(str,currentregime) + str = fromregime(currentregime,str) if trace_translating then report_translating("utf: %s",str) end @@ -243,40 +254,62 @@ end regimes.push = push regimes.pop = pop -sequencers.prependaction(textlineactions,"system","regimes.process") -sequencers.disableaction(textlineactions,"regimes.process") +if sequencers then + + sequencers.prependaction(textlineactions,"system","regimes.process") + sequencers.disableaction(textlineactions,"regimes.process") + +end -- interface: -commands.enableregime = enable -commands.disableregime = disable +implement { + name = "enableregime", + arguments = "string", + actions = function(regime) setmacro("currentregime",enable(regime)) end +} -commands.pushregime = push -commands.popregime = pop +implement { + name = "disableregime", + actions = function() setmacro("currentregime",disable()) end +} -function commands.currentregime() - context(currentregime) -end +implement { + name = "pushregime", + actions = push +} + +implement { + name = "popregime", + actions = pop +} local stack = { } -function commands.startregime(regime) - insert(stack,currentregime) - if trace_translating then - report_translating("start using %a",regime) +implement { + name = "startregime", + arguments = "string", + actions = function(regime) + insert(stack,currentregime) + if trace_translating then + report_translating("start using %a",regime) + end + setmacro("currentregime",enable(regime)) end - enable(regime) -end +} -function commands.stopregime() - if #stack > 0 then - local regime = remove(stack) - if trace_translating then - report_translating("stop using %a",regime) +implement { + name = "stopregime", + actions = function() + if #stack > 0 then + local regime = remove(stack) + if trace_translating then + report_translating("stop using %a",regime) + end + setmacro("currentregime",enable(regime)) end - enable(regime) end -end +} -- Next we provide some hacks. Unfortunately we run into crappy encoded -- (read : mixed) encoded xml files that have these ë ä ö ü sequences @@ -311,48 +344,82 @@ local patterns = { } -- -- twice as fast and much less lpeg bytecode +-- function regimes.cleanup(regime,str) +-- if not str or str == "" then +-- return str +-- end +-- local p = patterns[regime] +-- if p == nil then +-- regime = regime and synonyms[regime] or regime or currentregime +-- local vector = regime ~= "utf" and regime ~= "utf-8" and mapping[regime] +-- if vector then +-- local utfchars = { } +-- local firsts = { } +-- for k, uchar in next, vector do +-- local stream = { } +-- local split = totable(uchar) +-- local nofsplits = #split +-- if nofsplits > 1 then +-- local first +-- for i=1,nofsplits do +-- local u = vector[split[i]] +-- if not first then +-- first = firsts[u] +-- if not first then +-- first = { } +-- firsts[u] = first +-- end +-- end +-- stream[i] = u +-- end +-- local nofstream = #stream +-- if nofstream > 1 then +-- first[#first+1] = concat(stream,2,nofstream) +-- utfchars[concat(stream)] = uchar +-- end +-- end +-- end +-- p = P(false) +-- for k, v in next, firsts do +-- local q = P(false) +-- for i=1,#v do +-- q = q + P(v[i]) +-- end +-- p = p + P(k) * q +-- end +-- p = Cs(((p+1)/utfchars)^1) +-- -- lpeg.print(p) -- size: 1042 +-- else +-- p = false +-- end +-- patterns[regime] = p +-- end +-- return p and lpegmatch(p,str) or str +-- end +-- +-- 5 times faster: + function regimes.cleanup(regime,str) + if not str or str == "" then + return str + end local p = patterns[regime] if p == nil then regime = regime and synonyms[regime] or regime or currentregime - local vector = regime ~= "utf" and mapping[regime] + local vector = regime ~= "utf" and regime ~= "utf-8" and mapping[regime] if vector then - local utfchars = { } - local firsts = { } - for k, uchar in next, vector do - local stream = { } - local split = totable(uchar) - local nofsplits = #split - if nofsplits > 1 then - local first - for i=1,nofsplits do - local u = vector[split[i]] - if not first then - first = firsts[u] - if not first then - first = { } - firsts[u] = first - end - end - stream[i] = u - end - local nofstream = #stream - if nofstream > 1 then - first[#first+1] = concat(stream,2,nofstream) - utfchars[concat(stream)] = uchar - end + local mapping = { } + for k, v in next, vector do + local split = totable(v) + for i=1,#split do + split[i] = utfchar(byte(split[i])) end - end - p = P(false) - for k, v in next, firsts do - local q = P(false) - for i=1,#v do - q = q + P(v[i]) + split = concat(split) + if v ~= split then + mapping[split] = v end - p = p + P(k) * q end - p = Cs(((p+1)/utfchars)^1) - -- lpeg.print(p) -- size: 1042 + p = Cs((lpeg.utfchartabletopattern(mapping)/mapping+P(1))^0) else p = false end @@ -361,28 +428,9 @@ function regimes.cleanup(regime,str) return p and lpegmatch(p,str) or str end --- local map = require("regi-cp1252") -- local old = [[test ë ä ö ü crap]] --- local new = correctencoding(map,old) --- --- print(old,new) - --- obsolete: --- --- function regimes.setsynonym(synonym,target) --- synonyms[synonym] = target --- end --- --- function regimes.truename(regime) --- return regime and synonyms[regime] or regime or currentregime --- end --- --- commands.setregimesynonym = regimes.setsynonym --- --- function commands.trueregimename(regime) --- context(regimes.truename(regime)) --- end --- --- function regimes.load(regime) --- return mapping[synonyms[regime] or regime] --- end +-- local new = regimes.cleanup("cp1252",old) +-- report_translating("%s -> %s",old,new) +-- local old = "Pozn" .. char(0xE1) .. "mky" +-- local new = fromregime("cp1250",old) +-- report_translating("%s -> %s",old,new) diff --git a/Master/texmf-dist/tex/context/base/regi-ini.mkiv b/Master/texmf-dist/tex/context/base/regi-ini.mkiv index 651e2f13cb1..6190393d804 100644 --- a/Master/texmf-dist/tex/context/base/regi-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/regi-ini.mkiv @@ -16,34 +16,18 @@ \unprotect %D \macros -%D {enableregime,disableregime,currentregime} +%D {enableregime,disableregime, +%D startregime,stopregime, +%D currentregime} %D %D Beware, the enable and disable commands are global switches, so %D best use the start|/|stop commands. -\unexpanded\def\enableregime[#1]{\ctxcommand{enableregime("#1")}} -\unexpanded\def\disableregime {\ctxcommand{disableregime()}} -\unexpanded\def\startregime [#1]{\ctxcommand{startregime("#1")}} -\unexpanded\def\stopregime {\ctxcommand{stopregime()}} - \def\currentregime {\ctxcommand{currentregime()}} +\let\currentregime\empty -% D \macros -% D {defineregimesynonym,trueregimename} -% -% \unexpanded\def\defineregimesynonym % more or less obsolete -% {\dodoubleargument\dodefineregimesynonym} -% -% \def\dodefineregimesynonym[#1][#2]% -% {\ctxcommand{setregimesynonym("#1","#2")}} -% -% \def\trueregimename#1% -% {\ctxcommand{trueregimename("#1")}} - -% D \macros -% D {useregime} -% D -% D This one is sort of obsolete but we keep them around. - -\unexpanded\def\useregime[#1]{} +\unexpanded\def\enableregime[#1]{\clf_enableregime{#1}} +\unexpanded\def\disableregime {\clf_disableregime} +\unexpanded\def\startregime [#1]{\clf_startregime{#1}} +\unexpanded\def\stopregime {\clf_stopregime} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua b/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua new file mode 100644 index 00000000000..363d3ae0da3 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua @@ -0,0 +1,26 @@ +if not modules then modules = { } end modules ['regi-pdfdoc'] = { + version = 1.001, + comment = "companion to regi-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +return { [0] = + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, + 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x02D8, 0x02C7, 0x02C6, 0x02D9, 0x02DD, 0x02DB, 0x02DA, 0x02DC, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, + 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x0141, 0x0152, 0x0160, 0x0178, 0x017D, 0x0131, 0x0142, 0x0153, 0x0161, 0x017E, 0x009F, + 0x20AC, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0xFFFD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, +} diff --git a/Master/texmf-dist/tex/context/base/s-abr-01.tex b/Master/texmf-dist/tex/context/base/s-abr-01.tex index 733eebf7b95..00a1a5c1e2f 100644 --- a/Master/texmf-dist/tex/context/base/s-abr-01.tex +++ b/Master/texmf-dist/tex/context/base/s-abr-01.tex @@ -46,6 +46,7 @@ \logo [ARABTEX] {Arab\TeX} \logo [ASCII] {ascii} \logo [ASCIITEX] {ascii\TeX} +\logo [ASCIIMATH] {AsciiMath} \logo [BACHOTEX] {Bacho\TeX} \logo [BIBTEX] {bib\TeX} \logo [MLBIBTEX] {MLbib\TeX} @@ -66,6 +67,8 @@ \logo [CMYK] {cmyk} \logo [CODHOST] {CodHost} \logo [CONTEXT] {\ConTeXt} +\logo [CONTEXTWIKI] {\ConTeXt\ Wiki} +\logo [CONTEXTGROUP] {\ConTeXt\ Group} \logo [CSS] {css} \logo [CTAN] {ctan} \logo [CTXTOOLS] {ctxtools} @@ -94,6 +97,7 @@ \logo [EMTEX] {em\TeX} \logo [ENCODING] {enc} \logo [ENCTEX] {enc\TeX} +\logo [EPUB] {ePub} \logo [EPS] {eps} \logo [ETEX] {\eTeX} \logo [EUROBACHOTEX] {EuroBacho\TeX} @@ -235,6 +239,7 @@ \logo [SSD] {ssd} \logo [SVG] {svg} \logo [STIX] {Stix} +\logo [SUMATRAPDF] {SumatraPDF} \logo [SWIG] {swig} \logo [SWIGLIB] {SwigLib} \logo [TABLE] {\TaBlE} @@ -262,6 +267,7 @@ \logo [TEXTOOLS] {\TeX tools} \logo [TEXUTIL] {\TeX util} \logo [TEXWORK] {\TeX work} +\logo [TEXWORKS] {\TeX works} \logo [TEXXET] {\TeX\XeT} \def\XeT{XeT} \logo [TFM] {tfm} \logo [TIF] {tif} diff --git a/Master/texmf-dist/tex/context/base/s-art-01.mkiv b/Master/texmf-dist/tex/context/base/s-art-01.mkiv index e2584a35784..601ee1adc80 100644 --- a/Master/texmf-dist/tex/context/base/s-art-01.mkiv +++ b/Master/texmf-dist/tex/context/base/s-art-01.mkiv @@ -2,7 +2,7 @@ \startmodule[art-01] -\definemeasure [article:margin] [\paperheight/15] +\definemeasure [article:margin] [\paperheight/20] % was 15, see xtables-mkiv for results \definemeasure [overview:margin] [\paperheight/30] \definelayout @@ -10,7 +10,7 @@ [\c!topspace=\measure{article:margin}, \c!bottomspace=\measure{article:margin}, \c!backspace=\measure{article:margin}, - \c!header=\measure{overview:margin}, + \c!header=\measure{article:margin}, \c!footer=0pt, \c!width=\v!middle, \c!height=\v!middle] diff --git a/Master/texmf-dist/tex/context/base/s-figures-names.mkiv b/Master/texmf-dist/tex/context/base/s-figures-names.mkiv new file mode 100644 index 00000000000..a2782efc95d --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-figures-names.mkiv @@ -0,0 +1,99 @@ +%D \module +%D [ file=s-figures-names.mkiv, +%D version=2017.07.17, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Figure Names, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D Normally this module will be run someplace at the end of a document in some kind of tracing +%D mode. We could hook it into \type {\stoptext} but better leave it up to the user. Loading +%D this module upfront will not show anything useful. The main reason for making this module +%D was that we wanted to report weird figurenames: spaces, multiple hyphens in a row, mixed +%D hyphens and underscores, inconsistently mixed upper and lowercase, etc. +%D +%D If you only want info in the logfile, you can use: +%D +%D \starttyping +%D \enabletrackers[graphics.lognames] +%D \stoptyping +%D +%D This directive is persistent and can be issued any time before the end of the run. + +\startmodule[figures-names] + +\startluacode + +local context = context +local ctx_NC = context.NC +local ctx_NR = context.NR +local ctx_red = context.red +local ctx_starttabulate = context.starttabulate +local ctx_stoptabulate = context.stoptabulate +local ctx_hyphenatedname = context.hyphenatedfilename + +trackers.enable("graphics.lognames") + +context.start() + + context.switchtobodyfont { "tt,small" } + + local template = { "|Bl|p|" } + + for _, data in table.sortedhash(figures.found) do + ctx_starttabulate(template) + local badname = data.badname + local found = data.found + ctx_NC() + context("asked name") + ctx_NC() + if badname then + ctx_red() + end + context(data.askedname) + ctx_NC() ctx_NR() + if found then + ctx_NC() + context("format") + ctx_NC() + context(data.format) + ctx_NC() ctx_NR() + ctx_NC() + context("found file") + ctx_NC() + ctx_hyphenatedname(data.foundname) + -- context(data.foundname) + ctx_NC() ctx_NR() + ctx_NC() + context("used file") + ctx_NC() + ctx_hyphenatedname(data.fullname) + -- context(data.fullname) + ctx_NC() ctx_NR() + if badname then + ctx_NC() + context("comment") + ctx_NC() + context("bad name") + ctx_NC() ctx_NR() + end + else + ctx_NC() + context("comment") + ctx_NC() + context(data.comment or "not found") + ctx_NC() ctx_NR() + end + ctx_stoptabulate() + end + +context.stop() + +\stopluacode + +\stopmodule diff --git a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv index 9b6211c2b57..2fe82e0794b 100644 --- a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv +++ b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv @@ -100,7 +100,7 @@ function fonts.tracers.show_glyphs() end \stopluacode -\def\ShowCompleteFont#1#2#3% +\unexpanded\def\ShowCompleteFont#1#2#3% {\bgroup \page \font\TestFont=#1 at #2 @@ -118,7 +118,7 @@ end \page \egroup} -\def\ShowAllGlyphs#1#2#3% +\unexpanded\def\ShowAllGlyphs#1#2#3% {\bgroup \page \def\showglyph##1{\dontleavehmode\strut\char##1\relax\par} diff --git a/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv index 588c9801676..10d5a462394 100644 --- a/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv +++ b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv @@ -47,7 +47,7 @@ \endinput -% \usemodule[fnt-20] +% \usemodule[fnt-21] % % \starttext % diff --git a/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua index db47e57c43f..dd772d5f09b 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua +++ b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua @@ -29,6 +29,7 @@ function moduledata.fonts.coverage.showcomparison(specification) local present = { } local names = { } local files = { } + local chars = { } if not pattern then -- skip @@ -56,6 +57,7 @@ function moduledata.fonts.coverage.showcomparison(specification) end names[#names+1] = fontname files[#files+1] = fontfile + chars[#names] = fontdata.characters end end @@ -91,7 +93,11 @@ function moduledata.fonts.coverage.showcomparison(specification) NR() HL() for k, v in table.sortedpairs(present) do - if k > 0 then + if k <= 0 then + -- ignore + elseif k >= 0x110000 then + logs.report("warning","weird character %U",k) + else local description = chardata[k].description if not pattern or (pattern == k) or (description and lpegmatch(pattern,description)) then NC() @@ -99,7 +105,11 @@ function moduledata.fonts.coverage.showcomparison(specification) NC() for i=1,#names do getvalue(names[i]) - char(k) + if chars[i][k] then + char(k) + else + -- missing + end NC() end context(description) diff --git a/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv new file mode 100644 index 00000000000..e6ff2461e8c --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv @@ -0,0 +1,292 @@ +%D \module +%D [ file=s-fonts-ligatures, +%D version=2014.12.14, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Fonts Ligatures, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin info +% +% title : show some ligature building in fonts +% +% comment : we trace some ligatures that have rather different implementations in fontss +% status : experimental, used for luatex testing +% +% end info + +\definefontfeature + [otfligaturetest] + [analyze=off, + ccmp=yes, % brill uses that .. not really ligatures ! + %clig=yes, + script=latn, + language=dflt] + +\hyphenation{xf-fi-a} +\hyphenation{xff-i-b} +\hyphenation{xffi-c} +\hyphenation{xffid} + +\registerhyphenationexception[xf-fi-a] +\registerhyphenationexception[xff-i-b] +\registerhyphenationexception[xffi-c] +\registerhyphenationexception[xffid] + +\starttexdefinition showotfligaturescaption #1 + \bTD [align={flushleft,lohi},nx=3] + \nohyphens + \ttbf + #1 + \eTD +\stoptexdefinition + +\starttexdefinition showotfligatureslegend #1 + \bTD [width=6em,align={flushleft,lohi}] + \nohyphens \ttxx original + \eTD + \bTD [width=6em,align={flushleft,lohi}] + \nohyphens \ttxx expanded + \eTD + \bTD [width=6em,align={flushleft,lohi}] + \nohyphens \ttxx traditional + \eTD +\stoptexdefinition + +\starttexdefinition showotfligaturesline #1#2 + \bTD[toffset=.5ex,frame=off] + \starthyphenation[#1] + \LigatureFont + \showfontkerns + \showdiscretionaries + \begstrut#2\endstrut + \par + \stophyphenation + \eTD +\stoptexdefinition + +\def\showotfligaturescells{3} +%def\showotfligaturesnx {12} +%def\showotfligatureswidth{18em} +\def\showotfligaturesnx {\the\numexpr 4*\showotfligaturescells} +\def\showotfligatureswidth{\the\dimexpr6em*\showotfligaturescells} + +\starttexdefinition showotfligaturesbanner #1 + \bTR[frame=off] + \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align={middle,lohi},height=4ex] + \tttf #1 + \eTD + \eTR +\stoptexdefinition + +\starttexdefinition showotfligaturescaptions #1 + \bTR[height=3ex,align={middle,lohi},bottomframe=off] + \processcommalist[#1]\showotfligaturescaption + \eTR + \bTR[height=3ex,align={middle,lohi},topframe=off] + \processcommalist[#1]\showotfligatureslegend + \eTR +\stoptexdefinition + +\starttexdefinition showotfligatureslineset #1 + \showotfligaturesline{original} {#1} + \showotfligaturesline{expanded} {#1} + \showotfligaturesline{traditional}{#1} +\stoptexdefinition + + +\starttexdefinition showotfligaturesparagraphset #1 + \showotfligatureslineset { + \hsize \zeropoint + \lefthyphenmin \plustwo + \righthyphenmin\plustwo + #1 + } +\stoptexdefinition + +\starttexdefinition showotfligaturesextremeset #1 + \showotfligatureslineset { + \hsize \zeropoint + \lefthyphenmin \plusone + \righthyphenmin\plusone + #1 + } +\stoptexdefinition + +\starttexdefinition showotfligatureslines #1 + \bTR[height=4ex,bottomframe=off] + \processcommalist[#1]\showotfligatureslineset + \eTR +\stoptexdefinition + +\starttexdefinition showotfligaturesparagraphs #1 + \bTR[topframe=off] + \processcommalist[#1]\showotfligaturesparagraphset + \eTR +\stoptexdefinition + +\starttexdefinition showotfligaturesextremes #1 + \bTR[topframe=off] + \processcommalist[#1]\showotfligaturesextremeset + \eTR +\stoptexdefinition + +\starttexdefinition showotfligaturesdefaults + \bTR + \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align=middle,height=4ex,frame=off] + \start \LigatureFont fb \stop \quad + \start \LigatureFont ff \stop \quad + \start \LigatureFont fi \stop \quad + \start \LigatureFont fk \stop \quad + \start \LigatureFont fl \stop \quad + \start \LigatureFont ft \stop \quad + \start \LigatureFont ffb \stop \quad + \start \LigatureFont fff \stop \quad + \start \LigatureFont ffi \stop \quad + \start \LigatureFont ffl \stop \quad + \start \LigatureFont ffk \stop \quad + \start \LigatureFont fft \stop + \eTD + \eTR +\stoptexdefinition + +\starttexdefinition showotfligaturesexample #1#2 + \showotfligaturescaptions {#1} + \showotfligatureslines {#2} + \showotfligaturesparagraphs{#2} + \showotfligaturesextremes {#2} +\stoptexdefinition + +% todo: n -> and split in lua + +\starttexdefinition showotfligaturesexamples + \showotfligaturesexample + {leafing,baffling,efficient,shifffahrt} + {leafing,baffling,efficient,shifffahrt} + \showotfligaturesexample + {offbeat,effect,ef-fective,ef\-fective} + {offbeat,effect,ef-fective,ef\-fective} + \showotfligaturesexample + {xf+fi+a,xff+i+b,xffi+c,xffid} + {xffia, xffib, xffic, xffid} +\stoptexdefinition + +\starttexdefinition showotfligatures [#1] + \begingroup + \getdummyparameters[font=Regular,features=default,#1] + \definefont[LigatureFont][\dummyparameter{font}*\dummyparameter{features},otfligaturetest ht 2ex] + \bTABLE[leftframe=off,rightframe=off] + \showotfligaturesbanner{\dummyparameter{font} * \dummyparameter{features}} + \showotfligaturesdefaults + \showotfligaturesexamples + \eTABLE + \endgroup +\stoptexdefinition + +\continueifinputfile{s-fonts-ligatures.mkiv} + +\starttext + + \startTEXpage[offset=10pt] \showotfligatures[font=lmroman10-regular.otf, features=default] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=dejavu-serif.ttf, features=default] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=minionpro.otf, features=default] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=minionpro.otf, features=smallcaps] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=brill.otf, features=default] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=gentiumplus-r.ttf, features=default] \stopTEXpage + \startTEXpage[offset=10pt] \showotfligatures[font=cambria, features=default] \stopTEXpage + +\stoptext + +% \startluacode +% +% local f = fonts.hashes.identifiers[true] +% +% local sequences = f.resources.sequences +% local descriptions = f.shared.rawdata.descriptions +% local lookuptypes = f.resources.lookuptypes +% local lookups = f.resources.lookups +% +% local ligatures = { "liga", "dlig", "rlig", "clig", "tlig", "ccmp" } +% local found = { } +% +% for i=1,#sequences do +% local sequence = sequences[i] +% local features = sequence.features +% for i=1,#ligatures do +% local l = ligatures[i] +% if features[l] then +% local subtables = sequence.subtables +% if subtables then +% for i=1,#subtables do +% local subtable = subtables[i] +% local lookup = found[subtable] +% if lookup then +% lookup[l] = true +% else +% found[subtable] = { [l] = true } +% end +% end +% end +% end +% end +% end +% +% context.starttabulate { "|||T|T|T|" } +% +% local function flush(l,v,start,unicode,data,done) +% local features = found[l] +% if features then +% local lookuptype = lookuptypes[l] +% if lookuptype == "ligature" then +% local t = { } +% for i=1,#v do +% t[i] = utf.char(v[i]) +% end +% t = table.concat(t," ") +% if not done[t] then +% context.NC() +% context(t) +% context.NC() +% context(utf.char(unicode)) +% context.NC() +% context(" %t",table.sortedkeys(features)) +% context.NC() +% local name = data.name +% if name then +% context(name) +% end +% context.NC() +% context("%U",unicode) +% context.NC() +% context.NR() +% done[t] = true +% end +% end +% end +% end +% +% for unicode, data in table.sortedhash(descriptions) do +% local slookups = data.slookups +% local mlookups = data.mlookups +% local done = { } +% if slookups then +% for l, v in next, slookups do +% flush(l,v,1,unicode,data,done) +% end +% end +% if mlookups then +% for i=1,#mlookups do +% local v = mlookups[i] +% flush(v[1],v,2,unicode,data,done) +% end +% end +% end +% +% context.stoptabulate() +% +% \stopluacode diff --git a/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua index b387c11ddd7..bca860f3fb8 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua +++ b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua @@ -16,24 +16,32 @@ local NC, NR = context.NC, context.NR local space, dontleavehmode, glyph, getvalue = context.space, context.dontleavehmode, context.glyph, context.getvalue local formatters = string.formatters -function moduledata.fonts.shapes.showlist(specification) -- todo: ranges - specification = interfaces.checkedspecification(specification) - local id, cs = fonts.definers.internal(specification,"") - local chrs = fontdata[id].characters - function char(k) - dontleavehmode() - glyph(id,k) - end - local function special(v) - local specials = v.specials - if specials and #specials > 1 then - context("%s:",specials[1]) +function char(id,k) + dontleavehmode() + glyph(id,k) +end + +local function special(id,specials) + if specials and #specials > 1 then + context("%s:",specials[1]) + if #specials > 5 then + space() char(id,specials[2]) + space() char(id,specials[3]) + space() context("...") + space() char(id,specials[#specials-1]) + space() char(id,specials[#specials]) + else for i=2,#specials do - space() - char(specials[i]) + space() char(id,specials[i]) end end end +end + +function moduledata.fonts.shapes.showlist(specification) -- todo: ranges + specification = interfaces.checkedspecification(specification) + local id, cs = fonts.definers.internal(specification,"") + local chrs = fontdata[id].characters context.begingroup() context.tt() context.starttabulate { "|l|c|c|c|c|l|l|" } @@ -50,11 +58,11 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges for k, v in next, characters.data do if chrs[k] then NC() context("0x%05X",k) - NC() char(k) -- getvalue(cs) context.char(k) - NC() char(v.shcode) - NC() char(v.lccode or k) - NC() char(v.uccode or k) - NC() special(v) + NC() char(id,k) -- getvalue(cs) context.char(k) + NC() char(id,v.shcode) + NC() char(id,v.lccode or k) + NC() char(id,v.uccode or k) + NC() special(id,v.specials) NC() context.tx(v.description) NC() NR() end @@ -67,20 +75,6 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges specification = interfaces.checkedspecification(specification) local id, cs = fonts.definers.internal(specification,"") local chrs = fontdata[id].characters - function char(k) - dontleavehmode() - glyph(id,k) - end - local function special(v) - local specials = v.specials - if specials and #specials > 1 then - context("%s:",specials[1]) - for i=2,#specials do - space() - char(specials[i]) - end - end - end context.begingroup() context.tt() context.starttabulate { "|l|c|c|c|c|l|l|" } @@ -97,11 +91,11 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges for k, v in next, characters.data do if chrs[k] then NC() context("0x%05X",k) - NC() char(k) - NC() char(v.shcode) - NC() char(v.lccode or k) - NC() char(v.uccode or k) - NC() special(v) + NC() char(id,k) + NC() char(id,v.shcode) + NC() char(id,v.lccode or k) + NC() char(id,v.uccode or k) + NC() special(id,v.specials) NC() context.tx(v.description) NC() NR() end @@ -137,7 +131,8 @@ local function showglyphshape(specification) local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor local anchors, math = d.anchors, d.math context.startMPcode() - context("pickup pencircle scaled .25bp ;") + context("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) 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) @@ -153,11 +148,11 @@ local function showglyphshape(specification) l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy) end end - context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1]) + context("draw ((%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 .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#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 1bp;",v) + context("draw %s withcolor blue withpen pencircle scaled 2lw ;",v) end end end @@ -203,7 +198,7 @@ local function showglyphshape(specification) end local function show(x,y,txt) local xx, yy = x*factor, y*factor - context("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy) + context("draw (%s,%s) withcolor blue withpen pencircle scaled 2lw ;",xx,yy) context('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy) context('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy) end @@ -242,9 +237,9 @@ local function showglyphshape(specification) end end if italic ~= 0 then - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury) - context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury) - context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury) + context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue ;',width,ury,width,ury) + context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue ;',width+italic,ury,width+italic,ury) + context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue ;',width,ury,width+italic,ury) context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury) context('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury) end @@ -258,7 +253,7 @@ local function showglyphshape(specification) context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury) context('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly) end - context('draw origin withcolor red withpen pencircle scaled 1bp;') + context('draw origin withcolor red withpen pencircle scaled 2lw;') context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;") context("currentpicture := currentpicture scaled 8 ;") context.stopMPcode() diff --git a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua index 5c91d5ee72c..b3dac7d0630 100644 --- a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua +++ b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua @@ -21,6 +21,12 @@ local digits = { dflt = { dflt = "1234567890 1/2", }, + arab = { + dflt = "", + }, + latn = { + dflt = "1234567890 1/2", + } } local punctuation = { @@ -65,6 +71,9 @@ local lowercase = { cyrl= { dflt = "абвгдежзиійклмнопрстуфхцчшщъыьѣэюяѳ" }, + arab = { + dflt = "ابجدهوزحطيكلمنسعفصقرشتثخذضظغ" + }, } local samples = { diff --git a/Master/texmf-dist/tex/context/base/s-inf-01.mkvi b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi index 8263413ace3..2c0c1681e12 100644 --- a/Master/texmf-dist/tex/context/base/s-inf-01.mkvi +++ b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi @@ -126,6 +126,8 @@ return max, what, function(n) return (max == 0 and 0) or (n == 0 and 0) or n/max end end + local f_norm = string.formatters["%0.3f"] + function document.context_state_1(what) local max, what, norm = prepare(what) context.starttabulate { "|Tl|T|T|T|T|T|" } @@ -154,9 +156,15 @@ (used.mkvi[k] and "vi") or "~~", k ) + -- context("%s\\enspace %s\\quad %s\\quad %s", + -- (used.mkii[k] and "ii") or "\\quad", + -- (used.mkiv[k] and "iv") or "\\quad", + -- (used.mkvi[k] and "vi") or "\\quad", + -- k + -- ) context.NC() for i=1,#types do - context.Bar(types[i],v[i],c[i],norm(v[i])) + context.Bar(types[i],v[i],c[i],f_norm(norm(v[i]))) context.NC() end context.NR() @@ -170,7 +178,7 @@ local c = (what == size and comp[k]) or nope context.StartUp(k) for i=1,#types do - context.Up(types[i],norm(v[i])) + context.Up(types[i],f_norm(norm(v[i]))) end context.StopUp() end diff --git a/Master/texmf-dist/tex/context/base/s-inf-03.mkiv b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv index 48449d6900b..a253bed773c 100644 --- a/Master/texmf-dist/tex/context/base/s-inf-03.mkiv +++ b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv @@ -8,7 +8,7 @@ \setupbodyfont[dejavu] -\doifmodeelse {tablet} { +\doifelsemode {tablet} { \setuppapersize [S6,landscape] @@ -159,16 +159,16 @@ local skipglobal = table.tohash { "_G", "_M", "_ENV", "", "context", "modules", "global", "arg", "utf", 1, "_ptbs_", "_pcol_", "_plib_", "_clib_", "_tlib_", - "kpse", + "kpse", "commands", } local skipkeys = table.tohash { "_pcol_", "_plib_", "_clib_", "_tlib_", "_bpnf_", "_ptbs_", - "_cldf_", "_cldn_", + "_cldf_", "_cldn_", "_cldo_", "_clmb_", "_clme_", "_clmm_", "_clmn_", "_clma_", "_clmh_", "_G", "_M", "_ENV", "", + -- "global", "shortcuts", "_VERSION", "_COPYRIGHT", "_DESCRIPTION", "_NAME", "_PACKAGE", "__unload", - } local sameglobal = { @@ -196,6 +196,8 @@ local variant = 1 -- all parents local variant = 2 -- parent name too local variant = 3 -- no parents +local done = { } + local function childtables(key,tab,handler,depth) depth = depth or 1 local keys = sortedkeys(tab) -- no sorted_pairs @@ -214,6 +216,10 @@ local function childtables(key,tab,handler,depth) t = "data" handler(s,t,depth) else +if done[v] then + -- logs.report("inf-03","key %a in %a already done",k,v) +else + done[v] = true handler(s,t,depth) if variant == 3 then childtables(false,v,handler,depth+1) @@ -223,6 +229,7 @@ local function childtables(key,tab,handler,depth) childtables(s,v,handler,depth+1) end end +end else handler(s,t,depth) end @@ -245,6 +252,7 @@ end local function show(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete) -- todo: table as argument +-- print(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete) local keys = sortedkeys(t) -- no sorted_pairs if #keys > 0 then local fulltitle = title @@ -341,6 +349,8 @@ end show("global","",sameglobal.global,false,_G,builtin,"darkgreen",globals,"darkblue",false,obsolete) +-- inspect(table.sortedkeys(context)) + for k, v in table.sortedpairs(_G) do if not skipglobal[k] and not obsolete[k] and type(v) == "table" and not marked(v) then @@ -351,7 +361,8 @@ for k, v in table.sortedpairs(_G) do elseif extralua[k] then show(k,"extra lua",sameglobal[k],extralua[k],v,builtin[k],"darkred", false,false,true) elseif basictex[k] then show(k,"basic tex",sameglobal[k],basictex[k],v,builtin[k],"darkred", false,false,true) elseif extratex[k] then show(k,"extra tex",sameglobal[k],extratex[k],v,builtin[k],"darkred", false,false,true) - else show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true) + else + show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true) end end end diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua index c16c5bd2d94..c5a4f91f1e9 100644 --- a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua +++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua @@ -13,8 +13,8 @@ local a_colormodel = attributes.private('colormodel') local nodecodes = nodes.nodecodes local nodepool = nodes.pool -local disc = nodecodes.disc -local glyph = nodecodes.glyph +local disc_code = nodecodes.disc +local glyph_code = nodecodes.glyph local emwidths = fonts.hashes.emwidths local exheights = fonts.hashes.exheights local newkern = nodepool.kern @@ -23,7 +23,7 @@ local newglue = nodepool.glue local insert_node_after = node.insert_after local traverse_by_id = node.traverse_id -local hyphenate = lang.hyphenate +local hyphenate = languages.hyphenators.handler -- lang.hyphenate local find_tail = node.tail local remove_node = nodes.remove @@ -36,11 +36,11 @@ local function identify(head,marked) while current do local id = current.id local next = current.next - if id == disc then - if prev and next.id == glyph then -- catch other usage of disc + if id == disc_code then + if prev and next then -- and next.id == glyph_code then -- catch other usage of disc marked[#marked+1] = prev end - elseif id == glyph then + elseif id == glyph_code then prev = current end current = next @@ -81,10 +81,10 @@ function moduledata.languages.hyphenation.showhyphens(head) local m = { } local l = langs[i] marked[i] = m - for n in traverse_by_id(glyph,head) do + for n in traverse_by_id(glyph_code,head) do n.lang = l end - hyphenate(head,find_tail(head)) + languages.hyphenators.methods.original(head) identify(head,m) strip(head,m) end diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv index 769c3d05904..6662dbf2f32 100644 --- a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv +++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv @@ -26,7 +26,7 @@ {\begingroup \par % \language\zerocount - \setupalign[\v!nothyphenated]% + % \setupalign[\v!nothyphenated]% \ctxlua{moduledata.languages.hyphenation.startcomparepatterns("#1")}} \unexpanded\def\stopcomparepatterns @@ -56,13 +56,15 @@ \starttext +\def|#1|{-} + \startsubject{Normal text} \input tufte \stopsubject \startsubject{Compare hyphenation points of \showcomparepatternslegend[en,de]} \startcomparepatterns - \input tufte \quad (\showcomparepatternslegend) + \input tufte \quad (\showcomparepatternslegend) \stopcomparepatterns \stopsubject diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.lua b/Master/texmf-dist/tex/context/base/s-languages-system.lua index 5afc4d4036f..3b422db9f2e 100644 --- a/Master/texmf-dist/tex/context/base/s-languages-system.lua +++ b/Master/texmf-dist/tex/context/base/s-languages-system.lua @@ -10,26 +10,53 @@ moduledata.languages = moduledata.languages or { } moduledata.languages.system = moduledata.languages.system or { } local NC, NR, HL = context.NC, context.NR, context.HL +local sortedhash = table.sortedhash +local registered = languages.registered +local context = context +local ctx_NC = context.NC +local ctx_NR = context.NR +local ctx_bold = context.bold + +function moduledata.languages.system.loadinstalled() + context.start() + for k, v in table.sortedhash(registered) do + context.language{ k } + end + context.stop() +end function moduledata.languages.system.showinstalled() - local numbers = languages.numbers - local registered = languages.registered - context.starttabulate { "|r|l|l|l|l|" } - NC() context("id") - NC() context("tag") - NC() context("synonyms") - NC() context("parent") - NC() context("loaded") - NC() NR() HL() - for i=1,#numbers do - local tag = numbers[i] - local data = registered[tag] - NC() context(data.number) - NC() context(tag) - NC() context("% t",table.sortedkeys(data.synonyms)) - NC() context(data.parent) - NC() context("%+t",table.sortedkeys(data.used)) - NC() NR() + -- + context.starttabulate { "|l|r|l|l|p(7em)|r|p|" } + context.FL() + ctx_NC() ctx_bold("tag") + ctx_NC() ctx_bold("n") + ctx_NC() ctx_bold("parent") + ctx_NC() ctx_bold("file") + ctx_NC() ctx_bold("synonyms") + ctx_NC() ctx_bold("patterns") + ctx_NC() ctx_bold("characters") + ctx_NC() ctx_NR() + context.FL() + for k, v in sortedhash(registered) do + local parent = v.parent + local resources = v.resources + local patterns = resources and resources.patterns + ctx_NC() context(k) + ctx_NC() context(v.number) + ctx_NC() context(v.parent) + ctx_NC() context(v.patterns) + ctx_NC() for k, v in sortedhash(v.synonyms) do context("%s\\par",k) end + if patterns then + ctx_NC() context(patterns.n) + ctx_NC() context("% t",utf.split(patterns.characters)) + else + ctx_NC() + ctx_NC() + end + ctx_NC() ctx_NR() end + context.LL() context.stoptabulate() + -- end diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.mkiv b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv index 36372037433..22991f264f8 100644 --- a/Master/texmf-dist/tex/context/base/s-languages-system.mkiv +++ b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv @@ -16,6 +16,7 @@ \registerctxluafile{s-languages-system}{} \installmodulecommandluasingle \showinstalledlanguages {moduledata.languages.system.showinstalled} +\installmodulecommandluasingle \loadinstalledlanguages {moduledata.languages.system.loadinstalled} \stopmodule @@ -25,6 +26,7 @@ \starttext + \loadinstalledlanguages \showinstalledlanguages \stoptext diff --git a/Master/texmf-dist/tex/context/base/s-languages-words.lua b/Master/texmf-dist/tex/context/base/s-languages-words.lua new file mode 100644 index 00000000000..ea7aee87bcd --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-words.lua @@ -0,0 +1,32 @@ +if not modules then modules = { } end modules ['s-languages-words'] = { + version = 1.001, + comment = "companion to s-languages-words.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.words = moduledata.languages.words or { } + +function moduledata.languages.words.showwords(specification) + local filename = specification.filename or file.addsuffix(tex.jobname,"words") + if lfs.isfile(filename) then + local w = dofile(filename) + if w then + -- table.print(w) + for cname, category in table.sortedpairs(w.categories) do + for lname, language in table.sortedpairs(category.languages) do + context.bold(string.format("category: %s, language: %s, total: %s, unique: %s:", + cname, lname, language.total or 0, language.unique or 0) + ) + for word, n in table.sortedpairs(language.list) do + context(" %s (%s)",word,n) + end + context.par() + end + end + end + end +end + diff --git a/Master/texmf-dist/tex/context/base/s-languages-words.mkiv b/Master/texmf-dist/tex/context/base/s-languages-words.mkiv new file mode 100644 index 00000000000..4e350bf34d2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-languages-words.mkiv @@ -0,0 +1,22 @@ +%D \module +%D [ file=s-languages-words, +%D version=2010.10.21, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Environment 3, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is used in the test suite. + +\startmodule[languages-words] + +\registerctxluafile{s-languages-words}{} + +\installmodulecommandluasingle \showwords {moduledata.languages.words.showwords} + +\stopmodule diff --git a/Master/texmf-dist/tex/context/base/s-map-10.mkiv b/Master/texmf-dist/tex/context/base/s-map-10.mkiv index b1218f6e276..c7541babc81 100644 --- a/Master/texmf-dist/tex/context/base/s-map-10.mkiv +++ b/Master/texmf-dist/tex/context/base/s-map-10.mkiv @@ -172,7 +172,7 @@ \def\hfontii{\ssbf} \def\hfontiii{\rm\it} -\doifmodeelse{nosubsub}{% +\doifelsemode{nosubsub}{% \setuphead [section][% style=\hfontii, before={\blank[line]}, @@ -201,7 +201,7 @@ before={\blank[halfline]}% ]} -\doifmodeelse{nosubsub}{% +\doifelsemode{nosubsub}{% \setuphead [subject][% style=\hfontii, before={\blank[halfline]}, @@ -348,10 +348,10 @@ #1]% \doifnothing{\MapsPeriod}{% \ifnum \normalmonth<6 \gdef\MapsPeriod{VOORJAAR}\else \gdef\MapsPeriod{NAJAAR}\fi} - \doifinstringelse{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}% - \doifinstringelse{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}% - \doifinstringelse{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}% - \doifinstringelse{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}% + \doifelseinstring{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}% + \doifelseinstring{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}% + \doifelseinstring{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}% + \doifelseinstring{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}% \doifnothing{\MapsYear}{\gdef\MapsYear{\the\year}}% \doifnothing{\MapsNumber}{% \ifnum \normalmonth<6 @@ -441,9 +441,9 @@ %%%%%%%%%%% -\doifmodeelse{onecolumn}{% +\doifelsemode{onecolumn}{% \setuplayout[width=340pt] - \doifmodeelse{asym}{% one col, asymmetric + \doifelsemode{asym}{% one col, asymmetric \setuplayout[backspace=187.3pt]% \setuptyping [widetyping][oddmargin=-117pt] \setuppagenumbering [alternative={singlesided,doublesided}] diff --git a/Master/texmf-dist/tex/context/base/s-math-characters.lua b/Master/texmf-dist/tex/context/base/s-math-characters.lua index b0a79fcb6e5..8ff3a8660df 100644 --- a/Master/texmf-dist/tex/context/base/s-math-characters.lua +++ b/Master/texmf-dist/tex/context/base/s-math-characters.lua @@ -16,23 +16,26 @@ local lower = string.lower local utfchar = utf.char local round = math.round -local fontdata = fonts.hashes.identifiers -local chardata = characters.data +local fontdata = fonts.hashes.identifiers +local chardata = characters.data +local blocks = characters.blocks local no_description = "no description, private to font" -local limited = true -local fillinthegaps = true -local upperlimit = 0x0007F -local upperlimit = 0xF0000 +local limited = true +local fillinthegaps = true +local upperlimit = 0x0007F +local upperlimit = 0xF0000 -local f_unicode = string.formatters["%U"] -local f_slot = string.formatters["%s/%0X"] +local f_unicode = string.formatters["%U"] +local f_slot = string.formatters["%s/%0X"] function moduledata.math.characters.showlist(specification) - specification = interfaces.checkedspecification(specification) - local id = specification.number -- or specification.id - local list = specification.list + specification = interfaces.checkedspecification(specification) + local id = specification.number -- or specification.id + local list = specification.list + local showvirtual = specification.virtual == "all" + local check = specification.check == "yes" if not id then id = font.current() end @@ -70,137 +73,170 @@ function moduledata.math.characters.showlist(specification) names[k] = (name and file.basename(name)) or id end end - context.showmathcharactersstart() - for _, unicode in next, sorted do - if not limited or unicode < upperlimit then - local code = gaps[unicode] or unicode - local char = characters[code] - local desc = descriptions[code] - local info = chardata[code] - if char then - local next_sizes = char.next - local v_variants = char.vert_variants - local h_variants = char.horiz_variants - local commands = char.commands - local slookups = desc and desc.slookups - local mlookups = desc and desc.mlookups - local mathclass = info.mathclass - local mathspec = info.mathspec - local mathsymbol = info.mathsymbol - local description = info.description or no_description - context.showmathcharactersstartentry() - context.showmathcharactersreference(f_unicode(unicode)) - context.showmathcharactersentryhexdectit(f_unicode(code),code,lower(description)) - context.showmathcharactersentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) - if virtual and commands then - local t = { } - for i=1,#commands do - local ci = commands[i] - if ci[1] == "slot" then - local fnt, idx = ci[2], ci[3] - t[#t+1] = f_slot(names[fnt] or fnt,idx) + if check then + for k, v in table.sortedhash(blocks) do + if v.math then + local first = v.first + local last = v.last + local f, l = 0, 0 + if first and last then + for unicode=first,last do + local code = gaps[unicode] or unicode + local char = characters[code] + if char and not (char.commands and not showvirtual) then + f = unicode + break end end - if #t > 0 then - context.showmathcharactersentryresource(concat(t,", ")) - end - end - if mathclass or mathspec then - context.showmathcharactersstartentryclassspec() - if mathclass then - context.showmathcharactersentryclassname(mathclass,info.mathname or "no name") - end - if mathspec then - for i=1,#mathspec do - local mi = mathspec[i] - context.showmathcharactersentryclassname(mi.class,mi.name or "no name") + for unicode=last,first,-1 do + local code = gaps[unicode] or unicode + local char = characters[code] + if char and not (char.commands and not showvirtual) then + l = unicode + break end end - context.showmathcharactersstopentryclassspec() + context.showmathcharacterssetrange(k,f,l) end - if mathsymbol then - context.showmathcharactersentrysymbol(f_unicode(mathsymbol),mathsymbol) - end - if next_sizes then - local n, done = 0, { } - context.showmathcharactersstartnext() - while next_sizes do - n = n + 1 - if done[next_sizes] then - context.showmathcharactersnextcycle(n) - break - else - done[next_sizes] = true - context.showmathcharactersnextentry(n,f_unicode(next_sizes),next_sizes) - next_sizes = characters[next_sizes] - v_variants = next_sizes.vert_variants or v_variants - h_variants = next_sizes.horiz_variants or h_variants - if next_sizes then - next_sizes = next_sizes.next + end + end + else + context.showmathcharactersstart() + for _, unicode in next, sorted do + if not limited or unicode < upperlimit then + local code = gaps[unicode] or unicode + local char = characters[code] + local desc = descriptions[code] + local info = chardata[code] + if char then + local commands = char.commands + if commands and not showvirtual then + -- skip + else + local next_sizes = char.next + local v_variants = char.vert_variants + local h_variants = char.horiz_variants + local slookups = desc and desc.slookups + local mlookups = desc and desc.mlookups + local mathclass = info.mathclass + local mathspec = info.mathspec + local mathsymbol = info.mathsymbol + local description = info.description or no_description + context.showmathcharactersstartentry() + context.showmathcharactersreference(f_unicode(unicode)) + context.showmathcharactersentryhexdectit(f_unicode(code),code,lower(description)) + context.showmathcharactersentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) + if virtual and commands then + local t = { } + for i=1,#commands do + local ci = commands[i] + if ci[1] == "slot" then + local fnt, idx = ci[2], ci[3] + t[#t+1] = f_slot(names[fnt] or fnt,idx) + end + end + if #t > 0 then + context.showmathcharactersentryresource(concat(t,", ")) end end - end - context.showmathcharactersstopnext() - if h_variants or v_variants then - context.showmathcharactersbetweennextandvariants() - end - end - if h_variants then - context.showmathcharactersstarthvariants() - for i=1,#h_variants do -- we might go top-down in the original - local vi = h_variants[i] - context.showmathcharactershvariantsentry(i,f_unicode(vi.glyph),vi.glyph) - end - context.showmathcharactersstophvariants() - elseif v_variants then - context.showmathcharactersstartvvariants() - for i=1,#v_variants do - local vi = v_variants[#v_variants-i+1] - context.showmathcharactersvvariantsentry(i,f_unicode(vi.glyph),vi.glyph) - end - context.showmathcharactersstopvvariants() - end - if slookups or mlookups then - local variants = { } - if slookups then - for lookupname, lookupdata in next, slookups do - local lookuptype = lookuptypes[lookupname] - if lookuptype == "substitution" then - variants[lookupdata] = "sub" - elseif lookuptype == "alternate" then - for i=1,#lookupdata do - variants[lookupdata[i]] = "alt" + if mathclass or mathspec then + context.showmathcharactersstartentryclassspec() + if mathclass then + context.showmathcharactersentryclassname(mathclass,info.mathname or "no name") + end + if mathspec then + for i=1,#mathspec do + local mi = mathspec[i] + context.showmathcharactersentryclassname(mi.class,mi.name or "no name") end end + context.showmathcharactersstopentryclassspec() end - end - if mlookups then - for lookupname, lookuplist in next, mlookups do - local lookuptype = lookuptypes[lookupname] - for i=1,#lookuplist do - local lookupdata = lookuplist[i] - local lookuptype = lookuptypes[lookupname] - if lookuptype == "substitution" then - variants[lookupdata] = "sub" - elseif lookuptype == "alternate" then - for i=1,#lookupdata do - variants[lookupdata[i]] = "alt" + if mathsymbol then + context.showmathcharactersentrysymbol(f_unicode(mathsymbol),mathsymbol) + end + if next_sizes then + local n, done = 0, { } + context.showmathcharactersstartnext() + while next_sizes do + n = n + 1 + if done[next_sizes] then + context.showmathcharactersnextcycle(n) + break + else + done[next_sizes] = true + context.showmathcharactersnextentry(n,f_unicode(next_sizes),next_sizes) + next_sizes = characters[next_sizes] + v_variants = next_sizes.vert_variants or v_variants + h_variants = next_sizes.horiz_variants or h_variants + if next_sizes then + next_sizes = next_sizes.next end end end + context.showmathcharactersstopnext() + if h_variants or v_variants then + context.showmathcharactersbetweennextandvariants() + end end + if h_variants then + context.showmathcharactersstarthvariants() + for i=1,#h_variants do -- we might go top-down in the original + local vi = h_variants[i] + context.showmathcharactershvariantsentry(i,f_unicode(vi.glyph),vi.glyph) + end + context.showmathcharactersstophvariants() + elseif v_variants then + context.showmathcharactersstartvvariants() + for i=1,#v_variants do + local vi = v_variants[#v_variants-i+1] + context.showmathcharactersvvariantsentry(i,f_unicode(vi.glyph),vi.glyph) + end + context.showmathcharactersstopvvariants() + end + if slookups or mlookups then + local variants = { } + if slookups then + for lookupname, lookupdata in next, slookups do + local lookuptype = lookuptypes[lookupname] + if lookuptype == "substitution" then + variants[lookupdata] = "sub" + elseif lookuptype == "alternate" then + for i=1,#lookupdata do + variants[lookupdata[i]] = "alt" + end + end + end + end + if mlookups then + for lookupname, lookuplist in next, mlookups do + local lookuptype = lookuptypes[lookupname] + for i=1,#lookuplist do + local lookupdata = lookuplist[i] + local lookuptype = lookuptypes[lookupname] + if lookuptype == "substitution" then + variants[lookupdata] = "sub" + elseif lookuptype == "alternate" then + for i=1,#lookupdata do + variants[lookupdata[i]] = "alt" + end + end + end + end + end + context.showmathcharactersstartlookupvariants() + local i = 0 + for variant, lookuptype in table.sortedpairs(variants) do + i = i + 1 + context.showmathcharacterslookupvariant(i,f_unicode(variant),variant,lookuptype) + end + context.showmathcharactersstoplookupvariants() + end + context.showmathcharactersstopentry() end - context.showmathcharactersstartlookupvariants() - local i = 0 - for variant, lookuptype in table.sortedpairs(variants) do - i = i + 1 - context.showmathcharacterslookupvariant(i,f_unicode(variant),variant,lookuptype) - end - context.showmathcharactersstoplookupvariants() end - context.showmathcharactersstopentry() end end + context.showmathcharactersstop() end - context.showmathcharactersstop() end diff --git a/Master/texmf-dist/tex/context/base/s-math-characters.mkiv b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv index 1c415954453..3b273cb6c21 100644 --- a/Master/texmf-dist/tex/context/base/s-math-characters.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv @@ -46,6 +46,7 @@ \let\showmathcharactersstartlookupvariants \relax \let\showmathcharacterslookupvariant \gobblefourarguments \let\showmathcharactersstoplookupvariants \relax + \let\showmathcharacterssetrange \gobblethreearguments \stopsetups @@ -126,15 +127,23 @@ \def\module_math_characters_show[#1]% {\begingroup - \getdummyparameters[\c!bodyfont=,\c!list=,\c!alternative=default,#1]% + \getdummyparameters + [\c!bodyfont=, + \c!list=, + \c!check=, + \c!alternative=default, + \c!option=\v!all, + #1]% \directsetup{s-math-characters:\dummyparameter\c!alternative}% \doifelsenothing{\dummyparameter\c!bodyfont} {\definedfont[MathRoman*math-text]} {\definedfont[\dummyparameter\c!bodyfont]}% \dontcomplain \ctxlua{moduledata.math.characters.showlist { - number = false, - list = "\dummyparameter\c!list", + number = false, + check = "\dummyparameter\c!check", + list = "\dummyparameter\c!list", + option = "\dummyparameter\c!option", }}% \endgroup} diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.lua b/Master/texmf-dist/tex/context/base/s-math-coverage.lua index 56880f76db0..3c6080dc36e 100644 --- a/Master/texmf-dist/tex/context/base/s-math-coverage.lua +++ b/Master/texmf-dist/tex/context/base/s-math-coverage.lua @@ -9,45 +9,50 @@ if not modules then modules = { } end modules ['s-math-coverage'] = { local utfchar, utfbyte = utf.char, utf.byte local formatters, lower = string.formatters, string.lower local concat = table.concat +local sortedhash = table.sortedhash -moduledata.math = moduledata.math or { } -moduledata.math.coverage = moduledata.math.coverage or { } +moduledata.math = moduledata.math or { } +moduledata.math.coverage = moduledata.math.coverage or { } -local context = context +local context = context -local ctx_NC = context.NC -local ctx_NR = context.NR -local ctx_HL = context.HL +local ctx_NC = context.NC +local ctx_NR = context.NR +local ctx_HL = context.HL -local ctx_rawmathematics = context.formatted.rawmathematics -local ctx_mathematics = context.formatted.mathematics -local ctx_startimath = context.startimath -local ctx_stopimath = context.stopimath -local ctx_setmathattribute = context.setmathattribute -local ctx_underbar = context.underbar -local ctx_getglyph = context.getglyph +local ctx_startmixedcolumns = context.startmixedcolumns +local ctx_stopmixedcolumns = context.stopmixedcolumns +local ctx_setupalign = context.setupalign +local ctx_starttabulate = context.starttabulate +local ctx_stoptabulate = context.stoptabulate +local ctx_rawmathematics = context.formatted.rawmathematics +local ctx_mathematics = context.formatted.mathematics +local ctx_startimath = context.startimath +local ctx_stopimath = context.stopimath +local ctx_setmathattribute = context.setmathattribute +local ctx_underbar = context.underbar +local ctx_getglyph = context.getglyph -local styles = mathematics.styles -local alternatives = mathematics.alternatives -local charactersets = mathematics.charactersets +local styles = mathematics.styles +local alternatives = mathematics.alternatives +local charactersets = mathematics.charactersets -local getboth = mathematics.getboth -local remapalphabets = mathematics.remapalphabets +local getboth = mathematics.getboth +local remapalphabets = mathematics.remapalphabets -local chardata = characters.data -local superscripts = characters.superscripts -local subscripts = characters.subscripts +local chardata = characters.data +local superscripts = characters.superscripts +local subscripts = characters.subscripts context.writestatus("math coverage","underline: not remapped") function moduledata.math.coverage.showalphabets() - context.starttabulate { "|lT|l|Tl|" } + ctx_starttabulate { "|lT|l|Tl|" } for i=1,#styles do local style = styles[i] for i=1,#alternatives do local alternative = alternatives[i] - for i=1,#charactersets do - local alphabet = charactersets[i] + for _, alphabet in sortedhash(charactersets) do ctx_NC() if i == 1 then context("%s %s",style,alternative) @@ -80,14 +85,14 @@ function moduledata.math.coverage.showalphabets() end end end - context.stoptabulate() + ctx_stoptabulate() end function moduledata.math.coverage.showcharacters() - context.startmixedcolumns() - context.setupalign { "nothyphenated" } - context.starttabulate { "|T|i2|Tpl|" } - for u, d in table.sortedhash(chardata) do + ctx_startmixedcolumns { balance = "yes" } + ctx_setupalign { "nothyphenated" } + ctx_starttabulate { "|T|i2|Tpl|" } + for u, d in sortedhash(chardata) do local mathclass = d.mathclass local mathspec = d.mathspec if mathclass or mathspec then @@ -110,15 +115,15 @@ function moduledata.math.coverage.showcharacters() ctx_NR() end end - context.stoptabulate() - context.stopmixedcolumns() + ctx_stoptabulate() + ctx_stopmixedcolumns() end -- This is a somewhat tricky table as we need to bypass the math machinery. function moduledata.math.coverage.showscripts() - context.starttabulate { "|cT|c|cT|c|c|c|l|" } - for k, v in table.sortedhash(table.merged(superscripts,subscripts)) do + ctx_starttabulate { "|cT|c|cT|c|c|c|l|" } + for k, v in sortedhash(table.merged(superscripts,subscripts)) do local ck = utfchar(k) local cv = utfchar(v) local ss = superscripts[k] and "^" or "_" @@ -131,14 +136,14 @@ function moduledata.math.coverage.showscripts() ctx_NC() context(lower(chardata[k].description)) ctx_NC() ctx_NR() end - context.stoptabulate() + ctx_stoptabulate() end -- Handy too. function moduledata.math.coverage.showbold() - context.starttabulate { "|lT|cm|lT|cm|lT|" } - for k, v in table.sortedhash(mathematics.boldmap) do + ctx_starttabulate { "|lT|cm|lT|cm|lT|" } + for k, v in sortedhash(mathematics.boldmap) do ctx_NC() context("%U",k) ctx_NC() context("%c",k) ctx_NC() context("%U",v) @@ -146,5 +151,47 @@ function moduledata.math.coverage.showbold() ctx_NC() context(chardata[k].description) ctx_NC() ctx_NR() end - context.stoptabulate() + ctx_stoptabulate() end + +-- function moduledata.math.coverage.showentities() +-- ctx_startmixedcolumns { balance = "yes" } +-- ctx_starttabulate { "|Tl|c|Tl|" } +-- for k, v in sortedhash(characters.entities) do +-- local b = utf.byte(v) +-- local d = chardata[b] +-- local m = d.mathname +-- local c = d.contextname +-- local s = ((m and "\\"..m) or (c and "\\".. c) or v) .. "{}{}{}" +-- ctx_NC() +-- context("%U",b) +-- ctx_NC() +-- ctx_mathematics(s) +-- ctx_NC() +-- context(k) +-- ctx_NC() +-- ctx_NR() +-- end +-- ctx_stoptabulate() +-- ctx_stopmixedcolumns() +-- end + +function moduledata.math.coverage.showentities() + ctx_startmixedcolumns { balance = "yes" } + ctx_starttabulate { "|T||T|T|" } + for k, v in sortedhash(characters.entities) do + local d = chardata[v] + if d then + local m = d.mathclass or d.mathspec + local u = d.unicodeslot + ctx_NC() context(m and "m" or "t") + ctx_NC() ctx_getglyph("MathRoman",u) + ctx_NC() context("%05X",u) + ctx_NC() context(k) + ctx_NC() ctx_NR() + end + end + ctx_stoptabulate() + ctx_stopmixedcolumns() +end + diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv index 9f084b2841c..e318c9effdd 100644 --- a/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv @@ -15,10 +15,11 @@ \registerctxluafile{s-math-coverage}{} -\installmodulecommandluasingle \showmathalphabets {moduledata.math.coverage.showalphabets} -\installmodulecommandluasingle \showmathcharacters {moduledata.math.coverage.showcharacters} -\installmodulecommandluasingle \showmathscripts {moduledata.math.coverage.showscripts} -\installmodulecommandluasingle \showmathbold {moduledata.math.coverage.showbold} +\installmodulecommandluasingle \showmathalphabets {moduledata.math.coverage.showalphabets} +\installmodulecommandluasingle \showmathcharacters{moduledata.math.coverage.showcharacters} +\installmodulecommandluasingle \showmathscripts {moduledata.math.coverage.showscripts} +\installmodulecommandluasingle \showmathbold {moduledata.math.coverage.showbold} +\installmodulecommandluasingle \showmathentities {moduledata.math.coverage.showentities} \stopmodule @@ -32,5 +33,6 @@ \showmathcharacters \page \showmathscripts \page \showmathbold \page + \showmathentities \page \stoptext diff --git a/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv index 314d23868e5..230eb513ebe 100644 --- a/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv +++ b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv @@ -39,7 +39,8 @@ % \setuplayout % [page] -\setuppapersize[HD+] +\setuppapersize + [HD+] \setuplayout [backspace=0pt, @@ -102,6 +103,16 @@ color=textcolor, contrastcolor=nonecolor] +\def\showmathcharacterssetrange#1#2#3% + {\writestatus{range}{#1: \unihex{#2} - \unihex{#3}}% + \ifcase#2\relax + \definereference[#1][notpresent]% + \else\ifcase#3\relax + \definereference[#1][notpresent]% + \else + \normalexpanded{\definereference[#1][\unihex{#2}]}% + \fi\fi} + \startinteractionmenu[bottom] \startgot [firstpage] first \stopgot \quad \startgot [deltapage(-100)] -100 \stopgot \quad @@ -159,6 +170,22 @@ \startgot [U+1D7AA] grk ss bolditalic \stopgot \stopinteractionmenu +% \startinteractionmenu[symbols] +% \startgot [U+00030] dig normal \stopgot \quad +% \startgot [U+1D7CE] dig bold \stopgot \quad +% \startgot [U+1D7D8] dig doublestruck \stopgot \quad +% \startgot [U+1D7E2] dig ss normal \stopgot \quad +% \startgot [U+1D7EC] dig ss bold \stopgot \quad +% \startgot [U+1D7F6] dig monospace \stopgot \quad +% \startgot [U+02200] operators \stopgot \quad +% \startgot [U+02701] symbols a \stopgot \quad +% \startgot [U+02901] symbols b \stopgot \quad +% \startgot [U+02A00] supplemental \stopgot \quad +% \startgot [U+027F0] arrows a \stopgot \quad +% \startgot [U+02900] arrows b \stopgot \quad +% \startgot [U+1F800] arrows c \stopgot +% \stopinteractionmenu + \startinteractionmenu[symbols] \startgot [U+00030] dig normal \stopgot \quad \startgot [U+1D7CE] dig bold \stopgot \quad @@ -167,9 +194,13 @@ \startgot [U+1D7EC] dig ss bold \stopgot \quad \startgot [U+1D7F6] dig monospace \stopgot \quad \startgot [U+02200] operators \stopgot \quad - \startgot [U+02701] symbols a \stopgot \quad - \startgot [U+02901] symbols b \stopgot \quad - \startgot [U+02A00] supplemental \stopgot + \startgot [miscellaneousmathematicalsymbolsa] symbols a \stopgot \quad + \startgot [miscellaneousmathematicalsymbolsb] symbols b \stopgot \quad + \startgot [supplementalmathematicaloperators] supplemental \stopgot \quad + \startgot [supplementalarrowsa] arrows a \stopgot \quad + \startgot [supplementalarrowsb] arrows b \stopgot \quad + \startgot [supplementalarrowsc] arrows c \stopgot \quad + \removeunwantedspaces \stopinteractionmenu \defineframed @@ -227,7 +258,7 @@ \showmathcharactersmth{10}{#1}% \endgroup \vfilll - \doifmodeelse{crosslink} + \doifelsemode{crosslink} {\goto{\strut\textcolor\showmathcharacterstxt{#2}}[#2::#1]}% {\strut\textcolor\showmathcharacterstxt{#2}}}% \hskip1ex} @@ -404,13 +435,17 @@ % main +% this is a one-run style so we can forget about an alternative +% just assume that the previous definitions are global + \unprotect \unexpanded\def\showmathfontrepertoire {\dosingleempty\module_math_repertoire_show} -\def\module_math_repertoire_show[#1]% % this is a one-run style so we can forget about an alternative - {\showmathfontcharacters[\c!alternative=,#1]} % just assume that the previous definitions are global +\def\module_math_repertoire_show[#1]% + {\showmathfontcharacters[alternative=,option=,check=yes,#1] + \showmathfontcharacters[alternative=,option=,#1]} \protect @@ -418,7 +453,7 @@ \continueifinputfile{s-math-repertoire.mkiv} -\showmathcharacterssetbodyfonts{lucidanova,cambria,xits,modern,pagella,termes,bonum,schola} +\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,modern,pagella,termes,bonum,schola,dejavu} \starttext @@ -434,10 +469,11 @@ % \setupbodyfont[stix, 12pt] % \setupbodyfont[xits, 12pt] % \setupbodyfont[lucida, 12pt] - % \setupbodyfont[lucidanova,12pt] + % \setupbodyfont[lucidaot, 12pt] % \setupbodyfont[pagella, 12pt] % \setupbodyfont[bonum, 12pt] - \setupbodyfont[schola, 12pt] + % \setupbodyfont[schola, 12pt] + \setupbodyfont[dejavu, 12pt] } { diff --git a/Master/texmf-dist/tex/context/base/s-pre-17.mkiv b/Master/texmf-dist/tex/context/base/s-pre-17.mkiv index 9505faa6b76..9c46b4ed7a4 100644 --- a/Master/texmf-dist/tex/context/base/s-pre-17.mkiv +++ b/Master/texmf-dist/tex/context/base/s-pre-17.mkiv @@ -194,7 +194,7 @@ \egroup \setbox\scratchbox\vbox\bgroup \vskip100pt - \doifmodeelse {SpreadPage} { + \doifelsemode {SpreadPage} { \hbox spread 200pt } { \hbox to \wd\scratchbox diff --git a/Master/texmf-dist/tex/context/base/s-references-show.mkiv b/Master/texmf-dist/tex/context/base/s-references-show.mkiv new file mode 100644 index 00000000000..72cccce54f1 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-references-show.mkiv @@ -0,0 +1,132 @@ +%D \module +%D [ file=s-references-show.mkiv, +%D version=2015.04.13, +%D title=\CONTEXT\ Style File, +%D subtitle=Reference Checking, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[references-show] + +\unprotect + +% \enabletrackers[nodes.references,nodes.destinations] % also shows areas + +\enabletrackers[nodes.references.show,nodes.destinations.show] + +\enablehiddenbackground % trick + +\edef\hiddenbackgroundlist{\hiddenbackgroundlist,trace-references} + +\defineoverlay + [trace-references] + [\directsetup{trace:references:onpage}] + +\startluacode + local pagelist = structures.references.tracedpages + + function commands.getreferencesonpage(n) + n = tonumber(n) + if n then + local pagedata = pagelist[n] + if pagedata then + context("%s references",#pagedata) + context.blank() + for i=1,#pagedata do + local details = pagedata[i] + local prefix = details[1] + local reference = details[2] + -- local internal = details[3] + -- context("%04i = %s : %s",internal,prefix == "" and "-" or prefix,reference) + context("%s : %s",prefix == "" and "-" or prefix,reference) + context.par() + end + else + context("no references") + end + else + context("no valid page") + end + end + +\stopluacode + +\definecolor + [trace:references:onpage] + [b=.5,a=1,t=.25] + +\defineframed + [trace:references:onpage] + [\c!offset=2\exheight, + %\c!foregroundstyle=\infofont, + \c!frame=\v!off, + \c!background=\v!color, + \c!backgroundcolor=trace:references:onpage, + \c!align=\v!normal] + +\startsetups trace:references:onpage + \vbox to \vsize \bgroup + \infofont + \vskip\dimexpr-\topspace-\headerheight+2\exheight\relax + \hbox to \hsize \bgroup + \doifoddpageelse\hss{\hskip\dimexpr-\cutspace+2\exheight\relax}% + \directlocalframed [ + trace:references:onpage + ] { + \ctxcommand{getreferencesonpage(\the\realpageno)} + } + \doifoddpageelse{\hskip\dimexpr-\cutspace+2\exheight\relax}\hss + \egroup + \vss + \egroup +\stopsetups + +\protect + +\continueifinputfile{s-references-show.mkiv} + +\usemodule[art-01] + +\setupinteraction + [state=start] + +\setuppagenumbering + [alternative=doublesided] + +\starttext + +\title {Contents} + +\placelist[chapter] + +\setupreferenceprefix[zero] + +\chapter[crap]{foo} + +\setupreferenceprefix[one] + +test \pagereference[whatever] + +\dorecurse{5}{ + \placefigure + [here][bar 1.#1] + {xx}{\framed{xx #1}} +} + +\setupreferenceprefix[two] + +\dorecurse{5}{ + \placefigure + [here][bar 2.#1] + {xx}{\framed{xx #1}} +} + +\in{checked}[bar 1.1] +\in{checked}[bar 2.1] + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv b/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv new file mode 100644 index 00000000000..daaab5abcd0 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv @@ -0,0 +1,80 @@ +%D \module +%D [ file=s-structure-sections, +%D version=2015.02.02, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Structure Sections, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\startluacode + local context = context + local ctx_NC, ctx_NR = context.NC, context.NR + local ctx_bold = context.bold + + structures.tracers = structures.tracers or { } + + function structures.tracers.showsections() + + local list = structures.sections.registered + local keys = table.keys(list) + table.sort(keys,function(a,b) + local la, lb = list[a].level, list[b].level + if la == lb then + return a < b + else + return la < lb + end + end) + context.start() + context.switchtobodyfont { "tt" } + context.starttabulate { "||c||||" } + context.FL() + ctx_NC() ctx_bold("name") + ctx_NC() ctx_bold("level") + ctx_NC() ctx_bold("parent") + ctx_NC() ctx_bold("section") + ctx_NC() ctx_bold("coupling") + ctx_NC() context.NR() + context.ML() + for i=1,#keys do + local k = keys[i] + local v = list[k] + ctx_NC() ctx_bold(k) + ctx_NC() context(v.level) + ctx_NC() context(v.parent) + ctx_NC() context(v.section) + ctx_NC() context(v.coupling) + ctx_NC() context.NR() + end + context.LL() + context.stoptabulate() + context.stop() + + end +\stopluacode + + +\starttexdefinition showstructuresections + + % no settings yet + + \ctxlua{structures.tracers.showsections()} + +\stoptexdefinition + +\protect + +\continueifinputfile{s-structure-sections.mkiv} + +\starttext + + \showstructuresections + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/s-syn-01.tex b/Master/texmf-dist/tex/context/base/s-syn-01.tex deleted file mode 100644 index 01c8f6653dd..00000000000 --- a/Master/texmf-dist/tex/context/base/s-syn-01.tex +++ /dev/null @@ -1,54 +0,0 @@ -%D \module -%D [ file=s-syn-01, -%D version=0000.00.00, -%D title=\CONTEXT\ Style File, -%D subtitle=Preliminary Syntax Stuff, -%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 is needed for the \METAFUN\ manual (this module was -%D called \type {p-syn-01} on my machine). - -\unprotect - -\def\Indent #1{\ifvmode\noindent\hbox to 2em{\hss#1}\else#1\fi} -\def\Sugar #1{\ifhmode\unskip\unskip\unskip\fi\kern.25em{#1}\kern.25em\ignorespaces} -\def\Something#1{\Sugar{\mathematics{\langle\hbox{#1}\rangle}}} -\def\Lbrace {\Sugar{\tttf\leftargument}} -\def\Rbrace {\Sugar{\tttf\rightargument}} -\def\Or {\Sugar{\mathematics{\vert}}} -\def\Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}} -\def\Means {\Sugar{\mathematics{\rightarrow}}} -\def\Tex #1{\Sugar{\type{#1}}} -\def\Literal #1{\Sugar{\type{#1}}} -\def\Syntax #1{\strut\kern-.25em{#1}\kern-.25em} -\def\Next {\crlf\hbox to 2em{}\nobreak} -\def\Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}} -\def\Quote #1{\Sugar{\quote{#1}}} - -\def\Or {\Sugar{\Indent{\mathematics{\vert}}}} -\def\Means {\Sugar{\Indent{\mathematics{\rightarrow}}}} - -\def\StartSyntax - {\goodbreak - \startlines - \catcode`\#=12 - \let\L \Literal - \let\S \Something - \def\FL##1{\color[darkred]{\L{##1}}} - \def\FS##1{\S{\color[darkred]{##1}}} - \let\M \Means - \let\O \Or - \let\Q \Quote - \let\LB\Lbrace - \let\RB\Rbrace} - -\def\StopSyntax - {\stoplines} - -\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/s-syntax.mkii b/Master/texmf-dist/tex/context/base/s-syntax.mkii new file mode 100644 index 00000000000..6d1d59697ec --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-syntax.mkii @@ -0,0 +1,54 @@ +%D \module +%D [ file=s-syntax, % was: s-syn-01, +%D version=0000.00.00, +%D title=\CONTEXT\ Style File, +%D subtitle=Preliminary Syntax Stuff, +%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 is needed for the \METAFUN\ manual (this module was +%D called \type {p-syn-01} on my machine). + +\unprotect + +\def\Indent #1{\ifvmode\noindent\hbox to 2em{\hss#1}\else#1\fi} +\def\Sugar #1{\ifhmode\unskip\unskip\unskip\fi\kern.25em{#1}\kern.25em\ignorespaces} +\def\Something#1{\Sugar{\mathematics{\langle\hbox{#1}\rangle}}} +\def\Lbrace {\Sugar{\tttf\leftargument}} +\def\Rbrace {\Sugar{\tttf\rightargument}} +\def\Or {\Sugar{\mathematics{\vert}}} +\def\Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}} +\def\Means {\Sugar{\mathematics{\rightarrow}}} +\def\Tex #1{\Sugar{\type{#1}}} +\def\Literal #1{\Sugar{\type{#1}}} +\def\Syntax #1{\strut\kern-.25em{#1}\kern-.25em} +\def\Next {\crlf\hbox to 2em{}\nobreak} +\def\Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}} +\def\Quote #1{\Sugar{\quote{#1}}} + +\def\Or {\Sugar{\Indent{\mathematics{\vert}}}} +\def\Means {\Sugar{\Indent{\mathematics{\rightarrow}}}} + +\def\StartSyntax + {\goodbreak + \startlines + \catcode`\#=12 + \let\L \Literal + \let\S \Something + \def\FL##1{\color[darkred]{\L{##1}}} + \def\FS##1{\S{\color[darkred]{##1}}} + \let\M \Means + \let\O \Or + \let\Q \Quote + \let\LB\Lbrace + \let\RB\Rbrace} + +\def\StopSyntax + {\stoplines} + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/s-syntax.mkiv b/Master/texmf-dist/tex/context/base/s-syntax.mkiv new file mode 100644 index 00000000000..96312f77179 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-syntax.mkiv @@ -0,0 +1,96 @@ +%D \module +%D [ file=s-syntax, % was: s-syn-01, +%D version=0000.00.00, +%D title=\CONTEXT\ Style File, +%D subtitle=Preliminary Syntax Stuff, +%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 is needed for the \METAFUN\ manual: quite old code that I would do +%D differently nowadays. + +\unprotect + +\unexpanded\def\module_syntax_Indent #1{\ifvmode\noindent\hbox to 2em{\hss#1}\else#1\fi} +\unexpanded\def\module_syntax_Sugar #1{\removeunwantedspaces\kern.25em{#1}\kern.25em\ignorespaces} +\unexpanded\def\module_syntax_Something #1{\Sugar{\mathematics{\langle\hbox{#1}\rangle}}} +\unexpanded\def\module_syntax_Lbrace {\Sugar{\tttf\leftargument}} +\unexpanded\def\module_syntax_Rbrace {\Sugar{\tttf\rightargument}} +\unexpanded\def\module_syntax_Lparent {\Sugar{\tttf(}} +\unexpanded\def\module_syntax_Rparent {\Sugar{\tttf)}} +\unexpanded\def\module_syntax_Lbracket {\Sugar{\tttf[}} +\unexpanded\def\module_syntax_Rbracket {\Sugar{\tttf]}} +\unexpanded\def\module_syntax_Or {\Sugar{\mathematics{\vert}}} +\unexpanded\def\module_syntax_Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}} +\unexpanded\def\module_syntax_Means {\Sugar{\mathematics{\rightarrow}}} +\unexpanded\def\module_syntax_Tex #1{\Sugar{\type{#1}}} +\unexpanded\def\module_syntax_Literal #1{\Sugar{\type{#1}}} +\unexpanded\def\module_syntax_Syntax #1{\strut\kern-.25em{#1}\kern-.25em} +\unexpanded\def\module_syntax_Next {\crlf\hbox to 2em{}\nobreak} +\unexpanded\def\module_syntax_Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}} +\unexpanded\def\module_syntax_Quote #1{\Sugar{\quote{#1}}} +\unexpanded\def\module_syntax_Or {\Sugar{\module_syntax_Indent{\mathematics{\vert}}}} +\unexpanded\def\module_syntax_Means {\Sugar{\module_syntax_Indent{\mathematics{\rightarrow}}}} +\unexpanded\def\module_syntax_FlaggedLiteral #1{\color[darkred]{\module_syntax_Literal{#1}}} +\unexpanded\def\module_syntax_FlaggedSomething#1{\module_syntax_Something{\color[darkred]{#1}}} + +\unexpanded\def\StartSyntax + {\startlines + % formatters + \let\Indent \module_syntax_Indent + \let\Sugar \module_syntax_Sugar + \let\Something \module_syntax_Something + \let\Lbrace \module_syntax_Lbrace + \let\Rbrace \module_syntax_Rbrace + \let\Lparent \module_syntax_Lparent + \let\Rparent \module_syntax_Rparent + \let\Lbracket \module_syntax_Lbracket + \let\Rbracket \module_syntax_Rbracket + \let\Or \module_syntax_Or + \let\Optional \module_syntax_Optional + \let\Means \module_syntax_Means + \let\Tex \module_syntax_Tex + \let\Literal \module_syntax_Literal + \let\Syntax \module_syntax_Syntax + \let\Next \module_syntax_Next + \let\Whatever \module_syntax_Whatever + \let\Quote \module_syntax_Quote + \let\Or \module_syntax_Or + \let\Means \module_syntax_Means + \let\FlaggedLiteral \module_syntax_FlaggedLiteral + \let\FlaggedSomething\module_syntax_FlaggedSomething + % shortcuts + \let\FL \module_syntax_FlaggedLiteral + \let\FS \module_syntax_FlaggedSomething + \let\L \module_syntax_Literal + \let\S \module_syntax_Something + \let\M \module_syntax_Means + \let\O \module_syntax_Or + \let\Q \module_syntax_Quote + \let\LB \module_syntax_Lbrace + \let\RB \module_syntax_Rbrace + \let\LP \module_syntax_Lparent + \let\RP \module_syntax_Rparent + \let\LS \module_syntax_Lbracket + \let\RS \module_syntax_Rbracket + \let\{ \module_syntax_Lbrace + \let\} \module_syntax_Rbrace + \let\( \module_syntax_Lparent + \let\) \module_syntax_Rparent + \let\[ \module_syntax_Lbracket + \let\] \module_syntax_Rbracket + % precaution + \catcode`\#\othercatcode} + +\unexpanded\def\StopSyntax + {\stoplines} + +\unexpanded\def\SyntaxCommand#1% + {\csname module_syntax_#1\endcsname} + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv b/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv new file mode 100644 index 00000000000..48d81ce3602 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv @@ -0,0 +1,209 @@ +%D \module +%D [ file=s-typesetting-kerning, +%D version=2014.12.14, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Character Kerning, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\definecharacterkerning + [typesetting-kerning-demo] + [factor=.5] + +\startbuffer[showcharacterkerning:boxes] + \starttextrule{boxes} + \showfontkerns + \dontcomplain + \startlines + test \hbox{!} test + test\hbox{!} test + test \hbox{!}test + test:$x$ test + \setcharacterkerning[typesetting-kerning-demo] + test \hbox{!} test + test\hbox{!} test + test \hbox{!}test + test:$x$ test + \stoplines + \stoptextrule +\stopbuffer + +\startbuffer[showcharacterkerning:ligatures] + \starttextrule{ligatures} + \dontcomplain + \startlines + effe flink effectief efficient fietsen + \blank + \setcharacterkerning[typesetting-kerning-demo] + effe flink effectief efficient fietsen + \blank \hsize\zeropoint + effe + flink + effectief + efficient + fietsen + \stoplines + \stoptextrule +\stopbuffer + +\startbuffer[showcharacterkerning:discretionaries] + \starttextrule{discretionary} + \dontcomplain + \startlines + \hbox{\samplediscretionary} + \hbox{xxx\samplediscretionary} + \hbox{\samplediscretionary xxx} + \hbox{xxx\samplediscretionary xxx} + \blank + \setcharacterkerning[typesetting-kerning-demo] + \hbox{\samplediscretionary} + \hbox{xxx\samplediscretionary} + \hbox{\samplediscretionary xxx} + \hbox{xxx\samplediscretionary xxx} + \blank \hsize\zeropoint + \samplediscretionary + xxx\samplediscretionary + \samplediscretionary xxx + xxx\samplediscretionary xxx + \stoplines + \stoptextrule +\stopbuffer + +\startbuffer[showcharacterkerning:explicits] + \starttextrule{explicits} + \exhyphenchar \hyphenasciicode + \preexhyphenchar \lessthanasciicode + \postexhyphenchar\morethanasciicode + \def\TestDisc + {\discretionary + {\kern\emwidth<}% + {>\kern\emwidth}% + {\kern\emwidth=\kern\emwidth}% + } + \dontcomplain + \startlines + \hbox{super-charged} + \hbox{super\-charged} + \hbox{super\TestDisc charged} + \hbox{super\discretionary{[}{]}{[]}charged} + \blank + \setcharacterkerning[typesetting-kerning-demo] + \hbox{super-charged} + \hbox{super\-charged} + \hbox{super\TestDisc charged} + \hbox{super\discretionary{[}{]}{[]}charged} + \blank \hsize\zeropoint + super-charged + super\-charged + super\TestDisc charged + super\discretionary{[}{]}{[]}charged + \stoplines + \stoptextrule +\stopbuffer + +\starttexdefinition unexpanded showcharacterkerning + \getbuffer[showcharacterkerning:boxes] + \getbuffer[showcharacterkerning:ligatures] + \getbuffer[showcharacterkerning:discretionaries] + \getbuffer[showcharacterkerning:explicits] +\stoptexdefinition + + +\starttexdefinition showcharacterkerningstepscompared #1 + \definecharacterkerning[crap][factor=\KerningStepFactor]% + \setbox0=\ruledhbox{\color[color-1]{#1}\hss} + \setbox2=\ruledhbox{\setcharacterkerning[crap]\color[color-2]{#1}} + \setbox4=\ruledhbox{\setcharacterkerning[crap]\showfontkerns\showglyphs#1} + \xdef\KerningStepPercentage{\ctxlua{context("\letterpercent 0.2f",(1-\number\wd0/\number\wd2)*100)}} + \scratchwidth\wd0 + \vtop\bgroup + \hbox{\box0\hskip-\scratchwidth\box2} + \par + \box4 + \egroup +\stoptexdefinition + +\starttexdefinition showcharacterkerningsteps [#1] + + \start + + \getdummyparameters + [\s!font=Regular, + \c!sample={Wat een bende, rommelen met het font design!}, + \c!text={rommelen}, + \c!first=00, + \c!last=95, + \c!step=05, + \c!option=, % \v!page + #1] + + \doif{\dummyparameter\c!option}\v!page { + \startTEXpage[\c!offset=1ex] + } + + \definecolor[color-1][r=1,t=.5,a=1] + \definecolor[color-2][b=1,t=.5,a=1] + + \definedfont[\dummyparameter\s!font*default sa 1] + + \doif {\dummyparameter\c!option}\v!page { + \begingroup + \tttf \dummyparameter\s!font\space @ default + \endgroup + \blank + } + + \starttabulate[|cT|l|cT|l|cT|] + + \NC \tt\bf factor \NC \tt\bf sample \NC \tt\bf \letterpercent \NC \tt\bf text \NC \tt\bf \letterpercent \NC \NR \HL + + \dostepwiserecurse {\dummyparameter\c!first} {\dummyparameter\c!last} {\dummyparameter\c!step} { + \NC + \xdef\KerningStepFactor{\ctxlua{context("\letterpercent 0.3f",####1/1000)}} + \KerningStepFactor + \NC + \showcharacterkerningstepscompared{\dummyparameter\c!sample} + \NC + \KerningStepPercentage + \NC + \showcharacterkerningstepscompared{\dummyparameter\c!text} + \NC + \KerningStepPercentage + \NC \NR + } + + \stoptabulate + + \doif{\dummyparameter\c!option}\v!page { + \stopTEXpage + } + + \stop + +\stoptexdefinition + +\protect + +\continueifinputfile{s-typesetting-kerning.mkiv} + +\starttext + + % \showcharacterkerning + + \showcharacterkerningsteps[font=file:FuturaStd-Book.otf,option=page] + \showcharacterkerningsteps[font=file:FuturaStd-Medium.otf,option=page] + \showcharacterkerningsteps[font=file:FuturaStd-Bold.otf,option=page] + \showcharacterkerningsteps[font=file:FuturaStd-heavy.otf,option=page] + +\stoptext + +% {\hsize1mm efficient\discretionary{\kern1pt!\kern1pt}{\kern1pt!\kern1pt}{\kern1pt!\kern1pt}efficient\par} +% {\hsize1mm\definedfont[Regular]\setcharacterkerning[typesetting-kerning-demo]efficient\-efficient\par} + diff --git a/Master/texmf-dist/tex/context/base/s-youless.mkiv b/Master/texmf-dist/tex/context/base/s-youless.mkiv index 247eb5f648f..e15973b9c63 100644 --- a/Master/texmf-dist/tex/context/base/s-youless.mkiv +++ b/Master/texmf-dist/tex/context/base/s-youless.mkiv @@ -59,9 +59,10 @@ for y=year,year do - local year = years[y] - local scale = 20 - local mark = 3 + local year = years[y] + local scale = 20 + local mark = 3 + local maxwatt = specification.maxwatt or year.maxwatt for m=1,12 do local month = year.months[m] @@ -69,7 +70,7 @@ context.startMPpage { offset = "10pt" } context("linecap := butt; pickup pencircle scaled .5") - for i=0,(math.div(year.maxwatt,1000)+1)*1000,100 do + for i=0,(math.div(maxwatt,1000)+1)*1000,100 do context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale) end @@ -123,7 +124,7 @@ context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10) end - local max = (math.div(year.maxwatt,1000)+1) + local max = (math.div(maxwatt,1000)+1) for i=0,max*1000,1000 do context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale) diff --git a/Master/texmf-dist/tex/context/base/scrn-bar.mkvi b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi index 1dadc26f38f..8a2f9441c80 100644 --- a/Master/texmf-dist/tex/context/base/scrn-bar.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi @@ -67,7 +67,7 @@ \def\scrn_bar_direct[#tag][#settings]% somewhat messy {\iflocation \begingroup - \doifassignmentelse{#tag} + \doifelseassignment{#tag} {\let\currentinteractionbar\empty \setupcurrentinteractionbar[#tag]% \edef\currentinteractionbar{\interactionbarparameter\c!alternative}}% diff --git a/Master/texmf-dist/tex/context/base/scrn-but.lua b/Master/texmf-dist/tex/context/base/scrn-but.lua index 74f6e0cd9af..7d883c910b7 100644 --- a/Master/texmf-dist/tex/context/base/scrn-but.lua +++ b/Master/texmf-dist/tex/context/base/scrn-but.lua @@ -6,12 +6,10 @@ if not modules then modules = { } end modules ['scrn-but'] = { license = "see context related readme files" } -local commands = commands local context = context - local f_two_colon = string.formatters["%s:%s"] -function commands.registerbuttons(tag,register,language) +local function registerbuttons(tag,register,language) local data = sorters.definitions[language] local orders = daya and data.orders or sorters.definitions.default.orders local tag = tag == "" and { "" } or { tag } @@ -20,3 +18,9 @@ function commands.registerbuttons(tag,register,language) context.menubutton(tag,f_two_colon(register,order),order) end end + +interfaces.implement { + name = "registerbuttons", + actions = registerbuttons, + arguments = { "string", "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/scrn-but.mkvi b/Master/texmf-dist/tex/context/base/scrn-but.mkvi index f8b236c522a..3fdaf2c5d75 100644 --- a/Master/texmf-dist/tex/context/base/scrn-but.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-but.mkvi @@ -93,7 +93,7 @@ [\c!state=\v!start, \c!width=\v!fit, \c!height=\v!broad, - \c!offset=0.25em, + \c!offset=0.25\emwidth, \c!frame=\v!on, \c!background=, \c!backgroundcolor=, @@ -159,7 +159,7 @@ \attribute\referenceattribute\attributeunsetvalue \global\setfalse\c_scrn_button_skipped \chardef\locationboxpagestate\csname\??buttonlocation#currentparameter\c!samepage\endcsname % ?? bt: todo - \doifreferencefoundelse{#action}\scrn_button_make_yes\scrn_button_make_nop + \doifelsereferencefound{#action}\scrn_button_make_yes\scrn_button_make_nop #currentparameter% #inheritedframed% #letparameter% @@ -217,12 +217,12 @@ {\global\settrue\c_scrn_button_skipped} \def\scrn_button_make_normal#currentparameter#inheritedframed#letparameter#setparameter#text% - {\ctxcommand{injectcurrentreference()}% + {\clf_injectcurrentreference \hbox attr \referenceattribute \lastreferenceattribute {#inheritedframed{\ignorespaces#text\removeunwantedspaces}}} \def\scrn_button_make_contrast#currentparameter#inheritedframed#letparameter#setparameter#text% - {\ctxcommand{injectcurrentreference()}% + {\clf_injectcurrentreference \hbox attr \referenceattribute \lastreferenceattribute {#setparameter\c!foregroundcolor{#currentparameter\c!contrastcolor}% #inheritedframed{\ignorespaces#text\removeunwantedspaces}}} @@ -343,12 +343,12 @@ \def\scrn_menu_define[#tag][#category][#settings]% category reflects location, settings can be parent {\ifthirdargument - \doifassignmentelse{#settings}% + \doifelseassignment{#settings}% {\scrn_menu_define_original[#tag][#category][\c!category=#category,#settings]}% child definition {\scrn_menu_define_original[#tag][#settings][\c!category=#category]}% % child definition \scrn_menu_register{#tag}{#category}% \else\ifsecondargument - \doifassignmentelse{#category}% + \doifelseassignment{#category}% {\scrn_menu_define_original[#tag][#category]}% % root definition {\scrn_menu_define_original[#tag][#category][\c!category=#category]% % child definition \scrn_menu_register{#tag}{#category}}% @@ -368,7 +368,7 @@ %D Fill menus: -\normalexpanded{\long\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#tag]#content\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}% +\normalexpanded{\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#tag]#content\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}% {\def\currentinteractionmenu{#tag}% \expandafter\settrue\csname\??menustate\interactionmenuparameter\c!category\endcsname \setinteractionmenuparameter\c!menu{#content}} @@ -691,7 +691,7 @@ \def\scrn_button_make_position#currentparameter#inheritedframed#letparameter#setparameter#text#action% {\global\advance\c_scrn_menu_position\plusone - \doifreferencefoundelse{#action}% 0=not found, 1=same page, >1=elsewhere + \doifelsereferencefound{#action}% 0=not found, 1=same page, >1=elsewhere {\c_scrn_menu_page_mode\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}% {\c_scrn_menu_page_mode\plustwo}% \doglobal\appendetoks @@ -709,7 +709,8 @@ \unexpanded\def\scrn_menu_got_start[#action]#text\stopgot {\scrn_menu_action_start - \setupcurrentinteractionmenu[\c!frame=\v!off,\c!background=]% needs checking, was buttons + \letinteractionmenuparameter\c!frame\v!off + \letinteractionmenuparameter\c!background\empty \scrn_button_make \interactionmenuparameter \inheritedinteractionmenuframed @@ -967,7 +968,7 @@ \scrn_menu_menu_button_a {#menutag}{#settings}{#text}{#action}% \else - \doifassignmentelse{#menutag}\scrn_menu_menu_button_b\scrn_menu_menu_button_c + \doifelseassignment{#menutag}\scrn_menu_menu_button_b\scrn_menu_menu_button_c {#menutag}{#text}{#action}% \fi} @@ -1022,9 +1023,14 @@ \def\scrn_menu_register_menu_buttons[#menu][#register]% {\ifsecondargument - \ctxcommand{registerbuttons("menu","#register","\currentlanguage")} + \clf_registerbuttons{menu}{#register}{\currentlanguage}% \else - \ctxcommand{registerbuttons("","#menu","\currentlanguage")} + \clf_registerbuttons{}{#menu}{\currentlanguage}% \fi} +% or less readable: +% +% \def\scrn_menu_register_menu_buttons[#menu][#register]% +% {\clf_registerbuttons\ifsecondargument{menu}{#register}\else{}{#menu}\fi{\currentlanguage}} + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.lua b/Master/texmf-dist/tex/context/base/scrn-fld.lua index 69480b88794..1563b9005d7 100644 --- a/Master/texmf-dist/tex/context/base/scrn-fld.lua +++ b/Master/texmf-dist/tex/context/base/scrn-fld.lua @@ -8,6 +8,10 @@ if not modules then modules = { } end modules ['scrn-fld'] = { -- we should move some code from lpdf-fld to here +local context = context +local ctx_doifelse = commands.doifelse +local implement = interfaces.implement + local variables = interfaces.variables local v_yes = variables.yes @@ -40,48 +44,141 @@ fields.defineset = defineset fields.clone = clone fields.insert = insert -commands.definefield = define -commands.definefieldset = defineset -commands.clonefield = clone +-- codeinjections are not yet defined + +implement { + name = "definefield", + actions = define, + arguments = { + { + { "name" }, + { "alternative" }, + { "type" }, + { "category" }, + { "values" }, + { "default" }, + } + } +} -function commands.insertfield(name,specification) - texsetbox("b_scrn_field_body",insert(name,specification)) -end +implement { + name = "definefieldset", + actions = defineset, + arguments = { "string", "string" } +} + +implement { + name = "clonefield", + actions = clone, + arguments = { + { + { "children" }, + { "alternative" }, + { "parent" }, + { "category" }, + { "values" }, + { "default" }, + } + } +} + +implement { + name = "insertfield", + actions = function(name,specification) + texsetbox("b_scrn_field_body",insert(name,specification)) + end, + arguments = { + "string", + { + { "title" }, + { "width", "dimen" }, + { "height", "dimen" }, + { "depth", "dimen" }, + { "align" }, + { "length" }, + { "fontstyle" }, + { "fontalternative" }, + { "fontsize" }, + { "fontsymbol" }, + { "colorvalue", "integer" }, + { "color" }, + { "backgroundcolorvalue", "integer" }, + { "backgroundcolor" }, + { "framecolorvalue", "integer" }, + { "framecolor" }, + { "layer" }, + { "option" }, + { "align" }, + { "clickin" }, + { "clickout" }, + { "regionin" }, + { "regionout" }, + { "afterkey" }, + { "format" }, + { "validate" }, + { "calculate" }, + { "focusin" }, + { "focusout" }, + { "openpage" }, + { "closepage" }, + } + } +} -- (for the monent) only tex interface -function commands.getfieldcategory(name) - local g = codeinjections.getfieldcategory(name) - if g then - context(g) +implement { + name = "getfieldcategory", + arguments = "string", + actions = function(name) + local g = codeinjections.getfieldcategory(name) + if g then + context(g) + end end -end +} -function commands.getdefaultfieldvalue(name) - local d = codeinjections.getdefaultfieldvalue(name) - if d then - context(d) +implement { + name = "getdefaultfieldvalue", + arguments = "string", + actions = function(name) + local d = codeinjections.getdefaultfieldvalue(name) + if d then + context(d) + end end -end +} -function commands.exportformdata(export) - if export == v_yes then - codeinjections.exportformdata() +implement { + name = "exportformdata", + arguments = "string", + actions = function(export) + if export == v_yes then + codeinjections.exportformdata() + end end -end - -function commands.setformsmethod(method) - codeinjections.setformsmethod(method) -end +} -function commands.doiffieldcategoryelse(name) - commands.doifelse(codeinjections.validfieldcategory(name)) -end +implement { + name = "setformsmethod", + arguments = "string", + actions = function(method) + codeinjections.setformsmethod(method) + end +} -function commands.doiffieldsetelse(tag) - commands.doifelse(codeinjections.validfieldset(name)) -end +implement { + name = "doifelsefieldcategory", + arguments = "string", + actions = function(name) + ctx_doifelse(codeinjections.validfieldcategory(name)) + end +} -function commands.doiffieldelse(name) - commands.doifelse(codeinjections.validfield(name)) -end +implement { + name = "doiffieldsetelse", + arguments = "string", + actions = function(name) + ctx_doifelse(codeinjections.validfieldset(name)) + end +} diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.mkvi b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi index 049ac92c353..4b4c9d0eeca 100644 --- a/Master/texmf-dist/tex/context/base/scrn-fld.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi @@ -105,7 +105,7 @@ \installdirectcommandhandler \??forms {forms} \appendtoks - \ctxcommand{setformsmethod("\formsparameter\c!method")}% + \clf_setformsmethod{\formsparameter\c!method}% \to \everysetupforms \setupforms @@ -113,7 +113,7 @@ \appendtoks \iflocation - \ctxcommand{exportformdata("\formsparameter\c!export")}% + \clf_exportformdata{\formsparameter\c!export}% \fi \to \everystoptext @@ -127,7 +127,7 @@ {\processcommalist[#set]\scrn_symbols_preset_indeed}% \def\scrn_symbols_preset_indeed#tag% - {\doifobjectfoundelse{SYM}{#tag} + {\doifelseobjectfound{SYM}{#tag} {} {\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}% % todo: set this as immediate xform \page_otr_add_special_content{\hskip-\maxdimen\getobject{SYM}{#tag}}}} % and then force it into the file @@ -177,23 +177,23 @@ \appendtoks % we cannot use parent .. maybe s!parent has to change \ifx\currentfieldbodyparent\empty \scrn_field_check_category - \ctxcommand{definefield{ - name = "\currentfieldbody", - alternative = "normal", - type = "\fieldbodyparameter\c!type", - category = "\fieldbodyparameter\c!category", - values = \!!bs\fieldbodyparameter\c!values\!!es, - default = \!!bs\fieldbodyparameter\c!default\!!es - }}% + \clf_definefield + name {\currentfieldbody}% + alternative {normal}% + type {\fieldbodyparameter\c!type}% + category {\fieldbodyparameter\c!category}% + values {\fieldbodyparameter\c!values}% + default {\fieldbodyparameter\c!default}% + \relax \else - \ctxcommand{clonefield{ - children = "\currentfieldbody", - alternative = "clone", - parent = "\currentfieldbodyparent", - category = "\fieldbodyparameter\c!category", - values = \!!bs\fieldbodyparameter\c!values\!!es, - default = \!!bs\fieldbodyparameter\c!default\!!es - }}% + \clf_clonefield + children {\currentfieldbody}% + alternative {clone}% + parent {\currentfieldbodyparent}% + category {\fieldbodyparameter\c!category}% + values {\fieldbodyparameter\c!values}% + default {\fieldbodyparameter\c!default}% + \relax \fi \to \everydefinefieldbody @@ -224,43 +224,46 @@ % == \edef\currentfieldbackgroundcolorvalue{\thecolorattribute\currentfieldbackgroundcolor}% \fi \usefieldbodystyleandcolor\c!style\c!color - \ctxcommand{insertfield("\currentfieldbody", { - title = "\currentfieldbody", - width = \number\dimexpr\fieldbodyparameter\c!width \relax, - height = \number\dimexpr\fieldbodyparameter\c!height\relax, - depth = \number\dimexpr\fieldbodyparameter\c!depth \relax, - align = "\fieldbodyparameter\c!align", - length = "\fieldbodyparameter\c!n", - fontstyle = "\fontstyle", - fontalternative = "\fontalternative", - fontsize = "\fontbody", - fontsymbol = "\fieldbodyparameter\c!symbol", - color = "\fieldbodyparameter\c!color", - colorvalue = \number\attribute\colorattribute, - \ifx\currentfieldbackgroundcolor\empty \else - backgroundcolor = "\currentfieldbackgroundcolor", - backgroundcolorvalue = "\currentfieldbackgroundcolorvalue", - \fi - \ifx\currentfieldframecolor\empty \else - framecolor = "\currentfieldframecolor", - framecolorvalue = "\currentfieldframecolorvalue", - \fi - layer = "\fieldbodyparameter\c!fieldlayer", - option = "\fieldbodyparameter\c!option", - align = "\fieldbodyparameter\c!align", - clickin = "\fieldbodyparameter\c!clickin", - clickout = "\fieldbodyparameter\c!clickout", - regionin = "\fieldbodyparameter\c!regionin", - regionout = "\fieldbodyparameter\c!regionout", - afterkey = "\fieldbodyparameter\c!afterkey", - format = "\fieldbodyparameter\c!format", - validate = "\fieldbodyparameter\c!validate", - calculate = "\fieldbodyparameter\c!calculate", - focusin = "\fieldbodyparameter\c!focusin", - focusout = "\fieldbodyparameter\c!focusout", - openpage = "\fieldbodyparameter\c!openpage", - closepage = "\fieldbodyparameter\c!closepage", - })}} + \clf_insertfield + {\currentfieldbody}% + {% + title {\currentfieldbody} + width \dimexpr\fieldbodyparameter\c!width \relax + height \dimexpr\fieldbodyparameter\c!height\relax + depth \dimexpr\fieldbodyparameter\c!depth \relax + align {\fieldbodyparameter\c!align}% + length {\fieldbodyparameter\c!n}% + fontstyle {\fontstyle}% + fontalternative {\fontalternative}% + fontsize {\fontbody}% + fontsymbol {\fieldbodyparameter\c!symbol}% + color {\fieldbodyparameter\c!color}% + colorvalue \attribute\colorattribute + \ifx\currentfieldbackgroundcolor\empty \else + backgroundcolor {\currentfieldbackgroundcolor}% + backgroundcolorvalue \numexpr\currentfieldbackgroundcolorvalue\relax + \fi + \ifx\currentfieldframecolor\empty \else + framecolor {\currentfieldframecolor}% + framecolorvalue \numexpr\currentfieldframecolorvalue\relax + \fi + layer {\fieldbodyparameter\c!fieldlayer}% + option {\fieldbodyparameter\c!option}% + align {\fieldbodyparameter\c!align}% + clickin {\fieldbodyparameter\c!clickin}% + clickout {\fieldbodyparameter\c!clickout}% + regionin {\fieldbodyparameter\c!regionin}% + regionout {\fieldbodyparameter\c!regionout}% + afterkey {\fieldbodyparameter\c!afterkey}% + format {\fieldbodyparameter\c!format}% + validate {\fieldbodyparameter\c!validate}% + calculate {\fieldbodyparameter\c!calculate}% + focusin {\fieldbodyparameter\c!focusin}% + focusout {\fieldbodyparameter\c!focusout}% + openpage {\fieldbodyparameter\c!openpage}% + closepage {\fieldbodyparameter\c!closepage}% + }% + \relax} %D The sets are used in grouped calculations. %D @@ -270,16 +273,20 @@ {\dodoubleempty\scrn_field_define_set} \def\scrn_field_define_set[#tag][#list]% - {\ctxcommand{definefieldset("#tag","#list")}} + {\clf_definefieldset{#tag}{#list}} \let\dodefinefieldset\definefieldbodyset % compatibility %D A few testing macros: -\def\doiffieldbodyelse #tag{\ctxcommand{doiffieldelse("#tag")}} -\def\doiffieldcategoryelse#tag{\ctxcommand{doiffieldcategoryelse("#tag")}} +\def\doifelsefieldbody #tag{\clf_doifelsefield{#tag}} +\def\doifelsefieldcategory#tag{\clf_doifelsefieldcategory{#tag}} + +\let\doiffieldbodyelse \doifelsefieldbody +\let\doiffieldcategoryelse\doifelsefieldcategory -\let\doiffieldelse\doiffieldbodyelse % compatibility +\let\doiffieldelse \doifelsefieldbody % compatibility / will be dropped +\let\doifelsefield \doifelsefieldbody % compatibility / will be dropped %D We still support the traditional method of defining fields: %D @@ -365,7 +372,7 @@ \def\scrn_field_fit[#tag][#settings]% {\iflocation \begingroup - \edef\currentdefaultfieldvalue{\ctxcommand{getdefaultfieldvalue("#tag")}}% + \edef\currentdefaultfieldvalue{\clf_getdefaultfieldvalue{#tag}}% \setbox\b_scrn_field_fit_symbol\hbox{\symbol[\currentdefaultfieldvalue]}% \fitfieldframed {\fieldbody[#tag] @@ -494,7 +501,7 @@ \scrn_field_load_scripts \edef\currentfieldbody {#tag}% \edef\currentfieldlabel {#label}% - \edef\currentfieldcategory{\ctxcommand{getfieldcategory("#tag")}}% + \edef\currentfieldcategory{\clf_getfieldcategory{#tag}}% \ifx\currentfieldlabel\empty \let\currentfieldlabel\currentfieldbody \fi @@ -679,7 +686,7 @@ \edef\currenttooltipname{tooltip:\number\c_scrn_tooltip_n}% \setbox\b_scrn_tooltip_anchor\hbox {\strut#anchortext}% - \doifassignmentelse{#settings} + \doifelseassignment{#settings} {\setupcurrenttooltip[#settings]}% {\setupcurrenttooltip[\c!location=#settings]}% \setbox\b_scrn_tooltip_text\hbox @@ -740,6 +747,8 @@ %D \goto{walk field}[Walk{mine}] %D \stoptyping +% todo: expand #symbols + \unexpanded\def\definefieldstack {\dotripleargument\scrn_fieldstack_define} @@ -868,7 +877,7 @@ \setvalue{pushbutton:#tag}{\scrn_pushbutton_handle{#tag}{#settings}}} \def\scrn_pushbutton_define_variant#tag#variant#content% - {\doifsymboldefinedelse{pushsymbol:#tag:#variant} + {\doifelsesymboldefined{pushsymbol:#tag:#variant} \donothing {\definesymbol[pushsymbol:#tag:#variant][{#content}]}} @@ -975,7 +984,7 @@ \setupcurrentinteractionmenu[#settings]% \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m \else - \doifassignmentelse{#tag} + \doifelseassignment{#tag} {\let\currentbutton\empty \setupcurrentbutton[#tag]% \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b}% diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.lua b/Master/texmf-dist/tex/context/base/scrn-hlp.lua index d344ce2802c..99c0565a8b7 100644 --- a/Master/texmf-dist/tex/context/base/scrn-hlp.lua +++ b/Master/texmf-dist/tex/context/base/scrn-hlp.lua @@ -6,13 +6,15 @@ if not modules then modules = { } end modules ['scrn-hlp'] = { license = "see context related readme files" } -local format = string.format +local tonumber = tonumber local help = { } interactions.help = help local context = context -local commands = commands +local implement = interfaces.implement + +local formatters = string.formatters local a_help = attributes.private("help") @@ -48,21 +50,26 @@ local helpscript = [[ local template = "javascript(Hide_All_Help{help:}),action(show{help:%s})" -function help.register(number,name,box) - if helpscript then - interactions.javascripts.setpreamble("HelpTexts",helpscript) - helpscript = false - end - local b = copy_nodelist(texgetbox(box)) - register_list(b) - data[number] = b - if name and name ~= "" then - references[name] = number - structures.references.define("",name,format(template,number)) +local function register(specification) + local number = specification.number + local name = specification.name + local box = specification.box + if number and name and box then + if helpscript then + interactions.javascripts.setpreamble("HelpTexts",helpscript) + helpscript = false + end + local b = copy_nodelist(texgetbox(box)) + register_list(b) + data[number] = b + if name and name ~= "" then + references[name] = number + structures.references.define("",name,formatters[template](number)) + end end end -local function collect(head,used) +local function collectused(head,used) while head do local id = head.id if id == hlist_code then @@ -74,51 +81,77 @@ local function collect(head,used) used[#used+1] = a end else - used = collect(head.list,used) + used = collectused(head.list,used) end elseif id == vlist_code then - used = collect(head.list,used) + used = collectused(head.list,used) end head = head.next end return used end -function help.collect(box) +local function collect(box) if next(data) then - return collect(texgetbox(box).list) + return collectused(texgetbox(box).list) end end -commands.registerhelp = help.register - -function commands.collecthelp(box) - local used = help.collect(box) - if used then - local done = { } - context.startoverlay() - for i=1,#used do - local d = data[used[i]] - if d and not done[d] then - local box = hpack_nodelist(copy_nodelist(d)) - context(false,box) - done[d] = true - else - -- error +local function reference(name) + return references[name] or tonumber(name) or 0 +end + +help.register = register +help.collect = collect +help.reference = reference + +implement { + name = "registerhelp", + actions = register, + arguments = { + { + { "number", "integer" }, + { "name" }, + { "box" , "integer" } + } + } +} + +implement { + name = "collecthelp", + arguments = "integer", + actions = function(box) + local used = collect(box) + if used then + local done = { } + context.startoverlay() + for i=1,#used do + local d = data[used[i]] + if d and not done[d] then + local box = hpack_nodelist(copy_nodelist(d)) + context(false,box) + done[d] = true + else + -- error + end end + context.stopoverlay() end - context.stopoverlay() end -end - -function help.reference(name) - return references[name] or tonumber(name) or 0 -end +} -function commands.helpreference(name) - context(references[name] or tonumber(name) or 0) -end +implement { + name = "helpreference", + arguments = "string", + actions = function(name) + context(reference(name)) + end +} -function commands.helpaction(name) - context(template,references[name] or tonumber(name) or 0) -end +implement { + name = "helpaction", + arguments = "string", + actions = function(name) + context(template,reference(name)) + end +} diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi index f5a78fb0891..eca79c90a5b 100644 --- a/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi @@ -130,25 +130,31 @@ \c!values=\currenthelpname]% \setbox\b_scrn_help_box\hbox {\fieldbody[\currenthelpname]}% - \ctxcommand{registerhelp(\number\c_scrn_help_n,"\currenthelpreference",\number\b_scrn_help_box)}} + \clf_registerhelp + number \c_scrn_help_n + name {\currenthelpreference}% + box \b_scrn_help_box + \relax} -\def\doifelsehelp +\unexpanded\def\doifelsehelp {\ifcase\c_scrn_help_n \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} -\def\placehelp % was \helpdata +\let\doifhelpelse\doifelsehelp + +\unexpanded\def\placehelp % was \helpdata {\ifinpagebody\ifcase\c_scrn_help_n\else - \ctxcommand{collecthelp(255)}% rather hard coded ... bad + \clf_collecthelp\normalpagebox \fi\fi} \def\helpreference#category% - {\ctxcommand{helpreference("#category")}} + {\clf_helpreference{#category}} \def\helpaction#category% - {\ctxcommand{helpaction("#category")}} + {\clf_helpaction{#category}} \unexpanded\def\helpsignal#category% {\hbox attr \helpattribute \helpreference{#category}{}} diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.lua b/Master/texmf-dist/tex/context/base/scrn-ini.lua index 4831408f983..ce9f9f71b06 100644 --- a/Master/texmf-dist/tex/context/base/scrn-ini.lua +++ b/Master/texmf-dist/tex/context/base/scrn-ini.lua @@ -16,7 +16,7 @@ local codeinjections = backends.codeinjections local identitydata = { } -local function setupidentity(specification) +function general.setupidentity(specification) for k, v in next, specification do identitydata[k] = v end @@ -27,6 +27,17 @@ function general.getidentity() return identitydata end -general.setupidentity = setupidentity - -commands.setupidentity = setupidentity +interfaces.implement { + name = "setupidentity", + actions = general.setupidentity, + arguments = { + { + { "title" }, + { "subtitle" }, + { "author" }, + { "creator" }, + { "date" }, + { "keywords" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi index f5b29462436..2ed822c6e96 100644 --- a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi @@ -51,6 +51,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doiflocationelse\doifelselocation + \setupinteraction [\c!state=\v!stop] @@ -176,14 +178,14 @@ %D Identity \def\scrn_identity_synchronize - {\ctxcommand{setupidentity{ - title = \!!bs\interactionparameter\c!title\!!es, - subtitle = \!!bs\interactionparameter\c!subtitle\!!es, - author = \!!bs\interactionparameter\c!author\!!es, - creator = \!!bs ConTeXt - \contextversion\!!es, - date = \!!bs\interactionparameter\c!date\!!es, - keywords = \!!bs\interactionparameter\c!keyword\!!es, - }}} + {\clf_setupidentity + title {\interactionparameter\c!title}% + subtitle {\interactionparameter\c!subtitle}% + author {\interactionparameter\c!author}% + creator { ConTeXt - \contextversion}% + date {\interactionparameter\c!date}% + keywords {\interactionparameter\c!keyword}% + \relax} \appendtoks \scrn_identity_synchronize diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.lua b/Master/texmf-dist/tex/context/base/scrn-pag.lua index 7003d028508..4d7b388ee0c 100644 --- a/Master/texmf-dist/tex/context/base/scrn-pag.lua +++ b/Master/texmf-dist/tex/context/base/scrn-pag.lua @@ -10,18 +10,43 @@ interactions = interactions or { } interactions.pages = interactions.pages or { } local pages = interactions.pages +local implement = interfaces.implement + local codeinjections = backends.codeinjections -local function setupcanvas(specification) +function pages.setupcanvas(specification) codeinjections.setupcanvas(specification) end -local function setpagetransition(specification) +function pages.setpagetransition(specification) codeinjections.setpagetransition(specification) end -pages.setupcanvas = setupcanvas -pages.setpagetransition = setpagetransition +implement { + name = "setupcanvas", + actions = pages.setupcanvas, + arguments = { + { + { "mode" }, + { "singlesided", "boolean" }, + { "doublesided", "boolean" }, + { "leftoffset", "dimen" }, + { "topoffset", "dimen" }, + { "width", "dimen" }, + { "height", "dimen" }, + { "paperwidth", "dimen" }, + { "paperheight", "dimen" }, + } + } +} -commands.setupcanvas = setupcanvas -commands.setpagetransition = setpagetransition +implement { + name = "setpagetransition", + actions = pages.setpagetransition, + arguments = { + { + { "n" }, + { "delay", "integer" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.mkvi b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi index 5bbdadda885..3dfcd65c5ff 100644 --- a/Master/texmf-dist/tex/context/base/scrn-pag.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi @@ -124,30 +124,49 @@ % % \starttext \input ward \stoptext -\def\scrn_canvas_synchronize_simple - {\ctxcommand{setupcanvas{ - paperwidth = \number\printpaperwidth, - paperheight = \number\printpaperheight - }}} +\let\scrn_canvas_synchronize_simple \relax +\let\scrn_canvas_synchronize_complex\relax -\def\scrn_canvas_synchronize_complex +\appendtoks + \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple_indeed + \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex_indeed +\to \everysetuplayout + +\def\scrn_canvas_synchronize_simple_indeed + {\clf_setupcanvas + paperwidth \printpaperwidth + paperheight \printpaperheight + \relax + %\global\let\scrn_canvas_synchronize_simple \relax + \global\let\scrn_canvas_synchronize_complex\relax} + +\def\scrn_canvas_synchronize_complex_indeed {\scrn_canvas_calculate % otherwise we need to hook it into setuppage etc - \ctxcommand{setupcanvas{ - mode = "\interactionscreenparameter\c!option", - singlesided = \ifsinglesided true\else false\fi, - doublesided = \ifdoublesided true\else false\fi, - leftoffset = \number\canvasbackoffset, - topoffset = \number\canvastopoffset, - width = \number\canvaswidth, - height = \number\canvasheight, - paperwidth = \number\canvasmaxwidth, - paperheight = \number\canvasmaxheight - }}} + \clf_setupcanvas + mode {\interactionscreenparameter\c!option}% + singlesided \ifsinglesided true\else false\fi\space + doublesided \ifdoublesided true\else false\fi\space + leftoffset \canvasbackoffset + topoffset \canvastopoffset + width \canvaswidth + height \canvasheight + paperwidth \canvasmaxwidth + paperheight \canvasmaxheight + \relax + %\global\let\scrn_canvas_synchronize_simple \relax + \global\let\scrn_canvas_synchronize_complex\relax} \appendtoks - \doifcommonelse{\interactionscreenparameter\c!option}{\v!max,\v!fit}% - {\global\settrue \c_scrn_canvas_tight_page}% - {\global\setfalse\c_scrn_canvas_tight_page}% + \begingroup + \edef\p_option{\interactionscreenparameter\c!option}% + \ifx\p_option\v!max + \global\settrue \c_scrn_canvas_tight_page + \else\ifx\p_option\v!fit + \global\settrue \c_scrn_canvas_tight_page + \else + \global\setfalse\c_scrn_canvas_tight_page + \fi\fi + \endgroup \to \everysetupinteractionscreen \setupinteractionscreen @@ -159,6 +178,11 @@ \c!topspace=\topspace, \c!option=\v!auto] +\appendtoks + \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple + \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex +\to \everysetupinteractionscreen + %D Conditional page breaks: \unexpanded\def\screen @@ -177,7 +201,10 @@ {\dosingleempty\scrn_transitions_setup} \def\scrn_transitions_setup[#list]% - {\edef\scrn_transitions_list{#list}} + {\edef\scrn_transitions_list{#list}% + \ifx\scrn_transitions_list\v!reset + \let\scrn_transitions_list\empty + \fi} \def\scrn_transitions_set {\iflocation \ifx\scrn_transitions_list\empty \else @@ -187,10 +214,10 @@ \def\scrn_transitions_set_indeed {\begingroup \edef\currentinteractionscreendelay{\interactionscreenparameter\c!delay}% - \ctxcommand{setpagetransition{ - n = "\scrn_transitions_list", - delay = "\ifx\currentinteractionscreendelay\v!none 0\else\currentinteractionscreendelay\fi" - }}% + \clf_setpagetransition + n {\scrn_transitions_list}% + delay \ifx\currentinteractionscreendelay\v!none \zerocount\else\currentinteractionscreendelay\fi + \relax \endgroup} \prependtoks diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.lua b/Master/texmf-dist/tex/context/base/scrn-ref.lua index df71b6a97fe..c1fc9487138 100644 --- a/Master/texmf-dist/tex/context/base/scrn-ref.lua +++ b/Master/texmf-dist/tex/context/base/scrn-ref.lua @@ -15,6 +15,8 @@ local codeinjections = backends.codeinjections local expandcurrent = structures.references.expandcurrent local identify = structures.references.identify +local implement = interfaces.implement + local function check(what) if what and what ~= "" then local set, bug = identify("",what) @@ -54,12 +56,12 @@ local function setclosepageaction(close) end end -references.setopendocument = setopendocumentaction -references.setclosedocument = setclosedocumentaction -references.setopenpage = setopenpageaction -references.setclosepage = setclosepageaction +references.setopendocument = setopendocumentaction +references.setclosedocument = setclosedocumentaction +references.setopenpage = setopenpageaction +references.setclosepage = setclosepageaction -commands.setopendocumentaction = setopendocumentaction -commands.setclosedocumentaction = setclosedocumentaction -commands.setopenpageaction = setopenpageaction -commands.setclosepageaction = setclosepageaction +implement { name = "setopendocumentaction", arguments = "string", actions = setopendocumentaction } +implement { name = "setclosedocumentaction", arguments = "string", actions = setclosedocumentaction } +implement { name = "setopenpageaction", arguments = "string", actions = setopenpageaction } +implement { name = "setclosepageaction", arguments = "string", actions = setclosepageaction } diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.mkvi b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi index a06ba1ad8fc..2b15b46778e 100644 --- a/Master/texmf-dist/tex/context/base/scrn-ref.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi @@ -25,7 +25,7 @@ \to \everysetupinteraction \def\scrn_reference_enable_page_destinations % no reset - {\ctxlua{structures.references.setinnermethod("\interactionparameter\c!page")}} + {\clf_setinnerreferencemethod{\interactionparameter\c!page}} \setupinteraction % start fit page and reset form [\c!page=\v!no, @@ -34,7 +34,7 @@ \c!focus=\v!fit, \c!calculate=, % rendering: - \c!width=1em, + \c!width=\emwidth, \c!height=\zeropoint, \c!depth=\zeropoint, \c!symbolset=] @@ -46,10 +46,10 @@ \edef\currentinteractionopenaction {\interactionparameter\c!openaction }% \edef\currentinteractioncloseaction{\interactionparameter\c!closeaction}% \ifx\currentinteractionopenaction\empty \else - \ctxcommand{setopendocumentaction("\currentinteractionopenaction")}% + \clf_setopendocumentaction{\currentinteractionopenaction}% \fi \ifx\currentinteractioncloseaction\empty \else - \ctxcommand{setclosedocumentaction("\currentinteractioncloseaction")}% + \clf_setclosedocumentaction{\currentinteractioncloseaction}% \fi \glet\scrn_reference_set_text_actions\relax \fi} @@ -59,10 +59,10 @@ \edef\currentinteractionopenpageaction {\interactionparameter\c!openpageaction }% \edef\currentinteractionclosepageaction{\interactionparameter\c!closepageaction}% \ifx\currentinteractionopenpageaction\empty \else - \ctxcommand{setopenpageaction("\currentinteractionopenpageaction")}% + \clf_setopenpageaction{\currentinteractionopenpageaction}% \fi \ifx\currentinteractionclosepageaction\empty \else - \ctxcommand{setclosepageaction("\currentinteractionclosepageaction")}% + \clf_setclosepageaction{\currentinteractionclosepageaction}% \fi \fi} @@ -73,7 +73,7 @@ \def\scrn_reference_enable_references {\ifproductionrun - \ctxlua{structures.references.enableinteraction()}% + \clf_enableinteraction % only once anyway \glet\scrn_reference_enable_references\relax \fi} diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.lua b/Master/texmf-dist/tex/context/base/scrn-wid.lua index 5b319b07ea7..72c9bc733aa 100644 --- a/Master/texmf-dist/tex/context/base/scrn-wid.lua +++ b/Master/texmf-dist/tex/context/base/scrn-wid.lua @@ -10,6 +10,7 @@ interactions = interactions or { } local interactions = interactions local context = context +local implement = interfaces.implement local allocate = utilities.storage.allocate @@ -42,9 +43,13 @@ local report_attachments = logs.reporter("widgets","attachments") -- Symbols -function commands.presetsymbollist(list) - codeinjections.presetsymbollist(list) -end +implement { + name = "presetsymbollist", + arguments = "string", + actions = function(list) + codeinjections.presetsymbollist(list) + end +} -- Attachments -- @@ -108,11 +113,51 @@ function attachments.insert(specification) return nodeinjections.attachfile(specification) end -commands.registerattachment = attachments.register +implement { + name = "registerattachment", + actions = attachments.register, + arguments = { + { + { "tag" }, + { "registered" }, + { "title" }, + { "subtitle" }, + { "author" }, + { "file" }, + { "name" }, + { "buffer" }, + } + } +} -function commands.insertattachment(specification) - texsetbox("b_scrn_attachment_link",(attachments.insert(specification))) -end +implement { + name = "insertattachment", + actions = function(specification) + texsetbox("b_scrn_attachment_link",(attachments.insert(specification))) + end, + arguments = { + { + { "tag" }, + { "registered" }, + { "method" }, + { "width", "dimen" }, + { "height", "dimen" }, + { "depth", "dimen" }, + { "colormodel", "integer" }, + { "colorvalue", "integer" }, + { "color" }, + { "transparencyvalue", "integer" }, + { "symbol" }, + { "layer" }, + { "title" }, + { "subtitle" }, + { "author" }, + { "file" }, + { "name" }, + { "buffer" }, + } + } +} -- Comment @@ -124,9 +169,32 @@ function comments.insert(specification) return nodeinjections.comment(specification) end -function commands.insertcomment(specification) - texsetbox("b_scrn_comment_link",(comments.insert(specification))) -end +implement { + name = "insertcomment", + actions = function(specification) + texsetbox("b_scrn_comment_link",(comments.insert(specification))) + end, + arguments = { + { + { "tag" }, + { "title" }, + { "subtitle" }, + { "author" }, + { "width", "dimen" }, + { "height", "dimen" }, + { "depth", "dimen" }, + { "nx" }, + { "ny" }, + { "colormodel", "integer" }, + { "colorvalue", "integer" }, + { "transparencyvalue", "integer" }, + { "option" }, + { "symbol" }, + { "buffer" }, + { "layer" }, + } + } +} -- Soundclips @@ -153,8 +221,27 @@ function soundclips.insert(tag) end end -commands.registersoundclip = soundclips.register -commands.insertsoundclip = soundclips.insert +implement { + name = registersoundclip, + actions = soundclips.register, + arguments = { + { + { "tag" }, + { "file" } + } + } +} + +implement { + name = insertsoundclip, + actions = soundclips.insert, + arguments = { + { + { "tag" }, + { "repeat" } + } + } +} -- Renderings @@ -175,48 +262,84 @@ function renderings.rendering(label) end end -local function var(label,key) +function renderings.var(label,key) local rn = renderings[label] return rn and rn[key] or "" end -renderings.var = var - -function commands.renderingvar(label,key) - context(var(label,key)) -end +implement { + name = "renderingvar", + actions = { renderings.var, context }, + arguments = { "string", "string" } +} -commands.registerrendering = renderings.register +implement { + name = "registerrendering", + actions = renderings.register, + arguments = { + { + { "type" }, + { "label" }, + { "mime" }, + { "filename" }, + { "option" }, + } + } +} -- Rendering: -function commands.insertrenderingwindow(specification) - codeinjections.insertrenderingwindow(specification) -end +implement { + name = "insertrenderingwindow", + actions = function(specification) + codeinjections.insertrenderingwindow(specification) + end, + arguments = { + { + { "label" }, + { "width", "dimen" }, + { "height", "dimen" }, + { "option" }, + { "page", "integer" }, + } + } +} -- Linkedlists (only a context interface) -function commands.definelinkedlist(tag) - -- no need -end +implement { + name = "definelinkedlist", + arguments = "string", + actions = function(tag) + -- no need + end +} -function commands.enhancelinkedlist(tag,n) - local ll = jobpasses.gettobesaved(tag) - if ll then - ll[n] = texgetcount("realpageno") - end -end +implement { + name = "enhancelinkedlist", + arguments = { "string", "integer" }, + actions = function(tag,n) + local ll = jobpasses.gettobesaved(tag) + if ll then + ll[n] = texgetcount("realpageno") + end + end +} -function commands.addlinklistelement(tag) - local tobesaved = jobpasses.gettobesaved(tag) - local collected = jobpasses.getcollected(tag) or { } - local currentlink = #tobesaved + 1 - local noflinks = #collected - tobesaved[currentlink] = 0 - local f = collected[1] or 0 - local l = collected[noflinks] or 0 - local p = collected[currentlink-1] or f - local n = collected[currentlink+1] or l - context.setlinkedlistproperties(currentlink,noflinks,f,p,n,l) - -- context.ctxlatelua(function() commands.enhancelinkedlist(tag,currentlink) end) -end +implement { + name = "addlinklistelement", + arguments = "string", + actions = function(tag) + local tobesaved = jobpasses.gettobesaved(tag) + local collected = jobpasses.getcollected(tag) or { } + local currentlink = #tobesaved + 1 + local noflinks = #collected + tobesaved[currentlink] = 0 + local f = collected[1] or 0 + local l = collected[noflinks] or 0 + local p = collected[currentlink-1] or f + local n = collected[currentlink+1] or l + context.setlinkedlistproperties(currentlink,noflinks,f,p,n,l) + -- context.ctxlatelua(function() commands.enhancelinkedlist(tag,currentlink) end) + end +} diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.mkvi b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi index 8dcc7a86a23..57a4be27639 100644 --- a/Master/texmf-dist/tex/context/base/scrn-wid.mkvi +++ b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi @@ -100,16 +100,16 @@ \begingroup \def\currentattachment{_}% \setupcurrentattachment[#settings,\s!parent=\??attachment]% - \ctxcommand{registerattachment{ - tag = "#tag", - registered = "#tag", - title = "\attachmentparameter\c!title", - subtitle = "\attachmentparameter\c!subtitle", - author = "\attachmentparameter\c!author", - file = "\attachmentparameter\c!file", - name = "\attachmentparameter\c!name", - buffer = "\attachmentparameter\c!buffer", - }}% + \clf_registerattachment + tag {#tag}% + registered {#tag}% + title {\attachmentparameter\c!title}% + subtitle {\attachmentparameter\c!subtitle}% + author {\attachmentparameter\c!author}% + file {\attachmentparameter\c!file}% + name {\attachmentparameter\c!name}% + buffer {\attachmentparameter\c!buffer}% + \relax \endgroup \else % todo @@ -136,7 +136,7 @@ {\bgroup \doifelsenothing{#registered} {\scrn_attachment_inject[\v!auto][]} - {\doifassignmentelse{#registered} + {\doifelseassignment{#registered} {\scrn_attachment_inject[\v!auto][#registered]} {\scrn_attachment_inject[#registered][#settings]}}% \egroup} @@ -162,7 +162,7 @@ {\bgroup \doifelsenothing{#registered} {\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment]\egroup}}% - {\doifassignmentelse{#registered} + {\doifelseassignment{#registered} {\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment,#registered]\egroup}}% {\def\scrn_attachment_stop{\scrn_attachment_inject[#registered][\c!buffer=\v!attachment,#settings]\egroup}}}% \grabbufferdatadirect\v!attachment{\e!start\currentattachment}{\e!stop\currentattachment}} @@ -181,37 +181,37 @@ \edef\currentattachmentheight{\attachmentparameter\c!height}% \edef\currentattachmentdepth {\attachmentparameter\c!depth }% \ifx\currentattachmentsymbol\empty - \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {.5em}\fi - \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{.5em}\fi + \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {.5\emwidth}\fi + \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{.5\emwidth}\fi \ifx\currentattachmentdepth \v!fit\let \currentattachmentdepth \zeropoint\fi \else - \ctxcommand{presetsymbollist("\attachmentparameter\c!symbol")}% + \clf_presetsymbollist{\attachmentparameter\c!symbol}% % we cannot yet ask for the wd/ht/dp of an xform else we could use those \setbox\b_scrn_attachment_symbol\hbox{\symbol[\lastpredefinedsymbol]}% \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {\wd\b_scrn_attachment_symbol}\fi \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{\ht\b_scrn_attachment_symbol}\fi \ifx\currentattachmentdepth \v!fit\edef\currentattachmentdepth {\dp\b_scrn_attachment_symbol}\fi \fi - \ctxcommand{insertattachment{ - tag = "\currentattachment", - registered = "\currentattachmentregistered", - width = \number\dimexpr\currentattachmentwidth \relax, - height = \number\dimexpr\currentattachmentheight\relax, - depth = \number\dimexpr\currentattachmentdepth \relax, - color = "\attachmentparameter\c!color", - colormodel = \number\attribute\colormodelattribute, - colorvalue = \thecolorattribute{\attachmentparameter\c!color}, - transparencyvalue = \thetransparencyattribute{\attachmentparameter\c!color}, - symbol = "\currentattachmentsymbol", - layer = "\attachmentparameter\c!textlayer", + \clf_insertattachment + tag {\currentattachment}% + registered {\currentattachmentregistered}% + width \dimexpr\currentattachmentwidth \relax + height \dimexpr\currentattachmentheight\relax + depth \dimexpr\currentattachmentdepth \relax + color {\attachmentparameter\c!color}% + colormodel \attribute\colormodelattribute + colorvalue \numexpr\thecolorattribute{\attachmentparameter\c!color}\relax % or are these chardefs + transparencyvalue \numexpr\thetransparencyattribute{\attachmentparameter\c!color}\relax % or are these chardefs + symbol {\currentattachmentsymbol}% + layer {\attachmentparameter\c!textlayer}% % these will be overloaded by registered when available - title = "\attachmentparameter\c!title", - subtitle = "\attachmentparameter\c!subtitle", - author = "\attachmentparameter\c!author", - file = "\attachmentparameter\c!file", - name = "\attachmentparameter\c!name", - buffer = "\attachmentparameter\c!buffer", - }}% + title {\attachmentparameter\c!title}% + subtitle {\attachmentparameter\c!subtitle}% + author {\attachmentparameter\c!author}% + file {\attachmentparameter\c!file}% + name {\attachmentparameter\c!name}% + buffer {\attachmentparameter\c!buffer}% + \relax \setbox\b_scrn_attachment_link\hbox{\scrn_attachment_place}% \wd\b_scrn_attachment_link\currentattachmentwidth \ht\b_scrn_attachment_link\currentattachmentheight @@ -219,11 +219,11 @@ \box\b_scrn_attachment_link} \setvalue{\??attachmentmethod\v!hidden}% - {\ctxcommand{insertattachment{ - tag = "\currentattachment", - registered = "\currentattachmentregistered", - method = "\v!hidden" - }}} + {\clf_insertattachment + tag {\currentattachment}% + registered {\currentattachmentregistered}% + method {\v!hidden}% + \relax} \def\scrn_attachment_place {\executeifdefined @@ -398,10 +398,10 @@ \scrn_comment_argument_ignore} \def\scrn_comment_argument_indeed[#title][#settings]#text% - {\doifassignmentelse{#title} + {\doifelseassignment{#title} {\setupcurrentcomment[#title]} {\setupcurrentcomment[\c!title=#title,#settings]}% - \ctxcommand{assignbuffer("\v!comment",\!!bs#text\!!es)}% todo: expansion control, but expanded by default (xml) + \clf_assignbuffer{\v!comment}{#text}\catcodetable\relax% todo: expansion control, but expanded by default (xml) \scrn_comment_inject \ignorespaces} @@ -421,7 +421,7 @@ \def\scrn_comment_start_indeed[#title][#settings]% {\bgroup - \doifassignmentelse{#title} + \doifelseassignment{#title} {\setupcurrentcomment[#title]} {\setupcurrentcomment[\c!title=#title,#settings]}% \unexpanded\def\scrn_comment_stop{\scrn_comment_inject\egroup}% @@ -447,35 +447,35 @@ \edef\currentcommentheight{\commentparameter\c!height}% \edef\currentcommentdepth {\commentparameter\c!depth }% \ifx\currentcommentsymbol\empty - \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {.5em}\fi - \ifx\currentcommentheight\v!fit\edef\currentcommentheight{.5em}\fi + \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {.5\emwidth}\fi + \ifx\currentcommentheight\v!fit\edef\currentcommentheight{.5\emwidth}\fi \ifx\currentcommentdepth \v!fit\let \currentcommentdepth \zeropoint\fi \else - \ctxcommand{presetsymbollist("\commentparameter\c!symbol")}% + \clf_presetsymbollist{\commentparameter\c!symbol}% % we cannot yet ask for the wd/ht/dp of an xform else we could use those \setbox\b_scrn_comment_symbol\hbox{\symbol[\lastpredefinedsymbol]}% \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {\wd\b_scrn_comment_symbol}\fi \ifx\currentcommentheight\v!fit\edef\currentcommentheight{\ht\b_scrn_comment_symbol}\fi \ifx\currentcommentdepth \v!fit\edef\currentcommentdepth {\dp\b_scrn_comment_symbol}\fi \fi - \ctxcommand{insertcomment{ - tag = "\currentcomment", - title = "\commentparameter\c!title", - subtitle = "\commentparameter\c!subtitle", - author = "\commentparameter\c!author", - width = \number\dimexpr\currentcommentwidth, - height = \number\dimexpr\currentcommentheight, - depth = \number\dimexpr\currentcommentdepth, - nx = \commentparameter\c!nx, - ny = \commentparameter\c!ny, - colormodel = \number\attribute\colormodelattribute, - colorvalue = \thecolorattribute{\commentparameter\c!color}, - transparencyvalue = \thetransparencyattribute{\commentparameter\c!color}, - option = "\commentparameter\c!option", % todo - symbol = "\commentparameter\c!symbol", - buffer = "\v!comment", - layer = "\commentparameter\c!textlayer" - }}% + \clf_insertcomment + tag {\currentcomment}% + title {\commentparameter\c!title}% + subtitle {\commentparameter\c!subtitle}% + author {\commentparameter\c!author}% + width \dimexpr\currentcommentwidth\relax + height \dimexpr\currentcommentheight\relax + depth \dimexpr\currentcommentdepth\relax + nx {\commentparameter\c!nx}% + ny {\commentparameter\c!ny}% + colormodel \attribute\colormodelattribute + colorvalue \numexpr\thecolorattribute{\commentparameter\c!color}\relax + transparencyvalue \numexpr\thetransparencyattribute{\commentparameter\c!color}\relax + option {\commentparameter\c!option}% % todo + symbol {\commentparameter\c!symbol}% + buffer {\v!comment}% + layer {\commentparameter\c!textlayer}% + \relax \wd\b_scrn_comment_link\currentcommentwidth \ht\b_scrn_comment_link\currentcommentheight \dp\b_scrn_comment_link\currentcommentdepth @@ -542,17 +542,17 @@ {\dodoubleargument\scrn_soundtrack_indeed} \def\scrn_soundtrack_indeed[#tag][#filename]% - {\ctxcommand{registersoundclip{ - tag = "#tag", - file = "#filename" - }}} + {\clf_registersoundclip + tag {#tag}% + file {#filename}% + \relax} \def\checksoundtrack#tag% yet untested in mkiv (also move management to lua) {\iflocation - \ctxcommand{insertsoundclip{ - tag = "#tag", - ["repeat"] = "\directexternalsoundtrackparameter\c!option", % todo: pass option as-is - }}% + \clf_insertsoundclip + tag {#tag}% + repeat {\directexternalsoundtrackparameter\c!option}% + \relax \fi} %D Renderings (not yet tested in mkvi): @@ -571,31 +571,31 @@ \unexpanded\def\setinternalrendering{\dodoubleempty \scrn_rendering_set} \def\scrn_rendering_use[#tag][#mime][#file][#option]% - {\ctxcommand{registerrendering{ - type = "external", - label = "#tag", - mime = "#mime", - filename = "#file", - option = "#option", - }}} + {\clf_registerrendering + type {external}% + label {#tag}% + mime {#mime}% + filename {#file}% + option {#option}% + \relax} \def\scrn_rendering_set[#tag][#option]% {content} % crappy {\bgroup \dowithnextbox - {\ctxcommand{registerrendering{ - type = "internal", - label = "#tag", - mime = "IRO", % brrr - filename = "#tag", - option = "#option", - }}% + {\clf_registerrendering + type {internal}% + label {#tag}% + mime {IRO}% brrr + filename {#tag}% + option {#option}% + \relax \let\objectoffset\zeropoint \setobject{IRO}{#tag}\hbox{\box\nextbox}% \egroup}% \hbox} -\def\renderingtype #tag{\ctxcommand{renderingvar("#tag","type")}} -\def\renderingoption#tag{\ctxcommand{renderingvar("#tag","option")}} +\def\renderingtype #tag{\clf_renderingvar{#tag}{type}} +\def\renderingoption#tag{\clf_renderingvar{#tag}{option}} \newdimen\d_scrn_rendering_width \d_scrn_rendering_width 8cm \newdimen\d_scrn_rendering_height \d_scrn_rendering_height 6cm @@ -648,13 +648,14 @@ \letrenderingwindowparameter\c!offset\v!overlay \inheritedrenderingwindowframed {\vfill - \ctxcommand{insertrenderingwindow { - label = "\currentrendering", - width = \number\d_scrn_rendering_width, - height = \number\d_scrn_rendering_height, - option = "\renderingoption\currentrendering", - page = \number\m_scrn_rendering_page, - }}\hfill}% + \clf_insertrenderingwindow + label {\currentrendering}% + width \d_scrn_rendering_width + height \d_scrn_rendering_height + option {\renderingoption\currentrendering}% + page \m_scrn_rendering_page + \relax + \hfill}% \egroup} %D Linkedlists (not tested in mkvi): @@ -676,7 +677,7 @@ % \let\setupbutton\setuplinkedlists\setuplinkedlist % % \appendtoks -% \ctxcommand{definelinkedlist("\currentlinkedlist")}% +% \clf_definelinkedlist{\currentlinkedlist}% % \to \everydefinelinkedlist % % \def\setlinkedlistproperties#1#2#3#4#5#6% @@ -694,8 +695,8 @@ % \edef\currentlinkedlist{#1}% % \ifcsname\??lk\currentlinkedlist\s!parent\endcsname % \hskip\linkedlistparameter\c!distance -% \ctxcommand{addlinklistelement("\currentlinkedlist")}% -% \expanded{\ctxlatelua{commands.enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end +% \clf_addlinklistelement{\currentlinkedlist}% +% \expanded{\ctxlatecommand{enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end % \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink % \ifnum\noflinks>\plustwo % \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.lua b/Master/texmf-dist/tex/context/base/scrp-ini.lua index a6bfe4cf9e3..3c3517542d3 100644 --- a/Master/texmf-dist/tex/context/base/scrp-ini.lua +++ b/Master/texmf-dist/tex/context/base/scrp-ini.lua @@ -27,6 +27,8 @@ local texsetattribute = tex.setattribute local nodecodes = nodes.nodecodes local unsetvalue = attributes.unsetvalue +local implement = interfaces.implement + local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue @@ -475,18 +477,19 @@ function scripts.injectors.handler(head) normal_process = handler.injector end if normal_process then + -- wrong: originals are indices ! local f = getfont(start) if f ~= lastfont then originals = fontdata[f].resources if resources then originals = resources.originals else - -- can't happen + originals = nil -- can't happen end lastfont = f end local c = getchar(start) - if originals then + if originals and type(originals) == "number" then c = originals[c] or c end local h = hash[c] @@ -937,5 +940,22 @@ function autofontfeature.disable() disableaction("processors","scripts.autofontfeature.handler") end -commands.enableautofontscript = autofontfeature.enable -commands.disableautofontscript = autofontfeature.disable +implement { + name = "enableautofontscript", + actions = autofontfeature.enable +} + +implement { + name = "disableautofontscript", + actions = autofontfeature.disable } + +implement { + name = "setscript", + actions = scripts.set, + arguments = { "string", "string", "string" } +} + +implement { + name = "resetscript", + actions = scripts.reset +} diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv index 4a27dd8e2bf..cd060c02bbd 100644 --- a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv @@ -41,14 +41,14 @@ \to \everydefinescript \unexpanded\def\scripts_basics_set - {\ctxlua{scripts.set("\currentscript","\scriptparameter\c!method","\scriptparameter\c!preset")}} + {\clf_setscript{\currentscript}{\scriptparameter\c!method}{\scriptparameter\c!preset}} \unexpanded\def\setscript[#1]% {\edef\currentscript{#1}% \scripts_basics_set} \unexpanded\def\resetscript - {\ctxlua{scripts.reset()}} + {\clf_resetscript} \unexpanded\def\startscript[#1]% {\begingroup @@ -86,8 +86,8 @@ \fi \to \everysetupscript -\unexpanded\def\enableautofontscript {\ctxcommand{enableautofontscript ()}} -\unexpanded\def\disableautofontscript{\ctxcommand{disableautofontscript()}} +\unexpanded\def\enableautofontscript {\clf_enableautofontscript } +\unexpanded\def\disableautofontscript{\clf_disableautofontscript} \definefontfeature[latn][script=latn] \definefontfeature[grek][script=grek] diff --git a/Master/texmf-dist/tex/context/base/sort-ini.lua b/Master/texmf-dist/tex/context/base/sort-ini.lua index 9ac020166a8..99597761311 100644 --- a/Master/texmf-dist/tex/context/base/sort-ini.lua +++ b/Master/texmf-dist/tex/context/base/sort-ini.lua @@ -39,19 +39,28 @@ relatively easy to do.

how they map onto this mechanism. I've learned that users can come up with any demand so nothing here is frozen.

+

Todo: I ran into the Unicode Collation document and noticed that +there are some similarities (like the weights) but using that method +would still demand extra code for language specifics. One option is +to use the allkeys.txt file for the uc vectors but then we would also +use the collapsed key (sq, code is now commented). In fact, we could +just hook those into the replacer code that we reun beforehand.

+

In the future index entries will become more clever, i.e. they will have language etc properties that then can be used.

]]-- -local gsub, rep, sub, sort, concat = string.gsub, string.rep, string.sub, table.sort, table.concat +local gsub, rep, sub, sort, concat, tohash, format = string.gsub, 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 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 report_sorters = logs.reporter("languages","sorters") @@ -65,7 +74,9 @@ local digitsoffset = 0x20000 -- frozen local digitsmaximum = 0xFFFFF -- frozen local lccodes = characters.lccodes +local uccodes = characters.uccodes local lcchars = characters.lcchars +local ucchars = characters.ucchars local shchars = characters.shchars local fscodes = characters.fscodes local fschars = characters.fschars @@ -81,7 +92,7 @@ local v_after = variables.after local v_first = variables.first local v_last = variables.last -local validmethods = table.tohash { +local validmethods = tohash { "ch", -- raw character (for tracing) "mm", -- minus mapping "zm", -- zero mapping @@ -101,11 +112,11 @@ local predefinedmethods = { } sorters = { - comparers = comparers, - splitters = splitters, - definitions = definitions, - tracers = tracers, - constants = { + comparers = comparers, + splitters = splitters, + definitions = definitions, + tracers = tracers, + constants = { ignoredoffset = ignoredoffset, replacementoffset = replacementoffset, digitsoffset = digitsoffset, @@ -113,6 +124,7 @@ sorters = { defaultlanguage = v_default, defaultmethod = v_default, defaultdigits = v_numbers, + validmethods = validmethods, } } @@ -156,6 +168,7 @@ local mte = { -- todo: assign to t } local noorder = false +local nothing = { 0 } local function preparetables(data) local orders, lower, m_mappings, z_mappings, p_mappings = data.orders, data.lower, { }, { }, { } @@ -168,12 +181,12 @@ local function preparetables(data) __index = function(t,k) local n, nn if k then - if trace_tests then + if trace_orders then report_sorters("simplifing character %C",k) end local l = lower[k] or lcchars[k] if l then - if trace_tests then + if trace_orders then report_sorters(" 1 lower: %C",l) end local ml = rawget(t,l) @@ -184,7 +197,7 @@ local function preparetables(data) nn = nn + 1 n[nn] = ml[i] + (t.__delta or 0) end - if trace_tests then + if trace_orders then report_sorters(" 2 order: % t",n) end end @@ -192,7 +205,7 @@ local function preparetables(data) if not n then local s = shchars[k] -- maybe all components? if s and s ~= k then - if trace_tests then + if trace_orders then report_sorters(" 3 shape: %C",s) end n = { } @@ -200,7 +213,7 @@ local function preparetables(data) for l in utfcharacters(s) do local ml = rawget(t,l) if ml then - if trace_tests then + if trace_orders then report_sorters(" 4 keep: %C",l) end if ml then @@ -212,7 +225,7 @@ local function preparetables(data) else l = lower[l] or lcchars[l] if l then - if trace_tests then + if trace_orders then report_sorters(" 5 lower: %C",l) end local ml = rawget(t,l) @@ -226,44 +239,45 @@ local function preparetables(data) end end else - -- -- we probably never enter this branch - -- -- fschars returns a single char - -- - -- s = fschars[k] - -- if s and s ~= k then - -- if trace_tests then - -- report_sorters(" 6 split: %s",s) - -- end - -- local ml = rawget(t,s) - -- if ml then - -- n = { } - -- nn = 0 - -- for i=1,#ml do - -- nn = nn + 1 - -- n[nn] = ml[i] - -- end - -- end - -- end - local b = utfbyte(k) - n = decomposed[b] or { b } - if trace_tests then - report_sorters(" 6 split: %s",utf.tostring(b)) -- todo + -- this is a kind of last resort branch that we might want to revise + -- one day + -- + -- local b = utfbyte(k) + -- n = decomposed[b] or { b } + -- if trace_tests then + -- report_sorters(" 6 split: %s",utf.tostring(b)) -- todo + -- end + -- + -- we need to move way above valid order (new per 2014-10-16) .. maybe we + -- need to move it even more up to get numbers right (not all have orders) + -- + if k == "\000" then + n = nothing -- shared + if trace_orders then + report_sorters(" 6 split: space") -- todo + end + else + local b = 2 * #orders + utfbyte(k) + n = decomposed[b] or { b } -- could be shared tables + if trace_orders then + report_sorters(" 6 split: %s",utf.tostring(b)) -- todo + end end end if n then - if trace_tests then + if trace_orders then report_sorters(" 7 order: % t",n) end else n = noorder - if trace_tests then + if trace_orders then report_sorters(" 8 order: 0") end end end else n = noorder - if trace_tests then + if trace_orders then report_sorters(" 9 order: 0") end end @@ -298,11 +312,11 @@ local function update() -- prepare parent chains, needed when new languages are end end -local function setlanguage(l,m,d,u) +local function setlanguage(l,m,d,u) -- this will become a specification table language = (l ~= "" and l) or constants.defaultlanguage - data = definitions[language or constants.defaultlanguage] or definitions[constants.defaultlanguage] - method = (m ~= "" and m) or data.method or constants.defaultmethod - digits = (d ~= "" and d) or data.digits or constants.defaultdigits + data = definitions[language or constants.defaultlanguage] or definitions[constants.defaultlanguage] + method = (m ~= "" and m) or (data.method ~= "" and data.method) or constants.defaultmethod + digits = (d ~= "" and d) or (data.digits ~= "" and data.digits) or constants.defaultdigits if trace_tests then report_sorters("setting language %a, method %a, digits %a",language,method,digits) end @@ -333,8 +347,8 @@ local function setlanguage(l,m,d,u) report_sorters("invalid sorter method %a in %a",s,method) end end + usedinsequence = tohash(sequence) data.sequence = sequence - usedinsequence = table.tohash(sequence) data.usedinsequence = usedinsequence -- usedinsequence.ch = true -- better just store the string if trace_tests then @@ -356,6 +370,8 @@ end -- tricky: { 0, 0, 0 } vs { 0, 0, 0, 0 } => longer wins and mm, pm, zm can have them +-- inlining and checking first slot first doesn't speed up (the 400K complex author sort) + local function basicsort(sort_a,sort_b) if sort_a and sort_b then local na = #sort_a @@ -363,12 +379,14 @@ local function basicsort(sort_a,sort_b) if na > nb then na = nb end - for i=1,na do - local ai, bi = sort_a[i], sort_b[i] - if ai > bi then - return 1 - elseif ai < bi then - return -1 + if na > 0 then + for i=1,na do + local ai, bi = sort_a[i], sort_b[i] + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end end end end @@ -378,6 +396,10 @@ end -- todo: compile compare function local function basic(a,b) -- trace ea and eb + if a == b then + -- hashed (shared) entries + return 0 + end local ea, eb = a.split, b.split local na, nb = #ea, #eb if na == 0 and nb == 0 then @@ -437,31 +459,72 @@ local function basic(a,b) -- trace ea and eb end end +-- if we use sq: +-- +-- local function basic(a,b) -- trace ea and eb +-- local ea, eb = a.split, b.split +-- local na, nb = #ea, #eb +-- if na == 0 and nb == 0 then +-- -- simple variant (single word) +-- return basicsort(ea.sq,eb.sq) +-- else +-- -- complex variant, used in register (multiple words) +-- local result = 0 +-- for i=1,nb < na and nb or na do +-- local eai, ebi = ea[i], eb[i] +-- result = basicsort(ea.sq,eb.sq) +-- if result ~= 0 then +-- return result +-- end +-- end +-- if result ~= 0 then +-- return result +-- elseif na > nb then +-- return 1 +-- elseif nb > na then +-- return -1 +-- else +-- return 0 +-- end +-- end +-- end + comparers.basic = basic function sorters.basicsorter(a,b) return basic(a,b) == -1 end -local function numify(s) - s = digitsoffset + tonumber(s) -- alternatively we can create range - if s > digitsmaximum then - s = digitsmaximum +local function numify(old) + if digits == v_numbers then -- was swapped, fixed 2014-11-10 + local new = digitsoffset + tonumber(old) -- alternatively we can create range + if new > digitsmaximum then + new = digitsmaximum + end + return utfchar(new) + else + return old end - return utfchar(s) +end + +local pattern = nil + +local function prepare() + pattern = Cs( ( + characters.tex.toutfpattern() + + lpeg.patterns.whitespace / "\000" + + (P("\\") / "") * R("AZ")^0 * (P(-1) + #(1-R("AZ"))) + + (P("\\") * P(1) * R("az","AZ")^0) / "" + + S("[](){}$\"'") / "" + + R("09")^1 / numify + + P(1) + )^0 ) + return pattern end function sorters.strip(str) -- todo: only letters and such if str and str ~= "" then - -- todo: make a decent lpeg - str = gsub(str,"\\[\"\'~^`]*","") -- \"e -- hm, too greedy - str = gsub(str,"\\%S*","") -- the rest - str = gsub(str,"%s","\001") -- can be option - str = gsub(str,"[%s%[%](){}%$\"\']*","") -- %s already done - if digits == v_numbers then - str = gsub(str,"(%d+)",numify) -- sort numbers properly - end - return str + return lpegmatch(pattern or prepare(),str) else return "" end @@ -529,10 +592,15 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean else n = n + 1 local l = lower[sc] - l = l and utfbyte(l) or lccodes[b] + l = l and utfbyte(l) or lccodes[b] or b + -- local u = upper[sc] + -- u = u and utfbyte(u) or uccodes[b] or b if type(l) == "table" then l = l[1] -- there are currently no tables in lccodes but it can be some, day end + -- if type(u) == "table" then + -- u = u[1] -- there are currently no tables in lccodes but it can be some, day + -- end z_case[n] = l if l ~= b then m_case[n] = l - 1 @@ -591,9 +659,9 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean -- p_mapping = { p_mappings[fs][1] } -- end -- end - + local result if checked then - return { + result = { ch = trace_tests and char or nil, -- not in sequence uc = usedinsequence.uc and byte or nil, mc = usedinsequence.mc and m_case or nil, @@ -604,7 +672,7 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean pm = usedinsequence.pm and p_mapping or nil, } else - return { + result = { ch = char, uc = byte, mc = m_case, @@ -615,7 +683,15 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean pm = p_mapping, } end - + -- local sq, n = { }, 0 + -- for i=1,#byte do + -- for s=1,#sequence do + -- n = n + 1 + -- sq[n] = result[sequence[s]][i] + -- end + -- end + -- result.sq = sq + return result end local function packch(entry) @@ -646,11 +722,11 @@ local function packuc(entry) if #split > 0 then -- useless test local t = { } for i=1,#split do - t[i] = concat(split[i].uc, " ") + t[i] = concat(split[i].uc, " ") -- sq end return concat(t," + ") else - return concat(split.uc," ") + return concat(split.uc," ") -- sq end end @@ -677,7 +753,9 @@ function sorters.sort(entries,cmp) first = " " else s = first - report_sorters(">> %C (%C)",first,letter) + if first and letter then + report_sorters(">> %C (%C)",first,letter) + end end report_sorters(" %s | %s",packch(entry),packuc(entry)) end diff --git a/Master/texmf-dist/tex/context/base/spac-adj.lua b/Master/texmf-dist/tex/context/base/spac-adj.lua index c87a9d17f62..cdf9b505119 100644 --- a/Master/texmf-dist/tex/context/base/spac-adj.lua +++ b/Master/texmf-dist/tex/context/base/spac-adj.lua @@ -56,3 +56,11 @@ function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionc return head, false end end + +interfaces.implement { + name = "enablegraphicvadjust", + onlyonce = true, + actions = function() + nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust") + end +} diff --git a/Master/texmf-dist/tex/context/base/spac-adj.mkiv b/Master/texmf-dist/tex/context/base/spac-adj.mkiv index 447dd722963..b8534303df9 100644 --- a/Master/texmf-dist/tex/context/base/spac-adj.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-adj.mkiv @@ -16,18 +16,19 @@ \unprotect % Very nasty but needed for margin stuff inside colored -% paragraphs. Obsolete anyway. +% paragraphs. Obsolete for while . \registerctxluafile{spac-adj}{1.001} \definesystemattribute [graphicvadjust] [public] \unexpanded\def\enablegraphicvadjust - {\ctxlua{nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust")}% + {\writestatus\m!systems{graphicvadjusting is no longer needed!} + \clf_enablegraphicvadjust %once anyway \glet\enablegraphicvadjust\relax} \unexpanded\def\graphicvadjust % currently not enabled ... nasty bidi handling - {\enablegraphicvadjust % and no longer needed anyway + {\clf_enablegraphicvadjust % and probably no longer needed anyway \dowithnextboxcontentcs\forgetall\spac_vadjust_graphic_finish\vbox} \def\spac_vadjust_graphic_finish diff --git a/Master/texmf-dist/tex/context/base/spac-ali.lua b/Master/texmf-dist/tex/context/base/spac-ali.lua index 08e33c5b87c..880da6213d5 100644 --- a/Master/texmf-dist/tex/context/base/spac-ali.lua +++ b/Master/texmf-dist/tex/context/base/spac-ali.lua @@ -133,7 +133,11 @@ function alignments.set(n) texsetattribute(a_realign,texgetcount("realpageno") * 10 + n) end -commands.setrealign = alignments.set +interfaces.implement { + name = "setrealign", + actions = alignments.set, + arguments = "integer", +} statistics.register("realigning", function() if nofrealigned > 0 then diff --git a/Master/texmf-dist/tex/context/base/spac-ali.mkiv b/Master/texmf-dist/tex/context/base/spac-ali.mkiv index c13e4ca7615..fbcce89c46d 100644 --- a/Master/texmf-dist/tex/context/base/spac-ali.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-ali.mkiv @@ -38,8 +38,8 @@ \to \everyforgetall \unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue} -\unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}} -\unexpanded\def\signalouterrealign{\ctxcommand{setrealign(1)}} +\unexpanded\def\signalinnerrealign{\clf_setrealign\plustwo} +\unexpanded\def\signalouterrealign{\clf_setrealign\plusone} \installcorenamespace{aligncommand} \installcorenamespace{alignhorizontal} @@ -562,6 +562,12 @@ \spac_align_use_indeed \fi} +\unexpanded\def\dousealignparameter#1% faster local variant + {\edef\m_spac_align_asked{#1}% + \ifx\m_spac_align_asked\empty\else + \spac_align_use_indeed + \fi} + \def\spac_align_use_indeed {\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname \ifx\raggedcommand\relax @@ -715,7 +721,7 @@ \forgetall \let\\=\endgraf \ifdoublesided\signalinnerrealign\fi - \doifrightpageelse\spac_align_set_horizontal_right\spac_align_set_horizontal_left + \doifelserightpage\spac_align_set_horizontal_right\spac_align_set_horizontal_left \let\next} \unexpanded\def\obox#1#2#3% @@ -723,7 +729,7 @@ \forgetall \let\\=\endgraf \ifdoublesided\signalouterrealign\fi - \doifrightpageelse\c_spac_align_state_horizontal_left\spac_align_set_horizontal_right + \doifelserightpage\c_spac_align_state_horizontal_left\spac_align_set_horizontal_right \let\next} \let\raggedbox\relax @@ -961,7 +967,7 @@ \hbox} \def\doxcheckline % used for floats so multipass anyway - {\signalrightpage\doifrightpageelse\donetrue\donefalse} + {\signalrightpage\doifelserightpage\donetrue\donefalse} \setvalue{\??alignline\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } \setvalue{\??alignline\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} diff --git a/Master/texmf-dist/tex/context/base/spac-chr.lua b/Master/texmf-dist/tex/context/base/spac-chr.lua index 5b3a15478ce..e3fa6d09983 100644 --- a/Master/texmf-dist/tex/context/base/spac-chr.lua +++ b/Master/texmf-dist/tex/context/base/spac-chr.lua @@ -14,13 +14,14 @@ local byte, lower = string.byte, string.lower -- to be redone: characters will become tagged spaces instead as then we keep track of -- spaceskip etc --- todo: only setattr when export +-- todo: only setattr when export / use properties local next = next -trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end) +local trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end) +local trace_nbsp = false trackers.register("typesetters.nbsp", function(v) trace_nbsp = v end) -report_characters = logs.reporter("typesetting","characters") +local report_characters = logs.reporter("typesetting","characters") local nodes, node = nodes, node @@ -39,6 +40,8 @@ local setattr = nuts.setattr local getfont = nuts.getfont local getchar = nuts.getchar +local setcolor = nodes.tracers.colors.set + local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local remove_node = nuts.remove @@ -50,6 +53,8 @@ local tasks = nodes.tasks local nodepool = nuts.pool local new_penalty = nodepool.penalty local new_glue = nodepool.glue +local new_kern = nodepool.kern +local new_rule = nodepool.rule local nodecodes = nodes.nodecodes local skipcodes = nodes.skipcodes @@ -107,13 +112,22 @@ local function inject_char_space(unicode,head,current,parent) end local function inject_nobreak_space(unicode,head,current,space,spacestretch,spaceshrink) - local attr = getfield(current,"attr") - local glue = new_glue(space,spacestretch,spaceshrink) + local attr = getfield(current,"attr") + local glue = new_glue(space,spacestretch,spaceshrink) local penalty = new_penalty(10000) setfield(glue,"attr",attr) setfield(current,"attr",nil) - setattr(glue,a_character,unicode) + setattr(glue,a_character,unicode) -- bombs head, current = insert_node_after(head,current,penalty) + if trace_nbsp then + local rule = new_rule(space) + local kern = new_kern(-space) + local penalty = new_penalty(10000) + setcolor(rule,"orange") + head, current = insert_node_after(head,current,rule) + head, current = insert_node_after(head,current,kern) + head, current = insert_node_after(head,current,penalty) + end head, current = insert_node_after(head,current,glue) return head, current end diff --git a/Master/texmf-dist/tex/context/base/spac-chr.mkiv b/Master/texmf-dist/tex/context/base/spac-chr.mkiv index f9dc6e16b5f..562fb940ce1 100644 --- a/Master/texmf-dist/tex/context/base/spac-chr.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-chr.mkiv @@ -77,6 +77,7 @@ \let\zwnj\zerowidthnonjoiner \let\zwj \zerowidthjoiner +\let\nbsp\nobreakspace \chardef\optionalspace"1F % will be space unless before punctuation diff --git a/Master/texmf-dist/tex/context/base/spac-hor.lua b/Master/texmf-dist/tex/context/base/spac-hor.lua index c9d6e2b154b..5d5a43e311c 100644 --- a/Master/texmf-dist/tex/context/base/spac-hor.lua +++ b/Master/texmf-dist/tex/context/base/spac-hor.lua @@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['spac-hor'] = { license = "see context related readme files" } -local match = string.match local utfbyte = utf.byte +local lpegmatch, P, C = lpeg.match, lpeg.P, lpeg.C local context = context -local commands = commands local chardata = characters.data +local p_check = P("the ") * (P("letter") + P("character")) * P(" ") * lpeg.patterns.utf8byte -- is a capture already + local can_have_space = table.tohash { "lu", "ll", "lt", "lm", "lo", -- letters -- "mn", "mc", "me", -- marks @@ -26,10 +27,18 @@ local can_have_space = table.tohash { -- "cc", "cf", "cs", "co", "cn", -- others } -function commands.autonextspace(str) -- todo: use nexttoken - local ch = match(str,"the letter (.)") or match(str,"the character (.)") - ch = ch and chardata[utfbyte(ch)] - if ch and can_have_space[ch.category] then - context.space() +local function autonextspace(str) -- todo: make a real not intrusive lookahead + local b = lpegmatch(p_check,str) + if b then + local d = chardata[b] + if d and can_have_space[d.category] then + context.space() + end end end + +interfaces.implement { + name = "autonextspace", + actions = autonextspace, + arguments = "string", +} diff --git a/Master/texmf-dist/tex/context/base/spac-hor.mkiv b/Master/texmf-dist/tex/context/base/spac-hor.mkiv index 92491ce3218..54156c3b428 100644 --- a/Master/texmf-dist/tex/context/base/spac-hor.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-hor.mkiv @@ -32,7 +32,7 @@ {\doifoutervmode{\ifconditional\c_spac_indentation_indent_first\else\spac_indentation_variant_no\fi}} \unexpanded\def\setupindenting - {\doifnextoptionalcselse\spac_indentation_setup_options\spac_indentation_setup_size} + {\doifelsenextoptionalcs\spac_indentation_setup_options\spac_indentation_setup_size} \unexpanded\def\spac_indentation_setup_size {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}} @@ -64,6 +64,12 @@ \def\spac_indentation_set_everypar {\everypar{\checkindentation}} +\unexpanded\def\useindentingparameter#1% faster local variant + {\edef\m_spac_indentation_options{#1\c!indenting}% + \ifx\m_spac_indentation_options\empty \else + \spac_indentation_setup_indeed + \fi} + % \def\spac_indentation_apply_step_one#1% % {\ifcsname\??indentingmethod#1\endcsname % % case two @@ -122,7 +128,7 @@ \fi\fi} \unexpanded\def\indenting % kind of obsolete - {\doifnextoptionalcselse\spac_indentation_setup_options\relax} + {\doifelsenextoptionalcs\spac_indentation_setup_options\relax} % use \noindentation to suppress next indentation @@ -258,7 +264,7 @@ \unexpanded\def\spac_indentation_check_next_indentation {\global\let\dorechecknextindentation\relax - \doifnextcharelse\par\donothing\spac_indentation_variant_no} % messy check as next is seldom \par + \doifelsenextchar\par\donothing\spac_indentation_variant_no} % messy check as next is seldom \par \def\spac_indentation_variant_auto {\global\let\dorechecknextindentation\spac_indentation_check_next_indentation} @@ -380,7 +386,7 @@ \installspacingmethod \v!broad {\nonfrenchspacing} % more depending on what punctuation \unexpanded\def\setupspacing - {\doifnextoptionalcselse\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop} + {\doifelsenextoptionalcs\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop} \def\spac_spacecodes_setup_yes[#1]% {\csname\??spacecodemethod#1\endcsname @@ -671,7 +677,7 @@ \fi} \def\spac_narrower_start_named_one[#1]% - {\doifassignmentelse{#1}\spac_narrower_start_named_one_yes\spac_narrower_start_named_one_nop[#1]} + {\doifelseassignment{#1}\spac_narrower_start_named_one_yes\spac_narrower_start_named_one_nop[#1]} \def\spac_narrower_start_named_one_yes[#1][#2]% [settings] [] {\setupcurrentnarrower[#1]% @@ -682,14 +688,14 @@ \spac_narrower_start_apply{\narrowerparameter\v!default}} \def\spac_narrower_start_named_two[#1]% - {\doifassignmentelse{#1}\spac_narrower_start_named_settings_how\spac_narrower_start_named_tag_unknown[#1]} + {\doifelseassignment{#1}\spac_narrower_start_named_settings_how\spac_narrower_start_named_tag_unknown[#1]} \def\spac_narrower_start_named_settings_how[#1][#2]% [settings] [how] {\setupcurrentnarrower[#1]% \spac_narrower_start_apply{#2}} \def\spac_narrower_start_named_tag_unknown[#1][#2]% [tag] [...] - {\doifassignmentelse{#2}\spac_narrower_start_named_tag_settings\spac_narrower_start_named_tag_how[#1][#2]} + {\doifelseassignment{#2}\spac_narrower_start_named_tag_settings\spac_narrower_start_named_tag_how[#1][#2]} \def\spac_narrower_start_named_tag_settings[#1][#2]% [tag] [settings] {\edef\currentnarrower{#1}% @@ -733,8 +739,8 @@ \unexpanded\def\dosetleftskipadaption #1{\leftskipadaption \ifcsname\??skipadaptionleft #1\endcsname\csname\??skipadaptionleft #1\endcsname\else#1\fi\relax} \unexpanded\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname\??skipadaptionright#1\endcsname\csname\??skipadaptionright#1\endcsname\else#1\fi\relax} -\unexpanded\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption } -\unexpanded\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption} +\unexpanded\def\doadaptleftskip #1{\normalexpanded{\dosetleftskipadaption {#1}}\advance\leftskip \leftskipadaption } +\unexpanded\def\doadaptrightskip#1{\normalexpanded{\dosetrightskipadaption{#1}}\advance\rightskip\rightskipadaption} \unexpanded\def\forgetbothskips {\leftskip\zeropoint @@ -780,7 +786,7 @@ {\dosingleargument\spac_tolerances_setup} \def\spac_tolerances_setup[#1]% - {\doifinsetelse\v!vertical{#1}% + {\doifelseinset\v!vertical{#1}% {\processcommacommand[#1]\spac_tolerances_step_vertical } {\processcommacommand[#1]\spac_tolerances_step_horizontal}} @@ -850,31 +856,6 @@ %D In \CONTEXT\ however we save some processing time by putting %D an extra \type{\hbox} around the \type{\strutbox}. -% moved from page-lin.tex to here (due to visualization added -% in august 2003) -% -% \unexpanded \def\crlf -% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break} - -\unexpanded\def\crlf - {\ifhmode - \unskip - \prewordbreak\crlfplaceholder - \ifcase\raggedstatus\hfil\or\or\or\hfil\fi - \break - \else - \crlfplaceholder - \endgraf - \fi} - -\unexpanded\def\crlfplaceholder - {\strut} - -\unexpanded\def\settestcrlf - {\unexpanded\def\crlfplaceholder - {\hbox to \zeropoint - {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}} - %D \starttyping %D % \setuplayout[gridgrid=yes] \showgrid %D @@ -1065,7 +1046,7 @@ {\futurelet\nexttoken\spac_spaces_auto_insert_next} \def\spac_spaces_auto_insert_next - {\ctxcommand{autonextspace(\!!bs\meaning\nexttoken\!!es)}} % todo, just consult nexttoken at the lua end + {\clf_autonextspace{\meaning\nexttoken}} % todo, just consult nexttoken at the lua end %D Moved from bib module: @@ -1100,7 +1081,7 @@ %D A rather unknown one: \unexpanded\def\widened % moved from cont-new - {\doifnextoptionalcselse\spac_widened_yes\spac_widened_nop} + {\doifelsenextoptionalcs\spac_widened_yes\spac_widened_nop} \def\spac_widened_yes[#1]#2{\hbox \s!spread #1{\hss#2\hss}} \def\spac_widened_nop #1{\hbox \s!spread \emwidth{\hss#1\hss}} diff --git a/Master/texmf-dist/tex/context/base/spac-lin.mkiv b/Master/texmf-dist/tex/context/base/spac-lin.mkiv index 094e18e0bac..20fec5d4537 100644 --- a/Master/texmf-dist/tex/context/base/spac-lin.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-lin.mkiv @@ -88,13 +88,13 @@ \linesparameter\c!before \pushmacro\checkindentation \whitespace - \dostarttagged\t!lines\currentlines + \dostarttaggedchained\t!lines\currentlines\??lines \begingroup \uselinesstyleandcolor\c!style\c!color - \setupindenting[\linesparameter\c!indenting]% - \setupalign[\linesparameter\c!align]% + \useindentingparameter\linesparameter + \usealignparameter\linesparameter \typesettinglinestrue - \setupwhitespace[\v!none]% + \setupwhitespace[\v!none]% todo use fast variant %\obeylines % move upwards to keep spaces in the first line due to optional argument \ignorespaces \glet\spac_after_first_obeyed_line\spac_lines_after_first_obeyed_line_a @@ -128,7 +128,7 @@ \egroup} \def\spac_lines_between - {\doifmeaningelse\next\obeyedline % brrr + {\doifelsemeaning\next\obeyedline % brrr {\linesparameter\c!inbetween} {\spac_after_first_obeyed_line}} diff --git a/Master/texmf-dist/tex/context/base/spac-pag.mkiv b/Master/texmf-dist/tex/context/base/spac-pag.mkiv index da4c8e9703b..1ecc31d8cd5 100644 --- a/Master/texmf-dist/tex/context/base/spac-pag.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-pag.mkiv @@ -51,7 +51,7 @@ \setpagestaterealpageno{#1}{\number#2}% \fi} -\unexpanded\def\doifrightpagestateelse#1#2% not expandable ! +\unexpanded\def\doifelserightpagestate#1#2% not expandable ! {\ifcase\frozenpagestate \pagestatemismatchfalse \realpagestateno\realfolio @@ -100,7 +100,7 @@ \expandafter\secondoftwoarguments \fi} -\unexpanded\def\doifforcedrightpagestateelse#1#2% +\unexpanded\def\doifelseforcedrightpagestate#1#2% {\ifcase\frozenpagestate \pagestatemismatchfalse \realpagestateno\realfolio @@ -135,6 +135,9 @@ \expandafter\secondoftwoarguments \fi} +\let\doifrightpagestateelse \doifelserightpagestate +\let\doifforcedrightpagestateelse\doifelseforcedrightpagestate + \unexpanded\def\freezepagestate {\frozenpagestate\plusone } \unexpanded\def\defrostpagestate{\frozenpagestate\zerocount} @@ -147,7 +150,9 @@ \definepagestate[\s!paragraph] \unexpanded\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} % use \dontleavehmode if needed -\unexpanded\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs} +\unexpanded\def\doifelserightpage{\doifelserightpagestate\s!paragraph\nofraggedparagraphs} + +\let\doifrightpageelse\doifelserightpage \installcorenamespace{pagechanges} diff --git a/Master/texmf-dist/tex/context/base/spac-par.mkiv b/Master/texmf-dist/tex/context/base/spac-par.mkiv index 825cdca462b..4dd3db24338 100644 --- a/Master/texmf-dist/tex/context/base/spac-par.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-par.mkiv @@ -203,6 +203,8 @@ % \glet\flushpostponednodedata\spac_postponed_data_flush % \fi} +\newtoks\everyflushatnextpar + \unexpanded\def\pushpostponednodedata {\globalpushbox\b_spac_postponed_data} @@ -214,6 +216,7 @@ \unexpanded\def\flushatnextpar {\begingroup + \the\everyflushatnextpar \glet\flushpostponednodedata\spac_postponed_data_flush \dowithnextboxcs\spac_postponed_data_finish\hbox} diff --git a/Master/texmf-dist/tex/context/base/spac-ver.lua b/Master/texmf-dist/tex/context/base/spac-ver.lua index d5a2b4d5693..fc6fba0eb43 100644 --- a/Master/texmf-dist/tex/context/base/spac-ver.lua +++ b/Master/texmf-dist/tex/context/base/spac-ver.lua @@ -8,11 +8,16 @@ if not modules then modules = { } end modules ['spac-ver'] = { -- we also need to call the spacer for inserts! +-- somehow lists still don't always have proper prev nodes so i need to +-- check all of the luatex code some day .. maybe i should replece the +-- whole mvl handler by lua code .. why not + -- todo: use lua nodes with lua data (>0.79) -- see ** can go when 0.79 -- this code dates from the beginning and is kind of experimental; it --- will be optimized and improved soon +-- will be optimized and improved soon .. it's way too complex now but +-- dates from less possibilities -- -- the collapser will be redone with user nodes; also, we might get make -- parskip into an attribute and appy it explicitly thereby getting rid @@ -33,13 +38,20 @@ local formatters = string.formatters local P, C, R, S, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc -local nodes, node, trackers, attributes, context, commands, tex = nodes, node, trackers, attributes, context, commands, tex +local nodes = nodes +local node = node +local trackers = trackers +local attributes = attributes +local context = context +local tex = tex local texlists = tex.lists local texgetdimen = tex.getdimen +local texsetdimen = tex.setdimen local texnest = tex.nest local variables = interfaces.variables +local implement = interfaces.implement -- vertical space handler @@ -104,6 +116,7 @@ local nodepool = nuts.pool local new_penalty = nodepool.penalty local new_kern = nodepool.kern local new_rule = nodepool.rule +local new_glue = nodepool.glue local new_gluespec = nodepool.gluespec local nodecodes = nodes.nodecodes @@ -134,11 +147,13 @@ local default = { strut = true, hfraction = 1, dfraction = 1, + bfraction = 0.25, } local fractions = { minheight = "hfraction", maxheight = "hfraction", mindepth = "dfraction", maxdepth = "dfraction", + box = "bfraction", top = "tlines", bottom = "blines", } @@ -330,27 +345,58 @@ local function snap_hlist(where,current,method,height,depth) -- method.strut is t[#t+1] = formatters["auto: snapht %p snapdp %p"](snapht,snapdp) end end - local h = height or getfield(current,"height") - local d = depth or getfield(current,"depth") - local hr, dr, ch, cd = method.hfraction or 1, method.dfraction or 1, h, d - local tlines, blines = method.tlines or 1, method.blines or 1 - local done, plusht, plusdp = false, snapht, snapdp + + local h = (method.noheight and 0) or height or getfield(current,"height") + local d = (method.nodepth and 0) or depth or getfield(current,"depth") + local hr = method.hfraction or 1 + local dr = method.dfraction or 1 + local br = method.bfraction or 0 + local ch = h + local cd = d + local tlines = method.tlines or 1 + local blines = method.blines or 1 + local done = false + local plusht = snapht + local plusdp = snapdp local snaphtdp = snapht + snapdp - if method.none then + if method.box then + local br = 1 - br + if br < 0 then + br = 0 + elseif br > 1 then + br = 1 + end + local n = ceiled((h+d-br*snapht-br*snapdp)/snaphtdp) + local x = n * snaphtdp - h - d + plusht = h + x / 2 + plusdp = d + x / 2 + elseif method.max then + local n = ceiled((h+d)/snaphtdp) + local x = n * snaphtdp - h - d + plusht = h + x / 2 + plusdp = d + x / 2 + elseif method.min then + local n = floored((h+d)/snaphtdp) + local x = n * snaphtdp - h - d + plusht = h + x / 2 + plusdp = d + x / 2 + elseif method.none then plusht, plusdp = 0, 0 if t then t[#t+1] = "none: plusht 0pt plusdp 0pt" end end if method.halfline then -- extra halfline - plusht, plusdp = plusht + snaphtdp/2, plusdp + snaphtdp/2 + plusht = plusht + snaphtdp/2 + plusdp = plusdp + snaphtdp/2 if t then t[#t+1] = formatters["halfline: plusht %p plusdp %p"](plusht,plusdp) end end if method.line then -- extra line - plusht, plusdp = plusht + snaphtdp, plusdp + snaphtdp + plusht = plusht + snaphtdp + plusdp = plusdp + snaphtdp if t then t[#t+1] = formatters["line: plusht %p plusdp %p"](plusht,plusdp) end @@ -512,6 +558,12 @@ local function snap_hlist(where,current,method,height,depth) -- method.strut is t[#t+1] = formatters["final height: %p -> %p"](h,ch) t[#t+1] = formatters["final depth: %p -> %p"](d,cd) end +-- todo: +-- +-- if h < 0 or d < 0 then +-- h = 0 +-- d = 0 +-- end if t then report_snapper("trace: %s type %s\n\t%\n\tt",where,nodecodes[getid(current)],t) end @@ -879,19 +931,18 @@ local special_penalty_xxx = 0 -- header don't break but also make sure that we have at least a decent -- break when we have succesive ones (often when testing) +-- todo: mark headers as such so that we can recognize them + local specialmethods = { } local specialmethod = 1 local properties = nodes.properties.data -specialmethods[1] = function(start,penalty) +specialmethods[1] = function(pagehead,pagetail,start,penalty) -- - if penalty < special_penalty_min or penalty > special_penalty_max then + if not pagehead or penalty < special_penalty_min or penalty > special_penalty_max then return end - -- this can move to the caller - local pagehead = tonut(texlists.page_head) - local pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet local current = pagetail -- -- nodes.showsimplelist(pagehead,0) @@ -927,51 +978,84 @@ specialmethods[1] = function(start,penalty) return end elseif trace_specials then - report_specials(" context %a, higher level, continue",p) + report_specials(" context penalty %a, higher level, continue",p) + end + else + local p = getfield(current,"penalty") + if p < 10000 then + -- assume some other mechanism kicks in so we seem to have content + if trace_specials then + report_specials(" regular penalty %a, quitting",p) + end + break + else + if trace_specials then + report_specials(" regular penalty %a, continue",p) + end end - elseif trace_specials then - report_specials(" regular penalty, continue") end end current = getprev(current) end + -- none found, so no reson to be special + if trace_specials then + report_specials(" context penalty, discarding") + end + return special_penalty_xxx end -- specialmethods[2] : always put something before and use that as to-be-changed +-- +-- we could inject a vadjust to force a recalculation .. a mess +-- +-- So, the next is far from robust and okay but for the moment this overlaying +-- has to do. Always test this with the examples in spec-ver.mkvi! -local function check_experimental_overlay(head,current) -- todo +local function check_experimental_overlay(head,current) local p = nil local c = current local n = nil -setfield(head,"prev",nil) -- till we have 0.79 ** - - local function overlay(p, n, s, mvl) - local c = getprev(n) - while c and c ~= p do - local p = getprev(c) - free_node(c) - c = p - end - setfield(n,"prev",nil) - if not mvl then - setfield(p,"next",n) + -- setfield(head,"prev",nil) -- till we have 0.79 ** + + local function overlay(p,n,mvl) + local p_ht = getfield(p,"height") + local p_dp = getfield(p,"depth") + local n_ht = getfield(n,"height") + local skips = 0 + -- + -- We deal with this at the tex end .. we don't see spacing .. enabling this code + -- is probably harmless btu then we need to test it. + -- + local c = getnext(p) + while c and c ~= n do + local id = getid(c) + if id == glue_code then + skips = skips + getfield(getfield(c,"glue_spec"),"width") + elseif id == kern_code then + skips = skips + getfield(c,"kern") + end + c = getnext(c) end - local p_ht = getfield(p,"height") - local p_dp = getfield(p,"depth") - local n_ht = getfield(n,"height") - local delta = n_ht + s + p_dp + -- + local delta = n_ht + skips + p_dp + texsetdimen("global","d_spac_overlay",-delta) -- for tracing local k = new_kern(-delta) - if trace_vspacing then - report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,s,delta) - end if n_ht > p_ht then - -- we should adapt pagetotal ! (need a hook for that) + -- we should adapt pagetotal ! (need a hook for that) .. now we have the wrong pagebreak setfield(p,"height",n_ht) end - return k + insert_node_before(head,n,k) + if p == head then + head = k + end + if trace_vspacing then + report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,skips,delta) + end + return remove_node(head,current,true) end + -- goto next line while c do local id = getid(c) if id == glue_code or id == penalty_code or id == kern_code then @@ -985,7 +1069,7 @@ setfield(head,"prev",nil) -- till we have 0.79 ** end end if n then - -- we have a next line + -- we have a next line, goto prev line c = current while c do local id = getid(c) @@ -1002,45 +1086,33 @@ setfield(head,"prev",nil) -- till we have 0.79 ** if a_snapmethod == a_snapvbox then -- quit, we're not on the mvl else - -- messy local c = tonut(texlists.page_head) - local s = 0 - while c do + while c and c ~= n do local id = getid(c) - if id == glue_code then - if p then - s = s + getfield(getfield(c,"glue_spec"),"width") - end - elseif id == kern_code then - if p then - s = s + getfield(c,"kern") - end - elseif id == penalty_code then - -- skip (actually, remove) - elseif id == hlist_code then + if id == hlist_code then p = c - s = 0 - else - p = nil - s = 0 end c = getnext(c) end if p and p ~= n then - local k = overlay(p,n,s,true) - insert_node_before(n,n,k) - return k, getnext(n) + return overlay(p,n,true) end end elseif p ~= n then - local k = overlay(p,n,0,false ) - insert_node_after(p,p,k) - return head, getnext(n) + return overlay(p,n,false) end end + -- in fact, we could try again later ... so then no remove (a few tries) return remove_node(head, current, true) end +-- This will be replaced after 0.80+ when we have a more robust look-back and +-- can look at the bigger picture. + +-- todo: look back and when a special is there before a list is seen penalty keep ut + +-- we now look back a lot, way too often + local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail if trace then reset_tracing(head) @@ -1052,6 +1124,21 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also -- -- todo: keep_together: between headers -- + local function getpagelist() + if not pagehead then + pagehead = texlists.page_head + if pagehead then + pagehead = tonut(texlists.page_head) + pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet + else + pagetail = nil + end + else + pagetail = nil + end + return pagehead, pagetail + end + -- local function flush(why) if penalty_data then local p = new_penalty(penalty_data) @@ -1068,7 +1155,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also head = insert_node_before(head,current,p) end -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then - properties[p] = { special_penalty = special_penalty or penalty_data } + local props = properties[p] + if props then + props.special_penalty = special_penalty or penalty_data + else + properties[p] = { + special_penalty = special_penalty or penalty_data + } + end -- end end if glue_data then @@ -1089,6 +1183,26 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also penalty_order, penalty_data, natural_penalty = 0, nil, nil parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false end + -- + +-- quick hack, can be done nicer +-- local nobreakfound = nil +-- local function checknobreak() +-- local pagehead, pagetail = getpagelist() +-- local current = pagetail +-- while current do +-- local id = getid(current) +-- if id == hlist_code or id == vlist_code then +-- return false +-- elseif id == penalty_code then +-- return getfield(current,"penalty") >= 10000 +-- end +-- current = getprev(current) +-- end +-- return false +-- end + + -- if trace_vsnapping then report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p", texgetdimen("globalbodyfontstrutheight"), texgetdimen("globalbodyfontstrutdepth"), @@ -1096,9 +1210,15 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also ) end if trace then trace_info("start analyzing",where,what) end + +-- local headprev = getprev(head) + while current do local id = getid(current) if id == hlist_code or id == vlist_code then +-- if nobreakfound == nil then +-- nobreakfound = false +-- end -- needs checking, why so many calls if snap then local list = getlist(current) @@ -1144,6 +1264,17 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also -- natural_penalty = getfield(current,"penalty") -- if trace then trace_done("removed penalty",current) end -- head, current = remove_node(head, current, true) + +-- if nobreakfound == nil then +-- nobreakfound = checknobreak() +-- end +-- if nobreakfound and getfield(current,"penalty") <= 10000 then +-- -- if trace then +-- trace_done("removed penalty",current) +-- -- end +-- head, current = remove_node(head, current, true) +-- end + current = getnext(current) elseif id == kern_code then if snap and trace_vsnapping and getfield(current,"kern") ~= 0 then @@ -1159,7 +1290,8 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also local sp = getattr(current,a_skippenalty) -- has no default, no unset (yet) if sp and sc == penalty then if where == "page" then - local p = specialmethods[specialmethod](current,sp) + local pagehead, pagetail = getpagelist() + local p = specialmethods[specialmethod](pagehead,pagetail,current,sp) if p then if trace then trace_skip("previous special penalty %a is changed to %a using method %a",sp,p,specialmethod) @@ -1167,6 +1299,12 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also special_penalty = sp sp = p end + +-- else +-- if nobreakfound == nil then +-- nobreakfound = checknobreak() +-- end + end if not penalty_data then penalty_data = sp @@ -1176,6 +1314,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also penalty_data = sp end if trace then trace_skip("penalty in skip",sc,so,sp,current) end + +-- if nobreakfound then +-- penalty_data = 10000 +-- if trace then +-- trace_skip("nobreak found before penalty in skip",sc,so,sp,current) +-- end +-- end + head, current = remove_node(head, current, true) elseif not sc then -- if not sc then if glue_data then @@ -1234,6 +1380,8 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also elseif sc == overlay then -- todo (overlay following line over previous if trace then trace_skip("overlay",sc,so,sp,current) end + -- beware: head can actually be after the affected nodes as + -- we look back ... some day head will the real head head, current = check_experimental_overlay(head,current,a_snapmethod) elseif ignore_following then if trace then trace_skip("disabled",sc,so,sp,current) end @@ -1431,9 +1579,16 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also local p = new_penalty(penalty_data) if trace then trace_done("result",p) end head, tail = insert_node_after(head,tail,p) --- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then - properties[p] = { special_penalty = special_penalty or penalty_data } --- end + -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then + local props = properties[p] + if props then + props.special_penalty = special_penalty or penalty_data + else + properties[p] = { + special_penalty = special_penalty or penalty_data + } + end + -- end end if glue_data then if not tail then tail = find_node_tail(head) end @@ -1445,7 +1600,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also else head, tail = insert_node_after(head,tail,glue_data) end -texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler + texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler end if trace then if glue_data or penalty_data then @@ -1456,6 +1611,13 @@ texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevd trace_info("head has been changed from %a to %a",nodecodes[getid(oldhead)],nodecodes[getid(head)]) end end + +-- if headprev then +-- setprev(head,headprev) +-- setnext(headprev,head) +-- end +-- print("C HEAD",tonode(head)) + return head, true end @@ -1576,10 +1738,51 @@ end -- interface -commands.vspacing = vspacing.analyze -commands.vspacingsetamount = vspacing.setskip -commands.vspacingdefine = vspacing.setmap -commands.vspacingcollapse = vspacing.collapsevbox -commands.vspacingsnap = vspacing.snapbox -commands.resetprevdepth = vspacing.resetprevdepth -commands.definesnapmethod = vspacing.definesnapmethod +implement { + name = "vspacing", + actions = vspacing.analyze, + scope = "private", + arguments = "string" +} + +implement { + name = "resetprevdepth", + actions = vspacing.resetprevdepth, + scope = "private" +} + +implement { + name = "vspacingsetamount", + actions = vspacing.setskip, + scope = "private", + arguments = "string", +} + +implement { + name = "vspacingdefine", + actions = vspacing.setmap, + scope = "private", + arguments = { "string", "string" } +} + +implement { + name = "vspacingcollapse", + actions = vspacing.collapsevbox, + scope = "private", + arguments = "integer" +} + +implement { + name = "vspacingsnap", + actions = vspacing.snapbox, + scope = "private", + arguments = { "integer", "integer" } +} + +implement { + name = "definesnapmethod", + actions = vspacing.definesnapmethod, + scope = "private", + arguments = { "string", "string" } +} + diff --git a/Master/texmf-dist/tex/context/base/spac-ver.mkiv b/Master/texmf-dist/tex/context/base/spac-ver.mkiv index 0c84958beb0..e44056954ad 100644 --- a/Master/texmf-dist/tex/context/base/spac-ver.mkiv +++ b/Master/texmf-dist/tex/context/base/spac-ver.mkiv @@ -17,6 +17,8 @@ \registerctxluafile{spac-ver}{1.001} +% todo: use usernodes ? + % todo: itemize : intro ... only when there is one or two lines preceding and then % keep these together i.e. \blank[intro] @@ -120,7 +122,7 @@ \setvalue{\??interlinespacerelative\v!auto }{\let\setrelativeinterlinespace\spac_linespacing_set_relative_interlinespace} \def\spac_linespacing_set_specified_relative_interlinespace#1% fragile? - {\doifdimenstringelse{#1} + {\doifelsedimenstring{#1} {\setupspecifiedinterlinespace[\c!line=#1]} {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}% \spacing\currentrelativeinterlinespace}} @@ -140,6 +142,20 @@ \spacing\currentrelativeinterlinespace \fi} +\unexpanded\def\spac_linespacing_setup_use + {\ifcsname\namedinterlinespacehash\m_spac_interlinespace\s!parent\endcsname + \let\currentinterlinespace\m_spac_interlinespace + \spac_linespacing_setup_specified_interline_space + % \else + % we only support named interlinespaces + \fi} + +\unexpanded\def\useinterlinespaceparameter#1% see footnotes + {\edef\m_spac_interlinespace{#1\c!interlinespace}% + \ifx\m_spac_interlinespace\empty \else + \spac_linespacing_setup_use + \fi} + \newtoks\everysetupglobalinterlinespace \newtoks\everysetuplocalinterlinespace @@ -174,7 +190,7 @@ \fi\fi} \def\spac_linespacing_setup_specified_or_relative[#1]% - {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]% + {\doifelseassignment{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]% \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi} \def\spac_linespacing_synchronize_local % adapts to the font @@ -201,7 +217,7 @@ \fi \popmacro\currentinterlinespace \else - \normalexpanded{\noexpand\doifassignmentelse{\p_spac_checked_interlinespace}% + \normalexpanded{\noexpand\doifelseassignment{\p_spac_checked_interlinespace}% \setupspecifiedinterlinespace\setuprelativeinterlinespace[\p_spac_checked_interlinespace]}% \iflocalinterlinespace \the\everysetuplocalinterlinespace @@ -334,7 +350,7 @@ \let\v_spac_whitespace_current\v!none \unexpanded\def\setupwhitespace - {\doifnextoptionalcselse\spac_whitespace_setup_yes\spac_whitespace_setup_nop} + {\doifelsenextoptionalcs\spac_whitespace_setup_yes\spac_whitespace_setup_nop} \def\spac_whitespace_setup_nop {\ifx\v_spac_whitespace_current\v!none\else @@ -960,6 +976,35 @@ \let\normalstrut\strut +\unexpanded\def\halfstrut + {\relax + \dontleavehmode + \begingroup + \setbox\scratchbox\copy\strutbox + \ht\scratchbox\dimexpr\strutht/\plustwo\relax + \dp\scratchbox\dimexpr\strutdp/\plustwo\relax + \box\scratchbox + \endgroup} + +\unexpanded\def\quarterstrut + {\relax + \dontleavehmode + \begingroup + \setbox\scratchbox\copy\strutbox + \ht\scratchbox\dimexpr\strutht/\plusfour\relax + \dp\scratchbox\dimexpr\strutdp/\plusfour\relax + \box\scratchbox + \endgroup} + +\unexpanded\def\depthstrut + {\relax + \dontleavehmode + \begingroup + \setbox\scratchbox\copy\strutbox + \ht\scratchbox\dimexpr\strutht-\struthtdp/\plustwo\relax % assumes that ht > lineheight/2 + \box\scratchbox + \endgroup} + %D Sometimes a capstrut comes in handy %D %D \starttabulate[|Tl|l|l|] @@ -1032,12 +1077,17 @@ \newbox\nostrutbox \setbox\nostrutbox\emptyhbox +\newtoks\everysetnostrut + \unexpanded\def\setnostrut - {\setbox\strutbox\copy\nostrutbox - \let\strut\empty - \let\endstrut\empty - \let\begstrut\empty - \let\crlfplaceholder\empty} + {\the\everysetnostrut} + +\appendtoks + \setbox\strutbox\copy\nostrutbox + \let\strut\empty + \let\endstrut\empty + \let\begstrut\empty +\to \everysetnostrut % when enabled, sigstruts will remove themselves if nothing % goes inbetween @@ -1167,7 +1217,7 @@ \let\normaloffinterlineskip\offinterlineskip % knuth's original \appendtoks - \ifvmode\ctxcommand{resetprevdepth()}\fi % a nasty hack (tested for a while now) + \ifvmode\clf_resetprevdepth\fi % a nasty hack (tested for a while now) \to \everyafteroutput %D My own one: @@ -1341,7 +1391,7 @@ \unexpanded\def\installsnapvalues#1#2% todo: a proper define {\edef\currentsnapper{#1:#2}% \ifcsname\??gridsnapperattributes\currentsnapper\endcsname \else - \setevalue{\??gridsnapperattributes\currentsnapper}{\ctxcommand{definesnapmethod("#1","#2")}}% + \setevalue{\??gridsnapperattributes\currentsnapper}{\clf_definesnapmethod{#1}{#2}}% \fi \setevalue{\??gridsnappers#1}{\attribute\snapmethodattribute\csname\??gridsnapperattributes\currentsnapper\endcsname\space}} @@ -1410,6 +1460,9 @@ \definegridsnapping[\v!none] [\v!none] \definegridsnapping[\v!line] [\v!line] \definegridsnapping[\v!strut] [\v!strut] +\definegridsnapping[\v!box] [\v!box] % centers a box rounded upwards (box:.5 -> tolerance) +\definegridsnapping[\v!min] [\v!min] % centers a box rounded downwards +\definegridsnapping[\v!max] [\v!max] % centers a box rounded upwards \definegridsnapping[\v!max] [\v!maxdepth,\v!maxheight,\v!strut] \definegridsnapping[\v!min] [\v!mindepth,\v!minheight,\v!strut] @@ -1495,10 +1548,10 @@ \def\spac_grids_snap_to_finish#1% {\ifvbox\nextbox % this will go away - \ctxcommand{vspacingcollapse(\number\nextbox)}% isn't that already done? + \clf_vspacingcollapse\nextbox\relax % isn't that already done? \fi \doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}% - \ctxcommand{vspacingsnap(\number\nextbox,\number\attribute\snapmethodattribute)}% + \clf_vspacingsnap\nextbox\attribute\snapmethodattribute\relax \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% \egroup} @@ -1648,7 +1701,7 @@ \def\spac_vspacing_define_amount[#1][#2][#3]% can be combined {\setvalue{\??vspacingamount#1}{\ifgridsnapping#3\else#2\fi}% - \ctxcommand{vspacingsetamount("#1")}} + \clf_vspacingsetamount{#1}} % \installcorenamespace{vspacingamountnormal} % \installcorenamespace{vspacingamountgrid} @@ -1660,13 +1713,13 @@ % \fi % \csname n>#1\endcsname{#2}% % \csname g>#1\endcsname{#3}% -% \ctxcommand{vspacingsetamount("#1")}} +% \clf_vspacingsetamount{#1}} \unexpanded\def\definevspacing {\dodoubleempty\spac_vspacing_define} \def\spac_vspacing_define[#1][#2]% - {\ctxcommand{vspacingdefine("#1","#2")}} + {\clf_vspacingdefine{#1}{#2}} %D The injector code (generated at the \LUA\ end): @@ -1767,7 +1820,7 @@ % The main spacer: \unexpanded\def\vspacing - {\doifnextoptionalcselse\spac_vspacing_yes\spac_vspacing_nop} + {\doifelsenextoptionalcs\spac_vspacing_yes\spac_vspacing_nop} \def\spac_vspacing_yes {\ifinpagebody % somewhat weird @@ -1788,21 +1841,21 @@ \fi\fi} \def\spac_vspacing_yes_indeed[#1]% - {\ifmmode\else\par\ctxcommand{vspacing("#1")}\fi} + {\ifmmode\else\par\clf_vspacing{#1}\fi} \def\spac_vspacing_yes_ignore[#1]% {\ifmmode\else\par\fi} \def\spac_vspacing_nop_indeed - {\ifmmode\else\par\ctxcommand{vspacing("\currentvspacing")}\fi} + {\ifmmode\else\par\clf_vspacing{\currentvspacing}\fi} \def\spac_vspacing_nop_ignore {\ifmmode\else\par\fi} \def\directvspacing#1% - {\par\ctxcommand{vspacing("#1")}} + {\par\clf_vspacing{#1}} -% handy (and faste): +% handy (and faster): \unexpanded\def\directvpenalty#1% {\begingroup @@ -1823,7 +1876,7 @@ % these depend on bigskipamount cum suis so we'd better sync them \unexpanded\def\setupvspacing - {\doifnextoptionalcselse\setupvspacing_yes\setupvspacing_nop} + {\doifelsenextoptionalcs\setupvspacing_yes\setupvspacing_nop} \let\currentvspacing\s!default % hm, default, standard ... @@ -1876,6 +1929,21 @@ \fi\fi \relax} +% used in itemize ... always test this + +\newdimen\d_spac_overlay + +\def\spac_overlay_lines + {\blank[\v!back,\v!overlay]% + \nointerlineskip} + +% \startitemize[n] +% \item \input zapf +% \item \startitemize[a] +% \item \input knuth +% \stopitemize +% \stopitemize +% % \strut \hfill first line \blank[overlay] second line \hfill \strut % % \ruledvbox { @@ -1883,6 +1951,9 @@ % line 2 \hfill \strut \blank[overlay] % \strut \hfill line 3 \hfill \strut % } +% +% \dorecurse{50} +% {\startitemize[n] \startitem \startitemize[a] \item #1 \stopitemize \stopitem \stopitemize} \definevspacing[\v!preference][penalty:-500] % goodbreak \definevspacing[\v!samepage] [penalty:10000] % nobreak @@ -1893,7 +1964,7 @@ \definevspacing[\v!back] [category:7] % together [category:8] \definevspacing[\v!overlay] [category:9] -\definevspacing[\v!always] [category:0] +\definevspacing[\v!always] [category:0] % hm, internally it's discard \definevspacing[\v!weak] [order:0] \definevspacing[\v!strong] [order:100] @@ -1920,8 +1991,20 @@ %D \type {\blank} (we needed the first one while playing with the %D new code). +% We keep this one as reference +% +% \unexpanded\def\inhibitblank +% {\vspacing[\v!disable]} +% +% but use the following more efficient variant instead: + \unexpanded\def\inhibitblank - {\vspacing[\v!disable]} % can be made faster + {\ifvmode + \begingroup + \attribute\skipcategoryattribute\plusfive + \vskip\zeropoint + \endgroup + \fi} \let\doinhibitblank\inhibitblank % keep this command, used in styles @@ -2006,7 +2089,7 @@ \let\m_spac_hanging_location\empty \def\spac_hanging_start[#1]% - {\doifassignmentelse{#1} + {\doifelseassignment{#1} {\let\m_spac_hanging_location\empty \setupcurrenthanging[#1]}% {\edef\m_spac_hanging_location{#1}}% @@ -2135,7 +2218,7 @@ % as encountered in forced blank skips (see lua code) % % \appendtoks -% \ifvmode\ctxcommand{resetprevdepth()}\fi +% \ifvmode\clf_resetprevdepth\fi % \to \everyafteroutput % % this should only happen when there is nothing left over (how to detemine that) .. testcase: diff --git a/Master/texmf-dist/tex/context/base/status-files.pdf b/Master/texmf-dist/tex/context/base/status-files.pdf index 24b73242775..dc228ad8ae4 100644 Binary files a/Master/texmf-dist/tex/context/base/status-files.pdf and b/Master/texmf-dist/tex/context/base/status-files.pdf differ diff --git a/Master/texmf-dist/tex/context/base/status-lua.pdf b/Master/texmf-dist/tex/context/base/status-lua.pdf index f6ca96bc3cd..02c9447e819 100644 Binary files a/Master/texmf-dist/tex/context/base/status-lua.pdf and b/Master/texmf-dist/tex/context/base/status-lua.pdf differ diff --git a/Master/texmf-dist/tex/context/base/status-mkiv.lua b/Master/texmf-dist/tex/context/base/status-mkiv.lua index 07e912a88ba..45c2822565b 100644 --- a/Master/texmf-dist/tex/context/base/status-mkiv.lua +++ b/Master/texmf-dist/tex/context/base/status-mkiv.lua @@ -320,7 +320,6 @@ return { }, { category = "mkiv", - comment = "maybe this becomes a runtime module", filename = "toks-ini", loading = "always", status = "okay", @@ -392,6 +391,12 @@ return { loading = "always", status = "okay", }, + { + category = "mkiv", + filename = "typo-sus", + loading = "always", + status = "okay", + }, { category = "mkiv", filename = "node-pag", @@ -540,6 +545,12 @@ return { loading = "always", status = "okay", }, + { + category = "mkiv", + filename = "lang-hyp", + loading = "always", + status = "okay", + }, { category = "mkiv", filename = "unic-ini", @@ -613,6 +624,12 @@ return { loading = "always", status = "okay", }, + { + category = "mkiv", + filename = "lang-hyp", + loading = "always", + status = "okay", + }, { category = "mkiv", filename = "lang-frq", @@ -2558,6 +2575,12 @@ return { loading = "always", status = "pending", }, + { + category = "mkiv", + filename = "publ-jrn", + loading = "always", + status = "pending", + }, { category = "mkiv", filename = "publ-xml", @@ -3488,6 +3511,18 @@ return { loading = "lang-def", status = "okay", }, + { + category = "lua", + filename = "lang-dis", + loading = "lang-ini", + status = "okay", + }, + { + category = "lua", + filename = "lang-hyp", + loading = "lang-hyp", + status = "okay", + }, { category = "lua", filename = "lang-ini", @@ -3500,6 +3535,12 @@ return { loading = "lang-lab", status = "okay", }, + { + category = "lua", + filename = "lang-hyp", + loading = "lang-hyp", + status = "okay", + }, { category = "lua", filename = "lang-txt", @@ -4716,7 +4757,14 @@ return { { category = "lua", filename = "toks-ini", - status = "todo", + loading = "toks-ini", + status = "okay", + }, + { + category = "lua", + filename = "toks-scn", + loading = "toks-ini", + status = "okay", }, { category = "lua", @@ -4818,6 +4866,11 @@ return { filename = "typo-bld", status = "todo", }, + { + category = "lua", + filename = "typo-sus", + status = "okay", + }, { category = "lua", filename = "typo-brk", @@ -4905,6 +4958,11 @@ return { filename = "typo-fln", status = "okay", }, + { + category = "lua", + filename = "typo-man", + status = "todo", + }, { category = "lua", filename = "typo-prc", @@ -5086,6 +5144,12 @@ return { loading = "publ-ini.mkiv", status = "pending", }, + { + category = "lua", + filename = "publ-fnd", + loading = "publ-ini.mkiv", + status = "pending", + }, { category = "lua", filename = "publ-tra", diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.lua b/Master/texmf-dist/tex/context/base/strc-bkm.lua index c38ab3c2e8c..1ff75aa5f72 100644 --- a/Master/texmf-dist/tex/context/base/strc-bkm.lua +++ b/Master/texmf-dist/tex/context/base/strc-bkm.lua @@ -13,14 +13,15 @@ if not modules then modules = { } end modules ['strc-bkm'] = { -- we should hook the placement into everystoptext ... needs checking -local format, concat, gsub = string.format, table.concat, string.gsub +-- todo: make an lpeg for stripped + +local next, type = next, type +local gsub, lower = string.gsub, string.lower +local concat = table.concat local utfvalues = utf.values local settings_to_hash = utilities.parsers.settings_to_hash -local codeinjections = backends.codeinjections - -local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end) - +local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end) local report_bookmarks = logs.reporter("structure","bookmarks") local structures = structures @@ -30,13 +31,17 @@ structures.bookmarks = structures.bookmarks or { } local bookmarks = structures.bookmarks local sections = structures.sections local lists = structures.lists - local levelmap = sections.levelmap local variables = interfaces.variables +local implement = interfaces.implement +local codeinjections = backends.codeinjections -bookmarks.method = "internal" -- or "page" +bookmarks.method = "internal" -- or "page" -local names, opened, forced, numbered = { }, { }, { }, { } +local names = { } +local opened = { } +local forced = { } +local numbered = { } function bookmarks.register(settings) local force = settings.force == variables.yes @@ -78,8 +83,13 @@ function bookmarks.overload(name,text) end end if ls then - ls.titledata.bookmark = text + local titledata = ls.titledata + if titledata then + titledata.bookmark = text + end end + -- last resort + -- context.writetolist({name},text,"") end local function stripped(str) -- kind of generic @@ -101,54 +111,6 @@ function bookmarks.setup(spec) end end --- function bookmarks.place() --- if next(names) then --- local list = lists.filtercollected(names,"all",nil,lists.collected,forced) --- if #list > 0 then --- local levels, noflevels, lastlevel = { }, 0, 1 --- for i=1,#list do --- local li = list[i] --- local metadata = li.metadata --- local name = metadata.name --- if not metadata.nolist or forced[name] then -- and levelmap[name] then --- local titledata = li.titledata --- if titledata then --- local structural = levelmap[name] --- lastlevel = structural or lastlevel --- local title = titledata.bookmark --- if not title or title == "" then --- -- We could typeset the title and then convert it. --- if not structural then --- -- placeholder, todo: bookmarklabel --- title = name .. ": " .. (titledata.title or "?") --- else --- title = titledata.title or "?" --- end --- end --- if numbered[name] then --- local sectiondata = sections.collected[li.references.section] --- local numberdata = li.numberdata --- if sectiondata and numberdata and not numberdata.hidenumber then --- -- we could typeset the number and convert it --- title = concat(sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata)) .. " " .. title --- end --- end --- noflevels = noflevels + 1 --- levels[noflevels] = { --- lastlevel, --- stripped(title), -- can be replaced by converter --- li.references, -- has internal and realpage --- allopen or opened[name] --- } --- end --- end --- end --- bookmarks.finalize(levels) --- end --- function bookmarks.place() end -- prevent second run --- end --- end - function bookmarks.place() if next(names) then local levels = { } @@ -157,26 +119,51 @@ function bookmarks.place() local nofblocks = #lists.sectionblocks -- always >= 1 local showblocktitle = toboolean(numberspec.showblocktitle,true) for i=1,nofblocks do - local block = lists.sectionblocks[i] + local block = lists.sectionblocks[i] local blockdone = nofblocks == 1 - local list = lists.filtercollected(names,block..":all",nil,lists.collected,forced) + local list = lists.filter { + names = names, + criterium = block .. ":all", + forced = forced, + } for i=1,#list do local li = list[i] local metadata = li.metadata local name = metadata.name if not metadata.nolist or forced[name] then -- and levelmap[name] then local titledata = li.titledata + -- + if not titledata then + local userdata = li.userdata + if userdata then + local first = userdata.first + local second = userdata.second + if first then + if second then + titledata = { title = first .. " " .. second } + else + titledata = { title = first } + end + else + titledata = { title = second } + end + end + end + -- if titledata then if not blockdone then if showblocktitle then -- add block entry local blockdata = sections.sectionblockdata[block] noflevels = noflevels + 1 + local references = li.references levels[noflevels] = { - 1, -- toplevel - stripped(blockdata.bookmark ~= "" and blockdata.bookmark or block), - li.references, - allopen or opened[name] -- same as first entry + level = 1, -- toplevel + title = stripped(blockdata.bookmark ~= "" and blockdata.bookmark or block), + reference = references, + opened = allopen or opened[name], -- same as first entry + realpage = references and references.realpage or 0, -- handy for later + usedpage = true, } end blockdone = true @@ -190,27 +177,36 @@ function bookmarks.place() local title = titledata.bookmark if not title or title == "" then -- We could typeset the title and then convert it. - if not structural then - -- placeholder, todo: bookmarklabel - title = name .. ": " .. (titledata.title or "?") - else + -- if not structural then + -- title = titledata.title or "?") + -- else title = titledata.title or "?" - end + -- end end if numbered[name] then local sectiondata = sections.collected[li.references.section] local numberdata = li.numberdata - if sectiondata and numberdata and not numberdata.hidenumber then + if sectiondata and numberdata then + if not numberdata.hidenumber then -- we could typeset the number and convert it - title = concat(sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata)) .. " " .. title + local number = sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata) + if number and #number > 0 then + title = concat(number) .. " " .. title + end + end end end noflevels = noflevels + 1 + local references = li.references levels[noflevels] = { - lastlevel, - stripped(title), -- can be replaced by converter - li.references, -- has internal and realpage - allopen or opened[name] + level = lastlevel, + title = stripped(title), -- can be replaced by converter + reference = references, -- has internal and realpage + opened = allopen or opened[name], + realpage = references and references.realpage or 0, -- handy for later + usedpage = true, + structural = structural, + name = name, } end end @@ -222,47 +218,296 @@ function bookmarks.place() end function bookmarks.flatten(levels) + if not levels then + -- a plugin messed up + return { } + end -- This function promotes leading structurelements with a higher level -- to the next lower level. Such situations are the result of lack of -- structure: a subject preceding a chapter in a sectionblock. So, the -- following code runs over section blocks as well. (bookmarks-007.tex) local noflevels = #levels if noflevels > 1 then - local skip, start, one = false, 1, levels[1] - local first, block = one[1], one[3].block + local function showthem() + for i=1,noflevels do + local level = levels[i] + -- if level.structural then + -- report_bookmarks("%i > %s > %s",level.level,level.reference.block,level.title) + -- else + report_bookmarks("%i > %s > %s > %s",level.level,level.reference.block,level.name,level.title) + -- end + end + end + if trace_bookmarks then + report_bookmarks("checking structure") + showthem() + end + local skip = false + local done = 0 + local start = 1 + local one = levels[1] + local first = one.level + local block = one.reference.block for i=2,noflevels do - local li = levels[i] - local new, newblock = li[1], li[3].block + local current = levels[i] + local new = current.level + local reference = current.reference + local newblock = type(reference) == "table" and current.reference.block or block if newblock ~= block then - first, block, start, skip = new, newblock, i, false + first = new + block = newblock + start = i + skip = false elseif skip then -- go on elseif new > first then skip = true elseif new < first then for j=start,i-1 do - local lj = levels[j] - local old = lj[1] - lj[1] = new + local previous = levels[j] + local old = previous.level + previous.level = new if trace_bookmarks then - report_bookmarks("promoting entry %a from level %a to %a: %s",j,old,new,lj[2]) + report_bookmarks("promoting entry %a from level %a to %a: %s",j,old,new,previous.title) end + done = done + 1 end skip = true end end + if trace_bookmarks then + if done > 0 then + report_bookmarks("%a entries promoted") + showthem() + else + report_bookmarks("nothing promoted") + end + end + end + return levels +end + +local extras = { } +local lists = { } +local names = { } + +bookmarks.extras = extras + +local function cleanname(name) + return lower(file.basename(name)) +end + +function extras.register(name,levels) + if name and levels then + name = cleanname(name) + local found = names[name] + if found then + lists[found].levels = levels + else + lists[#lists+1] = { + name = name, + levels = levels, + } + names[name] = #lists + end + end +end + +function extras.get(name) + if name then + local found = names[cleanname(name)] + if found then + return lists[found].levels + end + else + return lists + end +end + +function extras.reset(name) + local l, n = { }, { } + if name then + name = cleanname(name) + for i=1,#lists do + local li = lists[i] + local ln = li.name + if name == ln then + -- skip + else + local m = #l + 1 + l[m] = li + n[ln] = m + end + end + end + lists, names = l, n +end + +local function checklists() + for i=1,#lists do + local levels = lists[i].levels + for j=1,#levels do + local entry = levels[j] + local pageindex = entry.pageindex + if pageindex then + entry.reference = figures.getrealpage(pageindex) + entry.pageindex = nil + end + end end end +function extras.tosections(levels) + local sections = { } + local noflists = #lists + for i=1,noflists do + local levels = lists[i].levels + local data = { } + sections[i] = data + for j=1,#levels do + local entry = levels[j] + if entry.usedpage then + local section = entry.section + local d = data[section] + if d then + d[#d+1] = entry + else + data[section] = { entry } + end + end + end + end + return sections +end + +function extras.mergesections(levels,sections) + if not sections or #sections == 0 then + return levels + elseif not levels then + return { } + else + local merge = { } + local noflists = #lists + if #levels == 0 then + local level = 0 + local section = 0 + for i=1,noflists do + local entries = sections[i][0] + if entries then + for i=1,#entries do + local entry = entries[i] + merge[#merge+1] = entry + entry.level = entry.level + level + end + end + end + else + for j=1,#levels do + local entry = levels[j] + merge[#merge+1] = entry + local section = entry.reference.section + local level = entry.level + entry.section = section -- for tracing + for i=1,noflists do + local entries = sections[i][section] + if entries then + for i=1,#entries do + local entry = entries[i] + merge[#merge+1] = entry + entry.level = entry.level + level + end + end + end + end + end + return merge + end +end + +function bookmarks.merge(levels,mode) + return extras.mergesections(levels,extras.tosections()) +end + +local sequencers = utilities.sequencers +local appendgroup = sequencers.appendgroup +local appendaction = sequencers.appendaction + +local bookmarkactions = sequencers.new { + arguments = "levels,method", + returnvalues = "levels", + results = "levels", +} + +appendgroup(bookmarkactions,"before") -- user +appendgroup(bookmarkactions,"system") -- private +appendgroup(bookmarkactions,"after" ) -- user + +appendaction(bookmarkactions,"system",bookmarks.flatten) +appendaction(bookmarkactions,"system",bookmarks.merge) + function bookmarks.finalize(levels) - -- This function can be overloaded by an optional converter - -- that uses nodes.toutf on a typeset stream. This is something - -- that we will support when the main loop has become a coroutine. - codeinjections.addbookmarks(levels,bookmarks.method) + local method = bookmarks.method or "internal" + checklists() -- so that plugins have the adapted page number + levels = bookmarkactions.runner(levels,method) + if levels and #levels > 0 then + -- normally this is not needed + local purged = { } + for i=1,#levels do + local l = levels[i] + if l.usedpage ~= false then + purged[#purged+1] = l + end + end + -- + codeinjections.addbookmarks(purged,method) + else + -- maybe a plugin messed up + end +end + +function bookmarks.installhandler(what,where,func) + if not func then + where, func = "after", where + end + if where == "before" or where == "after" then + sequencers.appendaction(bookmarkactions,where,func) + else + report_tex("installing bookmark %a handlers in %a is not possible",what,tostring(where)) + end end -- interface -commands.overloadbookmark = bookmarks.overload -commands.registerbookmark = bookmarks.register -commands.setupbookmarks = bookmarks.setup +implement { + name = "setupbookmarks", + actions = bookmarks.setup, + arguments = { + { + { "separatorset" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + { "segments" }, + { "showblocktitle" }, + } + } +} + +implement { + name = "registerbookmark", + actions = bookmarks.register, + arguments = { + { + { "names" }, + { "opened" }, + { "force" }, + { "number" }, + } + } +} + +implement { + name = "overloadbookmark", + actions = bookmarks.overload, + arguments = { "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv index 9d2ebd796c6..9688a1f93b1 100644 --- a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv @@ -74,7 +74,11 @@ \def\strc_bookmarks_bookmark_yes[#1]#2% {\begingroup \simplifycommands - \ctxcommand{overloadbookmark("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}% + \ifnum\thenamedheadlevel{#1}>\zerocount + \clf_overloadbookmark{#1}{\detokenize\expandafter{\normalexpanded{#2}}}% + \else + \strc_lists_write_to[#1][]{#2}{}% todo: a dedicated bookmark writer + \fi \endgroup} \def\strc_bookmarks_bookmark_nop[#1]#2% @@ -106,27 +110,59 @@ \ifthirdargument \setupcurrentbookmark[#3]% no every so not all possible \else\ifsecondargument - \doifassignmentelse{#2}{\let\m_bookmarks_opened\empty\setupcurrentbookmark[#2]}\donothing + \doifelseassignment{#2}{\let\m_bookmarks_opened\empty\setupcurrentbookmark[#2]}\donothing \fi\fi - \ctxcommand{registerbookmark { - names = "\m_bookmarks_names", - opened = "\m_bookmarks_opened", - force = "\bookmarkparameter\c!force", - number = "\bookmarkparameter\c!number", - }}% + \clf_registerbookmark + names {\m_bookmarks_names}% + opened {\m_bookmarks_opened}% + force {\bookmarkparameter\c!force}% + number {\bookmarkparameter\c!number}% + \relax \endgroup} \appendtoks - \ctxcommand{setupbookmarks { - separatorset = "\bookmarkparameter\c!numberseparatorset", - conversionset = "\bookmarkparameter\c!numberconversionset", - starter = \!!bs\bookmarkparameter\c!numberstarter\!!es, - stopper = \!!bs\bookmarkparameter\c!numberstopper\!!es, - segments = "\bookmarkparameter\c!numbersegments", - showblocktitle = "\bookmarkparameter\c!sectionblock", - }}% + \clf_setupbookmarks + separatorset {\bookmarkparameter\c!numberseparatorset}% + conversionset {\bookmarkparameter\c!numberconversionset}% + starter {\bookmarkparameter\c!numberstarter}% + stopper {\bookmarkparameter\c!numberstopper}% + segments {\bookmarkparameter\c!numbersegments}% + showblocktitle {\bookmarkparameter\c!sectionblock}% + \relax \to \everysetupbookmark +%D There is a plugin mechanism but this is for experts only. The intermediate +%D data structures are stable. +%D +%D \starttyping +%D \startluacode +%D structures.bookmarks.installhandler("check before","before",function(levels) +%D logs.report("extra bookmarks","before (normal bookmarks)") +%D inspect(levels) +%D logs.report("extra bookmarks","before (extra bookmarks)") +%D inspect(structures.bookmarks.extras.get()) +%D return levels +%D end) +%D structures.bookmarks.installhandler("check after", "after", function(levels) +%D logs.report("extra bookmarks","after (merged bookmarks)") +%D inspect(levels) +%D return levels +%D end) +%D \stopluacode +%D \starttyping +%D +%D This mechanism was added when bookmark inclusion became (optional) part of graphic +%D inclusion (which is needed by Taco). +%D +%D \starttyping +%D \getfiguredimensions[somefile.pdf] +%D \dorecurse {\noffigurepages} { +%D \startTEXpage +%D \externalfigure[somefile.pdf][interaction=bookmark,page=\recurselevel] +%D \stopTEXpage +%D } +%D \starttyping + \protect \endinput % \starttext diff --git a/Master/texmf-dist/tex/context/base/strc-blk.lua b/Master/texmf-dist/tex/context/base/strc-blk.lua index ce3304d59af..0ababcfc09c 100644 --- a/Master/texmf-dist/tex/context/base/strc-blk.lua +++ b/Master/texmf-dist/tex/context/base/strc-blk.lua @@ -16,6 +16,8 @@ local allocate = utilities.storage.allocate local context = context local commands = commands +local implement = interfaces.implement + local structures = structures structures.blocks = structures.blocks or { } @@ -78,13 +80,19 @@ end function blocks.select(state,name,tag,criterium) criterium = criterium or "text" - if find(tag,"=",1,true) then tag = "" end - local names = settings_to_set(name) - local all = tag == "" - local tags = not all and settings_to_set(tag) - local hide = state == "process" - local n = sections.numberatdepth(criterium) - local result = lists.filtercollected("all", criterium, n, collected, { }) + if find(tag,"=",1,true) then + tag = "" + end + local names = settings_to_set(name) + local all = tag == "" + local tags = not all and settings_to_set(tag) + local hide = state == "process" + local result = lists.filter { + names = "all", + criterium = criterium, + number = sections.numberatdepth(criterium), -- not needed + collected = collected, + } for i=1,#result do local ri = result[i] local metadata = ri.metadata @@ -148,8 +156,7 @@ end -- interface - -commands.definestructureblock = blocks.define -commands.savestructureblock = blocks.save -commands.selectstructureblock = blocks.select -commands.setstructureblockstate = blocks.setstate +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" } } diff --git a/Master/texmf-dist/tex/context/base/strc-blk.mkiv b/Master/texmf-dist/tex/context/base/strc-blk.mkiv index bceb66beb1a..fe259d223ce 100644 --- a/Master/texmf-dist/tex/context/base/strc-blk.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-blk.mkiv @@ -33,7 +33,7 @@ \installcommandhandler \??block {block} \??block \appendtoks - \ctxcommand{definestructureblock("\currentblock")}% + \clf_definestructureblock{\currentblock}% \setuevalue{\e!begin\currentblock}{\dodoubleempty\strc_blocks_begin[\currentblock]}% \setuevalue{\e!end \currentblock}{}% \to \everydefineblock @@ -41,7 +41,7 @@ \unexpanded\def\strc_blocks_begin[#1][#2]% {\normalexpanded{\buff_pickup{@block@}{\e!begin#1}{\e!end#1}} {}% before - {\ctxcommand{savestructureblock("#1","#2","@block@")}}% + {\clf_savestructureblock{#1}{#2}{@block@}}% \plusone}% after \let\strc_blocks_setup\relax @@ -72,17 +72,17 @@ \egroup} \def\strc_blocks_set_state[#1][#2][#3]% state name tag - {\ctxcommand{setstructureblockstate("#1","#2","#3")}} + {\clf_setstructureblockstate{#1}{#2}{#3}} \def\strc_blocks_select[#1][#2][#3][#4]% state name tag setups {\bgroup - \doifassignmentelse{#3} + \doifelseassignment{#3} {\getparameters[\??blocktemp][\c!criterium=\v!text,#3]% \def\strc_blocks_setup{\setupcurrentblock[#3]}% - \ctxcommand{selectstructureblock("#1","#2","","\csname\??blocktemp\c!criterium\endcsname")}} + \clf_selectstructureblock{#1}{#2}{}{\csname\??blocktemp\c!criterium\endcsname}} {\getparameters[\??blocktemp][\c!criterium=\v!text,#4]% \def\strc_blocks_setup{\setupcurrentblock[#4]}% - \ctxcommand{selectstructureblock("#1","#2","#3","\csname\??blocktemp\c!criterium\endcsname")}}% + \clf_selectstructureblock{#1}{#2}{#3}{\csname\??blocktemp\c!criterium\endcsname}}% \egroup} % hide : save, if [+] also hidden execute diff --git a/Master/texmf-dist/tex/context/base/strc-con.mkvi b/Master/texmf-dist/tex/context/base/strc-con.mkvi index 1862b00a6fd..11f6f758e0e 100644 --- a/Master/texmf-dist/tex/context/base/strc-con.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-con.mkvi @@ -159,6 +159,7 @@ \unexpanded\def\strc_constructions_initialize#1% class instance {\edef\currentconstruction{#1}% + \let\currentconstructionhash\??construction \let\currentconstructionlistentry\!!zerocount \expandafter\let\expandafter\currentconstructionmain \csname\??constructionmain \currentconstruction\endcsname \expandafter\let\expandafter\currentconstructionlevel \csname\??constructionlevel\currentconstruction\endcsname @@ -214,7 +215,7 @@ \constructionparameter\c!headcommand {\strut \constructionparameter\c!text - \ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}}% + \clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax}% \endgroup} \unexpanded\def\strc_constructions_stored_start @@ -262,10 +263,14 @@ \def\strc_constructions_ignore_head {\constructionsheaddistance\zeropoint - \constructionsheadwidth \zeropoint} + \constructionsheadwidth \zeropoint + % we also need to make sure that no stretch creeps in (new per 2015-02-02, for Alan) + \settrue\c_strc_constructions_distance_none} + +\let\currentconstructionhash\??construction \unexpanded\setvalue{\??constructionstarthandler\v!construction}% this will be redone (reorganized) .. too much boxing - {\dostarttagged\t!construction\currentconstruction + {\dostarttaggedchained\t!construction\currentconstruction\currentconstructionhash \dotagsetconstruction \constructionparameter\c!before \begingroup @@ -322,7 +327,7 @@ \else \strc_constructions_preroll_head\currentconstructionsample \ifzeropt\wd\constructionheadbox - \strc_constructions_ignore_head + \strc_constructions_ignore_head \else \strc_constructions_set_width_and_distance \fi @@ -352,10 +357,6 @@ \ifx\p_strc_constructions_align\empty \else \setupalign[\p_strc_constructions_align]% \use... \fi - \edef\p_strc_constructions_indenting{\constructionparameter\c!indenting}% - \ifx\p_strc_constructions_indenting\empty \else - \indenting[\p_strc_constructions_indenting]% \use... - \fi \ifcase\c_strc_constructions_nested_state \c_strc_constructions_nested_state\plusone \or @@ -366,6 +367,11 @@ \edef\p_strc_constructions_headalign{\constructionparameter\c!headalign}% % \directsetup\p_strc_constructions_renderingsetup\relax + % moved to here 2014-07-03 + \edef\p_strc_constructions_indenting{\constructionparameter\c!indenting}% + \ifx\p_strc_constructions_indenting\empty \else + \indenting[\p_strc_constructions_indenting]% \use... + \fi % \dostoptagged % tag \dostarttagged\t!constructioncontent\empty @@ -502,7 +508,7 @@ \setupalign[\p_strc_constructions_headalign]% use fast one \fi \ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox}% -\setbox\constructionheadbox\hbox{\box\constructionheadbox}% needed in case of e.g. a real big head font, see descriptions-006.tex + \setbox\constructionheadbox\hbox{\box\constructionheadbox}% needed in case of e.g. a real big head font, see descriptions-006.tex \ht\constructionheadbox\strutht \dp\constructionheadbox\strutdp} @@ -526,9 +532,14 @@ % The setups. These only deal with placement of the descriptor and initializing the % environment. The wrapping happens elsewhere. +% todo: optimize the setups with +% +% \ifconditional\c_strc_constructions_distance_none : no need for skip +% \ifzeropt\wd\constructionheadbox : no need for box and skips + \startsetups[\??constructionrenderings:\v!left] \edef\p_strc_constructions_hang{\constructionparameter\c!hang}% - \doifsetupselse{\??constructionrenderings:\v!left:\p_strc_constructions_hang} { + \doifelsesetups{\??constructionrenderings:\v!left:\p_strc_constructions_hang} { \directsetup{\??constructionrenderings:\v!left:\p_strc_constructions_hang} } { \directsetup{\??constructionrenderings:\v!left:\v!hanging} @@ -537,7 +548,7 @@ \startsetups[\??constructionrenderings:\v!right] \edef\p_strc_constructions_hang{\constructionparameter\c!hang} - \doifsetupselse{\??constructionrenderings:\v!right:\p_strc_constructions_hang} { + \doifelsesetups{\??constructionrenderings:\v!right:\p_strc_constructions_hang} { \directsetup{\??constructionrenderings:\v!right:\p_strc_constructions_hang} } { \directsetup{\??constructionrenderings:\v!right:\v!hanging} @@ -556,6 +567,7 @@ \copy\constructionheadbox\hss } } + \nobreak \useconstructionstyleandcolor\c!style\c!color \ignorespaces \stopsetups @@ -580,6 +592,7 @@ \copy\constructionheadbox \hskip\rightconstructionskip } + \nobreak \advance\rightskip \constructionsheaddistance \useconstructionstyleandcolor\c!style\c!color \ignorespaces @@ -634,6 +647,7 @@ \box\constructionheadbox } } + \nobreak \useconstructionstyleandcolor\c!style\c!color \ignorespaces \stopsetups @@ -653,6 +667,7 @@ } } } + \nobreak \useconstructionstyleandcolor\c!style\c!color \ignorespaces \stopsetups @@ -730,7 +745,7 @@ \startsetups[\??constructionrenderings:\v!serried] \edef\p_strc_constructions_width{\constructionparameter\c!width}% CHECK ! ! ! wrong parameter namespace - \doifsetupselse{\??constructionrenderings:\v!serried:\p_strc_constructions_width} { + \doifelsesetups{\??constructionrenderings:\v!serried:\p_strc_constructions_width} { \directsetup{\??constructionrenderings:\v!serried:\p_strc_constructions_width} } { \directsetup{\??constructionrenderings:\v!serried:\v!wide} @@ -741,7 +756,7 @@ \let\\=\crlf \noindent \ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox % why copy? leftover? - \penalty\plustenthousand % new + \nobreak \hskip\constructionsheaddistance\relax \useconstructionstyleandcolor\c!style\c!color \ignorespaces @@ -752,8 +767,8 @@ \noindent \ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox % why copy? leftover? \ifconditional\c_strc_constructions_distance_none \else - \penalty\plustenthousand % new - \hskip\constructionsheaddistance \!!plus .5\constructionsheaddistance \!!minus .25\constructionsheaddistance\relax + \nobreak + \hskip\constructionsheaddistance \!!plus .5\constructionsheaddistance \!!minus .25\constructionsheaddistance\relax \fi \useconstructionstyleandcolor\c!style\c!color \ignorespaces @@ -770,6 +785,7 @@ \ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox \hss } + \nobreak \hskip\constructionsheaddistance\relax \useconstructionstyleandcolor\c!style\c!color \ignorespaces @@ -845,7 +861,7 @@ \let\currentconstructionlistentry\!!zerocount \def\strc_constructions_register - {\ctxcommand{doiflisthasentry(\currentconstructionlistentry)}% + {\clf_doifelselisthasentry\numexpr\currentconstructionlistentry\relax \strc_constructions_register_nop \strc_constructions_register_yes} @@ -858,7 +874,7 @@ \def\strc_constructions_discard {\iftrialtypesetting % \writestatus{constructions}{discarding \currentconstruction: \number\currentconstructionlistentry}% - \ctxcommand{discardfromlist(\currentconstructionlistentry)}% + \clf_discardfromlist\currentconstructionlistentry\relax \fi} \let\currentconstructionlistnumber \!!zerocount @@ -928,59 +944,63 @@ \else \setnextinternalreferences{construction}\currentconstructionmain % plural \relax - \scratchcounter\ctxcommand{addtolist{ % we can set a counter at the lua end - metadata = { - kind = "construction", - name = "\currentconstructionmain", - level = structures.sections.currentlevel(), - catcodes = \the\catcodetable, - % \currentdirectionparameters - }, - references = { - internal = \nextinternalreference, - order = \nextinternalorderreference, - reference = "\currentconstructionreference", - referenceprefix = "\referenceprefix", - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - titledata = { - label = \!!bs\detokenize\expandafter{\currentconstructionlabel }\!!es, - title = \!!bs\detokenize\expandafter{\currentconstructiontitle }\!!es, + \scratchcounter\clf_addtolist + metadata { + kind {construction} + name {\currentconstructionmain} + % level structures.sections.currentlevel() + catcodes \catcodetable + % \currentdirectionparameters + } + references { + internal \nextinternalreference + order \nextinternalorderreference + reference {\currentconstructionreference} + prefix {\referenceprefix} + % block {\currentsectionblock} + % section structures.sections.currentid(), + } + titledata { + label {\detokenize\expandafter{\currentconstructionlabel}} + title {\detokenize\expandafter{\currentconstructiontitle}} \ifx\currentconstructionbookmark\currentconstructiontitle \else - bookmark = \!!bs\detokenize\expandafter{\currentconstructionbookmark}\!!es, + bookmark {\detokenize\expandafter{\currentconstructionbookmark}} \fi \ifx\currentconstructionlist\currentconstructiontitle \else - list = \!!bs\detokenize\expandafter{\currentconstructionlist }\!!es, + list {\detokenize\expandafter{\currentconstructionlist}} \fi - }, + } \ifconditional\c_strc_constructions_number_state - prefixdata = { - prefix = "\constructionparameter\c!prefix", - separatorset = "\constructionparameter\c!prefixseparatorset", - conversion = \!!bs\constructionparameter\c!prefixconversion\!!es, - conversionset = "\constructionparameter\c!prefixconversionset", - set = "\constructionparameter\c!prefixset", - segments = "\constructionparameter\c!prefixsegments", - connector = \!!bs\constructionparameter\c!prefixconnector\!!es, - }, - numberdata = { - numbers = structures.counters.compact("\currentconstructionnumber",nil,true), % ! number can be cloned - separatorset = "\constructionparameter\c!numberseparatorset", - conversion = "\constructionparameter\c!numberconversion", - conversionset = "\constructionparameter\c!numberconversionset", - starter = \!!bs\constructionparameter\c!numberstarter\!!es, - stopper = \!!bs\constructionparameter\c!numberstopper\!!es, - segments = "\constructionparameter\c!numbersegments", - }, + prefixdata { + prefix {\constructionparameter\c!prefix} + separatorset {\constructionparameter\c!prefixseparatorset} + conversion {\constructionparameter\c!prefixconversion} + conversionset {\constructionparameter\c!prefixconversionset} + set {\constructionparameter\c!prefixset} + segments {\constructionparameter\c!prefixsegments} + connector {\constructionparameter\c!prefixconnector} + } + numberdata { + numbers {\currentconstructionnumber} + separatorset {\constructionparameter\c!numberseparatorset} + conversion {\constructionparameter\c!numberconversion} + conversionset {\constructionparameter\c!numberconversionset} + starter {\constructionparameter\c!numberstarter} + stopper {\constructionparameter\c!numberstopper} + segments {\constructionparameter\c!numbersegments} + } \or % symbol \fi - userdata = \!!bs\detokenize{#2}\!!es % will be converted to table at the lua end - } - }\relax + userdata {\detokenize{#2}} + \relax % \writestatus{constructions}{registering \currentconstruction: \number\scratchcounter}% - \ctxcommand{setinternalreference("\referenceprefix","\currentconstructionreference",\nextinternalreference,"\interactionparameter\c!focus")}% + \clf_setinternalreference + prefix {\referenceprefix}% + reference {\currentconstructionreference}% + internal \nextinternalreference + view {\interactionparameter\c!focus}% + \relax \normalexpanded{% \endgroup \edef\noexpand\currentconstructionlistentry {\the\scratchcounter}% @@ -994,7 +1014,7 @@ % macros. \def\reinstateconstructionnumberentry#1% was xdef - {\edef\currentconstructionattribute {\ctxcommand {getinternallistreference(#1)}}% + {\edef\currentconstructionattribute {\clf_getinternallistreference#1}% \edef\currentconstructionsynchronize{\ctxlatecommand{enhancelist(#1)}}} \installstructurelistprocessor{construction}{\usestructurelistprocessor{number+title}} diff --git a/Master/texmf-dist/tex/context/base/strc-def.mkiv b/Master/texmf-dist/tex/context/base/strc-def.mkiv index 0738bdf29d8..b4d2a5feadf 100644 --- a/Master/texmf-dist/tex/context/base/strc-def.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-def.mkiv @@ -32,6 +32,7 @@ \defineresetset [\s!default] [] [1] % each level \defineprefixset [\s!default] [section-1,section-2,section-3] [] +\defineconversionset [\v!number] [] [numbers] \defineconversionset [\v!pagenumber] [] [numbers] \defineprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] [] @@ -47,6 +48,9 @@ \setupuserpagenumber [\c!numberconversionset=\v!pagenumber] +\setupcounters + [\c!numberconversionset=\v!number] + % \startsetups defaults:frontpart:pagenumbers:roman % \defineconversionset[\c!frontpart:\c!pagenumber][][romannumerals] % \setupuserpagenumber[\c!way=\v!by\v!block] @@ -220,19 +224,19 @@ [\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns \c!after=\blank, \c!label=\v!yes, - \c!distance=1em] + \c!distance=\emwidth] \setuplist [\v!chapter] [\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns \c!after=] -\setuplist [\v!part] [\c!width=0em] -\setuplist [\v!chapter] [\c!width=2em] -\setuplist [\v!section] [\c!width=3em] -\setuplist [\v!subsection] [\c!width=4em] -\setuplist [\v!subsubsection] [\c!width=5em] -\setuplist [\v!subsubsubsection] [\c!width=6em] -\setuplist [\v!subsubsubsubsection] [\c!width=7em] +\setuplist [\v!part] [\c!width=0\emwidth] +\setuplist [\v!chapter] [\c!width=2\emwidth] +\setuplist [\v!section] [\c!width=3\emwidth] +\setuplist [\v!subsection] [\c!width=4\emwidth] +\setuplist [\v!subsubsection] [\c!width=5\emwidth] +\setuplist [\v!subsubsubsection] [\c!width=6\emwidth] +\setuplist [\v!subsubsubsubsection] [\c!width=7\emwidth] \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/strc-des.mkvi b/Master/texmf-dist/tex/context/base/strc-des.mkvi index fa20d3caea9..3557000f91d 100644 --- a/Master/texmf-dist/tex/context/base/strc-des.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-des.mkvi @@ -76,6 +76,7 @@ \unexpanded\setvalue{\??constructioninitializer\v!description}% {\let\currentdescription \currentconstruction \let\constructionparameter \descriptionparameter + \let\constructionnamespace \??description \let\detokenizedconstructionparameter\detokenizeddescriptionparameter \let\letconstructionparameter \letdescriptionparameter \let\useconstructionstyleandcolor \usedescriptionstyleandcolor @@ -102,10 +103,10 @@ \unexpanded\def\strc_descriptions_start#1% {\begingroup \strc_constructions_initialize{#1}% - \doifnextoptionalcselse\strc_descriptions_start_yes\strc_descriptions_start_nop} + \doifelsenextoptionalcs\strc_descriptions_start_yes\strc_descriptions_start_nop} \unexpanded\def\strc_descriptions_start_yes[#1]% - {\doifassignmentelse{#1}\strc_descriptions_start_yes_assignment\strc_descriptions_start_yes_reference[#1]} + {\doifelseassignment{#1}\strc_descriptions_start_yes_assignment\strc_descriptions_start_yes_reference[#1]} \unexpanded\def\strc_descriptions_start_yes_assignment[#1]% todo userdata {\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title=,\c!bookmark=,\c!list=,#1][]% @@ -119,7 +120,7 @@ \fi} \unexpanded\def\strc_descriptions_start_yes_titled[#1]% - {\doifnextbgroupelse + {\doifelsenextbgroup {\strc_descriptions_start_yes_titled_indeed[#1]}% {\setfalse\c_strc_constructions_title_state \strc_descriptions_start_yes_normal[#1]}} @@ -140,7 +141,7 @@ \fi} \unexpanded\def\strc_descriptions_start_nop_titled - {\doifnextbgroupelse + {\doifelsenextbgroup {\strc_descriptions_start_nop_titled_indeed}% {\setfalse\c_strc_constructions_title_state \strc_descriptions_start_nop_normal}}% @@ -162,7 +163,7 @@ \unexpanded\def\strc_descriptions_command#1% {\begingroup \strc_constructions_initialize{#1}% - \doifnextoptionalcselse\strc_descriptions_yes\strc_descriptions_nop} + \doifelsenextoptionalcs\strc_descriptions_yes\strc_descriptions_nop} \unexpanded\def\strc_descriptions_yes {\ifconditional\c_strc_constructions_title_state @@ -176,7 +177,7 @@ \csname\??constructioncommandhandler\currentconstructionhandler\endcsname} \unexpanded\def\strc_descriptions_yes_titled[#1]% - {\doifnextbgroupelse + {\doifelsenextbgroup {\strc_descriptions_yes_titled_indeed[#1]}% {\setfalse\c_strc_constructions_title_state \strc_descriptions_yes_normal[#1]}} @@ -197,7 +198,7 @@ \fi} \unexpanded\def\strc_descriptions_nop_titled - {\doifnextbgroupelse + {\doifelsenextbgroup {\strc_descriptions_nop_titled_indeed}% {\setfalse\c_strc_constructions_title_state \strc_descriptions_nop_normal}} diff --git a/Master/texmf-dist/tex/context/base/strc-doc.lua b/Master/texmf-dist/tex/context/base/strc-doc.lua index 38830a4e77c..029d68a9dc2 100644 --- a/Master/texmf-dist/tex/context/base/strc-doc.lua +++ b/Master/texmf-dist/tex/context/base/strc-doc.lua @@ -17,15 +17,18 @@ if not modules then modules = { } end modules ['strc-doc'] = { local next, type, tonumber, select = next, type, tonumber, select local format, gsub, find, gmatch, match = string.format, string.gsub, string.find, string.gmatch, string.match -local concat, fastcopy = table.concat, table.fastcopy +local concat, fastcopy, insert, remove = table.concat, table.fastcopy, table.insert, table.remove local max, min = math.max, math.min local allocate, mark, accesstable = utilities.storage.allocate, utilities.storage.mark, utilities.tables.accesstable local setmetatableindex = table.setmetatableindex +local lpegmatch, P, C = lpeg.match, lpeg.P, lpeg.C local catcodenumbers = catcodes.numbers local ctxcatcodes = catcodenumbers.ctxcatcodes local variables = interfaces.variables +local implement = interfaces.implement + local v_last = variables.last local v_first = variables.first local v_previous = variables.previous @@ -59,6 +62,8 @@ local startapplyprocessor = processors.startapply local stopapplyprocessor = processors.stopapply local strippedprocessor = processors.stripped +local convertnumber = converters.convert + local a_internal = attributes.private('internal') local ctx_convertnumber = context.convertnumber @@ -128,28 +133,48 @@ local registered = sections.registered storage.register("structures/sections/registered", registered, "structures.sections.registered") +local function update(name,level,section) + for k, v in next, registered do + if k ~= name and v.coupling == name then + report_structure("updating section level %a to level of %a",k,name) + context.doredefinehead(k,name) + update(k,level,section) + end + end +end + function sections.register(name,specification) registered[name] = specification + local level = specification.level + local section = specification.section + update(name,level,section) end function sections.currentid() return #tobesaved end +local lastsaved = 0 + function sections.save(sectiondata) -- local sectionnumber = helpers.simplify(section.sectiondata) -- maybe done earlier local numberdata = sectiondata.numberdata local ntobesaved = #tobesaved if not numberdata or sectiondata.metadata.nolist then - return ntobesaved + -- stay else ntobesaved = ntobesaved + 1 tobesaved[ntobesaved] = numberdata if not collected[ntobesaved] then collected[ntobesaved] = numberdata end - return ntobesaved end + lastsaved = ntobesaved + return ntobesaved +end + +function sections.currentsectionindex() + return lastsaved -- only for special controlled situations end function sections.load() @@ -214,7 +239,7 @@ end function sections.pushblock(name,settings) counters.check(0) -- we assume sane usage of \page between blocks local block = name or data.block - data.blocks[#data.blocks+1] = block + insert(data.blocks,block) data.block = block sectionblockdata[block] = settings documents.reset() @@ -222,17 +247,18 @@ function sections.pushblock(name,settings) end function sections.popblock() - data.blocks[#data.blocks] = nil - local block = data.blocks[#data.blocks] or data.block + local block = remove(data.blocks) or data.block data.block = block documents.reset() return block end -function sections.currentblock() +local function getcurrentblock() return data.block or data.blocks[#data.blocks] or "unknown" end +sections.currentblock = getcurrentblock + function sections.currentlevel() return data.depth end @@ -246,15 +272,33 @@ local saveset = { } -- experiment, see sections/tricky-001.tex function sections.setentry(given) -- old number local numbers = data.numbers + -- + local metadata = given.metadata + local numberdata = given.numberdata + local references = given.references + local directives = given.directives + local userdata = given.userdata + + if not metadata then + metadata = { } + given.metadata = metadata + end + if not numberdata then + numberdata = { } + given.numberdata = numberdata + end + if not references then + references = { } + given.references = references + end local ownnumbers = data.ownnumbers local forced = data.forced local status = data.status local olddepth = data.depth - local givenname = given.metadata.name + local givenname = metadata.name local mappedlevel = levelmap[givenname] local newdepth = tonumber(mappedlevel or (olddepth > 0 and olddepth) or 1) -- hm, levelmap only works for section-* - local directives = given.directives local resetset = directives and directives.resetset or "" -- local resetter = sets.getall("structure:resets",data.block,resetset) -- a trick to permit userdata to overload title, ownnumber and reference @@ -264,14 +308,13 @@ function sections.setentry(given) report_structure("name %a, mapped level %a, old depth %a, new depth %a, reset set %a", givenname,mappedlevel,olddepth,newdepth,resetset) end - local u = given.userdata - if u then - -- kind of obsolete as we can pass them directly anyway - if u.reference and u.reference ~= "" then given.metadata.reference = u.reference ; u.reference = nil end - if u.ownnumber and u.ownnumber ~= "" then given.numberdata.ownnumber = u.ownnumber ; u.ownnumber = nil end - if u.title and u.title ~= "" then given.titledata.title = u.title ; u.title = nil end - if u.bookmark and u.bookmark ~= "" then given.titledata.bookmark = u.bookmark ; u.bookmark = nil end - if u.label and u.label ~= "" then given.titledata.label = u.label ; u.label = nil end + if userdata then + -- kind of obsolete as we can pass them directly anyway ... NEEDS CHECKING ! + if userdata.reference and userdata.reference ~= "" then given.metadata.reference = userdata.reference ; userdata.reference = nil end + if userdata.ownnumber and userdata.ownnumber ~= "" then given.numberdata.ownnumber = userdata.ownnumber ; userdata.ownnumber = nil end + if userdata.title and userdata.title ~= "" then given.titledata.title = userdata.title ; userdata.title = nil end + if userdata.bookmark and userdata.bookmark ~= "" then given.titledata.bookmark = userdata.bookmark ; userdata.bookmark = nil end + if userdata.label and userdata.label ~= "" then given.titledata.label = userdata.label ; userdata.label = nil end end -- so far for the trick if saveset then @@ -309,12 +352,12 @@ function sections.setentry(given) end end counters.check(newdepth) - ownnumbers[newdepth] = given.numberdata.ownnumber or "" - given.numberdata.ownnumber = nil + ownnumbers[newdepth] = numberdata.ownnumber or "" + numberdata.ownnumber = nil data.depth = newdepth -- new number olddepth = newdepth - if given.metadata.increment then + if metadata.increment then local oldn, newn = numbers[newdepth] or 0, 0 local fd = forced[newdepth] if fd then @@ -344,40 +387,31 @@ function sections.setentry(given) v[2](k) end end - local numberdata= given.numberdata - if not numberdata then - -- probably simplified to nothing - numberdata = { } - given.numberdata = numberdata - end - local n = { } for i=1,newdepth do n[i] = numbers[i] end numberdata.numbers = n --- numberdata.numbers = fastcopy(numbers) - + if not numberdata.block then + numberdata.block = getcurrentblock() -- also in references + end if #ownnumbers > 0 then numberdata.ownnumbers = fastcopy(ownnumbers) end if trace_detail then report_structure("name %a, numbers % a, own numbers % a",givenname,numberdata.numbers,numberdata.ownnumbers) end - - local metadata = given.metadata - local references = given.references - + if not references.block then + references.block = getcurrentblock() -- also in numberdata + end local tag = references.tag or tags.getid(metadata.kind,metadata.name) if tag and tag ~= "" and tag ~= "?" then references.tag = tag end - local setcomponent = structures.references.setcomponent if setcomponent then setcomponent(given) -- might move to the tex end end - references.section = sections.save(given) -- given.numberdata = nil end @@ -528,10 +562,6 @@ end sections.depthnumber = depthnumber -function commands.depthnumber(n) - return context(depthnumber(n)) -end - function sections.autodepth(numbers) for i=#numbers,1,-1 do if numbers[i] ~= 0 then @@ -557,10 +587,9 @@ end -- sign=positive => also zero -- sign=hang => llap sign ---~ todo: test this ---~ +-- this can be a local function -local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done) +local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language) -- todo: too much (100 steps) local number = numbers and (numbers[index] or 0) local ownnumber = ownnumbers and ownnumbers[index] or "" @@ -581,10 +610,10 @@ local function process(index,numbers,ownnumbers,criterium,separatorset,conversio if ownnumber ~= "" then result[#result+1] = ownnumber elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups) .. inherited! - result[#result+1] = converters.convert(conversion,number) + result[#result+1] = convertnumber(conversion,number,language) else local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers") - result[#result+1] = converters.convert(theconversion,number) + result[#result+1] = convertnumber(theconversion,number,language) end else if ownnumber ~= "" then @@ -616,6 +645,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref local set = "" local segments = "" local criterium = "" + local language = "" for d=1,select("#",...) do local data = select(d,...) -- can be multiple parametersets if data then @@ -629,6 +659,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref if set == "" then set = data.set or "" end if segments == "" then segments = data.segments or "" end if criterium == "" then criterium = data.criterium or "" end + if language == "" then language = data.language or "" end end end if separatorset == "" then separatorset = "default" end @@ -640,6 +671,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref if connector == "" then connector = nil end if set == "" then set = "default" end if segments == "" then segments = nil end + if language == "" then language = nil end -- if criterium == v_strict then criterium = 0 @@ -651,10 +683,10 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref criterium = 0 end -- - local firstprefix, lastprefix = 0, 16 + local firstprefix, lastprefix = 0, 16 -- too much, could max found level if segments then local f, l = match(tostring(segments),"^(.-):(.+)$") - if l == "*" then + if l == "*" or l == v_all then l = 100 -- new end if f and l then @@ -688,7 +720,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref applyprocessor(starter) end end - if prefixlist and (kind == 'section' or kind == 'prefix' or kind == 'direct') then + if prefixlist and (kind == "section" or kind == "prefix" or kind == "direct") then -- find valid set (problem: for sectionnumber we should pass the level) -- no holes local b, e, bb, ee = 1, #prefixlist, 0, 0 @@ -732,15 +764,13 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref local prefix = prefixlist[k] local index = sections.getlevel(prefix) or k if index >= firstprefix and index <= lastprefix then - -- process(index,result) - preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done) + preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language) end end else -- also holes check for index=firstprefix,lastprefix do - -- process(index,result) - preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done) + preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language) end end -- @@ -756,7 +786,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref if result then result[#result+1] = strippedprocessor(groupsuffix) else - applyprocessor(groupsuffix) + applyprocessor(groupsuffix) end end if stopper then @@ -901,34 +931,21 @@ end function sections.getnumber(depth,what) -- redefined here local sectiondata = sections.findnumber(depth,what) - context((sectiondata and sectiondata.numbers[depth]) or 0) + local askednumber = 0 + if sectiondata then + local numbers = sectiondata.numbers + if numbers then + askednumber = numbers[depth] or 0 + end + end + context(askednumber) end -- experimental local levels = { } ---~ function commands.autonextstructurelevel(level) ---~ if level > #levels then ---~ for i=#levels+1,level do ---~ levels[i] = "" ---~ end ---~ end ---~ local finish = concat(levels,"\n",level) or "" ---~ for i=level+1,#levels do ---~ levels[i] = "" ---~ end ---~ levels[level] = [[\finalizeautostructurelevel]] ---~ context(finish) ---~ end - ---~ function commands.autofinishstructurelevels() ---~ local finish = concat(levels,"\n") or "" ---~ levels = { } ---~ context(finish) ---~ end - -function commands.autonextstructurelevel(level) +local function autonextstructurelevel(level) if level > #levels then for i=#levels+1,level do levels[i] = false @@ -944,7 +961,7 @@ function commands.autonextstructurelevel(level) levels[level] = true end -function commands.autofinishstructurelevels() +local function autofinishstructurelevels() for i=1,#levels do if levels[i] then ctx_finalizeauto() @@ -953,38 +970,132 @@ function commands.autofinishstructurelevels() levels = { } end --- interface (some are actually already commands, like sections.fullnumber) +implement { + name = "autonextstructurelevel", + actions = autonextstructurelevel, + arguments = "integer", +} -commands.structurenumber = sections.fullnumber -commands.structuretitle = sections.title +implement { + name = "autofinishstructurelevels", + actions = autofinishstructurelevels, +} -commands.structurevariable = function(name) sections.structuredata(nil,name) end -commands.structureuservariable = function(name) sections.userdata (nil,name) end -commands.structurecatcodedget = function(name) sections.structuredata(nil,name,nil,true) end -commands.structuregivencatcodedget = function(name,catcode) sections.structuredata(nil,name,nil,catcode) end -commands.structureautocatcodedget = function(name,catcode) sections.structuredata(nil,name,nil,catcode) end +-- interface (some are actually already commands, like sections.fullnumber) -commands.namedstructurevariable = sections.structuredata -commands.namedstructureuservariable = sections.userdata +implement { + name = "depthnumber", + actions = { depthnumber, context }, + arguments = "integer", +} -commands.setsectionlevel = sections.setlevel -commands.setsectionnumber = sections.setnumber -commands.getsectionnumber = sections.getnumber -commands.getfullsectionnumber = sections.fullnumber -commands.getstructuredata = sections.structuredata -commands.getcurrentsectionlevel = sections.getcurrentlevel +implement { name = "structurenumber", actions = sections.fullnumber } +implement { name = "structuretitle", actions = sections.title } + +implement { name = "structurevariable", actions = sections.structuredata, arguments = { false, "string" } } +implement { name = "structureuservariable", actions = sections.userdata, arguments = { false, "string" } } +implement { name = "structurecatcodedget", actions = sections.structuredata, arguments = { false, "string", false, true } } +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 = "setstructurelevel", actions = sections.setlevel, arguments = { "string", "string" } } +implement { name = "getstructurelevel", actions = sections.getcurrentlevel, arguments = { "string" } } +implement { name = "setstructurenumber", actions = sections.setnumber, arguments = { "integer", "string" } } +implement { name = "getstructurenumber", actions = sections.getnumber, arguments = { "integer" } } +implement { name = "getsomestructurenumber", actions = sections.getnumber, arguments = { "integer", "string" } } +implement { name = "getfullstructurenumber", actions = sections.fullnumber, arguments = { "integer" } } +implement { name = "getsomefullstructurenumber", actions = sections.fullnumber, arguments = { "integer", "string" } } +implement { name = "getspecificstructuretitle", actions = sections.structuredata, arguments = { "string", "'titledata.title'",false,"string" } } + +implement { name = "reportstructure", actions = sections.reportstructure } + +implement { + name = "registersection", + actions = sections.register, + arguments = { + "string", + { + { "coupling" }, + { "section" }, + { "level", "integer" }, + { "parent" }, + } + } +} -commands.setsectionblock = sections.setblock -commands.pushsectionblock = sections.pushblock -commands.popsectionblock = sections.popblock +implement { + name = "setsectionentry", + actions = sections.setentry, + arguments = { + { + { "references", { + { "internal", "integer" }, + { "block" }, + { "backreference" }, + { "prefix" }, + { "reference" }, + } + }, + { "directives", { + { "resetset" } + } + }, + { "metadata", { + { "kind" }, + { "name" }, + { "catcodes", "integer" }, + { "coding" }, + { "xmlroot" }, + { "xmlsetup" }, + { "nolist", "boolean" }, + { "increment" }, + } + }, + { "titledata", { + { "label" }, + { "title" }, + { "bookmark" }, + { "marking" }, + { "list" }, + } + }, + { "numberdata", { + { "block" }, + { "hidenumber", "boolean" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "starter" }, + { "stopper" }, + { "set" }, + { "segments" }, + { "ownnumber" }, + { "language" }, + }, + }, + { "userdata" }, + } + } +} -commands.registersection = sections.register -commands.setsectionentry = sections.setentry -commands.reportstructure = sections.reportstructure --- +-- os.exit() -local byway = "^" .. v_by -- ugly but downward compatible +implement { + name = "setsectionblock", + actions = sections.setblock, + arguments = { "string", { { "bookmark" } } } +} -function commands.way(way) - context((gsub(way,byway,""))) -end +implement { + name = "pushsectionblock", + actions = sections.pushblock, + arguments = { "string", { { "bookmark" } } } +} + +implement { + name = "popsectionblock", + actions = sections.popblock, +} diff --git a/Master/texmf-dist/tex/context/base/strc-doc.mkiv b/Master/texmf-dist/tex/context/base/strc-doc.mkiv index 98abfd6118e..c453f199ef8 100644 --- a/Master/texmf-dist/tex/context/base/strc-doc.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-doc.mkiv @@ -20,8 +20,13 @@ %D This will move: \unexpanded\def\setstructuresynchronization#1% todo: use ctxcontext - {\ctxcommand{setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\interactionparameter\c!focus")}% + {\clf_setinternalreference + prefix {\currentstructurereferenceprefix}% + reference {\currentstructurereference} + internal \nextinternalreference + view {\interactionparameter\c!focus}% + \relax \xdef\currentstructureattribute {\the\lastdestinationattribute}% - \xdef\currentstructuresynchronize{\ctxlatecommand{enhancelist(#1)}}} + \xdef\currentstructuresynchronize{\strc_lists_inject_enhance{#1}{\nextinternalreference}}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/strc-enu.mkvi b/Master/texmf-dist/tex/context/base/strc-enu.mkvi index 0a01d2637f5..b76bc0067e1 100644 --- a/Master/texmf-dist/tex/context/base/strc-enu.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-enu.mkvi @@ -172,7 +172,7 @@ \ifx\p_counter\empty % \let\p_counter\currentenumeration \fi - \doifcounterelse\p_counter\donothing{\strc_enumerations_define_counter\p_counter}% + \doifelsecounter\p_counter\donothing{\strc_enumerations_define_counter\p_counter}% \letenumerationparameter\s!counter\p_counter %\strc_enumerations_setup_counter\currentenumeration \to \everydefineenumeration @@ -183,6 +183,7 @@ \unexpanded\setvalue{\??constructioninitializer\v!enumeration}% {\let\currentenumeration \currentconstruction \let\constructionparameter \enumerationparameter + \let\constructionnamespace \??enumeration \let\detokenizedconstructionparameter\detokenizedenumerationparameter \let\letconstructionparameter \letenumerationparameter \let\useconstructionstyleandcolor \useenumerationstyleandcolor @@ -283,7 +284,7 @@ \unexpanded\def\strc_enumerations_inject_extra_text {\ifconditional\c_strc_constructions_title_state - \ctxcommand{doiflisthastitleelse("\currentconstructionmain",\currentconstructionlistentry)} + \clf_doifelselisthastitle{\currentconstructionmain}\numexpr\currentconstructionlistentry\relax \donothing \strc_enumerations_inject_extra_text_indeed \fi} @@ -300,7 +301,7 @@ \useconstructionstyleandcolor\c!titlestyle\c!titlecolor \constructionparameter\c!titlecommand {\constructionparameter\c!titleleft - \ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}% + \clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax \constructionparameter\c!titleright}% \endgroup} @@ -312,7 +313,7 @@ \unexpanded\def\strc_enumerations_inject_number {\constructionparameter\c!left \constructionparameter\c!starter - \ctxcommand{savedlistprefixednumber("\currentconstructionmain",\currentconstructionlistentry)}% + \clf_savedlistprefixednumber{\currentconstructionmain}\currentconstructionlistentry\relax \constructionparameter\c!stopper \constructionparameter\c!right} @@ -370,6 +371,6 @@ \fi} \unexpanded\def\strc_enumerations_skip_number_coupling[#tag]% e.g. for questions with no answer - {\ctxcommand{setnextreferenceorder("construction","#tag")}} + {\clf_setnextreferenceorder{construction}{#tag}} \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/strc-flt.mkvi b/Master/texmf-dist/tex/context/base/strc-flt.mkvi index a939213177d..9a7fc56f6da 100644 --- a/Master/texmf-dist/tex/context/base/strc-flt.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-flt.mkvi @@ -17,6 +17,23 @@ \unprotect +% todo: a keyword for this (and then a settings->hash for speed) +% +% \setuplayout[width=middle,backspace=3cm] +% +% \appendtoks +% \settrue\inhibitmargindata +% \to \everyinsidefloat +% +% \starttext +% \dorecurse{20}{ +% \par \inleft{\red\infofont<#1>} \par +% \placefigure[leftmargin]{}{\framed[height=1cm,width=2cm]{}} +% % \placefigure{#1}{\framed[height=1cm,width=2cm]{}} +% \par line #1.1 \par line #1.2 \par +% } +% \stoptext + % todo: delay caption creation and make setups for each method instead % so that we can have a list of methods and redo them as we can % keep the list or even better: recreate it @@ -91,8 +108,9 @@ % \c!stopper=\@@kostopper, \c!suffixseparator=, % currently rather hard coded \c!suffix=\floatcaptionsuffix, - \c!distance=1em, + \c!distance=\emwidth, \c!conversion=\v!numbers, + \c!maxwidth=\hsize, \c!command=] % we can comment some of these @@ -133,6 +151,7 @@ \c!outermargin=\zeropoint, % idem \c!leftmargindistance=\zeropoint, \c!rightmargindistance=\floatparameter\c!leftmargindistance, + \c!step=\v!big, % the flish side float step (big=line, medium=halfline, small=quarterline, depth=halfline with normaldepth) \c!ntop=2, \c!nbottom=0, \c!nlines=4, % used? @@ -186,8 +205,8 @@ {\definefloatcaption[#1][#3]% \definecounter[#1][#3]% \definelist[#1][#3]% - \presetlabeltext[#1=\Word{#3}~]% - \presetheadtext[#2=\Word{#2}]% + \copylabeltext[#1=#3]% + %\presetheadtext[#2=\Word{#2}]% \strc_floats_define_saved[#1][#3]% \strc_floats_define_commands{#1}{#2}} @@ -235,8 +254,9 @@ \namedtaggedlabeltexts \t!floatlabel \currentfloat \t!floatnumber\currentfloat - {\ctxcommand{savedlistprefixednumber("\currentfloat",\currentfloatnumber)}% - \thecurrentfloatnumbersuffix}% + {\floatcaptionparameter\c!numbercommand + {\clf_savedlistprefixednumber{\currentfloat}\currentfloatnumber\relax + \thecurrentfloatnumbersuffix}}% \fi \fi \fi} @@ -244,7 +264,8 @@ {\ifnofloatcaption \else \ifx\currentfloatnumber\relax\else \dostarttagged\t!floattext\empty - \ctxcommand{savedlisttitle("\currentfloat",\currentfloatnumber)}% + \floatcaptionparameter\c!textcommand + {\clf_savedlisttitle{\currentfloat}\currentfloatnumber\relax}% \dostoptagged \fi \fi} @@ -489,8 +510,9 @@ \edef\floatlocation{\floatparameter\c!default}% beware of a clash between alignment locations \fi \strc_floats_analyze_location + % todo: use \lets \setupcurrentfloatcaption[\c!reference={#reference},\c!title={#caption},\c!marking=,\c!list=,\c!bookmark=]% - \doifinsetelse\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal} + \doifelseinset\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal} \unexpanded\def\placefloat {\flushnotes @@ -535,7 +557,7 @@ \setupcurrentfloatuserdata[#userdata]% \fi \strc_floats_analyze_location - \doifinsetelse\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal + \doifelseinset\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal \bgroup \ignorespaces} @@ -547,7 +569,7 @@ {\flushnotes \page_otr_command_flush_side_floats % here ! \strc_floats_begin_group - \dodoubleempty\strc_floats_start_place_float} + \dotripleempty\strc_floats_start_place_float} \def\strc_floats_start_place_float[#tag]% {\strc_floats_set_current_tag{#tag}% @@ -636,14 +658,14 @@ \unexpanded\def\strc_floats_place_next_box_normal {\ifconditional\c_page_floats_some_waiting % this was \checkwaitingfloats spread all over - \doifinsetelse\v!always\floatlocation + \doifelseinset\v!always\floatlocation {\showmessage\m!floatblocks5\empty} - {\doifcommonelse\floatlocation\flushfloatslist\page_otr_command_flush_floats\donothing}% + {\doifelsecommon\floatlocation\flushfloatslist\page_otr_command_flush_floats\donothing}% % but which should be done before using box \floatbox \fi \page_margin_strc_floats_before % todo: each float handler gets a before \global\insidefloattrue - \dostarttagged\t!float\currentfloat + \dostarttaggedchained\t!float\currentfloat\??float \page_margin_strc_floats_set_hsize % todo: each float handler gets a set_hsize \the\everyinsidefloat \strc_floats_analyze_variables_one @@ -681,7 +703,7 @@ {\ifinsidecolumns \global\setfalse\c_strc_floats_par_float \else - \doifcommonelse\floatlocation\flushfloatslist + \doifelsecommon\floatlocation\flushfloatslist {\global\settrue \c_strc_floats_par_float} {\global\setfalse\c_strc_floats_par_float}% \fi @@ -720,12 +742,12 @@ 180=>\global\c_strc_floats_rotation\commalistelement\relax,% 270=>\global\c_strc_floats_rotation\commalistelement\relax]% \fi - \doifinsetelse\v!nonumber\floatlocation + \doifelseinset\v!nonumber\floatlocation {\global\nofloatnumbertrue} {\doifelse{\floatcaptionparameter\c!number}\v!yes {\global\nofloatnumberfalse} {\global\nofloatnumbertrue}}% - \doifinsetelse\v!none\floatlocation + \doifelseinset\v!none\floatlocation {\global\nofloatcaptiontrue} {\global\nofloatcaptionfalse}% \doif{\floatcaptionparameter\c!number}\v!none % new @@ -741,7 +763,7 @@ \ifconditional\c_page_floats_center_box_global \settrue\c_page_floats_center_box_local \else - \doifinsetelse\v!local\floatlocation\settrue\setfalse\c_page_floats_center_box_local + \doifelseinset\v!local\floatlocation\settrue\setfalse\c_page_floats_center_box_local \fi \doifnotcommon{\v!always,\v!here,\v!force}\floatlocation % ! ! ! ! ! ! {\setfalse\c_page_floats_center_box_global @@ -767,6 +789,8 @@ \expandafter\firstoftwoarguments \fi} +\let\doifmainfloatbodyelse\doifelsemainfloatbody + % todo: optional user pars \let\currentfloatattribute\empty % to be checked @@ -801,7 +825,7 @@ % uses: \def\strc_floats_group_index - {\numexpr\ctxcommand{listgroupindex("\currentfloat","\currentfloatgroup")}\relax} + {\numexpr\clf_listgroupindex{\currentfloat}{\currentfloatgroup}\relax} \def\strc_floats_place_packaged_boxes {\expandafter\strc_floats_place_packaged_boxes_indeed\expandafter{\m_strc_floats_saved_userdata}} @@ -835,7 +859,7 @@ \relax \relax \relax - [\c!name=\currentfloat,% + [\s!name=\currentfloat,% was c!name \s!counter=\currentfloatcounter,% \s!hascaption=\ifnofloatcaption \v!no\else\v!yes\fi,% \s!hasnumber=\ifnofloatnumber \v!no\else\v!yes\fi,% @@ -896,26 +920,29 @@ \strc_float_load_data \to \everyinsidefloat -\def\doifrightpagefloatelse +\def\doifelserightpagefloat {\ifdoublesided \ifsinglesided \doubleexpandafter\firstoftwoarguments \else - \doubleexpandafter\doifoddfloatpageelse + \doubleexpandafter\doifelseoddfloatpage \fi \else \expandafter\firstoftwoarguments \fi} -\def\doifoddfloatpageelse +\def\doifelseoddfloatpage {\ifodd\purenumber\strc_float_realpage\space \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifrightpagefloatelse\doifelserightpagefloat +\let\doifoddpagefloatelse \doifelseoddpagefloat + \appendtoks - \let\rightorleftpageaction\doifrightpagefloatelse + \let\rightorleftpageaction\doifelserightpagefloat \to \everyinsidefloat % \let\movesidefloat\gobbleoneargument @@ -926,7 +953,7 @@ \unexpanded\def\movesidefloat[#settings]% (-)n*line|x=,y= {\global\d_page_sides_downshift \zeropoint \global\d_page_sides_extrashift\zeropoint - \doifassignmentelse{#settings}% + \doifelseassignment{#settings}% {\begingroup \setupcurrentfloat[\c!x=\zeropoint,\c!y=\zeropoint,#settings]% \ifgridsnapping @@ -1038,10 +1065,10 @@ \fi \fi % we can also support edges .. in that case no common but a fast loop - \doifinsetelse\v!hanging\floatlocation - {\doifcommonelse{\v!inleft,\v!leftmargin}\floatlocation + \doifelseinset\v!hanging\floatlocation + {\doifelsecommon{\v!inleft,\v!leftmargin}\floatlocation {\let\p_maxwidth\leftmarginwidth}% - {\doifcommonelse{\v!inright,\v!rightmargin}\floatlocation + {\doifelsecommon{\v!inright,\v!rightmargin}\floatlocation {\let\p_maxwidth\rightmarginwidth}% {\edef\p_maxwidth{\floatparameter\c!maxwidth}}}}% {\edef\p_maxwidth{\floatparameter\c!maxwidth}}% @@ -1050,9 +1077,9 @@ \else \scratchwidth\p_maxwidth\relax \ifdim\wd\floatbox>\scratchwidth - \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge,\v!inleft,\v!leftmargin,\v!leftedge}\floatlocation + \doifelsecommon{\v!inright,\v!rightmargin,\v!rightedge,\v!inleft,\v!leftmargin,\v!leftedge}\floatlocation {\global\d_page_sides_maximum\scratchwidth} - {\doifcommonelse{\v!right,\v!left}\floatlocation + {\doifelsecommon{\v!right,\v!left}\floatlocation \strc_floats_realign_floatbox_horizontal_one \strc_floats_realign_floatbox_horizontal_two}% \fi @@ -1104,11 +1131,22 @@ \unexpanded\def\betweenfloatblanko % assumes that spaceafter is present {\blank[\rootfloatparameter\c!spacebefore]} % or v!back,.... +% \unexpanded\def\doplacefloatbox % used elsewhere +% {%\forgetall % NO +% \whitespace +% \blank[\rootfloatparameter\c!spacebefore] +% \page_otr_command_flush_float_box +% \blank[\rootfloatparameter\c!spaceafter]} + \unexpanded\def\doplacefloatbox % used elsewhere {%\forgetall % NO \whitespace \blank[\rootfloatparameter\c!spacebefore] + \nointerlineskip + \flushnotes % new per 2014-05-29 : todo: move them up in the mvl + \nointerlineskip \page_otr_command_flush_float_box + \nointerlineskip \blank[\rootfloatparameter\c!spaceafter]} % test case: @@ -1126,7 +1164,7 @@ \global\floatheight \ht\floatbox % forget about the depth \global\floattextwidth\dimexpr\hsize-\floatwidth-\rootfloatparameter\c!margin\relax \edef\floatlocation{\floatlocationmethod}% to be sure .. why - \doifinsetelse\v!tall\floatlocationmethod + \doifelseinset\v!tall\floatlocationmethod {\floattextheight\dimexpr\pagegoal-\pagetotal-\bigskipamount\relax % ugly, this bigskip \ifdim\floattextheight>\textheight \floattextheight\textheight @@ -1151,27 +1189,27 @@ {\floattextheight\ifdim\ht\floattext<\floatheight\floatheight\else\ht\floattext\fi}% \setbox\floatbox\vbox to \floattextheight {\hsize\floatwidth - \doifinsetelse\v!both\floatlocation - {\doifinsetelse\v!low\floatlocation + \doifelseinset\v!both\floatlocation + {\doifelseinset\v!low\floatlocation {\vfill\box\floatbox} - {\doifinsetelse\v!middle\floatlocation + {\doifelseinset\v!middle\floatlocation {\vfill\box\floatbox\vfill} {\box\floatbox\vfill}}} {\box\floatbox\vfill}}% \setbox\floattext\vbox to \floattextheight {\hsize\floattextwidth - \doifinsetelse\v!low\floatlocation + \doifelseinset\v!low\floatlocation {\vfill \box\floattext \doifinset\c!offset\floatlocation{\whitespace\blank}} - {\doifinsetelse\v!middle\floatlocation + {\doifelseinset\v!middle\floatlocation {\vfill \box\floattext \vfill} {\doifinset\v!offset\floatlocation{\whitespace\blank}% \box\floattext \vfill}}}% - \doifinsetelse\v!right\floatlocation + \doifelseinset\v!right\floatlocation {\setbox\floatbox\hbox to \hsize {\box\floattext \hfill @@ -1190,13 +1228,13 @@ \blank[\rootfloatparameter\c!spaceafter]% \strc_floats_end_text_group \page_floats_report_total} - + \def\borderedfloatbox {\begingroup \setupcurrentfloat[\c!location=\v!normal,\c!width=\v!fit,\c!height=\v!fit]% \inheritedfloatframed{\box\floatbox}% \endgroup} - + % minwidth=fit,width=max : no overshoot, as wide as graphic \def\strc_floats_align_content_indeed @@ -1366,17 +1404,82 @@ \fi \strc_floats_make_complete_caption}} +% \def\strc_floats_prepare_stack_caption_auto +% {\ifx\p_strc_floats_caption_align\empty \else +% \doifnotinset\v!middle\p_strc_floats_caption_align{\let\captionovershoot\!!zeropoint}% +% \fi +% \edef\captionhsize{\the\wd\b_strc_floats_content}% +% \ifdim\captionhsize>\hsize +% % float is wider than \hsize +% \setbox\b_strc_floats_caption\vbox +% {\settrialtypesetting +% \strc_floats_caption_set_align +% \hsize\captionhsize +% \notesenabledfalse +% \strc_floats_make_complete_caption}% +% \ifdim\ht\scratchbox>\lineheight % more lines +% \setbox\b_strc_floats_caption\vbox +% {\strc_floats_caption_set_align +% \hsize\dimexpr\captionhsize-\captionovershoot\relax +% \ifdim\hsize<\captionminwidth\relax +% \hsize\captionhsize +% \fi +% \strc_floats_make_complete_caption}% +% \else +% \setbox\b_strc_floats_caption\vbox +% {\strc_floats_caption_set_align +% \hsize\captionhsize +% \strc_floats_make_complete_caption}% +% \fi +% \else +% % float is smaller of equal to \hsize +% \ifdim\captionhsize<\captionminwidth\relax +% \scratchdimen\captionminwidth % float smaller than min width +% \edef\captionhsize{\the\scratchdimen}% +% \fi +% \setbox\scratchbox\vbox % test with overshoot +% {\settrialtypesetting +% \scratchdimen\dimexpr\captionhsize+\captionovershoot+3\emwidth\relax % 3em is an average word length +% \ifdim\scratchdimen<\hsize +% \hsize\scratchdimen +% \fi +% \notesenabledfalse +% \strc_floats_make_complete_caption}% +% \ifdim\ht\scratchbox>\lineheight +% % at least an average word longer than a line +% \setbox\b_strc_floats_caption\vbox +% {\strc_floats_caption_set_align +% \scratchdimen\dimexpr\captionhsize+\captionovershoot\relax +% \ifdim\scratchdimen<\hsize +% \hsize\scratchdimen +% \fi +% \strc_floats_make_complete_caption}% +% \else\ifx\p_strc_floats_caption_align\empty +% \setbox\b_strc_floats_caption\vbox +% {\strc_floats_caption_set_align +% \hsize\captionhsize +% \raggedcenter % overloads +% \strc_floats_make_complete_caption}% +% \else +% \setbox\b_strc_floats_caption\vbox +% {\strc_floats_caption_set_align +% \hsize\captionhsize +% \strc_floats_make_complete_caption}% +% \fi\fi +% \fi} + \def\strc_floats_prepare_stack_caption_auto {\ifx\p_strc_floats_caption_align\empty \else \doifnotinset\v!middle\p_strc_floats_caption_align{\let\captionovershoot\!!zeropoint}% \fi \edef\captionhsize{\the\wd\b_strc_floats_content}% - \ifdim\captionhsize>\hsize + \scratchwidth\floatcaptionparameter\c!maxwidth\relax + \ifdim\captionhsize>\scratchwidth % float is wider than \hsize \setbox\b_strc_floats_caption\vbox {\settrialtypesetting \strc_floats_caption_set_align - \hsize\captionhsize + \hsize\scratchwidth \notesenabledfalse \strc_floats_make_complete_caption}% \ifdim\ht\scratchbox>\lineheight % more lines @@ -1384,13 +1487,13 @@ {\strc_floats_caption_set_align \hsize\dimexpr\captionhsize-\captionovershoot\relax \ifdim\hsize<\captionminwidth\relax - \hsize\captionhsize + \hsize\scratchwidth \fi \strc_floats_make_complete_caption}% \else \setbox\b_strc_floats_caption\vbox {\strc_floats_caption_set_align - \hsize\captionhsize + \hsize\scratchwidth \strc_floats_make_complete_caption}% \fi \else @@ -1456,10 +1559,10 @@ \box\b_strc_floats_content}} \def\strc_floats_build_box_next_outer - {\doifrightpagefloatelse\strc_floats_build_box_next_right\strc_floats_build_box_next_left} + {\doifelserightpagefloat\strc_floats_build_box_next_right\strc_floats_build_box_next_left} \def\strc_floats_build_box_next_inner - {\doifrightpagefloatelse\strc_floats_build_box_next_left\strc_floats_build_box_next_right} + {\doifelserightpagefloat\strc_floats_build_box_next_left\strc_floats_build_box_next_right} \def\strc_floats_build_box_next_right_hang#1% {\ifconditional\c_strc_floats_par_float \hbox \else \expandafter \strc_floats_align_content \fi @@ -1510,12 +1613,12 @@ {\strc_floats_build_box_next_left_margin_indeed \leftmargindistance } \def\strc_floats_build_box_next_outer_margin - {\doifrightpagefloatelse + {\doifelserightpagefloat {\strc_floats_build_box_next_right_margin_indeed\rightmargindistance} {\strc_floats_build_box_next_left_margin_indeed \rightmargindistance}} \def\strc_floats_build_box_next_inner_margin - {\doifrightpagefloatelse + {\doifelserightpagefloat {\strc_floats_build_box_next_left_margin_indeed \leftmargindistance} {\strc_floats_build_box_next_right_margin_indeed\leftmargindistance}} @@ -1552,29 +1655,16 @@ \def\strc_floats_flush_left_caption_hang {\hsmash{\llap{\box\b_strc_floats_caption\dotfskip{\floatcaptionparameter\c!distance}}}} -% \def\strc_floats_flush_caption_hang % expanded can go -% {\expanded{\doifinsetelse{\v!righthanging}{\floatcaptionparameter\c!location}} -% {\strc_floats_flush_right_caption_hang} -% {\expanded{\doifinsetelse{\v!lefthanging}{\floatcaptionparameter\c!location}} -% {\strc_floats_flush_left_caption_hang} -% {\expanded{\doifinsetelse{\v!hang}{\floatcaptionparameter\c!location}} -% {\expanded{\doifinsetelse{\v!outer}{\floatcaptionparameter\c!location}} -% {\doifrightpagefloatelse{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}} -% {\expanded{\doifinsetelse{\v!right}{\floatcaptiondirectives}} -% {\strc_floats_flush_right_caption_hang} -% {\strc_floats_flush_left_caption_hang}}} -% {\box\b_strc_floats_caption}}}} - \def\strc_floats_flush_caption_hang % expanded can go {\edef\p_strc_floats_caption_location{\floatcaptionparameter\c!location}% - \doifinsetelse\v!righthanging\p_strc_floats_caption_location + \doifelseinset\v!righthanging\p_strc_floats_caption_location {\strc_floats_flush_right_caption_hang} - {\doifinsetelse\v!lefthanging\p_strc_floats_caption_location + {\doifelseinset\v!lefthanging\p_strc_floats_caption_location {\strc_floats_flush_left_caption_hang} - {\doifinsetelse\v!hang\p_strc_floats_caption_location - {\doifinsetelse\v!outer\p_strc_floats_caption_location - {\doifrightpagefloatelse{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}} - {\doifinsetelse\v!right\floatcaptiondirectives + {\doifelseinset\v!hang\p_strc_floats_caption_location + {\doifelseinset\v!outer\p_strc_floats_caption_location + {\doifelserightpagefloat{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}} + {\doifelseinset\v!right\floatcaptiondirectives {\strc_floats_flush_right_caption_hang} {\strc_floats_flush_left_caption_hang}}} {\box\b_strc_floats_caption}}}} @@ -1637,7 +1727,7 @@ \fi} \def\strc_floats_build_box_top_stack_normal - {\doifinsetelse\v!overlay{\floatcaptionparameter\c!location} + {\doifelseinset\v!overlay{\floatcaptionparameter\c!location} \strc_floats_build_box_top_stack_normal_overlay \strc_floats_build_box_top_stack_normal_content} @@ -1753,8 +1843,8 @@ \processallactionsinset[\floatcaptionparameter\c!location] [ \v!left=>\let\next\strc_floats_relocate_caption_left, \v!right=>\let\next\strc_floats_relocate_caption_right, - \v!inner=>\doifrightpagefloatelse{\let\next\strc_floats_relocate_caption_left }{\let\next\strc_floats_relocate_caption_right}, - \v!outer=>\doifrightpagefloatelse{\let\next\strc_floats_relocate_caption_right}{\let\next\strc_floats_relocate_caption_left }]% + \v!inner=>\doifelserightpagefloat{\let\next\strc_floats_relocate_caption_left }{\let\next\strc_floats_relocate_caption_right}, + \v!outer=>\doifelserightpagefloat{\let\next\strc_floats_relocate_caption_right}{\let\next\strc_floats_relocate_caption_left }]% \next} \installfloatboxbuilder \v!none \strc_floats_build_box_default @@ -1987,7 +2077,7 @@ \definefloat [\v!graphic] [\v!graphics] - + % float strategy, replaces some of the above macros \installcorenamespace{floatmethods} @@ -1999,7 +2089,7 @@ \let\forcedfloatmethod\empty % set by lua \def\setfloatmethodvariables#1% \floatmethod \floatlabel \floatrow \floatcolumn - {\ctxcommand{analysefloatmethod("#1")}} + {\clf_analysefloatmethod{#1}} \def\somesomewherefloat[#1]% {\page_floats_save_somewhere_float\s!somewhere{#1}} diff --git a/Master/texmf-dist/tex/context/base/strc-ini.lua b/Master/texmf-dist/tex/context/base/strc-ini.lua index a48679e6fdf..f736427bb44 100644 --- a/Master/texmf-dist/tex/context/base/strc-ini.lua +++ b/Master/texmf-dist/tex/context/base/strc-ini.lua @@ -73,7 +73,7 @@ structures.itemgroups = structures.itemgroups or { } structures.specials = structures.specials or { } structures.counters = structures.counters or { } structures.tags = structures.tags or { } -structures.formulas = structures.formulas or { } +structures.formulas = structures.formulas or { } -- not used but reserved structures.sets = structures.sets or { } structures.marks = structures.marks or { } structures.floats = structures.floats or { } @@ -160,7 +160,7 @@ local function simplify(d,nodefault) t[k] = simplify(v) end elseif tv == "string" then - if v ~= "" and v ~= "default" then + if v ~= "" then t[k] = v end elseif tv == "boolean" then @@ -336,7 +336,8 @@ function sets.getall(namespace,block,name) end end --- messy (will be another keyword, fixedconversion) +-- messy (will be another keyword, fixedconversion) .. needs to be documented too +-- maybe we should cache local splitter = lpeg.splitat("::") @@ -376,4 +377,8 @@ end -- interface -commands.definestructureset = sets.define +interfaces.implement { + name = "definestructureset", + actions = sets.define, + arguments = { "string", "string", "string", "string", "boolean" } +} diff --git a/Master/texmf-dist/tex/context/base/strc-ini.mkvi b/Master/texmf-dist/tex/context/base/strc-ini.mkvi index 8488d1dab86..ad83cbc58c2 100644 --- a/Master/texmf-dist/tex/context/base/strc-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-ini.mkvi @@ -70,12 +70,12 @@ \unexpanded\def\defineconversionset{\dotripleempty\strc_sets_define_conversion_set} \unexpanded\def\defineprefixset {\dotripleempty\strc_sets_define_prefix_set} -% Low level versions (no optional checking). The detokenize and escaping might go away. +% Low level versions (no optional checking). The detokenize might go away. -\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:resets", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}",true)}} -\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:separators", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}} -\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\ctxcommand{definestructureset("structure:conversions","#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}} -\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:prefixes", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}} +\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\clf_definestructureset{structure:resets} {#name}{\detokenize{#set}}{\detokenize{#default}}true\relax} +\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\clf_definestructureset{structure:separators} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax} +\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\clf_definestructureset{structure:conversions}{#name}{\detokenize{#set}}{\detokenize{#default}}false\relax} +\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\clf_definestructureset{structure:prefixes} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax} \let\definestructureresetset \defineresetset \let\definestructureseparatorset \defineseparatorset diff --git a/Master/texmf-dist/tex/context/base/strc-itm.lua b/Master/texmf-dist/tex/context/base/strc-itm.lua index 4945c282fba..adec591c1c1 100644 --- a/Master/texmf-dist/tex/context/base/strc-itm.lua +++ b/Master/texmf-dist/tex/context/base/strc-itm.lua @@ -6,33 +6,58 @@ if not modules then modules = { } end modules ['strc-itm'] = { license = "see context related readme files" } -local structures = structures -local itemgroups = structures.itemgroups -local jobpasses = job.passes - -local setvariable = jobpasses.save -local getvariable = jobpasses.getfield - -function itemgroups.register(name,nofitems,maxwidth) - setvariable("itemgroup", { nofitems, maxwidth }) +local structures = structures +local itemgroups = structures.itemgroups +local jobpasses = job.passes + +local implement = interfaces.implement + +local setvariable = jobpasses.save +local getvariable = jobpasses.getfield + +local texsetcount = tex.setcount +local texsetdimen = tex.setdimen + +local f_stamp = string.formatters["itemgroup:%s:%s"] +local counts = table.setmetatableindex("number") + +-- We keep the counter at the Lua end so we can group the items within +-- an itemgroup which in turn makes for less passes when one itemgroup +-- entry is added or removed. + +local trialtypesetting = context.trialtypesetting + +local function analyzeitemgroup(name,level) + local n = counts[name] + if level == 1 then + n = n + 1 + counts[name] = n + end + local stamp = f_stamp(name,n) + local n = getvariable(stamp,level,1,0) + local w = getvariable(stamp,level,2,0) + texsetcount("local","c_strc_itemgroups_max_items",n) + texsetdimen("local","d_strc_itemgroups_max_width",w) end -function itemgroups.nofitems(name,index) - return getvariable("itemgroup", index, 1, 0) +local function registeritemgroup(name,level,nofitems,maxwidth) + local n = counts[name] + if not trialtypesetting() then + -- no trialtypsetting + setvariable(f_stamp(name,n), { nofitems, maxwidth }, level) + elseif level == 1 then + counts[name] = n - 1 + end end -function itemgroups.maxwidth(name,index) - return getvariable("itemgroup", index, 2, 0) -end - --- interface (might become counter/dimension) - -commands.registeritemgroup = itemgroups.register - -function commands.nofitems(name,index) - context(getvariable("itemgroup", index, 1, 0)) -end +implement { + name = "analyzeitemgroup", + actions = analyzeitemgroup, + arguments = { "string", "integer" } +} -function commands.maxitemwidth(name,index) - context(getvariable("itemgroup", index, 2, 0)) -end +implement { + name = "registeritemgroup", + actions = registeritemgroup, + arguments = { "string", "integer", "integer", "dimen" } +} diff --git a/Master/texmf-dist/tex/context/base/strc-itm.mkvi b/Master/texmf-dist/tex/context/base/strc-itm.mkvi index 098b863b95a..86fc9d9fd28 100644 --- a/Master/texmf-dist/tex/context/base/strc-itm.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-itm.mkvi @@ -15,6 +15,9 @@ \registerctxluafile{strc-itm}{1.001} +%D As we analyze/register widths and such we could as well push and pop the +%D numbers at the \LUA\ end (which saves a few calls). + %D Cleaning up this module happened around the time when Kate Bush came up %D with the nicest numbered list of words: 50 Words For Snow. It's therefore %D no surprise that I had that cd running several times when updating this @@ -203,7 +206,6 @@ \newdimen \d_strc_itemgroups_max_width % multipass \newcount \c_strc_itemgroups_max_items % multipass -\newcount \c_strc_itemgroups_n_of_lists \newcount \c_strc_itemgroups_n_of_items \newcount \c_strc_itemgroups_nesting \newcount \c_strc_itemgroups_column_depth @@ -227,13 +229,10 @@ \let \currentitemgroupsegments \empty \def\strc_itemgroups_register_status - {\iftrialtypesetting \else - \ctxcommand{registeritemgroup("\currentitemgroup",\number\c_strc_itemgroups_n_of_items,"\itemgroupparameter\c!maxwidth")}% - \fi} + {\clf_registeritemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\c_strc_itemgroups_n_of_items\dimexpr\itemgroupparameter\c!maxwidth\relax} \def\strc_itemgroups_check_n_of_items % we could do this at the lua end and save a call (i.e. will be dimen and counter) - {\c_strc_itemgroups_max_items\ctxcommand{nofitems("\currentitemgroup",\number\c_strc_itemgroups_n_of_lists)}\relax - \d_strc_itemgroups_max_width\ctxcommand{maxitemwidth("\currentitemgroup",\number\c_strc_itemgroups_n_of_lists)}\scaledpoint + {\clf_analyzeitemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\relax \edef\currentnofitems{\the\c_strc_itemgroups_max_items}} % todo: \dodosetreference -> \strc_counters_register_component (to be checked) @@ -249,47 +248,51 @@ \fi \fi} \def\strc_itemgroups_insert_reference_indeed % maybe we need a 'frozen counter' numberdata blob / quick hack .. .mive this to strc-ref - {%\setnextinternalreference + {% needs testing, gave problems: + \setnextinternalreference % no need to collect nodes in \b_strc_destination_nodes here ... maybe at some point \strc_references_start_destination_nodes - % this is somewhat over the top ... we should use the counter's reference - \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","\currentitemreference", - { - metadata = { - kind = "item",% ? - catcodes = \the\catcodetable, - xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text - }, - references = { - % internal = \nextinternalreference, % no: this spoils references - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - prefixdata = structures.helpers.simplify { - prefix = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefix", - separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset", - conversion = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion\!!es, - conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset", - set = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset", - segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments", - % segments = "\askedprefixsegments", - connector = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector\!!es, - }, - numberdata = structures.helpers.simplify { - numbers = structures.counters.compact("\v_strc_itemgroups_counter",nil,true), - separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset", - % conversion = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion", - % conversion = "\currentitemgroupconversionset", - % conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset", - % todo: fixedconversion = "\currentitemgroupconversionset", % temp hack: - conversionset = "fixed::\currentitemgroupconversionset", - % - % for the moment no stopper, we need to make references configurable first - % stopper = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper\!!es, - segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments", - }, - }) + % this is somewhat over the top ... we should use the counter's reference + \clf_setreferenceattribute + {% + metadata {% + kind {item}% was item, why? + \ifx\currentreferencecoding\s!xml + xmlroot {\xmldocument}% only useful when text + \fi + catcodes \catcodetable + }% + references {% + internal \nextinternalreference % no: this spoils references + % block {\currentsectionblock}% + view {\interactionparameter\c!focus}% + prefix {\referenceprefix}% + reference {\currentitemreference}% + }% + prefixdata {% + prefix {\namedcounterparameter\v_strc_itemgroups_counter\c!prefix}% + separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset}% + conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion}% + conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset}% + set {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset}% + segments {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments}% + % segments {\askedprefixsegments}% + connector {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector}% + }% + numberdata {% + numbers {\v_strc_itemgroups_counter}% + separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset}% + % conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion}% + % conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset}% + % fixedconversion {\currentitemgroupconversionset}% + conversionset {fixed::\currentitemgroupconversionset}% temp hack + % + % for the moment no stopper, we need to make references configurable first + % stopper {\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper}% + segments {\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments}% + }% }% + \relax \strc_references_stop_destination_nodes \xdef\currentdestinationattribute{\number\lastdestinationattribute}% % will become an option: @@ -467,7 +470,7 @@ \let\strc_itemgroups_margin_symbol\empty \let\strc_itemgroups_extra_symbol\empty % - \global\letitemgroupparameter\c!maxwidth\!!zerocount + \global\letitemgroupparameter\c!maxwidth\!!zeropoint } \setvalue{\??itemgroupfirst\v!intro }{\settrue\c_strc_itemgroups_intro } @@ -482,10 +485,11 @@ \csname\??itemgroupfirst#option\endcsname \fi} -\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi +\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi +\ifdefined\dotagsetitem \else \let\dotagsetitem \gobbleoneargument \fi \def\strc_itemgroups_tag_start_group - {\dostarttagged\t!itemgroup\currentitemgroup + {\dostarttaggedchained\t!itemgroup\currentparentitemgroup\??itemgroup \dotagsetitemgroup} \def\strc_itemgroups_tag_stop_group @@ -576,7 +580,7 @@ % can be made a bit faster \def\strc_itemgroups_setup_each#category#whatever% - {\doifassignmentelse{#whatever} + {\doifelseassignment{#whatever} {\strc_itemgroups_normal_setup[#category][#whatever]} {\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}} @@ -587,7 +591,7 @@ {\strc_itemgroups_normal_setup[#category:#level][\c!option={#whatever}]} \def\strc_itemgroups_setup_list#subcategories#category#whatever% - {\doifassignmentelse{#whatever} + {\doifelseassignment{#whatever} {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}} {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}} @@ -639,9 +643,9 @@ \def\strc_itemgroups_set_symbol#symbol% {\edef\strc_itemgroups_tmp_symbol{#symbol}% \ifx\strc_itemgroups_tmp_symbol\empty \else - \doifsymboldefinedelse\strc_itemgroups_tmp_symbol + \doifelsesymboldefined\strc_itemgroups_tmp_symbol \strc_itemgroups_set_symbol_symbol - {\doifconversiondefinedelse\strc_itemgroups_tmp_symbol + {\doifelseconversiondefined\strc_itemgroups_tmp_symbol \strc_itemgroups_set_symbol_conversion \donothing}% \fi} @@ -706,7 +710,7 @@ \ifthirdargument \strc_itemgroups_start_indeed[#options][#settings]% \else\ifsecondargument - \doifassignmentelse{#options} + \doifelseassignment{#options} {\strc_itemgroups_start_indeed[][#options]} {\strc_itemgroups_start_indeed[#options][]}% \else @@ -745,7 +749,6 @@ \iftrialtypesetting \strc_counters_save\v_strc_itemgroups_counter \fi - \global\advance\c_strc_itemgroups_n_of_lists\plusone \c_strc_itemgroups_n_of_items\zerocount \strc_itemgroups_check_n_of_items \ifx\itemgroupoptions\empty @@ -811,7 +814,7 @@ \ifinsidecolumns\else\ifcase\c_strc_itemgroups_column_depth \global\c_strc_itemgroups_column_depth\c_strc_itemgroups_nesting % global ? \strc_itemgroups_before_command - \strc_itemgroups_tag_start_group + %\strc_itemgroups_tag_start_group \strc_itemgroups_start_columns \fi\fi \fi @@ -941,8 +944,7 @@ \fi\fi % new test, needed in sidefloats (surfaced in volker's proceedings) \iftrialtypesetting - \strc_counters_restore\v_strc_itemgroups_counter - \global\advance\c_strc_itemgroups_n_of_lists\minusone + \strc_counters_restore\v_strc_itemgroups_counter % could happen in LUA \fi \global\advance\c_strc_itemgroups_nesting\minusone \xdef\currentitemlevel{\number\c_strc_itemgroups_nesting}% @@ -965,7 +967,7 @@ {\setfalse\c_strc_itemgroups_first % \begingroup % (3) \ifcase\c_strc_itemgroups_nesting - % 0 + % 0 \or \strc_itemgroups_start_item_first_one % 1 \else @@ -1039,15 +1041,11 @@ \strc_itemgroups_start_item_next \fi \ifconditional\c_strc_itemgroups_concat - % \vskip-\lastskip % we cannot use a \dimexpr here because - % \vskip-\lineheight % then we loose the stretch and shrink - % \nobreak - % - \blank[\v!overlay]% new per 2014-03-27 - % + \spac_overlay_lines % see spac-ver.mkvi ... a typical potential problem \setfalse\c_strc_itemgroups_concat \fi \dostarttagged\t!item\empty + % \dotagsetitem\empty \dostarttagged\t!itemtag\empty \strc_itemgroups_insert_item \dostoptagged @@ -1088,17 +1086,24 @@ \fi \fi \strc_itemgroups_start_item[#reference]% - \groupedcommand\strc_itemgroups_start_head_indeed\strc_itemgroups_stop_head_indeed} + \pickupgroupedcommand + \strc_itemgroups_start_head_indeed + \strc_itemgroups_stop_head_indeed + \strc_itemgroups_head_body_indeed} \unexpanded\def\stopitemgrouphead - {\stopitemgroupitem} + {\dostoptagged + \stopitemgroupitem} \unexpanded\def\strc_itemgroups_start_head_indeed {\settrue\c_strc_itemgroups_head + \dotagsetitem\s!head% % weird place + \dostarttagged\t!itemhead\empty \useitemgroupstyleandcolor\c!headstyle\c!headcolor\ignorespaces} \unexpanded\def\strc_itemgroups_stop_head_indeed {\removeunwantedspaces + \dostoptagged \ifconditional\c_strc_itemgroups_text \space \ignorespaces @@ -1107,7 +1112,10 @@ \fi \strc_itemgroups_insert_breakno \ifconditional\c_strc_itemgroups_pack\else\strc_itemgroups_after_head_command\fi - \strc_itemgroups_insert_breakno + \strc_itemgroups_insert_breakno} + +\unexpanded\def\strc_itemgroups_head_body_indeed + {\dostarttagged\t!itembody\empty \noindentation} % Simple commands. @@ -1125,30 +1133,37 @@ \unexpanded\def\strc_itemgroups_start_symbol#text% {\def\strc_itemgroups_extra_symbol{#text}% \settrue\c_strc_itemgroups_symbol - \startitemgroupitem} + \startitemgroupitem + \dotagsetitem\s!symbol} \unexpanded\def\strc_itemgroups_start_dummy {\strc_itemgroups_start_symbol\strut\strut} % two ? \unexpanded\def\strc_itemgroups_start_subitem {\settrue\c_strc_itemgroups_sub - \startitemgroupitem} + \startitemgroupitem + \dotagsetitem\s!sub} \unexpanded\def\strc_itemgroups_start_edge#text% {\strc_itemgroups_start_symbol {\strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting + \dostarttagged\t!ignore\empty % for the moment, maybe an attribute \hbox to \d_strc_itemgroups_list_width - {#text\hskip\itemgroupparameter\c!distance}}} + {#text\hskip\itemgroupparameter\c!distance}% + \dostoptagged}} \unexpanded\def\strc_itemgroups_start_margin#text% {\def\strc_itemgroups_margin_symbol % brrr - {\llap + {\dostarttagged\t!ignore\empty % for the moment, maybe an attribute + \llap {\begingroup \useitemgroupstyleandcolor\c!marstyle\c!marcolor #text% keep em/ex local \endgroup - \hskip\dimexpr\leftskip+\leftmargindistance\relax}}% - \startitemgroupitem} + \hskip\dimexpr\leftskip+\leftmargindistance\relax}% + \dostoptagged}% + \startitemgroupitem + \dotagsetitem\s!margin} \unexpanded\def\strc_itemgroups_start_text#text% {\def\strc_itemgroups_extra_symbol{#text}% @@ -1222,7 +1237,9 @@ {\dontcomplain \hbox to \d_strc_itemgroups_list_width {\ifconditional\c_strc_itemgroups_sub + \dostarttagged\t!ignore\empty \llap{+\enspace}% + \dostoptagged \fi \strc_itemgroups_left_sym_filler \box\b_strc_itemgroups % can already have a forced widt, only factor handled here @@ -1232,7 +1249,9 @@ \def\strc_itemgroups_handle_lapped_item_negative {\llap {\ifconditional\c_strc_itemgroups_sub + \dostarttagged\t!ignore\empty \llap{+\enspace}% + \dostoptagged \fi \box\b_strc_itemgroups \hskip\leftmargindistance}} @@ -1240,7 +1259,9 @@ \def\strc_itemgroups_handle_groups_text_item {\hbox {\ifconditional\c_strc_itemgroups_sub + \dostarttagged\t!ignore\empty +\enspace + \dostoptagged \fi \box\b_strc_itemgroups \hskip\interwordspace}% @@ -1249,7 +1270,9 @@ \def\strc_itemgroups_handle_groups_inline_item {\hbox to \d_strc_itemgroups_list_width {\ifconditional\c_strc_itemgroups_sub + \dostarttagged\t!ignore\empty \llap{+\enspace}% + \dostoptagged \fi \box\b_strc_itemgroups \hss}} % was: \hfill @@ -1285,8 +1308,8 @@ \setfalse\c_strc_itemgroups_symbol} \def\strc_itemgroups_make_fitting_box - {\ifdim\wd\b_strc_itemgroups>\itemgroupparameter\c!maxwidth\scaledpoint\relax % brr, sp - \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\number\wd\b_strc_itemgroups}}% + {\ifdim\wd\b_strc_itemgroups>\itemgroupparameter\c!maxwidth\relax + \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\the\wd\b_strc_itemgroups}}% \fi \ifdim\d_strc_itemgroups_max_width>\zeropoint \setbox\b_strc_itemgroups\simplealignedbox @@ -1539,7 +1562,7 @@ {\strc_itemgroups_item_alone} \def\strc_itemgroups_item_alone[#category]#text\par - {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% + {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% \startitem#text\stopitem \stopitemgroup} @@ -1547,7 +1570,7 @@ {\strc_itemgroups_head_alone} \def\strc_itemgroups_head_alone[#category]#head\par#body\par - {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% + {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% \starthead{#head}#body\stophead \stopitemgroup} diff --git a/Master/texmf-dist/tex/context/base/strc-lab.mkiv b/Master/texmf-dist/tex/context/base/strc-lab.mkiv index 3e661712632..ac49941aaee 100644 --- a/Master/texmf-dist/tex/context/base/strc-lab.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-lab.mkiv @@ -101,7 +101,7 @@ \ifx\p_counter\empty % \let\p_counter\currentlabel \fi - \doifcounterelse\p_counter\donothing{\strc_labels_define_counter\p_counter}% + \doifelsecounter\p_counter\donothing{\strc_labels_define_counter\p_counter}% \letlabelparameter\s!counter\p_counter \to \everydefinelabel @@ -113,6 +113,7 @@ \setvalue{\??constructioninitializer\v!label}% {\let\currentlabel \currentconstruction \let\constructionparameter \labelparameter + \let\constructionnamespace \??label \let\detokenizedconstructionparameter\detokenizedlabelparameter \let\letconstructionparameter \letlabelparameter \let\useconstructionstyleandcolor \uselabelstyleandcolor diff --git a/Master/texmf-dist/tex/context/base/strc-lev.lua b/Master/texmf-dist/tex/context/base/strc-lev.lua index 947889e1e1c..d7ffd6af434 100644 --- a/Master/texmf-dist/tex/context/base/strc-lev.lua +++ b/Master/texmf-dist/tex/context/base/strc-lev.lua @@ -8,26 +8,30 @@ if not modules then modules = { } end modules ['strc-lev'] = { local insert, remove = table.insert, table.remove -local context = context -local commands = commands +local context = context +local interfaces = interfaces -local sections = structures.sections -local default = interfaces.variables.default +local sections = structures.sections +local implement = interfaces.implement -sections.levels = sections.levels or { } +local v_default = interfaces.variables.default -local level, levels, categories = 0, sections.levels, { } +sections.levels = sections.levels or { } -storage.register("structures/sections/levels", levels, "structures.sections.levels") +local level = 0 +local levels = sections.levels +local categories = { } local f_two_colon = string.formatters["%s:%s"] -function commands.definesectionlevels(category,list) +storage.register("structures/sections/levels", levels, "structures.sections.levels") + +local function definesectionlevels(category,list) levels[category] = utilities.parsers.settings_to_array(list) end -function commands.startsectionlevel(category) - category = category ~= "" and category or default +local function startsectionlevel(category) + category = category ~= "" and category or v_default level = level + 1 local lc = levels[category] if not lc or level > #lc then @@ -38,7 +42,7 @@ function commands.startsectionlevel(category) insert(categories,category) end -function commands.stopsectionlevel() +local function stopsectionlevel() local category = remove(categories) if category then local lc = levels[category] @@ -52,3 +56,20 @@ function commands.stopsectionlevel() -- error end end + +implement { + name = "definesectionlevels", + actions = definesectionlevels, + arguments = { "string", "string" } +} + +implement { + name = "startsectionlevel", + actions = startsectionlevel, + arguments = "string" +} + +implement { + name = "stopsectionlevel", + actions = stopsectionlevel, +} diff --git a/Master/texmf-dist/tex/context/base/strc-lev.mkvi b/Master/texmf-dist/tex/context/base/strc-lev.mkvi index b3ec2a2d5a4..dae3f28e30e 100644 --- a/Master/texmf-dist/tex/context/base/strc-lev.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-lev.mkvi @@ -26,17 +26,17 @@ \unexpanded\def\definesectionlevels{\dodoubleargument\strc_levels_define} \unexpanded\def\startsectionlevel {\dosingleempty \strc_levels_start } -\unexpanded\def\strc_levels_define[#category][#list]{\ctxcommand{definesectionlevels("#category","#list")}} -\unexpanded\def\strc_levels_start [#category]{\ctxcommand{startsectionlevel("#category")}} -\unexpanded\def\stopsectionlevel {\ctxcommand{stopsectionlevel()}} +\unexpanded\def\strc_levels_define[#category][#list]{\clf_definesectionlevels{#category}{#list}} +\unexpanded\def\strc_levels_start [#category]{\clf_startsectionlevel{#category}} +\unexpanded\def\stopsectionlevel {\clf_stopsectionlevel} \unexpanded\def\nostarthead{\dotripleargument\strc_levels_start_nop} % used at the lua end \unexpanded\def\nostophead {\dosingleargument\strc_levels_stop_nop } % used at the lua end \unexpanded\def\strc_levels_start[#category]% - {\doifassignmentelse{#category} - {\ctxcommand{startsectionlevel("\v!default")}[#category]} - {\ctxcommand{startsectionlevel("#category")}}} + {\doifelseassignment{#category} + {\clf_startsectionlevel{\v!default}[#category]} + {\clf_startsectionlevel{#category}}} \unexpanded\def\strc_levels_start_nop[#category][#settings][#userdata]% {\blank diff --git a/Master/texmf-dist/tex/context/base/strc-lnt.mkvi b/Master/texmf-dist/tex/context/base/strc-lnt.mkvi index f84521002e1..ee7d5dd8854 100644 --- a/Master/texmf-dist/tex/context/base/strc-lnt.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-lnt.mkvi @@ -92,10 +92,10 @@ \def\page_lines_in_to {\in[lr:e:\currentlinenotereference]} \unexpanded\def\strc_linenotes_range_normal#1% order - {\doifreferencefoundelse{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from + {\doifelsereferencefound{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from \ifconditional\c_page_lines_current_from \xdef\m_page_lines_current_from{\currentreferencelinenumber}% - \doifreferencefoundelse{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to + \doifelsereferencefound{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to \ifconditional\c_page_lines_current_to \xdef\m_page_lines_current_to{\currentreferencelinenumber}% \page_lines_in_from @@ -111,10 +111,10 @@ \fi} \unexpanded\def\strc_linenotes_range_sparse#1% order - {\doifreferencefoundelse{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from + {\doifelsereferencefound{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from \ifconditional\c_page_lines_current_from \xdef\m_page_lines_current_from{\currentreferencelinenumber}% - \doifreferencefoundelse{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to + \doifelsereferencefound{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to \ifconditional\c_page_lines_current_to \xdef\m_page_lines_current_to{\currentreferencelinenumber}% \ifx\m_page_lines_previous_from\m_page_lines_current_from diff --git a/Master/texmf-dist/tex/context/base/strc-lst.lua b/Master/texmf-dist/tex/context/base/strc-lst.lua index 16160e2735f..4c9a7217e7e 100644 --- a/Master/texmf-dist/tex/context/base/strc-lst.lua +++ b/Master/texmf-dist/tex/context/base/strc-lst.lua @@ -15,12 +15,16 @@ if not modules then modules = { } end modules ['strc-lst'] = { -- -- move more to commands -local format, gmatch, gsub = string.format, string.gmatch, string.gsub local tonumber, type = tonumber, type -local concat, insert, remove = table.concat, table.insert, table.remove +local concat, insert, remove, sort = table.concat, table.insert, table.remove, table.sort local lpegmatch = lpeg.match -local simple_hash_to_string, settings_to_hash = utilities.parsers.simple_hash_to_string, utilities.parsers.settings_to_hash -local allocate, checked = utilities.storage.allocate, utilities.storage.checked + +local setmetatableindex = table.setmetatableindex +local sortedkeys = table.sortedkeys + +local settings_to_set = utilities.parsers.settings_to_set +local allocate = utilities.storage.allocate +local checked = utilities.storage.checked local trace_lists = false trackers.register("structures.lists", function(v) trace_lists = v end) @@ -28,22 +32,23 @@ local report_lists = logs.reporter("structure","lists") local context = context local commands = commands - -local texgetcount = tex.getcount +local implement = interfaces.implement local structures = structures local lists = structures.lists local sections = structures.sections local helpers = structures.helpers local documents = structures.documents -local pages = structures.pages local tags = structures.tags +local counters = structures.counters local references = structures.references local collected = allocate() local tobesaved = allocate() local cached = allocate() local pushed = allocate() +local kinds = allocate() +local names = allocate() lists.collected = collected lists.tobesaved = tobesaved @@ -53,19 +58,46 @@ lists.enhancers = lists.enhancers or { } lists.ordered = allocate(lists.ordered or { }) -- to be checked lists.cached = cached lists.pushed = pushed +lists.kinds = kinds +lists.names = names + +local sorters = sorters +local sortstripper = sorters.strip +local sortsplitter = sorters.splitters.utf +local sortcomparer = sorters.comparers.basic local sectionblocks = allocate() lists.sectionblocks = sectionblocks references.specials = references.specials or { } -local variables = interfaces.variables local matchingtilldepth = sections.matchingtilldepth local numberatdepth = sections.numberatdepth +local getsectionlevel = sections.getlevel +local typesetnumber = sections.typesetnumber +local autosectiondepth = sections.autodepth --- -- -- -- -- -- +local variables = interfaces.variables -local function zerostrippedconcat(t,separator) -- for the moment not public +local v_all = variables.all +local v_reference = variables.reference +local v_title = variables.title +local v_number = variables.reference +local v_command = variables.command +local v_text = variables.text +local v_current = variables.current +local v_previous = variables.previous +local v_next = variables.next +local v_intro = variables.intro +local v_here = variables.here +local v_component = variables.component +local v_reference = variables.reference +local v_local = variables["local"] +local v_default = variables.default + +-- for the moment not public -- + +local function zerostrippedconcat(t,separator) local f, l = 1, #t for i=f,l do if t[i] == 0 then @@ -85,11 +117,11 @@ end local function initializer() -- create a cross reference between internal references -- and list entries - local collected = lists.collected - local internals = checked(references.internals) - local ordered = lists.ordered + local collected = lists.collected + local internals = checked(references.internals) + local ordered = lists.ordered local usedinternals = references.usedinternals - local blockdone = { } + local blockdone = { } for i=1,#collected do local c = collected[i] local m = c.metadata @@ -109,7 +141,8 @@ local function initializer() end end -- access by order in list - local kind, name = m.kind, m.name + local kind = m.kind + local name = m.name if kind and name then local ok = ordered[kind] if ok then @@ -122,6 +155,12 @@ local function initializer() else ordered[kind] = { [name] = { c } } end + kinds[kind] = true + names[name] = true + elseif kind then + kinds[kind] = true + elseif name then + names[name] = true end end if r then @@ -147,7 +186,7 @@ end job.register('structures.lists.collected', tobesaved, initializer, finalizer) -local groupindices = table.setmetatableindex("table") +local groupindices = setmetatableindex("table") function lists.groupindex(name,group) local groupindex = groupindices[name] @@ -157,14 +196,23 @@ end -- we could use t (as hash key) in order to check for dup entries function lists.addto(t) -- maybe more more here (saves parsing at the tex end) - local m = t.metadata - local u = t.userdata - if u and type(u) == "string" then - t.userdata = helpers.touserdata(u) - end + local metadata = t.metadata + local userdata = t.userdata local numberdata = t.numberdata + if userdata and type(userdata) == "string" then + t.userdata = helpers.touserdata(userdata) + end + if not metadata.level then + metadata.level = structures.sections.currentlevel() -- this is not used so it will go away + end + if numberdata then + local numbers = numberdata.numbers + if type(numbers) == "string" then + numberdata.numbers = counters.compact(numbers,nil,true) + end + end local group = numberdata and numberdata.group - local name = m.name + local name = metadata.name if not group then -- forget about it elseif group == "" then @@ -180,6 +228,9 @@ function lists.addto(t) -- maybe more more here (saves parsing at the tex end) setcomponent(t) -- can be inlined end local r = t.references + if r and not r.section then + r.section = structures.sections.currentid() + end local i = r and r.internal or 0 -- brrr local p = pushed[i] if not p then @@ -221,6 +272,11 @@ end local enhanced = { } +local synchronizepage = function(r) -- bah ... will move + synchronizepage = references.synchronizepage + return synchronizepage(r) +end + function lists.enhance(n) local l = cached[n] if not l then @@ -237,7 +293,7 @@ function lists.enhance(n) -- save in the right order (happens at shipout) lists.tobesaved[#lists.tobesaved+1] = l -- default enhancer (cross referencing) - references.realpage = texgetcount("realpageno") + synchronizepage(references) -- tags local kind = metadata.kind local name = metadata.name @@ -267,51 +323,88 @@ end local nesting = { } function lists.pushnesting(i) - local parent = lists.result[i] - local name = parent.metadata.name + local parent = lists.result[i] + local name = parent.metadata.name local numberdata = parent and parent.numberdata - local numbers = numberdata and numberdata.numbers - local number = numbers and numbers[sections.getlevel(name)] or 0 - insert(nesting, { number = number, name = name, result = lists.result, parent = parent }) + local numbers = numberdata and numberdata.numbers + local number = numbers and numbers[getsectionlevel(name)] or 0 + insert(nesting, { + number = number, + name = name, + result = lists.result, + parent = parent + }) end function lists.popnesting() local old = remove(nesting) - lists.result = old.result + if old then + lists.result = old.result + else + report_lists("nesting error") + end end --- will be split - -- Historically we had blocks but in the mkiv approach that could as well be a level -- which would simplify things a bit. -local splitter = lpeg.splitat(":") +local splitter = lpeg.splitat(":") -- maybe also :: or have a block parameter --- this will become filtercollected(specification) and then we'll also have sectionblock as key - -local sorters = { - [variables.command] = function(a,b) +local listsorters = { + [v_command] = function(a,b) if a.metadata.kind == "command" or b.metadata.kind == "command" then return a.references.internal < b.references.internal else return a.references.order < b.references.order end end, - [variables.all] = function(a,b) + [v_all] = function(a,b) return a.references.internal < b.references.internal end, + [v_title] = function(a,b) + local da = a.titledata + local db = b.titledata + if da and db then + local ta = da.title + local tb = db.title + if ta and tb then + local sa = da.split + if not sa then + sa = sortsplitter(sortstripper(ta)) + da.split = sa + end + local sb = db.split + if not sb then + sb = sortsplitter(sortstripper(tb)) + db.split = sb + end + return sortcomparer(da,db) == -1 + end + end + return a.references.internal < b.references.internal + end } --- some day soon we will pass a table .. also split the function +-- was: names, criterium, number, collected, forced, nested, sortorder -local function filtercollected(names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string - local numbers, depth = documents.data.numbers, documents.data.depth - local result, nofresult, detail = { }, 0, nil - local block = false -- all - criterium = gsub(criterium or ""," ","") -- not needed - -- new, will be applied stepwise +local filters = setmetatableindex(function(t,k) return t[v_default] end) + +local function filtercollected(specification) + -- + local names = specification.names or { } + local criterium = specification.criterium or v_default + local number = 0 -- specification.number + local reference = specification.reference or "" + local collected = specification.collected or lists.collected + local forced = specification.forced or { } + local nested = specification.nested or false + local sortorder = specification.sortorder or specification.order + -- + local numbers = documents.data.numbers + local depth = documents.data.depth + local block = false -- all local wantedblock, wantedcriterium = lpegmatch(splitter,criterium) -- block:criterium - if wantedblock == "" or wantedblock == variables.all or wantedblock == variables.text then + if wantedblock == "" or wantedblock == v_all or wantedblock == v_text then criterium = wantedcriterium ~= "" and wantedcriterium or criterium elseif not wantedcriterium then block = documents.data.block @@ -321,236 +414,393 @@ local function filtercollected(names, criterium, number, collected, forced, nest if block == "" then block = false end --- print(">>",block,criterium) - -- - forced = forced or { } -- todo: also on other branched, for the moment only needed for bookmarks if type(names) == "string" then - names = settings_to_hash(names) + names = settings_to_set(names) end - local all = not next(names) or names[variables.all] or false + local all = not next(names) or names[v_all] or false + -- + specification.names = names + specification.criterium = criterium + specification.number = 0 -- obsolete + specification.reference = reference -- new + specification.collected = collected + specification.forced = forced -- todo: also on other branched, for the moment only needed for bookmarks + specification.nested = nested + specification.sortorder = sortorder + specification.numbers = numbers + specification.depth = depth + specification.block = block + specification.all = all + -- if trace_lists then - report_lists("filtering names %a, criterium %a, block %a, number %a",names,criterium,block or "*",number) + report_lists("filtering names %,t, criterium %a, block %a",sortedkeys(names), criterium, block or "*") end - if criterium == variables.intro then - -- special case, no structure yet - for i=1,#collected do - local v = collected[i] + local result = filters[criterium](specification) + if trace_lists then + report_lists("criterium %a, block %a, found %a",specification.criterium, specification.block or "*", #result) + end + -- + if sortorder then -- experiment + local sorter = listsorters[sortorder] + if sorter then + if trace_lists then + report_lists("sorting list using method %a",sortorder) + end + for i=1,#result do + result[i].references.order = i + end + sort(result,sorter) + end + end + -- + return result +end + +filters[v_intro] = function(specification) + local collected = specification.collected + local result = { } + local nofresult = #result + local all = specification.all + local names = specification.names + for i=1,#collected do + local v = collected[i] + local metadata = v.metadata + if metadata and (all or names[metadata.name or false]) then local r = v.references if r and r.section == 0 then nofresult = nofresult + 1 result[nofresult] = v end end - elseif all or criterium == variables.all or criterium == variables.text then - for i=1,#collected do - local v = collected[i] - local r = v.references - if r and (not block or not r.block or block == r.block) then - local metadata = v.metadata - if metadata then - local name = metadata.name or false - local sectionnumber = (r.section == 0) or sections.collected[r.section] - if forced[name] or (sectionnumber and not metadata.nolist and (all or names[name])) then -- and not sectionnumber.hidenumber then - nofresult = nofresult + 1 - result[nofresult] = v - end - end - end - end - elseif criterium == variables.current then - if depth == 0 then - return filtercollected(names,variables.intro,number,collected,forced,false,sortorder) - else + end + return result +end + +filters[v_reference] = function(specification) + local collected = specification.collected + local result = { } + local nofresult = #result + local names = specification.names + local sections = sections.collected + local reference = specification.reference + if reference ~= "" then + local prefix, rest = lpegmatch(references.prefixsplitter,reference) -- p::r + local r = prefix and rest and references.derived[prefix][rest] or references.derived[""][reference] + local s = r and r.numberdata -- table ref ! + if s then + local depth = getsectionlevel(r.metadata.name) + local numbers = s.numbers for i=1,#collected do local v = collected[i] local r = v.references if r and (not block or not r.block or block == r.block) then - local sectionnumber = sections.collected[r.section] - if sectionnumber then -- and not sectionnumber.hidenumber then - local cnumbers = sectionnumber.numbers - local metadata = v.metadata - if cnumbers then - if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers > depth then - local ok = true - for d=1,depth do - local cnd = cnumbers[d] - if not (cnd == 0 or cnd == numbers[d]) then - ok = false - break - end - end - if ok then - nofresult = nofresult + 1 - result[nofresult] = v - end + local metadata = v.metadata + if metadata and names[metadata.name or false] then + local sectionnumber = (r.section == 0) or sections[r.section] + if sectionnumber then + if matchingtilldepth(depth,numbers,sectionnumber.numbers) then + nofresult = nofresult + 1 + result[nofresult] = v end end end end end - end - elseif criterium == variables.here then - -- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers - if depth == 0 then - return filtercollected(names,variables.intro,number,collected,forced,false,sortorder) else - for i=1,#collected do - local v = collected[i] - local r = v.references - if r then -- and (not block or not r.block or block == r.block) then - local sectionnumber = sections.collected[r.section] - if sectionnumber then -- and not sectionnumber.hidenumber then - local cnumbers = sectionnumber.numbers - local metadata = v.metadata - if cnumbers then - if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then - local ok = true - for d=1,depth do - local cnd = cnumbers[d] - if not (cnd == 0 or cnd == numbers[d]) then - ok = false - break - end - end - if ok then - nofresult = nofresult + 1 - result[nofresult] = v - end - end - end - end + report_lists("unknown reference %a specified",reference) + end + else + report_lists("no reference specified") + end + return result +end + +filters[v_all] = function(specification) + local collected = specification.collected + local result = { } + local nofresult = #result + local block = specification.block + local all = specification.all + local forced = specification.forced + local names = specification.names + local sections = sections.collected + for i=1,#collected do + local v = collected[i] + local r = v.references + if r and (not block or not r.block or block == r.block) then + local metadata = v.metadata + if metadata then + local name = metadata.name or false + local sectionnumber = (r.section == 0) or sections[r.section] + if forced[name] or (sectionnumber and not metadata.nolist and (all or names[name])) then -- and not sectionnumber.hidenumber then + nofresult = nofresult + 1 + result[nofresult] = v end end end - elseif criterium == variables.previous then - if depth == 0 then - return filtercollected(names,variables.intro,number,collected,forced,false,sortorder) - else - for i=1,#collected do - local v = collected[i] - local r = v.references - if r and (not block or not r.block or block == r.block) then - local sectionnumber = sections.collected[r.section] - if sectionnumber then -- and not sectionnumber.hidenumber then - local cnumbers = sectionnumber.numbers - local metadata = v.metadata - if cnumbers then - if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then - local ok = true - for d=1,depth-1 do - local cnd = cnumbers[d] - if not (cnd == 0 or cnd == numbers[d]) then - ok = false - break - end - end - if ok then - nofresult = nofresult + 1 - result[nofresult] = v - end + end + return result +end + +filters[v_text] = filters[v_all] + +filters[v_current] = function(specification) + if specification.depth == 0 then + specification.nested = false + specification.criterium = v_intro + return filters[v_intro](specification) + end + local collected = specification.collected + local result = { } + local nofresult = #result + local depth = specification.depth + local block = specification.block + local all = specification.all + local names = specification.names + local numbers = specification.numbers + local sections = sections.collected + for i=1,#collected do + local v = collected[i] + local r = v.references + if r and (not block or not r.block or block == r.block) then + local sectionnumber = sections[r.section] + if sectionnumber then -- and not sectionnumber.hidenumber then + local cnumbers = sectionnumber.numbers + local metadata = v.metadata + if cnumbers then + if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers > depth then + local ok = true + for d=1,depth do + local cnd = cnumbers[d] + if not (cnd == 0 or cnd == numbers[d]) then + ok = false + break end end + if ok then + nofresult = nofresult + 1 + result[nofresult] = v + end end end end end - elseif criterium == variables["local"] then -- not yet ok - local nested = nesting[#nesting] - if nested then - return filtercollected(names,nested.name,nested.number,collected,forced,nested,sortorder) - elseif sections.autodepth(documents.data.numbers) == 0 then - return filtercollected(names,variables.all,number,collected,forced,false,sortorder) - else - return filtercollected(names,variables.current,number,collected,forced,false,sortorder) - end - elseif criterium == variables.component then - -- special case, no structure yet - local component = resolvers.jobs.currentcomponent() or "" - if component ~= "" then - for i=1,#collected do - local v = collected[i] - local r = v.references - local m = v.metadata - if r and r.component == component and (m and names[m.name] or all) then - nofresult = nofresult + 1 - result[nofresult] = v + end + return result +end + +filters[v_here] = function(specification) + -- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers + if specification.depth == 0 then + specification.nested = false + specification.criterium = v_intro + return filters[v_intro](specification) + end + local collected = specification.collected + local result = { } + local nofresult = #result + local depth = specification.depth + local block = specification.block + local all = specification.all + local names = specification.names + local numbers = specification.numbers + local sections = sections.collected + for i=1,#collected do + local v = collected[i] + local r = v.references + if r then -- and (not block or not r.block or block == r.block) then + local sectionnumber = sections[r.section] + if sectionnumber then -- and not sectionnumber.hidenumber then + local cnumbers = sectionnumber.numbers + local metadata = v.metadata + if cnumbers then + if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then + local ok = true + for d=1,depth do + local cnd = cnumbers[d] + if not (cnd == 0 or cnd == numbers[d]) then + ok = false + break + end + end + if ok then + nofresult = nofresult + 1 + result[nofresult] = v + end + end end end end - else -- sectionname, number - -- not the same as register - local depth = sections.getlevel(criterium) - local number = tonumber(number) or numberatdepth(depth) or 0 - if trace_lists then - local t = sections.numbers() - detail = format("depth %s, number %s, numbers %s, startset %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected) - end - if number > 0 then - local pnumbers = nil - local pblock = block - local parent = nested and nested.parent - if parent then - pnumbers = parent.numberdata.numbers or pnumbers -- so local as well as nested - pblock = parent.references.block or pblock - end - for i=1,#collected do - local v = collected[i] - local r = v.references - if r and (not block or not r.block or pblock == r.block) then - local sectionnumber = sections.collected[r.section] - if sectionnumber then - local metadata = v.metadata - local cnumbers = sectionnumber.numbers - if cnumbers then - if (all or names[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers,pnumbers) then - nofresult = nofresult + 1 - result[nofresult] = v + end + return result +end + +filters[v_previous] = function(specification) + if specification.depth == 0 then + specification.nested = false + specification.criterium = v_intro + return filters[v_intro](specification) + end + local collected = specification.collected + local result = { } + local nofresult = #result + local block = specification.block + local all = specification.all + local names = specification.names + local numbers = specification.numbers + local sections = sections.collected + local depth = specification.depth + for i=1,#collected do + local v = collected[i] + local r = v.references + if r and (not block or not r.block or block == r.block) then + local sectionnumber = sections[r.section] + if sectionnumber then -- and not sectionnumber.hidenumber then + local cnumbers = sectionnumber.numbers + local metadata = v.metadata + if cnumbers then + if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then + local ok = true + for d=1,depth-1 do + local cnd = cnumbers[d] + if not (cnd == 0 or cnd == numbers[d]) then + ok = false + break end end + if ok then + nofresult = nofresult + 1 + result[nofresult] = v + end end end end end end - if trace_lists then - report_lists("criterium %a, block %a, found %a, detail %a",criterium,block or "*",#result,detail) + return result +end + +filters[v_local] = function(specification) + local numbers = specification.numbers + local nested = nesting[#nesting] + if nested then + return filtercollected { + names = specification.names, + criterium = nested.name, + collected = specification.collected, + forced = specification.forced, + nested = nested, + sortorder = specification.sortorder, + } + else + specification.criterium = autosectiondepth(numbers) == 0 and v_all or v_current + specification.nested = false + return filtercollected(specification) -- rechecks, so better (for determining all) end +end - if sortorder then -- experiment - local sorter = sorters[sortorder] - if sorter then - if trace_lists then - report_lists("sorting list using method %a",sortorder) - end - for i=1,#result do - result[i].references.order = i + +filters[v_component] = function(specification) + -- special case, no structure yet + local collected = specification.collected + local result = { } + local nofresult = #result + local all = specification.all + local names = specification.names + local component = resolvers.jobs.currentcomponent() or "" + if component ~= "" then + for i=1,#collected do + local v = collected[i] + local r = v.references + local m = v.metadata + if r and r.component == component and (m and names[m.name] or all) then + nofresult = nofresult + 1 + result[nofresult] = v end - table.sort(result,sorter) end end - return result end -lists.filtercollected = filtercollected +-- local number = tonumber(number) or numberatdepth(depth) or 0 +-- if number > 0 then +-- ... +-- end -function lists.filter(specification) - return filtercollected( - specification.names, - specification.criterium, - specification.number, - lists.collected, - specification.forced, - false, - specification.order - ) +filters[v_default] = function(specification) -- is named + local collected = specification.collected + local result = { } + local nofresult = #result + ----- depth = specification.depth + local block = specification.block + local criterium = specification.criterium + local all = specification.all + local names = specification.names + local numbers = specification.numbers + local sections = sections.collected + local reference = specification.reference + local nested = specification.nested + -- + if reference then + reference = tonumber(reference) + end + -- + local depth = getsectionlevel(criterium) + local pnumbers = nil + local pblock = block + local parent = nested and nested.parent + -- + if parent then + pnumbers = parent.numberdata.numbers or pnumbers -- so local as well as nested + pblock = parent.references.block or pblock + if trace_lists then + report_lists("filtering by block %a and section %a",pblock,criterium) + end + end + -- + for i=1,#collected do + local v = collected[i] + local r = v.references + if r and (not block or not r.block or pblock == r.block) then + local sectionnumber = sections[r.section] + if sectionnumber then + local metadata = v.metadata + local cnumbers = sectionnumber.numbers + if cnumbers then + if all or names[metadata.name or false] then + if reference then + -- filter by number + if reference == cnumbers[depth] then + nofresult = nofresult + 1 + result[nofresult] = v + end + else + if #cnumbers >= depth and matchingtilldepth(depth,cnumbers,pnumbers) then + nofresult = nofresult + 1 + result[nofresult] = v + end + end + end + end + end + end + end + return result end +-- names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string + +lists.filter = filtercollected + lists.result = { } +function lists.getresult(r) + return lists.result[r] +end + function lists.process(specification) - lists.result = lists.filter(specification) - local specials = utilities.parsers.settings_to_hash(specification.extras or "") + lists.result = filtercollected(specification) + local specials = settings_to_set(specification.extras or "") specials = next(specials) and specials or nil for i=1,#lists.result do local r = lists.result[i] @@ -561,7 +811,7 @@ function lists.process(specification) end function lists.analyze(specification) - lists.result = lists.filter(specification) + lists.result = filtercollected(specification) end function lists.userdata(name,r,tag) -- to tex (todo: xml) @@ -601,7 +851,7 @@ function lists.sectionnumber(name,n,spec) local data = lists.result[n] local sectiondata = sections.collected[data.references.section] -- hm, prefixnumber? - sections.typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too + typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too end -- some basics (todo: helpers for pages) @@ -678,18 +928,18 @@ function lists.number(name,n,spec) if data then local numberdata = data.numberdata if numberdata then - sections.typesetnumber(numberdata,"number",spec or false,numberdata or false) + typesetnumber(numberdata,"number",spec or false,numberdata or false) end end end -function lists.prefixednumber(name,n,prefixspec,numberspec) +function lists.prefixednumber(name,n,prefixspec,numberspec,forceddata) local data = lists.result[n] if data then helpers.prefix(data,prefixspec) - local numberdata = data.numberdata + local numberdata = data.numberdata or forceddata if numberdata then - sections.typesetnumber(numberdata,"number",numberspec or false,numberdata or false) + typesetnumber(numberdata,"number",numberspec or false,numberdata or false) end end end @@ -718,29 +968,175 @@ end -- interface (maybe strclistpush etc) -commands.pushlist = lists.pushnesting -commands.poplist = lists.popnesting -commands.enhancelist = lists.enhance -commands.processlist = lists.process -commands.analyzelist = lists.analyze -commands.listtitle = lists.title -commands.listprefixednumber = lists.prefixednumber -commands.listprefixedpage = lists.prefixedpage +if not lists.reordered then + function lists.reordered(data) + return data.numberdata + end +end +implement { name = "pushlist", actions = lists.pushnesting, arguments = "integer" } +implement { name = "poplist", actions = lists.popnesting } + +implement { + name = "addtolist", + actions = { lists.addto, context }, + arguments = { + { + { "references", { + { "internal", "integer" }, + { "block" }, + { "section", "integer" }, + { "location" }, + { "prefix" }, + { "reference" }, + { "order", "integer" }, + } + }, + { "metadata", { + { "kind" }, + { "name" }, + { "level", "integer" }, + { "catcodes", "integer" }, + { "coding" }, + { "xmlroot" }, + { "setup" }, + } + }, + { "userdata" }, + { "titledata", { + { "label" }, + { "title" }, + { "bookmark" }, + { "marking" }, + { "list" }, + } + }, + { "prefixdata", { + { "prefix" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "set" }, + { "segments" }, + { "connector" }, + } + }, + { "numberdata", { + { "numbers" }, + { "groupsuffix" }, + { "group" }, + { "counter" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "starter" }, + { "stopper" }, + { "segments" }, + } + } + } + } +} -function commands.addtolist (...) context(lists.addto (...)) end -function commands.listsize (...) context(lists.size (...)) end -function commands.listlocation (...) context(lists.location (...)) end -function commands.listlabel (...) context(lists.label (...)) end -function commands.listrealpage (...) context(lists.realpage (...)) end -function commands.listgroupindex (...) context(lists.groupindex(...)) end +implement { + name = "enhancelist", + actions = lists.enhance, + arguments = "integer" +} -function commands.currentsectiontolist() - context(lists.addto(sections.current())) -end +implement { + name = "processlist", + actions = lists.process, + arguments = { + { + { "names" }, + { "criterium" }, + { "reference" }, + { "extras" }, + { "order" }, + } + } +} + +implement { + name = "analyzelist", + actions = lists.analyze, + arguments = { + { + { "names" }, + { "criterium" }, + { "reference" }, + } + } +} + +implement { + name = "listtitle", + actions = lists.title, + arguments = { "string", "integer" } +} + +implement { + name = "listprefixednumber", + actions = lists.prefixednumber, + arguments = { + "string", + "integer", + { + { "prefix" }, + { "separatorset" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + { "set" }, + { "segments" }, + { "connector" }, + }, + { + { "separatorset" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + { "segments" }, + } + } +} + +implement { + name = "listprefixedpage", + actions = lists.prefixedpage, + arguments = { + "string", + "integer", + { + { "separatorset" }, + { "conversionset" }, + { "set" }, + { "segments" }, + { "connector" }, + }, + { + { "prefix" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + } + } +} + +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" } } -function commands.listuserdata(...) - local str, metadata = lists.userdata(...) +implement { + name = "currentsectiontolist", + actions = { sections.current, lists.addto, context } +} + +local function userdata(name,r,tag) + local str, metadata = lists.userdata(name,r,tag) if str then -- local catcodes = metadata and metadata.catcodes -- if catcodes then @@ -752,25 +1148,21 @@ function commands.listuserdata(...) end end +implement { + name = "listuserdata", + actions = userdata, + arguments = { "string", "integer", "string" } +} + -- we could also set variables .. names will change (when this module is done) -- maybe strc_lists_savedtitle etc -function commands.doiflisthastitleelse (...) commands.doifelse(lists.hastitledata (...)) end -function commands.doiflisthaspageelse (...) commands.doifelse(lists.haspagedata (...)) end -function commands.doiflisthasnumberelse(...) commands.doifelse(lists.hasnumberdata(...)) end -function commands.doiflisthasentry (n) commands.doifelse(lists.iscached (n )) end - -function commands.savedlistnumber(name,n) - local data = cached[tonumber(n)] - if data then - local numberdata = data.numberdata - if numberdata then - sections.typesetnumber(numberdata,"number",numberdata or false) - end - end -end +implement { name = "doifelselisthastitle", actions = { lists.hastitledata, commands.doifelse }, arguments = { "string", "integer" } } +implement { name = "doifelselisthaspage", actions = { lists.haspagedata, commands.doifelse }, arguments = { "string", "integer" } } +implement { name = "doifelselisthasnumber", actions = { lists.hasnumberdata, commands.doifelse }, arguments = { "string", "integer" } } +implement { name = "doifelselisthasentry", actions = { lists.iscached, commands.doifelse }, arguments = { "integer" } } -function commands.savedlisttitle(name,n,tag) +local function savedlisttitle(name,n,tag) local data = cached[tonumber(n)] if data then local titledata = data.titledata @@ -780,39 +1172,56 @@ function commands.savedlisttitle(name,n,tag) end end --- function commands.savedlistprefixednumber(name,n) --- local data = cached[tonumber(n)] --- if data then --- local numberdata = data.numberdata --- if numberdata then --- helpers.prefix(data,data.prefixdata) --- sections.typesetnumber(numberdata,"number",numberdata or false) --- end --- end --- end - -if not lists.reordered then - function lists.reordered(data) - return data.numberdata +local function savedlistnumber(name,n) + local data = cached[tonumber(n)] + if data then + local numberdata = data.numberdata + if numberdata then + typesetnumber(numberdata,"number",numberdata or false) + end end end -function commands.savedlistprefixednumber(name,n) +local function savedlistprefixednumber(name,n) local data = cached[tonumber(n)] if data then local numberdata = lists.reordered(data) if numberdata then helpers.prefix(data,data.prefixdata) - sections.typesetnumber(numberdata,"number",numberdata or false) + typesetnumber(numberdata,"number",numberdata or false) end end end -commands.discardfromlist = lists.discard +lists.savedlisttitle = savedlisttitle +lists.savedlistnumber = savedlistnumber +lists.savedlistprefixednumber = savedlistprefixednumber --- new and experimental and therefore off by default +implement { + name = "savedlistnumber", + actions = savedlistnumber, + arguments = { "string", "integer" } +} -local sort, setmetatableindex = table.sort, table.setmetatableindex +implement { + name = "savedlisttitle", + actions = savedlisttitle, + arguments = { "string", "integer" } +} + +implement { + name = "savedlistprefixednumber", + actions = savedlistprefixednumber, + arguments = { "string", "integer" } +} + +implement { + name = "discardfromlist", + actions = lists.discard, + arguments = { "integer" } +} + +-- new and experimental and therefore off by default lists.autoreorder = false -- true diff --git a/Master/texmf-dist/tex/context/base/strc-lst.mkvi b/Master/texmf-dist/tex/context/base/strc-lst.mkvi index 0008f060231..556d2ab4895 100644 --- a/Master/texmf-dist/tex/context/base/strc-lst.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-lst.mkvi @@ -47,7 +47,7 @@ \c!state=\v!start, \c!coupling=\v!off, \c!criterium=\v!local, - \c!number=\zerocount, + \c!reference=,% was number which was sort of obsolete \c!width=3\emwidth, %\c!maxwidth=, \c!distance=\zeropoint, @@ -94,6 +94,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doiflistelse\doifelselist + %D Regular list entries are bound to a specific location in order to %D get the right pagenumber etc.\ associated. When pushing something %D inbetween (in mkiv) it ends up directtly in the list. This is the @@ -125,37 +127,48 @@ \def\strc_lists_inject_nop[#dummya][#dummyb]% {\endgroup} -\def\strc_lists_inject_yes[#settings][#userdata]% +\unexpanded\def\strc_lists_inject_enhance#listindex#internal% + {\normalexpanded{\ctxlatecommand{enhancelist(#listindex)}}} + +\unexpanded\def\strc_lists_inject_yes[#settings][#userdata]% can be used directly {\setupcurrentlist[\c!type=userdata,\c!location=\v!none,#settings]% grouped (use \let... \edef\p_location{\listparameter\c!location}% \setnextinternalreference - \edef\currentlistnumber{\ctxcommand{addtolist{ - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", % handy for lists, like bibl - section = structures.sections.currentid(), - % location = "\p_location", - }, - metadata = { - kind = "\listparameter\c!type", - name = "\currentlist", - level = structures.sections.currentlevel(), - catcodes = \the\catcodetable, - }, - userdata = \!!bs\detokenize{#userdata}\!!es % will be converted to table at the lua end - }}}% + \scratchcounter\clf_addtolist + references { + internal \nextinternalreference + % block {\currentsectionblock} + % section structures.sections.currentid() + % location {\p_location} + } + metadata { + kind {\listparameter\c!type} + name {\currentlist} + % level structures.sections.currentlevel() + catcodes \catcodetable + } + userdata {\detokenize\expandafter{\normalexpanded{#userdata}}} + \relax + \edef\currentlistnumber{\the\scratchcounter}% \ifx\p_location\v!here % this branch injects nodes ! - \expanded{\ctxlatecommand{enhancelist(\currentlistnumber)}}% - \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}% will change + \strc_lists_inject_enhance{\currentlistnumber}{\nextinternalreference}% + \clf_setinternalreference internal \nextinternalreference\relax % this will change \xdef\currentstructurelistattribute{\the\lastdestinationattribute}% \dontleavehmode\hbox attr \destinationattribute \lastdestinationattribute{}% todo \else % and this one doesn't - \ctxcommand{enhancelist(\currentlistnumber)}% + \clf_enhancelist\currentlistnumber\relax \fi \endgroup} +% todo: make like \strc_references_direct_full_user ... with {}{}{} + +\unexpanded\def\strc_lists_inject_direct[#tag]% [#settings][#userdata] + {\begingroup + \edef\currentlist{#tag}% + \strc_lists_inject_yes} % [#settings][#userdata] + \unexpanded\def\writebetweenlist{\dodoubleempty \strc_lists_write_between} \unexpanded\def\writedatatolist {\dotripleargument\strc_lists_write_data_to} \unexpanded\def\writetolist {\dodoubleempty \strc_lists_write_to} @@ -244,7 +257,7 @@ \strc_lists_place_current % maybe inline {#list}% {\listparameter\c!criterium}% - {\listparameter\c!number}% + {\listparameter\c!reference}% {\listparameter\c!extras}% {\listparameter\c!order}% % \stoplistreferences @@ -288,7 +301,7 @@ {\dotripleempty\strc_lists_combined_define} \def\strc_lists_combined_define[#tag][#list][#settings]% - {\definelist[#tag][\c!criterium=\v!local,\c!number=0,\c!alternative=,\c!list={#list},#settings]% inherits from root + {\definelist[#tag][\c!criterium=\v!local,\c!reference=,\c!alternative=,\c!list={#list},#settings]% inherits from root \setvalue{\e!setup #tag\e!endsetup}{\dodoubleempty\strc_lists_combined_setup [#tag]}% \setvalue{\e!place #tag}{\dodoubleempty\strc_lists_combined_place [#tag]}% \setvalue{\e!complete #tag}{\dodoubleempty\strc_lists_combined_complete[#tag]}} @@ -324,42 +337,42 @@ \def\currentstructurelistnumber{0} % injection \def\currentlistmethod {entry} % typesetting -\def\currentlistindex {0} % typesetting +\def\currentlistindex {0} % typesetting (maybe also a real counter) \def\structurelistlocation - {\ctxcommand{listlocation(\currentlistindex)}} + {\clf_listlocation\numexpr\currentlistindex\relax} \def\structurelistrealpagenumber - {\ctxcommand{listrealpage("\currentlist",\currentlistindex)}} + {\clf_listrealpage{\currentlist}\numexpr\currentlistindex\relax} \unexpanded\def\structurelistpagenumber {\dostarttagged\t!listpage\empty - \ctxcommand{listprefixedpage( - "\currentlist", - \currentlistindex, - { - separatorset = "\listparameter\c!pageprefixseparatorset", - conversionset = "\listparameter\c!pageprefixconversionset", - set = "\listparameter\c!pageprefixset", - segments = "\listparameter\c!pageprefixsegments", - connector = \!!bs\listparameter\c!pageprefixconnector\!!es, - }, - { - prefix = "\listparameter\c!pageprefix", - conversionset = "\listparameter\c!pageconversionset", - starter = \!!bs\listparameter\c!pagestarter\!!es, - stopper = \!!bs\listparameter\c!pagestopper\!!es, + \clf_listprefixedpage + {\currentlist} + \currentlistindex + { + separatorset {\listparameter\c!pageprefixseparatorset} + conversionset {\listparameter\c!pageprefixconversionset} + set {\listparameter\c!pageprefixset} + segments {\listparameter\c!pageprefixsegments} + connector {\listparameter\c!pageprefixconnector} } - )}% + { + prefix {\listparameter\c!pageprefix} + conversionset {\listparameter\c!pageconversionset} + starter {\listparameter\c!pagestarter} + stopper {\listparameter\c!pagestopper} + } + \relax \dostoptagged} \unexpanded\def\structurelistuservariable#name% {\dostarttagged\t!listdata{#name}% - \ctxcommand{listuserdata("\currentlist",\currentlistindex,"#name")}% + \clf_listuserdata{\currentlist}\currentlistindex{#name}% \dostoptagged} \def\rawstructurelistuservariable#name% - {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"#name")}} + {\clf_listuserdata{\currentlist}\currentlistindex{#name}} \unexpanded\def\structurelistfirst {\structurelistuservariable\s!first } % s! \unexpanded\def\structurelistsecond{\structurelistuservariable\s!second} % s! @@ -367,63 +380,70 @@ \def\rawstructurelistfirst {\rawstructurelistuservariable\s!first } % s! % was \unexpanded \def\rawstructurelistsecond{\rawstructurelistuservariable\s!second} % s! % was \unexpanded -\unexpanded\def\doifstructurelisthaspageelse - {\ctxcommand{doiflisthaspageelse("\currentlist",\currentlistindex)}} +\unexpanded\def\doifelsestructurelisthaspage + {\clf_doifelselisthaspage{\currentlist}\numexpr\currentlistindex\relax} + +\unexpanded\def\doifelsestructurelisthasnumber + {\clf_doifelselisthasnumber{\currentlist}\numexpr\currentlistindex\relax} -\unexpanded\def\doifstructurelisthasnumberelse - {\ctxcommand{doiflisthasnumberelse("\currentlist",\currentlistindex)}} +\let\doifstructurelisthaspageelse \doifelsestructurelisthaspage +\let\doifstructurelisthasnumberelse\doifelsestructurelisthasnumber \unexpanded\def\structurelistgenerictitle {\dostarttagged\t!listcontent\empty - \ctxcommand{listtitle("\currentlist",\currentlistindex)}% + \clf_listtitle{\currentlist}\currentlistindex\relax \dostoptagged} \unexpanded\def\structurelistgenericnumber % tricky, we need to delay tagging as we have nested lua calls {\dostarttagged\t!listtag\empty - \ctxcommand{listprefixednumber("\currentlist",\currentlistindex, { - prefix = "\listparameter\c!prefix", - separatorset = "\listparameter\c!prefixseparatorset", - conversionset = "\listparameter\c!prefixconversionset", - starter = \!!bs\listparameter\c!prefixstarter\!!es, - stopper = \!!bs\listparameter\c!prefixstopper\!!es, - set = "\listparameter\c!prefixset", - segments = "\listparameter\c!prefixsegments", - connector = \!!bs\listparameter\c!prefixconnector\!!es, - }, - { - separatorset = "\listparameter\c!numberseparatorset", - conversionset = "\listparameter\c!numberconversionset", - starter = \!!bs\listparameter\c!numberstarter\!!es, - stopper = \!!bs\listparameter\c!numberstopper\!!es, - segments = "\listparameter\c!numbersegments", - } )}% + \clf_listprefixednumber + {\currentlist}% + \currentlistindex + {% + prefix {\listparameter\c!prefix}% + separatorset {\listparameter\c!prefixseparatorset}% + conversionset {\listparameter\c!prefixconversionset}% + starter {\listparameter\c!prefixstarter}% + stopper {\listparameter\c!prefixstopper}% + set {\listparameter\c!prefixset}% + segments {\listparameter\c!prefixsegments}% + connector {\listparameter\c!prefixconnector}% + }% + {% + separatorset {\listparameter\c!numberseparatorset}% + conversionset {\listparameter\c!numberconversionset}% + starter {\listparameter\c!numberstarter}% + stopper {\listparameter\c!numberstopper}% + segments {\listparameter\c!numbersegments}% + }% + \relax \dostoptagged} % TODO: pass extra tag name (contents, figures, bibliography ...) -\unexpanded\def\strc_lists_place_current#list#criterium#number#extras#order% beware, not a user command - {\dostarttagged\t!list\empty - \ctxcommand{processlist{ - names = "#list", - criterium = "#criterium", - number = "#number", - extras = "#extras", - order = "#order" - }}% +\unexpanded\def\strc_lists_place_current#list#criterium#reference#extras#order% beware, not a user command + {\dostarttaggedchained\t!list\empty\??list + \clf_processlist + names {#list} + criterium {#criterium} + reference {#reference} + extras {#extras} + order {#order} + \relax \dostoptagged} -\unexpanded\def\strc_lists_analyze#list#criterium#number% - {\ctxcommand{analyzelist{ - names = "#list", - criterium = "#criterium", - number = "#number" - }}} +\unexpanded\def\strc_lists_analyze#list#criterium#reference% + {\clf_analyzelist + names {#list} + criterium {#criterium} + reference {#reference} + \relax} -\def\firststructureelementinlist#list% - {\ctxcommand{firstinset("#list")}} +\def\firststructureelementinlist#list% expandable + {\clf_firstinset{#list}} \def\structurelistsize - {\ctxcommand{listsize()}} + {\clf_listsize} %D Depending on what kind of list we have (e.g.\ a section related one) %D processors can be defined. @@ -451,14 +471,12 @@ \def\usestructurelistprocessor#tag% {\csname\??structurelistprocessor#tag\endcsname} -\unexpanded\def\strclistsentryprocess#tag#method#index#extra% This one is called at the lua end! - {\ctxcommand{pushlist(#index)}% - \edef\currentlist {#tag}% - \edef\currentlistmethod{#method}% - \edef\currentlistindex {#index}% - \edef\currentlistextra {#extra}% - \listextraparameter\c!before +\let\dotaglistlocation\relax + +\def\strc_lists_entry_process % assume things to be set up + {\listextraparameter\c!before \dostarttagged\t!listitem\currentlist + \dotaglistlocation \csname\??structurelistprocessor \ifcsname\??structurelistprocessor\currentlist:\currentlistmethod\endcsname\currentlist:\currentlistmethod\else \ifcsname\??structurelistprocessor\currentlistmethod \endcsname\currentlistmethod \else @@ -466,8 +484,16 @@ \s!default \fi\fi\fi \endcsname \dostoptagged - \listextraparameter\c!after - \ctxcommand{poplist()}} + \listextraparameter\c!after} + +\unexpanded\def\strclistsentryprocess#tag#method#index#extra% This one is called at the lua end! + {\clf_pushlist#index\relax + \edef\currentlist {#tag}% + \edef\currentlistmethod{#method}% + \edef\currentlistindex {#index}% + \edef\currentlistextra {#extra}% + \strc_lists_entry_process + \clf_poplist} % lists that have a number/title are kind of generic and can share code @@ -481,7 +507,7 @@ \strc_lists_apply_renderingsetup} \installstructurelistprocessor\s!command - {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"\s!command")}} + {\clf_listuserdata{\currentlist}\currentlistindex{\s!command}} \installstructurelistprocessor{section} {\let\currentlistentrynumber \structurelistgenericnumber @@ -498,7 +524,7 @@ % example of usage elsewhere: % % \installstructcurelistprocessor{pubs:userdata} -% {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"bibref")}} +% {\clf_listuserdata{\currentlist}\currentlistindex{bibref}} %D List symbols are used in interactive documents where no numbers %D are used but nevertheless structure is present. Beware, the list @@ -520,7 +546,7 @@ \def\strc_lists_assign_dimen#dimension#key#default% {\edef\m_strc_list_dimen{\listparameter#key}% - \doifinsetelse\m_strc_list_dimen{\v!fit,\v!broad}{#dimension#default}{#dimension\m_strc_list_dimen}\relax} + \doifelseinset\m_strc_list_dimen{\v!fit,\v!broad}{#dimension#default}{#dimension\m_strc_list_dimen}\relax} \definesymbol[\v!list][\v!none ][\strc_lists_symbol_none] \definesymbol[\v!list][\v!one ][\strc_lists_symbol_one] @@ -531,7 +557,7 @@ \unexpanded\def\currentlistsymbol {\edef\p_symbol{\listparameter\c!symbol}% - \doifinsymbolsetelse\v!list\p_symbol + \doifelseinsymbolset\v!list\p_symbol {\directsymbol\v!list\p_symbol} {\directsymbol\v!list\s!default}} @@ -589,7 +615,7 @@ {\currentlistentrynumber} \setvalue{\??listsymbollabels\v!yes}% auto (use value stored in tuc file) - {\edef\currentlistlabel{\ctxcommand{listlabel(\currentlistindex,"\currentlistlabel")}}% + {\edef\currentlistlabel{\clf_listlabel\currentlistindex{\currentlistlabel}}% \leftlabeltext\currentlistlabel \listparameter\c!starter \currentlistentrynumber @@ -700,7 +726,7 @@ \let\p_method\v!command \fi \normalexpanded{\definelistalternative[#tag][\p_method]}[\c!command=\strc_lists_placement_command]% - \doifnextbgroupelse + \doifelsenextbgroup {\strc_lists_define_placement_yes{#tag}} {\strc_lists_define_placement_nop{#tag}}} @@ -764,7 +790,7 @@ \settrue\c_lists_has_page \settrue\c_lists_show_page \else - \doifstructurelisthaspageelse\settrue\setfalse\c_lists_has_page + \doifelsestructurelisthaspage\settrue\setfalse\c_lists_has_page \ifx\p_pagenumber\v!yes \settrue\c_lists_show_page \else @@ -777,7 +803,7 @@ \settrue\c_lists_has_number \settrue\c_lists_show_number \else - \doifstructurelisthasnumberelse\settrue\setfalse\c_lists_has_number + \doifelsestructurelisthasnumber\settrue\setfalse\c_lists_has_number \ifx\p_headnumber\v!yes \settrue\c_lists_show_number \else @@ -818,6 +844,8 @@ % todo: provide packager via attributes +\doinstallinjector\s!list + \installcorenamespace{listalternativemethods} % the general wrapper of a rendering \startsetups[\??listrenderings:none] @@ -845,12 +873,15 @@ % \stopsetups \startsetups[\??listrenderings:generic] + \typo_injectors_check_list \listparameter\c!before % can be \hskip \edef\p_command{\listalternativeparameter\c!command} \ifx\p_command\empty \listalternativeparameter\c!before \vbox { \forgetall + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all { \ifconditional\c_lists_show_number % \ifconditional\c_lists_has_page @@ -878,6 +909,8 @@ } \listalternativeparameter\c!after \else + \noindent % otherwise annotations are mirrored up +\typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { \p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber } @@ -889,7 +922,8 @@ \startsetups[\??listrenderings:abc] \endgraf % are we grouped? -% \advance % yes or no ... \rightskip is also honored + \typo_injectors_check_list + % \advance % yes or no ... \rightskip is also honored \leftskip\listparameter\c!margin % after \endgraf ! \listparameter\c!before \endgraf @@ -908,7 +942,8 @@ \scratchwidth\p_width \fi \fi\fi - \noindent + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { \setlocalhsize \hsize\localhsize @@ -952,6 +987,8 @@ \hsize\scratchhsize \usealignparameter\listparameter \ifdim\scratchwidth<\hsize + % we have leftskip so we'd better just skip back instead of messing + % with hang* \edef\p_hang{\listparameter\c!hang} \hangindent\dimexpr\wd\b_strc_lists_number+\scratchdistance\relax \hangafter\ifx\p_hang\v!no\zerocount\else\plusone\fi @@ -964,7 +1001,7 @@ \scratchdistance\zeropoint \fi \parindent\zeropoint - \dontleavehmode + \dontleavehmode % this nils hang: i need to figure out why % % topaligned % % \scratchdimen\wd\b_strc_lists_number @@ -1089,7 +1126,9 @@ \stopsetups \startsetups[\??listrenderings:e] - \noindent + \typo_injectors_check_list + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { \letlistparameter\c!depth\zeropoint \letlistparameter\c!color\empty @@ -1109,7 +1148,9 @@ \stopsetups \startsetups[\??listrenderings:f] - \noindent + \typo_injectors_check_list + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { \dosetraggedhbox{\listparameter\c!align}% \raggedbox { @@ -1127,7 +1168,9 @@ \stopsetups \startsetups[\??listrenderings:g] - \noindent + \typo_injectors_check_list + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { \midaligned { \strc_lists_set_style_color\c!style\c!color\v!all @@ -1148,19 +1191,119 @@ \definelistalternative [\v!interactive] - [\c!renderingsetup=\??listrenderings:interactive] + [\c!renderingsetup=\??listrenderings:interactive, + \c!before=\endgraf, % new per 2014-11-08 + \c!after=\endgraf] % new per 2014-11-08 \startsetups[\??listrenderings:interactive] - \edef\p_command{\listalternativeparameter\c!command}% - \ifx\p_command\empty - [\currentlist: \currentlistentrynumber\space -- \currentlistentrytitle\space -- \currentlistentrypagenumber]% - \else - \listparameter\c!before - \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { - \p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber - } - \listparameter\c!after - \fi + \edef\p_command{\listalternativeparameter\c!command}% + \typo_injectors_check_list + \listparameter\c!before + \noindent % otherwise annotations are mirrored up + \typo_injectors_mark_list + \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute { + \ifx\p_command\empty + [ + \currentlist:\space + \currentlistentrynumber + \space\emdash\space + \currentlistentrytitle + \space\emdash\space + \currentlistentrypagenumber + ] + \else + \p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber + \fi + } + \listparameter\c!after +\stopsetups + +%D One special for publications (as Alan loves to hangindent). No fonts and +%D such (for now). No interaction either as that is dealt with elsewhere. +%D +%D \currentlistsymbol +%D \currentlistentry +%D \currentlistentrypagenumber % not really used + +\definelistalternative + [\v!paragraph] + [\c!filler=\hskip.25\emwidth, + \c!renderingsetup=\??listrenderings:\v!paragraph] + +\startsetups[\??listrenderings:\v!paragraph] + \endgraf % are we grouped? + \typo_injectors_check_list % ? + \listparameter\c!before + \endgraf + \begingroup + \forgetall + \noindent + \parindent\zeropoint + \edef\p_width{\listparameter\c!width}% + \edef\p_distance{\listparameter\c!distance}% we are nice for bib users + \edef\p_margin{\listparameter\c!margin}% we are nice for bib users + \ifx\p_distance\v!none + \scratchdistance\zeropoint + \else + \scratchdistance\p_distance + \fi + \ifx\p_margin\v!none + \scratchoffset\zeropoint + \else + \scratchoffset\p_margin + \fi + \ifx\p_width\v!fit + \scratchwidth\zeropoint + \leftskip\scratchoffset + \else + \scratchwidth\p_width + \ifdim\scratchoffset=\zeropoint + \leftskip\dimexpr\scratchwidth+\scratchdistance\relax + \else + \leftskip\scratchoffset + \fi + \fi + \usealignparameter\listparameter + \hskip-\leftskip + \ifconditional\c_lists_has_number + \ifconditional\c_lists_show_number + \setbox\scratchbox + \ifzeropt\scratchwidth + \hbox + \else + \simplealignedbox\scratchwidth{\listparameter\c!numberalign} + \fi + \bgroup + \useliststyleandcolor\c!numberstyle\c!numbercolor + \currentlistsymbol + \egroup + \ifdim\wd\scratchbox>\zeropoint + \box\scratchbox + \hskip\scratchdistance\relax + \fi + \fi + \fi + \begingroup + \useliststyleandcolor\c!textstyle\c!textcolor + \setstrut + \begstrut + \currentlistentrytitle + \endstrut + \endgroup + \ifconditional\c_lists_has_page + \ifconditional\c_lists_show_page + \nobreak + \listalternativeparameter\c!filler\relax + \begingroup + \useliststyleandcolor\c!pagestyle\c!pagecolor + \currentlistentrypagenumber + \endgroup + \fi + \fi + \endgraf + \endgroup + \allowbreak + \listparameter\c!after \stopsetups %D List elements are packaged in such a way that we can click on them @@ -1303,7 +1446,7 @@ \let\listlength\!!zerocount \else \setupcurrentlist[#settings]% - \strc_lists_analyze{#list}{\listparameter\c!criterium}{\listparameter\c!number}% + \strc_lists_analyze{#list}{\listparameter\c!criterium}{\listparameter\c!reference}% \normalexpanded{\endgroup\noexpand\edef\noexpand\listlength{\structurelistsize}}% \fi \strc_lists_set_mode} diff --git a/Master/texmf-dist/tex/context/base/strc-mar.lua b/Master/texmf-dist/tex/context/base/strc-mar.lua index 9c6259de4c4..3af9113bf85 100644 --- a/Master/texmf-dist/tex/context/base/strc-mar.lua +++ b/Master/texmf-dist/tex/context/base/strc-mar.lua @@ -10,12 +10,14 @@ if not modules then modules = { } end modules ['strc-mar'] = { -- todo: only commands.* print to tex, native marks return values local insert, concat = table.insert, table.concat -local tostring, next, rawget = tostring, next, rawget +local tostring, next, rawget, type = tostring, next, rawget, type local lpegmatch = lpeg.match local context = context local commands = commands +local implement = interfaces.implement + local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex @@ -29,7 +31,6 @@ local getprev = nuts.getprev local getid = nuts.getid local getlist = nuts.getlist local getattr = nuts.getattr -local setattr = nuts.setattr local getbox = nuts.getbox local traversenodes = nuts.traverse @@ -217,7 +218,11 @@ local function resolve(t,k) end function marks.define(name,settings) - settings = settings or { } + if not settings then + settings = { } + elseif type(settings) == "string" then + settings = { parent = settings } + end data[name] = settings local parent = settings.parent if parent == nil or parent == "" or parent == name then @@ -712,20 +717,17 @@ end -- interface -commands.markingtitle = marks.title -commands.markingnumber = marks.number - -commands.definemarking = marks.define -commands.relatemarking = marks.relate -commands.setmarking = marks.set -commands.resetmarking = marks.reset -commands.synchronizemarking = marks.synchronize -commands.getmarking = marks.fetch -commands.fetchonemark = marks.fetchonemark -commands.fetchtwomarks = marks.fetchtwomarks -commands.fetchallmarks = marks.fetchallmarks - -function commands.doifelsemarking(str) -- can be shortcut - commands.doifelse(marks.exists(str)) -end +implement { name = "markingtitle", actions = marks.title, arguments = { "string", "string" } } +implement { name = "markingnumber", actions = marks.number, arguments = { "string", "string" } } + +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 = "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 = "doifelsemarking", actions = { marks.exists, commands.doifelse }, arguments = "string" } diff --git a/Master/texmf-dist/tex/context/base/strc-mar.mkiv b/Master/texmf-dist/tex/context/base/strc-mar.mkiv index 3685b66a702..8bd8c094e44 100644 --- a/Master/texmf-dist/tex/context/base/strc-mar.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-mar.mkiv @@ -56,35 +56,31 @@ \unexpanded\def\synchronizemarking{\dotripleargument\strc_markings_synchronize} \appendtoks - \ctxcommand{definemarking("\currentmarking",{ parent = "\currentmarkingparent" })}% + \clf_definemarking{\currentmarking}{\currentmarkingparent}% \to \everydefinemarking \def\strc_markings_relate[#1][#2]% - {\ctxcommand{relatemarking("#1","#2")}} + {\clf_relatemarking{#1}{#2}} \def\strc_markings_set[#1]#2% {\ifconditional\inhibitsetmarking % nothing \else \doifelse{\namedmarkingparameter{#1}\c!expansion}\v!yes - {\ctxcommand{setmarking("#1",\!!bs#2\!!es)}} - {\ctxcommand{setmarking("#1",\!!bs\detokenize{#2}\!!es)}}% + {\clf_setmarking{#1}{#2}} + {\clf_setmarking{#1}{\detokenize{#2}}}% \fi} \def\strc_markings_reset[#1]% - {\ctxcommand{resetmarking("#1")}} + {\clf_resetmarking{#1}} \def\strc_markings_synchronize[#1][#2][#3]% #1=class #2=boxnumber (some day also name) #3=options, maybe second argument table - {\ifvoid#2\else\ctxcommand{synchronizemarking("#1",\number#2,"#3")}\fi} + {\ifvoid#2\else\clf_synchronizemarking{#1}#2{#3}\fi} -% \def\doifelsemarking#1% why no \unexpanded -% {\ctxcommand{doifelsemarking("#1")}} +\def\doifelsemarking#1% no \noexpanded + {\clf_doifelsemarking{#1}} -% \def\doifelsemarking#1% -% {\normalexpanded{\noexpand\ctxcommand{doifelsemarking("\noexpand\detokenize{#1}")}}} - -\def\doifelsemarking#1% - {\ctxcommand{doifelsemarking(\!!bs#1\!!es)}} +\let\doifmarkingelse \doifelsemarking % \appendtoks % \strc_markings_synchronize[\v!page][\normalpagebox][\v!keep]% keep if no marks @@ -116,25 +112,25 @@ \setsystemmode\v!marking \the\everymarking \ifthirdargument - \ctxcommand{getmarking("#1","#2","#3")}% + \clf_getmarking{#1}{#2}{#3}% \else - \ctxcommand{getmarking("#1","\v!page","#2")}% + \clf_getmarking{#1}{\v!page}{#2}% \fi \endgroup}} % the fetchers are fully expandable: [name][method] -\def\fetchonemark[#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchonemark ("#1","\v!page","#2")}\fi} -\def\fetchtwomarks [#1]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchtwomarks("#1","\v!page")}\fi} -\def\fetchallmarks [#1]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchallmarks("#1","\v!page")}\fi} +\def\fetchonemark[#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchonemark {#1}{\v!page}{#2}\fi} +\def\fetchtwomarks [#1]{\ifconditional\inhibitgetmarking\else\clf_fetchtwomarks{#1}{\v!page}\fi} +\def\fetchallmarks [#1]{\ifconditional\inhibitgetmarking\else\clf_fetchallmarks{#1}{\v!page}\fi} \let\fetchmark\fetchonemark % also fully expandable but here we have: [name][range][method] -\def\fetchonemarking[#1]#2[#3]#4[#5]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchonemark ("#1","#3","#5")}\fi} -\def\fetchtwomarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchtwomarks("#1","#3")}\fi} -\def\fetchallmarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchallmarks("#1","#3")}\fi} +\def\fetchonemarking[#1]#2[#3]#4[#5]{\ifconditional\inhibitgetmarking\else\clf_fetchonemark {#1}{#3}{#5}\fi} +\def\fetchtwomarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchtwomarks{#1}{#3}\fi} +\def\fetchallmarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchallmarks{#1}{#3}\fi} \let\fetchmarking\fetchonemarking diff --git a/Master/texmf-dist/tex/context/base/strc-mat.lua b/Master/texmf-dist/tex/context/base/strc-mat.lua index 98b1e996c3c..87f35ed1d3a 100644 --- a/Master/texmf-dist/tex/context/base/strc-mat.lua +++ b/Master/texmf-dist/tex/context/base/strc-mat.lua @@ -6,28 +6,35 @@ if not modules then modules = { } end modules ['strc-mat'] = { license = "see context related readme files" } +----- copytable = table.copy + local structures = structures -local lists = structures.lists -local sections = structures.sections -local floats = structures.floats -local helpers = structures.helpers -local formulas = structures.formulas +local lists = structures.lists +local sections = structures.sections +local floats = structures.floats +local helpers = structures.helpers +local formulas = structures.formulas -- not used but reserved -lists.enhancers = lists.enhancers or { } +----- context = context +----- simplify = helpers.simplify -- maybe we want to do clever things with formulas, the store might go away -local formuladata = { } - -function formulas.store(data) - formuladata[#formuladata+1] = data - context(#formuladata) -end - -function formulas.current() - return formuladata[#formuladata] -end +-- local formuladata = { } +-- +-- function formulas.store(data) +-- formuladata[#formuladata+1] = data +-- context(#formuladata) +-- end +-- +-- function formulas.current() +-- return formuladata[#formuladata] +-- end + +-- function formulas.simplify(entry) +-- return simplify(copytable(entry or formuladata[#formuladata])) +-- end function helpers.formulanumber(data,spec) if data then @@ -38,10 +45,9 @@ function helpers.formulanumber(data,spec) end end -function formulas.simplify(entry) - return helpers.simplify(table.copy(entry or formuladata[#formuladata])) -end - function lists.formulanumber(name,n,spec) - helpers.formulanumber(lists.result[n]) + local result = lists.result + if result then + helpers.formulanumber(result[n]) + end end diff --git a/Master/texmf-dist/tex/context/base/strc-mat.mkiv b/Master/texmf-dist/tex/context/base/strc-mat.mkiv index 18cb005cbea..22fa5488910 100644 --- a/Master/texmf-dist/tex/context/base/strc-mat.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-mat.mkiv @@ -360,7 +360,7 @@ \def\strc_formulas_handle_sub_numbering_indeed {\let\strc_formulas_handle_sub_numbering\relax % else error: see math/numbering-001.tex - \doiftextelse\currentsubformulasuffix + \doifelsetext\currentsubformulasuffix {\strc_counters_setown_sub\v!formula\plustwo\currentsubformulasuffix} {\strc_counters_increment_sub\v!formula\plustwo}% \placecurrentformulanumber} @@ -528,7 +528,7 @@ \unexpanded\def\strc_formulas_start_formula_indeed[#1][#2]% setting leftskip adaption is slow ! {\bgroup % HERE \def\currentformula{#1}% - \dostarttagged\t!formula\currentformula + \dostarttaggedchained\t!formula\currentformula\??formula \the\everybeforedisplayformula \d_strc_formulas_display_skip_par\parskip\relax %\formulastrutdp\strutdepth @@ -564,7 +564,7 @@ \unexpanded\def\strc_formulas_start_formula_nested#1% {\bgroup \let\strc_formulas_stop_formula\strc_formulas_stop_formula_nested - \dostarttagged\t!subformula} + \dostarttagged\t!subformula\empty} \unexpanded\def\strc_formulas_stop_formula_nested {\dostoptagged @@ -835,14 +835,14 @@ \def\strc_formulas_place[#1]% {\def\currentplaceformulareference{#1}% \let\currentplaceformulasuffix\empty - \doifnextbgroupelse\strc_formulas_place_yes\strc_formulas_place_nop\strc_formulas_place_nop} % [ref]{} + \doifelsenextbgroup\strc_formulas_place_yes\strc_formulas_place_nop\strc_formulas_place_nop} % [ref]{} \def\strc_formulas_place_yes#1% {\def\currentplaceformulasuffix{#1}% \strc_formulas_place_nop} \def\strc_formulas_place_nop - {\doifnextcharelse$\strc_formulas_place_pickup\strc_formulas_place_indeed} % [ref]$$ [ref]\start + {\doifelsenextchar$\strc_formulas_place_pickup\strc_formulas_place_indeed} % [ref]$$ [ref]\start \def\strc_formulas_place_indeed {\strc_formulas_place_numbering} diff --git a/Master/texmf-dist/tex/context/base/strc-not.lua b/Master/texmf-dist/tex/context/base/strc-not.lua index 40b78d59f8b..71eccf1cec2 100644 --- a/Master/texmf-dist/tex/context/base/strc-not.lua +++ b/Master/texmf-dist/tex/context/base/strc-not.lua @@ -38,6 +38,8 @@ local variables = interfaces.variables local context = context local commands = commands +local implement = interfaces.implement + -- state: store, insert, postpone local function store(tag,n) @@ -69,9 +71,11 @@ end notes.store = store -function commands.storenote(tag,n) - context(store(tag,n)) -end +implement { + name = "storenote", + actions = { store, context }, + arguments = { "string", "integer" } +} local function get(tag,n) -- tricky ... only works when defined local nd = notedata[tag] @@ -108,9 +112,11 @@ end notes.listindex = listindex -function commands.notelistindex(tag,n) - context(listindex(tag,n)) -end +implement { + name = "notelistindex", + actions = { listindex, context }, + arguments = { "string", "integer" } +} local function setstate(tag,newkind) local state = notestates[tag] @@ -144,18 +150,28 @@ end notes.setstate = setstate notes.getstate = getstate -commands.setnotestate = setstate +implement { + name = "setnotestate", + actions = setstate, + arguments = { "string", "string" } +} -function commands.getnotestate(tag) - context(getstate(tag)) -end +implement { + name = "getnotestate", + actions = { getstate, context }, + arguments = "string" +} function notes.define(tag,kind,number) local state = setstate(tag,kind) state.number = number end -commands.definenote = notes.define +implement { + name = "definenote", + actions = notes.define, + arguments = { "string", "string", "integer" } +} function notes.save(tag,newkind) local state = notestates[tag] @@ -184,8 +200,8 @@ function notes.restore(tag,forcedstate) end end -commands.savenote = notes.save -commands.restorenote = notes.restore +implement { name = "savenote", actions = notes.save, arguments = { "string", "string" } } +implement { name = "restorenote", actions = notes.restore, arguments = { "string", "string" } } local function hascontent(tag) local ok = notestates[tag] @@ -205,9 +221,11 @@ end notes.hascontent = hascontent -function commands.doifnotecontent(tag) - commands.doif(hascontent(tag)) -end +implement { + name = "doifnotecontent", + actions = { hascontent, commands.doif }, + arguments = "string", +} local function internal(tag,n) local nd = get(tag,n) @@ -243,9 +261,11 @@ end notes.doifonsamepageasprevious = onsamepageasprevious -function commands.doifnoteonsamepageasprevious(tag) - commands.doifelse(onsamepageasprevious(tag)) -end +implement { + name = "doifnoteonsamepageasprevious", + actions = { onsamepageasprevious, commands.doifelse }, + arguments = "string", +} function notes.checkpagechange(tag) -- called before increment ! local nd = notedata[tag] -- can be unset at first entry @@ -277,7 +297,10 @@ function notes.postpone() end end -commands.postponenotes = notes.postpone +implement { + name = "postponenotes", + actions = notes.postpone +} function notes.setsymbolpage(tag,n,l) local l = l or listindex(tag,n) @@ -297,7 +320,11 @@ function notes.setsymbolpage(tag,n,l) end end -commands.setnotesymbolpage = notes.setsymbolpage +implement { + name = "setnotesymbolpage", + actions = notes.setsymbolpage, + arguments = { "string", "integer" } +} local function getsymbolpage(tag,n) local li = internal(tag,n) @@ -351,11 +378,11 @@ notes.getsymbolpage = getsymbolpage notes.getnumberpage = getnumberpage notes.getdeltapage = getdeltapage -function commands.notesymbolpage(tag,n) context(getsymbolpage(tag,n)) end -function commands.notenumberpage(tag,n) context(getnumberpage(tag,n)) end -function commands.notedeltapage (tag,n) context(getdeltapage (tag,n)) end +implement { name = "notesymbolpage", actions = { getsymbolpage, context }, arguments = { "string", "integer" } } +implement { name = "notenumberpage", actions = { getnumberpage, context }, arguments = { "string", "integer" } } +implement { name = "notedeltapage", actions = { getdeltapage, context }, arguments = { "string", "integer" } } -function commands.flushnotes(tag,whatkind,how) -- store and postpone +local function flushnotes(tag,whatkind,how) -- store and postpone local state = notestates[tag] local kind = state.kind if kind == whatkind then @@ -411,15 +438,26 @@ function commands.flushnotes(tag,whatkind,how) -- store and postpone end end -function commands.flushpostponednotes() +local function flushpostponednotes() if trace_notes then report_notes("flushing all postponed notes") end for tag, _ in next, notestates do - commands.flushnotes(tag,"postpone") + flushnotes(tag,"postpone") end end +implement { + name = "flushpostponednotes", + actions = flushpostponednotes +} + +implement { + name = "flushnotes", + actions = flushnotes, + arguments = { "string", "string", "string" } +} + function notes.resetpostponed() if trace_notes then report_notes("resetting all postponed notes") @@ -432,13 +470,17 @@ function notes.resetpostponed() end end -function commands.notetitle(tag,n) - command.savedlisttitle(tag,notedata[tag][n]) -end +implement { + name = "notetitle", + actions = function(tag,n) lists.savedlisttitle(tag,notedata[tag][n]) end, + arguments = { "string", "integer" } +} -function commands.noteprefixednumber(tag,n,spec) - commands.savedlistprefixednumber(tag,notedata[tag][n]) -end +implement { + name = "noteprefixednumber", + actions = function(tag,n) lists.savedlistprefixednumber(tag,notedata[tag][n]) end, + arguments = { "string", "integer" } +} function notes.internalid(tag,n) local nd = get(tag,n) diff --git a/Master/texmf-dist/tex/context/base/strc-not.mkvi b/Master/texmf-dist/tex/context/base/strc-not.mkvi index 60ab66c980f..25a1072a3e7 100644 --- a/Master/texmf-dist/tex/context/base/strc-not.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-not.mkvi @@ -170,7 +170,7 @@ \ifx\p_counter\empty % \let\p_counter\currentnotation \fi - \doifcounterelse\p_counter\donothing{\strc_notes_define_counter\p_counter}% + \doifelsecounter\p_counter\donothing{\strc_notes_define_counter\p_counter}% \letnotationparameter\s!counter\p_counter %\strc_notes_setup_counter\currentnotation \to \everydefinenotation @@ -181,6 +181,7 @@ \unexpanded\setvalue{\??constructioninitializer\v!notation}% {\let\currentnotation \currentconstruction \let\constructionparameter \notationparameter + \let\constructionnamespace \??notation \let\detokenizedconstructionparameter\detokenizednotationparameter \let\letconstructionparameter \letnotationparameter \let\useconstructionstyleandcolor \usenotationstyleandcolor @@ -231,7 +232,7 @@ \ifnotesenabled \strc_counters_increment_sub\currentconstructionnumber\currentconstructionlevel \fi - \doifnextoptionalcselse\strc_notations_command_yes\strc_notations_command_nop} + \doifelsenextoptionalcs\strc_notations_command_yes\strc_notations_command_nop} \unexpanded\def\strc_notations_command_nop#title% {\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title={#title},\c!bookmark=,\c!list=][]% @@ -240,7 +241,7 @@ \normalexpanded{\endgroup\noteparameter\c!next}} \unexpanded\def\strc_notations_command_yes[#optional]% - {\doifassignmentelse{#optional}\strc_notations_command_assignment\strc_notations_command_argument[#optional]} + {\doifelseassignment{#optional}\strc_notations_command_assignment\strc_notations_command_argument[#optional]} \unexpanded\def\strc_notations_command_assignment[#settings]% {\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title=,\c!bookmark=,\c!list=,#settings][]% @@ -278,7 +279,7 @@ \normalexpanded % not that efficient but also not that frequently used (\normaldef for parser) {\def\noexpand\strc_pickup_yes[#one]#two\csname\e!stop#stoptag\endcsname{\strc_notations_command_yes[#one]{#two}}% \def\noexpand\strc_pickup_nop #one\csname\e!stop#stoptag\endcsname{\strc_notations_command_nop {#one}}}% - \doifnextoptionalcselse\strc_pickup_yes\strc_pickup_nop} + \doifelsenextoptionalcs\strc_pickup_yes\strc_pickup_nop} \unexpanded\def\strc_notations_start_yes[#reference]#title% {\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference={#reference},\c!title={#title},\c!bookmark=,\c!list=][]% @@ -382,7 +383,7 @@ \appendtoks \ifx\currentnoteparent\empty - \doifinsertionelse\currentnote + \doifelseinsertion\currentnote \donothing {\defineinsertion[\currentnote]% could be an option \normalexpanded{\t_strc_notes{\the\t_strc_notes\noexpand\strc_notes_process_list{\currentnote}}}}% @@ -392,7 +393,7 @@ \setexpandednoteparameter\s!insert{\namednoteparameter\currentnoteparent\s!insert}% \definenotation[\currentnote][\currentnoteparent][\c!type=\v!note]% \fi - \ctxcommand{definenote("\currentnote","insert",\number\currentnoteinsertionnumber)}% + \clf_definenote{\currentnote}{insert}\currentnoteinsertionnumber\relax \to \everydefinenote % maybe we will share this at some point: @@ -437,7 +438,7 @@ \strc_notes_inject_dummy \else \begingroup - \edef\currentnotenumber{\ctxcommand{storenote("\currentnote",\currentconstructionlistentry)}}% + \edef\currentnotenumber{\clf_storenote{\currentnote}\currentconstructionlistentry}% \settrue\processingnote \ifconditional\c_strc_notes_skip \globallet\lastnotesymbol\strc_notes_inject_symbol_nop @@ -519,7 +520,7 @@ \endcsname} \setvalue{\??noteinteractioninline\v!yes}% - {\strc_references_get_simple_page_reference{page(\ctxcommand{notenumberpage("\currentnote",\currentnotenumber)})}% + {\strc_references_get_simple_page_reference{page(\clf_notenumberpage{\currentnote}\currentnotenumber)}% \edef\strc_notes_get_reference_attribute_symbol{attr\referenceattribute\currentreferenceattribute}% \let \strc_notes_set_style_color_inline \strc_notes_set_style_color_inline_yes} @@ -539,7 +540,7 @@ % page(...) : we could have a dedicated one \setvalue{\??noteinteractiondisplay\v!yes}% - {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}% + {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}% \edef\strc_notes_set_reference_attribute_number{\attribute\referenceattribute\currentreferenceattribute}% \let \strc_notes_set_reference_attribute_text \donothing \let \strc_notes_set_destination_attribute_text\donothing @@ -552,7 +553,7 @@ \let\strc_notes_set_style_color_display \strc_notes_set_style_color_display_nop} \setvalue{\??noteinteractiondisplay\v!all}% - {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}% + {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}% \edef\strc_notes_set_reference_attribute_text {\attribute\referenceattribute\currentreferenceattribute}% %\strc_references_set_simple_page_reference{note:\cldcontext{structures.notes.internalid("\currentnote",\currentnotenumber)}}% \strc_references_set_simple_page_reference{note:\currentnote:\currentnotenumber}% @@ -561,7 +562,7 @@ \let \strc_notes_set_style_color_display \strc_notes_set_style_color_display_yes} \setvalue{\??noteinteractiondisplay\v!text}% - {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}% + {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}% \edef\strc_notes_set_reference_attribute_text {\attribute\referenceattribute\currentreferenceattribute}% %\strc_references_set_simple_page_reference{note:\cldcontext{structures.notes.internalid("\currentnote",\currentnotenumber)}}% \strc_references_set_simple_page_reference{note:\currentnote:\currentnotenumber}% @@ -586,7 +587,7 @@ {\iftrialtypesetting % keep \else\ifx\currentcolorparameter\empty - \scratchcounter\ctxcommand{notedeltapage("\currentnote",\currentnotenumber)}\relax % todo calculate once + \scratchcounter\clf_notedeltapage{\currentnote}\currentnotenumber\relax % todo calculate once \setlocationcolorspecified\scratchcounter \fi\fi} @@ -605,7 +606,7 @@ % in mkii the pointer only showed up in pagewise notes \unexpanded\def\strc_notes_inject_pointer % todo calculate once - {\ifcase\ctxcommand{notedeltapage("\currentnote",\currentnotenumber)}\relax + {\ifcase\clf_notedeltapage{\currentnote}\currentnotenumber\relax\relax % unknown \or % same page @@ -638,7 +639,7 @@ \unexpanded\def\strc_notes_inject_symbol_indeed#synchronize% {\removeunwantedspaces - \doifitalicelse\/\donothing % Charles IV \footnote{the fourth} + \doifelseitalic\/\donothing % Charles IV \footnote{the fourth} \ifdim\lastkern=\notesignal % \kern\noteparameter\c!distance % yes or no note font? or main text \strc_notes_inject_separator @@ -654,18 +655,18 @@ \hbox \strc_notes_get_reference_attribute_symbol \bgroup \dostarttagged\t!descriptionsymbol\currentnote \dotagsetnotesymbol - \noteparameter\c!textcommand{\ctxcommand{noteprefixednumber("\currentnote",\currentnotenumber)}}% + \noteparameter\c!textcommand{\clf_noteprefixednumber{\currentnote}\currentnotenumber\relax}% % the next one can cycle so we need to make sure it has no advance width \doif{\noteparameter\c!indicator}\v!yes\strc_notes_inject_pointer \dostoptagged \egroup \endgroup - \dostoptagged % check +% \dostoptagged % check \globallet\lastnotesymbol\relax} \unexpanded\def\strc_notes_inject_dummy % temp hack {\removeunwantedspaces - \doifitalicelse\/\donothing % Charles IV \footnote{the fourth} + \doifelseitalic\/\donothing % Charles IV \footnote{the fourth} \ifdim\lastkern=\notesignal % \kern\noteparameter\c!distance % yes or no note font? or main text \strc_notes_inject_separator @@ -1029,7 +1030,7 @@ \def\strc_notes_set_location_text % we don't use inserts anyway (e.g. endnotes) {\settrue\c_strc_notes_delayed - \ctxcommand{setnotestate("\currentnote","store")}% + \clf_setnotestate{\currentnote}{store}% \page_inserts_set_location\currentnoteinsertion\v!text % \setupinsertion[\currentnote][\c!location=\v!text]% \global\count\currentnoteinsertionnumber\zerocount \global\dimen\currentnoteinsertionnumber\maxdimen @@ -1181,6 +1182,7 @@ \insert\currentnoteinsertionnumber\bgroup \the\everyinsidenoteinsert\relax \usesetupsparameter\noteparameter % experimental + \useinterlinespaceparameter\noteparameter \doifelse{\noteparameter\c!paragraph}\v!yes {\nointerlineskip \startvboxtohboxseparator @@ -1203,7 +1205,7 @@ \edef\currentnote{#tag}% \strc_constructions_initialize{#tag}% \strc_notes_synchronize - \edef\currentconstructionlistentry{\ctxcommand{notelistindex("\currentnote",#id)}}% index in list cache + \edef\currentconstructionlistentry{\clf_notelistindex{\currentnote}#id}% index in list cache % as we can have collected notes (e.g. in tables) we need to recover % \currentdescriptionattribute and \currentdescriptionsynchronize % @@ -1217,14 +1219,14 @@ \begstrut \strc_references_flush_destination_nodes \strc_notes_set_destination_attribute_text - \strc_notes_inject_text - \endstrut + \strc_notes_inject_text\relax + \ifvmode\obeydepth\else\endstrut\fi % \obeydepth is new per 2015-01-10 \strc_constructions_stored_stop % \endgroup } \unexpanded\def\strc_notes_inject_text % hm main? - {\ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}} + {\clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax} \let\startpushnote\relax \let\stoppushnote \relax @@ -1297,7 +1299,7 @@ \noteparameter\c!before \fi % \bgroup - % \setupalign[\noteparameter\c!align]% + % \usealignparameter\noteparameter \placenoterule % alleen in ..mode % \par % \egroup @@ -1353,11 +1355,14 @@ % idea: tag with attr and then just flush them again \def\strc_notes_flush_global - {\doifelse{\noteparameter\c!paragraph}\v!yes + {\begingroup + \useinterlinespaceparameter\noteparameter + \doifelse{\noteparameter\c!paragraph}\v!yes {\vbox\starthboxestohbox \iftrialtypesetting\unvcopy\else\unvbox\fi\currentnoteinsertionnumber \stophboxestohbox} - {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}} + {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}% + \endgroup} %D Supporting end notes is surprisingly easy. Even better, we %D can combine this feature with solving the common \TEX\ @@ -1395,7 +1400,7 @@ {\ifconditional\postponingnotes\else \global\settrue\postponingnotes \global\let\flushnotes\doflushnotes - \ctxcommand{postponenotes()}% + \clf_postponenotes \fi} \let\flushnotes\relax @@ -1405,7 +1410,7 @@ \begingroup \let\flushnotes \relax \let\postponenotes\relax - \ctxcommand{flushpostponednotes()}% this also resets the states ! + \clf_flushpostponednotes% this also resets the states ! \global\setfalse\postponednote \global\setfalse\postponingnotes \global\let\flushnotes\relax @@ -1452,20 +1457,20 @@ \strc_counters_save{#tag}% \strc_counters_reset{#tag}% \fi - \ctxcommand{savenote("#tag","store")}} + \clf_savenote{#tag}{store}} \def\strc_notes_local_stop_step#tag% {\p_strc_notes_continue{\noteparameter\c!continue}% \ifx\p_strc_notes_continue\v!yes \else \strc_counters_restore{#tag}% \fi - \ctxcommand{restorenote("#tag")}} + \clf_restorenote{#tag}} \unexpanded\def\placelocalnotes {\dodoubleempty\strc_notes_local_place} \def\strc_notes_local_place[#tag][#settings]% - {\doif{\ctxcommand{getnotestate("#tag")}}{store}{\strc_notes_local_place_indeed{#settings}{#tag}}} + {\doif{\clf_getnotestate{#tag}}{store}{\strc_notes_local_place_indeed{#settings}{#tag}}} \def\strc_notes_local_place_indeed#settings#tag% {\begingroup @@ -1525,7 +1530,7 @@ \def\strc_notes_place_indeed#settings#tag% settings note {\edef\currentnote{#tag}% grouping ? - \doifelse{\ctxcommand{getnotestate("#tag")}}{store} + \doifelse{\clf_getnotestate{#tag}}{store} \strc_notes_local_place_indeed \strc_notes_global_place_indeed {#settings}{#tag}} @@ -1545,7 +1550,7 @@ {\setvalue{\??notealternative#alternative}{#command}} \unexpanded\def\doifnotescollected#tag% - {\ctxcommand{doifnotecontent("#tag")}} + {\clf_doifnotecontent{#tag}} \def\strc_notes_place_local_alternative % will be a setup (wrapper) {\doifnotescollected\currentnote @@ -1572,7 +1577,7 @@ % setups ? -\def\flushlocalnotes#tag{\ctxcommand{flushnotes("#tag","store","\noteparameter\c!criterium")}} +\def\flushlocalnotes#tag{\clf_flushnotes{#tag}{store}{\noteparameter\c!criterium}} \installnotealternative \v!none {\flushlocalnotes\currentnote} @@ -1597,7 +1602,7 @@ \setupcurrentnote[\c!location=]% \inheritednoteframed {\edef\currentnotewidth{\noteparameter\c!width}% - \doifdimensionelse\currentnotewidth\donothing + \doifelsedimension\currentnotewidth\donothing {\edef\currentnotewidth{\the\hsize}}% \startsimplecolumns[\c!distance=\noteparameter\c!columndistance,\c!n=\noteparameter\c!n,\c!width=\currentnotewidth]% \flushlocalnotes\currentnote @@ -1722,8 +1727,8 @@ \def\strc_notes_set_bodyfont {\let\strc_notes_set_bodyfont\relax \restoreglobalbodyfont - \switchtobodyfont[\noteparameter\c!bodyfont]% - \setupalign[\noteparameter\c!align]} + \usebodyfontparameter\noteparameter + \usealignparameter\noteparameter} %D The footnote mechanism defaults to a traditional one %D column way of showing them. By default we precede them by @@ -1764,7 +1769,9 @@ %D } %D \stoptyping -\def\doifnoteonsamepageelse[#tag]{\ctxcommand{doifnoteonsamepageasprevious("#tag")}} +\def\doifelsenoteonsamepage[#tag]{\clf_doifnoteonsamepageasprevious{#tag}} + +\let\doifnoteonsamepageelse\doifelsenoteonsamepage %D New trickery: @@ -1829,4 +1836,24 @@ % [ownnote] % [\ownnotesymbol] +% tricky: +% +% \enabletrackers[nodes.areas] +% \enabletrackers[nodes.references] +% \enabletrackers[nodes.destinations] +% +% \setupnotes[interaction=all,rule=no] +% \setupinteraction[state=start,focus=standard] +% +% \starttext +% \goto{\input tufte\relax}[page(2)] \par +% \ruledhbox{\gotobox{\vtop{\input tufte\relax}}[page(2)]} \par +% \ruledhbox{\gotobox{\vbox{\input tufte\relax}}[page(2)]} \par +% % \completecontent +% % \chapter{Chapter} +% % \dorecurse{5}{\input knuth} +% a\footnote{\input tufte\par\input ward\relax} +% \stoptext + \protect \endinput + diff --git a/Master/texmf-dist/tex/context/base/strc-num.lua b/Master/texmf-dist/tex/context/base/strc-num.lua index e1fc6003071..0203334fff6 100644 --- a/Master/texmf-dist/tex/context/base/strc-num.lua +++ b/Master/texmf-dist/tex/context/base/strc-num.lua @@ -20,6 +20,8 @@ local setmetatableindex = table.setmetatableindex local trace_counters = false trackers.register("structures.counters", function(v) trace_counters = v end) local report_counters = logs.reporter("structure","counters") +local implement = interfaces.implement + local structures = structures local helpers = structures.helpers local sections = structures.sections @@ -199,6 +201,24 @@ local function allocate(name,i) -- can be metatable return ci end +local pattern = lpeg.P(variables.by)^-1 * lpeg.C(lpeg.P(1)^1) +local lpegmatch = lpeg.match + +function counters.way(way) + if not way or way == "" then + return "" + else + return lpegmatch(pattern,way) + end +end + +implement { + name = "way", + actions = { counters.way, context }, + arguments = "string" +} + + function counters.record(name,i) return allocate(name,i or 1) end @@ -376,10 +396,8 @@ local function check(name,data,start,stop) end end -counters.reset = reset -counters.set = set -function counters.setown(name,n,value) +local function setown(name,n,value) local cd = counterdata[name] if cd then local d = allocate(name,n) @@ -397,7 +415,7 @@ function counters.setown(name,n,value) end end -function counters.restart(name,n,newstart,noreset) +local function restart(name,n,newstart,noreset) local cd = counterdata[name] if cd then newstart = tonumber(newstart) @@ -425,7 +443,7 @@ function counters.restore(name) end end -function counters.add(name,n,delta) +local function add(name,n,delta) local cd = counterdata[name] if cd and (cd.state == v_start or cd.state == "") then local data = cd.data @@ -494,7 +512,12 @@ local function get(name,n,key) end end -counters.get = get +counters.reset = reset +counters.set = set +counters.add = add +counters.get = get +counters.setown = setown +counters.restart = restart function counters.value(name,n) -- what to do with own return get(name,n or 1,'number') or 0 @@ -553,24 +576,7 @@ end -- interfacing -commands.definecounter = counters.define -commands.setcounter = counters.set -commands.setowncounter = counters.setown -commands.resetcounter = counters.reset -commands.restartcounter = counters.restart -commands.savecounter = counters.save -commands.restorecounter = counters.restore -commands.addcounter = counters.add - -commands.rawcountervalue = function(...) context(counters.raw (...)) end -commands.countervalue = function(...) context(counters.value (...)) end -commands.lastcountervalue = function(...) context(counters.last (...)) end -commands.firstcountervalue = function(...) context(counters.first (...)) end -commands.nextcountervalue = function(...) context(counters.next (...)) end -commands.prevcountervalue = function(...) context(counters.previous(...)) end -commands.subcountervalues = function(...) context(counters.subs (...)) end - -function commands.showcounter(name) +local function showcounter(name) local cd = counterdata[name] if cd then context("[%s:",name) @@ -583,17 +589,11 @@ function commands.showcounter(name) end end -function commands.doifelsecounter(name) commands.doifelse(counterdata[name]) end -function commands.doifcounter (name) commands.doif (counterdata[name]) end -function commands.doifnotcounter (name) commands.doifnot (counterdata[name]) end - -function commands.incrementedcounter(...) context(counters.add(...)) end - -- the noreset is somewhat messy ... always false messes up e.g. itemize but true the pagenumbers -- -- if this fails i'll clean up this still somewhat experimental mechanism (but i need use cases) -function commands.checkcountersetup(name,level,start,state) +local function checkcountersetup(name,level,start,state) local noreset = true -- level > 0 -- was true counters.restart(name,1,start,noreset) -- was true counters.setstate(name,state) @@ -601,6 +601,70 @@ function commands.checkcountersetup(name,level,start,state) sections.setchecker(name,level,counters.reset) end +-- + +implement { name = "addcounter", actions = add, arguments = { "string", "integer", "integer" } } +implement { name = "setcounter", actions = set, arguments = { "string", 1, "integer" } } +implement { name = "setowncounter", actions = setown, arguments = { "string", 1, "string" } } +implement { name = "restartcounter", actions = restart, arguments = { "string", 1, "integer" } } +implement { name = "resetcounter", actions = reset, arguments = { "string", 1 } } +implement { name = "incrementcounter", actions = add, arguments = { "string", 1, 1 } } +implement { name = "decrementcounter", actions = add, arguments = { "string", 1, -1 } } + +implement { name = "setsubcounter", actions = set, arguments = { "string", "integer", "integer" } } +implement { name = "setownsubcounter", actions = setown, arguments = { "string", "integer", "string" } } +implement { name = "restartsubcounter", actions = restart, arguments = { "string", "integer", "integer" } } +implement { name = "resetsubcounter", actions = reset, arguments = { "string", "integer" } } +implement { name = "incrementsubcounter", actions = add, arguments = { "string", "integer", 1 } } +implement { name = "decrementsubcounter", actions = add, arguments = { "string", "integer", -1 } } + +implement { name = "rawcountervalue", actions = { counters.raw , context }, arguments = { "string", 1 } } +implement { name = "countervalue", actions = { counters.value , context }, arguments = { "string", 1 } } +implement { name = "lastcountervalue", actions = { counters.last , context }, arguments = { "string", 1 } } +implement { name = "firstcountervalue", actions = { counters.first , context }, arguments = { "string", 1 } } +implement { name = "nextcountervalue", actions = { counters.next , context }, arguments = { "string", 1 } } +implement { name = "prevcountervalue", actions = { counters.previous, context }, arguments = { "string", 1 } } +implement { name = "subcountervalues", actions = { counters.subs , context }, arguments = { "string", 1 } } + +implement { name = "rawsubcountervalue", actions = { counters.raw , context }, arguments = { "string", "integer" } } +implement { name = "subcountervalue", actions = { counters.value , context }, arguments = { "string", "integer" } } +implement { name = "lastsubcountervalue", actions = { counters.last , context }, arguments = { "string", "integer" } } +implement { name = "firstsubcountervalue", actions = { counters.first , context }, arguments = { "string", "integer" } } +implement { name = "nextsubcountervalue", actions = { counters.next , context }, arguments = { "string", "integer" } } +implement { name = "previoussubcountervalue", actions = { counters.previous, context }, arguments = { "string", "integer" } } +implement { name = "subsubcountervalues", actions = { counters.subs , context }, arguments = { "string", "integer" } } + +implement { name = "savecounter", actions = counters.save, arguments = "string" } +implement { name = "restorecounter", actions = counters.restore, arguments = "string" } + +implement { name = "incrementedcounter", actions = { add, context }, arguments = { "string", 1, 1 } } +implement { name = "decrementedcounter", actions = { add, context }, arguments = { "string", 1, -1 } } + +implement { name = "showcounter", actions = showcounter, arguments = "string" } -- todo +implement { name = "checkcountersetup", actions = checkcountersetup, arguments = { "string", "integer", "integer", "string" } } + +table.setmetatablecall(counterdata,function(t,k) return t[k] end) + +implement { name = "doifelsecounter", actions = { counterdata, commands.doifelse }, arguments = "string" } +implement { name = "doifcounter", actions = { counterdata, commands.doif }, arguments = "string" } +implement { name = "doifnotcounter", actions = { counterdata, commands.doifnot }, arguments = "string" } + +implement { + name = "definecounter", + actions = counters.define, + arguments = { + { + { "name" } , + { "start", "integer" }, + { "counter" }, + { "method" }, + } + } +} + +------------------------------------------------------------------ +------------------------------------------------------------------ + -- -- move to strc-pag.lua -- -- function counters.analyze(name,counterspecification) diff --git a/Master/texmf-dist/tex/context/base/strc-num.mkiv b/Master/texmf-dist/tex/context/base/strc-num.mkiv index 6802027e67b..58095b8e7d9 100644 --- a/Master/texmf-dist/tex/context/base/strc-num.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-num.mkiv @@ -27,7 +27,9 @@ \installcommandhandler \??counter {counter} \??counter -\let\setupstructurecounting\setupcounter +\let\setupcounters\setupcounter + +\let\setupstructurecounting\setupcounter % will disappear \setupcounter [\c!way=\v!by\v!chapter, @@ -41,7 +43,7 @@ \c!state=\v!start] \def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto - {2:\thenamedheadlevel{\ctxcommand{way("#1\c!way")}}} + {2:\thenamedheadlevel{\clf_way{#1\c!way}}} \appendtoks \resetcounterparameter\s!counter @@ -50,15 +52,16 @@ \appendtoks \ifx\currentcounterparent\empty \edef\p_start{\counterparameter\c!start}% - \ctxcommand{definecounter { - name = "\currentcounter", - start = \ifx\p_start\empty0\else\number\p_start\fi, - counter = "\counterparameter\s!counter", - method = "\counterparameter\c!method", - }}% + \clf_definecounter + name {\currentcounter}% + start \ifx\p_start\empty\zerocount\else\numexpr\p_start\relax\fi + counter {\counterparameter\s!counter}% + method {\counterparameter\c!method}% + \relax \letcounterparameter\s!name\currentcounter \else - \letcounterparameter\s!name\currentcounterparent + % \letcounterparameter\s!name\currentcounterparent % we need a chained clone + \setexpandedcounterparameter\s!name{\namedcounterparameter\currentcounterparent\s!name}% \fi \strc_counters_check_setup \to \everydefinecounter @@ -67,7 +70,7 @@ \ifx\currentcounter\empty \else \edef\p_number{\counterparameter\c!number}% \ifx\p_number\empty \else - \ctxcommand{setcounter("\counterparameter\s!name",1,\number\p_number)}% + \clf_setcounter{\counterparameter\s!name}\numexpr\p_number\relax \letcounterparameter\c!number\empty \fi \edef\p_start{\counterparameter\c!start}% @@ -78,40 +81,28 @@ % % % % -\def\strc_counters_way#1% slow, we need to store it at the tex end - {\ctxcommand{way("\namedcounterparameter{#1}\c!way")}} - -% \def\thenamedcounterlevel#1% -% {\thenamedheadlevel{\strc_counters_way{#1}}} +\def\strc_counters_way#1{\clf_way{\namedcounterparameter{#1}\c!way}} \def\thenamedcounterlevel#1% - {\xthenamedheadlevel{\strc_counters_way{#1}}} - -% \def\strc_counters_check_setup#1% does it have to happen here? -% {% this can be done at the lua end / a bit messy here ... todo ... -% \ifcsname\??counter#1\c!number\endcsname -% \doifelsevalue {\??counter#1\c!number}{#1} {\letbeundefined{\??counter#1\c!number}}% -% {\doifvaluenothing{\??counter#1\c!number} {\letbeundefined{\??counter#1\c!number}}}% -% \fi -% \ifcsname\??counter#1\c!number\endcsname -% % it's a clone -% \else -% \edef\currentcounterlevel{\thenamedcounterlevel{#1}}% -% \edef\p_start{\counterparameter{#1}\c!start}% -% \ctxcommand{checkcountersetup("#1",\currentcounterlevel,\ifx\p_start\empty0\else\number\p_start\fi,"\counterparameter{#1}\c!state")}% -% \fi} + {\xthenamedheadlevel{\clf_way{\namedcounterparameter{#1}\c!way}}} -\def\strc_counters_check_setup +\unexpanded\def\strc_counters_check_setup {\edef\p_name{\directcounterparameter\s!name}% \ifx\currentcounter\p_name \edef\currentcounterlevel{\thenamedcounterlevel\currentcounter}% \edef\p_start{\counterparameter\c!start}% - \ctxcommand{checkcountersetup("\currentcounter",\currentcounterlevel,\ifx\p_start\empty0\else\number\p_start\fi,"\counterparameter\c!state")}% + \clf_checkcountersetup + {\currentcounter}% + \numexpr\currentcounterlevel\relax + \numexpr\ifx\p_start\empty\zerocount\else\p_start\fi\relax % bug in scanner + {\counterparameter\c!state}% \fi} -\unexpanded\def\doifcounterelse #1{\ctxcommand{doifelsecounter("\namedcounterparameter{#1}\s!name")}} -\unexpanded\def\doifcounter #1{\ctxcommand{doifcounter ("\namedcounterparameter{#1}\s!name")}} -\unexpanded\def\doifnotcounter #1{\ctxcommand{doifnotcounter ("\namedcounterparameter{#1}\s!name")}} +\unexpanded\def\doifelsecounter #1{\clf_doifelsecounter{\namedcounterparameter{#1}\s!name}} +\unexpanded\def\doifcounter #1{\clf_doifcounter {\namedcounterparameter{#1}\s!name}} +\unexpanded\def\doifnotcounter #1{\clf_doifnotcounter {\namedcounterparameter{#1}\s!name}} + +\let\doifcounterelse\doifelsecounter \unexpanded\def\setcounter {\dotripleempty \strc_counters_set_interfaced} \unexpanded\def\setcounterown {\dotripleempty \strc_counters_setown_interfaced} @@ -252,90 +243,90 @@ \expandafter\gobbleoneoptional \fi} -\def\strc_counters_set_two [#1][#2][#3]{\strc_counters_set_sub {#1}{#2}{#3}} -\def\strc_counters_setown_two [#1][#2][#3]{\strc_counters_setown_sub {#1}{#2}{#3}} -\def\strc_counters_restart_two [#1][#2][#3]{\strc_counters_restart_sub {#1}{#2}{#3}} -\def\strc_counters_reset_two [#1][#2]{\strc_counters_reset_sub {#1}{#2}} -\def\strc_counters_increment_two [#1][#2]{\strc_counters_increment_sub{#1}{#2}} -\def\strc_counters_decrement_two [#1][#2]{\strc_counters_decrement_sub{#1}{#2}} - -\def\strc_counters_raw_two [#1][#2]{\strc_counters_raw_sub {#1}{#2}} -\def\strc_counters_last_two [#1][#2]{\strc_counters_last_sub {#1}{#2}} -\def\strc_counters_first_two [#1][#2]{\strc_counters_first_sub {#1}{#2}} -\def\strc_counters_next_two [#1][#2]{\strc_counters_next_sub {#1}{#2}} -\def\strc_counters_prev_two [#1][#2]{\strc_counters_prev_sub {#1}{#2}} -\def\strc_counters_subs_two [#1][#2]{\strc_counters_subs_sub {#1}{#2}} - -\def\strc_counters_set_one [#1][#2][#3]{\strc_counters_set_sub {#1}\plusone{#2}} -\def\strc_counters_setown_one [#1][#2][#3]{\strc_counters_setown_sub {#1}\plusone{#2}} -\def\strc_counters_restart_one [#1][#2][#3]{\strc_counters_restart_sub {#1}\plusone{#2}} -\def\strc_counters_reset_one [#1][#2]{\strc_counters_reset_sub {#1}\plusone} -\def\strc_counters_increment_one [#1][#2]{\strc_counters_increment_sub{#1}\plusone} -\def\strc_counters_decrement_one [#1][#2]{\strc_counters_decrement_sub{#1}\plusone} - -\def\strc_counters_raw_one [#1][#2]{\strc_counters_raw_sub {#1}\plusone} -\def\strc_counters_last_one [#1][#2]{\strc_counters_last_sub {#1}\plusone} -\def\strc_counters_first_one [#1][#2]{\strc_counters_first_sub {#1}\plusone} -\def\strc_counters_next_one [#1][#2]{\strc_counters_next_sub {#1}\plusone} -\def\strc_counters_prev_one [#1][#2]{\strc_counters_prev_sub {#1}\plusone} -\def\strc_counters_subs_one [#1][#2]{\strc_counters_subs_sub {#1}\plusone} - -\def\strc_counters_save_one [#1]{\strc_counters_save {#1}} -\def\strc_counters_restore_one [#1]{\strc_counters_restore {#1}} - -\unexpanded\def\strc_counters_set #1#2{\strc_counters_set_sub {#1}\plusone{#2}} -\unexpanded\def\strc_counters_setown #1#2{\strc_counters_setown_sub {#1}\plusone{#2}} -\unexpanded\def\strc_counters_restart #1#2{\strc_counters_restart_sub {#1}\plusone{#2}} -\unexpanded\def\strc_counters_reset #1{\strc_counters_reset_sub {#1}\plusone} -\unexpanded\def\strc_counters_increment #1{\strc_counters_increment_sub{#1}\plusone} -\unexpanded\def\strc_counters_decrement #1{\strc_counters_decrement_sub{#1}\plusone} - - \def\strc_counters_raw #1{\strc_counters_raw_sub {#1}\plusone} - \def\strc_counters_last #1{\strc_counters_last_sub {#1}\plusone} - \def\strc_counters_first #1{\strc_counters_first_sub {#1}\plusone} - \def\strc_counters_next #1{\strc_counters_next_sub {#1}\plusone} - \def\strc_counters_prev #1{\strc_counters_prev_sub {#1}\plusone} - \def\strc_counters_subs #1{\strc_counters_subs_sub {#1}\plusone} - -\unexpanded\def\strc_counters_set_sub #1#2#3{\ctxcommand{setcounter ("\namedcounterparameter{#1}\s!name",\number#2,\number#3)}} -\unexpanded\def\strc_counters_setown_sub #1#2#3{\ctxcommand{setowncounter ("\namedcounterparameter{#1}\s!name",\number#2,"#3")}} -\unexpanded\def\strc_counters_restart_sub #1#2#3{\ctxcommand{restartcounter("\namedcounterparameter{#1}\s!name",\number#2,\number#3)}} -\unexpanded\def\strc_counters_reset_sub #1#2{\ctxcommand{resetcounter ("\namedcounterparameter{#1}\s!name",\number#2)}} -\unexpanded\def\strc_counters_increment_sub #1#2{\ctxcommand{addcounter ("\namedcounterparameter{#1}\s!name",\number#2,1)}} -\unexpanded\def\strc_counters_decrement_sub #1#2{\ctxcommand{addcounter ("\namedcounterparameter{#1}\s!name",\number#2,-1)}} - - \def\strc_counters_raw_sub #1#2{\ctxcommand{countervalue ("\namedcounterparameter{#1}\s!name",\number#2)}} % maybe raw - \def\strc_counters_last_sub #1#2{\ctxcommand{lastcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}} - \def\strc_counters_first_sub #1#2{\ctxcommand{firstcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}} - \def\strc_counters_next_sub #1#2{\ctxcommand{nextcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}} - \def\strc_counters_prev_sub #1#2{\ctxcommand{previouscountervalue("\namedcounterparameter{#1}\s!name",\number#2)}} - \def\strc_counters_subs_sub #1#2{\ctxcommand{subcountervalues ("\namedcounterparameter{#1}\s!name",\number#2)}} - -\unexpanded\def\strc_counters_save #1{\ctxcommand{savecounter ("\namedcounterparameter{#1}\s!name")}} -\unexpanded\def\strc_counters_restore #1{\ctxcommand{restorecounter("\namedcounterparameter{#1}\s!name")}} - -\unexpanded\def\strc_counters_incremented #1{\ctxcommand{incrementedcounter("\namedcounterparameter{#1}\s!name",1, 1)}} -\unexpanded\def\strc_counters_decremented #1{\ctxcommand{incrementedcounter("\namedcounterparameter{#1}\s!name",1,-1)}} - -\unexpanded\def\showcounter [#1]{\ctxcommand{tracecounter("\namedcounterparameter{#1}\s!name")}} - -\unexpanded\def\incrementedcounter [#1]{\strc_counters_incremented{#1}} % expandable, no \dosingleargument -\unexpanded\def\decrementedcounter [#1]{\strc_counters_decremented{#1}} % expandable, no \dosingleargument +\def\strc_counters_set_two [#1][#2][#3]{\clf_setsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax} +\def\strc_counters_setown_two [#1][#2][#3]{\clf_setownsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax{#3}} +\def\strc_counters_restart_two [#1][#2][#3]{\clf_restartsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax} +\def\strc_counters_reset_two [#1][#2]{\clf_resetsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_increment_two [#1][#2]{\clf_incrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_decrement_two [#1][#2]{\clf_decrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + +\def\strc_counters_raw_two [#1][#2]{\clf_subcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_last_two [#1][#2]{\clf_lastsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_first_two [#1][#2]{\clf_firstsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_next_two [#1][#2]{\clf_nextsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_prev_two [#1][#2]{\clf_previoussubcountervalue{\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_subs_two [#1][#2]{\clf_subsubcountervalues {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + +\def\strc_counters_set_one [#1][#2][#3]{\clf_setcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_setown_one [#1][#2][#3]{\clf_setowncounter {\namedcounterparameter{#1}\s!name}{#2}} +\def\strc_counters_restart_one [#1][#2][#3]{\clf_restartcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\def\strc_counters_reset_one [#1][#2]{\clf_resetcounter {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_increment_one [#1][#2]{\clf_incrementcounter {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_decrement_one [#1][#2]{\clf_decrementcounter {\namedcounterparameter{#1}\s!name}} + +\def\strc_counters_raw_one [#1][#2]{\clf_countervalue {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_last_one [#1][#2]{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_first_one [#1][#2]{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_next_one [#1][#2]{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_prev_one [#1][#2]{\clf_previouscountervalue {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_subs_one [#1][#2]{\clf_subcountervalues {\namedcounterparameter{#1}\s!name}} + +\def\strc_counters_save_one [#1]{\clf_savecounter {\namedcounterparameter{#1}\s!name}} +\def\strc_counters_restore_one [#1]{\clf_restorecounter {\namedcounterparameter{#1}\s!name}} + +\unexpanded\def\strc_counters_set #1#2{\clf_setcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\unexpanded\def\strc_counters_setown #1#2{\clf_setowncounter {\namedcounterparameter{#1}\s!name}{#2}} +\unexpanded\def\strc_counters_restart #1#2{\clf_restartcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\unexpanded\def\strc_counters_reset #1{\clf_resetcounter {\namedcounterparameter{#1}\s!name}} +\unexpanded\def\strc_counters_increment #1{\clf_incrementcounter {\namedcounterparameter{#1}\s!name}} +\unexpanded\def\strc_counters_decrement #1{\clf_decrementcounter {\namedcounterparameter{#1}\s!name}} + + \def\strc_counters_raw #1{\clf_countervalue {\namedcounterparameter{#1}\s!name}} + \def\strc_counters_last #1{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}} + \def\strc_counters_first #1{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}} + \def\strc_counters_next #1{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}} + \def\strc_counters_prev #1{\clf_previouscountervalue {\namedcounterparameter{#1}\s!name}} + \def\strc_counters_subs #1{\clf_subcountervalues {\namedcounterparameter{#1}\s!name}} + +\unexpanded\def\strc_counters_set_sub #1#2#3{\clf_setsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax} +\unexpanded\def\strc_counters_setown_sub #1#2#3{\clf_setownsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax{#3}} +\unexpanded\def\strc_counters_restart_sub #1#2#3{\clf_restartsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax} +\unexpanded\def\strc_counters_reset_sub #1#2{\clf_resetsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\unexpanded\def\strc_counters_increment_sub #1#2{\clf_incrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} +\unexpanded\def\strc_counters_decrement_sub #1#2{\clf_decrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + + \def\strc_counters_raw_sub #1#2{\clf_subcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} % maybe raw + \def\strc_counters_last_sub #1#2{\clf_lastsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + \def\strc_counters_first_sub #1#2{\clf_firstsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + \def\strc_counters_next_sub #1#2{\clf_nextsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + \def\strc_counters_prev_sub #1#2{\clf_previoussubcountervalue{\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + \def\strc_counters_subs_sub #1#2{\clf_subsubcountervalues {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} + +\unexpanded\def\strc_counters_save #1{\clf_savecounter {\namedcounterparameter{#1}\s!name}} +\unexpanded\def\strc_counters_restore #1{\clf_restorecounter {\namedcounterparameter{#1}\s!name}} + +\unexpanded\def\strc_counters_incremented #1{\clf_incrementedcounter {\namedcounterparameter{#1}\s!name}} +\unexpanded\def\strc_counters_decremented #1{\clf_decrementedcounter {\namedcounterparameter{#1}\s!name}} + +\unexpanded\def\showcounter [#1]{\clf_showcounter {\namedcounterparameter{#1}\s!name}} + +\unexpanded\def\incrementedcounter [#1]{\clf_incrementedcounter {\namedcounterparameter{#1}\s!name}} % no \dosingleargument +\unexpanded\def\decrementedcounter [#1]{\clf_decrementedcounter {\namedcounterparameter{#1}\s!name}} % no \dosingleargument % public variants ... beware, for old cases, from now on the value variants are the % ones that are expandable -\def\rawcountervalue [#1]{\strc_counters_raw_sub {#1}\plusone} -\def\lastcountervalue [#1]{\strc_counters_last_sub {#1}\plusone} -\def\firstcountervalue[#1]{\strc_counters_first_sub{#1}\plusone} -\def\nextcountervalue [#1]{\strc_counters_next_sub {#1}\plusone} -\def\prevcountervalue [#1]{\strc_counters_prev_sub {#1}\plusone} +\def\rawcountervalue [#1]{\clf_countervalue {\namedcounterparameter{#1}\s!name}} +\def\lastcountervalue [#1]{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}} +\def\firstcountervalue [#1]{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}} +\def\nextcountervalue [#1]{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}} +\def\prevcountervalue [#1]{\clf_previouscountervalue{\namedcounterparameter{#1}\s!name}} -\let\rawsubcountervalue \strc_counters_raw_two -\let\lastsubcountervalue \strc_counters_last_two -\let\firstsubcountervalue\strc_counters_first_two -\let\nextsubcountervalue \strc_counters_next_two -\let\prevsubcountervalue \strc_counters_prev_two +\let\rawsubcountervalue \strc_counters_raw_two +\let\lastsubcountervalue \strc_counters_last_two +\let\firstsubcountervalue \strc_counters_first_two +\let\nextsubcountervalue \strc_counters_next_two +\let\prevsubcountervalue \strc_counters_prev_two % The bypage check needs a multipass reference and therefore we only check for it when we increment % and know that some content will be placed. We could also check for spreads. @@ -349,7 +340,7 @@ \strc_counters_reset{#1}% \fi \fi - \ctxcommand{addcounter("\namedcounterparameter{#1}\s!name",\number#2,1)}} + \clf_incrementsubcounter{\namedcounterparameter{#1}\s!name}\numexpr#2\relax} \unexpanded\def\convertedcounter {\dodoubleempty\strc_counters_converted} @@ -358,58 +349,58 @@ {\begingroup \edef\currentcounter{#1}% \ifsecondargument\setupcurrentcounter[#2]\fi - \ctxcommand{prefixedconverted( - "\counterparameter\s!name", + \clf_prefixedconverted + {\counterparameter\s!name} { - prefix = "\counterparameter\c!prefix", - separatorset = "\counterparameter\c!prefixseparatorset", - conversion = "\counterparameter\c!prefixconversion", - conversionset = "\counterparameter\c!prefixconversionset", - starter = \!!bs\counterparameter\c!prefixstarter\!!es, - stopper = \!!bs\counterparameter\c!prefixstopper\!!es, - set = "\counterparameter\c!prefixset", - segments = "\counterparameter\c!prefixsegments", - connector = \!!bs\counterparameter\c!prefixconnector\!!es, - }, + prefix {\counterparameter\c!prefix} + separatorset {\counterparameter\c!prefixseparatorset} + conversion {\counterparameter\c!prefixconversion} + conversionset {\counterparameter\c!prefixconversionset} + starter {\counterparameter\c!prefixstarter} + stopper {\counterparameter\c!prefixstopper} + set {\counterparameter\c!prefixset} + segments {\counterparameter\c!prefixsegments} + connector {\counterparameter\c!prefixconnector} + } { - order = "\counterparameter\c!numberorder", - separatorset = "\counterparameter\c!numberseparatorset", - conversion = \!!bs\counterparameter\c!numberconversion\!!es, - conversionset = "\counterparameter\c!numberconversionset", - starter = \!!bs\counterparameter\c!numberstarter\!!es, - stopper = \!!bs\counterparameter\c!numberstopper\!!es, - segments = "\counterparameter\c!numbersegments", - type = "\counterparameter\c!type", - criterium = "\counterparameter\c!criterium", % might change if we also want this with sectioning + order {\counterparameter\c!numberorder} + separatorset {\counterparameter\c!numberseparatorset} + conversion {\counterparameter\c!numberconversion} + conversionset {\counterparameter\c!numberconversionset} + starter {\counterparameter\c!numberstarter} + stopper {\counterparameter\c!numberstopper} + segments {\counterparameter\c!numbersegments} + type {\counterparameter\c!type} + criterium {\counterparameter\c!criterium} } - )}% + \relax \endgroup} \def\directconvertedcounter#1#2% name, type - {\ctxcommand{prefixedconverted( - "\namedcounterparameter{#1}\s!name", + {\clf_prefixedconverted + {\namedcounterparameter{#1}\s!name} { - prefix = "\namedcounterparameter{#1}\c!prefix", - separatorset = "\namedcounterparameter{#1}\c!prefixseparatorset", - conversion = "\namedcounterparameter{#1}\c!prefixconversion", - conversionset = "\namedcounterparameter{#1}\c!prefixconversionset", - % starter = \!!bs\namedcounterparameter{#1}\c!prefixstarter\!!es, - % stopper = \!!bs\namedcounterparameter{#1}\c!prefixstopper\!!es, - set = "\namedcounterparameter{#1}\c!prefixset", - segments = "\namedcounterparameter{#1}\c!prefixsegments", - connector = \!!bs\namedcounterparameter{#1}\c!prefixconnector\!!es, - }, + prefix {\namedcounterparameter{#1}\c!prefix} + separatorset {\namedcounterparameter{#1}\c!prefixseparatorset} + conversion {\namedcounterparameter{#1}\c!prefixconversion} + conversionset {\namedcounterparameter{#1}\c!prefixconversionset} + % starter {\namedcounterparameter{#1}\c!prefixstarter} + % stopper {\namedcounterparameter{#1}\c!prefixstopper} + set {\namedcounterparameter{#1}\c!prefixset} + segments {\namedcounterparameter{#1}\c!prefixsegments} + connector {\namedcounterparameter{#1}\c!prefixconnector} + } { - order = "\namedcounterparameter{#1}\c!numberorder", - separatorset = "\namedcounterparameter{#1}\c!numberseparatorset", - conversion = \!!bs\namedcounterparameter{#1}\c!numberconversion\!!es, - conversionset = "\namedcounterparameter{#1}\c!numberconversionset", - starter = \!!bs\namedcounterparameter{#1}\c!numberstarter\!!es, - stopper = \!!bs\namedcounterparameter{#1}\c!numberstopper\!!es, - segments = "\namedcounterparameter{#1}\c!numbersegments", - type = "#2", + order {\namedcounterparameter{#1}\c!numberorder} + separatorset {\namedcounterparameter{#1}\c!numberseparatorset} + conversion {\namedcounterparameter{#1}\c!numberconversion} + conversionset {\namedcounterparameter{#1}\c!numberconversionset} + starter {\namedcounterparameter{#1}\c!numberstarter} + stopper {\namedcounterparameter{#1}\c!numberstopper} + segments {\namedcounterparameter{#1}\c!numbersegments} + type {#2} } - )}} + \relax} \unexpanded\def\convertedsubcounter {\dotripleempty\strc_counters_converted_sub} @@ -444,7 +435,9 @@ \unexpanded\def\doifdefinedcounter {\doifcommandhandler \??counter} \unexpanded\def\doifundefinedcounter {\doifnotcommandhandler \??counter} -\unexpanded\def\doifdefinedcounterelse{\doifelsecommandhandler\??counter} +\unexpanded\def\doifelsedefinedcounter{\doifelsecommandhandler\??counter} + +\let\doifdefinedcounterelse\doifelsedefinedcounter %D What follows is a compatibility layer. @@ -465,7 +458,8 @@ \let \doifdefinednumber \doifdefinedcounter % {number}{true} \let \doifundefinednumber \doifnotdefinedcounter % {number}{true} -\let \doifdefinednumberelse \doifdefinedcounterelse % {number}{true}{false} +\let \doifelsedefinednumber \doifelsedefinedcounter % {number}{true}{false} +\let \doifdefinednumberelse \doifelsedefinedcounter % {number}{true}{false} \let \setupnumbering \setupcounter @@ -487,7 +481,6 @@ % currentstructurecomponent => \strc_current_ or just \m_strc_ - \unexpanded\def\strc_counters_register_component#1#2#3#4#5#6#7[#8][#9]% maybe also nolist {\begingroup % @@ -525,27 +518,36 @@ \glet\m_strc_counters_last_registered_attribute \attributeunsetvalue \glet\m_strc_counters_last_registered_synchronize\relax} +\def\strc_counters_register_component_check_prefix + {\ifx\currentstructurecomponentreferenceprefix\empty + \let\currentstructurecomponentreferenceprefix\currentstructurereferenceprefix + \fi + \ifx\currentstructurecomponentreferenceprefix\empty + \let\currentstructurecomponentreferenceprefix\referenceprefix + \fi + \ifdefined\currentstructurecomponentreferenceprefix\else + \let\currentstructurecomponentreferenceprefix\empty + \fi} + \def\strc_counters_register_component_page#1% {\xdef\currentstructurecomponentreference {#1\c!reference}% \xdef\currentstructurecomponentreferenceprefix{#1\c!referenceprefix}% - % maybe have a helper in strc-ref.mkvi + \strc_counters_register_component_check_prefix \setnextinternalreference - \ctxcommand{setreferenceattribute(% can be helper with less passed - "\s!page", - "\currentstructurecomponentreferenceprefix", - "\currentstructurecomponentreference", - { - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - metadata = { - kind = "page", - }, - }, - "\interactionparameter\c!focus") - }% + \clf_setreferenceattribute + {% + references {% + internal \nextinternalreference + % block {\currentsectionblock}% move to lua + view {\interactionparameter\c!focus}% + prefix {\currentstructurecomponentreferenceprefix}% + reference {\currentstructurecomponentreference}% + }% + metadata {% + kind {\s!page}% + }% + }% + \relax \xdef\m_strc_counters_last_registered_attribute {\the\lastdestinationattribute}% \glet\m_strc_counters_last_registered_index \relax \glet\m_strc_counters_last_registered_synchronize\relax} @@ -559,6 +561,7 @@ \xdef\currentstructurecomponentlabel {#2\c!label}% \xdef\currentstructurecomponentreference {#2\c!reference}% \xdef\currentstructurecomponentreferenceprefix{#2\c!referenceprefix}% + \strc_counters_register_component_check_prefix \ifx\currentstructurecomponentexpansion\s!xml \xmlstartraw \xdef\currentstructurecomponenttitle {#2\c!title}% @@ -595,70 +598,71 @@ \fi % \setnextinternalreference - \xdef\m_strc_counters_last_registered_index{\ctxcommand{addtolist{ - metadata = { - kind = "#1", - name = "\currentname", - level = structures.sections.currentlevel(), - catcodes = \the\ifx\currentstructurecomponentcatcodes\empty\catcodetable\else\csname\currentstructurecomponentcatcodes\endcsname\fi, - coding = "\currentstructurecomponentcoding", + \scratchcounter\clf_addtolist %{ + metadata { + kind {#1} + name {\currentname} + % level structures.sections.currentlevel() + catcodes \ifx\currentstructurecomponentcatcodes\empty\catcodetable\else\csname\currentstructurecomponentcatcodes\endcsname\fi + coding {\currentstructurecomponentcoding} \ifx\currentstructurecomponentcoding\s!xml - xmlroot = "\xmldocument", + xmlroot {\xmldocument} \fi \ifx\currentstructurecomponentxmlsetup\empty \else - xmlsetup = "\currentstructurexmlsetup", + xmlsetup {\currentstructurexmlsetup} \fi - }, - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - reference = "\currentstructurecomponentreference", - referenceprefix = "\currentstructurecomponentreferenceprefix", - section = structures.sections.currentid(), - }, - titledata = { - label = \!!bs\detokenize\expandafter{\currentstructurecomponentlabel }\!!es, - title = \!!bs\detokenize\expandafter{\currentstructurecomponenttitle }\!!es, + } + references { + internal \nextinternalreference + % block {\currentsectionblock} + reference {\currentstructurecomponentreference} + prefix {\currentstructurecomponentreferenceprefix} + % section structures.sections.currentid() + } + titledata { + label {\detokenize\expandafter{\currentstructurecomponentlabel}} + title {\detokenize\expandafter{\currentstructurecomponenttitle}} \ifx\currentstructurecomponentbookmark\currentstructurecomponenttitle \else - bookmark = \!!bs\detokenize\expandafter{\currentstructurecomponentbookmark}\!!es, + bookmark {\detokenize\expandafter{\currentstructurecomponentbookmark}} \fi \ifx\currentstructurecomponentmarking\currentstructurecomponenttitle \else - marking = \!!bs\detokenize\expandafter{\currentstructurecomponentmarking }\!!es, + marking {\detokenize\expandafter{\currentstructurecomponentmarking}} \fi \ifx\currentstructurecomponentlist\currentstructurecomponenttitle \else - list = \!!bs\detokenize\expandafter{\currentstructurecomponentlist}\!!es, + list {\detokenize\expandafter{\currentstructurecomponentlist}} \fi - }, - \ifx\p_hasnumber\v!yes - prefixdata = { - prefix = "#2\c!prefix", - separatorset = "#2\c!prefixseparatorset", - conversion = \!!bs#2\c!prefixconversion\!!es, - conversionset = "#2\c!prefixconversionset", - set = "#2\c!prefixset", - % segments = "#2\c!prefixsegments", - segments = "\p_prefixsegments", - connector = \!!bs#2\c!prefixconnector\!!es, - }, - numberdata = { % more helpers here, like compact elsewhere - numbers = structures.counters.compact("\currentcounter",nil,true), - group = "#2\c!group", - groupsuffix = \!!bs#2\c!groupsuffix\!!es, - counter = "\currentcounter", - separatorset = "#2\c!numberseparatorset", - conversion = \!!bs#2\c!numberconversion\!!es, - conversionset = "#2\c!numberconversionset", - starter = \!!bs#2\c!numberstarter\!!es, - stopper = \!!bs#2\c!numberstopper\!!es, - segments = "#2\c!numbersegments", - }, - \fi - userdata = \!!bs\detokenize{#4}\!!es % will be converted to table at the lua end - } - }}% - \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}% + } + \ifx\p_hasnumber\v!yes + prefixdata { + prefix {#2\c!prefix} + separatorset {#2\c!prefixseparatorset} + conversion {#2\c!prefixconversion} + conversionset {#2\c!prefixconversionset} + set {#2\c!prefixset} + % segments {#2\c!prefixsegments} + segments {\p_prefixsegments} + connector {#2\c!prefixconnector} + } + numberdata { % more helpers here, like compact elsewhere + numbers {\currentcounter} + group {#2\c!group} + groupsuffix {#2\c!groupsuffix} + counter {\currentcounter} + separatorset {#2\c!numberseparatorset} + conversion {#2\c!numberconversion} + conversionset {#2\c!numberconversionset} + starter {#2\c!numberstarter} + stopper {#2\c!numberstopper} + segments {#2\c!numbersegments} + } + \fi + userdata {\detokenize{#4}} + %} + \relax + \xdef\m_strc_counters_last_registered_index{\the\scratchcounter}% + \clf_setinternalreference internal \nextinternalreference\relax \xdef\m_strc_counters_last_registered_attribute {\the\lastdestinationattribute}% - \xdef\m_strc_counters_last_registered_synchronize{\ctxlatecommand{enhancelist(\m_strc_counters_last_registered_index)}}} + \xdef\m_strc_counters_last_registered_synchronize{\strc_lists_inject_enhance{\m_strc_counters_last_registered_index}{\nextinternalreference}}} \let\m_strc_counters_last_registered_index \relax \let\m_strc_counters_last_registered_attribute \relax diff --git a/Master/texmf-dist/tex/context/base/strc-pag.lua b/Master/texmf-dist/tex/context/base/strc-pag.lua index c294a464539..96d26e6f666 100644 --- a/Master/texmf-dist/tex/context/base/strc-pag.lua +++ b/Master/texmf-dist/tex/context/base/strc-pag.lua @@ -25,6 +25,7 @@ local counterdata = counters.data local variables = interfaces.variables local context = context local commands = commands +local implement = interfaces.implement local processors = typesetters.processors local applyprocessor = processors.apply @@ -61,10 +62,12 @@ function pages.save(prefixdata,numberdata,extradata) if trace_pages then report_pages("saving page %s.%s",realpage,userpage) end + local viewerprefix = extradata.viewerprefix + local state = extradata.state local data = { number = userpage, - viewerprefix = extradata.viewerprefix, - state = extradata.state, + viewerprefix = viewerprefix ~= "" and viewerprefix or nil, + state = state ~= "" and state or nil, -- maybe let "start" be default block = sections.currentblock(), prefixdata = prefixdata and helpers.simplify(prefixdata), numberdata = numberdata and helpers.simplify(numberdata), @@ -269,6 +272,24 @@ function pages.is_odd(n) end end +function pages.on_right(n) + local pagemode = texgetcount("pageduplexmode") + if pagemode == 2 or pagemode == 1 then + n = n or texgetcount("realpageno") + if texgetcount("pagenoshift") % 2 == 0 then + return n % 2 == 0 + else + return n % 2 ~= 0 + end + else + return true + end +end + +function pages.in_body(n) + return texgetcount("pagebodymode") > 0 +end + -- move to strc-pag.lua function counters.analyze(name,counterspecification) @@ -323,5 +344,58 @@ end -- -commands.savepagedata = pages.save -commands.prefixedconverted = sections.prefixedconverted -- weird place +implement { + name = "savepagedata", + actions = pages.save, + arguments = { + { + { "prefix" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "set" }, + { "segments" }, + { "connector" }, + }, + { + { "conversionset" }, + { "conversion" }, + { "starter" }, + { "stopper" }, + }, + { + { "viewerprefix" }, + { "state" }, + } + } +} + +implement { -- weird place + name = "prefixedconverted", + actions = sections.prefixedconverted, + arguments = { + "string", + { + { "prefix" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "starter" }, + { "stopper" }, + { "set" }, + { "segments" }, + { "connector" }, + }, + { + { "order" }, + { "separatorset" }, + { "conversionset" }, + { "conversion" }, + { "starter" }, + { "stopper" }, + { "segments" }, + { "type" }, + { "criterium" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/strc-pag.mkiv b/Master/texmf-dist/tex/context/base/strc-pag.mkiv index 6eddc0fba71..72f0cf32aa8 100644 --- a/Master/texmf-dist/tex/context/base/strc-pag.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-pag.mkiv @@ -26,12 +26,14 @@ \countdef\subpageno \plustwo \subpageno \zerocount % ! \countdef\arrangeno \plusthree \arrangeno \zerocount % ! \countdef\pagenoshift\plusfour \pagenoshift\zerocount % ! +\countdef\lastpageno \plusfive \lastpageno \zerocount % ! \let\pageno\userpageno \def\realfolio{\the\realpageno} \def\userfolio{\the\userpageno} \def\subfolio {\the\subpageno } +\def\lastfolio{\the\lastpageno} \newtoks\everyinitializepagecounters @@ -103,6 +105,7 @@ \strc_counters_set\s!realpage\realpageno \strc_counters_set\s!userpage\userpageno \strc_counters_set\s!subpage \subpageno + \lastpageno\lastcountervalue[\s!realpage]\relax \to \everyinitializepagecounters \let\setuppagenumber\setupuserpagenumber @@ -111,24 +114,25 @@ % invisible = \def\strc_pagenumbers_page_state_save % \normalexpanded? - {\ctxcommand{savepagedata({ - prefix = "\namedcounterparameter\s!userpage\c!prefix", - separatorset = "\namedcounterparameter\s!userpage\c!prefixseparatorset", - conversion = "\namedcounterparameter\s!userpage\c!prefixconversion", - conversionset = "\namedcounterparameter\s!userpage\c!prefixconversionset", - set = "\namedcounterparameter\s!userpage\c!prefixset", - segments = "\namedcounterparameter\s!userpage\c!prefixsegments", - connector = \!!bs\namedcounterparameter\s!userpage\c!prefixconnector\!!es, - },{ - conversion = "\namedcounterparameter\s!userpage\c!numberconversion", - conversionset = "\namedcounterparameter\s!userpage\c!numberconversionset", - starter = \!!bs\namedcounterparameter\s!userpage\c!numberstarter\!!es, - stopper = \!!bs\namedcounterparameter\s!userpage\c!numberstopper\!!es, - },{ - viewerprefix = \!!bs\namedcounterparameter\s!userpage\c!viewerprefix\!!es, - state = \!!bs\namedcounterparameter\s!userpage\c!state\!!es, - } - )}} + {\clf_savepagedata + { + prefix {\namedcounterparameter\s!userpage\c!prefix} + separatorset {\namedcounterparameter\s!userpage\c!prefixseparatorset} + conversion {\namedcounterparameter\s!userpage\c!prefixconversion} + conversionset {\namedcounterparameter\s!userpage\c!prefixconversionset} + set {\namedcounterparameter\s!userpage\c!prefixset} + segments {\namedcounterparameter\s!userpage\c!prefixsegments} + connector {\namedcounterparameter\s!userpage\c!prefixconnector} + }{ + conversion {\namedcounterparameter\s!userpage\c!numberconversion} + conversionset {\namedcounterparameter\s!userpage\c!numberconversionset} + starter {\namedcounterparameter\s!userpage\c!numberstarter} + stopper {\namedcounterparameter\s!userpage\c!numberstopper} + }{ + viewerprefix {\namedcounterparameter\s!userpage\c!viewerprefix} + state {\namedcounterparameter\s!userpage\c!state} + }% + \relax} \prependtoks \strc_pagenumbers_page_state_save @@ -303,6 +307,12 @@ \trackingmarginnotesfalse \fi \fi + \pageduplexmode + \ifsinglesided + \ifdoublesided\plustwo\else\zerocount\fi + \else + \ifdoublesided\plusone\else\zerocount\fi + \fi \page_backgrounds_recalculate \strc_pagenumbers_set_location \to \everysetuppagenumbering diff --git a/Master/texmf-dist/tex/context/base/strc-ref.lua b/Master/texmf-dist/tex/context/base/strc-ref.lua index 3f2c0608d2a..b6f2e9a3778 100644 --- a/Master/texmf-dist/tex/context/base/strc-ref.lua +++ b/Master/texmf-dist/tex/context/base/strc-ref.lua @@ -53,6 +53,7 @@ local v_auto = variables.auto local context = context local commands = commands +local implement = interfaces.implement local texgetcount = tex.getcount local texsetcount = tex.setcount @@ -76,6 +77,8 @@ local references = structures.references local lists = structures.lists local counters = structures.counters +local jobpositions = job.positions + -- some might become local references.defined = references.defined or allocate() @@ -83,6 +86,7 @@ references.defined = references.defined or allocate() local defined = references.defined local derived = allocate() local specials = allocate() +local functions = allocate() local runners = allocate() local internals = allocate() local filters = allocate() @@ -98,6 +102,7 @@ local usedviews = allocate() references.derived = derived references.specials = specials +references.functions = functions references.runners = runners references.internals = internals references.filters = filters @@ -123,7 +128,7 @@ local context_delayed = context.delayed local ctx_pushcatcodes = context.pushcatcodes local ctx_popcatcodes = context.popcatcodes -local ctx_dofinishsomereference = context.dofinishsomereference +local ctx_dofinishreference = context.dofinishreference local ctx_dofromurldescription = context.dofromurldescription local ctx_dofromurlliteral = context.dofromurlliteral local ctx_dofromfiledescription = context.dofromfiledescription @@ -339,8 +344,8 @@ local function setcomponent(data) local references = data and data.references if references then references.component = component - if references.referenceprefix == component then - references.referenceprefix = nil + if references.prefix == component then + references.prefix = nil end end return component @@ -353,15 +358,32 @@ references.setnextinternal = setnextinternal references.currentorder = currentorder references.setcomponent = setcomponent -commands.setnextreferenceorder = setnextorder -commands.setnextinternalreference = setnextinternal +implement { + name = "setnextreferenceorder", + actions = setnextorder, + arguments = { "string", "string" } +} -function commands.currentreferenceorder(kind,name) - context(currentorder(kind,name)) -end +implement { + name = "setnextinternalreference", + actions = setnextinternal, + arguments = { "string", "string" } +} + +implement { + name = "currentreferenceorder", + actions = { currentorder, context }, + arguments = { "string", "string" } +} -function references.set(kind,prefix,tag,data) --- setcomponent(data) +function references.set(data) + local references = data.references + local prefix = references.prefix or "" + local reference = references.reference + if not reference or reference == "" then + report_references("invalid reference") + return 0 + end local pd = tobesaved[prefix] -- nicer is a metatable if not pd then pd = { } @@ -380,21 +402,44 @@ function references.set(kind,prefix,tag,data) else n = n + 1 pd[ref] = data - ctx_dofinishsomereference(kind,prefix,ref) + local r = data.references + ctx_dofinishreference(prefix or "",ref or "",r and r.internal or 0) end end - process_settings(tag,action) + process_settings(reference,action) return n > 0 end +-- function references.enhance(prefix,tag) +-- local l = tobesaved[prefix][tag] +-- if l then +-- l.references.realpage = texgetcount("realpageno") +-- end +-- end + +local getpos = function() getpos = backends.codeinjections.getpos return getpos () end + +local function synchronizepage(reference) -- non public helper + reference.realpage = texgetcount("realpageno") + if jobpositions.used then + reference.x, reference.y = getpos() + end +end + +references.synchronizepage = synchronizepage + function references.enhance(prefix,tag) local l = tobesaved[prefix][tag] if l then - l.references.realpage = texgetcount("realpageno") + synchronizepage(l.references) end end -commands.enhancereference = references.enhance +implement { + name = "enhancereference", + actions = references.enhance, + arguments = { "string", "string" } +} -- -- -- related to strc-ini.lua -- -- -- @@ -402,15 +447,34 @@ commands.enhancereference = references.enhance local function register_from_lists(collected,derived,pages,sections) local derived_g = derived[""] -- global + local derived_p = nil + local derived_c = nil + local prefix = nil + local component = nil + local entry = nil if not derived_g then derived_g = { } derived[""] = derived_g end + local function action(s) + if trace_referencing then + report_references("list entry %a provides %a reference %a on realpage %a",i,kind,s,realpage) + end + if derived_p and not derived_p[s] then + derived_p[s] = entry + end + if derived_c and not derived_c[s] then + derived_c[s] = entry + end + if not derived_g[s] then + derived_g[s] = entry -- first wins + end + end for i=1,#collected do - local entry = collected[i] + entry = collected[i] local metadata = entry.metadata if metadata then - local kind = metadata.kind + local kind = metadata.kind -- why this check if kind then local references = entry.references if references then @@ -418,10 +482,8 @@ local function register_from_lists(collected,derived,pages,sections) if reference and reference ~= "" then local realpage = references.realpage if realpage then - local prefix = references.referenceprefix - local component = references.component - local derived_p = nil - local derived_c = nil + prefix = references.prefix + component = references.component if prefix and prefix ~= "" then derived_p = derived[prefix] if not derived_p then @@ -436,20 +498,6 @@ local function register_from_lists(collected,derived,pages,sections) derived[component] = derived_c end end - local function action(s) - if trace_referencing then - report_references("list entry %a provides %a reference %a on realpage %a",i,kind,s,realpage) - end - if derived_p and not derived_p[s] then - derived_p[s] = entry - end - if derived_c and not derived_c[s] then - derived_c[s] = entry - end - if not derived_g[s] then - derived_g[s] = entry -- first wins - end - end process_settings(reference,action) end end @@ -462,6 +510,78 @@ end references.registerinitializer(function() register_from_lists(lists.collected,derived) end) +-- tracing + +local function collectbypage(tracedpages) + -- lists + do + local collected = structures.lists.collected + local data = nil + local function action(reference) + local prefix = data.prefix + local component = data.component + local realpage = data.realpage + if realpage then + local pagelist = rawget(tracedpages,realpage) + local internal = data.internal or 0 + local prefix = (prefix ~= "" and prefix) or (component ~= "" and component) or "" + local pagedata = { prefix, reference, internal } + if pagelist then + pagelist[#pagelist+1] = pagedata + else + tracedpages[realpage] = { pagedata } + end + if internal > 0 then + data.usedprefix = prefix + end + end + end + for i=1,#collected do + local entry = collected[i] + local metadata = entry.metadata + if metadata and metadata.kind then + data = entry.references + if data then + local reference = data.reference + if reference and reference ~= "" then + process_settings(reference,action) + end + end + end + end + end + -- references + do + for prefix, list in next, collected do + for reference, entry in next, list do + local data = entry.references + if data then + local realpage = data.realpage + local internal = data.internal or 0 + local pagelist = rawget(tracedpages,realpage) + local pagedata = { prefix, reference, internal } + if pagelist then + pagelist[#pagelist+1] = pagedata + else + tracedpages[realpage] = { pagedata } + end + if internal > 0 then + data.usedprefix = prefix + end + end + end + end + end +end + +references.tracedpages = table.setmetatableindex(allocate(),function(t,k) + if collectbypage then + collectbypage(t) + collectbypage = nil + end + return rawget(t,k) +end) + -- urls local urls = references.urls or { } @@ -487,7 +607,11 @@ function urls.get(name) end end -function commands.geturl(name) +function urls.found(name) + return urldata[name] +end + +local function geturl(name) local url = urls.get(name) if url and url ~= "" then ctx_pushcatcodes(txtcatcodes) @@ -496,18 +620,23 @@ function commands.geturl(name) end end --- function commands.gethyphenatedurl(name,...) --- local url = urls.get(name) --- if url and url ~= "" then --- hyphenatedurl(url,...) --- end --- end +implement { + name = "doifelseurldefined", + actions = { urls.found, commands.doifelse }, + arguments = "string" +} -function commands.doifurldefinedelse(name) - commands.doifelse(urldata[name]) -end +implement { + name = "useurl", + actions = urls.define, + arguments = { "string", "string", "string", "string" } +} -commands.useurl= urls.define +implement { + name = "geturl", + actions = geturl, + arguments = "string", +} -- files @@ -529,11 +658,36 @@ function files.get(name,method,space) -- method: none, before, after, both, spac end end -function commands.doiffiledefinedelse(name) - commands.doifelse(filedata[name]) +function files.found(name) + return filedata[name] +end + +local function getfile(name) + local fil = files.get(name) + if fil and fil ~= "" then + ctx_pushcatcodes(txtcatcodes) + context(fil) + ctx_popcatcodes() + end end -commands.usefile= files.define +implement { + name = "doifelsefiledefined", + actions = { files.found, commands.doifelse }, + arguments = "string" +} + +implement { + name = "usefile", + actions = files.define, + arguments = { "string", "string", "string" } +} + +implement { + name = "getfile", + actions = getfile, + arguments = "string" +} -- helpers @@ -613,20 +767,30 @@ function references.checkedprogram(whatever) -- return whatever if not resolved end end -commands.defineprogram = programs.define +implement { + name = "defineprogram", + actions = programs.define, + arguments = { "string", "string", "string" } +} -function commands.getprogram(name) - local f = programdata[name] - if f then - context(f[1]) +local function getprogram(name) + local p = programdata[name] + if p then + context(p[1]) end end +implement { + name = "getprogram", + actions = getprogram, + arguments = "string" +} + -- shared by urls and files -function references.whatfrom(name) - context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown) -end +-- function references.whatfrom(name) +-- context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown) +-- end function references.from(name) local u = urldata[name] @@ -653,7 +817,7 @@ function references.from(name) end end -function commands.from(name) +local function from(name) local u = urldata[name] if u then local url, file, description = u[1], u[2], u[3] @@ -678,6 +842,12 @@ function commands.from(name) end end +implement { + name = "from", + actions = from, + arguments = "string" +} + function references.define(prefix,reference,list) local d = defined[prefix] if not d then d = { } defined[prefix] = d end d[reference] = list @@ -690,86 +860,17 @@ function references.reset(prefix,reference) end end -commands.definereference = references.define -commands.resetreference = references.reset - --- \primaryreferencefoundaction --- \secondaryreferencefoundaction --- \referenceunknownaction - --- t.special t.operation t.arguments t.outer t.inner - --- to what extend do we check the non prefixed variant +implement { + name = "definereference", + actions = references.define, + arguments = { "string", "string", "string" } +} --- local strict = false --- --- local function resolve(prefix,reference,args,set) -- we start with prefix,reference --- if reference and reference ~= "" then --- if not set then --- set = { prefix = prefix, reference = reference } --- else --- if not set.reference then set.reference = reference end --- if not set.prefix then set.prefix = prefix end --- end --- local r = settings_to_array(reference) --- for i=1,#r do --- local ri = r[i] --- local d --- if strict then --- d = defined[prefix] or defined[""] --- d = d and d[ri] --- else --- d = defined[prefix] --- d = d and d[ri] --- if not d then --- d = defined[""] --- d = d and d[ri] --- end --- end --- if d then --- resolve(prefix,d,nil,set) --- else --- local var = splitreference(ri) --- if var then --- var.reference = ri --- local vo, vi = var.outer, var.inner --- if not vo and vi then --- -- to be checked --- if strict then --- d = defined[prefix] or defined[""] --- d = d and d[vi] --- else --- d = defined[prefix] --- d = d and d[vi] --- if not d then --- d = defined[""] --- d = d and d[vi] --- end --- end --- -- --- if d then --- resolve(prefix,d,var.arguments,set) -- args can be nil --- else --- if args then var.arguments = args end --- set[#set+1] = var --- end --- else --- if args then var.arguments = args end --- set[#set+1] = var --- end --- if var.has_tex then --- set.has_tex = true --- end --- else --- -- report_references("funny pattern %a",ri) --- end --- end --- end --- return set --- else --- return { } --- end --- end +implement { + name = "resetreference", + actions = references.reset, + arguments = { "string", "string" } +} setmetatableindex(defined,"table") @@ -824,11 +925,11 @@ end references.currentset = nil -function commands.setreferenceoperation(k,v) +local function setreferenceoperation(k,v) references.currentset[k].operation = v end -function commands.setreferencearguments(k,v) +local function setreferencearguments(k,v) references.currentset[k].arguments = v end @@ -849,7 +950,22 @@ function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex end end -commands.expandcurrentreference = references.expandcurrent -- for the moment the same +implement { + name = "expandcurrentreference", + actions = references.expandcurrent +} + +implement { + name = "setreferenceoperation", + actions = setreferenceoperation, + arguments = { "integer", "string" } +} + +implement { + name = "setreferencearguments", + actions = setreferencearguments, + arguments = { "integer", "string" } +} local externals = { } @@ -893,7 +1009,7 @@ local function loadexternalreferences(name,utilitydata) local realpage = references.realpage if kind and realpage then references.pagedata = pages[realpage] - local prefix = references.referenceprefix or "" + local prefix = references.prefix or "" local target = external[prefix] if not target then target = { } @@ -995,7 +1111,7 @@ local function loadproductreferences(productname,componentname,utilitydata) local realpage = references.realpage if kind and realpage then references.pagedata = pages[realpage] - local prefix = references.referenceprefix or "" + local prefix = references.prefix or "" local component = references.component local ctarget, ptarget if not component or component == componentname then @@ -1141,7 +1257,7 @@ local useproduct = commands.useproduct if useproduct then - function commands.useproduct(product) + local function newuseproduct(product) useproduct(product) if texconditionals.autocrossfilereferences then local component = justacomponent() @@ -1154,6 +1270,13 @@ if useproduct then end end + implement { + name = "useproduct", + actions = newuseproduct, + arguments = "string", + overload = true, + } + end -- productdata.firstsection.numberdata.numbers @@ -1648,7 +1771,11 @@ local function identify(prefix,reference) set.n = nofidentified for i=1,#set do local var = set[i] - if var.special then + local spe = var.special + local fnc = functions[spe] + if fnc then + var = fnc(var) or { error = "invalid special function" } + elseif spe then var = identify_special(set,var,i) elseif var.outer then var = identify_outer(set,var,i) @@ -1675,7 +1802,7 @@ references.identify = identify local unknowns, nofunknowns, f_valid = { }, 0, formatters["[%s][%s]"] -function references.valid(prefix,reference,highlight,newwindow,layer) +function references.valid(prefix,reference,specification) local set, bug = identify(prefix,reference) local unknown = bug or #set == 0 if unknown then @@ -1690,16 +1817,28 @@ function references.valid(prefix,reference,highlight,newwindow,layer) unknowns[str] = u + 1 end else - set.highlight, set.newwindow, set.layer = highlight, newwindow, layer + set.highlight = specification.highlight + set.newwindow = specification.newwindow + set.layer = specification.layer currentreference = set[1] end -- we can do the expansion here which saves a call return not unknown end -function commands.doifelsereference(prefix,reference,highlight,newwindow,layer) - commands.doifelse(references.valid(prefix,reference,highlight,newwindow,layer)) -end +implement { + name = "doifelsereference", + actions = { references.valid, commands.doifelse }, + arguments = { + "string", + "string", + { + { "highlight", "boolean" }, + { "newwindow", "boolean" }, + { "layer" }, + } + } +} function references.reportproblems() -- might become local if nofunknowns > 0 then @@ -1742,6 +1881,13 @@ function references.setinnermethod(m) end end +implement { + name = "setinnerreferencemethod", + actions = references.setinnermethod, + arguments = "string", + onlyonce = true +} + function references.getinnermethod() return innermethod or defaultinnermethod end @@ -1754,24 +1900,27 @@ end) local destinationattributes = { } -local function setinternalreference(prefix,tag,internal,view) -- needs checking +local function setinternalreference(specification) + local internal = specification.internal local destination = unsetvalue if innermethod == v_auto then - local t, tn = { }, 0 -- maybe add to current - if tag then + local t, tn = { }, 0 -- maybe add to current (now only used for tracing) + local reference = specification.reference + if reference then + local prefix = specification.prefix if prefix and prefix ~= "" then prefix = prefix .. ":" -- watch out, : here local function action(ref) tn = tn + 1 t[tn] = prefix .. ref end - process_settings(tag,action) + process_settings(reference,action) else local function action(ref) tn = tn + 1 t[tn] = ref end - process_settings(tag,action) + process_settings(reference,action) end end -- ugly .. later we decide to ignore it when we have a real one @@ -1780,7 +1929,7 @@ local function setinternalreference(prefix,tag,internal,view) -- needs checking tn = tn + 1 t[tn] = internal -- when number it's internal end - destination = references.mark(t,nil,nil,view) -- returns an attribute + destination = references.mark(t,nil,nil,specification.view) -- returns an attribute end if internal then -- new destinationattributes[internal] = destination @@ -1795,16 +1944,103 @@ end references.setinternalreference = setinternalreference references.getinternalreference = getinternalreference -commands.setinternalreference = setinternalreference -commands.getinternalreference = getinternalreference -function references.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here - local attr = references.set(kind,prefix,tag,data) and setinternalreference(prefix,tag,nil,view) or unsetvalue +implement { + name = "setinternalreference", + actions = setinternalreference, + arguments = { + { + { "prefix" }, + { "reference" }, + { "internal", "integer" }, + { "view" } + } + } +} + +-- implement { +-- name = "getinternalreference", +-- actions = { getinternalreference, context }, +-- arguments = "integer", +-- } + +function references.setandgetattribute(data) -- maybe do internal automatically here + local attr = unsetvalue + local mdat = data.metadata + local rdat = data.references + if mdat and rdat then + if not rdat.section then + rdat.section = structures.sections.currentid() + end + local ndat = data.numberdata + if ndat then + local numbers = ndat.numbers + if type(numbers) == "string" then + ndat.numbers = counters.compact(numbers,nil,true) + end + data.numberdata = helpers.simplify(ndat) + end + local pdat = data.prefixdata + if pdat then + data.prefixdata = helpers.simplify(pdat) + end + local udat = data.userdata + if type(udat) == "string" then + data.userdata = helpers.touserdata(udat) + end + if not rdat.block then + rdat.block = structures.sections.currentblock() + end + local done = references.set(data) -- we had kind i.e .item -> full + if done then + attr = setinternalreference { + prefix = prefix, + reference = tag, + internal = rdat.internal, + view = rdat.view + } or unsetvalue + end + end texsetcount("lastdestinationattribute",attr) return attr end -commands.setreferenceattribute = references.setandgetattribute +implement { + name = "setreferenceattribute", + actions = references.setandgetattribute, + arguments = { + { + { + "references", { + { "internal", "integer" }, + { "block" }, + { "view" }, + { "prefix" }, + { "reference" }, + }, + }, + { + "metadata", { + { "kind" }, + { "xmlroot" }, + { "catcodes", "integer" }, + }, + }, + { + "prefixdata", { "*" } + }, + { + "numberdata", { "*" } + }, + { + "entries", { "*" } + }, + { + "userdata" + } + } + } +} function references.getinternallistreference(n) -- n points into list (todo: registers) local l = lists.collected[n] @@ -1812,11 +2048,11 @@ function references.getinternallistreference(n) -- n points into list (todo: reg return i and destinationattributes[i] or 0 end -function commands.getinternallistreference(n) -- this will also be a texcount - local l = lists.collected[n] - local i = l and l.references.internal - context(i and destinationattributes[i] or 0) -end +implement { + name = "getinternallistreference", + actions = { references.getinternallistreference, context }, + arguments = "integer" +} -- @@ -1825,12 +2061,11 @@ function references.getcurrentmetadata(tag) return data and data.metadata and data.metadata[tag] end -function commands.getcurrentreferencemetadata(tag) - local data = references.getcurrentmetadata(tag) - if data then - context(data) - end -end +implement { + name = "getcurrentreferencemetadata", + actions = { references.getcurrentmetadata, context }, + arguments = "string", +} local function currentmetadata(tag) local data = currentreference and currentreference.i @@ -1840,15 +2075,29 @@ end references.currentmetadata = currentmetadata local function getcurrentprefixspec(default) - -- todo: message - return currentmetadata("kind") or "?", currentmetadata("name") or "?", default or "?" + local data = currentreference and currentreference.i + local metadata = data and data.metadata + return + metatadata and metadata.kind or "?", + metatadata and metadata.name or "?", + default or "?" end references.getcurrentprefixspec = getcurrentprefixspec -function commands.getcurrentprefixspec(default) - ctx_getreferencestructureprefix(getcurrentprefixspec(default)) -end +-- implement { +-- name = "getcurrentprefixspec", +-- actions = { getcurrentprefixspec, context }, -- returns 3 arguments +-- arguments = "string", +-- } + +implement { + name = "getcurrentprefixspec", + actions = function(tag) + context("{%s}{%s}{%s}",getcurrentprefixspec(tag)) + end, + arguments = "string", +} local genericfilters = { } local userfilters = { } @@ -1862,12 +2111,12 @@ filters.text = textfilters filters.full = fullfilters filters.section = sectionfilters -local function filterreference(name,...) -- number page title ... +local function filterreference(name,prefixspec,numberspec) -- number page title ... local data = currentreference and currentreference.i -- maybe we should take realpage from here if data then if name == "realpage" then local cs = references.analyze() -- normally already analyzed but also sets state - context(tonumber(cs.realpage) or 0) -- todo, return and in command namespace + context(tonumber(cs.realpage) or 0) else -- assumes data is table local kind = type(data) == "table" and data.metadata and data.metadata.kind if kind then @@ -1877,7 +2126,7 @@ local function filterreference(name,...) -- number page title ... if trace_referencing then report_references("name %a, kind %a, using dedicated filter",name,kind) end - filter(data,name,...) + filter(data,name,prefixspec,numberspec) elseif trace_referencing then report_references("name %a, kind %a, using generic filter",name,kind) end @@ -1893,21 +2142,27 @@ local function filterreference(name,...) -- number page title ... end local function filterreferencedefault() - return filterreference("default",getcurrentprefixspec(v_default)) + return filterreference("default",getcurrentprefixspec("default")) end references.filter = filterreference references.filterdefault = filterreferencedefault -commands.filterreference = filterreference -commands.filterdefaultreference = filterreferencedefault +implement { + name = "filterreference", + actions = filterreference, + arguments = "string", +} -function commands.currentreferencedefault(tag) - if not tag then - tag = "default" - end - filterreference(tag,context_delayed(getcurrentprefixspec(tag))) -end +implement { + name = "filterdefaultreference", + actions = filterreference, + arguments = { + "string", -- 'default' + { { "*" } }, -- prefixspec + { { "*" } }, -- numberspec + } +} function genericfilters.title(data) if data then @@ -1927,12 +2182,12 @@ function genericfilters.text(data) end end -function genericfilters.number(data,what,prefixspec) -- todo: spec and then no stopper +function genericfilters.number(data,what,prefixspec,numberspec) if data then numberdata = lists.reordered(data) -- data.numberdata if numberdata then helpers.prefix(data,prefixspec) - sections.typesetnumber(numberdata,"number",numberdata) + sections.typesetnumber(numberdata,"number",numberspec,numberdata) else local useddata = data.useddata if useddata and useddata.number then @@ -2056,12 +2311,71 @@ local specials = references.testspecials -- pretty slow (progressively). In the pagebody one can best check the reference -- real page to determine if we need contrastlocation as that is more lightweight. -local function checkedpagestate(n,page) - local r = referredpage(n) +local function checkedpagestate(n,page,actions,position,spread) local p = tonumber(page) if not p then return 0 - elseif p > r then + end + if position and #actions > 0 then + local i = actions[1].i -- brrr + if i then + local a = i.references + if a then + local x = a.x + local y = a.y + if x and y then + local jp = jobpositions.collected[position] + if jp then + local px = jp.x + local py = jp.y + local pp = jp.p + if p == pp then + -- same page + if py > y then + return 5 -- above + elseif py < y then + return 4 -- below + elseif px > x then + return 4 -- below + elseif px < x then + return 5 -- above + else + return 1 -- same + end + elseif spread then + if pp % 2 == 0 then + -- left page + if pp > p then + return 2 -- before + elseif pp + 1 == p then +-- return 4 -- below (on right page) + return 5 -- above (on left page) + else + return 3 -- after + end + else + -- right page + if pp < p then + return 3 -- after + elseif pp - 1 == p then +-- return 5 -- above (on left page) + return 4 -- below (on right page) + else + return 2 -- before + end + end + elseif pp > p then + return 2 -- before + else + return 3 -- after + end + end + end + end + end + end + local r = referredpage(n) -- sort of obsolete + if p > r then return 3 -- after elseif p < r then return 2 -- before @@ -2100,11 +2414,13 @@ local function setreferencerealpage(actions) end end +references.setreferencerealpage = setreferencerealpage + -- we store some analysis data alongside the indexed array -- at this moment only the real reference page is analyzed -- normally such an analysis happens in the backend code -function references.analyze(actions) +function references.analyze(actions,position,spread) if not actions then actions = references.currentset end @@ -2119,32 +2435,56 @@ function references.analyze(actions) elseif actions.external then actions.pagestate = 0 else - actions.pagestate = checkedpagestate(actions.n,realpage) + actions.pagestate = checkedpagestate(actions.n,realpage,actions,position,spread) end end return actions end -function commands.referencepagestate(actions) - if not actions then - actions = references.currentset - end +local function referencepagestate(position,detail,spread) + local actions = references.currentset if not actions then - context(0) + return 0 else if not actions.pagestate then - references.analyze(actions) -- delayed unless explicitly asked for --- print("NO STATE",actions.reference,actions.pagestate) + references.analyze(actions,position,spread) -- delayed unless explicitly asked for + end + local pagestate = actions.pagestate + if detail then + return pagestate + elseif pagestate == 4 then + return 2 -- compatible + elseif pagestate == 5 then + return 3 -- compatible + else + return pagestate end - context(actions.pagestate) end end -function commands.referencerealpage(actions) +implement { + name = "referencepagestate", + actions = { referencepagestate, context }, + arguments = "string" +} + +implement { + name = "referencepagedetail", + actions = { referencepagestate, context }, + arguments = { "string", "boolean", "boolean" } +} + +local function referencerealpage(actions) actions = actions or references.currentset - context(not actions and 0 or actions.realpage or setreferencerealpage(actions)) + return not actions and 0 or actions.realpage or setreferencerealpage(actions) end +implement { + name = "referencerealpage", + actions = { referencerealpage, context }, + arguments = "string" +} + local plist, nofrealpages local function realpageofpage(p) -- the last one counts ! @@ -2281,6 +2621,102 @@ function specials.section(var,actions) end end +-- experimental: + +local p_splitter = lpeg.splitat(":") +local p_lower = lpeg.patterns.utf8lower + +-- We can cache lowercased titles which saves a lot of time, but then +-- we can better have a global cache with weak keys. + +-- local lowercache = table.setmetatableindex(function(t,k) +-- local v = lpegmatch(p_lower,k) +-- t[k] = v +-- return v +-- end) + +local lowercache = false + +local function locate(list,askedkind,askedname,pattern) + local kinds = lists.kinds + local names = lists.names + if askedkind and not kinds[askedkind] then + return false + end + if askedname and not names[askedname] then + return false + end + for i=1,#list do + local entry = list[i] + local metadata = entry.metadata + if metadata then + local found = false + if askedname then + local name = metadata.name + if name then + found = name == askedname + end + elseif askedkind then + local kind = metadata.kind + if kind then + found = kind == askedkind + end + end + if found then + local titledata = entry.titledata + if titledata then + local title = titledata.title + if title then + if lowercache then + found = lpegmatch(pattern,lowercache[title]) + else + found = lpegmatch(pattern,lpegmatch(p_lower,title)) + end + if found then + return { + inner = pattern, + kind = "inner", + reference = pattern, + i = entry, + p = "", + r = entry.references.realpage, + } + end + end + end + end + end + end +end + +function functions.match(var,actions) + if not var.outer then + local operation = var.operation + if operation and operation ~= "" then + local operation = lpegmatch(p_lower,operation) + local list = lists.collected + local names = false + local kinds = false + local where, what = lpegmatch(p_splitter,operation) + if where and what then + local pattern = lpeg.finder(what) + return + locate(list,false,where,pattern) + or locate(list,where,false,pattern) + or { error = "no match" } + else + local pattern = lpeg.finder(operation) + -- todo: don't look at section and float in last pass + return + locate(list,"section",false,pattern) + or locate(list,"float",false,pattern) + or locate(list,false,false,pattern) + or { error = "no match" } + end + end + end +end + -- needs a better split ^^^ -- done differently now: @@ -2289,24 +2725,36 @@ function references.export(usedname) end function references.import(usedname) end function references.load (usedname) end -commands.exportreferences = references.export +implement { name = "exportreferences", actions =references.export } -- better done here .... we don't insert/remove, just use a pointer local prefixstack = { "" } local prefixlevel = 1 -function commands.pushreferenceprefix(prefix) +local function pushreferenceprefix(prefix) prefixlevel = prefixlevel + 1 prefixstack[prefixlevel] = prefix - context(prefix) + return prefix end -function commands.popreferenceprefix() +local function popreferenceprefix() prefixlevel = prefixlevel - 1 if prefixlevel > 0 then - context(prefixstack[prefixlevel]) + return prefixstack[prefixlevel] else report_references("unable to pop referenceprefix") + return "" end end + +implement { + name = "pushreferenceprefix", + actions = { pushreferenceprefix, context }, -- we can use setmacro + arguments = "string", +} + +implement { + name = "popreferenceprefix", + actions = { popreferenceprefix, context }, -- we can use setmacro +} diff --git a/Master/texmf-dist/tex/context/base/strc-ref.mkvi b/Master/texmf-dist/tex/context/base/strc-ref.mkvi index 91bcb619311..f5d0d1d7863 100644 --- a/Master/texmf-dist/tex/context/base/strc-ref.mkvi +++ b/Master/texmf-dist/tex/context/base/strc-ref.mkvi @@ -118,6 +118,11 @@ \unexpanded\def\reference {\dosingleargument\strc_references_full_reference} % never forgotten \unexpanded\def\setreference {\dodoubleargument\strc_references_set_reference } % +% maybe: \let\reference\textreference + +\unexpanded\def\showreferences + {\enabletrackers[nodes.references.show,nodes.destinations.show]} + %D These are implemented in a low level form as: \unexpanded\def\strc_references_text_reference [#labels]{\strc_references_set_named_reference\s!text{#labels}{}} @@ -140,13 +145,29 @@ \newcount\lastreferenceattribute \newcount\lastdestinationattribute -\def\dofinishfullreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label")}}} -\def\dofinishtextreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label",{})}}} +\def\strc_references_finish#prefix#reference#internal% + {\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#reference")}}} + +\let\dofinishreference\strc_references_finish % used at lua end + +% This is somewhat tricky: we want to keep the reference with the following word but +% that word should also hyphenate. We need to find a better way. -\let\dofinishpagereference\dofinishfullreference -\let\dofinishuserreference\dofinishfullreference +% 0 = nothing +% 1 = bind to following word + +\setnewconstant\c_strc_references_bind_state\plusone + +\def\strc_references_inject_before + {} + +\def\strc_references_inject_after + {\ifcase\c_strc_references_bind_state + % nothing + \or + \prewordbreak % to be tested: \removeunwantedspaces\permithyphenation + \fi} -\def\dofinishsomereference#kind{\executeifdefined{dofinish#{kind}reference}\gobbletwoarguments} \unexpanded\def\strc_references_set_named_reference {\ifreferencing @@ -195,30 +216,34 @@ % beware, the structures.references.set writes a \setnextinternalreference \strc_references_start_destination_nodes - \ctxcommand{setreferenceattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels", - { - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - metadata = { % we could assume page to have no metadata - kind = "#kind", % \currentreferencekind - \ifx\currentreferencekind\s!page\else - catcodes = \the\catcodetable, - xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument"\else nil\fi, % only useful when text - \fi - }, + \clf_setreferenceattribute + {% + references {% + internal \nextinternalreference + % block {\currentsectionblock}% + view {\interactionparameter\c!focus}% + prefix {\referenceprefix}% + reference {\currentreferencelabels}% + }% + metadata {% + kind {\currentreferencekind}% + \ifx\currentreferencekind\s!page\else + \ifx\currentreferencecoding\s!xml + xmlroot {\xmldocument}% + \fi + catcodes \catcodetable + \fi + }% \ifx\currentreferencedata\empty\else - entries = { - text = \!!bs\currentreferencedata\!!es - }, + entries {% + text {\currentreferencedata}% + }% \fi \ifx\currentreferenceuserdata\empty\else - userdata = structures.helpers.touserdata(\!!bs\detokenize{#userdata}\!!es) + userdata {\detokenize{#userdata}}% \fi - },"\interactionparameter\c!focus") - }% + }% + \relax \strc_references_stop_destination_nodes \fi \else @@ -229,10 +254,11 @@ \xdef\currentdestinationattribute{\number\lastdestinationattribute}% % will become an option: \ifnum\lastdestinationattribute>\zerocount + \strc_references_inject_before % new \dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup \strc_references_flush_destination_nodes \egroup - \prewordbreak % new + \strc_references_inject_after % new \fi} \def\strc_references_set_page_only_destination_attribute#labels% could in fact be fully expandable @@ -243,19 +269,21 @@ \lastdestinationattribute\attributeunsetvalue \else \strc_references_start_destination_nodes -\setnextinternalreference - \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","\currentreferencelabels", - { - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - metadata = { - kind = "page", - }, - },"\interactionparameter\c!focus") - }% + \setnextinternalreference + \clf_setreferenceattribute + {% + references {% + internal \nextinternalreference + % block {\currentsectionblock}% + view {\interactionparameter\c!focus}% + prefix {\referenceprefix}% + reference {\currentreferencelabels}% + }% + metadata {% + kind {page}% + }% + }% + \relax \strc_references_stop_destination_nodes \fi \else @@ -269,28 +297,28 @@ \setnextinternalreference \edef\m_strc_references_user{#user}% \edef\m_strc_references_text{#text}% - \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","#labels", - { - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - section = structures.sections.currentid(), - }, - metadata = { - kind = "\s!full", - }, - \ifx\m_strc_references_text\empty \else - entries = { - text = \!!bs\m_strc_references_text\!!es - }, - \fi - \ifx\m_strc_references_user\empty \else - userdata = { - \m_strc_references_user - } - \fi - },"\interactionparameter\c!focus") - }% + \clf_setreferenceattribute + {% + references {% + internal \nextinternalreference + % block {\currentsectionblock}% + view {\interactionparameter\c!focus}% + prefix {\referenceprefix}% + reference {#labels}% + }% + metadata {% + kind {\s!full}% + }% + \ifx\m_strc_references_text\empty \else + entries {% + text {\m_strc_references_text}% + }% + \fi + \ifx\m_strc_references_user\empty \else + userdata {\m_strc_references_user}% \detokenize\expandafter{\normalexpanded{...}} + \fi + }% + \relax \strc_references_stop_destination_nodes \else \setbox\b_strc_destination_nodes\emptyhbox @@ -300,10 +328,11 @@ \xdef\currentdestinationattribute{\number\lastdestinationattribute}% % will become an option: \ifnum\lastdestinationattribute>\zerocount + \strc_references_inject_before % new \dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup \strc_references_flush_destination_nodes \egroup - \prewordbreak % new + \strc_references_inject_after % new \fi} \unexpanded\def\strc_references_direct_full @@ -345,17 +374,19 @@ \def\strc_references_set_simple_page_reference#label% {\iflocation \strc_references_start_destination_nodes - \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","#label", - { - references = { - % block = "\currentsectionblock", - % section = structures.sections.currentid(), - }, - metadata = { % we could assume page to have no metadata - kind = "\s!page", - }, - },"\interactionparameter\c!focus") - }% + \clf_setreferenceattribute + {% + references {% + % block {\currentsectionblock}% + view {\interactionparameter\c!focus}% + prefix {\referenceprefix}% + reference {#label}% + }% + metadata {% + kind {\s!page}% + }% + }% + \relax \strc_references_stop_destination_nodes \xdef\currentdestinationattribute{\number\lastdestinationattribute}% \else @@ -365,7 +396,15 @@ \def\strc_references_get_simple_page_reference#label% {\iflocation - \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {% + height \ht\strutbox + depth \dp\strutbox + \extrareferencearguments + }% + \relax \xdef\currentreferenceattribute{\number\lastreferenceattribute}% \else \xdef\currentreferenceattribute{\number\attributeunsetvalue}% @@ -505,9 +544,6 @@ \newcount\referencehastexstate % set in backend -\def\referencepagestate{\ctxcommand{referencepagestate()}} -\def\referencerealpage {\ctxcommand{referencerealpage ()}} - % referencepagestate: % % 0 = no page ref, 1=same page, 2=before, 3=after @@ -595,13 +631,13 @@ {\dodoubleempty\strc_references_define_reference} \def\strc_references_define_reference[#name][#specification]% - {\ctxcommand{definereference("\referenceprefix","#name",\!!bs\detokenize{#specification}\!!es)}} + {\clf_definereference{\referenceprefix}{#name}{\detokenize{#specification}}} \unexpanded\def\resetreference[#name]% - {\ctxcommand{resetreference("\referenceprefix","#name")}} + {\clf_resetreference{\referenceprefix}{#name}} \def\setpagereference#name#specification% hm,. low level ? - {\ctxcommand{definereference("","#name",\!!bs\v!page(\luaescapestring{#specification})\!!es)}} + {\clf_definereference{}{#name}{\v!page(\detokenize{#specification}}} % is detokenize needed here? %D Chained references are defined as: %D @@ -631,17 +667,19 @@ \newconditional\gotonewwindow \setfalse\gotonewwindow \def\expandtexincurrentreference % will happen in lua some time - {\ifcase\referencehastexstate\else\ctxcommand{expandcurrentreference()}\fi} + {\ifcase\referencehastexstate\else\clf_expandcurrentreference\fi} -\def\expandreferenceoperation#tag#content{\ctxcommand{setreferenceoperation(#tag,\!!bs#content\!!es)}} -\def\expandreferencearguments#tag#content{\ctxcommand{setreferencearguments(#tag,\!!bs#content\!!es)}} +\def\expandreferenceoperation#tag#content{\clf_setreferenceoperation#tag{#content}} +\def\expandreferencearguments#tag#content{\clf_setreferencearguments#tag{#content}} -\def\doifreferencefoundelse#labels#yes#nop% - {\ctxcommand{doifelsereference("\referenceprefix",\!!bs#labels\!!es,\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}% +\def\doifelsereferencefound#label#yes#nop% + {\clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% {\expandtexincurrentreference #yes}% {#nop}} +\let\doifreferencefoundelse \doifelsereferencefound + %D The tester only splits the reference in components but does %D not look into them. The following macro does a preroll and %D determines for instance the current real reference pagenumber. @@ -747,14 +785,14 @@ {\global\advance\locationcount\plusone} \def\setnextinternalreferences#kind#name% plural - {\ctxcommand{setnextinternalreference("#kind","#name")}} + {\clf_setnextinternalreference{#kind}{#name}} \def\getinternalorderreference#kind#name% - {\ctxcommand{currentreferenceorder("#kind","#name")}} + {\clf_currentreferenceorder{#kind}{#name}} \def\thisissomeinternal#kind#name% only for old time sake {\begingroup - \ctxcommand{setinternalreference("","#kind:#name")}% + \clf_setinternalreference reference {#kind:#name}\relax \hbox attr \destinationattribute\lastdestinationattribute{}% \endgroup} @@ -817,7 +855,7 @@ \appendtoks \edef\p_export{\referencingparameter\c!export}% \ifx\p_export\v!yes - \ctxcommand{exportreferences()}% + \clf_exportreferences \fi \to \everygoodbye @@ -832,16 +870,16 @@ % {\popmacro\referenceprefix} \unexpanded\def\globalpushreferenceprefix#prefix% - {\xdef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}} + {\xdef\referenceprefix{\clf_pushreferenceprefix{#prefix}}} \unexpanded\def\globalpopreferenceprefix - {\xdef\referenceprefix{\ctxcommand{popreferenceprefix()}}} + {\xdef\referenceprefix{\clf_popreferenceprefix}} \unexpanded\def\pushreferenceprefix#prefix% - {\edef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}} + {\edef\referenceprefix{\clf_pushreferenceprefix{#prefix}}} \unexpanded\def\popreferenceprefix - {\edef\referenceprefix{\ctxcommand{popreferenceprefix()}}} + {\edef\referenceprefix{\clf_popreferenceprefix}} \def\m_strc_references_prefix_yes{+} \def\m_strc_references_prefix_nop{-} @@ -931,15 +969,15 @@ \ifdefined\over \let\normalmathover \over \unexpanded\def\over {\mathortext\normalmathover \strc_references_about} \else \let\over \strc_references_about \fi \to \everydump - \def\filterreference #key{\ctxcommand{filterreference("#key")}} % no checking, expanded -\unexpanded\def\getreferenceentry#key{\ctxcommand{filterreference("#key")}} % no checking, unexpanded + \def\filterreference #key{\clf_filterreference{#key}} % no checking, expanded +\unexpanded\def\getreferenceentry#key{\clf_filterreference{#key}} % no checking, unexpanded -\def\currentreferencenumber {\filterreference{number}} -\def\currentreferencepage {\filterreference{page}} -\def\currentreferencetitle {\filterreference{title}} -\def\currentreferencetext {\filterreference{text}} -\def\currentreferencedefault {\filterreference{default}} -\def\currentreferencerealpage{\filterreference{realpage}} +\def\currentreferencenumber {\clf_filterreference{number}} +\def\currentreferencepage {\clf_filterreference{page}} +\def\currentreferencetitle {\clf_filterreference{title}} +\def\currentreferencetext {\clf_filterreference{text}} +\def\currentreferencedefault {\clf_filterreference{default}} +\def\currentreferencerealpage{\clf_filterreference{realpage}} %D The most straightforward way of retrieving references is %D using \type{\ref}. @@ -949,7 +987,7 @@ \def\strc_references_get_reference[#key][#label]% #key = number page title text default realpage ... {\ifsecondargument - \doifreferencefoundelse{#label}{\ctxcommand{filterreference("#key")}}\dummyreference + \doifelsereferencefound{#label}{\clf_filterreference{#key}}\dummyreference \else \dummyreference \fi} @@ -965,7 +1003,7 @@ \let\\\space \postponenotes % might go \referencingparameter\c!left - \doifreferencefoundelse{#label} + \doifelsereferencefound{#label} {\goto{\limitatetext\currentreferencetitle{\referencingparameter\c!width}\unknown}[#label]}% not so efficient (dup lookup) {}% todo \flushnotes % might go @@ -984,44 +1022,151 @@ %D ... \atpage[someref] ... %D \stoptyping -% 0 = unknown -% 1 = same -% 2 = before -% 3 = after +% standard detail +% +% 0 = unknown unknown +% 1 = same on same page +% 2 = before preceding page +% 3 = after following page +% +% 4 = above above on same page +% 5 = below below on same page -\def\strc_references_by_reference_page_state#unknown#before#current#after% - {\ifcase\referencepagestate\space#unknown\or#current\or#before\or#after\fi} +% todo: optimize for use in pagebody +% todo: maybe make it optional -% \unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward -% {\doifreferencefoundelse{#label}% usage needs checking (useless) -% {\goto{\strc_references_by_reference_page_state{#label}{#backward}{}{#foreward}}[#label]} -% {[#label]}} +% \setuppagenumbering[alternative=doublesided] +% \setupreferencing [doublesided=no] % yes is default % -% better: +% \somewhere{backward}{foreward}[label] +% \someplace{preceding}{backward}{current}{foreward}{following}[label] +% \atpage[#label] +% \doifcheckedpagestate{label}{preceding}{backward}{current}{foreward}{following}{otherwise} +% +% \dorecurse {20} { +% \placefigure[here][fig:#1]{}{\externalfigure[dummy]} +% \dorecurse {20} { +% ##1: \atpage[fig:##1] / +% \doifcheckedpagestate +% {fig:##1} +% {preceding}{backward}{current}{foreward}{following} +% {otherwise} +% } +% } + +\newcount \nofreferencestates +\newconditional\pagestatespread -\unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward - {\doifreferencefoundelse{#label}% - {\strc_references_by_reference_page_state{#label}{\goto{#backward}[#label]}{}{\goto{#foreward}[#label]}} - {[#label]}} +\appendtoks + \doifelse{\referencingparameter\c!doublesided}\v!yes\settrue\setfalse\pagestatespread +\to \everysetupreferencing -\unexpanded\def\atpage[#label]% todo - {\doifreferencefoundelse{#label}% kind of inefficient as \goto also analyzes - {\goto - {\strc_references_by_reference_page_state - {\labeltexts\v!page\dummyreference}% - {\labeltext\v!hencefore}% - {\labeltexts\v!atpage\currentreferencepage}% - {\labeltext\v!hereafter}}% - [#label]} - {[#label]}} +\setupreferencing + [\c!doublesided=\v!yes] + +\def\referencepagestate + {\numexpr\clf_referencepagestate + {rst::\number\nofreferencestates}% + \relax} + +\def\referencepagedetail + {\numexpr\clf_referencepagestate + {rst::\number\nofreferencestates}% + true % + \ifconditional\pagestatespread false\ifdoublesided true\else false\fi\fi + \relax} + +\def\referencerealpage + {\clf_referencerealpage} + +\unexpanded\def\tracedpagestate + {{\blue\tttf(\ifcase\referencepagedetail unknown\or same\or previous\or next\or above\or below\else unknown\fi)}} + +\unexpanded\def\markreferencepage + {\dontleavehmode\begingroup + \iftrialtypesetting + % issue warning that not stable + \else + % needs checking ... but probably never in trialmode + \global\advance\nofreferencestates\plusone + \xypos{rst::\number\nofreferencestates}% + % \tracedpagestate + \fi + \endgroup} + +\unexpanded\def\doifcheckedpagestate#label% #preceding#backward#current#foreward#following#otherwise% + {\doifelsereferencefound{#label}\strc_references_handle_page_state_yes\strc_references_handle_page_state_nop} + +\let\strc_references_handle_page_state_nop\sixthofsixarguments + +\def\strc_references_handle_page_state_yes + {\markreferencepage + \ifcase\referencepagedetail + \expandafter\sixthofsixarguments \or + \expandafter\thirdofsixarguments \or + \expandafter\firstofsixarguments \or + \expandafter\fifthofsixarguments \or + \expandafter\secondofsixarguments\or + \expandafter\fourthofsixarguments\else + \expandafter\sixthofsixarguments \fi} \unexpanded\def\referencesymbol - {\hbox{\strut\high - {\setupsymbolset[\interactionparameter\c!symbolset]% - \symbol[\strc_references_by_reference_page_state\v!somewhere\v!nowhere\v!previous\v!next]}}} + {\hbox\bgroup + \strut + \markreferencepage + \high + {\setupsymbolset[\interactionparameter\c!symbolset]% + \symbol[\ifcase\referencepagedetail\v!somewhere\or\v!nowhere\or\v!previous\or\v!next\or\v!previous\or\v!next\else\v!somewhere\fi]}% + \egroup} + +%D Hereafter the \type {\ignorespaces} binds the state node to next character (more likely +%D than a preceding one) and one can always add an explicit space. + +\unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward + {\doifcheckedpagestate{#label}% + {\goto{#backward}[#label]}% + {\goto{#backward}[#label]}% + {\ignorespaces}% + {\goto{#foreward}[#label]}% + {\goto{#foreward}[#label]}% + {#label}}% + +\unexpanded\def\someplace#preceding#backward#current#foreward#following#dummy[#label]% #dummy gobbles space around #foreward + {\doifcheckedpagestate{#label}% + {\doifelsenothing{#preceding}{\goto{#preceding}[#label]}\ignorespaces}% + {\doifelsenothing {#backward}{\goto {#backward}[#label]}\ignorespaces}% + {\doifelsenothing {#current}{\goto {#current}[#label]}\ignorespaces}% + {\doifelsenothing {#foreward}{\goto {#foreward}[#label]}\ignorespaces}% + {\doifelsenothing{#following}{\goto{#following}[#label]}\ignorespaces}% + {#label}} + +\unexpanded\def\atpage[#label]% todo + {\doifcheckedpagestate{#label}% + {\goto{\labeltext \v!precedingpage }[#label]}% + {\goto{\labeltext \v!hencefore }[#label]}% + {\ignorespaces}% + {\goto{\labeltext \v!hereafter }[#label]}% + {\goto{\labeltext \v!followingpage }[#label]}% + {\goto{\labeltexts\v!page\dummyreference}[#label]}} + +% Someone requested this but in retrospect didn't need it so we keep it as example. +% Beware: a node is injected which is why we add ignorespaces! +% +% \unexpanded\def\strc_references_conditional#action#text[#condition]#dummy[#label]% +% {\doifcheckedpagestate{#label}% +% {\doifelse{#condition}\v!precedingpage{#action{#text}[#label]}\ignorespaces}% +% {\doifelse{#condition}\v!hencefore {#action{#text}[#label]}\ignorespaces}% +% {\doifelse{#condition}\v!current {#action{#text}[#label]}\ignorespaces}% +% {\doifelse{#condition}\v!hereafter {#action{#text}[#label]}\ignorespaces}% +% {\doifelse{#condition}\v!followingpage{#action{#text}[#label]}\ignorespaces}% +% {#label}} +% +% \unexpanded\def\conditionalat {\strc_references_conditional\at} +% \unexpanded\def\conditionalin {\strc_references_conditional\in} +% \unexpanded\def\conditionalabout{\strc_references_conditional\about} -%D The other alternatives just conform their names: only the -%D label, only the text, or the label and the text. +%D The other alternatives just conform their names: only the label, only the text, or the +%D label and the text. % \dounknownreference -> \dummyreference @@ -1044,11 +1189,11 @@ \setvalue{\??referencinginteraction\v!all}% {\the\leftreferencetoks - \doifsometokselse\leftreferencetoks \leftofreferencecontent \donothing + \doifelsesometoks\leftreferencetoks \leftofreferencecontent \donothing \leftofreference \currentreferencecontent \rightofreference - \doifsometokselse\rightreferencetoks\rightofreferencecontent\donothing + \doifelsesometoks\rightreferencetoks\rightofreferencecontent\donothing \the\rightreferencetoks} \setvalue{\??referencinginteraction\v!label}% @@ -1108,14 +1253,21 @@ \let\rightofreferencecontent\empty \fi % inefficient: double resolve - \doifreferencefoundelse{#label} % we need to resolve the text + \doifelsereferencefound{#label} % we need to resolve the text {\goto{\referencesequence}[#label]} {\let\currentreferencecontent\dummyreference \goto{\referencesequence}[#label]}% \strc_references_stop_goto} -\unexpanded\def\strc_references_in{\strc_references_start_goto\let\currentreferencecontent\currentreferencedefault\strc_references_pickup_goto} -\unexpanded\def\strc_references_at{\strc_references_start_goto\let\currentreferencecontent\currentreferencepage \strc_references_pickup_goto} +\unexpanded\def\strc_references_in + {\strc_references_start_goto + \let\currentreferencecontent\currentreferencedefault + \strc_references_pickup_goto} + +\unexpanded\def\strc_references_at + {\strc_references_start_goto + \let\currentreferencecontent\currentreferencepage + \strc_references_pickup_goto} %D \macros %D {definereferenceformat} @@ -1226,7 +1378,7 @@ \def\autoreferencelabeltextflag{*} % a proper key like 'auto' or 'name' can clash with a label key \unexpanded\def\autoreferencelabeltext - {\ctxcommand{getcurrentreferencemetadata("name")}} + {\clf_getcurrentreferencemetadata{name}} % \starttext % \definereferenceformat[inxx] [left=(,right=),text=txt] @@ -1271,7 +1423,9 @@ \newconditional\uselocationstrut \settrue\uselocationstrut \def\extrareferencearguments - {\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow,"\currentviewerlayer"} + {highlight \luaconditional\highlighthyperlinks\space + newwindow \luaconditional\gotonewwindow\space + layer {\currentviewerlayer}} \unexpanded\def\directgoto {\ifconditional\uselocationstrut @@ -1303,7 +1457,15 @@ \attribute\referenceattribute\attributeunsetvalue \global\lastsavedreferenceattribute\attributeunsetvalue \iflocation - \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {% + height \ht\strutbox + depth \dp\strutbox + \extrareferencearguments + }% + \relax \setlocationattributes \setstrut % can be option \global\lastsavedreferenceattribute\lastreferenceattribute @@ -1322,7 +1484,15 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{injectreference("\referenceprefix","#label",\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {% + height \dimexpr\interactionparameter\c!height\relax + depth \dimexpr\interactionparameter\c!depth \relax + \extrareferencearguments + }% + \relax \setlocationattributes \attribute\referenceattribute\lastreferenceattribute \global\lastsavedreferenceattribute\lastreferenceattribute @@ -1341,9 +1511,12 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}% + \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% {\expandtexincurrentreference - \ctxcommand{injectcurrentreference(\number\ht\strutbox,\number\dp\strutbox)}% + \clf_injectcurrentreferencehtdp + \ht\strutbox + \dp\strutbox + \relax \setlocationattributes \setstrut % can be option \global\lastsavedreferenceattribute\lastreferenceattribute @@ -1358,15 +1531,52 @@ %\egroup\unhbox\referencebox} \endgroup} +\unexpanded\def\startgoto[#label]% + {\dontleavehmode + \begingroup + \iflocation + \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% + {\expandafter\startgoto_yes}% + {\expandafter\startgoto_nop}% + \else + \expandafter\startgoto_nop + \fi} + +\unexpanded\def\startgoto_nop + {\let\stopgoto\stopgoto_nop} + +\unexpanded\def\stopgoto_nop + {\endgroup} + +\unexpanded\def\startgoto_yes + {\expandtexincurrentreference + \clf_injectcurrentreferencehtdp + \ht\strutbox + \dp\strutbox + \relax + \setlocationattributes + \setstrut % can be option + \global\lastsavedreferenceattribute\lastreferenceattribute + \attribute\referenceattribute\lastreferenceattribute + \dostarttagged\t!link\empty + \let\stopgoto\stopgoto_yes} + +\unexpanded\def\stopgoto_yes + {\dostoptagged + \endgroup} + \def\dogotohtdp#content#dummy[#label]% dummy gobbles spaces {\dontleavehmode \begingroup \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}% + \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% {\expandtexincurrentreference - \ctxcommand{injectcurrentreference(\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax)}% + \clf_injectcurrentreferencehtdp + \dimexpr\interactionparameter\c!height\relax + \dimexpr\interactionparameter\c!depth \relax + \relax \setlocationattributes \global\lastsavedreferenceattribute\lastreferenceattribute \attribute\referenceattribute\lastreferenceattribute @@ -1385,7 +1595,11 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {\extrareferencearguments}% + \relax \setlocationattributes \global\lastsavedreferenceattribute\lastreferenceattribute \dostarttagged\t!link\empty @@ -1402,7 +1616,11 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {\extrareferencearguments}% + \relax \setlocationcolorspec{#resolver}% no consequence for strut \global\lastsavedreferenceattribute\lastreferenceattribute \dostarttagged\t!link\empty @@ -1419,7 +1637,11 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}% + \clf_injectreference + {\referenceprefix}% + {#label}% + {\extrareferencearguments}% + \relax \global\lastsavedreferenceattribute\lastreferenceattribute \dostarttagged\t!link\empty \hbox attr \referenceattribute \lastreferenceattribute {#content}% @@ -1435,9 +1657,9 @@ \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue \iflocation - \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}% + \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% {\expandtexincurrentreference - \ctxcommand{injectcurrentreference(nil,nil)}% + \clf_injectcurrentreference \setlocationattributes \global\lastsavedreferenceattribute\lastreferenceattribute \dostarttagged\t!link\empty @@ -1457,8 +1679,8 @@ \ht\scratchbox#height% \global\lastsavedreferenceattribute\attributeunsetvalue \attribute\referenceattribute\attributeunsetvalue - \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}% - {\ctxcommand{injectcurrentreference(nil,nil)}% + \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% + {\clf_injectcurrentreference \global\lastsavedreferenceattribute\lastreferenceattribute \hbox attr \referenceattribute \lastreferenceattribute {\box\scratchbox}} {\box\scratchbox}% @@ -1520,13 +1742,16 @@ \let\useexternaldocument\usefile \def\strc_references_use_url[#label][#url][#file][#description]% - {\ctxcommand{useurl("#label",\!!bs\detokenize{#url}\!!es,\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}} + {\clf_useurl{#label}{\detokenize{#url}}{\detokenize{#file}}{\detokenize{#description}}} \def\strc_references_use_file[#label][#file][#description]% - {\ctxcommand{usefile("#label",\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}} + {\clf_usefile{#label}{\detokenize{#file}}{\detokenize{#description}}} -\def\doifurldefinedelse #label{\ctxcommand{doifurldefinedelse ("#label")}} -\def\doiffiledefinedelse#label{\ctxcommand{doiffiledefinedelse("#label")}} +\def\doifelseurldefined #label{\clf_doifelseurldefined {#label}} +\def\doifelsefiledefined#label{\clf_doifelsefiledefined{#label}} + +\let\doifurldefinedelse \doifelseurldefined +\let\doiffiledefinedelse\doifelsefiledefined %D \macros %D {url,setupurl} @@ -1557,7 +1782,7 @@ {\dontleavehmode \begingroup \useurlstyleandcolor\c!style\c!color - \hyphenatedurl{\ctxcommand{geturl("#label")}}% + \hyphenatedurl{\clf_geturl{#label}}% \endgroup} %D This macro is hooked into a support macro, and thereby @@ -1588,7 +1813,7 @@ \def\strc_references_do_special_from[#label]% {\dontleavehmode - \goto{\ctxcommand{from("#label")}}[fileorurl(#label)]} + \goto{\clf_from{#label}}[fileorurl(#label)]} \def\dofromurldescription#content% called at the lua end {#content} @@ -1633,13 +1858,13 @@ {\dotripleargument\strc_references_define_program} \def\strc_references_define_program[#name][#program][#description]% - {\ctxcommand{defineprogram("#name",\!!bs#program\!!es,\!!bs#description\!!es)}} + {\clf_defineprogram{#name}{#program}{#description}} \def\program[#name]% incompatible, more consistent, hardy used anyway {\dontleavehmode \begingroup \useprogramsstyleandcolor\c!style\c!color - \ctxcommand{getprogram("#name","\directprogramsparameter\c!alternative","\directprogramsparameter\c!space")}% + \clf_getprogram{#name}% \endgroup} %D As we can see, we directly use the special reference @@ -1728,7 +1953,7 @@ %D %D Only when \type {text} is not empty, a space is inserted. -\def\dotextprefix#text% +\unexpanded\def\dotextprefix#text% {\begingroup \setbox\scratchbox\hbox{#text}% to be solved some day \ifdim\wd\scratchbox>\zeropoint @@ -1864,14 +2089,24 @@ \installcorenamespace{referencingprefix} \def\getreferencestructureprefix#kind#name#category% name will change - {{ - prefix = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix", - separatorset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset", - conversion = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion", - conversionset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset", - set = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset", - segments = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments", - connector = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector\!!es, + {{% + prefix {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix}% + separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset}% + conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion}% + conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset}% + starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstarter}% + stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstopper}% + set {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset}% + segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments}% + connector {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector}% + }% + {% + separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberseparatorset}% + conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversion}% + conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversionset}% + starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstarter}% + stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstopper}% + segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numbersegments}% }} \unexpanded\def\setupreferencestructureprefix @@ -1893,16 +2128,11 @@ \csname \??referencingprefix:#category#parameter\endcsname \fi\fi\fi} -% \def\currentreferencedefault -% {\ctxcommand{filterdefaultreference()}} - -\def\currentreferencedefault - {\ctxcommand{filterreference("\s!default",\ctxcommand{getcurrentprefixspec("\s!default")})}} - -% needs testing -% -% \def\currentreferencedefault -% {\ctxcommand{currentreferencedefault()}} +\def\currentreferencedefault % for some reason we need to explicitly expand + {\normalexpanded{\noexpand\clf_filterdefaultreference + {\s!default}% + \noexpand\getreferencestructureprefix\clf_getcurrentprefixspec{\s!default}% returns #kind#name#category + \relax}} %D Not all support is visible by looking at the \TEX\ code; here is one of those:^ %D @@ -1920,6 +2150,55 @@ %D \stopinteractionmenu %D \stoptyping +%D Relatively new: +%D +%D \starttyping +%D \chapter{The never ending story} +%D +%D \section{An ending story} +%D +%D \in{chapter}[match(complex bibliographies)] +%D \in{chapter}[match(never ending)] +%D \in{chapter}[match(ending)] +%D \in{chapter}[match(chapter:never ending)] +%D \in{chapter}[match(chapter:ending)] +%D \in{section}[match(section:ending)] +%D \in{figure}[match(float:mess)] +%D \in{figure}[match(figure:mess)] +%D \in{figure (not found)}[match(section:mess)] +%D \in{figure (not found)}[match(section:xxxx)] +%D \in{figure}[match(mess)] +%D +%D \placefigure{What a mess}{} +%D +%D \chapter{About complex bibliographies} +%D +%D \in{chapter}[match(complex bibliographies)] +%D \in{chapter}[match(never ending)] +%D \in{figure}[match(mess)] +%D \stoptyping + +%D Tracing: + +\unexpanded\def\strc_references_tracer#1#2% \csleft csright + {\hbox to \zeropoint \bgroup + \hss + \infofont + \darkblue + \ifx#1\empty\else + \raise\strutht \hbox \s!to \zeropoint \bgroup + \hss#1\hskip.2\emwidth + \egroup + \fi + \vrule \s!height 1.5\strutht \s!depth \strutdp \s!width .1\emwidth + \ifx#2\empty\else + \raise\strutht \hbox \s!to \zeropoint \bgroup + \hskip.2\emwidth#2\hss + \egroup + \fi + \hss + \egroup}% + \protect \endinput % tricky: diff --git a/Master/texmf-dist/tex/context/base/strc-reg.lua b/Master/texmf-dist/tex/context/base/strc-reg.lua index bdb2e0d6713..ed329219595 100644 --- a/Master/texmf-dist/tex/context/base/strc-reg.lua +++ b/Master/texmf-dist/tex/context/base/strc-reg.lua @@ -47,6 +47,8 @@ local v_text = variables.text local context = context local commands = commands +local implement = interfaces.implement + local matchingtilldepth = sections.matchingtilldepth local numberatdepth = sections.numberatdepth local currentlevel = sections.currentlevel @@ -64,6 +66,10 @@ local a_destination = attributes.private('destination') local absmaxlevel = 5 -- \c_strc_registers_maxlevel +local h_prefixpage = helpers.prefixpage +local h_prefixlastpage = helpers.prefixlastpage +local h_title = helpers.title + local ctx_startregisteroutput = context.startregisteroutput local ctx_stopregisteroutput = context.stopregisteroutput local ctx_startregistersection = context.startregistersection @@ -74,13 +80,115 @@ local ctx_startregisterentry = context.startregisterentry local ctx_stopregisterentry = context.stopregisterentry local ctx_startregisterpages = context.startregisterpages local ctx_stopregisterpages = context.stopregisterpages -local ctx_stopregisterseewords = context.stopregisterseewords local ctx_startregisterseewords = context.startregisterseewords +local ctx_stopregisterseewords = context.stopregisterseewords local ctx_registerentry = context.registerentry local ctx_registerseeword = context.registerseeword local ctx_registerpagerange = context.registerpagerange local ctx_registeronepage = context.registeronepage +-- possible export, but ugly code (overloads) +-- +-- local output, section, entries, nofentries, pages, words, rawtext +-- +-- h_title = function(a,b) rawtext = a end +-- +-- local function ctx_startregisteroutput() +-- output = { } +-- section = nil +-- entries = nil +-- nofentries = nil +-- pages = nil +-- words = nil +-- rawtext = nil +-- end +-- local function ctx_stopregisteroutput() +-- inspect(output) +-- output = nil +-- section = nil +-- entries = nil +-- nofentries = nil +-- pages = nil +-- words = nil +-- rawtext = nil +-- end +-- local function ctx_startregistersection(tag) +-- section = { } +-- output[#output+1] = { +-- section = section, +-- tag = tag, +-- } +-- end +-- local function ctx_stopregistersection() +-- end +-- local function ctx_startregisterentries(n) +-- entries = { } +-- nofentries = 0 +-- section[#section+1] = entries +-- end +-- local function ctx_stopregisterentries() +-- end +-- local function ctx_startregisterentry(n) -- or subentries (nested?) +-- nofentries = nofentries + 1 +-- entry = { } +-- entries[nofentries] = entry +-- end +-- local function ctx_stopregisterentry() +-- nofentries = nofentries - 1 +-- entry = entries[nofentries] +-- end +-- local function ctx_startregisterpages() +-- pages = { } +-- entry.pages = pages +-- end +-- local function ctx_stopregisterpages() +-- end +-- local function ctx_startregisterseewords() +-- words = { } +-- entry.words = words +-- end +-- local function ctx_stopregisterseewords() +-- end +-- local function ctx_registerentry(processor,internal,seeparent,text) +-- text() +-- entry.text = { +-- processor = processor, +-- internal = internal, +-- seeparent = seeparent, +-- text = rawtext, +-- } +-- end +-- local function ctx_registerseeword(i,n,processor,internal,seeindex,seetext) +-- seetext() +-- entry.words[i] = { +-- processor = processor, +-- internal = internal, +-- seeparent = seeparent, +-- seetext = rawtext, +-- } +-- end +-- local function ctx_registerpagerange(fprocessor,finternal,frealpage,lprocessor,linternal,lrealpage) +-- pages[#pages+1] = { +-- first = { +-- processor = fprocessor, +-- internal = finternal, +-- realpage = frealpage, +-- }, +-- last = { +-- processor = lprocessor, +-- internal = linternal, +-- realpage = lrealpage, +-- }, +-- } +-- end +-- local function ctx_registeronepage(processor,internal,realpage) +-- pages[#pages+1] = { +-- processor = processor, +-- internal = internal, +-- realpage = realpage, +-- } +-- end + -- some day we will share registers and lists (although there are some conceptual -- differences in the application of keywords) @@ -194,6 +302,7 @@ local function filtercollected(names,criterium,number,collected,prevmode) end else -- sectionname, number -- beware, this works ok for registers + -- to be redone with reference instead local depth = sections.getlevel(criterium) local number = tonumber(number) or numberatdepth(depth) or 0 if trace_registers then @@ -309,30 +418,71 @@ end registers.define = defineregister -- 4 times is somewhat over the top but we want consistency registers.setmethod = defineregister -- and we might have a difference some day -commands.defineregister = defineregister -commands.setregistermethod = defineregister + +implement { + name = "defineregister", + actions = defineregister, + arguments = { "string", "string" } +} + +implement { + name = "setregistermethod", + actions = defineregister, -- duplicate use + arguments = { "string", "string" } +} local entrysplitter = lpeg.tsplitat('+') -- & obsolete in mkiv local tagged = { } +-- this whole splitting is an inheritance of mkii + local function preprocessentries(rawdata) local entries = rawdata.entries if entries then - local e, k = entries[1] or "", entries[2] or "" - local et, kt, entryproc, pageproc - if type(e) == "table" then - et = e - else - entryproc, e = splitprocessor(e) + -- + -- local e = entries[1] or "" + -- local k = entries[2] or "" + -- local et, kt, entryproc, pageproc + -- if type(e) == "table" then + -- et = e + -- else + -- entryproc, e = splitprocessor(e) + -- et = lpegmatch(entrysplitter,e) + -- end + -- if type(k) == "table" then + -- kt = k + -- else + -- pageproc, k = splitprocessor(k) + -- kt = lpegmatch(entrysplitter,k) + -- end + -- + local processors = rawdata.processors + local et = entries.entries + local kt = entries.keys + local entryproc = processors and processors.entry + local pageproc = processors and processors.page + if entryproc == "" then + entryproc = nil + end + if pageproc == "" then + pageproc = nil + end + if not et then + local p, e = splitprocessor(entries.entry or "") + if p then + entryproc = p + end et = lpegmatch(entrysplitter,e) end - if type(k) == "table" then - kt = k - else - pageproc, k = splitprocessor(k) + if not kt then + local p, k = splitprocessor(entries.key or "") + if p then + pageproc = p + end kt = lpegmatch(entrysplitter,k) end + -- entries = { } local ok = false for k=#et,1,-1 do @@ -347,7 +497,7 @@ local function preprocessentries(rawdata) end rawdata.list = entries if pageproc or entryproc then - rawdata.processors = { entryproc, pageproc } + rawdata.processors = { entryproc, pageproc } -- old way: indexed .. will be keys end rawdata.entries = nil end @@ -361,6 +511,11 @@ local function storeregister(rawdata) -- metadata, references, entries local references = rawdata.references local metadata = rawdata.metadata -- checking + if not metadata then + metadata = { } + rawdata.metadata = metadata + end + -- if not metadata.kind then metadata.kind = "entry" end @@ -372,6 +527,11 @@ local function storeregister(rawdata) -- metadata, references, entries local name = metadata.name local notsaved = tobesaved[name].metadata.notsaved -- + if not references then + references = { } + rawdata.references = references + end + -- local internal = references.internal if not internal then internal = texgetcount("locationcount") -- we assume that it has been set @@ -408,7 +568,9 @@ local function storeregister(rawdata) -- metadata, references, entries return #entries end -local function enhanceregister(name,n) +registers.store = storeregister + +function registers.enhance(name,n) local data = tobesaved[name].metadata.notsaved and collected[name] or tobesaved[name] local entry = data.entries[n] if entry then @@ -416,7 +578,7 @@ local function enhanceregister(name,n) end end -local function extendregister(name,tag,rawdata) -- maybe do lastsection internally +function registers.extend(name,tag,rawdata) -- maybe do lastsection internally if type(tag) == "string" then tag = tagged[tag] end @@ -460,18 +622,70 @@ local function extendregister(name,tag,rawdata) -- maybe do lastsection internal end end -registers.store = storeregister -registers.enhance = enhanceregister -registers.extend = extendregister - -function commands.storeregister(rawdata) - local nofentries = storeregister(rawdata) - setinternalreference(nil,nil,rawdata.references.internal) - context(nofentries) +function registers.get(tag,n) + local list = tobesaved[tag] + return list and list.entries[n] end -commands.enhanceregister = enhanceregister -commands.extendregister = extendregister +implement { + name = "enhanceregister", + actions = registers.enhance, + arguments = { "string", "integer" } +} + +implement { + name = "extendregister", + actions = registers.extend, + arguments = { "string", "string" } +} + +implement { + name = "storeregister", + actions = function(rawdata) + local nofentries = storeregister(rawdata) + setinternalreference { internal = rawdata.references.internal } + context(nofentries) + end, + arguments = { + { + { "metadata", { + { "kind" }, + { "name" }, + { "coding" }, + { "level", "integer" }, + { "catcodes", "integer" }, + { "own" }, + { "xmlroot" }, + { "xmlsetup" } + } + }, + { "entries", { + { "entries", "list" }, + { "keys", "list" }, + { "entry" }, + { "key" } + } + }, + { "references", { + { "internal", "integer" }, + { "section", "integer" }, + { "label" } + } + }, + { "seeword", { + { "text" } + } + }, + { "processors", { + { "entry" }, + { "key" }, + { "page" } + } + }, + { "userdata" }, + } + } +} -- sorting and rendering @@ -508,7 +722,7 @@ end local seeindex = 0 --- meerdere loops, seewords, dan words, an seewords +-- meerdere loops, seewords, dan words, anders seewords local function crosslinkseewords(result) -- all words -- collect all seewords @@ -712,10 +926,21 @@ end registers.analyze = analyzeregister -function registers.analyze(class,options) - context(analyzeregister(class,options)) -end - +implement { + name = "analyzeregister", + actions = { analyzeregister, context }, + arguments = { + "string", + { + { "language" }, + { "method" }, + { "numberorder" }, + { "compress" }, + { "criterium" }, + { "pagenumber", "boolean" }, + } + } +} -- todo take conversion from index @@ -724,20 +949,14 @@ function registers.userdata(index,name) return data and data.userdata and data.userdata[name] or nil end -function commands.registeruserdata(index,name) - local data = references.internals[tonumber(index)] - data = data and data.userdata and data.userdata[name] - if data then - context(data) - end -end +implement { + name = "registeruserdata", + actions = { registers.userdata, context }, + arguments = { "integer", "string" } +} -- todo: ownnumber -local h_prefixpage = helpers.prefixpage -local h_prefixlastpage = helpers.prefixlastpage -local h_title = helpers.title - local function pagerange(f_entry,t_entry,is_last,prefixspec,pagespec) local fer, ter = f_entry.references, t_entry.references ctx_registerpagerange( @@ -873,8 +1092,8 @@ function registers.flush(data,options,prefixspec,pagespec) if #list > 1 then list[#list] = nil else - -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere - report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1]) + -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere .. somehow this message is wrong + -- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1]) end end end @@ -882,60 +1101,68 @@ function registers.flush(data,options,prefixspec,pagespec) -- but we don't want to allocate too many entries so there we go while d < #data do d = d + 1 - local entry = data[d] + local entry = data[d] + local metadata = entry.metadata + local kind = metadata.kind + local list = entry.list local e = { false, false, false } for i=3,maxlevel do e[i] = false end - local metadata = entry.metadata - local kind = metadata.kind - local list = entry.list for i=1,maxlevel do if list[i] then e[i] = list[i][1] end - if e[i] ~= done[i] then - if e[i] and e[i] ~= "" then - done[i] = e[i] - for j=i+1,maxlevel do - done[j] = false - end - if started then - ctx_stopregisterentry() - started = false - end - if n == i then + if e[i] == done[i] then + -- skip + elseif not e[i] then + -- see ends up here + -- can't happen any more + done[i] = false + for j=i+1,maxlevel do + done[j] = false + end + elseif e[i] == "" then + done[i] = false + for j=i+1,maxlevel do + done[j] = false + end + else + done[i] = e[i] + for j=i+1,maxlevel do + done[j] = false + end + if started then + ctx_stopregisterentry() + started = false + end + if n == i then -- ctx_stopregisterentries() -- ctx_startregisterentries(n) - else - while n > i do - n = n - 1 - ctx_stopregisterentries() - end - while n < i do - n = n + 1 - ctx_startregisterentries(n) - end + else + while n > i do + n = n - 1 + ctx_stopregisterentries() end - local references = entry.references - local processors = entry.processors - local internal = references.internal or 0 - local seeparent = references.seeparent or "" - local processor = processors and processors[1] or "" - -- so, we need to keep e as is (local), or we need local title = e[i] ... which might be - -- more of a problem - ctx_startregisterentry(0) -- will become a counter - started = true - if metadata then - ctx_registerentry(processor,internal,seeparent,function() h_title(e[i],metadata) end) - else -- ? - ctx_registerentry(processor,internal,seeindex,e[i]) + while n < i do + n = n + 1 + ctx_startregisterentries(n) end + end + local references = entry.references + local processors = entry.processors + local internal = references.internal or 0 + local seeparent = references.seeparent or "" + local processor = processors and processors[1] or "" + -- so, we need to keep e as is (local), or we need local title = e[i] ... which might be + -- more of a problem + ctx_startregisterentry(0) -- will become a counter + started = true + if metadata then + ctx_registerentry(processor,internal,seeparent,function() h_title(e[i],metadata) end) else - done[i] = false - for j=i+1,maxlevel do - done[j] = false - end + -- can this happen? + ctx_registerentry(processor,internal,seeindex,e[i]) end end end @@ -1051,7 +1278,8 @@ function registers.flush(data,options,prefixspec,pagespec) local seetext = seeword.text or "" local processor = seeword.processor or (entry.processors and entry.processors[1]) or "" local seeindex = entry.references.seeindex or "" - ctx_registerseeword(i,n,processor,0,seeindex,seetext) + -- ctx_registerseeword(i,nt,processor,0,seeindex,seetext) + ctx_registerseeword(i,nt,processor,0,seeindex,function() h_title(seetext,metadata) end) end ctx_stopregisterseewords() end @@ -1078,12 +1306,42 @@ function registers.flush(data,options,prefixspec,pagespec) -- collectgarbage("collect") end -local function processregister(class,...) +function registers.process(class,...) if analyzeregister(class,...) > 0 then local data = collected[class] registers.flush(data,...) end end -registers.process = processregister -commands.processregister = processregister +implement { + name = "processregister", + actions = registers.process, + arguments = { + "string", + { + { "language" }, + { "method" }, + { "numberorder" }, + { "compress" }, + { "criterium" }, + { "pagenumber", "boolean" }, + }, + { + { "separatorset" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + { "set" }, + { "segments" }, + { "connector" }, + }, + { + { "prefix" }, + { "separatorset" }, + { "conversionset" }, + { "starter" }, + { "stopper" }, + { "segments" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/strc-reg.mkiv b/Master/texmf-dist/tex/context/base/strc-reg.mkiv index d072aca69b1..138a1486f3e 100644 --- a/Master/texmf-dist/tex/context/base/strc-reg.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-reg.mkiv @@ -134,7 +134,7 @@ \ifconditional\c_strc_registers_defining \else % todo: dosingle ... \settrue\c_strc_registers_defining \definemixedcolumns[\currentregister][\v!register]% first as otherwise it overloads start/stop - \ctxcommand{defineregister("\currentregister","\registerparameter\c!referencemethod")}% + \clf_defineregister{\currentregister}{\registerparameter\c!referencemethod}% \normalexpanded{\presetheadtext[\currentregister=\Word{\currentregister}]}% \setuevalue{\currentregister}{\dodoubleempty\strc_registers_insert_entry[\currentregister]}% \setuevalue{\e!see\currentregister}{\dodoubleempty\strc_registers_insert_see[\currentregister]}% @@ -155,7 +155,7 @@ \to \everydefineregister \appendtoks - \ctxcommand{setregistermethod("\currentregister","\registerparameter\c!referencemethod")}% + \clf_setregistermethod{\currentregister}{\registerparameter\c!referencemethod}% \to \everysetupregister %D Registering: @@ -251,49 +251,49 @@ \setnextinternalreference % we could consider storing register entries in a list which we % could then sort - \xdef\currentregisternumber{\ctxcommand{storeregister{ % 'own' should not be in metadata - metadata = { - % kind = "entry", - name = "\currentregister", - % level = structures.sections.currentlevel(), - coding = "\currentregistercoding", - % catcodes = \the\catcodetable, + \xdef\currentregisternumber{\clf_storeregister % 'own' should not be in metadata + metadata {% + name {\currentregister}% + coding {\currentregistercoding}% \ifx\currentregisterownnumber\v!yes - own = "\registerparameter\c!alternative", % can be used instead of pagenumber + own {\registerparameter\c!alternative}% can be used instead of pagenumber \fi \ifx\currentreferencecoding\s!xml - xmlroot = "\xmldocument", % only useful when text + xmlroot {\xmldocument} % only useful when text \fi \ifx\currentregisterxmlsetup\empty \else - xmlsetup = "\currentregisterxmlsetup", + xmlsetup {\currentregisterxmlsetup}% \fi - }, - references = { - % internal = \nextinternalreference, - % section = structures.sections.currentid(), % hm, why then not also lastsection the same way + }% + references {% \ifx\currentregisterlabel\empty \else - label = "\currentregisterlabel", + label {\currentregisterlabel}% \fi - }, - % \ifx\currentregisterentries\empty \else - entries = { + }% + entries {% % we need a special one for xml, this is just a single one \ifx\currentregisterentries\empty - { \!!bs\currentregisterentriesa\!!es, \!!bs\currentregisterentriesb\!!es, \!!bs\currentregisterentriesc\!!es }, + entries { + {\currentregisterentriesa}% + {\currentregisterentriesb}% + {\currentregisterentriesc}% + } \else - \!!bs\currentregisterentries\!!es, + entry {\currentregisterentries}% \fi \ifx\currentregisterkeys\empty - { \!!bs\currentregisterkeysa\!!es, \!!bs\currentregisterkeysb\!!es, \!!bs\currentregisterkeysc\!!es }, + keys { + {\currentregisterkeysa}% + {\currentregisterkeysb}% + {\currentregisterkeysc}% + } \else - \!!bs\currentregisterkeys\!!es, + key {\currentregisterkeys}% \fi - }, - % \fi - userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es) - } - }}% - % \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}% in previous + }% + userdata {\detokenize\expandafter{\normalexpanded{#3}}} + }% + % \clf_setinternalreference internal \nextinternalreference\relax % in previous \ifx\currentregisterownnumber\v!yes \glet\currentregistersynchronize\relax \else @@ -302,9 +302,42 @@ \currentregistersynchronize % here? % needs thinking ... bla\index{bla}. will break before the . but adding a % penalty is also no solution + \dostarttagged\t!registerlocation\currentregister + \attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup + \dotagregisterlocation + \dostoptagged + \endgroup} + +\unexpanded\def\dosetfastregisterentry#1#2#3#4#5% register entry key processor processor + {\begingroup + \edef\currentregister{#1}% + \setnextinternalreference + \xdef\currentregisternumber{\clf_storeregister + {% + metadata {% + name {\currentregister}% + } + entries {% + entry {#2}% + key {#3}% + }% + processors {% + entry {#4}% + page {#5}% + }% + }% + }% + % overlap with the above + \xdef\currentregistersynchronize{\ctxlatecommand{enhanceregister("\currentregister",\currentregisternumber)}}% + \currentregistersynchronize % here? + \dostarttagged\t!registerlocation\currentregister \attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup + \dotagregisterlocation + \dostoptagged \endgroup} +\let\dotagregisterlocation\relax % experiment + \unexpanded\def\strc_registers_insert_entry[#1][#2]% {\def\currentregister{#1}% \doifelse{\registerparameter\c!ownnumber}\v!yes @@ -349,7 +382,7 @@ \def\strc_registers_finish_entry_indeed#1#2#3% register data userdata {\begingroup \edef\currentregister{#1}% - \setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% + \setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% todo: fast setter \edef\currentregisterlabel {\registerparameter\c!label}% \edef\currentregisterexpansion{\registerparameter\c!expansion}% \edef\currentregisterownnumber{\registerparameter\c!ownnumber}% @@ -461,27 +494,28 @@ \fi \setnextinternalreference % we could consider storing register entries in list - \edef\temp{\ctxcommand{storeregister{ - metadata = { - kind = "see", - name = "\currentregister", - % level = structures.sections.currentlevel(), - % catcodes = \the\catcodetable, - }, - references = { - % internal = \nextinternalreference, - % section = structures.sections.currentid(), - }, - entries = { - % we need a special one for xml, this is just a single one - \!!bs\currentregisterentries\!!es, - \!!bs#2\!!es - }, - seeword = { - text = \!!bs\currentregisterseeword\!!es - }, - } + \edef\temp{\clf_storeregister{ + metadata {% + kind {see}% + name {\currentregister}% + }% + references {% + % internal = \nextinternalreference, + % section = structures.sections.currentid(), + }% + entries {% + % we need a special one for xml, this is just a single one + entry {\currentregisterentries}% + key {#2}% + }% + seeword {% + text {\currentregisterseeword}% + }% }}% + \dostarttagged\t!registerlocation\currentregister + \attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup + \dotagregisterlocation + \dostoptagged \endgroup} %D Rendering: @@ -497,14 +531,17 @@ {\begingroup \edef\currentregister{#1}% \setupregister[\currentregister][#2]% - \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\ctxcommand{analyzeregister('\currentregister',{ - language = "\registerparameter\s!language", - method = "\registerparameter\c!method", - numberorder = "\registerparameter\c!numberorder", - compress = "\registerparameter\c!compress", - criterium = "\registerparameter\c!criterium", - pagenumber = \ifx\registerpageseparatorsymbol\empty false\else true\fi, - })}}}% brrr + \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\clf_analyzeregister + {\currentregister}% + {% + language {\registerparameter\s!language}% + method {\registerparameter\c!method}% + numberorder {\registerparameter\c!numberorder}% + compress {\registerparameter\c!compress}% + criterium {\registerparameter\c!criterium}% + pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi + }% + }}% \ifcase\utilityregisterlength\relax \resetsystemmode\v!register \else @@ -520,27 +557,6 @@ \unexpanded\def\placeregister {\dodoubleempty\strc_registers_place} -% \def\strc_registers_place[#1][#2]% -% {\iffirstargument -% \begingroup -% %\forgetall -% \edef\currentregister{#1}% -% \setupregister[\currentregister][#2]% -% \the\everyplaceregister -% \ifnum\registerparameter\c!n>\plusone -% \startcolumns -% [\c!n=\registerparameter\c!n, -% \c!balance=\registerparameter\c!balance, -% \c!align=\registerparameter\c!align, -% \c!tolerance=\registerparameter\c!tolerance]% -% \strc_registers_place_indeed -% \stopcolumns -% \else -% \strc_registers_place_indeed -% \fi -% \endgroup -% \fi} - \def\strc_registers_place[#1][#2]% {\iffirstargument \begingroup @@ -558,42 +574,33 @@ \endgroup \fi} -% \def\strc_registers_place_columns -% {\startmixedcolumns[\currentregister] -% \startpacked[\v!blank]% -% \strc_registers_place_indeed -% \stoppacked -% \stopmixedcolumns} -% -% \def\strc_registers_place_normal -% {\startpacked[\v!blank]% -% \strc_registers_place_indeed -% \stoppacked} - \def\strc_registers_place_indeed - {\ctxcommand{processregister('\currentregister',{ - language = "\registerparameter\s!language", - method = "\registerparameter\c!method", - numberorder = "\registerparameter\c!numberorder", - compress = "\registerparameter\c!compress", - criterium = "\registerparameter\c!criterium", - pagenumber = \ifx\registerpageseparatorsymbol\empty false\else true\fi, - },{ - separatorset = "\registerparameter\c!pageprefixseparatorset", - conversionset = "\registerparameter\c!pageprefixconversionset", - starter = \!!bs\registerparameter\c!pageprefixstarter\!!es, - stopper = \!!bs\registerparameter\c!pageprefixstopper\!!es, - set = "\registerparameter\c!pageprefixset", - segments = "\registerparameter\c!pageprefixsegments", - connector = \!!bs\registerparameter\c!pageprefixconnector\!!es, - },{ - prefix = "\registerparameter\c!pageprefix", - separatorset = "\registerparameter\c!pageseparatorset", - conversionset = "\registerparameter\c!pageconversionset", - starter = \!!bs\registerparameter\c!pagestarter\!!es, - stopper = \!!bs\registerparameter\c!pagestopper\!!es, - segments = "\registerparameter\c!pagesegments", - })}} + {\clf_processregister + {\currentregister}% + {% + language {\registerparameter\s!language}% + method {\registerparameter\c!method}% + numberorder {\registerparameter\c!numberorder}% + compress {\registerparameter\c!compress}% + criterium {\registerparameter\c!criterium}% + pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi + }{% + separatorset {\registerparameter\c!pageprefixseparatorset}% + conversionset {\registerparameter\c!pageprefixconversionset}% + starter {\registerparameter\c!pageprefixstarter}% + stopper {\registerparameter\c!pageprefixstopper}% + set {\registerparameter\c!pageprefixset}% + segments {\registerparameter\c!pageprefixsegments}% + connector {\registerparameter\c!pageprefixconnector}% + }{% + prefix {\registerparameter\c!pageprefix}% + separatorset {\registerparameter\c!pageseparatorset}% + conversionset {\registerparameter\c!pageconversionset}% + starter {\registerparameter\c!pagestarter}% + stopper {\registerparameter\c!pagestopper}% + segments {\registerparameter\c!pagesegments}% + }% + \relax} \def\strc_registers_limited_entry#1% {\limitatetext{#1}\currentregistermaxwidth\unknown}% @@ -668,17 +675,19 @@ % a = -\setvalue{\??registerindicator a}#1% +\def\strc_registers_indicator_a#1#2% {\registerparameter\c!before % bugged, why does leftskip gets set: \vskip\lineheight\goodbreak\vskip-\lineheight + \typo_injectors_check_register \begingroup \useregisterstyleandcolor\c!style\c!color \dontleavehmode + \typo_injectors_mark_register \strut \iflocation \dosetdirectpagereference{\currentregister:\v!section:#1}% \fi - \registerparameter\c!command{#1}% + \registerparameter\c!command{#2}% \endgroup \blank[\v!samepage]% \registerparameter\c!after @@ -687,38 +696,55 @@ % b = -\setvalue{\??registerindicator b}#1% will be shared with a +\def\strc_registers_indicator_b#1#2% {\registerparameter\c!before + \typo_injectors_check_register \begingroup \useregisterstyleandcolor\c!style\c!color \dontleavehmode + \typo_injectors_mark_register \strut \iflocation \dosetdirectpagereference{\currentregister:\v!section:#1}% \fi - \registerparameter\c!command{#1}% + \registerparameter\c!command{#2}% \endgroup \registerparameter\c!after \nobreak} -\setvalue{\??registerindicator A}#1{\getvalue{\??registerindicator a}{\WORD{#1}}} -\setvalue{\??registerindicator B}#1{\getvalue{\??registerindicator b}{\WORD{#1}}} +\setvalue{\??registerindicator a}#1{\strc_registers_indicator_a{#1}{#1}} +\setvalue{\??registerindicator A}#1{\strc_registers_indicator_a{#1}{\WORD{#1}}} +\setvalue{\??registerindicator b}#1{\strc_registers_indicator_b{#1}{#1}} +\setvalue{\??registerindicator B}#1{\strc_registers_indicator_b{#1}{\WORD{#1}}} %D The following macros are the interface to the rendering. These are %D generated by \LUA. This might change. +% \showinjector +% \setinjector[register][2][\column] +% +% \starttext +% first \index{first} +% second \index{second} +% third \index{third} +% fourth \index{fourth} +% \placeregister[index] +% \stoptext + +\doinstallinjector\s!register + %D Beware, we get funny side effects when a dangling \index precedes an %D placeindex as then flushing takes place inside the index. Took me hours %D to notice that. -\newconditional\c_strc_registers_page_done +\newconstant \c_strc_registers_page_state % 0=nothing 1=page 2=see \newdimen \d_strc_registers_distance \unexpanded\def\startregisteroutput {\endgraf \begingroup \d_strc_registers_distance\registerparameter\c!distance\relax - \dostarttagged\t!register\currentregister + \dostarttaggedchained\t!register\currentregister\??register \forgeteverypar \forgetparindent \forgetparskip} @@ -728,18 +754,6 @@ \dostoptagged \endgroup} -% \unexpanded\def\startregisterentries#1% depth -% {\endgraf -% \begingroup -% \dostarttagged\t!registerentries\empty -% \let\savedcurrentregister\currentregister -% \edef\currentregister{\currentregister:#1}% -% \useregisterstyleandcolor\c!textstyle\c!textcolor -% \advance\leftskip\numexpr#1-\plusone\relax\dimexpr\d_strc_registers_distance\relax -% \hangindent\registerparameter\c!distance\relax -% \hangafter\plusone -% \let\currentregister\savedcurrentregister} - \newdimen\d_strc_registers_hangindent \newcount\c_strc_registers_hangafter @@ -756,7 +770,7 @@ \fi \d_strc_registers_hangindent\registerparameter\c!distance\relax \c_strc_registers_hangafter \plusone -\blank[\v!samepage]% + \blank[\v!samepage]% \let\currentregister\savedcurrentregister} \unexpanded\def\stopregisterentries @@ -765,12 +779,18 @@ \endgroup} \unexpanded\def\startregisterentry#1% todo: level - {\begingroup + {\typo_injectors_check_register + \begingroup + \dostarttagged\t!registerentry\empty + \global\setconstant\c_strc_registers_page_state\zerocount \hangindent\d_strc_registers_hangindent - \hangafter \c_strc_registers_hangafter} + \hangafter \c_strc_registers_hangafter + \typo_injectors_mark_register} \unexpanded\def\stopregisterentry {\endgraf + \global\setconstant\c_strc_registers_page_state\zerocount + \dostoptagged \endgroup} \unexpanded\def\startregistersection#1% title @@ -786,7 +806,6 @@ \unexpanded\def\startregisterpages {\begingroup \dostarttagged\t!registerpages\empty - \setfalse\c_strc_registers_page_done \useregisterstyleandcolor\c!pagestyle\c!pagecolor} \unexpanded\def\stopregisterpages @@ -794,9 +813,8 @@ \endgroup} \unexpanded\def\startregisterseewords - {\ifhmode\crlf\fi + {%\par % \ifhmode\crlf\fi % otherwise wrong level \begingroup - \setfalse\c_strc_registers_page_done \dostarttagged\t!registerpage\empty \useregisterstyleandcolor\c!pagestyle\c!pagecolor} @@ -804,12 +822,17 @@ {\dostoptagged \endgroup} -\unexpanded\def\registerpageseparator% todo: , configurable - {\ifconditional\c_strc_registers_page_done - \registerpageseparatorsymbol - \else +\unexpanded\def\registerpageseparator % todo: , configurable + {\ifcase\c_strc_registers_page_state \hskip\d_strc_registers_distance\relax - \settrue\c_strc_registers_page_done + \or + \dostarttagged\t!registerseparator\empty + \registerpageseparatorsymbol % page + \dostoptagged + \or + \dostarttagged\t!registerseparator\empty + \registerpageseparatorsymbol % see + \dostoptagged \fi} \unexpanded\def\registeronepagerangeseparator @@ -825,12 +848,14 @@ \unexpanded\def\registeronepage#1#2#3#4% #1:processor content {\registerpageseparator + \global\setconstant\c_strc_registers_page_state\plusone \dostarttagged\t!registerpage\empty \withregisterpagecommand{#1}{#2}{#3}{#4}% \dostoptagged} \unexpanded\def\registerpagerange#1#2#3#4#5#6#7% #1:processor content, content todo: -- configurable {\registerpageseparator + \global\setconstant\c_strc_registers_page_state\plusone \dostarttagged\t!registerpagerange\empty \dostarttagged\t!registerfrompage\empty \withregisterpagecommand{#1}{#2}{#3}{#4}% @@ -841,12 +866,8 @@ \dostoptagged \dostoptagged} -\let\strc_register_injector_process\relax -\let\strc_register_injector_show \relax - \unexpanded\def\defaultregisterentry#1#2#3#4% #1:processor #2:internal #3:seeindex #4:word {\def\currentregisterpageindex{#2}% - \strc_register_injector_process \iflocation \def\currentregisterseeindex{#3}% \doifelse{\registerparameter\c!interaction}\v!text @@ -858,10 +879,9 @@ \fi} \unexpanded\def\doapplyregisterentrycommand#1#2% processor text - {\dostarttagged\t!registerentry\empty + {\dostarttagged\t!registercontent\empty \ifx\currentregisterseeindex\empty \else \dontleavehmode - \strc_register_injector_show \dosetdirectpagereference{seeindex:\currentregisterseeindex}% maybe some day we will support an area \fi \applyprocessor{#1}{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#2}}}}% @@ -876,7 +896,8 @@ \fi} \unexpanded\def\defaultregisterseeword#1#2#3#4#5#6% i n #3:processor #4:internal #5:seeindex #6:word - {%\registerpageseparator + {\registerpageseparator + \global\setconstant\c_strc_registers_page_state\plustwo \def\currentregisterpageindex{#4}% \dostarttagged\t!registersee\empty \settrue\c_strc_registers_page_done @@ -914,7 +935,7 @@ % \placeregister[index][n=1,pagecommand=\MyRegisterPageCommand] % \stoptext -\def\registerpageuserdata #1#2{\ctxcommand{registeruserdata(#1,"#2")}} +\def\registerpageuserdata #1#2{\clf_registeruserdata#1{#2}} \def\currentregisterpageuserdata {\registerpageuserdata\currentregisterpageindex} % {#1} % not yet ok : new internal handler names @@ -945,7 +966,7 @@ \def\registeronepage {\registerpagebuttonsymbol\gobblefourarguments}% \def\registerpagerange{\registerpagebuttonsymbol\gobblesevenarguments}} -\def\setregisterpagerendering +\unexpanded\def\setregisterpagerendering {\doifelse{\registerparameter\c!pagenumber}\v!no {\let \currentregisterpagesymbol\v!none} {\edef\currentregisterpagesymbol{\registerparameter\c!symbol}}% diff --git a/Master/texmf-dist/tex/context/base/strc-ren.mkiv b/Master/texmf-dist/tex/context/base/strc-ren.mkiv index fdf8fb7f4a4..34903dfa02a 100644 --- a/Master/texmf-dist/tex/context/base/strc-ren.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-ren.mkiv @@ -135,7 +135,7 @@ \unexpanded\def\strc_rendering_place_head_number_and_text {\strc_rendering_start_placement \setheadmarking - \doiftextelse\getheadnumber + \doifelsetext\getheadnumber \dosettructureheadnumbercontent \doresettructureheadnumbercontent \ifconditional\c_strc_sectioning_empty @@ -422,7 +422,7 @@ {\dodoubleargument\strc_rendering_define_placement} \def\strc_rendering_define_placement[#1][#2]% - {\doifnextbgroupelse + {\doifelsenextbgroup {\strc_rendering_define_placement_yes[#1][#2]}% {\strc_rendering_define_placement_nop[#1][#2]}} @@ -516,6 +516,11 @@ \fi \endgroup} +\def\fakedheadnumber{\vphantom{0}} % needed for mathplus + +\unexpanded\def\fakeheadnumbercontent + {\hbox to \zeropoint{\let\getheadnumber\fakedheadnumber\headnumbercontent}} + \unexpanded\def\strc_rendering_inject_number_and_text {\edef\p_command{\headparameter\c!command}% assumes \unexpanded definition \ifx\p_command\empty @@ -608,6 +613,7 @@ \hsize\headtextwidth \fi \noindent + \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered) \fi \headtextcontent } @@ -629,7 +635,7 @@ \hbox { \hfill \headnumbercontent - \doifrightpageelse{ + \doifelserightpage{ \scratchdistance\leftmargindistance } { \scratchdistance\rightmargindistance @@ -637,6 +643,8 @@ \hskip\dimexpr\d_strc_rendering_local_leftoffset+\scratchdistance\relax } } + \else + \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered) \fi \headtextcontent } @@ -650,6 +658,30 @@ % \directsetup{\??headrenderings:\v!vertical:\v!inmargin} % \stopsetups +%D This one is for head based numbering usage: foo 1.2 and so: + +\defineheadalternative + [\v!reverse] + [\c!alternative=\v!vertical, + \c!renderingsetup=\??headrenderings:\v!reverse] + +\startsetups[\??headrenderings:\v!reverse] + \vbox { + \headsetupspacing + \noindent + \begstrut + \setfalse\headisdisplay % so a kind of mix + \headtextcontent + \ifconditional\headshownumber + \kern\headnumberdistance + \headnumbercontent + \else + \fakeheadnumbercontent + \fi + \endstrut + } +\stopsetups + \defineheadalternative [\v!middle] [\c!alternative=\v!vertical, @@ -665,6 +697,8 @@ \strut \headnumbercontent \par + \else + \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered) \fi \begstrut \headtextcontent diff --git a/Master/texmf-dist/tex/context/base/strc-rsc.lua b/Master/texmf-dist/tex/context/base/strc-rsc.lua index e2105a4efc1..627e443b2ce 100644 --- a/Master/texmf-dist/tex/context/base/strc-rsc.lua +++ b/Master/texmf-dist/tex/context/base/strc-rsc.lua @@ -12,7 +12,8 @@ if not modules then modules = { } end modules ['strc-rsc'] = { -- The scanner accepts nested outer, but we don't care too much, maybe -- some day we will have both but currently the innermost wins. -local lpegmatch, lpegP, lpegS, lpegCs, lpegCt, lpegCf, lpegCc, lpegC, lpegCg = lpeg.match, lpeg.P, lpeg.S, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cc, lpeg.C, lpeg.Cg +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns +local lpegP, lpegS, lpegCs, lpegCt, lpegCf, lpegCc, lpegC, lpegCg = lpeg.P, lpeg.S, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cc, lpeg.C, lpeg.Cg local find = string.find local spaces = lpegP(" ")^0 @@ -34,18 +35,28 @@ local backslash = lpegP("\\") local endofall = spaces * lpegP(-1) -local o_token = 1 - rparent - rbrace - lparent - lbrace -- can be made more efficient -local a_token = 1 - rbrace +----- o_token = 1 - rparent - rbrace - lparent - lbrace -- can be made more efficient +----- a_token = 1 - rbrace local s_token = 1 - lparent - lbrace local i_token = 1 - lparent - lbrace - endofall local f_token = 1 - lparent - lbrace - dcolon local c_token = 1 - lparent - lbrace - tcolon +-- experimental + +local o_token = lpegpatterns.nestedparents + + (1 - rparent - lbrace) +local a_token = lpegpatterns.nestedbraces + + (1 - rbrace) +local q_token = lpegpatterns.unsingle + + lpegpatterns.undouble + local hastexcode = lpegCg(lpegCc("has_tex") * lpegCc(true)) -- cannot be made to work local component = lpegCg(lpegCc("component") * lpegCs(c_token^1)) local outer = lpegCg(lpegCc("outer") * lpegCs(f_token^1)) -local operation = lpegCg(lpegCc("operation") * lpegCs(o_token^1)) -local arguments = lpegCg(lpegCc("arguments") * lpegCs(a_token^0)) +----- operation = lpegCg(lpegCc("operation") * lpegCs(o_token^1)) +local operation = lpegCg(lpegCc("operation") * lpegCs(q_token + o_token^1)) +local arguments = lpegCg(lpegCc("arguments") * lpegCs(q_token + a_token^0)) local special = lpegCg(lpegCc("special") * lpegCs(s_token^1)) local inner = lpegCg(lpegCc("inner") * lpegCs(i_token^1)) @@ -56,9 +67,16 @@ local inner = lpegCg(lpegCc("inner") * lpegCs(i_token^1)) inner = inner * arguments special = special * lparent * (operation * arguments)^-1 * rparent -local referencesplitter = spaces * lpegCf (lpegCt("") * (component + outer)^-1 * (special + inner)^-1 * endofall, rawset) -local prefixsplitter = lpegCs(lpegP((1-scolon)^1 * scolon)) * #-scolon * lpegCs(lpegP(1)^1) -local componentsplitter = lpegCs(lpegP((1-scolon)^1)) * scolon * #-scolon * lpegCs(lpegP(1)^1) +local referencesplitter = spaces + * lpegCf (lpegCt("") * (component + outer)^-1 * (special + inner)^-1 * endofall, rawset) + +local prefixsplitter = lpegCs(lpegP((1-scolon)^1 * scolon)) + * #-scolon + * lpegCs(lpegP(1)^1) + +local componentsplitter = lpegCs(lpegP((1-scolon)^1)) + * scolon * #-scolon + * lpegCs(lpegP(1)^1) prefixsplitter = componentsplitter @@ -135,6 +153,8 @@ references.splitcomponent = splitcomponent -- inspect(splitreference([[ outer :: inner { argument } ]])) -- inspect(splitreference([[ special ( outer :: operation ) ]])) +-- inspect(splitreference([[inner(foo,bar)]])) + -- inspect(splitreference([[]])) -- inspect(splitreference([[inner]])) -- inspect(splitreference([[special(operation{argument,argument})]])) @@ -152,3 +172,14 @@ references.splitcomponent = splitcomponent -- inspect(splitreference([[outer::special()]])) -- inspect(splitreference([[outer::inner{argument}]])) -- inspect(splitreference([[special(outer::operation)]])) + +-- inspect(splitreference([[special(operation)]])) +-- inspect(splitreference([[special(operation(whatever))]])) +-- inspect(splitreference([[special(operation{argument,argument{whatever}})]])) +-- inspect(splitreference([[special(operation{argument{whatever}})]])) + +-- inspect(splitreference([[special("operation(")]])) +-- inspect(splitreference([[special("operation(whatever")]])) +-- inspect(splitreference([[special(operation{"argument,argument{whatever"})]])) +-- inspect(splitreference([[special(operation{"argument{whatever"})]])) + diff --git a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv index fc48307ec06..9f1d214cfda 100644 --- a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv @@ -65,7 +65,7 @@ \resetallstructuremarks \strc_sectionblock_get_environment\currentsectionblock \sectionblockparameter\c!before % don't move - \dostarttagged\t!division\currentsectionblock + \dostarttagged\t!division\currentsectionblock % no parents \to \everybeforesectionblock \appendtoks @@ -81,7 +81,9 @@ \def\strc_sectionblock_set[#1][#2]% used to set the default {\edef\currentsectionblock{#1}% from now on we assume a value \setupcurrentsectionblock[#2]% - \ctxcommand{setsectionblock("#1", { bookmark = "\sectionblockparameter\c!bookmark" })}} + \clf_setsectionblock{#1} + bookmark {\sectionblockparameter\c!bookmark}% + \relax} \let\currentsectionblock\empty % was \s!unknown @@ -93,7 +95,9 @@ \begingroup \edef\currentsectionblock{#1}% from now on we assume a value \setupcurrentsectionblock[#2]% - \ctxcommand{pushsectionblock("#1", { bookmark = "\sectionblockparameter\c!bookmark" })}% + \clf_pushsectionblock{#1} + bookmark {\sectionblockparameter\c!bookmark}% + \relax \csname #1true\endcsname % obsolete \setsystemmode\currentsectionblock \the\everybeforesectionblock\relax @@ -102,7 +106,7 @@ \unexpanded\def\stopsectionblock {\showmessage\m!structures2\currentsectionblock \the\everyaftersectionblock\relax - \ctxcommand{popsectionblock()}% + \clf_popsectionblock \endgroup} %D \starttyping diff --git a/Master/texmf-dist/tex/context/base/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/strc-sec.mkiv index 5adfeba1edb..f2a183601cb 100644 --- a/Master/texmf-dist/tex/context/base/strc-sec.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-sec.mkiv @@ -175,71 +175,68 @@ \setnextinternalreference \storeinternalreference\currentstructurename\nextinternalreference % \strc_sectioning_set_reference_prefix - \ctxcommand{% todo: combine with next call, adapt marks accordingly - setsectionentry{ - references = { - internal = \nextinternalreference, - block = "\currentsectionblock", - reference = "\currentstructurereference", - referenceprefix = "\currentstructurereferenceprefix", - backreference = "\currentstructurebackreference", - }, - directives = { - resetset = "\structureparameter\c!sectionresetset", - }, - metadata = { - kind = "section", - name = "\currentstructurename", - catcodes = \the\ifx\currentstructurecatcodes\empty\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi, - coding = "\currentstructurecoding", - \ifx\currentstructurecoding\s!xml - xmlroot = "\xmldocument", - \fi - \ifx\currentstructurexmlsetup\empty \else - xmlsetup = "\currentstructurexmlsetup", - \fi - \ifx\currentstructuresaveinlist\v!no - nolist = true, - \fi - \ifx\currentstructureincrementnumber\v!yes - increment = "\currentstructureincrementnumber", - \fi - }, - titledata = { % we can add mark and reference - label = \!!bs\detokenize\expandafter{\currentstructurelabel }\!!es, - title = \!!bs\detokenize\expandafter{\currentstructuretitle }\!!es, - \ifx\currentstructurebookmark\currentstructuretitle \else - bookmark = \!!bs\detokenize\expandafter{\currentstructurebookmark }\!!es, - \fi - \ifx\currentstructuremarking\currentstructuretitle \else - marking = \!!bs\detokenize\expandafter{\currentstructuremarking }\!!es, - \fi - \ifx\currentstructuresaveinlist\v!no \else - \ifx\currentstructurelist\currentstructuretitle \else - list = \!!bs\detokenize\expandafter{\currentstructurelist}\!!es, - \fi - \fi - }, - numberdata = { - % needed ? - block = "\currentsectionblock", - \ifx\currentstructureshownumber\v!no - hidenumber = true, % titles - \fi - % so far - separatorset = "\structureparameter\c!sectionseparatorset", - conversion = "\structureparameter\c!sectionconversion", % for good old times sake - conversionset = "\structureparameter\c!sectionconversionset", - starter = \!!bs\structureparameter\c!sectionstarter\!!es, - stopper = \!!bs\structureparameter\c!sectionstopper\!!es, - set = "\structureparameter\c!sectionset", - segments = "\structureparameter\c!sectionsegments", - ownnumber = "\currentstructureownnumber", - }, - userdata = \!!bs\detokenize{#3}\!!es % will be converted to table at the lua end + \clf_setsectionentry + references { + internal \nextinternalreference\space + % block {\currentsectionblock} + prefix {\currentstructurereferenceprefix} + reference {\currentstructurereference} + backreference {\currentstructurebackreference} } - }% - \xdef\currentstructurelistnumber{\ctxcommand{currentsectiontolist()}}% + directives { + resetset {\structureparameter\c!sectionresetset} + } + metadata { + kind {section} + name {\currentstructurename} + catcodes \ifx\currentstructurecatcodes\empty\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi\space + coding {\currentstructurecoding} + \ifx\currentstructurecoding\s!xml + xmlroot {\xmldocument} + \fi + \ifx\currentstructurexmlsetup\empty \else + xmlsetup {\currentstructurexmlsetup} + \fi + \ifx\currentstructuresaveinlist\v!no + nolist \space true\space + \fi + \ifx\currentstructureincrementnumber\v!yes + increment {\currentstructureincrementnumber} + \fi + } + titledata { + label {\detokenize\expandafter{\currentstructurelabel}} + title {\detokenize\expandafter{\currentstructuretitle}} + \ifx\currentstructurebookmark\currentstructuretitle \else + bookmark {\detokenize\expandafter{\currentstructurebookmark}} + \fi + \ifx\currentstructuremarking\currentstructuretitle \else + marking {\detokenize\expandafter{\currentstructuremarking}} + \fi + \ifx\currentstructuresaveinlist\v!no \else + \ifx\currentstructurelist\currentstructuretitle \else + list {\detokenize\expandafter{\currentstructurelist}} + \fi + \fi + } + numberdata { + % block {\currentsectionblock} + \ifx\currentstructureshownumber\v!no + hidenumber \space true\space + \fi + separatorset {\structureparameter\c!sectionseparatorset} + conversionset {\structureparameter\c!sectionconversionset} + conversion {\structureparameter\c!sectionconversion} + starter {\structureparameter\c!sectionstarter} + stopper {\structureparameter\c!sectionstopper} + set {\structureparameter\c!sectionset} + segments {\structureparameter\c!sectionsegments} + ownnumber {\currentstructureownnumber} + language {\currentlanguage}% for the moment, needed for bookmarks conversion + } + userdata {\detokenize{#3}}% will be converted to table at the lua end + \relax + \xdef\currentstructurelistnumber{\clf_currentsectiontolist}% % \currentstructuresynchronize has to be called someplace, since it introduces a node \setstructuresynchronization\currentstructurelistnumber \endgroup} @@ -266,16 +263,15 @@ % todo: #1 => "#1" ... adapt lua code for name and number -\def\structurenumber {\ctxcommand{structurenumber()}} -\def\structuretitle {\ctxcommand{structuretitle()}} -\def\structurevariable #1{\ctxcommand{structurevariable("#1")}} -\def\structureuservariable #1{\ctxcommand{structureuservariable("#1")}} -\def\structurecatcodedget #1{\ctxcommand{structurecatcodedget("#1")}} % bad name -\def\structuregivencatcodedget #1#2{\ctxcommand{structuregivencatcodedget("#1",\number#2)}} % bad name -\def\structureautocatcodedget #1#2{\ctxcommand{structureautocatcodedget ("#1","#2")}} - -\def\namedstructurevariable #1#2{\ctxcommand{namedstructurevariable ("#1","#2")}} -\def\namedstructureuservariable#1#2{\ctxcommand{namedstructureuservariable("#1","#2")}} +\def\structurenumber {\clf_structurenumber} +\def\structuretitle {\clf_structuretitle} +\def\structurevariable #1{\clf_structurevariable {#1}} +\def\structureuservariable #1{\clf_structureuservariable {#1}} +\def\structurecatcodedget #1{\clf_structurecatcodedget {#1}} % bad name +\def\structuregivencatcodedget #1#2{\clf_structuregivencatcodedget {#1}#2 } % bad name +\def\structureautocatcodedget #1#2{\clf_structureautocatcodedget {#1}{#2}} +\def\namedstructurevariable #1#2{\clf_namedstructurevariable {#1}{#2}} +\def\namedstructureuservariable#1#2{\clf_namedstructureuservariable{#1}{#2}} % compatibility issue: % @@ -305,18 +301,14 @@ \newconditional\c_strc_rendering_continuous % not used (mkii ?) -\def\setstructurelevel #1#2{\ctxcommand{setsectionlevel("#1","#2")}} % name, level|parent -\def\getstructurelevel #1{\ctxcommand{getcurrentsectionlevel("#1")}}% name -\def\setstructurenumber #1#2{\ctxcommand{setsectionnumber(#1,"#2")}} % level, number (+/-) -\def\getstructurenumber #1{\ctxcommand{getsectionnumber(#1)}} % level -\def\getsomestructurenumber #1#2{\ctxcommand{getsectionnumber(#1,"#2")}} % level, what -\def\getfullstructurenumber #1{\ctxcommand{getfullsectionnumber(#1)}} % level -\def\getsomefullstructurenumber#1#2{\ctxcommand{getfullsectionnumber(#1,"#2")}} -\def\getspecificstructuretitle #1{\ctxcommand{getstructuredata("#1","titledata.title",nil,"\headparameter\s!catcodes")}}% - -% will be: -% -% \def\getfullstructurenumber #1{\ctxcommand{structurenumber(\thenamedheadlevel{#1})}} +\def\setstructurelevel #1#2{\clf_setstructurelevel {#1}{#2}} % name, level|parent +\def\getstructurelevel #1{\clf_getstructurelevel {#1}} % name +\def\setstructurenumber #1#2{\clf_setstructurenumber #1{#2}} % level, number (+/-) +\def\getstructurenumber #1{\clf_getstructurenumber #1 } % level +\def\getsomestructurenumber #1#2{\clf_getsomestructurenumber #1{#2}} % level, what +\def\getfullstructurenumber #1{\clf_getfullstructurenumber #1 } % level +\def\getsomefullstructurenumber#1#2{\clf_getsomefullstructurenumber #1{#2}} % level, what +\def\getspecificstructuretitle #1{\clf_getspecificstructuretitle {#1}{\headparameter\s!catcodes}} % structure heads (like \startchapter) @@ -412,7 +404,7 @@ \definemarking[\currenthead] [\currentheadsection]% \definemarking[\currenthead\v!number][\currentheadsection]% \setupmarking [\currenthead] [\c!filtercommand=\noexpand\sectionheadmarkingtitle {\currenthead}]% - \setupmarking [\currenthead\c!number][\c!filtercommand=\noexpand\sectionheadmarkingnumber{\currenthead}]% + \setupmarking [\currenthead\v!number][\c!filtercommand=\noexpand\sectionheadmarkingnumber{\currenthead}]% }% \doifelselist\currenthead\donothing {\definelist[\currenthead][\c!prefix=\v!no]}% @@ -430,23 +422,30 @@ \the\everysetuphead \to \everydefinehead +\newtoks\everyredefinehead + \appendtoks - \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}% + \the\everyredefinehead \to \everydefinehead +\appendtoks + \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}% +\to \everyredefinehead + \appendtoks % beware, this is a global register \begingroup \edef\currentsectionheadcoupling{\sectionheadcoupling\currenthead}% \edef\currentsectionheadsection {\sectionheadsection \currentsectionheadcoupling}% \edef\currentsectionlevel {\sectionlevel \currentsectionheadsection}% - \ctxcommand{registersection("\currenthead",{ - coupling = "\currentsectionheadcoupling", - section = "\currentsectionheadsection", - level = \currentsectionlevel, - })}% + \clf_registersection {\currenthead} { + coupling {\currentsectionheadcoupling} + section {\currentsectionheadsection} + level \currentsectionlevel + parent {\currentheadparent} + }% \endgroup -\to \everydefinehead +\to \everyredefinehead \appendtoks % \setevalue{\e!next \currenthead}{\donexthead [\currenthead]}% @@ -460,6 +459,15 @@ {\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}% \to \everysetuphead +\unexpanded\def\doredefinehead#1#2% called at lua end + {\pushmacro\currenthead + \pushmacro\currentheadparent + \edef\currenthead{#1}% + \edef\currentheadparent{#2}% + \the\everyredefinehead\relax + \popmacro\currentheadparent + \popmacro\currenthead} + \let\currentnamedsection\empty \unexpanded\def\startnamedsection @@ -583,8 +591,8 @@ % head -> head -\def\sectionheadmarkingtitle #1#2{\ctxcommand{markingtitle("#1","#2")}} -\def\sectionheadmarkingnumber#1#2{\ctxcommand{markingnumber("#1","#2")}} +\def\sectionheadmarkingtitle #1#2{\clf_markingtitle {#1}{#2}} +\def\sectionheadmarkingnumber#1#2{\clf_markingnumber{#1}{#2}} \def\sectionheadcoupling#1{\namedheadparameter{#1}\c!coupling} \def\sectionheadsection #1{\namedheadparameter{#1}\c!section} @@ -608,7 +616,7 @@ \unexpanded\def\strc_sectioning_handle_nop_indeed[#1][#2]% for taco: [key=value] variant {\setfalse\currentstructureown \triggerautostructurelevel - \doifassignmentelse{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}} + \doifelseassignment{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}} \unexpanded\def\strc_sectioning_handle_nop_indeed_yes#1#2% {\strc_sectioning_handle{#1}{#2}{}} @@ -768,7 +776,7 @@ \unexpanded\def\placeheadtext {\dosingleempty\strc_sectioning_place_head_text } % use with care \unexpanded\def\placeheadnumber{\dosingleempty\strc_sectioning_place_head_number} % use with care -\unexpanded\def\strc_sectioning_report{\ctxcommand{reportstructure()}} +\unexpanded\def\strc_sectioning_report{\clf_reportstructure} \ifdefined\strc_rendering_initialize_style_and_color \else @@ -990,15 +998,19 @@ \hskip\s_strc_sectioniong_continuous_signal\relax \fi} +% \let\dotagsectionlevel\relax + \def\strc_sectioning_before_yes {\strc_sectioning_check_before\strc_sectioning_handle_page_yes \headparameter\c!inbetween - \dostarttagged\t!section\currenthead} + \dostarttaggedchained\t!section\currenthead\??head +% \dotagsectionlevel + } \def\strc_sectioning_before_nop {\strc_sectioning_check_before\strc_sectioning_handle_page_nop \headparameter\c!inbetween - \dostarttagged\currenthead\empty} + \dostarttagged\currenthead\empty} % this is a weird one .. needs checking \def\strc_sectioning_empty_correction {\ifconditional\c_strc_sectioning_empty @@ -1045,8 +1057,8 @@ #1% \fi} -\def\currentsectioncountervalue {\ctxcommand{depthnumber(\thenamedheadlevel\currenthead)}} -\def\previoussectioncountervalue{\ctxcommand{depthnumber(\thenamedheadlevel\currenthead-1)}} +\def\currentsectioncountervalue {\clf_depthnumber\numexpr\thenamedheadlevel\currenthead\relax} +\def\previoussectioncountervalue{\clf_depthnumber\numexpr\thenamedheadlevel\currenthead+\minusone\relax} \def\strc_sectioning_handle_page_nop {\edef\p_continue{\headparameter\c!continue}% @@ -1101,7 +1113,7 @@ {\dodoubleargument\strc_sectioning_setup_number} \def\strc_sectioning_setup_number[#1][#2]% todo: reset if at other level - {\setstructurenumber{\thenamedheadlevel{#1}}{#2}} + {\setstructurenumber{\thenamedheadlevel{#1}}{\number#2}} \def\currentheadnumber{0} % ==> \currentheadnumber @@ -1148,7 +1160,7 @@ \unexpanded\def\strc_sectioning_initialize_autolevel {\ifconditional\c_strc_sectioning_auto_levels - \ctxcommand{autonextstructurelevel(\number\currentheadlevel)}% + \clf_autonextstructurelevel\currentheadlevel\relax \global\setfalse\c_strc_sectioning_auto_levels \fi} @@ -1156,7 +1168,7 @@ {\global\settrue\c_strc_sectioning_auto_levels} \unexpanded\def\finalizeautostructurelevels - {\ctxcommand{autofinishstructurelevels()}} + {\clf_autofinishstructurelevels} \unexpanded\def\finalizeautostructurelevel {\dostoptagged diff --git a/Master/texmf-dist/tex/context/base/strc-syn.lua b/Master/texmf-dist/tex/context/base/strc-syn.lua index 604365b2d0c..5f3557a6958 100644 --- a/Master/texmf-dist/tex/context/base/strc-syn.lua +++ b/Master/texmf-dist/tex/context/base/strc-syn.lua @@ -7,12 +7,12 @@ if not modules then modules = { } end modules ['strc-syn'] = { } local next, type = next, type -local format = string.format -local allocate = utilities.storage.allocate - --- interface to tex end local context = context +local implement = interfaces.implement + +local allocate = utilities.storage.allocate + local sorters = sorters local structures = structures @@ -44,77 +44,129 @@ job.register('structures.synonyms.collected', tobesaved, initializer, finalizer) -- todo: allocate becomes metatable -local function allocate(class) - local d = tobesaved[class] - if not d then - d = { - metadata = { - language = 'en', - sorted = false, - class = class - }, - entries = { - }, - hash = { - } +table.setmetatableindex(tobesaved,function(t,k) + local v = { + metadata = { + language = 'en', + sorted = false, + class = v + }, + entries = { + }, + hash = { } - tobesaved[class] = d - end - return d -end + } + t[k] = v + return v +end) function synonyms.define(class,kind) - local data = allocate(class) + local data = tobesaved[class] data.metadata.kind = kind end function synonyms.register(class,kind,spec) - local data = allocate(class) + local data = tobesaved[class] + local hash = data.hash + local definition = spec.definition + local tag = definition.tag or "" data.metadata.kind = kind -- runtime, not saved in format (yet) - if not data.hash[spec.definition.tag or ""] then - data.entries[#data.entries+1] = spec - data.hash[spec.definition.tag or ""] = spec + if not hash[tag] then + if definition.used == nil then + definition.used = false + end + if definition.shown == nil then + definition.shown = false + end + local entries = data.entries + entries[#entries+1] = spec + hash[tag] = spec end end function synonyms.registerused(class,tag) - local data = allocate(class) - local dht = data.hash[tag] - if dht then - dht.definition.used = true + local data = tobesaved[class] + local okay = data.hash[tag] + if okay then + local definition = okay.definition + definition.used = true + definition.list = true + end +end + +function synonyms.registershown(class,tag) + local data = tobesaved[class] + local okay = data.hash[tag] + if okay then + local definition = okay.definition + definition.shown = true + definition.list = true + end +end + +function synonyms.isused(class,tag) + local data = tobesaved[class] + local okay = data.hash[tag] + return okay and okay.definition.used +end + +function synonyms.isshown(class,tag) + local data = tobesaved[class] + local okay = data.hash[tag] + return okay and okay.definition.shown +end + +function synonyms.resetused(class) + for tag, data in next, tobesaved[class].hash do + data.definition.used = false + end +end + +function synonyms.resetshown(class) + for tag, data in next, tobesaved[class].hash do + data.definition.shown = false end end function synonyms.synonym(class,tag) - local data = allocate(class).hash - local d = data[tag] - if d then - local de = d.definition - de.used = true - context(de.synonym) + local data = tobesaved[class] + local okay = data.hash[tag] + if okay then + local definition = okay.definition + definition.used = true + definition.list = true + context(definition.synonym) end end function synonyms.meaning(class,tag) - local data = allocate(class).hash - local d = data[tag] - if d then - local de = d.definition - de.used = true - context(de.meaning) + local data = tobesaved[class] + local okay = data.hash[tag] + if okay then + local definition = okay.definition + definition.shown = true + definition.list = true + context(definition.meaning) end end synonyms.compare = sorters.comparers.basic -- (a,b) function synonyms.filter(data,options) - local result = { } + local result = { } local entries = data.entries - local all = options and options.criterium == interfaces.variables.all - for i=1,#entries do - local entry = entries[i] - if all or entry.definition.used then - result[#result+1] = entry + local all = options and options.criterium == interfaces.variables.all + if all then + for i=1,#entries do + result[i] = entries[i] + end + else + for i=1,#entries do + local entry = entries[i] + local definition = entry.definition + if definition.list then + result[#result+1] = entry + end end end data.result = result @@ -124,12 +176,12 @@ function synonyms.prepare(data) local result = data.result if result then for i=1, #result do - local r = result[i] - local rd = r.definition - if rd then - local rt = rd.tag - local sortkey = rt and rt ~= "" and rt or rd.synonym - r.split = splitter(strip(sortkey)) + local entry = result[i] + local definition = entry.definition + if definition then + local tag = definition.tag + local key = tag ~= "" and tag or definition.synonym + entry.split = splitter(strip(key)) end end end @@ -137,25 +189,31 @@ end function synonyms.sort(data,options) sorters.sort(data.result,synonyms.compare) + data.metadata.sorted = true end -function synonyms.finalize(data,options) - local result = data.result - data.metadata.nofsorted = #result - local split = { } +function synonyms.finalize(data,options) -- mostly the same as registers so we will generalize it: sorters.split + local result = data.result + local split = { } + local nofsplit = 0 + local lasttag = nil + local lasttag = nil + local nofdone = 0 for k=1,#result do - local v = result[k] - local entry, tag = firstofsplit(v) - local s = split[entry] -- keeps track of change - local d - if not s then - d = { } - s = { tag = tag, data = d } - split[entry] = s - else - d = s.data + local entry = result[k] + local first, tag = firstofsplit(entry) + if tag ~= lasttag then + -- if trace_registers then + -- report_registers("splitting at %a",tag) + -- end + done = { } + nofdone = 0 + nofsplit = nofsplit + 1 + lasttag = tag + split[nofsplit] = { tag = tag, data = done } end - d[#d+1] = v + nofdone = nofdone + 1 + done[nofdone] = entry end data.result = split end @@ -166,27 +224,25 @@ end local ctx_synonymentry = context.synonymentry function synonyms.flush(data,options) - local kind = data.metadata.kind -- hack, will be done better local result = data.result - local sorted = table.sortedkeys(result) - for k=1,#sorted do - local letter = sorted[k] - local sublist = result[letter] - local data = sublist.data + for i=1,#result do + local sublist = result[i] + local letter = sublist.tag + local data = sublist.data for d=1,#data do local entry = data[d].definition ctx_synonymentry(d,entry.tag,entry.synonym,entry.meaning or "") end end - data.result = nil + data.result = nil data.metadata.sorted = false end function synonyms.analyzed(class,options) - local data = synonyms.collected[class] + local data = collected[class] if data and data.entries then options = options or { } - sorters.setlanguage(options.language) + sorters.setlanguage(options.language,options.method) synonyms.filter(data,options) -- filters entries to result synonyms.prepare(data,options) -- adds split table parallel to list table synonyms.sort(data,options) -- sorts entries in result @@ -198,12 +254,65 @@ end function synonyms.process(class,options) if synonyms.analyzed(class,options) then - synonyms.flush(synonyms.collected[class],options) + synonyms.flush(collected[class],options) end end -commands.registersynonym = synonyms.register -commands.registerusedsynonym = synonyms.registerused -commands.synonymmeaning = synonyms.meaning -commands.synonymname = synonyms.synonym -commands.processsynonyms = synonyms.process +-- 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 = "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" } +} + +implement { + name = "doifelsesynonymshown", + actions = { synonyms.isshown, commands.doifelse }, + arguments = { "string", "string" } +} + +implement { + name = "registersynonym", + actions = synonyms.register, + arguments = { + "string", + "string", + { + { "metadata", { + { "catcodes", "integer" }, + { "coding" }, + { "xmlroot" } + } + }, + { + "definition", { + { "tag" }, + { "synonym" }, + { "meaning" }, + { "used", "boolean" } + } + } + } + } +} + +implement { + name = "processsynonyms", + actions = synonyms.process, + arguments = { + "string", + { + { "criterium" }, + { "language" }, + { "method" } + } + } +} diff --git a/Master/texmf-dist/tex/context/base/strc-syn.mkiv b/Master/texmf-dist/tex/context/base/strc-syn.mkiv index 73aca18e601..0c132a602f0 100644 --- a/Master/texmf-dist/tex/context/base/strc-syn.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-syn.mkiv @@ -15,6 +15,93 @@ \registerctxluafile{strc-syn}{1.001} +%D Although we could nowadays build this on top of regular lists we keep this +%D more efficient variant around. Eventually we can add some options to lists +%D that also provide such functionality but at the cost of much more overhead. +%D +%D We show a usage of both synonyms and sorts, which are deep down variants of +%D so called simple lists. A definition looks like this: +%D +%D \startbuffer +%D \definesynonyms +%D [myabbreviation] +%D +%D \setupsynonyms +%D [myabbreviation] +%D [headstyle=bold, +%D headcolor=darkred, +%D synonymstyle=boldslanted, +%D synonymcolor=darkblue, +%D textstyle=slanted, +%D textcolor=darkgreen, +%D style=normal, +%D color=darkyellow] +%D +%D \definesorting +%D [mylogo] +%D +%D \setupsorting +%D [mylogo] +%D [style=bold, +%D color=darkmagenta] +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D More complex definitions involves commands to call up meanings and such. The +%D use of the defined commands is as follows: \ +%D +%D \startbuffer +%D \myabbreviation [FIRST] {TheFirst} {The First Words} +%D \myabbreviation [SECOND] {TheSecond} {The Second Words} +%D \myabbreviation [THIRD] {TheThird} {The Third Words} +%D +%D \mylogo [FOURTH] {TheFourth} +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D By default a synonym is just typeset and flagges as being used, so that in +%D a list it wil be shows with its meaning. You can however also expand the +%D meaning automatically at first use: +%D +%D \startbuffer +%D \setupsynonyms[myabbreviation][alternative=first] +%D +%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH. +%D +%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH. +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D We can change the order, as demonstrated in: +%D +%D \startbuffer +%D \resetshownsynonyms[myabbreviation] +%D +%D \setupsynonyms[myabbreviation][alternative=last] +%D +%D We have \FIRST\ and \THIRD\ or \FOURTH. +%D +%D We have \FIRST\ and \THIRD\ or \FOURTH. +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D A list is called up with: +%D +%D \startbuffer +%D \placelistofsynonyms[myabbreviation] +%D +%D \placelistofsorts[mylogo] +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D The lists are constructions (like descriptions are) and can be set up +%D likewise. + % todo: add 'define only' option to descriptions, then add sorting (also based on key) % and call to definition -> replaces this module @@ -22,7 +109,7 @@ % split but common in lua -\def\preprocessexpansion#1#2#3#4% +\def\preprocessexpansion#1#2#3#4% do this at the lua end if still needed {\ifx#1\s!xml \xmlstartraw \xdef#2{#4}% @@ -100,6 +187,7 @@ \setuvalue{\??constructioninitializer\v!simplelist}% {\let\currentsimplelist \currentconstruction \let\constructionparameter \simplelistparameter + \let\constructionnamespace \??simplelist \let\detokenizedconstructionparameter\detokenizedsimplelistparameter \let\letconstructionparameter \letsimplelistparameter \let\useconstructionstyleandcolor \usesimpleliststyleandcolor @@ -175,7 +263,7 @@ % \presetheadtext[#2=\Word{#2}]% changes the \if...argument % - \setvalue{\e!setup #2\e!endsetup}{\setupsynonym[#1]}% obsolete definition + \setvalue{\e!setup #2\e!endsetup}{\setupsynonyms[#1]}% obsolete definition \setvalue{\e!place \e!listof#2}{\placelistofsynonyms[#1]}% accepts extra argument \setvalue{\e!complete\e!listof#2}{\completelistofsynonyms[#1]}} @@ -194,21 +282,27 @@ % todo: error message \else \edef\currentsynonymexpansion{\simplelistparameter\c!expansion}% - \preprocessexpansion\currentsynonymexpansion\currentsynonymtext \currentsynonymcoding{#4}% - \preprocessexpansion\currentsynonymexpansion\currentsynonymmeaning\currentsynonymcoding{#5}% - \ctxcommand{registersynonym("\currentsynonym", "synonym", { - metadata = { - catcodes = \the\catcodetable, - coding = "\currentsynonymcoding", - xmlroot = \ifx\currentsynonymcoding\s!xml "\xmldocument" \else nil \fi, - }, - definition = { - tag = "\currentsynonymtag", - synonym = \!!bs\currentsynonymtext\!!es, - meaning = \!!bs\currentsynonymmeaning\!!es, - used = false, - } - })}% + \preprocessexpansion\currentsynonymexpansion\m_synonyms_text \currentsynonymcoding{#4}% + \preprocessexpansion\currentsynonymexpansion\m_synonyms_meaning\currentsynonymcoding{#5}% + \clf_registersynonym + {\currentsynonym}% + {synonym}% + {% + metadata {% + catcodes \catcodetable + coding {\currentsynonymcoding}% + \ifx\currentsynonymcoding\s!xml + xmlroot {\xmldocument}% + \fi + }% + definition {% + tag {\currentsynonymtag}% + synonym {\m_synonyms_text}% + meaning {\m_synonyms_meaning}% + % used false + }% + }% + \relax \doif{#1}\v!yes{\setuxvalue\currentsynonymtag{\strc_synonyms_insert{\currentsynonym}{\currentsynonymtag}}}% \fi \endgroup} @@ -217,43 +311,120 @@ {\dodoubleargument\strc_synonyms_register} \def\strc_synonyms_register[#1][#2]% - {\ctxcommand{registerusedsynonym("#1","#2")}} + {\clf_registerusedsynonym{#1}{#2}} + +\unexpanded\def\currentsynonymname {\clf_synonymname {\currentsimplelist}{\currentsynonymtag}} +\unexpanded\def\currentsynonymmeaning {\clf_synonymmeaning {\currentsimplelist}{\currentsynonymtag}} +\unexpanded\def\doifelsecurrentsynonymused {\clf_doifelsesynonymused {\currentsimplelist}{\currentsynonymtag}} +\unexpanded\def\doifelsecurrentsynonymshown{\clf_doifelsesynonymshown{\currentsimplelist}{\currentsynonymtag}} +\unexpanded\def\resetusedsynonyms [#1]{\clf_resetusedsynonyms {#1}} +\unexpanded\def\resetshownsynonyms [#1]{\clf_resetshownsynonyms {#1}} + +\installcorenamespace{simplelistalternative} % specific ways of rendering a list +\installcorenamespace{simplelistrenderings} % a namespace for setups (rather local) + +\installcommandhandler \??simplelistalternative {simplelistalternative} \??simplelistalternative + +\setupsimplelist + [\v!synonym] + [\c!alternative=\v!normal] \unexpanded\def\strc_synonyms_insert_meaning#1#2% name tag {\begingroup \def\currentsimplelist{#1}% - \usesimpleliststyleandcolor\c!textstyle\c!textcolor - \simplelistparameter\c!textcommand{\ctxcommand{synonymmeaning("#1","#2")}}% + \fastsetup{\??simplelistrenderings:\v!text}% \endgroup} \unexpanded\def\strc_synonyms_insert#1#2% name tag {\begingroup \edef\currentsimplelist{#1}% - \let\currentsynonym\currentsimplelist % for a while - \def\currentsynonymtag{#2}% - \dostarttagged\t!synonym\currentsynonym - \dotagsynonym - \usesimpleliststyleandcolor\c!synonymstyle\c!synonymcolor - \simplelistparameter\c!synonymcommand{\ctxcommand{synonymname("#1","#2")}}% - \dostoptagged + \let \currentsynonym\currentsimplelist % for a while + \def \currentsynonymtag{#2}% + \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}% + \fastsetup{\??simplelistrenderings:\v!synonym:\currentsimplelistalternative}% \normalexpanded{\endgroup\simplelistparameter\c!next}} +% \setupsimplelistalternative +% [\c!command=\strictsimplelistparameter\c!command] + +\definesimplelistalternative + [\v!normal] + [\c!inbetween=\space, + \c!left=(, + \c!right=)] + +\definesimplelistalternative + [\v!first] + [\v!normal] + +\definesimplelistalternative + [\v!last] + [\v!normal] + +\startsetups[\??simplelistrenderings::\v!synonym] + \begingroup + \dostarttaggedchained\t!synonym\currentsynonym\??simplelist + \dotagsynonym + \usesimpleliststyleandcolor\c!synonymstyle\c!synonymcolor + \simplelistparameter\c!synonymcommand{\currentsynonymname}% + \dostoptagged + \endgroup +\stopsetups + +\startsetups[\??simplelistrenderings::\v!text] + \begingroup + \usesimpleliststyleandcolor\c!textstyle\c!textcolor + \simplelistparameter\c!textcommand{\currentsynonymmeaning}% + \endgroup +\stopsetups + +\startsetups[\??simplelistrenderings:\v!synonym:\v!normal] + \fastsetup{\??simplelistrenderings::\v!synonym} +\stopsetups + +\startsetups[\??simplelistrenderings:\v!synonym:\v!first] + \fastsetup{\??simplelistrenderings::\v!synonym} + \doifelsecurrentsynonymshown \donothing { + \simplelistalternativeparameter\c!inbetween + \simplelistalternativeparameter\c!left + \fastsetup{\??simplelistrenderings::\v!text} + \simplelistalternativeparameter\c!right + } +\stopsetups + +\startsetups[\??simplelistrenderings:\v!synonym:\v!last] + \doifelsecurrentsynonymshown { + \fastsetup{\??simplelistrenderings::\v!synonym} + } { + \fastsetup{\??simplelistrenderings::\v!text} + \simplelistalternativeparameter\c!inbetween + \simplelistalternativeparameter\c!left + \fastsetup{\??simplelistrenderings::\v!synonym} + \simplelistalternativeparameter\c!right + } +\stopsetups + \unexpanded\def\placelistofsynonyms {\dodoubleempty\strc_synonyms_place_list} \def\strc_synonyms_place_list[#1][#2]% {\begingroup \edef\currentsimplelist{#1}% - \strc_constructions_initialize{#1}% - \setupcurrentsimplelist[#2]% - \let\synonymentry\strc_synonym_normal - \startpacked - \ctxcommand{processsynonyms('#1',{ - criterium = "\simplelistparameter\c!criterium", - language = "\simplelistparameter\s!language", - method = "\simplelistparameter\c!method", - })}% - \stoppacked + \doifelsecommandhandler\??simplelist\currentsimplelist + {\strc_constructions_initialize{#1}% + \setupcurrentsimplelist[#2]% + \let\synonymentry\strc_synonym_normal + \startpacked + \clf_processsynonyms + {#1}% + {% + criterium {\simplelistparameter\c!criterium}% + language {\simplelistparameter\s!language}% + method {\simplelistparameter\c!method}% + }% + \relax + \stoppacked}% + {}% todo: message that invalid \endgroup} \def\completelistofsynonyms @@ -262,10 +433,12 @@ \def\strc_synonyms_complete_list[#1][#2]% {\begingroup \edef\currentsimplelist{#1}% - \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}% - \strc_synonyms_place_list[#1][#2]% - \page - \stopnamedsection + \doifelsecommandhandler\??simplelist\currentsimplelist + {\normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}% + \strc_synonyms_place_list[#1][#2]% + \page + \stopnamedsection}% + {}% todo: message that invalid \endgroup} \unexpanded\def\strc_synonym_normal#1#2#3#4% @@ -337,40 +510,65 @@ \else \edef\currentsortingexpansion{\simplelistparameter\c!expansion}% \preprocessexpansion\currentsortingexpansion\currentsortingtext\currentsortingcoding{#4}% - \ctxcommand{registersynonym("\currentsorting", "sorting", { - metadata = { - catcodes = \the\catcodetable, - coding = "\currentsortingcoding", - xmlroot = \ifx\currentsortingcoding\s!xml "\xmldocument" \else nil \fi, - }, - definition = { - tag = "\currentsortingtag", - synonym = \!!bs\currentsortingtext\!!es, - % used = false, - } - })}% + \clf_registersynonym + {\currentsorting}% + {sorting}% + {% + metadata {% + catcodes \catcodetable + coding {\currentsortingcoding}% + \ifx\currentsortingcoding\s!xml + xmlroot {\xmldocument}% + \fi + }% + definition {% + tag {\currentsortingtag}% + synonym {\currentsortingtext}% + % used false + }% + }% + \relax \doif{#1}\v!yes{\setuxvalue\currentsortingtag{\strc_sorting_insert{\currentsorting}{\currentsortingtag}}}% \fi \endgroup} +\unexpanded\def\currentsortingname {\clf_synonymname {\currentsimplelist}{\currentsortingtag}} +\unexpanded\def\doifelsecurrentsortingused {\clf_doifelsesynonymused {\currentsimplelist}{\currentsortingtag}} +\unexpanded\def\resetusedsortings [#1]{\clf_resetusedsynonyms {#1}} + +\setupsimplelist + [\v!sorting] + [\c!alternative=\v!normal] + \unexpanded\def\strc_sorting_insert#1#2% name tag {\begingroup % no kap currently, of .. we need to map cap onto WORD \edef\currentsorting{#1}% - \def\currentsortingtag{#2}% - \let\currentsimplelist\currentsorting - \dostarttagged\t!sorting\currentsorting - \dotagsorting - \usesimpleliststyleandcolor\c!style\c!color - \ctxcommand{synonymname("#1","#2")}% - \dostoptagged + \def \currentsortingtag{#2}% + \let \currentsimplelist\currentsorting + \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}% + \fastsetup{\??simplelistrenderings:\v!sorting:\currentsimplelistalternative}% \normalexpanded{\endgroup\simplelistparameter\c!next}} +\startsetups [\??simplelistrenderings:\v!sorting:\v!normal] + \fastsetup{\??simplelistrenderings::\v!sorting}% +\stopsetups + +\startsetups [\??simplelistrenderings::\v!sorting] + \begingroup + \dostarttaggedchained\t!sorting\currentsorting\??simplelist + \dotagsorting + \usesimpleliststyleandcolor\c!style\c!color + \currentsortingname + \dostoptagged + \endgroup +\stopsetups + \unexpanded\def\registersort {\dodoubleargument\strc_sorting_register} \def\strc_sorting_register[#1][#2]% - {\ctxcommand{registerusedsynonym("#1","#2")}} + {\clf_registerusedsynonym{#1}{#2}} % before after % @@ -391,11 +589,14 @@ \let\synonymentry\strc_sorting_command \fi \startpacked - \ctxcommand{processsynonyms('#1',{ - criterium = "\simplelistparameter\c!criterium", - language = "\simplelistparameter\s!language", - method = "\simplelistparameter\c!method", - })}% + \clf_processsynonyms + {#1}% + {% + criterium {\simplelistparameter\c!criterium}% + language {\simplelistparameter\s!language}% + method {\simplelistparameter\c!method}% + }% + \relax \stoppacked \endgroup} @@ -423,6 +624,15 @@ %D Presets. +% To be considered: +% +% \setupsimplelist +% [\v!sorting] +% [\c!headstyle=\simplelistparameter\c!synonymstyle, +% \c!headcolor=\simplelistparameter\c!synonymcolor, +% \c!style=\simplelistparameter\c!textstyle, +% \c!color=\simplelistparameter\c!textcolor] + \definesynonyms [\v!abbreviation] [\v!abbreviations] diff --git a/Master/texmf-dist/tex/context/base/strc-tag.lua b/Master/texmf-dist/tex/context/base/strc-tag.lua index 7e5c6f99377..637d74e8c08 100644 --- a/Master/texmf-dist/tex/context/base/strc-tag.lua +++ b/Master/texmf-dist/tex/context/base/strc-tag.lua @@ -6,189 +6,219 @@ if not modules then modules = { } end modules ['strc-tag'] = { license = "see context related readme files" } --- This is rather experimental code. +-- This is rather experimental code. Tagging happens on the fly and there are two analysers +-- involved: the pdf backend tagger and the exporter. They share data but there are subtle +-- differences. Each tag carries a specification and these can be accessed by attribute (the +-- end of the chain tag) or by so called fullname which is a tagname combined with a number. +local type, next = type, next local insert, remove, unpack, concat = table.insert, table.remove, table.unpack, table.concat -local gsub, find, topattern, format = string.gsub, string.find, string.topattern, string.format -local lpegmatch = lpeg.match +local find, topattern, format = string.find, string.topattern, string.format +local lpegmatch, P, S, C, Cc = lpeg.match, lpeg.P, lpeg.S, lpeg.C, lpeg.Cc local texattribute = tex.attribute local allocate = utilities.storage.allocate local settings_to_hash = utilities.parsers.settings_to_hash +local setmetatableindex = table.setmetatableindex local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end) local report_tags = logs.reporter("structure","tags") -local attributes, structures = attributes, structures +local attributes = attributes +local structures = structures +local implement = interfaces.implement local a_tagged = attributes.private('tagged') local unsetvalue = attributes.unsetvalue local codeinjections = backends.codeinjections -local taglist = allocate() -local properties = allocate() -local labels = allocate() -local stack = { } -local chain = { } -local ids = { } -local enabled = false -local tagdata = { } -- used in export -local tagmetadata = { } -- used in export - -local tags = structures.tags -tags.taglist = taglist -- can best be hidden -tags.labels = labels -tags.data = tagdata -tags.metadata = tagmetadata - -local properties = allocate { - - document = { pdf = "Div", nature = "display" }, - - division = { pdf = "Div", nature = "display" }, - paragraph = { pdf = "P", nature = "mixed" }, - p = { pdf = "P", nature = "mixed" }, - construct = { pdf = "Span", nature = "inline" }, - highlight = { pdf = "Span", nature = "inline" }, - - section = { pdf = "Sect", nature = "display" }, - sectiontitle = { pdf = "H", nature = "mixed" }, - sectionnumber = { pdf = "H", nature = "mixed" }, - sectioncontent = { pdf = "Div", nature = "display" }, - - itemgroup = { pdf = "L", nature = "display" }, - item = { pdf = "Li", nature = "display" }, - itemtag = { pdf = "Lbl", nature = "mixed" }, - itemcontent = { pdf = "LBody", nature = "mixed" }, - - description = { pdf = "Div", nature = "display" }, - descriptiontag = { pdf = "Div", nature = "mixed" }, - descriptioncontent = { pdf = "Div", nature = "mixed" }, - descriptionsymbol = { pdf = "Span", nature = "inline" }, -- note reference - - verbatimblock = { pdf = "Code", nature = "display" }, - verbatimlines = { pdf = "Code", nature = "display" }, - verbatimline = { pdf = "Code", nature = "mixed" }, - verbatim = { pdf = "Code", nature = "inline" }, - - lines = { pdf = "Code", nature = "display" }, - line = { pdf = "Code", nature = "mixed" }, - - synonym = { pdf = "Span", nature = "inline" }, - sorting = { pdf = "Span", nature = "inline" }, - - register = { pdf = "Div", nature = "display" }, - registersection = { pdf = "Div", nature = "display" }, - registertag = { pdf = "Span", nature = "mixed" }, - registerentries = { pdf = "Div", nature = "display" }, - registerentry = { pdf = "Span", nature = "mixed" }, - registersee = { pdf = "Span", nature = "mixed" }, - registerpages = { pdf = "Span", nature = "mixed" }, - registerpage = { pdf = "Span", nature = "inline" }, - registerpagerange = { pdf = "Span", nature = "mixed" }, - - table = { pdf = "Table", nature = "display" }, - tablerow = { pdf = "TR", nature = "display" }, - tablecell = { pdf = "TD", nature = "mixed" }, - - tabulate = { pdf = "Table", nature = "display" }, - tabulaterow = { pdf = "TR", nature = "display" }, - tabulatecell = { pdf = "TD", nature = "mixed" }, - - list = { pdf = "TOC", nature = "display" }, - listitem = { pdf = "TOCI", nature = "display" }, - listtag = { pdf = "Lbl", nature = "mixed" }, - listcontent = { pdf = "P", nature = "mixed" }, - listdata = { pdf = "P", nature = "mixed" }, - listpage = { pdf = "Reference", nature = "mixed" }, - - delimitedblock = { pdf = "BlockQuote", nature = "display" }, - delimited = { pdf = "Quote", nature = "inline" }, - subsentence = { pdf = "Span", nature = "inline" }, - - label = { pdf = "Span", nature = "mixed" }, - number = { pdf = "Span", nature = "mixed" }, - - float = { pdf = "Div", nature = "display" }, -- Figure - floatcaption = { pdf = "Caption", nature = "mixed" }, - floatlabel = { pdf = "Span", nature = "inline" }, - floatnumber = { pdf = "Span", nature = "inline" }, - floattext = { pdf = "Span", nature = "mixed" }, - floatcontent = { pdf = "P", nature = "mixed" }, - - image = { pdf = "P", nature = "mixed" }, - mpgraphic = { pdf = "P", nature = "mixed" }, - - formulaset = { pdf = "Div", nature = "display" }, - formula = { pdf = "Div", nature = "display" }, -- Formula - formulacaption = { pdf = "Span", nature = "mixed" }, - formulalabel = { pdf = "Span", nature = "mixed" }, - formulanumber = { pdf = "Span", nature = "mixed" }, - formulacontent = { pdf = "P", nature = "display" }, - subformula = { pdf = "Div", nature = "display" }, - - link = { pdf = "Link", nature = "inline" }, - - margintextblock = { pdf = "Span", nature = "inline" }, - margintext = { pdf = "Span", nature = "inline" }, - - math = { pdf = "Div", nature = "inline" }, -- no display - mn = { pdf = "Span", nature = "mixed" }, - mi = { pdf = "Span", nature = "mixed" }, - mo = { pdf = "Span", nature = "mixed" }, - ms = { pdf = "Span", nature = "mixed" }, - mrow = { pdf = "Span", nature = "display" }, - msubsup = { pdf = "Span", nature = "display" }, - msub = { pdf = "Span", nature = "display" }, - msup = { pdf = "Span", nature = "display" }, - merror = { pdf = "Span", nature = "mixed" }, - munderover = { pdf = "Span", nature = "display" }, - munder = { pdf = "Span", nature = "display" }, - mover = { pdf = "Span", nature = "display" }, - mtext = { pdf = "Span", nature = "mixed" }, - mfrac = { pdf = "Span", nature = "display" }, - mroot = { pdf = "Span", nature = "display" }, - msqrt = { pdf = "Span", nature = "display" }, - mfenced = { pdf = "Span", nature = "display" }, - maction = { pdf = "Span", nature = "display" }, - - mtable = { pdf = "Table", nature = "display" }, -- might change - mtr = { pdf = "TR", nature = "display" }, -- might change - mtd = { pdf = "TD", nature = "display" }, -- might change - - ignore = { pdf = "Span", nature = "mixed" }, - metadata = { pdf = "Div", nature = "display" }, - metavariable = { pdf = "Span", nature = "mixed" }, - - mid = { pdf = "Span", nature = "inline" }, - sub = { pdf = "Span", nature = "inline" }, - sup = { pdf = "Span", nature = "inline" }, - subsup = { pdf = "Span", nature = "inline" }, - - combination = { pdf = "Span", nature = "display" }, - combinationpair = { pdf = "Span", nature = "display" }, - combinationcontent = { pdf = "Span", nature = "mixed" }, - combinationcaption = { pdf = "Span", nature = "mixed" }, +local taglist = allocate() -- access by attribute +local specifications = allocate() -- access by fulltag +local labels = allocate() +local stack = { } +local chain = { } +local ids = { } +local enabled = false +local tagcontext = { } +local tagpatterns = { } +local lasttags = { } +local stacksize = 0 +local metadata = nil -- applied to the next element + +local tags = structures.tags +tags.taglist = taglist -- can best be hidden +tags.labels = labels +tags.patterns = tagpatterns +tags.specifications = specifications + +-- Tags are internally stored as: +-- +-- tag>number tag>number tag>number + +local p_splitter = C((1-S(">"))^1) * P(">") * C(P(1)^1) +tagpatterns.splitter = p_splitter + +local properties = allocate { + + document = { pdf = "Div", nature = "display" }, + + division = { pdf = "Div", nature = "display" }, + paragraph = { pdf = "P", nature = "mixed" }, + p = { pdf = "P", nature = "mixed" }, + construct = { pdf = "Span", nature = "inline" }, + highlight = { pdf = "Span", nature = "inline" }, + + section = { pdf = "Sect", nature = "display" }, + sectiontitle = { pdf = "H", nature = "mixed" }, + sectionnumber = { pdf = "H", nature = "mixed" }, + sectioncontent = { pdf = "Div", nature = "display" }, + + itemgroup = { pdf = "L", nature = "display" }, + item = { pdf = "LI", nature = "display" }, + itemtag = { pdf = "Lbl", nature = "mixed" }, + itemcontent = { pdf = "LBody", nature = "mixed" }, + itemhead = { pdf = "Div", nature = "display" }, + itembody = { pdf = "Div", nature = "display" }, + + description = { pdf = "Div", nature = "display" }, + descriptiontag = { pdf = "Div", nature = "mixed" }, + descriptioncontent = { pdf = "Div", nature = "mixed" }, + descriptionsymbol = { pdf = "Span", nature = "inline" }, -- note reference + + verbatimblock = { pdf = "Code", nature = "display" }, + verbatimlines = { pdf = "Code", nature = "display" }, + verbatimline = { pdf = "Code", nature = "mixed" }, + verbatim = { pdf = "Code", nature = "inline" }, + + lines = { pdf = "Code", nature = "display" }, + line = { pdf = "Code", nature = "mixed" }, + + synonym = { pdf = "Span", nature = "inline" }, + sorting = { pdf = "Span", nature = "inline" }, + + register = { pdf = "Div", nature = "display" }, + registerlocation = { pdf = "Span", nature = "inline" }, + registersection = { pdf = "Div", nature = "display" }, + registertag = { pdf = "Span", nature = "mixed" }, + registerentries = { pdf = "Div", nature = "display" }, + registerentry = { pdf = "Div", nature = "display" }, + registercontent = { pdf = "Span", nature = "mixed" }, + registersee = { pdf = "Span", nature = "mixed" }, + registerpages = { pdf = "Span", nature = "mixed" }, + registerpage = { pdf = "Span", nature = "mixed" }, + registerseparator = { pdf = "Span", nature = "inline" }, + registerpagerange = { pdf = "Span", nature = "mixed" }, + + table = { pdf = "Table", nature = "display" }, + tablerow = { pdf = "TR", nature = "display" }, + tablecell = { pdf = "TD", nature = "mixed" }, + + tabulate = { pdf = "Table", nature = "display" }, + tabulaterow = { pdf = "TR", nature = "display" }, + tabulatecell = { pdf = "TD", nature = "mixed" }, + + list = { pdf = "TOC", nature = "display" }, + listitem = { pdf = "TOCI", nature = "display" }, + listtag = { pdf = "Lbl", nature = "mixed" }, + listcontent = { pdf = "P", nature = "mixed" }, + listdata = { pdf = "P", nature = "mixed" }, + listpage = { pdf = "Reference", nature = "mixed" }, + + delimitedblock = { pdf = "BlockQuote", nature = "display" }, + delimited = { pdf = "Quote", nature = "inline" }, + subsentence = { pdf = "Span", nature = "inline" }, + + label = { pdf = "Span", nature = "mixed" }, + number = { pdf = "Span", nature = "mixed" }, + + float = { pdf = "Div", nature = "display" }, -- Figure + floatcaption = { pdf = "Caption", nature = "mixed" }, + floatlabel = { pdf = "Span", nature = "inline" }, + floatnumber = { pdf = "Span", nature = "inline" }, + floattext = { pdf = "Span", nature = "mixed" }, + floatcontent = { pdf = "P", nature = "mixed" }, + + image = { pdf = "P", nature = "mixed" }, + mpgraphic = { pdf = "P", nature = "mixed" }, + + formulaset = { pdf = "Div", nature = "display" }, + formula = { pdf = "Div", nature = "display" }, -- Formula + formulacaption = { pdf = "Span", nature = "mixed" }, + formulalabel = { pdf = "Span", nature = "mixed" }, + formulanumber = { pdf = "Span", nature = "mixed" }, + formulacontent = { pdf = "P", nature = "display" }, + subformula = { pdf = "Div", nature = "display" }, + + link = { pdf = "Link", nature = "inline" }, + + margintextblock = { pdf = "Span", nature = "inline" }, + margintext = { pdf = "Span", nature = "inline" }, + + math = { pdf = "Div", nature = "inline" }, -- no display + mn = { pdf = "Span", nature = "mixed" }, + mi = { pdf = "Span", nature = "mixed" }, + mo = { pdf = "Span", nature = "mixed" }, + ms = { pdf = "Span", nature = "mixed" }, + mrow = { pdf = "Span", nature = "display" }, + msubsup = { pdf = "Span", nature = "display" }, + msub = { pdf = "Span", nature = "display" }, + msup = { pdf = "Span", nature = "display" }, + merror = { pdf = "Span", nature = "mixed" }, + munderover = { pdf = "Span", nature = "display" }, + munder = { pdf = "Span", nature = "display" }, + mover = { pdf = "Span", nature = "display" }, + mtext = { pdf = "Span", nature = "mixed" }, + mfrac = { pdf = "Span", nature = "display" }, + mroot = { pdf = "Span", nature = "display" }, + msqrt = { pdf = "Span", nature = "display" }, + mfenced = { pdf = "Span", nature = "display" }, + maction = { pdf = "Span", nature = "display" }, + + mstacker = { pdf = "Span", nature = "display" }, -- these are only internally used + mstackertop = { pdf = "Span", nature = "display" }, -- these are only internally used + mstackerbot = { pdf = "Span", nature = "display" }, -- these are only internally used + mstackermid = { pdf = "Span", nature = "display" }, -- these are only internally used + + mtable = { pdf = "Table", nature = "display" }, -- might change + mtr = { pdf = "TR", nature = "display" }, -- might change + mtd = { pdf = "TD", nature = "display" }, -- might change + + ignore = { pdf = "Span", nature = "mixed" }, -- used internally + private = { pdf = "Span", nature = "mixed" }, -- for users (like LS) when they need it + metadata = { pdf = "Div", nature = "display" }, + metavariable = { pdf = "Span", nature = "mixed" }, + + mid = { pdf = "Span", nature = "inline" }, + sub = { pdf = "Span", nature = "inline" }, + sup = { pdf = "Span", nature = "inline" }, + subsup = { pdf = "Span", nature = "inline" }, + + combination = { pdf = "Span", nature = "display" }, + combinationpair = { pdf = "Span", nature = "display" }, + combinationcontent = { pdf = "Span", nature = "mixed" }, + combinationcaption = { pdf = "Span", nature = "mixed" }, } -function tags.detailedtag(tag,detail,attribute) - if not attribute then - attribute = texattribute[a_tagged] - end +tags.properties = properties + +local patterns = setmetatableindex(function(t,tag) + local v = topattern("^" .. tag .. ">") + t[tag] = v + return v +end) + +function tags.locatedtag(tag) + local attribute = texattribute[a_tagged] if attribute >= 0 then - local tl = taglist[attribute] - if tl then - local pattern - if detail and detail ~= "" then - pattern = "^" .. tag .. ":".. detail .. "%-" - else - pattern = "^" .. tag .. "%-" - end - for i=#tl,1,-1 do - local tli = tl[i] - if find(tli,pattern) then - return tli + local specification = taglist[attribute] + if specification then + local taglist = specification.taglist + local pattern = patterns[tag] + for i=#taglist,1,-1 do + local t = taglist[i] + if find(t,pattern) then + return t end end end @@ -198,12 +228,20 @@ function tags.detailedtag(tag,detail,attribute) return false -- handy as bogus index end -tags.properties = properties - -local lasttags = { } -local userdata = { } - -tags.userdata = userdata +function structures.atlocation(str) + local specification = taglist[texattribute[a_tagged]] + if specification then + if list then + local taglist = specification.taglist + local pattern = patterns[str] + for i=#list,1,-1 do + if find(list[i],pattern) then + return true + end + end + end + end +end function tags.setproperty(tag,key,value) local p = properties[tag] @@ -214,15 +252,18 @@ function tags.setproperty(tag,key,value) end end -function tags.registerdata(data) - local fulltag = chain[nstack] - if fulltag then - tagdata[fulltag] = data +function tags.setaspect(key,value) + local tag = chain[stacksize] + if tag then + local p = properties[tag] + if p then + p[key] = value + else + properties[tag] = { [key] = value } + end end end -local metadata - function tags.registermetadata(data) local d = settings_to_hash(data) if metadata then @@ -232,75 +273,92 @@ function tags.registermetadata(data) end end -local nstack = 0 - function tags.start(tag,specification) - local label, detail, user - if specification then - label, detail, user = specification.label, specification.detail, specification.userdata - end if not enabled then codeinjections.enabletags() enabled = true end -- ---~ labels[tag] = label ~= "" and label or tag ---~ local fulltag ---~ if detail and detail ~= "" then ---~ fulltag = tag .. ":" .. detail ---~ else ---~ fulltag = tag ---~ end + labels[tag] = tag -- can go away -- - local fulltag = label ~= "" and label or tag - labels[tag] = fulltag - if detail and detail ~= "" then - fulltag = fulltag .. ":" .. detail - end + local attribute = #taglist + 1 + local tagindex = (ids[tag] or 0) + 1 -- - local t = #taglist + 1 - local n = (ids[fulltag] or 0) + 1 - ids[fulltag] = n - lasttags[tag] = n - local completetag = fulltag .. "-" .. n - nstack = nstack + 1 - chain[nstack] = completetag - stack[nstack] = t - -- a copy as we can add key values for alt and actualtext if needed: - taglist[t] = { unpack(chain,1,nstack) } + local completetag = tag .. ">" .. tagindex -- - if user and user ~= "" then - -- maybe we should merge this into taglist or whatever ... anyway there is room to optimize - -- taglist.userdata = settings_to_hash(user) - userdata[completetag] = settings_to_hash(user) - end - if metadata then - tagmetadata[completetag] = metadata + ids[tag] = tagindex + lasttags[tag] = tagindex + stacksize = stacksize + 1 + -- + chain[stacksize] = completetag + stack[stacksize] = attribute + tagcontext[tag] = completetag + -- + local tagnesting = { unpack(chain,1,stacksize) } -- a copy so we can add actualtext + -- + if specification then + specification.attribute = attribute + specification.tagindex = tagindex + specification.taglist = tagnesting + specification.tagname = tag + if metadata then + specification.metadata = metadata + metadata = nil + end + local userdata = specification.userdata + if user ~= "" and type(userdata) == "string" then + specification.userdata = settings_to_hash(userdata) + end + local detail = specification.detail + if detail == "" then + specification.detail = nil + end + local parents = specification.parents + if parents == "" then + specification.parents = nil + end + else + specification = { + attribute = attribute, + tagindex = tagindex, + taglist = tagnesting, + tagname = tag, + metadata = metadata, + } metadata = nil end - texattribute[a_tagged] = t - return t + -- + taglist[attribute] = specification + specifications[completetag] = specification + -- + texattribute[a_tagged] = attribute + return attribute end -function tags.restart(completetag) - local t = #taglist + 1 - nstack = nstack + 1 - chain[nstack] = completetag - stack[nstack] = t - taglist[t] = { unpack(chain,1,nstack) } - texattribute[a_tagged] = t - return t +function tags.restart(attribute) + stacksize = stacksize + 1 + if type(attribute) == "number" then + local taglist = taglist[attribute].taglist + chain[stacksize] = taglist[#taglist] + else + chain[stacksize] = attribute -- a string + attribute = #taglist + 1 + taglist[attribute] = { taglist = { unpack(chain,1,stacksize) } } + end + stack[stacksize] = attribute + texattribute[a_tagged] = attribute + return attribute end function tags.stop() - if nstack > 0 then - nstack = nstack -1 + if stacksize > 0 then + stacksize = stacksize - 1 end - local t = stack[nstack] + local t = stack[stacksize] if not t then - if trace_tags then - report_tags("ignoring end tag, previous chain: %s",nstack > 0 and concat(chain[nstack],"",1,nstack) or "none") - end + -- if trace_tags then + report_tags("ignoring end tag, previous chain: %s",stacksize > 0 and concat(chain," ",1,stacksize) or "none") + -- end t = unsetvalue end texattribute[a_tagged] = t @@ -308,24 +366,56 @@ function tags.stop() end function tags.getid(tag,detail) - if detail and detail ~= "" then - return ids[tag .. ":" .. detail] or "?" - else - return ids[tag] or "?" - end + return ids[tag] or "?" end function tags.last(tag) return lasttags[tag] -- or false end -function tags.lastinchain() - return chain[nstack] +function tags.lastinchain(tag) + if tag and tag ~= "" then + return tagcontext[tag] + else + return chain[stacksize] + end end -function structures.atlocation(str) - local location = gsub(concat(taglist[texattribute[a_tagged]],"-"),"%-%d+","") - return find(location,topattern(str)) ~= nil +local strip = C((1-S(">"))^1) + +function tags.elementtag() + local fulltag = chain[stacksize] + if fulltag then + return lpegmatch(strip,fulltag) + end +end + +function tags.strip(fulltag) + return lpegmatch(strip,fulltag) +end + +function tags.setuserproperties(tag,list) + if not list or list == "" then + tag, list = chain[stacksize], tag + else + tag = tagcontext[tag] + end + if tag then -- an attribute now + local l = settings_to_hash(list) + local s = specifications[tag] + if s then + local u = s.userdata + if u then + for k, v in next, l do + u[k] = v + end + else + s.userdata = l + end + else + -- error + end + end end function tags.handler(head) -- we need a dummy @@ -334,8 +424,8 @@ end statistics.register("structure elements", function() if enabled then - if nstack > 0 then - return format("%s element chains identified, open chain: %s ",#taglist,concat(chain," => ",1,nstack)) + if stacksize > 0 then + return format("%s element chains identified, open chain: %s ",#taglist,concat(chain," => ",1,stacksize)) else return format("%s element chains identified",#taglist) end @@ -349,6 +439,65 @@ directives.register("backend.addtags", function(v) end end) -commands.starttag = tags.start -commands.stoptag = tags.stop -commands.settagproperty = tags.setproperty +-- interface + +local starttag = tags.start + +implement { + name = "starttag", + actions = starttag, + arguments = { "string" } +} + +implement { + name = "stoptag", + actions = tags.stop, +} + +implement { + name = "starttag_u", + scope = "private", + actions = function(tag,userdata) starttag(tag,{ userdata = userdata }) end, + arguments = { "string", "string" } +} + +implement { + name = "starttag_d", + scope = "private", + actions = function(tag,detail) starttag(tag,{ detail = detail }) end, + arguments = { "string", "string" } +} + +implement { + name = "starttag_c", + scope = "private", + actions = function(tag,detail,parents) starttag(tag,{ detail = detail, parents = parents }) end, + arguments = { "string", "string", "string" } +} + +implement { name = "settagaspect", actions = tags.setaspect, arguments = { "string", "string" } } + +implement { name = "settagproperty", actions = tags.setproperty, arguments = { "string", "string", "string" } } +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" } + +implement { name = "getelementtag", actions = { tags.elementtag, context } } + +implement { + name = "setelementuserproperties", + scope = "private", + actions = tags.setuserproperties, + arguments = { "string", "string" } +} + +implement { + name = "doifelseinelement", + actions = { structures.atlocation, commands.testcase }, + arguments = "string", +} + +implement { + name = "settaggedmetadata", + actions = structures.tags.registermetadata, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/strc-tag.mkiv b/Master/texmf-dist/tex/context/base/strc-tag.mkiv index 6e792fd3f97..f2b59c29c2d 100644 --- a/Master/texmf-dist/tex/context/base/strc-tag.mkiv +++ b/Master/texmf-dist/tex/context/base/strc-tag.mkiv @@ -11,6 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +% labels: no language needed % key/values and other names might change (and probably will) \writestatus{loading}{ConTeXt Structure Macros / Tags} @@ -22,123 +23,139 @@ %D Eventually these labels will either move to the modules %D where they're used, or they will en dup in mult-tag. -\def\t!document {document} % Div - -\def\t!division {division} % Div -\def\t!paragraph {paragraph} % P -\def\t!p {p} % P -\def\t!construct {construct} % Span -\def\t!highlight {highlight} % Span - -\def\t!section {section} % Sect -\def\t!sectiontitle {sectiontitle} % H -\def\t!sectionnumber {sectionnumber} % H -\def\t!sectioncontent {sectioncontent} % Div - -\def\t!itemgroup {itemgroup} % L -\def\t!item {item} % Li -\def\t!itemtag {itemtag} % Lbl -\def\t!itemcontent {itemcontent} % LBody - -\def\t!description {description} % Li -\def\t!descriptiontag {descriptiontag} % Lbl -\def\t!descriptioncontent {descriptioncontent} % LBody -\def\t!descriptionsymbol {descriptionsymbol} % Span - -\let\t!construction \t!description -\let\t!constructiontag \t!descriptiontag -\let\t!constructioncontent\t!descriptioncontent -\let\t!constructionsymbol \t!descriptionsymbol - -\def\t!verbatimblock {verbatimblock} % Code -\def\t!verbatimlines {verbatimlines} % Code -\def\t!verbatimline {verbatimline} % Code -\def\t!verbatim {verbatim} % Code - -\def\t!lines {lines} % Code -\def\t!line {line} % Code - -\def\t!sorting {sorting} % Span -\def\t!synonym {synonym} % Span - -\def\t!register {register} % Div -\def\t!registersection {registersection} % Div -\def\t!registertag {registertag} % Span -\def\t!registerentries {registerentries} % Div -\def\t!registerentry {registerentry} % Span -\def\t!registersee {registersee} % Span -\def\t!registerpages {registerpages} % Span -\def\t!registerpage {registerpage} % Span -\def\t!registerpagerange {registerpagerange} % Span - -\def\t!table {table} % Table -\def\t!tablerow {tablerow} % TR -\def\t!tablecell {tablecell} % TD -\def\t!tabulate {tabulate} % Table -\def\t!tabulaterow {tabulaterow} % TR -\def\t!tabulatecell {tabulatecell} % TD - -\def\t!math {math} % math -\def\t!mathtable {mtable} % Table -\def\t!mathtablerow {mtr} % TR -\def\t!mathtablecell {mtd} % TD -\def\t!mathaction {maction} % - -\def\t!list {list} % TOC -\def\t!listitem {listitem} % TOCI -\def\t!listtag {listtag} % Lbl -\def\t!listcontent {listcontent} % P -\def\t!listdata {listdata} % P -\def\t!listpage {listpage} % Reference - -\def\t!delimitedblock {delimited} % BlockQuote -\def\t!delimited {delimited} % Quote -\def\t!subsentence {subsentence} % Span - -\def\t!float {float} % Div -\def\t!floatcaption {floatcaption} % Caption -\def\t!floatlabel {floatlabel} % Span -\def\t!floattext {floattext} % Span -\def\t!floatnumber {floatnumber} % Span -\def\t!floatcontent {floatcontent} % P - -\def\t!image {image} % P - -\def\t!mpgraphic {mpgraphic} % P - -\def\t!formulaset {formulaset} % Div -\def\t!formula {formula} % Div -\def\t!formulacaption {formulacaption} % Span -\def\t!formulalabel {formulalabel} % Span -\def\t!formulanumber {formulanumber} % P -\def\t!formulacontent {formulacontent} % P -\def\t!subformula {subformula} % Div - -\def\t!link {link} % Link - -\def\t!margintext {margintext} % Span -\def\t!margintextblock {margintextblock} % Div +\def\t!document {document} % Div + +\def\t!division {division} % Div +\def\t!paragraph {paragraph} % P +\def\t!p {p} % P +\def\t!construct {construct} % Span +\def\t!highlight {highlight} % Span + +\def\t!section {section} % Sect +\def\t!sectiontitle {sectiontitle} % H +\def\t!sectionnumber {sectionnumber} % H +\def\t!sectioncontent {sectioncontent} % Div + +\def\t!itemgroup {itemgroup} % L +\def\t!item {item} % Li +\def\t!itemtag {itemtag} % Lbl +\def\t!itemcontent {itemcontent} % LBody +\def\t!itemhead {itemhead} % Div +\def\t!itembody {itembody} % Div + +\def\t!description {description} % Li +\def\t!descriptiontag {descriptiontag} % Lbl +\def\t!descriptioncontent {descriptioncontent} % LBody +\def\t!descriptionsymbol {descriptionsymbol} % Span + +\let\t!construction \t!description +\let\t!constructiontag \t!descriptiontag +\let\t!constructioncontent \t!descriptioncontent +\let\t!constructionsymbol \t!descriptionsymbol + +\def\t!verbatimblock {verbatimblock} % Code +\def\t!verbatimlines {verbatimlines} % Code +\def\t!verbatimline {verbatimline} % Code +\def\t!verbatim {verbatim} % Code + +\def\t!lines {lines} % Code +\def\t!line {line} % Code + +\def\t!sorting {sorting} % Span +\def\t!synonym {synonym} % Span + +\def\t!register {register} % Div +\def\t!registerlocation {registerlocation} % Span +\def\t!registersection {registersection} % Div +\def\t!registertag {registertag} % Span +\def\t!registerentries {registerentries} % Div +\def\t!registerentry {registerentry} % Span +\def\t!registercontent {registercontent} % Span +\def\t!registersee {registersee} % Span +\def\t!registerpages {registerpages} % Span +\def\t!registerpage {registerpage} % Span +\def\t!registerpagerange {registerpagerange} % Span +\def\t!registerfrompage {registerfrompage} % Span +\def\t!registertopage {registertopage} % Span +\def\t!registerseparator {registerseparator} % Span + +\def\t!table {table} % Table +\def\t!tablerow {tablerow} % TR +\def\t!tablecell {tablecell} % TD +\def\t!tabulate {tabulate} % Table +\def\t!tabulaterow {tabulaterow} % TR +\def\t!tabulatecell {tabulatecell} % TD + +\def\t!math {math} % math +\def\t!mathtable {mtable} % Table +\def\t!mathtablerow {mtr} % TR +\def\t!mathtablecell {mtd} % TD +\def\t!mathaction {maction} % +\def\t!mathstacker {mstacker} +\def\t!mathstackertop {mstackertop} +\def\t!mathstackermid {mstackermid} +\def\t!mathstackerbot {mstackerbot} + +\def\t!munderover {munderover} % special cases +\def\t!munder {munder} % special cases +\def\t!mover {mover} % special cases + +\def\t!list {list} % TOC +\def\t!listitem {listitem} % TOCI +\def\t!listtag {listtag} % Lbl +\def\t!listcontent {listcontent} % P +\def\t!listdata {listdata} % P +\def\t!listpage {listpage} % Reference + +\def\t!delimitedblock {delimited} % BlockQuote +\def\t!delimited {delimited} % Quote +\def\t!subsentence {subsentence} % Span + +\def\t!float {float} % Div +\def\t!floatcaption {floatcaption} % Caption +\def\t!floatlabel {floatlabel} % Span +\def\t!floattext {floattext} % Span +\def\t!floatnumber {floatnumber} % Span +\def\t!floatcontent {floatcontent} % P + +\def\t!image {image} % P + +\def\t!mpgraphic {mpgraphic} % P + +\def\t!formulaset {formulaset} % Div +\def\t!formula {formula} % Div +\def\t!formulacaption {formulacaption} % Span +\def\t!formulalabel {formulalabel} % Span +\def\t!formulanumber {formulanumber} % P +\def\t!formulacontent {formulacontent} % P +\def\t!subformula {subformula} % Div + +\def\t!link {link} % Link + +\def\t!margintext {margintext} % Span +\def\t!margintextblock {margintextblock} % Div % we might opt for verbose variants so this is experimental: -\def\t!label {label} % Span -\def\t!number {number} % Span +\def\t!label {label} % Span +\def\t!number {number} % Span -\def\t!ignore {ignore} % Span +\def\t!ignore {ignore} % Span +\def\t!private {private} % Span -\def\t!mid {mid} % Span -\def\t!sub {sub} % Span -\def\t!sup {sup} % Span -\def\t!subsup {subsup} % Span +\def\t!mid {mid} % Span +\def\t!sub {sub} % Span +\def\t!sup {sup} % Span +\def\t!subsup {subsup} % Span -\def\t!unit {unit} % Span -\def\t!quantity {quantity} % Span -\def\t!number {number} % Span +\def\t!unit {unit} % Span +\def\t!quantity {quantity} % Span +\def\t!number {number} % Span -\def\t!combination {combination} % Span -\def\t!combinationpair {combinationpair} % Span -\def\t!combinationcontent {combinationcontent} % Span -\def\t!combinationcaption {combinationcaption} % Span +\def\t!combination {combination} % Span +\def\t!combinationpair {combinationpair} % Span +\def\t!combinationcontent {combinationcontent} % Span +\def\t!combinationcaption {combinationcaption} % Span % \setuptaglabeltext % [en] @@ -152,8 +169,11 @@ \unexpanded\def\setelementbackendtag{\dodoubleargument\strc_tags_set_backend} \unexpanded\def\setelementnature {\dodoubleargument\strc_tags_set_nature} -\def\strc_tags_set_backend[#1][#2]{\ctxcommand{settagproperty("#1","backend","#2")}} -\def\strc_tags_set_nature [#1][#2]{\ctxcommand{settagproperty("#1","nature", "#2")}} +\def\strc_tags_set_backend[#1][#2]{\clf_settagproperty_b{#1}{#2}} % todo: ignore when no export +\def\strc_tags_set_nature [#1][#2]{\clf_settagproperty_n{#1}{#2}} % todo: ignore when no export + +\unexpanded\def\strc_tags_set_aspect_nop#1#2{} +\unexpanded\def\strc_tags_set_aspect_yes#1#2{\clf_settagaspect{#1}{#2}} % todo: ignore when no export / also \let \installcorenamespace{tagging} @@ -176,11 +196,14 @@ \expandafter\strc_tags_element_stop_yes \fi} +% it makes no sense to have labels ... maybe some day as a last 'replace' in the export +% which might be more efficient then ... okay, we now cannot overload but who cares + \unexpanded\def\strc_tags_element_start_yes_indeed_yes[#1][#2]% - {\ctxcommand{starttag("#1",{label="\dogetupsometaglabeltext{#1}",userdata=\!!bs#2\!!es})}} + {\clf_starttag_u{#1}{#2}} \unexpanded\def\strc_tags_element_stop_yes - {\ctxcommand{stoptag()}} + {\clf_stoptag} \unexpanded\def\strc_tags_element_start_nop_indeed[#1][#2]% {} @@ -191,19 +214,35 @@ \unexpanded\def\strc_tags_enable_elements {\setuplanguage[\s!default][\s!righthyphenchar="AD]% for the moment here \let\startelement\strc_tags_element_start_yes - \let\stopelement \strc_tags_element_stop_yes} + \let\stopelement \strc_tags_element_stop_yes + \let\dosettagproperty\strc_tags_set_aspect_yes} \unexpanded\def\strc_tags_disable_elements {\let\startelement\strc_tags_element_start_nop - \let\stopelement \strc_tags_element_stop_nop} + \let\stopelement \strc_tags_element_stop_nop + \let\dosettagproperty\strc_tags_set_aspect_nop} % beware: making these unexpanded spoils tables (noalign problem) -\def\strc_tags_enabled_start +\def\strc_tags_enabled_start_no_detail + {\iftrialtypesetting + \expandafter\strc_tags_start_nop_no_detail + \else + \expandafter\strc_tags_start_yes_no_detail + \fi} + +\def\strc_tags_enabled_start_detail + {\iftrialtypesetting + \expandafter\strc_tags_start_nop_detail + \else + \expandafter\strc_tags_start_yes_detail + \fi} + +\def\strc_tags_enabled_start_chained {\iftrialtypesetting - \expandafter\strc_tags_start_nop + \expandafter\strc_tags_start_nop_chained \else - \expandafter\strc_tags_start_yes + \expandafter\strc_tags_start_yes_chained \fi} \def\strc_tags_enabled_stop @@ -213,25 +252,66 @@ \expandafter\strc_tags_stop_yes \fi} -\def\strc_tags_start_yes#1#2% we could have a fast labeltext resolver - {\ctxcommand{starttag("#1",{label="\dogetupsometaglabeltext{#1}",detail="#2"})}} +\def\strc_tags_start_yes_no_detail #1{\clf_starttag{#1}} +\def\strc_tags_start_yes_detail #1#2{\clf_starttag_d{#1}{#2}} +\def\strc_tags_start_yes_chained #1#2#3{\clf_starttag_c{#1}{#2}{\getcurrentparentchain#3{#2}}} +\def\strc_tags_stop_yes {\clf_stoptag} -\def\strc_tags_stop_yes - {\ctxcommand{stoptag()}} +\let\strc_tags_start_nop_no_detail\gobbleoneargument +\let\strc_tags_start_nop_detail \gobbletwoarguments +\let\strc_tags_start_nop_chained \gobblethreearguments +\let\strc_tags_stop_nop \donothing -\def\strc_tags_start_nop#1#2% - {} +% more efficient: -\def\strc_tags_stop_nop - {} +% \dostarttagged % {tag} {detail} +% \dostarttaggedchained % {tag} {detail} \??hash +% \dostarttaggednodetail % {tag} + +% \unexpanded\def\strc_tags_enable +% {\let\dostarttagged\strc_tags_start_yes +% \let\dostoptagged \strc_tags_stop_yes} \unexpanded\def\strc_tags_enable - {\let\dostarttagged\strc_tags_start_yes - \let\dostoptagged \strc_tags_stop_yes} + {\let\dostarttagged \strc_tags_enabled_start_detail + \let\dostarttaggednodetail\strc_tags_enabled_start_no_detail + \let\dostarttaggedchained \strc_tags_enabled_start_chained + \let\dostoptagged \strc_tags_enabled_stop} \unexpanded\def\strc_tags_disable - {\let\dostarttagged\strc_tags_start_nop - \let\dostoptagged \strc_tags_stop_nop} + {\let\dostarttagged \strc_tags_start_nop_detail + \let\dostarttaggednodetail\strc_tags_start_nop_no_detail + \let\dostarttaggedchained \strc_tags_start_nop_chained + \let\dostoptagged \strc_tags_stop_nop} + +% for luigi (beware: fully expandable): + +\def\strc_tags_get_element_tag_yes{\clf_getelementtag} +\let\strc_tags_get_element_tag_nop\donothing + +\unexpanded\def\strc_tags_setup_element_user_properties_yes + {\dodoubleempty\strc_tags_setup_element_user_properties_indeed} + +\unexpanded\def\strc_tags_setup_element_user_properties_nop + {\dodoubleempty\strc_tags_setup_element_user_properties_indeed_nop} + +\def\strc_tags_setup_element_user_properties_indeed + {\iftrialtypesetting + \expandafter\strc_tags_setup_element_user_properties_indeed_nop + \else + \expandafter\strc_tags_setup_element_user_properties_indeed_yes + \fi} + +\def\strc_tags_setup_element_user_properties_indeed_nop[#1][#2]{} +\def\strc_tags_setup_element_user_properties_indeed_yes[#1][#2]{\clf_setelementuserproperties{#1}{#2}} + +\unexpanded\def\strc_tags_enable_properties + {\let\getelementtag \strc_tags_get_element_tag_yes + \let\setupelementuserproperties\strc_tags_setup_element_user_properties_yes} + +\unexpanded\def\strc_tags_disable_properties + {\let\getelementtag \strc_tags_get_element_tag_nop + \let\setupelementuserproperties\strc_tags_setup_element_user_properties_nop} %D The triggers: @@ -240,11 +320,13 @@ \appendtoks \strc_tags_enable_elements + \strc_tags_enable_properties \doifelse{\taggingparameter\c!method}\v!auto\strc_tags_enable\strc_tags_disable \to \everyenableelements \appendtoks \strc_tags_disable_elements + \strc_tags_disable_properties \strc_tags_disable \to \everydisableelements @@ -277,41 +359,41 @@ \installcorenamespace {paragraph} \installcommandhandler \??paragraph {paragraph} \??paragraph -\setupparagraph % someday maybe also strut (beg/end) +\setupparagraph % someday maybe also strut (beg/end) and align [\c!color=, \c!style=] \unexpanded\def\startparagraph - {\dodoubleempty\paragraph_start} + {\dodoubleempty\paragraph_start} \def\paragraph_start - {\iffirstargument - \ifsecondargument - \doubleexpandafter\paragraph_start_two - \else - \doubleexpandafter\paragraph_start_one - \fi - \else - \expandafter\paragraph_start_zero - \fi} + {\endgraf % we end before the group + \begingroup + \iffirstargument + \ifsecondargument + \doubleexpandafter\paragraph_start_two + \else + \doubleexpandafter\paragraph_start_one + \fi + \else + \expandafter\paragraph_start_zero + \fi} \def\paragraph_start_two[#1][#2]% - {\endgraf % we end before the group - \begingroup - \let\stopparagraph\paragraph_stop_indeed - \edef\currentparagraph{#1}% - \setupcurrentparagraph[#2]% - \paragraph_start_indeed} + {\edef\currentparagraph{#1}% + \setupcurrentparagraph[#2]% + \paragraph_start_indeed} \def\paragraph_start_one[#1][#2]% - {\endgraf % we end before the group - \begingroup - \let\stopparagraph\paragraph_stop_indeed - \doifassignmentelse{#1} - {\let\currentparagraph\empty - \setupcurrentparagraph[#1]} - {\edef\currentparagraph{#1}}% - \paragraph_start_indeed} + {\doifelseassignment{#1} + {\let\currentparagraph\empty + \setupcurrentparagraph[#1]} + {\edef\currentparagraph{#1}}% + \paragraph_start_indeed} + +\def\paragraph_start_zero[#1][#2]% + {\let\currentparagraph\empty + \paragraph_start_indeed} \def\paragraph_start_indeed {\useparagraphstyleandcolor\c!style\c!color @@ -319,27 +401,32 @@ \usesetupsparameter\paragraphparameter \dostarttagged\t!paragraph\currentparagraph} -\def\paragraph_start_zero[#1][#2]% - {\let\currentparagraph\empty - \paragraph_start_indeed} - -\unexpanded\def\paragraph_stop_indeed - {\dostoptagged - \endgraf % we end inside the group - \endgroup} - \unexpanded\def\stopparagraph - {\dostoptagged} + {\dostoptagged + \endgraf % we end inside the group + \endgroup} \let\startpar\startparagraph \let\stoppar \stopparagraph +\def\strc_tags_document_start_indeed + {\glet\strc_tags_document_start_indeed\relax + \dostarttagged\t!document\empty} + +\def\strc_tags_document_stop_indeed + {\glet\strc_tags_document_stop_indeed\relax + \dostoptagged} + \appendtoks - \dostarttagged\t!document\empty -\to \everystarttext + \strc_tags_document_start_indeed % here because otherwise products don't get a root (starttext before env) +\to \everyenableelements + +% \appendtoks +% \strc_tags_document_start_indeed +% \to \everystarttext \appendtoks - \dostoptagged + \strc_tags_document_stop_indeed \to \everystoptext \appendtoks @@ -347,12 +434,14 @@ \strc_tags_disable \to \everybeforepagebody -% \doifinelementelse{structure:section} {yes} {no} -% \doifinelementelse{structure:chapter} {yes} {no} -% \doifinelementelse{division:*-structure:chapter} {yes} {no} +% \doifelseinelement{structure:section} {yes} {no} +% \doifelseinelement{structure:chapter} {yes} {no} +% \doifelseinelement{division:*-structure:chapter} {yes} {no} + +\unexpanded\def\doifelseinelement#1% + {\clf_doifelseinelement{#1}} -\unexpanded\def\doifinelementelse#1% - {\ctxcommand{testcase(structures.atlocation("#1"))}} +\let\doifinelementelse\doifelseinelement \unexpanded\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent {\begingroup @@ -398,7 +487,7 @@ %D \stoptyping \unexpanded\def\settaggedmetadata[#1]% - {\ctxlua{structures.tags.registermetadata(\!!bs#1\!!es)}} + {\clf_settaggedmetadata{#1}} %D An overload: diff --git a/Master/texmf-dist/tex/context/base/supp-box.lua b/Master/texmf-dist/tex/context/base/supp-box.lua index 3c5a3383d01..7cc71a891dd 100644 --- a/Master/texmf-dist/tex/context/base/supp-box.lua +++ b/Master/texmf-dist/tex/context/base/supp-box.lua @@ -8,13 +8,16 @@ if not modules then modules = { } end modules ['supp-box'] = { -- this is preliminary code, use insert_before etc +local lpegmatch = lpeg.match + local report_hyphenation = logs.reporter("languages","hyphenation") local tex = tex local context = context -local commands = commands local nodes = nodes +local implement = interfaces.implement + local splitstring = string.split local nodecodes = nodes.nodecodes @@ -42,9 +45,12 @@ local setfield = nuts.setfield local setbox = nuts.setbox local free_node = nuts.free -local copy_list = nuts.copy_list +local flush_list = nuts.flush_list local copy_node = nuts.copy +local copy_list = nuts.copy_list local find_tail = nuts.tail +local traverse_id = nuts.traverse_id +local link_nodes = nuts.linked local listtoutf = nodes.listtoutf @@ -52,29 +58,64 @@ local nodepool = nuts.pool local new_penalty = nodepool.penalty local new_hlist = nodepool.hlist local new_glue = nodepool.glue +local new_rule = nodepool.rule +local new_kern = nodepool.kern + +local setlistcolor = nodes.tracers.colors.setlist local texget = tex.get +local texgetbox = tex.getbox -local function hyphenatedlist(head) +local function hyphenatedlist(head,usecolor) local current = head and tonut(head) while current do local id = getid(current) local next = getnext(current) local prev = getprev(current) if id == disc_code then - local hyphen = getfield(current,"pre") - if hyphen then - local penalty = new_penalty(-500) - -- insert_after etc - setfield(hyphen,"next",penalty) - setfield(penalty,"prev",hyphen) - setfield(prev,"next",hyphen) - setfield(next,"prev", penalty) - setfield(penalty,"next",next) - setfield(hyphen,"prev",prev) + local pre = getfield(current,"pre") + local post = getfield(current,"post") + local replace = getfield(current,"replace") + if pre then setfield(current,"pre",nil) - free_node(current) end + if post then + setfield(current,"post",nil) + end + if not usecolor then + -- nothing fancy done + elseif pre and post then + setlistcolor(pre,"darkmagenta") + setlistcolor(post,"darkcyan") + elseif pre then + setlistcolor(pre,"darkyellow") + elseif post then + setlistcolor(post,"darkyellow") + end + if replace then + flush_list(replace) + setfield(current,"replace",nil) + end + -- setfield(current,"replace",new_rule(65536)) -- new_kern(65536*2)) + setfield(current,"next",nil) + setfield(current,"prev",nil) + local list = link_nodes ( + pre and new_penalty(10000), + pre, + current, + post, + post and new_penalty(10000) + ) + local tail = find_tail(list) + if prev then + setfield(prev,"next",list) + setfield(list,"prev",prev) + end + if next then + setfield(tail,"next",next) + setfield(next,"prev",tail) + end + -- free_node(current) elseif id == vlist_code or id == hlist_code then hyphenatedlist(getlist(current)) end @@ -82,11 +123,29 @@ local function hyphenatedlist(head) end end -commands.hyphenatedlist = hyphenatedlist +implement { + name = "hyphenatedlist", + arguments = { "integer", "boolean" }, + actions = function(n,color) + local b = texgetbox(n) + if b then + hyphenatedlist(b.list,color) + end + end +} -function commands.showhyphenatedinlist(list) - report_hyphenation("show: %s",listtoutf(tonut(list),false,true)) -end +-- local function hyphenatedhack(head,pre) +-- pre = tonut(pre) +-- for n in traverse_id(disc_code,tonut(head)) do +-- local hyphen = getfield(n,"pre") +-- if hyphen then +-- flush_list(hyphen) +-- end +-- setfield(n,"pre",copy_list(pre)) +-- end +-- end +-- +-- commands.hyphenatedhack = hyphenatedhack local function checkedlist(list) if type(list) == "number" then @@ -96,12 +155,20 @@ local function checkedlist(list) end end +implement { + name = "showhyphenatedinlist", + arguments = "integer", + actions = function(box) + report_hyphenation("show: %s",listtoutf(checkedlist(n),false,true)) + end +} + local function applytochars(current,doaction,noaction,nested) while current do local id = getid(current) if nested and (id == hlist_code or id == vlist_code) then context.beginhbox() - applytochars(getlist(current),what,nested) + applytochars(getlist(current),doaction,noaction,nested) context.endhbox() elseif id ~= glyph_code then noaction(tonode(copy_node(current))) @@ -124,7 +191,7 @@ local function applytowords(current,doaction,noaction,nested) noaction(tonode(copy_node(current))) elseif nested and (id == hlist_code or id == vlist_code) then context.beginhbox() - applytowords(getlist(current),what,nested) + applytowords(getlist(current),doaction,noaction,nested) context.egroup() elseif not start then start = current @@ -136,17 +203,43 @@ local function applytowords(current,doaction,noaction,nested) end end -commands.applytochars = function(list,what,nested) applytochars(checkedlist(list),context[what or "ruledhbox"],context,nested) end -commands.applytowords = function(list,what,nested) applytowords(checkedlist(list),context[what or "ruledhbox"],context,nested) end +local methods = { + char = applytochars, + characters = applytochars, + word = applytowords, + words = applytowords, +} + +implement { + name = "applytobox", + arguments = { + { + { "box", "integer" }, + { "command" }, + { "method" }, + { "nested", "boolean" }, + } + }, + actions = function(specification) + local list = checkedlist(specification.box) + local action = methods[specification.method or "char"] + if list and action then + action(list,context[specification.command or "ruledhbox"],context,specification.nested) + end + end +} local split_char = lpeg.Ct(lpeg.C(1)^0) local split_word = lpeg.tsplitat(lpeg.patterns.space) local split_line = lpeg.tsplitat(lpeg.patterns.eol) -function commands.processsplit(str,command,how,spaced) - how = how or "word" - if how == "char" then - local words = lpeg.match(split_char,str) +local function processsplit(specification) + local str = specification.data or "" + local command = specification.command or "ruledhbox" + local method = specification.method or "word" + local spaced = specification.spaced + if method == "char" or method == "character" then + local words = lpegmatch(split_char,str) for i=1,#words do local word = words[i] if word == " " then @@ -159,8 +252,8 @@ function commands.processsplit(str,command,how,spaced) context(word) end end - elseif how == "word" then - local words = lpeg.match(split_word,str) + elseif method == "word" then + local words = lpegmatch(split_word,str) for i=1,#words do local word = words[i] if spaced and i > 1 then @@ -172,8 +265,8 @@ function commands.processsplit(str,command,how,spaced) context(word) end end - elseif how == "line" then - local words = lpeg.match(split_line,str) + elseif method == "line" then + local words = lpegmatch(split_line,str) for i=1,#words do local word = words[i] if spaced and i > 1 then @@ -190,63 +283,88 @@ function commands.processsplit(str,command,how,spaced) end end +implement { + name = "processsplit", + actions = processsplit, + arguments = { + { + { "data" }, + { "command" }, + { "method" }, + { "spaced", "boolean" }, + } + } +} + local a_vboxtohboxseparator = attributes.private("vboxtohboxseparator") -function commands.vboxlisttohbox(original,target,inbetween) - local current = getlist(getbox(original)) - local head = nil - local tail = nil - while current do - local id = getid(current) - local next = getnext(current) - if id == hlist_code then - local list = getlist(current) - if head then - if inbetween > 0 then - local n = new_glue(0,0,inbetween) - setfield(tail,"next",n) - setfield(n,"prev",tail) - tail = n - end - setfield(tail,"next",list) - setfield(list,"prev",tail) - else - head = list - end - tail = find_tail(list) - -- remove last separator - if getid(tail) == hlist_code and getattribute(tail,a_vboxtohboxseparator) == 1 then - local temp = tail - local prev = getprev(tail) - if next then - local list = getlist(tail) - setfield(prev,"next",list) - setfield(list,"prev",prev) - setfield(tail,"list",nil) - tail = find_tail(list) +implement { + name = "vboxlisttohbox", + arguments = { "integer", "integer", "dimen" }, + actions = function(original,target,inbetween) + local current = getlist(getbox(original)) + local head = nil + local tail = nil + while current do + local id = getid(current) + local next = getnext(current) + if id == hlist_code then + local list = getlist(current) + if head then + if inbetween > 0 then + local n = new_glue(0,0,inbetween) + setfield(tail,"next",n) + setfield(n,"prev",tail) + tail = n + end + setfield(tail,"next",list) + setfield(list,"prev",tail) else - tail = prev + head = list + end + tail = find_tail(list) + -- remove last separator + if getid(tail) == hlist_code and getattribute(tail,a_vboxtohboxseparator) == 1 then + local temp = tail + local prev = getprev(tail) + if next then + local list = getlist(tail) + setfield(prev,"next",list) + setfield(list,"prev",prev) + setfield(tail,"list",nil) + tail = find_tail(list) + else + tail = prev + end + free_node(temp) end - free_node(temp) + -- done + setfield(tail,"next",nil) + setfield(current,"list",nil) end - -- done - setfield(tail,"next",nil) - setfield(current,"list",nil) + current = next end - current = next + local result = new_hlist() + setfield(result,"list",head) + setbox(target,result) end - local result = new_hlist() - setfield(result,"list",head) - setbox(target,result) -end +} -function commands.hboxtovbox(original) - local b = getbox(original) - local factor = texget("baselineskip").width / texget("hsize") - setfield(b,"depth",0) - setfield(b,"height",getfield(b,"width") * factor) -end +implement { + name = "hboxtovbox", + arguments = "integer", + actions = function(n) + local b = getbox(n) + local factor = texget("baselineskip").width / texget("hsize") + setfield(b,"depth",0) + setfield(b,"height",getfield(b,"width") * factor) + end +} -function commands.boxtostring(n) - context.puretext(nodes.toutf(tex.box[n].list)) -- helper is defined later -end +implement { + name = "boxtostring", + arguments = "integer", + actions = function(n) + context.puretext(nodes.toutf(texgetbox(n).list)) -- helper is defined later + end +} diff --git a/Master/texmf-dist/tex/context/base/supp-box.mkiv b/Master/texmf-dist/tex/context/base/supp-box.mkiv index 66f373b72a7..54b0e2860a3 100644 --- a/Master/texmf-dist/tex/context/base/supp-box.mkiv +++ b/Master/texmf-dist/tex/context/base/supp-box.mkiv @@ -570,7 +570,7 @@ %D \doiftext {data} {then branch} %D \stoptyping -\unexpanded\def\doiftextelse#1% +\unexpanded\def\doifelsetext#1% {\begingroup \setbox\scratchbox\hbox {\settrialtypesetting @@ -581,6 +581,8 @@ \endgroup\expandafter\firstoftwoarguments \fi} +\let\doiftextelse\doifelsetext + \unexpanded\def\doiftext#1% {\begingroup \setbox\scratchbox\hbox @@ -658,8 +660,8 @@ %D A slower but more versatile implementation is: %D %D \starttyping -%D \long\def\dowithnextbox#1#2% -%D {\long\def\syst_boxes_with_next_box{#1}% +%D \unexpanded\def\dowithnextbox#1#2% +%D {\def\syst_boxes_with_next_box{#1}% %D \ifx#2\hbox %D \afterassignment\syst_boxes_with_next_box_indeed %D \else\ifx#2\vbox @@ -1063,10 +1065,11 @@ %D \showhyphens{dohyphenatedword} %D \stoptyping -\def\doshowhyphenatednextbox - {\ctxcommand{showhyphenatedinlist(tex.box[\number\nextbox].list)}} +\unexpanded\def\doshowhyphenatednextbox + {\clf_showhyphenatedinlist\nextbox} -\unexpanded\def\showhyphens{\dowithnextboxcs\doshowhyphenatednextbox\hbox} +\unexpanded\def\showhyphens + {\dowithnextboxcs\doshowhyphenatednextbox\hbox} %D The following macros are seldom used but handy for tracing. %D @@ -1076,14 +1079,20 @@ %D \hyphenatedfile{tufte} %D \stoptyping -\def\dohyphenatednextbox - {\ctxcommand{hyphenatedlist(tex.box[\number\nextbox].list)}% +\unexpanded\def\dohyphenatednextbox + {\clf_hyphenatedlist\nextbox false\relax \unhbox\nextbox} \unexpanded\def\hyphenatedword {\dowithnextboxcs\dohyphenatednextbox\hbox} \unexpanded\def\hyphenatedpar {\dowithnextboxcs\dohyphenatednextbox\hbox} \unexpanded\def\hyphenatedfile#1{\dowithnextboxcs\dohyphenatednextbox\hbox{\readfile{#1}\donothing\donothing}} +\unexpanded\def\dohyphenatednextboxcolor + {\clf_hyphenatedlist\nextbox true\relax + \unhbox\nextbox} + +\unexpanded\def\hyphenatedcoloredword{\dowithnextboxcs\dohyphenatednextboxcolor\hbox} + %D \macros %D {processtokens} %D @@ -1363,7 +1372,12 @@ \begingroup \setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}% \setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}% - \ctxcommand{applytochars(\number\scratchbox,"\strippedcsname#2",true)}% + \clf_applytobox + method {char}% + box \scratchbox + command {\checkedstrippedcsname#2}% + nested true% + \relax \endgroup} \unexpanded\def\processisolatedwords#1#2% @@ -1371,34 +1385,88 @@ \begingroup \setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}% \setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}% - \ctxcommand{applytowords(\number\scratchbox,"\strippedcsname#2",true)}% + \clf_applytobox + method {word}% + box \scratchbox + command {\checkedstrippedcsname#2}% + nested true% + \relax \endgroup} -\unexpanded\def\processwords#1% - {\processisolatedwords{#1}\processword} - -\let\processword\relax - -\unexpanded\def\applytosplitstringchar#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","char")}} -\unexpanded\def\applytosplitstringword#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","word")}} -\unexpanded\def\applytosplitstringline#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","line")}} - -\unexpanded\def\applytosplitstringcharspaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","char",true)}} -\unexpanded\def\applytosplitstringwordspaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","word",true)}} -\unexpanded\def\applytosplitstringlinespaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","line",true)}} - %D A variant: \unexpanded\def\applytocharacters#1% {\dontleavehmode - \dowithnextbox{\ctxcommand{applytochars(\number\nextbox,"\strippedcsname#1",true)}}% + \dowithnextbox{\clf_applytobox + method {char}% + box \nextbox + command {\checkedstrippedcsname#1}% + nested true% + \relax}% \hbox} \unexpanded\def\applytowords#1% {\dontleavehmode - \dowithnextbox{\ctxcommand{applytowords(\number\nextbox,"\strippedcsname#1",true)}}% + \dowithnextbox{\clf_applytobox + method {word}% + box \nextbox + command {\checkedstrippedcsname#1}% + nested true% + \relax}% \hbox} +%D The old call: + +\unexpanded\def\processwords#1% + {\processisolatedwords{#1}\processword} + +\let\processword\relax + +\unexpanded\def\applytosplitstringchar#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {char}% + \relax} + +\unexpanded\def\applytosplitstringword#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {word}% + \relax} + +\unexpanded\def\applytosplitstringline#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {line}% + \relax} + +\unexpanded\def\applytosplitstringcharspaced#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {char}% + spaced true% + \relax} + +\unexpanded\def\applytosplitstringwordspaced#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {word}% + spaced true% + \relax} + +\unexpanded\def\applytosplitstringlinespaced#1#2% + {\dontleavehmode\clf_processsplit + data {#2}% + command {\checkedstrippedcsname#1}% + method {line}% + spaced true% + \relax} + %D \macros %D {sbox} %D @@ -1795,7 +1863,7 @@ \box\d_syst_boxes_separator \fi \egroup - \ctxcommand{hboxtovbox(\number\scratchbox)}% + \clf_hboxtovbox\scratchbox \box\scratchbox \endgroup} @@ -1849,7 +1917,7 @@ \unexpanded\def\stophboxestohbox {\egroup - \ctxcommand{vboxlisttohbox(\number\scratchbox,\number\nextbox,\number\dimexpr\hboxestohboxslack)}% + \clf_vboxlisttohbox\scratchbox\nextbox\dimexpr\hboxestohboxslack\relax \dontleavehmode \unhbox\nextbox \removeunwantedspaces @@ -2024,7 +2092,7 @@ {\bgroup \def\syst_boxes_process_indeed{#1}% #1 can be redefined halfway \setbox\processbox\emptybox - \doifnextbgroupelse\syst_boxes_process_yes\syst_boxes_process_nop} + \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop} \def\syst_boxes_process_yes {\dowithnextboxcs\syst_boxes_process_content\hbox} @@ -2032,7 +2100,7 @@ \def\syst_boxes_process_content {\removeunwantedspaces \syst_boxes_process_indeed % takes \nextbox makes \processbox - \doifnextbgroupelse\syst_boxes_process_yes\syst_boxes_process_nop} + \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop} \unexpanded\def\syst_boxes_process_nop {\removeunwantedspaces @@ -2489,13 +2557,15 @@ \copy\csname\??stackbox#1:#2\endcsname \fi}} -\unexpanded\def\doifboxelse#1#2#3#4% +\unexpanded\def\doifelsebox#1#2#3#4% {\ifcsname\??stackbox#1:#2\endcsname \ifvoid\csname\??stackbox#1:#2\endcsname#4\else#3\fi \else #4% \fi} +\let\doifboxelse\doifelsebox + %D This one is cheaper (the above is no longer used that much): \installcorenamespace {boxstack} @@ -2525,9 +2595,6 @@ \unexpanded\def\globalpushbox{\syst_boxes_push\global} \unexpanded\def\globalpopbox {\syst_boxes_pop \global} -% \unexpanded\def\pushbox#1{\ctxcommand{pushbox(\number#1)}} -% \unexpanded\def\popbox #1{\ctxcommand{popbox(\number#1)}} - %D \macros %D {removedepth, obeydepth} %D @@ -2776,12 +2843,16 @@ % {\dowithnextbox{\edef#1{\syst_boxes_nodestostring}}\hbox} % % \def\syst_boxes_nodestostring -% {\ctxcommand{boxtostring(\number\nextbox)}} +% {\clf_boxtostring\nextbox} \unexpanded\def\nodestostring#1#2% more tolerant for #2=\cs {\begingroup \setbox\nextbox\hbox{#2}% - \normalexpanded{\endgroup\edef\noexpand#1{\ctxcommand{boxtostring(\number\nextbox)}}}} + \normalexpanded{\endgroup\edef\noexpand#1{\clf_boxtostring\nextbox}}} + +%D Even more dirty: + +\let\hyphenatedhbox\hbox \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/supp-ran.lua b/Master/texmf-dist/tex/context/base/supp-ran.lua index 7997db8f648..1d34393fa64 100644 --- a/Master/texmf-dist/tex/context/base/supp-ran.lua +++ b/Master/texmf-dist/tex/context/base/supp-ran.lua @@ -10,12 +10,16 @@ if not modules then modules = { } end modules ['supp-ran'] = { local report_system = logs.reporter("system","randomizer") -local math = math -local context, commands = context, commands +local math = math +local context = context +local implement = interfaces.implement -local random, randomseed, round, seed, last = math.random, math.randomseed, math.round, false, 1 - -local maxcount = 2^30-1 -- 1073741823 +local random = math.random +local randomseed = math.randomseed +local round = math.round +local seed = false +local last = 1 +local maxcount = 2^30-1 -- 1073741823 local function setrandomseedi(n,comment) if not n then @@ -34,28 +38,23 @@ end math.setrandomseedi = setrandomseedi -function commands.getrandomcounta(min,max) +local function getrandomnumber(min,max) last = random(min,max) - context(last) -end - -function commands.getrandomcountb(min,max) - last = random(min,max)/65536 - context(last) + return last end -function commands.setrandomseed(n) +local function setrandomseed(n) last = n setrandomseedi(n) end -function commands.getrandomseed(n) - context(last) +local function getrandomseed() + return last end -- maybe stack -function commands.freezerandomseed(n) +local function freezerandomseed(n) if seed == false or seed == nil then seed = last setrandomseedi(seed,"freeze",seed) @@ -65,9 +64,18 @@ function commands.freezerandomseed(n) end end -function commands.defrostrandomseed() +local function defrostrandomseed() if seed ~= false then setrandomseedi(seed,"defrost",seed) -- was last (bug) seed = false end end + +implement { name = "getrandomnumber", actions = { getrandomnumber, context }, arguments = { "integer", "integer" } } +implement { name = "getrandomdimen", actions = { getrandomnumber, context }, arguments = { "dimen", "dimen" } } +implement { name = "getrandomfloat", actions = { getrandomnumber, context }, arguments = { "number", "number" } } +implement { name = "setrandomseed", actions = { setrandomseed }, arguments = { "integer" } } +implement { name = "getrandomseed", actions = { getrandomseed, context } } +implement { name = "freezerandomseed", actions = { freezerandomseed } } +implement { name = "defrostrandomseed", actions = { defrostrandomseed } } + diff --git a/Master/texmf-dist/tex/context/base/supp-ran.mkiv b/Master/texmf-dist/tex/context/base/supp-ran.mkiv index f5466a0e1fd..e491737170c 100644 --- a/Master/texmf-dist/tex/context/base/supp-ran.mkiv +++ b/Master/texmf-dist/tex/context/base/supp-ran.mkiv @@ -18,13 +18,15 @@ \registerctxluafile{supp-ran}{1.001} -\unexpanded\def\getrandomcount #1#2#3{#1=\ctxcommand{getrandomcounta(\number#2,\number#3)}\relax} -\unexpanded\def\getrandomdimen #1#2#3{#1=\ctxcommand{getrandomcounta(\number\dimexpr#2,\number\dimexpr#3)}\scaledpoint\relax} -\unexpanded\def\getrandomnumber#1#2#3{\edef#1{\ctxcommand{getrandomcounta(\number#2,\number#3)}}} -\unexpanded\def\getrandomfloat #1#2#3{\edef#1{\ctxcommand{getrandomcountb(\number\dimexpr#2\points,\number\dimexpr#3\points)}}} -\unexpanded\def\setrandomseed #1{\ctxcommand{setrandomseed(\number#1)}} -\unexpanded\def\getrandomseed #1{\edef#1{\ctxcommand{getrandomseed()}}} -\unexpanded\def\freezerandomseed {\ctxcommand{freezerandomseed()}} -\unexpanded\def\defrostrandomseed {\ctxcommand{defrostrandomseed()}} +\unprotect -\endinput +\unexpanded\def\getrandomcount #1#2#3{#1=\clf_getrandomnumber#2 #3\relax} +\unexpanded\def\getrandomdimen #1#2#3{#1=\clf_getrandomdimen#2 #3 \scaledpoint\relax} +\unexpanded\def\getrandomnumber#1#2#3{\edef#1{\clf_getrandomnumber#2 #3}} +\unexpanded\def\getrandomfloat #1#2#3{\edef#1{\clf_getrandomfloat#2 #3}} +\unexpanded\def\setrandomseed #1{\clf_setrandomseed#1\relax} +\unexpanded\def\getrandomseed #1{\edef#1{\clf_getrandomseed}} +\unexpanded\def\freezerandomseed {\clf_freezerandomseed} +\unexpanded\def\defrostrandomseed {\clf_defrostrandomseed} + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv b/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv index 45ea977328e..e753d695f8c 100644 --- a/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv +++ b/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv @@ -11,8 +11,10 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D LS/HH: This font has changed over time so there might be diffences +%D in rendering. The otf, ttf and type1 version can differ too. -\doiffontpresentelse{ccicons.otf} { % redone ctan version +\doifelsefontpresent{ccicons.otf} { % redone ctan version \definefontfeature [creativecommons] [mode=base, diff --git a/Master/texmf-dist/tex/context/base/symb-ini.lua b/Master/texmf-dist/tex/context/base/symb-ini.lua index 9586338be12..6a4a1882529 100644 --- a/Master/texmf-dist/tex/context/base/symb-ini.lua +++ b/Master/texmf-dist/tex/context/base/symb-ini.lua @@ -6,20 +6,27 @@ if not modules then modules = { } end modules ['symb-ini'] = { license = "see context related readme files" } -local context, commands = context, commands +local context = context +local variables = interfaces.variables -local variables = interfaces.variables +fonts = fonts or { } -- brrrr -fonts = fonts or { } -- brrrr +local symbols = fonts.symbols or { } +fonts.symbols = symbols -local symbols = fonts.symbols or { } -fonts.symbols = symbols +local listitem = utilities.parsers.listitem +local uselibrary = resolvers.uselibrary local report_symbols = logs.reporter ("fonts","symbols") local status_symbols = logs.messenger("fonts","symbols") -local patterns = { "symb-imp-%s.mkiv", "symb-imp-%s.tex", "symb-%s.mkiv", "symb-%s.tex" } -local listitem = utilities.parsers.listitem +local patterns = { + "symb-imp-%s.mkiv", + "symb-imp-%s.tex", + -- obsolete: + "symb-%s.mkiv", + "symb-%s.tex" +} local function action(name,foundname) -- context.startnointerference() @@ -37,7 +44,7 @@ end function symbols.uselibrary(name) if name ~= variables.reset then for name in listitem(name) do - commands.uselibrary { + uselibrary { name = name, patterns = patterns, action = action, @@ -48,4 +55,8 @@ function symbols.uselibrary(name) end end -commands.usesymbols = symbols.uselibrary +interfaces.implement { + name = "usesymbols", + actions = symbols.uselibrary, + arguments = "string", +} diff --git a/Master/texmf-dist/tex/context/base/symb-ini.mkiv b/Master/texmf-dist/tex/context/base/symb-ini.mkiv index e957e68c1f5..40a0af6d690 100644 --- a/Master/texmf-dist/tex/context/base/symb-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/symb-ini.mkiv @@ -74,9 +74,12 @@ \letvalue{\??symbolset}\empty -\unexpanded\def\doifinsymbolsetelse#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} +\unexpanded\def\doifelseinsymbolset#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} \unexpanded\def\doifinsymbolset #1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi} -\unexpanded\def\doifsymbolsetelse #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} +\unexpanded\def\doifelsesymbolset #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} + +\let\doifinsymbolsetelse\doifelseinsymbolset +\let\doifsymbolsetelse \doifelsesymbolset \def\symbolset#1{\csname\??symbolset\ifcsname\??symbolset#1\endcsname#1\fi\endcsname} % no [#1], to be used in commalists etc @@ -216,7 +219,7 @@ \def\symb_fetch_second#1% {\doifinsymbolset\empty\currentsymbol{\settrue\c_symb_found}} -\def\doifsymboldefinedelse#1% +\unexpanded\def\doifelsesymboldefined#1% {\begingroup \edef\currentsymbol{#1}% \let\symb_fetch\symb_fetch_first @@ -233,6 +236,8 @@ \fi \fi} +\let\doifsymboldefinedelse\doifelsesymboldefined + %D \macros %D {setupsymbolset,startsymbolset} %D @@ -300,7 +305,7 @@ %D %D \showsetup{usesymbols} -\unexpanded\def\usesymbols[#1]{\ctxcommand{usesymbols("#1")}} +\unexpanded\def\usesymbols[#1]{\clf_usesymbols{#1}} %D As longs as symbols are linked to levels or numbers, we can %D also use the conversion mechanism, but in for instance the diff --git a/Master/texmf-dist/tex/context/base/syst-aux.lua b/Master/texmf-dist/tex/context/base/syst-aux.lua index de15428f966..a880bace3b0 100644 --- a/Master/texmf-dist/tex/context/base/syst-aux.lua +++ b/Master/texmf-dist/tex/context/base/syst-aux.lua @@ -11,42 +11,66 @@ if not modules then modules = { } end modules ['syst-aux'] = { -- utfmatch(str,"(.?)(.*)$") -- utf.sub(str,1,1) -local commands, context = commands, context - -local settings_to_array = utilities.parsers.settings_to_array -local format = string.format +local tonumber = tonumber local utfsub = utf.sub -local P, S, C, Cc, Cs, Carg, lpegmatch, utf8char = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match, lpeg.patterns.utf8char - +local P, S, R, C, Cc, Cs, Carg, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match -local setvalue = context.setvalue - -local pattern = C(utf8char^-1) * C(P(1)^0) +local context = context +local implement = interfaces.implement +local formatters = string.formatters +local setcatcode = tex.setcatcode +local utf8character = lpeg.patterns.utf8character +local settings_to_array = utilities.parsers.settings_to_array +local setmacro = interfaces.setmacro + +local pattern = C(utf8character^-1) * C(P(1)^0) + +implement { + name = "getfirstcharacter", + arguments = "string", + actions = function(str) + local first, rest = lpegmatch(pattern,str) + setmacro("firstcharacter",first) + setmacro("remainingcharacters",rest) + end +} -function commands.getfirstcharacter(str) - local first, rest = lpegmatch(pattern,str) - setvalue("firstcharacter",first) - setvalue("remainingcharacters",rest) -end +implement { + name = "thefirstcharacter", + arguments = "string", + actions = function(str) + local first, rest = lpegmatch(pattern,str) + context(first) + end +} -function commands.thefirstcharacter(str) - local first, rest = lpegmatch(pattern,str) - context(first) -end -function commands.theremainingcharacters(str) - local first, rest = lpegmatch(pattern,str) - context(rest) -end +implement { + name = "theremainingcharacters", + arguments = "string", + actions = function(str) + local first, rest = lpegmatch(pattern,str) + context(rest) + end +} -local pattern = C(utf8char^-1) +local pattern = C(utf8character^-1) +local ctx_doifelse = commands.doifelse -function commands.doiffirstcharelse(chr,str) - commands.doifelse(lpegmatch(pattern,str) == chr) -end +implement { + name = "doifelsefirstchar", + arguments = { "string", "string" }, + actions = function(str,chr) + ctx_doifelse(lpegmatch(pattern,str) == chr) + end +} -function commands.getsubstring(str,first,last) - context(utfsub(str,tonumber(first),tonumber(last))) -end +implement { + name = "getsubstring", + arguments = { "string", "string", "string" }, + actions = function(str,first,last) + context(utfsub(str,tonumber(first),tonumber(last))) + end +} -- function commands.addtocommalist(list,item) -- if list == "" then @@ -78,21 +102,40 @@ end -- end -- end -local pattern = (C((1-P("%"))^1) * Carg(1)) /function(n,d) return format("%.0fsp",d * tonumber(n)/100) end * P("%") * P(-1) -- .0 ? +local pattern = (C((1-P("%"))^1) * Carg(1)) / function(n,d) + return formatters["%.0fsp"](d * tonumber(n)/100) end * P("%") * P(-1) -- .0 ? --- commands.percentageof("10%",65536*10) +-- percentageof("10%",65536*10) -function commands.percentageof(str,dim) - context(lpegmatch(pattern,str,1,dim) or str) -end +implement { + name = "percentageof", + arguments = { "string", "dimen" }, + actions = function(str,dim) + context(lpegmatch(pattern,str,1,dim) or str) + end +} -- \gdef\setpercentdimen#1#2% -- {#1=\ctxcommand{percentageof("#2",\number#1)}\relax} -local spaces = P(" ")^0/"" +local spaces = P(" ")^0 / "" +local nohash = 1 - P("#") +local digit = R("09") +local double = P("##") / "#" +local single = P("#") +local sentinel = spaces * (nohash^1 / "\\%0") +local sargument = (single * digit)^1 +local dargument = (double * digit)^1 -local pattern = Cs( - ( P("global") / "\\global" )^0 +local usespaces = nil +local texpreamble = nil + +local pattern = Cs( -- ^-1 + ( P("spaces") / function() usespaces = true return "" end )^0 + * spaces + * ( P("nospaces") / function() usespaces = false return "" end )^0 + * spaces + * ( P("global") / "\\global" )^0 * spaces * ( P("unexpanded") / "\\unexpanded" )^0 * spaces @@ -102,15 +145,85 @@ local pattern = Cs( * spaces * ( P((1-S(" #"))^1) / "def\\csname %0\\endcsname" ) * spaces - * Cs( (P("##")/"#" + P(1))^0 ) + * ( + -- (double * digit)^1 * sentinel^-1 * double^-1 + -- + (single * digit)^1 * sentinel^-1 * single^-1 + ( P("[") * dargument * P("]") + dargument)^1 * sentinel^-1 * double^-1 + + ( P("[") * sargument * P("]") + sargument)^1 * sentinel^-1 * single^-1 + + sentinel^-1 * (double+single)^-1 + ) ) -function commands.thetexdefinition(str) - context(lpegmatch(pattern,str)) +local ctx_dostarttexdefinition = context.dostarttexdefinition + +local function texdefinition_one(str) + usespaces = nil + texpreamble = lpegmatch(pattern,str) + if usespaces == true then + setcatcode(32,10) -- space + setcatcode(13, 5) -- endofline + elseif usespaces == false then + setcatcode(32, 9) -- ignore + setcatcode(13, 9) -- ignore + else + -- this is default + -- setcatcode(32,10) -- space + -- setcatcode(13, 9) -- ignore + end + ctx_dostarttexdefinition() +end + +local function texdefinition_two() + context(texpreamble) end -local upper, lower, strip = utf.upper, utf.lower, string.strip +implement { name = "texdefinition_one", actions = texdefinition_one, scope = "private", arguments = "string" } +implement { name = "texdefinition_two", actions = texdefinition_two, scope = "private" } + +implement { name = "upper", arguments = "string", actions = { utf.upper, context } } +implement { name = "lower", arguments = "string", actions = { utf.lower, context } } +implement { name = "strip", arguments = "string", actions = { string.strip, context } } -- or utf.strip + +-- implement { +-- name = "converteddimen", +-- arguments = { "dimen", "string" }, +-- actions = function(dimen,unit) +-- context(todimen(dimen,unit or "pt","%0.5f")) -- no unit appended (%F) +-- end +-- } + +-- where, not really the best spot for this: -function commands.upper(s) context(upper(s)) end -function commands.lower(s) context(lower(s)) end -function commands.strip(s) context(strip(s)) end +implement { + name = "immediatemessage", + arguments = { "'message'", "string" }, + actions = logs.status +} + +implement { + name = "resettimer", + actions = function() + statistics.resettiming("whatever") + statistics.starttiming("whatever") + end +} + +implement { + name = "elapsedtime", + actions = function() + statistics.stoptiming("whatever") + context(statistics.elapsedtime("whatever")) + end +} + +local accuracy = table.setmetatableindex(function(t,k) + local v = formatters["%0." ..k .. "f"] + t[k] = v + return v +end) + +implement { + name = "rounded", + arguments = "integer", + actions = function(n,m) context(accuracy[n](m)) end +} diff --git a/Master/texmf-dist/tex/context/base/syst-aux.mkiv b/Master/texmf-dist/tex/context/base/syst-aux.mkiv index 308e4b6fca5..308ed5a3ba4 100644 --- a/Master/texmf-dist/tex/context/base/syst-aux.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-aux.mkiv @@ -11,13 +11,17 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D There are some references to \LUA\ variants here but these concern -%D (often old) experiments, moved from local test modules to here, -%D cleaned up, but not really used. After all it's not that urgent -%D and replacing helpers is a delicate process. Don't depend on it. +%D There are some references to \LUA\ variants here but these concern (often old) +%D experiments, moved from local test modules to here, cleaned up, but not really +%D used. After all it's not that urgent and replacing helpers is a delicate process. +%D Don't depend on it. \registerctxluafile{syst-aux}{1.001} +% A dedicated primitive \ifvoidmacro\cs == \ifx\cs\empty is some 10% faster but +% probably not that noticeable in practice. An \ifvoidtoks might make sense but we +% don't test that often for it (and it's more work to implement in the engine). + %D This is a stripped down combination of: %D %D \startitemize @@ -26,20 +30,18 @@ %D \item \type {syst-new.tex} %D \stopitemize %D -%D We keep them around (for \MKII) so you can find comments, -%D experiences, intermediate versions and cleaner variants -%D there (and also non-\ETEX\ variants). +%D We keep them around (for \MKII) so you can find comments, experiences, +%D intermediate versions and cleaner variants there (and also non-\ETEX\ variants). %D -%D Contrary to the older files, we now assume that this one -%D is used in \CONTEXT\ and therefore we might also assume that -%D some basic functionality is available. +%D Contrary to the older files, we now assume that this one is used in \CONTEXT\ and +%D therefore we might also assume that some basic functionality is available. %D -%D The original files contain previous implementations and notes about -%D performance. This file will be stripped down in due time. - -%D Some of the macros here were only used in the bibliography module. They -%D have been be moved to a separate syst module since the bib module is no -%D longer using them. Some more will go away. +%D The original files contain previous implementations and notes about performance. +%D This file will be stripped down in due time. +%D +%D Some of the macros here were only used in the bibliography module. They have been +%D be moved to a separate syst module since the bib module is no longer using them. +%D Some more will go away. \unprotect @@ -72,13 +74,20 @@ % %def\expunded#1{\normalexpanded\expandafter{#1}} % \def\expunded#1{\expandafter\empty#1} % used within an edef anyway - %D As we don't have namespace definers yet, we use a special one: -\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes +\ifdefined\c_syst_helpers_n_of_namespaces + + % lets plug in a better error message + +\else + + \newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes -\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} -%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet + \def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} + %def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet + +\fi \unexpanded\def\installsystemnamespace#1% maybe move this to syst-ini {\ifcsname ??#1\endcsname @@ -278,12 +287,14 @@ %D {\localnext} because we don't want clashes with \type %D {\next}. -\unexpanded\def\doifnextcharelse#1#2#3% #1 should not be {} ! +\unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} ! {\let\charactertoken=#1% = needed here \def\m_syst_action_yes{#2}% \def\m_syst_action_nop{#3}% \futurelet\nexttoken\syst_helpers_inspect_next_character} +\let\doifnextcharelse\doifelsenextchar + \def\syst_helpers_inspect_next_character {\ifx\nexttoken\blankspace \expandafter\syst_helpers_reinspect_next_character @@ -318,18 +329,21 @@ \let\syst_helpers_next_optional_character_token=[ -\unexpanded\def\doifnextoptionalelse#1#2% +\unexpanded\def\doifelsenextoptional#1#2% {\def\m_syst_action_yes{#1}% \def\m_syst_action_nop{#2}% \let\if_next_blank_space_token\iffalse \futurelet\nexttoken\syst_helpers_inspect_next_optional_character} -\unexpanded\def\doifnextoptionalcselse#1#2% \cs \cs (upto 10% faster) +\unexpanded\def\doifelsenextoptionalcs#1#2% \cs \cs (upto 10% faster) {\let\m_syst_action_yes#1% \let\m_syst_action_nop#2% \let\if_next_blank_space_token\iffalse \futurelet\nexttoken\syst_helpers_inspect_next_optional_character} +\let\doifnextoptionalelse \doifelsenextoptional +\let\doifnextoptionalcselse\doifelsenextoptionalcs + \def\syst_helpers_inspect_next_optional_character {\ifx\nexttoken\blankspace \expandafter\syst_helpers_reinspect_next_optional_character @@ -346,18 +360,21 @@ \let\syst_helpers_next_bgroup_character_token\bgroup -\unexpanded\def\doifnextbgroupelse#1#2% +\unexpanded\def\doifelsenextbgroup#1#2% {\def\m_syst_action_yes{#1}% \def\m_syst_action_nop{#2}% \let\if_next_blank_space_token\iffalse \futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character} -\unexpanded\def\doifnextbgroupcselse#1#2% +\unexpanded\def\doifelsenextbgroupcs#1#2% {\let\m_syst_action_yes#1% \let\m_syst_action_nop#2% \let\if_next_blank_space_token\iffalse \futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character} +\let\doifnextbgroupelse \doifelsenextbgroup +\let\doifnextbgroupcselse\doifelsenextbgroupcs + \def\syst_helpers_inspect_next_bgroup_character {\ifx\nexttoken\blankspace \expandafter\syst_helpers_reinspect_next_bgroup_character @@ -374,12 +391,14 @@ \let\syst_helpers_next_parenthesis_character_token( -\unexpanded\def\doifnextparenthesiselse#1#2% +\unexpanded\def\doifelsenextparenthesis#1#2% {\def\m_syst_action_yes{#1}% \def\m_syst_action_nop{#2}% \let\if_next_blank_space_token\iffalse \futurelet\nexttoken\syst_helpers_inspect_next_parenthesis_character} +\let\doifnextparenthesiselse\doifelsenextparenthesis + \def\syst_helpers_inspect_next_parenthesis_character {\ifx\nexttoken\blankspace \expandafter\syst_helpers_reinspect_next_parenthesis_character @@ -396,16 +415,19 @@ %D The next one is handy in predictable situations: -\unexpanded\def\doiffastoptionalcheckelse#1#2% +\unexpanded\def\doifelsefastoptionalcheck#1#2% {\def\m_syst_action_yes{#1}% \def\m_syst_action_nop{#2}% \futurelet\nexttoken\syst_helpers_do_if_fast_optional_check_else} -\unexpanded\def\doiffastoptionalcheckcselse#1#2% \cs \cs +\unexpanded\def\doifelsefastoptionalcheckcs#1#2% \cs \cs {\let\m_syst_action_yes#1% \let\m_syst_action_nop#2% \futurelet\nexttoken\syst_helpers_do_if_fast_optional_check_else} +\let\doiffastoptionalcheckelse \doifelsefastoptionalcheck +\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs + \def\syst_helpers_do_if_fast_optional_check_else {\ifx\nexttoken\syst_helpers_next_optional_character_token \expandafter\m_syst_action_yes @@ -574,12 +596,12 @@ \suppressifcsnameerror\plusone -\def\doifundefinedelse#1% +\def\doifelseundefined#1% {\ifcsname#1\endcsname \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments \fi} -\def\doifdefinedelse#1% +\def\doifelsedefined#1% {\ifcsname#1\endcsname \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments \fi} @@ -594,6 +616,9 @@ \expandafter\firstofoneargument\else\expandafter\gobbleoneargument \fi} +\let\doifundefinedelse\doifelseundefined +\let\doifdefinedelse \doifelsedefined + %D \macros %D {letbeundefined} %D @@ -617,7 +642,7 @@ %D behavior in text and math mode, which was due to this grouping subtilities. We %D therefore decided to use \type{\begingroup} instead of \type{\bgroup}. -\unexpanded\def\doifalldefinedelse#1% +\unexpanded\def\doifelsealldefined#1% {\begingroup \donetrue % we could use a reserved one and avoid the group \processcommalist[#1]\syst_helpers_do_if_all_defined_else @@ -627,6 +652,8 @@ \endgroup\expandafter\secondoftwoarguments \fi} +\let\doifalldefinedelse\doifelsealldefined + \def\syst_helpers_do_if_all_defined_else#1% {\ifcsname#1\endcsname\else \donefalse @@ -690,7 +717,7 @@ %D %D This time, the string is not expanded. -\unexpanded\def\doifemptyelse#1% +\unexpanded\def\doifelseempty#1% {\def\m_syst_string_one{#1}% \ifx\m_syst_string_one\empty \expandafter\firstoftwoarguments @@ -698,6 +725,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doifemptyelse\doifelseempty + \unexpanded\def\doifempty#1% {\def\m_syst_string_one{#1}% \ifx\m_syst_string_one\empty @@ -763,7 +792,7 @@ \def\syst_helpers_re_do_if_in_set {\expandafter\syst_helpers_do_check_if_item_in_set \m_syst_string_two,],\relax} \def\syst_helpers_re_do_if_not_in_set {\expandafter\syst_helpers_do_check_if_item_not_in_set \m_syst_string_two,],\relax} -\unexpanded\def\doifinsetelse#1% make this two step too +\unexpanded\def\doifelseinset#1% make this two step too {\edef\m_syst_string_one{#1}% \ifx\m_syst_string_one\empty \expandafter\thirdofthreearguments @@ -771,6 +800,8 @@ \expandafter\syst_helpers_do_if_in_set_else \fi} +\let\doifinsetelse\doifelseinset + \def\syst_helpers_do_if_in_set_else#1% {\edef\m_syst_string_two{#1}% \ifx\m_syst_string_two\empty @@ -961,10 +992,12 @@ \fi\fi #1#2} -\unexpanded\def\doifcommonelse{\syst_helpers_do_do_if_common_else\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifelsecommon{\syst_helpers_do_do_if_common_else\firstoftwoarguments\secondoftwoarguments} \unexpanded\def\doifcommon {\syst_helpers_do_do_if_common_else\firstofoneargument \gobbleoneargument } \unexpanded\def\doifnotcommon {\syst_helpers_do_do_if_common_else\gobbleoneargument \firstofoneargument } +\let\doifcommonelse\doifelsecommon + %D \macros %D {processcommalist,processcommacommand,quitcommalist, %D processcommalistwithparameters} @@ -1306,10 +1339,12 @@ \let\firstcharacter \empty \let\remainingcharacters\empty -\unexpanded\def\getfirstcharacter #1{\ctxcommand{getfirstcharacter(\!!bs#1\!!es)}} -\unexpanded\def\doiffirstcharelse #1#2{\ctxcommand{doiffirstcharelse(\!!bs#1\!!es,\!!bs#2\!!es)}} % chr str -\unexpanded\def\thefirstcharacter #1{\ctxcommand{thefirstcharacter(\!!bs#1\!!es)}} -\unexpanded\def\theremainingcharacters#1{\ctxcommand{theremainingcharacters(\!!bs#1\!!es)}} +\unexpanded\def\getfirstcharacter #1{\clf_getfirstcharacter{#1}} +\unexpanded\def\doifelsefirstchar #1#2{\clf_doifelsefirstchar{#1}{#2}} +\unexpanded\def\thefirstcharacter #1{\clf_thefirstcharacter{#1}} +\unexpanded\def\theremainingcharacters#1{\clf_theremainingcharacters{#1}} + +\let\doiffirstcharelse\doifelsefirstchar %D \macros %D {doifinstringelse, doifincsnameelse} @@ -1323,7 +1358,7 @@ \let\m_syst_sub_string\empty -\unexpanded\def\doifinstringelse#1% +\unexpanded\def\doifelseinstring#1% {\edef\m_syst_sub_string{#1}% expand #1 here \ifx\m_syst_sub_string\empty \expandafter\thirdofthreearguments @@ -1331,6 +1366,8 @@ \expandafter\syst_helpers_do_if_in_string_else_indeed \fi} +\let\doifinstringelse\doifelseinstring + \unexpanded\def\syst_helpers_do_if_in_string_else_indeed#1% {\syst_helpers_do_if_in_string_else\m_syst_sub_string{#1}% \expandafter\firstoftwoarguments @@ -1393,13 +1430,15 @@ {\unless\if##2@}% \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@\_e_o_s_} -\unexpanded\def\doifincsnameelse#1#2% +\unexpanded\def\doifelseincsname#1#2% {\normalexpanded{\syst_helpers_do_if_in_csname_else{#1}}{#2}% \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifincsnameelse\doifelseincsname + %D \macros %D {doifnumberelse,doifnumber,doifnotnumber} %D @@ -1415,13 +1454,15 @@ %D The macro accepts \type {123}, \type {abc}, \type {{}}, \type {\getal} and %D \type {\the\count...}. This macro is a rather dirty one. -\def\doifnumberelse#1% does not accept counters (fully expandable) +\def\doifelsenumber#1% does not accept counters (fully expandable) {\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space \expandafter\secondoftwoarguments \else \expandafter\firstoftwoarguments \fi} +\let\doifnumberelse\doifelsenumber + \def\doifnumber#1% {\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space \expandafter\firstofoneargument @@ -1446,10 +1487,10 @@ %D \stoptyping \def\percentdimen#1#2% dimen percentage (with %) - {\dimexpr\ctxcommand{percentageof("#2",\number#1)}\relax} + {\dimexpr\clf_percentageof{#2}\dimexpr#1\relax} \unexpanded\def\setpercentdimen#1#2% dimen percentage (with %) - {#1=\ctxcommand{percentageof("#2",\number#1)}\relax} + {#1=\clf_percentageof{#2}\dimexpr#1\relax} %D \macros %D {makerawcommalist, @@ -1469,7 +1510,7 @@ %D %D \starttyping %D \makerawcommalist[string,string,...]\stringlist -%D \rawdoifinsetelse{string}{string,...}{...}{...} +%D \rawdoifelseinset{string}{string,...}{...}{...} %D \rawprocesscommalist[string,string,...]\commando %D \rawprocessaction[x][a=>\a,b=>\b,c=>\c] %D \stoptyping @@ -1504,12 +1545,12 @@ \unexpanded\def\rawprocesscommacommand[#1]% not really needed {\normalexpanded{\rawprocesscommalist[#1]}} -% \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}} +% \def\rawdoifelseinset#1#2{\doifinstringelse{,#1,}{,#2,}} % \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}} \def\m_syst_two_commas{,,} -\unexpanded\def\rawdoifinsetelse#1% +\unexpanded\def\rawdoifelseinset#1% {\edef\m_syst_sub_string{,#1,}% expand #1 here \ifx\m_syst_sub_string\m_syst_two_commas \expandafter\thirdofthreearguments @@ -1517,6 +1558,8 @@ \expandafter\syst_helpers_raw_do_if_in_set_else \fi} +\let\rawdoifinsetelse\rawdoifinsetelse + \unexpanded\def\syst_helpers_raw_do_if_in_set_else#1% {\syst_helpers_do_if_in_string_else\m_syst_sub_string{,#1,}% \expandafter\firstoftwoarguments @@ -2182,7 +2225,7 @@ \unexpanded\def\dosingleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\firstargumenttrue#1}% {\syst_helpers_single_empty_one_nop#1}} @@ -2194,13 +2237,13 @@ \unexpanded\def\dodoubleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_double_empty_one_yes#1}% {\syst_helpers_double_empty_one_nop#1}} \def\syst_helpers_double_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\secondargumenttrue#1[{#2}]}% {\syst_helpers_double_empty_two_nop#1{#2}}} @@ -2224,19 +2267,19 @@ \unexpanded\def\dotripleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_triple_empty_one_yes#1}% {\syst_helpers_triple_empty_one_nop#1}} \def\syst_helpers_triple_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_triple_empty_two_yes#1{#2}}% {\syst_helpers_triple_empty_two_nop#1{#2}}} \def\syst_helpers_triple_empty_two_yes#1#2[#3]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\thirdargumenttrue#1[{#2}][{#3}]}% {\syst_helpers_triple_empty_three_nop#1{#2}{#3}}} @@ -2272,25 +2315,25 @@ \unexpanded\def\doquadrupleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quadruple_empty_one_yes#1}% {\syst_helpers_quadruple_empty_one_nop#1}} \def\syst_helpers_quadruple_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quadruple_empty_two_yes#1{#2}}% {\syst_helpers_quadruple_empty_two_nop#1{#2}}} \def\syst_helpers_quadruple_empty_two_yes#1#2[#3]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quadruple_empty_three_yes#1{#2}{#3}}% {\syst_helpers_quadruple_empty_three_nop#1{#2}{#3}}} \def\syst_helpers_quadruple_empty_three_yes#1#2#3[#4]% {\thirdargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\fourthargumenttrue#1[{#2}][{#3}][{#4}]}% {\syst_helpers_quadruple_empty_four_nop#1{#2}{#3}{#4}}} @@ -2339,31 +2382,31 @@ \unexpanded\def\doquintupleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quintuple_empty_one_yes#1}% {\syst_helpers_quintuple_empty_one_nop#1}} \def\syst_helpers_quintuple_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quintuple_empty_two_yes#1{#2}}% {\syst_helpers_quintuple_empty_two_nop#1{#2}}} \def\syst_helpers_quintuple_empty_two_yes#1#2[#3]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quintuple_empty_three_yes#1{#2}{#3}}% {\syst_helpers_quintuple_empty_three_nop#1{#2}{#3}}} \def\syst_helpers_quintuple_empty_three_yes#1#2#3[#4]% {\thirdargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_quintuple_empty_four_yes#1{#2}{#3}{#4}}% {\syst_helpers_quintuple_empty_four_nop#1{#2}{#3}{#4}}} \def\syst_helpers_quintuple_empty_four_yes#1#2#3#4[#5]% {\fourthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\fifthargumenttrue#1[{#2}][{#3}][{#4}][{#5}]}% {\syst_helpers_quintuple_empty_five_nop#1{#2}{#3}{#4}{#5}}} @@ -2426,37 +2469,37 @@ \unexpanded\def\dosixtupleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_sixtuple_empty_one_yes#1} {\syst_helpers_sixtuple_empty_one_nop#1}} \def\syst_helpers_sixtuple_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_sixtuple_empty_two_yes#1{#2}}% {\syst_helpers_sixtuple_empty_two_nop#1{#2}}} \def\syst_helpers_sixtuple_empty_two_yes#1#2[#3]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_sixtuple_empty_three_yes#1{#2}{#3}}% {\syst_helpers_sixtuple_empty_three_nop#1{#2}{#3}}} \def\syst_helpers_sixtuple_empty_three_yes#1#2#3[#4]% {\thirdargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_sixtuple_empty_four_yes#1{#2}{#3}{#4}}% {\syst_helpers_sixtuple_empty_four_nop#1{#2}{#3}{#4}}} \def\syst_helpers_sixtuple_empty_four_yes#1#2#3#4[#5]% {\fourthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_sixtuple_empty_five_yes#1{#2}{#3}{#4}{#5}}% {\syst_helpers_sixtuple_empty_five_nop#1{#2}{#3}{#4}{#5}}} \def\syst_helpers_sixtuple_empty_five_yes#1#2#3#4#5[#6]% {\fifthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\sixthargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}]}% {\syst_helpers_sixtuple_empty_six_nop#1{#2}{#3}{#4}{#5}{#6}}} @@ -2534,43 +2577,43 @@ \unexpanded\def\doseventupleempty#1% {\syst_helpers_argument_reset - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_one_yes#1}% {\syst_helpers_seventuple_empty_one_nop#1}} \def\syst_helpers_seventuple_empty_one_yes#1[#2]% {\firstargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_two_yes#1{#2}}% {\syst_helpers_seventuple_empty_two_nop#1{#2}}} \def\syst_helpers_seventuple_empty_two_yes#1#2[#3]% {\secondargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_three_yes#1{#2}{#3}}% {\syst_helpers_seventuple_empty_three_nop#1{#2}{#3}}} \def\syst_helpers_seventuple_empty_three_yes#1#2#3[#4]% {\thirdargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_four_yes#1{#2}{#3}{#4}}% {\syst_helpers_seventuple_empty_four_nop#1{#2}{#3}{#4}}} \def\syst_helpers_seventuple_empty_four_yes#1#2#3#4[#5]% {\fourthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_five_yes#1{#2}{#3}{#4}{#5}}% {\syst_helpers_seventuple_empty_five_nop#1{#2}{#3}{#4}{#5}}} \def\syst_helpers_seventuple_empty_five_yes#1#2#3#4#5[#6]% {\fifthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\syst_helpers_seventuple_empty_six_yes#1{#2}{#3}{#4}{#5}{#6}}% {\syst_helpers_seventuple_empty_six_nop#1{#2}{#3}{#4}{#5}{#6}}} \def\syst_helpers_seventuple_empty_six_yes#1#2#3#4#5#6[#7]% {\sixthargumenttrue - \doifnextoptionalelse + \doifelsenextoptional {\seventhargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}]}% {\syst_helpers_seventuple_empty_seven_nop#1{#2}{#3}{#4}{#5}{#6}{#7}}} @@ -2726,13 +2769,13 @@ \unexpanded\def\complexorsimple#1% {% \relax % prevents lookahead, brrr - \doifnextoptionalelse + \doifelsenextoptional {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname} {\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}} \unexpanded\def\complexorsimpleempty#1% {% \relax % prevents lookahead, brrr - \doifnextoptionalelse + \doifelsenextoptional {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname} {\firstargumentfalse\csname\s!complex\strippedcsname#1\endcsname[]}} @@ -2744,10 +2787,10 @@ %D in protection. \unexpanded\def\syst_helpers_complex_or_simple#1#2% - {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#2}} + {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#2}} \unexpanded\def\syst_helpers_complex_or_simple_empty#1% - {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#1[]}} + {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#1[]}} \unexpanded\def\definecomplexorsimple#1% {\unexpanded\edef#1{\syst_helpers_complex_or_simple @@ -2948,7 +2991,14 @@ \def\fifthofsixarguments #1#2#3#4#5#6{#5} \def\sixthofsixarguments #1#2#3#4#5#6{#6} -\unexpanded\def\firstofoneunexpanded#1{#1} +\unexpanded\def\firstofoneunexpanded #1{#1} + +\unexpanded\def\firstoftwounexpanded #1#2{#1} +\unexpanded\def\secondoftwounexpanded #1#2{#2} + +\unexpanded\def\firstofthreeunexpanded #1#2#3{#1} +\unexpanded\def\secondofthreeunexpanded#1#2#3{#2} +\unexpanded\def\thirdofthreeunexpanded #1#2#3{#3} %D \macros %D {globalletempty,letempty, @@ -3033,7 +3083,7 @@ %D %D A fully expandable message: -\def\immediatemessage#1{\ctxlua{logs.status("message","#1")}} +\let\immediatemessage\clf_immediatemessage % {} mandate %D \macros %D {debuggerinfo} @@ -3249,6 +3299,25 @@ % [here #oeps: \the\scratchcounter] % \stoptexdefinition +% \bgroup \obeylines +% +% \global\let\stoptexdefinition\relax +% +% \unexpanded\gdef\starttexdefinition% +% {\bgroup% +% \obeylines% +% \syst_helpers_start_tex_definition_one} +% +% \gdef\syst_helpers_start_tex_definition_one#1 +% {\catcode\endoflineasciicode\ignorecatcode% +% \syst_helpers_start_tex_definition_two{#1}} +% +% \gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition% +% {\egroup% +% \ctxcommand{thetexdefinition("#1")}{#2}} +% +% \egroup + \bgroup \obeylines \global\let\stoptexdefinition\relax @@ -3256,19 +3325,19 @@ \unexpanded\gdef\starttexdefinition% {\bgroup% \obeylines% - \syst_helpers_start_tex_definition_one} + \syst_helpers_start_tex_definition} -\gdef\syst_helpers_start_tex_definition_one#1 +\gdef\syst_helpers_start_tex_definition#1 {\catcode\endoflineasciicode\ignorecatcode% - \syst_helpers_start_tex_definition_two{#1}} + \clf_texdefinition_one{#1}} -\gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition% +\gdef\dostarttexdefinition#1\stoptexdefinition% {\egroup% - \ctxcommand{thetexdefinition("#1")}{#2}} + \clf_texdefinition_two{#1}} \egroup -\unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname} +\unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname} % todo: a nop cs: char 0 or some corenamespace % This is a first variant, more might be added: @@ -3345,14 +3414,14 @@ \def\syst_helpers_do_do_do_increment#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+#2\relax}} \def\syst_helpers_do_do_do_decrement#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi-#2\relax}} -\def\syst_helpers_do_do_increment(#1{\doifnextcharelse,{\syst_helpers_do_do_do_increment#1}{\syst_helpers_do_do_do_increment#1,\plusone}} -\def\syst_helpers_do_do_decrement(#1{\doifnextcharelse,{\syst_helpers_do_do_do_decrement#1}{\syst_helpers_do_do_do_decrement#1,\plusone}} +\def\syst_helpers_do_do_increment(#1{\doifelsenextchar,{\syst_helpers_do_do_do_increment#1}{\syst_helpers_do_do_do_increment#1,\plusone}} +\def\syst_helpers_do_do_decrement(#1{\doifelsenextchar,{\syst_helpers_do_do_do_decrement#1}{\syst_helpers_do_do_do_decrement#1,\plusone}} \unexpanded\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}} \unexpanded\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}} -\unexpanded\def\increment{\doifnextcharelse(\syst_helpers_do_do_increment\syst_helpers_do_increment} -\unexpanded\def\decrement{\doifnextcharelse(\syst_helpers_do_do_decrement\syst_helpers_do_decrement} +\unexpanded\def\increment{\doifelsenextchar(\syst_helpers_do_do_increment\syst_helpers_do_increment} +\unexpanded\def\decrement{\doifelsenextchar(\syst_helpers_do_do_decrement\syst_helpers_do_decrement} \unexpanded\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname} \unexpanded\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname} @@ -3396,6 +3465,7 @@ {\expandafter\syst_helpers_checked_stripped_csname\string#1} \def\syst_helpers_checked_stripped_csname#1% + %{\ifx#1\letterbackslash\else#1\fi} {\if\noexpand#1\letterbackslash\else#1\fi} %D \macros @@ -4028,13 +4098,15 @@ \def\syst_helpers_check_if_assignment_else#1=#2#3\_e_o_p_{\if#2@}% -\unexpanded\def\doifassignmentelse#1% expandable +\unexpanded\def\doifelseassignment#1% expandable {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=@@\_e_o_p_ \expandafter\secondoftwoarguments \else \expandafter\firstoftwoarguments \fi} +\let\doifassignmentelse\doifelseassignment + \newif\ifassignment \unexpanded\def\docheckassignment#1% @@ -4107,7 +4179,7 @@ %D %D Watch the one level expansion of the second argument. -\unexpanded\def\doifmeaningelse#1#2% +\unexpanded\def\doifelsemeaning#1#2% {\edef\m_syst_string_one{\meaning#1}% \def \m_syst_string_two{#2}% \edef\m_syst_string_two{\meaning\m_syst_string_two}% @@ -4117,6 +4189,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doifmeaningelse\doifelsemeaning + %D \macros %D {doifsamestringselse,doifsamestring,doifnotsamestring} %D @@ -4134,10 +4208,12 @@ \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#4}}}% \ifx\m_syst_string_one\m_syst_string_two\expandafter#1\else\expandafter#2\fi} -\unexpanded\def\doifsamestringelse{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifelsesamestring{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments} \unexpanded\def\doifsamestring {\syst_helpers_if_samestring_else\firstofoneargument \gobbleoneargument } \unexpanded\def\doifnotsamestring {\syst_helpers_if_samestring_else\gobbleoneargument \firstofoneargument } +\let\doifsamestringelse\doifelsesamestring + %D \macros %D {ConvertToConstant,ConvertConstantAfter} %D @@ -4199,7 +4275,7 @@ \unexpanded\def\CheckConstantAfter#1#2% {\expandafter\convertargument\v!prefix!\to\ascii \convertargument#1\to#2\relax - \doifinstringelse\ascii{#2} + \doifelseinstring\ascii{#2} {\expandafter\convertargument#1\to#2} {}} @@ -4438,6 +4514,18 @@ {\m_syst_helpers_handle_group_after \egroup}% +\unexpanded\def\syst_helpers_handle_group_pickup#1#2#3% no inner group (so no kerning interference) + {\bgroup + \def\m_syst_helpers_handle_group_before{#1}% + \def\m_syst_helpers_handle_group_after {#2\egroup#3}% + \afterassignment\m_syst_helpers_handle_group_pickup_before + \let\next=} + +\def\m_syst_helpers_handle_group_pickup_before + {\bgroup + \aftergroup\m_syst_helpers_handle_group_after + \m_syst_helpers_handle_group_before} + \unexpanded\def\syst_helpers_handle_group_nop {\ifnum\currentgrouptype=\semisimplegroupcode \expandafter\syst_helpers_handle_group_nop_a @@ -4470,10 +4558,13 @@ %D implementation became: \unexpanded\def\groupedcommand#1#2% - {\doifnextbgroupelse{\syst_helpers_handle_group_normal{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}} + {\doifelsenextbgroup{\syst_helpers_handle_group_normal{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}} \unexpanded\def\simplegroupedcommand#1#2% - {\doifnextbgroupelse{\syst_helpers_handle_group_simple{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}} + {\doifelsenextbgroup{\syst_helpers_handle_group_simple{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}} + +\unexpanded\def\pickupgroupedcommand#1#2#3% + {\doifelsenextbgroup{\syst_helpers_handle_group_pickup{#1}{#2}{#3}}{\syst_helpers_handle_group_nop{#1}{#2}}} %D Users should be aware of the fact that grouping can %D interfere with ones paragraph settings that are executed @@ -4567,14 +4658,14 @@ \newtoks\AfterPar \def\redowithpar\par - {\doifnextcharelse\par\redowithpar\dodowithpar}% + {\doifelsenextchar\par\redowithpar\dodowithpar}% \def\dowithpar#1#2% {\def\dodowithpar##1\par{#1##1#2}% \redowithpar\par} \def\redogotopar\par - {\doifnextcharelse\par\redogotopar\dodogotopar}% + {\doifelsenextchar\par\redogotopar\dodogotopar}% \def\dogotopar#1% {\def\dodogotopar{#1}% @@ -4638,7 +4729,7 @@ \unexpanded\def\dowithpargument#1% {\def\syst_helpers_next_par##1 \par{#1{##1}}% \def\syst_helpers_next_arg##1{#1{##1}}% - \doifnextbgroupelse\syst_helpers_next_arg{\doifnextcharelse\par{#1{}}\syst_helpers_next_par}} + \doifelsenextbgroup\syst_helpers_next_arg{\doifelsenextchar\par{#1{}}\syst_helpers_next_par}} %D The \type{p} in the previous command stands for paragraph. %D When we want to act upon words we can use the \type{w} @@ -4668,7 +4759,7 @@ \unexpanded\def\dowithwargument#1% {\def\syst_helpers_next_war##1 {#1{##1}}% \def\syst_helpers_next_arg##1{#1{##1}}% - \doifnextbgroupelse\syst_helpers_next_arg\syst_helpers_next_war} + \doifelsenextbgroup\syst_helpers_next_arg\syst_helpers_next_war} %D \macros %D {dorepeat,dorepeatwithcommand} @@ -4763,11 +4854,13 @@ \expandafter\firstoftwoarguments \fi} -\def\doifstringinstringelse#1#2% +\def\doifelsestringinstring#1#2% {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3\_e_o_s_ {\syst_helpers_if_instring_else_indeed##2}% \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@\_e_o_s_} +\let\doifstringinstringelse\doifelsestringinstring + %D \macros %D {appendtoks,prependtoks,appendtoksonce,prependtoksonce, %D doifintokselse,flushtoks,dotoks} @@ -4813,19 +4906,21 @@ \def\syst_helpers_append_toks_once#1\to#2% {\let\m_syst_helpers_scratch#2% \t_syst_helpers_scratch\expandafter{\gobbleoneargument#1}% - \doifintokselse\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_append_toks_indeed} + \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_append_toks_indeed} \def\syst_helpers_prepend_toks_once#1\to#2% {\let\m_syst_helpers_scratch#2% \t_syst_helpers_scratch\expandafter{\gobbleoneargument#1}% - \doifintokselse\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_prepend_toks_indeed} + \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_prepend_toks_indeed} %D The test macro: -\unexpanded\def\doifintokselse#1#2% #1 en #2 zijn toks +\unexpanded\def\doifelseintoks#1#2% #1 en #2 zijn toks {\edef\asciia{\detokenize\expandafter{\the#1}}% \edef\asciib{\detokenize\expandafter{\the#2}}% - \doifstringinstringelse\asciia\asciib} + \doifelsestringinstring\asciia\asciib} + +\let\doifintokselse\doifelseintoks %D A nice one too: @@ -5019,24 +5114,26 @@ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}} \unexpanded\def\addtocommalist#1#2% {item} \cs - {\rawdoifinsetelse{#1}#2\resetglobal + {\rawdoifelseinset{#1}#2\resetglobal {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}} \unexpanded\def\pretocommalist#1#2% {item} \cs - {\rawdoifinsetelse{#1}#2\resetglobal + {\rawdoifelseinset{#1}#2\resetglobal {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}} -\unexpanded\def\robustdoifinsetelse#1#2% +\unexpanded\def\robustdoifelseinset#1#2% {\edef\m_syst_string_one{\detokenize\expandafter{\normalexpanded{#1}}}% \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#2}}}% - \rawdoifinsetelse\m_syst_string_one\m_syst_string_two} + \rawdoifelseinset\m_syst_string_one\m_syst_string_two} + +\let\robustdoifinsetelse\robustdoifelseinset \unexpanded\def\robustaddtocommalist#1#2% {item} \cs - {\robustdoifinsetelse{#1}#2\resetglobal + {\robustdoifelseinset{#1}#2\resetglobal {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}} \unexpanded\def\robustpretocommalist#1#2% {item} \cs - {\robustdoifinsetelse{#1}#2\resetglobal + {\robustdoifelseinset{#1}#2\resetglobal {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}} \unexpanded\def\xsplitstring#1#2% \cs {str} @@ -5050,7 +5147,7 @@ \def\acleanedupcommalist#1,,#2\relax{#1} \unexpanded\def\removefromcommalist#1#2% to be sped up - {\rawdoifinsetelse{#1}#2% + {\rawdoifelseinset{#1}#2% {\normalexpanded{\xsplitstring\noexpand#2{#1}}% \dodoglobal\edef#2% {\ifx\m_syst_string_one\empty @@ -5288,7 +5385,7 @@ \let\popmacro \localpopmacro %D \macros -%D {setlocalhsize} +%D {setlocalhsize,distributedhsize} %D %D Sometimes we need to work with the \type{\hsize} that is %D corrected for indentation and left and right skips. The @@ -5307,7 +5404,7 @@ \newdimen\localhsize \unexpanded\def\setlocalhsize % don't change ! - {\doifnextoptionalelse + {\doifelsenextoptional \syst_helpers_set_local_hsize_yes \syst_helpers_set_local_hsize_nop} @@ -5326,6 +5423,12 @@ \fi \relax} +\def\distributedhsize#1#2#3% + {\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax} + +\def\hsizefraction#1#2% + {\dimexpr#1/#2\relax} + %D \macros %D {doifvalue,doifnotvalue,doifelsevalue, %D doifnothing,doifsomething,doifelsenothing, @@ -5388,7 +5491,7 @@ \expandafter\secondoftwoarguments \fi} -\unexpanded\def\doifsomethingelse#1% +\unexpanded\def\doifelsesomething#1% {\edef\m_syst_string_one{#1}% \ifx\m_syst_string_one\empty \expandafter\secondoftwoarguments @@ -5420,18 +5523,25 @@ \expandafter\secondoftwoarguments \fi} +\let\doifvalueelse \doifelsevalue +\let\doifnothingelse \doifelsenothing +\let\doifsomethingelse \doifelsesomething +\let\doifvaluenothingelse\doifelsevaluenothing + %D \macros %D {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue} %D %D Also handy: -\def\doifemptyelsevalue#1% +\def\doifelseemptyvalue#1% {\expandafter\ifx\csname#1\endcsname\empty \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\let\doifemptyvalueelse\doifelseemptyvalue + \def\doifemptyvalue#1% {\expandafter\ifx\csname#1\endcsname\empty \expandafter\firstofoneargument @@ -5461,10 +5571,12 @@ \processcommalist[#3]\syst_helpers_do_common_check_all \ifdone\expandafter#1\else\expandafter#2\fi} -\unexpanded\def\doifallcommonelse{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifelseallcommon{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments} \unexpanded\def\doifallcommon {\syst_helpers_do_if_all_common_else\firstofonearguments\gobbleoneargument } \unexpanded\def\doifnotallcommon {\syst_helpers_do_if_all_common_else\gobbleoneargument \firstofonearguments } +\let\doifallcommonelse\doifelseallcommon + %D \macros %D {DOIF,DOIFELSE,DOIFNOT} %D @@ -5668,13 +5780,15 @@ \def\syst_helpers_if_some_space_else#1 #2#3\_e_o_s_{\if\noexpand#2@} -\def\doifsomespaceelse#1% % #2#3% +\def\doifelsesomespace#1% % #2#3% {\syst_helpers_if_some_space_else#1 @ @\_e_o_s_ % #3\else#2\fi} \expandafter\secondoftwoarguments \else \expandafter\firstoftwoarguments \fi} +\let\doifsomespaceelse\doifelsesomespace + %D \macros %D {processseparatedlist} %D @@ -5924,11 +6038,11 @@ %D These macros are sort of obsolete as we never use uppercase this %D way. But nevertheless we provide them: -\def\utfupper#1{\ctxcommand{upper(\!!bs#1\!!es)}} % expandable -\def\utflower#1{\ctxcommand{lower(\!!bs#1\!!es)}} % expandable +\def\utfupper#1{\clf_upper{#1}} % expandable +\def\utflower#1{\clf_lower{#1}} % expandable -\unexpanded\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\ctxcommand{upper(\!!bs#1\!!es)}}} -\unexpanded\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\ctxcommand{lower(\!!bs#1\!!es)}}} +\unexpanded\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\clf_upper{#1}}} +\unexpanded\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\clf_lower{#1}}} %D \macros %D {handletokens} @@ -6124,24 +6238,20 @@ % \def\threedigitrounding#1% % {\expandafter\expandafter\expandafter\dothreedigitrounding\expandafter\WITHOUTPT\the\dimexpr#1\points+.0005\points\relax0000.*00\relax} -\def\integerrounding #1{\cldcontext{"\letterpercent 0.0f",#1}} -\def\onedigitrounding #1{\cldcontext{"\letterpercent 0.1f",#1}} -\def\twodigitrounding #1{\cldcontext{"\letterpercent 0.2f",#1}} -\def\threedigitrounding#1{\cldcontext{"\letterpercent 0.3f",#1}} +\def\integerrounding #1{\clf_rounded\zerocount\numexpr#1\relax} +\def\onedigitrounding #1{\clf_rounded\plusone \numexpr#1\relax} +\def\twodigitrounding #1{\clf_rounded\plustwo \numexpr#1\relax} +\def\threedigitrounding#1{\clf_rounded\plusthree\numexpr#1\relax} %D \macros %D {processcontent} %D -%D This is the first occasion where \TEX\ and \ETEX\ are no -%D longer compatible, although in many cases things go ok. -%D Beware of verbatim, i.e. catcode changes. +%D This macro is first used in the tabulation macros. %D %D \starttyping %D \unexpanded\def\starthans% %D {\processcontent{stophans}\test{\message{\test}\wait}} %D \stoptyping -%D -%D This macro is first used in the tabulation macros. \unexpanded\def\processcontent#1% {\begingroup\expandafter\syst_helpers_process_content\csname#1\endcsname} @@ -6207,7 +6317,7 @@ %D Not that fast I guess, but here's a way to test for token %D registers being empty. -\unexpanded\def\doifsometokselse#1% +\unexpanded\def\doifelsesometoks#1% {\edef\m_syst_string_one{\the#1}% one level expansion so quite ok \ifx\m_syst_string_one\empty \expandafter\secondoftwoarguments @@ -6215,6 +6325,8 @@ \expandafter\firstoftwoarguments \fi} +\let\doifsometokselse\doifelsesometoks + \unexpanded\def\doifsometoks#1% {\edef\m_syst_string_one{\the#1}% one level expansion so quite ok \ifx\m_syst_string_one\empty @@ -6253,9 +6365,11 @@ \unexpanded\def\stopstrictinspectnextcharacter {\let\syst_helpers_inspect_next_character\syst_helpers_normal_inspect_next_character} -\def\strictdoifnextoptionalelse#1#2% +\unexpanded\def\strictdoifelsenextoptional#1#2% {\startstrictinspectnextcharacter - \doifnextcharelse[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}} + \doifelsenextchar[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}} + +\let\strictdoifnextoptionalelse\strictdoifelsenextoptional %D \macros %D {gobblespacetokens} @@ -6448,9 +6562,11 @@ %D %D This is a dirty one: we simply append a unit and discard it when needed. -\def\doifdimensionelse#1% +\def\doifelsedimension#1% {\afterassignment\syst_helpers_if_dimension_else\scratchdimen#1pt\relax} +\let\doifdimensionelse\doifelsedimension + \def\syst_helpers_if_dimension_else#1% {\ifx#1\relax \expandafter\secondoftwoarguments @@ -6479,7 +6595,9 @@ \installsystemnamespace{dimencheckb} \installsystemnamespace{dimencheckc} -\def\doifdimenstringelse#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]} +\def\doifelsedimenstring#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]} + +\let\doifdimenstringelse\doifelsedimenstring \def\dodimenteststageone #1#2{\csname \??dimenchecka\ifcsname \??dimenchecka#2\endcsname#2\else x\fi\endcsname#2} \def\dodimenteststagetwo #1#2{\csname \??dimencheckb\ifcsname \??dimencheckb#2\endcsname#2\else x\fi\endcsname#2} @@ -6602,10 +6720,12 @@ % sometimes handy: -\unexpanded\def\doifhasspaceelse#1% +\unexpanded\def\doifelsehasspace#1% {\edef\m_syst_string_one{#1}% \normalexpanded{\syst_helpers_if_has_space_else#1\space}\empty\relax} +\let\doifhasspaceelse\doifelsehasspace + \unexpanded\def\syst_helpers_if_has_space_else#1 #2#3\relax % \space\empty\relax {\ifx\m_syst_string_one\space \expandafter\firstoftwoarguments @@ -6614,7 +6734,7 @@ \else \doubleexpandafter\firstoftwoarguments \fi\fi} - + % this will replace loadfile once and alike !!! todo \installsystemnamespace{flag} @@ -6633,6 +6753,8 @@ \doubleexpandafter\secondoftwoarguments \fi\fi} +\let\doifflaggedelse\doifelseflagged + \def\doifnotflagged#1% {\expandafter\ifx\csname\??flag#1\endcsname\relax \expandafter\firstofoneargument @@ -6641,10 +6763,10 @@ \else \doubleexpandafter\firstofoneargument \fi\fi} - + \unexpanded\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey {\expandafter\def\csname#1#3\expandafter\endcsname\expandafter{\csname#1#5\endcsname}} - + \def\syst_helpers_if_non_zero_positive_else#1#2\end % #3#4% {\ifx#1\relax \ifcase\scratchcounter @@ -6659,9 +6781,11 @@ \expandafter\secondoftwoarguments \fi} -\def\doifnonzeropositiveelse#1% +\def\doifelsenonzeropositive#1% {\begingroup\afterassignment\syst_helpers_if_non_zero_positive_else\scratchcounter=0#1\relax\empty\end} - + +\let\doifnonzeropositiveelse\doifelsenonzeropositive + % here ? \unexpanded\def\dosetrawvalue #1#2#3{\expandafter \def\csname#1#2\endcsname{#3}} @@ -6705,8 +6829,8 @@ % \fi % \def\elapsedseconds{\expandafter\withoutpt\the\dimexpr\elapsedtime sp\relax} -\def\resettimer {\ctxcommand{resettimer()}} -\def\elapsedtime {\ctxcommand{elapsedtime()}} +\let\resettimer \clf_resettimer +\let\elapsedtime \clf_elapsedtime \let\elapsedseconds \elapsedtime \newcount\c_syst_helpers_test_feature_n @@ -6820,7 +6944,7 @@ %D \typebuffer \getbuffer \unexpanded\def\ignoreimplicitspaces - {\doifnextcharelse\relax\relax\relax} + {\doifelsenextchar\relax\relax\relax} %D \macros %D {processwords} @@ -6883,7 +7007,7 @@ \def\syst_helpers_direct_double_empty_one_nop#1{#1[][]} \def\syst_helpers_direct_double_empty_two_nop#1[#2]{#1[#2][]} -%D Used in math definitions (in an type {\edef}): +%D Used in math definitions (in an \type {\edef}): %D \startbuffer %D [\docheckedpair{}] @@ -6997,8 +7121,80 @@ % expandable: -%def\getsubstring#1#2#3{\cldcontext{utf.sub([[#3]],tonumber("#1"),tonumber("#2"))}} -\def\getsubstring#1#2#3{\ctxcommand{getsubstring(\!!bs#3\!!es,"#1","#2")}} +\def\getsubstring#1#2#3{\clf_getsubstring{#3}{#1}{#2}} + +%D Other dimensions than pt: + +% \def\converteddimen#1#2{\clf_converteddimen\dimexpr#1\relax{#2}} + +%D Maybe (looks ugly): +%D +%D \starttyping +%D \doifcase {foo} +%D {bar} {BAR} +%D {foo} {FOO} +%D {default} {DEFAULT} +%D +%D \doifcase {foo} +%D {bar} {BAR} +%D {foo} {\doifcase {bar} +%D {bar} {BAR} +%D {foo} {FOO} +%D {default} {DEFAULT} +%D } +%D {default} {DEFAULT} +%D \stoptyping + +% \doifcase {\btxfoundname{author}} +% {author} {\btxflush{author}} +% {editor} {\texdefinition{btx:apa:editor-or-editors}} +% {title} {\texdefinition{btx:apa:title-subtitle-type}} +% {default} {\btxflush{author}} + +% \unexpanded\def\doifcase#1% +% {\edef\m_case_asked{#1}% +% \syst_aux_case} +% +% \def\syst_aux_case#1% +% {\edef\m_case_temp{#1}% +% \ifx\m_case_temp\m_case_asked +% \expandafter\syst_aux_case_yes +% \else\ifx\m_case_temp\s!default +% \doubleexpandafter\firstofoneargument +% \else +% \doubleexpandafter\syst_aux_case_nop +% \fi\fi} +% +% \def\syst_aux_skip#1#2% +% {\edef\m_case_temp{#1}% +% \ifx\m_case_temp\s!default +% \expandafter\syst_aux_done +% \else +% \expandafter\syst_aux_skip +% \fi} +% +% \def\syst_aux_case_yes#1% +% {\def\syst_aux_done{#1}% +% \syst_aux_skip} +% +% \def\syst_aux_case_nop#1% +% {\syst_aux_case} + +%D \macros +%D {ntimes} +%D +%D some repetition: +%D +%D \startbuffer +%D \ntimes{*}{20} +%D \stopbuffer +%D +%D \typebuffer \blank gives: \getbuffer \blank +%D +%D This is not real fast but quite okay: + +%def\ntimes#1#2{\ifnum#2>\zerocount#1\ntimes{#1}{\numexpr#2-\plusone\relax}\fi} % 1.72 +\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax} % 0.33 \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/syst-con.lua b/Master/texmf-dist/tex/context/base/syst-con.lua index dfbd490518e..0fa685b2dab 100644 --- a/Master/texmf-dist/tex/context/base/syst-con.lua +++ b/Master/texmf-dist/tex/context/base/syst-con.lua @@ -7,16 +7,18 @@ if not modules then modules = { } end modules ['syst-con'] = { } local tonumber = tonumber +local math = math local utfchar = utf.char -local gsub, format = string.gsub, string.format +local gsub = string.gsub converters = converters or { } local converters = converters local context = context -local comands = commands +local commands = commands +local implement = interfaces.implement -local formatters = string,formatters +local formatters = string.formatters --[[ldx--

For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18) at @@ -28,45 +30,39 @@ function converters.octstringtonumber(n) tonumber(n, 8) end function converters.rawcharacter (n) utfchar(0x110000+n) end -converters.lchexnumber = formatters["%x" ] -converters.uchexnumber = formatters["%X" ] -converters.lchexnumbers = formatters["%02x"] -converters.uchexnumbers = formatters["%02X"] -converters.octnumber = formatters["%03o"] - -function commands.hexstringtonumber(n) context(tonumber(n,16)) end -function commands.octstringtonumber(n) context(tonumber(n, 8)) end - -function commands.rawcharacter (n) context(utfchar(0x110000+n)) end - -function commands.lchexnumber (n) context("%x" ,n) end -function commands.uchexnumber (n) context("%X" ,n) end -function commands.lchexnumbers (n) context("%02x",n) end -function commands.uchexnumbers (n) context("%02X",n) end -function commands.octnumber (n) context("%03o",n) end - -function commands.format(fmt,...) -- used ? - fmt = gsub(fmt,"@","%%") - context(fmt,...) -end - -local cosd, sind, tand = math.cosd, math.sind, math.tand -local cos, sin, tan = math.cos, math.sin, math.tan - --- unfortunately %s spits out: 6.1230317691119e-017 --- --- function commands.sind(n) context(sind(n)) end --- function commands.cosd(n) context(cosd(n)) end --- function commands.tand(n) context(tand(n)) end --- --- function commands.sin (n) context(sin (n)) end --- function commands.cos (n) context(cos (n)) end --- function commands.tan (n) context(tan (n)) end - -function commands.sind(n) context("%0.6F",sind(n)) end -function commands.cosd(n) context("%0.6F",cosd(n)) end -function commands.tand(n) context("%0.6F",tand(n)) end - -function commands.sin (n) context("%0.6F",sin (n)) end -function commands.cos (n) context("%0.6F",cos (n)) end -function commands.tan (n) context("%0.6F",tan (n)) end +local lchexnumber = formatters["%x"] +local uchexnumber = formatters["%X"] +local lchexnumbers = formatters["%02x"] +local uchexnumbers = formatters["%02X"] +local octnumber = formatters["%03o"] +local nicenumber = formatters["%0.6F"] + +converters.lchexnumber = lchexnumber +converters.uchexnumber = uchexnumber +converters.lchexnumbers = lchexnumbers +converters.uchexnumbers = uchexnumbers +converters.octnumber = octnumber +converters.nicenumber = nicenumber + +implement { name = "hexstringtonumber", actions = { tonumber, context }, arguments = { "integer", 16 } } +implement { name = "octstringtonumber", actions = { tonumber, context }, arguments = { "integer", 8 } } + +implement { name = "rawcharacter", actions = function(n) context(utfchar(0x110000+n)) end, arguments = "integer" } + +implement { name = "lchexnumber", actions = { lchexnumber, context }, arguments = "integer" } +implement { name = "uchexnumber", actions = { uchexnumber, context }, arguments = "integer" } +implement { name = "lchexnumbers", actions = { lchexnumbers, context }, arguments = "integer" } +implement { name = "uchexnumbers", actions = { uchexnumbers, context }, arguments = "integer" } +implement { name = "octnumber", actions = { octnumber, context }, arguments = "integer" } + +implement { name = "sin", actions = { math.sin, nicenumber, context }, arguments = "number" } +implement { name = "cos", actions = { math.cos, nicenumber, context }, arguments = "number" } +implement { name = "tan", actions = { math.tan, nicenumber, context }, arguments = "number" } + +implement { name = "sind", actions = { math.sind, nicenumber, context }, arguments = "number" } +implement { name = "cosd", actions = { math.cosd, nicenumber, context }, arguments = "number" } +implement { name = "tand", actions = { math.tand, nicenumber, context }, arguments = "number" } + +-- only as commands + +function commands.format(fmt,...) context((gsub(fmt,"@","%%")),...) end diff --git a/Master/texmf-dist/tex/context/base/syst-con.mkiv b/Master/texmf-dist/tex/context/base/syst-con.mkiv index de8ed597e1a..17c40781977 100644 --- a/Master/texmf-dist/tex/context/base/syst-con.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-con.mkiv @@ -46,10 +46,10 @@ %D [\expandafter\uchexnumber\expandafter{\the\zerocount}] %D \stoptyping -\def\lchexnumber #1{\ctxcommand{lchexnumber(\number#1)}} -\def\uchexnumber #1{\ctxcommand{uchexnumber(\number#1)}} -\def\lchexnumbers#1{\ctxcommand{lchexnumbers(\number#1)}} -\def\uchexnumbers#1{\ctxcommand{uchexnumbers(\number#1)}} +\def\lchexnumber #1{\clf_lchexnumber \numexpr#1\relax} +\def\uchexnumber #1{\clf_uchexnumber \numexpr#1\relax} +\def\lchexnumbers#1{\clf_lchexnumbers\numexpr#1\relax} +\def\uchexnumbers#1{\clf_uchexnumbers\numexpr#1\relax} \let\hexnumber\uchexnumber @@ -58,7 +58,7 @@ %D %D For unicode remapping purposes, we need octal numbers. -\def\octnumber#1{\ctxcommand{octnumber(\number#1)}} +\def\octnumber#1{\clf_octnumber\numexpr#1\relax} %D \macros %D {hexstringtonumber,octstringtonumber} @@ -67,8 +67,8 @@ %D a decimal number, thereby taking care of lowercase characters %D as well. -\def\hexstringtonumber#1{\ctxcommand{hexstringtonumber("#1")}} -\def\octstringtonumber#1{\ctxcommand{octstringtonumber("#1")}} +\def\hexstringtonumber#1{\clf_hexstringtonumber\numexpr#1\relax} +\def\octstringtonumber#1{\clf_octstringtonumber\numexpr#1\relax} %D \macros %D {rawcharacter} @@ -76,7 +76,7 @@ %D This macro can be used to produce proper 8 bit characters %D that we sometimes need in backends and round||trips. -\def\rawcharacter#1{\ctxcommand{rawcharacter(\number#1)}} +\def\rawcharacter#1{\clf_rawcharacter\numexpr#1\relax} %D \macros %D {twodigits, threedigits} @@ -126,23 +126,12 @@ %D \macros %D {setcalculatedsin,setcalculatedcos,setcalculatedtan} -%D -%D This saves some 2K in the format. At some point we will redo the -%D code that calls this. Beware: in \MKII\ this is a separate module. - -% \let\calculatesin\gobbleoneargument -% \let\calculatecos\gobbleoneargument -% \let\calculatetan\gobbleoneargument - -% \def\setcalculatedsin#1#2{\edef#1{\cldcontext{math.sind(#2)}}} % jit-unsafe -% \def\setcalculatedcos#1#2{\edef#1{\cldcontext{math.cosd(#2)}}} % jit-unsafe -% \def\setcalculatedtan#1#2{\edef#1{\cldcontext{math.tand(#2)}}} % jit-unsafe -\def\setcalculatedsin#1#2{\edef#1{\ctxcommand{sind(#2)}}} -\def\setcalculatedcos#1#2{\edef#1{\ctxcommand{cosd(#2)}}} -\def\setcalculatedtan#1#2{\edef#1{\ctxcommand{tand(#2)}}} +\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}} +\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}} +\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}} - \def\formatted#1{\ctxcommand{format(#1)}} -\unexpanded\def\format #1{\ctxcommand{format(#1)}} + \def\formatted#1{\ctxcommand{format(#1)}} % not clf +\unexpanded\def\format #1{\ctxcommand{format(#1)}} % not clf \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/syst-ini.mkiv b/Master/texmf-dist/tex/context/base/syst-ini.mkiv index a533f8a6a6a..8631aed9075 100644 --- a/Master/texmf-dist/tex/context/base/syst-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-ini.mkiv @@ -114,11 +114,6 @@ end } -%D Handy. - -\suppresslongerror = 1 -\suppressoutererror = 1 - %D \ETEX\ has a not so handy way of telling you the version number, i.e. the revision %D number has a period in it: @@ -198,7 +193,7 @@ \countdef \c_syst_last_allocated_language = 41 \c_syst_last_allocated_language = \c_syst_min_allocated_language % not used in context \countdef \c_syst_last_allocated_insertion = 42 \c_syst_last_allocated_insertion = \c_syst_min_allocated_insert \countdef \c_syst_last_allocated_family = 43 \c_syst_last_allocated_family = \c_syst_min_allocated_family % not used in context -\countdef \c_syst_last_allocated_attribute = 44 \c_syst_last_allocated_attribute = \c_syst_min_allocated_attribute +\countdef \c_syst_last_allocated_attribute = 44 \c_syst_last_allocated_attribute = \c_syst_min_allocated_attribute % not used in context \countdef \c_syst_min_counter_value = 125 \c_syst_min_counter_value = -"7FFFFFFF % beware, we use index 125 at the lua end \countdef \c_syst_max_counter_value = 126 \c_syst_max_counter_value = "7FFFFFFF % beware, we use index 126 at the lua end @@ -328,7 +323,7 @@ \newcount\scratchcounterone \newcount\scratchcountertwo \newcount\scratchcounterthree \newdimen \scratchdimenone \newdimen \scratchdimentwo \newdimen \scratchdimenthree \newskip \scratchskipone \newskip \scratchskiptwo \newskip \scratchskipthree -\newbox \scratchmuskipone \newbox \scratchmuskiptwo \newbox \scratchmuskipthree +\newmuskip\scratchmuskipone \newmuskip\scratchmuskiptwo \newmuskip\scratchmuskipthree \newtoks \scratchtoksone \newtoks \scratchtokstwo \newtoks \scratchtoksthree \newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree @@ -386,6 +381,8 @@ \newmuskip\zeromuskip \zeromuskip = 0mu \newmuskip\onemuskip \onemuskip = 1mu +\newmuskip\muquad \muquad = 18mu + \let\points \onepoint \let\halfpoint\halfapoint @@ -417,6 +414,7 @@ \chardef \plustwentythousand = 20000 \chardef \medcard = 32768 \chardef \maxcard = 65536 % pdftex has less mathchars +\chardef \maxcardminusone = 65535 %D \macros %D {doubleexpandafter,tripleexpandafter,expanded,startexpanded} @@ -631,6 +629,8 @@ %D %D In \LUATEX\ we have ways around this. +% no longer \errorstopmode cf. plain tex 3.141592653 + \normalprotected\def\tracingall {\tracingonline \plusone \tracingcommands \plusthree @@ -647,8 +647,7 @@ \tracingifs \plusone \tracingscantokens\plusone \tracingnesting \plusone - \tracingassigns \plustwo - \errorstopmode} + \tracingassigns \plustwo} \normalprotected\def\loggingall {\tracingall @@ -766,8 +765,8 @@ \normalprotected\def\newfraction#1{\let#1\!!plusone} -%D It would be handy to have a primitive \unless\ifcase because then we could -%D use nicer values. Anyhow, this conditional code used to be in the \type +%D It would be handy to have a primitive \type {\unless\ifcase} because then we +%D could use nicer values. Anyhow, this conditional code used to be in the \type %D {syst-aux} module but is now promoted to here. %D \macros @@ -1016,12 +1015,18 @@ % \bindprimitive ifabsnum ifpdfabsnum %D We need to make sure that we start up in \DVI\ mode, so, after testing for running -%D \PDFTEX, we default to \DVI. - -\pdfoutput \zerocount -\pdfminorversion \plusfive -\pdfgentounicode \plusone -\pdfinclusioncopyfonts\plusone +%D \PDFTEX, we default to \DVI. Why? + +\pdfoutput \zerocount +\pdfminorversion \plusseven +\pdfgentounicode \plusone +\pdfinclusioncopyfonts \plusone +\pdfinclusionerrorlevel \zerocount +\pdfdecimaldigits \plusten +\pdfhorigin 1 true in +\pdfvorigin \pdfhorigin +\pdfimageresolution 300 +\pdfpkresolution 600 \normalprotected\def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount} \normalprotected\def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine } @@ -1084,6 +1089,12 @@ \voffset\zeropoint \let\voffset\relax \newdimen\voffset % prevent messing up \hoffset\zeropoint \let\hoffset\relax \newdimen\hoffset % prevent messing up +%D Handy. + +\suppresslongerror \plusone +\suppressoutererror \plusone +\suppressmathparerror \plusone + %D While cleaning this code up a bit I was listening to Heather Nova's \CD\ Redbird. %D The first song on that \CD\ ends with a few lines suitable for ending this %D initialization module: @@ -1101,4 +1112,21 @@ %D %D So let's see what \TEX\ can do now that we've opened up the basic machinery. +%D Now we define a few helpers that we need in a very early stage. We hav eno message system +%D yet but redundant definitions are fatal anyway. + +\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes + +\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} +%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet + +\normalprotected\def\installsystemnamespace#1% + {\ifcsname ??#1\endcsname + \immediate\write16{fatal error: duplicate system namespace '#1'}% + \expandafter\normalend + \else + \global\advance\c_syst_helpers_n_of_namespaces\plusone + \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template_system}% + \fi} + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/syst-lua.lua b/Master/texmf-dist/tex/context/base/syst-lua.lua index cd7dcc062c5..a6665f4104a 100644 --- a/Master/texmf-dist/tex/context/base/syst-lua.lua +++ b/Master/texmf-dist/tex/context/base/syst-lua.lua @@ -6,16 +6,28 @@ if not modules then modules = { } end modules ['syst-lua'] = { license = "see context related readme files" } -local format, find, match, rep = string.format, string.find, string.match, string.rep +local find, match = string.find, string.match local tonumber = tonumber -local S, lpegmatch, lpegtsplitat = lpeg.S, lpeg.match, lpeg.tsplitat +local S, C, P, lpegmatch, lpegtsplitat = lpeg.S, lpeg.C, lpeg.P, lpeg.match, lpeg.tsplitat -commands = commands or { } -local commands = commands -local context = context +commands = commands or { } +local commands = commands -function commands.writestatus(...) logs.status(...) end -- overloaded later +local implement = interfaces.implement + +local two_strings = interfaces.strings[2] + +local context = context +local csprint = context.sprint + +local prtcatcodes = tex.prtcatcodes + +implement { -- will b eoverloaded later + name = "writestatus", + arguments = two_strings, + actions = logs.status, +} local ctx_firstoftwoarguments = context.firstoftwoarguments -- context.constructcsonly("firstoftwoarguments" ) local ctx_secondoftwoarguments = context.secondoftwoarguments -- context.constructcsonly("secondoftwoarguments") @@ -30,24 +42,60 @@ local ctx_gobbleoneargument = context.gobbleoneargument -- context.constru function commands.doifelse(b) if b then ctx_firstoftwoarguments() +-- csprint(prtcatcodes,[[\ui_ft]]) -- ctx_firstoftwoarguments + else + ctx_secondoftwoarguments() +-- csprint(prtcatcodes,[[\ui_st]]) -- ctx_secondoftwoarguments + end +end + +function commands.doifelsesomething(b) + if b and b ~= "" then + ctx_firstoftwoarguments() +-- csprint(prtcatcodes,[[\ui_ft]]) -- ctx_firstoftwoarguments else ctx_secondoftwoarguments() +-- csprint(prtcatcodes,[[\ui_st]]) -- ctx_secondoftwoarguments end end function commands.doif(b) if b then ctx_firstofoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments + else + ctx_gobbleoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments + end +end + +function commands.doifsomething(b) + if b and b ~= "" then + ctx_firstofoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments else ctx_gobbleoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments end end function commands.doifnot(b) if b then ctx_gobbleoneargument() +-- csprint(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments + else + ctx_firstofoneargument() +-- csprint(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments + end +end + +function commands.doifnotthing(b) + if b and b ~= "" then + ctx_gobbleoneargument() +-- csprint(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments else ctx_firstofoneargument() +-- csprint(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments end end @@ -68,7 +116,7 @@ end local s = lpegtsplitat(",") local h = { } -function commands.doifcommonelse(a,b) -- often the same test +local function doifelsecommon(a,b) -- often the same test local ha = h[a] local hb = h[b] if not ha then @@ -92,7 +140,7 @@ function commands.doifcommonelse(a,b) -- often the same test ctx_secondoftwoarguments() end -function commands.doifinsetelse(a,b) +local function doifelseinset(a,b) local hb = h[b] if not hb then hb = lpegmatch(s,b) h[b] = hb end for i=1,#hb do @@ -104,9 +152,21 @@ function commands.doifinsetelse(a,b) ctx_secondoftwoarguments() end +implement { + name = "doifelsecommon", + arguments = two_strings, + actions = doifelsecommon +} + +implement { + name = "doifelseinset", + arguments = two_strings, + actions = doifelseinset +} + local pattern = lpeg.patterns.validdimen -function commands.doifdimenstringelse(str) +function commands.doifelsedimenstring(str) if lpegmatch(pattern,str) then ctx_firstoftwoarguments() else @@ -114,11 +174,70 @@ function commands.doifdimenstringelse(str) end end -function commands.firstinset(str) - local first = match(str,"^([^,]+),") - context(first or str) -end +local p_first = C((1-P(",")-P(-1))^0) -function commands.ntimes(str,n) - context(rep(str,n or 1)) -end +implement { + name = "firstinset", + arguments = "string", + actions = function(str) context(lpegmatch(p_first,str or "")) end +} + +implement { + name = "ntimes", + arguments = { "string", "integer" }, + actions = { string.rep, context } +} + +implement { + name = "execute", + arguments = "string", + actions = os.execute -- wrapped in sandbox +} + +-- function commands.write(n,str) +-- if n == 18 then +-- os.execute(str) +-- elseif n == 16 then +-- -- immediate +-- logs.report(str) +-- else +-- -- at the tex end we can still drop the write / also delayed vs immediate +-- context.writeviatex(n,str) +-- end +-- end + +implement { + name = "doifelsesame", + arguments = two_strings, + actions = function(a,b) + if a == b then + ctx_firstoftwoarguments() + else + ctx_secondoftwoarguments() + end + end +} + +implement { + name = "doifsame", + arguments = two_strings, + actions = function(a,b) + if a == b then + ctx_firstofoneargument() + else + ctx_gobbleoneargument() + end + end +} + +implement { + name = "doifnotsame", + arguments = two_strings, + actions = function(a,b) + if a == b then + ctx_gobbleoneargument() + else + ctx_firstofoneargument() + end + end +} diff --git a/Master/texmf-dist/tex/context/base/syst-lua.mkiv b/Master/texmf-dist/tex/context/base/syst-lua.mkiv index 88a8c246e26..5e82a9ea9e7 100644 --- a/Master/texmf-dist/tex/context/base/syst-lua.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-lua.mkiv @@ -15,15 +15,18 @@ \unprotect -\def\expdoifelse#1#2{\ctxcommand{doifelse(\!!bs#1\!!es==\!!bs#2\!!es)}} -\def\expdoif #1#2{\ctxcommand{doif (\!!bs#1\!!es==\!!bs#2\!!es)}} -\def\expdoifnot #1#2{\ctxcommand{doifnot (\!!bs#1\!!es==\!!bs#2\!!es)}} +\def\expdoifelse#1#2{\clf_doifelsesame{#1}{#2}} +\def\expdoif #1#2{\clf_doifsame {#1}{#2}} +\def\expdoifnot #1#2{\clf_doifnotsame {#1}{#2}} % \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3 % \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5 -\def\expdoifcommonelse#1#2{\ctxcommand{doifcommonelse("#1","#2")}} -\def\expdoifinsetelse #1#2{\ctxcommand{doifinsetelse("#1","#2")}} +\def\expdoifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}} +\def\expdoifelseinset #1#2{\clf_doifelseinset {#1}{#2}} + +\def\expdoifcommonelse\expdoifelsecommon +\def\expdoifinsetelse \expdoifelseinset % we define these here, just in case ... @@ -32,7 +35,7 @@ \edef\!!bs{[\luastringsep[} \edef\!!es{]\luastringsep]} -\unexpanded\def\writestatus#1#2{\ctxcommand{writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}} +\unexpanded\def\writestatus#1#2{\clf_writestatus{#1}{#2}} % A handy helper: @@ -41,7 +44,7 @@ % We can omit the tex.ctxcatcodes here as nowadays we seldom % change the regime at the \TEX\ end: -\def\luaexpr#1{\directlua{tex.print(tostring(#1))}} +\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled % helpers: @@ -50,4 +53,49 @@ \def\ui_ft#1#2{#1} \def\ui_st#1#2{#2} +%D Let's bring this under \LUA\ (and therefore \MKIV\ sandbox) control: + +% \setnewconstant\c_syst_write 18 +% +% \unexpanded\def\write#1#% so we can handle \immediate +% {\ifnum#1=\c_syst_write +% \expandafter\syst_execute +% \else +% \normalwrite#1% +% \fi} +% +% \unexpanded\def\syst_execute#1% +% {\ctxlua{os.execute(\!!bs#1\!!es)}} + +%D But as we only use write 16 we could as well do all in \LUA\ +%D and ignore the rest. Okay, we still can do writes here but only +%D when not blocked. + +% Nicer would be if we could just disable write 18 and keep os.execute +% which in fact we can do by defining write18 as macro instead of +% primitive ... todo. + +% \unexpanded\def\write#1#% +% {\syst_write{#1}} +% +% \def\syst_write#1#2% +% {\ctxcommand{write(\number#1,\!!bs\normalunexpanded{#2}\!!es)}} +% +% \unexpanded\def\writeviatex#1#2% +% {\ifx\normalwrite\relax\else +% \normalwrite#1{#2}% +% \fi} + +% we have no way yet to pickup \immediate unless we redefine it +% we assume immediate execution + +\let\syst_write_execute\clf_execute % always {...} + +\unexpanded\def\write#1#% + {\ifnum#1=18 + \expandafter\syst_write_execute + \else + \normalwrite#1% + \fi} + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/syst-rtp.mkiv b/Master/texmf-dist/tex/context/base/syst-rtp.mkiv index f65e599eca5..82c0778b43f 100644 --- a/Master/texmf-dist/tex/context/base/syst-rtp.mkiv +++ b/Master/texmf-dist/tex/context/base/syst-rtp.mkiv @@ -13,6 +13,6 @@ \unprotect -\def\executesystemcommand#1{\ctxlua{os.execute([[#1]])}} +\let\executesystemcommand\clf_execute \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv index f7fbc0390df..4c892138e82 100644 --- a/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv @@ -138,6 +138,8 @@ \expandafter\secondoftwoarguments \fi} +\let\doiflinetablecparameterelse\doifelselinetablecparameter + \def\linetablecparameter#1% {\csname \ifcsname\??lec\number\linetablecolumn#1\endcsname @@ -614,7 +616,7 @@ {\global\linetablepage\zerocount \ifcase\linetablerepeat \else \ifcase\linetablepage \doif{\linetableparameter\c!repeat}\v!no - {\global\linetablepage\doifoddpageelse\plusone\plustwo}% + {\global\linetablepage\doifelseoddpage\plusone\plustwo}% \fi \fi} \def\flushlinetablehead diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii index 465ed44b21f..fbf43eb1edc 100644 --- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii +++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii @@ -423,7 +423,9 @@ \ifcsname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\fi \ifcsname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\csname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\fi % done - \global\letcscsname\@@tblsplitafter\csname\@@tbl\@@tbl\c!after\endcsname + \global\letcscsname\@@tblsplitafter \csname\@@tbl\@@tbl\c!after \endcsname + \global\letcscsname\@@tblsplitbefore \csname\@@tbl\@@tbl\c!before \endcsname + \global\letcscsname\@@tblsplitsamepage\csname\@@tbl\@@tbl\c!samepage\endcsname \relax} % we cannot use +n (checking on number/last/first would slow down too much) @@ -439,7 +441,9 @@ % \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR} % \eTABLE -\globallet\@@tblsplitafter\relax +\globallet\@@tblsplitafter \relax +\globallet\@@tblsplitbefore \relax +\globallet\@@tblsplitsamepage\relax % split + page: % @@ -851,7 +855,17 @@ {\noalign {\global\advance\tblrow\plusone \global\tblcol\zerocount - \global\tblspn\zerocount}% + \global\tblspn\zerocount + \bgroup % protect local vars + \@@tblsplitbefore + \egroup + \ifx\@@tblsplitsamepage\v!before + \unpenalty + \nobreak + \else\ifx\@@tblsplitsamepage\v!both + \unpenalty + \nobreak + \fi\fi}% \nexttblcol \kern\dimexpr\tbltblleftmargindistance-\tbltblcolumndistance\relax} @@ -862,7 +876,14 @@ {\nointerlineskip \ifnum\tblrow>\noftblheadlines \ifnum\gettblnob\tblrow=\zerocount - \allowbreak + \unpenalty + \ifx\@@tblsplitsamepage\v!after + \nobreak + \else\ifx\@@tblsplitsamepage\v!both + \nobreak + \else + \allowbreak + \fi\fi \fi \else \allowbreak % else no proper head split off diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv index a7a7ae50bc7..2b6f3a3ecf6 100644 --- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This module as a more modern variant in xtables but as we follow a bit +%D This module has a more modern variant in xtables but as we follow a bit %D different approach with settings there, this mechanism will stay. In fact %D each of them has its advantages. This module could be sped up a bit and made %D more efficient by delegating some housekeeping to \LUA\ but it's not worth @@ -19,8 +19,14 @@ %D real purpose in it. If needed I can squeeze out a few more percentages %D runtime. +% columndistance 'optimized' ... needs checking +% +% we don't need the alignment mechanism .. we can just pack the row in a box + \writestatus{loading}{ConTeXt Table Macros / Natural Tables} +% sometimes this helps (with nc going wild): \setupTABLE[maxwidth=100cm] +% % bug: width 3cm is not honored and column becomes too wide % as given width is added to distributed width % @@ -98,7 +104,7 @@ \to \t_tabl_ntb_cell_start \unexpanded\def\tabl_ntb_cell_start - {\inhibitblank + {% \inhibitblank \dotagTABLEcell %\tabl_ntb_next_level \usenaturaltablelocalstyleandcolor\c!style\c!color @@ -145,6 +151,9 @@ \newcount\c_tabl_ntb_maximum_row_span \newcount\c_tabl_ntb_maximum_col_span +\newcount\c_tabl_ntb_encountered_col +\newcount\c_tabl_ntb_encountered_max + \newtoks\t_tabl_ntb \newtoks\t_tabl_ntb_row @@ -162,6 +171,11 @@ \newdimen\d_tabl_ntb_height \newdimen\d_tabl_ntb_width +\newdimen\d_tabl_ntb_leftmargindistance +\newdimen\d_tabl_ntb_rightmargindistance +\newdimen\d_tabl_ntb_columndistance +\newdimen\d_tabl_ntb_maxwidth + \newtoks\everyTABLEpass % public \newcount\tablecellrows % public (needs checking) @@ -208,6 +222,8 @@ \installdirectcommandhandler \??naturaltable {naturaltable} % \??naturaltable \installsimpleframedcommandhandler \??naturaltablelocal {naturaltablelocal} \??naturaltablelocal +\installcorenamespace{naturaltabletal} +\installcorenamespace{naturaltablegal} \installcorenamespace{naturaltablenob} \installcorenamespace{naturaltabletag} \installcorenamespace{naturaltablecol} @@ -219,11 +235,26 @@ \installcorenamespace{naturaltablehei} \installcorenamespace{naturaltabledis} \installcorenamespace{naturaltableaut} +\installcorenamespace{naturaltablefwd} % forcedwidth \installcorenamespace{naturaltabletxt} \installcorenamespace{naturaltablespn} \installcorenamespace{naturaltableref} \installcorenamespace{naturaltableset} \installcorenamespace{naturaltablecell} +\installcorenamespace{naturaltablesqueeze} +\installcorenamespace{naturaltabletok} + +\letvalue{\??naturaltablesqueeze }\donefalse +\letvalue{\??naturaltablesqueeze\v!fit }\donetrue +\letvalue{\??naturaltablesqueeze\v!fixed}\donetrue +\letvalue{\??naturaltablesqueeze\v!broad}\donetrue +\letvalue{\??naturaltablesqueeze\v!local}\donetrue + +\def\tabl_ntb_let_gal{\global\expandafter\let\csname\??naturaltablegal\m_tabl_tbl_level\endcsname} +\def\tabl_ntb_get_gal{\csname\??naturaltablegal\m_tabl_tbl_level\endcsname} + +\def\tabl_ntb_let_tal#1{\global\expandafter\let\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname} +\def\tabl_ntb_get_tal#1{\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname} \def\tabl_ntb_set_nob#1{\expandafter\let\csname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone} \def\tabl_ntb_get_nob#1{\ifcsname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone\else\zerocount\fi} @@ -281,15 +312,22 @@ % \def\tabl_ntb_row_state#1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} % \def\tabl_ntb_col_state#1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} -\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone} -\def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone} +%def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone} +%def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone} + +%def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} +%def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} -\def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} -\def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} +\def\tabl_ntb_let_ref #1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} +\def\tabl_ntb_set_ref #1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} +\def\tabl_ntb_get_ref #1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi} -\def\tabl_ntb_let_ref#1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_set_ref#1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_get_ref#1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi} +\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone} +\def\tabl_ntb_spn_doifelse#1{\ifcase0\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname\relax % could be inlined + \expandafter\secondoftwoarguments % unset + \else + \expandafter\firstoftwoarguments % a span + \fi} % keep for a while: % @@ -317,6 +355,7 @@ \newif\ifenableTBLbreak \enableTBLbreakfalse \newif\ifmultipleTBLheads \multipleTBLheadsfalse \newif\iftightTBLrowspan \tightTBLrowspantrue +\newif\iftightTBLcolspan \tightTBLcolspanfalse \newif\iftraceTABLE \traceTABLEfalse @@ -549,7 +588,6 @@ % local \ifcsname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\fi % done - \xdef\m_tabl_ntb_after_split{\naturaltablelocalparameter\c!after}% to be checked \relax} % we cannot use +n (checking on number/last/first would slow down too much) @@ -565,7 +603,9 @@ % \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR} % \eTABLE -\let\m_tabl_ntb_after_split\relax +\let\m_tabl_ntb_before_split\empty +\let\m_tabl_ntb_after_split \empty +\let\m_tabl_ntb_same_page \empty % split + page: % @@ -577,6 +617,7 @@ \unexpanded\def\tabl_ntb_tr {\c_tabl_ntb_running_col\zerocount + \c_tabl_ntb_encountered_col\zerocount \advance\c_tabl_ntb_maximum_row\plusone \iffirstargument \expandafter\tabl_ntb_tr_yes @@ -591,7 +632,8 @@ \def\m_tabl_ntb_default_nc{\naturaltableparameter\c!nc} \unexpanded\def\tabl_ntb_td - {\iffirstargument + {\advance\c_tabl_ntb_encountered_col\plusone + \iffirstargument \expandafter\tabl_ntb_td_yes \else \expandafter\tabl_ntb_td_nop @@ -651,7 +693,10 @@ % save text \normalexpanded {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}% - {#1}{#2}} + {#1}{#2}% + \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max + \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col + \fi} \def\tabl_ntb_td_nop[#1]#2\eTD {\global\advance\c_tabl_ntb_spn\plusone\relax @@ -671,7 +716,10 @@ \tabl_ntb_let_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\empty \normalexpanded {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}% - {#1}{#2}} + {#1}{#2}% + \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max + \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col + \fi} \def\tabl_ntb_td_pass_n#1% {\scratchcounter\numexpr\m_tabl_ntb_n-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax @@ -850,10 +898,20 @@ \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema \resetcharacteralign % new \setupcurrentnaturaltablelocal[\c!align={\v!right,\v!broad,\v!high},#1]% + % + \d_tabl_ntb_leftmargindistance \naturaltablelocalparameter\c!leftmargindistance\relax + \d_tabl_ntb_rightmargindistance\naturaltablelocalparameter\c!rightmargindistance\relax + \d_tabl_ntb_columndistance \naturaltablelocalparameter\c!columndistance\relax + \d_tabl_ntb_maxwidth \naturaltablelocalparameter\c!maxwidth\relax + % \usesetupsparameter\naturaltablelocalparameter \doifelse{\naturaltablelocalparameter\c!textwidth}\v!local {\hsize\availablehsize} {\hsize\naturaltablelocalparameter\c!textwidth}% + \enableTBLbreakfalse + \multipleTBLheadsfalse + \autoTBLspreadfalse + \tightTBLcolspanfalse \processaction [\naturaltablelocalparameter\c!split] [ \v!yes=>\enableTBLbreaktrue, @@ -865,7 +923,8 @@ \tabl_ntb_preset_parameters \processallactionsinset [\naturaltablelocalparameter\c!option] - [\v!stretch=>\autoTBLspreadtrue]% + [\v!stretch=>\autoTBLspreadtrue,% + \v!tight=>\tightTBLcolspantrue]% \linewidth\naturaltablelocalparameter\c!rulethickness % needs to be frozen \dontcomplain \c_tabl_ntb_running_col \zerocount @@ -905,10 +964,10 @@ \unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode {% tricky and dirty order -) - \doifsometokselse\t_tabl_ntb_head % slow, better a flag + \doifelsesometoks\t_tabl_ntb_head % slow, better a flag {\the\t_tabl_ntb_head \c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax - \doifsometokselse\t_tabl_ntb_next + \doifelsesometoks\t_tabl_ntb_next {\the\t_tabl_ntb_next \c_tabl_ntb_n_of_next_lines\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_n_of_head_lines\relax}% {\c_tabl_ntb_n_of_next_lines\zerocount}% was 1 @@ -1013,7 +1072,7 @@ \ifautoTBLemptycell \normalexpanded {\tabl_ntb_set_txt_process\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}% - {}{\strut}% + {\c!option=\v!tight}{\strut\kern\scaledpoint}% the kern forces the tight \fi} \def\tabl_ntb_loop_two @@ -1045,79 +1104,179 @@ \newcount\c_tabl_prelocated_rows % \prelocateTBLrows{1000} may speed up large tables -\def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks} -\def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}} +% \def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks} +% \def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}} + +\def\tabl_ntb_row_start + {\t_tabl_ntb_row\emptytoks} + +\def\tabl_ntb_row_stop + {\ifenableTBLbreak + \tabl_ntb_row_stop_split + \else + \tabl_ntb_row_stop_boxed + \fi} + +\def\tabl_ntb_row_stop_boxed + {% \noindent % no, else double leftskip in narrower + \normalexpanded + {\t_tabl_ntb + {\the\t_tabl_ntb + % no need for init + \tabl_ntb_row_align_start + \the\t_tabl_ntb_row + \tabl_ntb_row_align_stop}}} + +\def\tabl_ntb_row_stop_split + {\ifcsname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname + \tabl_ntb_row_stop_split_yes + \else + \tabl_ntb_row_stop_split_nop + \fi} + +\def\tabl_ntb_row_stop_split_nop + {\normalexpanded + {\t_tabl_ntb + {\the\t_tabl_ntb + \tabl_ntb_row_align_reset + \tabl_ntb_row_align_start + \the\t_tabl_ntb_row + \tabl_ntb_row_align_stop}}} + +\def\tabl_ntb_row_stop_split_yes + {\begingroup + \csname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname + \xdef\m_tabl_ntb_before_split{\naturaltablelocalparameter\c!before}% to be checked + \xdef\m_tabl_ntb_after_split {\naturaltablelocalparameter\c!after}% to be checked + \xdef\m_tabl_ntb_same_page {\naturaltablelocalparameter\c!samepage}% + \endgroup + \normalexpanded + {\t_tabl_ntb + {\the\t_tabl_ntb + \tabl_ntb_row_align_set{\m_tabl_ntb_before_split}{\m_tabl_ntb_after_split}{\m_tabl_ntb_same_page}% + \tabl_ntb_row_align_start + \the\t_tabl_ntb_row + \tabl_ntb_row_align_stop}}} + +\unexpanded\def\tabl_ntb_row_align_set#1#2#3% + {\xdef\m_tabl_ntb_before_split{#1}% + \xdef\m_tabl_ntb_after_split {#2}% + \xdef\m_tabl_ntb_same_page {#3}} + +\unexpanded\def\tabl_ntb_row_align_reset + {\global\let\m_tabl_ntb_before_split\empty + \global\let\m_tabl_ntb_after_split \empty + \global\let\m_tabl_ntb_same_page \empty} \def\tabl_ntb_prelocate_error {\writestatus\m!system{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \the\c_tabl_prelocated_rows)}} % \prelocateTBLrows{1000} % may speed up large tables -\installcorenamespace{naturaltabletok} - \def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway - {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone{\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}% + {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone + {\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}% \def\tabl_ntb_row_start {\ifnum\c_tabl_ntb_row<\c_tabl_prelocated_rows\relax - \expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks + \tabl_ntb_prelocate_okay \else \tabl_ntb_prelocate_error \fi}% \def\tabl_ntb_row_stop - {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\tabl_ntb_row_align_stop}}}% + {\normalexpanded + {\t_tabl_ntb + {\the\t_tabl_ntb + \tabl_ntb_row_align_start + \the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname + \tabl_ntb_row_align_stop}}}% \global\c_tabl_prelocated_rows#1\relax} +\def\tabl_ntb_prelocate_okay + {\expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks} + % We use aligments to handle the empty (skipped) columns, so % that we don't have to (re|)|calculate these. -\def\tabl_ntb_column_skip - {\global\advance\c_tabl_ntb_col\plusone} - -\def\tabl_ntb_column_next - {\global\advance\c_tabl_ntb_col\plusone - \kern\naturaltablelocalparameter\c!columndistance - \aligntab} - -\def\tabl_ntb_column_span - {\span} - \let\m_tabl_ntb_saved_row\!!zerocount \let\m_tabl_ntb_saved_col\!!zerocount -\def\tabl_ntb_row_align_start - {\noalign{\tabl_ntb_row_align_reset}% - \tabl_ntb_column_next - \kern\dimexpr\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!columndistance\relax} - -\unexpanded\def\tabl_ntb_row_align_reset +\unexpanded\def\tabl_ntb_row_align_start {\global\advance\c_tabl_ntb_row\plusone - \global\c_tabl_ntb_col\zerocount - \global\c_tabl_ntb_spn\zerocount} + \global\c_tabl_ntb_col\plusone + \global\c_tabl_ntb_spn\zerocount + \tabl_ntb_row_align_start_inject + \dostarttagged\t!tablerow\empty + \hbox\bgroup + \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax} \unexpanded\def\tabl_ntb_row_align_stop - {\kern\dimexpr\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax - \crcr - \noalign - {\nointerlineskip - \ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines - \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount - \allowbreak - \fi - \else - \allowbreak % else no proper head split off - \fi - \bgroup % protect local vars - \m_tabl_ntb_after_split - \egroup - \bgroup % protect local vars - \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax - \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax - \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax - \doifsomething{\naturaltablelocalparameter\c!spaceinbetween} - {\blank[\naturaltablelocalparameter\c!spaceinbetween]}% - \fi - \fi - \egroup}} + {\kern\dimexpr\d_tabl_ntb_rightmargindistance-\d_tabl_ntb_columndistance\relax + \egroup + \dostoptagged + \tabl_ntb_row_align_stop_inject} + +\unexpanded\def\tabl_ntb_before_page + {\ifx\m_tabl_ntb_same_page\v!before + % \blank[\v!samepage,\v!strong]% + \unpenalty + \nobreak + \else\ifx\m_tabl_ntb_same_page\v!both + % \blank[\v!samepage,\v!strong]% + \unpenalty + \nobreak + \fi\fi} + +\unexpanded\def\tabl_ntb_after_page + {\ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines + \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount + \unpenalty + \ifx\m_tabl_ntb_same_page\v!after + % \blank[\v!samepage,\v!strong]% + \nobreak + \else\ifx\m_tabl_ntb_same_page\v!both + % \blank[\v!samepage,\v!strong]% + \nobreak + \else + % \blank[\v!preference,\v!weak]% + \allowbreak + \fi\fi + \fi + \else + % \blank[\v!preference,\v!weak]% + \allowbreak % else no proper head split off + \fi} + +\unexpanded\def\tabl_ntb_inbetween + {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax + \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax + \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax + \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}% + \ifx\p_spaceinbetween\empty\else + \blank[\p_spaceinbetween]% + \fi + \fi + \fi} + +\unexpanded\def\tabl_ntb_row_align_start_inject + {\bgroup % protect local vars + \m_tabl_ntb_before_split + \egroup + \ifenableTBLbreak + \tabl_ntb_before_page + \fi} + +\unexpanded\def\tabl_ntb_row_align_stop_inject + {\par + \nointerlineskip + \ifenableTBLbreak + \tabl_ntb_after_page + \fi + \bgroup % protect local vars + \m_tabl_ntb_after_split + \egroup + \bgroup % protect local vars + \tabl_ntb_inbetween + \egroup} \def\tabl_ntb_flush_content {\the\everyTABLEpass @@ -1125,47 +1284,56 @@ \global\c_tabl_ntb_col\zerocount \global\c_tabl_ntb_row\zerocount \global\advance\c_tabl_ntb_row\minusone - \tabskip\zeropoint - \dostarttagged\t!table\empty - \dostarttagged\t!tablerow\empty - \appendtoks\dostoptagged\dostarttagged\t!tablerow\empty\to\everycr - \halign\bgroup - \registerparoptions - % watch out: tagging the cell happens at the outer level (faster) - \ignorespaces\alignmark\alignmark\unskip - \aligntab\aligntab - \ignorespaces\alignmark\alignmark\unskip - \cr % one too many - \the\t_tabl_ntb - \dostoptagged - \egroup + \dostarttaggedchained\t!table\empty\??naturaltable + %\registerparoptions % (*) triggers max hsize + \the\t_tabl_ntb \dostoptagged} +\unexpanded\def\tabl_ntb_span#1% + {\dorecurse{#1} + {\hskip\tabl_ntb_get_wid\c_tabl_ntb_col\relax + \global\advance\c_tabl_ntb_col\plusone}} + +\unexpanded\def\tabl_ntb_skip#1% + {\global\advance\c_tabl_ntb_col#1\relax} + +\unexpanded\def\tabl_ntb_plus + {\global\advance\c_tabl_ntb_col\plusone + \kern\d_tabl_ntb_columndistance} + +% \setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2% +% {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax +% \ifnum\scratchcounter>\zerocount +% \normalexpanded +% {\t_tabl_ntb_row +% {\the\t_tabl_ntb_row +% \tabl_ntb_span{\the\scratchcounter}% +% \tabl_ntb_plus}}% +% \fi} + \setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2% {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax \ifnum\scratchcounter>\zerocount - \advance\scratchcounter\minusone - \ifnum\scratchcounter>\zerocount - \tabl_ntb_span - \fi - \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next} + \normalexpanded + {\t_tabl_ntb_row + {\the\t_tabl_ntb_row + \tabl_ntb_span{\the\scratchcounter}}}% \fi} \setvalue{\??naturaltablecell\the\c_tabl_ntb_cell}#1#2% {\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_pass #1 #2 }% space delimited -> less tokens \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax \ifnum\scratchcounter>\zerocount - \advance\scratchcounter\minusone - \ifnum\scratchcounter>\zerocount - \tabl_ntb_span - \fi - \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next} + \normalexpanded + {\t_tabl_ntb_row + {\the\t_tabl_ntb_row + \ifnum\scratchcounter=\plusone + \tabl_ntb_plus + \else + \tabl_ntb_skip{\the\scratchcounter}% + \fi}}% \fi} -\def\tabl_ntb_span - {\dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_span}}% - \dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_skip}}} - \unexpanded\def\tabl_ntb_cell#1#2% {\csname\??naturaltablecell\the\tabl_ntb_get_tag{#1}{#2}\endcsname{#1}{#2}} @@ -1183,16 +1351,22 @@ {\d_tabl_ntb_width\zeropoint \scratchcounter\c_tabl_ntb_col \!!counta\tabl_ntb_get_col{#1}{#2}\relax - \dorecurse\!!counta - {\advance\d_tabl_ntb_width\dimexpr - \tabl_ntb_get_wid\scratchcounter - +\naturaltablelocalparameter\c!columndistance - \ifnum\recurselevel<\!!counta - +\tabl_ntb_get_dis\scratchcounter - \fi - \relax - \advance\scratchcounter\plusone}% - \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax + \ifcase\!!counta\or + \advance\d_tabl_ntb_width\dimexpr + \tabl_ntb_get_wid\scratchcounter + \relax + \advance\scratchcounter\plusone + \else + \dorecurse\!!counta + {\advance\d_tabl_ntb_width\dimexpr + \tabl_ntb_get_wid\scratchcounter + \ifnum\recurselevel<\!!counta + +\d_tabl_ntb_columndistance + +\tabl_ntb_get_dis\scratchcounter + \fi + \relax + \advance\scratchcounter\plusone}% + \fi \setbox\scratchbox\hbox{\tabl_ntb_get_txt{#1}{#2}}% \tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}% \tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}% @@ -1223,16 +1397,22 @@ % width \d_tabl_ntb_width\zeropoint \scratchcounter\c_tabl_ntb_col - \dorecurse\!!counta - {\advance\d_tabl_ntb_width\dimexpr - \tabl_ntb_get_wid\scratchcounter - +\naturaltablelocalparameter\c!columndistance - \ifnum\recurselevel<\!!counta - +\tabl_ntb_get_dis\scratchcounter - \fi - \relax - \advance\scratchcounter\plusone}% - \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax + \ifcase\!!counta\or + \advance\d_tabl_ntb_width\dimexpr + \tabl_ntb_get_wid\scratchcounter + \relax + \advance\scratchcounter\plusone + \else + \dorecurse\!!counta + {\advance\d_tabl_ntb_width\dimexpr + \tabl_ntb_get_wid\scratchcounter + \ifnum\recurselevel<\!!counta + +\d_tabl_ntb_columndistance + +\tabl_ntb_get_dis\scratchcounter + \fi + \relax + \advance\scratchcounter\plusone}% + \fi % cell \setbox\scratchbox\hbox attr \taggedattribute \attribute\taggedattribute \bgroup \dotagTABLEsignal % maybe we need to add some packaging in this case @@ -1280,10 +1460,13 @@ \fi} \def\tabl_ntb_table_stop - {\setbox\scratchbox\hbox - {\setupcurrentnaturaltablelocal[\c!frame=\v!off,\c!background=,\c!align=\v!no]% - \inheritednaturaltablelocalframed{\strut}}% - \edef\minimalcellheight{\the\ht\scratchbox}% not used + {\forgetall % new, here see narrower-004.tex + %\setbox\scratchbox\hbox + % {\letnaturaltablelocalparameter\c!frame\v!off + % \letnaturaltablelocalparameter\c!background\empty + % \letnaturaltablelocalparameter\c!align\v!no + % \inheritednaturaltablelocalframed{\strut}}% + %\edef\minimalcellheight{\the\ht\scratchbox}% not used \dorecurse\c_tabl_ntb_maximum_col {\tabl_ntb_let_aut\recurselevel\zeropoint % new @@ -1292,14 +1475,22 @@ {\tabl_ntb_let_wd\recurselevel\c_tabl_ntb_current_col_one\zeropoint \tabl_ntb_let_ht\recurselevel\c_tabl_ntb_current_col_one\zeropoint}% % till here + \tabl_ntb_let_tal\recurselevel\zerocount \tabl_ntb_let_wid\recurselevel\zeropoint \tabl_ntb_let_dis\recurselevel\zeropoint}% \dorecurse\c_tabl_ntb_maximum_row {\tabl_ntb_let_hei\recurselevel\maxdimen}% + \tabl_ntb_let_gal\zerocount \c_tabl_tbl_pass\plusone \let\tabl_ntb_pass\tabl_ntb_pass_one \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a - \setbox0\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \ifcase\tabl_ntb_get_gal\or + % \c_tabl_tbl_pass\plusone + % \let\tabl_ntb_pass\tabl_ntb_pass_one + \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a_extra + \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \fi \tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint \ifautoTBLspread % experimental, stretch non fixed cells to \hsize @@ -1308,21 +1499,24 @@ \tabl_ntb_stretch_widths \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% - \else\ifdim\wd0>\hsize + \else\ifdim\wd\scratchbox>\hsize \ifautoTBLhsize \tabl_ntb_check_widths_one % trial run \tabl_ntb_check_widths_two % real run \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% \fi - \else\ifautoTBLrowspan\ifnum\c_tabl_ntb_maximum_row_span>1 % max ? + \else\ifautoTBLrowspan\ifnum\c_tabl_ntb_maximum_row_span>\plusone % max ? % added jan 2002 because nx=* did no longer work + \ifnum\c_tabl_ntb_encountered_max<\c_tabl_ntb_maximum_col + % added jun 2014 because someone had less columns than nx .. sigh / see *nx* + \writestatus\m!TABLE{missing\space\number\numexpr\c_tabl_ntb_maximum_col-\c_tabl_ntb_encountered_max\relax\space column(s), guessing widths}% + \fi \edef\savedhsize{\the\hsize}% - \hsize\wd0\relax % new per 17/04/2006 + \hsize\wd\scratchbox\relax % new per 17/04/2006 \tabl_ntb_check_widths_one % trial run \tabl_ntb_check_widths_two % real run \hsize\savedhsize - % \let\tabl_ntb_cell_process\tabl_ntb_cell_process_c \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% \fi\fi\fi\fi @@ -1336,39 +1530,56 @@ \c_tabl_tbl_pass\plusthree \let\tabl_ntb_pass\tabl_ntb_pass_three \ifnum\m_tabl_tbl_level>\plusone - \expandafter\tabl_tbl_split_nop + \tabl_tbl_split_nop \else\ifenableTBLbreak - \doubleexpandafter\tabl_tbl_split_yes + \tabl_tbl_split_yes \else - \doubleexpandafter\tabl_tbl_split_nop - \fi\fi{\tabl_ntb_flush_content}} + \tabl_tbl_split_nop + \fi\fi} \def\tabl_ntb_stretch_widths % more variants, e.g. a max to \dimend {\ifcase\c_tabl_ntb_maximum_col\else % else division by zero \!!dimend\zeropoint - \!!dimene\hsize + \!!dimene\dimexpr + \hsize + -\d_tabl_ntb_leftmargindistance + -\d_tabl_ntb_rightmargindistance + +\d_tabl_ntb_columndistance + \relax \dorecurse\c_tabl_ntb_maximum_col - {\advance\!!dimend\dimexpr\tabl_ntb_get_wid\recurselevel+\naturaltablelocalparameter\c!columndistance\relax - \advance\!!dimene-\tabl_ntb_get_dis\recurselevel}% - \advance\!!dimend\dimexpr-\naturaltablelocalparameter\c!columndistance+\naturaltablelocalparameter\c!leftmargindistance+\naturaltablelocalparameter\c!rightmargindistance\relax + {\advance\!!dimend\dimexpr + \tabl_ntb_get_wid\recurselevel + \relax + \advance\!!dimene\dimexpr + -\tabl_ntb_get_dis\recurselevel + -\d_tabl_ntb_columndistance + \relax}% + \relax % distribute width (stretch) \ifdim\!!dimend<\!!dimene \advance\!!dimend-\!!dimene - \!!dimend-\!!dimend \divide\!!dimend\c_tabl_ntb_maximum_col \dorecurse\c_tabl_ntb_maximum_col - {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel+\!!dimend\relax}}% + {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel-\!!dimend\relax}}% \fi \fi} -\def\tabl_tbl_split_nop#1% - {\setbox\b_tabl_ntb_final\vbox{#1}% +\def\tabl_tbl_split_nop + {\setbox\b_tabl_ntb_final\vbox{\tabl_ntb_flush_content}% \postprocessTABLEbox\b_tabl_ntb_final \beforeTABLEbox + % packaging prevents max hsized box + % \hbox{\registerparoptions\box\b_tabl_ntb_final}% (*) better here + % better : + \ifinsidefloat + % nothing, else we get a \hsized box + \else + \registerparoptions % (*) better here + \fi \box\b_tabl_ntb_final \afterTABLEbox} -\def\tabl_tbl_split_yes % #1 +\def\tabl_tbl_split_yes {\ifinsidesplitfloat \donetrue \else\ifinsidefloat @@ -1386,14 +1597,15 @@ \let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox -\def\tabl_ntb_split_box#1% +\def\tabl_ntb_split_box {\resettsplit \def\tsplitminimumfreelines{2}% \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\naturaltablelocalparameter\c!splitoffset\relax}% \def\tsplitbeforeresult {\beforeTABLEsplitbox}% \def\tsplitafterresult {\afterTABLEsplitbox}% \def\tsplitafter {\m_tabl_ntb_after_split}% - \setbox\tsplitcontent\vbox{#1}% + \def\tsplitbefore {\m_tabl_ntb_before_split}% supported ? + \setbox\tsplitcontent\vbox{\tabl_ntb_flush_content}% \ifmultipleTBLheads \dorecurse\c_tabl_ntb_n_of_head_lines {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight @@ -1402,8 +1614,10 @@ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}% \fi - \doifsomething{\naturaltablelocalparameter\c!spaceinbetween} - {\def\tsplitinbetween{\blank[\naturaltablelocalparameter\c!spaceinbetween]}}% + \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}% + \ifx\p_spaceinbetween\empty\else + \blank[\p_spaceinbetween]% + \fi \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}% \handletsplit} @@ -1423,15 +1637,23 @@ \def\tabl_ntb_check_widths_indeed#1% {\iftraceTABLE\tabl_ntb_show_widths{B#1}\fi \!!counta\zerocount - \!!dimena\dimexpr\hsize-\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax + \!!dimena\dimexpr + \hsize + -\d_tabl_ntb_leftmargindistance + -\d_tabl_ntb_rightmargindistance + -\d_tabl_ntb_columndistance + \relax \dorecurse\c_tabl_ntb_maximum_col {\scratchdimen\tabl_ntb_get_aut\recurselevel\relax - \advance\!!dimena-\tabl_ntb_get_dis\recurselevel\relax + \advance\!!dimena\dimexpr + -\tabl_ntb_get_dis\recurselevel + -\d_tabl_ntb_columndistance + \relax \ifdim\scratchdimen>\zeropoint\relax \advance\!!dimena -\scratchdimen \else \scratchdimen\tabl_ntb_get_wid\recurselevel\relax - \ifdim\scratchdimen>\naturaltablelocalparameter\c!maxwidth\relax + \ifdim\scratchdimen>\d_tabl_ntb_maxwidth\relax \ifcase#1\else\tabl_ntb_let_wid\recurselevel\zeropoint\fi \advance\!!counta \plusone \else @@ -1440,7 +1662,9 @@ \else % eigenlijk moet dit alleen als de kolom wordt overspannen door een % vorige, maw extra dubbele loop en status var - \advance\!!counta \plusone + \ifnum\c_tabl_ntb_encountered_max=\c_tabl_ntb_maximum_col % *nx* bah + \advance\!!counta \plusone % setting maxwidth to a large value also works + \fi \fi \fi \fi}% @@ -1531,7 +1755,9 @@ \def\tabl_ntb_show_widths#1% {\vbox - {\forgetall\tttf[#1]\dorecurse\c_tabl_ntb_maximum_col + {\forgetall + \tttf[#1]% + \dorecurse\c_tabl_ntb_maximum_col {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax [\recurselevel:\the\scratchdimen]}}} @@ -1548,46 +1774,115 @@ % \setsecondpasscharacteralign \checkalignment{#3}% {\strut#2\unskip}% % \ignorespaces} -\def\tabl_ntb_char_align - {\doifelse{\naturaltablelocalparameter\c!aligncharacter}\v!yes - \tabl_ntb_char_align_indeed - \gobbletwoarguments} +\def\tabl_ntb_char_align % called often + {\edef\p_characteralign{\naturaltablelocalparameter\c!aligncharacter}% + \ifx\p_characteralign\v!yes + \ifcase\c_tabl_tbl_pass\or + \tabl_ntb_let_tal\currentTABLEcolumn\plusone + \tabl_ntb_let_gal\plusone + \fi + \expandafter\tabl_ntb_char_align_indeed + \else + \expandafter\gobbletwoarguments + \fi} \def\tabl_ntb_char_align_indeed#1#2% row column {\ifcase\c_tabl_tbl_pass \or - \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}% + \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}% we could store the character in tal \fi \typo_charalign_adapt_font \signalcharacteralign{#2}{#1}} +\unexpanded\def\tabl_ntb_cell_process_a_extra#1#2% + {\ifcase\tabl_ntb_get_tal{#2}\relax + \expandafter\tabl_ntb_cell_process_x + \else + \expandafter\tabl_ntb_cell_process_a + \fi{#1}{#2}} + +\unexpanded\def\tabl_ntb_cell_process_x#1#2[#3]#4% + {} + +% problem: when span doesn't break we can have a span that is the sum of +% cells but still to small .. chicken egg problem ... for that we should +% also have a smallest width run +% +% nilling the background makes a run upto 25% faster + +\def\tabl_ntb_cell_process_a_check_span_one + {\ifautosqueezeTBLspan + \edef\p_width{\naturaltablelocalparameter\c!width}% + \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname + \else + \donetrue + \fi + \ifdone % brr, 0 + \ifnum\scratchcounter>\plusone + \tabl_ntb_set_spn\c_tabl_ntb_col + \fi + \fi} + +\def\tabl_ntb_cell_process_a_check_span_two_yes + {\iftightTBLcolspan + \donefalse + \else + \ifnum\scratchcounter>\plusone + \begingroup + \edef\p_width{\naturaltablelocalparameter\c!width}% + \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname + \ifdone + \endgroup + \edef\p_option{\naturaltablelocalparameter\c!option}% + \ifx\p_option\v!tight\donefalse\else\donetrue\fi + \else + % a dimension + \endgroup + \donefalse + \fi + \else + \edef\p_option{\naturaltablelocalparameter\c!option}% + \ifx\p_option\v!tight\donefalse\else\donetrue\fi + \fi + \fi} + + +% \let\tabl_ntb_cell_process_a_check_span_two_nop\donetrue + +\def\tabl_ntb_cell_process_a_check_span_two_nop + {\ifnum\scratchcounter>\plusone + \edef\p_width{\naturaltablelocalparameter\c!width}% + \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname + \else + \donetrue + \fi} + \unexpanded\def\tabl_ntb_cell_process_a#1#2[#3]#4% grouping added ! ! ! {\bgroup + \letnaturaltablelocalparameter\c!option\empty \tabl_ntb_setup_cell{#1}{#2}% + \setupcurrentnaturaltablelocal[#3]% + \letnaturaltablelocalparameter\c!background\empty + \letnaturaltablelocalparameter\c!frame\v!off + \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax \setbox\scratchbox\hbox {\scratchdimen\naturaltablelocalparameter\c!distance\relax \ifdim\scratchdimen>\tabl_ntb_get_dis{#2}\relax \tabl_ntb_set_dis{#2}{\the\scratchdimen}% \fi - \setupcurrentnaturaltablelocal[#3,\c!background=,\c!frame=\v!off]% 25% faster \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop\tabl_ntb_cell_finalize}}% \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax \ifdim\wd\scratchbox>\scratchdimen \ifsqueezeTBLspan - \ifautosqueezeTBLspan - \doifinsetelse{\naturaltablelocalparameter\c!width}{\v!fit,\v!fixed,\v!broad,\v!local} - \donetrue \donefalse - \else - \donetrue - \fi - \ifdone % brr, 0 - \ifnum\tabl_ntb_get_col{#1}{#2}>\plusone \tabl_ntb_set_spn\c_tabl_ntb_col\fi - \fi + \tabl_ntb_cell_process_a_check_span_one \fi \tabl_ntb_spn_doifelse\c_tabl_ntb_col - \donothing - {\ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox + \tabl_ntb_cell_process_a_check_span_two_yes + \tabl_ntb_cell_process_a_check_span_two_nop + \ifdone + \ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}% - \fi}% auto set + \fi + \fi \fi \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax @@ -1608,8 +1903,7 @@ % unless span \tabl_ntb_set_aut\c_tabl_ntb_col{\the\wd\scratchbox}% % to be translated - \writestatus\m!TABLE - {no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}% + \writestatus\m!TABLE{no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}% \fi\fi \fi \fi @@ -1624,7 +1918,9 @@ \unexpanded\def\tabl_ntb_cell_process_b_c#1#2#3[#4]#5% {\setbox\scratchbox\hbox {\tabl_ntb_setup_cell{#2}{#3}% - \setupcurrentnaturaltablelocal[#4,#1,\c!frame=\v!off,\c!background=]% + \setupcurrentnaturaltablelocal[#4,#1]% + \letnaturaltablelocalparameter\c!background\empty + \letnaturaltablelocalparameter\c!frame\v!off \inheritednaturaltablelocalframed{\tabl_ntb_cell_start#5\tabl_ntb_cell_stop}}% \setbox2\emptyhbox \wd2\wd\scratchbox @@ -1663,7 +1959,10 @@ \unexpanded\def\tabl_ntb_cell_process_d#1#2[#3]#4% {\tabl_ntb_setup_cell{#1}{#2}% \bgroup - \setupcurrentnaturaltablelocal[#3,\c!width=\d_tabl_ntb_width,\c!background=,\c!frame=\v!off]% 25% faster + \setupcurrentnaturaltablelocal[#3]% + \letnaturaltablelocalparameter\c!background\empty + \letnaturaltablelocalparameter\c!frame\v!off + \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}% \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}% \egroup} @@ -1672,10 +1971,11 @@ \setupcurrentnaturaltablelocal[#3]% to get the color right, the way we \color % handle color here prevents interference due to whatsit nodes [\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence - {\ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns - \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width]% + {\letnaturaltablelocalparameter\c!color\empty + \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}% + \ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns \else - \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width,\c!height=\d_tabl_ntb_height]% + \setnaturaltablelocalparameter\c!height{\d_tabl_ntb_height}% \fi \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}}% \hskip\tabl_ntb_get_dis{#2}} @@ -1728,7 +2028,7 @@ \newconditional\resetTABLEmode \settrue\resetTABLEmode -\def\tabl_ntb_parameters_reset +\def\tabl_ntb_parameters_reset % we can use setters instead {\ifnum\m_tabl_tbl_level>\plusone % in ieder geval \ifconditional\resetTABLEmode % not ok yet diff --git a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv index f9ac27e7011..5add1c684a0 100644 --- a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv @@ -1503,9 +1503,9 @@ \global\setfalse\tableactionstatepermitted \global\setfalse\hassometablehead \global\setfalse\hassometabletail - \expanded{\doifinstringelse{|}{#1}} + \expanded{\doifelseinstring{|}{#1}} {\xdef\restarttable{\noexpand\dorestarttable{\noexpand\thirdstagestarttable{#1}}}} - {\doifdefinedelse{\??tabletemplate#1} + {\doifelsedefined{\??tabletemplate#1} {\gdef\restarttable{\getvalue{\??tabletemplate#1}}} {\gdef\restarttable{\dorestarttable{\getvalue{#1}}}}}% \egroup @@ -1921,7 +1921,7 @@ {\global\currenttablecolumn\zerocount} \def\dotablevrulecommand#1% global assignments - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\global\tablevrulethicknessfactor#1\relax \global\multiply\tablevrulethicknessfactor\m_tabl_table_VLwidth\relax} {\xdef\tablecurrentvrulecolor{#1}}} @@ -1955,7 +1955,7 @@ \unexpanded\def\dotableVN#1{\global\noftablevrules#1\relax\VL} \def\dotablehrulecommand#1% global assignments - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\global\tablehrulethicknessfactor#1\relax \global\multiply\tablehrulethicknessfactor\m_tabl_table_HLheight\relax} {\xdef\tablecurrenthrulecolor{#1}}} @@ -2075,7 +2075,7 @@ \fi} \def\dotabledrulecommand#1% global assignments - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\ifcase\tabledrulespan \global\tabledrulespan#1\relax \else @@ -2203,7 +2203,7 @@ \def\dolocaltablesetup {\directtablesparameter\c!commands\relax - \doifsomething{\directtablesparameter\c!bodyfont}{\switchtobodyfont[\directtablesparameter\c!bodyfont]}% + \usebodyfontparameter\directtablesparameter \tablelinethicknessunit\dimexpr\directtablesparameter\c!rulethickness/\tablelinethicknessfactor\relax \edef\p_tabl_table_height{\directtablesparameter\c!height}% \edef\p_tabl_table_depth{\directtablesparameter\c!depth}% @@ -2288,8 +2288,7 @@ \c!distance=\v!medium, \c!bodyfont=, \c!commands=, - \c!background=\v!screen, % huh? - \c!backgroundscreen=\defaultbackgroundscreen, + \c!background=, \c!backgroundcolor=, \c!split=\v!auto] diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.lua b/Master/texmf-dist/tex/context/base/tabl-tbl.lua index b088a10086e..13d899de647 100644 --- a/Master/texmf-dist/tex/context/base/tabl-tbl.lua +++ b/Master/texmf-dist/tex/context/base/tabl-tbl.lua @@ -25,7 +25,7 @@ local pattern = Ct((separator * (C(nested) + Cc("")) * C((1-separator)^0))^0 local ctx_settabulatelastentry = context.settabulatelastentry local ctx_settabulateentry = context.settabulateentry -function commands.presettabulate(preamble) +local function presettabulate(preamble) preamble = gsub(preamble,"~","d") -- let's get rid of ~ mess here if find(preamble,"*",1,true) then -- todo: lpeg but not now @@ -43,3 +43,10 @@ function commands.presettabulate(preamble) end ctx_settabulatelastentry(t[m+1]) end + +interfaces.implement { + name = "presettabulate", + actions = presettabulate, + arguments = "string", + scope = "private", +} diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv index c25d61741f4..ae4f03825a7 100644 --- a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv @@ -331,7 +331,7 @@ {\dowithnextboxcs\tabl_tabulate_shaped_par_finish\vbox\bgroup} \def\tabl_tabulate_shaped_par_finish - {\ctxcommand{doreshapeframedbox(\number\nextbox)}% + {\clf_doreshapeframedbox\nextbox\relax \ifvmode\unvbox\else\box\fi\nextbox} \let\tabl_tabulate_shaped_par_end\egroup @@ -599,17 +599,17 @@ \tabl_tabulate_set_preamble} \def\tabl_tabulate_set_preskip#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble } {\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}} \def\tabl_tabulate_set_posskip#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\s_tabl_tabulate_post#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble } {\s_tabl_tabulate_post.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}} \def\tabl_tabulate_set_preposskip#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble } {\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble#1}} @@ -651,7 +651,7 @@ \tabl_tabulate_set_preamble} \def\tabl_tabulate_pickup_width - {\doifnextparenthesiselse\tabl_tabulate_set_width_indeed\tabl_tabulate_set_preamble} + {\doifelsenextparenthesis\tabl_tabulate_set_width_indeed\tabl_tabulate_set_preamble} \def\tabl_tabulate_set_width {\setfalse\c_tabl_tabulate_pwidth_set @@ -664,7 +664,7 @@ \tabl_tabulate_set_preamble} \def\tabl_tabulate_set_paragraph - {\doifnextparenthesiselse + {\doifelsenextparenthesis {\c_tabl_tabulate_modus\plusone \settrue\c_tabl_tabulate_pwidth_set \tabl_tabulate_pickup_width} @@ -749,7 +749,7 @@ \tabl_tabulate_set_preamble} \def\tabl_tabulate_set_vrule_command#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\global\d_tabl_tabulate_vrulethickness#1\d_tabl_tabulate_vrulethickness_default} {\xdef\m_tabl_tabulate_vrule_color{#1}}} @@ -1049,17 +1049,25 @@ \def\tabl_tabulate_insert_foot_content {\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}% - \csname\??tabulatehead\currenttabulation\endcsname + \csname\??tabulatefoot\currenttabulation\endcsname \tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}% \def\tabl_tabulate_check_full_content % - needed, else confusion with \c!header {\ifcsname\??tabulatehead\currenttabulation\endcsname - \let\tabl_tabulate_insert_head\tabl_tabulate_insert_head_content + \expandafter\ifx\csname\??tabulatehead\currenttabulation\endcsname\empty + \let\tabl_tabulate_insert_head\empty + \else + \let\tabl_tabulate_insert_head\tabl_tabulate_insert_head_content + \fi \else \let\tabl_tabulate_insert_head\empty \fi \ifcsname\??tabulatefoot\currenttabulation\endcsname - \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_foot_content + \expandafter\ifx\csname\??tabulatefoot\currenttabulation\endcsname\empty + \let\tabl_tabulate_insert_foot\empty + \else + \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_head_content + \fi \else \let\tabl_tabulate_insert_foot\empty \fi} @@ -1079,8 +1087,10 @@ \tabulatenoalign{\kern-\lineheight}% \fi} -\setuvalue{\e!start\v!tabulatehead}{\doifnextoptionalcselse\tabl_tabulate_start_head_yes\tabl_tabulate_start_head_nop} -\setuvalue{\e!start\v!tabulatetail}{\doifnextoptionalcselse\tabl_tabulate_start_foot_yes\tabl_tabulate_start_foot_nop} +% todo: make footer synonym to tail + +\setuvalue{\e!start\v!tabulatehead}{\doifelsenextoptionalcs\tabl_tabulate_start_head_yes\tabl_tabulate_start_head_nop} +\setuvalue{\e!start\v!tabulatetail}{\doifelsenextoptionalcs\tabl_tabulate_start_foot_yes\tabl_tabulate_start_foot_nop} \let\m_tabl_tabulate_data\empty @@ -1090,30 +1100,30 @@ \def\tabl_tabulate_start_foot_yes[#1]% {\processcontent{\e!stop\v!tabulatetail}\m_tabl_tabulate_data{\letvalue{\??tabulatefoot#1}\m_tabl_tabulate_data}} -% \def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]} -% \def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]} +\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]} +\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]} -\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[]} -\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[]} +% \def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[]} +% \def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[]} % \unexpanded\def\tabl_start_defined[#1]% % {\bgroup % \edef\currenttabulationparent{#1}% % \let\currenttabulation\currenttabulationparent -% \doifnextoptionalcselse\tabl_start_defined_yes\tabl_start_defined_nop} -% -% \def\tabl_start_defined_yes[#1]% -% {\edef\currenttabulation{\currenttabulation:#1}% -% \tabl_tabulate_start_building} -% -% \def\tabl_start_defined_nop -% {\tabl_tabulate_start_building} +% \dodoubleargument\tabl_start_defined_indeed} \unexpanded\def\tabl_start_defined[#1]% {\bgroup \edef\currenttabulationparent{#1}% \let\currenttabulation\currenttabulationparent - \dodoubleargument\tabl_start_defined_indeed} + \edef\p_format{\tabulationparameter\c!format}% + \ifx\p_format\v!none + % this is special case: we need to define the generic english + % \starttabulate in other interfaces as well + \expandafter\dodoubleempty \expandafter\tabl_start_regular + \else + \expandafter\dodoubleargument\expandafter\tabl_start_defined_indeed + \fi} \def\tabl_start_defined_indeed {\iffirstargument @@ -1127,7 +1137,7 @@ \fi} \def\tabl_start_defined_one[#1][#2]% - {\doifassignmentelse{#1} + {\doifelseassignment{#1} {\setuptabulation[\currenttabulation][#1]}% {\edef\currenttabulation{\currenttabulation:#1}}% \tabl_tabulate_start_building} @@ -1144,26 +1154,11 @@ \unexpanded\setuvalue{\e!start\v!tabulate}% {\bgroup % whole thing + \let\currenttabulationparent\empty \dodoubleempty\tabl_start_regular} -% \def\tabl_start_regular[#1][#2]% -% {%\let\currenttabulationparent\v!tabulate -% \let\currenttabulationparent\empty -% \let\currenttabulation\currenttabulationparent -% \def\p_format{#1}% -% \ifx\p_format\empty -% \def\p_format{|l|p|}% -% \fi -% \lettabulationparameter\c!format\p_format -% \ifsecondargument -% \setupcurrenttabulation[#2]% -% \fi -% \tabl_tabulate_start_building} - \def\tabl_start_regular - {%\let\currenttabulationparent\v!tabulate - \let\currenttabulationparent\empty - \let\currenttabulation\currenttabulationparent + {\let\currenttabulation\currenttabulationparent \ifsecondargument \expandafter\tabl_start_regular_two \else @@ -1171,7 +1166,7 @@ \fi} \def\tabl_start_regular_one[#1][#2]% - {\doifassignmentelse{#1} + {\doifelseassignment{#1} {\setupcurrenttabulation[\c!format={|l|p|},#1]} {\def\p_format{#1}% \ifx\p_format\empty @@ -1321,7 +1316,7 @@ \def\tabl_tabulate_set_color_column#1% overloaded {\unskip - \doiffastoptionalcheckelse{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}} + \doifelsefastoptionalcheck{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}} \def\tabl_tabulate_set_color_column_nop {\tabl_tabulate_column_normal} @@ -1360,13 +1355,13 @@ % \fi\fi \global\let\m_tabl_tabulate_vrule_color_local\m_tabl_tabulate_vrule_color_default \global\d_tabl_tabulate_vrulethickness_local\d_tabl_tabulate_vrulethickness_default - \doiffastoptionalcheckelse{\tabl_tabulate_column_vruled_yes#1}{\tabl_tabulate_column_vruled_nop#1}} + \doifelsefastoptionalcheck{\tabl_tabulate_column_vruled_yes#1}{\tabl_tabulate_column_vruled_nop#1}} \def\tabl_tabulate_column_vruled_nop {\tabl_tabulate_column_normal} \def\tabl_tabulate_column_vruled_step#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\global\d_tabl_tabulate_vrulethickness_local#1\d_tabl_tabulate_vrulethickness_default} {\xdef\m_tabl_tabulate_vrule_color_local{#1}}} @@ -1454,15 +1449,15 @@ \def\tabl_tabulate_hrule_spec_ignore#1% {%\global\let\currenttabulationlocalhrulecolor\empty %\global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default - \doiffastoptionalcheckelse#1#1} + \doifelsefastoptionalcheck#1#1} \def\tabl_tabulate_hrule_spec_pickup#1% {\global\let\currenttabulationlocalhrulecolor\m_tabl_tabulate_hrule_color_default \global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default - \doiffastoptionalcheckelse{\tabl_tabulate_hrule_preset#1}#1} + \doifelsefastoptionalcheck{\tabl_tabulate_hrule_preset#1}#1} \def\tabl_tabulate_hrule_preset_step#1% - {\doifnumberelse{#1} + {\doifelsenumber{#1} {\global\d_tabl_tabulate_hrulethickness_local#1\d_tabl_tabulate_hrulethickness_default} {\xdef\currenttabulationlocalhrulecolor{#1}}} @@ -1531,7 +1526,7 @@ \unexpanded\def\tabl_tabulate_color_set#1% we could store the attributes at the cost of a lua call {\begingroup - \node_backgrounds_align_initialize % name might change + \clf_enablebackgroundalign % was \node_backgrounds_align_initialize \global\let\tabl_tabulate_color_repeat\tabl_tabulate_color_repeat_second \global\settrue\c_tabl_tabulate_has_colors \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_colorcolumn @@ -2106,7 +2101,7 @@ \c_tabl_tabulate_nofcolumns \zerocount \c_tabl_tabulate_has_rule_spec_first\zerocount \c_tabl_tabulate_has_rule_spec_last \zerocount - \ctxcommand{presettabulate(\!!bs\detokenizedtabulationparameter\c!format\!!es)}% + \clf_presettabulate{\detokenizedtabulationparameter\c!format}% % % \edef\totaltabulatecolumns{\the\numexpr3*\c_tabl_tabulate_columns+\plusfour}% \d_tabl_tabulate_width\zeropoint @@ -2172,7 +2167,7 @@ \global\setbox\b_tabl_tabulate\vbox \bgroup \fi % - \dostarttagged\t!tabulate\empty + \dostarttaggedchained\t!tabulate\empty\??tabulation \dostarttagged\t!tabulaterow\empty \setfalse\inhibitmargindata % new per 2012.06.13 ... really needed \everycr\expandafter{\the\everycr\dostoptagged\dostarttagged\t!tabulaterow\empty}% @@ -2452,4 +2447,10 @@ %D \stopwhatever %D \stoptyping +%D This is needed because we soemtimes use the english command in +%D tracing macros. In fact, most detailed tracing macros that +%D are done with \LUA\ only work in the english interface anyway. + +\definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv index 0138697af8e..64ab94a67da 100644 --- a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv +++ b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv @@ -195,7 +195,7 @@ \normalexpanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}% \global\settrue\usesamefloatnumber \else - \doifnumberelse\extrasplitfloatlines\donothing{\def\extrasplitfloatlines{1}}% + \doifelsenumber\extrasplitfloatlines\donothing{\def\extrasplitfloatlines{1}}% \fi} \unexpanded\def\doifnotinsidesplitfloat diff --git a/Master/texmf-dist/tex/context/base/tabl-xtb.lua b/Master/texmf-dist/tex/context/base/tabl-xtb.lua index 5728b80e95f..bddd627adce 100644 --- a/Master/texmf-dist/tex/context/base/tabl-xtb.lua +++ b/Master/texmf-dist/tex/context/base/tabl-xtb.lua @@ -24,13 +24,16 @@ this mechamism will be improved so that it can replace its older cousin. ]]-- -- todo: use linked list instead of r/c array +-- todo: we can use the sum of previously forced widths for column spans -local tonumber = tonumber +local tonumber, next = tonumber, next local commands = commands local context = context local tex = tex +local implement = interfaces.implement + local texgetcount = tex.getcount local texsetcount = tex.setcount local texgetdimen = tex.getdimen @@ -41,10 +44,13 @@ local format = string.format local concat = table.concat local points = number.points +local todimen = string.todimen + local context_beginvbox = context.beginvbox local context_endvbox = context.endvbox local context_blank = context.blank local context_nointerlineskip = context.nointerlineskip +local context_dummyxcell = context.dummyxcell local variables = interfaces.variables @@ -83,6 +89,11 @@ local v_repeat = variables["repeat"] local v_max = variables.max local v_fixed = variables.fixed local v_auto = variables.auto +local v_before = variables.before +local v_after = variables.after +local v_both = variables.both +local v_samepage = variables.samepage +local v_tight = variables.tight local xtables = { } typesetters.xtables = xtables @@ -110,36 +121,40 @@ local stack, data = { }, nil function xtables.create(settings) table.insert(stack,data) - local rows = { } - local widths = { } - local heights = { } - local depths = { } - local spans = { } - local distances = { } - local autowidths = { } - local modes = { } - local fixedrows = { } - local fixedcolumns = { } - local frozencolumns = { } - local options = { } + local rows = { } + local widths = { } + local heights = { } + local depths = { } + local spans = { } + local distances = { } + local autowidths = { } + local modes = { } + local fixedrows = { } + local fixedcolumns = { } + -- local fixedcspans = { } + local frozencolumns = { } + local options = { } + local rowproperties = { } data = { - rows = rows, - widths = widths, - heights = heights, - depths = depths, - spans = spans, - distances = distances, - modes = modes, - autowidths = autowidths, - fixedrows = fixedrows, - fixedcolumns = fixedcolumns, - frozencolumns = frozencolumns, - options = options, - nofrows = 0, - nofcolumns = 0, - currentrow = 0, - currentcolumn = 0, - settings = settings or { }, + rows = rows, + widths = widths, + heights = heights, + depths = depths, + spans = spans, + distances = distances, + modes = modes, + autowidths = autowidths, + fixedrows = fixedrows, + fixedcolumns = fixedcolumns, + -- fixedcspans = fixedcspans, + frozencolumns = frozencolumns, + options = options, + nofrows = 0, + nofcolumns = 0, + currentrow = 0, + currentcolumn = 0, + settings = settings or { }, + rowproperties = rowproperties, } local function add_zero(t,k) t[k] = 0 @@ -155,6 +170,9 @@ function xtables.create(settings) nx = 0, ny = 0, list = false, + wd = 0, + ht = 0, + dp = 0, } row[c] = cell if c > data.nofcolumns then @@ -180,24 +198,28 @@ function xtables.create(settings) setmetatableindex(fixedrows,add_zero) setmetatableindex(fixedcolumns,add_zero) setmetatableindex(options,add_table) + -- setmetatableindex(fixedcspans,add_table) + -- + local globaloptions = settings_to_hash(settings.option) -- - settings.columndistance = tonumber(settings.columndistance) or 0 - settings.rowdistance = tonumber(settings.rowdistance) or 0 - settings.leftmargindistance = tonumber(settings.leftmargindistance) or 0 + settings.columndistance = tonumber(settings.columndistance) or 0 + settings.rowdistance = tonumber(settings.rowdistance) or 0 + settings.leftmargindistance = tonumber(settings.leftmargindistance) or 0 settings.rightmargindistance = tonumber(settings.rightmargindistance) or 0 - settings.options = settings_to_hash(settings.option) - settings.textwidth = tonumber(settings.textwidth) or texget("hsize") - settings.lineheight = tonumber(settings.lineheight) or texgetdimen("lineheight") - settings.maxwidth = tonumber(settings.maxwidth) or settings.textwidth/8 + settings.options = globaloptions + settings.textwidth = tonumber(settings.textwidth) or texget("hsize") + settings.lineheight = tonumber(settings.lineheight) or texgetdimen("lineheight") + settings.maxwidth = tonumber(settings.maxwidth) or settings.textwidth/8 -- if #stack > 0 then -- settings.textwidth = texget("hsize") -- end data.criterium_v = 2 * data.settings.lineheight data.criterium_h = .75 * data.settings.textwidth - + -- + data.tight = globaloptions[v_tight] and true or false end -function xtables.initialize_reflow_width(option) +function xtables.initialize_reflow_width(option,width) local r = data.currentrow local c = data.currentcolumn + 1 local drc = data.rows[r][c] @@ -218,8 +240,7 @@ function xtables.initialize_reflow_width(option) data.currentcolumn = c end --- local function rather_fixed(n) --- for n in node. +-- todo: we can better set the cell values in one go function xtables.set_reflow_width() local r = data.currentrow @@ -234,50 +255,105 @@ function xtables.set_reflow_width() -- drc.list = true -- we don't need to keep the content around as we're in trial mode (no: copy_node_list(tb)) -- - local widths, width = data.widths, getfield(tb,"width") - if width > widths[c] then - widths[c] = width - end - local heights, height = data.heights, getfield(tb,"height") - if height > heights[r] then - heights[r] = height + local width = getfield(tb,"width") + local height = getfield(tb,"height") + local depth = getfield(tb,"depth") + -- + local widths = data.widths + local heights = data.heights + local depths = data.depths + local cspan = drc.nx + if cspan < 2 then + if width > widths[c] then + widths[c] = width + end + else + local options = data.options[r][c] + if data.tight then + -- no check + elseif not options then + if width > widths[c] then + widths[c] = width + end + elseif not options[v_tight] then + if width > widths[c] then + widths[c] = width + end + end end - local depths, depth = data.depths, getfield(tb,"depth") - if depth > depths[r] then - depths[r] = depth + -- if cspan > 1 then + -- local f = data.fixedcspans[c] + -- local w = f[cspan] or 0 + -- if width > w then + -- f[cspan] = width -- maybe some day a solution for autospanmax and so + -- end + -- end + if drc.ny < 2 then + if height > heights[r] then + heights[r] = height + end + if depth > depths[r] then + depths[r] = depth + end end -- + drc.wd = width + drc.ht = height + drc.dp = depth + -- local dimensionstate = texgetcount("frameddimensionstate") local fixedcolumns = data.fixedcolumns local fixedrows = data.fixedrows if dimensionstate == 1 then - if width > fixedcolumns[c] then -- how about a span here? - fixedcolumns[c] = width - end + if cspan > 1 then + -- ignore width + elseif width > fixedcolumns[c] then -- how about a span here? + fixedcolumns[c] = width + end elseif dimensionstate == 2 then fixedrows[r] = height elseif dimensionstate == 3 then fixedrows[r] = height -- width fixedcolumns[c] = width -- height - elseif data.options[v_auto] then -- new per 5/5/2014 - data.autowidths[c] = true - else - -- no dimensions are set in the cell - if width <= data.criterium_h and height >= data.criterium_v then - -- somewhat tricky branch - if width > fixedcolumns[c] then -- how about a span here? - -- maybe an image, so let's fix - fixedcolumns[c] = width - end - else - -- safeguard as it could be text that can be recalculated - -- and the previous branch could have happened in a previous - -- row and then forces a wrong one-liner in a multiliner - if width > fixedcolumns[c] then - data.autowidths[c] = true -- new per 5/5/2014 - end + elseif width <= data.criterium_h and height >= data.criterium_v then + -- somewhat tricky branch + if width > fixedcolumns[c] then -- how about a span here? + -- maybe an image, so let's fix + fixedcolumns[c] = width end end +-- +-- -- this fails so not good enough predictor +-- +-- -- \startxtable +-- -- \startxrow +-- -- \startxcell knuth \stopxcell +-- -- \startxcell \input knuth \stopxcell +-- -- \stopxrow +-- +-- else +-- local o = data.options[r][c] +-- if o and o[v_auto] then -- new per 5/5/2014 - removed per 15/07/2014 +-- data.autowidths[c] = true +-- else +-- -- no dimensions are set in the cell +-- if width <= data.criterium_h and height >= data.criterium_v then +-- -- somewhat tricky branch +-- if width > fixedcolumns[c] then -- how about a span here? +-- -- maybe an image, so let's fix +-- fixedcolumns[c] = width +-- end +-- else +-- -- safeguard as it could be text that can be recalculated +-- -- and the previous branch could have happened in a previous +-- -- row and then forces a wrong one-liner in a multiliner +-- if width > fixedcolumns[c] then +-- data.autowidths[c] = true -- new per 5/5/2014 - removed per 15/07/2014 +-- end +-- end +-- end +-- end +-- -- drc.dimensionstate = dimensionstate -- @@ -324,7 +400,6 @@ function xtables.initialize_reflow_height() end texsetdimen("d_tabl_x_width",w) local dimensionstate = drc.dimensionstate or 0 --- print(r,c,w,data.autowidths[c]) if dimensionstate == 1 or dimensionstate == 3 then -- width was fixed so height is known texsetcount("c_tabl_x_skip_mode",1) @@ -334,6 +409,8 @@ function xtables.initialize_reflow_height() elseif data.autowidths[c] then -- width has changed so we need to recalculate the height texsetcount("c_tabl_x_skip_mode",0) + elseif data.fixedcolumns[c] then + texsetcount("c_tabl_x_skip_mode",0) -- new else texsetcount("c_tabl_x_skip_mode",1) end @@ -347,18 +424,30 @@ function xtables.set_reflow_height() -- while row[c].span do -- we could adapt drc.nx instead -- c = c + 1 -- end - local tb = getbox("b_tabl_x") + local tb = getbox("b_tabl_x") local drc = row[c] - if data.fixedrows[r] == 0 then -- and drc.dimensionstate < 2 - local heights, height = data.heights, getfield(tb,"height") - if height > heights[r] then - heights[r] = height - end - local depths, depth = data.depths, getfield(tb,"depth") - if depth > depths[r] then - depths[r] = depth + -- + local width = getfield(tb,"width") + local height = getfield(tb,"height") + local depth = getfield(tb,"depth") + -- + if drc.ny < 2 then + if data.fixedrows[r] == 0 then -- and drc.dimensionstate < 2 + local heights = data.heights + local depths = data.depths + if height > heights[r] then + heights[r] = height + end + if depth > depths[r] then + depths[r] = depth + end end end + -- + drc.wd = width + drc.ht = height + drc.dp = depth + -- -- c = c + drc.nx - 1 -- data.currentcolumn = c end @@ -372,23 +461,35 @@ function xtables.initialize_construct() c = c + 1 end data.currentcolumn = c - local widths = data.widths + local widths = data.widths local heights = data.heights - local depths = data.depths - local w = widths[c] - local h = heights[r] - local d = depths[r] + local depths = data.depths + -- local drc = row[c] + local wd = drc.wd + local ht = drc.ht + local dp = drc.dp + -- + local width = widths[c] + local height = heights[r] + local depth = depths[r] + -- for x=1,drc.nx-1 do - w = w + widths[c+x] + width = width + widths[c+x] end - for y=1,drc.ny-1 do - h = h + heights[r+y] - d = d + depths[r+y] + -- + local total = height + depth + local ny = drc.ny + if ny > 1 then + for y=1,ny-1 do + local nxt = r + y + total = total + heights[nxt] + depths[nxt] + end end - texsetdimen("d_tabl_x_width",w) - texsetdimen("d_tabl_x_height",h + d) - texsetdimen("d_tabl_x_depth",0) + -- + texsetdimen("d_tabl_x_width",width) + texsetdimen("d_tabl_x_height",total) + texsetdimen("d_tabl_x_depth",0) -- for now end function xtables.set_construct() @@ -401,8 +502,7 @@ function xtables.set_construct() -- end local drc = row[c] -- this will change as soon as in luatex we can reset a box list without freeing --- drc.list = copy_node_list(getbox("b_tabl_x")) -drc.list = takebox("b_tabl_x") + drc.list = takebox("b_tabl_x") -- c = c + drc.nx - 1 -- data.currentcolumn = c end @@ -435,6 +535,8 @@ function xtables.reflow_width() local maxwidth = settings.maxwidth -- calculate width local widths = data.widths + local heights = data.heights + local depths = data.depths local distances = data.distances local autowidths = data.autowidths local fixedcolumns = data.fixedcolumns @@ -448,6 +550,7 @@ function xtables.reflow_width() showwidths("stage 1",widths,autowidths) end local noffrozen = 0 + -- inspect(data.fixedcspans) if options[v_max] then for c=1,nofcolumns do width = width + widths[c] @@ -570,16 +673,50 @@ function xtables.reflow_width() -- data.currentrow = 0 data.currentcolumn = 0 + -- +-- inspect(data) end function xtables.reflow_height() data.currentrow = 0 data.currentcolumn = 0 local settings = data.settings + -- + -- analyze ny + -- + local nofrows = data.nofrows + local nofcolumns = data.nofcolumns + local widths = data.widths + local heights = data.heights + local depths = data.depths + -- + for r=1,nofrows do + for c=1,nofcolumns do + local drc = data.rows[r][c] + if drc then + local ny = drc.ny + if ny > 1 then + local height = heights[r] + local depth = depths[r] + local total = height + depth + local htdp = drc.ht + drc.dp + for y=1,ny-1 do + local nxt = r + y + total = total + heights[nxt] + depths[nxt] + end + local delta = htdp - total + if delta > 0 then + delta = delta / ny + for y=1,ny do + heights[y] = heights[y] + delta + end + end + end + end + end + end + -- if settings.options[v_height] then - local heights = data.heights - local depths = data.depths - local nofrows = data.nofrows local totalheight = 0 local totaldepth = 0 for i=1,nofrows do @@ -597,6 +734,8 @@ function xtables.reflow_height() end end end + -- +-- inspect(data) end local function showspans(data) @@ -636,6 +775,7 @@ function xtables.construct() local rowdistance = settings.rowdistance local leftmargindistance = settings.leftmargindistance local rightmargindistance = settings.rightmargindistance + local rowproperties = data.rowproperties -- ranges can be mixes so we collect if trace_xtable then @@ -728,14 +868,33 @@ function xtables.construct() result[nofr][4] = true end nofr = nofr + 1 + local rp = rowproperties[r] + -- we have a direction issue here but hpack_node_list(list,0,"exactly","TLT") cannot be used + -- due to the fact that we need the width + local hbox = hpack_node_list(list) + setfield(hbox,"dir","TLT") result[nofr] = { - hpack_node_list(list), + hbox, size, i < nofrange and rowdistance > 0 and rowdistance or false, -- might move - false + false, + rp and rp.samepage or false, } end end + if nofr > 0 then + -- the [5] slot gets the after break + result[1] [5] = false + result[nofr][5] = false + for i=2,nofr-1 do + local r = result[i] + if r == v_both or r == v_before then + result[i-1][5] = true + elseif r == v_after then + result[i][5] = true + end + end + end return result end local body = collect_range(ranges[body_mode]) @@ -769,8 +928,14 @@ local function inject(row,copy,package) context_nointerlineskip() -- figure out a better way if row[4] then -- nothing as we have a span + elseif row[5] then + if row[3] then + context_blank { v_samepage, row[3] .. "sp" } + else + context_blank { v_samepage } + end elseif row[3] then - context_blank(row[3] .. "sp") -- why blank ? + context_blank { row[3] .. "sp" } -- why blank ? else context(tonode(new_glue(0))) end @@ -823,23 +988,23 @@ local function spanheight(body,i) end function xtables.flush(directives) -- todo split by size / no inbetween then .. glue list kern blank - local vsize = directives.vsize - local method = directives.method or v_normal - local settings = data.settings - local results = data.results - local rowdistance = settings.rowdistance - local head = results[head_mode] - local foot = results[foot_mode] - local more = results[more_mode] - local body = results[body_mode] + local height = directives.height + local method = directives.method or v_normal + local settings = data.settings + local results = data.results + local rowdistance = settings.rowdistance + local head = results[head_mode] + local foot = results[foot_mode] + local more = results[more_mode] + local body = results[body_mode] local repeatheader = settings.header == v_repeat local repeatfooter = settings.footer == v_repeat - if vsize and vsize > 0 then + if height and height > 0 then context_beginvbox() local bodystart = data.bodystart or 1 local bodystop = data.bodystop or #body if bodystart > 0 and bodystart <= bodystop then - local bodysize = vsize + local bodysize = height local footsize = total(foot,rowdistance) local headsize = total(head,rowdistance) local moresize = total(more,rowdistance) @@ -926,7 +1091,7 @@ function xtables.flush(directives) -- todo split by size / no inbetween then .. texsetcount("global","c_tabl_x_state",2) end else - if firstsize > vsize then + if firstsize > height then -- get rid of the too large cell for s=1,firstspans do inject(body[bodystart]) @@ -950,13 +1115,13 @@ function xtables.flush(directives) -- todo split by size / no inbetween then .. inject(head[i],false,true) end if #head > 0 and rowdistance > 0 then - context_blank(rowdistance .. "sp") + context_blank { rowdistance .. "sp" } end for i=1,#body do inject(body[i],false,true) end if #foot > 0 and rowdistance > 0 then - context_blank(rowdistance .. "sp") + context_blank { rowdistance .. "sp" } end for i=1,#foot do inject(foot[i],false,true) @@ -1014,28 +1179,71 @@ function xtables.cleanup() data = table.remove(stack) end -function xtables.next_row() +function xtables.next_row(specification) local r = data.currentrow + 1 data.modes[r] = texgetcount("c_tabl_x_mode") data.currentrow = r data.currentcolumn = 0 + data.rowproperties[r] = specification +end + +function xtables.finish_row() + local n = data.nofcolumns - data.currentcolumn + if n > 0 then + -- message + for i=1,n do + context_dummyxcell() + end + end end -- eventually we might only have commands -commands.x_table_create = xtables.create -commands.x_table_reflow_width = xtables.reflow_width -commands.x_table_reflow_height = xtables.reflow_height -commands.x_table_construct = xtables.construct -commands.x_table_flush = xtables.flush -commands.x_table_cleanup = xtables.cleanup -commands.x_table_next_row = xtables.next_row -commands.x_table_init_reflow_width = xtables.initialize_reflow_width -commands.x_table_init_reflow_height = xtables.initialize_reflow_height -commands.x_table_init_construct = xtables.initialize_construct -commands.x_table_set_reflow_width = xtables.set_reflow_width -commands.x_table_set_reflow_height = xtables.set_reflow_height -commands.x_table_set_construct = xtables.set_construct +implement { + name = "x_table_create", + actions = xtables.create, + arguments = { + { + { "option" }, + { "textwidth", "dimen" }, + { "textheight", "dimen" }, + { "maxwidth", "dimen" }, + { "lineheight", "dimen" }, + { "columndistance", "dimen" }, + { "leftmargindistance", "dimen" }, + { "rightmargindistance", "dimen" }, + { "rowdistance", "dimen" }, + { "header" }, + { "footer" }, + } + } +} + +implement { + name = "x_table_flush", + actions = xtables.flush, + arguments = { + { + { "method" }, + { "height", "dimen" } + } + } +} -commands.x_table_r = function() context(data.currentrow or 0) end -commands.x_table_c = function() context(data.currentcolumn or 0) end +implement { name = "x_table_reflow_width", actions = xtables.reflow_width } +implement { name = "x_table_reflow_height", actions = xtables.reflow_height } +implement { name = "x_table_construct", actions = xtables.construct } +implement { name = "x_table_cleanup", actions = xtables.cleanup } +implement { name = "x_table_next_row", actions = xtables.next_row } +implement { name = "x_table_next_row_option", actions = xtables.next_row, arguments = "string" } +implement { name = "x_table_finish_row", actions = xtables.finish_row } +implement { name = "x_table_init_reflow_width", actions = xtables.initialize_reflow_width } +implement { name = "x_table_init_reflow_height", actions = xtables.initialize_reflow_height } +implement { name = "x_table_init_reflow_width_option", actions = xtables.initialize_reflow_width, arguments = "string" } +implement { name = "x_table_init_reflow_height_option", actions = xtables.initialize_reflow_height, arguments = "string" } +implement { name = "x_table_init_construct", actions = xtables.initialize_construct } +implement { name = "x_table_set_reflow_width", actions = xtables.set_reflow_width } +implement { name = "x_table_set_reflow_height", actions = xtables.set_reflow_height } +implement { name = "x_table_set_construct", actions = xtables.set_construct } +implement { name = "x_table_r", actions = function() context(data.currentrow or 0) end } +implement { name = "x_table_c", actions = function() context(data.currentcolumn or 0) end } diff --git a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi index 06fb472cdfd..876abef8c8f 100644 --- a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi +++ b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi @@ -29,6 +29,8 @@ % - maybe only tag the box % - scale to fit % +% - buffers permit verbatim but are not always handy + %D This module started as an afternoon experiment and surprisingly could be %D mostly finished the same evening. Of course it builds upon existing %D functionality. The main reason for writing it is that we occasionally @@ -78,8 +80,13 @@ \let\dotagxtablesignal\relax % names will change \appendtoks - \def\dotagxtablecell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}% - \def\dotagxtablesignal{\char\zerocount}% not used + \def\dotagxtablecell + {\clf_settagtablecell + \numexpr\tablecellrows\relax + \numexpr\tablecellcolumns\relax + \numexpr\raggedstatus\relax}% + \def\dotagxtablesignal + {\char\zerocount}% not used \to \everyenableelements \newdimen\d_tabl_x_width @@ -96,8 +103,8 @@ \newcount\c_tabl_x_skip_mode % 1 = skip \newdimen\d_tabl_x_textwidth -\def\currentxtablerow {\ctxcommand{x_table_r()}} -\def\currentxtablecolumn{\ctxcommand{x_table_c()}} +\let\currentxtablerow \clf_x_table_r +\let\currentxtablecolumn\clf_x_table_c % \setupxtable[one][parent][a=b,c=d] % \setupxtable[one] [a=b,c=d] @@ -194,7 +201,7 @@ \unexpanded\def\tabl_x_embedded_start[#settings]#content\stopembeddedxtable {\tabl_x_prepare{#settings}% - \ctxcommand{assignbuffer("embedded_x_table",\!!bs\detokenize{#content}\!!es)}% + \clf_assignbuffer{embedded_x_table}{\detokenize{#content}}\catcodetable\relax \bgroup \let\tabl_x_start_table\tabl_x_process_buffer \edef\tabl_x_current_buffer{embedded_x_table}% @@ -216,12 +223,12 @@ \unexpanded\def\tabl_x_start_named_indeed[#settings]% {\advance\c_tabl_x_nesting\plusone - \dostarttagged\t!table\empty + \dostarttaggedchained\t!table\empty\??xtable \iffirstargument \setupcurrentxtable[#settings]% \fi \tabl_x_check_textwidth - \forgetall + %\forgetall % else whitespace mess \edef\tabl_x_current_buffer{\tabl_x_default_buffer}% \normalexpanded{\buff_pickup{\tabl_x_current_buffer}{\e!start\currentxtable}{\e!stop\currentxtable}\relax\tabl_x_process\zerocount}} @@ -240,15 +247,15 @@ \unexpanded\def\tabl_x_prepare#settings% assumes \iffirstargument to be set {\advance\c_tabl_x_nesting\plusone - \dostarttagged\t!table\empty + \dostarttaggedchained\t!table\empty\??xtable \iffirstargument \tabl_x_set_checked{#settings}% \fi \tabl_x_check_textwidth - \forgetall} + }% else whitespace mess \def\tabl_x_get_buffer - {\ctxcommand{gettexbuffer("\tabl_x_current_buffer")}} + {\clf_gettexbuffer{\tabl_x_current_buffer}} \let\tabl_x_start_row_yes \relax \let\tabl_x_start_row_nop \relax @@ -259,23 +266,24 @@ \unexpanded\def\tabl_x_process {\begingroup % * - \doifsomething{\xtableparameter\c!bodyfont} - {\setupbodyfont[\xtableparameter\c!bodyfont]}% + \forgetall % moved here + \dontcomplain % for the moment here till we figure out where we get the overflow + \usebodyfontparameter\xtableparameter \setbox\scratchbox\vbox - {\xtableparameter\c!spaceinbetween}% - \ctxcommand{x_table_create { - option = "\xtableparameter\c!option", - textwidth = \number\d_tabl_x_textwidth, - textheight = \number\dimexpr\xtableparameter\c!textheight, - maxwidth = \number\dimexpr\xtableparameter\c!maxwidth, - lineheight = \number\openlineheight, - columndistance = \number\dimexpr\xtableparameter\c!columndistance, - leftmargindistance = \number\dimexpr\xtableparameter\c!leftmargindistance, - rightmargindistance = \number\dimexpr\xtableparameter\c!rightmargindistance, - rowdistance = \number\ht\scratchbox, - header = "\xtableparameter\c!header", - footer = "\xtableparameter\c!footer", - } }% + {\doifsomething{\xtableparameter\c!spaceinbetween}{\blank[\xtableparameter\c!spaceinbetween]}}% + \clf_x_table_create + option {\xtableparameter\c!option}% + textwidth \d_tabl_x_textwidth + textheight \dimexpr\xtableparameter\c!textheight\relax + maxwidth \dimexpr\xtableparameter\c!maxwidth\relax + lineheight \openlineheight + columndistance \dimexpr\xtableparameter\c!columndistance\relax + leftmargindistance \dimexpr\xtableparameter\c!leftmargindistance\relax + rightmargindistance \dimexpr\xtableparameter\c!rightmargindistance\relax + rowdistance \ht\scratchbox + header {\xtableparameter\c!header}% + footer {\xtableparameter\c!footer}% + \relax % \letxtableparameter\c!option\empty % not so nice but needed as we use this in the setup @@ -290,7 +298,7 @@ \let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_width \settrialtypesetting \tabl_x_get_buffer - \ctxcommand{x_table_reflow_width()}\relax + \clf_x_table_reflow_width \endgroup \begingroup \let\tabl_x_start_row_yes \tabl_x_start_row_reflow_height_yes @@ -301,7 +309,7 @@ \let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_height \settrialtypesetting \tabl_x_get_buffer - \ctxcommand{x_table_reflow_height()}\relax + \clf_x_table_reflow_height \endgroup \begingroup \let\tabl_x_start_row_yes \tabl_x_start_row_construct_yes @@ -311,7 +319,7 @@ \let\tabl_x_start_cell_nop\tabl_x_start_cell_construct_nop \let\tabl_x_stop_cell \tabl_x_stop_cell_construct \tabl_x_get_buffer - \ctxcommand{x_table_construct()}\relax + \clf_x_table_construct \endgroup \endgroup % * \ifinsidesplitfloat @@ -321,7 +329,7 @@ \else \tabl_x_flush_text_checked \fi\fi - \ctxcommand{x_table_cleanup()}% + \clf_x_table_cleanup \dostoptagged \resetbuffer[\tabl_x_current_buffer]% \egroup} @@ -336,19 +344,27 @@ % in text flow: headers and footers only once \setvalue{\??xtableflushsplit\v!yes}% - {\ctxcommand{x_table_flush{ method = "\v!split" }}} + {\clf_x_table_flush + method {\v!split}% + \relax} % in text flow: headers and footers only once \setvalue{\??xtableflushsplit\v!no}% - {\dontleavehmode % else no leftskip etc - \ctxcommand{x_table_flush{ method = "\v!normal" }}} + {\noindent % \dontleavehmode % else no leftskip etc + \clf_x_table_flush + method {\v!normal}% + \relax + \removeunwantedspaces} % in text flow: headers and footers get repeated \setvalue{\??xtableflushsplit\v!repeat}% {\doloop - {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi }}% + {\clf_x_table_flush + method {\v!split}% + height \ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi + \relax \ifcase\c_tabl_x_state \exitloop \else @@ -370,7 +386,10 @@ % \stopsetups % % \unexpanded\def\xtablesplitflush -% {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr\xtablesplitvsize\relax}}\relax} +% {\clf_x_table_flush +% method {\v!split}% +% height \dimexpr\xtablesplitvsize\relax +% \relax} % % \def\xtablesplitvsize % {\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi} @@ -380,7 +399,9 @@ \let\extratxtablesplitheight\zeropoint % might disappear so don't depend on it \unexpanded\def\tabl_x_flush_float_normal - {\ctxcommand{x_table_flush{ method = "\v!normal" }}} + {\clf_x_table_flush + method {\v!normal}% + \relax} \unexpanded\def\tabl_x_flush_float_split {\resetdirecttsplit @@ -391,9 +412,12 @@ \let\tsplitdirectwidth \d_tabl_x_final_width \handledirecttsplit} -\unexpanded\def\tabl_x_split_splitter#vsize% +\unexpanded\def\tabl_x_split_splitter#height% {\setbox\tsplitresult\vbox - {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr#vsize }}}% + {\clf_x_table_flush + method {\v!split}% + height \dimexpr#height\relax + \relax}% \ifcase\c_tabl_x_state \global\setfalse\somenextsplitofffloat \else @@ -402,14 +426,14 @@ \unexpanded\def\startxrow {\begingroup - \doifnextoptionalcselse\tabl_x_start_row_yes\tabl_x_start_row_nop} + \doifelsenextoptionalcs\tabl_x_start_row_yes\tabl_x_start_row_nop} \unexpanded\def\tabl_x_start_row_reflow_width_yes[#settings]% {\setupcurrentxtable[#settings]% - \ctxcommand{x_table_next_row()}} + \clf_x_table_next_row} \unexpanded\def\tabl_x_start_row_reflow_width_nop - {\ctxcommand{x_table_next_row()}} + {\clf_x_table_next_row} \unexpanded\def\tabl_x_stop_row_reflow_width {} @@ -421,27 +445,36 @@ \unexpanded\def\tabl_x_start_row_construct_yes[#settings]% {\setupcurrentxtable[#settings]% \dostarttagged\t!tablerow\empty - \ctxcommand{x_table_next_row()}} + \clf_x_table_next_row_option{\xtableparameter\c!samepage}} \unexpanded\def\tabl_x_start_row_construct_nop {\dostarttagged\t!tablerow\empty - \ctxcommand{x_table_next_row()}} + \clf_x_table_next_row} \unexpanded\def\tabl_x_stop_row_construct - {\dostoptagged} + {\clf_x_table_finish_row + \dostoptagged} \unexpanded\def\stopxrow {\tabl_x_stop_row \endgroup} \unexpanded\def\startxcell - {\doifnextoptionalcselse\tabl_x_start_cell_yes\tabl_x_start_cell_nop} + {\doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop} \unexpanded\def\stopxcell {\tabl_x_stop_cell} +\unexpanded\def\dummyxcell#1% + {\tabl_x_start_cell_nop + \tabl_x_stop_cell} + +\unexpanded\def\dummyxcell + {\tabl_x_start_cell_nop + \tabl_x_stop_cell} + \unexpanded\def\tabl_x_begin_of_cell - {\inhibitblank + {%\inhibitblank % already in framed \everypar{\delayedbegstrut}} \unexpanded\def\tabl_x_end_of_cell @@ -467,8 +500,16 @@ % Although this becomes kind of messy. It saves already time that we only check % for it when we have settings. -\def\tabl_x_set_hsize - {\hsize.25\maxdimen} % let's be reasonable +% \def\tabl_x_set_hsize +% {\hsize.25\maxdimen} % let's be reasonable + +% \def\tabl_x_set_hsize +% {\edef\p_width{\xtableparameter\c!width}% +% \ifx\p_width\empty +% \hsize.25\maxdimen % is this really needed +% \fi} + +\let\tabl_x_set_hsize\relax \unexpanded\def\tabl_x_start_cell_reflow_width_yes[#settings]% {\setbox\b_tabl_x\hbox\bgroup @@ -494,7 +535,7 @@ \fi % \d_tabl_x_distance\xtableparameter\c!distance\relax - \ctxcommand{x_table_init_reflow_width("\xtableparameter\c!option")}% + \clf_x_table_init_reflow_width_option{\xtableparameter\c!option}% \inheritedxtableframed\bgroup \tabl_x_begin_of_cell \tabl_x_set_hsize} @@ -508,7 +549,7 @@ \c_tabl_x_nx\plusone \c_tabl_x_ny\plusone \d_tabl_x_distance\xtableparameter\c!distance\relax - \ctxcommand{x_table_init_reflow_width()}% + \clf_x_table_init_reflow_width \inheritedxtableframed\bgroup \tabl_x_begin_of_cell \tabl_x_set_hsize} @@ -517,11 +558,11 @@ {\tabl_x_end_of_cell \egroup \egroup - \ctxcommand{x_table_set_reflow_width()}} + \clf_x_table_set_reflow_width} \unexpanded\def\tabl_x_start_cell_reflow_height_yes[#settings]% {\setbox\b_tabl_x\hbox\bgroup - \ctxcommand{x_table_init_reflow_height()}% + \clf_x_table_init_reflow_height \ifcase\c_tabl_x_skip_mode % can be sped up \ifnum\c_tabl_x_nesting>\plusone \letxtableparameter\c!height\v!fit % overloads given height @@ -535,7 +576,7 @@ \unexpanded\def\tabl_x_start_cell_reflow_height_nop {\setbox\b_tabl_x\hbox\bgroup - \ctxcommand{x_table_init_reflow_height()}% + \clf_x_table_init_reflow_height \ifcase\c_tabl_x_skip_mode % can be sped up \ifnum\c_tabl_x_nesting>\plusone \letxtableparameter\c!height\v!fit % overloads given height @@ -552,7 +593,7 @@ \egroup \fi \egroup - \ctxcommand{x_table_set_reflow_height()}} + \clf_x_table_set_reflow_height} \unexpanded\def\tabl_x_start_cell_construct_yes[#settings]% {\dostarttagged\t!tablecell\empty % can't we just tag the box @@ -560,7 +601,7 @@ \setupcurrentxtable[#settings]% \letxtableparameter\c!width \d_tabl_x_width % overloads given width \letxtableparameter\c!height\d_tabl_x_height % overloads given height - \ctxcommand{x_table_init_construct()}% + \clf_x_table_init_construct \inheritedxtableframed\bgroup \tabl_x_begin_of_cell \dotagxtablecell} @@ -570,7 +611,7 @@ \setbox\b_tabl_x\hbox\bgroup \letxtableparameter\c!width \d_tabl_x_width % overloads given width \letxtableparameter\c!height\d_tabl_x_height % overloads given height (commenting it ... nice option) - \ctxcommand{x_table_init_construct()}% + \clf_x_table_init_construct \inheritedxtableframed\bgroup \tabl_x_begin_of_cell \dotagxtablecell} @@ -580,7 +621,7 @@ \egroup \dotagxtablesignal % harmless spot \egroup - \ctxcommand{x_table_set_construct()}% + \clf_x_table_set_construct \dostoptagged} \unexpanded\def\startxcellgroup @@ -677,7 +718,7 @@ \unexpanded\def\startxgroup {\begingroup - \doifnextoptionalcselse\tabl_x_start_group_delayed_one\relax} + \doifelsenextoptionalcs\tabl_x_start_group_delayed_one\relax} \unexpanded\def\stopxgroup {\endgroup} @@ -695,7 +736,7 @@ \chaintocurrentxtable{#tag}% \fi \edef\currentxtable{#tag}% - \doifnextoptionalcselse\setupcurrentxtable\relax} + \doifelsenextoptionalcs\setupcurrentxtable\relax} \let\startxrowgroup \startxgroup \let\stopxrowgroup \stopxgroup @@ -706,7 +747,7 @@ \unexpanded\def\startxcell {\begingroup - \doifnextoptionalcselse\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop} + \doifelsenextoptionalcs\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop} \unexpanded\def\tabl_x_start_cell_delayed_one[#tag]% % {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname @@ -721,7 +762,7 @@ \chaintocurrentxtable{#tag}% \fi \edef\currentxtable{#tag}% - \doifnextoptionalcselse\tabl_x_start_cell_yes\tabl_x_start_cell_nop} + \doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop} \unexpanded\def\stopxcell {\tabl_x_stop_cell @@ -731,7 +772,7 @@ \unexpanded\def\startxrow {\begingroup - \doifnextoptionalcselse\tabl_x_start_row_delayed_one\tabl_x_start_row_nop} + \doifelsenextoptionalcs\tabl_x_start_row_delayed_one\tabl_x_start_row_nop} \unexpanded\def\tabl_x_start_row_delayed_one[#tag]% % {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname @@ -746,7 +787,7 @@ \chaintocurrentxtable{#tag}% \fi \edef\currentxtable{#tag}% - \doifnextoptionalcselse\tabl_x_start_row_yes\tabl_x_start_row_nop} + \doifelsenextoptionalcs\tabl_x_start_row_yes\tabl_x_start_row_nop} \unexpanded\def\stopxrow {\tabl_x_stop_row diff --git a/Master/texmf-dist/tex/context/base/task-ini.lua b/Master/texmf-dist/tex/context/base/task-ini.lua index 3dc5e71b4c8..ed9989a81cc 100644 --- a/Master/texmf-dist/tex/context/base/task-ini.lua +++ b/Master/texmf-dist/tex/context/base/task-ini.lua @@ -21,9 +21,11 @@ local tasks = nodes.tasks local prependaction = tasks.prependaction local appendaction = tasks.appendaction local disableaction = tasks.disableaction +local enableaction = tasks.enableaction local freezegroup = tasks.freezegroup local freezecallbacks = callbacks.freeze +appendaction("processors", "normalizers", "typesetters.wrappers.handler") -- disabled appendaction("processors", "normalizers", "typesetters.characters.handler") -- always on appendaction("processors", "normalizers", "fonts.collections.process") -- disabled appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled @@ -37,11 +39,13 @@ appendaction("processors", "characters", "typesetters.breakpoints.handler") appendaction("processors", "characters", "scripts.injectors.handler") -- disabled appendaction("processors", "words", "languages.replacements.handler") -- disabled -appendaction("processors", "words", "builders.kernel.hyphenation") -- always on + +appendaction("processors", "words", "languages.hyphenators.handler") -- always on + appendaction("processors", "words", "languages.words.check") -- disabled -- might move up, no disc check needed then appendaction("processors", "words", "typesetters.initials.handler") -- disabled -- might move up -appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled -- might move up +appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled -- might move down appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo @@ -57,10 +61,12 @@ appendaction("processors", "lists", "typesetters.spacings.handler") appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling) appendaction("processors", "lists", "typesetters.italics.handler") -- disabled (after otf/kern handling) -------------("processors", "lists", "typesetters.initials.handler") -- disabled +appendaction("processors", "lists", "languages.visualizediscretionaries") -- disabled + +-- appendaction("processors", "lists", "typesetters.initials.handler") -- disabled -appendaction("shipouts", "normalizers", "builders.paragraphs.expansion.trace") -- disabled appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled +appendaction("shipouts", "normalizers", "builders.paragraphs.expansion.trace") -- disabled appendaction("shipouts", "normalizers", "typesetters.alignments.handler") appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled @@ -102,10 +108,8 @@ appendaction("math", "builders", "builders.kernel.mlist_to_hlist") ------------("math", "builders", "noads.handlers.italics", nil, "nohead") -- disabled appendaction("math", "builders", "typesetters.directions.processmath") -- disabled (has to happen pretty late) --- quite experimental (nodes.handlers.graphicvadjust might go away) - appendaction("finalizers", "lists", "builders.paragraphs.keeptogether") -appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo +------------("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo appendaction("finalizers", "fonts", "builders.paragraphs.solutions.splitters.optimize") -- experimental appendaction("finalizers", "lists", "builders.paragraphs.tag") @@ -128,6 +132,7 @@ appendaction ("shipouts", "normalizers", "nodes.properties.delayed") -- enabl -- speedup: only kick in when used +disableaction("processors", "typesetters.wrappers.handler") disableaction("processors", "languages.replacements.handler") disableaction("processors", "typesetters.characteralign.handler") disableaction("processors", "scripts.autofontfeature.handler") @@ -147,6 +152,7 @@ disableaction("processors", "typesetters.firstlines.handler") disableaction("processors", "typesetters.spacings.handler") disableaction("processors", "typesetters.kerns.handler") disableaction("processors", "typesetters.italics.handler") +disableaction("processors", "languages.visualizediscretionaries") disableaction("processors", "nodes.handlers.stripping") disableaction("shipouts", "builders.paragraphs.expansion.trace") @@ -164,7 +170,6 @@ disableaction("shipouts", "nodes.visualizers.handler") disableaction("shipouts", "nodes.handlers.accessibility") disableaction("shipouts", "nodes.handlers.backgrounds") disableaction("shipouts", "nodes.handlers.alignbackgrounds") -disableaction("shipouts", "nodes.handlers.cleanuppage") disableaction("shipouts", "nodes.references.handler") disableaction("shipouts", "nodes.destinations.handler") @@ -177,7 +182,7 @@ disableaction("processors", "builders.paragraphs.solutions.splitters.split") disableaction("finalizers", "builders.paragraphs.keeptogether") disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize") -disableaction("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete +-------------("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete disableaction("finalizers", "builders.paragraphs.tag") disableaction("math", "noads.handlers.showtree") @@ -216,3 +221,18 @@ freezegroup("vboxbuilders", "normalizers") freezegroup("math", "normalizers") freezegroup("math", "builders") + +-- new: disabled here + +disableaction("processors", "builders.kernel.ligaturing") +disableaction("processors", "builders.kernel.kerning") + +directives.register("nodes.basepass", function(v) + if v then + disableaction("processors", "builders.kernel.ligaturing") + disableaction("processors", "builders.kernel.kerning") + else + enableaction("processors", "builders.kernel.ligaturing") + enableaction("processors", "builders.kernel.kerning") + end +end) diff --git a/Master/texmf-dist/tex/context/base/toks-ini.lua b/Master/texmf-dist/tex/context/base/toks-ini.lua index 0f0c016f8e9..f8b94589040 100644 --- a/Master/texmf-dist/tex/context/base/toks-ini.lua +++ b/Master/texmf-dist/tex/context/base/toks-ini.lua @@ -5,338 +5,252 @@ if not modules then modules = { } end modules ['toks-ini'] = { license = "see context related readme files" } -local context, commands = context, commands -local utfbyte, utfchar, utfvalues = utf.byte, utf.char, utf.values -local format, gsub = string.format, string.gsub - ---[[ldx-- -

This code is experimental and needs a cleanup. The visualizers will move to -a module.

---ldx]]-- - --- 1 = command, 2 = modifier (char), 3 = controlsequence id --- --- callback.register('token_filter', token.get_next) --- --- token.get_next() --- token.expand() --- token.create() --- token.csname_id() --- token.csname_name(v) --- token.command_id() --- token.command_name(v) --- token.is_expandable() --- token.is_activechar() --- token.lookup(v) - --- actually, we can use token registers to store tokens - -local token, tex = token, tex - -local createtoken = token.create -local csname_id = token.csname_id -local command_id = token.command_id -local command_name = token.command_name -local get_next = token.get_next -local expand = token.expand -local is_activechar = token.is_activechar -local csname_name = token.csname_name - -tokens = tokens or { } -local tokens = tokens - -tokens.vbox = createtoken("vbox") -tokens.hbox = createtoken("hbox") -tokens.vtop = createtoken("vtop") -tokens.bgroup = createtoken(utfbyte("{"), 1) -tokens.egroup = createtoken(utfbyte("}"), 2) - -tokens.letter = function(chr) return createtoken(utfbyte(chr), 11) end -tokens.other = function(chr) return createtoken(utfbyte(chr), 12) end - -tokens.letters = function(str) - local t, n = { }, 0 - for chr in utfvalues(str) do - n = n + 1 - t[n] = createtoken(chr, 11) - end - return t -end - -tokens.collectors = tokens.collectors or { } -local collectors = tokens.collectors - -collectors.data = collectors.data or { } -local collectordata = collectors.data +tokens = tokens or { } + +local tokens = tokens +local tostring = tostring +local utfchar = utf.char +local char = string.char +local printtable = table.print +local concat = table.concat + +if newtoken then + + if setinspector then + + local istoken = newtoken.is_token + local simple = { letter = "letter", other_char = "other" } + + local function astable(t) + if t and istoken(t) then + local cmdname = t.cmdname + local simple = simple[cmdname] + if simple then + return { + category = simple, + character = utfchar(t.mode) or nil, + } + else + return { + command = t.command, + id = t.id, + tok = t.tok, + csname = t.csname, + active = t.active, + expandable = t.expandable, + protected = t.protected, + mode = t.mode, + cmdname = cmdname, + } + end + end + end -collectors.registered = collectors.registered or { } -local registered = collectors.registered + tokens.istoken = istoken + tokens.astable = astable -local function printlist(data) - callbacks.push('token_filter', function () - callbacks.pop('token_filter') -- tricky but the nil assignment helps - return data - end) -end + setinspector(function(v) if istoken(v) then printtable(astable(v),tostring(v)) return true end end) -tex.printlist = printlist -- will change to another namespace + end -function collectors.flush(tag) - printlist(collectordata[tag]) -end + local scan_toks = newtoken.scan_toks + local scan_string = newtoken.scan_string + local scan_int = newtoken.scan_int + local scan_code = newtoken.scan_code + local scan_dimen = newtoken.scan_dimen + local scan_glue = newtoken.scan_glue + local scan_keyword = newtoken.scan_keyword + local scan_token = newtoken.scan_token + local scan_word = newtoken.scan_word + local scan_number = newtoken.scan_number -function collectors.test(tag) - printlist(collectordata[tag]) -end + local get_next = newtoken.get_next -function collectors.register(name) - registered[csname_id(name)] = name -end + local set_macro = newtoken.set_macro -local call = command_id("call") -local letter = command_id("letter") -local other = command_id("other_char") - -function collectors.install(tag,end_cs) - local data, d = { }, 0 - collectordata[tag] = data - local endcs = csname_id(end_cs) - while true do - local t = get_next() - local a, b = t[1], t[3] - if b == endcs then - context["end_cs"]() - return - elseif a == call and registered[b] then - expand() + set_macro = function(k,v,g) + if g == "global" then + context.setgvalue(k,v or '') else - d = d + 1 - data[d] = t + context.setvalue(k,v or '') end end -end - -function collectors.handle(tag,handle,flush) - collectordata[tag] = handle(collectordata[tag]) - if flush then - collectors.flush(tag) - end -end -local show_methods = { } -collectors.show_methods = show_methods + local bits = { + escape = 2^ 0, + begingroup = 2^ 1, + endgroup = 2^ 2, + mathshift = 2^ 3, + alignment = 2^ 4, + endofline = 2^ 5, + parameter = 2^ 6, + superscript = 2^ 7, + subscript = 2^ 8, + ignore = 2^ 9, + space = 2^10, -- 1024 + letter = 2^11, + other = 2^12, + active = 2^13, + comment = 2^14, + invalid = 2^15, + -- + character = 2^11 + 2^12, + whitespace = 2^13 + 2^10, -- / needs more checking + -- + open = 2^10 + 2^1, -- space + begingroup + close = 2^10 + 2^2, -- space + endgroup + } + + -- for k, v in next, bits do bits[v] = k end + + tokens.bits = bits + + local space_bits = bits.space + + -- words are space or \relax terminated and the trailing space is gobbled; a word + -- can contain any non-space letter/other + + local t = { } -- small optimization, a shared variable that is not reset + + if scan_word then + + scan_number = function(base) + local s = scan_word() + if not s then + return nil + elseif base then + return tonumber(s,base) + else + return tonumber(s) + end + end -function collectors.show(tag, method) - if type(tag) == "table" then - show_methods[method or 'a'](tag) else - show_methods[method or 'a'](collectordata[tag]) - end -end - -function collectors.defaultwords(t,str) - local n = #t - n = n + 1 - t[n] = tokens.bgroup - n = n + 1 - t[n] = createtoken("red") - for i=1,#str do - n = n + 1 - t[n] = tokens.other('*') - end - n = n + 1 - t[n] = tokens.egroup -end -function collectors.dowithwords(tag,handle) - local t, w, tn, wn = { }, { }, 0, 0 - handle = handle or collectors.defaultwords - local tagdata = collectordata[tag] - for k=1,#tagdata do - local v = tagdata[k] - if v[1] == letter then - wn = wn + 1 - w[wn] = v[2] - else - if wn > 0 then - handle(t,w) - wn = 0 + scan_word = function() + local n = 0 + while true do + local c = scan_code() + if c then + n = n + 1 + t[n] = utfchar(c) + elseif scan_code(space_bits) then + if n > 0 then + break + end + elseif n > 0 then + break + else + return + end end - tn = tn + 1 - t[tn] = v + return concat(t,"",1,n) end - end - if wn > 0 then - handle(t,w) - end - collectordata[tag] = t -end -local function showtoken(t) - if t then - local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, command_name(t) or "" - if cmd == letter or cmd == other then - return format("%s-> %s -> %s", name, chr, utfchar(chr)) - elseif id > 0 then - cs = csname_name(t) or nil - if cs then - return format("%s-> %s", name, cs) - elseif tonumber(chr) < 0 then - return format("%s-> %s", name, id) + -- so we gobble the space (like scan_int) (number has to be space or non-char terminated + -- as we accept 0xabcd and such so there is no clear separator for a keyword + + scan_number = function(base) + local n = 0 + while true do + local c = scan_code() + if c then + n = n + 1 + t[n] = char(c) + elseif scan_code(space_bits) then + if n > 0 then + break + end + elseif n > 0 then + break + else + return + end + end + local s = concat(t,"",1,n) + if base then + return tonumber(s,base) else - return format("%s-> (%s,%s)", name, chr, id) + return tonumber(s) end - else - return format("%s", name) end - else - return "no node" - end -end - -collectors.showtoken = showtoken - -function collectors.trace() - local t = get_next() - logs.report("tokenlist",showtoken(t)) - return t -end - --- these might move to a runtime module -show_methods.a = function(data) -- no need to store the table, just pass directly - local function row(one,two,three,four,five) - context.NC() context(one) - context.NC() context(two) - context.NC() context(three) - context.NC() context(four) - context.NC() context(five) - context.NC() context.NR() end - context.starttabulate { "|T|Tr|cT|Tr|T|" } - row("cmd","chr","","id","name") - context.HL() - for _,v in next, data do - local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", "" - local name = gsub(command_name(v) or "","_","\\_") - if id > 0 then - cs = csname_name(v) or "" - if cs ~= "" then cs = "\\string " .. cs end - else - id = "" - end - if cmd == letter or cmd == other then - sym = "\\char " .. chr - end - if tonumber(chr) < 0 then - row(name,"",sym,id,cs) - else - row(name,chr,sym,id,cs) - end - end - context.stoptabulate() -end -local function show_b_c(data,swap) -- no need to store the table, just pass directly - local function row(one,two,three) - context.NC() context(one) - context.NC() context(two) - context.NC() context(three) - context.NC() context.NR() - end - if swap then - context.starttabulate { "|Tl|Tl|Tr|" } - else - context.starttabulate { "|Tl|Tr|Tl|" } - end - row("cmd","chr","name") - context.HL() - for _,v in next, data do - local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", "" - local name = gsub(command_name(v) or "","_","\\_") - if id > 0 then - cs = csname_name(v) or "" - end - if cmd == letter or cmd == other then - sym = "\\char " .. chr - elseif cs == "" then - -- okay - elseif is_activechar(v) then - sym = "\\string " .. cs + -- -- the next one cannot handle \iftrue true\else false\fi + -- + -- local function scan_boolean() + -- if scan_keyword("true") then + -- return true + -- elseif scan_keyword("false") then + -- return false + -- else + -- return nil + -- end + -- end + + local function scan_boolean() + local kw = scan_word() + if kw == "true" then + return true + elseif kw == "false" then + return false else - sym = "\\string\\" .. cs - end - if swap then - row(name,sym,chr) - elseif tonumber(chr) < 0 then - row(name,"",sym) - else - row(name,chr,sym) + return nil end end - context.stoptabulate() -end --- Even more experimental ... + tokens.scanners = { -- these expand + token = scan_token or get_next, + toks = scan_toks, + tokens = scan_toks, + dimen = scan_dimen, + dimension = scan_dimen, + glue = scan_glue, + skip = scan_glue, + integer = scan_int, + count = scan_int, + string = scan_string, + code = scan_code, + word = scan_word, + number = scan_number, + boolean = scan_boolean, + keyword = scan_keyword, + } + + tokens.getters = { -- these don't expand + token = get_next, + count = tex.getcount, + dimen = tex.getdimen, + box = tex.getbox, + } + + tokens.setters = { + macro = set_macro, + count = tex.setcount, + dimen = tex.setdimen, + box = tex.setbox, + } -show_methods.b = function(data) show_b_c(data,false) end -show_methods.c = function(data) show_b_c(data,true ) end - -local remapper = { } -- namespace -collectors.remapper = remapper - -local remapperdata = { } -- user mappings -remapper.data = remapperdata - -function remapper.store(tag,class,key) - local s = remapperdata[class] - if not s then - s = { } - remapperdata[class] = s - end - s[key] = collectordata[tag] - collectordata[tag] = nil end -function remapper.convert(tag,toks) - local data = remapperdata[tag] - local leftbracket, rightbracket = utfbyte('['), utfbyte(']') - local skipping = 0 - -- todo: math - if data then - local t, n = { }, 0 - for s=1,#toks do - local tok = toks[s] - local one, two = tok[1], tok[2] - if one == 11 or one == 12 then - if two == leftbracket then - skipping = skipping + 1 - n = n + 1 ; t[n] = tok - elseif two == rightbracket then - skipping = skipping - 1 - n = n + 1 ; t[n] = tok - elseif skipping == 0 then - local new = data[two] - if new then - if #new > 1 then - for n=1,#new do - n = n + 1 ; t[n] = new[n] - end - else - n = n + 1 ; t[n] = new[1] - end - else - n = n + 1 ; t[n] = tok - end - else - n = n + 1 ; t[n] = tok - end - else - n = n + 1 ; t[n] = tok - end - end - return t - else - return toks - end -end +-- static int run_scan_token(lua_State * L) +-- { +-- saved_tex_scanner texstate; +-- save_tex_scanner(texstate); +-- get_x_token(); +-- make_new_token(L, cur_cmd, cur_chr, cur_cs); +-- unsave_tex_scanner(texstate); +-- return 1; +-- } +-- +-- static int run_get_future(lua_State * L) +-- { +-- /* saved_tex_scanner texstate; */ +-- /* save_tex_scanner(texstate); */ +-- get_token(); +-- make_new_token(L, cur_cmd, cur_chr, cur_cs); +-- back_input(); +-- /* unsave_tex_scanner(texstate); */ +-- return 1; +-- } diff --git a/Master/texmf-dist/tex/context/base/toks-ini.mkiv b/Master/texmf-dist/tex/context/base/toks-ini.mkiv index 4eb756b7537..49625a93990 100644 --- a/Master/texmf-dist/tex/context/base/toks-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/toks-ini.mkiv @@ -14,57 +14,11 @@ \writestatus{loading}{ConTeXt Token Support / Initialization} \registerctxluafile{toks-ini}{1.001} +\registerctxluafile{toks-scn}{1.001} +\registerctxluafile{cldf-scn}{1.001} \unprotect -%D Handy for manuals \unknown - -\unexpanded\def\starttokens [#1]{\ctxlua{tokens.collectors.install("#1","stoptokens")}} - \let\stoptokens \relax - \def\flushtokens [#1]{\ctxlua{tokens.collectors.flush("#1")}} - \def\showtokens [#1]{\ctxlua{tokens.collectors.show("#1")}} - \def\testtokens [#1]{\ctxlua{tokens.collectors.with_words("#1")}} - \def\registertoken #1{\ctxlua{tokens.collectors.register("#1")}} - -%D Inspired by a prototype by Taco for Thomas cum suis. - -% \defineremapper[babelgreek] -% -% \remapcharacter[babelgreek][`a]{\alpha} -% \remapcharacter[babelgreek][`b]{\beta} -% \remapcharacter[babelgreek][`c]{\gamma} -% \remapcharacter[babelgreek][`d]{OEPS} -% -% \starttext -% -% [\startbabelgreek -% a b c some stuff here \blank[big] oeps b d -% \stopbabelgreek] -% -% [\babelgreek{some stuff here}] -% -% \stoptext - -\unexpanded\def\defineremapper[#1]% - {\setuevalue{\e!start#1}{\toks_start_remapper{#1}}% - \setuevalue{\e!stop #1}{\toks_stop_remapper {#1}}% - \letvalue{#1}\relax - \normalexpanded{\expandafter\def\csname#1\endcsname##1{\csname\e!start#1\endcsname##1\csname\e!stop#1\endcsname}}} - -\unexpanded\def\toks_start_remapper#1% - {\ctxlua{tokens.collectors.install("#1", "\e!stop#1")}} - -\unexpanded\def\toks_stop_remapper#1% - {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end, true)}} - -\unexpanded\def\remaptokens#1% - {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end)}} - -\unexpanded\def\remapcharacter - {\dodoubleempty\toks_remap_character} - -\def\toks_remap_character[#1][#2]#3% - {\ctxlua{tokens.collectors.install("store", "ctxlua")}#3% - \ctxlua{tokens.collectors.remapper.store("store","#1",\number#2)}} +% nothing yet \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/toks-map.lua b/Master/texmf-dist/tex/context/base/toks-map.lua new file mode 100644 index 00000000000..9120c2084e6 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/toks-map.lua @@ -0,0 +1,70 @@ +if not modules then modules = { } end modules ['toks-map'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Even more experimental ... this used to be part of toks-ini but as +-- this kind of remapping has not much use it is not loaded in the +-- core. We just keep it here for old times sake. + +-- local remapper = { } -- namespace +-- collectors.remapper = remapper +-- +-- local remapperdata = { } -- user mappings +-- remapper.data = remapperdata +-- +-- function remapper.store(tag,class,key) +-- local s = remapperdata[class] +-- if not s then +-- s = { } +-- remapperdata[class] = s +-- end +-- s[key] = collectordata[tag] +-- collectordata[tag] = nil +-- end +-- +-- function remapper.convert(tag,toks) +-- local data = remapperdata[tag] +-- local leftbracket = utfbyte('[') +-- local rightbracket = utfbyte(']') +-- local skipping = 0 +-- -- todo: math +-- if data then +-- local t, n = { }, 0 +-- for s=1,#toks do +-- local tok = toks[s] +-- local one, two = tok[1], tok[2] +-- if one == 11 or one == 12 then +-- if two == leftbracket then +-- skipping = skipping + 1 +-- n = n + 1 ; t[n] = tok +-- elseif two == rightbracket then +-- skipping = skipping - 1 +-- n = n + 1 ; t[n] = tok +-- elseif skipping == 0 then +-- local new = data[two] +-- if new then +-- if #new > 1 then +-- for n=1,#new do +-- n = n + 1 ; t[n] = new[n] +-- end +-- else +-- n = n + 1 ; t[n] = new[1] +-- end +-- else +-- n = n + 1 ; t[n] = tok +-- end +-- else +-- n = n + 1 ; t[n] = tok +-- end +-- else +-- n = n + 1 ; t[n] = tok +-- end +-- end +-- return t +-- else +-- return toks +-- end +-- end diff --git a/Master/texmf-dist/tex/context/base/toks-map.mkiv b/Master/texmf-dist/tex/context/base/toks-map.mkiv new file mode 100644 index 00000000000..f1b63a68b0a --- /dev/null +++ b/Master/texmf-dist/tex/context/base/toks-map.mkiv @@ -0,0 +1,63 @@ +%D \module +%D [ file=toks-map, % experimental moved from toks-ini +%D version=2007.03.03, +%D title=\CONTEXT\ Token Support, +%D subtitle=Initialization, +%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. + +% \writestatus{loading}{ConTeXt Token Support / Remapping} +% +% \registerctxluafile{toks-map}{1.001} +% +% \unprotect +% +% %D Inspired by a prototype by Taco for Thomas cum suis. +% %D +% %D \starttyping +% %D \defineremapper[babelgreek] +% %D +% %D \remapcharacter[babelgreek][`a]{\alpha} +% %D \remapcharacter[babelgreek][`b]{\beta} +% %D \remapcharacter[babelgreek][`c]{\gamma} +% %D \remapcharacter[babelgreek][`d]{OEPS} +% %D +% %D \starttext +% %D +% %D [\startbabelgreek +% %D a b c some stuff here \blank[big] oeps b d +% %D \stopbabelgreek] +% %D +% %D [\babelgreek{some stuff here}] +% %D +% %D \stoptext +% %D \stoptyping +% +% \unexpanded\def\defineremapper[#1]% +% {\setuevalue{\e!start#1}{\toks_start_remapper{#1}}% +% \setuevalue{\e!stop #1}{\toks_stop_remapper {#1}}% +% \letvalue{#1}\relax +% \normalexpanded{\expandafter\def\csname#1\endcsname##1{\csname\e!start#1\endcsname##1\csname\e!stop#1\endcsname}}} +% +% \unexpanded\def\toks_start_remapper#1% +% {\ctxlua{tokens.collectors.install("#1", "\e!stop#1")}} +% +% \unexpanded\def\toks_stop_remapper#1% +% {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end, true)}} +% +% \unexpanded\def\remaptokens#1% +% {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end)}} +% +% \unexpanded\def\remapcharacter +% {\dodoubleempty\toks_remap_character} +% +% \def\toks_remap_character[#1][#2]#3% +% {\ctxlua{tokens.collectors.install("store", "ctxlua")}#3% +% \ctxlua{tokens.collectors.remapper.store("store","#1",\number#2)}} +% +% \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/toks-scn.lua b/Master/texmf-dist/tex/context/base/toks-scn.lua new file mode 100644 index 00000000000..84924c69419 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/toks-scn.lua @@ -0,0 +1,437 @@ +if not modules then modules = { } end modules ['toks-scn'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Writing this kind of code (and completing the newtoken code base) is fun. I did +-- so with the brilliant film music from The Girl with the Dragon Tattoo running in a +-- loop in the background (three cd's by Trent Reznor and Atticus Ross). An alien +-- feeling helps with alien code. + +-- todo: more \let's at the tex end + +local type, next, tostring, tonumber = type, next, tostring, tonumber + +local formatters = string.formatters +local concat = table.concat + +local scanners = tokens.scanners +local tokenbits = tokens.bits + +local scanstring = scanners.string +local scaninteger = scanners.integer +local scannumber = scanners.number +local scankeyword = scanners.keyword +local scanword = scanners.word +local scancode = scanners.code +local scanboolean = scanners.boolean +local scandimen = scanners.dimen + +local todimen = number.todimen +local toboolean = toboolean + +local lpegmatch = lpeg.match +local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted) + +local trace_compile = false trackers.register("tokens.compile", function(v) trace_compile = v end) +local report_compile = logs.reporter("tokens","compile") +local report_scan = logs.reporter("tokens","scan") + +local open = tokenbits.open +local close = tokenbits.close + +local function scanopen() + while true do + local c = scancode(open) + if c == 123 then + return true + -- elseif c ~= 32 then + elseif not c then + return + end + end +end + +local function scanclose() + while true do + local c = scancode(close) + if c == 125 then + return true + -- elseif c ~= 32 then + elseif not c then + return + end + end +end + +scanners.scanopen = scanopen +scanners.scanclose = scanclose + +local function scanlist() + local wrapped = scanopen() + local list = { } + local size = 0 + while true do + local entry = scanstring() + if entry then + size = size + 1 + list[size] = entry + else + break + end + end + if wrapped then + scanclose() + end + return list +end + +local function scanconditional() + local kw = scanword() + if kw == "true" then + return true + end + if kw == "false" then + return false + end + local c = scaninteger() + if c then + return c == 0 -- with a conditional 0=true + end + return nil +end + +scanners.list = scanlist +scanners.conditional = scanconditional + +local shortcuts = { + tokens = tokens, + bits = tokenbits, + open = open, + close = close, + scanners = scanners, + scanstring = scanstring, + scaninteger = scaninteger, + scannumber = scannumber, + scankeyword = scankeyword, + scanword = scanword, + scancode = scancode, + scanboolean = scanboolean, + scandimen = scandimen, + scandimension = scandimen, + scanconditional = scanconditional, + scanopen = scanopen, + scanclose = scanclose, + scanlist = scanlist, + todimen = todimen, + tonumber = tonumber, + tostring = tostring, + toboolean = toboolean, + inspect = inspect, + report = report_scan, +} + +tokens.shortcuts = shortcuts + +local load = load +local dump = string.dump + +local function loadstripped(code) + return load(code,nil,nil,shortcuts) + -- return load(dump(load(code),true),nil,nil,shortcuts) +end + +tokens.converters = { + tonumber = "tonumber", + tostring = "tostring", + toboolean = "toboolean", + todimen = "todimen", + toglue = "todimen", +} + +local f_if = formatters[ " if scankeyword('%s') then data['%s'] = scan%s()"] +local f_elseif = formatters[" elseif scankeyword('%s') then data['%s'] = scan%s()"] +local f_local = formatters["local scan%s = scanners.%s"] +local f_scan = formatters["scan%s()"] +local f_shortcut = formatters["local %s = scanners.converters.%s"] + +local f_if_c = formatters[ " if scankeyword('%s') then data['%s'] = %s(scan%s())"] +local f_elseif_c = formatters[" elseif scankeyword('%s') then data['%s'] = %s(scan%s())"] +local f_scan_c = formatters["%s(scan%s())"] + +local f_any = formatters[" else local key = scanword() if key then data[key] = scan%s() else break end end"] +local f_any_c = formatters[" else local key = scanword() if key then data[key] = %s(scan%s()) else break end end"] +local s_done = " else break end" + +local f_any_all = formatters[" local key = scanword() if key then data[key] = scan%s() else break end"] +local f_any_all_c= formatters[" local key = scanword() if key then data[key] = %s(scan%s()) else break end"] + +local f_table = formatters["%\nt\nreturn function()\n local data = { }\n%s\n return %s\nend\n"] +local f_sequence = formatters["%\nt\n%\nt\n%\nt\nreturn function()\n return %s\nend\n"] +local f_simple = formatters["%\nt\nreturn function()\n return %s\nend\n"] +local f_string = formatters["%q"] +local f_action_f = formatters["action%s(%s)"] +local f_action_s = formatters["local action%s = tokens._action[%s]"] +local f_nested = formatters["local function scan%s()\n local data = { }\n%s\n return data\nend\n"] + +-- local f_check = formatters[ [[ +-- local wrapped = false +-- while true do +-- local c = scancode(open) +-- if c == 123 then +-- wrapped = true +-- break +-- elseif c ~= 32 then +-- break +-- end +-- end +-- while true do +-- ]] .. "%\nt\n" .. [[ +-- %s +-- end +-- if wrapped then +-- while true do +-- local c = scancode(close) +-- if c == 125 then +-- break +-- elseif c ~= 32 then +-- break +-- end +-- end +-- end +-- ]] ] + +local f_check = formatters[ [[ + local wrapped = scanopen() + while true do + ]] .. "%\nt\n" .. [[ + %s + end + if wrapped then + scanclose() + end +]] ] + +function tokens.compile(specification) + local f = { } + local n = 0 + local c = { } + local t = specification.arguments or specification + local a = specification.actions or nil + if type(a) == "function" then + a = { a } + end + local code + local function compile(t,nested) + local done = s_done + local r = { } + local m = 0 + for i=1,#t do + local ti = t[i] + if ti == "*" and i == 1 then + done = f_any_all("string") + else + local t1 = ti[1] + local t2 = ti[2] or "string" + if type(t2) == "table" then + n = n + 1 + f[n] = compile(t2,n) + t2 = n + end + local t3 = ti[3] + if type(t3) == "function" then + -- todo: also create shortcut + elseif t3 then + c[t3] = f_shortcut(t3,t3) + if t1 == "*" then + if i == 1 then + done = f_any_all_c(t3,t2) + break + else + done = f_any_c(t3,t2) + end + else + m = m + 1 + r[m] = (m > 1 and f_elseif_c or f_if_c)(t1,t1,t3,t2) + end + else + if t1 == "*" then + if i == 1 then + done = f_any_all(t2) + break + else + done = f_any(t2) + end + else + m = m + 1 + r[m] = (m > 1 and f_elseif or f_if )(t1,t1,t2) + end + end + end + end + local c = f_check(r,done) + if nested then + return f_nested(nested,c) + else + return c + end + end + local tt = type(t) + if tt == "string" then + if a then + local s = lpegmatch(p_unquoted,t) + if s and t ~= s then + code = t + else + code = f_scan(t) + end + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + code = f_simple(f,code) + else + return scanners[t] + end + elseif tt ~= "table" then + return + elseif #t == 1 then + local ti = t[1] + if type(ti) == "table" then + ti = compile(ti) + code = "data" + if a then + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + end + code = f_table(f,ti,code) + elseif a then + code = f_scan(ti) + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + code = f_simple(f,code) + else + return scanners[ti] + end + else + local r = { } + local p = { } + local m = 0 + for i=1,#t do + local ti = t[i] + local tt = type(ti) + if tt == "table" then + if ti[1] == "_constant_" then + local v = ti[2] + if type(v) == "string" then + r[i] = f_string(v) + else + r[i] = tostring(v) + end + else + m = m + 1 + p[m] = compile(ti,100+m) + r[i] = f_scan(100+m) + end + elseif tt == "number" then + r[i] = tostring(ti) + elseif tt == "boolean" then + r[i] = tostring(ti) + else + local s = lpegmatch(p_unquoted,ti) + if s and ti ~= s then + r[i] = ti -- a string, given as "'foo'" or '"foo"' + elseif scanners[ti] then + r[i] = f_scan(ti) + else + report_compile("unknown scanner %a",ti) + r[i] = ti + end + end + end + code = concat(r,",") + if a then + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + end + code = f_sequence(c,f,p,code) + end + if not code then + return + end + if trace_compile then + report_compile("code: %s",code) + end + local code, message = loadstripped(code) + if code then + code = code() -- sets action + else + report_compile("error in code: %s",code) + report_compile("error message: %s",message) + end + if a then + tokens._action = nil + end + if code then + return code + end +end + +-- local fetch = tokens.compile { +-- "string", +-- "string", +-- { +-- { "data", "string" }, +-- { "tab", "string" }, +-- { "method", "string" }, +-- { "foo", { +-- { "method", "integer" }, +-- { "compact", "number" }, +-- { "nature" }, +-- { "*" }, -- any key +-- } }, +-- { "compact", "string", "tonumber" }, +-- { "nature", "boolean" }, +-- { "escape", "string" }, +-- { "escape" }, +-- } +-- "boolean", +-- } +-- +-- os.exit() + +function tokens.scantable(t,data) + if not data then + data = { } + end + local wrapped = scanopen() + while true do + local key = scanword() + if key then + local get = t[key] + if get then + data[key] = get() + else + -- catch all we can get + end + else + break + end + end + if wrapped then + scanclose() + end + return data +end diff --git a/Master/texmf-dist/tex/context/base/toks-tra.lua b/Master/texmf-dist/tex/context/base/toks-tra.lua new file mode 100644 index 00000000000..bf2b91d38a3 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/toks-tra.lua @@ -0,0 +1,298 @@ +if not modules then modules = { } end modules ['toks-ini'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + + +local utfbyte, utfchar, utfvalues = utf.byte, utf.char, utf.values +local format, gsub = string.format, string.gsub +local tostring = tostring + +local tokens = tokens +local newtoken = newtoken +local tex = tex +local context = context +local commands = commands + +tokens.collectors = tokens.collectors or { } +local collectors = tokens.collectors + +collectors.data = collectors.data or { } +local collectordata = collectors.data + +collectors.registered = collectors.registered or { } +local registered = collectors.registered + +local report = logs.reporter("tokens","collectors") + +if newtoken then + + -- todo: + -- + -- register : macros that will be expanded (only for demo-ing) + -- flush : print back to tex + -- test : fancy stuff + + local get_next = newtoken.get_next + local create = newtoken.create + + function collectors.install(tag,end_cs) + local data, d = { }, 0 + collectordata[tag] = data + end_cs = gsub(end_cs,"^\\","") + while true do + local t = get_next() + if t.csname == end_cs then + context[end_cs]() + return + else + d = d + 1 + data[d] = t + end + end + end + + local simple = { letter = "letter", other_char = "other" } + + function collectors.show(data) + -- We no longer have methods as we only used (in demos) method a + -- so there is no need to burden the core with this. We have a + -- different table anyway. + if type(data) == "string" then + data = collectordata[data] + end + if not data then + return + end + local ctx_NC = context.NC + local ctx_NR = context.NR + local ctx_bold = context.bold + local ctx_verbatim = context.verbatim + context.starttabulate { "|Tl|Tc|Tl|" } + ctx_NC() ctx_bold("cmd") + ctx_NC() ctx_bold("meaning") + ctx_NC() ctx_bold("properties") + ctx_NC() ctx_NR() + context.HL() + for i=1,#data do + local token = data[i] + local cmdname = token.cmdname + local simple = simple[cmdname] + ctx_NC() + ctx_verbatim(simple or cmdname) + ctx_NC() + ctx_verbatim(simple and utfchar(token.mode) or token.csname) + ctx_NC() + if token.active then context("active ") end + if token.expandable then context("expandable ") end + if token.protected then context("protected ") end + ctx_NC() + ctx_NR() + end + context.stoptabulate() + end + + local function printlist(data) + if data and #data > 0 then + report("not supported (yet): printing back to tex") + end + end + + tokens.printlist = printlist -- will change to another namespace + + function collectors.flush(tag) + printlist(collectordata[tag]) + end + + function collectors.test(tag,handle) + report("not supported (yet): testing") + end + + function collectors.register(name) + report("not supported (yet): registering") + end + +else + + -- 1 = command, 2 = modifier (char), 3 = controlsequence id + + local create = token.create + local csname_id = token.csname_id + local command_id = token.command_id + local command_name = token.command_name + local get_next = token.get_next + local expand = token.expand + local csname_name = token.csname_name + + local function printlist(data) + if data and #data > 0 then + callbacks.push('token_filter', function () + callbacks.pop('token_filter') -- tricky but the nil assignment helps + return data + end) + end + end + + tokens.printlist = printlist -- will change to another namespace + + function collectors.flush(tag) + printlist(collectordata[tag]) + end + + function collectors.register(name) + registered[csname_id(name)] = name + end + + local call = command_id("call") + local letter = command_id("letter") + local other = command_id("other_char") + + function collectors.install(tag,end_cs) + local data, d = { }, 0 + collectordata[tag] = data + end_cs = gsub(end_cs,"^\\","") + local endcs = csname_id(end_cs) + while true do + local t = get_next() + local a, b = t[1], t[3] + if b == endcs then + context[end_cs]() + return + elseif a == call and registered[b] then + expand() + else + d = d + 1 + data[d] = t + end + end + end + + function collectors.show(data) + -- We no longer have methods as we only used (in demos) method a + -- so there is no need to burden the core with this. + if type(data) == "string" then + data = collectordata[data] + end + if not data then + return + end + local ctx_NC = context.NC + local ctx_NR = context.NR + local ctx_bold = context.bold + local ctx_verbatim = context.verbatim + context.starttabulate { "|T|Tr|cT|Tr|T|" } + ctx_NC() ctx_bold("cmd") + ctx_NC() ctx_bold("chr") + ctx_NC() + ctx_NC() ctx_bold("id") + ctx_NC() ctx_bold("name") + ctx_NC() ctx_NR() + context.HL() + for i=1,#data do + local token = data[i] + local cmd = token[1] + local chr = token[2] + local id = token[3] + local name = command_name(token) + ctx_NC() + ctx_verbatim(name) + ctx_NC() + if tonumber(chr) >= 0 then + ctx_verbatim(chr) + end + ctx_NC() + if cmd == letter or cmd == other then + ctx_verbatim(utfchar(chr)) + end + ctx_NC() + if id > 0 then + ctx_verbatim(id) + end + ctx_NC() + if id > 0 then + ctx_verbatim(csname_name(token) or "") + end + ctx_NC() ctx_NR() + end + context.stoptabulate() + end + + function collectors.test(tag,handle) + local t, w, tn, wn = { }, { }, 0, 0 + handle = handle or collectors.defaultwords + local tagdata = collectordata[tag] + for k=1,#tagdata do + local v = tagdata[k] + if v[1] == letter then + wn = wn + 1 + w[wn] = v[2] + else + if wn > 0 then + handle(t,w) + wn = 0 + end + tn = tn + 1 + t[tn] = v + end + end + if wn > 0 then + handle(t,w) + end + collectordata[tag] = t + end + +end + +-- Interfacing: + +commands.collecttokens = collectors.install +commands.showtokens = collectors.show +commands.flushtokens = collectors.flush +commands.testtokens = collectors.test +commands.registertoken = collectors.register + +-- Redundant: + +-- function collectors.test(tag) +-- printlist(collectordata[tag]) +-- end + +-- For old times sake: + +collectors.dowithwords = collectors.test + +-- This is only used in old articles ... will move to a module: + +local create = newtoken and newtoken.create or token.create + +tokens.vbox = create("vbox") +tokens.hbox = create("hbox") +tokens.vtop = create("vtop") +tokens.bgroup = create(utfbyte("{"),1) +tokens.egroup = create(utfbyte("}"),2) + +tokens.letter = function(chr) return create(utfbyte(chr),11) end +tokens.other = function(chr) return create(utfbyte(chr),12) end + +tokens.letters = function(str) + local t, n = { }, 0 + for chr in utfvalues(str) do + n = n + 1 + t[n] = create(chr, 11) + end + return t +end + +function collectors.defaultwords(t,str) + if t then + local n = #t + n = n + 1 ; t[n] = tokens.bgroup + n = n + 1 ; t[n] = create("red") + for i=1,#str do + n = n + 1 ; t[n] = tokens.other('*') + end + n = n + 1 ; t[n] = tokens.egroup + end +end diff --git a/Master/texmf-dist/tex/context/base/toks-tra.mkiv b/Master/texmf-dist/tex/context/base/toks-tra.mkiv new file mode 100644 index 00000000000..a3e27eaf89f --- /dev/null +++ b/Master/texmf-dist/tex/context/base/toks-tra.mkiv @@ -0,0 +1,31 @@ +%D \module +%D [ file=toks-tra, % was toks-ini +%D version=2007.03.03, +%D title=\CONTEXT\ Token Support, +%D subtitle=Initialization, +%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. + +\writestatus{loading}{ConTeXt Token Support / Tracing} + +\registerctxluafile{toks-tra}{1.001} + +\unprotect + +%D Handy for manuals \unknown\ but not really used in practice, so it might +%D become a runtime loaded module instead. + +\unexpanded\def\starttokens [#1]{\ctxcommand{collecttokens("#1","stoptokens")}} + \let\stoptokens \relax + \def\flushtokens [#1]{\ctxcommand{flushtokens("#1")}} + \def\showtokens [#1]{\ctxcommand{showtokens("#1")}} + \def\testtokens [#1]{\ctxcommand{testtokens("#1")}} + \def\registertoken #1{\ctxcommand{registertoken("#1")}} + + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/trac-ctx.lua b/Master/texmf-dist/tex/context/base/trac-ctx.lua index 706e7a2447a..493ce793686 100644 --- a/Master/texmf-dist/tex/context/base/trac-ctx.lua +++ b/Master/texmf-dist/tex/context/base/trac-ctx.lua @@ -6,15 +6,15 @@ if not modules then modules = { } end modules ['trac-ctx'] = { license = "see context related readme files" } -local commands = commands -local context = context -local register = trackers.register +local context = context +local implement = interfaces.implement +local register = trackers.register local textrackers = tex.trackers or { } local texdirectives = tex.directives or { } -tex.trackers = textrackers -tex.directives = texdirectives +tex.trackers = textrackers +tex.directives = texdirectives storage.register("tex/trackers", textrackers, "tex.trackers") storage.register("tex/directives",texdirectives,"tex.directives") @@ -39,10 +39,32 @@ local function install(category,register,tag,enable,disable) register(tag, function(v) doit(category,tag,v) end) -- todo: v,tag in caller end -function commands.initializetextrackers () initialize(textrackers ,trackers .register ) end -function commands.initializetexdirectives() initialize(texdirectives,directives.register) end +implement { + name = "initializetextrackers", + actions = function() + initialize(textrackers,trackers.register) + end +} --- commands.install(tag,enable,disable): +implement { + name = "initializetexdirectives", + actions = function() + initialize(texdirectives,directives.register) + end +} -function commands.installtextracker (...) install(textrackers ,trackers .register,...) end -function commands.installtexdirective(...) install(texdirectives,directives.register,...) end +implement { + name = "installtextracker", + actions = function(tag,enable,disable) + install(textrackers,trackers.register,tag,enable,disable) + end, + arguments = { "string", "string", "string" } +} + +implement { + name = "installtexdirective", + actions = function(tag,enable,disable) + install(texdirectives,directives.register,tag,enable,disable) + end, + arguments = { "string", "string", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/trac-ctx.mkiv b/Master/texmf-dist/tex/context/base/trac-ctx.mkiv index 3eb53713cb3..4240281a6fb 100644 --- a/Master/texmf-dist/tex/context/base/trac-ctx.mkiv +++ b/Master/texmf-dist/tex/context/base/trac-ctx.mkiv @@ -18,14 +18,14 @@ \unprotect \unexpanded\def\installtextracker#1#2#3% - {\ctxcommand{installtextracker("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}} + {\clf_installtextracker{#1}{\detokenize{#2}}{\detokenize{#3}}} \unexpanded\def\installtexdirective#1#2#3% - {\ctxcommand{installtexdirective("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}} + {\clf_installtexdirective{#1}{\detokenize{#2}}{\detokenize{#3}}} \appendtoks - \ctxcommand{initializetextrackers ()}% - \ctxcommand{initializetexdirectives()}% + \clf_initializetextrackers + \clf_initializetexdirectives \to \everyjob \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/trac-deb.lua b/Master/texmf-dist/tex/context/base/trac-deb.lua index d52399bcf1f..d998295c13c 100644 --- a/Master/texmf-dist/tex/context/base/trac-deb.lua +++ b/Master/texmf-dist/tex/context/base/trac-deb.lua @@ -32,6 +32,8 @@ local texgetdimen = tex.getdimen local texgettoks = tex.gettoks local texgetcount = tex.getcount +local implement = interfaces.implement + strings.undefined = "undefined" lists.scratch = { @@ -304,3 +306,20 @@ local function trace_calls(n) end directives.register("system.tracecalls", function(n) trace_calls(n) end) -- indirect is needed for nilling + +implement { name = "showtrackers", actions = trackers.show } +implement { name = "enabletrackers", actions = trackers.enable, arguments = "string" } +implement { name = "disabletrackers", actions = trackers.disable, arguments = "string" } +implement { name = "resettrackers", actions = trackers.reset } + +implement { name = "showdirectives", actions = directives.show } +implement { name = "enabledirectives", actions = directives.enable, arguments = "string" } +implement { name = "disabledirectives", actions = directives.disable, arguments = "string" } + +implement { name = "showexperiments", actions = experiments.show } +implement { name = "enableexperiments", actions = experiments.enable, arguments = "string" } +implement { name = "disableexperiments", actions = experiments.disable, arguments = "string" } + +implement { name = "showdebuginfo", actions = lmx.showdebuginfo } +implement { name = "overloaderror", actions = lmx.overloaderror } +implement { name = "showlogcategories", actions = logs.show } diff --git a/Master/texmf-dist/tex/context/base/trac-deb.mkiv b/Master/texmf-dist/tex/context/base/trac-deb.mkiv index fe5dd02dc4a..1e61a351261 100644 --- a/Master/texmf-dist/tex/context/base/trac-deb.mkiv +++ b/Master/texmf-dist/tex/context/base/trac-deb.mkiv @@ -13,25 +13,31 @@ \writestatus{loading}{ConTeXt Tracing Macros / Debugger} +\unprotect + %registerctxluafile{trac-lmx}{1.001} \registerctxluafile{trac-deb}{1.001} -\unexpanded\def\breakpoint{\showdebuginfo\wait} +\unexpanded\def\breakpoint {\showdebuginfo\wait} + +\unexpanded\def\showtrackers {\clf_showtrackers} +\unexpanded\def\enabletrackers [#1]{\clf_enabletrackers{#1}} +\unexpanded\def\disabletrackers [#1]{\clf_disabletrackers{#1}} +\unexpanded\def\resettrackers {\clf_resettrackers} + +\unexpanded\def\showdirectives {\clf_showdirectives} +\unexpanded\def\enabledirectives [#1]{\clf_enabledirectives{#1}} +\unexpanded\def\disabledirectives [#1]{\clf_disabledirectives{#1}} -\unexpanded\def\showtrackers {\ctxlua{trackers.show()}} -\unexpanded\def\enabletrackers [#1]{\ctxlua{trackers.enable("#1")}} -\unexpanded\def\disabletrackers [#1]{\ctxlua{trackers.disable("#1")}} -\unexpanded\def\resettrackers {\ctxlua{trackers.reset()}} +\unexpanded\def\showexperiments {\clf_showexperiments} +\unexpanded\def\enableexperiments [#1]{\clf_enableexperiments{#1}} +\unexpanded\def\disableexperiments[#1]{\clf_disableexperiments{#1}} -\unexpanded\def\showdirectives {\ctxlua{directives.show()}} -\unexpanded\def\enabledirectives [#1]{\ctxlua{directives.enable("#1")}} -\unexpanded\def\disabledirectives [#1]{\ctxlua{directives.disable("#1")}} +\unexpanded\def\showdebuginfo {\clf_showdebuginfo} +\unexpanded\def\overloaderror {\clf_overloaderror} -\unexpanded\def\showexperiments {\ctxlua{experiments.show()}} -\unexpanded\def\enableexperiments [#1]{\ctxlua{experiments.enable("#1")}} -\unexpanded\def\disableexperiments[#1]{\ctxlua{experiments.disable("#1")}} +\unexpanded\def\showlogcategories {\clf_showlogcategories} -\unexpanded\def\showdebuginfo {\ctxlua{lmx.showdebuginfo()}} -\unexpanded\def\overloaderror {\ctxlua{lmx.overloaderror()}} % \enabledirectives[system.showerror] +% \enabledirectives[system.showerror] -\unexpanded\def\showlogcategories {\ctxlua{logs.show()}} +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/trac-inf.lua b/Master/texmf-dist/tex/context/base/trac-inf.lua index 034726ffcdd..5497e54eb70 100644 --- a/Master/texmf-dist/tex/context/base/trac-inf.lua +++ b/Master/texmf-dist/tex/context/base/trac-inf.lua @@ -207,17 +207,3 @@ function statistics.tracefunction(base,tag,...) statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end) end end - --- where, not really the best spot for this: - -commands = commands or { } - -function commands.resettimer(name) - resettiming(name or "whatever") - starttiming(name or "whatever") -end - -function commands.elapsedtime(name) - stoptiming(name or "whatever") - context(elapsedtime(name or "whatever")) -end diff --git a/Master/texmf-dist/tex/context/base/trac-jus.lua b/Master/texmf-dist/tex/context/base/trac-jus.lua index 00c871159ad..0c92848dcec 100644 --- a/Master/texmf-dist/tex/context/base/trac-jus.lua +++ b/Master/texmf-dist/tex/context/base/trac-jus.lua @@ -62,9 +62,10 @@ end checkers.set = set checkers.reset = reset -function commands.showjustification(n) - set(n) -end +interfaces.implement { + name = "showjustification", + actions = set +} trackers.register("visualizers.justification", function(v) if v then @@ -77,7 +78,7 @@ end) function checkers.handler(head) for current in traverse_id(hlist_code,tonut(head)) do if getattr(current,a_justification) == 1 then - setattr(current,a_justification,0) + setattr(current,a_justification,0) -- kind of reset local width = getfield(current,"width") if width > 0 then local list = getlist(current) diff --git a/Master/texmf-dist/tex/context/base/trac-jus.mkiv b/Master/texmf-dist/tex/context/base/trac-jus.mkiv index 7a5347da844..d0823d31196 100644 --- a/Master/texmf-dist/tex/context/base/trac-jus.mkiv +++ b/Master/texmf-dist/tex/context/base/trac-jus.mkiv @@ -20,6 +20,6 @@ \definesystemattribute[justification] [public] \unexpanded\def\showjustification - {\ctxcommand{showjustification()}} + {\clf_showjustification} % currently no argument (default 1) \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/trac-lmx.lua b/Master/texmf-dist/tex/context/base/trac-lmx.lua index 41d9305361a..4f4ea62c489 100644 --- a/Master/texmf-dist/tex/context/base/trac-lmx.lua +++ b/Master/texmf-dist/tex/context/base/trac-lmx.lua @@ -530,7 +530,7 @@ do_nested_include = function(data) -- also used in include return lpegmatch(pattern_1,data) end -function lmxnew(data,defaults,nocache,path) -- todo: use defaults in calling routines +local function lmxnew(data,defaults,nocache,path) -- todo: use defaults in calling routines data = data or "" local known = cache[data] if not known then @@ -608,7 +608,7 @@ function lmx.convertfile(templatefile,variables,nocache) return lmxresult(converter,variables) end -function lmxconvert(templatefile,resultfile,variables,nocache) -- or (templatefile,variables) +local function lmxconvert(templatefile,resultfile,variables,nocache) -- or (templatefile,variables) if trace_variables then -- will become templates report_lmx("converting file %a",templatefile) end @@ -665,14 +665,13 @@ function lmx.color(r,g,b,a) end end - -- these can be overloaded lmx.lmxfile = string.itself lmx.htmfile = string.itself lmx.popupfile = os.launch -function lmxmake(name,variables) +local function lmxmake(name,variables) local lmxfile = lmx.lmxfile(name) local htmfile = lmx.htmfile(name) if lmxfile == htmfile then @@ -682,7 +681,7 @@ function lmxmake(name,variables) return htmfile end -lmxmake = lmx.make +lmx.make = lmxmake function lmx.show(name,variables) local htmfile = lmxmake(name,variables) diff --git a/Master/texmf-dist/tex/context/base/trac-log.lua b/Master/texmf-dist/tex/context/base/trac-log.lua index 72f271d9c3c..ce620e6cf0c 100644 --- a/Master/texmf-dist/tex/context/base/trac-log.lua +++ b/Master/texmf-dist/tex/context/base/trac-log.lua @@ -9,76 +9,28 @@ if not modules then modules = { } end modules ['trac-log'] = { -- In fact all writes could go through lua and we could write the console and -- terminal handler in lua then. Ok, maybe it's slower then, so a no-go. --- if tex and (tex.jobname or tex.formatname) then --- --- -- quick hack, awaiting speedup in engine (8 -> 6.4 sec for --make with console2) --- -- still needed for luajittex --- --- local texio_write_nl = texio.write_nl --- local texio_write = texio.write --- local io_write = io.write --- --- local write_nl = function(target,...) --- if not io_write then --- io_write = io.write --- end --- if target == "term and log" then --- texio_write_nl("log",...) --- texio_write_nl("term","") --- io_write(...) --- elseif target == "log" then --- texio_write_nl("log",...) --- elseif target == "term" then --- texio_write_nl("term","") --- io_write(...) --- else --- texio_write_nl("log",target,...) --- texio_write_nl("term","") --- io_write(target,...) --- end --- end --- --- local write = function(target,...) --- if not io_write then --- io_write = io.write --- end --- if target == "term and log" then --- texio_write("log",...) --- io_write(...) --- elseif target == "log" then --- texio_write("log",...) --- elseif target == "term" then --- io_write(...) --- else --- texio_write("log",target,...) --- io_write(target,...) --- end --- end --- --- texio.write = write --- texio.write_nl = write_nl --- --- else --- --- -- texlua or just lua --- --- end - --- todo: less categories, more subcategories (e.g. nodes) --- todo: split into basics and ctx specific - +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 -local next, type, select = next, type, select local utfchar = utf.char +local datetime = os.date +local openfile = io.open local setmetatableindex = table.setmetatableindex local formatters = string.formatters local texgetcount = tex and tex.getcount +-- variant is set now + +local variant = "default" +-- local variant = "ansi" + +-- todo: less categories, more subcategories (e.g. nodes) +-- todo: split into basics and ctx specific + --[[ldx--

This is a prelude to a more extensive logging module. We no longer provide based logging as parsing is relatively easy anyway.

@@ -112,12 +64,12 @@ wiki : http://contextgarden.net -- [[local chruni = utilities.strings.chruni]] -- ) -utilities.strings.formatters.add ( +formatters.add ( formatters, "unichr", [["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]] ) -utilities.strings.formatters.add ( +formatters.add ( formatters, "chruni", [[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]] ) @@ -150,20 +102,127 @@ setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end) local report, subreport, status, settarget, setformats, settranslations -local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog, setprocessor, setformatters +local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog, setprocessor, setformatters, newline + +-- we use formatters but best check for % then because for simple messages but +-- 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 - -- local format = string.formatter + local function useluawrites() - local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper + -- quick hack, awaiting speedup in engine (8 -> 6.4 sec for --make with console2) + -- still needed for luajittex .. luatex should not have that ^^ mess - local target = "term and log" + local texio_write_nl = texio.write_nl + local texio_write = texio.write + local io_write = io.write - logs.flush = io.flush + write_nl = function(target,...) + if not io_write then + io_write = io.write + end + if target == "term and log" then + texio_write_nl("log",...) + texio_write_nl("term","") + io_write(...) + elseif target == "log" then + texio_write_nl("log",...) + elseif target == "term" then + texio_write_nl("term","") + io_write(...) + elseif target ~= "none" then + texio_write_nl("log",target,...) + texio_write_nl("term","") + io_write(target,...) + end + end + + write = function(target,...) + if not io_write then + io_write = io.write + end + if target == "term and log" then + texio_write("log",...) + io_write(...) + elseif target == "log" then + texio_write("log",...) + elseif target == "term" then + io_write(...) + elseif target ~= "none" then + texio_write("log",target,...) + io_write(target,...) + end + end - local formats = { } setmetatable(formats, valueiskey) - local translations = { } setmetatable(translations,valueiskey) + texio.write = write + texio.write_nl = write_nl + + useluawrites = ignore + + end + + -- local format = string.formatter + + local whereto = "both" + local target = nil + local targets = nil + + local formats = table.setmetatableindex("self") + local translations = table.setmetatableindex("self") + + local report_yes, subreport_yes, direct_yes, subdirect_yes, status_yes + local report_nop, subreport_nop, direct_nop, subdirect_nop, status_nop + + local variants = { + default = { + formats = { + report_yes = formatters["%-15s > %s\n"], + report_nop = formatters["%-15s >\n"], + direct_yes = formatters["%-15s > %s"], + direct_nop = formatters["%-15s >"], + subreport_yes = formatters["%-15s > %s > %s\n"], + subreport_nop = formatters["%-15s > %s >\n"], + subdirect_yes = formatters["%-15s > %s > %s"], + subdirect_nop = formatters["%-15s > %s >"], + status_yes = formatters["%-15s : %s\n"], + status_nop = formatters["%-15s :\n"], + }, + targets = { + logfile = "log", + log = "log", + file = "log", + console = "term", + terminal = "term", + both = "term and log", + }, + }, + ansi = { + formats = { + report_yes = formatters["%-15s > %s\n"], + report_nop = formatters["%-15s >\n"], + direct_yes = formatters["%-15s > %s"], + direct_nop = formatters["%-15s >"], + subreport_yes = formatters["%-15s > %s > %s\n"], + subreport_nop = formatters["%-15s > %s >\n"], + subdirect_yes = formatters["%-15s > %s > %s"], + subdirect_nop = formatters["%-15s > %s >"], + status_yes = formatters["%-15s : %s\n"], + status_nop = formatters["%-15s :\n"], + }, + targets = { + logfile = "none", + log = "none", + file = "none", + console = "term", + terminal = "term", + both = "term", + }, + } + } + + logs.flush = io.flush writer = function(...) write_nl(target,...) @@ -173,13 +232,6 @@ if tex and (tex.jobname or tex.formatname) then write_nl(target,"\n") end - local report_yes = formatters["%-15s > %s\n"] - local report_nop = formatters["%-15s >\n"] - - -- we can use formatters but best check for % then because for simple messages - -- we con't want this overhead for single messages (not that there are that - -- many; we could have a special weak table) - report = function(a,b,c,...) if c then write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...))) @@ -192,9 +244,6 @@ if tex and (tex.jobname or tex.formatname) then end end - local direct_yes = formatters["%-15s > %s"] - local direct_nop = formatters["%-15s >"] - direct = function(a,b,c,...) if c then return direct_yes(translations[a],formatters[formats[b]](c,...)) @@ -207,9 +256,6 @@ if tex and (tex.jobname or tex.formatname) then end end - local subreport_yes = formatters["%-15s > %s > %s\n"] - local subreport_nop = formatters["%-15s > %s >\n"] - subreport = function(a,s,b,c,...) if c then write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...))) @@ -222,9 +268,6 @@ if tex and (tex.jobname or tex.formatname) then end end - local subdirect_yes = formatters["%-15s > %s > %s"] - local subdirect_nop = formatters["%-15s > %s >"] - subdirect = function(a,s,b,c,...) if c then return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...)) @@ -237,9 +280,6 @@ if tex and (tex.jobname or tex.formatname) then end end - local status_yes = formatters["%-15s : %s\n"] - local status_nop = formatters["%-15s :\n"] - status = function(a,b,c,...) if c then write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...))) @@ -252,17 +292,13 @@ if tex and (tex.jobname or tex.formatname) then end end - local targets = { - logfile = "log", - log = "log", - file = "log", - console = "term", - terminal = "term", - both = "term and log", - } - - settarget = function(whereto) - target = targets[whereto or "both"] or targets.both + settarget = function(askedwhereto) + whereto = askedwhereto or whereto or "both" + target = targets[whereto] + if not target then + whereto = "both" + target = targets[whereto] + end if target == "term" or target == "term and log" then logs.flush = io.flush else @@ -298,24 +334,81 @@ if tex and (tex.jobname or tex.formatname) then end end - setformatters = function(f) - report_yes = f.report_yes or report_yes - report_nop = f.report_nop or report_nop - subreport_yes = f.subreport_yes or subreport_yes - subreport_nop = f.subreport_nop or subreport_nop - direct_yes = f.direct_yes or direct_yes - direct_nop = f.direct_nop or direct_nop - subdirect_yes = f.subdirect_yes or subdirect_yes - subdirect_nop = f.subdirect_nop or subdirect_nop - status_yes = f.status_yes or status_yes - status_nop = f.status_nop or status_nop + setformatters = function(specification) + local t = nil + local f = nil + local d = variants.default + if not specification then + -- + elseif type(specification) == "table" then + t = specification.targets + f = specification.formats or specification + else + local v = variants[specification] + if v then + t = v.targets + f = v.formats + variant = specification + end + end + targets = t or d.targets + target = targets[whereto] or target + if f then + d = d.formats + else + f = d.formats + d = f + end + setmetatableindex(f,d) + report_yes = f.report_yes + report_nop = f.report_nop + subreport_yes = f.subreport_yes + subreport_nop = f.subreport_nop + direct_yes = f.direct_yes + direct_nop = f.direct_nop + subdirect_yes = f.subdirect_yes + subdirect_nop = f.subdirect_nop + status_yes = f.status_yes + status_nop = f.status_nop + if variant == "ansi" then + useluawrites() -- because tex escapes ^^ + end + settarget(whereto) end + setformatters(variant) + setlogfile = ignore settimedlog = ignore else + local report_yes, subreport_yes, status_yes + local report_nop, subreport_nop, status_nop + + local variants = { + default = { + formats = { + report_yes = formatters["%-15s | %s"], + report_nop = formatters["%-15s |"], + subreport_yes = formatters["%-15s | %s | %s"], + subreport_nop = formatters["%-15s | %s |"], + status_yes = formatters["%-15s : %s\n"], + status_nop = formatters["%-15s :\n"], + }, + }, + ansi = { + formats = { + report_yes = formatters["%-15s | %s"], + report_nop = formatters["%-15s |"], + subreport_yes = formatters["%-15s | %s | %s"], + subreport_nop = formatters["%-15s | %s |"], + status_yes = formatters["%-15s : %s\n"], + status_nop = formatters["%-15s :\n"], + }, + }, + } + logs.flush = ignore writer = function(s) @@ -326,9 +419,6 @@ else write_nl("\n") end - local report_yes = formatters["%-15s | %s"] - local report_nop = formatters["%-15s |"] - report = function(a,b,c,...) if c then write_nl(report_yes(a,formatters[b](c,...))) @@ -341,9 +431,6 @@ else end end - local subreport_yes = formatters["%-15s | %s | %s"] - local subreport_nop = formatters["%-15s | %s |"] - subreport = function(a,sub,b,c,...) if c then write_nl(subreport_yes(a,sub,formatters[b](c,...))) @@ -356,9 +443,6 @@ else end end - local status_yes = formatters["%-15s : %s\n"] - local status_nop = formatters["%-15s :\n"] - status = function(a,b,c,...) -- not to be used in lua anyway if c then write_nl(status_yes(a,formatters[b](c,...))) @@ -387,15 +471,36 @@ else end end - setformatters = function(f) - report_yes = f.report_yes or report_yes - report_nop = f.report_nop or report_nop - subreport_yes = f.subreport_yes or subreport_yes - subreport_nop = f.subreport_nop or subreport_nop - status_yes = f.status_yes or status_yes - status_nop = f.status_nop or status_nop + setformatters = function(specification) + local f = nil + local d = variants.default + if specification then + if type(specification) == "table" then + f = specification.formats or specification + else + local v = variants[specification] + if v then + f = v.formats + end + end + end + if f then + d = d.formats + else + f = d.formats + d = f + end + setmetatableindex(f,d) + report_yes = f.report_yes + report_nop = f.report_nop + subreport_yes = f.subreport_yes + subreport_nop = f.subreport_nop + status_yes = f.status_yes + status_nop = f.status_nop end + setformatters(variant) + setlogfile = function(name,keepopen) if name and name ~= "" then local localtime = os.localtime @@ -726,13 +831,13 @@ logs.simpleline = simple -- obsolete -function logs.setprogram () end -- obsolete -function logs.extendbanner() end -- obsolete -function logs.reportlines () end -- obsolete -function logs.reportbanner() end -- obsolete -function logs.reportline () end -- obsolete -function logs.simplelines () end -- obsolete -function logs.help () end -- obsolete +logs.setprogram = ignore -- obsolete +logs.extendbanner = ignore -- obsolete +logs.reportlines = ignore -- obsolete +logs.reportbanner = ignore -- obsolete +logs.reportline = ignore -- obsolete +logs.simplelines = ignore -- obsolete +logs.help = ignore -- obsolete -- applications @@ -845,10 +950,12 @@ end -- logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123") -- end -function logs.system(whereto,process,jobname,category,...) - local message = formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)) +local f_syslog = formatters["%s %s => %s => %s => %s\r"] + +function logs.system(whereto,process,jobname,category,fmt,arg,...) + local message = f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg == nil and fmt or format(fmt,arg,...)) for i=1,10 do - local f = io.open(whereto,"a") -- we can consider keeping the file open + local f = openfile(whereto,"a") -- we can consider keeping the file open if f then f:write(message) f:close() diff --git a/Master/texmf-dist/tex/context/base/trac-set.lua b/Master/texmf-dist/tex/context/base/trac-set.lua index 95fdc43b30f..9e2bf87589a 100644 --- a/Master/texmf-dist/tex/context/base/trac-set.lua +++ b/Master/texmf-dist/tex/context/base/trac-set.lua @@ -37,7 +37,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti local data = setter.data if data then for key, newvalue in next, values do - local newvalue = is_boolean(newvalue,newvalue) + local newvalue = is_boolean(newvalue,newvalue,true) -- strict local functions = data[key] if functions then local oldvalue = functions.value @@ -97,7 +97,7 @@ local function set(t,what,newvalue) elseif not value then value = false -- catch nil else - value = is_boolean(value,value) + value = is_boolean(value,value,true) -- strict end w = topattern(w,true,true) for name, functions in next, data do @@ -258,6 +258,7 @@ function setters.new(name) -- we could use foo:bar syntax (but not used that oft report = function(...) setters.report (setter,...) end, enable = function(...) enable (setter,...) end, disable = function(...) disable (setter,...) end, + reset = function(...) reset (setter,...) end, -- can be dangerous register = function(...) register(setter,...) end, list = function(...) list (setter,...) end, show = function(...) show (setter,...) end, diff --git a/Master/texmf-dist/tex/context/base/trac-tex.lua b/Master/texmf-dist/tex/context/base/trac-tex.lua index 7e340607313..5fe4754cbde 100644 --- a/Master/texmf-dist/tex/context/base/trac-tex.lua +++ b/Master/texmf-dist/tex/context/base/trac-tex.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['trac-tex'] = { -- moved from trac-deb.lua -local format = string.format +local next = next local texhashtokens = tex.hashtokens @@ -20,23 +20,70 @@ function trackers.savehash() saved = texhashtokens() end -function trackers.dumphashtofile(filename,delta) - local list, hash, command_name = { }, texhashtokens(), token.command_name - for name, token in next, hash do - if not delta or not saved[name] then - -- token: cmd, chr, csid -- combination cmd,chr determines name - local category = command_name(token) - local dk = list[category] - if not dk then - -- a bit funny names but this sorts better (easier to study) - dk = { names = { }, found = 0, code = token[1] } - list[category] = dk +if newtoken then + + function trackers.dumphashtofile(filename,delta) + local list = { } + local hash = tex.hashtokens() + local create = newtoken.create + for name, token in next, hash do + if not delta or not saved[name] then + if token[2] ~= 0 then -- still old interface + local token = create(name) + -- inspect(token) + local category = token.cmdname + local dk = list[category] + if not dk then + dk = { + names = { }, + found = 0, + -- code = token[1], + } + list[category] = dk + end + if token.protected then + if token.expandable then + dk.names[name] = "ep" + else + dk.names[name] = "-p" + end + else + if token.expandable then + dk.names[name] = "ep" + else + dk.names[name] = "--" + end + end + dk.found = dk.found + 1 + end end - dk.names[name] = { token[2], token[3] } - dk.found = dk.found + 1 end + table.save(filename or tex.jobname .. "-hash.log",list) end - io.savedata(filename or tex.jobname .. "-hash.log",table.serialize(list,true)) + +else + + function trackers.dumphashtofile(filename,delta) + local list = { } + local hash = texhashtokens() + local getname = token.command_name + for name, token in next, hash do + if not delta or not saved[name] then + -- token: cmd, chr, csid -- combination cmd,chr determines name + local category = getname(token) + local dk = list[category] + if not dk then + -- a bit funny names but this sorts better (easier to study) + dk = { names = { }, found = 0, code = token[1] } + list[category] = dk + end + dk.names[name] = { token[2], token[3] } + dk.found = dk.found + 1 + end + end + table.save(filename or tex.jobname .. "-hash.log",list) + end + end local delta = nil diff --git a/Master/texmf-dist/tex/context/base/trac-vis.lua b/Master/texmf-dist/tex/context/base/trac-vis.lua index eb5373ee350..86af6da0bdc 100644 --- a/Master/texmf-dist/tex/context/base/trac-vis.lua +++ b/Master/texmf-dist/tex/context/base/trac-vis.lua @@ -190,7 +190,7 @@ end local function enable() if not usedfont then - -- we use a narrow monospaced font + -- we use a narrow monospaced font -- infofont ? visualizers.setfont(fonts.definers.define { name = "lmmonoltcond10regular", size = tex.sp("4pt") }) end for mode, value in next, modes do @@ -280,13 +280,6 @@ function visualizers.setlayer(n) texsetattribute(a_layer,layers[n] or unsetvalue) end -commands.setvisual = visualizers.setvisual -commands.setlayer = visualizers.setlayer - -function commands.visual(n) - context(setvisual(n)) -end - local function set(mode,v) texsetattribute(a_visual,setvisual(mode,texgetattribute(a_visual),v)) end @@ -322,7 +315,7 @@ local c_glyph_d = "trace:do" local c_white_d = "trace:dw" local c_math_d = "trace:dr" -local function sometext(str,layer,color,textcolor) -- we can just paste verbatim together .. no typesteting needed +local function sometext(str,layer,color,textcolor,lap) -- we can just paste verbatim together .. no typesteting needed local text = fast_hpack_string(str,usedfont) local size = getfield(text,"width") local rule = new_rule(size,2*exheight,exheight/2) @@ -336,10 +329,13 @@ local function sometext(str,layer,color,textcolor) -- we can just paste verbatim local info = linked_nodes(rule,kern,text) setlisttransparency(info,c_zero) info = fast_hpack(info) + local width = getfield(info,"width") + if lap then + info = fast_hpack(linked_nodes(new_kern(-width),info)) + end if layer then setattr(info,a_layer,layer) end - local width = getfield(info,"width") setfield(info,"width",0) setfield(info,"height",0) setfield(info,"depth",0) @@ -580,7 +576,8 @@ local function ruledglyph(head,current,previous) setfield(current,"prev",nil) local linewidth = emwidth/20 local baseline - if dp ~= 0 and ht ~= 0 then + -- if dp ~= 0 and ht ~= 0 then + if (dp >= 0 and ht >= 0) or (dp <= 0 and ht <= 0) then baseline = new_rule(wd-2*linewidth,linewidth,0) end local doublelinewidth = 2*linewidth @@ -740,7 +737,7 @@ local function ruledpenalty(head,current,vertical) return head, getnext(current) end -local function visualize(head,vertical) +local function visualize(head,vertical,forced) local trace_hbox = false local trace_vbox = false local trace_vtop = false @@ -760,7 +757,7 @@ local function visualize(head,vertical) local prev_trace_fontkern = nil while current do local id = getid(current) - local a = getattr(current,a_visual) or unsetvalue + local a = forced or getattr(current,a_visual) or unsetvalue if a ~= attr then prev_trace_fontkern = trace_fontkern if a == unsetvalue then @@ -801,19 +798,17 @@ local function visualize(head,vertical) head, current = ruledglyph(head,current,previous) end elseif id == disc_code then - if trace_glyph then - local pre = getfield(current,"pre") - if pre then - setfield(current,"pre",ruledglyph(pre,pre)) - end - local post = getfield(current,"post") - if post then - setfield(current,"post",ruledglyph(post,post)) - end - local replace = getfield(current,"replace") - if replace then - setfield(current,"replace",ruledglyph(replace,replace)) - end + local pre = getfield(current,"pre") + if pre then + setfield(current,"pre",visualize(pre,false,a)) + end + local post = getfield(current,"post") + if post then + setfield(current,"post",visualize(post,false,a)) + end + local replace = getfield(current,"replace") + if replace then + setfield(current,"replace",visualize(replace,false,a)) end elseif id == kern_code then local subtype = getsubtype(current) @@ -822,7 +817,7 @@ local function visualize(head,vertical) if trace_fontkern or prev_trace_fontkern then head, current = fontkern(head,current) end - elseif subtype == user_kern_code then + else -- if subtype == user_kern_code then if trace_kern then head, current = ruledkern(head,current,vertical) end @@ -838,10 +833,6 @@ local function visualize(head,vertical) if trace_penalty then head, current = ruledpenalty(head,current,vertical) end - elseif id == disc_code then - setfield(current,"pre",visualize(getfield(current,"pre"))) - setfield(current,"post",isualize(getfield(current,"post"))) - setfield(current,"replace",visualize(getfield(current,"replace"))) elseif id == hlist_code then local content = getlist(current) if content then @@ -967,10 +958,6 @@ function visualizers.markfonts(list) markfonts(type(n) == "number" and getlist(getbox(n)) or n) end -function commands.markfonts(n) - visualizers.markfonts(n) -end - luatex.registerstopactions(cleanup) statistics.register("visualization time",function() @@ -979,3 +966,14 @@ statistics.register("visualization time",function() return format("%s seconds",statistics.elapsedtime(visualizers)) end end) + +-- interface + +local implement = interfaces.implement + +implement { name = "setvisual", arguments = "string", actions = visualizers.setvisual } +implement { name = "getvisual", arguments = "string", actions = { setvisual, context } } +implement { name = "setvisuallayer", arguments = "string", actions = visualizers.setlayer } +implement { name = "markvisualfonts", arguments = "integer", actions = visualizers.markfonts } +implement { name = "setvisualfont", arguments = "integer", actions = visualizers.setfont } + diff --git a/Master/texmf-dist/tex/context/base/trac-vis.mkiv b/Master/texmf-dist/tex/context/base/trac-vis.mkiv index 7517037ea46..a227e83544e 100644 --- a/Master/texmf-dist/tex/context/base/trac-vis.mkiv +++ b/Master/texmf-dist/tex/context/base/trac-vis.mkiv @@ -54,10 +54,10 @@ \let\syst_visualizers_vbox\vbox \let\syst_visualizers_vtop\vtop -\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \ctxcommand{visual("simplehbox")} } -\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \ctxcommand{visual("simplevbox")} } -\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("simplevtop")} } % special case -\unexpanded\def\ruledtopv{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("vtop")} } +\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \clf_getvisual{simplehbox} } +\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \clf_getvisual{simplevbox} } +\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \clf_getvisual{simplevtop} } % special case +\unexpanded\def\ruledtopv{\syst_visualizers_vtop attr \visualattribute \clf_getvisual{vtop} } \unexpanded\def\ruledmbox#1{\ruledhbox{\startimath#1\stopimath}} @@ -87,29 +87,29 @@ \unexpanded\def\syst_visualizers_makeup[#1]% {\iffirstargument - \ctxcommand{setvisual("#1")}% + \clf_setvisual{#1}% \else - \ctxcommand{setvisual("makeup")}% + \clf_setvisual{makeup}% \let\normalvtop\ruledtopv \let\vtop \ruledtopv \fi} \unexpanded\def\showallmakeup - {\ctxcommand{setvisual("all")}% + {\clf_setvisual{all}% \let\normalvtop\ruledtopv \let\vtop \ruledtopv \showstruts} \unexpanded\def\showboxes - {\ctxcommand{setvisual("boxes")}% + {\clf_setvisual{boxes}% \let\normalvtop\ruledtopv \let\vtop \ruledtopv} \unexpanded\def\showglyphs - {\ctxcommand{setvisual("glyph")}} + {\clf_setvisual{glyph}} \unexpanded\def\showfontkerns - {\ctxcommand{setvisual("fontkern")}} + {\clf_setvisual{fontkern}} \unexpanded\def\setvisualizerfont {\dosingleempty\syst_visualizers_setfont} @@ -117,7 +117,7 @@ \def\syst_visualizers_setfont[#1]% somename at 4pt {\begingroup \doifelsenothing{#1}{\definedfont[Mono at 4pt]}{\definedfont[#1]}% - \ctxlua{nodes.visualizers.setfont()}% + \clf_setvisualfont\fontid\font \endgroup} %D New (these might also be a visualizers): @@ -148,14 +148,14 @@ %D Overload: % \def\spac_struts_vide_hbox -% {\hbox attr \visualattribute \ctxcommand{visual("strut")} } +% {\hbox attr \visualattribute \clf_getvisual{strut} } % % \def\spac_struts_vide_hbox -% {\xdef\spac_struts_vide_hbox{\hbox attr \visualattribute \ctxcommand{visual("strut")} }% +% {\xdef\spac_struts_vide_hbox{\hbox attr \visualattribute \clf_getvisual{strut} }% % \spac_struts_vide_hbox} \unexpanded\def\spac_struts_vide_hbox - {\hbox attr \visualattribute \ctxcommand{visual("strut")} } + {\hbox attr \visualattribute \clf_getvisual{strut} } \appendtoks \normalexpanded{\unexpanded\xdef\spac_struts_vide_hbox\expandafter{\spac_struts_vide_hbox}}% @@ -167,7 +167,7 @@ {\dontleavehmode \begingroup \setbox\scratchbox\hbox{\getbuffer}% - \ctxcommand{markfonts(\number\scratchbox)}% + \clf_markvisualfonts\scratchbox \unhbox\scratchbox \endgroup} diff --git a/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv b/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv index de1f7752cc9..41cf1f701e3 100644 --- a/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv +++ b/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv @@ -15,33 +15,6 @@ \starttypescriptcollection[dejavu] - \starttypescript [\s!mono] [dejavu-condensed] [\s!name] - \setups[\s!font:\s!fallback:\s!mono] - % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none] - \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono] - \stoptypescript - - % \starttypescript [\s!mono] [dejavu-condensed] [\s!name] - % \setups[\s!font:\s!fallback:\s!mono] - % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none] - % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] - % \stoptypescript - - \starttypescript[dejavu-condensed] - \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] - \stoptypescript - \starttypescript [\s!serif] [dejavu] [\s!name] \setups[\s!font:\s!fallback:\s!serif] \definefontsynonym [\s!Serif] [\s!name:dejavuserif] [\s!features=\s!default] @@ -66,11 +39,17 @@ \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] \stoptypescript + \starttypescript [\s!math][dejavu][\s!name] + %\loadfontgoodies[dejavu] + \definefontsynonym[\s!MathRoman][file:dejavu-math.otf][\s!features=\s!math\mathsizesuffix] + \stoptypescript + \starttypescript[dejavu] \definetypeface [dejavu] [\s!rm] [\s!serif] [dejavu] [\s!default] \definetypeface [dejavu] [\s!ss] [\s!sans] [dejavu] [\s!default] \definetypeface [dejavu] [\s!tt] [\s!mono] [dejavu] [\s!default] - \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] +% \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] + \definetypeface [dejavu] [\s!mm] [\s!math] [dejavu] [\s!default] \stoptypescript \starttypescript[dejavubidi] @@ -96,4 +75,32 @@ \definefontsynonym [\s!SansBoldItalic] [\s!name:dejavusanscondensedboldoblique] [\s!features=\s!default] \stoptypescript + \starttypescript [\s!mono] [dejavu-condensed] [\s!name] + \setups[\s!font:\s!fallback:\s!mono] + % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none] + \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono] + \stoptypescript + + % \starttypescript [\s!mono] [dejavu-condensed] [\s!name] + % \setups[\s!font:\s!fallback:\s!mono] + % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none] + % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] + % \stoptypescript + + \starttypescript[dejavu-condensed] + \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default] + \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default] + \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default] +% \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] + \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [dejavu] [\s!default] + \stoptypescript + \stoptypescriptcollection diff --git a/Master/texmf-dist/tex/context/base/type-ini.lua b/Master/texmf-dist/tex/context/base/type-ini.lua index 4f53fbf4011..cd5b32d3e6c 100644 --- a/Master/texmf-dist/tex/context/base/type-ini.lua +++ b/Master/texmf-dist/tex/context/base/type-ini.lua @@ -6,15 +6,23 @@ if not modules then modules = { } end modules ['type-ini'] = { license = "see context related readme files" } +local gsub = string.gsub +local lpegmatch, P, Cs = lpeg.match, lpeg.P, lpeg.Cs + -- more code will move here -local commands, context = commands, context +local commands = commands +local context = context +local implement = interfaces.implement -local gsub = string.gsub +local uselibrary = resolvers.uselibrary + +local name_one = nil +local name_two = nil -local report_typescripts = logs.reporter("fonts","typescripts") +local p_strip = Cs((P("type-") * (P("imp-")^0))^0/"" * P(1)^0) -local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex", "type-%s.mkiv", "type-%s.tex" } -- this will be imp only +local report = logs.reporter("fonts","typescripts") local function action(name,foundname) -- context.startreadingfile() @@ -27,52 +35,83 @@ local function action(name,foundname) context.loadfoundtypescriptfile(foundname) end -local name_one, name_two - -local function failure_two(name) - report_typescripts("unknown library %a or %a",name_one,name_two) -end +local patterns = { + "type-imp-%s.mkiv", + "type-imp-%s.tex" +} -local function failure_one(name) - name_two = gsub(name,"%-.*$","") +local function failure(name) if name == "loc" then -- ignore - elseif name_two == name then - report_typescripts("unknown library %a",name_one) else - commands.uselibrary { - name = name_two, + report("unknown library %a",name) + end +end + +implement { + name = "loadtypescriptfile", + arguments = "string", + actions = function(name) -- a more specific name + uselibrary { + name = lpegmatch(p_strip,name) or name, patterns = patterns, action = action, - failure = failure_two, + failure = failure, onlyonce = false, -- will become true } end -end - -function commands.doprocesstypescriptfile(name) - name_one = gsub(name,"^type%-","") - commands.uselibrary { - name = name_one, - patterns = patterns, - action = action, - failure = failure_one, - onlyonce = false, -- will become true - } -end +} -local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex" } +local patterns = { + "type-imp-%s.mkiv", + "type-imp-%s.tex", + -- obsolete + "type-%s.mkiv", + "type-%s.tex" +} -local function failure(name) - report_typescripts("unknown library %a",name) -end +-- local function failure_two(name) +-- report("unknown library %a or %a",name_one,name_two) +-- end +-- +-- local function failure_one(name) +-- name_two = gsub(name,"%-.*$","") +-- if name == "loc" then +-- -- ignore +-- elseif name_two == name then +-- report("unknown library %a",name_one) +-- else +-- commands.uselibrary { +-- name = name_two, +-- patterns = patterns, +-- action = action, +-- failure = failure_two, +-- onlyonce = false, -- will become true +-- } +-- end +-- end +-- +-- function commands.doprocesstypescriptfile(name) +-- name_one = lpegmatch(p_strip,name) or name +-- uselibrary { +-- name = name_one, +-- patterns = patterns, +-- action = action, +-- failure = failure_one, +-- onlyonce = false, -- will become true +-- } +-- end -function commands.loadtypescriptfile(name) -- a more specific name - commands.uselibrary { - name = gsub(name,"^type%-",""), - patterns = patterns, - action = action, - failure = failure, - onlyonce = false, -- will become true - } -end +implement { + name = "doprocesstypescriptfile", + arguments = "string", + actions = function(name) + uselibrary { + name = lpegmatch(p_strip,name) or name, + patterns = patterns, + action = action, + failure = failure, + onlyonce = false, -- will become true + } + end +} diff --git a/Master/texmf-dist/tex/context/base/type-ini.mkvi b/Master/texmf-dist/tex/context/base/type-ini.mkvi index faa9c667c34..f56c5573d5d 100644 --- a/Master/texmf-dist/tex/context/base/type-ini.mkvi +++ b/Master/texmf-dist/tex/context/base/type-ini.mkvi @@ -172,7 +172,7 @@ \unexpanded\def\loadtypescriptfile[#1]% {\pushmacro\typescriptstate \let\typescriptstate\plustwo % assumes 2 at the outer level - \ctxcommand{loadtypescriptfile("#1")}% + \clf_loadtypescriptfile{#1}% \popmacro\typescriptstate} \unexpanded\def\loadfoundtypescriptfile#1% @@ -237,7 +237,7 @@ \expandafter\let\csname\??typescriptfiles\currenttypefile\endcsname\t_font_typescripts} \def\font_typescript_process_typescript_file - {\ctxcommand{doprocesstypescriptfile("\currenttypefile")}} + {\clf_doprocesstypescriptfile{\currenttypefile}} \unexpanded\def\usetypescriptonce {\dotripleempty\font_typescripts_use_once} @@ -294,12 +294,12 @@ %{\appendtoks\starttypescript#definitions\stoptypescript\to\c_font_typescripts_document} {\c_font_typescripts_document\expandafter{\the\c_font_typescripts_document\starttypescript#definitions\stoptypescript}} -\def\font_typescripts_start_process % could be a faster \doifnextoptionalelse if needed +\def\font_typescripts_start_process % could be a faster \doifelsenextoptionalif needed {\let\typescriptone \m_font_typescripts_one \let\typescripttwo \m_font_typescripts_two \let\typescriptthree\m_font_typescripts_three \let\m_font_typescripts_match\empty - \doifnextoptionalcselse\font_typescripts_start_process_one\font_typescripts_start_process_all} + \doifelsenextoptionalcs\font_typescripts_start_process_one\font_typescripts_start_process_all} \def\font_typescripts_start_process_all % could be a \let {\ifconditional\c_font_typescripts_first_pass @@ -333,10 +333,10 @@ {\font_typescripts_check\m_font_typescripts_three\typescriptthree\font_typescripts_start_process_again_three} \def\font_typescripts_start_process_again_one - {\doifnextoptionalcselse\font_typescripts_start_process_two\font_typescripts_start_process_yes} + {\doifelsenextoptionalcs\font_typescripts_start_process_two\font_typescripts_start_process_yes} \def\font_typescripts_start_process_again_two - {\doifnextoptionalcselse\font_typescripts_start_process_three\font_typescripts_start_process_yes} + {\doifelsenextoptionalcs\font_typescripts_start_process_three\font_typescripts_start_process_yes} \let\font_typescripts_start_process_again_three\font_typescripts_start_process_yes @@ -359,7 +359,7 @@ \donetrue \let#target\m_font_typescripts_check \else - \doifcommonelse\m_font_typescripts_check#asked\donetrue\donefalse + \doifelsecommon\m_font_typescripts_check#asked\donetrue\donefalse \ifdone \let#target\commalistelement \fi @@ -381,13 +381,13 @@ \unexpanded\def\loadmapline{\dodoubleempty\font_map_load_line} \def\font_map_load_file[#filename]% - {\ctxlua{fonts.mappings.loadfile("#filename")}} + {\clf_loadmapfile{#filename}} \def\font_map_load_line[#kind][#data]% - {\ctxlua{fonts.mappings.loadline("#kind","#data")}} + {\clf_loadmapline{#kind}{#data}} \unexpanded\def\forgetmapfiles - {\ctxlua{fonts.mappings.reset()}} + {\clf_resetmapfiles} % \prependtoks % \loadmapfile[mkiv-base.map]% can't we preload this one? @@ -497,7 +497,7 @@ {\font_typefaces_define_indeed[#name][#style]} \def\font_typefaces_define_d[#name][#specification][#dummya][#dummyb][#dummyc][#dummyd]% use definitions in lfg file - {\ctxlua{fonts.definetypeface("#name",\!!bs#specification\!!es)}} + {\clf_definetypeface{#name}{#specification}} \def\font_typefaces_define_indeed[#name][#style]% saveguard against redefinition {\doifsomething{#name} @@ -575,12 +575,6 @@ \fi \fi \fi \ifmmode\mr\else\tf\fi} % needed ? -% obsolete -% -% \unexpanded\def\usetypefile[#type]% recurses on path ! % no storage -% {\edef\currenttypefile{#type}% -% \ctxcommand{doprocesstypescriptfile("\currenttypefile")}} - %D For Taco: %D %D \starttyping diff --git a/Master/texmf-dist/tex/context/base/type-run.mkiv b/Master/texmf-dist/tex/context/base/type-run.mkiv index 4da633371d9..0455d896636 100644 --- a/Master/texmf-dist/tex/context/base/type-run.mkiv +++ b/Master/texmf-dist/tex/context/base/type-run.mkiv @@ -21,7 +21,7 @@ \def\dochecktypescript##1##2% script use {\doifelsenothing{##1##2} {\donetrue} - {\doifcommonelse{##1}{##2}\donetrue\donefalse}} + {\doifelsecommon{##1}{##2}\donetrue\donefalse}} \edef\typescriptone {\truetypescript{#1}}% \edef\typescripttwo {\truetypescript{#2}}% \edef\typescriptthree{\truetypescript{#3}}% @@ -30,7 +30,7 @@ \obeylines % else we loose the first line due to lookahead \dotripleempty\dostarttypescript} \def\dostarttypescript[##1][##2][##3]% - {\long\def\next####1\stoptypescript{\egroup} + {\def\next####1\stoptypescript{\egroup} \dochecktypescript{##1}\typescriptone \ifdone \dochecktypescript{##2}\typescripttwo \ifdone \dochecktypescript{##3}\typescriptthree\ifdone diff --git a/Master/texmf-dist/tex/context/base/typo-bld.lua b/Master/texmf-dist/tex/context/base/typo-bld.lua index ad37c36f41a..4d0f28d9ab1 100644 --- a/Master/texmf-dist/tex/context/base/typo-bld.lua +++ b/Master/texmf-dist/tex/context/base/typo-bld.lua @@ -165,13 +165,8 @@ local function processor(head,followed_by_display) end end -function constructors.enable() - enabled = true -end - -function constructors.disable() - enabled = false -end +function constructors.enable () enabled = true end +function constructors.disable() enabled = false end callbacks.register('linebreak_filter', processor, "breaking paragraps into lines") @@ -179,15 +174,6 @@ statistics.register("linebreak processing time", function() return statistics.elapsedseconds(parbuilders) end) --- interface - -commands.defineparbuilder = constructors.define -commands.startparbuilder = constructors.start -commands.stopparbuilder = constructors.stop -commands.setparbuilder = constructors.set -commands.enableparbuilder = constructors.enable -commands.disableparbuilder = constructors.disable - -- todo: move from nodes.builders to builders nodes.builders = nodes.builder or { } @@ -267,3 +253,12 @@ callbacks.register('buildpage_filter', builders.buildpage_filter, "vertical spac statistics.register("v-node processing time", function() return statistics.elapsedseconds(builders) end) + +local implement = interfaces.implement + +implement { name = "defineparbuilder", actions = constructors.define, arguments = "string" } +implement { name = "setparbuilder", actions = constructors.set, arguments = "string" } +implement { name = "startparbuilder", actions = constructors.start, arguments = "string" } +implement { name = "stopparbuilder", actions = constructors.stop } +implement { name = "enableparbuilder", actions = constructors.enable } +implement { name = "disableparbuilder", actions = constructors.disable } diff --git a/Master/texmf-dist/tex/context/base/typo-bld.mkiv b/Master/texmf-dist/tex/context/base/typo-bld.mkiv index 10502005b9a..69047c98b15 100644 --- a/Master/texmf-dist/tex/context/base/typo-bld.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-bld.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\writestatus{loading}{ConTeXt Node Macros / Paragraph Building} +\writestatus{loading}{ConTeXt Typesetting Macros / Paragraph Building} %D This is very experimental, undocumented, subjected to changes, etc. just as %D the underlying interfaces. But at least it's cleaned as part of the status-mkiv @@ -38,18 +38,18 @@ \installcorenamespace {parbuilder} \unexpanded\def\defineparbuilder[#1]% - {\ctxcommand{defineparbuilder("#1")}} + {\clf_defineparbuilder{#1}} \unexpanded\def\startparbuilder[#1]% {\ifhmode\par\fi - \ctxcommand{startparbuilder("#1")}} + \clf_startparbuilder{#1}} \unexpanded\def\stopparbuilder {\ifhmode\par\fi - \ctxcommand{stopparbuilder()}} + \clf_stopparbuilder} \unexpanded\def\setmainparbuilder[#1]% - {\ctxcommand{setparbuilder("#1")}} + {\clf_setparbuilder{#1}} % no high level interface, after all implementing a linebreaker is not something that % the average user will do @@ -58,7 +58,7 @@ \defineparbuilder[oneline] % just for testing \defineparbuilder[basic] % just for testing -\def\enableparbuilders {\ctxcommand{enableparbuilder()}} % hooks in otr so we need to pickup -\def\disableparbuilders{\ctxcommand{disableparbuilder()}} % hooks in otr so we need to pickup +\unexpanded\def\enableparbuilders {\clf_enableparbuilder } % hooks in otr so we need to pickup +\unexpanded\def\disableparbuilders{\clf_disableparbuilder} % hooks in otr so we need to pickup \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/typo-brk.lua b/Master/texmf-dist/tex/context/base/typo-brk.lua index f9a65c6ba4c..a9d775856b4 100644 --- a/Master/texmf-dist/tex/context/base/typo-brk.lua +++ b/Master/texmf-dist/tex/context/base/typo-brk.lua @@ -53,6 +53,8 @@ local tasks = nodes.tasks local v_reset = interfaces.variables.reset +local implement = interfaces.implement + local new_penalty = nodepool.penalty local new_glue = nodepool.glue local new_disc = nodepool.disc @@ -107,7 +109,8 @@ methods[2] = function(head,start) -- ( => (- local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"replace",tmp) local tmp = copy_node(tmp) local hyphen = copy_node(tmp) @@ -125,7 +128,8 @@ methods[3] = function(head,start) -- ) => -) local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"replace",tmp) local tmp = copy_node(tmp) local hyphen = copy_node(tmp) @@ -143,7 +147,8 @@ methods[4] = function(head,start) -- - => - - - local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"pre",copy_node(tmp)) setfield(start,"post",copy_node(tmp)) setfield(start,"replace",tmp) @@ -171,7 +176,8 @@ methods[5] = function(head,start,settings) -- x => p q r if middle then setfield(start,"replace",(tonodes(tostring(middle),font,attr))) end - setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do + -- setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do + setfield(start,"attr",attr) -- todo: critical only -- just a copy will do free_node(tmp) insert_break(head,start,10000,10000) end @@ -315,6 +321,32 @@ end -- interface -commands.definebreakpoints = breakpoints.define -commands.definebreakpoint = breakpoints.setreplacement -commands.setbreakpoints = breakpoints.set +implement { + name = "definebreakpoints", + actions = breakpoints.define, + arguments = "string" +} + +implement { + name = "definebreakpoint", + actions = breakpoints.setreplacement, + arguments = { + "string", + "string", + "string", + { + { "type", "integer" }, + { "nleft" }, + { "nright" }, + { "right" }, + { "left" }, + { "middle" }, + } + } +} + +implement { + name = "setbreakpoints", + actions = breakpoints.set, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-brk.mkiv b/Master/texmf-dist/tex/context/base/typo-brk.mkiv index af498bfecb5..3b463c06f92 100644 --- a/Master/texmf-dist/tex/context/base/typo-brk.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-brk.mkiv @@ -25,13 +25,13 @@ \definesystemattribute[breakpoint][public,global] -\exhyphenchar\minusone % we use a different order then base tex, so we really need this +% see below: \exhyphenchar \minusone % we use a different order tha n base tex, so we really need this \unexpanded\def\definebreakpoints {\dosingleargument\typo_breakpoints_define} \def\typo_breakpoints_define[#1]% - {\ctxcommand{definebreakpoints("#1")}} + {\clf_definebreakpoints{#1}} \def\definebreakpoint {\dotripleempty\typo_breakpoints_define_character} @@ -39,18 +39,24 @@ \def\typo_breakpoints_define_character[#1][#2][#3]% name char settings {\begingroup \getdummyparameters[\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]% - \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag{\directdummyparameter\s!language}", { % maybe deal with #3 at the lua end - type = \directdummyparameter\c!type, - nleft = "\directdummyparameter\c!nleft", - nright = "\directdummyparameter\c!nright", - right = "\directdummyparameter\c!right", - left = "\directdummyparameter\c!left", - middle = "\directdummyparameter\c!middle" - } )}% + \clf_definebreakpoint + {#1}% + {#2}% + {\reallanguagetag{\directdummyparameter\s!language}}% + {% maybe deal with #3 at the lua end + type \directdummyparameter\c!type + nleft {\directdummyparameter\c!nleft}% + nright {\directdummyparameter\c!nright}% + right {\directdummyparameter\c!right}% + left {\directdummyparameter\c!left}% + middle {\directdummyparameter\c!middle}% + }% + \relax \endgroup} \unexpanded\def\setbreakpoints[#1]% - {\ctxcommand{setbreakpoints("#1")}} + {\exhyphenchar\minusone % we use a different order tha n base tex, so we really need this + \clf_setbreakpoints{#1}} \unexpanded\def\resetbreakpoints {\attribute\breakpointattribute\attributeunsetvalue} diff --git a/Master/texmf-dist/tex/context/base/typo-cap.lua b/Master/texmf-dist/tex/context/base/typo-cap.lua index 78ed8700a31..80a74bac916 100644 --- a/Master/texmf-dist/tex/context/base/typo-cap.lua +++ b/Master/texmf-dist/tex/context/base/typo-cap.lua @@ -33,6 +33,9 @@ local getchar = nuts.getchar local copy_node = nuts.copy local end_of_math = nuts.end_of_math +local traverse_nodes = nuts.traverse +local traverse_id = nuts.traverse_id +local insert_after = nuts.insert_after local nodecodes = nodes.nodecodes local skipcodes = nodes.skipcodes @@ -72,6 +75,8 @@ local a_cases = attributes.private("case") local extract = bit32.extract local run = 0 -- a trick to make neighbouring ranges work +local blocked = { } + local function set(tag,font) if run == 2^6 then run = 1 @@ -104,88 +109,40 @@ end -- -- \WORD {far too \Word{many \WORD{more \word{pushed} in between} useless} words} -local uccodes = characters.uccodes -local lccodes = characters.lccodes +local uccodes = characters.uccodes +local lccodes = characters.lccodes +local categories = characters.categories -- true false true == mixed -local function helper(start,attr,lastfont,n,codes,special,once,keepother) +local function replacer(start,codes) local char = getchar(start) local dc = codes[char] if dc then local fnt = getfont(start) - if keepother and dc == char then - local lfa = lastfont[n] - if lfa then - setfield(start,"font",lfa) - return start, true - else - return start, false - end - else - if special then - local lfa = lastfont[n] - if lfa then - local previd = getid(getprev(start)) - if previd ~= glyph_code and previd ~= disc_code then - fnt = lfa - setfield(start,"font",lfa) - end + local ifc = fontchar[fnt] + if type(dc) == "table" then + for i=1,#dc do + if not ifc[dc[i]] then + return start, false end end - local ifc = fontchar[fnt] - if type(dc) == "table" then - local ok = true - for i=1,#dc do - -- could be cached in font - if not ifc[dc[i]] then - ok = false - break - end - end - if ok then - -- todo: use generic injector - local prev = start - local original = start - for i=1,#dc do - local chr = dc[i] - prev = start - if i == 1 then - setfield(start,"char",chr) - else - local g = copy_node(original) - setfield(g,"char",chr) - local next = getnext(start) - setfield(g,"prev",start) - if next then - setfield(g,"next",next) - setfield(start,"next",g) - setfield(next,"prev",g) - end - start = g - end - end - if once then - lastfont[n] = false - end - return prev, true - end - if once then - lastfont[n] = false - end - return start, false - elseif ifc[dc] then - setfield(start,"char",dc) - if once then - lastfont[n] = false + for i=#dc,1,-1 do + local chr = dc[i] + if i == 1 then + setfield(start,"char",chr) + else + local g = copy_node(start) + setfield(g,"char",chr) + insert_after(start,start,g) end - return start, true end + return start, true + elseif ifc[dc] then + setfield(start,"char",dc) + return start, true end end - if once then - lastfont[n] = false - end return start, false end @@ -206,140 +163,147 @@ end cases.register = register -local function WORD(start,attr,lastfont,n) +local function WORD(start,attr,lastfont,n,count,where,first) lastfont[n] = false - return helper(start,attr,lastfont,n,uccodes) + return replacer(first or start,uccodes) end -local function word(start,attr,lastfont,n) +local function word(start,attr,lastfont,n,count,where,first) lastfont[n] = false - return helper(start,attr,lastfont,n,lccodes) -end - -local function blockrest(start) - local n = getnext(start) - while n do - local id = getid(n) - if id == glyph_code or id == disc_node and getattr(n,a_cases) == attr then - setattr(n,a_cases,unsetvalue) - else - -- break -- we can have nested mess - end - n = getnext(n) - end + return replacer(first or start,lccodes) end -local function Word(start,attr,lastfont,n) -- looks quite complex - lastfont[n] = false - local prev = getprev(start) - if prev and getid(prev) == kern_code and getsubtype(prev) == kerning_code then - prev = getprev(prev) +local function Words(start,attr,lastfont,n,count,where,first) -- looks quite complex + if where == "post" then + return end - if not prev then - blockrest(start) - return helper(start,attr,lastfont,n,uccodes) - end - local previd = getid(prev) - if previd ~= glyph_code and previd ~= disc_code then - -- only the first character is treated - blockrest(start) - -- we could return the last in the range and save some scanning - -- but why bother - return helper(start,attr,lastfont,n,uccodes) + if count == 1 and where ~= "post" then + replacer(first or start,uccodes) + return start, true, true else - return start, false + return start, false, true end end -local function Words(start,attr,lastfont,n) - lastfont[n] = false - local prev = getprev(start) - if prev and getid(prev) == kern_code and getsubtype(prev) == kerning_code then - prev = getprev(prev) - end - if not prev then - return helper(start,attr,lastfont,n,uccodes) +local function Word(start,attr,lastfont,n,count,where,first) + blocked[attr] = true + return Words(start,attr,lastfont,n,count,where,first) +end + +local function camel(start,attr,lastfont,n,count,where,first) + local _, done_1 = word(start,attr,lastfont,n,count,where,first) + local _, done_2 = Words(start,attr,lastfont,n,count,where,first) + return start, done_1 or done_2, true +end + +local function mixed(start,attr,lastfont,n,count,where,first) + if where == "post" then + return end - local previd = getid(prev) - if previd ~= glyph_code and previd ~= disc_code then - return helper(start,attr,lastfont,n,uccodes) + local used = first or start + local char = getchar(first) + local dc = uccodes[char] + if not dc then + return start, false, true + elseif dc == char then + local lfa = lastfont[n] + if lfa then + setfield(first,"font",lfa) + return start, true, true + else + return start, false, true + end else - return start, false + replacer(first or start,uccodes) + return start, true, true end end -local function capital(start,attr,lastfont,n) -- 3 - return helper(start,attr,lastfont,n,uccodes,true,true) -end - -local function Capital(start,attr,lastfont,n) -- 4 - return helper(start,attr,lastfont,n,uccodes,true,false) +local function Capital(start,attr,lastfont,n,count,where,first,once) -- 3 + local used = first or start + if count == 1 and where ~= "post" then + local lfa = lastfont[n] + if lfa then + local dc = uccodes[getchar(used)] + if dc then + setfield(used,"font",lfa) + end + end + end + local s, d, c = replacer(first or start,uccodes) + if once then + lastfont[n] = false -- here + end + return start, d, c end -local function mixed(start,attr,lastfont,n) - return helper(start,attr,lastfont,n,uccodes,false,false,true) +local function capital(start,attr,lastfont,n,where,count,first,count) -- 4 + return Capital(start,attr,lastfont,n,where,count,first,true) end -local function none(start,attr,lastfont,n) - return start, false +local function none(start,attr,lastfont,n,count,where,first) + return start, false, true end -local function random(start,attr,lastfont,n) +local function random(start,attr,lastfont,n,count,where,first) + local used = first or start + local char = getchar(used) + local font = getfont(used) + local tfm = fontchar[font] lastfont[n] = false - local ch = getchar(start) - local tfm = fontchar[getfont(start)] - if lccodes[ch] then + local kind = categories[char] + if kind == "lu" then while true do - local d = chardata[randomnumber(1,0xFFFF)] - if d then - local uc = uccodes[d] - if uc and tfm[uc] then -- this also intercepts tables - setfield(start,"char",uc) - return start, true - end + local n = randomnumber(0x41,0x5A) + if tfm[n] then -- this also intercepts tables + setfield(used,"char",n) + return start, true end end - elseif uccodes[ch] then + elseif kind == "ll" then while true do - local d = chardata[randomnumber(1,0xFFFF)] - if d then - local lc = lccodes[d] - if lc and tfm[lc] then -- this also intercepts tables - setfield(start,"char",lc) - return start, true - end + local n = randomnumber(0x61,0x7A) + if tfm[n] then -- this also intercepts tables + setfield(used,"char",n) + return start, true end end end return start, false end -register(variables.WORD, WORD) -- 1 -register(variables.word, word) -- 2 -register(variables.Word, Word) -- 3 -register(variables.Words, Words) -- 4 -register(variables.capital, capital) -- 5 -register(variables.Capital, Capital) -- 6 -register(variables.none, none) -- 7 (dummy) -register(variables.random, random) -- 8 -register(variables.mixed, mixed) -- 9 +register(variables.WORD, WORD) -- 1 +register(variables.word, word) -- 2 +register(variables.Word, Word) -- 3 +register(variables.Words, Words) -- 4 +register(variables.capital,capital) -- 5 +register(variables.Capital,Capital) -- 6 +register(variables.none, none) -- 7 (dummy) +register(variables.random, random) -- 8 +register(variables.mixed, mixed) -- 9 +register(variables.camel, camel) -- 10 -register(variables.cap, variables.capital) -- clone -register(variables.Cap, variables.Capital) -- clone +register(variables.cap, variables.capital) -- clone +register(variables.Cap, variables.Capital) -- clone function cases.handler(head) -- not real fast but also not used on much data - head = tonut(head) local lastfont = { } local lastattr = nil local done = false - local start = head + local start = tonut(head) + local count = 0 + local previd = nil + local prev = nil while start do -- while because start can jump ahead local id = getid(start) if id == glyph_code then local attr = getattr(start,a_cases) - if attr and attr > 0 then + if attr and attr > 0 and not blocked[attr] then if attr ~= lastattr then lastattr = attr + count = 1 + else + count = count + 1 end setattr(start,a_cases,unsetvalue) local n, id, m = get(attr) @@ -348,7 +312,7 @@ function cases.handler(head) -- not real fast but also not used on much data end local action = actions[n] -- map back to low number if action then - start, ok = action(start,attr,lastfont,n) + start, ok = action(start,attr,lastfont,n,count) if ok then done = true end @@ -361,9 +325,10 @@ function cases.handler(head) -- not real fast but also not used on much data end elseif id == disc_code then local attr = getattr(start,a_cases) - if attr and attr > 0 then + if attr and attr > 0 and not blocked[attr] then if attr ~= lastattr then lastattr = attr + count = 0 end setattr(start,a_cases,unsetvalue) local n, id, m = get(attr) @@ -374,28 +339,73 @@ function cases.handler(head) -- not real fast but also not used on much data if action then local replace = getfield(start,"replace") if replace then - action(replace,attr,lastfont,n) + local cnt = count + for g in traverse_id(glyph_code,replace) do + cnt = cnt + 1 + -- setattr(g,a_cases,unsetvalue) + local _, _, quit = action(start,attr,lastfont,n,cnt,"replace",g) + if quit then break end + end end local pre = getfield(start,"pre") if pre then - action(pre,attr,lastfont,n) + local cnt = count + for g in traverse_id(glyph_code,pre) do + cnt = cnt + 1 + -- setattr(g,a_cases,unsetvalue) + local _, _, quit = action(start,attr,lastfont,n,cnt,"pre",g) + if quit then break end + end end local post = getfield(start,"post") if post then - action(post,attr,lastfont,n) + local cnt = count + for g in traverse_id(glyph_code,post) do + cnt = cnt + 1 + -- setattr(g,a_cases,unsetvalue) + local _, _, quit = action(start,attr,lastfont,n,cnt,"post",g) + if quit then break end + end end end + count = count + 1 end elseif id == math_code then start = end_of_math(start) + count = 0 + elseif prev_id == kern_code and getsubtype(prev) == kerning_code then + -- still inside a word ...nomally kerns are added later + else + count = 0 end - if start then -- why test - start = getnext(start) + if start then + prev = start + previd = id + start = getnext(start) end end - return tonode(head), done + return head, done end +-- function cases.handler(head) -- let's assume head doesn't change ... no reason +-- local done = false +-- local lastfont = { } +-- for first, last, size, attr in nuts.words(tonut(head),a_cases) do +-- local n, id, m = get(attr) +-- if lastfont[n] == nil then +-- lastfont[n] = id +-- end +-- local action = actions[n] +-- if action then +-- local _, ok = action(first,attr,lastfont,n) +-- if ok then +-- done = true +-- end +-- end +-- end +-- return head, done +-- end + local enabled = false function cases.set(n,id) @@ -422,4 +432,8 @@ end -- interface -commands.setcharactercasing = cases.set +interfaces.implement { + name = "setcharactercasing", + actions = cases.set, + arguments = { "string", "integer" } +} diff --git a/Master/texmf-dist/tex/context/base/typo-cap.mkiv b/Master/texmf-dist/tex/context/base/typo-cap.mkiv index c4458129f51..2859ba104e1 100644 --- a/Master/texmf-dist/tex/context/base/typo-cap.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-cap.mkiv @@ -43,6 +43,7 @@ \definecapitals[\v!WORD] % all lower \definecapitals[\v!Word] % one upper + font \definecapitals[\v!Words] % some upper +\definecapitals[\v!camel] % lowers first \definecapitals[\v!word][\c!style=] % nothing %D \macros @@ -76,7 +77,7 @@ % test \Word{test TEST \TeX} test \unexpanded\def\setcharactercasing[#1]% - {\ctxcommand{setcharactercasing("#1",\number\fontid\font)}} + {\clf_setcharactercasing{#1}\fontid\font} % todo: names casings @@ -84,6 +85,7 @@ \unexpanded\def\word {\groupedcommand{\setcharactercasing[\v!word ]}{}} \unexpanded\def\Word {\groupedcommand{\setcharactercasing[\v!Word ]}{}} \unexpanded\def\Words{\groupedcommand{\setcharactercasing[\v!Words]}{}} +\unexpanded\def\camel{\groupedcommand{\setcharactercasing[\v!camel]}{}} % This might become: % @@ -166,16 +168,13 @@ \def\typo_capitals_set_fake#1% {\edef\currentcapitals{#1}% - %\setcharactercasing[\currentcapitals]% - \ctxcommand{setcharactercasing("\currentcapitals",\number\fontid\font)}% - \signalcharacter % retain current style + \clf_setcharactercasing{\currentcapitals}\fontid\font \usecapitalsstyleparameter\c!style} \def\typo_capitals_set_real#1% {\edef\currentcapitals{#1}% \sc - %\setcharactercasing[\currentcapitals]} - \ctxcommand{setcharactercasing("\currentcapitals",\number\fontid\font)}} + \clf_setcharactercasing{\currentcapitals}\fontid\font} \unexpanded\def\pseudosmallcapped{\groupedcommand{\typo_capitals_set_fake\v!WORD }\donothing} % all upper \unexpanded\def\pseudoSmallcapped{\groupedcommand{\typo_capitals_set_fake\v!capital}\donothing} % one upper + font diff --git a/Master/texmf-dist/tex/context/base/typo-chr.lua b/Master/texmf-dist/tex/context/base/typo-chr.lua new file mode 100644 index 00000000000..94095828ddc --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-chr.lua @@ -0,0 +1,155 @@ +if not modules then modules = { } end modules ['typo-chr'] = { + version = 1.001, + comment = "companion to typo-bld.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- local nodecodes = nodes.nodecodes +-- local whatsitcodes = nodes.whatsitcodes +-- local glyph_code = nodecodes.glyph +-- local whatsit_code = nodecodes.whatsit +-- local user_code = whatsitcodes.userdefined +-- +-- local stringusernode = nodes.pool.userstring +-- +-- local nuts = nodes.nuts +-- local pool = nuts.pool +-- +-- local tonut = nuts.tonut +-- local tonode = nuts.tonode +-- local getid = nuts.getid +-- local getprev = nuts.getprev +-- local getsubtype = nuts.getsubtype +-- local getchar = nuts.getchar +-- local getfield = nuts.getfield +-- +-- local remove_node = nuts.remove +-- local traverse_by_id = nuts.traverse_id +-- +-- local signal = pool.userids.signal +-- +-- local is_punctuation = characters.is_punctuation +-- +-- local actions = { +-- removepunctuation = function(head,n) +-- local prev = getprev(n) +-- if prev then +-- if getid(prev) == glyph_code then +-- if is_punctuation[getchar(prev)] then +-- head = remove_node(head,prev,true) +-- end +-- end +-- end +-- return head +-- end +-- } +-- +-- -- we can also use properties .. todo (saves pass) +-- +-- typesetters.signals = { } +-- +-- function typesetters.signals.handler(head) +-- local h = tonut(head) +-- local done = false +-- for n in traverse_by_id(whatsit_code,h) do +-- if getsubtype(n) == user_code and getfield(n,"user_id") == signal and getfield(n,"type") == 115 then +-- local action = actions[getfield(n,"value")] +-- if action then +-- h = action(h,n) +-- end +-- h = remove_node(h,n,true) +-- done = true +-- end +-- end +-- if done then +-- return tonode(h), true +-- else +-- return head +-- end +-- end +-- +-- local enabled = false +-- +-- local function signal(what) +-- if not enabled then +-- nodes.tasks.prependaction("processors","normalizers", "typesetters.signals.handler") +-- enabled = true +-- end +-- context(stringusernode(signal,what)) +-- end +-- +-- interfaces.implement { +-- name = "signal", +-- actions = signal, +-- arguments = "string", +-- } + +local insert, remove = table.insert, table.remove + +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph + +local texnest = tex.nest +local free_node = node.free + +local punctuation = characters.is_punctuation + +local stack = { } + +local function pickup() + local list = texnest[texnest.ptr] + if list then + local tail = list.tail + if tail and tail.id == glyph_code and punctuation[tail.char] then + local prev = tail.prev + list.tail = prev + if prev then + prev.next = nil + end + list.tail = prev + tail.prev = nil + return tail + end + end +end + +local actions = { + remove = function(specification) + local n = pickup() + if n then + free_node(n) + end + end, + push = function(specification) + local n = pickup() + if n then + insert(stack,n or false) + end + end, + pop = function(specification) + local n = remove(stack) + if n then + context(n) + end + end, +} + +local function pickuppunctuation(specification) + local action = actions[specification.action or "remove"] + if action then + action(specification) + end +end + +interfaces.implement { + name = "pickuppunctuation", + actions = pickuppunctuation, + arguments = { + { + { "action" } + } + } +} + diff --git a/Master/texmf-dist/tex/context/base/typo-chr.mkiv b/Master/texmf-dist/tex/context/base/typo-chr.mkiv new file mode 100644 index 00000000000..9d8dd7c20c8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-chr.mkiv @@ -0,0 +1,28 @@ + +%D \module +%D [ file=typo-cap, +%D version=2009.03.27, % code moved from core-spa.mkiv +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Capping, +%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. + +\writestatus{loading}{ConTeXt Typesetting Macros / Characters} + +\unprotect + +%D Maybe we need a more clever system: either command or style mode etc. so +%D that we can avoid the grouped mess in a simple style switch. + +\registerctxluafile{typo-chr}{1.001} + +\unexpanded\def\removepunctuation{\clf_pickuppunctuation action {remove}\relax} +\unexpanded\def\pushpunctuation {\clf_pickuppunctuation action {push}\relax} +\unexpanded\def\poppunctuation {\clf_pickuppunctuation action {pop}\relax} + +\protect diff --git a/Master/texmf-dist/tex/context/base/typo-cln.lua b/Master/texmf-dist/tex/context/base/typo-cln.lua index 8b1ac78768d..7228e02c543 100644 --- a/Master/texmf-dist/tex/context/base/typo-cln.lua +++ b/Master/texmf-dist/tex/context/base/typo-cln.lua @@ -101,4 +101,8 @@ end -- interface -commands.setcharactercleaning = cleaners.set +interfaces.implement { + name = "setcharactercleaning", + actions = cleaners.set, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-cln.mkiv b/Master/texmf-dist/tex/context/base/typo-cln.mkiv index 5306f614f27..193198dc556 100644 --- a/Master/texmf-dist/tex/context/base/typo-cln.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-cln.mkiv @@ -24,7 +24,7 @@ %D 1: Autocap first character of a line \unexpanded\def\setcharactercleaning[#1]% This name might change! - {\ctxcommand{setcharactercleaning("#1")}} % also accepts "reset" + {\clf_setcharactercleaning{#1}} % also accepts "reset" % \appendtoks % \attribute\cleanerattribute\attributeunsetvalue diff --git a/Master/texmf-dist/tex/context/base/typo-del.mkiv b/Master/texmf-dist/tex/context/base/typo-del.mkiv index 603471f752c..4c3c5ab3da0 100644 --- a/Master/texmf-dist/tex/context/base/typo-del.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-del.mkiv @@ -70,23 +70,23 @@ {\ifcase\boundarycharactermode \or %\nobreak - \hskip\hspaceamount\currentlanguage{#2}% - \languageparameter#1% + \hskip\hspaceamount\currentusedlanguage{#2}% + \usedlanguageparameter#1% %\nobreak - \hskip\hspaceamount\currentlanguage{#2}% + \hskip\hspaceamount\currentusedlanguage{#2}% \or - \languageparameter#1% + \usedlanguageparameter#1% \fi \boundarycharactermode\plusone} \unexpanded\def\leftboundarycharacter#1#2% {\ifcase\boundarycharactermode \or - \languageparameter#1% + \usedlanguageparameter#1% \nobreak - \hskip\hspaceamount\currentlanguage{#2}% + \hskip\hspaceamount\currentusedlanguage{#2}% \or - \languageparameter#1% + \usedlanguageparameter#1% \fi \boundarycharactermode\plusone} @@ -94,10 +94,10 @@ {\ifcase\boundarycharactermode \or \prewordbreak %\nobreak - \hskip\hspaceamount\currentlanguage{#2}% - \languageparameter#1% + \hskip\hspaceamount\currentusedlanguage{#2}% + \usedlanguageparameter#1% \or - \languageparameter#1% + \usedlanguageparameter#1% \fi \boundarycharactermode\plusone} @@ -142,13 +142,13 @@ {\beforesubsentence \ifdim\lastkern=\d_typo_subsentence_signal \unskip - \kern\hspaceamount\currentlanguage{intersentence}% + \kern\hspaceamount\currentusedlanguage{intersentence}% \fi \global\advance\c_typo_subsentence_nesting\plusone \ifnum\c_typo_subsentence_nesting=\plusone \dontleavehmode % was \leaveoutervmode \fi - \dostarttagged\t!subsentence\empty + \dostarttagged\t!subsentence\empty % no chain \symbol[\ifodd\c_typo_subsentence_nesting\c!leftsentence\else\c!leftsubsentence\fi]% }% \ignorespaces} @@ -166,7 +166,7 @@ \unexpanded\def\endofsubsentencespacing {\ifdim\lastkern=\d_typo_subsentence_signal \unskip - \hskip\hspaceamount\currentlanguage{intersentence}% + \hskip\hspaceamount\currentusedlanguage{intersentence}% % no good, actually language dependent: % \ignorespaces \else @@ -193,8 +193,8 @@ %definehspace [quote] [\zeropoint] %definehspace [speech] [\zeropoint] -\definehspace [quote] [\hspaceamount\currentlanguage{quotation}] -\definehspace [speech] [\hspaceamount\currentlanguage{quotation}] +\definehspace [quote] [\hspaceamount\currentusedlanguage{quotation}] +\definehspace [speech] [\hspaceamount\currentusedlanguage{quotation}] \definesymbol [\c!leftquotation] @@ -204,6 +204,14 @@ [\c!rightquotation] [\rightboundarycharacter\c!rightquotation{quotation}] +\definesymbol + [\c!nextleftquotation] + [\rightboundarycharacter\c!leftquotation{quotation}] + +\definesymbol + [\c!nextrightquotation] + [\leftboundarycharacter\c!rightquotation{quotation}] + \definesymbol [\c!leftquote] [\leftboundarycharacter\c!leftquote{quote}] @@ -248,6 +256,7 @@ \def\typo_delimited_push#1% {\globalpushmacro\currentdelimitedtext \def\currentdelimitedtext{#1}% + \setlanguageparameter\delimitedtextparameter \let\currentparentdelimitedtext\currentdelimitedtext \global\advance\c_typo_delimited_nesting\plusone \edef\delimitedtextlevel{\number\c_typo_delimited_nesting}% @@ -297,9 +306,9 @@ \unexpanded\def\startdelimitedtext[#1]% {\begingroup \typo_delimited_push{#1}% - \dostarttagged\t!delimitedblock\currentdelimitedtext - \edef\p_method{\delimitedtextparameter\c!method}% - \ifx\p_method\s!font + \dostarttaggedchained\t!delimitedblock\currentdelimitedtext\??delimitedtext + \edef\p_delimited_method{\delimitedtextparameter\c!method}% + \ifx\p_delimited_method\s!font \expandafter\typo_delimited_start_font \else \expandafter\typo_delimited_start_other @@ -313,16 +322,16 @@ \ignorespaces} \def\typo_delimited_start_other - {\edef\p_repeat{\delimitedtextparameter\c!repeat}% - \ifx\p_repeat\v!yes + {\edef\p_delimited_repeat{\delimitedtextparameter\c!repeat}% + \ifx\p_delimited_repeat\v!yes \let\typo_delimited_repeat\typo_delimited_repeat_ideed \else \let\typo_delimited_repeat\relax \fi - \edef\p_location{\delimitedtextparameter\c!location}% - \ifx\p_location\v!paragraph + \edef\p_delimited_location{\delimitedtextparameter\c!location}% + \ifx\p_delimited_location\v!paragraph \singleexpandafter\typo_delimited_start_par - \else\ifx\p_location\v!margin + \else\ifx\p_delimited_location\v!margin \doubleexpandafter\typo_delimited_start_par \else \doubleexpandafter\typo_delimited_start_txt @@ -338,8 +347,10 @@ \def\typo_delimited_start_par_indeed[#1]% {\let\typo_delimited_stop\typo_delimited_stop_par - \doifsomething{\delimitedtextparameter\c!spacebefore} - {\blank[\delimitedtextparameter\c!spacebefore]}% + \edef\p_delimited_spacebefore{\delimitedtextparameter\c!spacebefore}% + \ifx\p_delimited_spacebefore\empty \else + \blank[\p_delimited_spacebefore]% + \fi \delimitedtextparameter\c!before \edef\m_typo_delimited_narrower{#1}% \ifx\m_typo_delimited_narrower\empty @@ -353,11 +364,21 @@ \fi % so far \pushmacro\checkindentation - \doifsomething{\delimitedtextparameter\c!indenting} % WS - {\setupindenting[\delimitedtextparameter\c!indenting]}% + \useindentingparameter\delimitedtextparameter + % \begingroup \usedelimitedtextstyleandcolor\c!style\c!color + % + \edef\p_delimited_left {\delimitedtextparameter{\c!left}}% + \edef\p_delimited_right {\delimitedtextparameter{\c!right}}% + \edef\p_delimited_nextleft {\delimitedtextparameter{\c!nextleft}}% + \edef\p_delimited_nextright{\delimitedtextparameter{\c!nextright}}% + % \leftdelimitedtextmark + % + \setnextleftdelimitedtextmark + \setnextrightdelimitedtextmark + % \ignorespaces} \def\typo_delimited_stop_par @@ -368,10 +389,12 @@ \popmacro\checkindentation \typo_delimited_stop_par_indeed \delimitedtextparameter\c!after - \doifsomething{\delimitedtextparameter\c!spaceafter} - {\blank[\delimitedtextparameter\c!spaceafter]}% + \edef\p_delimited_spaceafter{\delimitedtextparameter\c!spaceafter}% + \ifx\p_delimited_spaceafter\empty \else + \blank[\p_delimited_spaceafter]% + \fi \useindentnextparameter\delimitedtextparameter - \dorechecknextindentation}% AM: This was missing! + \aftergroup\dorechecknextindentation}% AM: This was missing! \def\typo_delimited_start_txt {\let\typo_delimited_stop\typo_delimited_stop_txt @@ -394,18 +417,18 @@ \unexpanded\def\delimitedtext[#1]% {\dontleavehmode % following ones can be omited \typo_delimited_push{#1}% - \edef\p_method{\delimitedtextparameter\c!method}% - \ifx\p_method\s!font + \edef\p_delimited_method{\delimitedtextparameter\c!method}% + \ifx\p_delimited_method\s!font \expandafter\typo_delimited_fontdriven \else \expandafter\typo_delimited_other \fi} \def\typo_delimited_other - {\edef\p_location{\delimitedtextparameter\c!location}% - \ifx\p_location\v!paragraph + {\edef\p_delimited_location{\delimitedtextparameter\c!location}% + \ifx\p_delimited_location\v!paragraph \singleexpandafter\typo_delimited_par - \else\ifx\p_location\v!margin + \else\ifx\p_delimited_location\v!margin \doubleexpandafter\typo_delimited_par \else \doubleexpandafter\typo_delimited_txt @@ -417,16 +440,89 @@ \unexpanded\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned \def\delimited {\delimitedtext} +% todo: \dostarttagged\t!nothing\empty % for left/right boxes + +%D We have 4 different location and symbol handlers (two pairs): +%D +%D \starttyping +%D \input tufte \startquotation \input tufte \stopquotation +%D +%D \setupdelimitedtext +%D [quotation] +%D [nextleft=right, +%D nextright=left] +%D +%D \input tufte \startquotation \input tufte \stopquotation +%D +%D \setupdelimitedtext +%D [quotation] +%D [nextleft={\symbol[nextleftquotation]}, +%D nextright={\symbol[nextrightquotation]}] +%D +%D \input tufte \startquotation \input tufte \stopquotation +%D \stoptyping + +\unexpanded\def\setnextleftdelimitedtextmark + {\ifx\p_delimited_nextleft\empty + % nothing + \else\ifx\p_delimited_nextleft\v!left + \typo_delimited_nextleft_symbol\p_delimited_left + \else\ifx\p_delimited_nextleft\v!right + \typo_delimited_nextleft_symbol\p_delimited_right + \else + \typo_delimited_nextleft_symbol\p_delimited_nextleft + \fi\fi\fi} + +\unexpanded\def\setnextrightdelimitedtextmark + {\ifx\p_delimited_nextright\empty + % nothing + \else\ifx\p_delimited_nextright\v!right + \typo_delimited_nextright_symbol\p_delimited_right + \else\ifx\p_delimited_nextright\v!left + \typo_delimited_nextright_symbol\p_delimited_left + \else + \typo_delimited_nextright_symbol\p_delimited_nextright + \fi\fi\fi} + \unexpanded\def\leftdelimitedtextmark - {\doifsomething{\delimitedtextparameter\c!left} - {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}% - \dontleavehmode - \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}% - \box\scratchbox}} + {\ifx\p_delimited_left\empty + % nothing + \else + \typo_delimited_left_symbol\p_delimited_left + \fi} \unexpanded\def\rightdelimitedtextmark - {\doifsomething{\delimitedtextparameter\c!right} - {\hsmash{\delimitedtextparameter\c!right}}} + {\ifx\p_delimited_right\empty + % nothing + \else + \typo_delimited_right_symbol\p_delimited_right + \fi} + +\def\typo_delimited_left_symbol#1% + {\setbox\scratchbox\hbox{\usedelimitedtextstyleandcolor\c!symstyle\c!symcolor#1}% + \dontleavehmode + \edef\p_delimited_margin{\delimitedtextparameter\c!location}% + \ifx\p_delimited_margin\v!margin + \hskip-\wd\scratchbox + \fi + \box\scratchbox} + +\def\typo_delimited_right_symbol#1% + {\hsmash{\usedelimitedtextstyleandcolor\c!symstyle\c!symcolor#1}} + +\def\typo_delimited_nextleft_symbol#1% + {\localleftbox\bgroup + \swapmacros\leftboundarycharacter\rightboundarycharacter + \boundarycharactermode\plusone + \typo_delimited_left_symbol#1% + \egroup} + +\def\typo_delimited_nextright_symbol#1% + {\localrightbox\bgroup + \swapmacros\leftboundarycharacter\rightboundarycharacter + \boundarycharactermode\plusone + \typo_delimited_right_symbol#1% + \egroup} % \starttext % \hyphenatedword{groepsvrijstellingsverordeningen}\par @@ -443,11 +539,12 @@ \def\typo_delimited_handle_middle#1% {\begingroup + \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor \setbox\scratchbox\hbox{\delimitedtextparameter#1}% \ifdim\wd\scratchbox>\zeropoint \ifdim\lastkern=\d_typo_delimited_signal \unkern - \hskip\hspaceamount\currentlanguage{interquotation}% + \hskip\hspaceamount\currentusedlanguage{interquotation}% \fi \ifhmode % else funny pagebeaks \penalty\plustenthousand @@ -462,14 +559,15 @@ \def\typo_delimited_handle_left#1% {\begingroup + \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor \setbox\scratchbox\hbox{\delimitedtextparameter#1}% \ifdim\wd\scratchbox>\zeropoint \ifdim\lastkern=\d_typo_delimited_signal \unkern - \hskip\hspaceamount\currentlanguage{interquotation}% + \hskip\hspaceamount\currentusedlanguage{interquotation}% \else\ifdim\lastskip=\d_typo_delimited_signal \unskip - \hskip\hspaceamount\currentlanguage{interquotation}% + \hskip\hspaceamount\currentusedlanguage{interquotation}% \fi\fi \strut % new, needed below \ifhmode % else funny pagebeaks @@ -485,16 +583,17 @@ \def\typo_delimited_handle_right#1% {\begingroup + \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor \setbox\scratchbox\hbox{\delimitedtextparameter#1}% \ifdim\wd\scratchbox>\zeropoint \ifdim\lastkern=\d_typo_delimited_signal \unkern \penalty\plustenthousand - \hskip\hspaceamount\currentlanguage{interquotation}% + \hskip\hspaceamount\currentusedlanguage{interquotation}% \else\ifdim\lastskip=\d_typo_delimited_signal \unskip \penalty\plustenthousand - \hskip\hspaceamount\currentlanguage{interquotation}% + \hskip\hspaceamount\currentusedlanguage{interquotation}% \fi\fi \ifhmode % else funny pagebeaks \penalty\plustenthousand @@ -508,21 +607,57 @@ \unexpanded\def\typo_delimited_par {\groupedcommand - {\dostarttagged\t!delimited\currentdelimitedtext % block? + {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext % block? \typo_delimited_handle_left\c!left} {\typo_delimited_handle_right\c!right \removelastskip \dostoptagged \typo_delimited_pop}} +% \unexpanded\def\typo_delimited_txt +% {\doifelse{\delimitedtextparameter\c!style}\v!normal +% \typo_delimited_quoted +% \typo_delimited_attributed} +% +% \def\typo_delimited_quoted_b +% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext +% \typo_delimited_handle_left\c!left} +% +% \def\typo_delimited_quoted_e +% {\typo_delimited_handle_right\c!right +% \removelastskip +% \dostoptagged +% \typo_delimited_pop} +% +% \def\typo_delimited_attributed_b +% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext +% \usedelimitedtextstyleandcolor\c!style\c!color} +% +% \def\typo_delimited_attributed_e +% {\dostoptagged +% \typo_delimited_pop} +% +% \def\typo_delimited_fontdriven_b +% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext +% \languageparameter{\c!left\currentparentdelimitedtext}}% was: \currentdelimitedtext +% +% \def\typo_delimited_fontdriven_e +% {\languageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext +% \dostoptagged +% \typo_delimited_pop} + \unexpanded\def\typo_delimited_txt - {\doifelse{\delimitedtextparameter\c!style}\v!normal - \typo_delimited_quoted - \typo_delimited_attributed} + {\edef\p_left_right{\delimitedtextparameter\c!left\delimitedtextparameter\c!right}% + \ifx\p_left_right\empty + \expandafter\typo_delimited_attributed + \else + \expandafter\typo_delimited_quoted + \fi} \def\typo_delimited_quoted_b - {\dostarttagged\t!delimited\currentdelimitedtext - \typo_delimited_handle_left\c!left} + {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext + \typo_delimited_handle_left\c!left + \usedelimitedtextstyleandcolor\c!style\c!color} \def\typo_delimited_quoted_e {\typo_delimited_handle_right\c!right @@ -531,7 +666,7 @@ \typo_delimited_pop} \def\typo_delimited_attributed_b - {\dostarttagged\t!delimited\currentdelimitedtext + {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext \usedelimitedtextstyleandcolor\c!style\c!color} \def\typo_delimited_attributed_e @@ -539,11 +674,12 @@ \typo_delimited_pop} \def\typo_delimited_fontdriven_b - {\dostarttagged\t!delimited\currentdelimitedtext - \languageparameter{\c!left\currentparentdelimitedtext}}% was: \currentdelimitedtext + {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext + \usedlanguageparameter{\c!left\currentparentdelimitedtext}% was: \currentdelimitedtext + \usedelimitedtextstyleandcolor\c!style\c!color} \def\typo_delimited_fontdriven_e - {\languageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext + {\usedlanguageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext \dostoptagged \typo_delimited_pop} diff --git a/Master/texmf-dist/tex/context/base/typo-dha.lua b/Master/texmf-dist/tex/context/base/typo-dha.lua index 3410c2dfca0..904b774ec30 100644 --- a/Master/texmf-dist/tex/context/base/typo-dha.lua +++ b/Master/texmf-dist/tex/context/base/typo-dha.lua @@ -64,7 +64,6 @@ local getlist = nuts.getlist local getfield = nuts.getfield local setfield = nuts.setfield local getattr = nuts.getattr -local setattr = nuts.setattr local getprop = nuts.getprop local setprop = nuts.setprop @@ -185,9 +184,9 @@ local function process(start) finidir = finish end if embedded <= 0 then - finish, autodir, done = "TRT", -1 + finish, autodir = "TRT", -1 else - finish, autodir, done = "TLT", 1 + finish, autodir = "TLT", 1 end done = true if finidir == finish then @@ -347,7 +346,7 @@ local function process(start) top = top - 1 end obsolete[#obsolete+1] = current - else + elseif trace_directions then setcolor(current) end else diff --git a/Master/texmf-dist/tex/context/base/typo-dig.lua b/Master/texmf-dist/tex/context/base/typo-dig.lua index 67849c6d47b..c753a03520a 100644 --- a/Master/texmf-dist/tex/context/base/typo-dig.lua +++ b/Master/texmf-dist/tex/context/base/typo-dig.lua @@ -103,15 +103,14 @@ end actions[1] = function(head,start,attr) local font = getfont(start) local char = getchar(start) - local unic = chardata[font][char].tounicode - local what = unic and tonumber(unic,16) or char - if charbase[what].category == "nd" then + local unic = chardata[font][char].unicode or char + if charbase[unic].category == "nd" then -- ignore unic tables local oldwidth = getfield(start,"width") local newwidth = getdigitwidth(font) if newwidth ~= oldwidth then if trace_digits then report_digits("digit trigger %a, instance %a, char %C, unicode %U, delta %s", - attr%100,div(attr,100),char,what,newwidth-oldwidth) + attr%100,div(attr,100),char,unic,newwidth-oldwidth) end head, start = nodes.aligned(head,start,start,newwidth,"middle") return head, start, true @@ -174,4 +173,8 @@ end -- interface -commands.setdigitsmanipulation = digits.set +interfaces.implement { + name = "setdigitsmanipulation", + actions = digits.set, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-dig.mkiv b/Master/texmf-dist/tex/context/base/typo-dig.mkiv index 71425c594a5..aa610b3c943 100644 --- a/Master/texmf-dist/tex/context/base/typo-dig.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-dig.mkiv @@ -39,7 +39,7 @@ %D \stoplines \unexpanded\def\setdigitsmanipulation[#1]% - {\ctxcommand{setdigitsmanipulation("#1")}} + {\clf_setdigitsmanipulation{#1}} \unexpanded\def\resetdigitsmanipulation {\attribute\digitsattribute\attributeunsetvalue} diff --git a/Master/texmf-dist/tex/context/base/typo-dir.lua b/Master/texmf-dist/tex/context/base/typo-dir.lua index e7d3c686c4f..482b7114d63 100644 --- a/Master/texmf-dist/tex/context/base/typo-dir.lua +++ b/Master/texmf-dist/tex/context/base/typo-dir.lua @@ -50,6 +50,8 @@ local tracers = nodes.tracers local setcolor = tracers.colors.set local resetcolor = tracers.colors.reset +local implement = interfaces.implement + local directions = typesetters.directions or { } typesetters.directions = directions @@ -137,9 +139,17 @@ function directions.setcolor(current,direction,reversed,mirror) end end -function commands.getbidimode(specification) - context(tomode(specification)) -- hash at tex end -end +implement { + name = "getbidimode", + actions = { tomode, context }, + arguments = { + { + { "scope" }, + { "method" }, + { "fences" }, + } + } +} local enabled = false @@ -190,4 +200,8 @@ function directions.set(n) -- todo: names and numbers texsetattribute(a_directions,n) end -commands.setdirection = directions.set +implement { + name = "setdirection", + arguments = "integer", + actions = directions.set +} diff --git a/Master/texmf-dist/tex/context/base/typo-dir.mkiv b/Master/texmf-dist/tex/context/base/typo-dir.mkiv index 0362af56cb0..f9b4ecb976c 100644 --- a/Master/texmf-dist/tex/context/base/typo-dir.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-dir.mkiv @@ -13,6 +13,9 @@ \writestatus{loading}{ConTeXt Typesetting Macros / Directions} +%D At some point we might default to method 'two' but first I need to make it more +%D efficient (and provide some options). I also want to have some basic tracing. + \unprotect \registerctxluafile{typo-dir}{1.001} @@ -33,10 +36,14 @@ \edef\righttoleftmark{\normalUchar"200F} \let\rlm\righttoleftmark \unexpanded\def\setdirection[#1]% todo: symbolic names - {\ctxcommand{setdirection(\number#1)}} + {\clf_setdirection#1\relax} + +% \unexpanded\def\resetdirection +% {\clf_setdirection\zerocount} +% +% is in fact: \unexpanded\def\resetdirection - %{\ctxcommand{setdirection(0)}} {\attribute\directionsattribute\attributeunsetvalue} \newconstant\directionsbidimode % this one might become pivate @@ -46,12 +53,14 @@ % \setupdirections[bidi=global,method=two] % \setupdirections[bidi=global,method=two,fences=no] +% maybee use chardefs + \def\typo_dir_get_mode - {\def\currentbidimode{\ctxcommand{getbidimode { - scope = "\directionsparameter\c!bidi ", - method = "\directionsparameter\c!method", - fences = "\directionsparameter\c!fences", - }}}% + {\def\currentbidimode{\clf_getbidimode + scope {\directionsparameter\c!bidi}% + method {\directionsparameter\c!method}% + fences {\directionsparameter\c!fences}% + }% \expandafter\glet\csname\??directionsbidimode\currentbidistamp\endcsname\currentbidimode} \appendtoks diff --git a/Master/texmf-dist/tex/context/base/typo-drp.lua b/Master/texmf-dist/tex/context/base/typo-drp.lua index 9151100b6f9..4bbf0b8e989 100644 --- a/Master/texmf-dist/tex/context/base/typo-drp.lua +++ b/Master/texmf-dist/tex/context/base/typo-drp.lua @@ -91,7 +91,27 @@ function initials.set(specification) texsetattribute(a_initial,1) end -commands.setinitial = initials.set +interfaces.implement { + name = "setinitial", + actions = initials.set, + arguments = { + { + { "location" }, + { "enabled", "boolean" }, + { "method" }, + { "distance" ,"dimen" }, + { "hoffset" ,"dimen" }, + { "voffset" ,"dimen" }, + { "font", "integer" }, + { "dynamic", "integer" }, + { "ca", "integer" }, + { "ma", "integer" }, + { "ta", "integer" }, + { "n", "integer" }, + { "m", "integer" }, + } + } +} -- dropped caps experiment (will be done properly when luatex -- stores the state in the local par node) .. btw, search still @@ -324,6 +344,15 @@ actions[v_default] = function(head,setting) if dynamic > 0 then setattr(current,0,dynamic) end +-- apply font + +-- local g = nodes.copy(tonode(current)) +-- g.subtype = 0 +-- nodes.handlers.characters(g) +-- nodes.handlers.protectglyphs(g) +-- setfield(current,"char",g.char) +-- nodes.free(g) + -- can be a helper if ca and ca > 0 then setattr(current,a_colorspace,ma == 0 and 1 or ma) diff --git a/Master/texmf-dist/tex/context/base/typo-drp.mkiv b/Master/texmf-dist/tex/context/base/typo-drp.mkiv index 3ac47466f7a..2520c3bfdef 100644 --- a/Master/texmf-dist/tex/context/base/typo-drp.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-drp.mkiv @@ -99,21 +99,21 @@ {\useinitialstyleparameter\c!style}% \useinitialcolorparameter\c!color \edef\p_text{\initialparameter\c!text}% optional - \ctxcommand{setinitial{ - location = "\initialparameter\c!location", - enabled = true, - n = \number\scratchcounter, - m = \number\initialparameter\c!m, - method = "\initialparameter\c!method", - distance = \number\scratchdistance, - hoffset = \number\scratchhoffset, - voffset = \number\scratchvoffset, - ma = \the\attribute\colormodelattribute, - ca = \the\attribute\colorattribute, - ta = \the\attribute\transparencyattribute, - font = \fontid\font, - dynamic = \number\attribute\zerocount, % it's a bit over the top to support this here - }}% + \clf_setinitial + location {\initialparameter\c!location}% + enabled true\space + n \scratchcounter + m \numexpr\initialparameter\c!m\relax + method {\initialparameter\c!method}% + distance \scratchdistance + hoffset \scratchhoffset + voffset \scratchvoffset + ma \attribute\colormodelattribute + ca \attribute\colorattribute + ta \attribute\transparencyattribute + font \fontid\font + dynamic \attribute\zerocount % it's a bit over the top to support this here + \relax \stopluacode \kern\zeropoint % we need a node \p_text diff --git a/Master/texmf-dist/tex/context/base/typo-dua.lua b/Master/texmf-dist/tex/context/base/typo-dua.lua index 73b00f033fd..1e9b325a623 100644 --- a/Master/texmf-dist/tex/context/base/typo-dua.lua +++ b/Master/texmf-dist/tex/context/base/typo-dua.lua @@ -710,7 +710,7 @@ local function apply_to_list(list,size,head,pardir) if enddir and getsubtype(current) == parfillskip_code then -- insert the last enddir before \parfillskip glue local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) enddir = false done = true @@ -719,7 +719,7 @@ local function apply_to_list(list,size,head,pardir) if begindir and getsubtype(current) == localpar_code then -- local_par should always be the 1st node local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) begindir = nil done = true @@ -727,7 +727,7 @@ local function apply_to_list(list,size,head,pardir) end if begindir then local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) done = true end @@ -739,7 +739,7 @@ local function apply_to_list(list,size,head,pardir) end if enddir then local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) done = true end diff --git a/Master/texmf-dist/tex/context/base/typo-dub.lua b/Master/texmf-dist/tex/context/base/typo-dub.lua index b6581137b80..a1c9de75245 100644 --- a/Master/texmf-dist/tex/context/base/typo-dub.lua +++ b/Master/texmf-dist/tex/context/base/typo-dub.lua @@ -65,7 +65,6 @@ local getid = nuts.getid local getsubtype = nuts.getsubtype local getlist = nuts.getlist local getattr = nuts.getattr -local setattr = nuts.setattr local getfield = nuts.getfield local setfield = nuts.setfield @@ -147,7 +146,7 @@ local report_directions = logs.reporter("typesetting","directions two") -- -- l : left to right -- r : right to left --- al : right to legt arabic (esp punctuation issues) +-- al : right to left arabic (esp punctuation issues) -- explicit: (new) -- @@ -327,7 +326,7 @@ end -- ש ( ל ( א ) כ ) 2-8,4-6 -- ש ( ל [ א ] כ ) 2-8,4-6 -function resolve_fences(list,size,start,limit) +local function resolve_fences(list,size,start,limit) -- N0: funny effects, not always better, so it's an options local stack = { } local top = 0 @@ -820,7 +819,7 @@ local function apply_to_list(list,size,head,pardir) if enddir and getsubtype(current) == parfillskip_code then -- insert the last enddir before \parfillskip glue local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) enddir = false done = true @@ -829,7 +828,7 @@ local function apply_to_list(list,size,head,pardir) if begindir and getsubtype(current) == localpar_code then -- local_par should always be the 1st node local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) begindir = nil done = true @@ -837,7 +836,7 @@ local function apply_to_list(list,size,head,pardir) end if begindir then local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) done = true end @@ -849,7 +848,7 @@ local function apply_to_list(list,size,head,pardir) end if enddir then local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) done = true end diff --git a/Master/texmf-dist/tex/context/base/typo-fln.lua b/Master/texmf-dist/tex/context/base/typo-fln.lua index 884a4c829f1..2076a7464ff 100644 --- a/Master/texmf-dist/tex/context/base/typo-fln.lua +++ b/Master/texmf-dist/tex/context/base/typo-fln.lua @@ -23,6 +23,9 @@ local firstlines = typesetters.firstlines local nodes = nodes local tasks = nodes.tasks +local context = context +local implement = interfaces.implement + local nuts = nodes.nuts local tonut = nuts.tonut local tonode = nuts.tonode @@ -85,7 +88,21 @@ function firstlines.set(specification) texsetattribute(a_firstline,1) end -commands.setfirstline = firstlines.set +implement { + name = "setfirstline", + actions = firstlines.set, + arguments = { + { + { "alternative" }, + { "font", "integer" }, + { "dynamic", "integer" }, + { "ma", "integer" }, + { "ca", "integer" }, + { "ta", "integer" }, + { "n", "integer" }, + } + } +} actions[v_line] = function(head,setting) -- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental @@ -262,7 +279,7 @@ end -- goodie -function commands.applytofirstcharacter(box,what) +local function applytofirstcharacter(box,what) local tbox = getbox(box) -- assumes hlist local list = getlist(tbox) local done = nil @@ -283,3 +300,9 @@ function commands.applytofirstcharacter(box,what) end end end + +implement { + name = "applytofirstcharacter", + actions = applytofirstcharacter, + arguments = { "integer", "string" } +} diff --git a/Master/texmf-dist/tex/context/base/typo-fln.mkiv b/Master/texmf-dist/tex/context/base/typo-fln.mkiv index c092fc922e4..38a53bfa973 100644 --- a/Master/texmf-dist/tex/context/base/typo-fln.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-fln.mkiv @@ -79,15 +79,15 @@ \begingroup \edef\currentfirstline{#1}% \usefirstlinestyleandcolor\c!style\c!color - \ctxcommand{setfirstline { - alternative = "\firstlineparameter\c!alternative", - ma = \the\attribute\colormodelattribute, - ca = \the\attribute\colorattribute, - ta = \the\attribute\transparencyattribute, - n = \number\firstlineparameter\c!n, - font = \fontid\font, - dynamic = \number\attribute\zerocount, - }}% + \clf_setfirstline + alternative {\firstlineparameter\c!alternative}% + ma \attribute\colormodelattribute + ca \attribute\colorattribute + ta \attribute\transparencyattribute + n \numexpr\firstlineparameter\c!n\relax + font \fontid\font + dynamic \attribute\zerocount + \relax \kern\zeropoint % we need a node % \hskip\zeropoint\s!plus\emwidth\relax % can be an option \endgroup @@ -104,7 +104,7 @@ \unexpanded\def\applytofirstcharacter#1% {\begingroup \dowithnextbox - {\ctxcommand{applytofirstcharacter(\number\nextbox,"\strippedcsname#1")}% + {\clf_applytofirstcharacter\nextbox{\strippedcsname#1}% \unhbox\nextbox \endgroup}% \hbox} diff --git a/Master/texmf-dist/tex/context/base/typo-inj.lua b/Master/texmf-dist/tex/context/base/typo-inj.lua new file mode 100644 index 00000000000..b5d9e1c513a --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-inj.lua @@ -0,0 +1,94 @@ +if not modules then modules = { } end modules ['typo-inj'] = { -- was node-par + version = 1.001, + comment = "companion to typo-inj.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local tonumber = tonumber + +local context = context +local implement = interfaces.implement + +local injectors = { } +typesetters.injectors = injectors +local list = { } +injectors.list = list +local showall = false + +local settings_to_array = utilities.parsers.settings_to_array + +local ctx_domarkinjector = context.domarkinjector +local ctx_doactivateinjector = context.doactivateinjector + +table.setmetatableindex(list,function(t,k) + local v = { + counter = 0, + actions = { }, + show = false, + active = false, + } + t[k] = v + return v +end) + +function injectors.reset(name) + list[name] = nil +end + +function injectors.set(name,numbers,command) + local injector = list[name] + local actions = injector.actions + local places = settings_to_array(numbers) + for i=1,#places do + actions[tonumber(places[i])] = command + end + if not injector.active then + ctx_doactivateinjector(name) + injector.active = true + end +end + +function injectors.show(name) + if not name or name == "" then + showall = true + else + local list = settings_to_array(name) + for i=1,#list do + list[list[i]].show = true + end + end +end + +function injectors.mark(name,show) + local injector = list[name] + local n = injector.counter + 1 + injector.counter = n + if showall or injector.show then + ctx_domarkinjector(injector.actions[n] and 1 or 0,n) + end +end + +function injectors.check(name,n) -- we could also accent n = number : +/- 2 + local injector = list[name] + if n == false then + n = injector.counter + elseif n == nil then + n = injector.counter + 1 -- next (upcoming) + else + n = tonumber(n) or 0 + end + local action = injector.actions[n] + if action then + context(action) + end +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 = "markinjector", actions = injectors.mark, arguments = "string" } +implement { name = "checkinjector", actions = injectors.check, arguments = "string" } +implement { name = "checkpreviousinjector", actions = injectors.check, arguments = { "string", true } } +implement { name = "checknextinjector", actions = injectors.check } diff --git a/Master/texmf-dist/tex/context/base/typo-inj.mkiv b/Master/texmf-dist/tex/context/base/typo-inj.mkiv new file mode 100644 index 00000000000..46cd9fe4599 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-inj.mkiv @@ -0,0 +1,77 @@ +%D \module +%D [ file=typo-inj, +%D version=2014.10.13, +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Triggering Actions, +%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. + +\writestatus{loading}{ConTeXt Typesetting Macros / Triggering Actions} + +%D This is a sort of escape from too automatic typesetting of lists. I have +%D been thinking fo a more generic injector for instance based on tags (as we +%D already index each element) but thi sis sort of fuzzy because the number of a +%D tag is not always incremented before we check for it. Also, registers and lists +%D are among the few candidates that cannot be controlled directly by putting +%D something in the input. So,m for the moment I stick to this mechanism but +%D future versions of \CONTEXT\ might do it differently. Compatibility is not much +%D of an issue here as this mechanism is only to be used in final production runs. + +\unprotect + +\registerctxluafile{typo-inj}{1.001} + +% todo: no need in trialmode + +%D \showinjector +%D +%D \setinjector[register][3][\column] +%D \setinjector[list] [2][{\blank[3*big]}] +%D +%D \starttext +%D \placelist[section][criterium=text] +%D \blank[3*big] +%D \placeregister[index][criterium=text] +%D \page +%D \startsection[title=Alpha] first \index{first} \stopsection +%D \startsection[title=Beta] second \index{second} \stopsection +%D \startsection[title=Gamma] third \index{third} \stopsection +%D \startsection[title=Delta] fourth \index{fourth} \stopsection +%D \stoptext + +\unexpanded\def\resetinjector [#1]{\clf_resetinjector{#1}} +\unexpanded\def\markinjector [#1]{\dontleavehmode\clf_markinjector{#1}} +\unexpanded\def\checkinjector [#1]{\clf_checkinjector{#1}} +\unexpanded\def\checknextinjector {\clf_checknextinjector} +\unexpanded\def\checkpreviousinjector {\clf_checkpreviousinjector} +\unexpanded\def\dosetinjector [#1][#2][#3]{\clf_setinjector{#1}{#2}{#3}} +\unexpanded\def\doshowinjector [#1]{\clf_showinjector{#1}} + +\unexpanded\def\setinjector {\dotripleargument\dosetinjector} +\unexpanded\def\showinjector{\dosingleempty\doshowinjector} + +\unexpanded\def\domarkinjector#1#2% called at the lua end + {\dontleavehmode\llap{\infofont\ifcase#1\else\red\fi<#2>\quad}} + +% low level definers .. we could have \injectors_mark and \injectors_check and then +% use \v!list instead of \s!list + +\unexpanded\def\doinstallinjector#1% + {\letvalue{typo_injectors_mark_#1}\donothing + \letvalue{typo_injectors_check_#1}\donothing} + +\unexpanded\def\doactivateinjector#1% used at lua end + {\setuxvalue{typo_injectors_mark_#1}{\dontleavehmode\noexpand\clf_markinjector{#1}}% + \setuxvalue{typo_injectors_check_#1}{\noexpand\clf_checkinjector{#1}}} + +\unexpanded\def\dotestinjector#1% only for testing outside unprotect + {\csname typo_injectors_check_#1\endcsname + \csname typo_injectors_mark_#1\endcsname} + +\protect \endinput + diff --git a/Master/texmf-dist/tex/context/base/typo-itc.lua b/Master/texmf-dist/tex/context/base/typo-itc.lua index 7373c0321fb..f37549dc830 100644 --- a/Master/texmf-dist/tex/context/base/typo-itc.lua +++ b/Master/texmf-dist/tex/context/base/typo-itc.lua @@ -32,6 +32,7 @@ local tonode = nuts.tonode local tonut = nuts.tonut local getfield = nuts.getfield +local getprev = nuts.getprev local getnext = nuts.getnext local getid = nuts.getid local getfont = nuts.getfont @@ -42,6 +43,7 @@ local setattr = nuts.setattr local insert_node_after = nuts.insert_after local delete_node = nuts.delete local end_of_math = nuts.end_of_math +local find_tail = nuts.tail local texgetattribute = tex.getattribute local texsetattribute = tex.setattribute @@ -56,6 +58,8 @@ local fontdata = fonthashes.identifiers local italicsdata = fonthashes.italics local exheights = fonthashes.exheights +local implement = interfaces.implement + local forcedvariant = false function typesetters.italics.forcevariant(variant) @@ -98,16 +102,55 @@ end -- todo: clear attribute +local function okay(data,current,font,prevchar,previtalic,char,what) + if not data then + if trace_italics then + report_italics("ignoring %p between %s italic %C and italic %C",previtalic,what,prevchar,char) + end + return false + end + if threshold then + local ht = getfield(current,"height") + local ex = exheights[font] + local th = threshold * ex + if ht <= th then + if trace_italics then + report_italics("ignoring correction between %s italic %C and regular %C, height %p less than threshold %p",prevchar,what,char,ht,th) + end + return false + end + end + if trace_italics then + report_italics("inserting %p between %s italic %C and regular %C",previtalic,what,prevchar,char) + end + return true +end + function italics.handler(head) - head = tonut(head) - local done = false - local italic = 0 - local lastfont = nil - local lastattr = nil - local previous = nil - local prevchar = nil - local current = head - local inserted = nil + + local prev = nil + local prevchar = nil + local prevhead = tonut(head) + local previtalic = 0 + local previnserted = nil + + local replace = nil + local replacechar = nil + local replacehead = nil + local replaceitalic = 0 + local replaceinserted = nil + + local post = nil + local postchar = nil + local posthead = nil + local postitalic = 0 + local postinserted = nil + + local current = prevhead + local done = false + local lastfont = nil + local lastattr = nil + while current do local id = getid(current) if id == glyph_code then @@ -115,40 +158,45 @@ function italics.handler(head) local char = getchar(current) local data = italicsdata[font] if font ~= lastfont then - if italic ~= 0 then - if data then - if trace_italics then - report_italics("ignoring %p between italic %C and italic %C",italic,prevchar,char) + if previtalic ~= 0 then + if okay(data,current,font,prevchar,previtalic,char,"glyph") then + insert_node_after(prevhead,prev,new_correction_kern(previtalic)) + done = true + end + elseif previnserted and data then + if trace_italics then + report_italics("deleting last correction before %s %C",char,"glyph") + end + delete_node(prevhead,previnserted) + else + -- + if replaceitalic ~= 0 then + if okay(data,replace,font,replacechar,replaceitalic,char,"replace") then + insert_node_after(replacehead,replace,new_correction_kern(replaceitalic)) + done = true end - else - local okay = true - if threshold then - local ht = getfield(current,"height") - local ex = exheights[font] - local th = threshold * ex - if ht <= th then - if trace_italics then - report_italics("ignoring correction between italic %C and regular %C, height %p less than threshold %p",prevchar,char,ht,th) - end - okay = false - end + replaceitalic = 0 + elseif replaceinserted and data then + if trace_italics then + report_italics("deleting last correction before %s %C","replace",char) end - if okay then - if trace_italics then - report_italics("inserting %p between italic %C and regular %C",italic,prevchar,char) - end - insert_node_after(head,previous,new_correction_kern(italic)) + delete_node(replacehead,replaceinserted) + end + -- + if postitalic ~= 0 then + if okay(data,post,font,postchar,postitalic,char,"post") then + insert_node_after(posthead,post,new_correction_kern(postitalic)) done = true end + postitalic = 0 + elseif postinserted and data then + if trace_italics then + report_italics("deleting last correction before %s %C","post",char) + end + delete_node(posthead,postinserted) end - elseif inserted and data then - if trace_italics then - report_italics("deleting last correction before %C",char) - end - delete_node(head,inserted) - else - -- nothing end + -- lastfont = font end if data then @@ -157,63 +205,240 @@ function italics.handler(head) local cd = data[char] if not cd then -- this really can happen - italic = 0 + previtalic = 0 else - italic = cd.italic or cd.italic_correction - if not italic then - italic = setitalicinfont(font,char) -- calculated once - -- italic = 0 + previtalic = cd.italic or cd.italic_correction + if not previtalic then + previtalic = setitalicinfont(font,char) -- calculated once + -- previtalic = 0 end - if italic ~= 0 then + if previtalic ~= 0 then lastfont = font lastattr = attr - previous = current + prev = current + -- prevhead = head prevchar = char end end else - italic = 0 + previtalic = 0 end else - italic = 0 + previtalic = 0 end - inserted = nil + previnserted = nil + replaceinserted = nil + postinserted = nil elseif id == disc_code then - -- skip - elseif id == kern_code then - inserted = nil - italic = 0 + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + replace = getfield(current,"replace") + if replace then + local current = find_tail(replace) + if getid(current) ~= glyph_code then + current = getprev(current) + end + if current and getid(current) == glyph_code then + local font = getfont(current) + local char = getchar(current) + local data = italicsdata[font] + if data then + local attr = forcedvariant or getattr(current,a_italics) + if attr and attr > 0 then + local cd = data[char] + if not cd then + -- this really can happen + replaceitalic = 0 + else + replaceitalic = cd.italic or cd.italic_correction + if not replaceitalic then + replaceitalic = setitalicinfont(font,char) -- calculated once + -- replaceitalic = 0 + end + if replaceitalic ~= 0 then + lastfont = font + lastattr = attr + replacechar = char + replacehead = replace + replace = current + end + end +-- else +-- replaceitalic = 0 + end +-- else +-- replaceitalic = 0 + end +-- else +-- replaceitalic = 0 + end +-- replaceinserted = nil +-- else +-- replaceitalic = 0 +-- replaceinserted = nil + end + post = getfield(current,"post") + if post then + local current = find_tail(post) + if getid(current) ~= glyph_code then + current = getprev(current) + end + if current and getid(current) == glyph_code then + local font = getfont(current) + local char = getchar(current) + local data = italicsdata[font] + if data then + local attr = forcedvariant or getattr(current,a_italics) + if attr and attr > 0 then + local cd = data[char] + if not cd then + -- this really can happen +-- postitalic = 0 + else + postitalic = cd.italic or cd.italic_correction + if not postitalic then + postitalic = setitalicinfont(font,char) -- calculated once + -- postitalic = 0 + end + if postitalic ~= 0 then + lastfont = font + lastattr = attr + postchar = char + posthead = post + post = current + end + end +-- else +-- postitalic = 0 + end +-- else +-- postitalic = 0 + end +-- else +-- postitalic = 0 + end +-- postinserted = nil +-- else +-- postitalic = 0 +-- postinserted = nil + end + elseif id == kern_code then -- how about fontkern ? + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 elseif id == glue_code then - if italic ~= 0 then + if previtalic ~= 0 then if trace_italics then - report_italics("inserting %p between italic %C and glue",italic,prevchar) + report_italics("inserting %p between %s italic %C and glue",previtalic,"glyph",prevchar) + end + previnserted = new_correction_glue(previtalic) -- maybe just add ? else problem with penalties + previtalic = 0 + done = true + insert_node_after(prevhead,prev,previnserted) + else + if replaceitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and glue",replaceitalic,"replace",replacechar) + end + replaceinserted = new_correction_kern(replaceitalic) -- needs to be a kern + replaceitalic = 0 + done = true + insert_node_after(replacehead,replace,replaceinserted) + end + if postitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and glue",postitalic,"post",postchar) + end + postinserted = new_correction_kern(postitalic) -- needs to be a kern + postitalic = 0 + done = true + insert_node_after(posthead,post,postinserted) end - inserted = new_correction_glue(italic) -- maybe just add ? else problem with penalties - insert_node_after(head,previous,inserted) - italic = 0 - done = true end elseif id == math_code then current = end_of_math(current) - elseif italic ~= 0 then - if trace_italics then - report_italics("inserting %p between italic %C and whatever",italic,prevchar) + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + else + if previtalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and whatever",previtalic,"glyph",prevchar) + end + insert_node_after(prevhead,prev,new_correction_kern(previtalic)) + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + done = true + else + if replaceitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and whatever",replaceritalic,"replace",replacechar) + end + insert_node_after(replacehead,replace,new_correction_kern(replaceitalic)) + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + done = true + end + if postitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and whatever",postitalic,"post",postchar) + end + insert_node_after(posthead,post,new_correction_kern(postitalic)) + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + done = true + end end - inserted = nil - insert_node_after(head,previous,new_correction_kern(italic)) - italic = 0 - done = true end current = getnext(current) end - if italic ~= 0 and lastattr > 1 then -- more control is needed here - if trace_italics then - report_italics("inserting %p between italic %C and end of list",italic,prevchar) + if lastattr and lastattr > 1 then -- more control is needed here + if previtalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and end of list",previtalic,"glyph",prevchar) + end + insert_node_after(prevhead,prev,new_correction_kern(previtalic)) + done = true + else + if replaceitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and end of list",replaceitalic,"replace",replacechar) + end + insert_node_after(replacehead,replace,new_correction_kern(replaceitalic)) + done = true + end + if postitalic ~= 0 then + if trace_italics then + report_italics("inserting %p between %s italic %C and end of list",postitalic,"post",postchar) + end + insert_node_after(posthead,post,new_correction_kern(postitalic)) + done = true + end end - insert_node_after(head,previous,new_correction_kern(italic)) - done = true end - return tonode(head), done + return head, done end local enable @@ -241,10 +466,21 @@ function italics.reset() texsetattribute(a_italics,unsetvalue) end +implement { + name = "setitaliccorrection", + actions = italics.set, + arguments = "string" +} + +implement { + name = "resetitaliccorrection", + actions = italics.reset, +} + local variables = interfaces.variables local settings_to_hash = utilities.parsers.settings_to_hash -function commands.setupitaliccorrection(option) -- no grouping ! +local function setupitaliccorrection(option) -- no grouping ! if enable then enable() end @@ -268,16 +504,28 @@ function commands.setupitaliccorrection(option) -- no grouping ! end end +implement { + name = "setupitaliccorrection", + actions = setupitaliccorrection, + arguments = "string" +} + -- for manuals: local stack = { } -function commands.pushitaliccorrection() - table.insert(stack,{forcedvariant, texgetattribute(a_italics) }) -end +implement { + name = "pushitaliccorrection", + actions = function() + table.insert(stack,{forcedvariant, texgetattribute(a_italics) }) + end +} -function commands.popitaliccorrection() - local top = table.remove(stack) - forcedvariant = top[1] - texsetattribute(a_italics,top[2]) -end +implement { + name = "popitaliccorrection", + actions = function() + local top = table.remove(stack) + forcedvariant = top[1] + texsetattribute(a_italics,top[2]) + end +} diff --git a/Master/texmf-dist/tex/context/base/typo-itc.mkvi b/Master/texmf-dist/tex/context/base/typo-itc.mkvi index 4a3bba51850..c0aa8e2f6dd 100644 --- a/Master/texmf-dist/tex/context/base/typo-itc.mkvi +++ b/Master/texmf-dist/tex/context/base/typo-itc.mkvi @@ -42,10 +42,10 @@ % 2 = end of word and end of a list \unexpanded\def\setitaliccorrection[#code]% rather low level (might go away) - {\ctxlua{typesetters.italics.set(\number#code)}} + {\clf_setitaliccorrection#code\relax} \unexpanded\def\resetitaliccorrection% rather low level (might go away) - {\ctxlua{typesetters.italics.reset()}} + {\clf_resetitaliccorrection} % global : no attributes, just always (faster and less memory) % text : only text @@ -53,7 +53,7 @@ % none : - \unexpanded\def\setupitaliccorrection[#settings]% - {\ctxcommand{setupitaliccorrection("#settings")}} + {\clf_setupitaliccorrection{#settings}} \appendtoks \attribute\italicsattribute\attributeunsetvalue diff --git a/Master/texmf-dist/tex/context/base/typo-itm.mkiv b/Master/texmf-dist/tex/context/base/typo-itm.mkiv index eb47e407616..0bb8170c721 100644 --- a/Master/texmf-dist/tex/context/base/typo-itm.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-itm.mkiv @@ -109,9 +109,9 @@ \let\p_typo_items_symbol\empty \let\m_typo_items_symbol\firstofoneargument \else - \doifconversiondefinedelse\p_typo_items_symbol + \doifelseconversiondefined\p_typo_items_symbol {\def\m_typo_items_symbol{\convertnumber\p_typo_items_symbol}} - {\doifsymboldefinedelse\p_typo_items_symbol + {\doifelsesymboldefined\p_typo_items_symbol {\def\m_typo_items_symbol{\symbol[\p_typo_items_symbol]\gobbleoneargument}} {\let\m_typo_items_symbol\firstofoneargument}}% \fi\fi diff --git a/Master/texmf-dist/tex/context/base/typo-krn.lua b/Master/texmf-dist/tex/context/base/typo-krn.lua index a8ffe557be4..46a977cfd49 100644 --- a/Master/texmf-dist/tex/context/base/typo-krn.lua +++ b/Master/texmf-dist/tex/context/base/typo-krn.lua @@ -11,7 +11,8 @@ if not modules then modules = { } end modules ['typo-krn'] = { local next, type, tonumber = next, type, tonumber local utfchar = utf.char -local nodes, node, fonts = nodes, node, fonts +local nodes = nodes +local fonts = fonts local tasks = nodes.tasks local nuts = nodes.nuts @@ -20,11 +21,10 @@ local nodepool = nuts.pool local tonode = nuts.tonode local tonut = nuts.tonut +-- check what is used + local find_node_tail = nuts.tail local free_node = nuts.free -local free_nodelist = nuts.flush_list -local copy_node = nuts.copy -local copy_nodelist = nuts.copy_list local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local end_of_math = nuts.end_of_math @@ -51,6 +51,7 @@ local nodecodes = nodes.nodecodes local kerncodes = nodes.kerncodes local skipcodes = nodes.skipcodes local disccodes = nodes.disccodes +local listcodes = nodes.listcodes local glyph_code = nodecodes.glyph local kern_code = nodecodes.kern @@ -60,7 +61,12 @@ local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local math_code = nodecodes.math +local box_list_code = listcodes.box +local user_list_code = listcodes.unknown + local discretionary_code = disccodes.discretionary +local automatic_code = disccodes.automatic + local kerning_code = kerncodes.kerning local userkern_code = kerncodes.userkern local userskip_code = skipcodes.userskip @@ -203,39 +209,200 @@ local function spec_injector(fillup,width,stretch,shrink) end end --- needs checking ... base mode / node mode -- also use insert_before/after etc +-- a simple list injector, no components and such .. just disable ligatures in +-- kern mode .. maybe not even hyphenate ... anyway, the next one is for simple +-- sublists .. beware: we can have char -1 + +local function inject_begin(boundary,prev,keeptogether,krn,ok) -- prev is a glyph + local id = getid(boundary) + if id == kern_code then + if getsubtype(boundary) == kerning_code or getattr(boundary,a_fontkern) then + local inject = true + if keeptogether then + local next = getnext(boundary) + if not next or (getid(next) == glyph_code and keeptogether(prev,next)) then + inject = false + end + end + if inject then + -- not yet ok, as injected kerns can be overlays (from node-inj.lua) + setfield(boundary,"subtype",userkern_code) + setfield(boundary,"kern",getfield(boundary,"kern") + quaddata[getfont(prev)]*krn) + return boundary, true + end + end + elseif id == glyph_code then + if keeptogether and keeptogether(boundary,prev) then + -- keep 'm + else + local charone = getchar(prev) + if charone > 0 then + local font = getfont(boundary) + local chartwo = getchar(boundary) + local kerns = chardata[font][charone].kerns + local kern = new_kern((kerns and kerns[chartwo] or 0) + quaddata[font]*krn) + setfield(boundary,"prev",kern) + setfield(kern,"next",boundary) + return kern, true + end + end + end + return boundary, ok +end + +local function inject_end(boundary,next,keeptogether,krn,ok) + local tail = find_node_tail(boundary) + local id = getid(tail) + if id == kern_code then + if getsubtype(tail) == kerning_code or getattr(tail,a_fontkern) then + local inject = true + if keeptogether then + local prev = getprev(tail) + if getid(prev) == glyph_code and keeptogether(prev,two) then + inject = false + end + end + if inject then + -- not yet ok, as injected kerns can be overlays (from node-inj.lua) + setfield(tail,"subtype",userkern_code) + setfield(tail,"kern",getfield(tail,"kern") + quaddata[getfont(next)]*krn) + return boundary, true + end + end + elseif id == glyph_code then + if keeptogether and keeptogether(tail,two) then + -- keep 'm + else + local charone = getchar(tail) + if charone > 0 then + local font = getfont(tail) + local chartwo = getchar(next) + local kerns = chardata[font][charone].kerns + local kern = (kerns and kerns[chartwo] or 0) + quaddata[font]*krn + insert_node_after(boundary,tail,new_kern(kern)) + return boundary, true + end + end + end + return boundary, ok +end -local function do_process(head,force) -- todo: glue so that we can fully stretch - local start, done, lastfont = head, false, nil +local function process_list(head,keeptogether,krn,font,okay) + local start = head + local prev = nil + local pid = nil + local kern = 0 + local mark = font and markdata[font] + while start do + local id = getid(start) + if id == glyph_code then + if not font then + font = getfont(start) + mark = markdata[font] + kern = quaddata[font]*krn + end + if prev then + local char = getchar(start) + if mark[char] then + -- skip + elseif pid == kern_code then + if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then + local inject = true + if keeptogether then + local prevprev = getprev(prev) + if getid(prevprev) == glyph_code and keeptogether(prevprev,start) then + inject = false + end + end + if inject then + -- not yet ok, as injected kerns can be overlays (from node-inj.lua) + setfield(prev,"subtype",userkern_code) + setfield(prev,"kern",getfield(prev,"kern") + kern) + okay = true + end + end + elseif pid == glyph_code then + if keeptogether and keeptogether(prev,start) then + -- keep 'm + else + local prevchar = getchar(prev) + local kerns = chardata[font][prevchar].kerns + -- if kerns then + -- print("it happens indeed, basemode kerns not yet injected") + -- end + insert_node_before(head,start,new_kern((kerns and kerns[char] or 0) + kern)) + okay = true + end + end + end + end + if start then + prev = start + pid = id + start = getnext(start) + end + end + return head, okay, prev +end + +local function closest_bound(b,get) + b = get(b) + if b and getid(b) ~= glue_code then + while b do + if not getattr(b,a_kerns) then + break + elseif getid(b) == glyph_code then + return b, getfont(b) + else + b = get(b) + end + end + end +end + +function kerns.handler(head) + local head = tonut(head) + local start = head + local done = false + local lastfont = nil local keepligature = kerns.keepligature local keeptogether = kerns.keeptogether - local fillup = false + local fillup = false + local bound = false + local prev = nil + local previd = nil + local prevchar = nil + local prevfont = nil + local prevmark = nil while start do - -- faster to test for attr first - local attr = force or getattr(start,a_kerns) + -- fontkerns don't get the attribute but they always sit between glyphs so + -- are always valid bound .. disc nodes also somtimes don't get them + local id = getid(start) + local attr = getattr(start,a_kerns) if attr and attr > 0 then - setattr(start,a_kerns,unsetvalue) + setattr(start,a_kerns,0) -- unsetvalue) local krn = mapping[attr] if krn == v_max then - krn = .25 + krn = .25 fillup = true else fillup = false end - if krn and krn ~= 0 then - local id = getid(start) - if id == glyph_code then -- we could use the subtype ligature - lastfont = getfont(start) - local c = getfield(start,"components") - if not c then - -- fine - elseif keepligature and keepligature(start) then - -- keep 'm - else - c = do_process(c,attr) + if not krn or krn == 0 then + bound = false + elseif id == glyph_code then -- we could use the subtype ligature + local c = getfield(start,"components") + if not c then + -- fine + elseif keepligature and keepligature(start) then + -- keep 'm + c = nil + else + while c do local s = start - local p, n = getprev(s), getnext(s) - local tail = find_node_tail(c) + local t = find_node_tail(c) + local p = getprev(s) + local n = getnext(s) if p then setfield(p,"next",c) setfield(c,"prev",p) @@ -243,165 +410,190 @@ local function do_process(head,force) -- todo: glue so that we can fully stretch head = c end if n then - setfield(n,"prev",tail) + setfield(n,"prev",t) + setfield(t,"next",n) end - setfield(tail,"next",n) start = c setfield(s,"components",nil) - -- we now leak nodes ! - -- free_node(s) - done = true + free_node(s) + c = getfield(start,"components") end - local prev = getprev(start) - if not prev then - -- skip - elseif markdata[lastfont][getchar(start)] then - -- skip - else - local pid = getid(prev) - if not pid then - -- nothing - elseif pid == kern_code then - if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then - if keeptogether and getid(getprev(prev)) == glyph_code and keeptogether(getprev(prev),start) then -- we could also pass start - -- keep 'm - else - -- not yet ok, as injected kerns can be overlays (from node-inj.lua) - setfield(prev,"subtype",userkern_code) - setfield(prev,"kern",getfield(prev,"kern") + quaddata[lastfont]*krn) -- here - done = true - end - end - elseif pid == glyph_code then - if getfont(prev) == lastfont then - local prevchar, lastchar = getchar(prev), getchar(start) - if keeptogether and keeptogether(prev,start) then - -- keep 'm - else - local kerns = chardata[lastfont][prevchar].kerns - local kern = kerns and kerns[lastchar] or 0 - krn = kern + quaddata[lastfont]*krn -- here - insert_node_before(head,start,kern_injector(fillup,krn)) - done = true - end - else - krn = quaddata[lastfont]*krn -- here - insert_node_before(head,start,kern_injector(fillup,krn)) - done = true - end - elseif pid == disc_code then - -- a bit too complicated, we can best not copy and just calculate - -- but we could have multiple glyphs involved so ... - local disc = prev -- disc - local prv, nxt = getprev(disc), getnext(disc) - if getsubtype(disc) == discretionary_code then - -- maybe we should forget about this variant as there is no glue - -- possible - local pre, post, replace = getfield(disc,"pre"), getfield(disc,"post"), getfield(disc,"replace") - if pre and prv then -- must pair with getprev(start) - local before = copy_node(prv) - setfield(pre,"prev",before) - setfield(before,"next",pre) - setfield(before,"prev",nil) - pre = do_process(before,attr) - pre = getnext(pre) - setfield(pre,"prev",nil) - setfield(disc,"pre",pre) - free_node(before) - end - if post and nxt then -- must pair with start - local after = copy_node(nxt) - local tail = find_node_tail(post) - setfield(tail,"next",after) - setfield(after,"prev",tail) - setfield(after,"next",nil) - post = do_process(post,attr) - setfield(tail,"next",nil) - setfield(disc,"post",post) - free_node(after) - end - if replace and prv and nxt then -- must pair with start and start.prev - local before = copy_node(prv) - local after = copy_node(nxt) - local tail = find_node_tail(replace) - setfield(replace,"prev",before) - setfield(before,"next",replace) - setfield(before,"prev",nil) - setfield(tail,"next",after) - setfield(after,"prev",tail) - setfield(after,"next",nil) - replace = do_process(before,attr) - replace = getnext(replace) - setfield(replace,"prev",nil) - setfield(getfield(after,"prev"),"next",nil) - setfield(disc,"replace",replace) - free_node(after) - free_node(before) - elseif prv and getid(prv) == glyph_code and getfont(prv) == lastfont then - local prevchar, lastchar = getchar(prv), getchar(start) - local kerns = chardata[lastfont][prevchar].kerns - local kern = kerns and kerns[lastchar] or 0 - krn = kern + quaddata[lastfont]*krn -- here - setfield(disc,"replace",kern_injector(false,krn)) -- only kerns permitted, no glue - else - krn = quaddata[lastfont]*krn -- here - setfield(disc,"replace",kern_injector(false,krn)) -- only kerns permitted, no glue - end - else - -- this one happens in most cases: automatic (-), explicit (\-), regular (patterns) - if prv and getid(prv) == glyph_code and getfont(prv) == lastfont then - -- the normal case - local prevchar, lastchar = getchar(prv), getchar(start) - local kerns = chardata[lastfont][prevchar].kerns - local kern = kerns and kerns[lastchar] or 0 - krn = kern + quaddata[lastfont]*krn - else - krn = quaddata[lastfont]*krn - end - insert_node_before(head,start,kern_injector(fillup,krn)) + end + local char = getchar(start) + local font = getfont(start) + local mark = markdata[font] + if not bound then + -- yet + elseif mark[char] then + -- skip + elseif previd == kern_code then + if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then + local inject = true + if keeptogether then + if previd == glyph_code and keeptogether(prev,start) then + inject = false end end + if inject then + -- not yet ok, as injected kerns can be overlays (from node-inj.lua) + setfield(prev,"subtype",userkern_code) + setfield(prev,"kern",getfield(prev,"kern") + quaddata[font]*krn) + done = true + end end - elseif id == glue_code then - local subtype = getsubtype(start) - if subtype == userskip_code or subtype == xspaceskip_code or subtype == spaceskip_code then - local s = getfield(start,"spec") - local w = getfield(s,"width") - if w > 0 then - local width, stretch, shrink = w+gluefactor*w*krn, getfield(s,"stretch"), getfield(s,"shrink") - setfield(start,"spec",spec_injector(fillup,width,stretch*width/w,shrink*width/w)) + elseif previd == glyph_code then + if prevfont == font then + if keeptogether and keeptogether(prev,start) then + -- keep 'm + else + local kerns = chardata[font][prevchar].kerns + local kern = (kerns and kerns[char] or 0) + quaddata[font]*krn + insert_node_before(head,start,kern_injector(fillup,kern)) done = true end + else + insert_node_before(head,start,kern_injector(fillup,quaddata[font]*krn)) + done = true end - elseif id == kern_code then - -- if getsubtype(start) == kerning_code then -- handle with glyphs - -- local sk = getfield(start,"kern") - -- if sk > 0 then - -- setfield(start,"kern",sk*krn) - -- done = true - -- end - -- end - elseif lastfont and (id == hlist_code or id == vlist_code) then -- todo: lookahead - local p = getprev(start) - if p and getid(p) ~= glue_code then - insert_node_before(head,start,kern_injector(fillup,quaddata[lastfont]*krn)) + end + prev = start + prevchar = char + prevfont = font + prevmark = mark + previd = id + bound = true + elseif id == disc_code then + local prev, next, pglyph, nglyph -- delayed till needed + local subtype = getsubtype(start) + if subtype == automatic_code then + -- this is kind of special, as we have already injected the + -- previous kern + local prev = getprev(start) + local pglyph = prev and getid(prev) == glyph_code + languages.expand(start,pglyph and prev) + -- we can have a different start now + elseif subtype ~= discretionary_code then + prev = getprev(start) + pglyph = prev and getid(prev) == glyph_code + languages.expand(start,pglyph and prev) + end + local pre = getfield(start,"pre") + local post = getfield(start,"post") + local replace = getfield(start,"replace") + -- we really need to reasign the fields as luatex keeps track of + -- the tail in a temp preceding head .. kind of messy so we might + -- want to come up with a better solution some day like a real + -- pretail etc fields in a disc node + -- + -- maybe i'll merge the now split functions + if pre then + local okay = false + if not prev then + prev = prev or getprev(start) + pglyph = prev and getid(prev) == glyph_code + end + if pglyph then + pre, okay = inject_begin(pre,prev,keeptogether,krn,okay) + end + pre, okay = process_list(pre,keeptogether,krn,false,okay) + if okay then + setfield(start,"pre",pre) done = true end - local n = getnext(start) - if n and getid(n) ~= glue_code then - insert_node_after(head,start,kern_injector(fillup,quaddata[lastfont]*krn)) + end + if post then + local okay = false + if not next then + next = getnext(start) + nglyph = next and getid(next) == glyph_code + end + if nglyph then + post, okay = inject_end(post,next,keeptogether,krn,okay) + end + post, okay = process_list(post,keeptogether,krn,false,okay) + if okay then + setfield(start,"post",post) done = true end - elseif id == math_code then - start = end_of_math(start) end + if replace then + local okay = false + if not prev then + prev = prev or getprev(start) + pglyph = prev and getid(prev) == glyph_code + end + if pglyph then + replace, okay = inject_begin(replace,prev,keeptogether,krn,okay) + end + if not next then + next = getnext(start) + nglyph = next and getid(next) == glyph_code + end + if nglyph then + replace, okay = inject_end(replace,next,keeptogether,krn,okay) + end + replace, okay = process_list(replace,keeptogether,krn,false,okay) + if okay then + setfield(start,"replace",replace) + done = true + end + elseif prevfont then + setfield(start,"replace",new_kern(quaddata[prevfont]*krn)) + done = true + end + bound = false + elseif id == kern_code then + bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern) + prev = start + previd = id + elseif id == glue_code then + local subtype = getsubtype(start) + if subtype == userskip_code or subtype == xspaceskip_code or subtype == spaceskip_code then + local s = getfield(start,"spec") + local w = getfield(s,"width") + if w > 0 then + local width = w+gluefactor*w*krn + local stretch = getfield(s,"stretch") + local shrink = getfield(s,"shrink") + setfield(start,"spec",spec_injector(fillup,width,stretch*width/w,shrink*width/w)) + done = true + end + end + bound = false + elseif id == hlist_code or id == vlist_code then + local subtype = getsubtype(start) + if subtype == user_list_code or subtype == box_list_code then + -- special case + local b, f = closest_bound(start,getprev) + if b then + insert_node_before(head,start,kern_injector(fillup,quaddata[f]*krn)) + done = true + end + local b, f = closest_bound(start,getnext) + if b then + insert_node_after(head,start,kern_injector(fillup,quaddata[f]*krn)) + done = true + end + end + bound = false + elseif id == math_code then + start = end_of_math(start) + bound = false end - end - if start then + if start then + start = getnext(start) + end + elseif id == kern_code then + bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern) + prev = start + previd = id + start = getnext(start) + else + bound = false start = getnext(start) end end - return head, done + return tonode(head), done end local enabled = false @@ -428,11 +620,11 @@ function kerns.set(factor) return factor end -function kerns.handler(head) - local head, done = do_process(tonut(head)) -- no direct map, because else fourth argument is tail == true - return tonode(head), done -end - -- interface -commands.setcharacterkerning = kerns.set +interfaces.implement { + name = "setcharacterkerning", + actions = kerns.set, + arguments = "string" +} + diff --git a/Master/texmf-dist/tex/context/base/typo-krn.mkiv b/Master/texmf-dist/tex/context/base/typo-krn.mkiv index 92689f07b85..6d6126542bf 100644 --- a/Master/texmf-dist/tex/context/base/typo-krn.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-krn.mkiv @@ -35,13 +35,10 @@ \typo_kerning_set \fi} -% \def\typo_kerning_set -% {\ctxcommand{setcharacterkerning(\characterkerningparameter\c!factor)}} - \def\typo_kerning_set {\usecharacterkerningstyleandcolor\c!style\c!color % goodie, maybe also strut \useaddfontfeatureparameter\characterkerningparameter - \ctxcommand{setcharacterkerning("\characterkerningparameter\c!factor")}} + \clf_setcharacterkerning{\characterkerningparameter\c!factor}} \unexpanded\def\resetcharacterkerning % fast one {\attribute\kernattribute\attributeunsetvalue} @@ -89,9 +86,9 @@ \appendtoks \setuevalue{\currentcharacterkerning}% - {\doifnextoptionalelse + {\doifelsenextoptional {\typo_kerning_apply_yes{\currentcharacterkerning}}% - {\typo_kerning_apply_nop{\currentcharacterkerning}}} + {\typo_kerning_apply_nop{\currentcharacterkerning}}}% \to \everydefinecharacterkerning \unexpanded\def\typo_kerning_apply_yes#1[#2]% diff --git a/Master/texmf-dist/tex/context/base/typo-lan.lua b/Master/texmf-dist/tex/context/base/typo-lan.lua index 50927f74493..c42d2119eb6 100644 --- a/Master/texmf-dist/tex/context/base/typo-lan.lua +++ b/Master/texmf-dist/tex/context/base/typo-lan.lua @@ -67,6 +67,8 @@ function frequencies.averagecharwidth(language,font) return frequencycache[language or "en"][font or currentfont()] end -function commands.averagecharwidth(language,font) - context(frequencycache[language or "en"][font or currentfont()]) -end +interfaces.implement { + name = "averagecharwidth", + actions = { frequencies.averagecharwidth, context }, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-lan.mkiv b/Master/texmf-dist/tex/context/base/typo-lan.mkiv index bb4ed204205..8b633957bca 100644 --- a/Master/texmf-dist/tex/context/base/typo-lan.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-lan.mkiv @@ -30,7 +30,7 @@ \def\charwidthlanguage{\currentmainlanguage} -\def\averagecharwidth{\dimexpr\ctxcommand{averagecharwidth("\charwidthlanguage")}\scaledpoint\relax} +\def\averagecharwidth{\dimexpr\clf_averagecharwidth{\charwidthlanguage}\scaledpoint\relax} \protect diff --git a/Master/texmf-dist/tex/context/base/typo-lig.mkiv b/Master/texmf-dist/tex/context/base/typo-lig.mkiv new file mode 100644 index 00000000000..6171441d6d3 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-lig.mkiv @@ -0,0 +1,31 @@ +%D \module +%D [ file=typo-lig, +%D version=2014.12.01, +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Ligatures, +%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. + +\writestatus{loading}{ConTeXt Typesetting Macros / Ligatures} + +%D This macro is mostly used for testing an attribute that blocks ligatures +%D in the nodemode handler. It is not really used in practice, and mostly +%D there as a plug in the generic font handler. + +\unprotect + +\definesystemattribute[noligature][public] + +\unexpanded\def\noligature#1% + {\dontleavehmode + \begingroup + \attribute\noligatureattribute\plusone + #1% + \endgroup} + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/typo-man.lua b/Master/texmf-dist/tex/context/base/typo-man.lua new file mode 100644 index 00000000000..6c6d7926f37 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-man.lua @@ -0,0 +1,113 @@ +if not modules then modules = { } end modules ['typo-man'] = { + version = 1.001, + comment = "companion to typo-prc.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if not characters then + -- for testing stand-alone + require("char-def") + require("char-ini") +end + +local lpegmatch = lpeg.match +local P, R, C, Ct, Cs, Carg = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg +local global = global or _G + +local methods = { + uppercase = characters.upper, + lowercase = characters.lower, + Word = converters.Word, + Words = converters.Words, +} + +local function nothing(s) return s end -- we already have that one somewhere + +-- table.setmetatableindex(methods,function(t,k) +-- t[k] = nothing +-- return nothing +-- end) + +local splitter = lpeg.tsplitat(".") + +table.setmetatableindex(methods,function(t,k) + local s = lpegmatch(splitter,k) + local v = global + for i=1,#s do + v = v[s[i]] + if not v then + break + end + end + if not v or v == global then + v = nothing + end + t[k] = v + return v +end) + +local whitespace = lpeg.patterns.whitespace^0 +local separator = whitespace * P("->") * whitespace +local pair = C((1-separator)^1) * separator * C(P(1)^0) +local list = Ct((C((1-separator)^1) * separator)^1) * C(P(1)^0) + +local pattern = Carg(1) * pair / function(methods,operation,str) + return methods[operation](str) or str +end + +local function apply(str,m) + return lpegmatch(pattern,str,1,m or methods) or str +end + +local function splitspecification(field,m) + local m, f = lpegmatch(list,field,1,m or methods) + if m then + return m, f or field + else + return nil, field + end +end + +local function applyspecification(actions,str) + if actions then + for i=1,#actions do + local action = methods[actions[i]] + if action then + str = action(str) or str + end + end + end + return str +end + +if not typesetters then typesetters = { } end + +typesetters.manipulators = { + methods = methods, + apply = apply, + patterns = { + pair = pair, + list = list, + }, + splitspecification = splitspecification, + applyspecification = applyspecification, +} + +local pattern = Cs((1 - P(1) * P(-1))^0 * (P(".")/"" + P(1))) + +methods.stripperiod = function(str) return lpegmatch(pattern,str) end + +-- print(apply("hans")) +-- print(apply("uppercase->hans")) +-- print(apply("string.reverse -> hans")) +-- print(apply("uppercase->hans",{ uppercase = string.reverse } )) + +-- print(applyspecification(splitspecification("hans"))) +-- print(applyspecification(splitspecification("lowercase->uppercase->hans"))) +-- print(applyspecification(splitspecification("uppercase->stripperiod->hans."))) + +function commands.manipulated(str) + context(apply(str)) +end diff --git a/Master/texmf-dist/tex/context/base/typo-mar.lua b/Master/texmf-dist/tex/context/base/typo-mar.lua index 4ea6b1e1d86..fed9e0745d6 100644 --- a/Master/texmf-dist/tex/context/base/typo-mar.lua +++ b/Master/texmf-dist/tex/context/base/typo-mar.lua @@ -77,6 +77,7 @@ local format, validstring = string.format, string.valid local insert, remove = table.insert, table.remove local setmetatable, next = setmetatable, next local formatters = string.formatters +local toboolean = toboolean local attributes, nodes, node, variables = attributes, nodes, node, variables @@ -115,6 +116,7 @@ local v_continue = variables.continue local v_first = variables.first local v_text = variables.text local v_column = variables.column +local v_line = variables.line local nuts = nodes.nuts local nodepool = nuts.pool @@ -165,9 +167,6 @@ local localpar_code = whatsitcodes.localpar local nodepool = nuts.pool local new_kern = nodepool.kern -local new_glue = nodepool.glue -local new_penalty = nodepool.penalty -local new_stretch = nodepool.stretch local new_usernumber = nodepool.usernumber local new_latelua = nodepool.latelua @@ -177,8 +176,6 @@ local texgetcount = tex.getcount local texgetdimen = tex.getdimen local texget = tex.get -local points = number.points - local isleftpage = layouts.status.isleftpage local registertogether = builders.paragraphs.registertogether -- tonode @@ -374,11 +371,13 @@ end local status, nofstatus = { }, 0 local f_anchor = formatters["_plib_.set('md:h',%i,{x=true,c=true})"] + local function setanchor(h_anchor) return new_latelua(f_anchor(h_anchor)) end -- local t_anchor = { x = true, c = true } +-- -- local function setanchor(h_anchor) -- return lateluafunction(function() setposition("md:h",h_anchor,t_anchor) end) -- end @@ -449,7 +448,7 @@ local function realign(current,candidate) anchor = v_text end if inline or anchor ~= v_text or candidate.psubtype == alignment_code then - -- the alignment_code check catches margintexts ste before a tabulate + -- the alignment_code check catches margintexts before a tabulate h_anchors = h_anchors + 1 anchornode = setanchor(h_anchors) local blob = getposition('md:h',h_anchors) @@ -555,6 +554,9 @@ end local function inject(parent,head,candidate) local box = candidate.box + if not box then + return head, nil, false -- we can have empty texts + end local width = getfield(box,"width") local height = getfield(box,"height") local depth = getfield(box,"depth") @@ -574,6 +576,11 @@ local function inject(parent,head,candidate) nofdelayed = nofdelayed + 1 status[nofstatus] = candidate -- yet untested + baseline = tonumber(baseline) + if not baseline then + baseline = toboolean(baseline) + end + -- if baseline == true then baseline = false -- hbox vtop @@ -600,10 +607,10 @@ local function inject(parent,head,candidate) -- offset = offset + height end if stack == v_yes then - offset = offset + candidate.dy + offset = offset + candidate.dy -- always shift = shift + offset elseif stack == v_continue then - offset = offset + candidate.dy + offset = offset + candidate.dy -- always if firstonstack then offset = offset + getovershoot(location) end @@ -620,9 +627,19 @@ local function inject(parent,head,candidate) if trace_margindata then report_margindata("top aligned by %p",delta) end - if delta < candidate.threshold then + if delta < candidate.threshold then -- often we need a negative threshold here shift = shift + voffset + delta end + elseif method == v_line then + if getfield(parent,"depth") == 0 then + local delta = height - getfield(parent,"height") + if trace_margindata then + report_margindata("top aligned by %p (no depth)",delta) + end + if delta < candidate.threshold then -- often we need a negative threshold here + shift = shift + voffset + delta + end + end elseif method == v_first then if baseline then shift = shift + voffset + height - baseline -- option @@ -740,17 +757,23 @@ local function flushed(scope,parent) -- current is hlist for l=1,#locations do local location = locations[l] local store = displaystore[category][location][scope] - while true do - local candidate = remove(store,1) -- brr, local stores are sparse - if candidate then -- no vpack, as we want to realign - head, room, con = inject(parent,head,candidate) - done = true - continue = continue or con - nofstored = nofstored - 1 - registertogether(tonode(parent),room) -- !! tonode - else - break + if store then + while true do + local candidate = remove(store,1) -- brr, local stores are sparse + if candidate then -- no vpack, as we want to realign + head, room, con = inject(parent,head,candidate) + done = true + continue = continue or con + nofstored = nofstored - 1 + if room then + registertogether(tonode(parent),room) -- !! tonode + end + else + break + end end + else + -- report_margindata("fatal error: invalid category %a",category or "?") end end end @@ -836,15 +859,15 @@ function margins.globalhandler(head,group) -- check group end return head, false elseif group == "hmode_par" then - return handler("global",head,group) + return handler(v_global,head,group) elseif group == "vmode_par" then -- experiment (for alignments) - return handler("global",head,group) + return handler(v_global,head,group) -- this needs checking as we then get quite some one liners to process and -- we cannot look ahead then: elseif group == "box" then -- experiment (for alignments) - return handler("global",head,group) + return handler(v_global,head,group) elseif group == "alignment" then -- experiment (for alignments) - return handler("global",head,group) + return handler(v_global,head,group) else if trace_margingroup then report_margindata("ignored 2, group %a, stored %s, inhibit %a",group,nofstored,inhibit) @@ -885,9 +908,9 @@ function margins.finalhandler(head) -- if trace_margindata then -- report_margindata("flushing stage two, instore: %s, delayed: %s",nofstored,nofdelayed) -- end -head = tonut(head) -local head, done = finalhandler(head) -head = tonode(head) + head = tonut(head) + local head, done = finalhandler(head) + head = tonode(head) return head, done else return head, false @@ -928,4 +951,32 @@ statistics.register("margin data", function() end end) -commands.savemargindata = margins.save +interfaces.implement { + name = "savemargindata", + actions = margins.save, + arguments = { + { + { "location" }, + { "method" }, + { "category" }, + { "name" }, + { "scope" }, + { "number", "integer" }, + { "margin" }, + { "distance", "dimen" }, + { "hoffset", "dimen" }, + { "voffset", "dimen" }, + { "dy", "dimen" }, + { "bottomspace", "dimen" }, + { "baseline"}, -- dimen or string or + { "threshold", "dimen" }, + { "inline", "boolean" }, + { "anchor" }, + -- { "leftskip", "dimen" }, + -- { "rightskip", "dimen" }, + { "align" }, + { "line", "integer" }, + { "stack" }, + } + } +} diff --git a/Master/texmf-dist/tex/context/base/typo-mar.mkiv b/Master/texmf-dist/tex/context/base/typo-mar.mkiv index 2b89f57774d..d5869b45998 100644 --- a/Master/texmf-dist/tex/context/base/typo-mar.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-mar.mkiv @@ -14,6 +14,8 @@ %C details. % todo: tags +% todo: force inline with option (saves pos) +% todo: margintitle (also less position then) \writestatus{loading}{ConTeXt Typesetting Macros / Margindata} @@ -113,7 +115,7 @@ \c!color=, % maybe \maintextcolor % \c!name=, % \c!category=, - \c!threshold=.25ex, + \c!threshold=.25\exheight, \c!margin=\v!normal, \c!scope=\v!global, \c!width=, @@ -163,7 +165,7 @@ \unexpanded\def\typo_margins_data_synchronize {\doforcedtrackpagestate\s!margintext\nofmargintexts % includes increment \docheckpagestate\s!margintext\nofmargintexts - %\doifrightpagestateelse\s!margintext\nofmargintexts\relax\relax + %\doifelserightpagestate\s!margintext\nofmargintexts\relax\relax \realpageno\realpagestateno \swapmargins} @@ -199,13 +201,13 @@ \strc_references_set_page_only_destination_box_attribute\currentmarginreference\currentmarginreference \fi \edef\currentmargindatastrut{\margindataparameter\c!strut}% - \dostarttagged\t!margintext\currentmargindata + \dostarttaggedchained\t!margintext\currentmargindata\??margindata \ifcsname\currentmarginframedhash\s!parent\endcsname \setbox\nextbox\hbox \currentmarginreference \bgroup \the\everymargindatacontent \usemargindatastyleandcolor\c!style\c!color \setupcurrentmarginframed[\c!location=\v!normal,#textparameters]% -\typo_margins_data_synchronize + \typo_margins_data_synchronize \inheritedmarginframedframed\bgroup \ifx\currentmargindatastrut\empty \else \synchronizestrut\currentmargindatastrut @@ -221,7 +223,7 @@ \edef\currentmargindatawidth{\margindataparameter\c!width}% \ifx\currentmargindatawidth\empty \setbox\nextbox\hbox \currentmarginreference \bgroup -\typo_margins_data_synchronize + \typo_margins_data_synchronize \the\everymargindatacontent \usemargindatastyleandcolor\c!style\c!color \ifx\currentmargindatastrut\empty \else @@ -235,7 +237,7 @@ \let\currentmarginfirstheight\empty \else \setbox\nextbox\hbox \currentmarginreference \bgroup -\typo_margins_data_synchronize + \typo_margins_data_synchronize \dosetraggedcommand{\margindataparameter\c!align}% \vtop \bgroup \the\everymargindatacontent @@ -258,49 +260,49 @@ \fi \ifdone \anch_positions_initialize % we use positions at the lua end - \ctxcommand{savemargindata{ - location = "\margindataparameter\c!location", - method = "\margindataparameter\c!method", - category = "\margindataparameter\c!category", - name = "\margindataparameter\c!name", - scope = "\margindataparameter\c!scope", - number = \number\nextbox, - margin = "\margindataparameter\c!margin", % local normal margin edge - distance = \number\dimexpr\margindataparameter\c!distance, - hoffset = \number\dimexpr\margindataparameter\c!hoffset, - voffset = \number\dimexpr\margindataparameter\c!voffset, - dy = \number\dimexpr\margindataparameter\c!dy, - bottomspace = \number\dimexpr\margindataparameter\c!bottomspace, + \clf_savemargindata + location {\margindataparameter\c!location}% + method {\margindataparameter\c!method}% + category {\margindataparameter\c!category}% + name {\margindataparameter\c!name}% + scope {\margindataparameter\c!scope}% + number \nextbox + margin {\margindataparameter\c!margin}% local normal margin edge + distance \dimexpr\margindataparameter\c!distance\relax + hoffset \dimexpr\margindataparameter\c!hoffset\relax + voffset \dimexpr\margindataparameter\c!voffset\relax + dy \dimexpr\margindataparameter\c!dy\relax + bottomspace \dimexpr\margindataparameter\c!bottomspace\relax \ifx\currentmarginfirstheight\empty \else - baseline = \currentmarginfirstheight, + baseline {\currentmarginfirstheight}% \fi - threshold = \number\dimexpr\margindataparameter\c!threshold, % overlap related, will change + threshold \dimexpr\margindataparameter\c!threshold\relax % overlap related, will change \ifhmode - inline = true, + inline true % \fi - anchor = "\margindataparameter\c!anchor", + anchor {\margindataparameter\c!anchor}% % % we're not in forgetall % % \ifzeropt\leftskip \else - % leftskip = \number\leftskip, + % leftskip \dimexpr\leftskip\relax % \fi % \ifzeropt\leftskip \else - % rightskip = \number\rightskip, + % rightskip \dimexpr\rightskip\relax % \fi - align = "\margindataparameter\c!align", - line = \number\margindataparameter\c!line, - stack = "\margindataparameter\c!stack", - }}% + align {\margindataparameter\c!align}% + line \numexpr\margindataparameter\c!line\relax + stack {\margindataparameter\c!stack}% + \relax \else - \ctxcommand{savemargindata{ - location = "\margindataparameter\c!location", - method = "\margindataparameter\c!method", - category = "\margindataparameter\c!category", - name = "\margindataparameter\c!name", - scope = "\margindataparameter\c!scope", - number = \number\nextbox, - }}% + \clf_savemargindata + location {\margindataparameter\c!location}% + method {\margindataparameter\c!method}% + category {\margindataparameter\c!category}% + name {\margindataparameter\c!name}% + scope {\margindataparameter\c!scope}% + number \nextbox + \relax \fi \endgroup} diff --git a/Master/texmf-dist/tex/context/base/typo-pag.lua b/Master/texmf-dist/tex/context/base/typo-pag.lua index 5b96e9c2113..53f79fcfc69 100644 --- a/Master/texmf-dist/tex/context/base/typo-pag.lua +++ b/Master/texmf-dist/tex/context/base/typo-pag.lua @@ -52,6 +52,9 @@ trackers.register("parbuilders.keeptogether", function(v) trace_keeptogether = -- when no hlists are there ? ... maybe the local_par function parbuilders.registertogether(line,specification) -- might change + if not specification then + return + end if not enabled then nodes.tasks.enableaction("finalizers","builders.paragraphs.keeptogether") end @@ -87,18 +90,16 @@ function parbuilders.registertogether(line,specification) -- might change if trace_keeptogether then local a = a or last local c = cache[a] - if trace_keeptogether then - local noflines = specification.lineheight - local height = c.height - local depth = c.depth - local slack = c.slack - if not noflines or noflines == 0 then - noflines = "unknown" - else - noflines = math.round((height + depth - slack) / noflines) - end - report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines) + local noflines = specification.lineheight + local height = c.height + local depth = c.depth + local slack = c.slack + if not noflines or noflines == 0 then + noflines = "unknown" + else + noflines = math.round((height + depth - slack) / noflines) end + report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines) end end diff --git a/Master/texmf-dist/tex/context/base/typo-prc.lua b/Master/texmf-dist/tex/context/base/typo-prc.lua index 959cabbb8e5..cde66df0087 100644 --- a/Master/texmf-dist/tex/context/base/typo-prc.lua +++ b/Master/texmf-dist/tex/context/base/typo-prc.lua @@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['typo-prc'] = { license = "see context related readme files" } --- moved from strc-ini.lua - -local context, commands = context, commands -local formatters = string.formatters local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C, lpeg.Cs -- processors: syntax: processor->data ... not ok yet +local context = context +local implement = interfaces.implement + +local formatters = string.formatters + typesetters.processors = typesetters.processors or { } local processors = typesetters.processors @@ -21,8 +22,8 @@ local trace_processors = false local report_processors = logs.reporter("processors") local registered = { } -context_applyprocessor = context.applyprocessor -context_firstofoneargument = context.firstofoneargument +local ctx_applyprocessor = context.applyprocessor +local ctx_firstofoneargument = context.firstofoneargument trackers.register("typesetters.processors", function(v) trace_processors = v end) @@ -58,7 +59,7 @@ function processors.apply(p,s) if trace_processors then report_processors("applying %s processor %a, argument: %s","known",p,s) end - context_applyprocessor(p,s) + ctx_applyprocessor(p,s) elseif s then if trace_processors then report_processors("applying %s processor %a, argument: %s","unknown",p,s) @@ -81,21 +82,21 @@ function processors.startapply(p,s) if trace_processors then report_processors("start applying %s processor %a","known",p) end - context_applyprocessor(p) + ctx_applyprocessor(p) context("{") return s elseif p then if trace_processors then report_processors("start applying %s processor %a","unknown",p) end - context_firstofoneargument() + ctx_firstofoneargument() context("{") return s else if trace_processors then report_processors("start applying %s processor","ignored") end - context_firstofoneargument() + ctx_firstofoneargument() context("{") return str end @@ -124,5 +125,5 @@ end -- interface -commands.registerstructureprocessor = processors.register -commands.resetstructureprocessor = processors.reset +implement { name = "registerstructureprocessor", actions = processors.register, arguments = "string" } +implement { name = "resetstructureprocessor", actions = processors.reset, arguments = "string" } diff --git a/Master/texmf-dist/tex/context/base/typo-prc.mkvi b/Master/texmf-dist/tex/context/base/typo-prc.mkvi index de221f2419b..49a16569647 100644 --- a/Master/texmf-dist/tex/context/base/typo-prc.mkvi +++ b/Master/texmf-dist/tex/context/base/typo-prc.mkvi @@ -13,7 +13,11 @@ \writestatus{loading}{ConTeXt Typesetting Macros / Processors} +%D For the moment manipulators are loaded here too, as they're in the same +%D category as processors. This might change. (They are used in publications.) + \registerctxluafile{typo-prc}{1.001} +\registerctxluafile{typo-man}{1.001} \unprotect @@ -51,7 +55,7 @@ \appendtoks \letvalue{\??processorcheck\currentprocessor}\relax - \ctxcommand{registerstructureprocessor("\currentprocessor")}% global, but it permits using processor that are yet undefined + \clf_registerstructureprocessor{\currentprocessor}% global, but it permits using processor that are yet undefined \to \everydefineprocessor %D The following command can be used by users but normally it will be @@ -68,9 +72,12 @@ \fi} \def\typo_processor_apply - {\doifelse{\processorparameter\c!state}\v!stop - \firstofoneargument - \typo_processor_apply_indeed} + {\edef\p_state{\processorparameter\c!state}% + \ifx\p_state\v!stop + \expandafter\firstofoneargument + \else + \expandafter\typo_processor_apply_indeed + \fi} \def\typo_processor_apply_indeed#content% {\begingroup diff --git a/Master/texmf-dist/tex/context/base/typo-rep.lua b/Master/texmf-dist/tex/context/base/typo-rep.lua index 15e3f97465e..d95eff68e0f 100644 --- a/Master/texmf-dist/tex/context/base/typo-rep.lua +++ b/Master/texmf-dist/tex/context/base/typo-rep.lua @@ -29,7 +29,6 @@ local getchar = nuts.getchar local getid = nuts.getid local getattr = nuts.getattr -local setattr = nuts.setattr local delete_node = nuts.delete local replace_node = nuts.replace @@ -139,4 +138,8 @@ tasks.disableaction("processors","nodes.handlers.stripping") -- interface -commands.setcharacterstripping = stripping.set +interfaces.implement { + name = "setcharacterstripping", + actions = stripping.set, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-rep.mkiv b/Master/texmf-dist/tex/context/base/typo-rep.mkiv index 46b43949151..c1146997e33 100644 --- a/Master/texmf-dist/tex/context/base/typo-rep.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-rep.mkiv @@ -38,7 +38,7 @@ \definesystemattribute[stripping][public] \unexpanded\def\setcharacterstripping[#1]% - {\ctxcommand{setcharacterstripping("#1")}} + {\clf_setcharacterstripping{#1}} \unexpanded\def\resetcharacterstripping {\attribute\strippingattribute\attributeunsetvalue} diff --git a/Master/texmf-dist/tex/context/base/typo-spa.lua b/Master/texmf-dist/tex/context/base/typo-spa.lua index eb84eb7d7e3..519ba3f34fb 100644 --- a/Master/texmf-dist/tex/context/base/typo-spa.lua +++ b/Master/texmf-dist/tex/context/base/typo-spa.lua @@ -230,6 +230,30 @@ end -- interface -commands.definecharacterspacing = spacings.define -commands.setupcharacterspacing = spacings.setup -commands.setcharacterspacing = spacings.set +local implement = interfaces.implement + +implement { + name = "definecharacterspacing", + actions = spacings.define, + arguments = "string" +} + +implement { + name = "setupcharacterspacing", + actions = spacings.setup, + arguments = { + "string", + "integer", + { + { "left", "number" }, + { "right", "number" }, + { "alternative", "integer" }, + } + } +} + +implement { + name = "setcharacterspacing", + actions = spacings.set, + arguments = "string" +} diff --git a/Master/texmf-dist/tex/context/base/typo-spa.mkiv b/Master/texmf-dist/tex/context/base/typo-spa.mkiv index d783353d67d..2e3e71bf3b3 100644 --- a/Master/texmf-dist/tex/context/base/typo-spa.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-spa.mkiv @@ -35,7 +35,7 @@ \c!alternative=0] \unexpanded\def\definecharacterspacing[#1]% - {\ctxcommand{definecharacterspacing("#1")}} + {\clf_definecharacterspacing{#1}} \unexpanded\def\setupcharacterspacing {\dotripleargument\typo_characterspacing_setup} @@ -43,15 +43,19 @@ \def\typo_characterspacing_setup[#1][#2][#3]% todo: #2 list {\begingroup \setupcurrent_p_characterspacing[#3]% - \ctxcommand{setupcharacterspacing("#1",\number#2, { % todo: just pass #3 to the lua end - left = \direct_p_characterspacingparameter\c!left, - right = \direct_p_characterspacingparameter\c!right, - alternative = \direct_p_characterspacingparameter\c!alternative - })}% + \clf_setupcharacterspacing + {#1}% + \numexpr#2\relax + {% + left \direct_p_characterspacingparameter\c!left\space + right \direct_p_characterspacingparameter\c!right\space + alternative \direct_p_characterspacingparameter\c!alternative + }% + \relax \endgroup} \unexpanded\def\setcharacterspacing[#1]% we can store the attribute if we want speed - {\ctxcommand{setcharacterspacing("#1")}} + {\clf_setcharacterspacing{#1}} \unexpanded\def\resetcharacterspacing % fast one {\attribute\spacingattribute\attributeunsetvalue} diff --git a/Master/texmf-dist/tex/context/base/typo-sus.lua b/Master/texmf-dist/tex/context/base/typo-sus.lua new file mode 100644 index 00000000000..9eef6196bb0 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-sus.lua @@ -0,0 +1,304 @@ +if not modules then modules = { } end modules ['typo-sus'] = { + version = 1.001, + comment = "companion to typo-sus.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local punctuation = { + po = true, +} + +local openquote = { + ps = true, + pi = true, +} + +local closequote = { + pe = true, + pf = true, +} + +local categories = characters.categories + +local nodecodes = nodes.nodecodes + +local glyph_code = nodecodes.glyph +local kern_code = nodecodes.kern +local penalty_code = nodecodes.penalty +local glue_code = nodecodes.glue +local math_code = nodecodes.math +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist + +local nuts = nodes.nuts +local tonut = nodes.tonut +local tonode = nodes.tonode + +local getid = nuts.getid +local getchar = nuts.getchar +local getprev = nuts.getprev +local getnext = nuts.getnext +local getfield = nuts.getfield +local getattr = nuts.getattr +local getfont = nuts.getfont +local getlist = nuts.getlist + +local setfield = nuts.setfield +local setattr = nuts.setattr + +local setcolor = nodes.tracers.colors.set +local insert_before = nuts.insert_before +local insert_after = nuts.insert_after +local end_of_math = nuts.end_of_math + +local nodepool = nuts.pool + +local new_rule = nodepool.rule +local new_kern = nodepool.kern +local new_hlist = nodepool.hlist +----- new_penalty = nodepool.penalty + +local a_characters = attributes.private("characters") +local a_suspecting = attributes.private('suspecting') +local a_suspect = attributes.private('suspect') +local texsetattribute = tex.setattribute +local enabled = false + +local threshold = 65536 / 4 + +local function special(n) + if n then + local id = getid(n) + if id == kern_code then + local kern = getfield(n,"kern") + return kern < threshold + elseif id == penalty_code then + return true + elseif id == glue_code then + local width = getfield(getfield(n,"spec"),"width") + return width < threshold + elseif id == hlist_code then + local width = getfield(n,"width") + return width < threshold + end + else + return false + end +end + +local function goback(current) + local prev = getprev(current) + while prev and special(prev) do + prev = getprev(prev) + end + if prev then + return prev, getid(prev) + end +end + +local function goforward(current) + local next = getnext(current) + while next and special(next) do + next = getnext(next) + end + if next then + return next, getid(next) + end +end + +local function mark(head,current,id,color) + if id == glue_code then + -- the glue can have stretch and/or shrink so the rule can overlap with the + -- following glyph .. no big deal as that one then sits on top of the rule + local width = getfield(getfield(current,"spec"),"width") + local rule = new_rule(width) + local kern = new_kern(-width) + head = insert_before(head,current,rule) + head = insert_before(head,current,kern) + setcolor(rule,color) + -- elseif id == kern_code then + -- local width = getfield(current,"kern") + -- local rule = new_rule(width) + -- local kern = new_kern(-width) + -- head = insert_before(head,current,rule) + -- head = insert_before(head,current,kern) + -- setcolor(rule,color) + else + local width = getfield(current,"width") + local extra = fonts.hashes.xheights[getfont(current)] / 2 + local rule = new_rule(width,getfield(current,"height")+extra,getfield(current,"depth")+extra) + local hlist = new_hlist(rule) + head = insert_before(head,current,hlist) + setcolor(rule,color) + setcolor(current,"white") + end + return head, current +end + +-- we can cache the font and skip ahead to next but it doesn't +-- save enough time and it makes the code looks bad too ... after +-- all, we seldom use this + +local colors = { + "darkred", + "darkgreen", + "darkblue", + "darkcyan", + "darkmagenta", + "darkyellow", + "darkgray", + "orange", +} + +local found = 0 + +function typesetters.marksuspects(head) + local head = tonut(head) + local current = head + local lastdone = nil + while current do + if getattr(current,a_suspecting) then + local id = getid(current) + if id == glyph_code then + local char = getchar(current) + local code = categories[char] + local done = false + if punctuation[code] then + local prev, pid = goback(current) + if prev and pid == glue_code then + done = 3 -- darkblue + elseif prev and pid == math_code then + done = 3 -- darkblue + else + local next, nid = goforward(current) + if next and nid ~= glue_code then + done = 3 -- darkblue + end + end + elseif openquote[code] then + local next, nid = goforward(current) + if next and nid == glue_code then + done = 1 -- darkred + end + elseif closequote[code] then + local prev, pid = goback(current) + if prev and pid == glue_code then + done = 1 -- darkred + end + else + local prev, pid = goback(current) + if prev then + if pid == math_code then + done = 7-- darkgray + elseif pid == glyph_code and getfont(current) ~= getfont(prev) then + if lastdone ~= prev then + done = 2 -- darkgreen + end + end + end + if not done then + local next, nid = goforward(current) + if next then + if nid == math_code then + done = 7 -- darkgray + elseif nid == glyph_code and getfont(current) ~= getfont(next) then + if lastdone ~= prev then + done = 2 -- darkgreen + end + end + end + end + end + if done then + setattr(current,a_suspect,done) + lastdone = current + found = found + 1 + end + current = getnext(current) + elseif id == math_code then + current = getnext(end_of_math(current)) + elseif id == glue_code then + local a = getattr(current,a_characters) + if a then + local prev = getprev(current) + local prid = prev and getid(prev) + local done = false + if prid == penalty_code and getfield(prev,"penalty") == 10000 then + done = 8 -- orange + else + done = 5 -- darkmagenta + end + if done then + setattr(current,a_suspect,done) + -- lastdone = current + found = found + 1 + end + end + current = getnext(current) + else + current = getnext(current) + end + else + current = getnext(current) + end + end + return tonode(head), found > 0 +end + +local function showsuspects(head) + local current = head + while current do + local id = getid(current) + if id == glyph_code then + local a = getattr(current,a_suspect) + if a then + head, current = mark(head,current,id,colors[a]) + end + elseif id == glue_code then + local a = getattr(current,a_suspect) + if a then + head, current = mark(head,current,id,colors[a]) + end + elseif id == math_code then + current = end_of_math(current) + elseif id == hlist_code or id == vlist_code then + local list = getlist(current) + if list then + local l = showsuspects(list) + if l ~= list then + setfield(current,"list",l) + end + end + end + current = getnext(current) + end + return head +end + +function typesetters.showsuspects(head) + if found > 0 then + return tonode(showsuspects(tonut(head))), true + else + return head, false + end +end + +nodes.tasks.appendaction ("processors","after", "typesetters.marksuspects") +nodes.tasks.prependaction("shipouts", "normalizers","typesetters.showsuspects") + +nodes.tasks.disableaction("processors","typesetters.marksuspects") +nodes.tasks.disableaction("shipouts", "typesetters.showsuspects") + +-- or maybe a directive + +trackers.register("typesetters.suspects",function(v) + texsetattribute(a_suspecting,v and 1 or unsetvalue) + if v and not enabled then + nodes.tasks.enableaction("processors","typesetters.marksuspects") + nodes.tasks.enableaction("shipouts", "typesetters.showsuspects") + enabled = true + end +end) + diff --git a/Master/texmf-dist/tex/context/base/typo-sus.mkiv b/Master/texmf-dist/tex/context/base/typo-sus.mkiv new file mode 100644 index 00000000000..fe44e63277b --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-sus.mkiv @@ -0,0 +1,51 @@ +%D \module +%D [ file=typo-sus, +%D version=2014.11.06, +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Checking Suspects, +%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. + +\writestatus{loading}{ConTeXt Typesetting Macros / Checking Suspects} + +%D This is a rather special module, mostly needed by ourselves for +%D projects where copy||editing is not that precise. + +\registerctxluafile{typo-sus}{1.001} + +\unexpanded\def\showsuspects{\enabletrackers[typesetters.suspects]} + +%D The suspicious spacing will be colored in the text. There can be false +%D positives but this features is mostly used when proofreading. So, we +%D don't worry too much about interference (and efficiency). +%D +%D \unexpanded\def\showsample#1% +%D {\NC \type{#1}% +%D \NC \enabletrackers[typesetters.suspects]#1\disabletrackers[typesetters.spacing]% +%D \NC \NR} +%D +%D \starttabulate[|||][before=,after=] +%D \showsample{foo$x$} +%D \showsample{$x$bar} +%D \showsample{foo$x$bar} +%D \showsample{$f+o+o$:} +%D \showsample{;$f+o+o$} +%D \showsample{; bar} +%D \showsample{foo:bar} +%D \showsample{\quote{ foo }} +%D \showsample{\quote{bar }} +%D \showsample{\quote{ bar}} +%D \showsample{(foo )} +%D \showsample{\{foo \}} +%D \showsample{foo{\bf gnu}bar} +%D \showsample{foo$x^2$bar} +%D \showsample{foo\nobreakspace bar} +%D \stoptabulate + +\endinput + diff --git a/Master/texmf-dist/tex/context/base/typo-tal.lua b/Master/texmf-dist/tex/context/base/typo-tal.lua index 3a2d80e519e..5663c3bd995 100644 --- a/Master/texmf-dist/tex/context/base/typo-tal.lua +++ b/Master/texmf-dist/tex/context/base/typo-tal.lua @@ -6,20 +6,32 @@ if not modules then modules = { } end modules ['typo-tal'] = { license = "see context related readme files" } --- I'll make it a bit more efficient and provide named instances too. +-- I'll make it a bit more efficient and provide named instances too which is needed for +-- nested tables. +-- +-- Currently we have two methods: text and number with some downward compatible +-- defaulting. + +-- We can speed up by saving the current fontcharacters[font] + lastfont. local next, type = next, type local div = math.div local utfbyte = utf.byte +local splitmethod = utilities.parsers.splitmethod + local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue local fontcharacters = fonts.hashes.characters -local unicodes = fonts.hashes.unicodes +----- unicodes = fonts.hashes.unicodes local categories = characters.categories -- nd +local variables = interfaces.variables +local v_text = variables.text +local v_number = variables.number + local nuts = nodes.nuts local tonut = nuts.tonut local tonode = nuts.tonode @@ -62,6 +74,8 @@ local enabled = false local datasets = false +local implement = interfaces.implement + local comma = 0x002C local period = 0x002E local punctuationspace = 0x2008 @@ -80,6 +94,66 @@ local validsigns = { [0x2213] = 0x2213, -- minusplus } +-- If needed we can have more modes which then also means a faster simple handler +-- for non numbers. + +local function setcharacteralign(column,separator) + if not enabled then + nodes.tasks.enableaction("processors","typesetters.characteralign.handler") + enabled = true + end + if not datasets then + datasets = { } + end + local dataset = datasets[column] -- we can use a metatable + if not dataset then + local method, token + if separator then + method, token = splitmethod(separator) + if method and token then + separator = utfbyte(token) or comma + else + separator = utfbyte(separator) or comma + method = validseparators[separator] and v_number or v_text + end + else + separator = comma + method = v_number + end + dataset = { + separator = separator, + list = { }, + maxafter = 0, + maxbefore = 0, + collected = false, + method = method, + separators = validseparators, + signs = validsigns, + } + datasets[column] = dataset + used = true + end + return dataset +end + +local function resetcharacteralign() + datasets = false +end + +characteralign.setcharacteralign = setcharacteralign +characteralign.resetcharacteralign = resetcharacteralign + +implement { + name = "setcharacteralign", + actions = setcharacteralign, + arguments = { "integer", "string" } +} + +implement { + name = "resetcharacteralign", + actions = resetcharacteralign +} + local function traced_kern(w) return tracedrule(w,nil,nil,"darkgray") end @@ -102,8 +176,8 @@ function characteralign.handler(originalhead,where) if not a or a == 0 then return originalhead, false end - local column = div(a,100) - local row = a % 100 + local column = div(a,0xFFFF) + local row = a % 0xFFFF local dataset = datasets and datasets[column] or setcharacteralign(column) local separator = dataset.separator local list = dataset.list @@ -114,82 +188,128 @@ function characteralign.handler(originalhead,where) local c = nil local current = first local sign = nil + -- + local validseparators = dataset.separators + local validsigns = dataset.signs + local method = dataset.method -- we can think of constraints - while current do - local id = getid(current) - if id == glyph_code then - local char = getchar(current) - local font = getfont(current) - local unicode = unicodes[font][char] - if not unicode then - -- no unicode so forget about it - elseif unicode == separator then - c = current - if trace_split then - setcolor(current,"darkred") - end - dataset.hasseparator = true - elseif categories[unicode] == "nd" or validseparators[unicode] then - if c then - if not a_start then - a_start = current - end - a_stop = current + if method == v_number then + while current do + local id = getid(current) + if id == glyph_code then + local char = getchar(current) + local font = getfont(current) + -- local unicode = unicodes[font][char] + local unicode = fontcharacters[font][char].unicode or char -- ignore tables + if not unicode then + -- no unicode so forget about it + elseif unicode == separator then + c = current if trace_split then - setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue") + setcolor(current,"darkred") end - else - if not b_start then - if sign then - b_start = sign - local new = validsigns[getchar(sign)] - if char == new or not fontcharacters[getfont(sign)][new] then - if trace_split then - setcolor(sign,"darkyellow") + dataset.hasseparator = true + elseif categories[unicode] == "nd" or validseparators[unicode] then + if c then + if not a_start then + a_start = current + end + a_stop = current + if trace_split then + setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue") + end + else + if not b_start then + if sign then + b_start = sign + local new = validsigns[getchar(sign)] + if char == new or not fontcharacters[getfont(sign)][new] then + if trace_split then + setcolor(sign,"darkyellow") + end + else + setfield(sign,"char",new) + if trace_split then + setcolor(sign,"darkmagenta") + end end + sign = nil + b_stop = current else - setfield(sign,"char",new) - if trace_split then - setcolor(sign,"darkmagenta") - end + b_start = current + b_stop = current end - sign = nil - b_stop = current else - b_start = current b_stop = current - if trace_split then - setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue") - end end - else - b_stop = current - if trace_split then + if trace_split and current ~= sign then setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue") end end + elseif not b_start then + sign = validsigns[unicode] and current + -- if trace_split then + -- setcolor(current,"darkgreen") + -- end + end + elseif (b_start or a_start) and id == glue_code then + -- maybe only in number mode + -- somewhat inefficient + local next = getnext(current) + local prev = getprev(current) + if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking + local width = fontcharacters[getfont(b_start)][separator or period].width + -- local spec = getfield(current,"spec") + -- free_spec(spec) + setfield(current,"spec",new_gluespec(width)) + setattr(current,a_character,punctuationspace) + if a_start then + a_stop = current + elseif b_start then + b_stop = current + end end - elseif not b_start then - sign = validsigns[unicode] and current end - elseif (b_start or a_start) and id == glue_code then - -- somewhat inefficient - local next = getnext(current) - local prev = getprev(current) - if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking - local width = fontcharacters[getfont(b_start)][separator or period].width - -- local spec = getfield(current,"spec") - -- free_spec(spec) - setfield(current,"spec",new_gluespec(width)) - setattr(current,a_character,punctuationspace) - if a_start then - a_stop = current - elseif b_start then - b_stop = current + current = getnext(current) + end + else + while current do + local id = getid(current) + if id == glyph_code then + local char = getchar(current) + local font = getfont(current) + -- local unicode = unicodes[font][char] + local unicode = fontcharacters[font][char].unicode or char -- ignore tables + if not unicode then + -- no unicode so forget about it + elseif unicode == separator then + c = current + if trace_split then + setcolor(current,"darkred") + end + dataset.hasseparator = true + else + if c then + if not a_start then + a_start = current + end + a_stop = current + if trace_split then + setcolor(current,"darkgreen") + end + else + if not b_start then + b_start = current + end + b_stop = current + if trace_split then + setcolor(current,"darkblue") + end + end end end + current = getnext(current) end - current = getnext(current) end local entry = list[row] if entry then @@ -215,7 +335,7 @@ function characteralign.handler(originalhead,where) local maxafter = dataset.maxafter local before = entry.before or 0 local after = entry.after or 0 - local new_kern = trace_split and traced_kern or new_kern + local new_kern = trace_split and traced_kern or new_kern if b_start then if before < maxbefore then head = insert_node_before(head,b_start,new_kern(maxbefore-before)) @@ -269,37 +389,3 @@ function characteralign.handler(originalhead,where) end return tonode(head), true end - -function setcharacteralign(column,separator) - if not enabled then - nodes.tasks.enableaction("processors","typesetters.characteralign.handler") - enabled = true - end - if not datasets then - datasets = { } - end - local dataset = datasets[column] -- we can use a metatable - if not dataset then - dataset = { - separator = separator and utfbyte(separator) or comma, - list = { }, - maxafter = 0, - maxbefore = 0, - collected = false, - } - datasets[column] = dataset - used = true - end - return dataset -end - -local function resetcharacteralign() - datasets = false -end - -characteralign.setcharacteralign = setcharacteralign -characteralign.resetcharacteralign = resetcharacteralign - -commands.setcharacteralign = setcharacteralign -commands.resetcharacteralign = resetcharacteralign - diff --git a/Master/texmf-dist/tex/context/base/typo-tal.mkiv b/Master/texmf-dist/tex/context/base/typo-tal.mkiv index 7de10a6ec1d..570f1a1f56e 100644 --- a/Master/texmf-dist/tex/context/base/typo-tal.mkiv +++ b/Master/texmf-dist/tex/context/base/typo-tal.mkiv @@ -40,25 +40,26 @@ %D %D \typebuffer \blank \getbuffer \blank -%D \startbuffer -%D \bTABLE -%D \bTR \bTD[aligncharacter=yes] € 1,1 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 11,11 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 12\punctuationspace111,11 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 12 111,11 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 1.234.451,22222 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 234.451,2 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 234.451 \eTD \eTR -%D \bTR \bTD[aligncharacter=yes] € 451 \eTD \eTR -%D \bTR \bTD \bf some text \eTD \eTR -%D \eTABLE -%D \stopbuffer -%D -%D \typebuffer \blank \getbuffer \blank - -\unexpanded\def\signalcharacteralign#1#2{\attribute\characteralignattribute=\numexpr#1*\plushundred+#2\relax} -\unexpanded\def\setcharacteralign #1#2{\ctxcommand{setcharacteralign(\number#1,"#2")}} -\unexpanded\def\resetcharacteralign {\ctxcommand{resetcharacteralign()}} +% D \startbuffer +% D \bTABLE +% D \bTR \bTD[aligncharacter=yes] € 1,1 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 11,11 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 12\punctuationspace111,11 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 12 111,11 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 1.234.451,22222 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 234.451,2 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 234.451 \eTD \eTR +% D \bTR \bTD[aligncharacter=yes] € 451 \eTD \eTR +% D \bTR \bTD \bf some text \eTD \eTR +% D \eTABLE +% D \stopbuffer +% D +% D \typebuffer \blank \getbuffer \blank + +\unexpanded\def\signalcharacteralign#1#2{\attribute\characteralignattribute\numexpr#1*\maxcardminusone+#2\relax} % 0xFFFF +\unexpanded\def\setcharacteralign #1#2{\clf_setcharacteralign#1{#2}} +\unexpanded\def\resetcharacteralign {\clf_resetcharacteralign} +\unexpanded\def\nocharacteralign {\attribute\characteralignattribute\attributeunsetvalue} %D Mostly downward compatible: %D @@ -73,6 +74,15 @@ %D %D \typebuffer \blank \getbuffer \blank +%D We have (currently) two modes: \type {text} and \type {number}. The handler tries +%D to determine the mode automatically. When using periods and commas as separators +%D the \type {number} mode is chosen. If you use for instance a \type {-} as +%D separator, \type {text} is chosen, but you can enforce \type {number} with \type +%D {number->-} (as with other mechanisms, the arrow indicates a methot to apply). +%D +%D One can use \type {\nocharacteralign} to disable this mechanism, for instance in +%D a table cell. + \def\alignmentcharacter{,} \unexpanded\def\typo_charalign_pass_one @@ -86,19 +96,26 @@ \def\typo_charalign_pass {\hbox\bgroup\signalcharacteralign\plusone\scratchcounter\let\next} -\unexpanded\def\startcharacteralign#1\stopcharacteralign +\unexpanded\def\startcharacteralign + {\dosingleempty\typo_charalign_start} + +\def\typo_charalign_start[#1]#2\stopcharacteralign {\bgroup + \edef\m_temp{#1}% + \ifx\m_temp\empty \else + \let\alignmentcharacter\m_temp + \fi \setcharacteralign\plusone\alignmentcharacter \begingroup \scratchcounter\zerocount \let\checkcharacteralign\typo_charalign_pass_one \settrialtypesetting - #1\relax + #2\relax \endgroup \begingroup \scratchcounter\zerocount \let\checkcharacteralign\typo_charalign_pass_two - #1\relax + #2\relax \endgroup \resetcharacteralign \egroup} diff --git a/Master/texmf-dist/tex/context/base/typo-txt.mkvi b/Master/texmf-dist/tex/context/base/typo-txt.mkvi index fa79a4f6b87..7562fe70cd0 100644 --- a/Master/texmf-dist/tex/context/base/typo-txt.mkvi +++ b/Master/texmf-dist/tex/context/base/typo-txt.mkvi @@ -194,4 +194,51 @@ %D \HL %D \stoptabulate +%D This is used in the beginners manual. One needs to set the font size to an +%D acceptable value for this to work. + +\unexpanded\def\startnicelyfilledbox + {\vbox\bgroup + \forgetall + \dosingleempty\dostartnicelyfilledbox} + +\def\dostartnicelyfilledbox[#1]% + {\letdummyparameter\c!width \hsize + \letdummyparameter\c!height\vsize + \letdummyparameter\c!offset\exheight % we obey to the outer exheight + \letdummyparameter\c!strut \v!yes % we obey to the inner strut ! + \getdummyparameters[#1]% + \scratchoffset\dummyparameter\c!offset\relax + \setbox\scratchbox\vbox to \dummyparameter\c!height \bgroup + \hsize\dummyparameter\c!width\relax + \emergencystretch10\scratchoffset + \parfillskip\zeropoint + \baselineskip\zeropoint plus \onepoint minus \onepoint + \beginofshapebox + \leftskip \scratchoffset + \rightskip\scratchoffset} + +\unexpanded\def\stopnicelyfilledbox + {\doifelse{\dummyparameter\c!strut}\v!yes + {\xdef\doflushnicelyfilledbox + {\ht\shapebox\the\strutht + \dp\shapebox\the\strutdp + \box\shapebox}}% + {\gdef\doflushnicelyfilledbox + {\box\shapebox}}% + \endofshapebox + \doreshapebox + {\doflushnicelyfilledbox} + {\penalty\shapepenalty} + {\kern\shapekern} + {\vfil}% + \kern\scratchoffset + \vfilneg + \flushshapebox + \vfilneg + \kern\scratchoffset + \egroup + \box\scratchbox + \egroup} + \protect \endinput diff --git a/Master/texmf-dist/tex/context/base/typo-wrp.lua b/Master/texmf-dist/tex/context/base/typo-wrp.lua new file mode 100644 index 00000000000..07639392ff7 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-wrp.lua @@ -0,0 +1,76 @@ +if not modules then modules = { } end modules ['typo-wrp'] = { + version = 1.001, + comment = "companion to typo-wrp.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- begin/end par wrapping stuff ... more to come + +local nodecodes = nodes.nodecodes + +local glue_code = nodecodes.glue +local penalty_code = nodecodes.penalty +local parfill_skip_code = nodes.gluecodes.parfillskip +local user_penalty_code = nodes.penaltycodes.userpenalty + +local nuts = nodes.nuts +local tonut = nodes.tonut +local tonode = nodes.tonode + +local findtail = nuts.tail +local getprev = nuts.getprev +local getid = nuts.getid +local getsubtype = nuts.getsubtype +local getfield = nuts.getfield +local remove = nuts.remove + +local wrappers = { } +typesetters.wrappers = wrappers + +local trace_wrappers = trackers.register("typesetters.wrappers",function(v) trace_wrappers = v end) + +local report = logs.reporter("paragraphs","wrappers") + +-- we really need to pass tail too ... but then we need to check all the plugins +-- bah ... slowdown + +local function remove_dangling_crlf(head,tail) + if tail and getid(tail) == glue_code and getsubtype(tail) == parfill_skip_code then + tail = getprev(tail) + if tail and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getfield(tail,"penalty") == 10000 then + tail = getprev(tail) + if tail and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getfield(tail,"penalty") == -10000 then + if tail == head then + -- can't happen + else + if trace_wrappers then + report("removing a probably unwanted end-of-par break in line %s (guess)",tex.inputlineno) + end + remove(head,tail,true) + return head, tail, true + end + end + end + end + return head, tail, false +end + +function wrappers.handler(head) + local head = tonut(head) + if head then + local tail = findtail(head) + local done = false + head, tail, done = remove_dangling_crlf(head,tail) -- will be action chain + end + return head, true +end + +interfaces.implement { + name = "enablecrlf", + onlyonce = true, + actions = function() + nodes.tasks.enableaction("processors","typesetters.wrappers.handler") + end +} diff --git a/Master/texmf-dist/tex/context/base/typo-wrp.mkiv b/Master/texmf-dist/tex/context/base/typo-wrp.mkiv new file mode 100644 index 00000000000..0538a966273 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/typo-wrp.mkiv @@ -0,0 +1,65 @@ +%D \module +%D [ file=typo-wrp, +%D version=2014.11.09, +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Wrappers, +%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. + +\writestatus{loading}{ConTeXt Typesetting Macros / Wrapping} + +\unprotect + +\registerctxluafile{typo-wrp}{1.001} + +%D This definition has moved from page-lin.tex to spac-hor.tex (due to +%D visualization added in august 2003) and now to here (november 2014) +%D due to cacthing border cases in dirty and messy \XML\ sources). + +% \unexpanded\def\crlf +% {\ifhmode +% \unskip +% \prewordbreak\crlfplaceholder +% \ifcase\raggedstatus\hfil\or\or\or\hfil\fi +% \break +% \else +% \crlfplaceholder +% \endgraf +% \fi} + +\unexpanded\def\crlf + {\ifhmode + \expandafter\spac_crlf + \fi} + +\unexpanded\def\spac_crlf + {\clf_enablecrlf % once + \unskip + \prewordbreak % here or in \spac_crlf_placeholder + \spac_crlf_placeholder + \ifcase\raggedstatus\hfil\or\or\or\hfil\fi + \break + \ignorespaces} + +\unexpanded\def\spac_crlf_placeholder + {\strut} + +\unexpanded\def\spac_crlf_placeholder_show + {\hbox to \zeropoint{\strut{\infofont\kern.25\emwidth}\lohi{\infofont CR}{\infofont LF}\hss}} + +\unexpanded\def\settestcrlf + {\let\spac_crlf_placeholder\spac_crlf_placeholder_show} + +\unexpanded\def\crlfplaceholder % for old times sake + {\spac_crlf_placeholder} + +\appendtoks + \let\spac_crlf_placeholder\empty +\to \everysetnostrut + +\protect \endinput diff --git a/Master/texmf-dist/tex/context/base/unic-ini.lua b/Master/texmf-dist/tex/context/base/unic-ini.lua index cca1f06175a..132c92efaab 100644 --- a/Master/texmf-dist/tex/context/base/unic-ini.lua +++ b/Master/texmf-dist/tex/context/base/unic-ini.lua @@ -11,9 +11,13 @@ local utfchar = utf.char -- Beware, initializing unicodechar happens at first usage and takes -- 0.05 -- 0.1 second (lots of function calls). -function commands.unicodechar(asked) - local n = characters.unicodechar(asked) - if n then - context(utfchar(n)) +interfaces.implement { + name = "unicodechar", + arguments = "string", + actions = function(asked) + local n = characters.unicodechar(asked) + if n then + context(utfchar(n)) + end end -end +} diff --git a/Master/texmf-dist/tex/context/base/unic-ini.mkiv b/Master/texmf-dist/tex/context/base/unic-ini.mkiv index ece0da28355..13ad4bdb98f 100644 --- a/Master/texmf-dist/tex/context/base/unic-ini.mkiv +++ b/Master/texmf-dist/tex/context/base/unic-ini.mkiv @@ -26,8 +26,7 @@ %D %D \typebuffer \getbuffer -%def\unicodechar#1{\char\numexpr#1\relax} % no lookahead -\def\unicodechar#1{\ctxcommand{unicodechar("#1")}} +\def\unicodechar#1{\clf_unicodechar{#1}} \unexpanded\def\unknownchar {\dontleavehmode\hbox{\vrule\s!width.5\emwidth\s!height\exheight\s!depth\zeropoint}} diff --git a/Master/texmf-dist/tex/context/base/util-dim.lua b/Master/texmf-dist/tex/context/base/util-dim.lua index 69061495f94..2bdb870e7a4 100644 --- a/Master/texmf-dist/tex/context/base/util-dim.lua +++ b/Master/texmf-dist/tex/context/base/util-dim.lua @@ -24,13 +24,15 @@ local formatters = string.formatters local texget = tex and tex.get or function() return 65536*10*100 end +local p_stripzeros = lpeg.patterns.stripzeros + --this might become another namespace number = number or { } local number = number -number.tonumberf = function(n) return match(format("%.20f",n),"(.-0?)0*$") end -- one zero too much but alas -number.tonumberg = function(n) return format("%.20g",n) end +number.tonumberf = function(n) return lpegmatch(p_stripzeros,format("%.20f",n)) end +number.tonumberg = function(n) return format("%.20g",n) end local dimenfactors = allocate { ["pt"] = 1/65536, @@ -46,66 +48,65 @@ local dimenfactors = allocate { ["nc"] = ( 5080/65043)/65536 } ---~ print(table.serialize(dimenfactors)) ---~ ---~ %.99g: ---~ ---~ t={ ---~ ["bp"]=1.5201782378580324e-005, ---~ ["cc"]=1.1883696112892098e-006, ---~ ["cm"]=5.3628510057769479e-007, ---~ ["dd"]=1.4260435335470516e-005, ---~ ["em"]=0.000152587890625, ---~ ["ex"]=6.103515625e-005, ---~ ["in"]=2.1113586636917117e-007, ---~ ["mm"]=5.3628510057769473e-008, ---~ ["nc"]=1.1917446679504327e-006, ---~ ["nd"]=1.4300936015405194e-005, ---~ ["pc"]=1.2715657552083333e-006, ---~ ["pt"]=1.52587890625e-005, ---~ ["sp"]=1, ---~ } ---~ ---~ patched %s and tonumber ---~ ---~ t={ ---~ ["bp"]=0.00001520178238, ---~ ["cc"]=0.00000118836961, ---~ ["cm"]=0.0000005362851, ---~ ["dd"]=0.00001426043534, ---~ ["em"]=0.00015258789063, ---~ ["ex"]=0.00006103515625, ---~ ["in"]=0.00000021113587, ---~ ["mm"]=0.00000005362851, ---~ ["nc"]=0.00000119174467, ---~ ["nd"]=0.00001430093602, ---~ ["pc"]=0.00000127156576, ---~ ["pt"]=0.00001525878906, ---~ ["sp"]=1, ---~ } +-- print(table.serialize(dimenfactors)) +-- +-- %.99g: +-- +-- t={ +-- ["bp"]=1.5201782378580324e-005, +-- ["cc"]=1.1883696112892098e-006, +-- ["cm"]=5.3628510057769479e-007, +-- ["dd"]=1.4260435335470516e-005, +-- ["em"]=0.000152587890625, +-- ["ex"]=6.103515625e-005, +-- ["in"]=2.1113586636917117e-007, +-- ["mm"]=5.3628510057769473e-008, +-- ["nc"]=1.1917446679504327e-006, +-- ["nd"]=1.4300936015405194e-005, +-- ["pc"]=1.2715657552083333e-006, +-- ["pt"]=1.52587890625e-005, +-- ["sp"]=1, +-- } +-- +-- patched %s and tonumber +-- +-- t={ +-- ["bp"]=0.00001520178238, +-- ["cc"]=0.00000118836961, +-- ["cm"]=0.0000005362851, +-- ["dd"]=0.00001426043534, +-- ["em"]=0.00015258789063, +-- ["ex"]=0.00006103515625, +-- ["in"]=0.00000021113587, +-- ["mm"]=0.00000005362851, +-- ["nc"]=0.00000119174467, +-- ["nd"]=0.00001430093602, +-- ["pc"]=0.00000127156576, +-- ["pt"]=0.00001525878906, +-- ["sp"]=1, +-- } --[[ldx--

A conversion function that takes a number, unit (string) and optional format (string) is implemented using this table.

--ldx]]-- +local f_none = formatters["%s%s"] +local f_true = formatters["%0.5F%s"] -local function numbertodimen(n,unit,fmt) +local function numbertodimen(n,unit,fmt) -- will be redefined later ! if type(n) == 'string' then return n else unit = unit or 'pt' + n = n * dimenfactors[unit] if not fmt then - fmt = "%s%s" + fmt = f_none(n,unit) elseif fmt == true then - fmt = "%0.5f%s" + fmt = f_true(n,unit) + else + return formatters[fmt](n,unit) end - return format(fmt,n*dimenfactors[unit],unit) - -- if fmt then - -- return format(fmt,n*dimenfactors[unit],unit) - -- else - -- return match(format("%.20f",n*dimenfactors[unit]),"(.-0?)0*$") .. unit - -- end end end diff --git a/Master/texmf-dist/tex/context/base/util-env.lua b/Master/texmf-dist/tex/context/base/util-env.lua index e96a464b03a..b72226900a9 100644 --- a/Master/texmf-dist/tex/context/base/util-env.lua +++ b/Master/texmf-dist/tex/context/base/util-env.lua @@ -9,11 +9,11 @@ if not modules then modules = { } end modules ['util-env'] = { local allocate, mark = utilities.storage.allocate, utilities.storage.mark local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find -local unquoted, quoted = string.unquoted, string.quoted +local unquoted, quoted, optionalquoted = string.unquoted, string.quoted, string.optionalquoted local concat, insert, remove = table.concat, table.insert, table.remove -environment = environment or { } -local environment = environment +environment = environment or { } +local environment = environment -- precautions @@ -182,26 +182,14 @@ function environment.splitarguments(separator) -- rather special, cut-off before end function environment.reconstructcommandline(arg,noquote) + local resolveprefix = resolvers.resolve -- something rather special arg = arg or environment.originalarguments if noquote and #arg == 1 then - -- we could just do: return unquoted(resolvers.resolve(arg[i])) - local a = arg[1] - a = resolvers.resolve(a) - a = unquoted(a) - return a + return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1]) elseif #arg > 0 then local result = { } for i=1,#arg do - -- we could just do: result[#result+1] = format("%q",unquoted(resolvers.resolve(arg[i]))) - local a = arg[i] - a = resolvers.resolve(a) - a = unquoted(a) - a = gsub(a,'"','\\"') -- tricky - if find(a," ",1,true) then - result[#result+1] = quoted(a) - else - result[#result+1] = a - end + result[i] = optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix) end return concat(result," ") else @@ -238,26 +226,10 @@ end -- print(environment.relativepath("//x")) -- //x -- print(environment.relativepath()) -- e:/tmp --- -- to be tested: --- --- function environment.reconstructcommandline(arg,noquote) --- arg = arg or environment.originalarguments --- if noquote and #arg == 1 then --- return unquoted(resolvers.resolve(arg[1])) --- elseif #arg > 0 then --- local result = { } --- for i=1,#arg do --- result[#result+1] = format("%q",unquoted(resolvers.resolve(arg[i]))) -- always quote --- end --- return concat(result," ") --- else --- return "" --- end --- end - if arg then -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later) + local newarg, instring = { }, false for index=1,#arg do diff --git a/Master/texmf-dist/tex/context/base/util-prs.lua b/Master/texmf-dist/tex/context/base/util-prs.lua index 2cede919b1e..ea34c2c279d 100644 --- a/Master/texmf-dist/tex/context/base/util-prs.lua +++ b/Master/texmf-dist/tex/context/base/util-prs.lua @@ -167,7 +167,7 @@ local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace) + C((nestedbraces + (1-comma))^0) local pattern = spaces * Ct(value*(separator*value)^0) --- "aap, {noot}, mies" : outer {} removes, leading spaces ignored +-- "aap, {noot}, mies" : outer {} removed, leading spaces ignored patterns.settings_to_array = pattern @@ -195,12 +195,40 @@ end -- -- "{123} , 456 " -> "123" "456" -local separator = space^0 * comma * space^0 -local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace) - + C((nestedbraces + (1-(space^0*(comma+P(-1)))))^0) -local withvalue = Carg(1) * value / function(f,s) return f(s) end -local pattern_a = spaces * Ct(value*(separator*value)^0) -local pattern_b = spaces * withvalue * (separator*withvalue)^0 +-- local separator = space^0 * comma * space^0 +-- local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace) +-- + C((nestedbraces + (1-(space^0*(comma+P(-1)))))^0) +-- local withvalue = Carg(1) * value / function(f,s) return f(s) end +-- local pattern_a = spaces * Ct(value*(separator*value)^0) +-- local pattern_b = spaces * withvalue * (separator*withvalue)^0 + +local cache_a = { } +local cache_b = { } + +function parsers.groupedsplitat(symbol,withaction) + if not symbol then + symbol = "," + end + local pattern = (withaction and cache_b or cache_a)[symbol] + if not pattern then + local symbols = S(symbol) + local separator = space^0 * symbols * space^0 + local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace) + + C((nestedbraces + (1-(space^0*(symbols+P(-1)))))^0) + if withaction then + local withvalue = Carg(1) * value / function(f,s) return f(s) end + pattern = spaces * withvalue * (separator*withvalue)^0 + cache_b[symbol] = pattern + else + pattern = spaces * Ct(value*(separator*value)^0) + cache_a[symbol] = pattern + end + end + return pattern +end + +local pattern_a = parsers.groupedsplitat(",",false) +local pattern_b = parsers.groupedsplitat(",",true) function parsers.stripped_settings_to_array(str) if not str or str == "" then @@ -221,8 +249,6 @@ end -- parsers.process_stripped_settings("{123} , 456 ",function(s) print("["..s.."]") end) -- parsers.process_stripped_settings("123 , 456 ",function(s) print("["..s.."]") end) --- - local function set(t,v) t[#t+1] = v end @@ -275,15 +301,25 @@ function parsers.array_to_string(a,separator) end end -function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway - t = t or { } --- for s in gmatch(str,"%s*([^, ]+)") do -- space added - for s in gmatch(str,"[^, ]+") do -- space added - t[s] = true - end - return t +-- function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway +-- if str then +-- t = t or { } +-- for s in gmatch(str,"[^, ]+") do -- space added +-- t[s] = true +-- end +-- return t +-- else +-- return { } +-- end +-- end + +local pattern = Cf(Ct("") * Cg(C((1-S(", "))^1) * S(", ")^0 * Cc(true))^1,rawset) + +function utilities.parsers.settings_to_set(str,t) + return str and lpegmatch(pattern,str) or { } end + function parsers.simple_hash_to_string(h, separator) local t, tn = { }, 0 for k, v in sortedhash(h) do @@ -297,7 +333,7 @@ end -- for mtx-context etc: aaaa bbbb cccc=dddd eeee=ffff -local str = C((1-whitespace-equal)^1) +local str = Cs(lpegpatterns.unquoted) + C((1-whitespace-equal)^1) local setting = Cf( Carg(1) * (whitespace^0 * Cg(str * whitespace^0 * (equal * whitespace^0 * str + Cc(""))))^1,rawset) local splitter = setting^1 @@ -305,6 +341,12 @@ function utilities.parsers.options_to_hash(str,target) return str and lpegmatch(splitter,str,1,target or { }) or { } end +local splitter = lpeg.tsplitat(" ") + +function utilities.parsers.options_to_array(str) + return str and lpegmatch(splitter,str) or { } +end + -- for chem (currently one level) local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace) @@ -488,7 +530,7 @@ function parsers.rfc4180splitter(specification) local field = escaped + non_escaped + Cc("") local record = Ct(field * (separator * field)^1) local headerline = record * Cp() - local wholeblob = Ct((newline^-1 * record)^0) + local wholeblob = Ct((newline^(specification.strict and -1 or 1) * record)^0) return function(data,getheader) if getheader then local header, position = lpegmatch(headerline,data) @@ -542,8 +584,8 @@ end -- -local pattern_math = Cs((P("%")/"\\percent " + P("^") * Cc("{") * lpegpatterns.integer * Cc("}") + P(1))^0) -local pattern_text = Cs((P("%")/"\\percent " + (P("^")/"\\high") * Cc("{") * lpegpatterns.integer * Cc("}") + P(1))^0) +local pattern_math = Cs((P("%")/"\\percent " + P("^") * Cc("{") * lpegpatterns.integer * Cc("}") + anything)^0) +local pattern_text = Cs((P("%")/"\\percent " + (P("^")/"\\high") * Cc("{") * lpegpatterns.integer * Cc("}") + anything)^0) patterns.unittotex = pattern @@ -551,7 +593,7 @@ function parsers.unittotex(str,textmode) return lpegmatch(textmode and pattern_text or pattern_math,str) end -local pattern = Cs((P("^") / "" * lpegpatterns.integer * Cc("") + P(1))^0) +local pattern = Cs((P("^") / "" * lpegpatterns.integer * Cc("") + anything)^0) function parsers.unittoxml(str) return lpegmatch(pattern,str) @@ -648,3 +690,27 @@ function utilities.parsers.runtime(time) local seconds = mod(time,60) return days, hours, minutes, seconds end + +-- + +local spacing = whitespace^0 +local apply = P("->") +local method = C((1-apply)^1) +local token = lbrace * C((1-rbrace)^1) * rbrace + C(anything^1) + +local pattern = spacing * (method * spacing * apply + Carg(1)) * spacing * token + +function utilities.parsers.splitmethod(str,default) + if str then + return lpegmatch(pattern,str,1,default or false) + else + return default or false, "" + end +end + +-- print(utilities.parsers.splitmethod(" foo -> {bar} ")) +-- print(utilities.parsers.splitmethod("foo->{bar}")) +-- print(utilities.parsers.splitmethod("foo->bar")) +-- print(utilities.parsers.splitmethod("foo")) +-- print(utilities.parsers.splitmethod("{foo}")) +-- print(utilities.parsers.splitmethod()) diff --git a/Master/texmf-dist/tex/context/base/util-sbx.lua b/Master/texmf-dist/tex/context/base/util-sbx.lua new file mode 100644 index 00000000000..260e8b3b5a7 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/util-sbx.lua @@ -0,0 +1,415 @@ +if not modules then modules = { } end modules ['util-sbx'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Note: we use expandname and collapsepath and these use chdir +-- which is overloaded so we need to use originals there. Just +-- something to keep in mind. + +if not sandbox then require("l-sandbox") end -- for testing + +local next, type = next, type + +local replace = utilities.templates.replace +local collapsepath = file.collapsepath +local expandname = dir.expandname +local sortedhash = table.sortedhash +local lpegmatch = lpeg.match +local platform = os.type +local P, S, C = lpeg.P, lpeg.S, lpeg.C +local gsub = string.gsub +local lower = string.lower +local unquoted = string.unquoted +local optionalquoted = string.optionalquoted + +local sandbox = sandbox +local validroots = { } +local validrunners = { } +local validbinaries = { } +local validators = { } +local p_validroot = nil +local finalized = nil +local norunners = false +local trace = false +local p_split = lpeg.tsplitat(" ") -- more spaces? + +local report = logs.reporter("sandbox") + +trackers.register("sandbox",function(v) trace = v end) -- often too late anyway + +sandbox.setreporter(report) + +sandbox.finalizer(function() + finalized = true +end) + +local function registerroot(root,what) -- what == read|write + if finalized then + report("roots are already finalized") + else + root = collapsepath(expandname(root)) + if platform == "windows" then + root = lower(root) -- we assume ascii names + end + -- true: read & write | false: read + validroots[root] = what == "write" or false + end +end + +sandbox.finalizer(function() -- initializers can set the path + if p_validroot then + report("roots are already initialized") + else + sandbox.registerroot(".","write") -- always ok + -- also register texmf as read + for name in sortedhash(validroots) do + if p_validroot then + p_validroot = P(name) + p_validroot + else + p_validroot = P(name) + end + end + p_validroot = p_validroot / validroots + end +end) + +local function registerrunner(specification) + if finalized then + report("runners are already finalized") + else + local name = specification.name + if not name then + report("no runner name specified") + return + end + local program = specification.program + if type(program) == "string" then + -- common for all platforms + elseif type(program) == "table" then + program = program[platform] + end + if type(program) ~= "string" or program == "" then + report("invalid runner %a specified for platform %a",name,platform) + return + end + specification.program = program + validrunners[name] = specification + end +end + +local function registerbinary(name) + if finalized then + report("binaries are already finalized") + elseif type(name) == "string" and name ~= "" then + validbinaries[name] = true + end +end + +-- begin of validators + +local p_write = S("wa") p_write = (1 - p_write)^0 * p_write +local p_path = S("\\/~$%:") p_path = (1 - p_path )^0 * p_path -- be easy on other arguments + +local function normalized(name) -- only used in executers + if platform == "windows" then + name = gsub(name,"/","\\") + end + return name +end + +function sandbox.possiblepath(name) + return lpegmatch(p_path,name) and true or false +end + +local filenamelogger = false + +function sandbox.setfilenamelogger(l) + filenamelogger = type(l) == "function" and l or false +end + +local function validfilename(name,what) + if p_validroot and type(name) == "string" and lpegmatch(p_path,name) then + local asked = collapsepath(expandname(name)) + if platform == "windows" then + asked = lower(asked) -- we assume ascii names + end + local okay = lpegmatch(p_validroot,asked) + if okay == true then + -- read and write access + if filenamelogger then + filenamelogger(name,"w",asked,true) + end + return name + elseif okay == false then + -- read only access + if not what then + -- no further argument to io.open so a readonly case + if filenamelogger then + filenamelogger(name,"r",asked,true) + end + return name + elseif lpegmatch(p_write,what) then + if filenamelogger then + filenamelogger(name,"w",asked,false) + end + return -- we want write access + else + if filenamelogger then + filenamelogger(name,"r",asked,true) + end + return name + end + else + if filenamelogger then + filenamelogger(name,"*",name,false) + end + end + else + return name + end +end + +local function readable(name) + if platform == "windows" then + name = lower(name) -- we assume ascii names + end + local valid = validfilename(name,"r") + if valid then + return normalized(valid) + end +end + +local function writeable(name) + if platform == "windows" then + name = lower(name) -- we assume ascii names + end + local valid = validfilename(name,"w") + if valid then + return normalized(valid) + end +end + +validators.readable = readable +validators.writeable = writeable +validators.filename = readable + +table.setmetatableindex(validators,function(t,k) + if k then + t[k] = readable + end + return readable +end) + +function validators.string(s) + return s -- can be used to prevent filename checking +end + +-- end of validators + +sandbox.registerroot = registerroot +sandbox.registerrunner = registerrunner +sandbox.registerbinary = registerbinary +sandbox.validfilename = validfilename + +local function filehandlerone(action,one,...) + local checkedone = validfilename(one) + if checkedone then + return action(one,...) + else +-- report("file %a is unreachable",one) + end +end + +local function filehandlertwo(action,one,two,...) + local checkedone = validfilename(one) + if checkedone then + local checkedtwo = validfilename(two) + if checkedtwo then + return action(one,two,...) + else +-- report("file %a is unreachable",two) + end + else +-- report("file %a is unreachable",one) + end +end + +local function iohandler(action,one,...) + if type(one) == "string" then + local checkedone = validfilename(one) + if checkedone then + return action(one,...) + end + elseif one then + return action(one,...) + else + return action() + end +end + +-- runners can be strings or tables +-- +-- os.execute : string +-- os.exec : table with program in [0|1] +-- os.spawn : table with program in [0|1] +-- +-- our execute: registered program with specification + +local function runhandler(action,name,specification) + local kind = type(name) + if kind ~= "string" then + return + end + if norunners then + report("no runners permitted, ignoring command: %s",name) + return + end + local spec = validrunners[name] + if not spec then + report("unknown runner: %s",name) + return + end + -- specs are already checked + local program = spec.program + local variables = { } + local checkers = spec.checkers or { } + if specification then + -- we only handle runners that are defined before the sandbox is + -- closed so in principle we cannot have user runs with no files + -- while for context runners we assume a robust specification + for k, v in next, specification do + local checker = validators[checkers[k]] + local value = checker(unquoted(v)) -- todo: write checkers + if value then + variables[k] = optionalquoted(value) + else + report("suspicious argument found, run blocked: %s",v) + return + end + end + end + local command = replace(program,variables) + if trace then + report("executing runner: %s",command) + end + return action(command) +end + +-- only registered (from list) -- no checking on writable so let's assume harmless +-- runs + +local function binaryhandler(action,name) + local kind = type(name) + local list = name + if kind == "string" then + list = lpegmatch(p_split,name) + end + local program = name[0] or name[1] + if type(program) ~= "string" or program == "" then + return --silently ignore + end + if norunners then + report("no binaries permitted, ignoring command: %s",program) + return + end + if not validbinaries[program] then + report("binary is not permitted: %s",program) + return + end + for i=0,#list do + local n = list[i] + if n then + local v = readable(unquoted(n)) + if v then + list[i] = optionalquoted(v) + else + report("suspicious argument found, run blocked: %s",n) + return + end + end + end + return action(name) +end + +sandbox.filehandlerone = filehandlerone +sandbox.filehandlertwo = filehandlertwo +sandbox.iohandler = iohandler +sandbox.runhandler = runhandler +sandbox.binaryhandler = binaryhandler + +function sandbox.disablerunners() + norunners = true +end + +local execute = sandbox.original(os.execute) + +function sandbox.run(name,specification) + return runhandler(execute,name,specification) +end + +------------------- + +local overload = sandbox.overload +local register = sandbox.register + + overload(loadfile, filehandlerone,"loadfile") -- todo + +if io then + overload(io.open, filehandlerone,"io.open") + overload(io.popen, filehandlerone,"io.popen") + overload(io.input, iohandler, "io.input") + overload(io.output, iohandler, "io.output") + overload(io.lines, filehandlerone,"io.lines") +end + +if os then + overload(os.execute, binaryhandler, "os.execute") + overload(os.spawn, binaryhandler, "os.spawn") + overload(os.exec, binaryhandler, "os.exec") + overload(os.rename, filehandlertwo,"os.rename") + overload(os.remove, filehandlerone,"os.remove") +end + +if lfs then + overload(lfs.chdir, filehandlerone,"lfs.chdir") + overload(lfs.mkdir, filehandlerone,"lfs.mkdir") + overload(lfs.rmdir, filehandlerone,"lfs.rmdir") + overload(lfs.isfile, filehandlerone,"lfs.isfile") + overload(lfs.isdir, filehandlerone,"lfs.isdir") + overload(lfs.attributes, filehandlerone,"lfs.attributes") + overload(lfs.dir, filehandlerone,"lfs.dir") + overload(lfs.lock_dir, filehandlerone,"lfs.lock_dir") + overload(lfs.touch, filehandlerone,"lfs.touch") + overload(lfs.link, filehandlertwo,"lfs.link") + overload(lfs.setmode, filehandlerone,"lfs.setmode") + overload(lfs.readlink, filehandlerone,"lfs.readlink") + overload(lfs.shortname, filehandlerone,"lfs.shortname") + overload(lfs.symlinkattributes,filehandlerone,"lfs.symlinkattributes") +end + +-- these are used later on + +if zip then + zip.open = register(zip.open, filehandlerone,"zip.open") +end + +if fontloader then + fontloader.open = register(fontloader.open,filehandlerone,"fontloader.open") + fontloader.info = register(fontloader.info,filehandlerone,"fontloader.info") +end + +if epdf then + epdf.open = register(epdf.open, filehandlerone,"epdf.open") +end + +-- not used in a normal mkiv run : os.spawn = os.execute +-- not used in a normal mkiv run : os.exec = os.exec + +-- print(io.open("test.log")) +-- sandbox.enable() +-- print(io.open("test.log")) +-- print(io.open("t:/test.log")) diff --git a/Master/texmf-dist/tex/context/base/util-seq.lua b/Master/texmf-dist/tex/context/base/util-seq.lua index 35e6932855c..08fc4e95cb8 100644 --- a/Master/texmf-dist/tex/context/base/util-seq.lua +++ b/Master/texmf-dist/tex/context/base/util-seq.lua @@ -17,13 +17,15 @@ use locals to refer to them when compiling the chain.

-- todo: protect groups (as in tasks) -local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch +local gsub, concat, gmatch = string.gsub, table.concat, string.gmatch local type, load = type, load utilities = utilities or { } local tables = utilities.tables local allocate = utilities.storage.allocate +local formatters = string.formatters + local sequencers = { } utilities.sequencers = sequencers @@ -31,6 +33,7 @@ local functions = allocate() sequencers.functions = functions local removevalue = tables.removevalue +local replacevalue = tables.replacevalue local insertaftervalue = tables.insertaftervalue local insertbeforevalue = tables.insertbeforevalue @@ -189,6 +192,18 @@ function sequencers.removeaction(t,group,action,force) end end +function sequencers.replaceaction(t,group,oldaction,newaction,force) + t = known[t] + if t then + local g = t.list[group] + if g and (force or validaction(oldaction)) then + replacevalue(g,oldaction,newaction) + t.dirty = true + t.runner = nil + end + end +end + local function localize(str) return (gsub(str,"[%.: ]+","_")) end @@ -204,20 +219,23 @@ local function construct(t) for i=1,#actions do local action = actions[i] if not askip[action] then + local localized if type(action) == "function" then local name = localize(tostring(action)) functions[name] = action - action = format("utilities.sequencers.functions.%s",name) + action = formatters["utilities.sequencers.functions.%s"](name) + localized = localize(name) -- shorter than action + else + localized = localize(action) end - local localized = localize(action) n = n + 1 - variables[n] = format("local %s = %s",localized,action) + variables[n] = formatters["local %s = %s"](localized,action) if not returnvalues then - calls[n] = format("%s(%s)",localized,arguments) + calls[n] = formatters["%s(%s)"](localized,arguments) elseif n == 1 then - calls[n] = format("local %s = %s(%s)",returnvalues,localized,arguments) + calls[n] = formatters["local %s = %s(%s)"](returnvalues,localized,arguments) else - calls[n] = format("%s = %s(%s)",returnvalues,localized,arguments) + calls[n] = formatters["%s = %s(%s)"](returnvalues,localized,arguments) end end end @@ -230,9 +248,9 @@ local function construct(t) variables = concat(variables,"\n") calls = concat(calls,"\n") if results then - t.compiled = format("%s\nreturn function(%s)\n%s\nreturn %s\nend",variables,arguments,calls,results) + t.compiled = formatters["%s\nreturn function(%s)\n%s\nreturn %s\nend"](variables,arguments,calls,results) else - t.compiled = format("%s\nreturn function(%s)\n%s\nend",variables,arguments,calls) + t.compiled = formatters["%s\nreturn function(%s)\n%s\nend"](variables,arguments,calls) end end -- print(t.compiled) @@ -258,6 +276,7 @@ compile = function(t,compiler,n) -- already referred to in sequencers.new if compiled == "" then runner = false else +-- inspect(compiled) runner = compiled and load(compiled)() -- we can use loadstripped here end t.runner = runner @@ -314,12 +333,12 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug if not askip[action] then local localized = localize(action) n = n + 1 - vars[n] = format("local %s = %s",localized,action) + vars[n] = formatters["local %s = %s"](localized,action) -- only difference with tostring is kind and rets (why no return) if kind[action] == "nohead" then - calls[n] = format(" ok = %s(head%s) done = done or ok",localized,args) + calls[n] = formatters[" ok = %s(head%s) done = done or ok"](localized,args) else - calls[n] = format(" head, ok = %s(head%s) done = done or ok",localized,args) + calls[n] = formatters[" head, ok = %s(head%s) done = done or ok"](localized,args) end -- local s = " print('" .. tostring(group) .. " " .. tostring(action) .. " : ' .. tostring(head)) " -- calls[n] = s .. calls[n] .. s @@ -327,6 +346,6 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug end end end - local processor = #calls > 0 and format(template_yes,concat(vars,"\n"),args,concat(calls,"\n")) or template_nop + local processor = #calls > 0 and formatters[template_yes](concat(vars,"\n"),args,concat(calls,"\n")) or template_nop return processor end diff --git a/Master/texmf-dist/tex/context/base/util-sql-loggers.lua b/Master/texmf-dist/tex/context/base/util-sql-loggers.lua index 7fceb8032c0..ceb1ff75cfa 100644 --- a/Master/texmf-dist/tex/context/base/util-sql-loggers.lua +++ b/Master/texmf-dist/tex/context/base/util-sql-loggers.lua @@ -52,7 +52,7 @@ table.setmetatableindex(fromtype,function() return "info" end) loggers.totype = totype loggers.fromtype = fromtype -local template =[[ +local template = [[ CREATE TABLE IF NOT EXISTS %basename% ( `id` int(11) NOT NULL AUTO_INCREMENT, `time` int(11) NOT NULL, diff --git a/Master/texmf-dist/tex/context/base/util-sta.lua b/Master/texmf-dist/tex/context/base/util-sta.lua index 1a61ec4e6c4..27ab5a624b6 100644 --- a/Master/texmf-dist/tex/context/base/util-sta.lua +++ b/Master/texmf-dist/tex/context/base/util-sta.lua @@ -81,6 +81,8 @@ end function stacker.new(name) + local report = logs.reporter("stacker",name or nil) + local s local stack = { } @@ -126,8 +128,18 @@ function stacker.new(name) end end - local tops = { } - local top, switch + local tops = { } + local top = nil + local switch = nil + + local function resolve_reset(mode) + if #tops > 0 then + report("resetting %s left-over states of %a",#tops,name) + end + tops = { } + top = nil + switch = nil + end local function resolve_begin(mode) if mode then @@ -206,8 +218,7 @@ function stacker.new(name) local function resolve_end() -- resolve_step(s.unset) - local noftop = #top - if noftop > 0 then + if #tops > 0 then -- was #top brrr local result = s.stop(s,top,1,#top) remove(tops) top = tops[#tops] @@ -224,8 +235,6 @@ function stacker.new(name) resolve_end() end - local report = logs.reporter("stacker",name or nil) - s = { name = name or "unknown", unset = -1, @@ -240,6 +249,7 @@ function stacker.new(name) resolve_begin = resolve_begin, resolve_step = resolve_step, resolve_end = resolve_end, + resolve_reset = resolve_reset, } return s -- we can overload functions diff --git a/Master/texmf-dist/tex/context/base/util-str.lua b/Master/texmf-dist/tex/context/base/util-str.lua index 5609cdf255d..a677a82ed5c 100644 --- a/Master/texmf-dist/tex/context/base/util-str.lua +++ b/Master/texmf-dist/tex/context/base/util-str.lua @@ -216,14 +216,19 @@ local striplinepatterns = { ["retain"] = p_retain_normal, ["retain and collapse"] = p_retain_collapse, ["retain and no empty"] = p_retain_noempty, + ["collapse"] = patterns.collapser, -- how about: stripper fullstripper } +setmetatable(striplinepatterns,{ __index = function(t,k) return p_prune_collapse end }) + strings.striplinepatterns = striplinepatterns function strings.striplines(str,how) - return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str + return str and lpegmatch(striplinepatterns[how],str) or str end +-- also see: string.collapsespaces + strings.striplong = strings.striplines -- for old times sake -- local str = table.concat( { @@ -356,10 +361,10 @@ strings.tracers = tracedchars function string.tracedchar(b) -- todo: table if type(b) == "number" then - return tracedchars[b] or (utfchar(b) .. " (U+" .. format('%05X',b) .. ")") + return tracedchars[b] or (utfchar(b) .. " (U+" .. format("%05X",b) .. ")") else local c = utfbyte(b) - return tracedchars[c] or (b .. " (U+" .. format('%05X',c) .. ")") + return tracedchars[c] or (b .. " (U+" .. (c and format("%05X",c) or "?????") .. ")") end end @@ -525,12 +530,21 @@ local format_f = function(f) return format("format('%%%sf',a%s)",f,n) end -local format_F = function(f) +-- The next one formats an integer as integer and very small values as zero. This is needed +-- for pdf backend code. +-- +-- 1.23 % 1 : 0.23 +-- - 1.23 % 1 : 0.77 +-- +-- We could probably use just %s with integers but who knows what Lua 5.3 will do? So let's +-- for the moment use %i. + +local format_F = function(f) -- beware, no cast to number n = n + 1 if not f or f == "" then - return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n) + return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n) else - return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n) + return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n) end end @@ -830,7 +844,7 @@ local builder = Cs { "start", + V("m") + V("M") -- new + V("z") -- new -- - + V("*") -- ignores probably messed up % + -- + V("?") -- ignores probably messed up % ) + V("*") ) @@ -885,6 +899,7 @@ local builder = Cs { "start", ["A"] = (prefix_any * P("A")) / format_A, -- %A => "..." (forces tostring) -- ["*"] = Cs(((1-P("%"))^1 + P("%%")/"%%")^1) / format_rest, -- rest (including %%) + ["?"] = Cs(((1-P("%"))^1 )^1) / format_rest, -- rest (including %%) -- ["!"] = Carg(2) * prefix_any * P("!") * C((1-P("!"))^1) * P("!") / format_extension, } @@ -1082,3 +1097,23 @@ end -- string.formatteds = formatteds -- -- setmetatable(formatteds, { __index = make, __call = use }) + +-- This is a somewhat silly one used in commandline reconstruction but the older +-- method, using a combination of fine, gsub, quoted and unquoted was not that +-- reliable. +-- +-- '"foo"bar \"and " whatever"' => "foo\"bar \"and \" whatever" +-- 'foo"bar \"and " whatever' => "foo\"bar \"and \" whatever" + +local dquote = patterns.dquote -- P('"') +local equote = patterns.escaped + dquote / '\\"' + 1 +local space = patterns.space +local cquote = Cc('"') + +local pattern = + Cs(dquote * (equote - P(-2))^0 * dquote) -- we keep the outer but escape unescaped ones + + Cs(cquote * (equote - space)^0 * space * equote^0 * cquote) -- we escape unescaped ones + +function string.optionalquoted(str) + return lpegmatch(pattern,str) or str +end diff --git a/Master/texmf-dist/tex/context/base/util-tab.lua b/Master/texmf-dist/tex/context/base/util-tab.lua index f9e9b318df3..5eae0d5f676 100644 --- a/Master/texmf-dist/tex/context/base/util-tab.lua +++ b/Master/texmf-dist/tex/context/base/util-tab.lua @@ -98,6 +98,17 @@ function tables.removevalue(t,value) -- todo: n end end +function tables.replacevalue(t,oldvalue,newvalue) + if oldvalue and newvalue then + for i=1,#t do + if t[i] == oldvalue then + t[i] = newvalue + -- replace all, so no: return + end + end + end +end + function tables.insertbeforevalue(t,value,extra) for i=1,#t do if t[i] == extra then @@ -612,7 +623,7 @@ function table.serialize(root,name,specification) depth = depth + 1 end -- we could check for k (index) being number (cardinal) - if root and next(root) then + if root and next(root) ~= nil then local first = nil local last = 0 last = #root @@ -637,7 +648,7 @@ function table.serialize(root,name,specification) elseif tv == "string" then n = n + 1 t[n] = f_val_str(depth,v) elseif tv == "table" then - if not next(v) then + if next(v) == nil then n = n + 1 t[n] = f_val_not(depth) else local st = simple_table(v) @@ -667,7 +678,7 @@ function table.serialize(root,name,specification) n = n + 1 t[n] = f_key_boo_value_str(depth,k,v) end elseif tv == "table" then - if not next(v) then + if next(v) == nil then if tk == "number" then n = n + 1 t[n] = f_key_num_value_not(depth,k,v) elseif tk == "string" then @@ -731,7 +742,7 @@ function table.serialize(root,name,specification) root._w_h_a_t_e_v_e_r_ = nil end -- Let's forget about empty tables. - if next(root) then + if next(root) ~= nil then do_serialize(root,name,1,0) end end diff --git a/Master/texmf-dist/tex/context/base/util-tpl.lua b/Master/texmf-dist/tex/context/base/util-tpl.lua index 67d05822116..468dd429c98 100644 --- a/Master/texmf-dist/tex/context/base/util-tpl.lua +++ b/Master/texmf-dist/tex/context/base/util-tpl.lua @@ -52,7 +52,7 @@ local sqlescape = lpeg.replacer { -- { "\t", "\\t" }, } -local sqlquoted = lpeg.Cs(lpeg.Cc("'") * sqlescape * lpeg.Cc("'")) +local sqlquoted = Cs(Cc("'") * sqlescape * Cc("'")) lpegpatterns.sqlescape = sqlescape lpegpatterns.sqlquoted = sqlquoted @@ -111,13 +111,26 @@ local luaescaper = escapers.lua local quotedluaescaper = quotedescapers.lua local function replacekeyunquoted(s,t,how,recurse) -- ".. \" " - local escaper = how and escapers[how] or luaescaper - return escaper(replacekey(s,t,how,recurse)) + if how == false then + return replacekey(s,t,how,recurse) + else + local escaper = how and escapers[how] or luaescaper + return escaper(replacekey(s,t,how,recurse)) + end end local function replacekeyquoted(s,t,how,recurse) -- ".. \" " - local escaper = how and quotedescapers[how] or quotedluaescaper - return escaper(replacekey(s,t,how,recurse)) + if how == false then + return replacekey(s,t,how,recurse) + else + local escaper = how and quotedescapers[how] or quotedluaescaper + return escaper(replacekey(s,t,how,recurse)) + end +end + +local function replaceoptional(l,m,r,t,how,recurse) + local v = t[l] + return v and v ~= "" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or "" end local single = P("%") -- test %test% test : resolves test @@ -135,12 +148,19 @@ local norquoted = rquoted / '' local nolquotedq = lquotedq / '' local norquotedq = rquotedq / '' -local key = nosingle * ((C((1-nosingle )^1) * Carg(1) * Carg(2) * Carg(3)) / replacekey ) * nosingle -local quoted = nolquotedq * ((C((1-norquotedq)^1) * Carg(1) * Carg(2) * Carg(3)) / replacekeyquoted ) * norquotedq -local unquoted = nolquoted * ((C((1-norquoted )^1) * Carg(1) * Carg(2) * Carg(3)) / replacekeyunquoted) * norquoted +local noloptional = P("%?") / '' +local noroptional = P("?%") / '' +local nomoptional = P(":") / '' + + +local args = Carg(1) * Carg(2) * Carg(3) +local key = nosingle * ((C((1-nosingle )^1) * args) / replacekey ) * nosingle +local quoted = nolquotedq * ((C((1-norquotedq )^1) * args) / replacekeyquoted ) * norquotedq +local unquoted = nolquoted * ((C((1-norquoted )^1) * args) / replacekeyunquoted) * norquoted +local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional local any = P(1) - replacer = Cs((unquoted + quoted + escape + key + any)^0) + replacer = Cs((unquoted + quoted + escape + optional + key + any)^0) local function replace(str,mapping,how,recurse) if mapping and str then @@ -156,6 +176,7 @@ end -- print(replace("test '%[x]%' test",{ x = [[a '%y%'  a]], y = "oeps" },'sql',true)) -- print(replace([[test %[x]% test]],{ x = [[a "x"  a]]})) -- print(replace([[test %(x)% test]],{ x = [[a "x"  a]]})) +-- print(replace([[convert %?x: -x "%x%" ?% %?y: -y "%y%" ?%]],{ x = "yes" })) templates.replace = replace @@ -188,3 +209,5 @@ end -- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" })) -- inspect(utilities.templates.resolve({ one = "%two%", two = "two", three = "%three%" })) +-- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" },false,true)) +-- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" },false)) diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.lua b/Master/texmf-dist/tex/context/base/x-asciimath.lua index 87f04b5ff7d..7ddf5a6379a 100644 --- a/Master/texmf-dist/tex/context/base/x-asciimath.lua +++ b/Master/texmf-dist/tex/context/base/x-asciimath.lua @@ -7,268 +7,2058 @@ if not modules then modules = { } end modules ['x-asciimath'] = { } --[[ldx-- -

Some backgrounds are discussed in x-asciimath.mkiv.

+

Some backgrounds are discussed in x-asciimath.mkiv. This is a third version. I first +tried a to make a proper expression parser but it's not that easy. First we have to avoid left +recursion, which is not that trivial (maybe a future version of lpeg will provide that), and +second there is not really a syntax but a mix of expressions and sequences with some fuzzy logic +applied. Most problematic are fractions and we also need to handle incomplete expressions. So, +instead we (sort of) tokenize the string and then do some passes over the result. Yes, it's real +ugly and unsatisfying code mess down here. Don't take this as an example.

--ldx]]-- -local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end +-- todo: spaces around all elements in cleanup? +-- todo: filter from files listed in tuc file -local asciimath = { } -local moduledata = moduledata or { } -moduledata.asciimath = asciimath +local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end +local trace_detail = false if trackers then trackers.register("modules.asciimath.detail", function(v) trace_detail = v end) end +local trace_digits = false if trackers then trackers.register("modules.asciimath.digits", function(v) trace_digits = v end) end local report_asciimath = logs.reporter("mathematics","asciimath") -local format = string.format -local lpegmatch = lpeg.match -local S, P, R, C, V, Cc, Ct, Cs = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs - -local letter = lpeg.patterns.utf8 -local space = S(" \n\r\t") -local spaces = space^0/"" -local integer = P("-")^-1 * R("09")^1 -local realpart = P("-")^-1 * R("09")^1 * S(".")^1 * R("09")^1 -local number = integer -- so we can support nice formatting if needed -local real = realpart -- so we can support nice formatting if needed -local float = realpart * P("E") * integer -- so we can support nice formatting if needed -local texnic = P("\\") * (R("az","AZ")^1) - -local premapper = Cs ( ( - - P("@") / "\\degrees " + - P("O/") / "\\varnothing " + - P("o+") / "\\oplus " + - P("o.") / "\\ocirc " + - P("!in") / "\\not\\in " + - P("!=") / "\\neq " + - P("**") / "\\star " + - P("*") / "\\cdot " + - P("//") / "\\slash " + - P("/_") / "\\angle " + - P("\\\\") / "\\backslash " + - P("^^^") / "\\wedge " + - P("^^") / "\\wedge " + - P("<<") / "\\left\\langle " + - P(">>") / "\\right\\rangle " + - P("<=") / "\\leq " + - P(">=") / "\\geq " + - P("-<") / "\\precc " + - P(">-") / "\\succ " + - P("~=") / "\\cong " + - P("~~") / "\\approx " + - P("=>") / "\\Rightarrow " + - P("(:") / "\\left\\langle " + - P(":)") / "\\right\\rangle " + - P(":.") / "\\therefore " + - P("~|") / "\\right\\rceil " + - P("_|_") / "\\bot " + - P("_|") / "\\right\\rfloor " + - P("+-") / "\\pm " + - P("|--") / "\\vdash " + - P("|==") / "\\models " + - P("|_") / "\\left\\lfloor " + - P("|~") / "\\left\\lceil " + - P("-:") / "\\div " + - P("_=") / "\\equiv " + - - P("|") / "\\middle\\| " + - - P("dx") / "(dx)" + - P("dy") / "(dy)" + - P("dz") / "(dz)" + - - letter + P(1) +local asciimath = { } +local moduledata = moduledata or { } +moduledata.asciimath = asciimath -)^0 ) +if not characters then + require("char-def") + require("char-ini") + require("char-ent") +end + +local type, rawget = type, rawget +local concat, insert, remove = table.concat, table.insert, table.remove +local rep, gmatch, gsub, find = string.rep, string.gmatch, string.gsub, string.find +local utfchar = utf.char + +local lpegmatch, patterns = lpeg.match, lpeg.patterns +local S, P, R, C, V, Cc, Ct, Cs, Carg = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs, lpeg.Carg + +local sortedhash = table.sortedhash +local sortedkeys = table.sortedkeys +local formatters = string.formatters + +local entities = characters.entities or { } + +local xmltext = xml.text +local xmlinclusion = xml.inclusion +local xmlcollected = xml.collected + +-- todo: use private unicodes as temporary slots ... easier to compare + +local s_lparent = "\\left\\lparent" +local s_lbrace = "\\left\\lbrace" +local s_lbracket = "\\left\\lbracket" +local s_langle = "\\left\\langle" +local s_lfloor = "\\left\\lfloor" +local s_lceil = "\\left\\lceil" +local s_left = "\\left." + +local s_rparent = "\\right\\rparent" +local s_rbrace = "\\right\\rbrace" +local s_rbracket = "\\right\\rbracket" +local s_rangle = "\\right\\rangle" +local s_rfloor = "\\right\\rfloor" +local s_rceil = "\\right\\rceil" +local s_right = "\\right." + +local s_mslash = "\\middle/" + +local s_lbar = "\\left\\|" +local s_mbar = "\\middle\\|" +local s_rbar = "\\right\\|" + +local s_lnothing = "\\left ." -- space fools checker +local s_rnothing = "\\right ." -- space fools checker local reserved = { - ["aleph"] = "\\aleph ", - ["vdots"] = "\\vdots ", - ["ddots"] = "\\ddots ", - ["oint"] = "\\oint ", - ["grad"] = "\\nabla ", - ["prod"] = "\\prod ", - ["prop"] = "\\propto ", - ["sube"] = "\\subseteq ", - ["supe"] = "\\supseteq ", - ["sinh"] = "\\sinh ", - ["cosh"] = "\\cosh ", - ["tanh"] = "\\tanh ", - ["sum"] = "\\sum ", - ["vvv"] = "\\vee ", - ["nnn"] = "\\cap ", - ["uuu"] = "\\cup ", - ["sub"] = "\\subset ", - ["sup"] = "\\supset ", - ["not"] = "\\lnot ", - ["iff"] = "\\Leftrightarrow ", - ["int"] = "\\int ", - ["del"] = "\\partial ", - ["and"] = "\\and ", - ["not"] = "\\not ", - ["sin"] = "\\sin ", - ["cos"] = "\\cos ", - ["tan"] = "\\tan ", - ["csc"] = "\\csc ", - ["sec"] = "\\sec ", - ["cot"] = "\\cot ", - ["log"] = "\\log ", - ["det"] = "\\det ", - ["lim"] = "\\lim ", - ["mod"] = "\\mod ", - ["gcd"] = "\\gcd ", - ["lcm"] = "\\lcm ", - ["min"] = "\\min ", - ["max"] = "\\max ", - ["xx"] = "\\times ", - ["in"] = "\\in ", - ["ox"] = "\\otimes ", - ["vv"] = "\\vee ", - ["nn"] = "\\cap ", - ["uu"] = "\\cup ", - ["oo"] = "\\infty ", - ["ln"] = "\\ln ", - ["or"] = "\\or ", - - ["AA"] = "\\forall ", - ["EE"] = "\\exists ", - ["TT"] = "\\top ", - ["CC"] = "\\Bbb{C}", - ["NN"] = "\\Bbb{N}", - ["QQ"] = "\\Bbb{Q}", - ["RR"] = "\\Bbb{R}", - ["ZZ"] = "\\Bbb{Z}", + + ["prod"] = { false, "\\prod" }, + ["sinh"] = { false, "\\sinh" }, + ["cosh"] = { false, "\\cosh" }, + ["tanh"] = { false, "\\tanh" }, + ["sum"] = { false, "\\sum" }, + ["int"] = { false, "\\int" }, + ["sin"] = { false, "\\sin" }, + ["cos"] = { false, "\\cos" }, + ["tan"] = { false, "\\tan" }, + ["csc"] = { false, "\\csc" }, + ["sec"] = { false, "\\sec" }, + ["cot"] = { false, "\\cot" }, + ["log"] = { false, "\\log" }, + ["det"] = { false, "\\det" }, + ["lim"] = { false, "\\lim" }, + ["mod"] = { false, "\\mod" }, + ["gcd"] = { false, "\\gcd" }, + ["min"] = { false, "\\min" }, + ["max"] = { false, "\\max" }, + ["ln"] = { false, "\\ln" }, + + ["atan"] = { false, "\\atan" }, -- extra + ["acos"] = { false, "\\acos" }, -- extra + ["asin"] = { false, "\\asin" }, -- extra + -- extra + ["arctan"] = { false, "\\arctan" }, -- extra + ["arccos"] = { false, "\\arccos" }, -- extra + ["arcsin"] = { false, "\\arcsin" }, -- extra + + ["and"] = { false, "\\text{and}" }, + ["or"] = { false, "\\text{or}" }, + ["if"] = { false, "\\text{if}" }, + + ["sqrt"] = { false, "\\asciimathsqrt", "unary" }, + ["root"] = { false, "\\asciimathroot", "binary" }, + ["frac"] = { false, "\\frac", "binary" }, + ["stackrel"] = { false, "\\asciimathstackrel", "binary" }, + ["hat"] = { false, "\\widehat", "unary" }, + ["bar"] = { false, "\\overbar", "unary" }, + ["overbar"] = { false, "\\overbar", "unary" }, + ["underline"] = { false, "\\underline", "unary" }, + ["vec"] = { false, "\\overrightarrow", "unary" }, + ["dot"] = { false, "\\dot", "unary" }, -- 0x2D9 + ["ddot"] = { false, "\\ddot", "unary" }, -- 0xA8 + + -- binary operators + + ["+"] = { true, "+" }, + ["-"] = { true, "-" }, + ["*"] = { true, "⋅" }, + ["**"] = { true, "⋆" }, + ["//"] = { true, "⁄" }, -- \slash + ["\\"] = { true, "\\" }, + ["xx"] = { true, "×" }, + ["times"] = { true, "×" }, + ["-:"] = { true, "÷" }, + ["@"] = { true, "∘" }, + ["o+"] = { true, "⊕" }, + ["ox"] = { true, "⊗" }, + ["o."] = { true, "⊙" }, + ["^^"] = { true, "∧" }, + ["vv"] = { true, "∨" }, + ["nn"] = { true, "∩" }, + ["uu"] = { true, "∪" }, + + -- big operators + + ["^^^"] = { true, "⋀" }, + ["vvv"] = { true, "⋁" }, + ["nnn"] = { true, "⋂" }, + ["uuu"] = { true, "⋃" }, + ["int"] = { true, "∫" }, + ["oint"] = { true, "∮" }, + + -- brackets + + ["("] = { true, "(" }, + [")"] = { true, ")" }, + ["["] = { true, "[" }, + ["]"] = { true, "]" }, + ["{"] = { true, "{" }, + ["}"] = { true, "}" }, + + -- binary relations + + ["="] = { true, "=" }, + ["eq"] = { true, "=" }, + ["!="] = { true, "≠" }, + ["ne"] = { true, "≠" }, + ["neq"] = { true, "≠" }, + ["<"] = { true, "<" }, + ["lt"] = { true, "<" }, + [">"] = { true, ">" }, + ["gt"] = { true, ">" }, + ["<="] = { true, "≤" }, + ["le"] = { true, "≤" }, + ["leq"] = { true, "≤" }, + [">="] = { true, "≥" }, + ["ge"] = { true, "≥" }, + ["geq"] = { true, "≥" }, + ["-<"] = { true, "≺" }, + [">-"] = { true, "≻" }, + ["in"] = { true, "∈" }, + ["!in"] = { true, "∉" }, + ["sub"] = { true, "⊂" }, + ["sup"] = { true, "⊃" }, + ["sube"] = { true, "⊆" }, + ["supe"] = { true, "⊇" }, + ["-="] = { true, "≡" }, + ["~="] = { true, "≅" }, + ["~~"] = { true, "≈" }, + ["prop"] = { true, "∝" }, + + -- arrows + + ["rarr"] = { true, "→" }, + ["->"] = { true, "→" }, + ["larr"] = { true, "←" }, + ["harr"] = { true, "↔" }, + ["uarr"] = { true, "↑" }, + ["darr"] = { true, "↓" }, + ["rArr"] = { true, "⇒" }, + ["lArr"] = { true, "⇐" }, + ["hArr"] = { true, "⇔" }, + ["|->"] = { true, "↦" }, + + -- logical + + ["not"] = { true, "¬" }, + ["=>"] = { true, "⇒" }, + ["iff"] = { true, "⇔" }, + ["AA"] = { true, "∀" }, + ["EE"] = { true, "∃" }, + ["_|_"] = { true, "⊥" }, + ["TT"] = { true, "⊤" }, + ["|--"] = { true, "⊢" }, + ["|=="] = { true, "⊨" }, + + -- miscellaneous + + ["del"] = { true, "∂" }, + ["grad"] = { true, "∇" }, + ["+-"] = { true, "±" }, + ["O/"] = { true, "∅" }, + ["oo"] = { true, "∞" }, + ["aleph"] = { true, "ℵ" }, + ["angle"] = { true, "∠" }, + ["/_"] = { true, "∠" }, + [":."] = { true, "∴" }, + ["..."] = { true, "..." }, -- ldots + ["ldots"] = { true, "..." }, -- ldots + ["cdots"] = { true, "⋯" }, + ["vdots"] = { true, "⋮" }, + ["ddots"] = { true, "⋱" }, + ["diamond"] = { true, "⋄" }, + ["square"] = { true, "□" }, + ["|__"] = { true, "⌊" }, + ["__|"] = { true, "⌋" }, + ["|~"] = { true, "⌈" }, + ["~|"] = { true, "⌉" }, + + -- more + + ["_="] = { true, "≡" }, + + -- bonus + + ["prime"] = { true, "′" }, -- bonus + ["'"] = { true, "′" }, -- bonus + ["''"] = { true, "″" }, -- bonus + ["'''"] = { true, "‴" }, -- bonus + + -- special + + ["%"] = { false, "\\mathpercent" }, + ["&"] = { false, "\\mathampersand" }, + ["#"] = { false, "\\mathhash" }, + ["$"] = { false, "\\mathdollar" }, + + -- blackboard + + ["CC"] = { true, "ℂ" }, + ["NN"] = { true, "ℕ" }, + ["QQ"] = { true, "ℚ" }, + ["RR"] = { true, "ℝ" }, + ["ZZ"] = { true, "ℤ" }, + + -- greek lowercase + + ["alpha"] = { true, "α" }, + ["beta"] = { true, "β" }, + ["gamma"] = { true, "γ" }, + ["delta"] = { true, "δ" }, + ["epsilon"] = { true, "ε" }, + ["varepsilon"] = { true, "ɛ" }, + ["zeta"] = { true, "ζ" }, + ["eta"] = { true, "η" }, + ["theta"] = { true, "θ" }, + ["vartheta"] = { true, "ϑ" }, + ["iota"] = { true, "ι" }, + ["kappa"] = { true, "κ" }, + ["lambda"] = { true, "λ" }, + ["mu"] = { true, "μ" }, + ["nu"] = { true, "ν" }, + ["xi"] = { true, "ξ" }, + ["pi"] = { true, "π" }, + ["rho"] = { true, "ρ" }, + ["sigma"] = { true, "σ" }, + ["tau"] = { true, "τ" }, + ["upsilon"] = { true, "υ" }, + ["phi"] = { true, "φ" }, + ["varphi"] = { true, "ϕ" }, + ["chi"] = { true, "χ" }, + ["psi"] = { true, "ψ" }, + ["omega"] = { true, "ω" }, + + -- greek uppercase + + ["Gamma"] = { true, "Γ" }, + ["Delta"] = { true, "Δ" }, + ["Theta"] = { true, "Θ" }, + ["Lambda"] = { true, "Λ" }, + ["Xi"] = { true, "Ξ" }, + ["Pi"] = { true, "Π" }, + ["Sigma"] = { true, "Σ" }, + ["Phi"] = { true, "Φ" }, + ["Psi"] = { true, "Ψ" }, + ["Omega"] = { true, "Ω" }, + + -- blackboard + + ["bbb a"] = { true, "𝕒" }, + ["bbb b"] = { true, "𝕓" }, + ["bbb c"] = { true, "𝕔" }, + ["bbb d"] = { true, "𝕕" }, + ["bbb e"] = { true, "𝕖" }, + ["bbb f"] = { true, "𝕗" }, + ["bbb g"] = { true, "𝕘" }, + ["bbb h"] = { true, "𝕙" }, + ["bbb i"] = { true, "𝕚" }, + ["bbb j"] = { true, "𝕛" }, + ["bbb k"] = { true, "𝕜" }, + ["bbb l"] = { true, "𝕝" }, + ["bbb m"] = { true, "𝕞" }, + ["bbb n"] = { true, "𝕟" }, + ["bbb o"] = { true, "𝕠" }, + ["bbb p"] = { true, "𝕡" }, + ["bbb q"] = { true, "𝕢" }, + ["bbb r"] = { true, "𝕣" }, + ["bbb s"] = { true, "𝕤" }, + ["bbb t"] = { true, "𝕥" }, + ["bbb u"] = { true, "𝕦" }, + ["bbb v"] = { true, "𝕧" }, + ["bbb w"] = { true, "𝕨" }, + ["bbb x"] = { true, "𝕩" }, + ["bbb y"] = { true, "𝕪" }, + ["bbb z"] = { true, "𝕫" }, + + ["bbb A"] = { true, "𝔸" }, + ["bbb B"] = { true, "𝔹" }, + ["bbb C"] = { true, "ℂ" }, + ["bbb D"] = { true, "𝔻" }, + ["bbb E"] = { true, "𝔼" }, + ["bbb F"] = { true, "𝔽" }, + ["bbb G"] = { true, "𝔾" }, + ["bbb H"] = { true, "ℍ" }, + ["bbb I"] = { true, "𝕀" }, + ["bbb J"] = { true, "𝕁" }, + ["bbb K"] = { true, "𝕂" }, + ["bbb L"] = { true, "𝕃" }, + ["bbb M"] = { true, "𝕄" }, + ["bbb N"] = { true, "ℕ" }, + ["bbb O"] = { true, "𝕆" }, + ["bbb P"] = { true, "ℙ" }, + ["bbb Q"] = { true, "ℚ" }, + ["bbb R"] = { true, "ℝ" }, + ["bbb S"] = { true, "𝕊" }, + ["bbb T"] = { true, "𝕋" }, + ["bbb U"] = { true, "𝕌" }, + ["bbb V"] = { true, "𝕍" }, + ["bbb W"] = { true, "𝕎" }, + ["bbb X"] = { true, "𝕏" }, + ["bbb Y"] = { true, "𝕐" }, + ["bbb Z"] = { true, "ℤ" }, + + -- fraktur + + ["fr a"] = { true, "𝔞" }, + ["fr b"] = { true, "𝔟" }, + ["fr c"] = { true, "𝔠" }, + ["fr d"] = { true, "𝔡" }, + ["fr e"] = { true, "𝔢" }, + ["fr f"] = { true, "𝔣" }, + ["fr g"] = { true, "𝔤" }, + ["fr h"] = { true, "𝔥" }, + ["fr i"] = { true, "𝔦" }, + ["fr j"] = { true, "𝔧" }, + ["fr k"] = { true, "𝔨" }, + ["fr l"] = { true, "𝔩" }, + ["fr m"] = { true, "𝔪" }, + ["fr n"] = { true, "𝔫" }, + ["fr o"] = { true, "𝔬" }, + ["fr p"] = { true, "𝔭" }, + ["fr q"] = { true, "𝔮" }, + ["fr r"] = { true, "𝔯" }, + ["fr s"] = { true, "𝔰" }, + ["fr t"] = { true, "𝔱" }, + ["fr u"] = { true, "𝔲" }, + ["fr v"] = { true, "𝔳" }, + ["fr w"] = { true, "𝔴" }, + ["fr x"] = { true, "𝔵" }, + ["fr y"] = { true, "𝔶" }, + ["fr z"] = { true, "𝔷" }, + + ["fr A"] = { true, "𝔄" }, + ["fr B"] = { true, "𝔅" }, + ["fr C"] = { true, "ℭ" }, + ["fr D"] = { true, "𝔇" }, + ["fr E"] = { true, "𝔈" }, + ["fr F"] = { true, "𝔉" }, + ["fr G"] = { true, "𝔊" }, + ["fr H"] = { true, "ℌ" }, + ["fr I"] = { true, "ℑ" }, + ["fr J"] = { true, "𝔍" }, + ["fr K"] = { true, "𝔎" }, + ["fr L"] = { true, "𝔏" }, + ["fr M"] = { true, "𝔐" }, + ["fr N"] = { true, "𝔑" }, + ["fr O"] = { true, "𝔒" }, + ["fr P"] = { true, "𝔓" }, + ["fr Q"] = { true, "𝔔" }, + ["fr R"] = { true, "ℜ" }, + ["fr S"] = { true, "𝔖" }, + ["fr T"] = { true, "𝔗" }, + ["fr U"] = { true, "𝔘" }, + ["fr V"] = { true, "𝔙" }, + ["fr W"] = { true, "𝔚" }, + ["fr X"] = { true, "𝔛" }, + ["fr Y"] = { true, "𝔜" }, + ["fr Z"] = { true, "ℨ" }, + + -- script + + ["cc a"] = { true, "𝒶" }, + ["cc b"] = { true, "𝒷" }, + ["cc c"] = { true, "𝒸" }, + ["cc d"] = { true, "𝒹" }, + ["cc e"] = { true, "ℯ" }, + ["cc f"] = { true, "𝒻" }, + ["cc g"] = { true, "ℊ" }, + ["cc h"] = { true, "𝒽" }, + ["cc i"] = { true, "𝒾" }, + ["cc j"] = { true, "𝒿" }, + ["cc k"] = { true, "𝓀" }, + ["cc l"] = { true, "𝓁" }, + ["cc m"] = { true, "𝓂" }, + ["cc n"] = { true, "𝓃" }, + ["cc o"] = { true, "ℴ" }, + ["cc p"] = { true, "𝓅" }, + ["cc q"] = { true, "𝓆" }, + ["cc r"] = { true, "𝓇" }, + ["cc s"] = { true, "𝓈" }, + ["cc t"] = { true, "𝓉" }, + ["cc u"] = { true, "𝓊" }, + ["cc v"] = { true, "𝓋" }, + ["cc w"] = { true, "𝓌" }, + ["cc x"] = { true, "𝓍" }, + ["cc y"] = { true, "𝓎" }, + ["cc z"] = { true, "𝓏" }, + + ["cc A"] = { true, "𝒜" }, + ["cc B"] = { true, "ℬ" }, + ["cc C"] = { true, "𝒞" }, + ["cc D"] = { true, "𝒟" }, + ["cc E"] = { true, "ℰ" }, + ["cc F"] = { true, "ℱ" }, + ["cc G"] = { true, "𝒢" }, + ["cc H"] = { true, "ℋ" }, + ["cc I"] = { true, "ℐ" }, + ["cc J"] = { true, "𝒥" }, + ["cc K"] = { true, "𝒦" }, + ["cc L"] = { true, "ℒ" }, + ["cc M"] = { true, "ℳ" }, + ["cc N"] = { true, "𝒩" }, + ["cc O"] = { true, "𝒪" }, + ["cc P"] = { true, "𝒫" }, + ["cc Q"] = { true, "𝒬" }, + ["cc R"] = { true, "ℛ" }, + ["cc S"] = { true, "𝒮" }, + ["cc T"] = { true, "𝒯" }, + ["cc U"] = { true, "𝒰" }, + ["cc V"] = { true, "𝒱" }, + ["cc W"] = { true, "𝒲" }, + ["cc X"] = { true, "𝒳" }, + ["cc Y"] = { true, "𝒴" }, + ["cc Z"] = { true, "𝒵" }, + + -- bold + + ["bb a"] = { true, "𝒂" }, + ["bb b"] = { true, "𝒃" }, + ["bb c"] = { true, "𝒄" }, + ["bb d"] = { true, "𝒅" }, + ["bb e"] = { true, "𝒆" }, + ["bb f"] = { true, "𝒇" }, + ["bb g"] = { true, "𝒈" }, + ["bb h"] = { true, "𝒉" }, + ["bb i"] = { true, "𝒊" }, + ["bb j"] = { true, "𝒋" }, + ["bb k"] = { true, "𝒌" }, + ["bb l"] = { true, "𝒍" }, + ["bb m"] = { true, "𝒎" }, + ["bb n"] = { true, "𝒏" }, + ["bb o"] = { true, "𝒐" }, + ["bb p"] = { true, "𝒑" }, + ["bb q"] = { true, "𝒒" }, + ["bb r"] = { true, "𝒓" }, + ["bb s"] = { true, "𝒔" }, + ["bb t"] = { true, "𝒕" }, + ["bb u"] = { true, "𝒖" }, + ["bb v"] = { true, "𝒗" }, + ["bb w"] = { true, "𝒘" }, + ["bb x"] = { true, "𝒙" }, + ["bb y"] = { true, "𝒚" }, + ["bb z"] = { true, "𝒛" }, + + ["bb A"] = { true, "𝑨" }, + ["bb B"] = { true, "𝑩" }, + ["bb C"] = { true, "𝑪" }, + ["bb D"] = { true, "𝑫" }, + ["bb E"] = { true, "𝑬" }, + ["bb F"] = { true, "𝑭" }, + ["bb G"] = { true, "𝑮" }, + ["bb H"] = { true, "𝑯" }, + ["bb I"] = { true, "𝑰" }, + ["bb J"] = { true, "𝑱" }, + ["bb K"] = { true, "𝑲" }, + ["bb L"] = { true, "𝑳" }, + ["bb M"] = { true, "𝑴" }, + ["bb N"] = { true, "𝑵" }, + ["bb O"] = { true, "𝑶" }, + ["bb P"] = { true, "𝑷" }, + ["bb Q"] = { true, "𝑸" }, + ["bb R"] = { true, "𝑹" }, + ["bb S"] = { true, "𝑺" }, + ["bb T"] = { true, "𝑻" }, + ["bb U"] = { true, "𝑼" }, + ["bb V"] = { true, "𝑽" }, + ["bb W"] = { true, "𝑾" }, + ["bb X"] = { true, "𝑿" }, + ["bb Y"] = { true, "𝒀" }, + ["bb Z"] = { true, "𝒁" }, + + -- sans + + ["sf a"] = { true, "𝖺" }, + ["sf b"] = { true, "𝖻" }, + ["sf c"] = { true, "𝖼" }, + ["sf d"] = { true, "𝖽" }, + ["sf e"] = { true, "𝖾" }, + ["sf f"] = { true, "𝖿" }, + ["sf g"] = { true, "𝗀" }, + ["sf h"] = { true, "𝗁" }, + ["sf i"] = { true, "𝗂" }, + ["sf j"] = { true, "𝗃" }, + ["sf k"] = { true, "𝗄" }, + ["sf l"] = { true, "𝗅" }, + ["sf m"] = { true, "𝗆" }, + ["sf n"] = { true, "𝗇" }, + ["sf o"] = { true, "𝗈" }, + ["sf p"] = { true, "𝗉" }, + ["sf q"] = { true, "𝗊" }, + ["sf r"] = { true, "𝗋" }, + ["sf s"] = { true, "𝗌" }, + ["sf t"] = { true, "𝗍" }, + ["sf u"] = { true, "𝗎" }, + ["sf v"] = { true, "𝗏" }, + ["sf w"] = { true, "𝗐" }, + ["sf x"] = { true, "𝗑" }, + ["sf y"] = { true, "𝗒" }, + ["sf z"] = { true, "𝗓" }, + + ["sf A"] = { true, "𝖠" }, + ["sf B"] = { true, "𝖡" }, + ["sf C"] = { true, "𝖢" }, + ["sf D"] = { true, "𝖣" }, + ["sf E"] = { true, "𝖤" }, + ["sf F"] = { true, "𝖥" }, + ["sf G"] = { true, "𝖦" }, + ["sf H"] = { true, "𝖧" }, + ["sf I"] = { true, "𝖨" }, + ["sf J"] = { true, "𝖩" }, + ["sf K"] = { true, "𝖪" }, + ["sf L"] = { true, "𝖫" }, + ["sf M"] = { true, "𝖬" }, + ["sf N"] = { true, "𝖭" }, + ["sf O"] = { true, "𝖮" }, + ["sf P"] = { true, "𝖯" }, + ["sf Q"] = { true, "𝖰" }, + ["sf R"] = { true, "𝖱" }, + ["sf S"] = { true, "𝖲" }, + ["sf T"] = { true, "𝖳" }, + ["sf U"] = { true, "𝖴" }, + ["sf V"] = { true, "𝖵" }, + ["sf W"] = { true, "𝖶" }, + ["sf X"] = { true, "𝖷" }, + ["sf Y"] = { true, "𝖸" }, + ["sf Z"] = { true, "𝖹" }, + + -- monospace + + ["tt a"] = { true, "𝚊" }, + ["tt b"] = { true, "𝚋" }, + ["tt c"] = { true, "𝚌" }, + ["tt d"] = { true, "𝚍" }, + ["tt e"] = { true, "𝚎" }, + ["tt f"] = { true, "𝚏" }, + ["tt g"] = { true, "𝚐" }, + ["tt h"] = { true, "𝚑" }, + ["tt i"] = { true, "𝚒" }, + ["tt j"] = { true, "𝚓" }, + ["tt k"] = { true, "𝚔" }, + ["tt l"] = { true, "𝚕" }, + ["tt m"] = { true, "𝚖" }, + ["tt n"] = { true, "𝚗" }, + ["tt o"] = { true, "𝚘" }, + ["tt p"] = { true, "𝚙" }, + ["tt q"] = { true, "𝚚" }, + ["tt r"] = { true, "𝚛" }, + ["tt s"] = { true, "𝚜" }, + ["tt t"] = { true, "𝚝" }, + ["tt u"] = { true, "𝚞" }, + ["tt v"] = { true, "𝚟" }, + ["tt w"] = { true, "𝚠" }, + ["tt x"] = { true, "𝚡" }, + ["tt y"] = { true, "𝚢" }, + ["tt z"] = { true, "𝚣" }, + + ["tt A"] = { true, "𝙰" }, + ["tt B"] = { true, "𝙱" }, + ["tt C"] = { true, "𝙲" }, + ["tt D"] = { true, "𝙳" }, + ["tt E"] = { true, "𝙴" }, + ["tt F"] = { true, "𝙵" }, + ["tt G"] = { true, "𝙶" }, + ["tt H"] = { true, "𝙷" }, + ["tt I"] = { true, "𝙸" }, + ["tt J"] = { true, "𝙹" }, + ["tt K"] = { true, "𝙺" }, + ["tt L"] = { true, "𝙻" }, + ["tt M"] = { true, "𝙼" }, + ["tt N"] = { true, "𝙽" }, + ["tt O"] = { true, "𝙾" }, + ["tt P"] = { true, "𝙿" }, + ["tt Q"] = { true, "𝚀" }, + ["tt R"] = { true, "𝚁" }, + ["tt S"] = { true, "𝚂" }, + ["tt T"] = { true, "𝚃" }, + ["tt U"] = { true, "𝚄" }, + ["tt V"] = { true, "𝚅" }, + ["tt W"] = { true, "𝚆" }, + ["tt X"] = { true, "𝚇" }, + ["tt Y"] = { true, "𝚈" }, + ["tt Z"] = { true, "𝚉" }, + + -- some more undocumented + + ["dx"] = { false, { "d", "x" } }, -- "{dx}" "\\left(dx\\right)" + ["dy"] = { false, { "d", "y" } }, -- "{dy}" "\\left(dy\\right)" + ["dz"] = { false, { "d", "z" } }, -- "{dz}" "\\left(dz\\right)" + + -- fences + + ["(:"] = { true, "(:" }, + ["{:"] = { true, "{:" }, + ["[:"] = { true, "[:" }, + ["("] = { true, "(" }, + ["["] = { true, "[" }, + ["{"] = { true, "{" }, + ["<<"] = { true, "⟨" }, -- why not <: + ["|_"] = { true, "⌊" }, + ["|~"] = { true, "⌈" }, + ["⟨"] = { true, "⟨" }, + ["〈"] = { true, "⟨" }, + ["〈"] = { true, "⟨" }, + + [":)"] = { true, ":)" }, + [":}"] = { true, ":}" }, + [":]"] = { true, ":]" }, + [")"] = { true, ")" }, + ["]"] = { true, "]" }, + ["}"] = { true, "}" }, + [">>"] = { true, "⟩" }, -- why not :> + ["~|"] = { true, "⌉" }, + ["_|"] = { true, "⌋" }, + ["⟩"] = { true, "⟩" }, + ["〉"] = { true, "⟩" }, + ["〉"] = { true, "⟩" }, + + ["lparent"] = { true, "(" }, + ["lbracket"] = { true, "[" }, + ["lbrace"] = { true, "{" }, + ["langle"] = { true, "⟨" }, + ["lfloor"] = { true, "⌊" }, + ["lceil"] = { true, "⌈" }, + + ["rparent"] = { true, ")" }, + ["rbracket"] = { true, "]" }, + ["rbrace"] = { true, "}" }, + ["rangle"] = { true, "⟩" }, + ["rfloor"] = { true, "⌋" }, + ["rceil"] = { true, "⌉" }, + + -- a bit special: + + ["\\frac"] = { true, "frac" }, } -table.setmetatableindex(reserved,characters.entities) +local isbinary = { + ["\\frac"] = true, + ["\\root"] = true, + ["\\asciimathroot"] = true, + ["\\asciimathstackrel"] = true, +} -local postmapper = Cs ( ( +local isunary = { + ["\\sqrt"] = true, + ["\\asciimathsqrt"] = true, + ["\\text"] = true, -- mathoptext + ["\\mathoptext"] = true, -- mathoptext + ["\\asciimathoptext"] = true, -- mathoptext + ["\\hat"] = true, -- widehat + ["\\widehat"] = true, -- widehat + ["\\bar"] = true, -- + ["\\overbar"] = true, -- + ["\\underline"] = true, -- + ["\\vec"] = true, -- overrightarrow + ["\\overrightarrow"] = true, -- overrightarrow + ["\\dot"] = true, -- + ["\\ddot"] = true, -- - P("\\mathoptext ") * spaces * (P("\\bgroup ")/"{") * (1-P("\\egroup "))^1 * (P("\\egroup ")/"}") + +} - (P("\\bgroup ")) / "{" + - (P("\\egroup ")) / "}" + +local isfunny = { + ["\\sin"] = true, +} - P("\\") * (R("az","AZ")^2) + +local isinfix = { + ["^"] = true, + ["_"] = true, +} - (R("AZ","az")^2) / reserved + +local isleft = { + [s_lparent] = true, + [s_lbrace] = true, + [s_lbracket] = true, + [s_langle] = true, + [s_lfloor] = true, + [s_lceil] = true, + [s_left] = true, +} - P("{:") / "\\left." + - P(":}") / "\\right." + - P("(") / "\\left(" + - P(")") / "\\right)" + - P("[") / "\\left[" + - P("]") / "\\right]" + - P("{") / "\\left\\{" + - P("}") / "\\right\\}" + +local isright = { + [s_rparent] = true, + [s_rbrace] = true, + [s_rbracket] = true, + [s_rangle] = true, + [s_rfloor] = true, + [s_rceil] = true, + [s_right] = true, +} - letter + P(1) +local issimplified = { +} + +-- + +-- special mess + +local d_one = R("09") +local d_two = d_one * d_one +local d_three = d_two * d_one +local d_four = d_three * d_one +local d_split = P(-1) + P(",") + +local d_spaced = (Carg(1) * d_three)^1 + +local digitized_1 = Cs ( ( + d_three * d_spaced * d_split + + d_two * d_spaced * d_split + + d_one * d_spaced * d_split + + P(1) + )^1 ) + +local p_fourbefore = d_four * d_split +local p_fourafter = d_four * P(-1) + +local p_beforecomma = d_three * d_spaced * d_split + + d_two * d_spaced * d_split + + d_one * d_spaced * d_split + + d_one * d_split + +local p_aftercomma = p_fourafter + + d_three * d_spaced + + d_two * d_spaced + + d_one * d_spaced + +local digitized_2 = Cs ( + p_fourbefore * (p_aftercomma^0) + + p_beforecomma * ((p_aftercomma + d_one^1)^0) + ) + +local p_fourbefore = d_four * d_split +local p_fourafter = d_four +local d_spaced = (Carg(1) * (d_three + d_two + d_one))^1 +local p_aftercomma = p_fourafter * P(-1) + + d_three * d_spaced * P(1)^0 + + d_one^1 + +-- local digitized_3 = Cs ( +-- p_fourbefore * p_aftercomma^0 + +-- p_beforecomma * p_aftercomma^0 +-- ) + +local digitized_3 = Cs((p_fourbefore + p_beforecomma) * p_aftercomma^0) + +local splitmethods = { + digitized_1, + digitized_2, + digitized_3, +} + +local splitmethod = nil + +function asciimath.setup(settings) + splitmethod = splitmethods[tonumber(settings.splitmethod) or 0] + if splitmethod then + local separator = settings.separator + if separator == true or not interfaces or interfaces.variables.yes then + digitseparator = utfchar(0x2008) + elseif type(separator) == "string" and separator ~= "" then + digitseparator = separator + else + splitmethod = nil + end + end +end + +local collected_digits = { } +local collected_filename = "asciimath-digits.lua" + +function numbermess(s) + if splitmethod then + local d = lpegmatch(splitmethod,s,1,digitseparator) + if d then + if trace_digits and s ~= d then + collected_digits[s] = d + end + return d + end + end + return s +end + +-- asciimath.setup { splitmethod = 3 } +-- local t = { +-- "1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789", +-- "1,1", +-- "12,12", +-- "123,123", +-- "1234,123", +-- "1234,1234", +-- "12345,1234", +-- "1234,12345", +-- "12345,12345", +-- "123456,123456", +-- "1234567,1234567", +-- "12345678,12345678", +-- "123456789,123456789", +-- "0,1234", +-- "1234,0", +-- "1234,00", +-- "0,123456789", +-- } +-- for i=1,#t do print(formatters["%-20s : [%s]"](t[i],numbermess(t[i]))) end + +statistics.register("asciimath",function() + if trace_digits then + local n = table.count(collected_digits) + if n > 0 then + table.save(collected_filename,collected_digits) + return string.format("%s digit conversions saved in %s",n,collected_filename) + else + os.remove(collected_filename) + end + end +end) + +local p_number_base = patterns.cpnumber or patterns.cnumber or patterns.number +local p_number = C(p_number_base) +----- p_number = p_number_base +local p_spaces = patterns.whitespace + +local p_utf_base = patterns.utf8character +local p_utf = C(p_utf_base) +local p_entity = (P("&") * C((1-P(";"))^2) * P(";"))/ entities + +entities["gt"] = ">" +entities["lt"] = "<" +entities["amp"] = "&" +entities["dquot"] = '"' +entities["quot"] = "'" + +local p_onechar = p_utf_base * P(-1) + +----- p_number = Cs((patterns.cpnumber or patterns.cnumber or patterns.number)/function(s) return (gsub(s,",","{,}")) end) + +local sign = P("-")^-1 +local digits = R("09")^1 +local integer = sign * digits +local real = digits * (S(".") * digits)^-1 +local float = real * (P("E") * integer)^-1 + +-- local number = C(float + integer) +-- local p_number = C(float) +local p_number = float / numbermess + +local k_reserved = sortedkeys(reserved) +local k_commands = { } +local k_unicode = { } + +asciimath.keys = { + reserved = k_reserved +} + +local k_reserved_different = { } +local k_reserved_words = { } + +for k, v in sortedhash(reserved) do + local replacement = v[2] + if v[1] then + k_unicode[k] = replacement + else + k_unicode[k] = k -- keep them ... later we remap these + if k ~= replacement then + k_reserved_different[#k_reserved_different+1] = k + end + end + +for k, v in next, entities do + k_unicode[k] = v + k_unicode["\\"..k] = v +end + +if not find(k,"[^[a-zA-Z]+$]") then + k_unicode["\\"..k] = k -- dirty trick, no real unicode +end + + if not find(k,"[^a-zA-Z]") then + k_reserved_words[#k_reserved_words+1] = k + end + k_commands[k] = replacement +end + +local p_reserved = + lpeg.utfchartabletopattern(k_reserved_different) / k_commands + +local p_unicode = + lpeg.utfchartabletopattern(table.keys(k_unicode)) / k_unicode + +local p_texescape = patterns.texescape + +local function texescaped(s) + return lpegmatch(p_texescape,s) +end + +local p_text = + P("text") + * p_spaces^0 + * Cc("\\asciimathoptext") + * ( -- maybe balanced + Cs( P("{") * ((1-P("}"))^0/texescaped) * P("}") ) + + Cs((P("(")/"{") * ((1-P(")"))^0/texescaped) * (P(")")/"}")) + ) + + Cc("\\asciimathoptext") * Cs(Cc("{") * (patterns.undouble/texescaped) * Cc("}")) + +local m_left = { + ["(:"] = s_langle, + ["{:"] = s_left, + ["[:"] = s_left, + ["("] = s_lparent, + ["["] = s_lbracket, + ["{"] = s_lbrace, + ["⟨"] = s_langle, + ["⌈"] = s_lceil, + ["⌊"] = s_lfloor, + + -- ["<<"] = s_langle, -- why not <: + -- ["|_"] = s_lfloor, + -- ["|~"] = s_lceil, + -- ["〈"] = s_langle, + -- ["〈"] = s_langle, + + -- ["lparent"] = s_lparent, + -- ["lbracket"] = s_lbracket, + -- ["lbrace"] = s_lbrace, + -- ["langle"] = s_langle, + -- ["lfloor"] = s_lfloor, + -- ["lceil"] = s_lceil, +} + +local m_right = { + [":)"] = s_rangle, + [":}"] = s_right, + [":]"] = s_right, + [")"] = s_rparent, + ["]"] = s_rbracket, + ["}"] = s_rbrace, + ["⟩"] = s_rangle, + ["⌉"] = s_rceil, + ["⌋"] = s_rfloor, + + -- [">>"] = s_rangle, -- why not :> + -- ["~|"] = s_rceil, + -- ["_|"] = s_rfloor, + -- ["〉"] = s_rangle, + -- ["〉"] = s_rangle, + + -- ["rparent"] = s_rparent, + -- ["rbracket"] = s_rbracket, + -- ["rbrace"] = s_rbrace, + -- ["rangle"] = s_rangle, + -- ["rfloor"] = s_rfloor, + -- ["rceil"] = s_rceil, +} + +local islimits = { + ["\\sum"] = true, + -- ["∑"] = true, + ["\\prod"] = true, + -- ["∏"] = true, + ["\\lim"] = true, +} + +local p_left = + lpeg.utfchartabletopattern(m_left) / m_left +local p_right = + lpeg.utfchartabletopattern(m_right) / m_right + +-- special cases + +-- local p_special = +-- C("/") +-- + P("\\ ") * Cc("{}") * p_spaces^0 * C(S("^_")) +-- + P("\\ ") * Cc("\\space") +-- + P("\\\\") * Cc("\\backslash") +-- + P("\\") * (R("az","AZ")^1/entities) +-- + P("|") * Cc("\\|") +-- +-- faster bug also uglier: + +local p_special = + P("|") * Cc("\\|") -- s_mbar -- maybe always add left / right as in mml ? + + P("\\") * ( + ( + P(" ") * ( + Cc("{}") * p_spaces^0 * C(S("^_")) + + Cc("\\space") + ) + ) + + P("\\") * Cc("\\backslash") + -- + (R("az","AZ")^1/entities) + + C(R("az","AZ")^1) + ) + +-- open | close :: {: | :} + +local e_parser = Cs ( ( + p_entity + + p_utf_base )^0 ) -local parser -local function converted(original,totex) - local ok, result - if trace_mapping then - report_asciimath("original : %s",original) +local u_parser = Cs ( ( + patterns.doublequoted + + P("text") * p_spaces^0 * P("(") * (1-P(")"))^0 * P(")") + -- -- todo: balanced + p_unicode + + p_utf_base +)^0 ) + +local a_parser = Ct { "tokenizer", + tokenizer = ( + p_spaces + + p_number + + p_text + -- + Ct(p_open * V("tokenizer") * p_close) -- {: (a+b,=,1),(a+b,=,7) :} + -- + Ct(p_open * V("tokenizer") * p_close_right) -- { (a+b,=,1),(a+b,=,7) :} + -- + Ct(p_open_left * V("tokenizer") * p_right) -- {: (a+b,=,1),(a+b,=,7) } + + Ct(p_left * V("tokenizer") * p_right) -- { (a+b,=,1),(a+b,=,7) } + + p_special + + p_reserved + -- + p_utf - p_close - p_right + + (p_utf - p_right) + )^1, +} + +local collapse = nil +local serialize = table.serialize +local f_state = formatters["level %s : %s : intermediate"] + +local function show_state(t,level,state) + report_asciimath(serialize(t,f_state(level,state))) +end + +local function show_result(original,entified,unicoded,texcoded) + report_asciimath("original > %s",original) + report_asciimath("entified > %s",entified) + report_asciimath("unicoded > %s",unicoded) + report_asciimath("texcoded > %s",texcoded) +end + +local function collapse_matrices(t) + local n = #t + if n > 4 and t[3] == "," then + local l1 = t[1] + local r1 = t[n] + if isleft[l1] and isright[r1] then + local l2 = t[2] + local r2 = t[n-1] + if type(l2) == "table" and type(r2) == "table" then + -- we have a matrix + local valid = true + for i=3,n-2,2 do + if t[i] ~= "," then + valid = false + break + end + end + if valid then + for i=2,n-1,2 do + local ti = t[i] + local tl = ti[1] + local tr = ti[#ti] + if isleft[tl] and isright[tr] then + -- ok + else + valid = false + break + end + end + if valid then + local omit = l1 == s_left and r1 == s_right + if omit then + t[1] = "\\startmatrix" + else + t[1] = l1 .. "\\startmatrix" + end + for i=2,n-1 do + if t[i] == "," then + t[i] = "\\NR" + else + local ti = t[i] + ti[1] = "\\NC" + for i=2,#ti-1 do + if ti[i] == "," then + ti[i] = "\\NC" + end + end + ti[#ti] = nil + end + end + if omit then + t[n] = "\\NR\\stopmatrix" + else + t[n] = "\\NR\\stopmatrix" .. r1 + end + end + end + end + end end - local premapped = lpegmatch(premapper,original) - if premapped then - if trace_mapping then - report_asciimath("prepared : %s",premapped) + return t +end + +local function collapse_bars(t) + local n, i, l, m = #t, 1, false, 0 + while i <= n do + local current = t[i] + if current == "\\|" then + if l then + m = m + 1 + t[l] = s_lbar + t[i] = s_rbar + t[m] = { unpack(t,l,i) } + l = false + else + l = i + end + elseif not l then + m = m + 1 + t[m] = current end - local parsed = lpegmatch(parser,premapped) - if parsed then - if trace_mapping then - report_asciimath("parsed : %s",parsed) + i = i + 1 + end + if l then + local tt = { s_lnothing } -- space fools final checker + local tm = 1 + for i=1,m do + tm = tm + 1 + tt[tm] = t[i] + end + tm = tm + 1 + tt[tm] = s_mbar + for i=l+1,n do + tm = tm + 1 + tt[tm] = t[i] + end + tm = tm + 1 + tt[tm] = s_rnothing -- space fools final checker + m = tm + t = tt + elseif m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_pairs(t) + local n, i = #t, 1 + while i < n do + local current = t[i] + if current == "/" and i > 1 then + local tl = t[i-1] + local tr = t[i+1] + local tn = t[i+2] + if type(tl) == "table" then + if isleft[tl[1]] and isright[tl[#tl]] then + tl[1] = "" -- todo: remove + tl[#tl] = nil + end end - local postmapped = lpegmatch(postmapper,parsed) - if postmapped then - if trace_mapping then - report_asciimath("finalized: %s",postmapped) + if type(tr) == "table" then + if tn == "^" then + -- brr 1/(1+x)^2 + elseif isleft[tr[1]] and isright[tr[#tr]] then + tr[1] = "" -- todo: remove + tr[#tr] = nil end - result, ok = postmapped, true + end + i = i + 2 + elseif current == "," or current == ";" then + -- t[i] = current .. "\\thinspace" -- look sbad in (a,b) + i = i + 1 + else + i = i + 1 + end + end + return t +end + +local function collapse_parentheses(t) + local n, i = #t, 1 + if n > 2 then + while i < n do + local current = t[i] + if type(current) == "table" and isleft[t[i-1]] and isright[t[i+1]] then + local c = #current + if c > 2 and isleft[current[1]] and isright[current[c]] then + remove(current,c) + remove(current,1) + end + i = i + 3 else - result = "error in postmapping" + i = i + 1 + end + end + end + return t +end + +local function collapse_signs(t) + local n, m, i = #t, 0, 1 + while i <= n do + m = m + 1 + local current = t[i] + if isunary[current] then + local one = t[i+1] + if not one then + m = m + 1 + t[m] = current .. "{}" -- error + break + end + if type(one) == "table" then + if isleft[one[1]] and isright[one[#one]] then + remove(one,#one) + remove(one,1) + end + one = collapse(one,level) + elseif one == "-" and i + 2 <= n then -- or another sign ? or unary ? + local t2 = t[i+2] + if type(t2) == "string" then + one = one .. t2 + i = i + 1 + end + end + t[m] = current .. "{" .. one .. "}" + i = i + 2 + elseif i + 2 <= n and isfunny[current] then + local one = t[i+1] + if isinfix[one] then + local two = t[i+2] + if two == "-" then -- or another sign ? or unary ? + local three = t[i+3] + if three then + if type(three) == "table" then + three = collapse(three,level) + end + t[m] = current .. one .. "{" .. two .. three .. "}" + i = i + 4 + else + t[m] = current + i = i + 1 + end + else + t[m] = current + i = i + 1 + end + else + t[m] = current + i = i + 1 end else - result = "error in mapping" + t[m] = current + i = i + 1 end + end + if i == n then -- yes? + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_binaries(t) + local n, m, i = #t, 0, 1 + while i <= n do + m = m + 1 + local current = t[i] + if isbinary[current] then + local one = t[i+1] + local two = t[i+2] + if not one then + t[m] = current .. "{}{}" -- error + break + end + if type(one) == "table" then + if isleft[one[1]] and isright[one[#one]] then + remove(one,#one) + remove(one,1) + end + one = collapse(one,level) + end + if not two then + t[m] = current .. "{" .. one .. "}{}" + break + end + if type(two) == "table" then + if isleft[two[1]] and isright[two[#two]] then + remove(two,#two) + remove(two,1) + end + two = collapse(two,level) + end + t[m] = current .. "{" .. one .. "}{" .. two .. "}" + i = i + 3 + else + t[m] = current + i = i + 1 + end + end + if i == n then -- yes? + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_infixes_1(t) + local n, i = #t, 1 + while i <= n do + local current = t[i] + if isinfix[current] then + local what = t[i+1] + if what then + if type(what) == "table" then + local f, l = what[1], what[#what] + if isleft[f] and isright[l] then + remove(what,#what) + remove(what,1) + end + t[i+1] = collapse(what,level) -- collapse ? + end + i = i + 2 + else + break + end + else + i = i + 1 + end + end + return t +end + +function collapse_limits(t) + local n, m, i = #t, 0, 1 + while i <= n do + m = m + 1 + local current = t[i] + if islimits[current] then + local one, two, first, second = nil, nil, t[i+1], t[i+3] + if first and isinfix[first] then + one = t[i+2] + if one then + -- if type(one) == "table" then + -- if isleft[one[1]] and isright[one[#one]] then + -- remove(one,#one) + -- remove(one,1) + -- end + -- one = collapse(one,level) + -- end + if second and isinfix[second] then + two = t[i+4] + -- if type(two) == "table" then + -- if isleft[two[1]] and isright[two[#two]] then + -- remove(two,#two) + -- remove(two,1) + -- end + -- two = collapse(two,level) + -- end + end + if two then + t[m] = current .. "\\limits" .. first .. "{" .. one .. "}" .. second .. "{" .. two .. "}" + i = i + 5 + else + t[m] = current .. "\\limits" .. first .. "{" .. one .. "}" + i = i + 3 + end + else + t[m] = current + i = i + 1 + end + else + t[m] = current + i = i + 1 + end + else + t[m] = current + i = i + 1 + end + end + if i == n then -- yes? + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_tables(t) + local n, m, i = #t, 0, 1 + while i <= n do + m = m + 1 + local current = t[i] + if type(current) == "table" then + if current[1] == "\\NC" then + t[m] = collapse(current,level) + else + t[m] = "{" .. collapse(current,level) .. "}" + end + i = i + 1 + else + t[m] = current + i = i + 1 + end + end + if i == n then -- yes? + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_infixes_2(t) + local n, m, i = #t, 0, 1 + while i < n do + local current = t[i] + if isinfix[current] and i > 1 then + local tl = t[i-1] + local tr = t[i+1] + local ti = t[i+2] + local tn = t[i+3] + if ti and tn and isinfix[ti] then + t[m] = tl .. current .. "{" .. tr .. "}" .. ti .. "{" .. tn .. "}" + i = i + 4 + else + t[m] = tl .. current .. "{" .. tr .. "}" + i = i + 2 + end + else + m = m + 1 + t[m] = current + i = i + 1 + end + end + if i == n then + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_fractions_1(t) + local n, m, i = #t, 0, 1 + while i < n do + local current = t[i] + if current == "/" and i > 1 then + local tl = t[i-1] + local tr = t[i+1] + t[m] = "\\frac{" .. tl .. "}{" .. tr .. "}" + i = i + 2 + if i < n then + m = m + 1 + t[m] = t[i] + i = i + 1 + end + else + m = m + 1 + t[m] = current + i = i + 1 + end + end + if i == n then + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_fractions_2(t) + local n, m, i = #t, 0, 1 + while i < n do + local current = t[i] + if current == "⁄" and i > 1 then -- \slash + t[m] = "{" .. s_left .. t[i-1] .. s_mslash .. t[i+1] .. s_right .. "}" + i = i + 2 + if i < n then + m = m + 1 + t[m] = t[i] + i = i + 1 + end + else + m = m + 1 + t[m] = current + i = i + 1 + end + end + if i == n then + m = m + 1 + t[m] = t[n] + end + if m < n then + for i=n,m+1,-1 do + t[i] = nil + end + end + return t +end + +local function collapse_result(t) + local n = #t + if t[1] == s_left and t[n] == s_right then -- see bar .. space needed there + return concat(t," ",2,n-1) else - result = "error in premapping" + return concat(t," ") end - if totex then - if ok then - context.mathematics(result) +end + +collapse = function(t,level) + -- check + if not t then + return "" + end + -- tracing + if trace_detail then + if level then + level = level + 1 else - context.type(result) -- some day monospaced + level = 1 + end + show_state(t,level,"parsed") + end + -- steps + t = collapse_matrices (t) if trace_detail then show_state(t,level,"matrices") end + t = collapse_bars (t) if trace_detail then show_state(t,level,"bars") end + t = collapse_pairs (t) if trace_detail then show_state(t,level,"pairs") end + t = collapse_parentheses(t) if trace_detail then show_state(t,level,"parentheses") end + t = collapse_signs (t) if trace_detail then show_state(t,level,"signs") end + t = collapse_binaries (t) if trace_detail then show_state(t,level,"binaries") end + t = collapse_infixes_1 (t) if trace_detail then show_state(t,level,"infixes (1)") end + t = collapse_limits (t) if trace_detail then show_state(t,level,"limits") end + t = collapse_tables (t) if trace_detail then show_state(t,level,"tables") end + t = collapse_infixes_2 (t) if trace_detail then show_state(t,level,"infixes (2)") end + t = collapse_fractions_1(t) if trace_detail then show_state(t,level,"fractions (1)") end + t = collapse_fractions_2(t) if trace_detail then show_state(t,level,"fractions (2)") end + -- done + return collapse_result(t) +end + +-- todo: cache simple ones, say #str < 10, maybe weak + +local context = context +local ctx_mathematics = context and context.mathematics or report_asciimath +local ctx_type = context and context.type or function() end +local ctx_inleft = context and context.inleft or function() end + +local function convert(str,totex) + local entified = lpegmatch(e_parser,str) or str -- when used in text + local unicoded = lpegmatch(u_parser,entified) or entified + local texcoded = collapse(lpegmatch(a_parser,unicoded)) + if trace_mapping then + show_result(str,entified,unicoded,texcoded) + end + if totex then + ctx_mathematics(texcoded) + else + return texcoded + end +end + +local n = 0 +local p = ( + (S("{[(") + P("\\left" )) / function() n = n + 1 end + + (S("}])") + P("\\right")) / function() n = n - 1 end + + p_utf_base +)^0 + +local function invalidtex(str) + n = 0 + lpegmatch(p,str) + if n == 0 then + return false + elseif n < 0 then + return formatters["too many left fences: %s"](-n) + elseif n > 0 then + return formatters["not enough right fences: %s"](n) + end +end + +local collected = { } +local indexed = { } + +-- bonus + +local p_reserved_spaced = + C(lpeg.utfchartabletopattern(k_reserved_words)) / " %1 " + +local p_text = + C(P("text")) / " %1 " + * p_spaces^0 + * ( -- maybe balanced + (P("{") * (1-P("}"))^0 * P("}")) + + (P("(") * (1-P(")"))^0 * P(")")) + ) + + patterns.doublequoted + +local p_expand = Cs((p_text + p_reserved_spaced + p_utf_base)^0) +local p_compress = patterns.collapser + +local function cleanedup(str) + return lpegmatch(p_compress,lpegmatch(p_expand,str)) or str +end + +-- so far + +local function register(s,cleanedup,collected,shortname) + local c = cleanedup(s) + local f = collected[c] + if f then + f.count = f.count + 1 + f.files[shortname] = (f.files[shortname] or 0) + 1 + if s ~= c then + f.cleanedup = f.cleanedup + 1 + end + f.dirty[s] = (f.dirty[s] or 0) + 1 + else + local texcoded = convert(s) + local message = invalidtex(texcoded) + if message then + report_asciimath("%s: %s : %s",message,s,texcoded) end + collected[c] = { + count = 1, + files = { [shortname] = 1 }, + texcoded = texcoded, + message = message, + cleanedup = s ~= c and 1 or 0, + dirty = { [s] = 1 } + } + end +end + +local function wrapup(collected,indexed) + local n = 0 + for k, v in sortedhash(collected) do + n = n + 1 + v.n= n + indexed[n] = k + end +end + +function collect(fpattern,element,collected,indexed) + local element = element or "am" + local mpattern = formatters["<%s>(.-)"](element,element) + local filenames = resolvers.findtexfile(fpattern) + if filenames and filenames ~= "" then + filenames = { filenames } else - return result - end -end - -local function onlyconverted(str) - local parsed = lpegmatch(parser,str) - return parsed or str -end - -local sqrt = P("sqrt") / "\\rootradical \\bgroup \\egroup " -local root = P("root") / "\\rootradical " -local frac = P("frac") / "\\frac " -local stackrel = P("stackrel") / "\\stackrel " -local text = P("text") / "\\mathoptext " -local hat = P("hat") / "\\widehat " -local overbar = P("bar") / "\\overbar " -local underline = P("ul") / "\\underline " -local vec = P("vec") / "\\overrightarrow " -local dot = P("dot") / "\\dot " -local ddot = P("ddot") / "\\ddot " - -local left = P("(:") + P("{:") + P("(") + P("[") + P("{") -local right = P(":)") + P(":}") + P(")") + P("]") + P("}") -local leftnorright = 1 - left - right -local singles = sqrt + text + hat + underline + overbar + vec + ddot + dot -local doubles = root + frac + stackrel -local ignoreleft = (left/"") * spaces * spaces -local ignoreright = spaces * (right/"") * spaces -local ignoreslash = spaces * (P("/")/"") * spaces -local comma = P(",") -local nocomma = 1-comma -local anychar = P(1) -local openmatrix = left * spaces * Cc("\\matrix\\bgroup ") -local closematrix = Cc("\\egroup ") * spaces * right -local nextcolumn = spaces * (comma/"&") * spaces -local nextrow = spaces * (comma/"\\cr ") * spaces -local finishrow = Cc("\\cr ") -local opengroup = left/"\\bgroup " -local closegroup = right/"\\egroup " -local somescript = S("^_") * spaces -local beginargument = Cc("\\bgroup ") -local endargument = Cc("\\egroup ") - -parser = Cs { "main", - - scripts = somescript * V("argument"), - division = Cc("\\frac") * V("argument") * spaces * ignoreslash * spaces * V("argument"), - double = doubles * spaces * V("argument") * spaces * V("argument"), - single = singles * spaces * V("argument"), - - balanced = opengroup * (C((leftnorright + V("balanced"))^0)/onlyconverted) * closegroup, - argument = V("balanced") + V("token"), - - element = (V("step") + (V("argument") + V("step")) - ignoreright - nextcolumn - comma)^1, - commalist = ignoreleft * V("element") * (nextcolumn * spaces * V("element"))^0 * ignoreright, - matrix = openmatrix * spaces * (V("commalist") * (nextrow * V("commalist"))^0) * finishrow * closematrix, - - token = beginargument * (texnic + float + real + number + letter) * endargument, - - step = V("scripts") + V("division") + V("single") + V("double"), - main = (V("matrix") + V("step") + anychar)^0, + filenames = dir.glob(fpattern) + end + local cfpattern = gsub(fpattern,"^%./",lfs.currentdir()) + local cfpattern = gsub(cfpattern,"\\","/") + local wildcard = string.split(cfpattern,"*")[1] + if not collected then + collected = { } + indexed = { } + end + for i=1,#filenames do + filename = gsub(filenames[i],"\\","/") + local splitname = (wildcard and wildcard ~= "" and string.split(filename,wildcard)[2]) or filename + local shortname = gsub(splitname or file.basename(filename),"^%./","") + if shortname == "" then + shortname = filename + end + local fullname = resolvers.findtexfile(filename) or filename + if fullname ~= "" then + for s in gmatch(io.loaddata(fullname),mpattern) do + register(s,cleanedup,collected,shortname) + end + end + end + wrapup(collected,indexed) + return collected, indexed +end + +function filter(root,pattern,collected,indexed) + if not pattern or pattern == "" then + pattern = "am" + end + if not collected then + collected = { } + indexed = { } + end + for c in xmlcollected(root,pattern) do + register(xmltext(c),cleanedup,collected,xmlinclusion(c) or "" ) + end + wrapup(collected,indexed) + return collected, indexed +end + +asciimath.convert = convert +asciimath.reserved = reserved +asciimath.collect = collect +asciimath.filter = filter +asciimath.invalidtex = invalidtex +asciimath.cleanedup = cleanedup +-- sin(x) = 1 : 3.3 uncached 1.2 cached , so no real gain (better optimize the converter then) + +local function convert(str) + if #str > 0 then + local entified = lpegmatch(e_parser,str) or str -- when used in text + local unicoded = lpegmatch(u_parser,entified) or entified + if lpegmatch(p_onechar,unicoded) then + ctx_mathematics(unicoded) + else + local texcoded = collapse(lpegmatch(a_parser,unicoded)) + if trace_mapping then + show_result(str,entified,unicoded,texcoded) + end + if #texcoded == 0 then + report_asciimath("error in asciimath: %s",str) + else + local message = invalidtex(texcoded) + if message then + report_asciimath("%s: %s : %s",message,str,texcoded) + ctx_type(formatters["<%s>"](message)) + else + ctx_mathematics(texcoded) + end + end + end + end +end + +local context = context + +if not context then + +-- trace_mapping = true +-- trace_detail = true + +-- report_asciimath(cleanedup([[ac+sinx+xsqrtx+sinsqrtx+sinsqrt(x)]])) +-- report_asciimath(cleanedup([[a "αsinsqrtx" b]])) +-- report_asciimath(cleanedup([[a "α" b]])) +-- report_asciimath(cleanedup([[//4]])) + +-- convert("\\frac{a}{b}") +-- convert("frac{a}{b}") +-- convert("\\sin{a}{b}") +-- convert("sin{a}{b}") +-- convert("1: rightarrow") +-- convert("2: \\rightarrow") + +-- convert("((1,2,3),(4,5,6),(7,8,9))") + +-- convert("1/(t+x)^2") + +-- convert("AA a > 0 ^^ b > 0 | {:log_g:} a + {:log_g:} b") +-- convert("AA a > 0 ^^ b > 0 | {:log_g:} a + {:log_g:} b") + +-- convert("10000,00001") +-- convert("4/18*100text(%)~~22,2") +-- convert("4/18*100text(%)≈22,2") +-- convert("62541/(197,6)≈316,05") + +-- convert([[sum x]]) +-- convert([[sum^(1)_(2) x]]) +-- convert([[lim_(1)^(2) x]]) +-- convert([[lim_(1) x]]) +-- convert([[lim^(2) x]]) + +-- convert([[{: rangle]]) +-- convert([[\langle\larr]]) +-- convert([[langlelarr]]) +-- convert([[D_f=[0 ,→〉]]) +-- convert([[ac+sinx+xsqrtx]]) +-- convert([[ac+\alpha x+xsqrtx-cc b*pi**psi-3alephx / bb X]]) +-- convert([[ac+\ ^ x+xsqrtx]]) +-- convert([[d/dx(x^2+1)]]) +-- convert([[a "αsinsqrtx" b]]) +-- convert([[a "α" b]]) +-- convert([[//4]]) +-- convert([[ {(a+b,=,1),(a+b,=,7)) ]]) + +-- convert([[ 2/a // 5/b = (2 b) / ( a b) // ( 5 a ) / ( a b ) = (2 b ) / ( 5 a ) ]]) +-- convert([[ (2+x)/a // 5/b ]]) + +-- convert([[ ( 2/a ) // ( 5/b ) = ( (2 b) / ( a b) ) // ( ( 5 a ) / ( a b ) ) = (2 b ) / ( 5 a ) ]]) + +-- convert([[ (x/y)^3 = x^3/y^3 ]]) + +-- convert([[ {: (1,2) :} ]]) +-- convert([[ {: (a+b,=,1),(a+b,=,7) :} ]]) +-- convert([[ { (a+b,=,1),(a+b,=,7) :} ]]) +-- convert([[ {: (a+b,=,1),(a+b,=,7) } ]]) +-- convert([[ { (a+b,=,1),(a+b,=,7) } ]]) + +-- convert([[(1,5 ±sqrt(1,25 ),0 )]]) +-- convert([[1//2]]) +-- convert([[(p)/sqrt(p)]]) +-- convert([[u_tot]]) +-- convert([[u_tot=4,4 L+0,054 T]]) + +-- convert([[ [←;0,2] ]]) +-- convert([[ [←;0,2⟩ ]]) +-- convert([[ ⟨←;0,2 ) ]]) +-- convert([[ ⟨←;0,2 ] ]]) +-- convert([[ ⟨←;0,2⟩ ]]) + +-- convert([[ x^2(x-1/16)=0 ]]) +-- convert([[ y = ax + 3 - 3a ]]) +-- convert([[ y= ((1/4)) ^x ]]) +-- convert([[ x=\ ^ (1/4) log(0 ,002 )= log(0,002) / (log(1/4) ]]) +-- convert([[ x=\ ^glog(y) ]]) +-- convert([[ x^ (-1 1/2) =1/x^ (1 1/2)=1/ (x^1*x^ (1/2)) =1/ (xsqrt(x)) ]]) +-- convert([[ x^2(10 -x)>2 x^2 ]]) +-- convert([[ x^4>x ]]) + + return + +end + +interfaces.implement { + name = "asciimath", -- module_asciimath_convert + actions = convert, + arguments = "string" } -asciimath.reserved = reserved -asciimath.convert = converted +local ctx_typebuffer = context.typebuffer +local ctx_mathematics = context.mathematics +local ctx_color = context.color + +local sequenced = table.sequenced +local assign_buffer = buffers.assign + +local show = { } +asciimath.show = show + +local collected, indexed, ignored = { }, { }, { } + +local color = { "darkred" } + +function show.ignore(n) + if type(n) == "string" then + local c = collected[n] + n = c and c.n + end + if n then + ignored[n] = true + end +end + +function show.count(n,showcleanedup) + local v = collected[indexed[n]] + local count = v.count + local cleanedup = v.cleanedup + if not showcleanedup or cleanedup == 0 then + context(count) + elseif count == cleanedup then + ctx_color(color,count) + else + context("%s+",count-cleanedup) + ctx_color(color,cleanedup) + end +end + +local h = { } +local am = { "am" } + +function show.nofdirty(n) + local k = indexed[n] + local v = collected[k] + local n = v.cleanedup + h = { } + if n > 0 then + for d, n in sortedhash(v.dirty) do + if d ~= k then + h[#h+1] = { d, n } + end + end + end + context(#h) +end + +function show.dirty(m,wrapped) + local d = h[m] + if d then + ctx_inleft(d[2]) + if wrapped then + assign_buffer("am",'"' .. d[1] .. '"') + else + assign_buffer("am",d[1]) + end + ctx_typebuffer(am) + end +end + +function show.files(n) + context(sequenced(collected[indexed[n]].files," ")) +end -commands.convert = converted +function show.input(n,wrapped) + if wrapped then + assign_buffer("am",'"' .. indexed[n] .. '"') + else + assign_buffer("am",indexed[n]) + end + ctx_typebuffer(am) +end + +function show.result(n) + local v = collected[indexed[n]] + if ignored[n] then + context("ignored") + elseif v.message then + ctx_color(color, v.message) + else + ctx_mathematics(v.texcoded) + end +end + +function show.load(str,element) + collected, indexed, ignored = { }, { }, { } + local t = utilities.parsers.settings_to_array(str) + for i=1,#t do + asciimath.collect(t[i],element or "am",collected,indexed) + end +end + +function show.filter(id,element) + collected, indexed, ignored = { }, { }, { } + asciimath.filter(lxml.getid(id),element or "am",collected,indexed) +end + +function show.max() + context(#indexed) +end + +function show.statistics() + local usedfiles = { } + local noffiles = 0 + local nofokay = 0 + local nofbad = 0 + local nofcleanedup = 0 + for k, v in next, collected do + if ignored[v.n] then + nofbad = nofbad + v.count + elseif v.message then + nofbad = nofbad + v.count + else + nofokay = nofokay + v.count + end + nofcleanedup = nofcleanedup + v.cleanedup + for k, v in next, v.files do + local u = usedfiles[k] + if u then + usedfiles[k] = u + 1 + else + noffiles = noffiles + 1 + usedfiles[k] = 1 + end + end + end + local NC = context.NC + local NR = context.NR + local EQ = context.EQ + context.starttabulate { "|B||" } + NC() context("files") EQ() context(noffiles) NC() NR() + NC() context("formulas") EQ() context(nofokay+nofbad) NC() NR() + NC() context("uniques") EQ() context(#indexed) NC() NR() + NC() context("cleanedup") EQ() context(nofcleanedup) NC() NR() + NC() context("errors") EQ() context(nofbad) NC() NR() + context.stoptabulate() +end + +function show.save(name) + table.save(name ~= "" and name or "dummy.lua",collected) +end diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv index fd385671a50..cc98b54acca 100644 --- a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv +++ b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv @@ -1,6 +1,6 @@ %D \module -%D [ file=m-asciimath, -%D version=2006.04.24, % 1999.11.06, +%D [ file=x-asciimath, +%D version=2014.06.01, % 2006.04.24, % 1999.11.06, %D title=\CONTEXT\ Modules, %D subtitle=AsciiMath, %D author=Hans Hagen, @@ -11,90 +11,371 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D Lua code. - \registerctxluafile{x-asciimath}{} -\def\ctxmoduleasciimath#1{\ctxlua{moduledata.asciimath.#1}} - -%D The following code is not officially supported and is only meant -%D for the Math4All project. +%D When the Math4All project started, we immediately started using content \MATHML. +%D Because in school math there is often a reference to calculator input, we also +%D provided what we called \quote {calcmath}: a predictable expression based way +%D entering math. At some point \OPENMATH\ was also used but that was later +%D abandoned because editing is more cumbersome. +%D +%D Due to limitations in the web variant (which is independent of rendering for +%D paper but often determines the coding of document, not seldom for the worse) the +%D switch was made to presentational \MATHML. But even that proved to be too complex +%D for rendering on the web, so it got converted to so called \ASCIIMATH\ which +%D can be rendered using some \JAVASCRIPT\ magic. However, all the formulas (and +%D we're talking of tens of thousands of them) were very precisely coded by the main +%D author. Because in intermediate stages of the editing (by additional authors) a +%D mixture of \MATHML\ and \ASCIIMATH\ was used, we wrote the first version of this +%D module. As reference we took \url +%D {http://www1.chapman.edu/~jipsen/mathml/asciimath.html} and. The idea was to +%D stick to \MATHML\ as reference and if needed use \ASCIIMATH\ as annotation. %D -%D The following code kind of maps ascii math -%D http://www1.chapman.edu/~jipsen/mathml/asciimath.html onto \TEX. The -%D code was written for the math4all project but in retrospect we -%D could have used just tex code as the web version can handle that -%D as well. Anyhow, as we use \MATHML\ as basis it makes sense to add -%D this to the repertoire as annotation variant, so now we have -%D content \MATHML\ (prefered), presentation \MATHML\ (often messy), -%D \OPENMATH\ (what was which we started with in this project) -%D calcmath (handy for students who are accustomed to calculators), -%D asciimath (to make Frits's live easier) and of course \TEX. Of -%D course all are used mixed. +%D Eventually we ended up with supporting several math encodings in \CONTEXT\ that +%D could be used mixed: content \MATHML\ (preferred), presentation \MATHML\ (often +%D messy), \OPENMATH\ (somewhat minimalistic) calcmath (handy for students who are +%D accustomed to calculators), \ASCIIMATH\ (to make web support easier) and of +%D course \TEX. %D -%D We don't support all quirks of asciimath as I am not in the mood to -%D write a complex parser while a bit of sane coding can work as well. +%D The first version had some limitations as we didn't want to support all quirks of +%D \ASCIIMATH\ and also because I was not really in the mood to write a complex parser +%D when a bit of sane coding can work equally well. Some comments from that version: %D +%D \startnarrower %D \startitemize -%D \item We support only the syntactically clear variants and as long -%D as lpeg does not support left recursion this is as far as we -%D want to go. -%D \item The parser is rather insensitive for spaces but yet the advice is -%D to avoid weird coding like \type {d/dxf(x)} but use \type {d/dx -%D f(x)} instead. After all we're not in a compact coding cq.\ -%D parser challenge. -%D \item We also don't support the somewhat confusing \type {sqrt sqrt 2} -%D nor \type {root3x} (although the second one kind of works). A bit -%D of defensive coding does not hurt. -%D \item We can process \type {a/b/c/d} but it's not compatible with the -%D default behaviour of asciimath. Use grouping instead. Yes, we do -%D support the somewhat nonstandard grouping token mix. -%D \item You should use explicit \type {text(..)} directives as one can -%D never be sure what is a reserved word and not. +%D \item We support only the syntactically clear variants and as long as lpeg does +%D not support left recursion this is as far as we want to go. +%D \item The parser is rather insensitive for spaces but yet the advice is to avoid +%D weird coding like \type {d/dxf(x)} but use \type {d/dx f(x)} instead. After +%D all we're not in a compact coding cq.\ parser challenge. +%D \item We also don't support the somewhat confusing \type {sqrt sqrt 2} nor \type +%D {root3x} (although the second one kind of works). A bit of defensive coding +%D does not hurt. +%D \item We can process \type {a/b/c/d} but it's not compatible with the default +%D behaviour of \ASCIIMATH. Use grouping instead. Yes, we do support the somewhat +%D nonstandard grouping token mix. +%D \item You should use explicit \type {text(..)} directives as one can never be sure +%D what is a reserved word and not. %D \stopitemize %D -%D Actually, as the only parsing sensitive elements of \TEX\ are -%D fractions (\type {\over} and friends, a restricted use of \TEX\ -%D coding is probably as comprehensive and parseble. -%D -%D The webpage with examples served as starting point so anything beyond +%D Actually, as the only parsing sensitive elements of \TEX\ are fractions (\type {\over} +%D and friends, a restricted use of \TEX\ coding is probably as comprehensive and +%D parsable. The webpage with examples served as starting point so anything beyond %D what can be found there isn't supported. +%D \stopnarrower +%D +%D Then in 2014 something bad happened. Following the fashion of minimal encoding +%D (which of course means messy encoding of complex cases and which can make authors +%D sloppy too) the web based support workflow of the mentioned project ran into some +%D limitations and magically one day all carefully coded \MATHML\ was converted into +%D \ASCIIMATH. As there was no way to recover the original thousands of files and +%D tens of thousands of formulas we were suddenly stuck with \ASCIIMATH. Because the +%D conversion had be done automagically, we also saw numerous errors and were forced +%D to come up with some methods to check formulas. Because \MATHML\ poses some +%D restrictions it has predictable rendering; \ASCIIMATH\ on the other hand enforces +%D no structure. Also, because \MATHML\ has to be valid \XML\ it always processes. +%D Of course, during the decade that the project had run we also had to built in +%D some catches for abuse but at least we had a relatively stable and configurable +%D subsystem. So, in order to deal with less predictable cases as well as extensive +%D checking, a new \ASCIIMATH\ parser was written, one that could also be used to +%D trace bad coding. +%D +%D Because the formal description is incomplete, and because some links to resources +%D are broken, and because some testing on the web showed that sequences of characters +%D are interpreted that were not mentioned anywhere (visible), and because we noticed +%D that the parser was dangerously tolerant, the new code is quite different from the +%D old code. +%D +%D One need to keep in mind that because spaces are optional, the only robust way to +%D edit \ASCIIMATH\ is to use a \WYSIWYG\ editor and hope that the parser doesn't +%D change ever. Keys are picked up from spaceless sequences and when not recognized +%D a (sequence) of characters is considered to be variables. So, \type {xsqrtx} is +%D valid and renders as \type {$x\sqrt{x}$}, \type {xx} becomes \type {×} (times) +%D but \type {ac} becomes \type {$a c$} (a times c). We're lucky that \type {AC} is +%D not turned into Alternating Current, but who knows what happens a few years from +%D now. So, we do support this spaceless mess, but users are warned: best use a +%D spacy sequence. The extra amount of spaces (at one byte each) an author has to +%D include in his|/|her active writing time probably stays below the size of one +%D holiday picture. Another complication is that numbers (in Dutch) use commas instead +%D of periods, but vectors use commas as well. We also hav esome different names for +%D functions which then can conflict with the expectations about collapsed variables. +%D +%D It must be noted that simplified encodings (that seem to be the fashion today) +%D can demand from applications to apply fuzzy logic to make something work out +%D well. Because we have sequential data that gets rendered, sometimes wrong input +%D gets obscured simply by the rendering: like the comma's in numbers as well as +%D for separators (depending on space usage), or plain wrong symbols that somehow +%D get a representation anyway. This in itself is more a side effect of trying to +%D use the simplified encoding without applying rules (in the input) or to use it +%D beyong its intended usage, which then of course can lead to adapted parsers and +%D catches that themselves trigger further abuse. Imagine that instead of developing +%D new cars, planes, space ships, mobile phones, computers we would have adapted +%D horse cars, kites, firework, old fashioned phones and mechanical calculators in a +%D similar way: patch upon patch of traditional means for sure would not have +%D worked. So, when you use \ASCIIMATH\ best check immediately how it gets rendered +%D in the browser as well as on paper. And be prepared to check the more complex +%D code in the future again. We don't offer any guarantees but of course will try to +%D keep up. +%D +%D In retrospect I sometimes wonder if the energy put into constantly adapting to +%D the fashion of the day pays off. Probably not. It definitely doesn't pay of. +%D +%D More complex crap: +%D +%D 1: $x + \stackrel{comment}{\stackrel{\utfchar{"23DE}}{yyyyyyyy}} = y$ \blank +%D 2: \asciimath{x + stackrel{\utfchar{"23DE}}{yyyyyyyy} = y} \blank +%D 3: \asciimath{x + stackrel{yyyyyyyy}{\utfchar{"23DE}} = y} \blank +%D 4: \asciimath{x + stackrel{"comment"}{stackrel{\utfchar{"23DE}}{yyyyyyyy}} = y} \blank + +\usemodule[mathml-basics] + +\startmodule[asciimath] \unprotect \writestatus{asciimath}{beware, this is an experimental (m4all only) module} -%unexpanded\def\asciimath#1{\ctxmoduleasciimath{convert(\!!bs\detokenize{#1}\!!es,true)}} -\unexpanded\def\asciimath#1{\ctxcommand{convert(\!!bs\detokenize\expandafter{\normalexpanded{#1}}\!!es,true)}} +%D Hacks: + +\unexpanded\def\asciimathoptext #1{\ifmmode\mathoptext{#1}\else#1\fi} +\unexpanded\def\asciimathoptexttraced #1{\ifmmode\mathoptext{\color[darkgreen]{#1}}\else\color[darkgreen]{#1}\fi} +\unexpanded\def\asciimathstackrel #1#2{\mathematics{\mathop{\let\limits\relax\mover{#2}{#1}}}} +\unexpanded\def\asciimathroot #1#2{\sqrt[#1]{#2}} +\unexpanded\def\asciimathsqrt #1{\sqrt{#1}} + +%D The core commands: + +% if we need to set + +\installsetuponlycommandhandler {asciimath} {asciimath} + +\appendtoks + \ctxlua{moduledata.asciimath.setup { + splitmethod = "\asciimathparameter\c!splitmethod", + separator = "\asciimathparameter\c!separator", + }}% +\to \everysetupasciimath + +\unexpanded\def\asciimath#1% + {\clf_asciimath{\detokenize\expandafter{\normalexpanded{#1}}}} + +\unexpanded\def\ctxmoduleasciimath#1% + {\ctxlua{moduledata.asciimath.#1}} + +%D Some tracing commands. Using tex commands is 10\% slower that directly piping +%D from \LUA, but this is non|-|critical code. + +\unexpanded\def\ShowAsciiMathLoad [#1]{\ctxlua{moduledata.asciimath.show.load("#1")}} +\unexpanded\def\ShowAsciiMathIgnore[#1]{\ctxlua{moduledata.asciimath.show.ignore("#1")}} +\unexpanded\def\ShowAsciiMathXML #1#2{\ctxlua{moduledata.asciimath.show.filter("#1","#2")}} +\unexpanded\def\ShowAsciiMathStats {\ctxlua{moduledata.asciimath.show.statistics()}} +\unexpanded\def\ShowAsciiMathMax {\ctxlua{moduledata.asciimath.show.max()}} + +\unexpanded\def\ShowAsciiMathResult#1% + {\begingroup + \blank + % if we are in vmode, we don't get positions i.e. a smaller tuc file + \inleft{\ttbf#1\hfill\ctxlua{moduledata.asciimath.show.count(#1,true)}}% + \dontleavehmode + \begingroup + \ttbf + \ctxlua{moduledata.asciimath.show.files(#1)} + \endgroup + \blank[medium,samepage] + \startcolor[darkblue] + \ctxlua{moduledata.asciimath.show.input(#1,true)} + \stopcolor + \blank[medium,samepage] + \doifmode{asciimath:show:dirty} { + \dorecurse{\ctxlua{moduledata.asciimath.show.nofdirty(#1)}} { + \ctxlua{moduledata.asciimath.show.dirty(\recurselevel,true)} + \blank[medium,samepage] + } + } + \ctxlua{moduledata.asciimath.show.result(#1)} + \blank + \endgroup} + +\unexpanded\def\ShowAsciiMathStart + {\begingroup + \let\asciimathoptext\asciimathoptexttraced + \setuptyping[\v!buffer][\c!before=,\c!after=] + \setupmargindata[\v!left][\c!style=]} + +\unexpanded\def\ShowAsciiMathStop + {\endgroup} + +\unexpanded\def\ShowAsciiMath + {\dodoubleempty\doShowAsciiMath} + +\unexpanded\def\doShowAsciiMath[#1][#2]% + {\iffirstargument + \ShowAsciiMathStart + \ShowAsciiMathLoad[#1] + \ifsecondargument + \ShowAsciiMathIgnore[#2] + \fi + \dorecurse{\ShowAsciiMathMax}{\ShowAsciiMathResult\recurselevel} + \page + \ShowAsciiMathStats + \ShowAsciiMathStop + \fi} + +\unexpanded\def\xmlShowAsciiMath#1#2% + {\iffirstargument + \ShowAsciiMathStart + \ShowAsciiMathXML{#1}{#2}% + \dorecurse{\ShowAsciiMathMax}{\ShowAsciiMathResult\recurselevel} + \page + \ShowAsciiMathStats + \ShowAsciiMathStop + \fi} + +\unexpanded\def\ShowAsciiMathSave + {\dosingleempty\doShowAsciiMathSave} + +\unexpanded\def\doShowAsciiMathSave[#1]% + {\ctxlua{moduledata.asciimath.show.save("#1")}} \protect +\startsetups asciimath:layout + + \setupbodyfont + % [pagella,10pt] + [dejavu,10pt] + + \setuplayout + [backspace=35mm, + leftmargin=20mm, + rightmargindistance=0pt, + leftmargindistance=5mm, + cutspace=1cm, + topspace=1cm, + bottomspace=1cm, + width=middle, + height=middle, + header=0cm, + footer=1cm] + + \setupheadertexts + [] + + \setupfootertexts + [\currentdate][\pagenumber] + + \setupalign + [flushleft,verytolerant,stretch] + + \dontcomplain + +\stopsetups + +\stopmodule + \continueifinputfile{x-asciimath.mkiv} -\enabletrackers[modules.asciimath.mapping] +%D This will become an extra. -\starttext +\showframe +\setups[asciimath:layout] + +% \enabletrackers[modules.asciimath.mapping] +% \enabletrackers[modules.asciimath.detail] + +% \starttext +% \enablemode[asciimath:show:dirty] +% \ShowAsciiMath[e:/temporary/asciimath/*.xml] +% % \ShowAsciiMathSave[e:/temporary/asciimath/asciimath.lua] +% \stoptext + +\starttext +\unexpanded\def\MyAsciiMath#1{\startformula\asciimath{#1}\stopformula} \startlines -\asciimath{x^2+y_1+z_12^34} -\asciimath{sin^-1(x)} -\asciimath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h} -\asciimath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n} -\asciimath{int_0^1 f(x)dx} -\asciimath{int^1_0 f(x)dx} -\asciimath{a//b} -\asciimath{a//\alpha} -\asciimath{(a/b)/(d/c)} -\asciimath{((a*b))/(d/c)} -\asciimath{[[a,b],[c,d]]((n),(k))} -\asciimath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}} -\asciimath{{ (1,2), (x,(x + text(x))) }} -\asciimath{{(1,2),(x,(x+text(x))),(x,text(x))}} -\asciimath{{(1,2),(x,(x+text(x))),(x,x text(x))}} -\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}} -\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}} -\asciimath{<> text{and} {:(x,y),(u,v):}} -\asciimath{(a,b] = {x text(in) RR | a < x <= b}} +\MyAsciiMath{x^2 / 10 // z_12^34 / 20} +% \MyAsciiMath{{:{:x^2:} / 10:} // {:{:z_12^34 :} / 20:}} +% \MyAsciiMath{x^2+y_1+z_12^34} +% \MyAsciiMath{sin^-1(x)} +% \MyAsciiMath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h} +% \MyAsciiMath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n} +% \MyAsciiMath{int_0^1 f(x)dx} +% \MyAsciiMath{int^1_0 f(x)dx} +% \MyAsciiMath{a//b} +% \MyAsciiMath{a//\alpha} +% \MyAsciiMath{(a/b)/(d/c)} +% \MyAsciiMath{((a*b))/(d/c)} +% \MyAsciiMath{[[a,b],[c,d]]((n),(k))} +% \MyAsciiMath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}} +% \MyAsciiMath{{ (1,2), (x,(x + text(x))) }} +% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,text(x))}} +% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,x text(x))}} +% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}} +% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}} +% \MyAsciiMath{<> text{and} {:(x,y),(u,v):}} +% \MyAsciiMath{(a,b] = {x text(in) RR | a < x <= b}} +% \MyAsciiMath{a/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c)} +% \MyAsciiMath{ (a/b) // (c/d) = ( (a * d) / (b * d) ) // ( (b * c) / (b * d) ) = (a * d) / (b * c)} +% \MyAsciiMath{sin(x+1)_3^2/b / c/d} +% \MyAsciiMath{{:{:sin(x+1)_3^2:}/b:} / {:c/d:}} +% \MyAsciiMath{cos(a) + sin(x+1)_3^2/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c)} +% \MyAsciiMath{S_(11)} +% \MyAsciiMath{f(x)} +% \MyAsciiMath{sin(x)} +% \MyAsciiMath{sin(x+1)} +% \MyAsciiMath{sin^-1(x)} +% \MyAsciiMath{sin(2x)} +% \MyAsciiMath{a_2^2} +% \MyAsciiMath{( (S_(11),S_(12),S_(1n)),(vdots,ddots,vdots),(S_(m1),S_(m2),S_(mn)) ]} +% \MyAsciiMath{frac a b} +% \MyAsciiMath{sin(x)/2 // cos(x)/pi} +% \MyAsciiMath{a/13 // c/d} +% \MyAsciiMath{a/b // c/d} +% \MyAsciiMath{x} +% \MyAsciiMath{x^2} +% \MyAsciiMath{sqrt x} +% \MyAsciiMath{sqrt (x)} +% \MyAsciiMath{root 2 x} +% \MyAsciiMath{x+x} +% \MyAsciiMath{x/3} +% \MyAsciiMath{x^2 / 10} +% \MyAsciiMath{x^2 / 10 // z_12^34 / 20} +% \MyAsciiMath{a^23} +% \MyAsciiMath{a^{:b^23:}+3x} +% \MyAsciiMath{a/b / c/d} +% \MyAsciiMath{sin(x)/b / c/d} +% \MyAsciiMath{sin(x)/b // c/d} +% \MyAsciiMath{a/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c) } +% \MyAsciiMath{{:{:x^2:} / 10:} // {:{:z_12^34 :} / 20:}} +% \MyAsciiMath{x^2+y_1+z_12^34} +% \MyAsciiMath{sin^-1(x)} +% \MyAsciiMath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h} +% \MyAsciiMath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n} +% \MyAsciiMath{int_0^1 f(x)dx} +% \MyAsciiMath{int^1_0 f(x)dx} +% \MyAsciiMath{2x} +% \MyAsciiMath{a//b} +% \MyAsciiMath{a//\alpha} +% \MyAsciiMath{(a/b)/(d/c)} +% \MyAsciiMath{((a*b))/(d/c)} +% \MyAsciiMath{[[a,b],[c,d]]((n),(k))} +% \MyAsciiMath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}} +% \MyAsciiMath{{ (1,2), (x,(x + text(x))) }} +% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,text(x))}} +% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,x text(x))}} +% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}} +% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}} +% \MyAsciiMath{<> text{and} {:(x,y),(u,v):}} +% \MyAsciiMath{(a,b] = {x text(in) RR | a < x <= b}} +% \MyAsciiMath{x^-2} +% \MyAsciiMath{x^2(x-1/16)=0} +% \MyAsciiMath{y= ((1/4)) ^x} +% \MyAsciiMath{log (0,002) / (log(1/4))} +% \MyAsciiMath{x=ax+b \ oeps} +% \MyAsciiMath{x=\ ^ (1/4) log(x)} +% \MyAsciiMath{x=\ ^ (1/4) log(0 ,002 )= log(0,002) / (log(1/4))} +% \MyAsciiMath{x^ (-1 1/2) =1/x^ (1 1/2)=1/ (x^1*x^ (1/2)) =1/ (xsqrt(x))} +% \MyAsciiMath{x^2(10 -x)>2 x^2} +% \MyAsciiMath{x^4>x} \stoplines - \stoptext diff --git a/Master/texmf-dist/tex/context/base/x-cals.lua b/Master/texmf-dist/tex/context/base/x-cals.lua index 36bc1aaba2d..3af6106d803 100644 --- a/Master/texmf-dist/tex/context/base/x-cals.lua +++ b/Master/texmf-dist/tex/context/base/x-cals.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['x-cals'] = { license = "see context related readme files" } +local next = next local format, lower = string.format, string.lower local xmlsprint, xmlcprint, xmlcollected, xmlelements = xml.sprint, xml.cprint, xml.collected, xml.elements local n_todimen, s_todimen = number.todimen, string.todimen @@ -65,8 +66,10 @@ end local function getspecs(root, pattern, names, widths) -- here, but actually we need this in core-ntb.tex -- but ideally we need an mkiv enhanced core-ntb.tex - local ignore_widths = cals.ignore_widths - local shrink_widths = cals.shrink_widths + local ignore_widths = cals.ignore_widths +-- local shrink_widths = at.option == "shrink" or cals.shrink_widths +-- local stretch_widths = at.option == "stretch" or cals.stretch_widths + local shrink_widths = cals.shrink_widths local stretch_widths = cals.stretch_widths for e in xmlcollected(root,pattern) do local at = e.at diff --git a/Master/texmf-dist/tex/context/base/x-ct.lua b/Master/texmf-dist/tex/context/base/x-ct.lua index 2dee985c329..9c647e8e790 100644 --- a/Master/texmf-dist/tex/context/base/x-ct.lua +++ b/Master/texmf-dist/tex/context/base/x-ct.lua @@ -122,6 +122,8 @@ function moduledata.ct.tabulate(root,namespace) end +-- todo: use content and caption + function moduledata.ct.combination(root,namespace) if not root then diff --git a/Master/texmf-dist/tex/context/base/x-html.mkiv b/Master/texmf-dist/tex/context/base/x-html.mkiv new file mode 100644 index 00000000000..e1806eb9eb0 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/x-html.mkiv @@ -0,0 +1,379 @@ +%D \module +%D [ file=x-html, +%D version=2011.02.03, % adapted 2014.11.08 +%D title=\CONTEXT\ Modules, +%D subtitle=HTML, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[html] + +%D Usage: +%D +%D \starttyping +%D \xmlregistersetup{xml:html:basics} +%D \xmlregistersetup{xml:html:tables} +%D \stoptyping + +% \xmlsetsetup{#1}{(p|span)[@lang]}{xml:html:lang} +% +% \startxmlsetups xml:html:lang +% \begingroup +% \language[\xmlatt{#1}{lang}] +% \xmlsetup{#1}{xml:html:\xmltag{#1}} +% \endgroup +% \stopxmlsetups + +\unprotect + +\definehighlight[b] [\c!command=\v!no,\c!style=\v!bold] +\definehighlight[i] [\c!command=\v!no,\c!style=\v!italic] +\definehighlight[bi] [\c!command=\v!no,\c!style=\v!bolditalic] +\definehighlight[em] [\c!command=\v!no,\c!style=\em] +\definehighlight[tt] [\c!command=\v!no,\c!style=\v!mono] +\definehighlight[strong][\c!command=\v!no,\c!style=\v!bold] +\definehighlight[u] [\c!command=\v!no,\c!style=\directsetbar{\v!underbar}] +\definehighlight[code] [\c!command=\v!no,\c!style=\v!mono] +\definehighlight[pre] [\c!command=\v!no] + +\protect + +% todo: pre + +\startxmlsetups xml:html:basics + \xmlsetsetup{#1}{p|br|b|i|u|em|tt|strong|ul|ol|li|table|thead|tbody|tfoot|tr|td|th|span|img}{xml:html:*} + \xmlsetsetup{#1}{b/i}{xml:html:bi} + \xmlsetsetup{#1}{i/b}{xml:html:bi} + \xmlstripanywhere{#1}{!pre} +\stopxmlsetups + +\startxmlsetups xml:html:tables + \xmlsetsetup{#1}{table|thead|tbody|tfoot|tr|td|th}{xml:html:*} +\stopxmlsetups + +\startxmlsetups xml:html:p + \xmldoifnotselfempty {#1} { + \dontleavehmode + \ignorespaces + \xmlflush{#1} + \removeunwantedspaces + } + \par +\stopxmlsetups + +\startxmlsetups xml:html:br + \crlf +\stopxmlsetups + +\startxmlsetups xml:html:b + \directhighlight{b}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:i + \directhighlight{i}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:bi + \directhighlight{bi}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:em + \directhighlight{em}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:tt + \directhighlight{tt}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:strong + \directhighlight{strong}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:u + \directhighlight{u}{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:ul + \startitemize[packed] + \xmlflush{#1} + \stopitemize +\stopxmlsetups + +\startxmlsetups xml:html:ol + \startitemize[packed,n] + \xmlflush{#1} + \stopitemize +\stopxmlsetups + +\startxmlsetups xml:html:li + \startitem + \xmlflush{#1} + \stopitem +\stopxmlsetups + +\startxmlsetups xml:html:code + \directhighlight{code}{\xmlflushspacewise{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:pre + \directhighlight{pre}{\xmlflushspacewise{#1}} +\stopxmlsetups + +\startxmlsetups xml:html:span + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:html:img + \ifhmode + \dontleavehmode + \externalfigure[\xmlatt{#1}{src}] + \else + \startlinecorrection + \externalfigure[\xmlatt{#1}{src}] + \stoplinecorrection + \fi +\stopxmlsetups + +% tables, maybe we need a generic html table module +% +% todo: align + +% beware, the padding code is somewhat experimental, eventually the +% table will be done in cld code +% +% we can also use \xmlmap for border etc + +\starttexdefinition cssgetsinglepadding #1 + \ctxlua { + context((moduledata.css.padding( + "#1", + \number\dimexpr0.1ex, + \number\dimexpr0.01\hsize, + \number\dimexpr1ex, + \number\dimexpr1em + ))) % returns 4 values therefore () + }sp +\stoptexdefinition + +\startxmlsetups xml:html:table + \edef\CellPadding{\xmlatt{#1}{cellpadding}} + \ifx\CellPadding\empty + \edef\CellPadding{.25ex} + \else + \edef\CellPadding{\cssgetsinglepadding\CellPadding} + \fi + \startlinecorrection[blank] + \doifelse {\xmlatt{#1}{border}} {0} { + \bTABLE[frame=off,offset=\CellPadding] + \xmlflush{#1} + \eTABLE + } { + \bTABLE[offset=\CellPadding] + \xmlflush{#1} + \eTABLE + } + \stoplinecorrection +\stopxmlsetups + +\startxmlsetups xml:html:thead + \bTABLEhead + \xmlflush{#1} + \eTABLEhead +\stopxmlsetups + +\startxmlsetups xml:html:tbody + \bTABLEbody + \xmlflush{#1} + \eTABLEbody +\stopxmlsetups + +\startxmlsetups xml:html:tfoot + \bTABLEfoot + \xmlflush{#1} + \eTABLEfoot +\stopxmlsetups + +\startxmlsetups xml:html:tr + \bTR[ny=\xmlattdef{#1}{rowspan}{1}] + \xmlflush{#1} + \eTR +\stopxmlsetups + +\startxmlsetups xml:html:td + \bTD[nx=\xmlattdef{#1}{colspan}{1}] + \xmlflush{#1} + \eTD +\stopxmlsetups + +\startxmlsetups xml:html:th + \bTH[nx=\xmlattdef{#1}{colspan}{1}] + \xmlflush{#1} + \eTH +\stopxmlsetups + +% \xmlregistersetup{xml:html:basics} + +%D For old times sake: + +\startxmlsetups xml:setups:common + \xmlsetup{#1}{xml:html:basics} + \xmlsetup{#1}{xml:html:tables} +% \ifconditional\qmlcleanuptwo +% \xmlsetsetup{#1}{html/br[index() == 1]}{xml:noppes:1} +% \xmlsetsetup{#1}{html/p[index() == lastindex()]/br[index() == lastindex()]}{xml:noppes:2} +% \xmlsetsetup{#1}{html/br[index() == lastindex()]}{xml:noppes:3} +% \xmlsetsetup{#1}{br[name(1) == 'img']}{xml:noppes} +% \xmlsetsetup{#1}{br[name(1) == 'br' and name(2) == 'img']}{xml:noppes} +% % \xmlsetsetup{#1}{br/following-sibling::img[position()==1]}{xml:noppes} +% \fi +\stopxmlsetups + +\stopmodule + +\continueifinputfile{x-html.mkiv} + +\xmlregistersetup{xml:html:basics} +\xmlregistersetup{xml:html:tables} + +\startxmlsetups xml:whatever + \xmlsetsetup {#1} { + html|body + } {xml:html:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{main}{xml:whatever} + +\startxmlsetups xml:html:html + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:html:body + \xmlflush{#1} +\stopxmlsetups + +\setuphead[subject][page=yes,style=\bfa] + +\starttexdefinition ShowExample#1 + \startsubject[title=#1] + \typebuffer[#1] + \starttextrule{result} + \xmlprocessbuffer{main}{#1}{} + \stoptextrule + \stopsubject +\stoptexdefinition + +\starttext + +\startbuffer[test 1] + +

test

+

+

test

+ +\stopbuffer + +\startbuffer[test 2] + +

test (hierna een lf) +test

+ +\stopbuffer + +\startbuffer[test 3] + +

test (hierna een lf met lege regel) + +test

+ +\stopbuffer + +\startbuffer[test 4] + +

test (hierna een lf met twee lege regels) + + +test

+ +\stopbuffer + +\startbuffer[test 5] + +

test (hierna br geen lf)
test

+ +\stopbuffer + +\startbuffer[test 6] + +

test (hierna br met lf)
+test

+ +\stopbuffer + +\startbuffer[test 7] + +

test (hierna br met lf en lege regel)
+ +test

+ +\stopbuffer + +\startbuffer[test 8] + +

test (hierna br met lf en twee lege regels)
+ + +test

+ +\stopbuffer + +\startbuffer[test 9] + +

test (hierna bold) bold test

+ +\stopbuffer + +\startbuffer[test 10] + +

test (hierna lf met bold) +bold underlined test

+ +\stopbuffer + +\startbuffer[test 11] + +

test (hierna lf met lege regel en bold) + +bold test

+ +\stopbuffer + +\startbuffer[test 12] + +

test (hierna lf met lege regel en lf in bold) + + +bold + test

+ +\stopbuffer + +\startbuffer[test 13] + +

test (hierna lf met lege regel en lf en lege regel in bold) + + + +bold + + test

+ +\stopbuffer + +\dorecurse{13}{\ShowExample{test #1}} + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/x-math-svg.lua b/Master/texmf-dist/tex/context/base/x-math-svg.lua new file mode 100644 index 00000000000..263827f92f5 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/x-math-svg.lua @@ -0,0 +1,169 @@ +if not modules then modules = { } end modules ['x-math-svg'] = { + version = 1.001, + comment = "companion to x-math-svg.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local tostring, type, next = tostring, type, next +local lpegmatch, P, Cs = lpeg.match, lpeg.P, lpeg.Cs + +local xmlfirst = xml.first +local xmlconvert = xml.convert +local xmlload = xml.load +local xmlsave = xml.save +local xmlcollected = xml.collected +local xmldelete = xml.delete + +local loadtable = table.load +local savetable = table.save + +local replacesuffix = file.replacesuffix +local addsuffix = file.addsuffix +local removefile = os.remove +local isfile = lfs.isfile + +local formatters = string.formatters + +moduledata = moduledata or table.setmetatableindex("table") +local svgmath = moduledata.svgmath -- autodefined + +local namedata = { } +local pagedata = { } + +local statusname = "x-math-svg-status.lua" +local pdfname = "x-math-svg.pdf" + +local pdftosvg = os.which("mudraw") + +local f_make_tex = formatters[ [[context --global kpse:x-math-svg.mkvi --inputfile="%s" --svgstyle="%s" --batch --noconsole --once --purgeall]] ] +local f_make_svg = formatters[ [[mudraw -o "math-%%d.svg" "%s" 1-9999]] ] + +local f_inline = formatters[ [[
]] ] +local f_display = formatters[ [[
]] ] + +local f_math_tmp = formatters[ [[math-%i]] ] + +function svgmath.process(filename) + if not filename then + -- no filename given + return + elseif not isfile(filename) then + -- invalid filename + return + end + local index = 0 + local page = 0 + local blobs = { } + local root = xmlload(filename) + for mth in xmlcollected(root,"math") do + index = index + 1 + local blob = tostring(mth) + if blobs[blob] then + context.ReuseSVGMath(index,blobs[blob]) + else + page = page + 1 + buffers.assign(f_math_tmp(page),blob) + context.MakeSVGMath(index,page,mth.at.display) + blobs[blob] = page + end + end + context(function() + -- for tracing purposes: + for mathdata, pagenumber in next, blobs do + local p = pagedata[pagenumber] + p.mathml = mathdata + p.number = pagenumber + end + -- + savetable(statusname, { + pagedata = pagedata, + namedata = namedata, + }) + end) +end + +function svgmath.register(index,page,specification) + if specification then + pagedata[page] = specification + end + namedata[index] = page +end + +function svgmath.convert(filename,svgstyle) + if not filename then + -- no filename given + return false, "no filename" + elseif not isfile(filename) then + -- invalid filename + return false, "invalid filename" + elseif not pdftosvg then + return false, "mudraw is not installed" + end + + os.execute(f_make_tex(filename,svgstyle)) + + local data = loadtable(statusname) + if not data then + -- invalid tex run + return false, "invalid tex run" + elseif not next(data) then + return false, "no converson needed" + end + + local pagedata = data.pagedata + local namedata = data.namedata + + os.execute(f_make_svg(pdfname)) + + local root = xmlload(filename) + local index = 0 + local done = { } + local unique = 0 + + local between = (1-P("<"))^1/"" + local strip = Cs(( + (P(""))^1) * P("")) * between^0 / "" + + P(">") * between + + P(1) + )^1) + + for mth in xmlcollected(root,"m:math") do + index = index + 1 + local page = namedata[index] + if done[page] then + mth.__p__.dt[mth.ni] = done[page] + else + local info = pagedata[page] + local depth = info.depth + local mode = info.mode + local svgname = addsuffix(f_math_tmp(page),"svg") + local action = mode == "inline" and f_inline or f_display + local x_div = xmlfirst(xmlconvert(action(-depth)),"/div") + local svgdata = io.loaddata(svgname) + if not svgdata or svgdata == "" then + print("error in:",svgname,tostring(mth)) + else + -- svgdata = string.gsub(svgdata,">%s<","") + svgdata = lpegmatch(strip,svgdata) + local x_svg = xmlfirst(xmlconvert(svgdata),"/svg") + -- xmldelete(x_svg,"text") + x_div.dt = { x_svg } + mth.__p__.dt[mth.ni] = x_div -- use helper + end + done[page] = x_div + unique = unique + 1 + end + end + +-- for k, v in next, data do +-- removefile(addsuffix(k,"svg")) +-- end +-- removefile(statusname) +-- removefile(pdfname) + + xmlsave(root,filename) + + return true, index, unique +end diff --git a/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv b/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv new file mode 100644 index 00000000000..e166995b0c8 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv @@ -0,0 +1,276 @@ +% macros=mkvi + +% makes sense (but rel vs op ...): + +% \unexpanded\def\stackrel#1#2{\mathematics{\mathop{\let\limits\relax\mover{#2}{#1}}}} + +% this can become a core helper + +% bwe could do all of them in lua + +\startluacode +local find = string.find +local lpegmatch = lpeg.match + +local splitter = lpeg.Ct(lpeg.C(lpeg.patterns.nestedbraces + lpeg.patterns.utf8character)^1) + +function commands.xmfenced(left,middle,right,content) + local l = left ~= "" and left or "(" + local r = right ~= "" and right or ")" + local m = middle ~= "" and middle and lpegmatch(splitter,middle) or { "," } + local c = find(content,"{") and lpegmatch(splitter,content) or { content } + local n = #c + if n > 1 then + context("\\left%s",l) + for i=1,n do + if i > 1 then + context("%s %s",m[i] or m[#m],c[i]) + else + context(c[i]) + end + end + context("\\right%s",r) + else + context("\\left%s %s \\right%s",l,content,r) + end +end + +\stopluacode + +\unprotect + +\unexpanded\def\mexecuteifdefined#1% + {\ifx#1\empty + \expandafter\secondoftwoarguments + \else\ifcsname#1\endcsname + \doubleexpandafter\firstoftwoarguments + \else + \doubleexpandafter\secondoftwoarguments + \fi\fi + {\csname#1\endcsname}} + +% mrow + +\let\mrow\mathematics + +% msub msup msubsup + +\starttexdefinition msub #1#2 + \mathematics { + #1_{#2} + } +\stoptexdefinition + +\starttexdefinition msup #1#2 + \mathematics { + #1^{#2} + } +\stoptexdefinition + +\starttexdefinition msubsup #1#2#3 + \mathematics { + #1_{#2}^{#3} + } +\stoptexdefinition + +% mn mo mi + +\let\mn\mathematics +\let\mo\mathematics +\let\mi\mathematics + +% ms mtext + +\starttexdefinition ms #1 + \text { + "#1" + } +\stoptexdefinition + +\starttexdefinition mtext #1 + \text { + #1 + } +\stoptexdefinition + +% mover + +\starttexdefinition unexpanded moverabove #1 + \edef\movercommand{\utfmathfiller\movertoken} + \mexecuteifdefined\movercommand {#1} \relax +\stoptexdefinition +\starttexdefinition unexpanded moverbase #1 + \edef\mbasecommand{\utfmathfiller\mbasetoken} + \mexecuteifdefined\mbasecommand {#1} + \relax +\stoptexdefinition +\starttexdefinition unexpanded moverbasefiller #1#2 + \edef\mbasecommand{e\utfmathcommandfiller\mbasetoken} + \mexecuteifdefined\mbasecommand \relax {#2} {} +\stoptexdefinition +\starttexdefinition unexpanded moveraccent #1#2 + \edef\movercommand{\utfmathcommandabove\movertoken} + \mexecuteifdefined\movercommand \relax {#1} +\stoptexdefinition +\starttexdefinition unexpanded movertext #1#2 + % \mathtriplet {\mathstylehbox{#1}} {#2} {} + \mathtriplet {\mathematics{#1}} {#2} {} +\stoptexdefinition +\starttexdefinition unexpanded moveraccentchecker #1#2 + \edef\movertoken{\tochar{#2}} + \doifelseutfmathabove\movertoken \moveraccent \movertext {#1}{#2} +\stoptexdefinition + +\starttexdefinition unexpanded mover #1#2 + \mathematics { + \edef\mbasetoken{\tochar{#1}} + \doifelseutfmathfiller\mbasetoken \moverbasefiller \moveraccentchecker {#1}{#2} + } +\stoptexdefinition + +% munder + +\starttexdefinition unexpanded munderbelow #1 + \edef\mundercommand{\utfmathfiller\mundertoken} + \mexecuteifdefined\mundercommand {#1} \relax +\stoptexdefinition +\starttexdefinition unexpanded munderbase #1 + \edef\mbasecommand{\utfmathfiller\mbasetoken} + \mexecuteifdefined\mbasecommand {#1} + \relax +\stoptexdefinition +\starttexdefinition unexpanded munderbasefiller #1#2 + \edef\mbasecommand{e\utfmathcommandfiller\mbasetoken} + \mexecuteifdefined\mbasecommand \relax {#2} {} +\stoptexdefinition +\starttexdefinition unexpanded munderaccent #1#2 + \edef\mundercommand{\utfmathcommandbelow\mundertoken} + \mexecuteifdefined\mundercommand \relax {#1} +\stoptexdefinition +\starttexdefinition unexpanded mundertext #1#2 + % \mathtriplet {\mathstylehbox{#1}} {} {#2} + \mathtriplet {\mathematics{#1}} {} {#2} +\stoptexdefinition +\starttexdefinition unexpanded munderaccentchecker #1#2 + \edef\mundertoken{\tochar{#2}} + \doifelseutfmathbelow\mundertoken \munderaccent \mundertext {#1}{#2} +\stoptexdefinition + +\starttexdefinition unexpanded munder #1#2 + \mathematics { + \edef\mbasetoken{\tochar{#1}} + \doifelseutfmathfiller\mbasetoken \munderbasefiller \munderaccentchecker {#1}{#2} + } +\stoptexdefinition + +% munderover + +% mfenced + +% \mfenced{x,y} +% \mfenced{{x}{y}} +% \mfenced[separators]{{x}{y}} +% \mfenced[left][right]{{x}{y}} +% \mfenced[left][separators][right]{{x}{y}} + +\starttexdefinition unexpanded mfenced + \dotripleempty\do_mfenced +\stoptexdefinition + +\starttexdefinition unexpanded do_mfenced [#1][#2][#3]#4 + \mathematics { + \ctxcommand{xmfenced( + \ifthirdargument "#1","#2","#3"\else + \ifsecondargument "#1",",","#2"\else + \iffirstargument "(","#1",")"\else + "(",",",")"\fi\fi\fi + ,"#4")} + } +\stoptexdefinition + +% mfrac + +\starttexdefinition unexpanded mfrac #1#2 + \mathematics { + \frac{#1}{#2} + } +\stoptexdefinition + +% mroot msqrt + +\starttexdefinition unexpanded mroot #1#2 + \mathematics { + \sqrt[#1]{#2} + } +\stoptexdefinition + +\starttexdefinition unexpanded msqrt #1 + \mathematics { + \sqrt{#1} + } +\stoptexdefinition + +% menclose + +% merror + +% mglyph + +% mmultiscripts + +% mpadded + +% mphantom + +% mspace + +% mstyle + +% mtable mtr mlabeledtr mtd + +% maction + +% semantics + +\protect + +\continueifinputfile{x-mathml-basics.mkiv} + +\starttext + +$\mfenced{1+a}$\par +$\mfenced[,]{1+a}$\par +$\mfenced[,]{{1+a}{1+b}}$\par + +% $\mover{←}{test}$\par +% $\mover{\utfchar{"2190}}{test}$\par +% $\mover{e:leftarrow}{test}$\par +% $\mover{x:2190}{test}$\par + +% $\mover{test}{⏞}$\par +% $\mover{test}{\utfchar{"23DE}}$\par +% $\mover{test}{e:overbrace}$\par +% $\mover{test}{x:23DE}$\par +% $\mover{test}{over}$\par + +% \mover{test}{⏞}\par +% \mover{test}{\utfchar{"23DE}}\par +% \mover{test}{e:overbrace}\par +% \mover{test}{x:23DE}\par + +% $\munder{←}{test}$\par +% $\munder{\utfchar{"2190}}{test}$\par +% $\munder{e:leftarrow}{test}$\par +% $\munder{x:2190}{test}$\par + +% $\munder{test}{⏟}$\par +% $\munder{test}{\utfchar{"23DF}}$\par +% $\munder{test}{e:underbrace}$\par +% $\munder{test}{x:23DF}$\par +% $\munder{test}{under}$\par + +% \math{{\msup{x}{2}\mo{+}\mn{2}\mi{x}\mo{+}\mi{b}}} + +% \mrow{\msup{x}{2}\mo{+}\mn{2}\mi{x}\mo{+}\mi{b}} + +\stoptext diff --git a/Master/texmf-dist/tex/context/base/x-mathml.lua b/Master/texmf-dist/tex/context/base/x-mathml.lua index 15739eec76e..a0db339bc61 100644 --- a/Master/texmf-dist/tex/context/base/x-mathml.lua +++ b/Master/texmf-dist/tex/context/base/x-mathml.lua @@ -6,20 +6,56 @@ if not modules then modules = { } end modules ['x-mathml'] = { license = "see context related readme files" } --- This needs an upgrade to the latest greatest mechanisms. +-- This needs an upgrade to the latest greatest mechanisms. But ... it +-- probably doesn't pay back as no mathml support ever did. local type, next = type, next -local format, lower, find, gsub = string.format, string.lower, string.find, string.gsub +local formatters, lower, find, gsub, match = string.formatters, string.lower, string.find, string.gsub, string.match local strip = string.strip -local xmlsprint, xmlcprint, xmltext, xmlcontent = xml.sprint, xml.cprint, xml.text, xml.content +local xmlsprint, xmlcprint, xmltext, xmlcontent, xmlempty = xml.sprint, xml.cprint, xml.text, xml.content, xml.empty +local lxmlcollected, lxmlfilter = lxml.collected, lxml.filter local getid = lxml.getid -local utfchar, utfcharacters, utfvalues = utf.char, utf.characters, utf.values -local lpegmatch = lpeg.match +local utfchar, utfcharacters, utfvalues, utfsplit, utflen = utf.char, utf.characters, utf.values, utf.split, utf.len +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns +local P, Cs = lpeg.P, lpeg.Cs local mathml = { } moduledata.mathml = mathml lxml.mathml = mathml -- for the moment +local context = context + +local ctx_enabledelimiter = context.enabledelimiter +local ctx_disabledelimiter = context.disabledelimiter +local ctx_xmlflush = context.xmlflush -- better xmlsprint + +local ctx_halign = context.halign +local ctx_noalign = context.noalign +local ctx_bgroup = context.bgroup +local ctx_egroup = context.egroup +local ctx_crcr = context.crcr + +local ctx_bTABLE = context.bTABLE +local ctx_eTABLE = context.eTABLE +local ctx_bTR = context.bTR +local ctx_eTR = context.eTR +local ctx_bTD = context.bTD +local ctx_eTD = context.eTD + +local ctx_mn = context.mn +local ctx_mi = context.mi +local ctx_mo = context.mo +local ctx_startimath = context.startimath +local ctx_ignorespaces = context.ignorespaces +local ctx_removeunwantedspaces = context.removeunwantedspaces +local ctx_stopimath = context.stopimath + +local ctx_mmlapplycsymbol = context.mmlapplycsymbol + +local ctx_mathopnolimits = context.mathopnolimits +local ctx_left = context.left +local ctx_right = context.right + -- an alternative is to remap to private codes, where we can have -- different properties .. to be done; this will move and become -- generic; we can then make the private ones active in math mode @@ -62,6 +98,7 @@ local o_replacements = { -- in main table ["{"] = "\\mmlleftdelimiter \\lbrace", ["}"] = "\\mmlrightdelimiter\\rbrace", ["|"] = "\\mmlleftorrightdelimiter\\vert", + -- ["."] = "\\mmlleftorrightdelimiter.", ["/"] = "\\mmlleftorrightdelimiter\\solidus", [doublebar] = "\\mmlleftorrightdelimiter\\Vert", ["("] = "\\mmlleftdelimiter(", @@ -467,20 +504,39 @@ function mathml.stripped(str) context(strip(str)) end +local p_entity = (P("&") * ((1-P(";"))^0) * P(";")) +local p_utfchar = lpegpatterns.utf8character +local p_spacing = lpegpatterns.whitespace^1 + +local p_mn = Cs((p_entity/"" + p_spacing/utfchar(0x205F) + p_utfchar/n_replacements)^0) +local p_strip = Cs((p_entity/"" + p_utfchar )^0) +local p_mi = Cs((p_entity/"" + p_utfchar/i_replacements)^0) + +-- function mathml.mn(id,pattern) +-- -- maybe at some point we need to interpret the number, but +-- -- currently we assume an upright font +-- local str = xmlcontent(getid(id)) or "" +-- local rep = gsub(str,"&.-;","") +-- local rep = gsub(rep,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen) +-- local rep = gsub(rep,".",n_replacements) +-- ctx_mn(rep) +-- end + function mathml.mn(id,pattern) -- maybe at some point we need to interpret the number, but -- currently we assume an upright font - local str = xmlcontent(getid(id)) or "" - local rep = gsub(str,"&.-;","") - local rep = gsub(rep,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen) - local rep = gsub(rep,".",n_replacements) - context.mn(rep) + ctx_mn(lpegmatch(p_mn,xmlcontent(getid(id)) or "")) end +-- function mathml.mo(id) +-- local str = xmlcontent(getid(id)) or "" +-- local rep = gsub(str,"&.-;","") -- todo +-- context(simpleoperatorremapper(rep) or rep) +-- end + function mathml.mo(id) - local str = xmlcontent(getid(id)) or "" - local rep = gsub(str,"&.-;","") -- todo - context(simpleoperatorremapper(rep) or rep) + local str = lpegmatch(p_strip,xmlcontent(getid(id)) or "") + context(simpleoperatorremapper(str) or str) end function mathml.mi(id) @@ -494,37 +550,43 @@ function mathml.mi(id) elseif n == 1 then local first = str[1] if type(first) == "string" then - local str = gsub(first,"&.-;","") -- bah - local rep = i_replacements[str] - if not rep then - rep = gsub(str,".",i_replacements) - end + -- local str = gsub(first,"&.-;","") -- bah + -- local rep = i_replacements[str] + -- if not rep then + -- rep = gsub(str,".",i_replacements) + -- end + local str = lpegmatch(p_strip,first) + local rep = i_replacements[str] or lpegmatch(p_mi,str) context(rep) - -- context.mi(rep) + -- ctx_mi(rep) else - context.xmlflush(id) -- xmlsprint or so + ctx_xmlflush(id) -- xmlsprint or so end else - context.xmlflush(id) -- xmlsprint or so + ctx_xmlflush(id) -- xmlsprint or so end else - context.xmlflush(id) -- xmlsprint or so + ctx_xmlflush(id) -- xmlsprint or so end end function mathml.mfenced(id) -- multiple separators id = getid(id) - local left, right, separators = id.at.open or "(", id.at.close or ")", id.at.separators or "," - local l, r = l_replacements[left], r_replacements[right] - context.enabledelimiter() + local at = id.at + local left = at.open or "(" + local right = at.close or ")" + local separators = at.separators or "," + local l = l_replacements[left] + local r = r_replacements[right] + ctx_enabledelimiter() if l then context(l_replacements[left] or o_replacements[left] or "") else context(o_replacements["@l"]) context(left) end - context.disabledelimiter() - local collected = lxml.filter(id,"/*") -- check the * + ctx_disabledelimiter() + local collected = lxmlfilter(id,"/*") -- check the * if collected then local n = #collected if n == 0 then @@ -532,7 +594,7 @@ function mathml.mfenced(id) -- multiple separators elseif n == 1 then xmlsprint(collected[1]) -- to be checked else - local t = utf.split(separators,true) + local t = utfsplit(separators,true) for i=1,n do xmlsprint(collected[i]) -- to be checked if i < n then @@ -551,35 +613,16 @@ function mathml.mfenced(id) -- multiple separators end end end - context.enabledelimiter() + ctx_enabledelimiter() if r then context(r_replacements[right] or o_replacements[right] or "") else context(right) context(o_replacements["@r"]) end - context.disabledelimiter() + ctx_disabledelimiter() end ---~ local function flush(e,tag,toggle) ---~ if toggle then ---~ context("^{") ---~ else ---~ context("_{") ---~ end ---~ if tag == "none" then ---~ context("{}") ---~ else ---~ xmlsprint(e.dt) ---~ end ---~ if not toggle then ---~ context("}") ---~ else ---~ context("}{}") ---~ end ---~ return not toggle ---~ end - local function flush(e,tag,toggle) if tag == "none" then -- if not toggle then @@ -599,7 +642,7 @@ end function mathml.mmultiscripts(id) local done, toggle = false, false - for e in lxml.collected(id,"/*") do + for e in lxmlcollected(id,"/*") do local tag = e.tg if tag == "mprescripts" then context("{}") @@ -609,14 +652,14 @@ function mathml.mmultiscripts(id) end end local done, toggle = false, false - for e in lxml.collected(id,"/*") do + for e in lxmlcollected(id,"/*") do local tag = e.tg if tag == "mprescripts" then break elseif done then toggle = flush(e,tag,toggle) else - xmlsprint(e.dt) + xmlsprint(e) done = true end end @@ -651,12 +694,12 @@ function mathml.mcolumn(root) local tag = e.tg if tag == "mi" or tag == "mn" or tag == "mo" or tag == "mtext" then local str = xmltext(e) - str = gsub(str,"&.-;","") + str = lpegmatch(p_strip,str) for s in utfcharacters(str) do m[#m+1] = { tag, s } end if tag == "mn" then - local n = utf.len(str) + local n = utflen(str) if n > numbers then numbers = n end @@ -670,20 +713,20 @@ function mathml.mcolumn(root) -- m[#m+1] = { tag, e } end end - for e in lxml.collected(root,"/*") do + for e in lxmlcollected(root,"/*") do local m = { } matrix[#matrix+1] = m if e.tg == "mrow" then -- only one level - for e in lxml.collected(e,"/*") do + for e in lxmlcollected(e,"/*") do collect(m,e) end else collect(m,e) end end - context.halign() - context.bgroup() + ctx_halign() + ctx_bgroup() context([[\hss\startimath\alignmark\stopimath\aligntab\startimath\alignmark\stopimath\cr]]) for i=1,#matrix do local m = matrix[i] @@ -695,7 +738,7 @@ function mathml.mcolumn(root) end end if mline then - context.noalign([[\obeydepth\nointerlineskip]]) + ctx_noalign([[\obeydepth\nointerlineskip]]) end for j=1,#m do local mm = m[j] @@ -738,9 +781,9 @@ function mathml.mcolumn(root) local nchr = n_replacements[chr] context(nchr or chr) end - context.crcr() + ctx_crcr() end - context.egroup() + ctx_egroup() end local spacesplitter = lpeg.tsplitat(" ") @@ -758,42 +801,47 @@ function mathml.mtable(root) local framespacing = at.framespacing or "0pt" local framespacing = at.framespacing or "-\\ruledlinewidth" -- make this an option - context.bTABLE { frame = frametypes[frame or "none"] or "off", offset = framespacing, background = "" } -- todo: use xtables and definextable - for e in lxml.collected(root,"/(mml:mtr|mml:mlabeledtr)") do - context.bTR() + ctx_bTABLE { frame = frametypes[frame or "none"] or "off", offset = framespacing, background = "" } -- todo: use xtables and definextable + for e in lxmlcollected(root,"/(mml:mtr|mml:mlabeledtr)") do + ctx_bTR() local at = e.at local col = 0 local rfr = at.frame or (frames and frames [#frames]) local rra = at.rowalign or (rowaligns and rowaligns [#rowaligns]) local rca = at.columnalign or (columnaligns and columnaligns[#columnaligns]) local ignorelabel = e.tg == "mlabeledtr" - for e in lxml.collected(e,"/mml:mtd") do -- nested we can use xml.collected + for e in lxmlcollected(e,"/mml:mtd") do -- nested we can use xml.collected col = col + 1 if ignorelabel and col == 1 then -- get rid of label, should happen at the document level else local at = e.at - local rowspan, columnspan = at.rowspan or 1, at.columnspan or 1 + local rowspan = at.rowspan or 1 + local columnspan = at.columnspan or 1 local cra = rowalignments [at.rowalign or (rowaligns and rowaligns [col]) or rra or "center"] or "lohi" local cca = columnalignments[at.columnalign or (columnaligns and columnaligns[col]) or rca or "center"] or "middle" local cfr = frametypes [at.frame or (frames and frames [col]) or rfr or "none" ] or "off" - context.bTD { align = format("{%s,%s}",cra,cca), frame = cfr, nx = columnspan, ny = rowspan } - context.startimath() - context.ignorespaces() - xmlcprint(e) - context.stopimath() - context.removeunwantedspaces() - context.eTD() + ctx_bTD { align = formatters["{%s,%s}"](cra,cca), frame = cfr, nx = columnspan, ny = rowspan } + if xmlempty(e,".") then + -- nothing, else hsize max + else + ctx_startimath() + -- ctx_ignorespaces() + xmlcprint(e) + -- ctx_removeunwantedspaces() + ctx_stopimath() + end + ctx_eTD() end end -- if e.tg == "mlabeledtr" then - -- context.bTD() + -- ctx_bTD() -- xmlcprint(xml.first(e,"/!mml:mtd")) - -- context.eTD() + -- ctx_eTD() -- end - context.eTR() + ctx_eTR() end - context.eTABLE() + ctx_eTABLE() end function mathml.csymbol(root) @@ -804,14 +852,16 @@ function mathml.csymbol(root) local full = hash.original or "" local base = hash.path or "" local text = strip(xmltext(root) or "") - context.mmlapplycsymbol(full,base,encoding,text) + ctx_mmlapplycsymbol(full,base,encoding,text) end +local p = lpeg.Cs(((1-lpegpatterns.whitespace)^1 / "mml:enclose:%0" + (lpegpatterns.whitespace^1)/",")^1) + function mathml.menclosepattern(root) root = getid(root) local a = root.at.notation if a and a ~= "" then - context("mml:enclose:",(gsub(a," +",",mml:enclose:"))) + context(lpegmatch(p,a)) end end @@ -822,8 +872,8 @@ end function mathml.cpolar_a(root) root = getid(root) local dt = root.dt - context.mathopnolimits("Polar") - context.left(false,"(") + ctx_mathopnolimits("Polar") + ctx_left(false,"(") for k=1,#dt do local dk = dt[k] if xml.is_element(dk,"sep") then @@ -832,7 +882,7 @@ function mathml.cpolar_a(root) xmlsprint(dk) end end - context.right(false,")") + ctx_right(false,")") end -- crap .. maybe in char-def a mathml overload diff --git a/Master/texmf-dist/tex/context/base/x-mathml.mkiv b/Master/texmf-dist/tex/context/base/x-mathml.mkiv index 5520dbbe6fc..65a7223ce59 100644 --- a/Master/texmf-dist/tex/context/base/x-mathml.mkiv +++ b/Master/texmf-dist/tex/context/base/x-mathml.mkiv @@ -1,4 +1,4 @@ -%D \modul +%D \module %D [ file=x-mathml, %D version=2008.05.29, %D title=\CONTEXT\ XML Modules, @@ -16,12 +16,17 @@ % This module is under construction and will be cleaned up. We use a funny mix of % xml, tex and lua. I could rewrite the lot but it also shows how context evolves. % -% I might en dup with a lua-only implementation some day. +% I might end up with a lua-only implementation some day. I must find a good reason +% to spend time on it. In fact, it might even be more messy. % % no m:text strip (needs checking, maybe nbsp is mandate % % todo: more will be moved to lua (less hassle) % todo: move left/right to the lua end +% +% this implememation looks like a hack ... this is because we deal with all weird cases we +% ran into, including abuse that was supposed to render ok (even if it didn't in other +% renderers) .. it was simply expected to work that way. \writestatus{loading}{ConTeXt XML Macros / MathML Renderer} @@ -51,10 +56,10 @@ \xmlregistersetup{xml:mml:define} -\unexpanded\def\MMLhack - {\let\MMLpar\par - \let\par\relax - \everyvbox{\let\par\MMLpar}} +% \unexpanded\def\MMLhack % no longer needed +% {\let\MMLpar\par +% \let\par\relax +% \everyvbox{\let\par\MMLpar}} \xmlmapvalue {mml:math:mode} {display} {\displaymathematics} % we had this already \xmlmapvalue {mml:math:mode} {inline} {\inlinemathematics } @@ -75,7 +80,7 @@ } { \math_fences_checked_start - \MMLhack + %\MMLhack \xmlflush{#1} \math_fences_checked_stop } @@ -85,7 +90,7 @@ \startxmlsetups mml:imath \inlinemathematics { \math_fences_checked_start - \MMLhack + %\MMLhack \xmlflush{#1} \math_fences_checked_stop } @@ -94,7 +99,7 @@ \startxmlsetups mml:dmath \displaymathematics { \math_fences_checked_start - \MMLhack + %\MMLhack \xmlflush{#1} \math_fences_checked_stop } @@ -106,7 +111,10 @@ \edef\mmlformulalabel {\xmlatt{#1}{label}\xmlatt{#1}{id}} \edef\mmlformulasublabel{\xmlatt{#1}{sublabel}\xmlatt{#1}{id}} \doifsomething\mmlformulalabel{\placeformula[\mmlformulalabel]{\mmlformulasublabel}} - \startformula\MMLhack\xmlfirst{#1}{/mml:math}\stopformula + \startformula + %\MMLhack + \xmlfirst{#1}{/mml:math} + \stopformula \stopxmlsetups % old delimiter hacks @@ -164,11 +172,6 @@ %D filter. There is an intermediate cleaner module but it has %D some namespace limitations. Here we do it the \MKIV\ way. -\def\widevec#1% - {\vbox{\mathsurround\zeropoint\ialign{##\crcr - \rightarrowfill\crcr\noalign{\nointerlineskip}% - \startimath\hfil\displaystyle{#1}\hfil\stopimath\crcr}}} - %D The rendering macros: \def\MMLrm{\mr} @@ -209,7 +212,9 @@ %D We start with the parent elements and the option handler. -\def\xmlmathmldirective#1{\dosetvalue{MML#1}} +\unexpanded\def\xmlmathmldirective#1{\dosetvalue{MML#1}} + +\xmlinstalldirective{mathml}{xmlmathmldirective} %def\xmlmathmldirective#1#2#3{[#1][#2][#3]\dosetvalue{MML#1}{#2}{#3}} @@ -378,7 +383,7 @@ % \MMLdoR % } { \edef\mmlapplyaction{\xmlfilter{#1}{/*/name()}} - \doifsetupselse {mml:apply:mml:\mmlapplyaction} { + \doifelsesetups {mml:apply:mml:\mmlapplyaction} { \xmlsetup{#1}{mml:apply:mml:\mmlapplyaction} } { % \MMLdoL @@ -399,7 +404,7 @@ \startxmlsetups mml:apply:mml:fn \xmldoifelse {#1} {/mml:fn/mml:ci} { \edef\mmlfnci{\xmlstripped{#1}{/mml:fn/mml:ci}}% was xmlcontent - \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:... + \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:... \xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin } { \MMLcreset @@ -466,7 +471,7 @@ \fi \xmldoifelse {#1} {/mml:ci} { % first \edef\mmlfnci{\xmltext{#1}{/mml:ci}}% was xmlcontent - \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:... + \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:... \xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin } { \MMLcreset @@ -497,7 +502,7 @@ \startxmlsetups mmc:fn:apply % where used? \xmldoifelse {#1} {/mml:ci} { % first \edef\mmlfnci{\xmltext{#1}{/mml:ci}}% was xmlcontent - \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:... + \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:... \xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin } { \MMLcreset @@ -524,16 +529,15 @@ \starttexdefinition mmlapplycsymbol #1#2#3#4 % #1=full url, #2=name, #3=encoding, #4=text \doifelse {#3} {text} { -% {\mr #4} \text{#4} } { - \doifsetupselse {mml:csymbol:#1} { + \doifelsesetups {mml:csymbol:#1} { % full url - \directsetup{mml:csymbol:#1} + \fastsetup{mml:csymbol:#1} } { % somename (fallback) - \doifsetupselse {mml:csymbol:#2} { - \directsetup{mml:csymbol:#2} + \doifelsesetups {mml:csymbol:#2} { + \fastsetup{mml:csymbol:#2} } { \xmlval{mmc:cs}{#3}{}% todo } @@ -580,7 +584,7 @@ \stopxmlsetups \startxmlsetups mml:ci:vector - \widevec{\xmlflush{#1}} + \overrightarrow{\xmlflush{#1}} \stopxmlsetups \startxmlsetups mml:ci:matrix @@ -720,7 +724,7 @@ \startxmlsetups mml:cn:rational \xmldoifelse {#1} {/mml:sep} { - \frac + \mmlfrac {\xmlsnippet{#1}{1}} {\xmlsnippet{#1}{3}} } { @@ -905,7 +909,7 @@ \mmlsecond{#1}/\mmlthird{#1} \else \MMLcreset - \frac{\MMLcreset\mmlsecond{#1}}{\MMLcreset\mmlthird{#1}} + \mmlfrac{\MMLcreset\mmlsecond{#1}}{\MMLcreset\mmlthird{#1}} \fi } \advance\mmldividelevel\minusone @@ -1051,7 +1055,7 @@ \let\MMLtimes@@symbol\MMLtimessymbol } { \xmldoifelse {#1} {/mml:cn[name(1) == 'mml:cn']} {% name(1) is next one - \doifinsetelse\MMLtimessymbol{\v!yes,\v!no} { + \doifelseinset\MMLtimessymbol{\v!yes,\v!no} { \let\MMLtimes@@symbol\v!yes } { \let\MMLtimes@@symbol\MMLtimessymbol @@ -1303,7 +1307,7 @@ \doifelse \MMLdiffalternative \v!a { \xmldoifelse {#1} {/mml:lambda} { % a special case (mathadore/openmath) - \frac { + \mmlfrac { d \normalsuperscript {\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}} @@ -1316,7 +1320,7 @@ } } { \xmldoifelse {#1} {/mml:bvar} { - \frac { + \mmlfrac { {\mr d}{ \xmldoifelse {#1} {/mml:degree} { \normalsuperscript{\xmlconcat{#1}{/mml:degree}\empty} @@ -1331,13 +1335,11 @@ \xmlfirst{#1}{/mml:ci} } { \MMLcreset -\ifnum\xmlcount{#1}{/mml:apply/*}>\plustwo % hack - \left( - \xmlfirst{#1}{/mml:apply} - \right) -\else - \xmlfirst{#1}{/mml:apply} -\fi + \ifnum\xmlcount{#1}{/mml:apply/*}>\plustwo % hack + \left(\xmlfirst{#1}{/mml:apply}\right) + \else + \xmlfirst{#1}{/mml:apply} + \fi } } } { @@ -1387,7 +1389,7 @@ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)} } { \xmldoifelse {#1} {/mml:bvar} { - \frac { + \mmlfrac { {\mr d}\normalsuperscript{ \xmldoifelse {#1} {/mml:degree} { \xmlconcat{#1}{/mml:degree}\empty @@ -1709,7 +1711,7 @@ \stopxmlsetups \startxmlsetups mml:annotation - \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','TEX','ConTeXt','context','CONTEXT','ctx')]} { + \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','application/x-tex','TEX','ConTeXt','context','CONTEXT','ctx')]} { \xmlflushcontext{#1} } { \xmldoifelse {#1} {.[oneof(@encoding,'calcmath','cm')]} { @@ -1745,7 +1747,7 @@ \startxmlsetups mml:notanumber \mathopnolimits{NaN} \stopxmlsetups \startxmlsetups mml:true \mathopnolimits{true} \stopxmlsetups \startxmlsetups mml:false \mathopnolimits{false} \stopxmlsetups -\startxmlsetups mml:emptyset \mathopnolimits{\O} \stopxmlsetups +\startxmlsetups mml:emptyset \mathopnolimits{Ø} \stopxmlsetups \startxmlsetups mml:pi \pi \stopxmlsetups \startxmlsetups mml:eulergamma \gamma \stopxmlsetups \startxmlsetups mml:infinity \infty \stopxmlsetups @@ -1824,25 +1826,33 @@ % helpers: maybe we can need a setting for the uprights -\xmlmapvalue {mml} {normal} {\mathupright} % {\mathtf} -\xmlmapvalue {mml} {double-struck} {\mathblackboard} -\xmlmapvalue {mml} {italic} {\mathit} -\xmlmapvalue {mml} {fraktur} {\mathfraktur} -\xmlmapvalue {mml} {script} {\mathscript} -\xmlmapvalue {mml} {bold} {\mb} % {\mathbf} -\xmlmapvalue {mml} {bold-italic} {\mathbi} -\xmlmapvalue {mml} {bold-fraktur} {\mathfraktur\mathbf} -\xmlmapvalue {mml} {bold-script} {\mathscript\mathbf} -\xmlmapvalue {mml} {sans-serif} {\mathss} -\xmlmapvalue {mml} {bold-sans-serif} {\mathss\mathbf} -\xmlmapvalue {mml} {sans-serif-italic} {\mathss\mathit} -\xmlmapvalue {mml} {sans-serif-bold-italic} {\mathss\mathbi} -\xmlmapvalue {mml} {monospace} {\mathtt} +\xmlmapvalue {mml:s} {normal} {\mathupright} % {\mathtf} +\xmlmapvalue {mml:s} {double-struck} {\mathblackboard} +\xmlmapvalue {mml:s} {italic} {\mathit} +\xmlmapvalue {mml:s} {fraktur} {\mathfraktur} +\xmlmapvalue {mml:s} {script} {\mathscript} +\xmlmapvalue {mml:s} {bold} {\mb} % {\mathbf} +\xmlmapvalue {mml:s} {bold-italic} {\mathbi} +\xmlmapvalue {mml:s} {bold-fraktur} {\mathfraktur\mathbf} +\xmlmapvalue {mml:s} {bold-script} {\mathscript\mathbf} +\xmlmapvalue {mml:s} {sans-serif} {\mathss} +\xmlmapvalue {mml:s} {bold-sans-serif} {\mathss\mathbf} +\xmlmapvalue {mml:s} {sans-serif-italic} {\mathss\mathit} +\xmlmapvalue {mml:s} {sans-serif-bold-italic} {\mathss\mathbi} +\xmlmapvalue {mml:s} {monospace} {\mathtt} + +\xmlmapvalue {mml:l} {-} {\let\mmlfrac\tfrac} + \let\mmlfrac\frac +\xmlmapvalue {mml:l} {+} {\let\mmlfrac\sfrac} % todo: displaystyle=true/false (or whatever else shows up) \starttexdefinition setmmlmathstyle #1 - \xmlval {mml} {\xmlatt{#1}{mathvariant}} \empty % was: \mmmr + \xmlval{mml:s}{\xmlatt{#1}{mathvariant}}\empty % was: \mmmr +\stoptexdefinition + +\starttexdefinition setmmlscriptlevel #1 + \xmlval{mml:l}{\xmlatt{#1}{scriptlevel}}{\let\mmlfrac\frac} \stoptexdefinition \starttexdefinition applymmlmathcolor #1#2 @@ -1899,8 +1909,11 @@ \startxmlsetups mml:mi % todo: mathsize (unlikely) mathcolor (easy) mathbackground (easy) \begingroup + \pushmathstyle \setmmlmathstyle{#1} + \setmmlscriptlevel{#1} \ctxmodulemathml{mi("#1")} + \popmathstyle \endgroup \stopxmlsetups @@ -2000,7 +2013,7 @@ \overline{\left)\strut\xmlflush{#1}\right.} } { \doifelse \mmlmenclosenotation {mml:enclose:actuarial} { - \overline{\left.\strut\xmlflush{#1}\right|} + \overline{\left.\strut\xmlflush{#1}\right\vert} } { \doifelse \mmlmenclosenotation {mml:enclose:radical} { \sqrt{\xmlflush{#1}} @@ -2010,13 +2023,13 @@ \framed [frame=off,strut=no,background={\mmlmenclosenotation}] % offset is kind of undefined {\startimath - \expanded{\doifinsetelse {mml:enclose:longdiv} {\mmlmenclosenotation}} { + \expanded{\doifelseinset {mml:enclose:longdiv} {\mmlmenclosenotation}} { \overline{\left)\strut\xmlflush{#1}\right.} } { - \expanded{\doifinsetelse {mml:enclose:actuarial} {\mmlmenclosenotation}} { - \overline{\left.\strut\xmlflush{#1}\right|} + \expanded{\doifelseinset {mml:enclose:actuarial} {\mmlmenclosenotation}} { + \overline{\left.\strut\xmlflush{#1}\right\vert} } { - \expanded{\doifinsetelse {mml:enclose:radical} {\mmlmenclosenotation}} { + \expanded{\doifelseinset {mml:enclose:radical} {\mmlmenclosenotation}} { \sqrt{\xmlflush{#1}} } { \xmlflush{#1} @@ -2043,7 +2056,7 @@ \doifelse{\xmlatt{#1}{bevelled}}{true} { \left.\mmlfirst{#1}\middle/\mmlsecond{#1}\right.% \thinspace\middle/\thinspace } { - \frac{\mmlfirst{#1}}{\mmlsecond{#1}} + \mmlfrac{\mmlfirst{#1}}{\mmlsecond{#1}} } \else \doifelse {\xmlval{mml:mfrac:linethickness}{\mmlfraclinethickness}{}} {} { @@ -2074,8 +2087,11 @@ \startxmlsetups mml:mstyle \begingroup + \pushmathstyle \setmmlmathstyle{#1} + \setmmlscriptlevel{#1} \xmlflush{#1} + \popmathstyle \endgroup \stopxmlsetups @@ -2230,6 +2246,8 @@ } \stopxmlsetups +% helpers + \unexpanded\def\mmlexecuteifdefined#1% {\ifx#1\empty \expandafter\secondoftwoarguments @@ -2240,140 +2258,166 @@ \fi\fi {\csname#1\endcsname}} -% todo: combine topaccent/over/bottomaccent/under check - -\definemathextensible [\v!mathematics] [mml:overleftarrow] ["2190] % ["27F5] -\definemathextensible [\v!mathematics] [mml:overrightarrow] ["2192] % ["27F6] -\definemathextensible [\v!mathematics] [mml:overleftrightarrow] ["27F7] -\definemathextensible [\v!mathematics] [mml:overtwoheadrightarrow] ["27F9] -\definemathextensible [\v!mathematics] [mml:overleftharpoondown] ["21BD] -\definemathextensible [\v!mathematics] [mml:overleftharpoonup] ["21BC] -\definemathextensible [\v!mathematics] [mml:overrightharpoondown] ["21C1] -\definemathextensible [\v!mathematics] [mml:overrightharpoonup] ["21C0] - -\definemathextensible [\v!mathematics] [mml:underleftarrow] ["2190] % ["27F5] -\definemathextensible [\v!mathematics] [mml:underrightarrow] ["2192] % ["27F6] -\definemathextensible [\v!mathematics] [mml:underleftrightarrow] ["27F7] -\definemathextensible [\v!mathematics] [mml:undertwoheadrightarrow] ["27F9] -\definemathextensible [\v!mathematics] [mml:underleftharpoondown] ["21BD] -\definemathextensible [\v!mathematics] [mml:underleftharpoonup] ["21BC] -\definemathextensible [\v!mathematics] [mml:underrightharpoondown] ["21C1] -\definemathextensible [\v!mathematics] [mml:underrightharpoonup] ["21C0] - -\definemathtriplet [\v!mathematics] [mmlovertriplet] -\definemathtriplet [\v!mathematics] [mmlundertriplet] -\definemathtriplet [\v!mathematics] [mmldoubletriplet] - -% alternative: -% -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x2190}] ["2190] % ["27F5] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x2192}] ["2192] % ["27F6] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F5}] ["2190] % ["27F5] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F6}] ["2192] % ["27F6] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F7}] ["27F7] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F9}] ["27F9] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21BD}] ["21BD] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21BC}] ["21BC] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21C1}] ["21C1] -% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21C0}] ["21C0] - -\unexpanded\def\mmloverof#1{\mmlexecuteifdefined\mmlovercommand\relax{\mmlunexpandedfirst {#1}}\relax} -\unexpanded\def\mmloveros#1{\mmlexecuteifdefined\mmlovercommand {\mmlunexpandedsecond{#1}}\relax} -\unexpanded\def\mmloverbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax} -\unexpanded\def\mmloverbs#1{\mmlexecuteifdefined\mmlbasecommand\relax{\mmlunexpandedsecond{#1}}\relax} +\def\mmlextensible#1{\ctxmodulemathml{extensible(\!!bs#1\!!es)}} -\startxmlsetups mml:mover +\definemathtriplet [\v!mathematics] [mmlovertriplet] % or will we use a special instance +\definemathtriplet [\v!mathematics] [mmlundertriplet] % or will we use a special instance +\definemathtriplet [\v!mathematics] [mmldoubletriplet] % or will we use a special instance + +% common to munder/mover/munderover + +\starttexdefinition unexpanded mmlfencedfirst #1 + \math_fences_checked_start + \mmlunexpandedfirst{#1} + \math_fences_checked_stop +\stoptexdefinition +\starttexdefinition unexpanded mmlfencedsecond #1 + \math_fences_checked_start + \mmlunexpandedsecond{#1} + \math_fences_checked_stop +\stoptexdefinition +\starttexdefinition unexpanded mmlfencedthird #1 + \math_fences_checked_start + \mmlunexpandedthird{#1} + \math_fences_checked_stop +\stoptexdefinition + +% mover + +\starttexdefinition unexpanded mmloverabove #1 + \edef\mmlovercommand{\utfmathfiller\mmlovertoken} + \mmlexecuteifdefined\mmlovercommand {\mmlfencedsecond{#1}} \relax +\stoptexdefinition +\starttexdefinition unexpanded mmloverbase #1 + \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken} + \mmlexecuteifdefined\mmlbasecommand {\mmlfencedfirst{#1}} + \relax +\stoptexdefinition +\starttexdefinition unexpanded mmloverbasefiller #1 + \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken} + \mmlexecuteifdefined\mmlbasecommand \relax {\mmlfencedsecond{#1}} {} +\stoptexdefinition +\starttexdefinition unexpanded mmloveraccent #1 + \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken} + \mmlexecuteifdefined\mmlovercommand \relax {\mmlfencedfirst{#1}} +\stoptexdefinition +\starttexdefinition unexpanded mmlovertext #1 + \mmlovertriplet {\mmloverbase{#1}} {\mmloverabove{#1}} {} +\stoptexdefinition +\starttexdefinition unexpanded mmloveraccentchecker #1 \edef\mmlovertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text() - \doifelseutfmathabove\mmlovertoken { - \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken} - \mmloverof{#1} - } { - \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text() - \doifelseutfmathabove\mmlbasetoken { - \edef\mmlbasecommand{mml:\utfmathcommandabove\mmlbasetoken} - \mmloverbs{#1} - } { - \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken} - \edef\mmlovercommand{\utfmathfiller\mmlovertoken} - \mmlundertriplet{\mmloverbf{#1}}{\mmloveros{#1}}{}%\relax - } - } - % \limits % spoils spacing + \doifelseutfmathabove\mmlovertoken \mmloveraccent \mmlovertext {#1} +\stoptexdefinition + +\startxmlsetups mml:mover + \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text() + \doifelseutfmathfiller\mmlbasetoken \mmloverbasefiller \mmloveraccentchecker {#1} \stopxmlsetups -% alternative: -% -% \startxmlsetups mml:mover -% \edef\mmlovertoken{\xmlraw{#1}{/mml:*[2]}}% /text() -% \doifelseutfmathabove\mmlovertoken { -% \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken} -% \mmloverof{#1} -% } { -% \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]/text()}} -% \ifcsname mml:\mmlbasetoken\endcsname -% \csname mml:\mmlbasetoken\endcsname{\mmlunexpandedsecond{#1}}\relax -% \else -% \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken} -% \edef\mmlovercommand{\utfmathfiller\mmlovertoken} -% \mmlovertriplet{\mmloveros{#1}}{\mmloverbf{#1}}\relax -% \fi -% } -% % \limits % spoils spacing -% \stopxmlsetups +% munder -% do this in lua +\starttexdefinition unexpanded mmlunderbelow #1 + \edef\mmlundercommand{\utfmathfiller\mmlundertoken} + \mmlexecuteifdefined\mmlundercommand {\mmlfencedsecond{#1}} \relax +\stoptexdefinition +\starttexdefinition unexpanded mmlunderbase #1 + \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken} + \mmlexecuteifdefined\mmlbasecommand {\mmlfencedfirst{#1}} + \relax +\stoptexdefinition +\starttexdefinition unexpanded mmlunderbasefiller #1 + \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken}% + \mmlexecuteifdefined\mmlbasecommand \relax {} {\mmlfencedsecond{#1}} +\stoptexdefinition +\starttexdefinition unexpanded mmlunderaccent #1 + \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken} + \mmlexecuteifdefined\mmlundercommand \relax {\mmlfencedfirst{#1}} +\stoptexdefinition +\starttexdefinition unexpanded mmlundertext #1 + \mmlundertriplet {\mmlunderbase{#1}} {} {\mmlunderbelow{#1}} +\stoptexdefinition +\starttexdefinition unexpanded mmlunderaccentchecker #1 + \edef\mmlundertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text() + \doifelseutfmathbelow\mmlundertoken \mmlunderaccent \mmlundertext {#1} +\stoptexdefinition -\def\mmlextensible#1{\ctxmodulemathml{extensible(\!!bs#1\!!es)}} +\startxmlsetups mml:munder + \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text() + \doifelseutfmathfiller\mmlbasetoken \mmlunderbasefiller \mmlunderaccentchecker {#1} +\stopxmlsetups -\unexpanded\def\mmlunderuf#1{\mmlexecuteifdefined\mmlundercommand\relax {\mmlunexpandedfirst {#1}}\relax} -\unexpanded\def\mmlunderus#1{\mmlexecuteifdefined\mmlundercommand {\mmlunexpandedsecond{#1}}\relax} -\unexpanded\def\mmlunderbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax} -%unexpanded\def\mmlunderbs#1{\mmlexecuteifdefined\mmlbasecommand \relax{}{\mmlunexpandedsecond{#1}}\relax} -\unexpanded\def\mmlunderbs#1{\mmlexecuteifdefined\mmlbasecommand \relax {\mmlunexpandedsecond{#1}}\relax} +% munderover -\startxmlsetups mml:munder +\starttexdefinition unexpanded mmlunderoveraccentcheckerUO #1 + \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken} + \edef\mmlovercommand {\utfmathcommandabove\mmlovertoken} + \edef\mmlbasecommand {\mmlovercommand\mmlundercommand} + \ifcsname\mmlbasecommand\endcsname + \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}} + \else\ifcsname\mmlundercommand\endcsname + \ifcsname\mmlovercommand\endcsname + \csname\mmlovercommand\endcsname {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}} + \else + \mmldoubletriplet {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}} {\mmlfencedthird{#1}\mmlfencedthird{#1}} {} + \fi + \else\ifcsname\mmlovercommand\endcsname + \mmldoubletriplet {\csname\mmlovercommand\endcsname{\mmlfencedfirst{#1}}} {} {\mmlfencedsecond{#1}} + \else + \mmlunderoveraccentcheckerTT {#1} + \fi\fi\fi +\stoptexdefinition +\starttexdefinition unexpanded mmlunderoveraccentcheckerUT #1 + \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken} + \edef\mmlbasecommand {\mmlundercommand text} + \ifcsname\mmlbasecommand\endcsname + \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}} {\mmlfencedthird{#1}} + \else\ifcsname\mmlundercommand\endcsname + \mmldoubletriplet {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}} {\mmlfencedthird{#1}} {} + \else + \mmlunderoveraccentcheckerTT {#1} + \fi\fi +\stoptexdefinition +\starttexdefinition unexpanded mmlunderoveraccentcheckerOT #1 + \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken} + \edef\mmlbasecommand{\mmlovercommand text} + \ifcsname\mmlbasecommand\endcsname + \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}} {\mmlfencedsecond{#1}} + \else\ifcsname\mmlovercommand\endcsname + \mmldoubletriplet {\csname\mmlovercommand\endcsname{\mmlfencedfirst{#1}}} {} {\mmlfencedsecond{#1}} + \else + \mmlunderoveraccentcheckerTT {#1} + \fi\fi +\stoptexdefinition +\starttexdefinition unexpanded mmlunderoveraccentcheckerTT #1 + \mmldoubletriplet {\mmlfencedfirst{#1}} {\mmlfencedthird{#1}} {\mmlfencedsecond{#1}} \relax +\stoptexdefinition +\starttexdefinition unexpanded mmlunderoveraccentchecker #1 \edef\mmlundertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text() - \doifelseutfmathbelow\mmlundertoken {% - \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken} - \mmlunderuf{#1} + \edef\mmlovertoken {\mmlextensible{\xmlraw{#1}{/mml:*[3]}}}% /text() + \doifelseutfmathbelow\mmlundertoken { + \doifelseutfmathabove\mmlovertoken \mmlunderoveraccentcheckerUO \mmlunderoveraccentcheckerUT {#1} } { - \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text() - \doifelseutfmathbelow\mmlbasetoken { - \edef\mmlbasecommand{mml:\utfmathcommandbelow\mmlbasetoken} - \mmlunderbs{#1} - } { - \edef\mmlbasecommand {\utfmathfiller\mmlbasetoken} - \edef\mmlundercommand{\utfmathfiller\mmlundertoken} - \mmlundertriplet{\mmlunderbf{#1}}{}{\mmlunderus{#1}}%\relax - } + \doifelseutfmathabove\mmlovertoken \mmlunderoveraccentcheckerOT \mmlunderoveraccentcheckerTT {#1} } - % \limits % spoils spacing -\stopxmlsetups - -\unexpanded\def\mmlunderoverst#1{\mmlexecuteifdefined\mmlbasecommand \relax{\mmlunexpandedsecond{#1}}{\mmlunexpandedthird{#1}}\relax} -\unexpanded\def\mmlunderoverbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax} -\unexpanded\def\mmlunderoverus#1{\mmlexecuteifdefined\mmlundercommand {\mmlunexpandedsecond{#1}}\relax} -\unexpanded\def\mmlunderoverot#1{\mmlexecuteifdefined\mmlovercommand {\mmlunexpandedthird {#1}}\relax} +\stoptexdefinition +\starttexdefinition unexpanded mmlunderoverbasefiller #1 + \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken}% + \mmlexecuteifdefined\mmlbasecommand \relax {\mmlfencedthird{#1}} {\mmlfencedsecond{#1}} +\stoptexdefinition \startxmlsetups mml:munderover - \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text() - \doifelseutfmathbelow\mmlbasetoken { - \edef\mmlbasecommand{mml:\utfmathcommandbelow\mmlbasetoken} - \mmlunderoverst{#1} - } { - \edef\mmlundertoken {\xmlraw{#1}{/mml:*[2]}}% /text() - \edef\mmlovertoken {\xmlraw{#1}{/mml:*[3]}}% /text() - \edef\mmlbasecommand {\utfmathfiller\mmlbasetoken} - \edef\mmlundercommand{\utfmathfiller\mmlundertoken} - \edef\mmlovercommand {\utfmathfiller\mmlovertoken} - \mmldoubletriplet{\mmlunderoverbf{#1}}{\mmlunderoverot{#1}}{\mmlunderoverus{#1}}\relax - } + \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text() + \doifelseutfmathfiller\mmlbasetoken \mmlunderoverbasefiller \mmlunderoveraccentchecker {#1} \stopxmlsetups % tables (mml:mtable, mml:mtr, mml:mlabledtr, mml:mtd) \startxmlsetups mml:mtable % some more attributes need to be supported - \vcenter{\ctxmodulemathml{mtable("#1")}} + \vcenter { + \hbox {% needed because otherwise positions makr the vcenter wide + \ctxmodulemathml{mtable("#1")} + } + } \stopxmlsetups \startxmlsetups mml:mcolumn @@ -2383,29 +2427,39 @@ \def\mmlsetfakewidth#1{\setbox\scratchbox\hbox{#1}\scratchdimen\wd\scratchbox} \def\mmlmcolumndigitspace {\mmlsetfakewidth {0}\kern\scratchdimen} -\def\mmlmcolumndigitrule {\mmlsetfakewidth {0}\vrule width \scratchdimen height .2pt depth .2pt\relax} -\def\mmlmcolumnsymbolrule {\mmlsetfakewidth{\times}\vrule width \scratchdimen height .2pt depth .2pt\relax} -\def\mmlmcolumnpunctuationrule{\mmlsetfakewidth {.}\vrule width \scratchdimen height .2pt depth .2pt\relax} +\def\mmlmcolumndigitrule {\mmlsetfakewidth {0}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax} +\def\mmlmcolumnsymbolrule {\mmlsetfakewidth{\times}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax} +\def\mmlmcolumnpunctuationrule{\mmlsetfakewidth {.}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax} + +\setupMMLappearance[mspace][\c!option=] % \v!test \startxmlsetups mml:mspace \begingroup \edef\mmlspacetext{\xmlatt{#1}{spacing}} \ifx\mmlspacetext\empty - \!!widtha \xmlattdef{#1}{width} \!!zeropoint % must be string - \!!heighta\xmlattdef{#1}{height}\!!zeropoint - \!!deptha \xmlattdef{#1}{depth} \!!zeropoint - \ifdim\!!heighta=\zeropoint - \ifdim\!!deptha=\zeropoint\else - \hbox{\vrule\s!depth\!!deptha\s!height\zeropoint\s!width\zeropoint}% + \scratchwidth \xmlattdef{#1}{width} \!!zeropoint % must be string + \scratchheight\xmlattdef{#1}{height}\!!zeropoint + \scratchdepth \xmlattdef{#1}{depth} \!!zeropoint + \ifdim\scratchheight=\zeropoint + \ifdim\scratchdepth=\zeropoint\else + \hbox{\vrule\s!depth\scratchdepth\s!height\zeropoint\s!width\zeropoint}% \fi \else - \hbox{\vrule\s!depth\zeropoint\s!height\!!heighta\s!width\zeropoint}% + \hbox{\vrule\s!depth\zeropoint\s!height\scratchheight\s!width\zeropoint}% \fi - \ifdim\!!widtha=\zeropoint\else - \hskip\!!widtha + \ifdim\scratchwidth=\zeropoint\else + \ifx\MMLmspaceoption\v!test + \hbox to \scratchwidth{\showstruts\strut\hss\lower2\exheight\hbox{\infofont\xmlattdef{#1}{width}}\hss\strut} + \else + \hskip\scratchwidth + \fi \fi \else - \phantom{\triggermathstyle\normalmathstyle\mmlspacetext} + \ifx\MMLmspaceoption\v!test + \hbox{\showstruts\strut\phantom{\triggermathstyle\normalmathstyle\mmlspacetext}\strut} + \else + \phantom{\triggermathstyle\normalmathstyle\mmlspacetext} + \fi \fi \endgroup \stopxmlsetups diff --git a/Master/texmf-dist/tex/context/base/x-mathml.xsd b/Master/texmf-dist/tex/context/base/x-mathml.xsd index 17f0bea2aa4..1c29452b06a 100644 --- a/Master/texmf-dist/tex/context/base/x-mathml.xsd +++ b/Master/texmf-dist/tex/context/base/x-mathml.xsd @@ -3,9 +3,9 @@ - + - - + + diff --git a/Master/texmf-dist/tex/context/base/x-res-01.mkiv b/Master/texmf-dist/tex/context/base/x-res-01.mkiv index e234e98677a..36070c61599 100644 --- a/Master/texmf-dist/tex/context/base/x-res-01.mkiv +++ b/Master/texmf-dist/tex/context/base/x-res-01.mkiv @@ -256,7 +256,7 @@ \vfill } \advance\hsize by -30pt - \doifmodeelse {clipgrid-distance,clipgrid-steps} { + \doifelsemode {clipgrid-distance,clipgrid-steps} { \xmlsetup{#1}{xml:resource:a} } { \xmlsetup{#1}{xml:resource:b} diff --git a/Master/texmf-dist/tex/context/base/x-set-11.mkiv b/Master/texmf-dist/tex/context/base/x-set-11.mkiv index 12854dc92d8..73e68e0738c 100644 --- a/Master/texmf-dist/tex/context/base/x-set-11.mkiv +++ b/Master/texmf-dist/tex/context/base/x-set-11.mkiv @@ -57,7 +57,7 @@ 2: -- wordt verwerkt 3: -- is niet gedefinieerd 4: -- wordt nogmaals verwerkt - optional: optioneel + optional: opt displaymath: formule index: ingang math: formule @@ -95,7 +95,7 @@ 2: -- is processed 3: -- is undefined 4: -- is processed again - optional: optional + optional: opt displaymath: formula index: entry math: formula @@ -133,7 +133,7 @@ 2: -- wird verarbeitet 3: -- ist undefiniert 4: -- ist mehrmals verarbeitet - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -171,7 +171,7 @@ 2: -- je zpracovano 3: -- je nedefinovano 4: -- je zpracovano znovu - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -209,7 +209,7 @@ 2: -- is processed 3: -- is undefined 4: -- is processed again - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -247,7 +247,7 @@ 2: este procesat -- 3: -- este nedefinit 4: -- este procesat din nou - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -285,7 +285,7 @@ 2: -- est traité 3: -- n'est pas défini 4: -- est traité de nouveau - optional: optionel + optional: opt displaymath: formule index: entrée math: formule @@ -369,7 +369,8 @@ } { \let\currentSETUPprefix\empty } - \edef\currentSETUPname{\xmlatt{#1}{name}} + % \edef\currentSETUPname{\xmlatt{#1}{name}} + \edef\currentSETUPname{\xmlattribute{#1}{/sequence/string[1]}{value}}% \doifelse {\xmlatt{#1}{generated}} {yes} { \def\currentSETUPgenerated{*} } { @@ -457,7 +458,7 @@ \def\showsetupindeed#1% {\startelement[setup][name=#1]% \startelement[noexport][comment={setup definition #1}] - \xmlfilterlist{\loadedsetups}{/interface/command['#1' == (@type=='environment' and 'start' or '') .. @name]/command(xml:setups:typeset)}% + \xmlfilterlist{\loadedsetups}{/interface/command['#1' == (@type=='environment' and '\e!start' or '') .. @name]/command(xml:setups:typeset)}% \stopelement \stopelement} @@ -469,7 +470,7 @@ %D Typesetting: \setupxml - [\c!method=mkiv, % mixed mode + [%\c!method=mkiv, % mixed mode \c!default=\v!hidden, % ignore elements that are not defined \c!compress=\v!yes, % strip comment \c!entities=\v!yes] % replace entities @@ -499,37 +500,41 @@ \xmlfilter{#1}{/sequence/first()} \ignorespaces \egroup - \xmldoif{#1}{/arguments} { - \bgroup - \enablemode[setups-pass-one] - \doglobal\newcounter\currentSETUPargument - \ignorespaces - \xmlfilter{#1}{/arguments/text()} - \egroup - } - \doif {\xmlatt{#1}{type}} {environment} { - \bgroup - \enablemode[setups-pass-one]% - \hskip.5em\unknown\hskip.5em - \doif {\xmlatt{#1}{generated}} {yes} { - \ttsl - } - \tex{\e!stop} - \xmlfilter{#1}{/sequence/first()} - \ignorespaces - \egroup - } - \endgraf - \xmldoif{#1}{/arguments} { - \bgroup - \enablemode[setups-pass-two] - \doglobal\newcounter\currentSETUPargument - %\blank[\v!line] % packed mode (we could do \startunpacked ...) - \godown[.75\lineheight] - \switchtobodyfont[\v!small] - \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf - \egroup - } + \ifshortsetup + % nothing + \else + \xmldoif{#1}{/arguments} { + \bgroup + \enablemode[setups-pass-one] + \doglobal\newcounter\currentSETUPargument + \ignorespaces + \xmlfilter{#1}{/arguments/text()} + \egroup + } + \doif {\xmlatt{#1}{type}} {environment} { + \bgroup + \enablemode[setups-pass-one]% + \hskip.5em\unknown\hskip.5em + \doif {\xmlatt{#1}{generated}} {yes} { + \ttsl + } + \tex{\e!stop} + \xmlfilter{#1}{/sequence/first()} + \ignorespaces + \egroup + } + \endgraf + \xmldoif{#1}{/arguments} { + \bgroup + \enablemode[setups-pass-two] + \doglobal\newcounter\currentSETUPargument + %\blank[\v!line] % packed mode (we could do \startunpacked ...) + \godown[.75\lineheight] + \switchtobodyfont[\v!small] + \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf + \egroup + } + \fi \getvalue{\e!stop setuptext} \stopxmlsetups @@ -572,7 +577,7 @@ \startxmlsetups xml:setups:word \showSETUPcomponent{#1}{word} {word} \stopxmlsetups \def\showSETUPcomponent#1#2#3% - {\doifmodeelse{setups-pass-one} + {\doifelsemode{setups-pass-one} {\getvalue{showSETUP#2}{#1}} {\simpleSETUPargument{#3}}} @@ -607,7 +612,7 @@ \stopxmlsetups \startxmlsetups xml:setups:assignments - \doifmodeelse{setups-pass-one} { + \doifelsemode{setups-pass-one} { \showSETUPassignment{#1} } { \xdef\currentSETUPwidth{0pt}% @@ -629,7 +634,7 @@ \stopxmlsetups \startxmlsetups xml:setups:keywords - \doifmodeelse{setups-pass-one} { + \doifelsemode{setups-pass-one} { \showSETUPkeyword{#1} } { \startfirstSETUPcolumn{\showSETUPnumber}% @@ -665,7 +670,7 @@ \stopxmlsetups \startxmlsetups xml:setups:constant - \doifmodeelse {setups-pass-one} { + \doifelsemode {setups-pass-one} { } { \doif {\xmlatt{#1}{default}} {yes} { \underbar % next needs to be {braced} @@ -677,7 +682,7 @@ \stopxmlsetups \startxmlsetups xml:setups:variable - \doifmodeelse {setups-pass-one} { + \doifelsemode {setups-pass-one} { \expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces } { \c!setup!reserved!{\xmlatt{#1}{value}} diff --git a/Master/texmf-dist/tex/context/base/x-set-12.mkiv b/Master/texmf-dist/tex/context/base/x-set-12.mkiv index 6590bfe9e03..c60445313ee 100644 --- a/Master/texmf-dist/tex/context/base/x-set-12.mkiv +++ b/Master/texmf-dist/tex/context/base/x-set-12.mkiv @@ -146,8 +146,7 @@ [\c!alternative=\v!doublesided] \setupsetup - [\c!criterium=\v!all, - \c!reference=0] + [\c!criterium=\v!all] \setupframedtexts [setuptext] diff --git a/Master/texmf-dist/tex/context/base/x-xtag.mkiv b/Master/texmf-dist/tex/context/base/x-xtag.mkiv index 09490cc8ff4..ab95c567eec 100644 --- a/Master/texmf-dist/tex/context/base/x-xtag.mkiv +++ b/Master/texmf-dist/tex/context/base/x-xtag.mkiv @@ -14,7 +14,7 @@ %D Here we load the \MKII\ (mostly) streaming \XML\ parser. We %D define a couple of catcode regimes first. -\ifdefined\XMLbanner \endinput \fi +\endinput \writestatus{xtag}{this module is obsolete, use the mkiv-xml features or use mkii instead} diff --git a/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex b/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex new file mode 100644 index 00000000000..ebf03313a34 --- /dev/null +++ b/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex @@ -0,0 +1,385 @@ +%D \module +%D [ file=bibl-apa-it, +%D version=2014.10.10, +%D title=APA bibliography style, +%D subtitle=Publications, +%D author={Andrea Valle \& Alan Braslau}, +%D date=\currentdate, +%D copyright={Public Domain}] +%C +%C Donated to the public domain. Use at your own risk + +\unprotect + +\setupcite + [author,year] + [\c!andtext={ e }, + \c!otherstext={ et al.}, + \c!pubsep={, }, + \c!lastpubsep={ e }, + \c!compress=\v!no, + \c!inbetween={ }, + \c!left={(}, + \c!right={)}] + +\setupcite + [authoryear] + [\c!andtext={ e }, + \c!otherstext={ et al.}, + \c!pubsep={, }, + \c!lastpubsep={ e }, + \c!compress=\v!yes, + \c!inbetween={ }, + \c!left={(}, + \c!right={)}] + +\setupcite + [authoryears] + [\c!andtext={ e }, + \c!otherstext={ et al.}, + \c!pubsep={, }, + \c!lastpubsep={ e }, + \c!compress=\v!yes, + \c!inbetween={, }, + \c!left={(}, + \c!right={)}] + +\setupcite + [key,serial,authornum,page,short,type,doi,url] + [\c!andtext={ e }, + \c!otherstext={ et al.}, + \c!pubsep={, }, + \c!lastpubsep={ e }, + \c!compress=\v!no, + \c!inbetween={ }, + \c!left={[}, + \c!right={]}] + +\setupcite + [num] + [\c!andtext={ e }, + \c!otherstext={ et al.}, + \c!pubsep={, }, + \c!lastpubsep={ e }, + \c!compress=\v!yes, + \c!inbetween={--}, + \c!left={[}, + \c!right={]}] + +\setuppublications + [\c!sorttype=, + \c!criterium=, + \c!refcommand=authoryears, + \c!numbering=\v!no, + \c!autohang=\v!no] + +\setuppublicationlist + [\c!width=24pt, + \c!artauthor=\invertedshortauthor, + \c!editor=\invertedshortauthor, + \c!author=\invertedshortauthor, + \c!namesep={, }, + \c!lastnamesep={ e }, + \c!finalnamesep={ e }, + \c!firstnamesep={, }, + \c!juniorsep={ }, + \c!vonsep={ }, + \c!surnamesep={, }, + \c!authoretallimit=5, + \c!editoretallimit=5, + \c!artauthoretallimit=5, + \c!authoretaldisplay=5, + \c!editoretaldisplay=5, + \c!artauthoretaldisplay=5, + \c!authoretaltext={ et al.}, + \c!editoretaltext={ et al.}, + \c!artauthoretaltext={ et al.}] + +\def\maybeyear#1{#1} +\def\etalchar #1{#1} + +%D \macros{insertchapter,insertpublisher} + +%D Some shortcuts. + +% ((#1(type\ |)chapter#2)|#3) + +\def\insertchap#1#2#3% + {\insertchapter + {#1\insertbibtype{}{\ }{capitolo\ }}{#2}% + {#3}} + +% #1city, country: pubname#2 +% #1country: pubname#2 +% #1pubname#2 +% #1city, country#2 +% #3 + +\def\insertpublisher#1#2#3% + {\insertpubname + {\insertcity + {#1} + {\insertcountry{, }{}{}: }% + {#1\insertcountry{}{: }{}}}% + {#2}% + {\insertcity + {#1} + {\insertcountry{, }{}{#2}}% + {\insertcountry{#1}{#2}{#3}}}% + } + +\def\insertorg#1#2#3% + {\insertorganization + {\insertcity + {#1} + {\insertcountry{, }{}{#2}: }% + {\insertcountry{}{: }{#2}}}% + {}% + {\insertcity + {#1} + {\insertcountry{, }{}{#2}}% + {\insertcountry{}{#2}{#3}}}% + } + + + +\setuppublicationlayout[article]{% + \insertartauthors{}{ }{\insertthekey{}{ }{}}% + \insertpubyear{(}{). }{\unskip.}% + \insertarttitle{\bgroup }{\egroup. }{}% + \insertjournal{\bgroup \it}{\egroup} + {\insertcrossref{In }{}{}}% + \insertvolume + {\bgroup \it, } + {\egroup\insertissue{\/(}{)}{}\insertpages{, }{.}{.}} + {\insertpages{, pp. }{.}{.}}% + \insertnote{ }{.}{}% + \insertcomment{}{.}{}% +} + +\newif\ifeditedbook + +\setuppublicationlayout[book]{% + \insertauthors{}{ }{\inserteditors{}{, a c. di% + \ \global\editedbooktrue + }{\insertthekey{}{. }{}}}% + \insertpubyear{(}{). }{\unskip.}% + \inserttitle + {\bgroup\it }% + {\/\egroup + \ifeditedbook + \global\editedbookfalse + \insertvolume + { N.~}% + {\insertseries + { in~\bgroup}% + {\egroup. }% + {\insertcrossref{ in~}{}{. }}}% + {\insertseries{ }{.}{.}}% + \else + \insertcrossref + {\insertchap{, }{}{}% + \insertpages{\unskip, pp. }{. }{. }% + \insertvolume{Vol.~}{ di~}{}% + }% + {}% + {\insertvolume + {, vol.~}% + {\insertseries + { di~\bgroup\it}% + {\egroup} + {}} + {}% + \insertchap{, }{}{}% + \insertpages{\unskip, pp. }{.}{.}% + }% + \fi}% + {}% + \insertedition{ }{ ed.}{}% + \insertpublisher{ }{.}{.}% + \insertpages{ }{p. }{ }% + \insertnote{}{.}{}% +} + +\setuppublicationlayout[inbook]{% + \insertauthors{}{ }{\inserteditors{}{, a c. di% + \ \global\editedbooktrue + }{\insertthekey{}{. }{}}}% + \insertpubyear{(}{). }{\unskip.}% + \inserttitle + {\bgroup\it }% + {\/\egroup + \ifeditedbook + \global\editedbookfalse + \insertvolume + { number~}% + {\insertseries + { in~\bgroup}% + {\egroup. }% + {\insertcrossref{ in~}{}{.}}}% + {\insertseries{ }{.}{}}% + \else + \insertcrossref + {\insertchap{, }{}{}% + \insertpages{\unskip, pp. }{. }{. }% + \insertvolume{Volume~}{ di~}{}% + }% + {}% + {\insertvolume + {, volume~}% + {\insertseries + { di~\bgroup\it}% + {\egroup} + {}} + {}% + \insertchap{, }{}{}% + \insertpages{\unskip, pp. }{.}{}% + }% + \fi}% + { }% + \insertedition{ }{ ed.}{}% + \insertpublisher{ }{.}{.}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[booklet]{% + \insertauthors{}{ }{\insertthekey{}{. }{}}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}% + \insertedition{ }{ ed.}{}% + \insertpublisher{ }{.}{.}% + \insertpages{}{p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[manual]{% + \insertauthors{}{ }{\insertthekey{}{. }{}}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}% + \insertedition{ }{ ed.}{}% + \insertorg{ }{.}{.}% + \insertpages{}{p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[incollection]{% + \insertartauthors{}{ }{\insertthekey{}{. }{}}% + \insertpubyear{(}{). }{}% + \insertarttitle{\bgroup }{\egroup. }{}% + \inserttitle + {In \inserteditors{}% + {, a c. di, }% + {}% + \bgroup\it}% + {\egroup + \insertseries + {\insertvolume{, number }{~in }{ }}% + {}% + {}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, pp.~}{. }{\unskip. }% + \insertedition{ }{ edition}{}% + \insertpublisher{ }{.}{.}% + }% + {In \insertcrossref{}{}{}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, pp.~}{. }{\unskip. }% + }% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[inproceedings]{% + \insertauthors{}{ }{}% + \insertpubyear{(}{). }{}% + \insertarttitle{\bgroup }{\egroup. }{}%% + \inserttitle + {In \inserteditors{}% + {, a c. di, }% + {}% + \bgroup\it}% + {\egroup + \insertseries + {\insertvolume{, number }{~in }{ }}% + {}% + {}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, pp.~}{}{}% + \insertorg{. }{.}{.}% + }% + {In \insertcrossref{}{}{}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, pp.~}{. }{\unskip. }% + }% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[proceedings]{% + \inserteditors{}{, a c. di% + \ \global\editedbooktrue + }{\insertthekey{}{ }{}}% + \insertpubyear{(}{). }{}% + \inserttitle + {\bgroup\it}% + {\egroup + \insertseries + {\insertvolume{, number }{~in }{ }}% + {}% + {}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, pp.~}{}{}% + \insertorg{. }{.}{.}% + }% + {}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[mastersthesis]{% + \insertauthors{}{ }{}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}% + \insertbibtype{}{, }{Tesi di laurea, }% + \insertpublisher{ }{.}{.}% + \insertpages{ }{p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[phdthesis]{% + \insertauthors{}{ }{}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}% + \insertbibtype{}{, }{Tesi di dottorato,}% + \insertpublisher{ }{.}{.}% + \insertpages{ }{ p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[misc]{% + \insertauthors{}{ }{\insertthekey{}{. }{}}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}% + \insertpublisher{ }{.}{.}% + \insertpages{ }{p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[techreport]{% + \insertauthors{}{ }{}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}% + \insertbibtype{}{\insertvolume{ }{, }{, }}{Relazione tecnica}% + \insertpublisher{ }{.}{.}% + \insertpages{ }{p. }{}% + \insertnote{ }{.}{}% +} + +\setuppublicationlayout[unpublished]{% + \insertauthors{}{ }{}% + \insertpubyear{(}{). }{}% + \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}% + % \insertpublisher{ }{.}{.}% + \insertpages{ }{p. }{}% + \insertbibtype{(}{)}{}% + \insertnote{ }{.}{}% +} + +\protect diff --git a/Master/texmf-dist/tex/context/bib/sample.bib b/Master/texmf-dist/tex/context/bib/sample.bib index 3f8df623eeb..4bb71d3a72a 100644 --- a/Master/texmf-dist/tex/context/bib/sample.bib +++ b/Master/texmf-dist/tex/context/bib/sample.bib @@ -35,4 +35,3 @@ address = {London}, keywords = {general}, } - diff --git a/Master/texmf-dist/tex/context/extra/showunic.tex b/Master/texmf-dist/tex/context/extra/showunic.tex deleted file mode 100644 index efdbf4d3a94..00000000000 --- a/Master/texmf-dist/tex/context/extra/showunic.tex +++ /dev/null @@ -1,130 +0,0 @@ -% author : Hans Hagen / PRAGMA-ADE -% version : 2005-06-22 - -% todo: take antiqua (has everything) - -% \tracetypescriptstrue - -\usetypescriptfile[type-cbg] - -% \preloadtypescriptstrue (default at pragma) - -% this font does not work ... why -% -% \starttypescript [serif] [hebrew] [default] -% \definefontsynonym [Serif] [hclassic] -% \loadmapline[=][hclassic < hclassic.pfb] -% \stoptypescript - -\setuppapersize - [S6][S6] - -\setupbodyfont - [10pt] - -\setuplayout - [backspace=12pt, - topspace=12pt, - width=middle, - height=middle, - header=0pt, - footer=0pt] - -\setupcolors - [state=start] - -\setupbackgrounds - [page] - [background=color, - backgroundcolor=darkgray] - -\definetypeface [main-latin] [rm] [serif] [latin-modern] [default][encoding=texnansi] -\definetypeface [main-latin] [tt] [mono] [latin-modern] [default][encoding=texnansi] - -\definetypeface [main-math] [rm] [serif] [latin-modern] [default][encoding=texnansi] -\definetypeface [main-math] [tt] [mono] [latin-modern] [default][encoding=texnansi] -\definetypeface [main-math] [mm] [math] [latin-modern] [default][encoding=default] - -\definetypeface [main-eastern] [rm] [serif] [latin-modern] [default][encoding=qx] -\definetypeface [main-eastern] [tt] [mono] [latin-modern] [default][encoding=texnansi] - -\definetypeface [main-greek] [rm] [serif] [cbgreek] [default][encoding=default] -\definetypeface [main-greek] [tt] [mono] [latin-modern] [default][encoding=texnansi] - -\definetypeface [main-cyrillic] [rm] [serif] [computer-modern] [default][encoding=t2a] -\definetypeface [main-cyrillic] [tt] [mono] [latin-modern] [default][encoding=texnansi] - -% \definetypeface [main-hebrew] [rm] [serif] [hebrew] [default][encoding=default] -% \definetypeface [main-hebrew] [tt] [mono] [latin-modern] [default][encoding=texnansi] - -% The \showunicodetable macro is defined in unic-run.tex. - -\starttext - -% latin: western / eastern - -\startstandardmakeup - \setupbodyfont[main-latin] - \centerbox{\scale[factor=max]{\showunicodetable{000}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-eastern] - \centerbox{\scale[factor=max]{\showunicodetable{001}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-latin] - \centerbox{\scale[factor=max]{\showunicodetable{002}}} -\stopstandardmakeup - -% greek - -\startstandardmakeup - \setupbodyfont[main-greek] - \centerbox{\scale[factor=max]{\showunicodetable{003}}} -\stopstandardmakeup - -% cyrillic - -\startstandardmakeup - \setupbodyfont[main-cyrillic] - \centerbox{\scale[factor=max]{\showunicodetable{004}}} -\stopstandardmakeup - -% hebrew - -% \startstandardmakeup -% \setupbodyfont[mainhebrew] -% \centerbox{\scale[factor=max]{\showunicodetable{005}}} -% \stopstandardmakeup - -% misc - -\startstandardmakeup - \setupbodyfont[main-latin] - \centerbox{\scale[factor=max]{\showunicodetable{030}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-latin] - \centerbox{\scale[factor=max]{\showunicodetable{031}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-latin] - \centerbox{\scale[factor=max]{\showunicodetable{032}}} -\stopstandardmakeup - -% math - -\startstandardmakeup - \setupbodyfont[main-math] - \centerbox{\scale[factor=max]{\showunicodetable{033}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-math] - \centerbox{\scale[factor=max]{\showunicodetable{034}}} -\stopstandardmakeup -\startstandardmakeup - \setupbodyfont[main-math] - \centerbox{\scale[factor=max]{\showunicodetable{039}}} -\stopstandardmakeup - -\stoptext diff --git a/Master/texmf-dist/tex/context/fonts/treatments.lfg b/Master/texmf-dist/tex/context/fonts/treatments.lfg index 44d24da22a3..40bac427c31 100644 --- a/Master/texmf-dist/tex/context/fonts/treatments.lfg +++ b/Master/texmf-dist/tex/context/fonts/treatments.lfg @@ -25,24 +25,50 @@ local fix_unifraktur = { end, } -local fix_lmmonoregular = { - comment = "wrong widths of some glyphs", - fixes = function(data) - report("fixing some wrong widths") - local unicodes = data.resources.unicodes - local descriptions = data.descriptions - local defaultwidth = descriptions[unicodes["zero"]].width - descriptions[unicodes["six"] ].width = defaultwidth - descriptions[unicodes["nine"] ].width = defaultwidth - descriptions[unicodes["caron"] ].width = defaultwidth - descriptions[unicodes["perthousand"] ].width = defaultwidth - descriptions[unicodes["numero"] ].width = defaultwidth - descriptions[unicodes["caron.cap"] ].width = defaultwidth - descriptions[unicodes["six.taboldstyle"] ].width = defaultwidth - descriptions[unicodes["nine.taboldstyle"]].width = defaultwidth - descriptions[unicodes["dollar.oldstyle" ]].width = defaultwidth - end -} +-- local fix_lmmonoregular = { +-- -- +-- -- there are now some extra safeguards for idris +-- -- +-- comment = "wrong widths of some glyphs", +-- fixes = function(data) +-- report("fixing some wrong widths") +-- local unicodes = data.resources.unicodes +-- local descriptions = data.descriptions +-- local function getdescription(name) +-- local unicode = unicodes[name] +-- if not unicode then +-- report("no valid unicode for %a",name) +-- return +-- end +-- local description = descriptions[unicode] +-- if not description then +-- report("no glyph names %a in font",name) +-- return +-- end +-- return description +-- end +-- local zero = getdescription("zero") +-- if not zero then +-- return +-- end +-- local defaultwidth = zero.width +-- local function setwidth(name) +-- local data = getdescription(name) +-- if data then +-- data.width = defaultwidth +-- end +-- end +-- setwidth("six") +-- setwidth("nine") +-- setwidth("caron") +-- setwidth("perthousand") +-- setwidth("numero") +-- setwidth("caron.cap") +-- setwidth("six.taboldstyle") +-- setwidth("nine.taboldstyle") +-- setwidth("dollar.oldstyle") +-- end +-- } return { name = "treatments", diff --git a/Master/texmf-dist/tex/context/foxet/fe-bryson.xml b/Master/texmf-dist/tex/context/foxet/fe-bryson.xml deleted file mode 100644 index 28646b65f84..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fe-bryson.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -Imagine trying to live in a world dominated by dihydrogen oxide, a -compound that has no taste or smell and is so viable in its properties -that it is generally benign but at other times swiftly lethal. -Depending on its state, it can scald you or freeze you. In the -presence of certain organic molecules it can form carbonic acids so -nasty that they can strip the leaves from trees and eat the faces off -statuary. In bulk, when agitated, it can strike with a fury that no -human edifice could withstand. Even for those who have learned to live -with it, it is often murderous substance. We call it water. - diff --git a/Master/texmf-dist/tex/context/foxet/fe-ward.xml b/Master/texmf-dist/tex/context/foxet/fe-ward.xml deleted file mode 100644 index 05f7742659b..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fe-ward.xml +++ /dev/null @@ -1,8 +0,0 @@ - - -The Earth, as a habitat for animal life, is in old age and -has a fatal illness. Several, in fact. It would be happening -whether humans had ever evolved or not. But our presence is -like the effect of an old-age patient who smokes many packs -of cigarettes per day - and we humans are the cigarettes. - diff --git a/Master/texmf-dist/tex/context/foxet/fe-zapf.xml b/Master/texmf-dist/tex/context/foxet/fe-zapf.xml deleted file mode 100644 index faf9a08319c..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fe-zapf.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -Coming back to the use of typefaces in electronic -publishing: many of the new typographers receive their -knowledge and information about the rules of typography -from books, from computer magazines or the instruction -manuals which they get with the purchase of a PC or -software. There is not so much basic instruction, as of -now, as there was in the old days, showing the differences -between good and bad typographic design. Many people are -just fascinated by their PC's tricks, and think that a -widelypraised program, called up on the -screen, will make everything automatic from now on. - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0101.fo b/Master/texmf-dist/tex/context/foxet/fo-0101.fo deleted file mode 100644 index 197c5834cab..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0101.fo +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0102.fo b/Master/texmf-dist/tex/context/foxet/fo-0102.fo deleted file mode 100644 index 9adcf917efa..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0102.fo +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0103.fo b/Master/texmf-dist/tex/context/foxet/fo-0103.fo deleted file mode 100644 index 95d0d4769c2..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0103.fo +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0201.fo b/Master/texmf-dist/tex/context/foxet/fo-0201.fo deleted file mode 100644 index f524cfd09a9..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0201.fo +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0301.fo b/Master/texmf-dist/tex/context/foxet/fo-0301.fo deleted file mode 100644 index e0b8a6fc4f1..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0301.fo +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - beforeafter - - - beforeafter - beforeafter - beforeafter - beforeafter - - - beforeafter - beforeafter - beforeafter - beforeafter - - - beforeafter - beforeafter - beforeafter - beforeafter - - - beforeafter - beforeafter - beforeafter - beforeafter - - - beforeafter - beforeafter - beforeafter - beforeafter - beforeafter - beforeafter - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0601.fo b/Master/texmf-dist/tex/context/foxet/fo-0601.fo deleted file mode 100644 index 1e291f27888..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0601.fo +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0602.fo b/Master/texmf-dist/tex/context/foxet/fo-0602.fo deleted file mode 100644 index 36e8647675e..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0602.fo +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0603.fo b/Master/texmf-dist/tex/context/foxet/fo-0603.fo deleted file mode 100644 index 268249d3e4f..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0603.fo +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0604.fo b/Master/texmf-dist/tex/context/foxet/fo-0604.fo deleted file mode 100644 index 891198ee026..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0604.fo +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0611.fo b/Master/texmf-dist/tex/context/foxet/fo-0611.fo deleted file mode 100644 index 70f495fb69d..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0611.fo +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0612.fo b/Master/texmf-dist/tex/context/foxet/fo-0612.fo deleted file mode 100644 index 4b3de694024..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0612.fo +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0613.fo b/Master/texmf-dist/tex/context/foxet/fo-0613.fo deleted file mode 100644 index f478a571da4..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0613.fo +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0621.fo b/Master/texmf-dist/tex/context/foxet/fo-0621.fo deleted file mode 100644 index 554fcc4a098..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0621.fo +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - setting up simple page master 'any' - - - - - - setting up simple page master 'first-page' - - - - - - setting up simple page master 'left-page' - - - - - - setting up simple page master 'right-page' - - - - - - setting up simple page master 'blank-page' - - - - - - setting up simple page master 'odd' - - - - - - setting up simple page master 'even' - - - - - - setting up simple page master 'rest' - - - - - - - setting up page sequence master 'demo' - - - - - - - - - setting up page sequence master 'omed' - - - - - - - - - - - starting page sequence 'any' - - - - - - - - - starting page sequence 'demo' - - - - - - - - - starting page sequence 'omed' - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0641.fo b/Master/texmf-dist/tex/context/foxet/fo-0641.fo deleted file mode 100644 index 9dbb90870e0..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0641.fo +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0642.fo b/Master/texmf-dist/tex/context/foxet/fo-0642.fo deleted file mode 100644 index 8f646509cbe..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0642.fo +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0643.fo b/Master/texmf-dist/tex/context/foxet/fo-0643.fo deleted file mode 100644 index 9595d4438a8..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0643.fo +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0644.fo b/Master/texmf-dist/tex/context/foxet/fo-0644.fo deleted file mode 100644 index a408661e017..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0644.fo +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0650.fo b/Master/texmf-dist/tex/context/foxet/fo-0650.fo deleted file mode 100644 index 54fd7c1286e..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0650.fo +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0651.fo b/Master/texmf-dist/tex/context/foxet/fo-0651.fo deleted file mode 100644 index 319592ba8c0..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0651.fo +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0701.fo b/Master/texmf-dist/tex/context/foxet/fo-0701.fo deleted file mode 100644 index fabbe07228c..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0701.fo +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - Test 1 - - - Test 2 - - - Test 3 - - - Test 4 - - - Test 5 - - - Test 6 - - - Test 7 - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0801.fo b/Master/texmf-dist/tex/context/foxet/fo-0801.fo deleted file mode 100644 index b18c4282f99..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0801.fo +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - digits: - - - - - - characters: - - - - - - romannumerals: - - - - - - complex format: - - - - - - no format: - - - - - - - digits: - characters: - romannumerals: - complex format: - no format: - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0901.fo b/Master/texmf-dist/tex/context/foxet/fo-0901.fo deleted file mode 100644 index 05011269bec..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0901.fo +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - times - helvetica - courier - - - times - helvetica - courier - - - times - helvetica - courier - - - times - helvetica - courier - - - large - large - large - - - x-large - x-large - x-large - - - xx-large - xx-large - xx-large - - - times - helvetica - courier - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-0902.fo b/Master/texmf-dist/tex/context/foxet/fo-0902.fo deleted file mode 100644 index ebaa06651a8..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-0902.fo +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1001.fo b/Master/texmf-dist/tex/context/foxet/fo-1001.fo deleted file mode 100644 index 3733265fd09..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1001.fo +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - a test line d 10pt - - a test line d 5pt - - a test line d 4pt - - a test line d d d - - - - a test line r d d - - - - a test line d r d - - - - a test line r r d - - - - a test line d d r - - - - a test line r d r - - - - a test line d r r - - - - a test line r r r - - - - a test line d r r force - - - - a test line - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1002.fo b/Master/texmf-dist/tex/context/foxet/fo-1002.fo deleted file mode 100644 index cc0ea810010..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1002.fo +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1003.fo b/Master/texmf-dist/tex/context/foxet/fo-1003.fo deleted file mode 100644 index 4c416e02dff..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1003.fo +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1004.fo b/Master/texmf-dist/tex/context/foxet/fo-1004.fo deleted file mode 100644 index 1c057edd7ec..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1004.fo +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - beforeinbetweenafter - - - beforeinbetweenafter - - - beforeinbetweenafter - - - beforeinbetweenafter - - - beforeinbetweenafter - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1101.fo b/Master/texmf-dist/tex/context/foxet/fo-1101.fo deleted file mode 100644 index f6953d522d8..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1101.fo +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - [a] - - - - - - - - [b] - - - - - - [bb] - - - - - - - - - - - - - [a] - - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1102.fo b/Master/texmf-dist/tex/context/foxet/fo-1102.fo deleted file mode 100644 index f8d5a9df3a8..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1102.fo +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1103.fo b/Master/texmf-dist/tex/context/foxet/fo-1103.fo deleted file mode 100644 index 245f3ff0e92..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1103.fo +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - [a] - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1104.fo b/Master/texmf-dist/tex/context/foxet/fo-1104.fo deleted file mode 100644 index 6867e772f61..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1104.fo +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - X - - - - - - - - - - diff --git a/Master/texmf-dist/tex/context/foxet/fo-1201.fo b/Master/texmf-dist/tex/context/foxet/fo-1201.fo deleted file mode 100644 index 364dcb21477..00000000000 --- a/Master/texmf-dist/tex/context/foxet/fo-1201.fo +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - test - S - S - S - F - F - F - A - A - A - R - R - R - test - Q - Q - Q - Q - - - - - - diff --git a/Master/texmf-dist/tex/context/interface/keys-cs.xml b/Master/texmf-dist/tex/context/interface/keys-cs.xml index 7053ceed751..c8e7e7517c1 100644 --- a/Master/texmf-dist/tex/context/interface/keys-cs.xml +++ b/Master/texmf-dist/tex/context/interface/keys-cs.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-de.xml b/Master/texmf-dist/tex/context/interface/keys-de.xml index 7164db6e30b..a100a938fa3 100644 --- a/Master/texmf-dist/tex/context/interface/keys-de.xml +++ b/Master/texmf-dist/tex/context/interface/keys-de.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-en.xml b/Master/texmf-dist/tex/context/interface/keys-en.xml index 354b86d65fd..0e51dfc7c97 100644 --- a/Master/texmf-dist/tex/context/interface/keys-en.xml +++ b/Master/texmf-dist/tex/context/interface/keys-en.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-fr.xml b/Master/texmf-dist/tex/context/interface/keys-fr.xml index 0e4f9e51671..cd35ad7e19d 100644 --- a/Master/texmf-dist/tex/context/interface/keys-fr.xml +++ b/Master/texmf-dist/tex/context/interface/keys-fr.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1008,7 +1013,7 @@ - + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-it.xml b/Master/texmf-dist/tex/context/interface/keys-it.xml index afc33eb225d..f07dbb5e6f1 100644 --- a/Master/texmf-dist/tex/context/interface/keys-it.xml +++ b/Master/texmf-dist/tex/context/interface/keys-it.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -840,7 +844,7 @@ - + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-nl.xml b/Master/texmf-dist/tex/context/interface/keys-nl.xml index 9abfe5d7a90..f32d79275c2 100644 --- a/Master/texmf-dist/tex/context/interface/keys-nl.xml +++ b/Master/texmf-dist/tex/context/interface/keys-nl.xml @@ -183,6 +183,7 @@ + @@ -290,20 +291,21 @@ - - - + + + - + + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-pe.xml b/Master/texmf-dist/tex/context/interface/keys-pe.xml index 517c41ed0d8..a55ad78ce1f 100644 --- a/Master/texmf-dist/tex/context/interface/keys-pe.xml +++ b/Master/texmf-dist/tex/context/interface/keys-pe.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1008,7 +1013,7 @@ - + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/interface/keys-ro.xml b/Master/texmf-dist/tex/context/interface/keys-ro.xml index b7f5b2e1904..951a5e8c9c2 100644 --- a/Master/texmf-dist/tex/context/interface/keys-ro.xml +++ b/Master/texmf-dist/tex/context/interface/keys-ro.xml @@ -183,6 +183,7 @@ + @@ -304,6 +305,7 @@ + @@ -363,6 +365,7 @@ + @@ -422,7 +425,7 @@ - + @@ -657,7 +660,7 @@ - + @@ -692,7 +695,7 @@ - + @@ -759,6 +762,7 @@ + @@ -864,6 +868,7 @@ + @@ -1293,6 +1298,7 @@ + @@ -1453,7 +1459,6 @@ - @@ -1463,11 +1468,13 @@ + + @@ -1614,7 +1621,6 @@ - @@ -1632,6 +1638,7 @@ + @@ -1678,6 +1685,7 @@ + @@ -1704,6 +1712,7 @@ + @@ -1718,6 +1727,7 @@ + @@ -1743,6 +1753,7 @@ + diff --git a/Master/texmf-dist/tex/context/sample/darwin.tex b/Master/texmf-dist/tex/context/sample/darwin.tex new file mode 100644 index 00000000000..6425bf156cc --- /dev/null +++ b/Master/texmf-dist/tex/context/sample/darwin.tex @@ -0,0 +1,19 @@ +It is interesting to contemplate an entangled bank, clothed with many +plants of many kinds, with birds singing on the bushes, with various +insects flitting about, and with worms crawling through the damp earth, +and to reflect that these elaborately constructed forms, so different +from each other, and dependent on each other in so complex a manner, +have all been produced by laws acting around us. These laws, taken in +the largest sense, being Growth with Reproduction; Inheritance which is +almost implied by reproduction; Variability from the indirect and +direct action of the external conditions of life, and from use and +disuse; a Ratio of Increase so high as to lead to a Struggle for Life, +and as a consequence to Natural Selection, entailing Divergence of +Character and the Extinction of less-improved forms. Thus, from the war +of nature, from famine and death, the most exalted object which we are +capable of conceiving, namely, the production of the higher animals, +directly follows. There is grandeur in this view of life, with its +several powers, having been originally breathed into a few forms or +into one; and that, whilst this planet has gone cycling on according to +the fixed law of gravity, from so simple a beginning endless forms most +beautiful and most wonderful have been, and are being, evolved. diff --git a/Master/texmf-dist/tex/context/sample/dawkins.tex b/Master/texmf-dist/tex/context/sample/dawkins.tex index 3490b79b021..c0acd3157ad 100644 --- a/Master/texmf-dist/tex/context/sample/dawkins.tex +++ b/Master/texmf-dist/tex/context/sample/dawkins.tex @@ -8,13 +8,13 @@ individual out. \quotation {Let's first establish,} I said, right half of the lecture hall.} I invited everybody to stand up while my assistant tossed a coin. Everybody on the left of the hall was asked to \quote {will} the coin to -come down head. Everybody on the right had to will it to be +come down heads. Everybody on the right had to will it to be tails. Obviously one side had to lose, and they were asked -to sit down. Then those who remained were divided into two, +to sit down. Then those that remained were divided into two, with half \quote {willing} heads and the other half tails. Again the losers sat down. And so on by successive halvings until, inevitably, after seven or eight tosses, one individual was left standing. \quotation {A big round of applause for our psychic.} He must be psychic, mustn't he, because he successfully influenced the coin eight times in -a row? \ No newline at end of file +a row? diff --git a/Master/texmf-dist/tex/context/sample/douglas.tex b/Master/texmf-dist/tex/context/sample/douglas.tex index 7d986d484ab..838c6d24d26 100644 --- a/Master/texmf-dist/tex/context/sample/douglas.tex +++ b/Master/texmf-dist/tex/context/sample/douglas.tex @@ -1,18 +1,18 @@ Donald Knuth has spent the past several years working on a system allowing him to control many aspects of the design -of his forthcoming books, from the typesetting and layout +of his forthcoming books|=|from the typesetting and layout down to the very shapes of the letters! Seldom has an author had anything remotely like this power to control the final appearance of his or her work. Knuth's \TEX\ -typesetting system has become well|-|known and available in +typesetting system has become well|-|known and as available in many countries around the world. By contrast, his \METAFONT\ system for designing families of typefaces has -not become as well known or available. +not become as well known or as available. In his article \quotation {The Concept of a Meta|-|Font}, Knuth sets forth for the first time the underlying philosophy of \METAFONT, as well as some of its products. -Not only is the concept exiting and clearly well executed, +Not only is the concept exciting and clearly well executed, but in my opinion the article is charmingly written as well. However, despite my overall enthusiasm for Knuth's idea and article, there are some points in it that I feel might be diff --git a/Master/texmf-dist/tex/context/sample/sample.tex b/Master/texmf-dist/tex/context/sample/sample.tex index 5f97ea00964..ef31153a112 100644 --- a/Master/texmf-dist/tex/context/sample/sample.tex +++ b/Master/texmf-dist/tex/context/sample/sample.tex @@ -1,75 +1,21 @@ -\starttext - -The sample directory contains a few files with quotes that can be used -while testing styles. - -I'll complete this file when I've reorganized my books and audio cd's. - -If someone makes a nice bibtex file of these, the quotes can also be -used in testing bibliographic references and citations. - -\starttabulate[|l|l|p|] -\NC \bf file \NC \bf author \NC \bf source \NC \NR -\HL -%NC stork.tex \NC David F. Stork \NC \NC \NR -\NC knuth.tex \NC Donald E. Knuth \NC \NC \NR -\NC tufte.tex \NC Edward R. Tufte \NC \NC \NR -\NC reich.tex \NC Steve Reich \NC \NC \NR -\NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR -\NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR -\NC dawkins.tex \NC Dawkins \NC \NC \NR -\NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR -\NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, \endgraf - Electronic Publishing, vol. 6(3), \endgraf - 283-288 (September 1993) \NC \NR -\NC bryson.tex \NC Bill Bryson \NC A Short History of Nearly Everything, \endgraf - Random House, 2003 \NC \NR -\NC davis.tex \NC Kenneth C. Davis \NC Don't Know Much About History, \endgraf - Everything You Need to Know About American - History but Never Learned, \endgraf - HarperCollins, 2003 \NC \NR -\NC thuan.tex \NC Trinh Xuan Thuan \NC Chaos and Harmony, Perspectives on Scientific - Revolutions of the Twentieth Century, \endgraf - Oxford University Press, 2001 \NC \NR -\NC hawking.tex \NC Steve W. Hawking \NC The Universe in a Nutshell, Bantam Books - Random House, 2001 \NC \NR -\NC linden.tex \NC Eugene Linden \NC The Winds of Change, Climate, Weather, and the - Destruction of Civilizations, \endgraf - Simon \& Schuster, 2006, p.106 \NC \NR -\NC weisman.tex \NC Alan Weisman \NC The World Without Us, \endgraf - Thomas Dunne Books, 2007, p.160 \NC \NR -\NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf - University of California Press, 2007, p.199 \NC \NR -\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf - Quercus, London, 2006 \NC \NR -%NC schwarzenegger.tex \NC Arnold Schwarzenegger \NC Several place on the World Wide Web. \NC \NR -\stoptabulate +% this original file has been renamed to samples.tex and describes the +% short quotes that can be used in test files -% Tufte: This quote will always produce hyphenated text, apart from the content, -% it's a pretty good test case for protruding. - -% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards -% books excell. - -% A Short History of Nearly Everything: I wish that I had the memory to remember this book -% verbatim. - -% Chaos and Harmony: very nice and well written book, but the typography is rather bad: -% quite visible inter-character spacing in a text that can be typeset quite well by \TeX. +\starttext -% The Universe in a Nutshell: a beautiful designed book, (companion of A Short History -% of Time). +see \type {samples.tex} -% The World Without Us: A properly typeset, very readable book. Read it and you'll look at -% the world around you differently (and a bit more freightened). +\blank -% Dirt, The Erosion of Civilizations: one of those books that you buy immediately after -% reading a few sentences. Also one of those books that every politician should read. +\startluacode + context("see \\type {samples.tex}") +\stopluacode -% The Making of the Fittest: nice sample for color ans subsentence testing. A very -% readable book but unfortunately it has inter-character spacing. +\blank -% The Schwarzenegger letter was originally typeset at a width equivalent to 16.1cm in -% a default ConTeXt setup. +\startMPcode + draw textext("see \type {samples.tex}") ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode \stoptext diff --git a/Master/texmf-dist/tex/context/sample/samples.bib b/Master/texmf-dist/tex/context/sample/samples.bib new file mode 100644 index 00000000000..e54092aae83 --- /dev/null +++ b/Master/texmf-dist/tex/context/sample/samples.bib @@ -0,0 +1,29 @@ +% The following entries were provided by Rik Kabel: + +@book{dawkins2000unweaving, + title = {Unweaving the Rainbow: Science, Delusion and the Appetite for Wonder}, + author = {Dawkins, R.}, + isbn = {9780547347356}, + url = {http://books.google.com/books?id=ZudTchiioUoC}, + year = {2000}, + publisher = {Houghton Mifflin Harcourt}, + pages = {145--146}, +} + +@book{Hofstadter:1985:MTQ:537101, + author = {Hofstadter, Douglas R.}, + title = {Metamagical Themas: Questing for the Essence of Mind and Pattern}, + year = {1985}, + isbn = {0465045405}, + publisher = {Basic Books, Inc.}, + address = {New York, NY, USA}, +} + +@book{Tufte:1990:EI:78223, + author = {Tufte, Edward}, + title = {Envisioning Information}, + year = {1990}, + isbn = {0-9613921-1-8}, + publisher = {Graphics Press}, + address = {Cheshire, CT, USA}, +} diff --git a/Master/texmf-dist/tex/context/sample/samples.tex b/Master/texmf-dist/tex/context/sample/samples.tex new file mode 100644 index 00000000000..6e217a59251 --- /dev/null +++ b/Master/texmf-dist/tex/context/sample/samples.tex @@ -0,0 +1,78 @@ +\starttext + +The sample directory contains a few files with quotes that can be used +while testing styles. + +I'll complete this file when I've reorganized my books and audio cd's. + +If someone makes a nice bibtex file of these, the quotes can also be +used in testing bibliographic references and citations. + +\starttabulate[|l|l|p|] +\NC \bf file \NC \bf author \NC \bf source \NC \NR +\HL +%NC stork.tex \NC David F. Stork \NC \NC \NR +\NC knuth.tex \NC Donald E. Knuth \NC \NC \NR +\NC tufte.tex \NC Edward R. Tufte \NC \NC \NR +\NC reich.tex \NC Steve Reich \NC City Life (1995) \NC \NR +\NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR +\NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR +\NC dawkins.tex \NC Dawkins \NC \NC \NR +\NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR +\NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, \endgraf + Electronic Publishing, vol. 6(3), \endgraf + 283-288 (September 1993) \NC \NR +\NC bryson.tex \NC Bill Bryson \NC A Short History of Nearly Everything, \endgraf + Random House, 2003 \NC \NR +\NC davis.tex \NC Kenneth C. Davis \NC Don't Know Much About History, \endgraf + Everything You Need to Know About American + History but Never Learned, \endgraf + HarperCollins, 2003 \NC \NR +\NC thuan.tex \NC Trinh Xuan Thuan \NC Chaos and Harmony, Perspectives on Scientific + Revolutions of the Twentieth Century, \endgraf + Oxford University Press, 2001 \NC \NR +\NC hawking.tex \NC Steve W. Hawking \NC The Universe in a Nutshell, Bantam Books + Random House, 2001 \NC \NR +\NC linden.tex \NC Eugene Linden \NC The Winds of Change, Climate, Weather, and the + Destruction of Civilizations, \endgraf + Simon \& Schuster, 2006, p.106 \NC \NR +\NC weisman.tex \NC Alan Weisman \NC The World Without Us, \endgraf + Thomas Dunne Books, 2007, p.160 \NC \NR +\NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf + University of California Press, 2007, p.199 \NC \NR +\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf + Quercus, London, 2006 \NC \NR +%NC jojomayer.tex \NC Jojo Mayer \NC Between Zero & One, www.youtube.com/watch?v=mSj298iBjBY \NC \NR +%NC schwarzenegger.tex \NC Arnold Schwarzenegger \NC Several place on the World Wide Web. \NC \NR +\stoptabulate + +% Tufte: This quote will always produce hyphenated text, apart from the content, +% it's a pretty good test case for protruding. + +% Reich: This is a list of the voice samples from Steve Reich's 1995 composition City Life. + +% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards +% books excell. + +% A Short History of Nearly Everything: I wish that I had the memory to remember this book +% verbatim. + +% Chaos and Harmony: very nice and well written book, but the typography is rather bad: +% quite visible inter-character spacing in a text that can be typeset quite well by \TeX. + +% The Universe in a Nutshell: a beautiful designed book, (companion of A Short History +% of Time). + +% The World Without Us: A properly typeset, very readable book. Read it and you'll look at +% the world around you differently (and a bit more freightened). + +% Dirt, The Erosion of Civilizations: one of those books that you buy immediately after +% reading a few sentences. Also one of those books that every politician should read. + +% The Making of the Fittest: nice sample for color ans subsentence testing. A very +% readable book but unfortunately it has inter-character spacing. + +% The Schwarzenegger letter was originally typeset at a width equivalent to 16.1cm in +% a default ConTeXt setup. + +\stoptext diff --git a/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv b/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv index f980e314849..bc970c3f9d8 100644 --- a/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv +++ b/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv @@ -1,9 +1,9 @@ % PDF/A-1b:2005 -\enabletrackers[structure.tags,backend.tags] +\enabletrackers[structure.tags,backend.tags,backend.xmp] \setupbackend - [format=PDF/A-1a:2005, + [format=PDF/A-1b:2005, intent=sRGB IEC61966-2.1, % use entry here; otherwise problems with predefined default profile profile=sRGB.icc, % use here level=0] @@ -20,8 +20,6 @@ Text is needed, otherwise tagging base entries are not applied. -\stopchapter - \stoptextcolor %\startTEXpage diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua index c19a49af39f..c4d6536046a 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua @@ -15,8 +15,13 @@ local dummyfunction = function() end local dummyreporter = function(c) - return function(...) - (texio.reporter or texio.write_nl)(c .. " : " .. string.formatters(...)) + return function(f,...) + local r = texio.reporter or texio.write_nl + if f then + r(c .. " : " .. string.formatters(f,...)) + else + r("") + end end end @@ -351,7 +356,12 @@ end -- function table.setmetatableindex(t,f) + if type(t) ~= "table" then + f = f or t + t = { } + end setmetatable(t,{ __index = f }) + return t end -- helper for plain: diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua index 373dab5a8c7..1ec2895ba8f 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua @@ -45,7 +45,7 @@ attributes.private = attributes.private or function(name) return number end --- Nodes: +-- Nodes (a subset of context so that we don't get too much unused code): nodes = { } nodes.pool = { } @@ -105,10 +105,8 @@ function nodes.pool.kern(k) return n end --- experimental - -local getfield = node.getfield or function(n,tag) return n[tag] end -local setfield = node.setfield or function(n,tag,value) n[tag] = value end +local getfield = node.getfield +local setfield = node.setfield nodes.getfield = getfield nodes.setfield = setfield @@ -116,17 +114,6 @@ nodes.setfield = setfield nodes.getattr = getfield nodes.setattr = setfield -if node.getid then nodes.getid = node.getid else function nodes.getid (n) return getfield(n,"id") end end -if node.getsubtype then nodes.getsubtype = node.getsubtype else function nodes.getsubtype(n) return getfield(n,"subtype") end end -if node.getnext then nodes.getnext = node.getnext else function nodes.getnext (n) return getfield(n,"next") end end -if node.getprev then nodes.getprev = node.getprev else function nodes.getprev (n) return getfield(n,"prev") end end -if node.getchar then nodes.getchar = node.getchar else function nodes.getchar (n) return getfield(n,"char") end end -if node.getfont then nodes.getfont = node.getfont else function nodes.getfont (n) return getfield(n,"font") end end -if node.getlist then nodes.getlist = node.getlist else function nodes.getlist (n) return getfield(n,"list") end end - -function nodes.tonut (n) return n end -function nodes.tonode(n) return n end - -- being lazy ... just copy a bunch ... not all needed in generic but we assume -- nodes to be kind of private anyway @@ -167,12 +154,95 @@ nodes.unset_attribute = node.unset_attribute nodes.protect_glyphs = node.protect_glyphs nodes.unprotect_glyphs = node.unprotect_glyphs -nodes.kerning = node.kerning -nodes.ligaturing = node.ligaturing +-----.kerning = node.kerning +-----.ligaturing = node.ligaturing nodes.mlist_to_hlist = node.mlist_to_hlist -- in generic code, at least for some time, we stay nodes, while in context -- we can go nuts (e.g. experimental); this split permits us us keep code -- used elsewhere stable but at the same time play around in context -nodes.nuts = nodes +local direct = node.direct +local nuts = { } +nodes.nuts = nuts + +local tonode = direct.tonode +local tonut = direct.todirect + +nodes.tonode = tonode +nodes.tonut = tonut + +nuts.tonode = tonode +nuts.tonut = tonut + + +local getfield = direct.getfield +local setfield = direct.setfield + +nuts.getfield = getfield +nuts.setfield = setfield +nuts.getnext = direct.getnext +nuts.getprev = direct.getprev +nuts.getid = direct.getid +nuts.getattr = getfield +nuts.setattr = setfield +nuts.getfont = direct.getfont +nuts.getsubtype = direct.getsubtype +nuts.getchar = direct.getchar + +nuts.insert_before = direct.insert_before +nuts.insert_after = direct.insert_after +nuts.delete = direct.delete +nuts.copy = direct.copy +nuts.copy_list = direct.copy_list +nuts.tail = direct.tail +nuts.flush_list = direct.flush_list +nuts.free = direct.free +nuts.remove = direct.remove +nuts.is_node = direct.is_node +nuts.end_of_math = direct.end_of_math +nuts.traverse = direct.traverse +nuts.traverse_id = direct.traverse_id + +nuts.getprop = nuts.getattr +nuts.setprop = nuts.setattr + +local new_nut = direct.new +nuts.new = new_nut +nuts.pool = { } + +function nuts.pool.kern(k) + local n = new_nut("kern",1) + setfield(n,"kern",k) + return n +end + +-- properties as used in the (new) injector: + +local propertydata = direct.get_properties_table() +nodes.properties = { data = propertydata } + +direct.set_properties_mode(true,true) -- needed for injection + +function direct.set_properties_mode() end -- we really need the set modes + +nuts.getprop = function(n,k) + local p = propertydata[n] + if p then + return p[k] + end +end + +nuts.setprop = function(n,k,v) + if v then + local p = propertydata[n] + if p then + p[k] = v + else + propertydata[n] = { [k] = v } + end + end +end + +nodes.setprop = nodes.setproperty +nodes.getprop = nodes.getproperty diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua index 9db94f65e48..ce19c8811e9 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua @@ -18,14 +18,51 @@ local nodes = nodes local traverse_id = node.traverse_id local glyph_code = nodes.nodecodes.glyph +local disc_code = nodes.nodecodes.disc -function nodes.handlers.characters(head) +-- from now on we apply ligaturing and kerning here because it might interfere with complex +-- opentype discretionary handling where the base ligature pass expect some weird extra +-- pointers (which then confuse the tail slider that has some checking built in) + +local ligaturing = node.ligaturing +local kerning = node.kerning + +local basepass = true + +local function l_warning() texio.write_nl("warning: node.ligaturing called directly") l_warning = nil end +local function k_warning() texio.write_nl("warning: node.kerning called directly") k_warning = nil end + +function node.ligaturing(...) + if basepass and l_warning then + l_warning() + end + return ligaturing(...) +end + +function node.kerning(...) + if basepass and k_warning then + k_warning() + end + return kerning(...) +end + +function nodes.handlers.setbasepass(v) + basepass = v +end + +function nodes.handlers.nodepass(head) local fontdata = fonts.hashes.identifiers if fontdata then - local usedfonts, done, prevfont = { }, false, nil + local usedfonts = { } + local basefonts = { } + local prevfont = nil + local basefont = nil for n in traverse_id(glyph_code,head) do local font = n.font if font ~= prevfont then + if basefont then + basefont[2] = n.prev + end prevfont = font local used = usedfonts[font] if not used then @@ -36,18 +73,57 @@ function nodes.handlers.characters(head) local processors = shared.processes if processors and #processors > 0 then usedfonts[font] = processors - done = true + elseif basepass then + basefont = { n, nil } + basefonts[#basefonts+1] = basefont + end + end + end + end + end + end + for d in traverse_id(disc_code,head) do + local r = d.replace + if r then + for n in traverse_id(glyph_code,r) do + local font = n.font + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + end + end end end end end end end - if done then + if next(usedfonts) then for font, processors in next, usedfonts do for i=1,#processors do - local h, d = processors[i](head,font,0) - head, done = h or head, done or d + head = processors[i](head,font,0) or head + end + end + end + if basepass and #basefonts > 0 then + for i=1,#basefonts do + local range = basefonts[i] + local start = range[1] + local stop = range[2] + if stop then + start, stop = ligaturing(start,stop) + start, stop = kerning(start,stop) + elseif start then + start = ligaturing(start) + start = kerning(start) end end end @@ -57,12 +133,27 @@ function nodes.handlers.characters(head) end end +function nodes.handlers.basepass(head) + if not basepass then + head = ligaturing(head) + head = kerning(head) + end + return head, true +end + +local nodepass = nodes.handlers.nodepass +local basepass = nodes.handlers.basepass +local injectpass = nodes.injections.handler +local protectpass = nodes.handlers.protectglyphs + function nodes.simple_font_handler(head) --- lang.hyphenate(head) - head = nodes.handlers.characters(head) - nodes.injections.handler(head) - nodes.handlers.protectglyphs(head) - head = node.ligaturing(head) - head = node.kerning(head) - return head + if head then + head = nodepass(head) + head = injectpass(head) + head = basepass(head) + protectpass(head) + return head, true + else + return head, false + end end diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua index 5e6c0707092..cb9ed891cfc 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua @@ -1,22 +1,24 @@ -if not modules then modules = { } end modules ['node-inj'] = { +if not modules then modules = { } end modules ['font-inj'] = { version = 1.001, - comment = "companion to node-ini.mkiv", + comment = "companion to font-lib.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", } --- This is very experimental (this will change when we have luatex > .50 and --- a few pending thingies are available. Also, Idris needs to make a few more --- test fonts. Btw, future versions of luatex will have extended glyph properties --- that can be of help. Some optimizations can go away when we have faster machines. +-- This property based variant is not faster but looks nicer than the attribute one. We +-- need to use rawget (which is apbout 4 times slower than a direct access but we cannot +-- get/set that one for our purpose! -local next = next +if not nodes.properties then return end + +local next, rawget = next, rawget local utfchar = utf.char +local fastcopy = table.fastcopy -local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end) +local trace_injections = false trackers.register("fonts.injections", function(v) trace_injections = v end) -local report_injections = logs.reporter("nodes","injections") +local report_injections = logs.reporter("fonts","injections") local attributes, nodes, node = attributes, nodes, node @@ -28,496 +30,1023 @@ local injections = nodes.injections local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc local kern_code = nodecodes.kern -local nodepool = nodes.pool + +local nuts = nodes.nuts +local nodepool = nuts.pool + local newkern = nodepool.kern -local traverse_id = node.traverse_id -local insert_node_before = node.insert_before -local insert_node_after = node.insert_after +local tonode = nuts.tonode +local tonut = nuts.tonut + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar -local a_kernpair = attributes.private('kernpair') -local a_ligacomp = attributes.private('ligacomp') -local a_markbase = attributes.private('markbase') -local a_markmark = attributes.private('markmark') -local a_markdone = attributes.private('markdone') -local a_cursbase = attributes.private('cursbase') -local a_curscurs = attributes.private('curscurs') -local a_cursdone = attributes.private('cursdone') +local traverse_id = nuts.traverse_id +local insert_node_before = nuts.insert_before +local insert_node_after = nuts.insert_after +local find_tail = nuts.tail --- This injector has been tested by Idris Samawi Hamid (several arabic fonts as well as --- the rather demanding Husayni font), Khaled Hosny (latin and arabic) and Kaj Eigner --- (arabic, hebrew and thai) and myself (whatever font I come across). I'm pretty sure --- that this code is not 100% okay but examples are needed to figure things out. +local properties = nodes.properties.data function injections.installnewkern(nk) newkern = nk or newkern end -local cursives = { } -local marks = { } -local kerns = { } +local nofregisteredkerns = 0 +local nofregisteredpairs = 0 +local nofregisteredmarks = 0 +local nofregisteredcursives = 0 +----- markanchors = { } -- one base can have more marks +local keepregisteredcounts = false --- Currently we do gpos/kern in a bit inofficial way but when we have the extra fields in --- glyphnodes to manipulate ht/dp/wd explicitly I will provide an alternative; also, we --- can share tables. +function injections.keepcounts() + keepregisteredcounts = true +end --- For the moment we pass the r2l key ... volt/arabtype tests .. idris: this needs --- checking with husayni (volt and fontforge). +function injections.resetcounts() + nofregisteredkerns = 0 + nofregisteredpairs = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + keepregisteredcounts = false +end -function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) - local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2]) - local ws, wn = tfmstart.width, tfmnext.width - local bound = #cursives + 1 - start[a_cursbase] = bound - nxt[a_curscurs] = bound - cursives[bound] = { rlmode, dx, dy, ws, wn } - return dx, dy, bound +-- We need to make sure that a possible metatable will not kick in +-- unexpectedly. + +function injections.reset(n) + local p = rawget(properties,n) + if p and rawget(p,"injections") then + p.injections = nil + end end -function injections.setpair(current,factor,rlmode,r2lflag,spec,tfmchr) - local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4] - -- dy = y - h - if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then - local bound = current[a_kernpair] - if bound then - local kb = kerns[bound] - -- inefficient but singles have less, but weird anyway, needs checking - kb[2], kb[3], kb[4], kb[5] = (kb[2] or 0) + x, (kb[3] or 0) + y, (kb[4] or 0)+ w, (kb[5] or 0) + h +function injections.copy(target,source) + local sp = rawget(properties,source) + if sp then + local tp = rawget(properties,target) + local si = rawget(sp,"injections") + if si then + si = fastcopy(si) + if tp then + tp.injections = si + else + propertydata[target] = { + injections = si, + } + end + else + if tp then + tp.injections = nil + end + end + end +end + +function injections.setligaindex(n,index) + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + i.ligaindex = index + else + p.injections = { + ligaindex = index + } + end + else + properties[n] = { + injections = { + ligaindex = index + } + } + end +end + +function injections.getligaindex(n,default) + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + return i.ligaindex or default + end + end + return default +end + +function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes + local dx = factor*(exit[1]-entry[1]) + local dy = -factor*(exit[2]-entry[2]) + local ws, wn = tfmstart.width, tfmnext.width + nofregisteredcursives = nofregisteredcursives + 1 + if rlmode < 0 then + dx = -(dx + wn) + else + dx = dx - ws + end + -- + local p = rawget(properties,start) + if p then + local i = rawget(p,"injections") + if i then + i.cursiveanchor = true else - bound = #kerns + 1 - current[a_kernpair] = bound - kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width } + p.injections = { + cursiveanchor = true, + } end - return x, y, w, h, bound + else + properties[start] = { + injections = { + cursiveanchor = true, + }, + } + end + local p = rawget(properties,nxt) + if p then + local i = rawget(p,"injections") + if i then + i.cursivex = dx + i.cursivey = dy + else + p.injections = { + cursivex = dx, + cursivey = dy, + } + end + else + properties[nxt] = { + injections = { + cursivex = dx, + cursivey = dy, + }, + } + end + return dx, dy, nofregisteredcursives +end + +function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used + local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4] + if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then -- okay? + local yoffset = y - h + local leftkern = x -- both kerns are set in a pair kern compared + local rightkern = w - x -- to normal kerns where we set only leftkern + if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then + nofregisteredpairs = nofregisteredpairs + 1 + if rlmode and rlmode < 0 then + leftkern, rightkern = rightkern, leftkern + end + local p = rawget(properties,current) + if p then + local i = rawget(p,"injections") + if i then + if leftkern ~= 0 then + i.leftkern = (i.leftkern or 0) + leftkern + end + if rightkern ~= 0 then + i.rightkern = (i.rightkern or 0) + rightkern + end + if yoffset ~= 0 then + i.yoffset = (i.yoffset or 0) + yoffset + end + elseif leftkern ~= 0 or rightkern ~= 0 then + p.injections = { + leftkern = leftkern, + rightkern = rightkern, + yoffset = yoffset, + } + else + p.injections = { + yoffset = yoffset, + } + end + elseif leftkern ~= 0 or rightkern ~= 0 then + properties[current] = { + injections = { + leftkern = leftkern, + rightkern = rightkern, + yoffset = yoffset, + }, + } + else + properties[current] = { + injections = { + yoffset = yoffset, + }, + } + end + return x, y, w, h, nofregisteredpairs + end end return x, y, w, h -- no bound end -function injections.setkern(current,factor,rlmode,x,tfmchr) - local dx = factor*x +-- this needs checking for rl < 0 but it is unlikely that a r2l script +-- uses kernclasses between glyphs so we're probably safe (KE has a +-- problematic font where marks interfere with rl < 0 in the previous +-- case) + +function injections.setkern(current,factor,rlmode,x,injection) + local dx = factor * x if dx ~= 0 then - local bound = #kerns + 1 - current[a_kernpair] = bound - kerns[bound] = { rlmode, dx } - return dx, bound + nofregisteredkerns = nofregisteredkerns + 1 + local p = rawget(properties,current) + if not injection then + injection = "injections" + end + if p then + local i = rawget(p,injection) + if i then + i.leftkern = dx + (i.leftkern or 0) + else + p[injection] = { + leftkern = dx, + } + end + else + properties[current] = { + [injection] = { + leftkern = dx, + }, + } + end + return dx, nofregisteredkerns else return 0, 0 end end -function injections.setmark(start,base,factor,rlmode,ba,ma) -- ba=baseanchor, ma=markanchor +function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) -- ba=baseanchor, ma=markanchor local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2]) - local bound = base[a_markbase] - local index = 1 - if bound then - local mb = marks[bound] - if mb then - -- if not index then index = #mb + 1 end - index = #mb + 1 - mb[index] = { dx, dy, rlmode } - start[a_markmark] = bound - start[a_markdone] = index - return dx, dy, bound + nofregisteredmarks = nofregisteredmarks + 1 + -- markanchors[nofregisteredmarks] = base + if rlmode >= 0 then + dx = tfmbase.width - dx -- see later commented ox + end + local p = rawget(properties,start) + if p then + local i = rawget(p,"injections") + if i then + i.markx = dx + i.marky = dy + i.markdir = rlmode or 0 + i.markbase = nofregisteredmarks + i.markbasenode = base else - report_injections("possible problem, %U is base mark without data (id %a)",base.char,bound) + p.injections = { + markx = dx, + marky = dy, + markdir = rlmode or 0, + markbase = nofregisteredmarks, + markbasenode = base, + } end + else + properties[start] = { + injections = { + markx = dx, + marky = dy, + markdir = rlmode or 0, + markbase = nofregisteredmarks, + markbasenode = base, + }, + } end - index = index or 1 - bound = #marks + 1 - base[a_markbase] = bound - start[a_markmark] = bound - start[a_markdone] = index - marks[bound] = { [index] = { dx, dy, rlmode } } - return dx, dy, bound + return dx, dy, nofregisteredmarks end local function dir(n) return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset" end -local function trace(head) - report_injections("begin run") - for n in traverse_id(glyph_code,head) do - if n.subtype < 256 then - local kp = n[a_kernpair] - local mb = n[a_markbase] - local mm = n[a_markmark] - local md = n[a_markdone] - local cb = n[a_cursbase] - local cc = n[a_curscurs] - local char = n.char - report_injections("font %s, char %U, glyph %c",n.font,char,char) - if kp then - local k = kerns[kp] - if k[3] then - report_injections(" pairkern: dir %a, x %p, y %p, w %p, h %p",dir(k[1]),k[2],k[3],k[4],k[5]) - else - report_injections(" kern: dir %a, dx %p",dir(k[1]),k[2]) +local function showchar(n,nested) + local char = getchar(n) + report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char) +end + +local function show(n,what,nested,symbol) + if n then + local p = rawget(properties,n) + if p then + local i = rawget(p,what) + if i then + local leftkern = i.leftkern or 0 + local rightkern = i.rightkern or 0 + local yoffset = i.yoffset or 0 + local markx = i.markx or 0 + local marky = i.marky or 0 + local markdir = i.markdir or 0 + local markbase = i.markbase or 0 -- will be markbasenode + local cursivex = i.cursivex or 0 + local cursivey = i.cursivey or 0 + local ligaindex = i.ligaindex or 0 + local margin = nested and 4 or 2 + -- + if rightkern ~= 0 or yoffset ~= 0 then + report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset) + elseif leftkern ~= 0 then + report_injections("%w%s kern: dx %p",margin,symbol,leftkern) end - end - if mb then - report_injections(" markbase: bound %a",mb) - end - if mm then - local m = marks[mm] - if mb then - local m = m[mb] - if m then - report_injections(" markmark: bound %a, index %a, dx %p, dy %p",mm,md,m[1],m[2]) - else - report_injections(" markmark: bound %a, missing index",mm) - end - else - m = m[1] - report_injections(" markmark: bound %a, dx %p, dy %p",mm,m and m[1],m and m[2]) + if markx ~= 0 or marky ~= 0 or markbase ~= 0 then + report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase ~= 0 and "yes" or "no") end + if cursivex ~= 0 or cursivey ~= 0 then + report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey) + end + if ligaindex ~= 0 then + report_injections("%w%s liga: index %i",margin,symbol,ligaindex) + end + end + end + end +end + +local function showsub(n,what,where) + report_injections("begin subrun: %s",where) + for n in traverse_id(glyph_code,n) do + showchar(n,where) + show(n,what,where," ") + end + report_injections("end subrun") +end + +local function trace(head,where) + report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", + where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) + local n = head + while n do + local id = getid(n) + if id == glyph_code then + showchar(n) + show(n,"injections",false," ") + show(n,"preinjections",false,"<") + show(n,"postinjections",false,">") + show(n,"replaceinjections",false,"=") + elseif id == disc_code then + local pre = getfield(n,"pre") + local post = getfield(n,"post") + local replace = getfield(n,"replace") + if pre then + showsub(pre,"preinjections","pre") end - if cb then - report_injections(" cursbase: bound %a",cb) + if post then + showsub(post,"postinjections","post") end - if cc then - local c = cursives[cc] - report_injections(" curscurs: bound %a, dir %a, dx %p, dy %p",cc,dir(c[1]),c[2],c[3]) + if replace then + showsub(replace,"replaceinjections","replace") end end + n = getnext(n) end report_injections("end run") end --- todo: reuse tables (i.e. no collection), but will be extra fields anyway --- todo: check for attribute - --- We can have a fast test on a font being processed, so we can check faster for marks etc --- but I'll make a context variant anyway. - local function show_result(head) - local current = head + local current = head local skipping = false while current do - local id = current.id + local id = getid(current) if id == glyph_code then - report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset) + report_injections("char: %C, width %p, xoffset %p, yoffset %p", + getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset")) skipping = false elseif id == kern_code then - report_injections("kern: %p",current.kern) + report_injections("kern: %p",getfield(current,"kern")) skipping = false elseif not skipping then report_injections() skipping = true end - current = current.next + current = getnext(current) end end -function injections.handler(head,where,keep) - local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) - if has_marks or has_cursives then - if trace_injections then - trace(head) - end - -- in the future variant we will not copy items but refs to tables - local done, ky, rl, valid, cx, wx, mk, nofvalid = false, { }, { }, { }, { }, { }, { }, 0 - if has_kerns then -- move outside loop - local nf, tm = nil, nil - for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts - if n.subtype < 256 then - nofvalid = nofvalid + 1 - valid[nofvalid] = n - if n.font ~= nf then - nf = n.font - tm = fontdata[nf].resources.marks +-- we could also check for marks here but maybe not all are registered (needs checking) + +local function collect_glyphs_1(head) + local glyphs, nofglyphs = { }, 0 + local marks, nofmarks = { }, 0 + local nf, tm = nil, nil + for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts + if getsubtype(n) < 256 then + local f = getfont(n) + if f ~= nf then + nf = f + tm = fontdata[nf].resources.marks -- other hash in ctx + end + if tm and tm[getchar(n)] then + nofmarks = nofmarks + 1 + marks[nofmarks] = n + else + nofglyphs = nofglyphs + 1 + glyphs[nofglyphs] = n + end + -- yoffsets can influence curs steps + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) end - if tm then - mk[n] = tm[n.char] + end + end + end + end + return glyphs, nofglyphs, marks, nofmarks +end + +local function collect_glyphs_2(head) + local glyphs, nofglyphs = { }, 0 + local marks, nofmarks = { }, 0 + local nf, tm = nil, nil + for n in traverse_id(glyph_code,head) do + if getsubtype(n) < 256 then + local f = getfont(n) + if f ~= nf then + nf = f + tm = fontdata[nf].resources.marks -- other hash in ctx + end + if tm and tm[getchar(n)] then + nofmarks = nofmarks + 1 + marks[nofmarks] = n + else + nofglyphs = nofglyphs + 1 + glyphs[nofglyphs] = n + end + end + end + return glyphs, nofglyphs, marks, nofmarks +end + +local function inject_marks(marks,nofmarks) + for i=1,nofmarks do + local n = marks[i] + local pn = rawget(properties,n) + if pn then + pn = rawget(pn,"injections") + if pn then + local p = pn.markbasenode + if p then + local px = getfield(p,"xoffset") + local ox = 0 + local rightkern = nil + local pp = rawget(properties,p) + if pp then + pp = rawget(pp,"injections") + if pp then + rightkern = pp.rightkern + end end - local k = n[a_kernpair] - if k then - local kk = kerns[k] - if kk then - local x, y, w, h = kk[2] or 0, kk[3] or 0, kk[4] or 0, kk[5] or 0 - local dy = y - h - if dy ~= 0 then - ky[n] = dy - end - if w ~= 0 or x ~= 0 then - wx[n] = kk + if rightkern then -- x and w ~= 0 + if pn.markdir < 0 then + -- kern(w-x) glyph(p) kern(x) mark(n) + ox = px - pn.markx - rightkern + -- report_injections("r2l case 1: %p",ox) + else + -- kern(x) glyph(p) kern(w-x) mark(n) + -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern + local leftkern = pp.leftkern + if leftkern then + ox = px - pn.markx + else + ox = px - pn.markx - leftkern end - rl[n] = kk[1] -- could move in test +-- report_injections("l2r case 1: %p",ox) + end + else + -- we need to deal with fonts that have marks with width + -- if pn.markdir < 0 then + -- ox = px - pn.markx + -- -- report_injections("r2l case 3: %p",ox) + -- else + -- -- ox = px - getfield(p,"width") + pn.markx + ox = px - pn.markx + -- report_injections("l2r case 3: %p",ox) + -- end + local wn = getfield(n,"width") -- in arial marks have widths + if wn ~= 0 then + -- bad: we should center + -- insert_node_before(head,n,newkern(-wn/2)) + -- insert_node_after(head,n,newkern(-wn/2)) + pn.leftkern = -wn/2 + pn.rightkern = -wn/2 + -- wx[n] = { 0, -wn/2, 0, -wn } end + -- so far end + setfield(n,"xoffset",ox) + -- + local py = getfield(p,"yoffset") + local oy = 0 + if marks[p] then + oy = py + pn.marky + else + oy = getfield(n,"yoffset") + py + pn.marky + end + setfield(n,"yoffset",oy) + else + -- normally this can't happen (only when in trace mode which is a special case anyway) + -- report_injections("missing mark anchor %i",pn.markbase or 0) end end - else - local nf, tm = nil, nil - for n in traverse_id(glyph_code,head) do - if n.subtype < 256 then - nofvalid = nofvalid + 1 - valid[nofvalid] = n - if n.font ~= nf then - nf = n.font - tm = fontdata[nf].resources.marks + end + end +end + +local function inject_cursives(glyphs,nofglyphs) + local cursiveanchor, lastanchor = nil, nil + local minc, maxc, last = 0, 0, nil + for i=1,nofglyphs do + local n = glyphs[i] + local pn = rawget(properties,n) + if pn then + pn = rawget(pn,"injections") + end + if pn then + local cursivex = pn.cursivex + if cursivex then + if cursiveanchor then + if cursivex ~= 0 then + pn.leftkern = (pn.leftkern or 0) + cursivex end - if tm then - mk[n] = tm[n.char] + if lastanchor then + if maxc == 0 then + minc = lastanchor + end + maxc = lastanchor + properties[cursiveanchor].cursivedy = pn.cursivey end + last = n + else + maxc = 0 + end + elseif maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? end + maxc = 0 end + if pn.cursiveanchor then + cursiveanchor = n + lastanchor = i + else + cursiveanchor = nil + lastanchor = nil + if maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? + end + maxc = 0 + end + end + elseif maxc > 0 then + local ny = getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",getfield(ti,"yoffset") + ny) -- ? + end + maxc = 0 + cursiveanchor = nil + lastanchor = nil + end + -- if maxc > 0 and not cursiveanchor then + -- local ny = getfield(n,"yoffset") + -- for i=maxc,minc,-1 do + -- local ti = glyphs[i] + -- ny = ny + properties[ti].cursivedy + -- setfield(ti,"yoffset",ny) -- why not add ? + -- end + -- maxc = 0 + -- end + end + if last and maxc > 0 then + local ny = getfield(last,"yoffset") + for i=maxc,minc,-1 do + local ti = glyphs[i] + ny = ny + properties[ti].cursivedy + setfield(ti,"yoffset",ny) -- why not add ? end - if nofvalid > 0 then - -- we can assume done == true because we have cursives and marks - local cx = { } - if has_kerns and next(ky) then - for n, k in next, ky do - n.yoffset = k + end +end + +local function inject_kerns(head,glyphs,nofglyphs) + -- todo: pre/post/replace + for i=1,#glyphs do + local n = glyphs[i] + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + insert_node_before(head,n,newkern(leftkern)) -- type 0/2 + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) -- type 0/2 end end - -- todo: reuse t and use maxt - if has_cursives then - local p_cursbase, p = nil, nil - -- since we need valid[n+1] we can also use a "while true do" - local t, d, maxt = { }, { }, 0 - for i=1,nofvalid do -- valid == glyphs - local n = valid[i] - if not mk[n] then - local n_cursbase = n[a_cursbase] - if p_cursbase then - local n_curscurs = n[a_curscurs] - if p_cursbase == n_curscurs then - local c = cursives[n_curscurs] - if c then - local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5] - if rlmode >= 0 then - dx = dx - ws - else - dx = dx + wn - end - if dx ~= 0 then - cx[n] = dx - rl[n] = rlmode - end - -- if rlmode and rlmode < 0 then - dy = -dy - -- end - maxt = maxt + 1 - t[maxt] = p - d[maxt] = dy - else - maxt = 0 + end + end +end + +local function inject_everything(head,where) + head = tonut(head) + if trace_injections then + trace(head,"everything") + end + local glyphs, nofglyphs, marks, nofmarks + if nofregisteredpairs > 0 then + glyphs, nofglyphs, marks, nofmarks = collect_glyphs_1(head) + else + glyphs, nofglyphs, marks, nofmarks = collect_glyphs_2(head) + end + if nofglyphs > 0 then + if nofregisteredcursives > 0 then + inject_cursives(glyphs,nofglyphs) + end + if nofregisteredmarks > 0 then -- and nofmarks > 0 + inject_marks(marks,nofmarks) + end + inject_kerns(head,glyphs,nofglyphs) + end + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredkerns = 0 + nofregisteredpairs = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + end + return tonode(head), true +end + +local function inject_kerns_only(head,where) + head = tonut(head) + if trace_injections then + trace(head,"kerns") + end + local n = head + local p = nil + while n do + local id = getid(n) + if id == glyph_code then + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + if p then + local d = getfield(p,"post") + if d then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) end end - elseif maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - local ti = t[i] - ti.yoffset = ti.yoffset + ny + end + local d = getfield(p,"replace") + if d then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + end + else + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + setfield(p,"replace",newkern(leftkern)) + end end - maxt = 0 end - if not n_cursbase and maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - local ti = t[i] - ti.yoffset = ny + else + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + head = insert_node_before(head,n,newkern(leftkern)) end - maxt = 0 end - p_cursbase, p = n_cursbase, n end end - if maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - local ti = t[i] - ti.yoffset = ny + else + break + end + p = nil + elseif id == disc_code then + local d = getfield(n,"pre") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"preinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break end - maxt = 0 end - if not keep then - cursives = { } + if h ~= d then + setfield(n,"pre",h) end end - if has_marks then - for i=1,nofvalid do - local p = valid[i] - local p_markbase = p[a_markbase] - if p_markbase then - local mrks = marks[p_markbase] - local nofmarks = #mrks - for n in traverse_id(glyph_code,p.next) do - local n_markmark = n[a_markmark] - if p_markbase == n_markmark then - local index = n[a_markdone] or 1 - local d = mrks[index] - if d then - local rlmode = d[3] - -- - local k = wx[p] - if k then - local x = k[2] - local w = k[4] - if w then - if rlmode and rlmode >= 0 then - -- kern(x) glyph(p) kern(w-x) mark(n) - n.xoffset = p.xoffset - p.width + d[1] - (w-x) - else - -- kern(w-x) glyph(p) kern(x) mark(n) - n.xoffset = p.xoffset - d[1] - x - end - else - if rlmode and rlmode >= 0 then - -- okay for husayni - n.xoffset = p.xoffset - p.width + d[1] - else - -- needs checking: is x ok here? - n.xoffset = p.xoffset - d[1] - x - end - end - else - if rlmode and rlmode >= 0 then - n.xoffset = p.xoffset - p.width + d[1] - else - n.xoffset = p.xoffset - d[1] - end - local w = n.width - if w ~= 0 then - insert_node_before(head,n,newkern(-w/2)) - insert_node_after(head,n,newkern(-w/2)) - end - end - -- -- - if mk[p] then - n.yoffset = p.yoffset + d[2] - else - n.yoffset = n.yoffset + p.yoffset + d[2] - end - -- - if nofmarks == 1 then - break - else - nofmarks = nofmarks - 1 - end + local d = getfield(n,"post") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h ~= d then + setfield(n,"post",h) + end + end + local d = getfield(n,"replace") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local pn = rawget(properties,n) -- why can it be empty { } + if pn then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) end - else - -- KE: there can be sequences in ligatures end end + else + break end end - if not keep then - marks = { } + if h ~= d then + setfield(n,"replace",h) end end - -- todo : combine - if next(wx) then - for n, k in next, wx do - -- only w can be nil (kernclasses), can be sped up when w == nil - local x = k[2] - local w = k[4] - if w then - local rl = k[1] -- r2l = k[6] - local wx = w - x - if rl < 0 then -- KE: don't use r2l here - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) -- type 0/2 + p = n + else + p = nil + end + n = getnext(n) + end + -- + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredkerns = 0 + end + return tonode(head), true +end + +local function inject_pairs_only(head,where) + head = tonut(head) + if trace_injections then + trace(head,"pairs") + end + -- + local n = head + local p = nil + while n do + local id = getid(n) + if id == glyph_code then + if getsubtype(n) < 256 then + local pn = rawget(properties,n) + if pn then + if p then + local d = getfield(p,"post") + if d then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) -- type 0/2 + end + local d = getfield(p,"replace") + if d then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + local t = find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end end else - if x ~= 0 then - insert_node_before(head,n,newkern(x)) -- type 0/2 + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + setfield(p,"replace",newkern(leftkern)) + end + -- local rightkern = i.rightkern + -- if rightkern and rightkern ~= 0 then + -- insert_node_after(head,n,newkern(rightkern)) + -- n = getnext(n) -- to be checked + -- end end - if wx ~= 0 then - insert_node_after (head,n,newkern(wx)) -- type 0/2 + end + else + -- this is the most common case + local i = rawget(pn,"injections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + insert_node_before(head,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked end end - elseif x ~= 0 then - -- this needs checking for rl < 0 but it is unlikely that a r2l script - -- uses kernclasses between glyphs so we're probably safe (KE has a - -- problematic font where marks interfere with rl < 0 in the previous - -- case) - insert_node_before(head,n,newkern(x)) -- a real font kern, type 0 end end + else + break end - if next(cx) then - for n, k in next, cx do - if k ~= 0 then - local rln = rl[n] - if rln and rln < 0 then - insert_node_before(head,n,newkern(-k)) -- type 0/2 - else - insert_node_before(head,n,newkern(k)) -- type 0/2 + p = nil + elseif id == disc_code then + local d = getfield(n,"pre") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(p,"preinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end + end end + else + break end end + if h ~= d then + setfield(n,"pre",h) + end end - if not keep then - kerns = { } - end - -- if trace_injections then - -- show_result(head) - -- end - return head, true - elseif not keep then - kerns, cursives, marks = { }, { }, { } - end - elseif has_kerns then - if trace_injections then - trace(head) - end - for n in traverse_id(glyph_code,head) do - if n.subtype < 256 then - local k = n[a_kernpair] - if k then - local kk = kerns[k] - if kk then - local rl, x, y, w = kk[1], kk[2] or 0, kk[3], kk[4] - if y and y ~= 0 then - n.yoffset = y -- todo: h ? - end - if w then - -- copied from above - -- local r2l = kk[6] - local wx = w - x - if rl < 0 then -- KE: don't use r2l here - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) + local d = getfield(n,"post") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(p,"postinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) end - else - if x ~= 0 then - insert_node_before(head,n,newkern(x)) - end - if wx ~= 0 then - insert_node_after(head,n,newkern(wx)) + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked end end - else - -- simple (e.g. kernclass kerns) - if x ~= 0 then - insert_node_before(head,n,newkern(x)) + end + else + break + end + end + if h ~= d then + setfield(n,"post",h) + end + end + local d = getfield(n,"replace") + if d then + local h = d + for n in traverse_id(glyph_code,d) do + if getsubtype(n) < 256 then + local p = rawget(properties,n) + if p then + local i = rawget(pn,"replaceinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end end end + else + break end end + if h ~= d then + setfield(n,"replace",h) + end end + p = n + else + p = nil end - if not keep then - kerns = { } - end - -- if trace_injections then - -- show_result(head) - -- end - return head, true + n = getnext(n) + end + -- + if keepregisteredcounts then + keepregisteredcounts = false + else + nofregisteredpairs = 0 + nofregisteredkerns = 0 + end + return tonode(head), true +end + +function injections.handler(head,where) -- optimize for n=1 ? + if nofregisteredmarks > 0 or nofregisteredcursives > 0 then + return inject_everything(head,where) + elseif nofregisteredpairs > 0 then + return inject_pairs_only(head,where) + elseif nofregisteredkerns > 0 then + return inject_kerns_only(head,where) else - -- no tracing needed + return head, false end - return head, false end diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua index a0122fbe937..1d6509ae4e4 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 05/21/14 22:04:03 +-- merge date : 04/18/15 14:41:50 do -- begin closure to overcome local limits and interference @@ -85,6 +85,13 @@ end if lua then lua.mask=load([[τεχ = 1]]) and "utf" or "ascii" end +local flush=io.flush +if flush then + local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end + local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end + local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end + local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end +end end -- closure @@ -149,6 +156,8 @@ patterns.utfbom_16_le=utfbom_16_le patterns.utfbom_8=utfbom_8 patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n") patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000") +patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n") +patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000") patterns.utf8one=R("\000\127") patterns.utf8two=R("\194\223")*utf8next patterns.utf8three=R("\224\239")*utf8next*utf8next @@ -178,9 +187,21 @@ patterns.nonwhitespace=nonwhitespace local stripper=spacer^0*C((spacer^0*nonspacer^1)^0) local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0) local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0)) +local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0) +local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0) +local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0) +local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0) +local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0) +local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0) patterns.stripper=stripper patterns.fullstripper=fullstripper patterns.collapser=collapser +patterns.b_collapser=b_collapser +patterns.m_collapser=m_collapser +patterns.e_collapser=e_collapser +patterns.b_stripper=b_stripper +patterns.m_stripper=m_stripper +patterns.e_stripper=e_stripper patterns.lowercase=lowercase patterns.uppercase=uppercase patterns.letter=patterns.lowercase+patterns.uppercase @@ -217,9 +238,12 @@ patterns.integer=sign^-1*digit^1 patterns.unsigned=digit^0*period*digit^1 patterns.float=sign^-1*patterns.unsigned patterns.cunsigned=digit^0*comma*digit^1 +patterns.cpunsigned=digit^0*(period+comma)*digit^1 patterns.cfloat=sign^-1*patterns.cunsigned +patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer +patterns.cpnumber=patterns.cpfloat+patterns.integer patterns.oct=zero*octdigit^1 patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 @@ -636,23 +660,40 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t) - local p + local function making(t) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then + local v=t[k] + if v==true then + p=p+P(k)*p_true + elseif v==false then + else + p=p+P(k)*making(v) + end + end + end + if t[""] then + p=p+p_true + end + return p + end + local p=p_false local keys=sortedkeys(t) for i=1,#keys do local k=keys[i] - local v=t[k] - if not p then - if next(v) then - p=P(k)*make(v) - else - p=P(k) - end - else - if next(v) then - p=p+P(k)*make(v) + if k~="" then + local v=t[k] + if v==true then + p=p+P(k)*p_true + elseif v==false then else - p=p+P(k) + p=p+P(k)*making(v) end end end @@ -660,13 +701,73 @@ local function make(t) end function lpeg.utfchartabletopattern(list) local tree={} - for i=1,#list do - local t=tree - for c in gmatch(list[i],".") do - if not t[c] then - t[c]={} + local n=#list + if n==0 then + for s in next,list do + local t=tree + local p,pk + for c in gmatch(s,".") do + if t==true then + t={ [c]=true,[""]=true } + p[pk]=t + p=t + t=false + elseif t==false then + t={ [c]=false } + p[pk]=t + p=t + t=false + else + local tc=t[c] + if not tc then + tc=false + t[c]=false + end + p=t + t=tc + end + pk=c + end + if t==false then + p[pk]=true + elseif t==true then + else + t[""]=true + end + end + else + for i=1,n do + local s=list[i] + local t=tree + local p,pk + for c in gmatch(s,".") do + if t==true then + t={ [c]=true,[""]=true } + p[pk]=t + p=t + t=false + elseif t==false then + t={ [c]=false } + p[pk]=t + p=t + t=false + else + local tc=t[c] + if not tc then + tc=false + t[c]=false + end + p=t + t=tc + end + pk=c + end + if t==false then + p[pk]=true + elseif t==true then + else + t[""]=true end - t=t[c] end end return make(tree) @@ -706,6 +807,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") local number=digit^1*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper +local byte_to_HEX={} +local byte_to_hex={} +local byte_to_dec={} +local hex_to_byte={} +for i=0,255 do + local H=format("%02X",i) + local h=format("%02x",i) + local d=format("%03i",i) + local c=char(i) + byte_to_HEX[c]=H + byte_to_hex[c]=h + byte_to_dec[c]=d + hex_to_byte[h]=c + hex_to_byte[H]=c +end +local hextobyte=P(2)/hex_to_byte +local bytetoHEX=P(1)/byte_to_HEX +local bytetohex=P(1)/byte_to_hex +local bytetodec=P(1)/byte_to_dec +local hextobytes=Cs(hextobyte^0) +local bytestoHEX=Cs(bytetoHEX^0) +local bytestohex=Cs(bytetohex^0) +local bytestodec=Cs(bytetodec^0) +patterns.hextobyte=hextobyte +patterns.bytetoHEX=bytetoHEX +patterns.bytetohex=bytetohex +patterns.bytetodec=bytetodec +patterns.hextobytes=hextobytes +patterns.bytestoHEX=bytestoHEX +patterns.bytestohex=bytestohex +patterns.bytestodec=bytestodec +function string.toHEX(s) + if not s or s=="" then + return s + else + return lpegmatch(bytestoHEX,s) + end +end +function string.tohex(s) + if not s or s=="" then + return s + else + return lpegmatch(bytestohex,s) + end +end +function string.todec(s) + if not s or s=="" then + return s + else + return lpegmatch(bytestodec,s) + end +end +function string.tobytes(s) + if not s or s=="" then + return s + else + return lpegmatch(hextobytes,s) + end +end end -- closure @@ -866,11 +1026,12 @@ function table.keys(t) end end local function compare(a,b) - local ta,tb=type(a),type(b) - if ta==tb then + local ta=type(a) + local tb=type(b) + if ta==tb and ta=="number" then return a=first and k<=last then if tv=="number" then if hexify then - handle(format("%s 0x%04X,",depth,v)) + handle(format("%s 0x%X,",depth,v)) else handle(format("%s %s,",depth,v)) end @@ -1223,7 +1384,7 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s %q,",depth,v)) end elseif tv=="table" then - if not next(v) then + if next(v)==nil then handle(format("%s {},",depth)) elseif inline then local st=simple_table(v) @@ -1253,25 +1414,25 @@ local function do_serialize(root,name,depth,level,indexed) elseif tv=="number" then if tk=="number" then if hexify then - handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) + handle(format("%s [0x%X]=0x%X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end elseif tk=="boolean" then if hexify then - handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v)) + handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v)) else handle(format("%s [%s]=%s,",depth,k and "true" or "false",v)) end elseif noquotes and not reserved[k] and lpegmatch(propername,k) then if hexify then - handle(format("%s %s=0x%04X,",depth,k,v)) + handle(format("%s %s=0x%X,",depth,k,v)) else handle(format("%s %s=%s,",depth,k,v)) end else if hexify then - handle(format("%s [%q]=0x%04X,",depth,k,v)) + handle(format("%s [%q]=0x%X,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end @@ -1280,7 +1441,7 @@ local function do_serialize(root,name,depth,level,indexed) if reduce and tonumber(v) then if tk=="number" then if hexify then - handle(format("%s [0x%04X]=%s,",depth,k,v)) + handle(format("%s [0x%X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end @@ -1294,7 +1455,7 @@ local function do_serialize(root,name,depth,level,indexed) else if tk=="number" then if hexify then - handle(format("%s [0x%04X]=%q,",depth,k,v)) + handle(format("%s [0x%X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end @@ -1307,10 +1468,10 @@ local function do_serialize(root,name,depth,level,indexed) end end elseif tv=="table" then - if not next(v) then + if next(v)==nil then if tk=="number" then if hexify then - handle(format("%s [0x%04X]={},",depth,k)) + handle(format("%s [0x%X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end @@ -1326,7 +1487,7 @@ local function do_serialize(root,name,depth,level,indexed) if st then if tk=="number" then if hexify then - handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) + handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end @@ -1346,7 +1507,7 @@ local function do_serialize(root,name,depth,level,indexed) elseif tv=="boolean" then if tk=="number" then if hexify then - handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false")) + handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false")) else handle(format("%s [%s]=%s,",depth,k,v and "true" or "false")) end @@ -1362,7 +1523,7 @@ local function do_serialize(root,name,depth,level,indexed) local f=getinfo(v).what=="C" and dump(dummy) or dump(v) if tk=="number" then if hexify then - handle(format("%s [0x%04X]=load(%q),",depth,k,f)) + handle(format("%s [0x%X]=load(%q),",depth,k,f)) else handle(format("%s [%s]=load(%q),",depth,k,f)) end @@ -1377,7 +1538,7 @@ local function do_serialize(root,name,depth,level,indexed) else if tk=="number" then if hexify then - handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) + handle(format("%s [0x%X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end @@ -1431,7 +1592,7 @@ local function serialize(_handle,root,name,specification) end elseif tname=="number" then if hexify then - handle(format("[0x%04X]={",name)) + handle(format("[0x%X]={",name)) else handle("["..name.."]={") end @@ -1449,7 +1610,7 @@ local function serialize(_handle,root,name,specification) local dummy=root._w_h_a_t_e_v_e_r_ root._w_h_a_t_e_v_e_r_=nil end - if next(root) then + if next(root)~=nil then do_serialize(root,name,"",0) end end @@ -1578,14 +1739,25 @@ local function identical(a,b) end table.identical=identical table.are_equal=are_equal -function table.compact(t) - if t then - for k,v in next,t do - if not next(v) then - t[k]=nil +local function sparse(old,nest,keeptables) + local new={} + for k,v in next,old do + if not (v=="" or v==false) then + if nest and type(v)=="table" then + v=sparse(v,nest) + if keeptables or next(v)~=nil then + new[k]=v + end + else + new[k]=v end end end + return new +end +table.sparse=sparse +function table.compact(t) + return sparse(t,true,true) end function table.contains(t,v) if t then @@ -1690,10 +1862,10 @@ function table.sub(t,i,j) return { unpack(t,i,j) } end function table.is_empty(t) - return not t or not next(t) + return not t or next(t)==nil end function table.has_one_entry(t) - return t and not next(t,next(t)) + return t and next(t,next(t))==nil end function table.loweredkeys(t) local l={} @@ -1738,6 +1910,44 @@ function table.values(t,s) return {} end end +function table.filtered(t,pattern,sort,cmp) + if t and type(pattern)=="string" then + if sort then + local s + if cmp then + s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end) + else + s=sortedkeys(t) + end + local n=0 + local m=#s + local function kv(s) + while n -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n) + return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n) else - return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n) + return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n) end end local format_g=function(f) @@ -3084,7 +3286,6 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") -+V("*") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -3128,6 +3329,7 @@ local builder=Cs { "start", ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, + ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, } local direct=Cs ( @@ -3202,6 +3404,15 @@ else add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape }) add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape }) end +local dquote=patterns.dquote +local equote=patterns.escaped+dquote/'\\"'+1 +local space=patterns.space +local cquote=Cc('"') +local pattern=Cs(dquote*(equote-P(-2))^0*dquote) ++Cs(cquote*(equote-space)^0*space*equote^0*cquote) +function string.optionalquoted(str) + return lpegmatch(pattern,str) or str +end end -- closure @@ -3221,8 +3432,13 @@ end local dummyfunction=function() end local dummyreporter=function(c) - return function(...) - (texio.reporter or texio.write_nl)(c.." : "..string.formatters(...)) + return function(f,...) + local r=texio.reporter or texio.write_nl + if f then + r(c.." : "..string.formatters(f,...)) + else + r("") + end end end statistics={ @@ -3462,7 +3678,12 @@ function caches.compile(data,luaname,lucname) end end function table.setmetatableindex(t,f) + if type(t)~="table" then + f=f or t + t={} + end setmetatable(t,{ __index=f }) + return t end arguments={} if arg then @@ -3673,21 +3894,12 @@ function nodes.pool.kern(k) n.kern=k return n end -local getfield=node.getfield or function(n,tag) return n[tag] end -local setfield=node.setfield or function(n,tag,value) n[tag]=value end +local getfield=node.getfield +local setfield=node.setfield nodes.getfield=getfield nodes.setfield=setfield nodes.getattr=getfield nodes.setattr=setfield -if node.getid then nodes.getid=node.getid else function nodes.getid (n) return getfield(n,"id") end end -if node.getsubtype then nodes.getsubtype=node.getsubtype else function nodes.getsubtype(n) return getfield(n,"subtype") end end -if node.getnext then nodes.getnext=node.getnext else function nodes.getnext (n) return getfield(n,"next") end end -if node.getprev then nodes.getprev=node.getprev else function nodes.getprev (n) return getfield(n,"prev") end end -if node.getchar then nodes.getchar=node.getchar else function nodes.getchar (n) return getfield(n,"char") end end -if node.getfont then nodes.getfont=node.getfont else function nodes.getfont (n) return getfield(n,"font") end end -if node.getlist then nodes.getlist=node.getlist else function nodes.getlist (n) return getfield(n,"list") end end -function nodes.tonut (n) return n end -function nodes.tonode(n) return n end nodes.tostring=node.tostring or tostring nodes.copy=node.copy nodes.copy_list=node.copy_list @@ -3721,10 +3933,73 @@ nodes.set_attribute=node.set_attribute nodes.unset_attribute=node.unset_attribute nodes.protect_glyphs=node.protect_glyphs nodes.unprotect_glyphs=node.unprotect_glyphs -nodes.kerning=node.kerning -nodes.ligaturing=node.ligaturing nodes.mlist_to_hlist=node.mlist_to_hlist -nodes.nuts=nodes +local direct=node.direct +local nuts={} +nodes.nuts=nuts +local tonode=direct.tonode +local tonut=direct.todirect +nodes.tonode=tonode +nodes.tonut=tonut +nuts.tonode=tonode +nuts.tonut=tonut +local getfield=direct.getfield +local setfield=direct.setfield +nuts.getfield=getfield +nuts.setfield=setfield +nuts.getnext=direct.getnext +nuts.getprev=direct.getprev +nuts.getid=direct.getid +nuts.getattr=getfield +nuts.setattr=setfield +nuts.getfont=direct.getfont +nuts.getsubtype=direct.getsubtype +nuts.getchar=direct.getchar +nuts.insert_before=direct.insert_before +nuts.insert_after=direct.insert_after +nuts.delete=direct.delete +nuts.copy=direct.copy +nuts.copy_list=direct.copy_list +nuts.tail=direct.tail +nuts.flush_list=direct.flush_list +nuts.free=direct.free +nuts.remove=direct.remove +nuts.is_node=direct.is_node +nuts.end_of_math=direct.end_of_math +nuts.traverse=direct.traverse +nuts.traverse_id=direct.traverse_id +nuts.getprop=nuts.getattr +nuts.setprop=nuts.setattr +local new_nut=direct.new +nuts.new=new_nut +nuts.pool={} +function nuts.pool.kern(k) + local n=new_nut("kern",1) + setfield(n,"kern",k) + return n +end +local propertydata=direct.get_properties_table() +nodes.properties={ data=propertydata } +direct.set_properties_mode(true,true) +function direct.set_properties_mode() end +nuts.getprop=function(n,k) + local p=propertydata[n] + if p then + return p[k] + end +end +nuts.setprop=function(n,k,v) + if v then + local p=propertydata[n] + if p then + p[k]=v + else + propertydata[n]={ [k]=v } + end + end +end +nodes.setprop=nodes.setproperty +nodes.getprop=nodes.getproperty end -- closure @@ -3750,7 +4025,7 @@ fonts.analyzers={} fonts.readers={} fonts.definers={ methods={} } fonts.loggers={ register=function() end } -fontloader.totable=fontloader.to_table +fontloader.totable=fontloader.to_table end -- closure @@ -3783,7 +4058,8 @@ constructors.autocleanup=true constructors.namemode="fullpath" constructors.version=1.01 constructors.cache=containers.define("fonts","constructors",constructors.version,false) -constructors.privateoffset=0xF0000 +constructors.privateoffset=0xF0000 +constructors.cacheintex=true constructors.keys={ properties={ encodingbytes="number", @@ -4036,7 +4312,7 @@ function constructors.scale(tfmdata,specification) targetparameters.textsize=textsize targetparameters.forcedsize=forcedsize targetparameters.extrafactor=extrafactor - local tounicode=resources.tounicode + local tounicode=fonts.mappings.tounicode local defaultwidth=resources.defaultwidth or 0 local defaultheight=resources.defaultheight or 0 local defaultdepth=resources.defaultdepth or 0 @@ -4062,6 +4338,7 @@ function constructors.scale(tfmdata,specification) target.tounicode=1 target.cidinfo=properties.cidinfo target.format=properties.format + target.cache=constructors.cacheintex and "yes" or "renew" local fontname=properties.fontname or tfmdata.fontname local fullname=properties.fullname or tfmdata.fullname local filename=properties.filename or tfmdata.filename @@ -4116,7 +4393,9 @@ function constructors.scale(tfmdata,specification) local autoitalicamount=properties.autoitalicamount local stackmath=not properties.nostackmath local nonames=properties.noglyphnames - local nodemode=properties.mode=="node" + local haskerns=properties.haskerns or properties.mode=="base" + local hasligatures=properties.hasligatures or properties.mode=="base" + local realdimensions=properties.realdimensions if changed and not next(changed) then changed=false end @@ -4179,42 +4458,44 @@ function constructors.scale(tfmdata,specification) constructors.beforecopyingcharacters(target,tfmdata) local sharedkerns={} for unicode,character in next,characters do - local chr,description,index,touni + local chr,description,index if changed then local c=changed[unicode] if c then - local ligatures=character.ligatures description=descriptions[c] or descriptions[unicode] or character character=characters[c] or character index=description.index or c - if tounicode then - touni=tounicode[index] - if not touni then - local d=descriptions[unicode] or characters[unicode] - local i=d.index or unicode - touni=tounicode[i] - end - end - if ligatures and not character.ligatures then - character.ligatures=ligatures - end else description=descriptions[unicode] or character index=description.index or unicode - if tounicode then - touni=tounicode[index] - end end else description=descriptions[unicode] or character index=description.index or unicode - if tounicode then - touni=tounicode[index] - end end local width=description.width local height=description.height local depth=description.depth + if realdimensions then + if not height or height==0 then + local bb=description.boundingbox + local ht=bb[4] + if ht~=0 then + height=ht + end + if not depth or depth==0 then + local dp=-bb[2] + if dp~=0 then + depth=dp + end + end + elseif not depth or depth==0 then + local dp=-description.boundingbox[2] + if dp~=0 then + depth=dp + end + end + end if width then width=hdelta*width else width=scaledwidth end if height then height=vdelta*height else height=scaledheight end if depth and depth~=0 then @@ -4251,8 +4532,10 @@ function constructors.scale(tfmdata,specification) } end end - if touni then - chr.tounicode=touni + local isunicode=description.unicode + if isunicode then + chr.unicode=isunicode + chr.tounicode=tounicode(isunicode) end if hasquality then local ve=character.expansion_factor @@ -4345,7 +4628,7 @@ function constructors.scale(tfmdata,specification) end end end - if not nodemode then + if haskerns then local vk=character.kerns if vk then local s=sharedkerns[vk] @@ -4356,6 +4639,8 @@ function constructors.scale(tfmdata,specification) end chr.kerns=s end + end + if hasligatures then local vl=character.ligatures if vl then if true then @@ -4512,6 +4797,7 @@ function constructors.finalize(tfmdata) tfmdata.extend=nil tfmdata.slant=nil tfmdata.units_per_em=nil + tfmdata.cache=nil properties.finalized=true return tfmdata end @@ -4856,6 +5142,16 @@ function constructors.applymanipulators(what,tfmdata,features,trace,report) end end end +function constructors.addcoreunicodes(unicodes) + if not unicodes then + unicodes={} + end + unicodes.space=0x0020 + unicodes.hyphen=0x002D + unicodes.zwj=0x200D + unicodes.zwnj=0x200C + return unicodes +end end -- closure @@ -4947,7 +5243,7 @@ local function loadcidfile(filename) ordering=ordering, filename=filename, unicodes=unicodes, - names=names + names=names, } end end @@ -4984,10 +5280,23 @@ function cid.getmap(specification) local ordering=specification.ordering local supplement=specification.supplement local filename=format(registry,ordering,supplement) - local found=cidmap[lower(filename)] + local lowername=lower(filename) + local found=cidmap[lowername] if found then return found end + if ordering=="Identity" then + local found={ + supplement=supplement, + registry=registry, + ordering=ordering, + filename=filename, + unicodes={}, + names={}, + } + cidmap[lowername]=found + return found + end if trace_loading then report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement) end @@ -5038,17 +5347,19 @@ if not modules then modules={} end modules ['font-map']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local tonumber=tonumber +local tonumber,next,type=tonumber,next,type local match,format,find,concat,gsub,lower=string.match,string.format,string.find,table.concat,string.gsub,string.lower local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match local utfbyte=utf.byte local floor=math.floor +local formatters=string.formatters local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end) local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_unimapping=v end) local report_fonts=logs.reporter("fonts","loading") local fonts=fonts or {} local mappings=fonts.mappings or {} fonts.mappings=mappings +local allocate=utilities.storage.allocate local function loadlumtable(filename) local lumname=file.replacesuffix(file.basename(filename),"lum") local lumfile=resolvers.findfile(lumname,"map") or "" @@ -5082,11 +5393,13 @@ local function makenameparser(str) return p end end +local f_single=formatters["%04X"] +local f_double=formatters["%04X%04X"] local function tounicode16(unicode,name) if unicode<0x10000 then - return format("%04X",unicode) + return f_single(unicode) elseif unicode<0x1FFFFFFFFF then - return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) + return f_double(floor(unicode/1024),unicode%1024+0xDC00) else report_fonts("can't convert %a in %a into tounicode",unicode,name) end @@ -5094,17 +5407,43 @@ end local function tounicode16sequence(unicodes,name) local t={} for l=1,#unicodes do - local unicode=unicodes[l] - if unicode<0x10000 then - t[l]=format("%04X",unicode) + local u=unicodes[l] + if u<0x10000 then + t[l]=f_single(u) elseif unicode<0x1FFFFFFFFF then - t[l]=format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) + t[l]=f_double(floor(u/1024),u%1024+0xDC00) else - report_fonts ("can't convert %a in %a into tounicode",unicode,name) + report_fonts ("can't convert %a in %a into tounicode",u,name) + return end end return concat(t) end +local function tounicode(unicode,name) + if type(unicode)=="table" then + local t={} + for l=1,#unicode do + local u=unicode[l] + if u<0x10000 then + t[l]=f_single(u) + elseif u<0x1FFFFFFFFF then + t[l]=f_double(floor(u/1024),u%1024+0xDC00) + else + report_fonts ("can't convert %a in %a into tounicode",u,name) + return + end + end + return concat(t) + else + if unicode<0x10000 then + return f_single(unicode) + elseif unicode<0x1FFFFFFFFF then + return f_double(floor(unicode/1024),unicode%1024+0xDC00) + else + report_fonts("can't convert %a in %a into tounicode",unicode,name) + end + end +end local function fromunicode16(str) if #str==4 then return tonumber(str,16) @@ -5115,17 +5454,41 @@ local function fromunicode16(str) end mappings.loadlumtable=loadlumtable mappings.makenameparser=makenameparser +mappings.tounicode=tounicode mappings.tounicode16=tounicode16 mappings.tounicode16sequence=tounicode16sequence mappings.fromunicode16=fromunicode16 local ligseparator=P("_") local varseparator=P(".") local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0) +local overloads=allocate { + IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 }, + ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 }, + ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 }, + fi={ name="f_i",unicode={ 0x66,0x69 },mess=0xFB01 }, + fl={ name="f_l",unicode={ 0x66,0x6C },mess=0xFB02 }, + ffi={ name="f_f_i",unicode={ 0x66,0x66,0x69 },mess=0xFB03 }, + ffl={ name="f_f_l",unicode={ 0x66,0x66,0x6C },mess=0xFB04 }, + fj={ name="f_j",unicode={ 0x66,0x6A } }, + fk={ name="f_k",unicode={ 0x66,0x6B } }, +} +for k,v in next,overloads do + local name=v.name + local mess=v.mess + if name then + overloads[name]=v + end + if mess then + overloads[mess]=v + end +end +mappings.overloads=overloads function mappings.addtounicode(data,filename) local resources=data.resources local properties=data.properties local descriptions=data.descriptions local unicodes=resources.unicodes + local lookuptypes=resources.lookuptypes if not unicodes then return end @@ -5134,18 +5497,10 @@ function mappings.addtounicode(data,filename) unicodes['zwj']=unicodes['zwj'] or 0x200D unicodes['zwnj']=unicodes['zwnj'] or 0x200C local private=fonts.constructors.privateoffset - local unknown=format("%04X",utfbyte("?")) - local unicodevector=fonts.encodings.agl.unicodes - local tounicode={} - local originals={} - resources.tounicode=tounicode - resources.originals=originals + local unicodevector=fonts.encodings.agl.unicodes + local missing={} local lumunic,uparser,oparser local cidinfo,cidnames,cidcodes,usedmap - if false then - lumunic=loadlumtable(filename) - lumunic=lumunic and lumunic.tounicode - end cidinfo=properties.cidinfo usedmap=cidinfo and fonts.cid.getmap(cidinfo) if usedmap then @@ -5158,11 +5513,13 @@ function mappings.addtounicode(data,filename) for unic,glyph in next,descriptions do local index=glyph.index local name=glyph.name - if unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then + local r=overloads[name] + if r then + glyph.unicode=r.unicode + elseif unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then local unicode=lumunic and lumunic[name] or unicodevector[name] if unicode then - originals[index]=unicode - tounicode[index]=tounicode16(unicode,name) + glyph.unicode=unicode ns=ns+1 end if (not unicode) and usedmap then @@ -5170,8 +5527,7 @@ function mappings.addtounicode(data,filename) if foundindex then unicode=cidcodes[foundindex] if unicode then - originals[index]=unicode - tounicode[index]=tounicode16(unicode,name) + glyph.unicode=unicode ns=ns+1 else local reference=cidnames[foundindex] @@ -5180,21 +5536,18 @@ function mappings.addtounicode(data,filename) if foundindex then unicode=cidcodes[foundindex] if unicode then - originals[index]=unicode - tounicode[index]=tounicode16(unicode,name) + glyph.unicode=unicode ns=ns+1 end end if not unicode or unicode=="" then local foundcodes,multiple=lpegmatch(uparser,reference) if foundcodes then - originals[index]=foundcodes + glyph.unicode=foundcodes if multiple then - tounicode[index]=tounicode16sequence(foundcodes) nl=nl+1 unicode=true else - tounicode[index]=tounicode16(foundcodes,name) ns=ns+1 unicode=foundcodes end @@ -5232,39 +5585,157 @@ function mappings.addtounicode(data,filename) end if n==0 then elseif n==1 then - originals[index]=t[1] - tounicode[index]=tounicode16(t[1],name) + glyph.unicode=t[1] else - originals[index]=t - tounicode[index]=tounicode16sequence(t) + glyph.unicode=t end nl=nl+1 end if not unicode or unicode=="" then local foundcodes,multiple=lpegmatch(uparser,name) if foundcodes then + glyph.unicode=foundcodes if multiple then - originals[index]=foundcodes - tounicode[index]=tounicode16sequence(foundcodes,name) nl=nl+1 unicode=true else - originals[index]=foundcodes - tounicode[index]=tounicode16(foundcodes,name) ns=ns+1 unicode=foundcodes end end end + local r=overloads[unicode] + if r then + unicode=r.unicode + glyph.unicode=unicode + end + if not unicode then + missing[name]=true + end + end + end + if next(missing) then + local guess={} + local function check(gname,code,unicode) + local description=descriptions[code] + local variant=description.name + if variant==gname then + return + end + local unic=unicodes[variant] + if unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then + else + return + end + if descriptions[code].unicode then + return + end + local g=guess[variant] + if g then + g[gname]=unicode + else + guess[variant]={ [gname]=unicode } + end + end + for unicode,description in next,descriptions do + local slookups=description.slookups + if slookups then + local gname=description.name + for tag,data in next,slookups do + local lookuptype=lookuptypes[tag] + if lookuptype=="alternate" then + for i=1,#data do + check(gname,data[i],unicode) + end + elseif lookuptype=="substitution" then + check(gname,data,unicode) + end + end + end + local mlookups=description.mlookups + if mlookups then + local gname=description.name + for tag,list in next,mlookups do + local lookuptype=lookuptypes[tag] + if lookuptype=="alternate" then + for i=1,#list do + local data=list[i] + for i=1,#data do + check(gname,data[i],unicode) + end + end + elseif lookuptype=="substitution" then + for i=1,#list do + check(gname,list[i],unicode) + end + end + end + end + end + local done=true + while done do + done=false + for k,v in next,guess do + if type(v)~="number" then + for kk,vv in next,v do + if vv==-1 or vv>=private or (vv>=0xE000 and vv<=0xF8FF) or vv==0xFFFE or vv==0xFFFF then + local uu=guess[kk] + if type(uu)=="number" then + guess[k]=uu + done=true + end + else + guess[k]=vv + done=true + end + end + end + end + end + local orphans=0 + local guessed=0 + for k,v in next,guess do + if type(v)=="number" then + descriptions[unicodes[k]].unicode=descriptions[v].unicode or v + guessed=guessed+1 + else + local t=nil + local l=lower(k) + local u=unicodes[l] + if not u then + orphans=orphans+1 + elseif u==-1 or u>=private or (u>=0xE000 and u<=0xF8FF) or u==0xFFFE or u==0xFFFF then + local unicode=descriptions[u].unicode + if unicode then + descriptions[unicodes[k]].unicode=unicode + guessed=guessed+1 + else + orphans=orphans+1 + end + else + orphans=orphans+1 + end + end + end + if trace_loading and orphans>0 or guessed>0 then + report_fonts("%s glyphs with no related unicode, %s guessed, %s orphans",guessed+orphans,guessed,orphans) end end if trace_mapping then for unic,glyph in table.sortedhash(descriptions) do local name=glyph.name local index=glyph.index - local toun=tounicode[index] - if toun then - report_fonts("internal slot %U, name %a, unicode %U, tounicode %a",index,name,unic,toun) + local unicode=glyph.unicode + if unicode then + if type(unicode)=="table" then + local unicodes={} + for i=1,#unicode do + unicodes[i]=formatters("%U",unicode[i]) + end + report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,unic,unicodes) + else + report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,unic,unicode) + end else report_fonts("internal slot %U, name %a, unicode %U",index,name,unic) end @@ -5406,14 +5877,15 @@ local function read_from_tfm(specification) properties.fontname=tfmdata.fontname properties.psname=tfmdata.psname properties.filename=specification.filename + properties.format=fonts.formats.tfm parameters.size=size - shared.rawdata={} - shared.features=features - shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil tfmdata.properties=properties tfmdata.resources=resources tfmdata.parameters=parameters tfmdata.shared=shared + shared.rawdata={} + shared.features=features + shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil parameters.slant=parameters.slant or parameters[1] or 0 parameters.space=parameters.space or parameters[2] or 0 parameters.space_stretch=parameters.space_stretch or parameters[3] or 0 @@ -5445,6 +5917,10 @@ local function read_from_tfm(specification) features.encoding=encoding end end + properties.haskerns=true + properties.haslogatures=true + resources.unicodes={} + resources.lookuptags={} return tfmdata end end @@ -5500,15 +5976,20 @@ local trace_indexing=false trackers.register("afm.indexing",function(v) trace_in local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end) local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end) local report_afm=logs.reporter("fonts","afm loading") +local setmetatableindex=table.setmetatableindex local findbinfile=resolvers.findbinfile local definers=fonts.definers local readers=fonts.readers local constructors=fonts.constructors +local fontloader=fontloader +local font_to_table=fontloader.to_table +local open_font=fontloader.open +local close_font=fontloader.close local afm=constructors.newhandler("afm") local pfb=constructors.newhandler("pfb") local afmfeatures=constructors.newfeatures("afm") local registerafmfeature=afmfeatures.register -afm.version=1.410 +afm.version=1.500 afm.cache=containers.define("fonts","afm",afm.version,true) afm.autoprefixed=true afm.helpdata={} @@ -5516,6 +5997,7 @@ afm.syncspace=true afm.addligatures=true afm.addtexligatures=true afm.addkerns=true +local overloads=fonts.mappings.overloads local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes local function setmode(tfmdata,value) if value then @@ -5618,10 +6100,10 @@ local function get_variables(data,fontmetrics) end local function get_indexes(data,pfbname) data.resources.filename=resolvers.unresolve(pfbname) - local pfbblob=fontloader.open(pfbname) + local pfbblob=open_font(pfbname) if pfbblob then local characters=data.characters - local pfbdata=fontloader.to_table(pfbblob) + local pfbdata=font_to_table(pfbblob) if pfbdata then local glyphs=pfbdata.glyphs if glyphs then @@ -5646,7 +6128,7 @@ local function get_indexes(data,pfbname) elseif trace_loading then report_afm("no data in pfb file %a",pfbname) end - fontloader.close(pfbblob) + close_font(pfbblob) elseif trace_loading then report_afm("invalid pfb file %a",pfbname) end @@ -5703,7 +6185,7 @@ local function readafm(filename) return nil end end -local addkerns,addligatures,addtexligatures,unify,normalize +local addkerns,addligatures,addtexligatures,unify,normalize,fixnames function afm.load(filename) filename=resolvers.findfile(filename,'afm') or "" if filename~="" and not fonts.names.ignoredfile(filename) then @@ -5746,6 +6228,7 @@ function afm.load(filename) addkerns(data) end normalize(data) + fixnames(data) report_afm("add tounicode data") fonts.mappings.addtounicode(data,filename) data.size=size @@ -5753,6 +6236,7 @@ function afm.load(filename) data.pfbsize=pfbsize data.pfbtime=pfbtime report_afm("saving %a in cache",name) + data.resources.unicodes=nil data=containers.write(afm.cache,name,data) data=containers.read(afm.cache,name) end @@ -5812,18 +6296,30 @@ unify=function(data,filename) local filename=resources.filename or file.removesuffix(file.basename(filename)) resources.filename=resolvers.unresolve(filename) resources.unicodes=unicodes - resources.marks={} - resources.names=names + resources.marks={} resources.private=private end normalize=function(data) end +fixnames=function(data) + for k,v in next,data.descriptions do + local n=v.name + local r=overloads[n] + if r then + local name=r.name + if trace_indexing then + report_afm("renaming characters %a to %a",n,name) + end + v.name=name + v.unicode=r.unicode + end + end +end local addthem=function(rawdata,ligatures) if ligatures then local descriptions=rawdata.descriptions local resources=rawdata.resources local unicodes=resources.unicodes - local names=resources.names for ligname,ligdata in next,ligatures do local one=descriptions[unicodes[ligname]] if one then @@ -5956,8 +6452,8 @@ local function copytotfm(data) local filename=constructors.checkedfilename(resources) local fontname=metadata.fontname or metadata.fullname local fullname=metadata.fullname or metadata.fontname - local endash=unicodes['space'] - local emdash=unicodes['emdash'] + local endash=0x0020 + local emdash=0x2014 local spacer="space" local spaceunits=500 local monospaced=metadata.isfixedpitch @@ -6011,7 +6507,7 @@ local function copytotfm(data) if charxheight then parameters.x_height=charxheight else - local x=unicodes['x'] + local x=0x0078 if x then local x=descriptions[x] if x then @@ -6058,7 +6554,34 @@ function afm.setfeatures(tfmdata,features) return {} end end -local function checkfeatures(specification) +local function addtables(data) + local resources=data.resources + local lookuptags=resources.lookuptags + local unicodes=resources.unicodes + if not lookuptags then + lookuptags={} + resources.lookuptags=lookuptags + end + setmetatableindex(lookuptags,function(t,k) + local v=type(k)=="number" and ("lookup "..k) or k + t[k]=v + return v + end) + if not unicodes then + unicodes={} + resources.unicodes=unicodes + setmetatableindex(unicodes,function(t,k) + setmetatableindex(unicodes,nil) + for u,d in next,data.descriptions do + local n=d.name + if n then + t[n]=u + end + end + return rawget(t,k) + end) + end + constructors.addcoreunicodes(unicodes) end local function afmtotfm(specification) local afmname=specification.filename or specification.name @@ -6085,6 +6608,7 @@ local function afmtotfm(specification) if not tfmdata then local rawdata=afm.load(afmname) if rawdata and next(rawdata) then + addtables(rawdata) adddimensions(rawdata) tfmdata=copytotfm(rawdata) if tfmdata and next(tfmdata) then @@ -6119,6 +6643,7 @@ end local function prepareligatures(tfmdata,ligatures,value) if value then local descriptions=tfmdata.descriptions + local hasligatures=false for unicode,character in next,tfmdata.characters do local description=descriptions[unicode] local dligatures=description.ligatures @@ -6134,8 +6659,10 @@ local function prepareligatures(tfmdata,ligatures,value) type=0 } end + hasligatures=true end end + tfmdata.properties.hasligatures=hasligatures end end local function preparekerns(tfmdata,kerns,value) @@ -6144,6 +6671,7 @@ local function preparekerns(tfmdata,kerns,value) local resources=rawdata.resources local unicodes=resources.unicodes local descriptions=tfmdata.descriptions + local haskerns=false for u,chr in next,tfmdata.characters do local d=descriptions[u] local newkerns=d[kerns] @@ -6159,8 +6687,10 @@ local function preparekerns(tfmdata,kerns,value) kerns[uk]=v end end + haskerns=true end end + tfmdata.properties.haskerns=haskerns end end local list={ @@ -6590,6 +7120,8 @@ local reversed,concat,remove,sortedkeys=table.reversed,table.concat,table.remove local ioflush=io.flush local fastcopy,tohash,derivetable=table.fastcopy,table.tohash,table.derive local formatters=string.formatters +local P,R,S,C,Ct,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.match +local setmetatableindex=table.setmetatableindex local allocate=utilities.storage.allocate local registertracker=trackers.register local registerdirective=directives.register @@ -6604,26 +7136,28 @@ local trace_dynamics=false registertracker("otf.dynamics",function(v) trace_dyna local trace_sequences=false registertracker("otf.sequences",function(v) trace_sequences=v end) local trace_markwidth=false registertracker("otf.markwidth",function(v) trace_markwidth=v end) local trace_defining=false registertracker("fonts.defining",function(v) trace_defining=v end) +local compact_lookups=true registertracker("otf.compactlookups",function(v) compact_lookups=v end) +local purge_names=true registertracker("otf.purgenames",function(v) purge_names=v end) local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf otf.glists={ "gsub","gpos" } -otf.version=2.755 +otf.version=2.803 otf.cache=containers.define("fonts","otf",otf.version,true) -local fontdata=fonts.hashes.identifiers +local hashes=fonts.hashes +local definers=fonts.definers +local readers=fonts.readers +local constructors=fonts.constructors +local fontdata=hashes and hashes.identifiers local chardata=characters and characters.data -local otffeatures=fonts.constructors.newfeatures("otf") +local otffeatures=constructors.newfeatures("otf") local registerotffeature=otffeatures.register local enhancers=allocate() otf.enhancers=enhancers local patches={} enhancers.patches=patches -local definers=fonts.definers -local readers=fonts.readers -local constructors=fonts.constructors local forceload=false local cleanup=0 -local usemetatables=false local packdata=true local syncspace=true local forcenotdef=false @@ -6632,7 +7166,11 @@ local overloadkerns=false local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes local wildcard="*" local default="dflt" -local fontloaderfields=fontloader.fields +local fontloader=fontloader +local open_font=fontloader.open +local close_font=fontloader.close +local font_fields=fontloader.fields +local apply_featurefile=fontloader.apply_featurefile local mainfields=nil local glyphfields=nil local formats=fonts.formats @@ -6642,7 +7180,6 @@ formats.ttc="truetype" formats.dfont="truetype" registerdirective("fonts.otf.loader.cleanup",function(v) cleanup=tonumber(v) or (v and 1) or 0 end) registerdirective("fonts.otf.loader.force",function(v) forceload=v end) -registerdirective("fonts.otf.loader.usemetatables",function(v) usemetatables=v end) registerdirective("fonts.otf.loader.pack",function(v) packdata=v end) registerdirective("fonts.otf.loader.syncspace",function(v) syncspace=v end) registerdirective("fonts.otf.loader.forcenotdef",function(v) forcenotdef=v end) @@ -6674,7 +7211,7 @@ local function load_featurefile(raw,featurefile) if trace_loading then report_otf("using featurefile %a",featurefile) end - fontloader.apply_featurefile(raw,featurefile) + apply_featurefile(raw,featurefile) end end local function showfeatureorder(rawdata,filename) @@ -6734,7 +7271,6 @@ local valid_fields=table.tohash { "extrema_bound", "familyname", "fontname", - "fontname", "fontstyle_id", "fontstyle_name", "fullname", @@ -6772,7 +7308,6 @@ local ordered_enhancers={ "prepare lookups", "analyze glyphs", "analyze math", - "prepare tounicode", "reorganize lookups", "reorganize mark classes", "reorganize anchor classes", @@ -6785,9 +7320,12 @@ local ordered_enhancers={ "check glyphs", "check metadata", "check extra features", + "prepare tounicode", "check encoding", "add duplicates", "cleanup tables", + "compact lookups", + "purge names", } local actions=allocate() local before=allocate() @@ -6924,12 +7462,12 @@ function otf.load(filename,sub,featurefile) report_otf("loading %a, hash %a",filename,hash) local fontdata,messages if sub then - fontdata,messages=fontloader.open(filename,sub) + fontdata,messages=open_font(filename,sub) else - fontdata,messages=fontloader.open(filename) + fontdata,messages=open_font(filename) end if fontdata then - mainfields=mainfields or (fontloaderfields and fontloaderfields(fontdata)) + mainfields=mainfields or (font_fields and font_fields(fontdata)) end if trace_loading and messages and #messages>0 then if type(messages)=="string" then @@ -6969,6 +7507,7 @@ function otf.load(filename,sub,featurefile) }, lookuptypes={}, }, + warnings={}, metadata={ }, properties={ @@ -6977,7 +7516,7 @@ function otf.load(filename,sub,featurefile) goodies={}, helpers={ tounicodelist=splitter, - tounicodetable=lpeg.Ct(splitter), + tounicodetable=Ct(splitter), }, } starttiming(data) @@ -7002,7 +7541,7 @@ function otf.load(filename,sub,featurefile) report_otf("preprocessing and caching time %s, packtime %s", elapsedtime(data),packdata and elapsedtime(packtime) or 0) end - fontloader.close(fontdata) + close_font(fontdata) if cleanup>3 then collectgarbage("collect") end @@ -7020,6 +7559,34 @@ function otf.load(filename,sub,featurefile) report_otf("loading from cache using hash %a",hash) end enhance("unpack",data,filename,nil,false) + local resources=data.resources + local lookuptags=resources.lookuptags + local unicodes=resources.unicodes + if not lookuptags then + lookuptags={} + resources.lookuptags=lookuptags + end + setmetatableindex(lookuptags,function(t,k) + local v=type(k)=="number" and ("lookup "..k) or k + t[k]=v + return v + end) + if not unicodes then + unicodes={} + resources.unicodes=unicodes + setmetatableindex(unicodes,function(t,k) + setmetatableindex(unicodes,nil) + for u,d in next,data.descriptions do + local n=d.name + if n then + t[n]=u + else + end + end + return rawget(t,k) + end) + end + constructors.addcoreunicodes(unicodes) if applyruntimefixes then applyruntimefixes(filename,data) end @@ -7056,26 +7623,16 @@ actions["add dimensions"]=function(data,filename) local defaultheight=resources.defaultheight or 0 local defaultdepth=resources.defaultdepth or 0 local basename=trace_markwidth and file.basename(filename) - if usemetatables then - for _,d in next,descriptions do - local wd=d.width - if not wd then - d.width=defaultwidth - elseif trace_markwidth and wd~=0 and d.class=="mark" then - report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) - end - setmetatable(d,mt) + for _,d in next,descriptions do + local bb,wd=d.boundingbox,d.width + if not wd then + d.width=defaultwidth + elseif trace_markwidth and wd~=0 and d.class=="mark" then + report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) end - else - for _,d in next,descriptions do - local bb,wd=d.boundingbox,d.width - if not wd then - d.width=defaultwidth - elseif trace_markwidth and wd~=0 and d.class=="mark" then - report_otf("mark %a with width %b found in %a",d.name or "",wd,basename) - end - if bb then - local ht,dp=bb[4],-bb[2] + if bb then + local ht=bb[4] + local dp=-bb[2] if ht==0 or ht<0 then else d.height=ht @@ -7084,7 +7641,6 @@ actions["add dimensions"]=function(data,filename) else d.depth=dp end - end end end end @@ -7151,24 +7707,26 @@ actions["prepare glyphs"]=function(data,filename,raw) local glyph=cidglyphs[index] if glyph then local unicode=glyph.unicode -if unicode>=0x00E000 and unicode<=0x00F8FF then + if unicode>=0x00E000 and unicode<=0x00F8FF then unicode=-1 -elseif unicode>=0x0F0000 and unicode<=0x0FFFFD then + elseif unicode>=0x0F0000 and unicode<=0x0FFFFD then unicode=-1 -elseif unicode>=0x100000 and unicode<=0x10FFFD then + elseif unicode>=0x100000 and unicode<=0x10FFFD then unicode=-1 -end + end local name=glyph.name or cidnames[index] if not unicode or unicode==-1 then unicode=cidunicodes[index] end if unicode and descriptions[unicode] then - report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + if trace_private then + report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + end unicode=-1 end if not unicode or unicode==-1 then if not name then - name=format("u%06X",private) + name=format("u%06X.ctx",private) end unicode=private unicodes[name]=private @@ -7179,7 +7737,7 @@ end nofnames=nofnames+1 else if not name then - name=format("u%06X",unicode) + name=format("u%06X.ctx",unicode) end unicodes[name]=unicode nofunicodes=nofunicodes+1 @@ -7220,12 +7778,29 @@ end end private=private+1 else + if unicode>criterium then + local taken=descriptions[unicode] + if taken then + if unicode>=private then + private=unicode+1 + else + private=private+1 + end + descriptions[private]=taken + unicodes[taken.name]=private + indices[taken.index]=private + if trace_private then + report_otf("slot %U is moved to %U due to private in font",unicode) + end + else + if unicode>=private then + private=unicode+1 + end + end + end unicodes[name]=unicode end indices[index]=unicode - if not name then - name=format("u%06X",unicode) - end descriptions[unicode]={ boundingbox=glyph.boundingbox, name=name, @@ -7334,8 +7909,8 @@ actions["add duplicates"]=function(data,filename,raw) local description=descriptions[unicode] local n=0 for _,description in next,descriptions do + local kerns=description.kerns if kerns then - local kerns=description.kerns for _,k in next,kerns do local ku=k[unicode] if ku then @@ -7629,9 +8204,14 @@ local function t_hashed(t,cache) local ti=t[i] local tih=cache[ti] if not tih then - tih={} - for i=1,#ti do - tih[ti[i]]=true + local tn=#ti + if tn==1 then + tih={ [ti[1]]=true } + else + tih={} + for i=1,tn do + tih[ti[i]]=true + end end cache[ti]=tih end @@ -7644,12 +8224,17 @@ local function t_hashed(t,cache) end local function s_hashed(t,cache) if t then - local ht={} local tf=t[1] - for i=1,#tf do - ht[i]={ [tf[i]]=true } + local nf=#tf + if nf==1 then + return { [tf[1]]=true } + else + local ht={} + for i=1,nf do + ht[i]={ [tf[i]]=true } + end + return ht end - return ht else return nil end @@ -7799,12 +8384,12 @@ actions["reorganize lookups"]=function(data,filename,raw) local fore=glyphs.fore if fore and fore~="" then fore=s_uncover(splitter,s_u_cache,fore) - rule.before=s_hashed(fore,s_h_cache) + rule.after=s_hashed(fore,s_h_cache) end local back=glyphs.back if back then back=s_uncover(splitter,s_u_cache,back) - rule.after=s_hashed(back,s_h_cache) + rule.before=s_hashed(back,s_h_cache) end local names=glyphs.names if names then @@ -7812,6 +8397,14 @@ actions["reorganize lookups"]=function(data,filename,raw) rule.current=s_hashed(names,s_h_cache) end rule.glyphs=nil + local lookups=rule.lookups + if lookups then + for i=1,#names do + if not lookups[i] then + lookups[i]="" + end + end + end end end end @@ -7828,7 +8421,9 @@ local function check_variants(unicode,the_variants,splitter,unicodes) for i=1,#glyphs do local g=glyphs[i] if done[g] then - report_otf("skipping cyclic reference %U in math variant %U",g,unicode) + if i>1 then + report_otf("skipping cyclic reference %U in math variant %U",g,unicode) + end else if n==0 then n=1 @@ -8067,6 +8662,10 @@ actions["check glyphs"]=function(data,filename,raw) description.glyph=nil end end +local valid=(R("\x00\x7E")-S("(){}[]<>%/ \n\r\f\v"))^0*P(-1) +local function valid_ps_name(str) + return str and str~="" and #str<64 and lpegmatch(valid,str) and true or false +end actions["check metadata"]=function(data,filename,raw) local metadata=data.metadata for _,k in next,mainfields do @@ -8084,14 +8683,50 @@ actions["check metadata"]=function(data,filename,raw) end end if metadata.validation_state and table.contains(metadata.validation_state,"bad_ps_fontname") then - local name=file.nameonly(filename) - metadata.fontname="bad-fontname-"..name - metadata.fullname="bad-fullname-"..name + local function valid(what) + local names=raw.names + for i=1,#names do + local list=names[i] + local names=list.names + if names then + local name=names[what] + if name and valid_ps_name(name) then + return name + end + end + end + end + local function check(what) + local oldname=metadata[what] + if valid_ps_name(oldname) then + report_otf("ignoring warning %a because %s %a is proper ASCII","bad_ps_fontname",what,oldname) + else + local newname=valid(what) + if not newname then + newname=formatters["bad-%s-%s"](what,file.nameonly(filename)) + end + local warning=formatters["overloading %s from invalid ASCII name %a to %a"](what,oldname,newname) + data.warnings[#data.warnings+1]=warning + report_otf(warning) + metadata[what]=newname + end + end + check("fontname") + check("fullname") end end actions["cleanup tables"]=function(data,filename,raw) + local duplicates=data.resources.duplicates + if duplicates then + for k,v in next,duplicates do + if #v==1 then + duplicates[k]=v[1] + end + end + end data.resources.indices=nil - data.helpers=nil + data.resources.unicodes=nil + data.helpers=nil end actions["reorganize glyph lookups"]=function(data,filename,raw) local resources=data.resources @@ -8173,6 +8808,7 @@ actions["reorganize glyph lookups"]=function(data,filename,raw) end end end +local zero={ 0,0 } actions["reorganize glyph anchors"]=function(data,filename,raw) local descriptions=data.descriptions for unicode,description in next,descriptions do @@ -8181,14 +8817,32 @@ actions["reorganize glyph anchors"]=function(data,filename,raw) for class,data in next,anchors do if class=="baselig" then for tag,specification in next,data do - for i=1,#specification do - local si=specification[i] - specification[i]={ si.x or 0,si.y or 0 } + local n=0 + for k,v in next,specification do + if k>n then + n=k + end + local x,y=v.x,v.y + if x or y then + specification[k]={ x or 0,y or 0 } + else + specification[k]=zero + end end + local t={} + for i=1,n do + t[i]=specification[i] or zero + end + data[tag]=t end else for tag,specification in next,data do - data[tag]={ specification.x or 0,specification.y or 0 } + local x,y=specification.x,specification.y + if x or y then + data[tag]={ x or 0,y or 0 } + else + data[tag]=zero + end end end end @@ -8196,6 +8850,142 @@ actions["reorganize glyph anchors"]=function(data,filename,raw) end end end +local bogusname=(P("uni")+P("u"))*R("AF","09")^4+(P("index")+P("glyph")+S("Ii")*P("dentity")*P(".")^0)*R("09")^1 +local uselessname=(1-bogusname)^0*bogusname +actions["purge names"]=function(data,filename,raw) + if purge_names then + local n=0 + for u,d in next,data.descriptions do + if lpegmatch(uselessname,d.name) then + n=n+1 + d.name=nil + end + end + if n>0 then + report_otf("%s bogus names removed",n) + end + end +end +actions["compact lookups"]=function(data,filename,raw) + if not compact_lookups then + report_otf("not compacting") + return + end + local last=0 + local tags=table.setmetatableindex({}, + function(t,k) + last=last+1 + t[k]=last + return last + end + ) + local descriptions=data.descriptions + local resources=data.resources + for u,d in next,descriptions do + local slookups=d.slookups + if type(slookups)=="table" then + local s={} + for k,v in next,slookups do + s[tags[k]]=v + end + d.slookups=s + end + local mlookups=d.mlookups + if type(mlookups)=="table" then + local m={} + for k,v in next,mlookups do + m[tags[k]]=v + end + d.mlookups=m + end + local kerns=d.kerns + if type(kerns)=="table" then + local t={} + for k,v in next,kerns do + t[tags[k]]=v + end + d.kerns=t + end + end + local lookups=data.lookups + if lookups then + local l={} + for k,v in next,lookups do + local rules=v.rules + if rules then + for i=1,#rules do + local l=rules[i].lookups + if type(l)=="table" then + for i=1,#l do + l[i]=tags[l[i]] + end + end + end + end + l[tags[k]]=v + end + data.lookups=l + end + local lookups=resources.lookups + if lookups then + local l={} + for k,v in next,lookups do + local s=v.subtables + if type(s)=="table" then + for i=1,#s do + s[i]=tags[s[i]] + end + end + l[tags[k]]=v + end + resources.lookups=l + end + local sequences=resources.sequences + if sequences then + for i=1,#sequences do + local s=sequences[i] + local n=s.name + if n then + s.name=tags[n] + end + local t=s.subtables + if type(t)=="table" then + for i=1,#t do + t[i]=tags[t[i]] + end + end + end + end + local lookuptypes=resources.lookuptypes + if lookuptypes then + local l={} + for k,v in next,lookuptypes do + l[tags[k]]=v + end + resources.lookuptypes=l + end + local anchor_to_lookup=resources.anchor_to_lookup + if anchor_to_lookup then + for anchor,lookups in next,anchor_to_lookup do + local l={} + for lookup,value in next,lookups do + l[tags[lookup]]=value + end + anchor_to_lookup[anchor]=l + end + end + local lookup_to_anchor=resources.lookup_to_anchor + if lookup_to_anchor then + local l={} + for lookup,value in next,lookup_to_anchor do + l[tags[lookup]]=value + end + resources.lookup_to_anchor=l + end + tags=table.swapped(tags) + report_otf("%s lookup tags compacted",#tags) + resources.lookuptags=tags +end function otf.setfeatures(tfmdata,features) local okay=constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf) if okay then @@ -8207,6 +8997,7 @@ end local function copytotfm(data,cache_id) if data then local metadata=data.metadata + local warnings=data.warnings local resources=data.resources local properties=derivetable(data.properties) local descriptions=derivetable(data.descriptions) @@ -8281,6 +9072,7 @@ local function copytotfm(data,cache_id) local filename=constructors.checkedfilename(resources) local fontname=metadata.fontname local fullname=metadata.fullname or fontname + local psname=fontname or fullname local units=metadata.units_per_em or 1000 if units==0 then units=1000 @@ -8295,8 +9087,8 @@ local function copytotfm(data,cache_id) parameters.italicangle=italicangle parameters.charwidth=charwidth parameters.charxheight=charxheight - local space=0x0020 - local emdash=0x2014 + local space=0x0020 + local emdash=0x2014 if monospaced then if descriptions[space] then spaceunits,spacer=descriptions[space].width,"space" @@ -8343,7 +9135,7 @@ local function copytotfm(data,cache_id) if charxheight then parameters.x_height=charxheight else - local x=0x78 + local x=0x0078 if x then local x=descriptions[x] if x then @@ -8362,8 +9154,16 @@ local function copytotfm(data,cache_id) properties.filename=filename properties.fontname=fontname properties.fullname=fullname - properties.psname=fontname or fullname + properties.psname=psname properties.name=filename or fullname + if warnings and #warnings>0 then + report_otf("warnings for font: %s",filename) + report_otf() + for i=1,#warnings do + report_otf(" %s",warnings[i]) + end + report_otf() + end return { characters=characters, descriptions=descriptions, @@ -8372,6 +9172,7 @@ local function copytotfm(data,cache_id) resources=resources, properties=properties, goodies=goodies, + warnings=warnings, } end end @@ -8390,14 +9191,23 @@ local function otftotfm(specification) if duplicates then local nofduplicates,nofduplicated=0,0 for parent,list in next,duplicates do - for i=1,#list do - local unicode=list[i] - if not descriptions[unicode] then - descriptions[unicode]=descriptions[parent] + if type(list)=="table" then + local n=#list + for i=1,n do + local unicode=list[i] + if not descriptions[unicode] then + descriptions[unicode]=descriptions[parent] + nofduplicated=nofduplicated+1 + end + end + nofduplicates=nofduplicates+n + else + if not descriptions[list] then + descriptions[list]=descriptions[parent] nofduplicated=nofduplicated+1 end + nofduplicates=nofduplicates+1 end - nofduplicates=nofduplicates+#list end if trace_otf and nofduplicated~=nofduplicates then report_otf("%i extra duplicates copied out of %i",nofduplicated,nofduplicates) @@ -8528,7 +9338,7 @@ if not modules then modules={} end modules ['font-otb']={ } local concat=table.concat local format,gmatch,gsub,find,match,lower,strip=string.format,string.gmatch,string.gsub,string.find,string.match,string.lower,string.strip -local type,next,tonumber,tostring=type,next,tonumber,tostring +local type,next,tonumber,tostring,rawget=type,next,tonumber,tostring,rawget local lpegmatch=lpeg.match local utfchar=utf.char local trace_baseinit=false trackers.register("otf.baseinit",function(v) trace_baseinit=v end) @@ -8575,36 +9385,36 @@ local function gref(descriptions,n) return "" end end -local function cref(feature,lookupname) +local function cref(feature,lookuptags,lookupname) if lookupname then - return formatters["feature %a, lookup %a"](feature,lookupname) + return formatters["feature %a, lookup %a"](feature,lookuptags[lookupname]) else return formatters["feature %a"](feature) end end -local function report_alternate(feature,lookupname,descriptions,unicode,replacement,value,comment) +local function report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,comment) report_prepare("%s: base alternate %s => %s (%S => %S)", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), replacement and gref(descriptions,replacement), value, comment) end -local function report_substitution(feature,lookupname,descriptions,unicode,substitution) +local function report_substitution(feature,lookuptags,lookupname,descriptions,unicode,substitution) report_prepare("%s: base substitution %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), gref(descriptions,substitution)) end -local function report_ligature(feature,lookupname,descriptions,unicode,ligature) +local function report_ligature(feature,lookuptags,lookupname,descriptions,unicode,ligature) report_prepare("%s: base ligature %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,ligature), gref(descriptions,unicode)) end -local function report_kern(feature,lookupname,descriptions,unicode,otherunicode,value) +local function report_kern(feature,lookuptags,lookupname,descriptions,unicode,otherunicode,value) report_prepare("%s: base kern %s + %s => %S", - cref(feature,lookupname), + cref(feature,lookuptags,lookupname), gref(descriptions,unicode), gref(descriptions,otherunicode), value) @@ -8641,7 +9451,7 @@ local function finalize_ligatures(tfmdata,ligatures) local characters=tfmdata.characters local descriptions=tfmdata.descriptions local resources=tfmdata.resources - local unicodes=resources.unicodes + local unicodes=resources.unicodes local private=resources.private local alldone=false while not alldone do @@ -8677,12 +9487,12 @@ local function finalize_ligatures(tfmdata,ligatures) local secondname=firstname.."_"..secondcode if i==size-1 then target=unicode - if not unicodes[secondname] then + if not rawget(unicodes,secondname) then unicodes[secondname]=unicode end okay=true else - target=unicodes[secondname] + target=rawget(unicodes,secondname) if not target then break end @@ -8718,56 +9528,58 @@ local function finalize_ligatures(tfmdata,ligatures) end end resources.private=private + return true end end local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist) local characters=tfmdata.characters local descriptions=tfmdata.descriptions local resources=tfmdata.resources + local properties=tfmdata.properties local changed=tfmdata.changed - local unicodes=resources.unicodes local lookuphash=resources.lookuphash local lookuptypes=resources.lookuptypes + local lookuptags=resources.lookuptags local ligatures={} - local alternate=tonumber(value) + local alternate=tonumber(value) or true and 1 local defaultalt=otf.defaultbasealternate local trace_singles=trace_baseinit and trace_singles local trace_alternatives=trace_baseinit and trace_alternatives local trace_ligatures=trace_baseinit and trace_ligatures local actions={ - substitution=function(lookupdata,lookupname,description,unicode) + substitution=function(lookupdata,lookuptags,lookupname,description,unicode) if trace_singles then - report_substitution(feature,lookupname,descriptions,unicode,lookupdata) + report_substitution(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) end changed[unicode]=lookupdata end, - alternate=function(lookupdata,lookupname,description,unicode) + alternate=function(lookupdata,lookuptags,lookupname,description,unicode) local replacement=lookupdata[alternate] if replacement then changed[unicode]=replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") end elseif defaultalt=="first" then replacement=lookupdata[1] changed[unicode]=replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end elseif defaultalt=="last" then replacement=lookupdata[#data] if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end else if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") end end end, - ligature=function(lookupdata,lookupname,description,unicode) + ligature=function(lookupdata,lookuptags,lookupname,description,unicode) if trace_ligatures then - report_ligature(feature,lookupname,descriptions,unicode,lookupdata) + report_ligature(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) end ligatures[#ligatures+1]={ unicode,lookupdata } end, @@ -8783,7 +9595,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local lookuptype=lookuptypes[lookupname] local action=actions[lookuptype] if action then - action(lookupdata,lookupname,description,unicode) + action(lookupdata,lookuptags,lookupname,description,unicode) end end end @@ -8798,22 +9610,24 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local action=actions[lookuptype] if action then for i=1,#lookuplist do - action(lookuplist[i],lookupname,description,unicode) + action(lookuplist[i],lookuptags,lookupname,description,unicode) end end end end end end - finalize_ligatures(tfmdata,ligatures) + properties.hasligatures=finalize_ligatures(tfmdata,ligatures) end local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist) local characters=tfmdata.characters local descriptions=tfmdata.descriptions local resources=tfmdata.resources - local unicodes=resources.unicodes + local properties=tfmdata.properties + local lookuptags=resources.lookuptags local sharedkerns={} local traceindeed=trace_baseinit and trace_kerns + local haskerns=false for unicode,character in next,characters do local description=descriptions[unicode] local rawkerns=description.kerns @@ -8835,13 +9649,13 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist newkerns={ [otherunicode]=value } done=true if traceindeed then - report_kern(feature,lookup,descriptions,unicode,otherunicode,value) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) end elseif not newkerns[otherunicode] then newkerns[otherunicode]=value done=true if traceindeed then - report_kern(feature,lookup,descriptions,unicode,otherunicode,value) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) end end end @@ -8850,12 +9664,14 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist if done then sharedkerns[rawkerns]=newkerns character.kerns=newkerns + haskerns=true else sharedkerns[rawkerns]=false end end end end + properties.haskerns=haskerns end basemethods.independent={ preparesubstitutions=preparesubstitutions, @@ -8881,13 +9697,13 @@ local function make_1(present,tree,name) end end end -local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookupname) +local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookuptags,lookupname) for k,v in next,tree do if k=="ligature" then local character=characters[preceding] if not character then if trace_baseinit then - report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookupname,v,preceding) + report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookuptags[lookupname],v,preceding) end character=makefake(tfmdata,name,present) end @@ -8908,7 +9724,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don else local code=present[name] or unicode local name=name.."_"..k - make_2(present,tfmdata,characters,v,name,code,k,done,lookupname) + make_2(present,tfmdata,characters,v,name,code,k,done,lookuptags,lookupname) end end end @@ -8919,8 +9735,9 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local changed=tfmdata.changed local lookuphash=resources.lookuphash local lookuptypes=resources.lookuptypes + local lookuptags=resources.lookuptags local ligatures={} - local alternate=tonumber(value) + local alternate=tonumber(value) or true and 1 local defaultalt=otf.defaultbasealternate local trace_singles=trace_baseinit and trace_singles local trace_alternatives=trace_baseinit and trace_alternatives @@ -8932,36 +9749,36 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for unicode,data in next,lookupdata do if lookuptype=="substitution" then if trace_singles then - report_substitution(feature,lookupname,descriptions,unicode,data) + report_substitution(feature,lookuptags,lookupname,descriptions,unicode,data) end changed[unicode]=data elseif lookuptype=="alternate" then - local replacement=data[alternate] + local replacement=data[alternate] if replacement then changed[unicode]=replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") end elseif defaultalt=="first" then replacement=data[1] changed[unicode]=replacement if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end elseif defaultalt=="last" then replacement=data[#data] if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt) + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) end else if trace_alternatives then - report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown") + report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") end end elseif lookuptype=="ligature" then ligatures[#ligatures+1]={ unicode,data,lookupname } if trace_ligatures then - report_ligature(feature,lookupname,descriptions,unicode,data) + report_ligature(feature,lookuptags,lookupname,descriptions,unicode,data) end end end @@ -8979,7 +9796,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for i=1,nofligatures do local ligature=ligatures[i] local unicode,tree,lookupname=ligature[1],ligature[2],ligature[3] - make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookupname) + make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookuptags,lookupname) end end end @@ -8987,7 +9804,9 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist local characters=tfmdata.characters local descriptions=tfmdata.descriptions local resources=tfmdata.resources + local properties=tfmdata.properties local lookuphash=resources.lookuphash + local lookuptags=resources.lookuptags local traceindeed=trace_baseinit and trace_kerns for l=1,#lookuplist do local lookupname=lookuplist[l] @@ -9003,7 +9822,7 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist for otherunicode,kern in next,data do if not kerns[otherunicode] and kern~=0 then kerns[otherunicode]=kern - report_kern(feature,lookup,descriptions,unicode,otherunicode,kern) + report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,kern) end end else @@ -9029,7 +9848,7 @@ local function featuresinitializer(tfmdata,value) if true then local starttime=trace_preparing and os.clock() local features=tfmdata.shared.features - local fullname=trace_preparing and tfmdata.properties.fullname + local fullname=tfmdata.properties.fullname or "?" if features then applybasemethod("initializehashes",tfmdata) local collectlookups=otf.collectlookups @@ -9049,20 +9868,21 @@ local function featuresinitializer(tfmdata,value) if order then for i=1,#order do local feature=order[i] - if features[feature] then + local value=features[feature] + if value then local validlookups,lookuplist=collectlookups(rawdata,feature,script,language) if not validlookups then elseif basesubstitutions and basesubstitutions[feature] then if trace_preparing then - report_prepare("filtering base feature %a for %a",feature,fullname) + report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value) end applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) elseif basepositionings and basepositionings[feature] then if trace_preparing then - report_prepare("filtering base feature %a for %a",feature,fullname) + report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value) end - applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist) + applybasemethod("preparepositionings",tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) end end @@ -9096,17 +9916,19 @@ end -- closure do -- begin closure to overcome local limits and interference -if not modules then modules={} end modules ['node-inj']={ +if not modules then modules={} end modules ['font-inj']={ version=1.001, - comment="companion to node-ini.mkiv", + comment="companion to font-lib.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files", } -local next=next +if not nodes.properties then return end +local next,rawget=next,rawget local utfchar=utf.char -local trace_injections=false trackers.register("nodes.injections",function(v) trace_injections=v end) -local report_injections=logs.reporter("nodes","injections") +local fastcopy=table.fastcopy +local trace_injections=false trackers.register("fonts.injections",function(v) trace_injections=v end) +local report_injections=logs.reporter("fonts","injections") local attributes,nodes,node=attributes,nodes,node fonts=fonts local fontdata=fonts.hashes.identifiers @@ -9114,134 +9936,347 @@ nodes.injections=nodes.injections or {} local injections=nodes.injections local nodecodes=nodes.nodecodes local glyph_code=nodecodes.glyph +local disc_code=nodecodes.disc local kern_code=nodecodes.kern -local nodepool=nodes.pool +local nuts=nodes.nuts +local nodepool=nuts.pool local newkern=nodepool.kern -local traverse_id=node.traverse_id -local insert_node_before=node.insert_before -local insert_node_after=node.insert_after -local a_kernpair=attributes.private('kernpair') -local a_ligacomp=attributes.private('ligacomp') -local a_markbase=attributes.private('markbase') -local a_markmark=attributes.private('markmark') -local a_markdone=attributes.private('markdone') -local a_cursbase=attributes.private('cursbase') -local a_curscurs=attributes.private('curscurs') -local a_cursdone=attributes.private('cursdone') +local tonode=nuts.tonode +local tonut=nuts.tonut +local getfield=nuts.getfield +local setfield=nuts.setfield +local getnext=nuts.getnext +local getprev=nuts.getprev +local getid=nuts.getid +local getfont=nuts.getfont +local getsubtype=nuts.getsubtype +local getchar=nuts.getchar +local traverse_id=nuts.traverse_id +local insert_node_before=nuts.insert_before +local insert_node_after=nuts.insert_after +local find_tail=nuts.tail +local properties=nodes.properties.data function injections.installnewkern(nk) newkern=nk or newkern end -local cursives={} -local marks={} -local kerns={} -function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) - local dx,dy=factor*(exit[1]-entry[1]),factor*(exit[2]-entry[2]) - local ws,wn=tfmstart.width,tfmnext.width - local bound=#cursives+1 - start[a_cursbase]=bound - nxt[a_curscurs]=bound - cursives[bound]={ rlmode,dx,dy,ws,wn } - return dx,dy,bound +local nofregisteredkerns=0 +local nofregisteredpairs=0 +local nofregisteredmarks=0 +local nofregisteredcursives=0 +local keepregisteredcounts=false +function injections.keepcounts() + keepregisteredcounts=true +end +function injections.resetcounts() + nofregisteredkerns=0 + nofregisteredpairs=0 + nofregisteredmarks=0 + nofregisteredcursives=0 + keepregisteredcounts=false +end +function injections.reset(n) + local p=rawget(properties,n) + if p and rawget(p,"injections") then + p.injections=nil + end +end +function injections.copy(target,source) + local sp=rawget(properties,source) + if sp then + local tp=rawget(properties,target) + local si=rawget(sp,"injections") + if si then + si=fastcopy(si) + if tp then + tp.injections=si + else + propertydata[target]={ + injections=si, + } + end + else + if tp then + tp.injections=nil + end + end + end end -function injections.setpair(current,factor,rlmode,r2lflag,spec,tfmchr) - local x,y,w,h=factor*spec[1],factor*spec[2],factor*spec[3],factor*spec[4] - if x~=0 or w~=0 or y~=0 or h~=0 then - local bound=current[a_kernpair] - if bound then - local kb=kerns[bound] - kb[2],kb[3],kb[4],kb[5]=(kb[2] or 0)+x,(kb[3] or 0)+y,(kb[4] or 0)+w,(kb[5] or 0)+h +function injections.setligaindex(n,index) + local p=rawget(properties,n) + if p then + local i=rawget(p,"injections") + if i then + i.ligaindex=index else - bound=#kerns+1 - current[a_kernpair]=bound - kerns[bound]={ rlmode,x,y,w,h,r2lflag,tfmchr.width } + p.injections={ + ligaindex=index + } end - return x,y,w,h,bound + else + properties[n]={ + injections={ + ligaindex=index + } + } + end +end +function injections.getligaindex(n,default) + local p=rawget(properties,n) + if p then + local i=rawget(p,"injections") + if i then + return i.ligaindex or default + end + end + return default +end +function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) + local dx=factor*(exit[1]-entry[1]) + local dy=-factor*(exit[2]-entry[2]) + local ws,wn=tfmstart.width,tfmnext.width + nofregisteredcursives=nofregisteredcursives+1 + if rlmode<0 then + dx=-(dx+wn) + else + dx=dx-ws + end + local p=rawget(properties,start) + if p then + local i=rawget(p,"injections") + if i then + i.cursiveanchor=true + else + p.injections={ + cursiveanchor=true, + } + end + else + properties[start]={ + injections={ + cursiveanchor=true, + }, + } + end + local p=rawget(properties,nxt) + if p then + local i=rawget(p,"injections") + if i then + i.cursivex=dx + i.cursivey=dy + else + p.injections={ + cursivex=dx, + cursivey=dy, + } + end + else + properties[nxt]={ + injections={ + cursivex=dx, + cursivey=dy, + }, + } + end + return dx,dy,nofregisteredcursives +end +function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) + local x,y,w,h=factor*spec[1],factor*spec[2],factor*spec[3],factor*spec[4] + if x~=0 or w~=0 or y~=0 or h~=0 then + local yoffset=y-h + local leftkern=x + local rightkern=w-x + if leftkern~=0 or rightkern~=0 or yoffset~=0 then + nofregisteredpairs=nofregisteredpairs+1 + if rlmode and rlmode<0 then + leftkern,rightkern=rightkern,leftkern + end + local p=rawget(properties,current) + if p then + local i=rawget(p,"injections") + if i then + if leftkern~=0 then + i.leftkern=(i.leftkern or 0)+leftkern + end + if rightkern~=0 then + i.rightkern=(i.rightkern or 0)+rightkern + end + if yoffset~=0 then + i.yoffset=(i.yoffset or 0)+yoffset + end + elseif leftkern~=0 or rightkern~=0 then + p.injections={ + leftkern=leftkern, + rightkern=rightkern, + yoffset=yoffset, + } + else + p.injections={ + yoffset=yoffset, + } + end + elseif leftkern~=0 or rightkern~=0 then + properties[current]={ + injections={ + leftkern=leftkern, + rightkern=rightkern, + yoffset=yoffset, + }, + } + else + properties[current]={ + injections={ + yoffset=yoffset, + }, + } + end + return x,y,w,h,nofregisteredpairs + end end return x,y,w,h end -function injections.setkern(current,factor,rlmode,x,tfmchr) +function injections.setkern(current,factor,rlmode,x,injection) local dx=factor*x if dx~=0 then - local bound=#kerns+1 - current[a_kernpair]=bound - kerns[bound]={ rlmode,dx } - return dx,bound + nofregisteredkerns=nofregisteredkerns+1 + local p=rawget(properties,current) + if not injection then + injection="injections" + end + if p then + local i=rawget(p,injection) + if i then + i.leftkern=dx+(i.leftkern or 0) + else + p[injection]={ + leftkern=dx, + } + end + else + properties[current]={ + [injection]={ + leftkern=dx, + }, + } + end + return dx,nofregisteredkerns else return 0,0 end end -function injections.setmark(start,base,factor,rlmode,ba,ma) +function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) local dx,dy=factor*(ba[1]-ma[1]),factor*(ba[2]-ma[2]) - local bound=base[a_markbase] - local index=1 - if bound then - local mb=marks[bound] - if mb then - index=#mb+1 - mb[index]={ dx,dy,rlmode } - start[a_markmark]=bound - start[a_markdone]=index - return dx,dy,bound + nofregisteredmarks=nofregisteredmarks+1 + if rlmode>=0 then + dx=tfmbase.width-dx + end + local p=rawget(properties,start) + if p then + local i=rawget(p,"injections") + if i then + i.markx=dx + i.marky=dy + i.markdir=rlmode or 0 + i.markbase=nofregisteredmarks + i.markbasenode=base else - report_injections("possible problem, %U is base mark without data (id %a)",base.char,bound) + p.injections={ + markx=dx, + marky=dy, + markdir=rlmode or 0, + markbase=nofregisteredmarks, + markbasenode=base, + } end + else + properties[start]={ + injections={ + markx=dx, + marky=dy, + markdir=rlmode or 0, + markbase=nofregisteredmarks, + markbasenode=base, + }, + } end - index=index or 1 - bound=#marks+1 - base[a_markbase]=bound - start[a_markmark]=bound - start[a_markdone]=index - marks[bound]={ [index]={ dx,dy,rlmode } } - return dx,dy,bound + return dx,dy,nofregisteredmarks end local function dir(n) return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset" end -local function trace(head) - report_injections("begin run") - for n in traverse_id(glyph_code,head) do - if n.subtype<256 then - local kp=n[a_kernpair] - local mb=n[a_markbase] - local mm=n[a_markmark] - local md=n[a_markdone] - local cb=n[a_cursbase] - local cc=n[a_curscurs] - local char=n.char - report_injections("font %s, char %U, glyph %c",n.font,char,char) - if kp then - local k=kerns[kp] - if k[3] then - report_injections(" pairkern: dir %a, x %p, y %p, w %p, h %p",dir(k[1]),k[2],k[3],k[4],k[5]) - else - report_injections(" kern: dir %a, dx %p",dir(k[1]),k[2]) - end - end - if mb then - report_injections(" markbase: bound %a",mb) - end - if mm then - local m=marks[mm] - if mb then - local m=m[mb] - if m then - report_injections(" markmark: bound %a, index %a, dx %p, dy %p",mm,md,m[1],m[2]) - else - report_injections(" markmark: bound %a, missing index",mm) - end - else - m=m[1] - report_injections(" markmark: bound %a, dx %p, dy %p",mm,m and m[1],m and m[2]) - end +local function showchar(n,nested) + local char=getchar(n) + report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char) +end +local function show(n,what,nested,symbol) + if n then + local p=rawget(properties,n) + if p then + local i=rawget(p,what) + if i then + local leftkern=i.leftkern or 0 + local rightkern=i.rightkern or 0 + local yoffset=i.yoffset or 0 + local markx=i.markx or 0 + local marky=i.marky or 0 + local markdir=i.markdir or 0 + local markbase=i.markbase or 0 + local cursivex=i.cursivex or 0 + local cursivey=i.cursivey or 0 + local ligaindex=i.ligaindex or 0 + local margin=nested and 4 or 2 + if rightkern~=0 or yoffset~=0 then + report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset) + elseif leftkern~=0 then + report_injections("%w%s kern: dx %p",margin,symbol,leftkern) + end + if markx~=0 or marky~=0 or markbase~=0 then + report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase~=0 and "yes" or "no") + end + if cursivex~=0 or cursivey~=0 then + report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey) + end + if ligaindex~=0 then + report_injections("%w%s liga: index %i",margin,symbol,ligaindex) + end + end + end + end +end +local function showsub(n,what,where) + report_injections("begin subrun: %s",where) + for n in traverse_id(glyph_code,n) do + showchar(n,where) + show(n,what,where," ") + end + report_injections("end subrun") +end +local function trace(head,where) + report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", + where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) + local n=head + while n do + local id=getid(n) + if id==glyph_code then + showchar(n) + show(n,"injections",false," ") + show(n,"preinjections",false,"<") + show(n,"postinjections",false,">") + show(n,"replaceinjections",false,"=") + elseif id==disc_code then + local pre=getfield(n,"pre") + local post=getfield(n,"post") + local replace=getfield(n,"replace") + if pre then + showsub(pre,"preinjections","pre") end - if cb then - report_injections(" cursbase: bound %a",cb) + if post then + showsub(post,"postinjections","post") end - if cc then - local c=cursives[cc] - report_injections(" curscurs: bound %a, dir %a, dx %p, dy %p",cc,dir(c[1]),c[2],c[3]) + if replace then + showsub(replace,"replaceinjections","replace") end end + n=getnext(n) end report_injections("end run") end @@ -9249,307 +10284,586 @@ local function show_result(head) local current=head local skipping=false while current do - local id=current.id + local id=getid(current) if id==glyph_code then - report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset) + report_injections("char: %C, width %p, xoffset %p, yoffset %p", + getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset")) skipping=false elseif id==kern_code then - report_injections("kern: %p",current.kern) + report_injections("kern: %p",getfield(current,"kern")) skipping=false elseif not skipping then report_injections() skipping=true end - current=current.next + current=getnext(current) end end -function injections.handler(head,where,keep) - local has_marks,has_cursives,has_kerns=next(marks),next(cursives),next(kerns) - if has_marks or has_cursives then - if trace_injections then - trace(head) - end - local done,ky,rl,valid,cx,wx,mk,nofvalid=false,{},{},{},{},{},{},0 - if has_kerns then - local nf,tm=nil,nil - for n in traverse_id(glyph_code,head) do - if n.subtype<256 then - nofvalid=nofvalid+1 - valid[nofvalid]=n - if n.font~=nf then - nf=n.font - tm=fontdata[nf].resources.marks - end - if tm then - mk[n]=tm[n.char] +local function collect_glyphs_1(head) + local glyphs,nofglyphs={},0 + local marks,nofmarks={},0 + local nf,tm=nil,nil + for n in traverse_id(glyph_code,head) do + if getsubtype(n)<256 then + local f=getfont(n) + if f~=nf then + nf=f + tm=fontdata[nf].resources.marks + end + if tm and tm[getchar(n)] then + nofmarks=nofmarks+1 + marks[nofmarks]=n + else + nofglyphs=nofglyphs+1 + glyphs[nofglyphs]=n + end + local p=rawget(properties,n) + if p then + local i=rawget(p,"injections") + if i then + local yoffset=i.yoffset + if yoffset and yoffset~=0 then + setfield(n,"yoffset",yoffset) end - local k=n[a_kernpair] - if k then - local kk=kerns[k] - if kk then - local x,y,w,h=kk[2] or 0,kk[3] or 0,kk[4] or 0,kk[5] or 0 - local dy=y-h - if dy~=0 then - ky[n]=dy - end - if w~=0 or x~=0 then - wx[n]=kk + end + end + end + end + return glyphs,nofglyphs,marks,nofmarks +end +local function collect_glyphs_2(head) + local glyphs,nofglyphs={},0 + local marks,nofmarks={},0 + local nf,tm=nil,nil + for n in traverse_id(glyph_code,head) do + if getsubtype(n)<256 then + local f=getfont(n) + if f~=nf then + nf=f + tm=fontdata[nf].resources.marks + end + if tm and tm[getchar(n)] then + nofmarks=nofmarks+1 + marks[nofmarks]=n + else + nofglyphs=nofglyphs+1 + glyphs[nofglyphs]=n + end + end + end + return glyphs,nofglyphs,marks,nofmarks +end +local function inject_marks(marks,nofmarks) + for i=1,nofmarks do + local n=marks[i] + local pn=rawget(properties,n) + if pn then + pn=rawget(pn,"injections") + if pn then + local p=pn.markbasenode + if p then + local px=getfield(p,"xoffset") + local ox=0 + local rightkern=nil + local pp=rawget(properties,p) + if pp then + pp=rawget(pp,"injections") + if pp then + rightkern=pp.rightkern + end + end + if rightkern then + if pn.markdir<0 then + ox=px-pn.markx-rightkern + else + local leftkern=pp.leftkern + if leftkern then + ox=px-pn.markx + else + ox=px-pn.markx-leftkern end - rl[n]=kk[1] end + else + ox=px-pn.markx + local wn=getfield(n,"width") + if wn~=0 then + pn.leftkern=-wn/2 + pn.rightkern=-wn/2 + end + end + setfield(n,"xoffset",ox) + local py=getfield(p,"yoffset") + local oy=0 + if marks[p] then + oy=py+pn.marky + else + oy=getfield(n,"yoffset")+py+pn.marky end + setfield(n,"yoffset",oy) + else end end - else - local nf,tm=nil,nil - for n in traverse_id(glyph_code,head) do - if n.subtype<256 then - nofvalid=nofvalid+1 - valid[nofvalid]=n - if n.font~=nf then - nf=n.font - tm=fontdata[nf].resources.marks + end + end +end +local function inject_cursives(glyphs,nofglyphs) + local cursiveanchor,lastanchor=nil,nil + local minc,maxc,last=0,0,nil + for i=1,nofglyphs do + local n=glyphs[i] + local pn=rawget(properties,n) + if pn then + pn=rawget(pn,"injections") + end + if pn then + local cursivex=pn.cursivex + if cursivex then + if cursiveanchor then + if cursivex~=0 then + pn.leftkern=(pn.leftkern or 0)+cursivex end - if tm then - mk[n]=tm[n.char] + if lastanchor then + if maxc==0 then + minc=lastanchor + end + maxc=lastanchor + properties[cursiveanchor].cursivedy=pn.cursivey + end + last=n + else + maxc=0 + end + elseif maxc>0 then + local ny=getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti=glyphs[i] + ny=ny+properties[ti].cursivedy + setfield(ti,"yoffset",ny) + end + maxc=0 + end + if pn.cursiveanchor then + cursiveanchor=n + lastanchor=i + else + cursiveanchor=nil + lastanchor=nil + if maxc>0 then + local ny=getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti=glyphs[i] + ny=ny+properties[ti].cursivedy + setfield(ti,"yoffset",ny) end + maxc=0 end end + elseif maxc>0 then + local ny=getfield(n,"yoffset") + for i=maxc,minc,-1 do + local ti=glyphs[i] + ny=ny+properties[ti].cursivedy + setfield(ti,"yoffset",getfield(ti,"yoffset")+ny) + end + maxc=0 + cursiveanchor=nil + lastanchor=nil + end + end + if last and maxc>0 then + local ny=getfield(last,"yoffset") + for i=maxc,minc,-1 do + local ti=glyphs[i] + ny=ny+properties[ti].cursivedy + setfield(ti,"yoffset",ny) end - if nofvalid>0 then - local cx={} - if has_kerns and next(ky) then - for n,k in next,ky do - n.yoffset=k + end +end +local function inject_kerns(head,glyphs,nofglyphs) + for i=1,#glyphs do + local n=glyphs[i] + local pn=rawget(properties,n) + if pn then + local i=rawget(pn,"injections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + insert_node_before(head,n,newkern(leftkern)) + end + local rightkern=i.rightkern + if rightkern and rightkern~=0 then + insert_node_after(head,n,newkern(rightkern)) end end - if has_cursives then - local p_cursbase,p=nil,nil - local t,d,maxt={},{},0 - for i=1,nofvalid do - local n=valid[i] - if not mk[n] then - local n_cursbase=n[a_cursbase] - if p_cursbase then - local n_curscurs=n[a_curscurs] - if p_cursbase==n_curscurs then - local c=cursives[n_curscurs] - if c then - local rlmode,dx,dy,ws,wn=c[1],c[2],c[3],c[4],c[5] - if rlmode>=0 then - dx=dx-ws - else - dx=dx+wn - end - if dx~=0 then - cx[n]=dx - rl[n]=rlmode - end - dy=-dy - maxt=maxt+1 - t[maxt]=p - d[maxt]=dy - else - maxt=0 + end + end +end +local function inject_everything(head,where) + head=tonut(head) + if trace_injections then + trace(head,"everything") + end + local glyphs,nofglyphs,marks,nofmarks + if nofregisteredpairs>0 then + glyphs,nofglyphs,marks,nofmarks=collect_glyphs_1(head) + else + glyphs,nofglyphs,marks,nofmarks=collect_glyphs_2(head) + end + if nofglyphs>0 then + if nofregisteredcursives>0 then + inject_cursives(glyphs,nofglyphs) + end + if nofregisteredmarks>0 then + inject_marks(marks,nofmarks) + end + inject_kerns(head,glyphs,nofglyphs) + end + if keepregisteredcounts then + keepregisteredcounts=false + else + nofregisteredkerns=0 + nofregisteredpairs=0 + nofregisteredmarks=0 + nofregisteredcursives=0 + end + return tonode(head),true +end +local function inject_kerns_only(head,where) + head=tonut(head) + if trace_injections then + trace(head,"kerns") + end + local n=head + local p=nil + while n do + local id=getid(n) + if id==glyph_code then + if getsubtype(n)<256 then + local pn=rawget(properties,n) + if pn then + if p then + local d=getfield(p,"post") + if d then + local i=rawget(pn,"postinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + local t=find_tail(d) + insert_node_after(d,t,newkern(leftkern)) end end - elseif maxt>0 then - local ny=n.yoffset - for i=maxt,1,-1 do - ny=ny+d[i] - local ti=t[i] - ti.yoffset=ti.yoffset+ny - end - maxt=0 - end - if not n_cursbase and maxt>0 then - local ny=n.yoffset - for i=maxt,1,-1 do - ny=ny+d[i] - local ti=t[i] - ti.yoffset=ny - end - maxt=0 - end - p_cursbase,p=n_cursbase,n - end - end - if maxt>0 then - local ny=n.yoffset - for i=maxt,1,-1 do - ny=ny+d[i] - local ti=t[i] - ti.yoffset=ny - end - maxt=0 - end - if not keep then - cursives={} - end - end - if has_marks then - for i=1,nofvalid do - local p=valid[i] - local p_markbase=p[a_markbase] - if p_markbase then - local mrks=marks[p_markbase] - local nofmarks=#mrks - for n in traverse_id(glyph_code,p.next) do - local n_markmark=n[a_markmark] - if p_markbase==n_markmark then - local index=n[a_markdone] or 1 - local d=mrks[index] - if d then - local rlmode=d[3] - local k=wx[p] - if k then - local x=k[2] - local w=k[4] - if w then - if rlmode and rlmode>=0 then - n.xoffset=p.xoffset-p.width+d[1]-(w-x) - else - n.xoffset=p.xoffset-d[1]-x - end - else - if rlmode and rlmode>=0 then - n.xoffset=p.xoffset-p.width+d[1] - else - n.xoffset=p.xoffset-d[1]-x - end - end - else - if rlmode and rlmode>=0 then - n.xoffset=p.xoffset-p.width+d[1] - else - n.xoffset=p.xoffset-d[1] - end - local w=n.width - if w~=0 then - insert_node_before(head,n,newkern(-w/2)) - insert_node_after(head,n,newkern(-w/2)) - end - end - if mk[p] then - n.yoffset=p.yoffset+d[2] - else - n.yoffset=n.yoffset+p.yoffset+d[2] - end - if nofmarks==1 then - break - else - nofmarks=nofmarks-1 - end + end + local d=getfield(p,"replace") + if d then + local i=rawget(pn,"replaceinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + local t=find_tail(d) + insert_node_after(d,t,newkern(leftkern)) end - else + end + else + local i=rawget(pn,"injections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + setfield(p,"replace",newkern(leftkern)) + end + end + end + else + local i=rawget(pn,"injections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + head=insert_node_before(head,n,newkern(leftkern)) end end end end - if not keep then - marks={} + else + break + end + p=nil + elseif id==disc_code then + local d=getfield(n,"pre") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local pn=rawget(properties,n) + if pn then + local i=rawget(pn,"preinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h~=d then + setfield(n,"pre",h) end end - if next(wx) then - for n,k in next,wx do - local x=k[2] - local w=k[4] - if w then - local rl=k[1] - local wx=w-x - if rl<0 then - if wx~=0 then - insert_node_before(head,n,newkern(wx)) + local d=getfield(n,"post") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local pn=rawget(properties,n) + if pn then + local i=rawget(pn,"postinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) + end end - if x~=0 then - insert_node_after (head,n,newkern(x)) + end + else + break + end + end + if h~=d then + setfield(n,"post",h) + end + end + local d=getfield(n,"replace") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local pn=rawget(properties,n) + if pn then + local i=rawget(pn,"replaceinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) + end + end + end + else + break + end + end + if h~=d then + setfield(n,"replace",h) + end + end + p=n + else + p=nil + end + n=getnext(n) + end + if keepregisteredcounts then + keepregisteredcounts=false + else + nofregisteredkerns=0 + end + return tonode(head),true +end +local function inject_pairs_only(head,where) + head=tonut(head) + if trace_injections then + trace(head,"pairs") + end + local n=head + local p=nil + while n do + local id=getid(n) + if id==glyph_code then + if getsubtype(n)<256 then + local pn=rawget(properties,n) + if pn then + if p then + local d=getfield(p,"post") + if d then + local i=rawget(pn,"postinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + local t=find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end + end + end + local d=getfield(p,"replace") + if d then + local i=rawget(pn,"replaceinjections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + local t=find_tail(d) + insert_node_after(d,t,newkern(leftkern)) + end end else - if x~=0 then - insert_node_before(head,n,newkern(x)) + local i=rawget(pn,"injections") + if i then + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + setfield(p,"replace",newkern(leftkern)) + end + end + end + else + local i=rawget(pn,"injections") + if i then + local yoffset=i.yoffset + if yoffset and yoffset~=0 then + setfield(n,"yoffset",yoffset) + end + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + insert_node_before(head,n,newkern(leftkern)) end - if wx~=0 then - insert_node_after (head,n,newkern(wx)) + local rightkern=i.rightkern + if rightkern and rightkern~=0 then + insert_node_after(head,n,newkern(rightkern)) + n=getnext(n) end end - elseif x~=0 then - insert_node_before(head,n,newkern(x)) end end + else + break end - if next(cx) then - for n,k in next,cx do - if k~=0 then - local rln=rl[n] - if rln and rln<0 then - insert_node_before(head,n,newkern(-k)) - else - insert_node_before(head,n,newkern(k)) + p=nil + elseif id==disc_code then + local d=getfield(n,"pre") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local p=rawget(properties,n) + if p then + local i=rawget(p,"preinjections") + if i then + local yoffset=i.yoffset + if yoffset and yoffset~=0 then + setfield(n,"yoffset",yoffset) + end + local leftkern=i.leftkern + if leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) + end + local rightkern=i.rightkern + if rightkern and rightkern~=0 then + insert_node_after(head,n,newkern(rightkern)) + n=getnext(n) + end + end end + else + break end end + if h~=d then + setfield(n,"pre",h) + end end - if not keep then - kerns={} - end - return head,true - elseif not keep then - kerns,cursives,marks={},{},{} - end - elseif has_kerns then - if trace_injections then - trace(head) - end - for n in traverse_id(glyph_code,head) do - if n.subtype<256 then - local k=n[a_kernpair] - if k then - local kk=kerns[k] - if kk then - local rl,x,y,w=kk[1],kk[2] or 0,kk[3],kk[4] - if y and y~=0 then - n.yoffset=y - end - if w then - local wx=w-x - if rl<0 then - if wx~=0 then - insert_node_before(head,n,newkern(wx)) - end - if x~=0 then - insert_node_after (head,n,newkern(x)) + local d=getfield(n,"post") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local p=rawget(properties,n) + if p then + local i=rawget(p,"postinjections") + if i then + local yoffset=i.yoffset + if yoffset and yoffset~=0 then + setfield(n,"yoffset",yoffset) end - else - if x~=0 then - insert_node_before(head,n,newkern(x)) + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) end - if wx~=0 then - insert_node_after(head,n,newkern(wx)) + local rightkern=i.rightkern + if rightkern and rightkern~=0 then + insert_node_after(head,n,newkern(rightkern)) + n=getnext(n) end end - else - if x~=0 then - insert_node_before(head,n,newkern(x)) + end + else + break + end + end + if h~=d then + setfield(n,"post",h) + end + end + local d=getfield(n,"replace") + if d then + local h=d + for n in traverse_id(glyph_code,d) do + if getsubtype(n)<256 then + local p=rawget(properties,n) + if p then + local i=rawget(pn,"replaceinjections") + if i then + local yoffset=i.yoffset + if yoffset and yoffset~=0 then + setfield(n,"yoffset",yoffset) + end + local leftkern=i.leftkern + if leftkern and leftkern~=0 then + h=insert_node_before(h,n,newkern(leftkern)) + end + local rightkern=i.rightkern + if rightkern and rightkern~=0 then + insert_node_after(head,n,newkern(rightkern)) + n=getnext(n) + end end end + else + break end end + if h~=d then + setfield(n,"replace",h) + end end + p=n + else + p=nil end - if not keep then - kerns={} - end - return head,true + n=getnext(n) + end + if keepregisteredcounts then + keepregisteredcounts=false else + nofregisteredpairs=0 + nofregisteredkerns=0 + end + return tonode(head),true +end +function injections.handler(head,where) + if nofregisteredmarks>0 or nofregisteredcursives>0 then + return inject_everything(head,where) + elseif nofregisteredpairs>0 then + return inject_pairs_only(head,where) + elseif nofregisteredkerns>0 then + return inject_kerns_only(head,where) + else + return head,false end - return head,false end end -- closure do -- begin closure to overcome local limits and interference -if not modules then modules={} end modules ['font-ota']={ +if not modules then modules={} end modules ['font-otx']={ version=1.001, comment="companion to font-otf.lua (analysing)", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -9568,13 +10882,24 @@ analyzers.initializers=initializers analyzers.methods=methods analyzers.useunicodemarks=false local a_state=attributes.private('state') +local nuts=nodes.nuts +local tonut=nuts.tonut +local getfield=nuts.getfield +local getnext=nuts.getnext +local getprev=nuts.getprev +local getid=nuts.getid +local getprop=nuts.getprop +local setprop=nuts.setprop +local getfont=nuts.getfont +local getsubtype=nuts.getsubtype +local getchar=nuts.getchar +local traverse_id=nuts.traverse_id +local traverse_node_list=nuts.traverse +local end_of_math=nuts.end_of_math local nodecodes=nodes.nodecodes local glyph_code=nodecodes.glyph local disc_code=nodecodes.disc local math_code=nodecodes.math -local traverse_id=node.traverse_id -local traverse_node_list=node.traverse -local end_of_math=node.end_of_math local fontdata=fonts.hashes.identifiers local categories=characters and characters.categories or {} local otffeatures=fonts.constructors.newfeatures("otf") @@ -9616,51 +10941,52 @@ function analyzers.setstate(head,font) local tfmdata=fontdata[font] local descriptions=tfmdata.descriptions local first,last,current,n,done=nil,nil,head,0,false + current=tonut(current) while current do - local id=current.id - if id==glyph_code and current.font==font then + local id=getid(current) + if id==glyph_code and getfont(current)==font then done=true - local char=current.char + local char=getchar(current) local d=descriptions[char] if d then if d.class=="mark" or (useunicodemarks and categories[char]=="mn") then done=true - current[a_state]=s_mark + setprop(current,a_state,s_mark) elseif n==0 then first,last,n=current,current,1 - current[a_state]=s_init + setprop(current,a_state,s_init) else last,n=current,n+1 - current[a_state]=s_medi + setprop(current,a_state,s_medi) end else if first and first==last then - last[a_state]=s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state]=s_fina + setprop(last,a_state,s_fina) end first,last,n=nil,nil,0 end elseif id==disc_code then - current[a_state]=s_medi + setprop(current,a_state,s_medi) last=current else if first and first==last then - last[a_state]=s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state]=s_fina + setprop(last,a_state,s_fina) end first,last,n=nil,nil,0 if id==math_code then current=end_of_math(current) end end - current=current.next + current=getnext(current) end if first and first==last then - last[a_state]=s_isol + setprop(last,a_state,s_isol) elseif last then - last[a_state]=s_fina + setprop(last,a_state,s_fina) end return head,done end @@ -9716,6 +11042,7 @@ local isolated={ [0x0856]=true,[0x0858]=true,[0x0857]=true, [0x07FA]=true, [zwnj]=true, + [0x08AD]=true, } local final={ [0x0622]=true,[0x0623]=true,[0x0624]=true,[0x0625]=true, @@ -9733,15 +11060,16 @@ local final={ [0x06D3]=true,[0x06D5]=true,[0x06EE]=true,[0x06EF]=true, [0x0759]=true,[0x075A]=true,[0x075B]=true,[0x076B]=true, [0x076C]=true,[0x0771]=true,[0x0773]=true,[0x0774]=true, - [0x0778]=true,[0x0779]=true, + [0x0778]=true,[0x0779]=true, [0x08AA]=true,[0x08AB]=true,[0x08AC]=true, [0xFEF5]=true,[0xFEF7]=true,[0xFEF9]=true,[0xFEFB]=true, - [0x0710]=true,[0x0715]=true,[0x0716]=true,[0x0717]=true, - [0x0718]=true,[0x0719]=true,[0x0728]=true,[0x072A]=true, - [0x072C]=true,[0x071E]=true, + [0x0710]=true,[0x0715]=true,[0x0716]=true,[0x0717]=true, + [0x0718]=true,[0x0719]=true,[0x0728]=true,[0x072A]=true, + [0x072C]=true,[0x071E]=true, [0x072F]=true,[0x074D]=true, [0x0840]=true,[0x0849]=true,[0x0854]=true,[0x0846]=true, - [0x084F]=true + [0x084F]=true, + [0x08AE]=true,[0x08B1]=true,[0x08B2]=true, } local medial={ [0x0626]=true,[0x0628]=true,[0x062A]=true,[0x062B]=true, @@ -9801,12 +11129,12 @@ local medial={ [0x07D2]=true,[0x07D0]=true,[0x07CF]=true,[0x07CD]=true, [0x07CB]=true,[0x07D3]=true,[0x07E4]=true,[0x07D5]=true, [0x07E6]=true, - [tatweel]=true, - [zwj]=true, + [tatweel]=true,[zwj]=true, + [0x08A1]=true,[0x08AF]=true,[0x08B0]=true, } local arab_warned={} local function warning(current,what) - local char=current.char + local char=getchar(current) if not arab_warned[char] then log.report("analyze","arab: character %C has no %a class",char,what) arab_warned[char]=true @@ -9815,30 +11143,30 @@ end local function finish(first,last) if last then if first==last then - local fc=first.char + local fc=getchar(first) if medial[fc] or final[fc] then - first[a_state]=s_isol + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state]=s_error + setprop(first,a_state,s_error) end else - local lc=last.char + local lc=getchar(last) if medial[lc] or final[lc] then - last[a_state]=s_fina + setprop(last,a_state,s_fina) else warning(last,"fina") - last[a_state]=s_error + setprop(last,a_state,s_error) end end first,last=nil,nil elseif first then - local fc=first.char + local fc=getchar(first) if medial[fc] or final[fc] then - first[a_state]=s_isol + setprop(first,a_state,s_isol) else warning(first,"isol") - first[a_state]=s_error + setprop(first,a_state,s_error) end first=nil end @@ -9849,38 +11177,39 @@ function methods.arab(head,font,attr) local tfmdata=fontdata[font] local marks=tfmdata.resources.marks local first,last,current,done=nil,nil,head,false + current=tonut(current) while current do - local id=current.id - if id==glyph_code and current.font==font and current.subtype<256 and not current[a_state] then + local id=getid(current) + if id==glyph_code and getfont(current)==font and getsubtype(current)<256 and not getprop(current,a_state) then done=true - local char=current.char + local char=getchar(current) if marks[char] or (useunicodemarks and categories[char]=="mn") then - current[a_state]=s_mark + setprop(current,a_state,s_mark) elseif isolated[char] then first,last=finish(first,last) - current[a_state]=s_isol + setprop(current,a_state,s_isol) first,last=nil,nil elseif not first then if medial[char] then - current[a_state]=s_init + setprop(current,a_state,s_init) first,last=first or current,current elseif final[char] then - current[a_state]=s_isol + setprop(current,a_state,s_isol) first,last=nil,nil else first,last=finish(first,last) end elseif medial[char] then first,last=first or current,current - current[a_state]=s_medi + setprop(current,a_state,s_medi) elseif final[char] then - if not last[a_state]==s_init then - last[a_state]=s_medi + if getprop(last,a_state)~=s_init then + setprop(last,a_state,s_medi) end - current[a_state]=s_fina + setprop(current,a_state,s_fina) first,last=nil,nil elseif char>=0x0600 and char<=0x06FF then - current[a_state]=s_rest + setprop(current,a_state,s_rest) first,last=finish(first,last) else first,last=finish(first,last) @@ -9893,7 +11222,7 @@ function methods.arab(head,font,attr) current=end_of_math(current) end end - current=current.next + current=getnext(current) end if first or last then finish(first,last) @@ -9950,6 +11279,7 @@ local report_chain=logs.reporter("fonts","otf chain") local report_process=logs.reporter("fonts","otf process") local report_prepare=logs.reporter("fonts","otf prepare") local report_warning=logs.reporter("fonts","otf warning") +local report_run=logs.reporter("fonts","otf run") registertracker("otf.verbose_chain",function(v) otf.setcontextchain(v and "verbose") end) registertracker("otf.normal_chain",function(v) otf.setcontextchain(v and "normal") end) registertracker("otf.replacements","otf.singles,otf.multiples,otf.alternatives,otf.ligatures") @@ -9957,12 +11287,33 @@ registertracker("otf.positions","otf.marks,otf.kerns,otf.cursive") registertracker("otf.actions","otf.replacements,otf.positions") registertracker("otf.injections","nodes.injections") registertracker("*otf.sample","otf.steps,otf.actions,otf.analyzing") -local insert_node_after=node.insert_after -local delete_node=nodes.delete -local copy_node=node.copy -local find_node_tail=node.tail or node.slide -local flush_node_list=node.flush_list -local end_of_math=node.end_of_math +local nuts=nodes.nuts +local tonode=nuts.tonode +local tonut=nuts.tonut +local getfield=nuts.getfield +local setfield=nuts.setfield +local getnext=nuts.getnext +local getprev=nuts.getprev +local getid=nuts.getid +local getattr=nuts.getattr +local setattr=nuts.setattr +local getprop=nuts.getprop +local setprop=nuts.setprop +local getfont=nuts.getfont +local getsubtype=nuts.getsubtype +local getchar=nuts.getchar +local insert_node_before=nuts.insert_before +local insert_node_after=nuts.insert_after +local delete_node=nuts.delete +local remove_node=nuts.remove +local copy_node=nuts.copy +local copy_node_list=nuts.copy_list +local find_node_tail=nuts.tail +local flush_node_list=nuts.flush_list +local free_node=nuts.free +local end_of_math=nuts.end_of_math +local traverse_nodes=nuts.traverse +local traverse_id=nuts.traverse_id local setmetatableindex=table.setmetatableindex local zwnj=0x200C local zwj=0x200D @@ -9980,25 +11331,22 @@ local math_code=nodecodes.math local dir_code=whatcodes.dir local localpar_code=whatcodes.localpar local discretionary_code=disccodes.discretionary +local regular_code=disccodes.regular +local automatic_code=disccodes.automatic local ligature_code=glyphcodes.ligature local privateattribute=attributes.private local a_state=privateattribute('state') -local a_markbase=privateattribute('markbase') -local a_markmark=privateattribute('markmark') -local a_markdone=privateattribute('markdone') -local a_cursbase=privateattribute('cursbase') -local a_curscurs=privateattribute('curscurs') -local a_cursdone=privateattribute('cursdone') -local a_kernpair=privateattribute('kernpair') -local a_ligacomp=privateattribute('ligacomp') +local a_cursbase=privateattribute('cursbase') local injections=nodes.injections local setmark=injections.setmark local setcursive=injections.setcursive local setkern=injections.setkern local setpair=injections.setpair -local markonce=true +local resetinjection=injections.reset +local copyinjection=injections.copy +local setligaindex=injections.setligaindex +local getligaindex=injections.getligaindex local cursonce=true -local kernonce=true local fonthashes=fonts.hashes local fontdata=fonthashes.identifiers local otffeatures=fonts.constructors.newfeatures("otf") @@ -10014,6 +11362,7 @@ local currentfont=false local lookuptable=false local anchorlookups=false local lookuptypes=false +local lookuptags=false local handlers={} local rlmode=0 local featurevalue=false @@ -10058,98 +11407,104 @@ local function gref(n) end local function cref(kind,chainname,chainlookupname,lookupname,index) if index then - return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index) + return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index) elseif lookupname then - return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname) + return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname]) elseif chainlookupname then - return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname) + return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname]) elseif chainname then - return formatters["feature %a, chain %a"](kind,chainname) + return formatters["feature %a, chain %a"](kind,lookuptags[chainname]) else return formatters["feature %a"](kind) end end local function pref(kind,lookupname) - return formatters["feature %a, lookup %a"](kind,lookupname) + return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname]) end local function copy_glyph(g) - local components=g.components + local components=getfield(g,"components") if components then - g.components=nil + setfield(g,"components",nil) local n=copy_node(g) - g.components=components + copyinjection(n,g) + setfield(g,"components",components) return n else - return copy_node(g) + local n=copy_node(g) + copyinjection(n,g) + return n end end local function markstoligature(kind,lookupname,head,start,stop,char) - if start==stop and start.char==char then + if start==stop and getchar(start)==char then return head,start else - local prev=start.prev - local next=stop.next - start.prev=nil - stop.next=nil + local prev=getprev(start) + local next=getnext(stop) + setfield(start,"prev",nil) + setfield(stop,"next",nil) local base=copy_glyph(start) if head==start then head=base end - base.char=char - base.subtype=ligature_code - base.components=start + resetinjection(base) + setfield(base,"char",char) + setfield(base,"subtype",ligature_code) + setfield(base,"components",start) if prev then - prev.next=base + setfield(prev,"next",base) end if next then - next.prev=base + setfield(next,"prev",base) end - base.next=next - base.prev=prev + setfield(base,"next",next) + setfield(base,"prev",prev) return head,base end end local function getcomponentindex(start) - if start.id~=glyph_code then + if getid(start)~=glyph_code then return 0 - elseif start.subtype==ligature_code then + elseif getsubtype(start)==ligature_code then local i=0 - local components=start.components + local components=getfield(start,"components") while components do i=i+getcomponentindex(components) - components=components.next + components=getnext(components) end return i - elseif not marks[start.char] then + elseif not marks[getchar(start)] then return 1 else return 0 end end local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) - if start==stop and start.char==char then - start.char=char + if start==stop and getchar(start)==char then + resetinjection(start) + setfield(start,"char",char) return head,start end - local prev=start.prev - local next=stop.next - start.prev=nil - stop.next=nil + local prev=getprev(start) + local next=getnext(stop) + setfield(start,"prev",nil) + setfield(stop,"next",nil) local base=copy_glyph(start) if start==head then head=base end - base.char=char - base.subtype=ligature_code - base.components=start + resetinjection(base) + setfield(base,"char",char) + setfield(base,"subtype",ligature_code) + setfield(base,"components",start) if prev then - prev.next=base + setfield(prev,"next",base) end if next then - next.prev=base + setfield(next,"prev",base) end - base.next=next - base.prev=prev + setfield(base,"next",next) + setfield(base,"prev",prev) if not discfound then local deletemarks=markflag~="mark" local components=start @@ -10158,42 +11513,43 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun local head=base local current=base while start do - local char=start.char + local char=getchar(start) if not marks[char] then baseindex=baseindex+componentindex componentindex=getcomponentindex(start) elseif not deletemarks then - start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex) + setligaindex(start,baseindex+getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end head,current=insert_node_after(head,current,copy_node(start)) elseif trace_marks then logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) end - start=start.next + start=getnext(start) end - local start=current.next - while start and start.id==glyph_code do - local char=start.char + local start=getnext(current) + while start and getid(start)==glyph_code do + local char=getchar(start) if marks[char] then - start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex) + setligaindex(start,baseindex+getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end else break end - start=start.next + start=getnext(start) end end return head,base end function handlers.gsub_single(head,start,kind,lookupname,replacement) if trace_singles then - logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement)) + logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement)) end - start.char=replacement + resetinjection(start) + setfield(start,"char",replacement) return head,start,true end local function get_alternative_glyph(start,alternatives,value,trace_alternatives) @@ -10219,7 +11575,7 @@ local function get_alternative_glyph(start,alternatives,value,trace_alternatives return false,trace_alternatives and formatters["invalid value %a, %s"](value,"out of range") end elseif value==0 then - return start.char,trace_alternatives and formatters["invalid value %a, %s"](value,"no change") + return getchar(start),trace_alternatives and formatters["invalid value %a, %s"](value,"no change") elseif value<1 then return alternatives[1],trace_alternatives and formatters["invalid value %a, taking %a"](value,1) else @@ -10230,25 +11586,27 @@ end local function multiple_glyphs(head,start,multiple,ignoremarks) local nofmultiples=#multiple if nofmultiples>0 then - start.char=multiple[1] + resetinjection(start) + setfield(start,"char",multiple[1]) if nofmultiples>1 then - local sn=start.next + local sn=getnext(start) for k=2,nofmultiples do local n=copy_node(start) - n.char=multiple[k] - n.next=sn - n.prev=start + resetinjection(n) + setfield(n,"char",multiple[k]) + setfield(n,"next",sn) + setfield(n,"prev",start) if sn then - sn.prev=n + setfield(sn,"prev",n) end - start.next=n + setfield(start,"next",n) start=n end end return head,start,true else if trace_multiples then - logprocess("no multiple for %s",gref(start.char)) + logprocess("no multiple for %s",gref(getchar(start))) end return head,start,false end @@ -10258,34 +11616,35 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence local choice,comment=get_alternative_glyph(start,alternative,value,trace_alternatives) if choice then if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(start.char),choice,gref(choice),comment) + logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment) end - start.char=choice + resetinjection(start) + setfield(start,"char",choice) else if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(start.char),comment) + logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(getchar(start)),comment) end end return head,start,true end function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence) if trace_multiples then - logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple)) + logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(getchar(start)),gref(multiple)) end return multiple_glyphs(head,start,multiple,sequence.flags[1]) end function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) - local s,stop,discfound=start.next,nil,false - local startchar=start.char + local s,stop,discfound=getnext(start),nil,false + local startchar=getchar(start) if marks[startchar] then while s do - local id=s.id - if id==glyph_code and s.font==currentfont and s.subtype<256 then - local lg=ligature[s.char] + local id=getid(s) + if id==glyph_code and getfont(s)==currentfont and getsubtype(s)<256 then + local lg=ligature[getchar(s)] if lg then stop=s ligature=lg - s=s.next + s=getnext(s) else break end @@ -10297,9 +11656,9 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) local lig=ligature.ligature if lig then if trace_ligatures then - local stopchar=stop.char + local stopchar=getchar(stop) head,start=markstoligature(kind,lookupname,head,start,stop,lig) - logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char)) + logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) else head,start=markstoligature(kind,lookupname,head,start,stop,lig) end @@ -10310,18 +11669,18 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) else local skipmark=sequence.flags[1] while s do - local id=s.id - if id==glyph_code and s.subtype<256 then - if s.font==currentfont then - local char=s.char + local id=getid(s) + if id==glyph_code and getsubtype(s)<256 then + if getfont(s)==currentfont then + local char=getchar(s) if skipmark and marks[char] then - s=s.next + s=getnext(s) else local lg=ligature[char] if lg then stop=s ligature=lg - s=s.next + s=getnext(s) else break end @@ -10331,7 +11690,7 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) end elseif id==disc_code then discfound=true - s=s.next + s=getnext(s) else break end @@ -10340,36 +11699,36 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) if lig then if stop then if trace_ligatures then - local stopchar=stop.char + local stopchar=getchar(stop) head,start=toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) - logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char)) + logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) else head,start=toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) end - return head,start,true else - start.char=lig + resetinjection(start) + setfield(start,"char",lig) if trace_ligatures then logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig)) end - return head,start,true end + return head,start,true else end end return head,start,false end function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then - local base=start.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char + local base=getprev(start) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) if marks[basechar] then while true do - base=base.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - basechar=base.char + base=getprev(base) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + basechar=getchar(base) if not marks[basechar] then break end @@ -10393,7 +11752,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence if al[anchor] then local ma=markanchors[anchor] if ma then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -10418,16 +11777,16 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence return head,start,false end function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequence) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then - local base=start.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char + local base=getprev(start) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) if marks[basechar] then while true do - base=base.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - basechar=base.char + base=getprev(base) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + basechar=getchar(base) if not marks[basechar] then break end @@ -10439,7 +11798,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ end end end - local index=start[a_ligacomp] + local index=getligaindex(start) local baseanchors=descriptions[basechar] if baseanchors then baseanchors=baseanchors.anchors @@ -10453,7 +11812,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ if ma then ba=ba[index] if ba then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) @@ -10484,22 +11843,22 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ return head,start,false end function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then - local base=start.prev - local slc=start[a_ligacomp] + local base=getprev(start) + local slc=getligaindex(start) if slc then while base do - local blc=base[a_ligacomp] + local blc=getligaindex(base) if blc and blc~=slc then - base=base.prev + base=getprev(base) else break end end end - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) local baseanchors=descriptions[basechar] if baseanchors then baseanchors=baseanchors.anchors @@ -10511,7 +11870,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence if al[anchor] then local ma=markanchors[anchor] if ma then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true) + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -10537,20 +11896,20 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence return head,start,false end function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) - local alreadydone=cursonce and start[a_cursbase] + local alreadydone=cursonce and getprop(start,a_cursbase) if not alreadydone then local done=false - local startchar=start.char + local startchar=getchar(start) if marks[startchar] then if trace_cursive then logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) end else - local nxt=start.next - while not done and nxt and nxt.id==glyph_code and nxt.font==currentfont and nxt.subtype<256 do - local nextchar=nxt.char + local nxt=getnext(start) + while not done and nxt and getid(nxt)==glyph_code and getfont(nxt)==currentfont and getsubtype(nxt)<256 do + local nextchar=getchar(nxt) if marks[nextchar] then - nxt=nxt.next + nxt=getnext(nxt) else local entryanchors=descriptions[nextchar] if entryanchors then @@ -10584,13 +11943,13 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) return head,start,done else if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone) + logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) end return head,start,false end end function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence) - local startchar=start.char + local startchar=getchar(start) local dx,dy,w,h=setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar]) if trace_kerns then logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h) @@ -10598,33 +11957,33 @@ function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence) return head,start,false end function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) - local snext=start.next + local snext=getnext(start) if not snext then return head,start,false else local prev,done=start,false local factor=tfmdata.parameters.factor local lookuptype=lookuptypes[lookupname] - while snext and snext.id==glyph_code and snext.font==currentfont and snext.subtype<256 do - local nextchar=snext.char + while snext and getid(snext)==glyph_code and getfont(snext)==currentfont and getsubtype(snext)<256 do + local nextchar=getchar(snext) local krn=kerns[nextchar] if not krn and marks[nextchar] then prev=snext - snext=snext.next + snext=getnext(snext) else if not krn then elseif type(krn)=="table" then if lookuptype=="pair" then local a,b=krn[2],krn[3] if a and #a>0 then - local startchar=start.char + local startchar=getchar(start) local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b>0 then - local startchar=start.char + local startchar=getchar(start) local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) @@ -10637,7 +11996,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) elseif krn~=0 then local k=setkern(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) end done=true end @@ -10672,13 +12031,14 @@ function chainmores.chainsub(head,start,stop,kind,chainname,currentcontext,looku return head,start,false end function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,lookuphash,replacements) - local char=start.char + local char=getchar(start) local replacement=replacements[char] if replacement then if trace_singles then logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement)) end - start.char=replacement + resetinjection(start) + setfield(start,"char",replacement) return head,start,true else return head,start,false @@ -10691,8 +12051,8 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," ")) end while current do - if current.id==glyph_code then - local currentchar=current.char + if getid(current)==glyph_code then + local currentchar=getchar(current) local lookupname=subtables[1] local replacement=lookuphash[lookupname] if not replacement then @@ -10709,21 +12069,22 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo if trace_singles then logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement)) end - current.char=replacement + resetinjection(current) + setfield(current,"char",replacement) end end return head,start,true elseif current==stop then break else - current=current.next + current=getnext(current) end end return head,start,false end chainmores.gsub_single=chainprocs.gsub_single function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local startchar=start.char + local startchar=getchar(start) local subtables=currentlookup.subtables local lookupname=subtables[1] local replacements=lookuphash[lookupname] @@ -10752,8 +12113,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext local subtables=currentlookup.subtables local value=featurevalue==true and tfmdata.shared.features[kind] or featurevalue while current do - if current.id==glyph_code then - local currentchar=current.char + if getid(current)==glyph_code then + local currentchar=getchar(current) local lookupname=subtables[1] local alternatives=lookuphash[lookupname] if not alternatives then @@ -10768,7 +12129,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext if trace_alternatives then logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment) end - start.char=choice + resetinjection(start) + setfield(start,"char",choice) else if trace_alternatives then logwarning("%s: no variant %a for %s, %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(char),comment) @@ -10782,14 +12144,14 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext elseif current==stop then break else - current=current.next + current=getnext(current) end end return head,start,false end chainmores.gsub_alternate=chainprocs.gsub_alternate function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex) - local startchar=start.char + local startchar=getchar(start) local subtables=currentlookup.subtables local lookupname=subtables[1] local ligatures=lookuphash[lookupname] @@ -10804,20 +12166,20 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) end else - local s=start.next + local s=getnext(start) local discfound=false local last=stop local nofreplacements=0 local skipmark=currentlookup.flags[1] while s do - local id=s.id + local id=getid(s) if id==disc_code then - s=s.next + s=getnext(s) discfound=true else - local schar=s.char + local schar=getchar(s) if skipmark and marks[schar] then - s=s.next + s=getnext(s) else local lg=ligatures[schar] if lg then @@ -10825,7 +12187,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if s==stop then break else - s=s.next + s=getnext(s) end else break @@ -10842,7 +12204,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if start==stop then logprocess("%s: replacing character %s by ligature %s case 3",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2)) else - logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2)) + logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)),gref(l2)) end end head,start=toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound) @@ -10851,7 +12213,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if start==stop then logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) else - logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char)) + logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop))) end end end @@ -10860,7 +12222,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, end chainmores.gsub_ligature=chainprocs.gsub_ligature function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then local subtables=currentlookup.subtables local lookupname=subtables[1] @@ -10869,14 +12231,14 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext markanchors=markanchors[markchar] end if markanchors then - local base=start.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char + local base=getprev(start) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) if marks[basechar] then while true do - base=base.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - basechar=base.char + base=getprev(base) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + basechar=getchar(base) if not marks[basechar] then break end @@ -10897,7 +12259,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext if al[anchor] then local ma=markanchors[anchor] if ma then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -10923,7 +12285,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext return head,start,false end function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then local subtables=currentlookup.subtables local lookupname=subtables[1] @@ -10932,14 +12294,14 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon markanchors=markanchors[markchar] end if markanchors then - local base=start.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char + local base=getprev(start) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) if marks[basechar] then while true do - base=base.prev - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - basechar=base.char + base=getprev(base) + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + basechar=getchar(base) if not marks[basechar] then break end @@ -10951,7 +12313,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon end end end - local index=start[a_ligacomp] + local index=getligaindex(start) local baseanchors=descriptions[basechar].anchors if baseanchors then local baseanchors=baseanchors['baselig'] @@ -10963,7 +12325,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon if ma then ba=ba[index] if ba then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy) @@ -10990,67 +12352,67 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon return head,start,false end function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar=start.char + local markchar=getchar(start) if marks[markchar] then - local subtables=currentlookup.subtables - local lookupname=subtables[1] - local markanchors=lookuphash[lookupname] - if markanchors then - markanchors=markanchors[markchar] - end - if markanchors then - local base=start.prev - local slc=start[a_ligacomp] - if slc then - while base do - local blc=base[a_ligacomp] - if blc and blc~=slc then - base=base.prev - else - break - end + local subtables=currentlookup.subtables + local lookupname=subtables[1] + local markanchors=lookuphash[lookupname] + if markanchors then + markanchors=markanchors[markchar] + end + if markanchors then + local base=getprev(start) + local slc=getligaindex(start) + if slc then + while base do + local blc=getligaindex(base) + if blc and blc~=slc then + base=getprev(base) + else + break end end - if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then - local basechar=base.char - local baseanchors=descriptions[basechar].anchors + end + if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then + local basechar=getchar(base) + local baseanchors=descriptions[basechar].anchors + if baseanchors then + baseanchors=baseanchors['basemark'] if baseanchors then - baseanchors=baseanchors['basemark'] - if baseanchors then - local al=anchorlookups[lookupname] - for anchor,ba in next,baseanchors do - if al[anchor] then - local ma=markanchors[anchor] - if ma then - local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head,start,true + local al=anchorlookups[lookupname] + for anchor,ba in next,baseanchors do + if al[anchor] then + local ma=markanchors[anchor] + if ma then + local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) + if trace_marks then + logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", + cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) end + return head,start,true end end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) - end + end + if trace_bugs then + logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) end end - elseif trace_bugs then - logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname)) end elseif trace_bugs then - logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) + logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname)) end + elseif trace_bugs then + logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) + end elseif trace_bugs then logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) end return head,start,false end function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local alreadydone=cursonce and start[a_cursbase] + local alreadydone=cursonce and getprop(start,a_cursbase) if not alreadydone then - local startchar=start.char + local startchar=getchar(start) local subtables=currentlookup.subtables local lookupname=subtables[1] local exitanchors=lookuphash[lookupname] @@ -11064,11 +12426,11 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) end else - local nxt=start.next - while not done and nxt and nxt.id==glyph_code and nxt.font==currentfont and nxt.subtype<256 do - local nextchar=nxt.char + local nxt=getnext(start) + while not done and nxt and getid(nxt)==glyph_code and getfont(nxt)==currentfont and getsubtype(nxt)<256 do + local nextchar=getchar(nxt) if marks[nextchar] then - nxt=nxt.next + nxt=getnext(nxt) else local entryanchors=descriptions[nextchar] if entryanchors then @@ -11102,7 +12464,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l return head,start,done else if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone) + logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) end return head,start,false end @@ -11110,7 +12472,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l return head,start,false end function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) - local startchar=start.char + local startchar=getchar(start) local subtables=currentlookup.subtables local lookupname=subtables[1] local kerns=lookuphash[lookupname] @@ -11127,9 +12489,9 @@ function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lo end chainmores.gpos_single=chainprocs.gpos_single function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) - local snext=start.next + local snext=getnext(start) if snext then - local startchar=start.char + local startchar=getchar(start) local subtables=currentlookup.subtables local lookupname=subtables[1] local kerns=lookuphash[lookupname] @@ -11139,26 +12501,26 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look local lookuptype=lookuptypes[lookupname] local prev,done=start,false local factor=tfmdata.parameters.factor - while snext and snext.id==glyph_code and snext.font==currentfont and snext.subtype<256 do - local nextchar=snext.char + while snext and getid(snext)==glyph_code and getfont(snext)==currentfont and getsubtype(snext)<256 do + local nextchar=getchar(snext) local krn=kerns[nextchar] if not krn and marks[nextchar] then prev=snext - snext=snext.next + snext=getnext(snext) else if not krn then elseif type(krn)=="table" then if lookuptype=="pair" then local a,b=krn[2],krn[3] if a and #a>0 then - local startchar=start.char + local startchar=getchar(start) local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b>0 then - local startchar=start.char + local startchar=getchar(start) local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) @@ -11170,7 +12532,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look if a and a~=0 then local k=setkern(snext,factor,rlmode,a) if trace_kerns then - logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) end end if b and b~=0 then @@ -11181,7 +12543,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look elseif krn~=0 then local k=setkern(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) end done=true end @@ -11202,6 +12564,10 @@ local function show_skip(kind,chainname,char,ck,class) logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(kind,chainname),gref(char),class,ck[1],ck[2]) end end +local quit_on_no_replacement=true +directives.register("otf.chain.quitonnoreplacement",function(value) + quit_on_no_replacement=value +end) local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash) local flags=sequence.flags local done=false @@ -11219,7 +12585,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq local seq=ck[3] local s=#seq if s==1 then - match=current.id==glyph_code and current.font==currentfont and current.subtype<256 and seq[1][current.char] + match=getid(current)==glyph_code and getfont(current)==currentfont and getsubtype(current)<256 and seq[1][getchar(current)] else local f,l=ck[4],ck[5] if f==1 and f==l then @@ -11227,13 +12593,13 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq if f==l then else local n=f+1 - last=last.next + last=getnext(last) while n<=l do if last then - local id=last.id + local id=getid(last) if id==glyph_code then - if last.font==currentfont and last.subtype<256 then - local char=last.char + if getfont(last)==currentfont and getsubtype(last)<256 then + local char=getchar(last) local ccd=descriptions[char] if ccd then local class=ccd.class @@ -11242,10 +12608,10 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq if trace_skips then show_skip(kind,chainname,char,ck,class) end - last=last.next + last=getnext(last) elseif seq[n][char] then if n1 then - local prev=start.prev + local prev=getprev(start) if prev then local n=f-1 while n>=1 do if prev then - local id=prev.id + local id=getid(prev) if id==glyph_code then - if prev.font==currentfont and prev.subtype<256 then - local char=prev.char + if getfont(prev)==currentfont and getsubtype(prev)<256 then + local char=getchar(prev) local ccd=descriptions[char] if ccd then local class=ccd.class @@ -11312,7 +12678,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq match=false break end - prev=prev.prev + prev=getprev(prev) elseif seq[n][32] then n=n -1 else @@ -11332,15 +12698,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end end if match and s>l then - local current=last and last.next + local current=last and getnext(last) if current then local n=l+1 while n<=s do if current then - local id=current.id + local id=getid(current) if id==glyph_code then - if current.font==currentfont and current.subtype<256 then - local char=current.char + if getfont(current)==currentfont and getsubtype(current)<256 then + local char=getchar(current) local ccd=descriptions[char] if ccd then local class=ccd.class @@ -11370,7 +12736,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq match=false break end - current=current.next + current=getnext(current) elseif seq[n][32] then n=n+1 else @@ -11393,7 +12759,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq if match then if trace_contexts then local rule,lookuptype,f,l=ck[1],ck[2],ck[4],ck[5] - local char=start.char + local char=getchar(start) if ck[9] then logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a, %a => %a", cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10]) @@ -11424,15 +12790,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end else local i=1 - repeat + while true do if skipped then while true do - local char=start.char + local char=getchar(start) local ccd=descriptions[char] if ccd then local class=ccd.class if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then - start=start.next + start=getnext(start) else break end @@ -11461,18 +12827,20 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end end end - if start then - start=start.next + if i>nofchainlookups then + break + elseif start then + start=getnext(start) else end - until i>nofchainlookups + end end else local replacements=ck[7] if replacements then head,start,done=chainprocs.reversesub(head,start,last,kind,chainname,ck,lookuphash,replacements) else - done=true + done=quit_on_no_replacement if trace_contexts then logprocess("%s: skipping match",cref(kind,chainname)) end @@ -11543,7 +12911,7 @@ local function initialize(sequence,script,language,enabled) if features then local order=sequence.order if order then - for i=1,#order do + for i=1,#order do local kind=order[i] local valid=enabled[kind] if valid then @@ -11595,6 +12963,7 @@ local function featuresprocessor(head,font,attr) if not lookuphash then return head,false end + head=tonut(head) if trace_steps then checkstep(head) end @@ -11606,6 +12975,7 @@ local function featuresprocessor(head,font,attr) anchorlookups=resources.lookup_to_anchor lookuptable=resources.lookups lookuptypes=resources.lookuptypes + lookuptags=resources.lookuptags currentfont=font rlmode=0 local sequences=resources.sequences @@ -11627,10 +12997,10 @@ local function featuresprocessor(head,font,attr) local handler=handlers[typ] local start=find_node_tail(head) while start do - local id=start.id + local id=getid(start) if id==glyph_code then - if start.font==font and start.subtype<256 then - local a=start[0] + if getfont(start)==font and getsubtype(start)<256 then + local a=getattr(start,0) if a then a=a==attr else @@ -11641,7 +13011,7 @@ local function featuresprocessor(head,font,attr) local lookupname=subtables[i] local lookupcache=lookuphash[lookupname] if lookupcache then - local lookupmatch=lookupcache[start.char] + local lookupmatch=lookupcache[getchar(start)] if lookupmatch then head,start,success=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) if success then @@ -11652,15 +13022,15 @@ local function featuresprocessor(head,font,attr) report_missing_cache(typ,lookupname) end end - if start then start=start.prev end + if start then start=getprev(start) end else - start=start.prev + start=getprev(start) end else - start=start.prev + start=getprev(start) end else - start=start.prev + start=getprev(start) end end else @@ -11678,16 +13048,16 @@ local function featuresprocessor(head,font,attr) local head=start local done=false while start do - local id=start.id - if id==glyph_code and start.font==font and start.subtype<256 then - local a=start[0] + local id=getid(start) + if id==glyph_code and getfont(start)==font and getsubtype(start)<256 then + local a=getattr(start,0) if a then - a=(a==attr) and (not attribute or start[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(start,a_state)==attribute) else - a=not attribute or start[a_state]==attribute + a=not attribute or getprop(start,a_state)==attribute end if a then - local lookupmatch=lookupcache[start.char] + local lookupmatch=lookupcache[getchar(start)] if lookupmatch then local ok head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) @@ -11695,12 +13065,12 @@ local function featuresprocessor(head,font,attr) done=true end end - if start then start=start.next end + if start then start=getnext(start) end else - start=start.next + start=getnext(start) end else - start=start.next + start=getnext(start) end end if done then @@ -11709,18 +13079,18 @@ local function featuresprocessor(head,font,attr) end end local function kerndisc(disc) - local prev=disc.prev - local next=disc.next + local prev=getprev(disc) + local next=getnext(disc) if prev and next then - prev.next=next - local a=prev[0] + setfield(prev,"next",next) + local a=getattr(prev,0) if a then - a=(a==attr) and (not attribute or prev[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(prev,a_state)==attribute) else - a=not attribute or prev[a_state]==attribute + a=not attribute or getprop(prev,a_state)==attribute end if a then - local lookupmatch=lookupcache[prev.char] + local lookupmatch=lookupcache[getchar(prev)] if lookupmatch then local h,d,ok=handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) if ok then @@ -11729,22 +13099,22 @@ local function featuresprocessor(head,font,attr) end end end - prev.next=disc + setfield(prev,"next",disc) end return next end while start do - local id=start.id + local id=getid(start) if id==glyph_code then - if start.font==font and start.subtype<256 then - local a=start[0] + if getfont(start)==font and getsubtype(start)<256 then + local a=getattr(start,0) if a then - a=(a==attr) and (not attribute or start[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(start,a_state)==attribute) else - a=not attribute or start[a_state]==attribute + a=not attribute or getprop(start,a_state)==attribute end if a then - local lookupmatch=lookupcache[start.char] + local lookupmatch=lookupcache[getchar(start)] if lookupmatch then local ok head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) @@ -11752,38 +13122,38 @@ local function featuresprocessor(head,font,attr) success=true end end - if start then start=start.next end + if start then start=getnext(start) end else - start=start.next + start=getnext(start) end else - start=start.next + start=getnext(start) end elseif id==disc_code then - if start.subtype==discretionary_code then - local pre=start.pre + if getsubtype(start)==discretionary_code then + local pre=getfield(start,"pre") if pre then local new=subrun(pre) - if new then start.pre=new end + if new then setfield(start,"pre",new) end end - local post=start.post + local post=getfield(start,"post") if post then local new=subrun(post) - if new then start.post=new end + if new then setfield(start,"post",new) end end - local replace=start.replace + local replace=getfield(start,"replace") if replace then local new=subrun(replace) - if new then start.replace=new end + if new then setfield(start,"replace",new) end end elseif typ=="gpos_single" or typ=="gpos_pair" then kerndisc(start) end - start=start.next + start=getnext(start) elseif id==whatsit_code then - local subtype=start.subtype + local subtype=getsubtype(start) if subtype==dir_code then - local dir=start.dir + local dir=getfield(start,"dir") if dir=="+TRT" or dir=="+TLT" then topstack=topstack+1 dirstack[topstack]=dir @@ -11802,7 +13172,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) end elseif subtype==localpar_code then - local dir=start.dir + local dir=getfield(start,"dir") if dir=="TRT" then rlparmode=-1 elseif dir=="TLT" then @@ -11815,11 +13185,11 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) end end - start=start.next + start=getnext(start) elseif id==math_code then - start=end_of_math(start).next + start=getnext(end_of_math(start)) else - start=start.next + start=getnext(start) end end end @@ -11828,20 +13198,20 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then local head=start local done=false while start do - local id=start.id - if id==glyph_code and start.id==font and start.subtype<256 then - local a=start[0] + local id=getid(start) + if id==glyph_code and getfont(start)==font and getsubtype(start)<256 then + local a=getattr(start,0) if a then - a=(a==attr) and (not attribute or start[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(start,a_state)==attribute) else - a=not attribute or start[a_state]==attribute + a=not attribute or getprop(start,a_state)==attribute end if a then for i=1,ns do local lookupname=subtables[i] local lookupcache=lookuphash[lookupname] if lookupcache then - local lookupmatch=lookupcache[start.char] + local lookupmatch=lookupcache[getchar(start)] if lookupmatch then local ok head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) @@ -11856,12 +13226,12 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_missing_cache(typ,lookupname) end end - if start then start=start.next end + if start then start=getnext(start) end else - start=start.next + start=getnext(start) end else - start=start.next + start=getnext(start) end end if done then @@ -11870,22 +13240,22 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then end end local function kerndisc(disc) - local prev=disc.prev - local next=disc.next + local prev=getprev(disc) + local next=getnext(disc) if prev and next then - prev.next=next - local a=prev[0] + setfield(prev,"next",next) + local a=getattr(prev,0) if a then - a=(a==attr) and (not attribute or prev[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(prev,a_state)==attribute) else - a=not attribute or prev[a_state]==attribute + a=not attribute or getprop(prev,a_state)==attribute end if a then for i=1,ns do local lookupname=subtables[i] local lookupcache=lookuphash[lookupname] if lookupcache then - local lookupmatch=lookupcache[prev.char] + local lookupmatch=lookupcache[getchar(prev)] if lookupmatch then local h,d,ok=handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) if ok then @@ -11898,26 +13268,26 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then end end end - prev.next=disc + setfield(prev,"next",disc) end return next end while start do - local id=start.id + local id=getid(start) if id==glyph_code then - if start.font==font and start.subtype<256 then - local a=start[0] + if getfont(start)==font and getsubtype(start)<256 then + local a=getattr(start,0) if a then - a=(a==attr) and (not attribute or start[a_state]==attribute) + a=(a==attr) and (not attribute or getprop(start,a_state)==attribute) else - a=not attribute or start[a_state]==attribute + a=not attribute or getprop(start,a_state)==attribute end if a then for i=1,ns do local lookupname=subtables[i] local lookupcache=lookuphash[lookupname] if lookupcache then - local lookupmatch=lookupcache[start.char] + local lookupmatch=lookupcache[getchar(start)] if lookupmatch then local ok head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) @@ -11932,38 +13302,38 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_missing_cache(typ,lookupname) end end - if start then start=start.next end + if start then start=getnext(start) end else - start=start.next + start=getnext(start) end else - start=start.next + start=getnext(start) end elseif id==disc_code then - if start.subtype==discretionary_code then - local pre=start.pre + if getsubtype(start)==discretionary_code then + local pre=getfield(start,"pre") if pre then local new=subrun(pre) - if new then start.pre=new end + if new then setfield(start,"pre",new) end end - local post=start.post + local post=getfield(start,"post") if post then local new=subrun(post) - if new then start.post=new end + if new then setfield(start,"post",new) end end - local replace=start.replace + local replace=getfield(start,"replace") if replace then local new=subrun(replace) - if new then start.replace=new end + if new then setfield(start,"replace",new) end end elseif typ=="gpos_single" or typ=="gpos_pair" then kerndisc(start) end - start=start.next + start=getnext(start) elseif id==whatsit_code then - local subtype=start.subtype + local subtype=getsubtype(start) if subtype==dir_code then - local dir=start.dir + local dir=getfield(start,"dir") if dir=="+TRT" or dir=="+TLT" then topstack=topstack+1 dirstack[topstack]=dir @@ -11982,7 +13352,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) end elseif subtype==localpar_code then - local dir=start.dir + local dir=getfield(start,"dir") if dir=="TRT" then rlparmode=-1 elseif dir=="TLT" then @@ -11995,11 +13365,11 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) end end - start=start.next + start=getnext(start) elseif id==math_code then - start=end_of_math(start).next + start=getnext(end_of_math(start)) else - start=start.next + start=getnext(start) end end end @@ -12011,6 +13381,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then registerstep(head) end end + head=tonode(head) return head,done end local function generic(lookupdata,lookupname,unicode,lookuphash) @@ -12137,6 +13508,7 @@ local function prepare_contextchains(tfmdata) local rawdata=tfmdata.shared.rawdata local resources=rawdata.resources local lookuphash=resources.lookuphash + local lookuptags=resources.lookuptags local lookups=rawdata.lookups if lookups then for lookupname,lookupdata in next,rawdata.lookups do @@ -12149,7 +13521,7 @@ local function prepare_contextchains(tfmdata) if not validformat then report_prepare("unsupported format %a",format) elseif not validformat[lookuptype] then - report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname) + report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname]) else local contexts=lookuphash[lookupname] if not contexts then @@ -12198,7 +13570,7 @@ local function prepare_contextchains(tfmdata) else end else - report_prepare("missing lookuptype for lookupname %a",lookupname) + report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname]) end end end @@ -12950,27 +14322,6 @@ local function unpackdata(data) rule.replacements=tv end end - local fore=rule.fore - if fore then - local tv=tables[fore] - if tv then - rule.fore=tv - end - end - local back=rule.back - if back then - local tv=tables[back] - if tv then - rule.back=tv - end - end - local names=rule.names - if names then - local tv=tables[names] - if tv then - rule.names=tv - end - end local lookups=rule.lookups if lookups then local tv=tables[lookups] @@ -13091,6 +14442,7 @@ if otf.enhancers.register then otf.enhancers.register("unpack",unpackdata) end otf.enhancers.unpack=unpackdata +otf.enhancers.pack=packdata end -- closure @@ -13446,8 +14798,8 @@ function definers.read(specification,size,id) elseif trace_defining and type(tfmdata)=="table" then local properties=tfmdata.properties or {} local parameters=tfmdata.parameters or {} - report_defining("using %s font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", - properties.format,id,properties.name,parameters.size,properties.encodingbytes, + report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", + properties.format or "unknown",id,properties.name,parameters.size,properties.encodingbytes, properties.encodingname,properties.fullname,file.basename(properties.filename)) end statistics.stoptiming(fonts) @@ -13778,13 +15130,40 @@ local fonts=fonts local nodes=nodes local traverse_id=node.traverse_id local glyph_code=nodes.nodecodes.glyph -function nodes.handlers.characters(head) +local disc_code=nodes.nodecodes.disc +local ligaturing=node.ligaturing +local kerning=node.kerning +local basepass=true +local function l_warning() texio.write_nl("warning: node.ligaturing called directly") l_warning=nil end +local function k_warning() texio.write_nl("warning: node.kerning called directly") k_warning=nil end +function node.ligaturing(...) + if basepass and l_warning then + l_warning() + end + return ligaturing(...) +end +function node.kerning(...) + if basepass and k_warning then + k_warning() + end + return kerning(...) +end +function nodes.handlers.setbasepass(v) + basepass=v +end +function nodes.handlers.nodepass(head) local fontdata=fonts.hashes.identifiers if fontdata then - local usedfonts,done,prevfont={},false,nil + local usedfonts={} + local basefonts={} + local prevfont=nil + local basefont=nil for n in traverse_id(glyph_code,head) do local font=n.font if font~=prevfont then + if basefont then + basefont[2]=n.prev + end prevfont=font local used=usedfonts[font] if not used then @@ -13795,18 +15174,57 @@ function nodes.handlers.characters(head) local processors=shared.processes if processors and #processors>0 then usedfonts[font]=processors - done=true + elseif basepass then + basefont={ n,nil } + basefonts[#basefonts+1]=basefont + end + end + end + end + end + end + for d in traverse_id(disc_code,head) do + local r=d.replace + if r then + for n in traverse_id(glyph_code,r) do + local font=n.font + if font~=prevfont then + prevfont=font + local used=usedfonts[font] + if not used then + local tfmdata=fontdata[font] + if tfmdata then + local shared=tfmdata.shared + if shared then + local processors=shared.processes + if processors and #processors>0 then + usedfonts[font]=processors + end + end end end end end end end - if done then + if next(usedfonts) then for font,processors in next,usedfonts do for i=1,#processors do - local h,d=processors[i](head,font,0) - head,done=h or head,done or d + head=processors[i](head,font,0) or head + end + end + end + if basepass and #basefonts>0 then + for i=1,#basefonts do + local range=basefonts[i] + local start=range[1] + local stop=range[2] + if stop then + start,stop=ligaturing(start,stop) + start,stop=kerning(start,stop) + elseif start then + start=ligaturing(start) + start=kerning(start) end end end @@ -13815,13 +15233,27 @@ function nodes.handlers.characters(head) return head,false end end +function nodes.handlers.basepass(head) + if not basepass then + head=ligaturing(head) + head=kerning(head) + end + return head,true +end +local nodepass=nodes.handlers.nodepass +local basepass=nodes.handlers.basepass +local injectpass=nodes.injections.handler +local protectpass=nodes.handlers.protectglyphs function nodes.simple_font_handler(head) - head=nodes.handlers.characters(head) - nodes.injections.handler(head) - nodes.handlers.protectglyphs(head) - head=node.ligaturing(head) - head=node.kerning(head) - return head + if head then + head=nodepass(head) + head=injectpass(head) + head=basepass(head) + protectpass(head) + return head,true + else + return head,false + end end end -- closure diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua new file mode 100644 index 00000000000..f083fe09e83 --- /dev/null +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua @@ -0,0 +1,459 @@ +if not modules then modules = { } end modules ['font-otx'] = { + version = 1.001, + comment = "companion to font-otf.lua (analysing)", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local type = type + +if not trackers then trackers = { register = function() end } end + +----- trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end) + +local fonts, nodes, node = fonts, nodes, node + +local allocate = utilities.storage.allocate + +local otf = fonts.handlers.otf + +local analyzers = fonts.analyzers +local initializers = allocate() +local methods = allocate() + +analyzers.initializers = initializers +analyzers.methods = methods +analyzers.useunicodemarks = false + +local a_state = attributes.private('state') + +local nuts = nodes.nuts +local tonut = nuts.tonut + +local getfield = nuts.getfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getprop = nuts.getprop +local setprop = nuts.setprop +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local traverse_id = nuts.traverse_id +local traverse_node_list = nuts.traverse +local end_of_math = nuts.end_of_math + +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc +local math_code = nodecodes.math + +local fontdata = fonts.hashes.identifiers +local categories = characters and characters.categories or { } -- sorry, only in context + +local otffeatures = fonts.constructors.newfeatures("otf") +local registerotffeature = otffeatures.register + +--[[ldx-- +

Analyzers run per script and/or language and are needed in order to +process features right.

+--ldx]]-- + +-- never use these numbers directly + +local s_init = 1 local s_rphf = 7 +local s_medi = 2 local s_half = 8 +local s_fina = 3 local s_pref = 9 +local s_isol = 4 local s_blwf = 10 +local s_mark = 5 local s_pstf = 11 +local s_rest = 6 + +local states = { + init = s_init, + medi = s_medi, + fina = s_fina, + isol = s_isol, + mark = s_mark, + rest = s_rest, + rphf = s_rphf, + half = s_half, + pref = s_pref, + blwf = s_blwf, + pstf = s_pstf, +} + +local features = { + init = s_init, + medi = s_medi, + fina = s_fina, + isol = s_isol, + -- mark = s_mark, + -- rest = s_rest, + rphf = s_rphf, + half = s_half, + pref = s_pref, + blwf = s_blwf, + pstf = s_pstf, +} + +analyzers.states = states +analyzers.features = features + +-- todo: analyzers per script/lang, cross font, so we need an font id hash -> script +-- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace + +function analyzers.setstate(head,font) + local useunicodemarks = analyzers.useunicodemarks + local tfmdata = fontdata[font] + local descriptions = tfmdata.descriptions + local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean + current = tonut(current) + while current do + local id = getid(current) + if id == glyph_code and getfont(current) == font then + done = true + local char = getchar(current) + local d = descriptions[char] + if d then + if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then + done = true + setprop(current,a_state,s_mark) + elseif n == 0 then + first, last, n = current, current, 1 + setprop(current,a_state,s_init) + else + last, n = current, n+1 + setprop(current,a_state,s_medi) + end + else -- finish + if first and first == last then + setprop(last,a_state,s_isol) + elseif last then + setprop(last,a_state,s_fina) + end + first, last, n = nil, nil, 0 + end + elseif id == disc_code then + -- always in the middle + setprop(current,a_state,s_medi) + last = current + else -- finish + if first and first == last then + setprop(last,a_state,s_isol) + elseif last then + setprop(last,a_state,s_fina) + end + first, last, n = nil, nil, 0 + if id == math_code then + current = end_of_math(current) + end + end + current = getnext(current) + end + if first and first == last then + setprop(last,a_state,s_isol) + elseif last then + setprop(last,a_state,s_fina) + end + return head, done +end + +-- in the future we will use language/script attributes instead of the +-- font related value, but then we also need dynamic features which is +-- somewhat slower; and .. we need a chain of them + +local function analyzeinitializer(tfmdata,value) -- attr + local script, language = otf.scriptandlanguage(tfmdata) -- attr + local action = initializers[script] + if not action then + -- skip + elseif type(action) == "function" then + return action(tfmdata,value) + else + local action = action[language] + if action then + return action(tfmdata,value) + end + end +end + +local function analyzeprocessor(head,font,attr) + local tfmdata = fontdata[font] + local script, language = otf.scriptandlanguage(tfmdata,attr) + local action = methods[script] + if not action then + -- skip + elseif type(action) == "function" then + return action(head,font,attr) + else + action = action[language] + if action then + return action(head,font,attr) + end + end + return head, false +end + +registerotffeature { + name = "analyze", + description = "analysis of character classes", + default = true, + initializers = { + node = analyzeinitializer, + }, + processors = { + position = 1, + node = analyzeprocessor, + } +} + +-- latin + +methods.latn = analyzers.setstate + +-- This info eventually can go into char-def and we will have a state +-- table for generic then (unicode recognized all states but in practice +-- only has only +-- +-- isolated : isol +-- final : isol_fina +-- medial : isol_fina_medi_init +-- +-- so in practice, without analyzer it's rather useless info which is +-- why having it in char-def makes only sense for special purposes (like) +-- like tracing cq. visualizing. + +local tatweel = 0x0640 +local zwnj = 0x200C +local zwj = 0x200D + +local isolated = { -- isol + [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true, + [0x0604] = true, + [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true, + [0x06DD] = true, + -- mandaic + [0x0856] = true, [0x0858] = true, [0x0857] = true, + -- n'ko + [0x07FA] = true, + -- also here: + [zwnj] = true, + -- 7 + [0x08AD] = true, +} + +local final = { -- isol_fina + [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true, + [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true, + [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true, + [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true, + [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true, + [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true, + [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true, + [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true, + [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true, + [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true, + [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true, + [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true, + [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true, + [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true, + [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true, + [0x0778] = true, [0x0779] = true, + [0x08AA] = true, [0x08AB] = true, [0x08AC] = true, + [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true, + -- syriac + [0x0710] = true, [0x0715] = true, [0x0716] = true, [0x0717] = true, + [0x0718] = true, [0x0719] = true, [0x0728] = true, [0x072A] = true, + [0x072C] = true, [0x071E] = true, + [0x072F] = true, [0x074D] = true, + -- mandaic + [0x0840] = true, [0x0849] = true, [0x0854] = true, [0x0846] = true, + [0x084F] = true, + -- 7 + [0x08AE] = true, [0x08B1] = true, [0x08B2] = true, +} + +local medial = { -- isol_fina_medi_init + [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true, + [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true, + [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true, + [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true, + [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true, + [0x0641] = true, [0x0642] = true, [0x0643] = true, + [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true, + [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true, + [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true, + [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true, + [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true, + [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true, + [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true, + [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true, + [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true, + [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true, + [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true, + [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true, + [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true, + [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true, + [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true, + [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true, + [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true, + [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true, + [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true, + [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true, + [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true, + [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true, + [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true, + [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true, + [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true, + [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true, + [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true, + [0x077E] = true, [0x077F] = true, + [0x08A0] = true, [0x08A2] = true, [0x08A4] = true, [0x08A5] = true, + [0x08A6] = true, [0x0620] = true, [0x08A8] = true, [0x08A9] = true, + [0x08A7] = true, [0x08A3] = true, + -- syriac + [0x0712] = true, [0x0713] = true, [0x0714] = true, [0x071A] = true, + [0x071B] = true, [0x071C] = true, [0x071D] = true, [0x071F] = true, + [0x0720] = true, [0x0721] = true, [0x0722] = true, [0x0723] = true, + [0x0724] = true, [0x0725] = true, [0x0726] = true, [0x0727] = true, + [0x0729] = true, [0x072B] = true, [0x072D] = true, [0x072E] = true, + [0x074E] = true, [0x074F] = true, + -- mandaic + [0x0841] = true, [0x0842] = true, [0x0843] = true, [0x0844] = true, + [0x0845] = true, [0x0847] = true, [0x0848] = true, [0x0855] = true, + [0x0851] = true, [0x084E] = true, [0x084D] = true, [0x084A] = true, + [0x084B] = true, [0x084C] = true, [0x0850] = true, [0x0852] = true, + [0x0853] = true, + -- n'ko + [0x07D7] = true, [0x07E8] = true, [0x07D9] = true, [0x07EA] = true, + [0x07CA] = true, [0x07DB] = true, [0x07CC] = true, [0x07DD] = true, + [0x07CE] = true, [0x07DF] = true, [0x07D4] = true, [0x07E5] = true, + [0x07E9] = true, [0x07E7] = true, [0x07E3] = true, [0x07E2] = true, + [0x07E0] = true, [0x07E1] = true, [0x07DE] = true, [0x07DC] = true, + [0x07D1] = true, [0x07DA] = true, [0x07D8] = true, [0x07D6] = true, + [0x07D2] = true, [0x07D0] = true, [0x07CF] = true, [0x07CD] = true, + [0x07CB] = true, [0x07D3] = true, [0x07E4] = true, [0x07D5] = true, + [0x07E6] = true, + -- also here: + [tatweel]= true, [zwj] = true, + -- 7 + [0x08A1] = true, [0x08AF] = true, [0x08B0] = true, +} + +local arab_warned = { } + +-- todo: gref + +local function warning(current,what) + local char = getchar(current) + if not arab_warned[char] then + log.report("analyze","arab: character %C has no %a class",char,what) + arab_warned[char] = true + end +end + +-- potential optimization: local medial_final = table.merged(medial,final) + +local function finish(first,last) + if last then + if first == last then + local fc = getchar(first) + if medial[fc] or final[fc] then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + else + local lc = getchar(last) + if medial[lc] or final[lc] then + -- if laststate == 1 or laststate == 2 or laststate == 4 then + setprop(last,a_state,s_fina) + else + warning(last,"fina") + setprop(last,a_state,s_error) + end + end + first, last = nil, nil + elseif first then + -- first and last are either both set so we never com here + local fc = getchar(first) + if medial[fc] or final[fc] then + setprop(first,a_state,s_isol) + else + warning(first,"isol") + setprop(first,a_state,s_error) + end + first = nil + end + return first, last +end + +function methods.arab(head,font,attr) + local useunicodemarks = analyzers.useunicodemarks + local tfmdata = fontdata[font] + local marks = tfmdata.resources.marks + local first, last, current, done = nil, nil, head, false + current = tonut(current) + while current do + local id = getid(current) + if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then + done = true + local char = getchar(current) + if marks[char] or (useunicodemarks and categories[char] == "mn") then + setprop(current,a_state,s_mark) + elseif isolated[char] then -- can be zwj or zwnj too + first, last = finish(first,last) + setprop(current,a_state,s_isol) + first, last = nil, nil + elseif not first then + if medial[char] then + setprop(current,a_state,s_init) + first, last = first or current, current + elseif final[char] then + setprop(current,a_state,s_isol) + first, last = nil, nil + else -- no arab + first, last = finish(first,last) + end + elseif medial[char] then + first, last = first or current, current + setprop(current,a_state,s_medi) + elseif final[char] then + if getprop(last,a_state) ~= s_init then + -- tricky, we need to check what last may be ! + setprop(last,a_state,s_medi) + end + setprop(current,a_state,s_fina) + first, last = nil, nil + elseif char >= 0x0600 and char <= 0x06FF then -- needs checking + setprop(current,a_state,s_rest) + first, last = finish(first,last) + else -- no + first, last = finish(first,last) + end + else + if first or last then + first, last = finish(first,last) + end + if id == math_code then + current = end_of_math(current) + end + end + current = getnext(current) + end + if first or last then + finish(first,last) + end + return head, done +end + +methods.syrc = methods.arab +methods.mand = methods.arab +methods.nko = methods.arab + +directives.register("otf.analyze.useunicodemarks",function(v) + analyzers.useunicodemarks = v +end) diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua index 068f0a9b926..343e1826e0f 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua @@ -6,8 +6,17 @@ if not modules then modules = { } end modules ['font-otn'] = { license = "see context related readme files", } +-- todo: looks like we have a leak somewhere (probably in ligatures) +-- todo: copy attributes to disc + +-- this is a context version which can contain experimental code, but when we +-- have serious patches we also need to change the other two font-otn files + -- preprocessors = { "nodes" } +-- anchor class : mark, mkmk, curs, mklg (todo) +-- anchor type : mark, basechar, baselig, basemark, centry, cexit, max (todo) + -- this is still somewhat preliminary and it will get better in due time; -- much functionality could only be implemented thanks to the husayni font -- of Idris Samawi Hamid to who we dedicate this module. @@ -20,7 +29,6 @@ if not modules then modules = { } end modules ['font-otn'] = { -- todo: -- --- kerning is probably not yet ok for latin around dics nodes (interesting challenge) -- extension infrastructure (for usage out of context) -- sorting features according to vendors/renderers -- alternative loop quitters @@ -160,6 +168,7 @@ local report_chain = logs.reporter("fonts","otf chain") local report_process = logs.reporter("fonts","otf process") local report_prepare = logs.reporter("fonts","otf prepare") local report_warning = logs.reporter("fonts","otf warning") +local report_run = logs.reporter("fonts","otf run") registertracker("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end) registertracker("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end) @@ -171,12 +180,35 @@ registertracker("otf.injections","nodes.injections") registertracker("*otf.sample","otf.steps,otf.actions,otf.analyzing") -local insert_node_after = node.insert_after -local delete_node = nodes.delete -local copy_node = node.copy -local find_node_tail = node.tail or node.slide -local flush_node_list = node.flush_list -local end_of_math = node.end_of_math +local nuts = nodes.nuts +local tonode = nuts.tonode +local tonut = nuts.tonut + +local getfield = nuts.getfield +local setfield = nuts.setfield +local getnext = nuts.getnext +local getprev = nuts.getprev +local getid = nuts.getid +local getattr = nuts.getattr +local setattr = nuts.setattr +local getprop = nuts.getprop +local setprop = nuts.setprop +local getfont = nuts.getfont +local getsubtype = nuts.getsubtype +local getchar = nuts.getchar + +local insert_node_before = nuts.insert_before +local insert_node_after = nuts.insert_after +local delete_node = nuts.delete +local remove_node = nuts.remove +local copy_node = nuts.copy +local copy_node_list = nuts.copy_list +local find_node_tail = nuts.tail +local flush_node_list = nuts.flush_list +local free_node = nuts.free +local end_of_math = nuts.end_of_math +local traverse_nodes = nuts.traverse +local traverse_id = nuts.traverse_id local setmetatableindex = table.setmetatableindex @@ -200,36 +232,33 @@ local dir_code = whatcodes.dir local localpar_code = whatcodes.localpar local discretionary_code = disccodes.discretionary +local regular_code = disccodes.regular +local automatic_code = disccodes.automatic local ligature_code = glyphcodes.ligature local privateattribute = attributes.private -- Something is messed up: we have two mark / ligature indices, one at the injection --- end and one here ... this is bases in KE's patches but there is something fishy +-- end and one here ... this is based on KE's patches but there is something fishy -- there as I'm pretty sure that for husayni we need some connection (as it's much -- more complex than an average font) but I need proper examples of all cases, not -- of only some. local a_state = privateattribute('state') -local a_markbase = privateattribute('markbase') -local a_markmark = privateattribute('markmark') -local a_markdone = privateattribute('markdone') -- assigned at the injection end -local a_cursbase = privateattribute('cursbase') -local a_curscurs = privateattribute('curscurs') -local a_cursdone = privateattribute('cursdone') -local a_kernpair = privateattribute('kernpair') -local a_ligacomp = privateattribute('ligacomp') -- assigned here (ideally it should be combined) +local a_cursbase = privateattribute('cursbase') -- to be checked, probably can go local injections = nodes.injections local setmark = injections.setmark local setcursive = injections.setcursive local setkern = injections.setkern local setpair = injections.setpair +local resetinjection = injections.reset +local copyinjection = injections.copy +local setligaindex = injections.setligaindex +local getligaindex = injections.getligaindex -local markonce = true local cursonce = true -local kernonce = true local fonthashes = fonts.hashes local fontdata = fonthashes.identifiers @@ -252,6 +281,7 @@ local currentfont = false local lookuptable = false local anchorlookups = false local lookuptypes = false +local lookuptags = false local handlers = { } local rlmode = 0 local featurevalue = false @@ -306,20 +336,20 @@ end local function cref(kind,chainname,chainlookupname,lookupname,index) -- not in the mood to alias f_ if index then - return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index) + return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index) elseif lookupname then - return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname) + return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname]) elseif chainlookupname then - return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname) + return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname]) elseif chainname then - return formatters["feature %a, chain %a"](kind,chainname) + return formatters["feature %a, chain %a"](kind,lookuptags[chainname]) else return formatters["feature %a"](kind) end end local function pref(kind,lookupname) - return formatters["feature %a, lookup %a"](kind,lookupname) + return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname]) end -- We can assume that languages that use marks are not hyphenated. We can also assume @@ -332,42 +362,49 @@ end -- and indices. local function copy_glyph(g) -- next and prev are untouched ! - local components = g.components + local components = getfield(g,"components") if components then - g.components = nil + setfield(g,"components",nil) local n = copy_node(g) - g.components = components + copyinjection(n,g) -- we need to preserve the lig indices + setfield(g,"components",components) return n else - return copy_node(g) + local n = copy_node(g) + copyinjection(n,g) -- we need to preserve the lig indices + return n end end +-- + + -- start is a mark and we need to keep that one local function markstoligature(kind,lookupname,head,start,stop,char) - if start == stop and start.char == char then + if start == stop and getchar(start) == char then return head, start else - local prev = start.prev - local next = stop.next - start.prev = nil - stop.next = nil + local prev = getprev(start) + local next = getnext(stop) + setfield(start,"prev",nil) + setfield(stop,"next",nil) local base = copy_glyph(start) if head == start then head = base end - base.char = char - base.subtype = ligature_code - base.components = start + resetinjection(base) + setfield(base,"char",char) + setfield(base,"subtype",ligature_code) + setfield(base,"components",start) if prev then - prev.next = base + setfield(prev,"next",base) end if next then - next.prev = base + setfield(next,"prev",base) end - base.next = next - base.prev = prev + setfield(base,"next",next) + setfield(base,"prev",prev) return head, base end end @@ -380,17 +417,17 @@ end -- third component. local function getcomponentindex(start) - if start.id ~= glyph_code then + if getid(start) ~= glyph_code then return 0 - elseif start.subtype == ligature_code then + elseif getsubtype(start) == ligature_code then local i = 0 - local components = start.components + local components = getfield(start,"components") while components do i = i + getcomponentindex(components) - components = components.next + components = getnext(components) end return i - elseif not marks[start.char] then + elseif not marks[getchar(start)] then return 1 else return 0 @@ -400,29 +437,31 @@ end -- eventually we will do positioning in an other way (needs addional w/h/d fields) local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head - if start == stop and start.char == char then - start.char = char + if start == stop and getchar(start) == char then + resetinjection(start) + setfield(start,"char",char) return head, start end - local prev = start.prev - local next = stop.next - start.prev = nil - stop.next = nil + local prev = getprev(start) + local next = getnext(stop) + setfield(start,"prev",nil) + setfield(stop,"next",nil) local base = copy_glyph(start) if start == head then head = base end - base.char = char - base.subtype = ligature_code - base.components = start -- start can have components + resetinjection(base) + setfield(base,"char",char) + setfield(base,"subtype",ligature_code) + setfield(base,"components",start) -- start can have components if prev then - prev.next = base + setfield(prev,"next",base) end if next then - next.prev = base + setfield(next,"prev",base) end - base.next = next - base.prev = prev + setfield(base,"next",next) + setfield(base,"prev",prev) if not discfound then local deletemarks = markflag ~= "mark" local components = start @@ -432,35 +471,35 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun local current = base -- first we loop over the glyphs in start .. stop while start do - local char = start.char + local char = getchar(start) if not marks[char] then baseindex = baseindex + componentindex componentindex = getcomponentindex(start) elseif not deletemarks then -- quite fishy - start[a_ligacomp] = baseindex + (start[a_ligacomp] or componentindex) + setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end head, current = insert_node_after(head,current,copy_node(start)) -- unlikely that mark has components elseif trace_marks then logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) end - start = start.next + start = getnext(start) end -- we can have one accent as part of a lookup and another following -- local start = components -- was wrong (component scanning was introduced when more complex ligs in devanagari was added) - local start = current.next - while start and start.id == glyph_code do - local char = start.char + local start = getnext(current) + while start and getid(start) == glyph_code do + local char = getchar(start) if marks[char] then - start[a_ligacomp] = baseindex + (start[a_ligacomp] or componentindex) + setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then - logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) end else break end - start = start.next + start = getnext(start) end end return head, base @@ -468,9 +507,10 @@ end function handlers.gsub_single(head,start,kind,lookupname,replacement) if trace_singles then - logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement)) + logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement)) end - start.char = replacement + resetinjection(start) + setfield(start,"char",replacement) return head, start, true end @@ -497,7 +537,7 @@ local function get_alternative_glyph(start,alternatives,value,trace_alternatives return false, trace_alternatives and formatters["invalid value %a, %s"](value,"out of range") end elseif value == 0 then - return start.char, trace_alternatives and formatters["invalid value %a, %s"](value,"no change") + return getchar(start), trace_alternatives and formatters["invalid value %a, %s"](value,"no change") elseif value < 1 then return alternatives[1], trace_alternatives and formatters["invalid value %a, taking %a"](value,1) else @@ -509,30 +549,32 @@ end local function multiple_glyphs(head,start,multiple,ignoremarks) local nofmultiples = #multiple if nofmultiples > 0 then - start.char = multiple[1] + resetinjection(start) + setfield(start,"char",multiple[1]) if nofmultiples > 1 then - local sn = start.next + local sn = getnext(start) for k=2,nofmultiples do -- todo: use insert_node -- untested: -- --- while ignoremarks and marks[sn.char] then --- local sn = sn.next +-- while ignoremarks and marks[getchar(sn)] then +-- local sn = getnext(sn) -- end local n = copy_node(start) -- ignore components - n.char = multiple[k] - n.next = sn - n.prev = start + resetinjection(n) + setfield(n,"char",multiple[k]) + setfield(n,"next",sn) + setfield(n,"prev",start) if sn then - sn.prev = n + setfield(sn,"prev",n) end - start.next = n + setfield(start,"next",n) start = n end end return head, start, true else if trace_multiples then - logprocess("no multiple for %s",gref(start.char)) + logprocess("no multiple for %s",gref(getchar(start))) end return head, start, false end @@ -543,12 +585,13 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence local choice, comment = get_alternative_glyph(start,alternative,value,trace_alternatives) if choice then if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(start.char),choice,gref(choice),comment) + logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment) end - start.char = choice + resetinjection(start) + setfield(start,"char",choice) else if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(start.char),comment) + logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(getchar(start)),comment) end end return head, start, true @@ -556,23 +599,23 @@ end function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence) if trace_multiples then - logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple)) + logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(getchar(start)),gref(multiple)) end return multiple_glyphs(head,start,multiple,sequence.flags[1]) end function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) - local s, stop, discfound = start.next, nil, false - local startchar = start.char + local s, stop, discfound = getnext(start), nil, false + local startchar = getchar(start) if marks[startchar] then while s do - local id = s.id - if id == glyph_code and s.font == currentfont and s.subtype<256 then - local lg = ligature[s.char] + local id = getid(s) + if id == glyph_code and getfont(s) == currentfont and getsubtype(s)<256 then + local lg = ligature[getchar(s)] if lg then stop = s ligature = lg - s = s.next + s = getnext(s) else break end @@ -584,9 +627,9 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) local lig = ligature.ligature if lig then if trace_ligatures then - local stopchar = stop.char + local stopchar = getchar(stop) head, start = markstoligature(kind,lookupname,head,start,stop,lig) - logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char)) + logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) else head, start = markstoligature(kind,lookupname,head,start,stop,lig) end @@ -598,18 +641,18 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) else local skipmark = sequence.flags[1] while s do - local id = s.id - if id == glyph_code and s.subtype<256 then - if s.font == currentfont then - local char = s.char + local id = getid(s) + if id == glyph_code and getsubtype(s)<256 then + if getfont(s) == currentfont then + local char = getchar(s) if skipmark and marks[char] then - s = s.next + s = getnext(s) else local lg = ligature[char] if lg then stop = s ligature = lg - s = s.next + s = getnext(s) else break end @@ -619,7 +662,7 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) end elseif id == disc_code then discfound = true - s = s.next + s = getnext(s) else break end @@ -628,21 +671,21 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) if lig then if stop then if trace_ligatures then - local stopchar = stop.char + local stopchar = getchar(stop) head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) - logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char)) + logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) else head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) end - return head, start, true else -- weird but happens (in some arabic font) - start.char = lig + resetinjection(start) + setfield(start,"char",lig) if trace_ligatures then logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig)) end - return head, start, true end + return head, start, true else -- weird but happens end @@ -656,16 +699,16 @@ we need to explicitly test for basechar, baselig and basemark entries.

--ldx]]-- function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence) - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then - local base = start.prev -- [glyph] [start=mark] - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - local basechar = base.char + local base = getprev(start) -- [glyph] [start=mark] + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + local basechar = getchar(base) if marks[basechar] then while true do - base = base.prev - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - basechar = base.char + base = getprev(base) + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + basechar = getchar(base) if not marks[basechar] then break end @@ -689,7 +732,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence if al[anchor] then local ma = markanchors[anchor] if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -717,16 +760,16 @@ end function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequence) -- check chainpos variant - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then - local base = start.prev -- [glyph] [optional marks] [start=mark] - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - local basechar = base.char + local base = getprev(start) -- [glyph] [optional marks] [start=mark] + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + local basechar = getchar(base) if marks[basechar] then while true do - base = base.prev - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - basechar = base.char + base = getprev(base) + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + basechar = getchar(base) if not marks[basechar] then break end @@ -738,7 +781,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ end end end - local index = start[a_ligacomp] + local index = getligaindex(start) local baseanchors = descriptions[basechar] if baseanchors then baseanchors = baseanchors.anchors @@ -752,7 +795,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ if ma then ba = ba[index] if ba then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) -- index + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) -- index if trace_marks then logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) @@ -785,22 +828,22 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ end function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence) - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then - local base = start.prev -- [glyph] [basemark] [start=mark] - local slc = start[a_ligacomp] + local base = getprev(start) -- [glyph] [basemark] [start=mark] + local slc = getligaindex(start) if slc then -- a rather messy loop ... needs checking with husayni while base do - local blc = base[a_ligacomp] + local blc = getligaindex(base) if blc and blc ~= slc then - base = base.prev + base = getprev(base) else break end end end - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then -- subtype test can go - local basechar = base.char + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go + local basechar = getchar(base) local baseanchors = descriptions[basechar] if baseanchors then baseanchors = baseanchors.anchors @@ -812,7 +855,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence if al[anchor] then local ma = markanchors[anchor] if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true) + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -840,21 +883,21 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence end function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) -- to be checked - local alreadydone = cursonce and start[a_cursbase] + local alreadydone = cursonce and getprop(start,a_cursbase) if not alreadydone then local done = false - local startchar = start.char + local startchar = getchar(start) if marks[startchar] then if trace_cursive then logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) end else - local nxt = start.next - while not done and nxt and nxt.id == glyph_code and nxt.font == currentfont and nxt.subtype<256 do - local nextchar = nxt.char + local nxt = getnext(start) + while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do + local nextchar = getchar(nxt) if marks[nextchar] then -- should not happen (maybe warning) - nxt = nxt.next + nxt = getnext(nxt) else local entryanchors = descriptions[nextchar] if entryanchors then @@ -889,14 +932,14 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) return head, start, done else if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone) + logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) end return head, start, false end end function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence) - local startchar = start.char + local startchar = getchar(start) local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar]) if trace_kerns then logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h) @@ -907,19 +950,19 @@ end function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) -- todo: kerns in disc nodes: pre, post, replace -> loop over disc too -- todo: kerns in components of ligatures - local snext = start.next + local snext = getnext(start) if not snext then return head, start, false else local prev, done = start, false local factor = tfmdata.parameters.factor local lookuptype = lookuptypes[lookupname] - while snext and snext.id == glyph_code and snext.font == currentfont and snext.subtype<256 do - local nextchar = snext.char + while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do + local nextchar = getchar(snext) local krn = kerns[nextchar] if not krn and marks[nextchar] then prev = snext - snext = snext.next + snext = getnext(snext) else if not krn then -- skip @@ -927,14 +970,14 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) if lookuptype == "pair" then -- probably not needed local a, b = krn[2], krn[3] if a and #a > 0 then - local startchar = start.char + local startchar = getchar(start) local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b > 0 then - local startchar = start.char + local startchar = getchar(start) local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) @@ -946,7 +989,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) -- if a and a ~= 0 then -- local k = setkern(snext,factor,rlmode,a) -- if trace_kerns then - -- logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar)) + -- logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) -- end -- end -- if b and b ~= 0 then @@ -957,7 +1000,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence) elseif krn ~= 0 then local k = setkern(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) end done = true end @@ -1012,13 +1055,14 @@ end -- itself. It is meant mostly for dealing with Urdu. function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,lookuphash,replacements) - local char = start.char + local char = getchar(start) local replacement = replacements[char] if replacement then if trace_singles then logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement)) end - start.char = replacement + resetinjection(start) + setfield(start,"char",replacement) return head, start, true else return head, start, false @@ -1047,9 +1091,9 @@ as less as needed but that would also make the code even more messy.

-- -- done -- elseif ignoremarks then -- repeat -- start x x m x x stop => start m --- local next = start.next --- if not marks[next.char] then --- local components = next.components +-- local next = getnext(start) +-- if not marks[getchar(next)] then +-- local components = getfield(next,"components") -- if components then -- probably not needed -- flush_node_list(components) -- end @@ -1059,8 +1103,8 @@ as less as needed but that would also make the code even more messy.

-- until next == stop -- else -- start x x x stop => start -- repeat --- local next = start.next --- local components = next.components +-- local next = getnext(start) +-- local components = getfield(next,"components") -- if components then -- probably not needed -- flush_node_list(components) -- end @@ -1084,8 +1128,8 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," ")) end while current do - if current.id == glyph_code then - local currentchar = current.char + if getid(current) == glyph_code then + local currentchar = getchar(current) local lookupname = subtables[1] -- only 1 local replacement = lookuphash[lookupname] if not replacement then @@ -1102,14 +1146,15 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo if trace_singles then logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement)) end - current.char = replacement + resetinjection(current) + setfield(current,"char",replacement) end end return head, start, true elseif current == stop then break else - current = current.next + current = getnext(current) end end return head, start, false @@ -1124,7 +1169,7 @@ the match.

function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) -- local head, n = delete_till_stop(head,start,stop) - local startchar = start.char + local startchar = getchar(start) local subtables = currentlookup.subtables local lookupname = subtables[1] local replacements = lookuphash[lookupname] @@ -1167,8 +1212,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext local subtables = currentlookup.subtables local value = featurevalue == true and tfmdata.shared.features[kind] or featurevalue while current do - if current.id == glyph_code then -- is this check needed? - local currentchar = current.char + if getid(current) == glyph_code then -- is this check needed? + local currentchar = getchar(current) local lookupname = subtables[1] local alternatives = lookuphash[lookupname] if not alternatives then @@ -1183,7 +1228,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext if trace_alternatives then logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment) end - start.char = choice + resetinjection(start) + setfield(start,"char",choice) else if trace_alternatives then logwarning("%s: no variant %a for %s, %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(char),comment) @@ -1197,7 +1243,7 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext elseif current == stop then break else - current = current.next + current = getnext(current) end end return head, start, false @@ -1212,7 +1258,7 @@ assume rather stupid ligatures (no complex disc nodes).

--ldx]]-- function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex) - local startchar = start.char + local startchar = getchar(start) local subtables = currentlookup.subtables local lookupname = subtables[1] local ligatures = lookuphash[lookupname] @@ -1227,20 +1273,20 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) end else - local s = start.next + local s = getnext(start) local discfound = false local last = stop local nofreplacements = 0 local skipmark = currentlookup.flags[1] while s do - local id = s.id + local id = getid(s) if id == disc_code then - s = s.next + s = getnext(s) discfound = true else - local schar = s.char + local schar = getchar(s) if skipmark and marks[schar] then -- marks - s = s.next + s = getnext(s) else local lg = ligatures[schar] if lg then @@ -1248,7 +1294,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if s == stop then break else - s = s.next + s = getnext(s) end else break @@ -1265,7 +1311,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if start == stop then logprocess("%s: replacing character %s by ligature %s case 3",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2)) else - logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2)) + logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)),gref(l2)) end end head, start = toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound) @@ -1274,7 +1320,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext, if start == stop then logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) else - logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char)) + logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop))) end end end @@ -1285,7 +1331,7 @@ end chainmores.gsub_ligature = chainprocs.gsub_ligature function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then local subtables = currentlookup.subtables local lookupname = subtables[1] @@ -1294,14 +1340,14 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext markanchors = markanchors[markchar] end if markanchors then - local base = start.prev -- [glyph] [start=mark] - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - local basechar = base.char + local base = getprev(start) -- [glyph] [start=mark] + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + local basechar = getchar(base) if marks[basechar] then while true do - base = base.prev - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - basechar = base.char + base = getprev(base) + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + basechar = getchar(base) if not marks[basechar] then break end @@ -1322,7 +1368,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext if al[anchor] then local ma = markanchors[anchor] if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) @@ -1349,7 +1395,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext end function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then local subtables = currentlookup.subtables local lookupname = subtables[1] @@ -1358,14 +1404,14 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon markanchors = markanchors[markchar] end if markanchors then - local base = start.prev -- [glyph] [optional marks] [start=mark] - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - local basechar = base.char + local base = getprev(start) -- [glyph] [optional marks] [start=mark] + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + local basechar = getchar(base) if marks[basechar] then while true do - base = base.prev - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then - basechar = base.char + base = getprev(base) + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then + basechar = getchar(base) if not marks[basechar] then break end @@ -1378,7 +1424,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon end end -- todo: like marks a ligatures hash - local index = start[a_ligacomp] + local index = getligaindex(start) local baseanchors = descriptions[basechar].anchors if baseanchors then local baseanchors = baseanchors['baselig'] @@ -1390,7 +1436,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon if ma then ba = ba[index] if ba then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) -- index + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) if trace_marks then logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy) @@ -1418,64 +1464,59 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon end function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = start.char + local markchar = getchar(start) if marks[markchar] then - -- local alreadydone = markonce and start[a_markmark] - -- if not alreadydone then - -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local markanchors = lookuphash[lookupname] - if markanchors then - markanchors = markanchors[markchar] - end - if markanchors then - local base = start.prev -- [glyph] [basemark] [start=mark] - local slc = start[a_ligacomp] - if slc then -- a rather messy loop ... needs checking with husayni - while base do - local blc = base[a_ligacomp] - if blc and blc ~= slc then - base = base.prev - else - break - end + -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark + local subtables = currentlookup.subtables + local lookupname = subtables[1] + local markanchors = lookuphash[lookupname] + if markanchors then + markanchors = markanchors[markchar] + end + if markanchors then + local base = getprev(start) -- [glyph] [basemark] [start=mark] + local slc = getligaindex(start) + if slc then -- a rather messy loop ... needs checking with husayni + while base do + local blc = getligaindex(base) + if blc and blc ~= slc then + base = getprev(base) + else + break end end - if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then -- subtype test can go - local basechar = base.char - local baseanchors = descriptions[basechar].anchors + end + if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go + local basechar = getchar(base) + local baseanchors = descriptions[basechar].anchors + if baseanchors then + baseanchors = baseanchors['basemark'] if baseanchors then - baseanchors = baseanchors['basemark'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head, start, true + local al = anchorlookups[lookupname] + for anchor,ba in next, baseanchors do + if al[anchor] then + local ma = markanchors[anchor] + if ma then + local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) + if trace_marks then + logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", + cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) end + return head, start, true end end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) - end + end + if trace_bugs then + logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) end end - elseif trace_bugs then - logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname)) end elseif trace_bugs then - logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) + logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname)) end - -- elseif trace_marks and trace_details then - -- logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone) - -- end + elseif trace_bugs then + logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) + end elseif trace_bugs then logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) end @@ -1483,9 +1524,9 @@ function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext end function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local alreadydone = cursonce and start[a_cursbase] + local alreadydone = cursonce and getprop(start,a_cursbase) if not alreadydone then - local startchar = start.char + local startchar = getchar(start) local subtables = currentlookup.subtables local lookupname = subtables[1] local exitanchors = lookuphash[lookupname] @@ -1499,12 +1540,12 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) end else - local nxt = start.next - while not done and nxt and nxt.id == glyph_code and nxt.font == currentfont and nxt.subtype<256 do - local nextchar = nxt.char + local nxt = getnext(start) + while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do + local nextchar = getchar(nxt) if marks[nextchar] then -- should not happen (maybe warning) - nxt = nxt.next + nxt = getnext(nxt) else local entryanchors = descriptions[nextchar] if entryanchors then @@ -1539,7 +1580,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l return head, start, done else if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone) + logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) end return head, start, false end @@ -1549,7 +1590,7 @@ end function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) -- untested .. needs checking for the new model - local startchar = start.char + local startchar = getchar(start) local subtables = currentlookup.subtables local lookupname = subtables[1] local kerns = lookuphash[lookupname] @@ -1570,9 +1611,9 @@ chainmores.gpos_single = chainprocs.gpos_single -- okay? -- when machines become faster i will make a shared function function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) - local snext = start.next + local snext = getnext(start) if snext then - local startchar = start.char + local startchar = getchar(start) local subtables = currentlookup.subtables local lookupname = subtables[1] local kerns = lookuphash[lookupname] @@ -1582,12 +1623,12 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look local lookuptype = lookuptypes[lookupname] local prev, done = start, false local factor = tfmdata.parameters.factor - while snext and snext.id == glyph_code and snext.font == currentfont and snext.subtype<256 do - local nextchar = snext.char + while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do + local nextchar = getchar(snext) local krn = kerns[nextchar] if not krn and marks[nextchar] then prev = snext - snext = snext.next + snext = getnext(snext) else if not krn then -- skip @@ -1595,14 +1636,14 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look if lookuptype == "pair" then local a, b = krn[2], krn[3] if a and #a > 0 then - local startchar = start.char + local startchar = getchar(start) local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar]) if trace_kerns then logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) end end if b and #b > 0 then - local startchar = start.char + local startchar = getchar(start) local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar]) if trace_kerns then logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) @@ -1614,7 +1655,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look if a and a ~= 0 then local k = setkern(snext,factor,rlmode,a) if trace_kerns then - logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) end end if b and b ~= 0 then @@ -1625,7 +1666,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look elseif krn ~= 0 then local k = setkern(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar)) + logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) end done = true end @@ -1657,6 +1698,12 @@ local function show_skip(kind,chainname,char,ck,class) end end +local quit_on_no_replacement = true + +directives.register("otf.chain.quitonnoreplacement",function(value) -- maybe per font + quit_on_no_replacement = value +end) + local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash) -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6] local flags = sequence.flags @@ -1677,7 +1724,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq -- f..l = mid string if s == 1 then -- never happens - match = current.id == glyph_code and current.font == currentfont and current.subtype<256 and seq[1][current.char] + match = getid(current) == glyph_code and getfont(current) == currentfont and getsubtype(current)<256 and seq[1][getchar(current)] else -- maybe we need a better space check (maybe check for glue or category or combination) -- we cannot optimize for n=2 because there can be disc nodes @@ -1692,13 +1739,13 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq -- match = true else local n = f + 1 - last = last.next + last = getnext(last) while n <= l do if last then - local id = last.id + local id = getid(last) if id == glyph_code then - if last.font == currentfont and last.subtype<256 then - local char = last.char + if getfont(last) == currentfont and getsubtype(last)<256 then + local char = getchar(last) local ccd = descriptions[char] if ccd then local class = ccd.class @@ -1707,10 +1754,10 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq if trace_skips then show_skip(kind,chainname,char,ck,class) end - last = last.next + last = getnext(last) elseif seq[n][char] then if n < l then - last = last.next + last = getnext(last) end n = n + 1 else @@ -1726,7 +1773,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq break end elseif id == disc_code then - last = last.next + last = getnext(last) else match = false break @@ -1740,15 +1787,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end -- before if match and f > 1 then - local prev = start.prev + local prev = getprev(start) if prev then local n = f-1 while n >= 1 do if prev then - local id = prev.id + local id = getid(prev) if id == glyph_code then - if prev.font == currentfont and prev.subtype<256 then -- normal char - local char = prev.char + if getfont(prev) == currentfont and getsubtype(prev)<256 then -- normal char + local char = getchar(prev) local ccd = descriptions[char] if ccd then local class = ccd.class @@ -1779,7 +1826,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq match = false break end - prev = prev.prev + prev = getprev(prev) elseif seq[n][32] then -- somewhat special, as zapfino can have many preceding spaces n = n -1 else @@ -1800,16 +1847,16 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end -- after if match and s > l then - local current = last and last.next + local current = last and getnext(last) if current then -- removed optimization for s-l == 1, we have to deal with marks anyway local n = l + 1 while n <= s do if current then - local id = current.id + local id = getid(current) if id == glyph_code then - if current.font == currentfont and current.subtype<256 then -- normal char - local char = current.char + if getfont(current) == currentfont and getsubtype(current)<256 then -- normal char + local char = getchar(current) local ccd = descriptions[char] if ccd then local class = ccd.class @@ -1840,7 +1887,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq match = false break end - current = current.next + current = getnext(current) elseif seq[n][32] then n = n + 1 else @@ -1864,7 +1911,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq -- ck == currentcontext if trace_contexts then local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5] - local char = start.char + local char = getchar(start) if ck[9] then logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a, %a => %a", cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10]) @@ -1896,15 +1943,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end else local i = 1 - repeat + while true do if skipped then while true do - local char = start.char + local char = getchar(start) local ccd = descriptions[char] if ccd then local class = ccd.class if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - start = start.next + start = getnext(start) else break end @@ -1937,19 +1984,21 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq end end end - if start then - start = start.next + if i > nofchainlookups then + break + elseif start then + start = getnext(start) else -- weird end - until i > nofchainlookups + end end else local replacements = ck[7] if replacements then head, start, done = chainprocs.reversesub(head,start,last,kind,chainname,ck,lookuphash,replacements) -- sequence else - done = true -- can be meant to be skipped + done = quit_on_no_replacement -- can be meant to be skipped / quite inconsistent in fonts if trace_contexts then logprocess("%s: skipping match",cref(kind,chainname)) end @@ -2040,7 +2089,7 @@ local function initialize(sequence,script,language,enabled) if features then local order = sequence.order if order then - for i=1,#order do + for i=1,#order do -- local kind = order[i] -- local valid = enabled[kind] if valid then @@ -2099,12 +2148,12 @@ end -- if ok then -- done = true -- end --- if start then start = start.next end +-- if start then start = getnext(start) end -- else --- start = start.next +-- start = getnext(start) -- end -- else --- start = start.next +-- start = getnext(start) -- end -- there will be a new direction parser (pre-parsed etc) @@ -2114,7 +2163,7 @@ end -- attr = attr or false -- -- local a = getattr(start,0) --- if (a == attr and (not attribute or getattr(start,a_state) == attribute)) or (not attribute or getattr(start,a_state) == attribute) then +-- if (a == attr and (not attribute or getprop(start,a_state) == attribute)) or (not attribute or getprop(start,a_state) == attribute) then -- -- the action -- end @@ -2126,6 +2175,8 @@ local function featuresprocessor(head,font,attr) return head, false end + head = tonut(head) + if trace_steps then checkstep(head) end @@ -2139,6 +2190,7 @@ local function featuresprocessor(head,font,attr) anchorlookups = resources.lookup_to_anchor lookuptable = resources.lookups lookuptypes = resources.lookuptypes + lookuptags = resources.lookuptags currentfont = font rlmode = 0 @@ -2157,6 +2209,8 @@ local function featuresprocessor(head,font,attr) -- Keeping track of the headnode is needed for devanagari (I generalized it a bit -- so that multiple cases are also covered.) + -- todo: retain prev + for s=1,#datasets do local dataset = datasets[s] featurevalue = dataset[1] -- todo: pass to function instead of using a global @@ -2175,10 +2229,10 @@ local function featuresprocessor(head,font,attr) -- we need to get rid of this slide! probably no longer needed in latest luatex local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo while start do - local id = start.id + local id = getid(start) if id == glyph_code then - if start.font == font and start.subtype<256 then - local a = start[0] + if getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) if a then a = a == attr else @@ -2189,7 +2243,7 @@ local function featuresprocessor(head,font,attr) local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[start.char] + local lookupmatch = lookupcache[getchar(start)] if lookupmatch then head, start, success = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) if success then @@ -2200,15 +2254,15 @@ local function featuresprocessor(head,font,attr) report_missing_cache(typ,lookupname) end end - if start then start = start.prev end + if start then start = getprev(start) end else - start = start.prev + start = getprev(start) end else - start = start.prev + start = getprev(start) end else - start = start.prev + start = getprev(start) end end else @@ -2228,16 +2282,16 @@ local function featuresprocessor(head,font,attr) local head = start local done = false while start do - local id = start.id - if id == glyph_code and start.font == font and start.subtype <256 then - local a = start[0] + local id = getid(start) + if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) if a then - a = (a == attr) and (not attribute or start[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) else - a = not attribute or start[a_state] == attribute + a = not attribute or getprop(start,a_state) == attribute end if a then - local lookupmatch = lookupcache[start.char] + local lookupmatch = lookupcache[getchar(start)] if lookupmatch then -- sequence kan weg local ok @@ -2246,12 +2300,12 @@ local function featuresprocessor(head,font,attr) done = true end end - if start then start = start.next end + if start then start = getnext(start) end else - start = start.next + start = getnext(start) end else - start = start.next + start = getnext(start) end end if done then @@ -2261,19 +2315,19 @@ local function featuresprocessor(head,font,attr) end local function kerndisc(disc) -- we can assume that prev and next are glyphs - local prev = disc.prev - local next = disc.next + local prev = getprev(disc) + local next = getnext(disc) if prev and next then - prev.next = next - -- next.prev = prev - local a = prev[0] + setfield(prev,"next",next) + -- setfield(next,"prev",prev) + local a = getattr(prev,0) if a then - a = (a == attr) and (not attribute or prev[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) else - a = not attribute or prev[a_state] == attribute + a = not attribute or getprop(prev,a_state) == attribute end if a then - local lookupmatch = lookupcache[prev.char] + local lookupmatch = lookupcache[getchar(prev)] if lookupmatch then -- sequence kan weg local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1) @@ -2283,24 +2337,24 @@ local function featuresprocessor(head,font,attr) end end end - prev.next = disc - -- next.prev = disc + setfield(prev,"next",disc) + -- setfield(next,"prev",disc) end return next end while start do - local id = start.id + local id = getid(start) if id == glyph_code then - if start.font == font and start.subtype<256 then - local a = start[0] + if getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) if a then - a = (a == attr) and (not attribute or start[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) else - a = not attribute or start[a_state] == attribute + a = not attribute or getprop(start,a_state) == attribute end if a then - local lookupmatch = lookupcache[start.char] + local lookupmatch = lookupcache[getchar(start)] if lookupmatch then -- sequence kan weg local ok @@ -2309,39 +2363,39 @@ local function featuresprocessor(head,font,attr) success = true end end - if start then start = start.next end + if start then start = getnext(start) end else - start = start.next + start = getnext(start) end else - start = start.next + start = getnext(start) end elseif id == disc_code then -- mostly for gsub - if start.subtype == discretionary_code then - local pre = start.pre + if getsubtype(start) == discretionary_code then + local pre = getfield(start,"pre") if pre then local new = subrun(pre) - if new then start.pre = new end + if new then setfield(start,"pre",new) end end - local post = start.post + local post = getfield(start,"post") if post then local new = subrun(post) - if new then start.post = new end + if new then setfield(start,"post",new) end end - local replace = start.replace + local replace = getfield(start,"replace") if replace then local new = subrun(replace) - if new then start.replace = new end + if new then setfield(start,"replace",new) end end elseif typ == "gpos_single" or typ == "gpos_pair" then kerndisc(start) end - start = start.next + start = getnext(start) elseif id == whatsit_code then -- will be function - local subtype = start.subtype + local subtype = getsubtype(start) if subtype == dir_code then - local dir = start.dir + local dir = getfield(start,"dir") if dir == "+TRT" or dir == "+TLT" then topstack = topstack + 1 dirstack[topstack] = dir @@ -2360,7 +2414,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) end elseif subtype == localpar_code then - local dir = start.dir + local dir = getfield(start,"dir") if dir == "TRT" then rlparmode = -1 elseif dir == "TLT" then @@ -2374,11 +2428,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) end end - start = start.next + start = getnext(start) elseif id == math_code then - start = end_of_math(start).next + start = getnext(end_of_math(start)) else - start = start.next + start = getnext(start) end end end @@ -2389,20 +2443,20 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then local head = start local done = false while start do - local id = start.id - if id == glyph_code and start.id == font and start.subtype <256 then - local a = start[0] + local id = getid(start) + if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) if a then - a = (a == attr) and (not attribute or start[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) else - a = not attribute or start[a_state] == attribute + a = not attribute or getprop(start,a_state) == attribute end if a then for i=1,ns do local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[start.char] + local lookupmatch = lookupcache[getchar(start)] if lookupmatch then -- we could move all code inline but that makes things even more unreadable local ok @@ -2419,12 +2473,12 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_missing_cache(typ,lookupname) end end - if start then start = start.next end + if start then start = getnext(start) end else - start = start.next + start = getnext(start) end else - start = start.next + start = getnext(start) end end if done then @@ -2434,23 +2488,23 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then end local function kerndisc(disc) -- we can assume that prev and next are glyphs - local prev = disc.prev - local next = disc.next + local prev = getprev(disc) + local next = getnext(disc) if prev and next then - prev.next = next - -- next.prev = prev - local a = prev[0] + setfield(prev,"next",next) + -- setfield(next,"prev",prev) + local a = getattr(prev,0) if a then - a = (a == attr) and (not attribute or prev[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) else - a = not attribute or prev[a_state] == attribute + a = not attribute or getprop(prev,a_state) == attribute end if a then for i=1,ns do local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[prev.char] + local lookupmatch = lookupcache[getchar(prev)] if lookupmatch then -- we could move all code inline but that makes things even more unreadable local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i) @@ -2464,28 +2518,28 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then end end end - prev.next = disc - -- next.prev = disc + setfield(prev,"next",disc) + -- setfield(next,"prev",disc) end return next end while start do - local id = start.id + local id = getid(start) if id == glyph_code then - if start.font == font and start.subtype<256 then - local a = start[0] + if getfont(start) == font and getsubtype(start) < 256 then + local a = getattr(start,0) if a then - a = (a == attr) and (not attribute or start[a_state] == attribute) + a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) else - a = not attribute or start[a_state] == attribute + a = not attribute or getprop(start,a_state) == attribute end if a then for i=1,ns do local lookupname = subtables[i] local lookupcache = lookuphash[lookupname] if lookupcache then - local lookupmatch = lookupcache[start.char] + local lookupmatch = lookupcache[getchar(start)] if lookupmatch then -- we could move all code inline but that makes things even more unreadable local ok @@ -2502,39 +2556,39 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_missing_cache(typ,lookupname) end end - if start then start = start.next end + if start then start = getnext(start) end else - start = start.next + start = getnext(start) end else - start = start.next + start = getnext(start) end elseif id == disc_code then -- mostly for gsub - if start.subtype == discretionary_code then - local pre = start.pre + if getsubtype(start) == discretionary_code then + local pre = getfield(start,"pre") if pre then local new = subrun(pre) - if new then start.pre = new end + if new then setfield(start,"pre",new) end end - local post = start.post + local post = getfield(start,"post") if post then local new = subrun(post) - if new then start.post = new end + if new then setfield(start,"post",new) end end - local replace = start.replace + local replace = getfield(start,"replace") if replace then local new = subrun(replace) - if new then start.replace = new end + if new then setfield(start,"replace",new) end end elseif typ == "gpos_single" or typ == "gpos_pair" then kerndisc(start) end - start = start.next + start = getnext(start) elseif id == whatsit_code then - local subtype = start.subtype + local subtype = getsubtype(start) if subtype == dir_code then - local dir = start.dir + local dir = getfield(start,"dir") if dir == "+TRT" or dir == "+TLT" then topstack = topstack + 1 dirstack[topstack] = dir @@ -2553,7 +2607,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) end elseif subtype == localpar_code then - local dir = start.dir + local dir = getfield(start,"dir") if dir == "TRT" then rlparmode = -1 elseif dir == "TLT" then @@ -2566,11 +2620,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) end end - start = start.next + start = getnext(start) elseif id == math_code then - start = end_of_math(start).next + start = getnext(end_of_math(start)) else - start = start.next + start = getnext(start) end end end @@ -2581,7 +2635,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then if trace_steps then -- ? registerstep(head) end + end + + head = tonode(head) + return head, done end @@ -2734,6 +2792,7 @@ local function prepare_contextchains(tfmdata) local rawdata = tfmdata.shared.rawdata local resources = rawdata.resources local lookuphash = resources.lookuphash + local lookuptags = resources.lookuptags local lookups = rawdata.lookups if lookups then for lookupname, lookupdata in next, rawdata.lookups do @@ -2747,7 +2806,7 @@ local function prepare_contextchains(tfmdata) report_prepare("unsupported format %a",format) elseif not validformat[lookuptype] then -- todo: dejavu-serif has one (but i need to see what use it has) - report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname) + report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname]) else local contexts = lookuphash[lookupname] if not contexts then @@ -2803,7 +2862,7 @@ local function prepare_contextchains(tfmdata) -- no rules end else - report_prepare("missing lookuptype for lookupname %a",lookupname) + report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname]) end end end diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua index 5e5c9a4cfa6..c81e8cd1a88 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua @@ -27,6 +27,17 @@ if not modules then modules = { } end modules ['luatex-fonts'] = { -- also add more helper code here, but that depends to what extend metatex (sidetrack of context) -- evolves into a low level layer (depends on time, as usual). +texio.write_nl("") +texio.write_nl("--------------------------------------------------------------------------------") +texio.write_nl("The font code has been brought in sync with the context version of 2014.12.21 so") +texio.write_nl("if things don't work out as expected the interfacing needs to be checked. When") +texio.write_nl("this works as expected a second upgrade will happen that gives a more complete") +texio.write_nl("support and another sync with the context code (that new code is currently being") +texio.write_nl("tested. The base pass is now integrated in the main pass. The results can differ") +texio.write_nl("from those in context because there we integrate some mechanisms differently.") +texio.write_nl("--------------------------------------------------------------------------------") +texio.write_nl("") + utf = utf or unicode.utf8 -- We have some (global) hooks (for latex): @@ -210,12 +221,12 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then loadmodule('font-oti.lua') loadmodule('font-otf.lua') loadmodule('font-otb.lua') - loadmodule('luatex-fonts-inj.lua') -- will be replaced (luatex >= .80) - loadmodule('font-ota.lua') + loadmodule('luatex-fonts-inj.lua') + loadmodule('luatex-fonts-ota.lua') loadmodule('luatex-fonts-otn.lua') - loadmodule('font-otp.lua') -- optional + loadmodule('font-otp.lua') loadmodule('luatex-fonts-lua.lua') - loadmodule('font-def.lua') + loadmodule('font-def.lua') -- this code (stripped) might end up in luatex-fonts-def.lua loadmodule('luatex-fonts-def.lua') loadmodule('luatex-fonts-ext.lua') -- some extensions diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex index b822af66875..6f48e0ced7a 100644 --- a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex +++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex @@ -35,14 +35,16 @@ \font\gothic=msgothic(ms-gothic) {\gothic whatever} -\font\testy=file:IranNastaliq.ttf:mode=node;script=arab;language=dflt;+calt;+ccmp;+init;+isol;+medi;+fina;+liga;+rlig;+kern;+mark;+mkmk at 14pt -\testy این یک متن نمونه است با قلم ذر که درست آمده است. +\bgroup -\pdfprotrudechars2 \pdfadjustspacing2 + \pdfprotrudechars2 + \pdfadjustspacing2 -\font\testb=file:lmroman12-regular:+liga;extend=1.5 at 12pt \testb \input tufte \par -\font\testb=file:lmroman12-regular:+liga;slant=0.8 at 12pt \testb \input tufte \par -\font\testb=file:lmroman12-regular:+liga;protrusion=default at 12pt \testb \input tufte \par + \font\testb=file:lmroman12-regular:+liga;extend=1.5 at 12pt \testb \input tufte \par + \font\testb=file:lmroman12-regular:+liga;slant=0.8 at 12pt \testb \input tufte \par + \font\testb=file:lmroman12-regular:+liga;protrusion=default at 12pt \testb \input tufte \par + +\egroup \setmplibformat{plain} @@ -64,13 +66,12 @@ \font\test=dejavuserif:+kern at 10pt \test -\hsize 1mm -\noindent Циолковский +\bgroup \hsize 1mm \noindent Циолковский \par \egroup \loadpatterns{ru} -\noindent Циолковский +\bgroup \hsize 1mm \noindent Циолковский \par \egroup a bit of math -- cgit v1.2.3